在cesm中寻找科氏参数,或者纬度的技术思路 看fortran代码(4)

因为计算边界层高度的公式要用到科氏参数,我没想到这居然是最难找的一个变量。

我们先看看能不能简单计算

\LARGE f=2\Omega sin\varphi

其中\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,希望可以成功

这会果然得出了正确结果,我很高兴!

这样的话,也就是我的新方案完全加入到模式里面啦。

后面再我们自己构造一个边界层高度的方案,然后放进模式里进行对比,这样就能写篇文章啦。

我早晚成为模式专家。

果然问题还是得留在第二天上午做!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值