ROMS海洋模式笔记

按网站说明文档上用Subversion工具下载源代码安装
超算服务器提供已编译好的intel编译器、netcdf、impi和openmpi等库
module load 加载库时会自动加载它的依赖库和编译器,这样可以配套加载
比如加载netcdf会自动加载相应的编译器

upwelling application

编译

在 build_roms.bash中
export ROMS_APPLICATION=UPWELLING
export USE_NETCDF4=on # compile with NetCDF-4 library
加载的模块库如下:
(1) intel/15.0.6 2) hdf5/intel15/1.8.13 3) netcdf/intel15/4.3.3.1
串行编译成功

并行编译选择MPI软件测试结果
IMPI和MPICH都会报错,openmpi通过
Currently Loaded Modulefiles:
(1) hdf5/intel15/1.8.13 2) netcdf/intel15/4.3.3.1 3) intel/18.0.2 4) mpi/openmpi/3.1.2-icc18

export         USE_MPI=on              # distributed-memory parallelism
export         USE_MPIF90=on           # compile with mpif90 script
export         which_MPI=openmpi       # compile with OpenMPI library
export         FORT=ifort
export         USE_LARGE=on            # activate 64-bit compilation
export         USE_NETCDF4=on            # compile with NetCDF-4 library

以上设置并行编译成功,关键在于选择适合和相互匹配的软件和编译库

运行

设置环境变量同编译
运行脚本如下

module load netcdf/intel15/4.3.3.1
module load mpi/openmpi/3.1.2-icc18
module unload intel/15.0.6
cd /public4/home/pgv3234/roms/work/upwelling
mpirun -np 4 ./romsM roms_upwelling.in >& log.my_upwelling

要注意的地方

  1. module load mpi/openmpi/3.01-pmix-icc18 #used for srun command
    对应于srun的openmpi库,与编译不一致,所以此处用mpirun命令
  2. -np的cpu核数要等于NtileI * NtileJ具体参见roms_upwelling.in文件
  3. 注意在roms_upwelling.in中指定varinfo.dat的路径

编译和运行自定义实例

ROMS实际个例需要的设置
1.制作网格点 roms 官网上推荐的是MATLAB的seagrid包,安装和使用过程中发现他们已经很久没有更新了,支持的版本都是matlab08、09,linux版需要图形界面,安装库比较老,屡屡失败。推荐使用一款GridBuilder的软件,是Austides公司开发的软件,相当于在seagrid的基础上的更新版,Windows下使用,一键自动安装,比较方便。下载地址如下:https://austides.com/downloads/,其中有较为详细的说明文档。
2.制作初始条件、气候态文件
方法
(1)oa package
由WOA09温盐数据(即Levitus Climatology 根据人名命名)进行客观分析(Objective analysis),根据时空相关映射到roms格点上。
采用的是roms官网上发布的package中的oa工具,下载编译
安装注意:a. 将目录中的Makefile.Gnu重命名为Makefile
b. 更改g77编译器为gfortran
c. 设置netcdf的include路径,文件中是每个地方手动输入,注意搜索所有地方替换,还有没解决的将netcdf的include路径下的netcdf.inc复制到当前文件夹下
d. 设置netcdf的lib路径,gfortran编译会报错undefined函数之类的,解决方法加入 -L/netcdf_path/lib -lnetcdf -lnetcdff即可。(fortran调用netcdf的方法:gfortran -o test.exe -I/netcdf_path/include -L/netcdf_path/lib -lnetcdf -lnetcdff)
e.设置生成可执行文件路径,更改文件夹$home/bin 到自定义文件夹
解决上述问题后,编译成功。
oa的重要作用是水平网格插值,其中需要数据格式转换,转成HDAT格式
其中hydro库编译的时候碰到的问题:
类似的几个文件编译都会报错的问题,主要在于程序比较老,gfortran编译不支持

put_ptem.F:175.14:

     &       <nhvar>(1x,1pe8.2))                                        
              1
