Welcome to Flexpart - The Lagrangian particle dispersion model
This is the main development site @ University of Vienna.
Other references:
What is this repository for?
- This repository contains versions of the Lagrangian model FLEXPART
- Development versions
- Issues on the FLEXPART model
- 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 from ECMWF (Jasper is not a requirement).
- NetCDF (optional) from UCAR
- Fortran Compiler with Fortran 2008 standard, e.g. GCC compiler
8+
or INTEL19+
or INTEL-ONEAPI - make utils
2.Compilation
Clone the git repository or download one of the releases
# 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 using for example podman/docker or singularity/apptainer:
Specifications:
- compiled using
march=core-avx2
, compatible with CPUs above AVX2 (since Haswell or Zen) - ecCodes
# 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:
# 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
podman/docker flexpart run log
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
singularity/apptainer flexpart run log
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
ncdump of default run output
# 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 ;
}
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
-
-
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
-
become an active developer and request a user account.