scal_wind.F
快速理解
它做什么: 风场位置转换辅助例程,把标量位置的水平风转到 u/v 风点位置。被 lect_start_archive 调用。
基本过程: xus/xvs → 相邻格点平均 → xu/xv。
关键结果: u/v 风点位置的自然风,供后续转协变风。
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\scal_wind.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
scal_wind 是 lon-lat 动力网格上的风场位置转换辅助例程。它把位于标量/源位置的水平风数组 xus、xvs 通过相邻格点平均,转换到 u/v 风点位置 xu、xv。当前唯一源码调用点是 lect_start_archive.F:读取并垂直、水平插值 uold/vold 后,调用 scal_wind(us,vs,unat,vnat),再用 cu/cv 转成协变风 ucov/vcov。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
scal_wind |
subroutine | 1 | 把 xus/xvs 平均到 u/v 风点位置,输出 xu/xv |
依赖的模块
无 USE 模块依赖。
INCLUDE 依赖
| include 文件 | 行号 | 用途 |
|---|---|---|
dimensions.h |
15 | 提供 iim/jjm/llm 等网格维度 |
paramet.h |
16 | 提供派生维度 iip1/jjp1 等 |
comgeom.h |
17 | 当前例程内未直接引用其中变量;推断为历史/接口一致性依赖 |
调用的关键例程
无外部 CALL。本例程只做数组平均和周期边界赋值。
调用方
| 调用方 | 调用位置 | 用途 |
|---|---|---|
lect_start_archive.F |
行 1563 | start_archive 读取阶段,把插值后的 us/vs 转到自然风点 unat/vnat,随后乘 cu/cv 得 ucov/vcov |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
xus |
参数 | real(iip1,jjp1,llm) |
与风速一致 | 待转换的纬向风场,定义在输入网格位置 |
xvs |
参数 | real(iip1,jjp1,llm) |
与风速一致 | 待转换的经向风场,定义在输入网格位置 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
xu |
参数 | real(iip1,jjp1,llm) |
与 xus 相同 |
平均到 u 风点位置后的纬向风 |
xv |
参数 | real(iip1,jjm,llm) |
与 xvs 相同 |
平均到 v 风点位置后的经向风 |
共享状态与副作用
- 不读写 module 变量或 common block。
- 不做文件 I/O、日志输出或错误中止。
- 输出数组
xu/xv被完全重写;xus/xvs只读。
核心逻辑
- 对每个垂直层
l=1..llm、纬向行j=1..jjp1:- 对
i=1..iim,计算xu(i,j,l)=0.5*(xus(i,j,l)+xus(i+1,j,l))。 - 设置周期边界
xu(iip1,j,l)=xu(1,j,l)。
- 对
- 对每个垂直层
l=1..llm、经向行j=1..jjm、经向列i=1..iip1:- 计算
xv(i,j,l)=0.5*(xvs(i,j,l)+xvs(i,j+1,l))。
- 计算
伪代码
for l in 1..llm:
for j in 1..jjp1:
for i in 1..iim:
xu(i,j,l) = 0.5 * (xus(i,j,l) + xus(i+1,j,l))
xu(iip1,j,l) = xu(1,j,l)
for l in 1..llm:
for j in 1..jjm:
for i in 1..iip1:
xv(i,j,l) = 0.5 * (xvs(i,j,l) + xvs(i,j+1,l))
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| start_archive 初始场读取 | lect_start_archive 读取风场并插值后,用 scal_wind 生成自然风点风速,再转成协变风 |
| 动力-物理初始化 | 为 newstart 初始化出来的 ucov/vcov 风场提供网格位置转换步骤 |
写法特点
- 固定格式 Fortran,使用
#include引入网格维度。 - 无
INTENT标注,接口语义需从赋值方向判断:xus/xvs只读,xu/xv写入。 - 纬向风
xu显式设置经向周期边界;经向风xv不设置j=jjp1行,因为维度为jjm。 comgeom.h被 include 但本例程未直接引用其变量,可能是历史保留。
复现要点
xus的第一维必须至少包含iip1=iim+1,因为计算xu(i)会读取xus(i+1)。xvs的第二维必须至少包含jjp1=jjm+1,因为计算xv(j)会读取xvs(j+1)。- 调用方在
lect_start_archive中随后执行ucov=unat*cu、vcov=vnat*cv;scal_wind本身不做 metric 系数缩放。
待确认
comgeom.h在本例程中的实际必要性待确认;源码中未直接使用其变量。
相关页面
- lect_start_archive — 当前唯一调用方。
- wind_scal — 反向/相关风场缩放例程,从 u/v 自然风位置平均回标量格点。
- newstart — 间接消费
lect_start_archive输出的ucov/vcov并写入restart.nc。 - dynphy_lonlat/index — 所属目录概览。