最近入坑了海洋模式,决定从FVCOM入手试试水,奈何从安装虚拟机开始竟然每一步都走的如此艰难,特此写下这个文章,为诸位提供便利的同时记录这一心酸的历史。
致谢:
本文主要基于以下两大教程:
1.鲲鹏社区 - 气象行业应用移植指南
2.优快云 - Netcdf4.4的安装过程(毕竟安装过程的一大半是装netcdf库)
https://blog.youkuaiyun.com/schumacher2016/article/details/80850240
1. VMware安装与虚拟机配置
| 项目 | 版本 | 下载地址 |
| VMware Workstation Pro | 17.6.1 | https://pan.baidu.com/s/1tg-abYmbHFYv-Fy8vvY0nw?pwd=zthq |
| CentOS 7 x86_64 | 7.6.1810 | https://pan.baidu.com/s/1HOJ_eQX3tga_N7pkwoycqQ?pwd=zfqy |
1.1 VMware的下载
2023年11月22日,博通正式宣布收购VMware。加入博通之后,VMware 的官方名字也改成了 VMware by Broadcom。收购Vmware后,workstation也随之从永久许可转为订阅制,同时面向个人免费。
坏消息是,2024年5月5日之后,VMware workstation不能直接在vmware官网进行下载了,需要在博通网站上进行下载。VMware Workstation Pro下载链接 与原来相比,下载前需要注册,且下载地址及其难找,对新用户来说非常不友好。虽然我在上面给出了17.6.1版本的安装包,但考虑到以后还会更新,详细的下载过程可以参考这篇帖子:[2025年]最新VMware Workstation虚拟机下载并安装
好消息是, 2024年11月12日后,VMware宣布了VMware Workstation和VMware Fusion完全免费。但只有当前最新版本以及以后的版本才支持个人使用 (Personal Use) 免费许可。以 Workstation Pro 为例,在第一次启动时会要求你输入 license key,对于个人用户而言,你只需要选 Personal Use 就可以免费使用了。
1.2 VMware的安装
我唯一的建议是安装时关闭360安全卫士等杀毒软件,避免许多烦心事。
可以直接参考下面这篇帖子,写的挺详细的:
1.3 配置CentOS 7
可以参考这篇帖子的后半部分:
vm15+CentOS7安装(超级详细,保姆级教学,小白也会)
比较反人类的一点是每一步的“完成”在左上角,点击之后才能进入下一步。
注意:一定要每一步都按教程设置,比如软件选择要选“GNOME桌面”,而非默认的“最小化”
1.4 安装图形化界面
如果选择了“GNOME桌面”,则这一步可以跳过!!
我说最后一步安装感觉挺快的,没几分钟就装好了,选择最小化的代价就是没有图形化界面,取而代之的是命令行:

虽然也能凑合用,但毕竟用的不爽,所以接下来就要装一下图形化界面,参考的是这篇帖子:
当然,这对新手及其不友好,因为你装着装着就会发现——当前的镜像地址无法找到yum所需的文件!究其原因是CentOS 7 的官方仓库在 2024 年 6 月 30 日之后已经停止维护。所以使用 CentOS 7 官方仓库可能会遇到问题,那就只能换源。

所以最简单粗暴的方式是——删掉这个虚拟机重装。
删除的方法是打开安装的位置,删除所有文件后,再在VMware里移除就可以了。
1.5 共享文件夹解决方案之一 —— 手动挂载(不推荐)
此方法操作简单,但不建议在共享文件夹中进行安装操作,这容易带来问题
若虚拟机重启后找不到共享文件夹,则需重新挂载
1.6 共享文件夹解决方案之二——Samba (推荐)
如果不介意用稍微麻烦一些的操作换来更流畅的体验,也可以使用Samba
Win 访问 CentOS samba配置的共享文件夹(简单配置看这篇足够了)
注:这篇文章中,作者在配置smb.conf一节中将其路径写错了,应为:
sudo vim /etc/samba/smb.conf
因为 smbpasswd 命令只能添加系统已知的用户,因此我所采用的添加用户的顺序为:
sudo useradd lethal
sudo passwd lethal
sudo smbpasswd -a lethal
创建共享文件夹操作:
sudo mkdir -p /NetShare
sudo chmod -R 777 /NetShare
sudo cp -rp /etc/samba/smb.conf /etc/samba/smb.conf.bak
配置smb.conf
[NetShare]
comment = Share Directories
path = /NetShare
valid users = lethal
browseable = yes
public = yes
writeable = yes
配置防火墙:
sudo setenforce 0
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
sudo systemctl restart firewalld
CentOS 7 Samba 共享实现(防火墙开启 + SELinux 强制模式)
1.7 提高界面清晰度
如果觉得虚拟机的分辨率不忍直视,也可以稍作调整,增加一下清晰度
2. FVCOM的基础环境搭建
| 项目 | 版本 | 下载地址 |
| zlib | 1.2.8 | https://pan.baidu.com/s/1beKr3EXRU_C7KBStKI9f9Q?pwd=7xg4 |
|---|---|---|
| hdf5 | 1.10.5 | https://pan.baidu.com/s/1ILwaRnbv8TZ1nF5t4NaLBw?pwd=cx8q |
| netcdf-c | 4.7.0 | https://pan.baidu.com/s/1_y55XFnmYAGqJQQDXoCfpA?pwd=hd5u |
| netcdf-fortran | 4.4.5 | https://pan.baidu.com/s/19j0mMwkH6RdgwSgRGpLk5Q?pwd=xibc |
| metis | 4.0.3 | https://pan.baidu.com/s/1Dxa_zAdtD06Gu42Zp4SFmQ?pwd=sjjx |
| metis补丁 | 4.0 | https://pan.baidu.com/s/1mslnf-pplRGNemWxVW82rg?pwd=wh9s |
| openmpi | 5.0.9 | https://pan.baidu.com/s/1cNUIP_Yf5h9P2M6jHo-0FA?pwd=7vzx |
NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,对程序员来说,它和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。
注:netcdf 4.1.3及之前的版本中,C lib和fortran lib没有分开,netcdf4.2以上的版本c库和fortran库分开。这就导致了netcdf-fortran-4.2的安装麻烦了一点,需要依次安装 zlib,hdf5,netcdf,netcdf-c,netcdf-fortran。
2.1 安装之前的说明
1. 在开始前,我们需要下载好表2中的安装包,并统一放到共享文件夹路径下,这里我放在了
/NetShare
路径下。
2. 由于安装netcdf4需要zlib和hdf5,我们将把这些安装在同一个目录下,这里我放在了
/usr/local/netcdf4-needed
路径下,方便后面的环境变量配置。
3. 安装使用的是root用户,如果读者用户没有root权限,可以使用sudo来提升权限。
4. 如果使用yum的官方源进行yum install xxxx 的时候,速度非常慢,则建议将CentOS的yum源 替换为国内的镜像源。
2.2 安装zlib
应该是用于数据压缩,szip安装同zlib
1. 复制安装包到虚拟机(直接在共享文件夹中安装可能会出问题)
cd /usr/local
mkdir ./netcdf4-needed
cd netcdf4-needed/
mkdir ./packages
cd packages/
cp /NetShare/zlib-1.2.8.tar.gz ./
2. 解压安装包
tar -zxvf zlib-1.2.8.tar.gz
3. 配置安装信息
cd zlib-1.2.8
./configure --prefix=/usr/local/netcdf4-needed
其中可以使用 ./configure--help来查看可以使用哪些选项。这里选择默认选项安装。
4. 编译、检查、安装
make -j 4 # 使用4个线程编译
make check
make install
安装完成之后会在/usr/local/netcdf4-needed这个目录下生成三个文件lib include share
2.3 安装openmpi
openmpi是一个开源的并行计算库,用于在集群计算环境中进行并行计算
1. 将文件保存到虚拟机并解压
cd /usr/local/netcdf4-needed/packages
cp /NetShare/openmpi-5.0.9.tar.gz ./
tar -xvf openmpi-5.0.9.tar.gz
2. 配置安装路径,编译并安装
这一步里面/configure时间比较久,不要忘了进行后面的步骤。
cd openmpi-5.0.9/
./configure --prefix=/usr/local/openmpi
make -j 4
make install
3. 设置环境变量,路径为自己安装的路径
export MPI_HOME=/usr/local/openmpi
export PATH=${MPI_HOME}/bin:$PATH
export LD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATH
export MANPATH=${MPI_HOME}/share/man:$MANPATH
4. 验证安装成功,测试一下自带的例子
cd openmpi-5.0.9/examples
make -j 4
mpirun -np 4 hello_c
执行结果如下:

