一旦案例创建并设置完成,就是构建可执行文件的时候了。必须使用相同的编译器和标志来构建多个包含源代码的目录。 case.build 执行所有构建操作(设置依赖关系、调用 Make、创建可执行文件)。
4.1. 调用 case.build
在调用 case.setup 后,运行 case.build 来构建模型可执行文件。运行这将:
-
在
$RUNDIR
和$CASEROOT/CaseDocs
中创建组件名称列表。 -
创建由耦合器和组件模型
mct
,pio
,gptl
和csm_share
使用的必要编译库。这些库将被放置在$SHAREDLIBROOT
以下的路径中。 -
为每个组件模型创建必要的编译库。这些库将被放置在
$EXEROOT/bld/lib
中。 -
创建模型可执行文件 (
$MODEL.exe
),该文件将被放置在$EXEROOT
中。
您无需更改默认的构建设置来创建可执行文件,但熟悉它们对于最佳利用系统非常有用。CIME 脚本为您提供了高度的灵活性来定制构建过程。
env_build.xml 变量控制可执行文件的各个方面。大多数变量不应被修改,但用户可以修改这些:
-
$BUILD_THREADED
:如果为 TRUE,模型将使用 OpenMP 构建。 -
$DEBUG
:如果为 TRUE,模型将使用调试标志而不是优化标志进行编译。 -
$GMAKE_J
:GNUMake 在构建时应使用多少个线程。
查看你 $CASEROOT
目录中哪些 xml 变量最好的方法是使用 xmlquery 命令。要获取使用信息,请运行:
$ ./xmlquery --help
要构建模型,切换到你的 $CASEROOT
目录并执行 case.build。
$ cd $CASEROOT
$ ./case.build
诊断性注释会在构建过程中出现。
case.build 命令会生成工具和组件库以及模型可执行文件,并为每个组件生成构建日志。每个日志文件的命名格式为: $component.bldlog.$ datestamp。它们位于 $BLDDIR
目录中。如果它们被压缩(如以.gz 文件扩展名表示),则表示构建成功。
调用 case.build 会在使用 Intel 编译器时在 $EXEROOT
创建以下目录结构:
atm/, cpl/, esp/, glc/, ice/, intel/, lib/, lnd/, ocn/, rof/, wav/
除了 intel/ 和 lib/,每个目录都包含一个用于目标模型组件的编译对象文件的 obj/ 子目录。
mct、pio、gptl 和 csm_share 库被放置在一个反映其依赖关系的目录树中。查看特定组件的 bldlog 以定位库。
特殊的 include 模块被放置在 lib/include。模型可执行文件(例如 cesm.exe 或 e3sm.exe)直接放置在 $EXEROOT
。
组件名称列表、组件日志、输出数据集和重启文件都放置在 $RUNDIR
中。需要注意的是,$RUNDIR
和 $EXEROOT
是独立变量,它们在 $CASEROOT/env_run.xml 文件中设置。
4.2. 重新构建模型
在以下情况下需要重新构建模型:
如果 env_build.xml 或 Macros.make 之一被修改,并且/或者 SourceMods/src. 中添加了代码,最安全的方法是清理构建并从头开始重新构建,如下所示:
$ cd $CASEROOT
$ ./case.build --clean-all
如果你仅修改了 env_mach_pes.xml 中的 PE 布局,可能不需要进行清理。
$ cd $CASEROOT
$ ./case.build
如果自上次构建以来,任何组件中的线程设置已更改(开启或关闭),构建脚本应失败,并显示以下错误和建议从头开始重新构建模型:
ERROR SMP STATUS HAS CHANGED
SMP_BUILD = a0l0i0o0g0c0
SMP_VALUE = a1l0i0o0g0c0
A manual clean of your obj directories is strongly recommended.
You should execute the following:
./case.build --clean
./case.build
---- OR ----
You can override this error message at your own risk by executing:
./xmlchange SMP_BUILD=0
Then rerun the build script interactively.
如果有任何疑问,请重新构建。
运行此命令以清理所有模型组件(除了支持库,如 mct 和 gptl):
$ case.build --clean
运行此命令以清理与构建相关的所有内容:
$ case.build --clean-all
您也可以像这里所示清理单个组件,其中“compname”是要清理的组件的名称(例如,atm、clm、pio 等)。
$ case.build --clean compname
使用**—help**选项获取更多信息。
4.3. 输入数据
所有活动组件和数据组件都使用输入数据集。为了运行 CIME 和符合 CIME 标准的活动组件,本地磁盘需要被填充指定于 xml 变量 $DIN_LOC_ROOT
的目录树中的输入数据。
输入数据作为 CIME 发布的一部分提供,通过来自子版本输入数据服务器的数据。根据案例的需要,它会在服务器上下载。数据可能已经存在于默认本地文件系统的输入数据区域,该区域由 $DIN_LOC_ROOT
指定。
输入数据可能占用系统上相当大的空间,因此如果可能的话,用户应该在每台系统上共享一个公共的 $DIN_LOC_ROOT
目录。
构建过程处理输入数据如下:
-
各种组件
cime_config
目录中的 buildnml 脚本会在Buildconf/$component.input_data_list
文件中创建所需组件输入数据集的列表。 -
由 case.build 调用的 check_input_data 会检查根目录
$DIN_LOC_ROOT
中是否存在所需的输入数据文件。 -
如果所有所需数据集都存在于本地磁盘上,则可以继续构建。
-
如果任何所需输入数据集在本地未找到,则会列出缺失的文件。此时,你必须使用 check_input_data 从输入数据服务器获取所需数据,如这里所示:
./check_input_data --download
env_run.xml 变量 $DIN_LOC_ROOT
和 $DIN_LOC_ROOT_CLMFORC
决定了你应该在本地磁盘上期望输入数据的位置。