Metos3D BGC API¶
Application programming interface (API) for biogeochemical (BGC) models
Definition, realization in Fortran
metos3dbgcinit(...)
metos3dbgcbegin(...)
metos3dbgc(...)
metos3dbgcend(...)
metos3dbgcfinal(...)
Description¶
The interface decouples biogeochemical models and driver routines (ocean circulation, forcing, geometry) programmatically.
It gives the modeler the possibility to provide a free number of tracers, parameters, boundary and domain conditions. It suits well an optimization as well as an Automatic Differentiation (AD) context.
The interface changed (more or less) since it was introduced for the first time. The initial version can be found at \citep[][]{PiwSla16}.
What is it?¶
Ther Metos3D BGC API is a convention how biogeochemical models can be coupled to ocean circulation.
What for?¶
modelers that want to their marine ecosystem or biogeochemical models, coupled to a global ocean circulation,
Why?¶
climate research, ocean simulation, bgc models, uncertainties, parameters, processes, require assessment, at global-basin scale, sophisticated general circulation model,
How?¶
C model template¶
Fortran model template¶
Example 1¶
in the simplest case, assuming you have a model written in Fortran,
File: simple_bgc_model.f90
subroutine metos3dbgc(ny, nx, nu, nb, nd, ndg, dt, q, t, y, u, b, d, dg, ctx)
integer :: ny ! tracer count
integer :: nx ! layer count
integer :: nu ! parameter count
integer :: nb ! boundary condition count
integer :: nd ! domain condition count
integer :: ndg ! diagnostic variable count
real(8) :: dt ! ocean time step
real(8) :: q(nx, ny) ! bgc model output
real(8) :: t ! point in time
real(8) :: y(nx, ny) ! bgc model input
real(8) :: u(nu) ! parameters
real(8) :: b(nb) ! boundary conditions
real(8) :: d(nx, nd) ! domain conditions
real(8) :: dg(nx, ndg) ! diagnostic variables
integer :: ctx ! unsed variable, place holder for bgc context
! your code here ...
end subroutine
Example 2¶
File: bgctype.h90
type bgcctx
sequence
real(8) :: a
real(8) :: b
logical(4) :: yesOrNo
real(8), pointer :: ptr(:)
end type
File: more_sophisticated_bgc_model.f90
subroutine metos3dbgc(ny, nx, nu, nb, nd, ndg, dt, q, t, y, u, b, d, dg, ctx)
#include "bgctype.h90"
integer :: ny ! tracer count
integer :: nx ! layer count
integer :: nu ! parameter count
integer :: nb ! boundary condition count
integer :: nd ! domain condition count
integer :: ndg ! diagnostic variable count
real(8) :: dt ! ocean time step
real(8) :: q(nx, ny) ! bgc model output
real(8) :: t ! point in time
real(8) :: y(nx, ny) ! bgc model input
real(8) :: u(nu) ! parameters
real(8) :: b(nb) ! boundary conditions
real(8) :: d(nx, nd) ! domain conditions
real(8) :: dg(nx, ndg) ! diagnostic variables
type(bgcctx) :: ctx ! own bgc context
! your code here ...
end subroutine
Example 3¶
Good practice,
- store constants in a module,
- store pointers for own memory allocation, (usually not needed at all), in data type
- use
metos3dbgcinit
to allocate memory - use
metos3dbgcfinal
to free memory
- use
was what wie how warum why wofuer what for