2.4 安装hdf5
hdf5是为了使用netcdf-4特性,这个特性需要hdf5来支持,这个特性支持2G以上的文件。
1. 复制安装包到虚拟机(直接在共享文件夹中安装可能会出问题)
cd /usr/local/netcdf4-needed/packages
cp /NetShare/hdf5-1.10.5.tar.gz ./
2. 解压
tar -xvf hdf5-1.10.5.tar.gz
3. 配置安装信息
cd hdf5-1.10.5
./configure --prefix=/usr/local/netcdf4-needed --with-zlib=/usr/local/netcdf4-needed/ --enable-fortran --enable-parallel CC=mpicc FC=mpif90 CXX=mpicxx
4. 编译、检查、安装
make -j 4
make check
make install
安装完成后,会被安装进 /usr/local/netcdf4-needed目录下的四个文件lib include share bin 中.
2.5 安装netcdf-c
1. 复制安装包并解压
cd /usr/local/netcdf4-needed/packages
cp /NetShare/netcdf-c-4.7.0.tar.gz ./
tar -zxvf netcdf-c-4.7.0.tar.gz
2.配置安装信息
cd netcdf-c-4.7.0/
# 运行以解决configure: error: curl required for byte range support. Install curl or build without --enable-byterange.
yum install curl
yum install libcurl-devel
./configure --prefix=/usr/local/netcdf4-needed LDFLAGS=-L/usr/local/netcdf4-needed/lib CPPFLAGS=-I/usr/local/netcdf4-needed/include CC=mpicc --disable-dap
3. 编译、检查、安装
make -j 4
make check
make install
4. 设置NETCDF-C的环境变量
export PATH=/usr/local/netcdf4-needed/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/netcdf4-needed/lib:$LD_LIBRARY_PATH
export NETCDF=/usr/local/netcdf4-needed
2.6 安装netcdf-fortran
1. 复制安装包并解压
cd /usr/local/netcdf4-needed/packages
cp /NetShare/netcdf-fortran-4.4.5.tar.gz ./
tar -zxvf netcdf-fortran-4.4.5.tar.gz
2.配置安装信息
cd netcdf-fortran-4.4.5/
./configure --prefix=/usr/local/netcdf4-needed CPPFLAGS=-I/usr/local/netcdf4-needed/include LDFLAGS=-L/usr/local/netcdf4-needed/lib CC=mpicc FC=mpif90 F77=mpif90
注意:此处如果没有输入 --disable-dap的话,要预先安装curl. dap应该是用于远程数据处理相关的,这里不安装也行。
3.编译、检查、安装
make -j 4
make check
make install
2.7 配置环境变量
1. 终端中输入
vim ~/.bashrc
按i进入插入模式,输入如下信息:
export NETCDF=/usr/local/netcdf4-needed
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH
export CPPFLAGS='-I/usr/local/netcdf4-needed/include'
export LDFLAGS='-L/usr/local/netcdf4-needed/lib'
输入完成保存退出(先按esc键,然后输入:wq! 保存退出)
2. 终端中输入
source ~/.bashrc
使环境变量生效
3. FVCOM的安装与调试
| 项目 | 版本 | 下载地址 |
| fvcom | 4.1 | https://pan.baidu.com/s/1B2Mx51LffyJRGj5A36o2HQ?pwd=c8bc |
3.1 创建主程序安装目录并复制安装包
mkdir -p /path/to/FVCOM
cp /NetShare/fvcom-4.1.tar.gz /path/to/FVCOM
cd /path/to/FVCOM
tar -xvf fvcom-4.1.tar.gz
cd FVCOM4.1
3.2 配置相关文件
# 复制“make.inc_example”文件为“make.inc”
cp Examples/Estuary/make.inc_example FVCOM_source/make.inc
# 创建“make.inc”文件软链接
ln -sf FVCOM_source/make.inc ./
# 编辑“make.inc”文件
vim make.inc
3.3 修改配置
按“i”进入编辑模式
修改TOPDIR变量值(第51行)为源码目录,注意行尾不能出现空格:
TOPDIR = /path/to/FVCOM/FVCOM4.1/FVCOM_source
修改第79、80行:
LIBDIR = -L$(INSTALLDIR)/lib -L../METIS_source/metis -L./libs/julian
INCDIR = -I$(INSTALLDIR)/include -I../METIS_source/metis -I./libs/julian
修改第97、98行:
# -L 选项用于指定链接器在搜索库文件时应该包括的额外目录
IOLIBS = -L/usr/local/netcdf4-needed/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lz -lcurl -lm
# -I 选项用于指定编译器在搜索头文件时应该包括的额外目录
IOINCS = -I/usr/local/netcdf4-needed/include
注释掉并添加以下内容:
# Intel/MPI Compiler Definitions (SMAST)
#--------------------------------------------------------------------------
# CPP = /usr/bin/cpp
# COMPILER = -DIFORT
# CC = mpicc
# CXX = mpicxx
# CFLAGS = -O3
# FC = mpif90
# DEBFLGS = -check all traceback
# Use 'OPT = -O0 -g' for fast compile to test the make
# Use 'OPT = -xP' for fast run on em64t (Hydra and Guppy)
# Use 'OPT = -xN' for fast run on ia32 (Salmon and Minke)
# OPT = -O0 –g
# OPT = -axN –xN
# OPT = -O3
# gfortran defs
#--------------------------------------------------------------------------
CPP = /usr/bin/cpp
COMPILER = -DGFORTRAN
CC = mpicc
CXX = mpicxx
FC = mpif90
DEBFLGS =
OPT = -O3 -ffixed-line-length-none -ffree-form -ffree-line-length-none
CLIB =
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
3.4 创建编译环境变量文件
创建环境变量文件
cd /path/to/FVCOM/FVCOM4.1
vim env-fvcom.sh
按“i”进入编辑模式,添加如下内容:
export GCC_HOME=/path/to/GNU
export PATH=$GCC_HOME/bin:$PATH
export LD_LIBRARY_PATH=$GCC_HOME/lib:$GCC_HOME/lib64:$LD_LIBRARY_PATH
export MPI_HOME=/usr/lib64/openmpi
export PATH=$MPI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
export HDF5=/usr/local/netcdf4-needed
export PATH=$HDF5/bin:$PATH
export LD_LIBRARY_PATH=$HDF5/lib:$LD_LIBRARY_PATH
export NETCDF=/usr/local/netcdf4-needed
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
加载环境变量:
source env-fvcom.sh
3.5 编译METIS库
# 进入METIS安装路径
cd ./METIS_source
# 解压METIS安装包
tar -zxvf metis.tgz
# 将补丁文件复制至当前目录
cp /NetShare/metis-4.0.patch ./
# 进入“metis”目录并运行补丁文件
cd metis
patch -p2 < ../metis-4.0.patch
# 创建相应目录
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/lib
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/include
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/bin
# 编译安装METIS库。
make -j 4
make install
3.6 编译julian库
# 进入julian安装路径。
cd ../../FVCOM_source/libs
# 解压julian.tgz安装包。
tar -zxvf julian.tgz
# 进入解压后路径。
cd julian
# 编译安装。
make -j 4
make install
3.7 编译FVCOM主程序
# 进入FVCOM安装路径。
cd /path/to/FVCOM/FVCOM4.1/FVCOM_source
# 编辑“mod_newinp.F”文件。
vim mod_newinp.F
按“i”进入编辑模式,修改如下内容:
第一个“contains”语句添加如下内容:
!----------------------------------------
! functions
!----------------------------------------
contains
Character( Len = 256 ) Function N_Fmt( c , n )
Character( Len = * ) , Intent( IN ) :: c
Integer , Intent( IN ) :: n
integer :: i , j
character( len = 16 ) :: cn
i = index( c , '<' )
j = index( c , '>' )
write( cn , '(g0)' ) n
N_Fmt = c(:i-1) // Trim(adjustL(cn)) // c(j+1:)
End Function N_Fmt
第352行:修改前:write(*,'(A20,<size>F10.4)')trim(argname)//': ',fval(1:SIZE)
write(*,N_Fmt('(A20,<size>F10.4)',SIZE))trim(argname)//': ',fval(1:SIZE)
第421行:修改前:write(*,'(A20,<size>I10)')trim(argname)//': ',ival(1:SIZE)
write(*,N_Fmt('(A20,<size>I10)',SIZE))trim(argname)//': ',ival(1:SIZE)
第494行:修改前:write(*,'(A20,<size>L10)')trim(argname)//': ',cval(1:SIZE)
write(*,N_Fmt('(A20,<size>L10)',SIZE))trim(argname)//': ',cval(1:SIZE)
第567行:修改前:write(*,'(A20,<size>A10)')trim(argname)//': ',sval(1:SIZE)
write(*,N_Fmt('(A20,<size>A10)',SIZE))trim(argname)//': ',sval(1:SIZE)
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
在命令行中直接输入:
# 分别修改“mod_scal.F”、“internal_step.F”、“adv_t.F”、“adv_s.F”文件,对文件中以
# “IF(BACKWARD_ADVECTION”开头的语句进行相应修改,修改“==”为“.eqv.”,修改“/=”为“.neqv”.
sed -i 's/\/=\.TRUE\./\.neqv\.\.TRUE\./g' mod_scal.F
sed -i 's/==\.TRUE/\.eqv\.\.TRUE/g' internal_step.F
sed -i 's/==\.FALSE\./\.eqv\.\.FALSE\./g' adv_t.F
sed -i 's/==\.FALSE\./\.eqv\.\.FALSE\./g' adv_s.F
编译安装主程序:
make -j 4
安装成功后,可使用ll命令在当前目录查看生成的可执行文件“fvcom”
ll fvcom
执行效果如下:

