Невозможно изменить определенные значения переменных по определенному измерению в netcdf

У меня есть файл netcdf, содержащий 4-D переменные:

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" ;

Я хотел бы использовать переменную «mask_veget» в качестве маски для изменения значений переменной «maxvegetfrac» в определенных регионах и по выбранным значениям ее «растительного» измерения. Для этого я использую ncap2. Например, если я хочу установить значения maxvegetfrac для 5-го ранга измерения растительности на 500, где mask_veget равно 6, я делаю:

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

Моя проблема в том, что в полученном файле test.nc maxvegetfrac был изменен на первом ранге "вегетативного" измерения, а не на пятом. И я получаю тот же результат, если запускаю скрипт по всему измерению растительности:

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

Я где-то ошибаюсь, но ... где? Любая помощь приветствуется!


person Pierre Sepulchre    schedule 21.03.2017    source источник


Ответы (1)


Пара вещей, о которых вы, возможно, не подозреваете, не должны гиперпластифицировать переменную в теле where - в данный момент это не имеет смысла.

Это нормально для hyperslab в операторе where, доказывающем, что его единственный индекс, как тусклый с одним значением, рушится

Попробуй это:

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

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

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

запустите скрипт сейчас с помощью команды

ncap2 -v -O -S hyper.nco test.nc out.nc

...Генри

person Henry Fey    schedule 22.03.2017