CESM的安装及运行
关于CESM的安装
-
总的过程下来,安装的问题基本出在
config_machines.xml和config_compilers.xml上。 对于这两个文件一定要根据自己的机器情况进行设置。 -
除此之外,在安装过程中,库的依赖库需要统一。例如在编译
esmf时使用的是mpich, 而在配置CESM时,我设置的是openmpi。 这就导致在./case.build中出现mct等报错问题,最后我删除了esmf用openmpi重新编译解决了问题。 应该把CESM所有的库,以及这些库的依赖库都统一起来 (类似的还有pnetcdf也应该统一成用openmpi编译)。 -
另一个问题是网络问题,不过是在
./manage_externals/checkout_externals还是./case.submit都需要从网络下载一些文件。然而网络被墙,这些步骤频繁失败。解决方案可以是在本地开启Clash代理,然后在linux中开启使用本地的代理,从而让linux连上本地开启的VPN。 -
还有一个关于Lapack的问题。这个库的编译参照linux关于blas、lapack的安装和使用 - 知乎 (zhihu.com) 但安装好在./case.build会出现类似
glam_strs2.F90:(.text+0x888): undefined reference to dcopy_的报错。主要是因为在gcc编译中链接库的顺序问题。解决方案是在config_compilers.xml的<SLIBS>中添加<append>-L/disk1/xhw/libs/lapack/lib -llapacke -llapack -lcblas -lrefblas -lm -lgfortran</append> -
build时报错
relocation truncated to fit r_x86_64_32s against .data'。由于编译内存不足需要增加内存,在config_compilers.xml的FFLAGS里添加-mcmodel=medium。GCC 编译错误 relocation truncated to fit: R_X86_64_32S against `.bss’_relocation truncated to fit 错误-CSDN博客 -
submit后运行中断并报错
prterun noticed that process rank 2 with PID 313682 on node charney exited on signal 11 (Segmentation fault).原因是编译参数限制了堆栈的大小,不利于并行计算。输入ulimit -s unlimited解决。并行计算错误提示 - 第一原理 - 小木虫 - 学术 科研 互动社区 (muchong.com) -
./case.submit后
ERROR: No result from jobs [('case.run', None), ('case.st_archive', 'case.run or case.test')]。一方面case默认跑5天,但以月平均输出。由于5天run不足以输出月平均,所以就no result。可以修改./xmlchange STOP_N=1,STOP_OPTION=nmonths。另一方面即使修改了运行时长,如果你的机器没有batch(任务调度系统),那么仍然会输出这个错误。但在archive里可以找到运行输出的历史文件,这样的情况下可以忽视这个报错。[case.submit error] ERROR: No result from jobs [(‘case.run’, None), (‘case.st_archive’, ‘case.run or case.test’)] | DiscussCESM Forums (ucar.edu) -
一开始我使用的是系统自带的gcc,然后编译安装了一系列库。后来在编译运行CESM时,出现一些报错,发现可能是gcc版本太低导致的。于是我自己编译安装了高版本的gcc。这样的情况下,需要重新编译安装之前版本gcc编译的库,否则会出现类似
come from different version of gcc的错误。另外,自己编译安装gcc在某个文件夹下后,需要手动修改所有gcc/lib64/*.la的libdir='$gcc/lib64'和dependency_libs -
FWHIST运行报错
pio_support::pio_die:: myrank=-1 : ERROR: ionf_mod.F90:235 : NetCDF: Attempt to use feature that was not turned on when netCDF was built.MPI_ABORT was invoked on rank 1 in communicator MPI_COMM_WORLD。经历了用nccopy -k nc6 file.nc newfile.nc修改格式无果。最后在 Not a NetCDF error for ionf_mod.F90? | DiscussCESM Forums (ucar.edu) 找到了答案。./xmlchange PIO_TYPENAME='netcdf' -
在大装置上还遇到了类似这个报错“
H5Zbzip2.c:6:18: fatal error: hdf5.h: No such file or directory"。在大装置上,库都是通过module load导入的。而大装置上的hdf5似乎在编译时没有开始并行功能,导致如上报错。 解决方案是我自己用intelmpi重新编译hdf5,./configure CC=mpiicc FC=mpiifort CXX=mpiicpc --enable-parallel --enable-fortran --enable-shared --prefix=/home/ydn/opt/software/hdf5-1.10.6/build . 并导入该hdf5
CESM 文件夹结构
CASE的建立到提交
新建case
1 | cd $HOME/CESM/cime/scripts/ |
Setup:生成case.run; namelistusr_nl_xxx; CaseDocs。 pelayout 被固定
1 | ./case.setup |
build
1 | ./case.build |
提交
1 | ./case.submit |
关于case的运行过程被记录在 CaseStatus 文件中
1 | cd $HOME/CESM/cime/scripts/casename/CaseStatus |
修改、查询.xml
-p 可以模糊查询名为JOB_WALLCLOCK_TIME 的变量设置
1 | ./xmlquery -p WALLCLOCK |
修改允许时长
1 | ./xmlchange STOP_N=1,STOP_OPTION=nmonths |
修改pelayout
1 | ./xmlchange NTASKS=xxx,NTHRDS=xxx,ROOTPE=xxx |
修改(在./case.setup之前)
1 | ./xmlchange CONTINUE_RUN=TRUE |
或者直接修改 env_run.xml
namelist
namelist文件在 $CASEROOT 里,CAM模块的namelist名为 user_nl_cam
主要用于设置输出哪些变量,每几小时一平均,每个文件塞几个时次的变量
nhtfrq: 输出频率mfilt: 每个文件塞的时次数fincl: 额外增添一些变量
nhtfrq
nhtfrq=0 表示月平均输出,nhtfrq>0按时间步长输出,nhtfrq<0按小时输出
1 | nhtfrq = -24 ! 逐日(24小时) |
mfilt
1 | ! 逐日输出,每个文件里有365个时次 |
Note: 对于逐月输出的情况,设置mfilt无效. For monthly frequency, we always have:
mfilt = 1。 每个月作为一个文件是上限?不存在12个月为一个文件的情况?
fincl
输出的历史文件的文件名会带有**h0**, h1, …, **h9**字段,一共至多有十个。h0 是默认输出的,带有这个字段的文件会输出模式默认输出的变量。如果我想增加几个变量输出,我可以进行一些设置fincl2='xxx',这些变量会出现在h1字段的文件中。fincl3 控制h2 …
1 | ! 在h0中以月平均输出默认变量。在h1中以逐小时输出UVT三个变量,十个小时为一个文件。在h2中以逐24小时输出UVT,十个小时为一个文件 |
默认情况是做平均输出,例如逐小时平均,逐24小时平均。可以通过添加flags变逐小时输出瞬时量。
A==> AverageB==> GMT 00:00:00 averageI==> InstantaneousM==> MinimumX==> MaximumL==> Local-timeS==> Standard deviation
1 | ! 逐月平均输出默认变量。在h1中,每3小时输出TQUV的瞬时量 |
以上是CAM模块里的设置方法,对于海洋、陆面等模块的设置方法略有不同,参见 Customize CAM output — CESM Tutorial (ncar.github.io)
如何关闭各分量的输出
How to turn off CESM history output | DiscussCESM Forums (ucar.edu)
附录
xml 和 namelist 汇总
CESM1.2 Model Component Namelists (ucar.edu)
namelist 汇总
compsets
CESM2 Component Sets Definition (ucar.edu)
variable fields 汇总
case 命名规则
Naming Conventions | Community Earth System Model (ucar.edu)
集群、节点、核心、任务
集群:相当于一个机房,机房里有很多计算机。这些计算机的集合就是集群
节点:机房里的每个计算机相当于节点
核心:每个计算机的处理器核心
任务:例如跑一次CESM实验就是一次任务,这个任务可以拆分成若干小任务,每个小任务分配给核心。
关于NTASKS,PES,MPITASK
XML设置中有若干设置并行计算的变量。经过一番探索初步摸清了它们的意义
| 表头 | 表头 |
|---|---|
| MAX_MPITASKS_PER_NODE | 每个节点上MPI task的最大数量。也可以在config_machines.xml里设置。 |
| MAX_TASKS_PER_NODE | 所有分量每个节点上(MPI tasks) * (threads) 的总和。必须大于等于 MAX_MPITASKS_PER_NODE。也可以在 config_machines.xml 里设置。 |
| NTASKS | 每个分量的MPI task数 |
| NTHRDS | 每个分量每个任务的threads数。必须大于等于1。如果等于1,表示对应分量的并行关闭。 |
| ROOTPE | MPI task 任务编号。 |
对于一个case,如果
1 | NTASKS_ATM = 16 |
从上图可以知道程序实际只用了80个tasks,那么程序会向服务器申请80个tasks和128个pes处理器。前16个task用于处理atm,每个task由4个pes负责计算。后64个tasks用于处理ocn,每个task由1个pes负责计算。
这80个tasks的是没有重叠的,atm和ocn同时计算。如果ROOTPE_OCN=0, 那么前16个task就是和atm重叠的,ocn的前16个task需要等atm计算完成才能开始计算。
如果这时候 ROOTPE_OCN = 64
由于ocn的task编号从64开始,导致atm和ocn之间有48个task和pes不会被使用,但这些仍然由程序向服务器申请下来。
Compset 字母意义
| Designation | Active Components | Data Components | Notes |
|---|---|---|---|
| A | – | various | All data components; used for software testing |
| B | atm, lnd, ice, ocn | – | Fully active components |
| C | ocn | atm, ice, rof | |
| D | ice | atm, ocn, rof | Slab ocean model (SOM) |
| E | atm, lnd, ice | ocn | Slab ocean model (SOM) |
| F | atm, lnd | ice, ocn | Sea ice in prescribed mode; some F compsets use fewer surface components |
| G | ice, ocn | atm, rof | |
| I | lnd | atm | |
| J | lnd, ice, ocn | atm | Can be used to spin up the surface components |
| P | atm | – | CAM PORT compsets |
| Q | atm | ocn | Aquaplanet compsets |
| S | – | – | No components present; used for software testing |
| T | glc | lnd | |
| X | – | – | Coupler-test components; used for software testing |
关于BHIST和B1850
1850的强迫保持在工业化前水平,2000的强迫保持在near present day水平ya,hist的强迫则是随时间演化的,可以理解为近真实情景的强迫的时间演变。所以如果使用B1850,和BHIST使用相同的初始时间RUN_STARTDATE,两个case的演化也是非常不同的。
原文链接:https://blog.csdn.net/qq_27984679/article/details/134903532
装库的一些编译选项
ncview
1 | ./configure --prefix=/disk1/xhw/opt/ncview --with-nc-config=$libspath/netcdf/bin/nc-config --with-udunits2_incdir=$libspath/udunits/include/ --with-udunits2_libdir=$libspath/udunits/lib/ --with-png_incdir=$libspath/libpng/include/ --with-png_libdir=$libspath/libpng/lib/ |
1 | # hdf5 |
一些疑问
- hybrid和branch区别,什么是hydrid,为什么新建case都是hydrid
- pelayout到底改怎么规划
- RUN_REFCASE和RUN_REFDATE是什么
- BHIST和B1850的区别
- 很多文件的日期是从0001年开始算的,什么意思
PIcontrol使用的是工业革命前的强迫,对1850年重复模拟500或者300年,模拟这么多年目的是为了使系统达到稳定。B1850则是在别人模拟好的PIcontrol实验的基础上,用他们得到的数据作为初始场(这也就是REFCASE的意义和REFDATE=0500或0300的原因)。而B1850其实也是PIcontrol, 从REFCESE读取初始场后B1850重复地对1850年进行模拟 (Suggestions for modifying the start date (CESM2) , 所以B1850的STARTDATE是0001年这种形式,表示第一年、第二年…。如果随意改变B1850的REFDATE可能导致模式找不到初始场数据。如果改变STARTDATE,没有意义
BHIST是Historical run。使用的初始场来自于别人跑的Historical run。他的时间是推进的,例如第一年是1979,第二年就是1980…
以上说的基本都是hybrid,就运行的初始场是别人运行好的restart文件。通过咨询张贺老师了解到,CESM使用startup就相当于全部自己提供初始场,与WRF的运行方式相同了。如果只模拟几天则不需要spin up,如果运行超过一年则最好spin up.
- 关于PElayout:
以全部NTASK=4, NTHRDS=4, ROOTPE=0,MAX_MPITASKS_PER_NODE=MAX_TASKS_PER_NODE=40 为例。这种情况下,每个分量占用4个并行任务,每个任务使用4个线程(4个核心)。由于ROOTPE相同,这些分量是按顺序依次运行的。
这个时候如果运行./preview_run将输出
1 | nodes: 1 |
其中 total task=4 很好理解,因为所有NTAKS=4,ROOTPE=0即所有的分量在前四个TASK上运行。如果ROOTPE_OCN=4, 将有total task=8 。如果ROOTPE_OCN=2, 将有total task=6 。注意total task是总任务数, 这些个任务数会被分配到若干个node运行。是node数去适应total taks的变化。total task将只与我们对任务的排列分配(NTASK,ROOTPE)有关。
对于tasks per node=4,模式会优先将所有任务分配到一个node上。 因为我们设置了 MAX_MPITASKS_PER_NODE=40, 它是所有分量的NTASKS的最大值。 MAX_MPITASKS_PER_NODE=40远大于我们设置的total tasks=4, 所以这四个任务全部被放到了一个node上,所以nodes=1, tasks per node=4
如果改变MAX_MPITASKS_PER_NODE=3,这意味着每个node上最多只能有3个任务,而我们一共有total tasks=4 。所以需要两个node。这时nodes=2, tasks per node=3。(如果total tasks <= MAX_MPITASKS_PER_NODE, 则 tasks per node = MAX_MPITASKS_PER_NODE。如果total tasks > MAX_MPITASKS_PER_NODE, 则 tasks per node <= MAX_MPITASKS_PER_NODE。)
由此我们知道MAX_MPITASKS_PER_NODE是限制每个node上的任务数用的。 相对的,MAX_TASKS_PER_NODE受限制每个node上 NTASKS*NTHRDS用的。例如现在MAX_TASKS_PER_NODE=40,而 tasks per node * thread count=4*4=16 那么这同样将使得nodes=1。如果改变MAX_TASKS_PER_NODE=15,那么nodes将增加为1,tasks per node 将减小到3以使得二者乘积小于15。这个过程中total tasks不变。
未来计划
-
看看文献,有没有人做个WACCM替换再分析,试着复现,建立 baseline
-
试着用2°分辨率
-
试着预报爆发性增温
-
化学成分给气候态
-
MERRA2













