Fortran modules¶
Compilation¶
Requirements¶
Tested on Ubuntu 18.04 LTS
gfortran (used version 7.5)
libnetcdf for Fortran. More info at: https://www.unidata.ucar.edu/software/netcdf/docs-fortran/
These can be installed in Ubuntu using:
sudo apt-get install gfortran
sudo apt-get install libnetcdff-dev
How to compile¶
Using gfortran and linking the netcdf library (which is the most tricky part).
This command will compile everything, but please look at both the examples/build_examples.sh and the src/libswamif/build_tests.sh scripts for more details.
SRC='src/libswamif'
gfortran -c $SRC/dtm2020_F107_Kp-subr_MCM.f90 $SRC/dtm2020_sigma_function.f90 \
$SRC/m_dtm.f90 $SRC/m_interp.f90 $SRC/m_um.f90 $SRC/m_mcm.f90 \
`nf-config --fflags --flibs` -Wall -pedantic -Warray-bounds -fbacktrace
A more complex setup would be:
# path to the source code
SRC='src/libswamif'
# flags for gfortran
FLAGS='-Wall -pedantic -Warray-bounds -fbacktrace'
# for the netcdff library
L_NETCDF=$(nf-config --fflags --flibs)
# for the interpolation module
M_INTERP="$SRC/m_interp.f90"
# for the UM module
M_UM="$SRC/m_um.f90 $M_INTERP $L_NETCDF"
# for the DTM module
M_DTM="$SRC/dtm2020_F107_Kp-subr_MCM.f90 $SRC/dtm2020_sigma_function.f90 $SRC/m_dtm.f90"
# for the MCM module
M_MCM="$M_UM $M_DTM $SRC/m_mcm.f90"
gfortran $M_MCM
How to use¶
In your fortran program, use the use statement to load the module. There are three modules with their most important functions. More details on the units, the valid ranges and the definition in Fortran interface
It is important to call the init_ subroutine at the beginning of the program. It will load the required constants and keep them in memory throughtout the whole execution.
Fortran interface¶
m_mcm: MOWA Climatological Model (MCM)¶
This module contains routines related to the MCM model, which combines the DTM (thermosphere) and the UM (lower atmosphere) to have a MOdel of the Whole Atmosphere
call init_mcm(path_to_data_um, path_to_data_dtm)
call get_mcm_dens(dens, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_mcm_temp(temp, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_mcm(mcm_out, alti, lati, long, loct, doy, f107, f107m, kps(2))
Derived type t_mcm_out
dens [real]: Total density (in gram/cm3)
temp [real]: Temperature at altitude (K)
wmm [real]: Mean molecular mass (in gram)
d_H [real]: Partial density of atomic hydrogen (in gram/cm3)
d_He [real]: Partial density of helium
d_O [real]: Partial density of atomic oxygen
d_N2 [real]: Partial density of molecular nitrogen
d_O2 [real]: Partial density of molecular oxygen
d_N [real]: Partial density of atomic nitrogen
tinf [real]: Exospheric temperature, in K
dens_unc [real]: Density uncertainty from DTM2020 (above 120 km), as a percentage
dens_std [real]: Standard deviation of the density (UM, below 100 km), in g/cm3
temp_std [real]: Standard deviation of the temperature (UM, below 100 km), in K
xwind [real]: Zonal wind, in m/s
ywind [real]: Meridional wind, m/s
xwind_std [real]: Standard deviation of zonal wind, in m/s
ywind_std [real]: Standard deviation of neridional wind, m/s
m_dtm: Drag Temperature Model (DTM)¶
This module contains routines related to the DTM2020 model.
Go to Drag Temperature Model (DTM2020)) for some theoretical details about the model.
call init_dtm2020(path_to_data_dtm_file)
call get_dtm2020(dens, temp, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_dtm2020_dens_uncertainty(dens_unc, temp, alti, lati, long, loct, doy, f107, f107m, kps(2))
Parameter DTM2020_DATA_FILENAME
(character) is "DTM_2020_F107_Kp.dat"
Derived type t_dtm_out
dens [real]: Total density (in gram/cm3)
temp [real]: Temperature at altitude (K)
wmm [real]: Mean molecular mass (in gram)
d_H [real]: Partial density of atomic hydrogen (in gram/cm3)
d_He [real]: Partial density of helium
d_O [real]: Partial density of atomic oxygen
d_N2 [real]: Partial density of molecular nitrogen
d_O2 [real]: Partial density of molecular oxygen
d_N [real]: Partial density of atomic nitrogen
tinf [real]: Exospheric temperature, in K
dens_unc [real]: Density uncertainty from DTM2020 (above 120 km), as a percentage
m_um: Unified Model (UM)¶
This module contains routines related to the UM model.
Go to Unified Model (UM)) for some theoretical details about the model.
call init_um(path_to_data_um)
call get_um_dens(dens, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_temp(temp, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_xwind(xwind, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_ywind(ywind, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_dens_standard_deviation(dens_std, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_temp_standard_deviation(temp_std, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_xwind_standard_deviation(xwind_std, alti, lati, long, loct, doy, f107, f107m, kps(2))
call get_um_ywind_standard_deviation(ywind_std, alti, lati, long, loct, doy, f107, f107m, kps(2))