tool for creating fortran code for a FABM biogeochemical model from data.frames. Similar to the rodeo R-package it uses the well known standard notation based on the stoichiometry matrix to describe the ODEs.
you can install rodeoFABM
from github using:
library("devtools")
install_github("JFeldbauer/rodeoFABM")
You can clone the lake branche of GOTM-FABM from github using the function clone_GOTM()
:
library(rodeoFABM)
# clone github repo
clone_GOTM(build_dir = "build", src_dir = "gotm")
after you generated FABM code you can compile the model
to generate FABM code from data.frames (e.g. storred in a Libre Office spread sheet) use:
library(readODS)
# copy example ods file
example_model <- system.file("extdata/simple_model.ods", package = 'rodeoFABM')
# Create example folder
dir.create('example')
file.copy(from = example_model, to = 'example', recursive = TRUE)
# Change working directory to example folder
setwd('example')
# read in example ods file
odf_file <- "simple_model.ods"
vars <- read_ods(odf_file, 1)
pars <- read_ods(odf_file, 2)
funs <- read_ods(odf_file, 3)
pros <- read_ods(odf_file, 4)
stoi <- read_ods(odf_file, 5)
# generate fabm code
gen_fabm_code(vars, pars, funs, pros, stoi, "simple_model.f90", diags = TRUE)
# build GOTM
build_GOTM(build_dir = "../build", fabm_file = "simple_model.f90",
src_dir = "../gotm")
library(gotmtools)
library(OceanView)
# copy gotm control file and initital temperature
yaml_file <- system.file("extdata/gotm.yaml", package= "rodeoFABM")
file.copy(from = yaml_file, to = ".", recursive = TRUE)
# load forcing data
data(meteo_file)
data(hypsograph)
write.table(meteo_file, "meteo_file.dat", sep = "\t", quote = FALSE,
row.names = FALSE, col.names = TRUE)
write.table(hypsograph, "hypsograph.dat", sep = "\t", quote = FALSE,
row.names = FALSE, col.names = TRUE)
# run GOTM-FABM
system2("./gotm")
# read in model output
ALG1 <- get_vari("output.nc", "rodeo_C_ALG")
death <- get_vari("output.nc", "rodeo_death")
growth <- get_vari("output.nc", "rodeo_growth")
# plot model output
image2D(t(apply(as.matrix(ALG1[ , -1]), 1, rev)), ALG1$Datetime,
seq(-47, 0, length.out = 100), main = "ALG", xlab = "Date", ylab = "Depth")
image2D(t(apply(as.matrix(growth[ , -1]), 1, rev)) -
t(apply(as.matrix(death[ , -1]), 1, rev)), growth$Datetime,
seq(-47, 0, length.out = 100), main = "net. growth",
xlab = "Date", ylab = "Depth",
col = ramp.col(c("red4", "grey", "green4")))
Work on this project was funded by the European Social Fund and co-financed by tax funds based on the budget approved by the members of the Saxon State Parliament.