Skip to content

File Precision_Mod.F90

File List > core > Precision_Mod.F90

Go to the documentation of this file

module precision_mod
   implicit none

   ! KIND parameter for 4-byte precision
   INTEGER, PARAMETER, PUBLIC :: f4 = kind( 0.0_4 ) 

   ! KIND parameter for 8-byte precision
   INTEGER, PARAMETER, PUBLIC :: f8 = kind( 0.0_8 ) 

#ifdef USE_REAL8
   ! Use 8-byte floating point precision when asked.
   INTEGER, PARAMETER, PUBLIC :: fp = f8 
#else
   ! Use 4-byte floating point by default.
   INTEGER, PARAMETER, PUBLIC :: fp = f4 
#endif

   !=========================================================================
   ! Parameters for missing values
   !=========================================================================
   LOGICAL,          PARAMETER, PUBLIC :: MISSING_BOOL = .false.   
   INTEGER,          PARAMETER, PUBLIC :: MISSING_INT  = -999
   REAL(fp),         PARAMETER, PUBLIC :: MISSING      = -999.0_fp 
   REAL(f4),         PARAMETER, PUBLIC :: MISSING_REAL = -999.0_f4 
   REAL(f8),         PARAMETER, PUBLIC :: MISSING_DBLE = -999.0_f8 
   CHARACTER(LEN=7), PARAMETER, PUBLIC :: MISSING_STR  = "UNKNOWN"

   !=========================================================================
   ! Parameters for zero
   !=========================================================================
   REAL(fp),         PARAMETER, PUBLIC :: ZERO         =  0.0_fp   
   REAL(f4),         PARAMETER, PUBLIC :: ZERO_REAL    =  0.0_f4   
   REAL(f8),         PARAMETER, PUBLIC :: ZERO_DBLE    =  0.0_f8   

   !=========================================================================
   ! Parameters for very tiny numbers
   !=========================================================================
   REAL(f4),         PARAMETER, PUBLIC :: TINY_REAL    =  1.0e-16_f4 
   REAL(f8),         PARAMETER, PUBLIC :: TINY_DBLE    =  1.0e-31_f8 
#ifdef USE_REAL8
   REAL(fp),         PARAMETER, PUBLIC :: TINY_        = tiny_dble
#else
   REAL(fp),         PARAMETER, PUBLIC :: TINY_        = tiny_real
#endif

   !=========================================================================
   ! Parameters for one
   !=========================================================================
   REAL(fp),         PARAMETER, PUBLIC :: ONE          =  1.0_fp 
   REAL(f4),         PARAMETER, PUBLIC :: ONE_REAL     =  1.0_f4 
   REAL(f8),         PARAMETER, PUBLIC :: ONE_DBLE     =  1.0_f8 

   interface rae
      module procedure rae_f4, rae_f8
   end interface rae

contains

   logical function rae_f4(a, b) result(res)
      real(f4), intent(in) :: a, b
      real(f4) :: diff

      diff = abs(a - b)
      res = diff < tiny(a)
   end function rae_f4

   logical function rae_f8(a, b) result(res)
      real(f8), intent(in) :: a, b
      real(f8) :: diff

      diff = abs(a - b)
      res = diff < tiny(a)
   end function rae_f8

end module precision_mod