module precision_m !! Definition of precision use mpi use netcdf use, intrinsic :: iso_fortran_env, only: REAL32,REAL64,INT32,INT64 use, intrinsic :: iso_c_binding implicit none save integer, public, parameter :: SP = REAL32 !! Single precision integer, public, parameter :: DP = REAL64 !! Double precision real(kind = SP), public, parameter :: SP_EPS = epsilon(0.0_SP) !! Machine epsilon for single precision real(kind = DP), public, parameter :: DP_EPS = epsilon(0.0_DP) !! Machine epsilon for double precision real(kind = SP), parameter :: SP_NAN = transfer(-4194304_int32, 1._SP) !! NaN for single precision real(kind = DP), public, parameter :: DP_NAN = transfer(-2251799813685248_int64, 1._DP) !! NaN for double precision real(kind = SP), parameter :: SP_SMALLEST_EXP = log(tiny(1._SP)) !! Smallest allowable exponent for the exp function for single precision real(kind = DP), parameter :: DP_SMALLEST_EXP = log(tiny(1._DP)) !! Smallest allowable exponent for the exp function for double precision real(kind = SP), parameter :: SP_LARGEST = huge(1._SP) !! Largest allowable number for single precision real(kind = DP), parameter :: DP_LARGEST = huge(1._DP) !! Largest allowable number for double precision ! define PARALLAX precision #ifdef DOUBLE_PREC integer, public, parameter :: FP = DP !! PARALLAX Fortran precision integer, public, parameter :: CP = C_DOUBLE !! PARALLAX C/C++ precision integer, public, parameter :: MPI_FP = MPI_DOUBLE !! PARALLAX precision for MPI integer, public, parameter :: NF90_FP = NF90_DOUBLE !! PARALLAX precision for NetCDF real(kind = FP), public, parameter :: FP_EPS = DP_EPS !! Machine epsilon for PARALLAX precision real(kind = FP), public, parameter :: FP_NAN = DP_NAN !! NaN for PARALLAX precision real(kind = FP), parameter :: FP_SMALLEST_EXP = DP_SMALLEST_EXP !! Smallest allowable exponent for the exp function for PARALLAX precision real(kind = FP), parameter :: FP_LARGEST = DP_LARGEST !! Largest allowable number for PARALLAX precision #else integer, public, parameter :: FP = SP !! PARALLAX Fortran precision integer, public, parameter :: CP = C_FLOAT !! PARALLAX C/C++ precision integer, public, parameter :: MPI_FP = MPI_FLOAT !! PARALLAX precision for MPI integer, public, parameter :: NF90_FP = NF90_FLOAT !! PARALLAX precision for NetCDF real(kind = FP), public, parameter :: FP_EPS = SP_EPS !! Machine epsilon for PARALLAX precision real(kind = FP), public, parameter :: FP_NAN = SP_NAN !! NaN for PARALLAX precision real(kind = FP), parameter :: FP_SMALLEST_EXP = SP_SMALLEST_EXP !! Smallest allowable exponent for the exp function for PARALLAX precision real(kind = FP), parameter :: FP_LARGEST = SP_LARGEST !! Largest allowable number for PARALLAX precision #endif end module precision_m