Skip to content
Snippets Groups Projects
Commit aa2eaed0 authored by Lucie Bakels's avatar Lucie Bakels
Browse files

Merge branch 'master' of gitlab.phaidra.org:flexpart/flexpart

parents eb180d95 96169a52
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@ stages:
- build
- test
- compare
# - container
- container
default:
image:
......@@ -189,6 +189,36 @@ documentation:
- cd ./documentation && mkdocs build -c --verbose
- sshpass -p "$WOLKE_PASSWORD" rsync -autv --delete -e "ssh -o StrictHostKeyChecking=no" /tmp/cr-site/* "$WOLKE_USER@wolke.img.univie.ac.at:/var/www/flexpart/docs"
# base:
# stage: container
# image:
\ No newline at end of file
base:
stage: container
image: quay.io/podman/stable
when: manual
script:
- podman build -t "harbor.wolke.img.univie.ac.at/flexpart/rockylinux9:latest" -f ./tests/Dockerfile
- podman push "harbor.wolke.img.univie.ac.at/flexpart/rockylinux9:latest"
post:
stage: container
image: quay.io/podman/stable
when: manual
script:
- podman build -t "harbor.wolke.img.univie.ac.at/flexpart/postprocessing:py39" -f ./tests/Dockerfile.python
- podman push "harbor.wolke.img.univie.ac.at/flexpart/postprocessing:py39"
flexpart:
stage: container
image: quay.io/podman/stable
when: manual
script:
- podman build -t "harbor.wolke.img.univie.ac.at/flexpart/flexpartv11-${CI_COMMIT_REF_NAME}:${CI_COMMIT_SHA:0:8}" --build-arg COMMIT=${CI_COMMIT_SHA:0:8} -f ./containers/Dockerfile ../
- podman push "harbor.wolke.img.univie.ac.at/flexpart/flexpartv11-${CI_COMMIT_REF_NAME}:${CI_COMMIT_SHA:0:8}"
flexpartv10:
stage: container
image: quay.io/podman/stable
when: manual
script:
- podman build -t "harbor.wolke.img.univie.ac.at/flexpart/flexpartv10.4:latest" -f ./containers/Dockerfile.v10.4 ../
- podman push "harbor.wolke.img.univie.ac.at/flexpart/flexpartv10.4:latest"
# add a build for apptainer ?
\ No newline at end of file
XXXXXX EMPTY LINES XXXXXXXXX
XXXXXX EMPTY LINES XXXXXXXX
YYYYMMDD HHMMSS name of the file(up to 80 characters)
20120101 000000 EA12010100 ON DISK
20120101 010000 EA12010101 ON DISK
20120101 020000 EA12010102 ON DISK
20120101 030000 EA12010103 ON DISK
20120101 040000 EA12010104 ON DISK
20120101 050000 EA12010105 ON DISK
20120101 060000 EA12010106 ON DISK
20120101 070000 EA12010107 ON DISK
20120101 080000 EA12010108 ON DISK
20120101 090000 EA12010109 ON DISK
20120101 100000 EA12010110 ON DISK
20120101 110000 EA12010111 ON DISK
20120101 120000 EA12010112 ON DISK
20120101 130000 EA12010113 ON DISK
20120101 140000 EA12010114 ON DISK
20120101 150000 EA12010115 ON DISK
20120101 160000 EA12010116 ON DISK
20120101 170000 EA12010117 ON DISK
20120101 180000 EA12010118 ON DISK
20120101 190000 EA12010119 ON DISK
20120101 200000 EA12010120 ON DISK
20120101 210000 EA12010121 ON DISK
20120101 220000 EA12010122 ON DISK
20120101 230000 EA12010123 ON DISK
20090101 000000 EC2009010100 ON DISK
20090101 060000 EC2009010106 ON DISK
......@@ -12,409 +12,23 @@ Other references:
* This repository contains versions of the Lagrangian model FLEXPART
* Development versions
* Issues on the FLEXPART model
* Issues on the FLEXPART model, [tickets](./-/issues)/[mail](mailto:flexpart-support.img-wien@univie.ac.at)
* Feature requests for future versions
## Getting started with Flexpart
The model is written in Fortran. It needs to be compiled for the architecture that runs it.
### 1.Configuration
The Makefiles e.g. `src/makefile_gfortran` can use environmental variables:
- `CPATH` for include directories
- `LIBRARY_PATH` for libraries
This is commonly used on HPC systems. e.g. JET and VSC. These paths will be added via `rpath` so statically linked.
Otherwise edit the makefile with the paths to libraries and include files.
**Required Dependencies:**
* [ecCodes](https://confluence.ecmwf.int/display/ECC) from ECMWF (Jasper is not a requirement).
* [NetCDF](https://www.unidata.ucar.edu/software/netcdf/) (optional) from UCAR
* Fortran Compiler with [Fortran 2008](https://fortranwiki.org/fortran/show/Fortran+2008+status) standard, e.g. GCC compiler `8+` or INTEL `19+` or INTEL-ONEAPI
* make utils
### 2.Compilation
Clone the git repository or download one of the [releases](https://gitlab.phaidra.org/flexpart/flexpart/-/releases)
```bash
# clone the repository to your directory or download one of our releases
git clone https://gitlab.phaidra.org/flexpart/flexpart.git
# change to the SRC directory
cd flexpart/src
# Remember to configure your libraries in the makefile or environmental variables
# use for example the GCC makefile
make -f makefile_gfortran
# this will create the FLEXPART executable
file ./FLEXPART
# Check its dependencies:
ldd ./FLEXPART
```
Now you are almost ready to run.
### 3.Deployment instructions
FLEXPART is a standalone executable
The necessary ECMWF wind fields can be obtained testing flex_ecmwf
The AVAILABLE file works with the default ERA 5 retrieved winds
In the winds are available in flex_ecmwf/work it should suffice to execute
`./src/FLEXPART` in the main directory
### Container version
since version 11, FLEXPART is also available as a container. There is a Dockerfile and some instructions on how to build the container from scratch or you can download the container from our [registry](https://harbor.wolke.img.univie.ac.at) using for example podman/docker or singularity/apptainer:
Specifications:
- compiled using `march=core-avx2`, compatible with CPUs above AVX2 (since Haswell or Zen)
- ecCodes
```sh
# registry download, replace podman to docker or vice versa
podman pull harbor.wolke.img.univie.ac.at/flexpart/flexpartv11:master
# using singularity/apptainer for running FLEXPART
# there might be some warnings about EPERM (can be ignored)
apptainer pull flexpart.sif docker://harbor.wolke.img.univie.ac.at/flexpart/flexpartv11:master
```
running it using podman/docker or singularity/apptainer:
```sh
# simple run the container with default settings
podman run harbor.wolke.img.univie.ac.at/flexpart/flexpartv11:master
# running the container requires a writable output directory
# mounting the local directory to /output inside the container
apptainer run -B .:/output flexpart.sif
```
<details>
<summary>podman/docker flexpart run log</summary>
<pre><code class="shell">
Welcome, running FLEXPART
Using defaults (/pathnames)
/options/
/output/
/inputs/
/inputs/AVAILABLE
Mount volumes to change inputs
Git: c5bdd94 HEAD -> master, origin/master, origin/HEAD Tue Nov 21 16:15:27 2023 +0100
EXECUTING FLEXPART
trying to execute: /src/FLEXPART_ETA
Executing: /src/FLEXPART_ETA
Welcome to FLEXPART Version 11
Git: undefined
FLEXPART is free software released under the GNU General Public License.
FLEXPART is running with ETA coordinates.
----------------
INFORMATION: SUBGRIDSCALE TERRAIN EFFECT IS
NOT PARAMETERIZED DURING THIS SIMULATION.
----------------
*********** WARNING **********************************
* FLEXPART running in parallel mode *
* Number of uncertainty classes in *
* set to number of threads: 1 *
* All other computations are done with 8 threads. *
*******************************************************
FLEXPART WARNING: TIME DIFFERENCE BETWEEN TWO
WIND FIELDS IS BIG. THIS MAY CAUSE A DEGRADATION
OF SIMULATION QUALITY.
ECMWF metdata detected
NXSHIFT is set to 0
grid dim: 181 91 92 92 91 92
Vertical levels in ECMWF data: 92 92
Mother domain:
Longitude range: -178.00000 to 182.00000 Grid distance: 2.00000
Latitude range : -90.00000 to 90.00000 Grid distance: 2.00000
Number of receptors: 2
Releasepoints : 1
reading SPECIES 24
Particle shape SPHERE for particle 24
SPECIES: 24 AIRTRACER (GAS)
Wet removal for gases is turned: OFF
Dry deposition for gases is turned: OFF
Below-cloud scavenging: OFF
In-cloud scavenging: OFF
Particles released (numpartmax): 10000
Total mass released: 1.0000000E+00
Allocating fields for global output (x,y): 85 65
Concentrations are calculated using kernel
WARNING: turbulence switched off.
Simulated 0.0 hours ( 0 s), 0 particles
Time: 0 seconds. Total spawned: 0 alive: 0 terminated: 0
Allocating 10000 particles 0 0 0
Finished allocation
Time: 900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 1800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 2700 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 3600 seconds. Total spawned: 10000 alive: 10000 terminated: 0
3600 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 4500 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 5400 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 6300 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 7200 seconds. Total spawned: 10000 alive: 10000 terminated: 0
7200 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 8100 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9000 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 10800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
10800 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Read wind fields: 0.609375000 seconds
Timemanager: 1.17187500 seconds,first timestep: 1.09375000 seconds
Write particle files: 4.68750000E-02 seconds
Total running time: 1.81250000 seconds
tps,io,tot: 1.95312500E-02 0.131249994 1.81250000
CONGRATULATIONS: YOU HAVE SUCCESSFULLY COMPLETED A FLEXPART MODEL RUN!
FINISHED
</code></pre>
</details>
<details>
<summary>singularity/apptainer flexpart run log</summary>
<pre>
<code class="language-shell">
INFO: gocryptfs not found, will not be able to use gocryptfs
Welcome, running FLEXPART
Using defaults (/pathnames)
/options/
/output/
/inputs/
/inputs/AVAILABLE
Mount volumes to change inputs
Git: c5bdd94 HEAD -> master, origin/master, origin/HEAD Tue Nov 21 16:15:27 2023 +0100
EXECUTING FLEXPART
trying to execute: /src/FLEXPART_ETA
Executing: /src/FLEXPART_ETA
Welcome to FLEXPART Version 11
Git: undefined
FLEXPART is free software released under the GNU General Public License.
FLEXPART is running with ETA coordinates.
----------------
INFORMATION: SUBGRIDSCALE TERRAIN EFFECT IS
NOT PARAMETERIZED DURING THIS SIMULATION.
----------------
*********** WARNING **********************************
* FLEXPART running in parallel mode *
* Number of uncertainty classes in *
* set to number of threads: 1 *
* All other computations are done with 8 threads. *
*******************************************************
FLEXPART WARNING: TIME DIFFERENCE BETWEEN TWO
WIND FIELDS IS BIG. THIS MAY CAUSE A DEGRADATION
OF SIMULATION QUALITY.
ECMWF metdata detected
NXSHIFT is set to 0
grid dim: 181 91 92 92 91 92
Vertical levels in ECMWF data: 92 92
Mother domain:
Longitude range: -178.00000 to 182.00000 Grid distance: 2.00000
Latitude range : -90.00000 to 90.00000 Grid distance: 2.00000
Number of receptors: 2
Releasepoints : 1
reading SPECIES 24
Particle shape SPHERE for particle 24
SPECIES: 24 AIRTRACER (GAS)
Wet removal for gases is turned: OFF
Dry deposition for gases is turned: OFF
Below-cloud scavenging: OFF
In-cloud scavenging: OFF
Particles released (numpartmax): 10000
Total mass released: 1.0000000E+00
Allocating fields for global output (x,y): 85 65
Concentrations are calculated using kernel
WARNING: turbulence switched off.
Simulated 0.0 hours ( 0 s), 0 particles
Time: 0 seconds. Total spawned: 0 alive: 0 terminated: 0
Allocating 10000 particles 0 0 0
Finished allocation
Time: 900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 1800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 2700 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 3600 seconds. Total spawned: 10000 alive: 10000 terminated: 0
3600 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 4500 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 5400 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 6300 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 7200 seconds. Total spawned: 10000 alive: 10000 terminated: 0
7200 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 8100 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9000 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 10800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
10800 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Read wind fields: 0.703125000 seconds
Timemanager: 1.25000000 seconds,first timestep: 1.15625000 seconds
Write particle files: 1.56250000E-02 seconds
Total running time: 2.00000000 seconds
tps,io,tot: 2.34375000E-02 0.143749997 2.00000000
CONGRATULATIONS: YOU HAVE SUCCESSFULLY COMPLETED A FLEXPART MODEL RUN!
FINISHED
</code></pre>
</details>
<details>
<summary>ncdump of default run output</summary>
<pre><code class="language-shell">
# check the output
ncdump -h grid_conc_20090101000000.nc
netcdf grid_conc_20090101000000 {
dimensions:
time = UNLIMITED ; // (3 currently)
longitude = 85 ;
latitude = 65 ;
height = 4 ;
numspec = 1 ;
pointspec = 1 ;
nageclass = 1 ;
nchar = 45 ;
ncharrec = 16 ;
numpoint = 1 ;
receptor = UNLIMITED ; // (2 currently)
variables:
int time(time) ;
time:units = "seconds since 2009-01-01 00:00" ;
time:calendar = "proleptic_gregorian" ;
float longitude(longitude) ;
longitude:long_name = "longitude in degree east" ;
longitude:axis = "Lon" ;
longitude:units = "degrees_east" ;
longitude:standard_name = "grid_longitude" ;
longitude:description = "grid cell centers" ;
float latitude(latitude) ;
latitude:long_name = "latitude in degree north" ;
latitude:axis = "Lat" ;
latitude:units = "degrees_north" ;
latitude:standard_name = "grid_latitude" ;
latitude:description = "grid cell centers" ;
float height(height) ;
height:units = "meters" ;
height:positive = "up" ;
height:standard_name = "height" ;
height:long_name = "height above ground" ;
char RELCOM(numpoint, nchar) ;
RELCOM:long_name = "release point name" ;
float RELLNG1(numpoint) ;
RELLNG1:units = "degrees_east" ;
RELLNG1:long_name = "release longitude lower left corner" ;
float RELLNG2(numpoint) ;
RELLNG2:units = "degrees_east" ;
RELLNG2:long_name = "release longitude upper right corner" ;
float RELLAT1(numpoint) ;
RELLAT1:units = "degrees_north" ;
RELLAT1:long_name = "release latitude lower left corner" ;
float RELLAT2(numpoint) ;
RELLAT2:units = "degrees_north" ;
RELLAT2:long_name = "release latitude upper right corner" ;
float RELZZ1(numpoint) ;
RELZZ1:units = "meters" ;
RELZZ1:long_name = "release height bottom" ;
float RELZZ2(numpoint) ;
RELZZ2:units = "meters" ;
RELZZ2:long_name = "release height top" ;
int RELKINDZ(numpoint) ;
RELKINDZ:long_name = "release kind" ;
int RELSTART(numpoint) ;
RELSTART:units = "seconds" ;
RELSTART:long_name = "release start relative to simulation start" ;
int RELEND(numpoint) ;
RELEND:units = "seconds" ;
RELEND:long_name = "release end relative to simulation start" ;
int RELPART(numpoint) ;
RELPART:long_name = "number of release particles" ;
float RELXMASS(numspec, numpoint) ;
RELXMASS:long_name = "total release particle mass" ;
int LAGE(nageclass) ;
LAGE:units = "seconds" ;
LAGE:long_name = "age class" ;
int ORO(latitude, longitude) ;
ORO:standard_name = "surface altitude" ;
ORO:long_name = "outgrid surface altitude" ;
ORO:units = "m" ;
char receptor(receptor, ncharrec) ;
receptor:long_name = "receptor name" ;
float spec001_mr(nageclass, pointspec, time, height, latitude, longitude) ;
spec001_mr:units = "ng m-3" ;
spec001_mr:long_name = "AIRTRACER" ;
spec001_mr:decay = -0.07001485f ;
spec001_mr:weightmolar = 29.f ;
spec001_mr:ohcconst = -9.e-10f ;
spec001_mr:ohdconst = -9.9f ;
spec001_mr:vsetaver = 0.f ;
float receptor_conc001(receptor, time) ;
receptor_conc001:units = "ng m-3" ;
receptor_conc001:_FillValue = -1.f ;
receptor_conc001:positive = "up" ;
receptor_conc001:standard_name = "receptor_conc" ;
receptor_conc001:long_name = "receptor_concentration" ;
// global attributes:
:Conventions = "CF-1.6" ;
:title = "FLEXPART model output" ;
:git = "undefined" ;
:source = "Version 11 model output" ;
:history = "2023-11-21 16:22 +0100 created by mblaschek on NB513" ;
:references = "Stohl et al., Atmos. Chem. Phys., 2005, doi:10.5194/acp-5-2461-200" ;
:outlon0 = -25.f ;
:outlat0 = 10.f ;
:dxout = 1.f ;
:dyout = 1.f ;
:ldirect = 1 ;
:ibdate = "20090101" ;
:ibtime = "000000" ;
:iedate = "20090101" ;
:ietime = "030000" ;
:loutstep = 3600 ;
:loutaver = 3600 ;
:loutsample = 900 ;
:loutrestart = -1 ;
:lsynctime = 900 ;
:ctl = -0.2f ;
:ifine = 1 ;
:iout = 1 ;
:ipout = 0 ;
:lsubgrid = 0 ;
:lconvection = 0 ;
:lagespectra = 0 ;
:ipin = 0 ;
:ioutputforeachrelease = 0 ;
:iflux = 0 ;
:mdomainfill = 0 ;
:ind_source = 1 ;
:ind_receptor = 1 ;
:mquasilag = 0 ;
:nested_output = 0 ;
:sfc_only = 0 ;
:linit_cond = 0 ;
}
</code>
</pre>
</details>
The model is written in Fortran. It needs to be compiled for the architecture that runs it. Please have a look at the instructions on building FLEXPART available [here](./documentation/docs/building.md) or [online](https://flexpart.img.univie.ac.at/docs). There is also a containerized version of FLEXPART available.
### Contribution guidelines
* The version contributed should compile on a reference version of the system and compiler.
- `FLEXPART 10.4` used as reference gfortran 5.4 on Ubuntu 16.04
- `FLEXPART 11` uses as reference gfortran 8.5.0 on AlmaLinux 8/RockyLinux 8 or gfortran 11.4.1 on RockyLinux 9
- `FLEXPART 10.4` used as a reference gfortran 5.4 on Ubuntu 16.04
- `FLEXPART 11` uses as a reference gfortran 8.5.0 on AlmaLinux 8/RockyLinux 8 or gfortran 11.4.1 on RockyLinux 9
* Code contribution including new features and bug fixes should be complemented with appropriate tests
An essential test consists of a set of input files and directories that allow FLEXPART to run.
A test can be accompanied by output files for verification
* Code review
* report issues via mail to [support](mailto:flexpart-support.img-wien@univie.ac.at)
* become an active developer and request a user account.
\ No newline at end of file
* become an active developer and request a user account on gitlab.
\ No newline at end of file
FROM rockylinux:9-minimal
RUN microdnf install -y epel-release && \
microdnf install -y --enablerepo=crb make netcdf-fortran-devel.x86_64 netcdf.x86_64 eccodes eccodes-devel cmake tar gcc-c++ perl git wget && \
microdnf clean all -y && \
rm -rf /var/cache/yum
#
# Dockerfile for CI and Flexpart container images
# Options:
# - COMMIT = ... (use git log --pretty=format:'%h %D (%s %at)' -n 1)
# with this option Flexpart is build inside the container
# Build Examples:
# - podman build -t harbor.wolke.img.univie.ac.at/flexpart/flexpartv11:$(git rev-parse --abbrev-ref HEAD) -f Dockerfile_flexpart --build-arg COMMIT="$(git log --pretty=format:'%h %D %ad' -n 1)"
# Download ECCODES Version
# note 2.30.0 has an issue!!!
# ENV ECCODES=2.31.0
# RUN curl https://confluence.ecmwf.int/download/attachments/45757960/eccodes-${ECCODES}-Source.tar.gz | tar xz
# RUN mkdir build && \
# cd build && \
# cmake -DENABLE_ECCODES_OMP_THREADS=ON ../eccodes-*/ && \
# make -j8 && \
# make install
#
# set environment variables
#
# Build image with Flexpart inside
#
#FROM harbor.wolke.img.univie.ac.at/flexpart/almalinux8:latest
FROM harbor.wolke.img.univie.ac.at/flexpart/rockylinux9:latest
ENV FC=gfortran
ENV LIBRARY_PATH=/usr/lib64:/usr/local/lib64
ENV CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
# cmd Arguments for COMMIT ID/tag
ARG COMMIT=0
ENV COMMIT=$COMMIT
COPY ./src /src
COPY ./tests/default_options /options
# since the new data set is larger, we download the data for the container
RUN wget -P /inputs "https://webdata.wolke.img.univie.ac.at/flexpart/*"
# COPY ./tests/default_winds /inputs
COPY ./entrypoint.sh /entrypoint.sh
# EC 2009 01 01 00 - 06
RUN wget -r -np -nd -A 'EC*' -P /inputs "https://webdata.wolke.img.univie.ac.at/flexpart/"
WORKDIR /src
#
# compile using a standardized
......@@ -30,8 +35,14 @@ RUN make -f makefile_gfortran eta=no arch=generic \
&& make -f makefile_gfortran arch=generic \
&& mkdir -p /output \
&& echo -e "/options/\n/output/\n/inputs/\n/inputs/AVAILABLE" > /pathnames
COPY ./AVAILABLE /inputs/AVAILABLE
# Entrypoint script (user tips)
COPY ./containers/entrypoint.sh /entrypoint.sh
COPY ./tests/default_options /options
# In the Dockerfile, the ENTRYPOINT command defines the executable,
# while CMD sets the default parameter.
# so here our entrypoint run script and default FLEXPART_ETA or FLEXPART
ENTRYPOINT ["/entrypoint.sh"]
# Could be FLEXPART_ETA pathnames_custom
CMD ["FLEXPART_ETA"]
......@@ -28,3 +28,32 @@ RUN mkdir build && \
ENV FC=gfortran
ENV LIBRARY_PATH=/usr/lib64:/usr/local/lib64
ENV CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
WORKDIR /
# clone just that version for FLEXPART v10.4 + small fixes
RUN git clone --branch v10.4.1 --single-branch https://gitlab.phaidra.org/flexpart/flexpart.git \
&& cp -r flexpart/src /src
ENV COMMIT=v10.4
COPY ./tests/default_options /options
# since the new data set is larger, we download the data for the container
RUN wget -r --no-parent -A 'EC*' -P /inputs "https://webdata.wolke.img.univie.ac.at/flexpart/"
COPY ./AVAILABLE /inputs/
# Entrypoint script (user tips)
COPY ./entrypoint.sh /entrypoint.sh
WORKDIR /src
#
# compile using a subset of microarch
# need to fix march to x86_64_v3 , remove mtune
# here generic means core_avx2
RUN make -f makefile_gfortran eta=no arch=generic \
&& make -f makefile_gfortran arch=generic \
&& mkdir -p /output \
&& echo -e "/options/\n/output/\n/inputs/\n/inputs/AVAILABLE" > /pathnames
# In the Dockerfile, the ENTRYPOINT command defines the executable,
# while CMD sets the default parameter.
# so here our entrypoint run script and default FLEXPART_ETA or FLEXPART
ENTRYPOINT ["/entrypoint.sh"]
# Could be FLEXPART_ETA pathnames_custom
CMD ["FLEXPART"]
Bootstrap: docker
From: rockylinux:9-minimal
Stage: spython-base
%files
../src /src
../AVAILABLE /inputs/AVAILABLE
./entrypoint.sh /entrypoint.sh
../tests/default_options /options
%post
microdnf install -y epel-release && \
microdnf install -y --enablerepo=crb make netcdf-fortran-devel.x86_64 netcdf.x86_64 eccodes eccodes-devel cmake tar gcc-c++ perl git wget && \
microdnf clean all -y && \
rm -rf /var/cache/yum
#
# Download ECCODES Version
# note 2.30.0 has an issue!!!
# ENV ECCODES=2.31.0
# RUN curl https://confluence.ecmwf.int/download/attachments/45757960/eccodes-${ECCODES}-Source.tar.gz | tar xz
# RUN mkdir build && \
# cd build && \
# cmake -DENABLE_ECCODES_OMP_THREADS=ON ../eccodes-*/ && \
# make -j8 && \
# make install
#
# set environment variables
#
FC=gfortran
LIBRARY_PATH=/usr/lib64:/usr/local/lib64
CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
# cmd Arguments for COMMIT ID/tag
COMMIT=0
COMMIT=$COMMIT
# since the new data set is larger, we download the data for the container
# EC 2009 01 01 00 - 06
wget -r -np -nd -A 'EC*' -P /inputs "https://webdata.wolke.img.univie.ac.at/flexpart/"
mkdir -p /src
cd /src
export FC=gfortran
export LIBRARY_PATH=/usr/lib64:/usr/local/lib64
export CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
#
# compile using a standardized
# need to fix march to x86_64_v3 , remove mtune
# here generic means core_avx2
make -f makefile_gfortran eta=no arch=generic \
&& make -f makefile_gfortran arch=generic \
&& mkdir -p /output \
&& echo -e "/options/\n/output/\n/inputs/\n/inputs/AVAILABLE" > /pathnames
# Entrypoint script (user tips)
# In the Dockerfile, the ENTRYPOINT command defines the executable,
# while CMD sets the default parameter.
# so here our entrypoint run script and default FLEXPART_ETA or FLEXPART
# Could be FLEXPART_ETA pathnames_custom
%environment
export FC=gfortran
export LIBRARY_PATH=/usr/lib64:/usr/local/lib64
export CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
export COMMIT=$COMMIT
# add a check if output is writeable?
%runscript
cd /src
exec /entrypoint.sh FLEXPART_ETA "$@"
%startscript
cd /src
exec /entrypoint.sh FLEXPART_ETA "$@"
#!/bin/bash
# By MB
# Build a FLEXPART container
CPATH=$(dirname $0)
#
# using podman to build containers
#
BRANCH=$(git rev-parse --abbrev-ref HEAD)
COMMIT=$(git log --pretty=format:'%h' -n 1)
echo "Building flexpart v11 branch: $BRANCH : $COMMIT"
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
cd $CPATH
if [ "$1" != "apptainer" ]; then
# build with subdirectory as root
podman build -f Dockerfile -t flexpartv11-${BRANCH}:${COMMIT} --build-arg COMMIT=$COMMIT ../
# registry
# podman build -t harbor.wolke.img.univie.ac.at/flexpart/flexpartv11-${BRANCH}:$COMMIT --build-arg COMMIT=$COMMIT ..
else
apptainer build flexpartv11-${BRANCH}-${COMMIT}.sif Singularity
fi
\ No newline at end of file
#!/bin/bash
# By MB
# run FLEXPART, but provide a bit of information
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
report() {
if [ $? -eq 0 ]; then
printf "%-68s[$GREEN%10s$NC]\n" "$@" "OK"
return 0
else
printf "%-68s[$RED%10s$NC]\n" "$@" "FAILED"
return 1
fi
}
echo "Welcome, running FLEXPART "
echo "Using defaults (/pathnames)"
test -e /pathnames
report "Using defaults (/pathnames)"
cat /pathnames
echo "Mount volumes to change inputs"
echo "Git: $COMMIT"
echo "EXECUTING FLEXPART"
if [ $# -eq 1 ]; then
echo "trying to execute: /src/$1"
if [ -e /src/"$1" ]; then
echo "Executing: /src/$1"
test -e /src/"$1"
report "Executing: /src/$1"
if [ $? -eq 0 ]; then
/src/"$1" /pathnames
else
echo "Falling back to default, executing: /src/FLEXPART_ETA"
/src/FLEXPART_ETA /pathnames
test -e "$1"
report "Executing: $1"
if [ $? -eq 0 ]; then
exec "$1"
fi
fi
elif [ $# -eq 2 ]; then
test -e /src/"$1"
report "Executing: /src/$1 $2"
if [ $? -eq 0 ]; then
/src/"$1" "$2"
fi
else
echo "Executing: /src/FLEXPART_ETA"
test -e /src/FLEXPART_ETA
report "Executing: /src/FLEXPART_ETA"
/src/FLEXPART_ETA /pathnames
fi
echo "FINISHED"
#!/bin/bash
# Ignacio Pisso, May 2017
# Changes 2018-2019
echo CREATE A NEW FLEXPART DISTRIBUTION
# get current commit hash
githash=$(git rev-parse --short --verify HEAD)
echo githash $githash
#define version number with hash
version=10.4_$githash
echo version $version
# define tarball name
targetdir=../flexpart_distribution/
echo targetdir $targetdir
# name distribution version
distribution_name=flexpart_v$version
# name distribution temporary dir
tarball_tmp=${targetdir}flexpart_v$version
echo tarball_tmp $tarball_tmp
# name distribution tarball file
#tarball=${targetdir}flexpart_v$version.tar
tarball=${tarball_tmp}.tar
echo tarball $tarball
# if needed clean old package
if [ -d $tarball_tmp ]; then
echo
echo clean old tarball
hora=$(date +"%Y-%m-%d_%H%M%S")
tarball_tmp_bk=$tarball_tmp$tarball_tmp_$hora
echo tarball_tmp=$tarball_tmp exists: move to tarball_tmp_bk=$tarball_tmp_bk #and exit
mkdir $tarball_tmp_bk
mv $tarball_tmp $tarball_tmp_bk/
mv $tarball $tarball_tmp_bk/
#exit
echo old files moved to tarball_tmp_bk=$tarball_tmp_bk
echo
fi
# start packing
## needs in addition to the git repo ANCILLARY git repos
# VERIFY THESE RESOURCES EXIST BEFORE PACKING DISTRIBUTION
#1 OH file OH_variables.bin || OH_variables=../flexin/OH_FIELDS/OH_variables.bin
#2 flex_extract || flex_extract=../flex_extract_v7.0.4/
#3 flex_read_fortran from ../flex_read_matlab/export_basic TODO: add functions to ../flex_read_matlab/export/
# flex_read_matlab_src=../flex_read_matlab/export_basic
#4 tests/examples ../flex_tests_examples/examples/*
# mkdir container
echo ---------------------------------------------------------
echo ')' create basis dir $tarball_tmp
mkdir $tarball_tmp
echo ---------------------------------------------------------
echo
# patnames
echo ---------------------------------------------------------
echo ')' copy pathnames
cp pathnames $tarball_tmp/pathnames
echo ---------------------------------------------------------
echo
# fortran source files
echo ---------------------------------------------------------
echo ')' copy src/
mkdir $tarball_tmp/src
cp src/*.f90 $tarball_tmp/src
cp -r src/gributils $tarball_tmp/src
cp src/makefile $tarball_tmp/src
echo ---------------------------------------------------------
cp LICENSE $tarball_tmp/LICENSE_GPLv3
cp src/flexpart_license.txt $tarball_tmp/src
echo
# options dir
echo ---------------------------------------------------------
echo ')' copy options/
echo ---------------------------------------------------------
mkdir $tarball_tmp/options
user_input_files="AGECLASSES COMMAND IGBP_int1.dat OUTGRID OUTGRID_NEST RECEPTORS RELEASES surfdata.t surfdepo.t"
for i in $user_input_files
do
echo $i
cp -r options/$i $tarball_tmp/options
done
mkdir $tarball_tmp/options/SPECIES
cp options/SPECIES/SPECIES* $tarball_tmp/options/SPECIES/
cp options/SPECIES/specoverview.f90 $tarball_tmp/options/SPECIES/
echo copy options/SPECIES/ to $tarball_tmp/options/SPECIES/
echo ---------------------------------------------------------
echo
# OH file
echo ---------------------------------------------------------
echo ')' copy OH_variables.bin to flexin
mkdir $tarball_tmp/flexin
OH_variables=../flexin/OH_FIELDS/OH_variables.bin
cp $OH_variables $tarball_tmp/flexin/
echo ---------------------------------------------------------
echo
# AVAILABLE
echo ---------------------------------------------------------
echo ')' copy AVAILABLE
cp AVAILABLE $tarball_tmp/AVAILABLE
echo ---------------------------------------------------------
echo
# output
echo ---------------------------------------------------------
echo ')' create output/ # mkdir $tarball_tmp/output
mkdir $tarball_tmp/output
echo ---------------------------------------------------------
echo output reference?
echo ---------------------------------------------------------
echo
# preprocess
echo ---------------------------------------------------------
echo ')' preprocess/
mkdir $tarball_tmp/preprocess
echo -----------------flex_extract-------------------
mkdir $tarball_tmp/preprocess/flex_extract
flex_extract=../flex_extract_v7.0.4/
echo include flex_extract v7.0.4 b7c1c04a204c91e53759ef590504bf52dfaece64
echo from $flex_extract [use git modules?] IP 3/2018
cp $flex_extract/README.md $tarball_tmp/preprocess/flex_extract
cp -r $flex_extract/docs $tarball_tmp/preprocess/flex_extract
cp -r $flex_extract/grib_templates $tarball_tmp/preprocess/flex_extract
cp -r $flex_extract/python $tarball_tmp/preprocess/flex_extract
cp -r $flex_extract/src $tarball_tmp/preprocess/flex_extract
echo flex_extract copied
echo ---------------------------------------------------------
echo AVAILABLE generation scripts?
echo ---------------------------------------------------------
echo
# postprocess
echo ---------------------------------------------------------
echo ')' postprocess/
postprocess=postprocess
mkdir $tarball_tmp/$postprocess
echo -----------------flex_read_fortran-------------------
flex_read_fortran_src=$postprocess/flex_read_fortran/
mkdir $tarball_tmp/$postprocess/flex_read_fortran
cp $postprocess/flex_read_fortran/*.f $tarball_tmp/$postprocess/flex_read_fortran
cp $postprocess/flex_read_fortran/*.f90 $tarball_tmp/$postprocess/flex_read_fortran
cp $postprocess/flex_read_fortran/makefile $tarball_tmp/$postprocess/flex_read_fortran
echo flex_read_fortran copied from $flex_read_fortran_src
echo -----------------flex_read_matlab-------------------
flex_read_matlab_src=../flex_read_matlab/export_basic
mkdir $tarball_tmp/$postprocess/flex_read_matlab
cp -r $flex_read_matlab_src/* $tarball_tmp/$postprocess/flex_read_matlab
echo flex_read_fortran from $flex_read_matlab_src # NOT copied
echo ---------------------------------------------------------
echo
echo ---------------------------------------------------------
echo ')' tests/
#echo '13) tests'
mkdir $tarball_tmp/tests
echo ----------------- examples -------------------
mkdir $tarball_tmp/tests/examples
cp -r ../flex_tests_examples/examples/* $tarball_tmp/tests/examples/
echo ----------------- examples_reference -------------------
cp -r ./tests/examples_reference $tarball_tmp/tests/
echo -----------------read examples-------------------
mkdir $tarball_tmp/tests/read_examples
cp tests/read_examples/declare_examples $tarball_tmp/tests/read_examples/
cp tests/read_examples/display_examples.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/examples_output.txt $tarball_tmp/tests/read_examples/
cp tests/read_examples/read_examples.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/read_grids.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/read_parts.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/set_examples_all $tarball_tmp/tests/read_examples/
cp tests/read_examples/set_examples_3.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/read_headers.sh $tarball_tmp/tests/read_examples/
cp tests/read_examples/read_examples_output.txt $tarball_tmp/tests/ #read_examples/
echo ------------compare examples-------------------
mkdir $tarball_tmp/tests/compare_examples
cp tests/compare_examples/*.sh $tarball_tmp/tests/compare_examples
cp tests/compare_examples/compare_grids_output.txt $tarball_tmp/tests/ #compare_examples
echo
echo ---------------------------------------------------------
echo create tarball
cd $targetdir
tar cf $distribution_name.tar $distribution_name
pwd
echo tarball $tarball complete
echo exported untarred files in $tarball_tmp
echo verify:
echo cp -r preprocess/flex_extract/work $tarball_tmp/preprocess/flex_extract/
echo cd $tarball_tmp/src
echo $HOME/repos/flexpart/src/make_in_laptop.sh
echo cd .. ';' ./src/FLEXPART
echo cd postprocess/flex_read_fortran
echo make test
echo e.g.: max: 0.115784094 mean: 4.70877676E-05
echo cd ../../tests/examples ';' make run
echo cd ../read_examples
echo ./read_examples.sh
echo ./read_examples.sh '>' ../read_examples_output.txt
echo cd ../compare_examples
echo ./compare_grids.sh
echo ./compare_grids.sh '>' ../compare_grids_output.txt
echo e.g. tar --append --file=$tarball_tmp/ ../compare_grids_output.txt ../read_examples_output.txt
# Containers
There are two most commonly used container formats available:
1. Docker/Podman
2. Singularity/Apptainer
with FLEXPART and recipes can be found in containers folder.
Since version 11, FLEXPART is also available as a container. There is a Dockerfile and some instructions on how to build the container from scratch using for example podman/docker or singularity/apptainer:
Specifications:
- compiled using `march=core-avx2`, compatible with CPUs above AVX2 (since Haswell or Zen)
- ecCodes
```sh
# build container using podman (adjust for docker)
$ ./containers/build.sh
Building flexpart v11 branch: master : 2464aef
Press any key to continue or Ctrl+C to exit...
STEP 1/16: FROM rockylinux:9-minimal
...
STEP 16/16: CMD ["FLEXPART_ETA"]
--> Using cache 200844128a6919007417f3fa905221c8dbdea4bb285895ef80e89d3df80274b6
COMMIT flexpartv11-master:2464aef
--> 200844128a69
Successfully tagged localhost/flexpartv11-master:2464aef
200844128a6919007417f3fa905221c8dbdea4bb285895ef80e89d3df80274b6
# finished
# using singularity/apptainer for running FLEXPART
# there might be some warnings about EPERM (can be ignored)
$ ./containers/build.sh apptainer
Building flexpart v11 branch: master : 2464aef
Press any key to continue or Ctrl+C to exit...
INFO: Starting build...
INFO: Adding environment to container
INFO: Adding startscript
INFO: Adding runscript
INFO: Creating SIF file...
INFO: Build complete: flexpartv11-master-2464aef.sif
# finished
```
running it using podman/docker or singularity/apptainer:
```sh
# simple run the container with default settings
podman run localhost/flexpartv11-master:2464aef
# running the container requires a writable output directory
# mounting the local directory to /output inside the container
apptainer run -B .:/output flexpartv11-master-2464aef.sif
```
<details>
<summary>podman/docker flexpart run log</summary>
<pre><code class="shell">
Welcome, running FLEXPART
Using defaults (/pathnames)
/options/
/output/
/inputs/
/inputs/AVAILABLE
Mount volumes to change inputs
Git: c5bdd94 HEAD -> master, origin/master, origin/HEAD Tue Nov 21 16:15:27 2023 +0100
EXECUTING FLEXPART
trying to execute: /src/FLEXPART_ETA
Executing: /src/FLEXPART_ETA
Welcome to FLEXPART Version 11
Git: undefined
FLEXPART is free software released under the GNU General Public License.
FLEXPART is running with ETA coordinates.
----------------
INFORMATION: SUBGRIDSCALE TERRAIN EFFECT IS
NOT PARAMETERIZED DURING THIS SIMULATION.
----------------
*********** WARNING **********************************
* FLEXPART running in parallel mode *
* Number of uncertainty classes in *
* set to number of threads: 1 *
* All other computations are done with 8 threads. *
*******************************************************
FLEXPART WARNING: TIME DIFFERENCE BETWEEN TWO
WIND FIELDS IS BIG. THIS MAY CAUSE A DEGRADATION
OF SIMULATION QUALITY.
ECMWF metdata detected
NXSHIFT is set to 0
grid dim: 181 91 92 92 91 92
Vertical levels in ECMWF data: 92 92
Mother domain:
Longitude range: -178.00000 to 182.00000 Grid distance: 2.00000
Latitude range : -90.00000 to 90.00000 Grid distance: 2.00000
Number of receptors: 2
Releasepoints : 1
reading SPECIES 24
Particle shape SPHERE for particle 24
SPECIES: 24 AIRTRACER (GAS)
Wet removal for gases is turned: OFF
Dry deposition for gases is turned: OFF
Below-cloud scavenging: OFF
In-cloud scavenging: OFF
Particles released (numpartmax): 10000
Total mass released: 1.0000000E+00
Allocating fields for global output (x,y): 85 65
Concentrations are calculated using kernel
WARNING: turbulence switched off.
Simulated 0.0 hours ( 0 s), 0 particles
Time: 0 seconds. Total spawned: 0 alive: 0 terminated: 0
Allocating 10000 particles 0 0 0
Finished allocation
Time: 900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 1800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 2700 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 3600 seconds. Total spawned: 10000 alive: 10000 terminated: 0
3600 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 4500 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 5400 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 6300 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 7200 seconds. Total spawned: 10000 alive: 10000 terminated: 0
7200 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 8100 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9000 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 10800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
10800 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Read wind fields: 0.609375000 seconds
Timemanager: 1.17187500 seconds,first timestep: 1.09375000 seconds
Write particle files: 4.68750000E-02 seconds
Total running time: 1.81250000 seconds
tps,io,tot: 1.95312500E-02 0.131249994 1.81250000
CONGRATULATIONS: YOU HAVE SUCCESSFULLY COMPLETED A FLEXPART MODEL RUN!
FINISHED
</code></pre>
</details>
<details>
<summary>singularity/apptainer flexpart run log</summary>
<pre>
<code class="language-shell">
INFO: gocryptfs not found, will not be able to use gocryptfs
Welcome, running FLEXPART
Using defaults (/pathnames)
/options/
/output/
/inputs/
/inputs/AVAILABLE
Mount volumes to change inputs
Git: c5bdd94 HEAD -> master, origin/master, origin/HEAD Tue Nov 21 16:15:27 2023 +0100
EXECUTING FLEXPART
trying to execute: /src/FLEXPART_ETA
Executing: /src/FLEXPART_ETA
Welcome to FLEXPART Version 11
Git: undefined
FLEXPART is free software released under the GNU General Public License.
FLEXPART is running with ETA coordinates.
----------------
INFORMATION: SUBGRIDSCALE TERRAIN EFFECT IS
NOT PARAMETERIZED DURING THIS SIMULATION.
----------------
*********** WARNING **********************************
* FLEXPART running in parallel mode *
* Number of uncertainty classes in *
* set to number of threads: 1 *
* All other computations are done with 8 threads. *
*******************************************************
FLEXPART WARNING: TIME DIFFERENCE BETWEEN TWO
WIND FIELDS IS BIG. THIS MAY CAUSE A DEGRADATION
OF SIMULATION QUALITY.
ECMWF metdata detected
NXSHIFT is set to 0
grid dim: 181 91 92 92 91 92
Vertical levels in ECMWF data: 92 92
Mother domain:
Longitude range: -178.00000 to 182.00000 Grid distance: 2.00000
Latitude range : -90.00000 to 90.00000 Grid distance: 2.00000
Number of receptors: 2
Releasepoints : 1
reading SPECIES 24
Particle shape SPHERE for particle 24
SPECIES: 24 AIRTRACER (GAS)
Wet removal for gases is turned: OFF
Dry deposition for gases is turned: OFF
Below-cloud scavenging: OFF
In-cloud scavenging: OFF
Particles released (numpartmax): 10000
Total mass released: 1.0000000E+00
Allocating fields for global output (x,y): 85 65
Concentrations are calculated using kernel
WARNING: turbulence switched off.
Simulated 0.0 hours ( 0 s), 0 particles
Time: 0 seconds. Total spawned: 0 alive: 0 terminated: 0
Allocating 10000 particles 0 0 0
Finished allocation
Time: 900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 1800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 2700 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 3600 seconds. Total spawned: 10000 alive: 10000 terminated: 0
3600 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 4500 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 5400 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 6300 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 7200 seconds. Total spawned: 10000 alive: 10000 terminated: 0
7200 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Time: 8100 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9000 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 9900 seconds. Total spawned: 10000 alive: 10000 terminated: 0
Time: 10800 seconds. Total spawned: 10000 alive: 10000 terminated: 0
10800 Seconds simulated: 10000 Particles: Uncertainty: 0.000 0.000 0.000
Read wind fields: 0.703125000 seconds
Timemanager: 1.25000000 seconds,first timestep: 1.15625000 seconds
Write particle files: 1.56250000E-02 seconds
Total running time: 2.00000000 seconds
tps,io,tot: 2.34375000E-02 0.143749997 2.00000000
CONGRATULATIONS: YOU HAVE SUCCESSFULLY COMPLETED A FLEXPART MODEL RUN!
FINISHED
</code></pre>
</details>
<details>
<summary>ncdump of default run output</summary>
<pre><code class="language-shell">
# check the output
ncdump -h grid_conc_20090101000000.nc
netcdf grid_conc_20090101000000 {
dimensions:
time = UNLIMITED ; // (3 currently)
longitude = 85 ;
latitude = 65 ;
height = 4 ;
numspec = 1 ;
pointspec = 1 ;
nageclass = 1 ;
nchar = 45 ;
ncharrec = 16 ;
numpoint = 1 ;
receptor = UNLIMITED ; // (2 currently)
variables:
int time(time) ;
time:units = "seconds since 2009-01-01 00:00" ;
time:calendar = "proleptic_gregorian" ;
float longitude(longitude) ;
longitude:long_name = "longitude in degree east" ;
longitude:axis = "Lon" ;
longitude:units = "degrees_east" ;
longitude:standard_name = "grid_longitude" ;
longitude:description = "grid cell centers" ;
float latitude(latitude) ;
latitude:long_name = "latitude in degree north" ;
latitude:axis = "Lat" ;
latitude:units = "degrees_north" ;
latitude:standard_name = "grid_latitude" ;
latitude:description = "grid cell centers" ;
float height(height) ;
height:units = "meters" ;
height:positive = "up" ;
height:standard_name = "height" ;
height:long_name = "height above ground" ;
char RELCOM(numpoint, nchar) ;
RELCOM:long_name = "release point name" ;
float RELLNG1(numpoint) ;
RELLNG1:units = "degrees_east" ;
RELLNG1:long_name = "release longitude lower left corner" ;
float RELLNG2(numpoint) ;
RELLNG2:units = "degrees_east" ;
RELLNG2:long_name = "release longitude upper right corner" ;
float RELLAT1(numpoint) ;
RELLAT1:units = "degrees_north" ;
RELLAT1:long_name = "release latitude lower left corner" ;
float RELLAT2(numpoint) ;
RELLAT2:units = "degrees_north" ;
RELLAT2:long_name = "release latitude upper right corner" ;
float RELZZ1(numpoint) ;
RELZZ1:units = "meters" ;
RELZZ1:long_name = "release height bottom" ;
float RELZZ2(numpoint) ;
RELZZ2:units = "meters" ;
RELZZ2:long_name = "release height top" ;
int RELKINDZ(numpoint) ;
RELKINDZ:long_name = "release kind" ;
int RELSTART(numpoint) ;
RELSTART:units = "seconds" ;
RELSTART:long_name = "release start relative to simulation start" ;
int RELEND(numpoint) ;
RELEND:units = "seconds" ;
RELEND:long_name = "release end relative to simulation start" ;
int RELPART(numpoint) ;
RELPART:long_name = "number of release particles" ;
float RELXMASS(numspec, numpoint) ;
RELXMASS:long_name = "total release particle mass" ;
int LAGE(nageclass) ;
LAGE:units = "seconds" ;
LAGE:long_name = "age class" ;
int ORO(latitude, longitude) ;
ORO:standard_name = "surface altitude" ;
ORO:long_name = "outgrid surface altitude" ;
ORO:units = "m" ;
char receptor(receptor, ncharrec) ;
receptor:long_name = "receptor name" ;
float spec001_mr(nageclass, pointspec, time, height, latitude, longitude) ;
spec001_mr:units = "ng m-3" ;
spec001_mr:long_name = "AIRTRACER" ;
spec001_mr:decay = -0.07001485f ;
spec001_mr:weightmolar = 29.f ;
spec001_mr:ohcconst = -9.e-10f ;
spec001_mr:ohdconst = -9.9f ;
spec001_mr:vsetaver = 0.f ;
float receptor_conc001(receptor, time) ;
receptor_conc001:units = "ng m-3" ;
receptor_conc001:_FillValue = -1.f ;
receptor_conc001:positive = "up" ;
receptor_conc001:standard_name = "receptor_conc" ;
receptor_conc001:long_name = "receptor_concentration" ;
// global attributes:
:Conventions = "CF-1.6" ;
:title = "FLEXPART model output" ;
:git = "undefined" ;
:source = "Version 11 model output" ;
:history = "2023-11-21 16:22 +0100 created by mblaschek on NB513" ;
:references = "Stohl et al., Atmos. Chem. Phys., 2005, doi:10.5194/acp-5-2461-200" ;
:outlon0 = -25.f ;
:outlat0 = 10.f ;
:dxout = 1.f ;
:dyout = 1.f ;
:ldirect = 1 ;
:ibdate = "20090101" ;
:ibtime = "000000" ;
:iedate = "20090101" ;
:ietime = "030000" ;
:loutstep = 3600 ;
:loutaver = 3600 ;
:loutsample = 900 ;
:loutrestart = -1 ;
:lsynctime = 900 ;
:ctl = -0.2f ;
:ifine = 1 ;
:iout = 1 ;
:ipout = 0 ;
:lsubgrid = 0 ;
:lconvection = 0 ;
:lagespectra = 0 ;
:ipin = 0 ;
:ioutputforeachrelease = 0 ;
:iflux = 0 ;
:mdomainfill = 0 ;
:ind_source = 1 ;
:ind_receptor = 1 ;
:mquasilag = 0 ;
:nested_output = 0 ;
:sfc_only = 0 ;
:linit_cond = 0 ;
}
</code>
</pre>
</details>
Interactive shells can be launched into containers, to have a look at configurations and to better understand what might go wrong. Podman/Docker allows to alter files inside of the container and save these changes. Singularity/Apptainer containers are not writeable, but acts like a normal executable with access to host files.
```sh
# using podman
$ podman run -it localhost/flexpartv11-master:2464aef /bin/bash
Welcome, running FLEXPART
Using defaults (/pathnames) [ OK]
/options/
/output/
/inputs/
/inputs/AVAILABLE
Mount volumes to change inputs
Git: 2464aef
EXECUTING FLEXPART
Executing: /src//bin/bash [ FAILED]
Executing: /bin/bash [ OK]
bash-5.1#
# now you are inside the container
bash-5.1# pwd
/src
# important directories are /input, /output, /src, /options
#
# using singularity/apptainer
$ apptainer run
```
\ No newline at end of file
......@@ -38,5 +38,6 @@ nav:
- 'transport.md'
- 'evolution.md'
- 'examples.md'
- 'containers.md'
- 'troubleshooting.md'
./options/
./output/
./preprocess/flex_extract/work/
./inputs
./AVAILABLE
./options/
./output/
/
/xnilu_wrk/flex_wrk/WIND_FIELDS/AVAILABLE_ECMWF_OPER_fields_global
============================================
#
# Dockerfile for CI and Flexpart container images
# Build Examples:
# - podman build -t harbor.wolke.img.univie.ac.at/flexpart/almalinux8 -f Dockerfile
# - podman build -t harbor.wolke.img.univie.ac.at/flexpart/rockylinux9 -f Dockerfile
#
# FROM rockylinux:8-minimal
FROM rockylinux:9-minimal
#
# Build development image (with/without jasper)
# jasper was used in FP 10.4 (eccodes, emoslib)
#
# 8: --enablerepo=powertools
# since 9, there is 2.31 eccodes in epel
RUN microdnf install -y epel-release && \
microdnf install -y --enablerepo=crb make netcdf-fortran-devel.x86_64 netcdf.x86_64 eccodes eccodes-devel cmake tar gcc-c++ perl git && \
microdnf install -y --enablerepo=crb make netcdf-fortran-devel.x86_64 netcdf.x86_64 eccodes eccodes-devel cmake tar gcc-c++ perl git wget && \
microdnf clean all -y && \
rm -rf /var/cache/yum
#
# Download ECCODES Version
# note 2.30.0 has an issue!!!
#
# RUN curl https://confluence.ecmwf.int/download/attachments/45757960/eccodes-2.31.0-Source.tar.gz | tar xz
# ENV ECCODES=2.31.0
# RUN curl https://confluence.ecmwf.int/download/attachments/45757960/eccodes-${ECCODES}-Source.tar.gz | tar xz
# RUN mkdir build && \
# cd build && \
# cmake -DENABLE_ECCODES_OMP_THREADS=ON ../eccodes-*/ && \
......@@ -32,4 +18,4 @@ RUN microdnf install -y epel-release && \
#
ENV FC=gfortran
ENV LIBRARY_PATH=/usr/lib64:/usr/local/lib64
ENV CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
ENV CPATH=/usr/include:/usr/local/include:/usr/lib64/gfortran/modules
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment