FESOM
The Finite Element Sea-ice Ocean Model (FESOM) is an unstructured mesh global ocean model using finite element methods to solve the hydro-static primitive equations with the Boussinesq approximation (Danilov et al., 2004 [1]; Wang et al., 2008 [2]). FESOM v1.4 is interfaced with DART by Aydoğdu et al. (2018a) [3] using a regional implementation in Turkish Straits System (Gürses et al. 2016 [4], Aydoğdu et al. 2018b [5]).
There is a recent version of the model called the Finite-volumE Sea ice–Ocean Model (FESOM2, Danilov et al. 2017 [6]). A version for coastal applications FESOM-C v.2 (Androsov et al., 2019 [7]) has also been published.
The FESOM V1.4 source code can be downloaded from https://fesom.de/models/fesom14
The FESOM/DART interfaces, diagnostics and support scripting were contributed by Ali Aydoğdu. Thanks Ali!
Overview
model_mod.f90
A module called fesom_modules is provided to pass the information from FESOM to DART. fesom_modules.f90 includes fortran routines adopted from FESOM v1.4 to read the mesh, set the variables and dimensions of the arrays. fesom_modules should have access to nod2d.out, nod3d.out, elem2d.out, elem3d.out, aux3d.out, depth.out and m3d.ini mesh files.
Forward operators use an interpolation using the closest model node in the horizontal, given that the application in Aydoğdu et al. (2018a) uses a very high-resolution mesh. In the vertical, a linear interpolation is performed between two enclosing model layers. Interpolation in model_interpolate routine can be improved, if needed.
Note that because the FESOM-native code explicitly types reals, the DART mechanism of being able to run in reduced precision by defining real(r8) to be the same as real(r4) via ‘types_mod.f90’ is not supported.
Workflow
environment.load Must be modified to contain the specifics of an experiment. This file is sourced by every other script below.
experiment.launch Takes the information from environment.load and creates runnable scripts from the template script files. This also initiates the first cycle of the experiment.
2.1. ensemble.sh
2.1.1. initialize.template (first cycle only)
2.1.2. advance_model.template (job array to advance the ensemble)
2.1.3. check_ensemble.sh (if all goes well, assimilate)
2.1.3.1. filter.template (assimilate)
- 2.1.3.2. finalize.sh if all goes well and experiment is not finished …
continue to 2.1
Shell Scripts
Shell scripts are written in bash for LSF queuing system. They should be modified to work with others such as SLURM. FESOM executables are called externally detached from DART therefore no need for an advance model.
Script |
Queue |
Definition |
---|---|---|
environment.load |
serial |
Includes environment variables, relevant directories, experiment specifications. This file is sourced by every other script below. |
experiment.launch |
serial |
Main script which modifies
|
ensemble.sh |
serial |
Calls and submits
|
initialize.template |
serial |
Called only once at the beginning of the experiment. Sets the experiment directory, copies initial ensemble, namelists. |
advance_model.template |
parallel |
Submits a job array for all ensemble members. |
check_ensemble.sh |
serial |
Checks if the forwarding for all
members is finished. If so, first
calls |
filter.template |
parallel |
Runs the filter to perform the assimilation. |
finalize.sh |
serial |
Checks if the whole experiment is
finished. If so, stops.
Otherwise, resubmits
|
Diagnostics
A toolbox for diagnostics is provided. Some are written for a specific regional application using Ferrybox observations of temperature and salinity. However, it shouldn’t be difficult to add new tools following the present ones. A fortran toolbox post-processes the FESOM outputs and visualization is done using Generic Mapping Tools (GMT). DART post-processed netCDF outputs are visualized using FERRET. Please see the expanded description inside each source file.
Directory |
code file |
description |
---|---|---|
src/ |
||
fesom_post_main.F90 |
main fortran routine calling each tool selected in the namelist |
|
fesom_ocean_mod.F90 |
ocean diagnostic routines |
|
fesom_dart_mod.F90 |
DART diagnostic output routines |
|
fesom_forcing_mod.F90 |
forcing diagnostic routines |
|
fesom_observation_mod.F90 |
observation diagnostic routines |
|
gen_input.F90 |
routines for I/O (adapted from FESOM) |
|
gen_modules_clock.F90 |
routines for timing (adapted from FESOM) |
|
gen_modules_config.F90 |
routines for configuration (adapted from FESOM) |
|
mesh_read.F90 |
routines for reading the mesh (adapted from FESOM) |
|
Makefile |
Makefile (adapted from FESOM) but reads DART environment |
|
oce_dens_press.F90 |
routines to compute density and pressure (adapted from FESOM) |
|
oce_mesh_setup.F90 |
routines for mesh setup (adapted from FESOM) |
|
oce_modules.F90 |
routines for ocean modules (adapted from FESOM) |
|
random_perturbation.F90 |
random perturbation to observation sampling |
|
utilities.F90 |
various utilities |
|
script/ |
||
compute_ensemble_mean |
computes ensemble mean and extracts a transect or level |
|
compute_increment |
computes increment using DART diagnostic output |
|
compute_NR_diff |
computes the difference between a nature run and the ensemble prior mean |
|
dart_obs_seq_diag |
DART observation-space statistics from |
|
dart.postproc.env |
DART environment variables |
|
fesom.postproc.env |
FESOM environment variables |
|
observe_nature_run |
creates synthetic observations from a nature run |
|
transect_daily_mean |
extracts and plots a transect of an individual ensemble member |
|
zlevel_daily_mean |
extracts and plots a level of an individual ensemble member |
|
gmt/ |
||
plot_ensemble_mean.gmt |
plots ensemble mean created by |
|
plot_increment.gmt |
plots increment created by |
|
plot_NR_diff.gmt |
plots difference created by |
|
transect_daily_mean.gmt |
plots transects created by |
|
zlevel_yearly_mean.gmt |
plots levels created by |
|
ferret/ |
||
frt.obs_diag_TeMPLaTe.jnl |
plot DART diags created by |
|
frt.obs_epoch_TeMPLaTe.jnl |
plot DART diags created by |