因为计算边界层高度的公式要用到科氏参数,我没想到这居然是最难找的一个变量。
我们先看看能不能简单计算
其中\varphi是纬度
\Omega是地球自转速度。
\Omega是常量
也就是说实际上我只需要找到纬度传进来即可
再次使用grep大法!
我们看到实际上有很多latvals
我们搜索一下latvals
in radians 表示弧度制
in degrees 表示度数制
我们用弧度制好一点
我们看到这个函数用了latvals
我们看到这个文件里应用了这个函数
我们看到这前面没有定义从哪来的latvals
再往前找
我在pbl_util 里写了关于计算f的代码
结果编译出了问题
应该是因为不能在这写运算语言
数组表达式的形状不符合。 [F]
改了之后还有这个问题,应该是数组定义没定义好
/public/home/chengxl/cesm/components/cam/src/physics/cam/vertical_diffusion.F90(988): error #6404: This name does not have a type, and must have an explicit type. [LATVALS]
/public/home/chengxl/cesm/components/cam/src/physics/cam/vertical_diffusion.F90(988): error #6514: Substring or array slice notation requires CHARACTER type or array. [LATVALS]
/public/home/chengxl/cesm/components/cam/src/physics/cam/vertical_diffusion.F90(988): error #6633: The type of the actual argument differs from the type of the dummy argument. [LATVALS]
/public/home/chengxl/cesm/components/cam/src/physics/cam/vertical_diffusion.F90(1029): error #6514: Substring or array slice notation requires CHARACTER type or array. [LATVALS]
/public/home/chengxl/cesm/components/cam/src/physics/cam/vertical_diffusion.F90(1029): error #6633: The type of the actual argument differs from the type of the dummy argument. [LATVALS]
接下来这些是调用的问题了,分别是:需要定义,切片的话需要数组,实参和虚参类型不同。
也就是说,vertical——diffusion里面没有latvals这个变量。
我得从别的文件中找到这个变量。
我试一下在vertical_diffusion 里use const_init,这样不知道行不行呀
这样包了很多错,看起来不行的
我加一个only latvals,这样感觉不行,我需要的是输出那个气柱的纬度,但是这样似乎不是那样的
看来这样only不行的
我在里面自己加个定义吧
但是我并不知道这个值
这显然不能计算出来结果的,即使编译正确了
很有意思的是,我觉得模式会知道每一柱子一个柱子计算,但是这个柱子的纬度应该是在框架里面计算的,这样我并不能够知道这里的纬度
说着就编译成功了,可是我真的觉得这并不能得出正确的结果。
除非,,,除非像上面图一样
果然,模式可以运行,但是pblh却不是一个值,是nan
也就是输入了一个空参数进去,不能计算出正确的结果。
我觉得ncol和纬度存在很大的关系。
为了搞清楚模式参数化中的纬度到底是怎么样的,我决定看看phys_grid.F90
这个程序有点长
4900多行
物理过程计算的格点问题
目的:定义物理计算水平网格
方法:变量是私有的;接口例程用于用户提取有用的信息。
这里应该写的是可以调用的接口
问了一位师兄,师兄说和这个函数可能有关系,get_lat_all_p
实参类型和虚参类型不同
我一看原来是要整型,返回值是一个index相当于,这肯定不行
于是我重新往下看
看到了这个函数
这是返回弧度制的,我看看哪些应用了,怎么用的
这下我觉得行了!
我用get_rlat_all_p(lchnk,ncol,latvals)
计算出弧度制的latvals
然后放进cal_pbl_h里面计算高度
这下应该是可以了
编译成功
跑跑看对不对
对的话今天就下班啦
!!!
结果都是零,今天也下班啦。
输出latvals,结果全是零,我在想是不是因为下面一个子程序里面没有调用,因为case可能选了下面的方案。
于是我又在下面粘了一行算纬度的call get_rlat_all_p,希望可以成功
这会果然得出了正确结果,我很高兴!
这样的话,也就是我的新方案完全加入到模式里面啦。
后面再我们自己构造一个边界层高度的方案,然后放进模式里进行对比,这样就能写篇文章啦。
我早晚成为模式专家。
果然问题还是得留在第二天上午做!