开放边界设置
这里的大多数指令都依赖于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 = 11
1 n1 1
2 n2 1
...
ni
OBC节点的节点ID 在哪里i
。如果现在将通道的下游端更改为重力波辐射开放边界(OBC_TYPE=5
),而上游端仍是用户指定的开放边界,则casename_obc.dat
文件现在将读取:
OBC Node Number = 22
1 n1 1
2 n2 1
...
12 n12 5
13 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
:
n
belID(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)
tt
t(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
:
n
bndID(1)
bndID(2)
...
bndID(n)
其中n
是边界节点的数量,bndID
是边界节点ID。
casename_tide_cell.dat
:
e
belID(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
是开放边界节点处的表面高程。