Compilation of ROMS
The code here is also available as a notebook 01_build_roms.ipynb.
The Regional Ocean Modeling System (ROMS) is a free-surface, terrain-following, primitive equations ocean model widely used by the scientific community for a diverse range of applications.
This notebook should be run on https://notebook-gher.uliege.be/ (password are provided to the JuliaEO 2025 participants) or a Linux/UNIX environement after installing the required software.
Getting the source code
The source code of ROMS is distributed via GitHub. We use version 4.1 of the ROMS code. The code is downloaded to the directory ~/src/roms
:
using ROMS
romsdir = expanduser("~/src/roms")
if !isdir(romsdir)
mkpath(dirname(romsdir))
cd(dirname(romsdir)) do
run(`git clone https://github.com/myroms/roms`)
cd("roms") do
run(`git checkout roms-4.1`)
end
end
end
Process(`git checkout roms-4.1`, ProcessExited(0))
The previous julia commands, are essentially the same as the following shell commands:
mkdir ~/src/
cd ~/src/
git clone https://github.com/myroms/roms
cd roms
git checkout roms-4.1
The output of the last command will tell you that You are in 'detached HEAD' state.
(this is not an error).
All files that are specific to a given implementation of ROMS will be saved in a different directory modeldir
:
modeldir = expanduser("~/ROMS-implementation-test")
mkpath(modeldir);
The header file
Before we can compile ROMS we need to
- activate diffent terms of the momentum equations
- specify the schemes uses for advection, horizontal mixing, type equation of state, ...
The header file controls the compilation of the ROMS model by telling the compiler which part of the code needs to be compiled. If you modify this file, ROMS need to be recompiled.
This header file should be named yourdomain.h
(e.g. liguriansea.h
for the Ligurian Sea) and created in the directory ROMS-implementation-test
.
Do not change the two first lines and the last line of the following cell. When you execute the cell, the header file with the specified content is created.
header_file = joinpath(modeldir,"liguriansea.h")
write(header_file,"""
#define UV_ADV /* turn ON advection terms */
#define UV_COR /* turn ON Coriolis term */
#define DJ_GRADPS /* Splines density Jacobian (Shchepetkin, 2000) */
#define NONLIN_EOS /* define if using nonlinear equation of state */
#define SALINITY /* define if using salinity */
#define SOLVE3D /* define if solving 3D primitive equations */
#define MASKING /* define if there is land in the domain */
#define TS_U3HADVECTION /* Third-order upstream horizontal advection of tracers */
#define TS_C4VADVECTION /* Fourth-order centered vertical advection of tracers */
#define TS_DIF2 /* use to turn ON or OFF harmonic horizontal mixing */
#define MIX_S_UV /* mixing along constant S-surfaces */
#define UV_VIS2 /* turn ON Laplacian horizontal mixing */
#define AVERAGES
#define UV_QDRAG
#define MIX_S_TS
#define MY25_MIXING
#ifdef MY25_MIXING
#define N2S2_HORAVG
#define KANTHA_CLAYSON
#endif
#define ANA_BSFLUX /* analytical bottom salinity flux */
#define ANA_BTFLUX /* analytical bottom temperature flux */
#define ANA_SSFLUX
#define BULK_FLUXES /* turn ON bulk fluxes computation */
#define CLOUDS
#define LONGWAVE
#define SOLAR_SOURCE
""");
The ROMS wiki give more information about the compiler different options.
Compiling the model code
ROMS can use the MPI (Message Passing Interface) or OpenMP (Open Multi-Processing) for parallelization (but not both at the same time):
use_mpi = false;
use_openmp = true;
# or
##use_mpi = true;
##use_openmp = false;
ROMS can either be build (i.e. compiled) the shell script build_roms.sh
or with the julia script ROMS.build
.
roms_application
is a descriptive name of the domain or the particular application that the use can choose. We compile ROMS with the GNU Fortran compiler using 8 jobs for compilation.
roms_application = "LigurianSea"
fortran_compiler = "gfortran"
jobs = 2
logfile = "roms_build.log"
ROMS.build(romsdir,roms_application,modeldir;
stdout = logfile,
jobs,
fortran_compiler,
use_openmp,
use_mpi)
ar: creating Build_roms/libROMS.a
The first and last 5 lines of this log file:
println.(collect(eachline(logfile))[1:5]);
println("...")
println.(collect(eachline(logfile))[end-5:end]);
cp -f /usr/include/netcdf.mod Build_roms
cp -f /usr/include/typesizes.mod Build_roms
cp -p /home/runner/make_macros.mk Build_roms
/usr/bin/cpp -P -traditional -w -D_OPENMP -DLINUX -DX86_64 -DGFORTRAN -D'ROOT_DIR="/home/runner/src/roms"' -DLigurianSea -D'HEADER="liguriansea.h"' -D'ROMS_HEADER="/home/runner/ROMS-implementation-test/liguriansea.h"' -DNestedGrids= -D'ANALYTICAL_DIR="/home/runner/ROMS-implementation-test"' -D'MY_ANALYTICAL="on"' -D'GIT_URL="https://github.com/myroms/roms"' -D'GIT_REV="f4ef852c084bccd1009b3ff4db8d1d059569b0e2"' -D'SVN_URL="https://www.myroms.org/svn/src/trunk"' -D'SVN_REV="1171"' -IROMS/Include -I/home/runner/ROMS-implementation-test -IROMS/Nonlinear -IROMS/Nonlinear/Biology -IROMS/Nonlinear/Sediment -IROMS/Utility -IROMS/Drivers -IROMS/Functionals -I/home/runner/ROMS-implementation-test -IMaster -ICompilers -D'HEADER_DIR="/home/runner/ROMS-implementation-test"' ROMS/Nonlinear/bbl.F > Build_roms/bbl.f90
/usr/bin/cpp -P -traditional -w -D_OPENMP -DLINUX -DX86_64 -DGFORTRAN -D'ROOT_DIR="/home/runner/src/roms"' -DLigurianSea -D'HEADER="liguriansea.h"' -D'ROMS_HEADER="/home/runner/ROMS-implementation-test/liguriansea.h"' -DNestedGrids= -D'ANALYTICAL_DIR="/home/runner/ROMS-implementation-test"' -D'MY_ANALYTICAL="on"' -D'GIT_URL="https://github.com/myroms/roms"' -D'GIT_REV="f4ef852c084bccd1009b3ff4db8d1d059569b0e2"' -D'SVN_URL="https://www.myroms.org/svn/src/trunk"' -D'SVN_REV="1171"' -IROMS/Include -I/home/runner/ROMS-implementation-test -IROMS/Nonlinear -IROMS/Nonlinear/Biology -IROMS/Nonlinear/Sediment -IROMS/Utility -IROMS/Drivers -IROMS/Functionals -I/home/runner/ROMS-implementation-test -IMaster -ICompilers -D'HEADER_DIR="/home/runner/ROMS-implementation-test"' ROMS/Nonlinear/bc_2d.F > Build_roms/bc_2d.f90
...
cd Build_roms; /usr/bin/gfortran -c -frepack-arrays -fallow-argument-mismatch -O3 -ffast-math -fopenmp -static-libgcc esmf_roms.f90
cd Build_roms; /usr/bin/gfortran -c -frepack-arrays -fallow-argument-mismatch -O3 -ffast-math -fopenmp -static-libgcc esmf_esm.f90
cd Build_roms; /usr/bin/gfortran -c -frepack-arrays -fallow-argument-mismatch -O3 -ffast-math -fopenmp -static-libgcc master.f90
ar -r Build_roms/libROMS.a Build_roms/bbl.o Build_roms/bc_2d.o Build_roms/bc_3d.o Build_roms/bc_4d.o Build_roms/bc_bry2d.o Build_roms/bc_bry3d.o Build_roms/bulk_flux.o Build_roms/bvf_mix.o Build_roms/conv_2d.o Build_roms/conv_3d.o Build_roms/conv_bry2d.o Build_roms/conv_bry3d.o Build_roms/diag.o Build_roms/exchange_2d.o Build_roms/exchange_3d.o Build_roms/exchange_4d.o Build_roms/forcing.o Build_roms/frc_adjust.o Build_roms/get_data.o Build_roms/get_idata.o Build_roms/gls_corstep.o Build_roms/gls_prestep.o Build_roms/hmixing.o Build_roms/ini_fields.o Build_roms/initial.o Build_roms/interp_floats.o Build_roms/lmd_bkpp.o Build_roms/lmd_skpp.o Build_roms/lmd_swfrac.o Build_roms/lmd_vmix.o Build_roms/main2d.o Build_roms/main3d.o Build_roms/mpdata_adiff.o Build_roms/my25_corstep.o Build_roms/my25_prestep.o Build_roms/nesting.o Build_roms/obc_adjust.o Build_roms/obc_volcons.o Build_roms/omega.o Build_roms/output.o Build_roms/pre_step3d.o Build_roms/prsgrd.o Build_roms/radiation_stress.o Build_roms/rho_eos.o Build_roms/rhs3d.o Build_roms/set_avg.o Build_roms/set_data.o Build_roms/set_depth.o Build_roms/set_massflux.o Build_roms/set_tides.o Build_roms/set_vbc.o Build_roms/set_zeta.o Build_roms/step2d.o Build_roms/step3d_t.o Build_roms/step3d_uv.o Build_roms/step_floats.o Build_roms/t3dbc_im.o Build_roms/t3dmix.o Build_roms/tkebc_im.o Build_roms/u2dbc_im.o Build_roms/u3dbc_im.o Build_roms/uv3dmix.o Build_roms/v2dbc_im.o Build_roms/v3dbc_im.o Build_roms/vwalk_floats.o Build_roms/wetdry.o Build_roms/wvelocity.o Build_roms/zetabc.o Build_roms/biology.o Build_roms/biology_floats.o Build_roms/sed_bed.o Build_roms/sed_bedload.o Build_roms/sed_fluxes.o Build_roms/sed_settling.o Build_roms/sed_surface.o Build_roms/sediment.o Build_roms/analytical.o Build_roms/ADfromTL.o Build_roms/abort.o Build_roms/array_modes.o Build_roms/back_cost.o Build_roms/cgradient.o Build_roms/check_multifile.o Build_roms/checkadj.o Build_roms/checkdefs.o Build_roms/checkerror.o Build_roms/checkvars.o Build_roms/close_io.o Build_roms/comp_Jb0.o Build_roms/congrad.o Build_roms/convolve.o Build_roms/cost_grad.o Build_roms/dateclock.o Build_roms/def_avg.o Build_roms/def_dai.o Build_roms/def_diags.o Build_roms/def_dim.o Build_roms/def_error.o Build_roms/def_floats.o Build_roms/def_gst.o Build_roms/def_hessian.o Build_roms/def_his.o Build_roms/def_impulse.o Build_roms/def_info.o Build_roms/def_ini.o Build_roms/def_lanczos.o Build_roms/def_mod.o Build_roms/def_norm.o Build_roms/def_quick.o Build_roms/def_rst.o Build_roms/def_state.o Build_roms/def_station.o Build_roms/def_tides.o Build_roms/def_var.o Build_roms/destroy.o Build_roms/distribute.o Build_roms/dotproduct.o Build_roms/edit_multifile.o Build_roms/equilibrium_tide.o Build_roms/erf.o Build_roms/extract_obs.o Build_roms/extract_sta.o Build_roms/frc_weak.o Build_roms/gasdev.o Build_roms/get_2dfld.o Build_roms/get_2dfldr.o Build_roms/get_3dfld.o Build_roms/get_3dfldr.o Build_roms/get_bounds.o Build_roms/get_cycle.o Build_roms/get_env.o Build_roms/get_grid.o Build_roms/get_gst.o Build_roms/get_hash.o Build_roms/get_metadata.o Build_roms/get_ngfld.o Build_roms/get_ngfldr.o Build_roms/get_nudgcoef.o Build_roms/get_state.o Build_roms/get_varcoords.o Build_roms/get_wetdry.o Build_roms/grid_coords.o Build_roms/ini_adjust.o Build_roms/ini_hmixcoef.o Build_roms/ini_lanczos.o Build_roms/inner2state.o Build_roms/inp_decode.o Build_roms/inp_par.o Build_roms/inquiry.o Build_roms/interpolate.o Build_roms/lanc_resid.o Build_roms/lbc.o Build_roms/lubksb.o Build_roms/ludcmp.o Build_roms/memory.o Build_roms/metrics.o Build_roms/mp_exchange.o Build_roms/mp_routines.o Build_roms/nf_fread2d.o Build_roms/nf_fread2d_bry.o Build_roms/nf_fread3d.o Build_roms/nf_fread3d_bry.o Build_roms/nf_fread4d.o Build_roms/nf_fwrite2d.o Build_roms/nf_fwrite2d_bry.o Build_roms/nf_fwrite3d.o Build_roms/nf_fwrite3d_bry.o Build_roms/nf_fwrite4d.o Build_roms/normalization.o Build_roms/nrutil.o Build_roms/ntimestep.o Build_roms/obs_cost.o Build_roms/obs_depth.o Build_roms/obs_initial.o Build_roms/obs_k2z.o Build_roms/obs_read.o Build_roms/obs_write.o Build_roms/packing.o Build_roms/posterior.o Build_roms/posterior_var.o Build_roms/ran1.o Build_roms/ran_state.o Build_roms/random_ic.o Build_roms/read_asspar.o Build_roms/read_biopar.o Build_roms/read_couplepar.o Build_roms/read_fltbiopar.o Build_roms/read_fltpar.o Build_roms/read_phypar.o Build_roms/read_sedpar.o Build_roms/read_stapar.o Build_roms/regrid.o Build_roms/rep_matrix.o Build_roms/round.o Build_roms/rpcg_lanczos.o Build_roms/set_2dfld.o Build_roms/set_2dfldr.o Build_roms/set_3dfld.o Build_roms/set_3dfldr.o Build_roms/set_contact.o Build_roms/set_diags.o Build_roms/set_grid.o Build_roms/set_masks.o Build_roms/set_ngfld.o Build_roms/set_ngfldr.o Build_roms/set_pio.o Build_roms/set_scoord.o Build_roms/set_weights.o Build_roms/shapiro.o Build_roms/sqlq.o Build_roms/state_addition.o Build_roms/state_copy.o Build_roms/state_dotprod.o Build_roms/state_initialize.o Build_roms/state_join.o Build_roms/state_product.o Build_roms/state_read.o Build_roms/state_scale.o Build_roms/stats.o Build_roms/stats_modobs.o Build_roms/stdinp_mod.o Build_roms/stiffness.o Build_roms/strings.o Build_roms/sum_grad.o Build_roms/sum_imp.o Build_roms/tadv.o Build_roms/tides_date.o Build_roms/time_corr.o Build_roms/timers.o Build_roms/uv_rotate.o Build_roms/vorticity.o Build_roms/white_noise.o Build_roms/wpoints.o Build_roms/wrt_aug_imp.o Build_roms/wrt_avg.o Build_roms/wrt_dai.o Build_roms/wrt_diags.o Build_roms/wrt_error.o Build_roms/wrt_evolved.o Build_roms/wrt_floats.o Build_roms/wrt_gst.o Build_roms/wrt_hessian.o Build_roms/wrt_his.o Build_roms/wrt_impulse.o Build_roms/wrt_info.o Build_roms/wrt_ini.o Build_roms/wrt_quick.o Build_roms/wrt_rst.o Build_roms/wrt_state.o Build_roms/wrt_station.o Build_roms/wrt_tides.o Build_roms/yaml_parser.o Build_roms/zeta_balance.o Build_roms/i4dvar.o Build_roms/r4dvar.o Build_roms/rbl4dvar.o Build_roms/mod_arrays.o Build_roms/mod_average.o Build_roms/mod_bbl.o Build_roms/mod_behavior.o Build_roms/mod_biology.o Build_roms/mod_boundary.o Build_roms/mod_clima.o Build_roms/mod_coupler.o Build_roms/mod_coupling.o Build_roms/mod_diags.o Build_roms/mod_eclight.o Build_roms/mod_eoscoef.o Build_roms/mod_floats.o Build_roms/mod_forces.o Build_roms/mod_fourdvar.o Build_roms/mod_grid.o Build_roms/mod_iounits.o Build_roms/mod_kinds.o Build_roms/mod_mixing.o Build_roms/mod_ncparam.o Build_roms/mod_nesting.o Build_roms/mod_netcdf.o Build_roms/mod_ocean.o Build_roms/mod_parallel.o Build_roms/mod_param.o Build_roms/mod_pio_netcdf.o Build_roms/mod_scalars.o Build_roms/mod_sedbed.o Build_roms/mod_sediment.o Build_roms/mod_sources.o Build_roms/mod_stepping.o Build_roms/mod_storage.o Build_roms/mod_strings.o Build_roms/mod_tides.o Build_roms/cmeps_roms.o Build_roms/coupler.o Build_roms/esmf_atm.o Build_roms/esmf_data.o Build_roms/esmf_esm.o Build_roms/esmf_ice.o Build_roms/esmf_roms.o Build_roms/esmf_wav.o Build_roms/master.o Build_roms/mod_esmf_esm.o Build_roms/propagator.o Build_roms/roms_kernel.o
ranlib Build_roms/libROMS.a
/usr/bin/gfortran -frepack-arrays -fallow-argument-mismatch -O3 -ffast-math -fopenmp -static-libgcc Build_roms/cmeps_roms.o Build_roms/coupler.o Build_roms/esmf_atm.o Build_roms/esmf_data.o Build_roms/esmf_esm.o Build_roms/esmf_ice.o Build_roms/esmf_roms.o Build_roms/esmf_wav.o Build_roms/master.o Build_roms/mod_esmf_esm.o Build_roms/propagator.o Build_roms/roms_kernel.o -o /home/runner/ROMS-implementation-test/romsO -LBuild_roms -lROMS -L/usr/lib/x86_64-linux-gnu -lnetcdff -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -lnetcdf -lnetcdf -lm