无法修改netcdf中特定维度上的特定变量值

时间:2017-03-21 17:03:27

标签: netcdf netcdf4 nco

我有一个包含4-D变量的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" ;

我想使用变量" mask_veget"作为改变变量值的掩码" maxvegetfrac"在特定地区,以及其所选择的价值" veget"尺寸。 为此,我使用的是ncap2。例如,如果我想将veget维度的第5级上的maxvegetfrac值设置为500,其中mask_veget等于6,我这样做:

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

我的问题是,在生成的test.nc文件中,maxvegetfrac已经在" veget"的第一个等级进行了修改。维度,而不是第五个。如果我在整个veget维度上运行脚本,我会得到相同的结果:

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

所以我在某处误会,但......在哪里? 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

您可能没有注意到的一些事情 你不应该在身体的哪个地方过度使用变量 - 这一点毫无意义。

在where语句中证明其单一索引的hyperslab是可以的 作为一个单一值崩溃的昏暗

试试这个:

#include "Header.h"

vector <Account> bankAccounts; edited;

void menu(int *inputPtr) {

    int select = 0;

    cout << "Welcome to MadeUp Banking. Select options below: \n";
    cout << "\t 1. Make new account. \n";
    cout << "\t 2. Display to an account. \n";
    cout << "\t 3. Deposit to an account. \n";
    cout << "\t 4. Withdraw from an account. \n";
    cout << "\t 5. Print account. \n";
    cout << "\t 6. Delete an account. \n";
    cout << "\t 7. Quit. \n";
    cout << "Selection: ";
    cin >> select;
    *inputPtr = select;

}



void makeAccount(vector <Account> bankAccounts) {
    //edited vector <Account> bankAccounts within makeAccount()

return;

现在使用命令

运行脚本
/*** hyper.nco *****/ 
maxvegetfrac5=maxvegetfrac(:,5,:,:);

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

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

...亨利