Error: Unexpected element '<' in format string at (1)
put_ptem.F:149.24:

        write(outhyd,900) nhvar, nhpts, castid, hlng, hlat, hdpth,      
                        1
Error: FORMAT label 900 at (1) not defined

解决方法:更改格式语句

注释下面两行
c        write(outhyd,900) nhvar, nhpts, castid, hlng, hlat, hdpth,
c     &                    htime, (hscle(n),n=1,nhvar)
改为
        write(format_string,1000),nhvar
1000  format('(1x,i1,1x,i5,1x,i5,1x,f9.4,1x,f8.4,1x,f7.1,1x,f10.4,',
     &       i2,'(1x,1pe8.2)')

        write(outhyd,format_string) nhvar, nhpts, castid, hlng, hlat, hdpth,
     &                    htime, (hscle(n),n=1,nhvar)
     当然同时注释掉900格式,添加characer*80 format_string的声明

但是OA package有一个很大的问题是,插值的格点只能是等经纬度的格点,对于旋转后的格点就没法处理了,这限制了它的使用
(2)matlab 脚本(目前采用的是这种方法)
水平插值也可采用matlab线性插值,读入温盐数据利用interp2函数或者griddata函数线性插值
插值后用fillmissing 函数采用’nearest’方法填充陆地点
对已经插值好的水平网格点,存在oafile中
%%%%注意以上是替代oa package的功能%%%%
采用官网上的matlab脚本创建初始场文件,读取oafile中的数据,使用interp1函数进行垂直插值,注意深度范围和正负,写入数据 (d.initial.m)
!!!!也可使用官网脚本d_Mecator2roms.m经过改动,直接由WOA数据插值创建边界条件,u、v以及zeta设为0,其中的温度和盐度的水平插值同样要采用matlab函数插值!!!!
3. 边界条件
由官网上matlab脚本d_obc_mecator.m修改,以SODA资料作为边界条件,注意将其中的Nan值和0值以附近值填充
4. 强迫场
强迫场输入可以采用两种方式,一种一个文件输入一个强迫场,另一种可以合并在一个文件中。输入强迫场可以不用插值直接输入,roms会自动插值和矢量旋转(目前碰到读取错误未解决),另外也可以插值到roms网格并进行矢量旋转后再输入(关于矢量旋转存在疑问,roms是有内置代码进行旋转的,但是前提必须是从粗网格插值的时候??)。

notes

  1. 模式经常采用的时间为:seconds since 1960.01.01等类似的,可用matlab的函数处理mjuliandate
    儒略日(Julian day)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。
    Modified Julian day: 由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为 MJD = JD - 2400000.5。MJD相应的起点是1858年11月17日世界时0时。
    2.日期处理函数
    datestr天数转化为日期,起始为0000-Jan-00
    datenum(Date,format)日期转为天数,format参见help datestr

代码搜索

对于模式中的说明文档不够详细的地方,需要我们去阅读源代码,理解模式的运行方式.
windows下IDE可以实现方便的搜索
linux下,进入到ROMS文件夹内,搜索所有.F后缀的文件,以搜索“SSH_TIDES”为例

grep -ni "SSH_TIDES" `find ./ -name *.F`
vi搜索忽略大小写:/tides\c

改善模式模拟效果

与观测资料的比对发现,SST的模拟对海表面强迫非常敏感
采用不同的资料,运行一段时间后会显著不同

目前发现
采用coads模拟的clomatology run 二月份日本海和渤海水域水温偏低
使用ERA5和SODA边界运行一个月以后,可被纠正,但是ERA5强迫下渤海区域水温偏高(此处采用bulk方案)
GFS使用平均的短波长波辐射通量,比采用WRF短波辐射小,模拟的SST偏低

后续采用bulk方案测试一下结果看看

notes

测试中发现viscosity 和 diffusion系数影响模式稳定性,在风速较大时,系数调小会溢出
当然和其他参数可能也有关系

