登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 packard 于 2018-7-29 03:53 编辑
应版主建议,现翻译成中文。CESM是一个高度包装的模式,很多设置都是经过几重程序/包装,才解释落实成为最终的底层设置。而我觉得关于这几重程序/包装的说明,即使是英文的,也相对欠缺,于是自己写了这个短文,总结这方面,以及其他相关知识。以下基于CESM1.1.1,其他版本可能有些出入。
Namelist是什么?
Namelist这里指Fortran通过NAMELIST语法读入的文件。很多数值模式(包括CESM)都使用namelist来作参数修改,而不必重新编译模式。Namelist一般长这样: - &GROUP_NAME
- char_variable = "a char variable",
- logical_variable = .true.,
- real_variable = 12.3,
- int_array = 1, 2, 3, 4,
- /
复制代码
CESM默认如何生成namelist?
只有$RUNDIR/*_in 是传统意义下,直接被Fortran模式读入的底层namelist。但模式设计者并不建议直接修改这些底层namelist,而是建议通过 user_nl_* 和 env_*.xml 来间接修改。这个间接生成底层namelist的过程如下:
模式提交前: - cesm_setup 和 $CASE.build 都调用 preview_namelists
- preview_namelists
调用 Buildconf/$comp.buildnml.csh
把 *_in 拷贝至 CaseDocs/ - Buildconf/$comp.buildnml.csh
调用 $CCSMROOT/models/**/bld/build-namelist 来生成 Buildconf/*conf/*_in
把 *_in 拷贝至 $RUNDIR (覆盖) - build-namelist
输入 user_nl_* 作为 “infile”
写出 Buildconf/*conf/*_in 和 Buildconf/*.input_data_list
模式提交时: - $CASE.submit 提交 $CASE.run
- $CASE.run 调用 preview_namelists
- preview_namelists 进行跟上面一样的操作
如何修改CESM的namelist?
如果可以,通过修改 user_nl_* 和 env_*.xml 比如:./xmlchange SSTICE_DATA_FILENAME=/path/to/new_sst.nc
如果前面行不通,手动修改$RUNDIR/*_in ,然后把Buildconf/$comp.buildnml.csh 中的对应拷贝(覆盖)语句注释掉。
提示: ./preview_namelists 可以更新 namelist (和 input_data_list) grep '' Buildconf/*.input_data_list 可以列出所有input 数据
DIN_LOC_ROOT=`./xmlquery -valonly -silent DIN_LOC_ROOT`
./check_input_data -inputdata $DIN_LOC_ROOT -check
可以检查input 数据 drv_in中 &seq_infodata_inparm 的部分会写出到 $RUNDIR/cpl.log.$LID,可供检查 建议比较一下默认的 namelist 和修改后 namelist 有时,user_nl_* 不是逐句解读的,而是可以出现“按下葫芦起了瓢”的一些副作用。比如指定prescribed_ozone_file 时,关于prescribed_ozone_cycle_yr, prescribed_ozone_name等等的语句会被CESM自作聪明的省略(models/atm/cam/bld/build-namelist 第954行)。所以改prescribed_ozone_file的话,要同时手动指定所有几个ozone的参数,并且按上一点提示,比较默认和修改后的namelist 检查一下。 不要修改 CaseDocs/ 或者 Buildconf/ 下的namelist,他们每次会被覆盖,以及不被Fortran模式读入。
参考:
|