本文主要是介绍开边界设置1:仅生成潮汐以及潮汐和平均流量的开放边界强迫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
开放边界设置
这里的大多数指令都依赖于FVCOM MATLAB工具箱(fvcom-toolbox)。为了在FVCOM中使用平均流量函数,必须使用make.inc中启用的平均流量标志重新编译FVCOM(从2013/02/26开始,这是FLAG_18 = -DMEAN_FLOW
)。
1. 仅潮汐(光谱或表面高程)
使用MATLAB fvcom-toolbox生成边界强制的过程如下:
- 读入SMS网格(
read_sms_mesh
)。 - 提取开放边界节点(
add_obc_nodes_list
),为的参数中的ObcType分配值1add_obc_nodes_list
。有关ObcType选项,请参见FVCOM手册中的表6.1。 - 使用保存打开边界节点文件
write_FVCOM_obc
。
对于频谱涨潮:
- 提取开放边界位置处的潮汐谐波振幅和相位(
Mobj.read_obc_nodes
用于识别边界处的节点)。TPXO和POLPRED已成功用于提取所需的值。将潮汐振幅和相位保存到Mobj.obc_amp
和中,Mobj.obc_phase
然后用于write_FVCOM_spectide
输出到netCDF。
对于边界处的表面高程:
- 使用
Mobj.read_obc_nodes
来识别开放的边界节点,使用TPXO工具tmd_tide_pred
来生成时间序列的每个节点,保存到Mobj.surfaceElevation
和Mobj.el_time
与写出write_FVCOM_elevtide
。
在&NML_OPEN_BOUNDARY_CONTROL
名称列表的部分中,设置以下值:
OBC_ON = T,OBC_NODE_LIST_FILE = 'casename_obc.dat',OBC_ELEVATION_FORCING_ON = T,OBC_ELEVATION_FILE = 'casename_tide.nc',
其中 casename_tide.nc
频谱或表面海拔潮汐的netCDF
2. 潮汐和平均流量
潮汐方面与上面的纯潮汐情况相似,但对于平均流量而言,变得更加复杂。
- 读入SMS网格(
read_sms_mesh
)。 - 提取开放边界节点(
add_obc_nodes_list
),为的参数中的ObcType赋值为2add_obc_nodes_list
(在Beardsley和Haidvogel(1981)之后被“钳制”)。有关ObcType选项,请参见FVCOM手册中的表6.1。 - 读取sigma坐标(用于
read_sigma
加载sigma.dat
文件)。 - 用开放边界(
find_boundary_elements
)上的面识别元素。 - 在开放边界元素的质心处生成边界平均流量值。对于各种输出文件,我们需要u和v以及每个边界节点位置处的深度平均速度。
get_POLCOMS_meanflow
使用PML POLCOMS-ERSEM NetCDF文件将平均流插值到FVCOM开放边界元素和垂直网格。速度数据应该被保存在Mobj.velocity
尺寸[nElements,n时间]和在U和V分量的Mobj.meanflow_u
和Mobj.meanflow_v
作为大小[nElements,nSiglay,n时间]的阵列。 - 可以使用来将开放边界节点处的深度平均速度数据写入netCDF
write_FVCOM_meanflow
。生成的NetCDF文件包括深度比例因子(MFDIST
)以及平均流量(DMFQDIS
)。 - 除了netCDF文件之外,FVCOM还具有许多硬编码的文件
mod_obcs2.F
,对于平均流量条件,还必须将其生成。为此,运行write_FVCOM_meanflow_ascii
,提供与用于创建netCDF文件相同的速度数组(例如Mobj.velocity
,Mobj.meanflow_u
并Mobj.meanflow_v
从POLCOMS数据生成)。
在&NML_OPEN_BOUNDARY_CONTROL
名称列表的部分中,设置以下值:
OBC_ON = T,OBC_NODE_LIST_FILE = 'casename_obc.dat',OBC_ELEVATION_FORCING_ON = T,OBC_ELEVATION_FILE = 'casename_spectide.nc',OBC_MEANFLOW = T,OBC_MEANFLOW_FILE = 'casename_mf.nc',
3. 多个开放边界
的维度Mobj.surfaceElevation
必须为[nObc_nodes, nTime]
,其中nObc_nodes
是用户指定的(OBC_TYPE=1
)或任何其他开放边界类型的所有开放边界的节点总数,并且nTime
是时间步的总数。因此,例如,在一个恒定宽度为11个节点的简单通道的情况下,上游端由用户指定开放边界,下游端封闭,则的大小Mobj.surfaceElevaton
应为11 by nTime
,casename_obc.dat
文件将读取为:
OBC Node Number = 111 n1 12 n2 1...
ni
OBC节点的节点ID 在哪里i
。如果现在将通道的下游端更改为重力波辐射开放边界(OBC_TYPE=5
),而上游端仍是用户指定的开放边界,则casename_obc.dat
文件现在将读取:
OBC Node Number = 221 n1 12 n2 1...12 n12 513 n13 5...
现在Mobj.surfaceElevation
,nTime
即使用户未指定新的开放边界,的尺寸也必须为22 。因此,在此示例中,附加空间Mobj.surfaceElevation
可能用零填充,但尺寸必须为,[nObc_nodes, nTime]
否则FVCOM会导致致命错误。
平均流量注意事项
FVCOM的平均流量部分是FVCOM 2.7代码库中的残差。因此,存在一些粗糙的边缘。
首先,读入的文件mod_obcs2.F
在源中被硬编码:
201 CALL FOPEN(INMF, TRIM(INPUT_DIR)//TRIM(CASENAME)//'_meanflow.dat' ,"cfr")
202 CALL FOPEN(INTCELL,TRIM(INPUT_DIR)//TRIM(CASENAME)//'_tide_cell.dat' ,"cfr")
203 CALL FOPEN(INTNODE,TRIM(INPUT_DIR)//TRIM(CASENAME)//'_tide_node.dat' ,"cfr")
204 CALL FOPEN(INTELEL,TRIM(INPUT_DIR)//TRIM(CASENAME)//'_tide_el.dat' ,"cfr")
205 CALL FOPEN(INTUV, TRIM(INPUT_DIR)//TRIM(CASENAME)//'_tide_uv.dat' ,"cfr")
它们的格式相对简单(请参阅print_vals.F
和mod_obcs2.F
),概述如下。
casename_meanflow.dat
:
nbelID(1)belID(2)...belID(m)1 mfdist(1, 1) mfdist(1, 2) ... mfdist(1, z)2 mfdist(2, 1) mfdist(2, 2) ... mfdist(2, z)...m mfdist(m, 1) mfdist(m, 2) ... mfdist(m, z)ttt(0)dmfqdis(1, 1) dmfqdis(1, 2) ... dmfqdis(1, m)t(1)dmfqdis(2, 2) dmfqdis(2, 2) ... dmfqdis(2, m)...t(n-1)dmfqdis(tt, 1) dmfqdis(tt, 2) ... dmfqdis(tt, m)
其中m
是边界元素的数量,belID
是边界元素ID,mfdist
是平均流量的垂直分布,z
是垂直层的数量,dmfqdis
是平均流量,t
是时间步数(不是时间),tt
是时间步长。
casename_tide_el.dat
:
tt(1) elev(1, 1) elev(1, 2) ... elev(1, m)tt(2) elev(2, 1) elev(2, 2) ... elev(2, m)...tt(t) elev(t, 1) elev(t, 2) ... elev(t, m)
其中tt
是自模型开始以来的时间,以秒t
为单位,是时间步长,m
是边界节点的数量,elev
是开放边界节点的表面高程。
casename_tide_node.dat
:
nbndID(1)bndID(2)...bndID(n)
其中n
是边界节点的数量,bndID
是边界节点ID。
casename_tide_cell.dat
:
ebelID(1)belID(2)...belID(e)
其中e
是边界元素的数量,belID
是边界元素ID。
casename_tide_uv.dat
:
tt(1) ubar(1, 1) ubar(1, 2) ... ubar(1, m)
tt(1) vbar(1, 1) vbar(1, 2) ... vbar(1, m)
tt(1) u(1, 1, 1) u(1, 1, 2) ... u(1, 1, m)
tt(1) v(1, 1, 1) v(1, 1, 2) ... v(1, 1, m)
tt(1) u(1, 2, 1) u(1, 2, 2) ... u(1, 2, m)
tt(1) v(1, 2, 1) v(1, 2, 2) ... v(1, 2, m)
...
tt(1) u(1, z, 1) u(1, z, 2) ... u(1, z, m)
tt(1) v(1, z, 1) v(1, z, 2) ... v(1, z, m)
tt(2) ubar(2, 1) ubar(2, 2) ... ubar(2, m)
tt(2) vbar(2, 1) vbar(2, 2) ... vbar(2, m)
tt(2) u(2, 1, 1) u(2, 1, 2) ... u(2, 1, m)
tt(2) v(2, 1, 1) v(2, 1, 2) ... v(2, 1, m)
tt(2) u(2, 2, 1) u(2, 2, 2) ... u(2, 2, m)
tt(2) v(2, 2, 1) v(2, 2, 2) ... v(2, 2, m)
...
tt(2) u(2, z, 1) u(2, z, 2) ... u(2, z, m)
tt(2) v(2, z, 1) v(2, z, 2) ... v(2, z, m)
...
...
tt(t) ubar(t, 1) ubar(t, 2) ... ubar(t, m)
tt(t) vbar(t, 1) vbar(t, 2) ... vbar(t, m)
tt(t) u(t, 1, 1) u(t, 1, 2) ... u(t, 1, m)
tt(t) v(t, 1, 1) v(t, 1, 2) ... v(t, 1, m)
tt(t) u(t, 2, 1) u(t, 2, 2) ... u(t, 2, m)
tt(t) v(t, 2, 1) v(t, 2, 2) ... v(t, 2, m)
...
tt(t) u(t, z, 1) u(t, z, 2) ... u(t, z, m)
tt(t) v(t, z, 1) v(t, z, 2) ... v(t, z, m)
其中tt
是以秒为单位的时间(由于时间系列的开始?),t
是时间索引,m
是边界元件的数量,z
是西格玛层的数量,u
和v
与平均流量U和V分量(大小[吨, Z,M])和ubar
和vbar
是深度平均平均流量U和v分量(大小[T,M])。
casename_elj_obc.dat
是mod_obcs2.F
在第235行中指定的额外文件:
235 CALL FOPEN(111,TRIM(INPUT_DIR)//TRIM(CASENAME)//'_elj_obc.dat',"cfr")
它的格式casename_tide_el.dat
与第一列非常相似,只是它省略了第一列中的时间戳:
casename_elj_obc.dat
:
elev(1, 1) elev(1, 2) ... elev(1, m)
elev(2, 1) elev(2, 2) ... elev(2, m)
...
elev(tt, 1) elev(tt, 2) ... elev(tt, m)
其中,tt
是时间步数,m
是边界节点的数量,elev
是开放边界节点处的表面高程。
这篇关于开边界设置1:仅生成潮汐以及潮汐和平均流量的开放边界强迫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!