LZN's Blog CodePlayer

【已解决】CESM rebuild restart后不认SourceMods及namelist内容

2014-10-28
LZN

今天下午画CAM5 Heat试验的图,发现不能通过显著性检验,非常令人费解。毕竟已经重复跑过多遍了,再次重来,而且还是时空代价这么高的CAM5,终归让人沮丧。检查强迫输入文件没问题,fortran源代码中inject的读写函数也没问题,想到最初检查03-09年的数据通过显著性是没有问题的,于是检查10年之后的输出……完全不能通过。

返回查找log文件,发现25日那天我为了增快运行速度,更改pe_layers之后rebuild重启了一次,貌似rebuild过程中完全无视了我SourceMods中的内容!restart之后的结果转的其实是control,完全没有inject heating!简直无语了,为什么会这样。现在只能重新编译,在10年处restart试试看了。非常郁闷。

突然想到couple的试验还没有检查,暗暗祈祷画了个响应场,傻眼了,发现all value=0,以为脚本出错,查错时发现最不愿看到的事情还是发生了,所有的branch run的结果和原始的control结果一模一样……OMG!又不认SourceMods!实在是非常不能够理解。测试在修改的代码里加入错误,运行build程序时确乎是能够读到错误的,说明是可以读到SourceMods的,非常的奇怪,莫非与cesm_setup被clean后或者第一次build的时候是不去读SourceMods的?为了做测试,更改了pe layers,clean了setup,在代码里故意注入iulog文件句柄输出,重新build。

#Up to 20141029#

今天来查看结果,还是不行。不知道为什么,即便编译的时候会去检查Sourcemods的错误以及后来测试加入iulog也是可以输出的,但就是不会去执行。

今天中午回来索性直接查个遍。calday过1直接log输出heatf的所有数据。编译成功运行,查看输出——全部都是0!这种情况最大的可能当然是没有读取heatf的强迫文件。分明记得heatf的强迫在physics initial这个subroutine里呀,难道restart的时候就不会去做initial么?向上翻了翻代码,查了下restart的关键词,发现惊天地泣鬼神的三行语句:

750 if (nsrest .eq. 0) then 751 call phys_inidat(cam_out, pbuf2d) 752 end if

反查了下nsrest是什么,在control目录下,cam_control_mod这个module写的那叫一个清楚啊

11 integer :: nsrest ! run type flag (0=initial, 1=restart-continuation, 3=restart-branch.)

而我那可怜的读取外强迫文件的语句,被我扔在了phys_inidat这个subroutine下读取,OMG!原来你丫的inidat只在startup的case下采去读,我restart不出问题才怪,物理包真正的initial在phys_init这个soubroutine里!找到这个问题,重新编译测试,没想到提交任务的时候c73节点down掉了,真是那个叫什么来着,屋漏偏逢连阴雨,哪壶不开提哪壶么……

好在找到问题了,couple的问题也是一样的,当然也能迎刃而解。经测试,确实是这个问题造成的。

#Up to 20141102#


Comments

Content