FMS  2025.04
Flexible Modeling System
sat_vapor_pres_k.F90
1 !***********************************************************************
2 !* Apache License 2.0
3 !*
4 !* This file is part of the GFDL Flexible Modeling System (FMS).
5 !*
6 !* Licensed under the Apache License, Version 2.0 (the "License");
7 !* you may not use this file except in compliance with the License.
8 !* You may obtain a copy of the License at
9 !*
10 !* http://www.apache.org/licenses/LICENSE-2.0
11 !*
12 !* FMS is distributed in the hope that it will be useful, but WITHOUT
13 !* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied;
14 !* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
15 !* PARTICULAR PURPOSE. See the License for the specific language
16 !* governing permissions and limitations under the License.
17 !***********************************************************************
18 !> @defgroup sat_vapor_pres_k_mod sat_vapor_pres_k_mod
19 !> @ingroup sat_vapor_pres
20 !> @brief Kernel module to be used by @ref sat_vapor_pres_mod for
21 !! table lookups and calculations
22 
23  module sat_vapor_pres_k_mod
24 
25 ! This module is what I (pjp) think a kernel should be.
26 ! There have been many proposals as to what a kernel should look like.
27 ! If fact, so many different ideas have been expressed that the lack
28 ! of agreement has greatly hampered progress.
29 ! The only way to move forward is to limit the requirments for a kernel
30 ! to only what is widely agreeded upon.
31 ! I believe that there are only two things widely agreeded upon.
32 
33 ! 1) A kernel should be independent of the rest of FMS so that it can
34 ! easily be ported into another programming system.
35 ! This requires that a kernel does not access anything by use association.
36 ! The one exception is this kernel, because it is not practical for physics
37 ! modules to avoid using a module that computes the saturation vapor
38 ! pressure of water vapor.
39 
40 ! 2) For the sake of thread safety, module globals should be written only at initialization.
41 ! In this case, the module globals are the tables and a handful of scalars.
42 
43 ! 3) A kernel should not read from an external file.
44 
45 ! One of the things that was not widely agreeded upon is that a kernel should
46 ! not be a fortran module. This complicates things greatly for questionable
47 ! benefit and could be done as a second step anyway, if necessary.
48 
49  use fms_mod, only: error_mesg, fatal
50  use platform_mod, only : r4_kind, r8_kind
51 
52  implicit none
53  private
54 
55 ! Include variable "version" to be written to log file.
56 #include<file_version.h>
57 
58  public :: sat_vapor_pres_init_k
59  public :: lookup_es_k
60  public :: lookup_des_k
61  public :: lookup_es_des_k
62  public :: lookup_es2_k
63  public :: lookup_des2_k
64  public :: lookup_es2_des2_k
65  public :: lookup_es3_k
66  public :: lookup_des3_k
67  public :: lookup_es3_des3_k
68  public :: compute_qs_k
69  public :: compute_mrs_k
70 
71  !> @ingroup sat_vapor_pres_k_mod
73  module procedure sat_vapor_pres_init_k_r4
74  module procedure sat_vapor_pres_init_k_r8
75  end interface sat_vapor_pres_init_k
76 
77  !> @ingroup sat_vapor_pres_k_mod
78  interface compute_es_k
79  module procedure compute_es_k_r4
80  module procedure compute_es_k_r8
81  end interface compute_es_k
82 
83  interface compute_es_liq_k
84  module procedure compute_es_liq_k_r4
85  module procedure compute_es_liq_k_r8
86  end interface compute_es_liq_k
87 
89  module procedure compute_es_liq_ice_k_r4
90  module procedure compute_es_liq_ice_k_r8
91  end interface compute_es_liq_ice_k
92 
93  !> @ingroup sat_vapor_pres_k_mod
94  interface lookup_es_k
95  module procedure lookup_es_k_0d_r4
96  module procedure lookup_es_k_0d_r8
97  module procedure lookup_es_k_1d_r4
98  module procedure lookup_es_k_1d_r8
99  module procedure lookup_es_k_2d_r4
100  module procedure lookup_es_k_2d_r8
101  module procedure lookup_es_k_3d_r4
102  module procedure lookup_es_k_3d_r8
103  end interface
104 
105  !> @ingroup sat_vapor_pres_k_mod
106  interface lookup_des_k
107  module procedure lookup_des_k_0d_r4
108  module procedure lookup_des_k_0d_r8
109  module procedure lookup_des_k_1d_r4
110  module procedure lookup_des_k_1d_r8
111  module procedure lookup_des_k_2d_r4
112  module procedure lookup_des_k_2d_r8
113  module procedure lookup_des_k_3d_r4
114  module procedure lookup_des_k_3d_r8
115  end interface
116 
117  !> @ingroup sat_vapor_pres_k_mod
118  interface lookup_es_des_k
119  module procedure lookup_es_des_k_0d_r4
120  module procedure lookup_es_des_k_0d_r8
121  module procedure lookup_es_des_k_1d_r4
122  module procedure lookup_es_des_k_1d_r8
123  module procedure lookup_es_des_k_2d_r4
124  module procedure lookup_es_des_k_2d_r8
125  module procedure lookup_es_des_k_3d_r4
126  module procedure lookup_es_des_k_3d_r8
127  end interface
128 
129  !> @ingroup sat_vapor_pres_k_mod
130  interface lookup_es2_k
131  module procedure lookup_es2_k_0d_r4
132  module procedure lookup_es2_k_0d_r8
133  module procedure lookup_es2_k_1d_r4
134  module procedure lookup_es2_k_1d_r8
135  module procedure lookup_es2_k_2d_r4
136  module procedure lookup_es2_k_2d_r8
137  module procedure lookup_es2_k_3d_r4
138  module procedure lookup_es2_k_3d_r8
139  end interface
140 
141  !> @ingroup sat_vapor_pres_k_mod
142  interface lookup_des2_k
143  module procedure lookup_des2_k_0d_r4
144  module procedure lookup_des2_k_0d_r8
145  module procedure lookup_des2_k_1d_r4
146  module procedure lookup_des2_k_1d_r8
147  module procedure lookup_des2_k_2d_r4
148  module procedure lookup_des2_k_2d_r8
149  module procedure lookup_des2_k_3d_r4
150  module procedure lookup_des2_k_3d_r8
151  end interface
152 
153  !> @ingroup sat_vapor_pres_k_mod
155  module procedure lookup_es2_des2_k_0d_r4
156  module procedure lookup_es2_des2_k_0d_r8
157  module procedure lookup_es2_des2_k_1d_r4
158  module procedure lookup_es2_des2_k_1d_r8
159  module procedure lookup_es2_des2_k_2d_r4
160  module procedure lookup_es2_des2_k_2d_r8
161  module procedure lookup_es2_des2_k_3d_r4
162  module procedure lookup_es2_des2_k_3d_r8
163  end interface
164 
165  !> @ingroup sat_vapor_pres_k_mod
166  interface lookup_es3_k
167  module procedure lookup_es3_k_0d_r4
168  module procedure lookup_es3_k_0d_r8
169  module procedure lookup_es3_k_1d_r4
170  module procedure lookup_es3_k_1d_r8
171  module procedure lookup_es3_k_2d_r4
172  module procedure lookup_es3_k_2d_r8
173  module procedure lookup_es3_k_3d_r4
174  module procedure lookup_es3_k_3d_r8
175  end interface
176 
177  !> @ingroup sat_vapor_pres_k_mod
178  interface lookup_des3_k
179  module procedure lookup_des3_k_0d_r4
180  module procedure lookup_des3_k_0d_r8
181  module procedure lookup_des3_k_1d_r4
182  module procedure lookup_des3_k_1d_r8
183  module procedure lookup_des3_k_2d_r4
184  module procedure lookup_des3_k_2d_r8
185  module procedure lookup_des3_k_3d_r4
186  module procedure lookup_des3_k_3d_r8
187  end interface
188 
189  !> @ingroup sat_vapor_pres_k_mod
191  module procedure lookup_es3_des3_k_0d_r4
192  module procedure lookup_es3_des3_k_0d_r8
193  module procedure lookup_es3_des3_k_1d_r4
194  module procedure lookup_es3_des3_k_1d_r8
195  module procedure lookup_es3_des3_k_2d_r4
196  module procedure lookup_es3_des3_k_2d_r8
197  module procedure lookup_es3_des3_k_3d_r4
198  module procedure lookup_es3_des3_k_3d_r8
199  end interface
200 
201  !> @ingroup sat_vapor_pres_k_mod
202  interface compute_qs_k
203  module procedure compute_qs_k_0d_r4
204  module procedure compute_qs_k_0d_r8
205  module procedure compute_qs_k_1d_r4
206  module procedure compute_qs_k_1d_r8
207  module procedure compute_qs_k_2d_r4
208  module procedure compute_qs_k_2d_r8
209  module procedure compute_qs_k_3d_r4
210  module procedure compute_qs_k_3d_r8
211  end interface
212  !> @ingroup sat_vapor_pres_k_mod
213  interface compute_mrs_k
214  module procedure compute_mrs_k_0d_r4
215  module procedure compute_mrs_k_0d_r8
216  module procedure compute_mrs_k_1d_r4
217  module procedure compute_mrs_k_1d_r8
218  module procedure compute_mrs_k_2d_r4
219  module procedure compute_mrs_k_2d_r8
220  module procedure compute_mrs_k_3d_r4
221  module procedure compute_mrs_k_3d_r8
222  end interface compute_mrs_k
223 
224 !> @addtogroup sat_vapor_pres_k_mod
225 !> @{
226 
227  real(kind=r8_kind) :: dtres, tepsl, tminl, dtinvl
228  integer :: table_siz
229  real(kind=r8_kind), dimension(:), allocatable :: table ! sat vapor pres (es)
230  real(kind=r8_kind), dimension(:), allocatable :: dtable ! first derivative of es
231  real(kind=r8_kind), dimension(:), allocatable :: d2table ! second derivative of es
232  real(kind=r8_kind), dimension(:), allocatable :: table2 ! sat vapor pres (es)
233  real(kind=r8_kind), dimension(:), allocatable :: dtable2 ! first derivative of es
234  real(kind=r8_kind), dimension(:), allocatable :: d2table2 ! second derivative of es
235  real(kind=r8_kind), dimension(:), allocatable :: table3 ! sat vapor pres (es)
236  real(kind=r8_kind), dimension(:), allocatable :: dtable3 ! first derivative of es
237  real(kind=r8_kind), dimension(:), allocatable :: d2table3 ! second derivative of es
238 
239  logical :: use_exact_qs
240  logical :: module_is_initialized = .false.
241 
242  contains
243 
244 !#######################################################################
245 !#######################################################################
246 
247 #include "sat_vapor_pres_k_r4.fh"
248 #include "sat_vapor_pres_k_r8.fh"
249 
250  end module sat_vapor_pres_k_mod
251 !> @}
252 ! close documentation grouping
subroutine, public error_mesg(routine, message, level)
Print notes, warnings and error messages; terminates program for warning and error messages....
Definition: fms.F90:441