WW3快速demo步骤
ww3是最常用的海浪模拟模型。ww3来源于前沿研究人员的直接贡献,所以代码风格和结构没有成体系地优化,并且totally user unfriendly。所以即使运行最简单的demo test也会踩到不少坑。Here,记录2个新鲜出炉的bug。
WW3 Quick Start步骤超级简单,只需要setup model和通过ftp下载原始nc文件。我克隆好WW3 repo以后,按照manual手册做了以下2个操作:
# 设置编译器和模型模式
model/bin/w3_setup model -c gnu -s NCEP_st4
# 通过ftp下载数据
model/bin/ww3_from_ftp.sh
经过setup和数据下载,就可以开始自行编译ww3 model。
model/bin/w3_make
现在来讲下我在编译过程碰到的2个报错。
argument mismatch
先来看看报错原文。
fortran经过多年的流传,很多不合规代码已经不能为新版本编译器所容忍,所以编译不兼容时有发生。老版本代码没有检验接口参数类型和数量,而新版本gfortran编译器则严苛得多,于是编译时报错。不过ww3被用了这么多年,我们有理由相信接口检验不合格不会影响代码的正常功能。
So,怎么求新编译器放过这个错误惹?最简单的方式就是在编译参数中加入一个新的flag。
-fallow-argument-mismatch
针对我配置的运行示例,我们将model/bin/cmplr.env第262的编译选项中加入了上述flag。
optc='-c -J$path_m -g -fno-second-underscore -ffree-line-length-none -fallow-argument-mismatch'
这样就能避免新编译器矫枉过正。康康chat chat怎么解释allow-argument-mismatch标志。
allow-argument-mismatch标志是gfortran编译器选项之一,允许编译器忽略子程序或函数中实际参数与声明参数之间的不匹配。默认情况下,gfortran会检查参数不匹配,并在参数的数量、类型或种类不匹配时发出错误消息。但是,在某些情况下,例如调用旧代码或与外部库进行接口时,可能需要允许参数不匹配。allow-argument-mismatch标志启用了这种行为,即使存在参数不匹配,也允许代码编译和运行。但是,应谨慎使用,因为如果参数不符合预期,可能会导致未定义的行为和运行时错误。
——By ChatGPT
undefined reference w3iorsmd
well,解决完上一个bug以后,重新编译,马上咱们就遇到了第二个bug——ww3_gint linking error。终端只提示了makefile 512行错误(makefile指的是model/src/makefile)。但是可以在model/obj_XXX/link.err里面看到详细内容,如下图所示。
Which is totally 令人崩溃的。好端端的官方示例为什么会出现未定义函数,excuse me???不过先冷静下来,ww3的源代码的makefile由model/bin/make_makefile.sh脚本制作,每一个模块的依赖都事先在model/bin/build_utils.sh中设定好了。
首先,我们可以肯定ww3_gint.F90代码里面必然使用到了w3iorsmd库函数,但是,当我们打开makefile或者build_utils.sh,可以看到,里面毫无w3iorsmd踪迹。see below。
makefile
build_utils.sh
可以看到里面的依赖包列表并没有w3iorsmd。完全是个BUG,所以我们要自行在列表里添加w3iorsmd库。即,在build_utils.sh的IO中加入该包,如下所示。
现在再编译就没有任何问题惹。