1! Copyright 2005-2018 ECMWF.
2!
3! This software is licensed under the terms of the Apache Licence Version 2.0
4! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5!
6! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
7! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
8
9integer function kind_of_size_t()
10  integer(2), dimension(2) :: x2 = (/1, 2/)
11  integer(4), dimension(2) :: x4 = (/1, 2/)
12  integer(8), dimension(2) :: x8 = (/1, 2/)
13  character(len=1) :: ret
14
15  kind_of_size_t=-1
16
17  call check_size_t(x2(1),x2(2),ret)
18  if (ret == 't') then
19   kind_of_size_t=2
20   return
21  endif
22
23  call check_size_t(x4(1),x4(2),ret)
24  if (ret == 't') then
25   kind_of_size_t=4
26   return
27  endif
28
29  call check_size_t(x8(1),x8(2),ret)
30  if (ret == 't') then
31   kind_of_size_t=8
32   return
33  endif
34
35end function kind_of_size_t
36
37integer function kind_of_long()
38  integer(2), dimension(2) :: x2 = (/1, 2/)
39  integer(4), dimension(2) :: x4 = (/1, 2/)
40  integer(8), dimension(2) :: x8 = (/1, 2/)
41  character(len=1) :: ret
42
43  kind_of_long=-1
44
45  call check_long(x2(1),x2(2),ret)
46  if (ret == 't') then
47   kind_of_long=2
48   return
49  endif
50
51  call check_long(x4(1),x4(2),ret)
52  if (ret == 't') then
53   kind_of_long=4
54   return
55  endif
56
57  call check_long(x8(1),x8(2),ret)
58  if (ret == 't') then
59   kind_of_long=8
60   return
61  endif
62
63end function kind_of_long
64
65integer function kind_of_int()
66  integer(2), dimension(2) :: x2 = (/1, 2/)
67  integer(4), dimension(2) :: x4 = (/1, 2/)
68  integer(8), dimension(2) :: x8 = (/1, 2/)
69  character(len=1) :: ret
70
71  kind_of_int=-1
72
73  call check_int(x2(1),x2(2),ret)
74  if (ret == 't') then
75   kind_of_int=2
76   return
77  endif
78
79  call check_int(x4(1),x4(2),ret)
80  if (ret == 't') then
81   kind_of_int=4
82   return
83  endif
84
85  call check_int(x8(1),x8(2),ret)
86  if (ret == 't') then
87   kind_of_int=8
88   return
89  endif
90
91end function kind_of_int
92
93integer function kind_of_float()
94  real(4), dimension(2) :: x4 = (/1., 2./)
95  real(8), dimension(2) :: x8 = (/1., 2./)
96  character(len=1) :: ret
97
98  kind_of_float=-1
99
100  call check_float(x4(1),x4(2),ret)
101  if (ret == 't') then
102   kind_of_float=4
103   return
104  endif
105
106  call check_float(x8(1),x8(2),ret)
107  if (ret == 't') then
108   kind_of_float=8
109   return
110  endif
111
112end function kind_of_float
113
114integer function kind_of_double()
115  real(4), dimension(2) :: real4 = (/1., 2./)
116  real(8), dimension(2) :: real8 = (/1., 2./)
117  character(len=1) :: ret
118
119  kind_of_double=-1
120
121  call check_double(real4(1),real4(2),ret)
122  if (ret == 't') then
123   kind_of_double=4
124   return
125  endif
126
127  call check_double(real8(1),real8(2),ret)
128  if (ret == 't') then
129   kind_of_double=8
130   return
131  endif
132
133end function kind_of_double
134
135program kind_h
136  integer :: size
137  integer, dimension(2) :: i
138  integer(kind=2), dimension(2) :: i2
139  integer(kind=4), dimension(2) :: i4
140  real(kind=4), dimension(2) :: r4
141  real(kind=8), dimension(2) :: r8
142
143  print *,"integer,public,parameter :: kindOfInt=",kind_of_int()
144  print *,"integer,public,parameter :: kindOfLong=",kind_of_long()
145  print *,"integer,public,parameter :: kindOfSize_t=",kind_of_size_t()
146  print *,"integer,public,parameter :: kindOfSize=",kind_of_size_t()
147  print *,"integer,public,parameter :: kindOfDouble=",kind_of_double()
148  print *,"integer,public,parameter :: kindOfFloat=",kind_of_float()
149  call f_sizeof(i(1),i(2),size)
150  print *,"integer,public,parameter :: sizeOfInteger=",size
151  call f_sizeof(i2(1),i2(2),size)
152  print *,"integer,public,parameter :: sizeOfInteger2=",size
153  call f_sizeof(i4(1),i4(2),size)
154  print *,"integer,public,parameter :: sizeOfInteger4=",size
155  call f_sizeof(r4(1),r4(2),size)
156  print *,"integer,public,parameter :: sizeOfReal4=",size
157  call f_sizeof(r8(1),r8(2),size)
158  print *,"integer,public,parameter :: sizeOfReal8=",size
159
160end program kind_h
161
162