2017-03-21 1 views
1

J'ai un fichier NetCDF contenant des variables 4-D:Impossible de modifier les valeurs des variables spécifiques sur une dimension spécifique dans netcdf

variables: 
    double maxvegetfrac(time_counter, veget, lat, lon) ; 
     maxvegetfrac:_FillValue = 1.00000002004088e+20 ; 
     maxvegetfrac:history = "From Topo.115MaCTRL_WAM_360_180" ; 
     maxvegetfrac:long_name = "Vegetation types" ; 
     maxvegetfrac:missing_value = 1.e+20f ; 
     maxvegetfrac:name = "maxvegetfrac" ; 
     maxvegetfrac:units = "-" ; 

    double mask_veget(time_counter, veget, lat, lon) ; 
     mask_veget:missing_value = -1.e+34 ; 
     mask_veget:_FillValue = -1.e+34 ; 
     mask_veget:long_name = "IF MYVEG4 EQ 10 AND I GE 610 AND J GT 286 THEN 16 ELSE MYVEG4" ; 
     mask_veget:history = "From desert_115Ma_3" ; 

Je voudrais utiliser la variable « mask_veget » comme un masque pour modifier les valeurs de la variable "maxvegetfrac" sur des régions spécifiques, et sur des valeurs choisies de sa dimension "veget". Pour ce faire, j'utilise ncap2. Par exemple, si je veux définir des valeurs maxvegetfrac sur le 5e rang de dimension veget à 500 où mask_veget est égal à 6, je fais:

> ncap2 -s "where (mask_veget(:,:,:,:)== 6) maxvegetfrac(:,5,:,:) = 500" test.nc 

Mon problème est que dans le fichier test.nc résultant, maxvegetfrac a été modifié au premier rang de la dimension "veget", pas le 5ème. Et je reçois le même résultat si je lance le script sur toute la dimension de veget:

ncap2 -s "where (mask_veget(:,:,:,:)== 6) maxvegetfrac(:,:,:,:) = 500" test.nc 

Je suis confondais quelque part, mais ... où? Toute aide appréciée!

Répondre

1

Un certain nombre de choses que vous ne connaissez peut-être pas vous ne devriez pas être hyperslabbing une variable dans le corps où-cela n'a aucun sens pour le moment.

Il est autorisé à hyperslab dans la où la déclaration prouvant son un seul indice comme faible avec une seule valeur affaisse

Essayez ceci:

/*** hyper.nco *****/ 
maxvegetfrac5=maxvegetfrac(:,5,:,:); 

where(mask_veget(:,5,:,:)== 6) 
    maxvegetfrac5=500.0; 

/* put the hyperslab back in */ 
maxvegetfrac(:,5,:,:)=maxvegetfrac5; 
/* script end *****/ 

exécutez le script maintenant avec la commande

... Henry

+0

Merci beaucoup Henry. Cela a fonctionné parfaitement. –