cesm物理过程参数化控制代码 physpkg.F90
目录
引言:
我在向cesm中添加物理过程计算代码的时候都需要往vertical_diffusion_tend 的子程序里加,因为我知道这个会在正确的时间被调用。
但是我还是想追根溯源,找到到底是哪个文件在控制物理过程的计算。
于是我 grep -r "vertical_diffusion_tend" *
我发现,在physpkg.F90 文件中调用了vertical_diffusion_tend,我简单看一下,就是这个文件在控制各个物理过程的计算。
physpkg module 简介
首先是注释和作者
这里用了很多module中的很多subroutine
然后这里面有5个子程序,其中第一是注册,第二个初始化,第三个和第四个是运行物理过程计算,第五个是结束
其中vertical_diffusion_tend 在第三个run1中
然后是对物理过程的一些选项的控制变量
子程序phys_register
首先读取前面的控制变量,然后根据这些变量选择是否调用某些子程序,在这个子程序中,大部分只是准备变量之类的操作。
pbuf_add_field子程序就是创建变量场
我们看到,这后面还会不经过判断就执行某些子程序。
子程序phys_inidat
我们看见这里面定义了一些type:cam_out,pbuf2d等等,这个里面更多对数据的处理
这里面有tptr,tptr_2,tptr3d...
infld
pbuf_set_field
2D数据
这里面有一些是关于边界层高度的。这是二维数据,三维数据在下面
3D的数据
子程序phys_init
为了物理包的 初始化
这里有对边界层的初始化和垂直扩散的初始化,以及辐射,云,浅对流等等
子程序phys_run1
这里面的计算程序会在更新表面模式之前运行
这里是主要的步骤,并行计算里面的内容,然后相关的调用各个物理过程的语句在tphysbc中
子程序phys_run2
这里的程序会在表面模式更新之后再运行
重要的部分,其中tphysac 中的a 应该是after的意思,之前就是tphysbc,before.
子程序phys_final
应该是一些收尾工作
子程序tphysac
我们看到很多的物理过程都是在更新之后才进行的,其中包括了我们之前写的代码的。
我们简单看一下调用
其中垂直扩散和边界层计算在这里调用
子程序tphysbc
method 中介绍参数化的方法,可以看见,我们只需要写我们的参数化方法,然后在这个程序中call调用,当然需要遵守上面的三个步骤。
子程序phys_timestpep_init
结束module
总结: 这个程序是参数化最源头的程序了。相关的逻辑也大致明确了。之后可以在这个程序中调用我们的参数化方法,从而不需要再到别人的代码里面嫁接了。