wind_scal.F
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\wind_scal.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
wind_scal 是 lon-lat 动力网格上的风场位置转换辅助例程。它把输入的 zonal/meridional 风或质量通量 pbaru/pbarv 平均回标量格点数组 us/vs:zonal 分量沿经向相邻点平均并设置周期边界,meridional 分量沿纬向相邻点平均并把南北极行置零。当前源码调用方是 start2archive,用于把 covnat 生成的自然风 un/vn 转为可写入 start_archive.nc 的标量格点风 us/vs。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
wind_scal |
subroutine |
1 |
将 pbaru/pbarv 平均到标量格点,输出 us/vs。 |
依赖的模块
无 USE 模块依赖。
include 依赖
| include |
用途 |
dimensions.h |
提供 iim/jjm/llm 等基本维度。 |
paramet.h |
提供 ip1jmp1/ip1jm/iip1/iip2/jjp1 等派生维度。 |
comgeom.h |
本例程未直接引用其中变量;可能为历史接口保留。 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
SCOPY |
BLAS/外部向量拷贝例程 |
行 31 |
将 us(iip1,j,l) 周期边界列复制到 us(1,j,l),步长为 iip1。 |
调用方
| 调用方 |
调用位置 |
作用 |
start2archive |
start2archive.F:277 |
在 covnat(llm,ucov,vcov,un,vn) 后调用 wind_scal(un,vn,us,vs),把自然风转换到标量格点并写入 archive。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
pbaru |
参数 |
REAL(ip1jmp1,llm) |
与风速或通量一致 |
zonal 分量输入,start2archive 中为自然风 un。 |
pbarv |
参数 |
REAL(ip1jm,llm) |
与风速或通量一致 |
meridional 分量输入,start2archive 中为自然风 vn。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
us |
参数 |
REAL(ip1jmp1,llm) |
与 pbaru 相同 |
标量格点上的 zonal 风。 |
vs |
参数 |
REAL(ip1jmp1,llm) |
与 pbarv 相同 |
标量格点上的 meridional 风,南北极行置零。 |
共享状态与副作用
- 不读写模块变量或 common block。
- 不做文件 I/O,不输出日志。
- 覆盖写
us/vs;输入数组只读。
- 依赖外部
SCOPY 可链接,否则周期边界复制阶段会缺符号。
核心逻辑
- 对每个垂直层
l=1..llm,对线性索引 ij=2..ip1jmp1,计算 us(ij,l)=0.5*(pbaru(ij,l)+pbaru(ij-1,l))。
- 调用
SCOPY(jjp1*llm,us(iip1,1),iip1,us(1,1),iip1),把每一纬圈最后一个经向点复制到第一个经向点,保证周期边界。
- 对每个垂直层,在线性索引
ij=iip2..ip1jm 上计算 vs(ij,l)=0.5*(pbarv(ij,l)+pbarv(ij-iip1,l)),即沿纬向相邻 v 点平均。
- 对每个垂直层和
ij=1..iip1,将第一行 vs(ij,l) 与最后一行 vs(ip1jm+ij,l) 设为 0。
伪代码
for l in 1..llm:
for ij in 2..ip1jmp1:
us(ij,l) = 0.5 * (pbaru(ij,l) + pbaru(ij-1,l))
copy us(iip1,j,l) to us(1,j,l) for all j,l
for l in 1..llm:
for ij in iip2..ip1jm:
vs(ij,l) = 0.5 * (pbarv(ij,l) + pbarv(ij-iip1,l))
for i in 1..iip1:
vs(i,l) = 0
vs(ip1jm+i,l) = 0
参与的主题流程
| 主题 |
参与方式 |
| start/startfi 到 start_archive 转换 |
start2archive 写 archive 前,用本例程把自然风转为标量格点风变量 u/v。 |
| 风场位置转换 |
与 scal_wind 方向相反:scal_wind 从标量/源位置平均到 u/v 风点,本例程从 u/v 自然风位置平均回标量格点。 |
写法特点
- 固定格式 Fortran,无
INTENT 标注。
- 使用线性索引遍历二维 lon-lat 网格,依赖
paramet.h 中的 ip1jmp1/ip1jm/iip1/iip2。
- zonal 分量用
SCOPY 做周期边界;meridional 分量直接把极区边界置零。
comgeom.h 被 include 但未直接引用。
复现要点
pbaru 的线性排列必须与 ip1jmp1 标量网格一致,因为例程用 ij-1 做经向相邻点。
pbarv 只有 ip1jm 个输入点;输出 vs 有 ip1jmp1,首尾纬向边界由本例程置零。
- 例程不乘
cu/cv,也不做协变/反变 metric 转换;这些工作由调用方前后的动力例程完成。
待确认
SCOPY 的提供位置需结合构建系统确认。
- 注释写“flux de masse / vents”,当前
start2archive 实参是自然风;是否仍有质量通量调用路径未在当前范围内发现。
comgeom.h 是否为历史残留。
相关页面