1

我需要使用来自 mask.nc 的 landsea 掩码将变量掩码到 var.nc 文件中

我使用 NCO 如下:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'where(mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

问题是定义变量的时间步数。尤其是,

mask_var(t,y,x) with t=1
var_to_mask(t,y,x,) with t=12

因此,第一个命令正确复制 mask_var for t=1; 对于 t>1 mask_var 是 NaN。

有没有办法为所有其他时间步复制 mask_var ?

谢谢

4

2 回答 2

2

在 NCO'sncap2中,where()条件中变量的排名必须与子句中变量的排名相匹配。我认为这解释了你看到的行为,我认为你可以通过首先创建一个与变量相同等级的掩码然后使用该掩码来解决这个问题:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'big_mask_var=0*var_to_mask+mask_var;where(big_mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

注意:big_mask_var可以创建为不会出现在 OUT.nc 中的 RAM 变量。练习留给读者。

于 2018-11-03T23:25:34.963 回答
1

我不太擅长 NCO,但我认为您也可以在 CDO 中轻松做到这一点,并会在此基础上冒险提出替代答案。你没有在你的问题中清楚地说明掩码到底是什么以及你想如何掩码,但是从你的代码中我推断出

  • 掩码文件有一个介于 0 和 1 之间的浮动变量
  • 您只想保留 mask=1 的变量值,并将其他所有内容设置为缺失(而不是零)?

如果是这种情况,那么您可以这样做:

cdo setrtomiss,-999,0.999 mask.nc maskmiss.nc
cdo mul maskmiss.nc var.nc varmasked.nc

第一行设置一个缺少 0.999 及以下的掩码,否则保持该值不变,第二行相乘。如果一个文件只有一个时间步长,CDO 通过重复自动“填充”丢失的时间段,从而解决您的问题。如果您担心四舍五入(或者您的掩码的值 > 1),那么更安全的掩码定义将是

cdo gec,1 mask.nc mask2.nc
cdo setctomiss,0 mask2.nc mask3.nc  

在这种情况下,如果原始值 >=1,则 mask2 包含 1,否则为 0,然后在第二步中将其映射到缺失。

我认为您可以在一个命令中传递整个内容,并以这种方式避免中间文件:

cdo mul -setctomiss,0 -gec,1 mask.nc var.nc varmasked.nc 

最后一件事作为脚注,以防万一,使用内置地形数据集在 CDO 中动态创建海陆掩膜也很容易,根据我在此处的回答:NetCDF:如何掩蔽/过滤掉全局数据集中的非土地值,最好使用 Python 和/或 NCO? 这可能非常有用,因为您有时没有相同分辨率的掩码数据集,它可以帮助您准确地重新映射较粗的比例掩码。

于 2018-10-29T08:17:19.520 回答