DART(Data Assimilation Research Testbed)是一个数据同化的集合工具,是由NCAR提供支持的集合数据同化社区版工具,其支持提供了大多数模式数据同化接口。

安装

DART的编译依赖于makemkmf两个工具,make是一个非常常用的工具,其记录了各源码文件间的依赖关系,通常由用户自定义。mkmf是一个perl脚本,用来生成make输入文件和示例namelist文件input.nml.program_default

mkmf需要两个输入文件,第一个模版文件定义了特定F90编译器所需要的命令,也包含了DART系统所需要的预编译工具指向的目录。此模版需要根据所使用的系统进行修改。第二个模版文件是DART所需要的path_names文件,无需更改。mkmf使用上述两个文件生成Makefile,成功之后即可使用make进行编译。

构建和自定义mkmf.template文件

DART/build_templates目录下有很多模版文件,文件后缀为系统和编译器名称。

自定义path_names_*文件

每个模式的work目录下都提供了一些path_names_*文件,比如DART/models/lorenz_63/work,这些文件一般不需要自定义修改。

构建Lorenz_63 DART项目

所有的DART程序都可以使用相同的方式编译。每个模式目录中都有一个work目录,其中包含了用于构建可执行程序的文件。下例展示了如何为lorenz_63创建两个可执行程序:preprocessobs_diagpreprocess的构建和运行是用于创建源码支持特定的观测。按照如下方式编译:

1
2
3
4
5
6
cd DART/models/lorenz_63/work
./mkmf_preprocess
make
./preprocess         # 用于生成../../../assimilation_code/modules/observations/obs_kind_mod.f90文件,否则会报错
./mkmf_obs_diag
make

目前work目录下已经有一些DART可执行文件,Lorenz_63模式有7个mkmf_xxxxxx文件,具体描述如下:

1
2
3
4
5
6
7
8
9

Program	                    Purpose
preprocess	                 creates custom source code for just the observations of interest
create_obs_sequence	         specify a (set) of observation characteristics taken by a particular (set of) instruments
create_fixed_network_seq  	 specify the temporal attributes of the observation sets
                             perfect_model_obs	spinup, generate "true state" for synthetic observation experiments, ...
filter	                     perform experiments
obs_diag	                   creates observation-space diagnostic files to be explored by the MATLAB® scripts.
obs_sequence_tool	           manipulates observation sequence files. It is not generally needed (particularly for low-order models) but can be used to combine observation sequences or convert from ASCII to binary or vice-versa. Since this is a specialty routine - we will not cover its use in this document.

quickbuild.csh脚本可用于创建所有的可执行文件,而且可以提供选项构建mpi版本。

1
2
cd DART/models/lorenz_63/work
./quickbuild.csh -nompi

简单运行测试

DART/models/lorenz_63/work目录下提供了一些输入文件,可用于进行简单的测试:使用20个集合成员同化50天逐6小时的观测。运行perfect_model_obsfilter可以得到已知结果的对比结果。

初始条件和观测序列文件为ASCII格式,不存在移植的问题,但是从ASCII转换到机器二进制可能会存在一些问题。对于高度非线形模式,初始条件的微小差异会导致模式结果的不同。

Manhattan发行版使用netCDF文件作为输入文件格式,使用ncgen可进行转换。当转换完成后,执行perfect_model_obsfilter即可:

1
2
3
4
ncgen -o perfect_input.nc perfect_input.cdl
ncgen -o filter_input.nc filter_input.cdl
./perfect_model_obs
./filter

以下是输出文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
																			from executable "perfect_model_obs"
perfect_output.nc   			a netCDF file containing the model trajectory ... the 'truth'
obs_seq.out								The observations (harvested as the true model was advanced) that were assimilated.
 
																				from executable "filter"
preassim.nc								A netCDF file of the ensemble model states just before assimilation. This is the prior.
filter_output.nc					A netCDF file of the ensemble model states after assimilation.
obs_seq.final							The observations that were assimilated as well as the ensemble mean estimates of the 'observations' - for comparison.
 
																						from both
dart_log.out							The run-time log of the experiment. This grows with each execution and may safely be deleted at any time.
dart_log.nml							A record of the input settings of the experiment. This file may safely be deleted at any time.

如果修改了input.nml文件中的设置,输出文件可能会发生变化。

DART/documentation/tutorial 文档是学习DART和集合数据同化的非常有用的资料。

构建DART-WRF

DART也提供了WRF模式的同化模块,进入DART/models/wrf/work 目录可以按照lorenz_63 的构建方式进行编译,编译之前需要更改build_templates/mkmf.template 文件,使用intel编译器,并行库使用impi,编译选项更改为:

1
2
3
4
5
6
MPIFC = mpiifort
MPILD = mpiifort
FC = ifort
LD = ifort

FFLAGS  = -O2 $(INCS) 

编译前执行 echo $NETCDF 查看是否设置了netcdf环境变量,如果未设置,需要在 mkmf.template 文件中显示给定netcdf的路径

1
2
INCS = -I$(NETCDF)/include
LIBS = -L$(NETCDF)/lib -lnetcdff -lnetcdf

上述使用的是netcdfv4.3.0版本,如果使用的是比较老的netcdf版本,上述 LIBS 可能需要更改为

LIBS = -L$(NETCDF)/lib -lnetcdf

然后进入DART/models/wrf/work目录,执行quickbuild.csh脚本,然后编译所有可执行程序,默认编译为并行版。

如果没有出现错误,则表示所有可执行程序都编译成功,最后会出现所有可执行程序均编译成功的提示。

更新记录

2019.05.15 更新DART安装及WRF部分编译