diff --git a/src/MNH/modd_precision.f90 b/src/MNH/modd_precision.f90 new file mode 100644 index 0000000000000000000000000000000000000000..afd0a3a21fb0c432adc57bb19806a45b9e40a4ae --- /dev/null +++ b/src/MNH/modd_precision.f90 @@ -0,0 +1,100 @@ +!MNH_LIC Copyright 2019-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Author: +! P. Wautelet 08/03/2019 +! Modifications: +! +!----------------------------------------------------------------- +module modd_precision + +use modd_mpif + +#ifdef MNH_IOCDF4 +use NETCDF, only: NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_INT64 +#endif + +implicit none + +private + +public :: MNHINT, MNHREAL +public :: MNHINT_MPI, MNHREAL_MPI, MNH2REAL_MPI + +public :: LFIINT + +#ifdef MNH_IOCDF4 +public :: CDFINT, MNHINT_NF90, MNHREAL_NF90 +#endif + + +integer, parameter :: MNHINT32 = selected_int_kind( r = 9 ) +integer, parameter :: MNHINT64 = selected_int_kind( r = 18 ) + +integer, parameter :: MNHREAL32 = selected_real_kind( p = 6, r = 37 ) +integer, parameter :: MNHREAL64 = selected_real_kind( p = 15, r = 307 ) +integer, parameter :: MNHREAL128 = selected_real_kind( p = 33, r = 4931 ) + + +! Kinds for MesoNH +#if ( MNH_INT == 4 ) +integer, parameter :: MNHINT = MNHINT32 +integer, parameter :: MNHINT_MPI = MPI_INTEGER4 +#elif ( MNH_INT == 8 ) +integer, parameter :: MNHINT = MNHINT64 +integer, parameter :: MNHINT_MPI = MPI_INTEGER8 +#else +#error "Invalid MNH_INT" +#endif + +#if ( MNH_REAL == 4 ) +integer, parameter :: MNHREAL = MNHREAL32 +integer, parameter :: MNHREAL_MPI = MPI_REAL4 +integer, parameter :: MNH2REAL_MPI = MPI_2REAL +#elif ( MNH_REAL == 8 ) +integer, parameter :: MNHREAL = MNHREAL64 +integer, parameter :: MNHREAL_MPI = MPI_REAL8 +integer, parameter :: MNH2REAL_MPI = MPI_2DOUBLE_PRECISION +#elif ( MNH_REAL == 16 ) +integer, parameter :: MNHREAL = MNHREAL128 +integer, parameter :: MNHREAL_MPI = MPI_REAL16 +#error "No MNH2REAL_MPI for MNH_REAL=16" +#else +#error "Invalid MNH_REAL" +#endif + + +! Kinds for LFI +#if ( LFI_INT == 4 ) +integer, parameter :: LFIINT = MNHINT32 +#elif ( LFI_INT == 8 ) +integer, parameter :: LFIINT = MNHINT64 +#else +#error "Invalid LFI_INT" +#endif + + +#ifdef MNH_IOCDF4 +! Kinds for netCDF +integer, parameter :: CDFINT = selected_int_kind( r = 9 ) + +#if (MNH_INT == 4) +integer, parameter :: MNHINT_NF90 = NF90_INT +#elif (MNH_INT == 8) +integer, parameter :: MNHINT_NF90 = NF90_INT64 +#else +#error "Invalid MNH_INT" +#endif + +#if (MNH_REAL == 4) +integer, parameter :: MNHREAL_NF90 = NF90_FLOAT +#elif (MNH_REAL == 8) +integer, parameter :: MNHREAL_NF90 = NF90_DOUBLE +#else +#error "Invalid MNH_REAL" +#endif +#endif + +end module modd_precision