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:

     &       (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系数影响模式稳定性,在风速较大时,系数调小会溢出
当然和其他参数可能也有关系

你可能感兴趣的:(数值模式,matlab)