NCL学习笔记1:数据读取和选择

安装运行
数据读取和选择

重要资源库

官方文档: http://www.ncl.ucar.edu/Document/
官方邮件列表:http://www.ncl.ucar.edu/Support/email_lists.shtml
非官方论坛:
http://bbs.06climate.com/forum.php?mod=forumdisplay&fid=39http://bbs.lasg.ac.cn/?action-forumdisplay-fid-3
中文指南:https://ncl.readthedocs.io/zh_CN/latest/index.html

入门应用

可以直接从ncl官网Examples开始 https://www.ncl.ucar.edu/Applications/
更具体的语法、函数可以参考NCL_User_Guide和Reference_Manual https://www.ncl.ucar.edu/Document/

安装运行

安装

参照ncl官网 https://www.ncl.ucar.edu/Download/

建议用conda(适用于wsl,linux,mac_x86), sudo/yum(linux), homebrew(mac_x86)
os:由于ncl已经停止更新,暂不支持arm架构,即mac芯片,若一定有这个需求,可以先下载转译版的homebrew,且需重新适配x86_64版的fortran库(总之就是十分麻烦)

运行

  1. 交互模式COMMAND MODE
    交互模式演示
    ncl开启ncl命令框
    quit退出

  2. 批处理模式BATCH MODE
    ncl myscript.ncl运行ncl脚本
    ncl myscript.ncl >out运行脚本并输入结果定向到out文件中
    ncl -Q myscript.ncl禁用版本输出,即禁止输出Copyright(C)...版本号

  3. 脚本编辑
    vscode,下载ncl Extension

基本语法

脚本结构

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ;加载库文件,6.2.0以上版本包含默认加载文件
;****************************************
; These files are loaded by default in NCL V6.2.0 and newer
; load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" 
; load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"                      
;****************************************

begin

; this is main body of your code

end

; 代码主体的前后需要有begin,end进行声明

从MATLAB到NCL

MATLAB NCL Descriptions
% ; 注释
[start:stride:end] ispan/fspan 等差序列
nan,zero,... new 创建新数组
[a,b] table_attach_columns, 数组拼接
[a;b] table_attach_rows 数组拼接
write_matrix 按格式打印数组
' ' " " 字符串
['a',num2str(1),'b'] "a"+1+"b" 字符串拼接
reshape(A,[5,2]) reshape(arr1, (/5, 2/)) reshape成5行2列
A' transpose(A) 转置

举例

fid="sst.nc"
f=addfile(fid, "r")      ;~ netcdf(fid)
;print(f)                 ~ ncdisp(fid)
;list_filevars(f)         ~ ncdisp简略版

var1=f->TEMP             ;~ ncread(fid,'zeta'), lon,lat,lev,time [181 64 1 1]
;printVarSummary(var1)    ~ ncdisp(fid,'zeta')
; 注意,ncl里的dimensions与matlab相反,一般matlab为lon,lat,lev,time,而ncl则为time,lev,lat,time

x1=var1(:,:,3:11:2,0)    ;~ x1=var(1,4:2:12,:,:)
;printVarSummary(x1)
; 注意顺序,以及+1
; x2=x1(0)                ~ x2=x1(1)
; x2=x1(start:end:stride) ~ x2=x1(start:stride:end)
; 如果没有start,默认从0开始,如果没有end,默认到结尾,:stride选择性
;******************************************************
; arr1(2:4) 选取arr1数组中第3个-第5个元素
; arr1(1::2) 选取arr1数组中第2个-最后,每隔一个元素选取
; hgt(:15:2, 0, 15, 29) 选取hgt数组中第1个时次-第16个时次每隔一个时次 | 第1层 | 第16个纬度 | 第30个经度的片段
;******************************************************

;选取经度在100-110,纬度在10-25之间的变量
x2=var1(:,:,{10:25},{100:110}) 
;printVarSummary(x2)

;选取   90-120°E       所有纬度、深度     第1个时次 的部分数据
x3=var({lon| 90:120}, lat| :, level| :, time| 0 )

;选取arr1数组中第2个、第4个、第5个、第6个、第8个、第9个元素组成的新数组
arr1 = ispan(1, 10, 1)
idx = (/1,3,4,5,7,8/)
;print(arr1(idx))

;条件选取,相当于find,isnan,...
a = (/1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5/) ; 定义一维数组
a@_FillValue = 5 ; 将5设置为缺测
valid = ind(ismissing(a)) ; 找到数组a中所有缺测值的位置
a(valid) = 0 ; 将缺测值所在位置元素赋值为0
a(ind(a.ne.0)) = -a(ind(a.ne.0)) * 2 + 1 ; 对所有不等于0的元素操作
; ind: Returns the indices where the input is True.
; .eq. 等于     .ne. 不等于
; .gt. 大于     .ge. 大于等于
; .lt. 小于     .le. 小于等于
; .and.  .or.  .not. .xor.

主要参考NCL中文指南、汪君老师NCL课程

NCL入门级新手,有理解不到位处望批评指正

posted @ 2023-03-03 01:28  dan-chen  阅读(863)  评论(0编辑  收藏  举报