precision_m.f90 Source File


Source Code

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