3.8 Estuary算例运行和验证
# 进入FVCOM安装路径。
cd /path/to/FVCOM/FVCOM4.1/FVCOM_source
# 创建测试目录。
mkdir -p /path/to/FVCOM/test
# 进入测试目录。
cd /path/to/FVCOM/test
# 复制测试算例到当前目录。
cp -r /path/to/FVCOM/FVCOM4.1/Examples/Estuary/ ./
# 进入运行目录。
cd ./Estuary/run
编辑算例输入文件。
# 打开算例输入文件
vim tst_run.nml
按“i”进入编辑模式,为第171行的“tst_grd.dat”增加单引号。
GRID_FILE = 'tst_grd.dat'
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
将进程数 (-n) 调整为 ≤ CPU 核心数(可通过 nproc 查看),执行以下命令运行测试:
nproc # 查看可用CPU核心数(例如输出4)
time mpirun -n 4 --allow-run-as-root --bind-to core /path/to/FVCOM/FVCOM4.1/FVCOM_source/fvcom --casename=tst
接下来就能看到FVCOM的logo并等待程序执行:

等几分钟,就能看到程序结束后弹出执行时间花销的信息,此时再输入
# ll 相当于 ls -l,比ls列出的信息更加详细
ll
就能看到输出的nc文件:

完结撒花!
第一次写博客,如果觉得有用的话,就请给我一键三连吧!!
6953