### 回答1: 海洋数值模式是通过对海洋物理、化学和生物过程进行数值模拟,来预测海洋现象和变化的工具。对于不同的海洋现象,应该采用对应的海洋数值模式,以便更精确地进行预报。 以下是一些常见的海洋现象及推荐的数值模式: 1. 海洋温度和海表面高度:使用海洋大气耦合模式(例如在中国常用的FVCOM模式)和海洋环流模式(例如ROMS模式)。 2. 海洋波浪:使用波浪数值模式(例如SWAN模式)。 3. 潮汐:使用潮汐数值模式(例如TPXO模式)。 4. 海洋酸化:使用海洋生态模式(例如NEMURO模式)和海洋碳循环模式(例如CESM模式)。 5. 海洋风暴潮:使用风暴潮数值模式(例如ADCIRC模式)。 需要注意的是,不同的数值模式有其各自的优缺点和适用范围,同时也需要根据预报需求和数据可用性进行选择。 ### 回答2: 在预报不同海洋现象时,应根据具体现象的特点和需求来选择合适的海洋数值模式海洋数值模式是通过数学方程描述海洋物理过程,模拟海洋状态和变化的工具。 对于海浪预报,可采用基于波浪动力学理论的数值模式,如WAM (WINDS WAVE MODELLING)模式、SWAN (SIMULATING WAVES NEARSHORE)模式等。这些模式能够根据风场和海底地形等参数,计算波浪的传播、变形和衰减等过程,准确预报海浪的高度、周期和方向等信息,为海上、近岸、沿岸等任务提供支持。 对于海流预报,可采用基于海洋动力学理论的数值模式,如ROMS (REGIONAL OCEAN MODELING SYSTEM)模式、HYCOM (HYBRID COORDINATED OCEAN MODEL)模式等。这些模式能够模拟海流的产生、传输和演变过程,预报海流的强度、方向和变化趋势等信息,为航海、渔业、海洋工程等提供参考。 对于海洋温度和盐度预报,可采用基于海洋热力学和海洋化学理论的数值模式,如MITgcm (MASSACHUSETTS INSTITUTE OF TECHNOLOGY GENERAL CIRCULATION MODEL)模式、NEMO (NORTH ATLANTIC AND ARCTIC MODELING FRAMEWORK)模式等。这些模式能够模拟海洋的热盐环流和混合过程,预报海洋的温度、盐度和密度等信息,对海洋环境、气候变化等研究具有重要意义。 当预报的海洋现象涉及多个物理过程交互作用时,还可以使用耦合模式,将不同的数值模式进行耦合,模拟海洋的综合变化。这样能够更精确地预报海洋现象的时空分布和演变过程,提高预报的准确性和全球覆盖范围。 总之,在预报不同海洋现象时,应根据具体的需求和研究目标,选择合适的海洋数值模式,以实现准确、可靠的预报结果。 ### 回答3: 在预报不同海洋现象时,应该根据具体情况选择合适的海洋数值模式进行预报。 首先,对于海洋温度和盐度的预报,可以采用海洋通用循环模式(OGCM)来模拟海洋的动力和物理过程。OGCM能够模拟海洋的水循环、热量传输和盐分输运,可以准确预测海洋的温度分布和盐度分布。 其次,对于海洋风和波浪的预报,可以使用海洋风场数值模式海洋波浪数值模式海洋风场数值模式可以模拟风对海洋的作用,预测海面风速和风向的变化,从而预报海洋表面流场的分布。海洋波浪数值模式可以模拟波浪的传播和变形过程,预报海洋的波浪高度、波长和波向等参数。 此外,对于海洋潮汐的预报,可以使用潮汐模式。潮汐模式能够计算海洋潮汐的周期、振幅和相位等信息,预测潮汐的变化规律,对于海洋工程和航海等应用具有重要意义。 最后,对于海洋环境的预报,可以综合运用以上各种数值模式,例如同时预报海洋风、波浪和潮汐的变化情况,对海洋环境的变化进行全面分析和预测。 总之,对于不同的海洋现象,我们应该根据需求选择适合的海洋数值模式进行预报,以提高预报的准确性和可靠性。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值