Skip to Content
教程列表Cime构建 Case

一旦案例创建并设置完成,就是构建可执行文件的时候了。必须使用相同的编译器和标志来构建多个包含源代码的目录。 case.build 执行所有构建操作(设置依赖关系、调用 Make、创建可执行文件)。

4.1. 调用 case.build

在调用 case.setup 后,运行 case.build 来构建模型可执行文件。运行这将:

  1. $RUNDIR$CASEROOT/CaseDocs 中创建组件名称列表。

  2. 创建由耦合器和组件模型 mct, pio, gptlcsm_share 使用的必要编译库。这些库将被放置在 $SHAREDLIBROOT 以下的路径中。

  3. 为每个组件模型创建必要的编译库。这些库将被放置在 $EXEROOT/bld/lib 中。

  4. 创建模型可执行文件 ($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/ 子目录。

mctpiogptlcsm_share 库被放置在一个反映其依赖关系的目录树中。查看特定组件的 bldlog 以定位库。

特殊的 include 模块被放置在 lib/include。模型可执行文件(例如 cesm.exee3sm.exe)直接放置在 $EXEROOT

组件名称列表、组件日志、输出数据集和重启文件都放置在 $RUNDIR 中。需要注意的是,$RUNDIR$EXEROOT 是独立变量,它们在 $CASEROOT/env_run.xml 文件中设置。

4.2. 重新构建模型

在以下情况下需要重新构建模型:

如果 env_build.xmlMacros.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.

如果有任何疑问,请重新构建。

运行此命令以清理所有模型组件(除了支持库,如 mctgptl):

$ 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 决定了你应该在本地磁盘上期望输入数据的位置。

Last updated on