官方教程,请查阅wikiROMS(https://www.myroms.org/wiki/ROMS_Mac)
查找安装roms所需要的支持软件及位置
- make, Xcode, Perl, svn
- gfortran
- mpi
- netcdf
安装支持软件
可直接在homebrew官网(https://formulae.brew.sh)搜索,用brew install的命令下载即可
查询位置
gfortran
which gfortran
电脑里如果已安装,则通过which查询路径即可,如果未安装,可直接通过brew进行安装,因为gfotran已经集成到gcc里,因此可参考一下代码
brew install gcc
我个人which到的gfortran在
但通过检索,可以发现在/opt/homebrew/Cellar/里有完整的一些含头文件、库文件的包,因此后面设置环境变量时用的是Cellar内的路径。建议有兴趣也可以自行检索。
mpi
which mpirun
同理可查找mpi所在的路径
Cellar:
netcdf
which ncdump
Cellar:
下载roms
在官网注册roms的账号
下载
- 创建并进入roms安装的文件夹
cd ~ mkdir ROMS cd ROMS #我选择安装在主目录下的ROMS目录里
- 下载roms包
svn checkout --username joeroms https://www.myroms.org/svn/src/trunk #把joeroms改成自己的roms账号用户名,下载好后会发现有一个ROMS下有一个trunk的目录 svn checkout --username joeroms https://www.myroms.org/svn/src/trunk mydir #也可指定文件夹,下载好后会发现ROMS下有一个mydir的目录
自定义构建脚本
ROMS源代码在trunk/ROMS/Bin目录中附带一个构建脚本。提供了用sh(build_roms.sh)和csh(build.sh)编写的示例。接下来,将选择用sh脚本作示范
Upwelling示例创建和配置
- 新建upwelling算例
- 复制所需要的文件
- 修改build_roms.sh
- 修改my_build_paths.sh
- 修改Linux-gfortran.mk(它好像不起作用,请忽略)
在trunk同级目录下创建Projects的新文件夹,并在下面创建upwelling的算例
mkdir Projects
cd Projects
mkdir Upwelling
cd Upwelling
复制所需要的文件
cp ../../trunk/ROMS/External/roms_upwelling.in .
cp ../../trunk/ROMS/Include/upwelling.h .
cp ../../trunk/ROMS/Bin/build_roms.sh .
修改build_roms.sh
export ROMS_APPLICATION=UPWELLING
export MY_ROOT_DIR=/Users/username/ROMS
export MY_PROJECT_DIR=${MY_ROOT_DIR}/Projects/Upwelling
# export MY_CPP_FLAGS= #要把这行注释掉
export USE_MPI=on
export USE_MPIF90=on
export which_MPI=openmpi #可选择mpi方案openmpi,mpich...
export FORT=gfortran #可选择ifort,gfortran...
export USE_NETCDF4=on #选择netcdf4或者netcdf3
export USE_MY_LIBS=yes #使用自己安装的库
修改情况如上所示
修改my_build_paths.sh
如果在build_roms.sh中选择USE_MY_LIBS=yes,则需要修改my_build_paths.sh以配置自己的环境变量。注意需要修改的有:mpi,netcdf4,hdf5。
因为我选择的是gfortran,openmpi,故找到gfortran栏,修改openmpi,netcdf4,hdf5:
elif [ "${which_MPI}" = "openmpi" ]; then
export MPI_SOFT=/opt/homebrew/Cellar/open-mpi/4.1.4_1 #mpi
export NETCDF=/opt/homebrew/Cellar/netcdf/4.8.1_3 #netcdf4
export HDF5=/opt/homebrew/Cellar/hdf5/1.12.2_1 #hdf5
修改Linux-gfortran.mk
ifdef USE_NETCDF4
# NF_CONFIG ?= nf-config
# NETCDF_INCDIR ?= $(shell $(NF_CONFIG) --prefix)/include
# LIBS += $(shell $(NF_CONFIG) --flibs)
# INCDIR += $(NETCDF_INCDIR) $(INCDIR)
NETCDF_INCDIR ?= /opt/homebrew/Cellar/netcdf/4.8.1_3/include
NETCDF_LIBDIR ?= /opt/homebrew/Cellar/netcdf/4.8.1_3/lib
NETCDF_LIBS ?= -lnetcdf
LIBS += -L$(NETCDF_LIBDIR) $(NETCDF_LIBS)
INCDIR += $(NETCDF_INCDIR) $(INCDIR)
else
NETCDF_INCDIR ?= /opt/gfortransoft/serial/netcdf3/include
NETCDF_LIBDIR ?= /opt/gfortransoft/serial/netcdf3/lib
NETCDF_LIBS ?= -lnetcdf
LIBS += -L$(NETCDF_LIBDIR) $(NETCDF_LIBS)
INCDIR += $(NETCDF_INCDIR) $(INCDIR)
endif
ifdef USE_HDF5
HDF5_INCDIR ?= /opt/homebrew/Cellar/hdf5/1.12.2_1/include
HDF5_LIBDIR ?= /opt/homebrew/Cellar/hdf5/1.12.2_1/lib
# HDF5_INCDIR ?= $(HDF5_INC)
# HDF5_LIBDIR ?= $(HDF5_LIBDIR)
HDF5_LIBS ?= -lhdf5_fortran -lhdf5hl_fortran -lhdf5 -lz
LIBS += -L$(HDF5_LIBDIR) $(HDF5_LIBS)
INCDIR += $(HDF5_INCDIR)
endif
Upwelling示例编译
cd ~/ROMS/Projects/Upwelling
./build.bash
编译成功后可以看到romsM的可执行文件
Upwelling示例运行
- 对oms_upwelling.in进行修改
! VARNAME = ROMS/External/varinfo.yaml VARNAME = /Users/dan_chen/ROMS/trunk/ROMS/External/varinfo.yaml NtileI == 2 ! I-direction partition NtileJ == 2 ! J-direction partition ! 如果需要多核并行,还需修改 NtileI 和 NtileJ:确保并行使用的核数 =NtileI × NtileJ
- 运行
./romsM < roms_upwelling.in #使用串行编译 mpirun -n 1 ./romsM roms_upwelling.in #并行编译单核运行,相当于串行 mpirun -n 4 ./romsM roms_upwelling.in # 并行编译4核运行 mpirun -n 4 ./romsM roms_upwelling.in > log.roms # 保存运行信息到log.roms
- 运行成功可在log日志看到ROMS/TOMS: DONE...,此时upweilling目录下出现生成的nc文件
参考
- https://www.myroms.org/wiki/ROMS_Mac
- https://www.myroms.org/forum/viewtopic.php?t=5713
- https://zhuanlan.zhihu.com/p/545513615