MODULE Numeric_Kinds_Module
   IMPLICIT NONE
   SAVE 
   INTEGER, PARAMETER :: I1_Kind = SELECTED_INT_KIND(1)        ! 1 byte integer
   INTEGER, PARAMETER :: I4_Kind = SELECTED_INT_KIND(7)        ! 4 byte integer
   INTEGER, PARAMETER :: I8_Kind = SELECTED_INT_KIND(14)       ! 8 byte integer
   INTEGER, PARAMETER :: SP_Kind = SELECTED_REAL_KIND( 6,30)   ! Single precsion
   INTEGER, PARAMETER :: DP_Kind = SELECTED_REAL_KIND(14,300)  ! Double precsion
   INTEGER, PARAMETER :: QP_Kind = SELECTED_REAL_KIND(25,1000) ! Quadruple precision

   ! Current integer and real kinds
   INTEGER, PARAMETER :: IW_Kind = I4_Kind                     ! Working integer
   INTEGER, PARAMETER :: WP_Kind = DP_Kind                     ! Working real

   ! Commonly used integer constants
   INTEGER(KIND=IW_Kind), PARAMETER :: IW_Bit_Size = Bit_Size(1_IW_Kind) ! Number of bits
   INTEGER(KIND=IW_Kind), PARAMETER :: IW_Digits   = Digits(1_IW_Kind)   ! Number of digits
   INTEGER(KIND=IW_Kind), PARAMETER :: WP_Digits   = Digits(1.0_WP_Kind) ! Number of digits
   INTEGER(KIND=IW_Kind), PARAMETER :: IP_Huge     = Huge(1_IW_Kind)     ! Largest Integer number

   ! Commonly used real constants
   REAL(KIND=WP_Kind), PARAMETER :: WP_Tiny    = TINY(1.0_WP_Kind)       ! Smallest real number
   REAL(KIND=WP_Kind), PARAMETER :: WP_Huge    = Huge(1.0_WP_Kind)       ! Largest real number
END MODULE Numeric_Kinds_Module