Merge remote-tracking branch 'origin/release-v4.5.2'
[WRF.git] / var / convertor / nmm_interface_convertor / kinds.F
blob73fbe3b568febcfde8d39ff6fd1dae894c40e530
1 module kinds
2 !$$$  module documentation block
3 !                .      .    .                                       .
4 ! module:   kinds
5 !   prgmmr: treadon          org: np23                date: 2004-08-15
7 ! abstract:  Module to hold specification kinds for variable declaration.
8 !            This module is based on (copied from) Paul vanDelst's 
9 !            type_kinds module found in the community radiative transfer
10 !            model
12 ! module history log:
13 !   2004-08-15  treadon
15 ! Subroutines Included:
17 ! Functions Included:
19 ! remarks:
20 !   The numerical data types defined in this module are:
21 !      i_byte    - specification kind for byte (1-byte) integer variable
22 !      i_short   - specification kind for short (2-byte) integer variable
23 !      i_long    - specification kind for long (4-byte) integer variable
24 !      i_llong   - specification kind for double long (8-byte) integer variable
25 !      r_single  - specification kind for single precision (4-byte) real variable
26 !      r_double  - specification kind for double precision (8-byte) real variable
27 !      r_quad    - specification kind for quad precision (16-byte) real variable
29 !      i_kind    - generic specification kind for default integer
30 !      r_kind    - generic specification kind for default floating point
33 ! attributes:
34 !   language: f90
35 !   machine:  ibm RS/6000 SP
37 !$$$ end documentation block
38   implicit none
39   private
41 ! Integer type definitions below
43 ! Integer types
44   integer, parameter, public  :: i_byte  = selected_int_kind(1)      ! byte  integer
45   integer, parameter, public  :: i_short = selected_int_kind(4)      ! short integer
46   integer, parameter, public  :: i_long  = selected_int_kind(8)      ! long  integer
47   integer, parameter, private :: llong_t = selected_int_kind(16)     ! llong integer
48   integer, parameter, public  :: i_llong = max( llong_t, i_long )
50 ! Expected 8-bit byte sizes of the integer kinds
51   integer, parameter, public :: num_bytes_for_i_byte  = 1
52   integer, parameter, public :: num_bytes_for_i_short = 2
53   integer, parameter, public :: num_bytes_for_i_long  = 4
54   integer, parameter, public :: num_bytes_for_i_llong = 8
56 ! Define arrays for default definition
57   integer, parameter, private :: num_i_kinds = 4
58   integer, parameter, dimension( num_i_kinds ), private :: integer_types = (/ &
59        i_byte, i_short, i_long,  i_llong  /) 
60   integer, parameter, dimension( num_i_kinds ), private :: integer_byte_sizes = (/ &
61        num_bytes_for_i_byte, num_bytes_for_i_short, &
62        num_bytes_for_i_long, num_bytes_for_i_llong  /)
64 ! Default values
65 ! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT INTEGER TYPE KIND ***
66   integer, parameter, private :: default_integer = 3  ! 1=byte, 
67                                                       ! 2=short, 
68                                                       ! 3=long, 
69                                                       ! 4=llong
70   integer, parameter, public  :: i_kind = integer_types( default_integer )
71   integer, parameter, public  :: num_bytes_for_i_kind = &
72        integer_byte_sizes( default_integer )
75 ! Real definitions below
77 ! Real types
78   integer, parameter, public  :: r_single = selected_real_kind(6)  ! single precision
79   integer, parameter, public  :: r_double = selected_real_kind(15) ! double precision
80   integer, parameter, private :: quad_t   = selected_real_kind(20) ! quad precision
81   integer, parameter, public  :: r_quad   = max( quad_t, r_double )
83 ! Expected 8-bit byte sizes of the real kinds
84   integer, parameter, public :: num_bytes_for_r_single = 4
85   integer, parameter, public :: num_bytes_for_r_double = 8
86   integer, parameter, public :: num_bytes_for_r_quad   = 16
88 ! Define arrays for default definition
89   integer, parameter, private :: num_r_kinds = 3
90   integer, parameter, dimension( num_r_kinds ), private :: real_kinds = (/ &
91        r_single, r_double, r_quad    /) 
92   integer, parameter, dimension( num_r_kinds ), private :: real_byte_sizes = (/ &
93        num_bytes_for_r_single, num_bytes_for_r_double, &
94        num_bytes_for_r_quad    /)
96 ! Default values
97 ! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT REAL TYPE KIND ***
98   integer, parameter, private :: default_real = 2  ! 1=single, 
99                                                    ! 2=double, 
100                                                    ! 3=quad
101   integer, parameter, public  :: r_kind = real_kinds( default_real )
102   integer, parameter, public  :: num_bytes_for_r_kind = &
103        real_byte_sizes( default_real )
105 end module kinds