Line data Source code
1 : !-------------------------------------------------------------------------
2 : ! $Id$
3 : !===============================================================================
4 : module T_in_K_module
5 :
6 : implicit none
7 :
8 : private ! Default scope
9 :
10 : public :: thlm2T_in_K, T_in_K2thlm
11 :
12 : interface thlm2T_in_K
13 : module procedure thlm2T_in_K_k ! Works over a single vertical level
14 : module procedure thlm2T_in_K_1D ! Works over all vertical levels
15 : module procedure thlm2T_in_K_2D ! Works over all vertical levels and columns
16 : end interface thlm2T_in_K
17 :
18 : contains
19 :
20 : !-------------------------------------------------------------------------------
21 : ! Wrapped in interface thlm2T_in_K
22 0 : function thlm2T_in_K_k( thlm, exner, rcm ) &
23 : result( T_in_K )
24 :
25 : ! Description:
26 : ! Calculates absolute temperature from liquid water potential
27 : ! temperature. (Does not include ice.)
28 :
29 : ! References:
30 : ! Cotton and Anthes (1989), "Storm and Cloud Dynamics", Eqn. (2.51).
31 : !-------------------------------------------------------------------------------
32 : use constants_clubb, only: &
33 : ! Variable(s)
34 : Cp, & ! Dry air specific heat at constant p [J/kg/K]
35 : Lv ! Latent heat of vaporization [J/kg]
36 :
37 : use clubb_precision, only: &
38 : core_rknd ! Variable(s)
39 :
40 : implicit none
41 :
42 : ! ---------------------- Input ----------------------
43 : real( kind = core_rknd ), intent(in) :: &
44 : thlm, & ! Liquid potential temperature [K]
45 : exner, & ! Exner function [-]
46 : rcm ! Liquid water mixing ratio [kg/kg]
47 :
48 : real( kind = core_rknd ) :: &
49 : T_in_K ! Result temperature [K]
50 :
51 : ! ---------------------- Begin Code ----------------------
52 0 : T_in_K = thlm * exner + Lv * rcm / Cp
53 :
54 : return
55 : end function thlm2T_in_K_k
56 :
57 : !-------------------------------------------------------------------------------
58 : ! Wrapped in interface thlm2T_in_K
59 0 : function thlm2T_in_K_1D( nz, thlm, exner, rcm ) &
60 0 : result( T_in_K )
61 :
62 : ! Description:
63 : ! Calculates absolute temperature from liquid water potential
64 : ! temperature. (Does not include ice.)
65 :
66 : ! References:
67 : ! Cotton and Anthes (1989), "Storm and Cloud Dynamics", Eqn. (2.51).
68 : !-------------------------------------------------------------------------------
69 : use constants_clubb, only: &
70 : ! Variable(s)
71 : Cp, & ! Dry air specific heat at constant p [J/kg/K]
72 : Lv ! Latent heat of vaporization [J/kg]
73 :
74 : use clubb_precision, only: &
75 : core_rknd ! Variable(s)
76 :
77 : implicit none
78 :
79 : ! ---------------------- Input ----------------------
80 : integer, intent(in) :: &
81 : nz
82 :
83 : real( kind = core_rknd ), dimension(nz), intent(in) :: &
84 : thlm, & ! Liquid potential temperature [K]
85 : exner, & ! Exner function [-]
86 : rcm ! Liquid water mixing ratio [kg/kg]
87 :
88 : real( kind = core_rknd ), dimension(nz) :: &
89 : T_in_K ! Result temperature [K]
90 :
91 : integer :: k
92 :
93 : ! ---------------------- Begin Code ----------------------
94 0 : do k = 1, nz
95 0 : T_in_K(k) = thlm(k) * exner(k) + Lv * rcm(k) / Cp
96 : end do
97 :
98 0 : return
99 0 : end function thlm2T_in_K_1D
100 :
101 : !-------------------------------------------------------------------------------
102 : ! Wrapped in interface thlm2T_in_K
103 26805168 : function thlm2T_in_K_2D( nz, ngrdcol, thlm, exner, rcm ) &
104 26805168 : result( T_in_K )
105 :
106 : ! Description:
107 : ! Calculates absolute temperature from liquid water potential
108 : ! temperature. (Does not include ice.)
109 :
110 : ! References:
111 : ! Cotton and Anthes (1989), "Storm and Cloud Dynamics", Eqn. (2.51).
112 : !-------------------------------------------------------------------------------
113 : use constants_clubb, only: &
114 : ! Variable(s)
115 : Cp, & ! Dry air specific heat at constant p [J/kg/K]
116 : Lv ! Latent heat of vaporization [J/kg]
117 :
118 : use clubb_precision, only: &
119 : core_rknd ! Variable(s)
120 :
121 : implicit none
122 :
123 : ! Input
124 : integer, intent(in) :: &
125 : nz, &
126 : ngrdcol
127 :
128 : real( kind = core_rknd ), dimension(ngrdcol,nz), intent(in) :: &
129 : thlm, & ! Liquid potential temperature [K]
130 : exner, & ! Exner function [-]
131 : rcm ! Liquid water mixing ratio [kg/kg]
132 :
133 : real( kind = core_rknd ), dimension(ngrdcol,nz) :: &
134 : T_in_K ! Result temperature [K]
135 :
136 : integer :: i, k
137 :
138 : ! ---- Begin Code ----
139 :
140 : !$acc data copyin( thlm, exner, rcm ) &
141 : !$acc copyout( T_in_K )
142 :
143 : !$acc parallel loop gang vector collapse(2) default(present)
144 2305244448 : do k = 1, nz
145 38071442448 : do i = 1, ngrdcol
146 38044637280 : T_in_K(i,k) = thlm(i,k) * exner(i,k) + Lv * rcm(i,k) / Cp
147 : end do
148 : end do
149 : !$acc end parallel loop
150 :
151 : !$acc end data
152 :
153 26805168 : return
154 26805168 : end function thlm2T_in_K_2D
155 :
156 : !-------------------------------------------------------------------------------
157 0 : elemental function T_in_K2thlm( T_in_K, exner, rcm ) &
158 : result( thlm )
159 :
160 : ! Description:
161 : ! Calculates liquid water potential temperature from absolute temperature
162 :
163 : ! References:
164 : ! None
165 : !-------------------------------------------------------------------------------
166 : use constants_clubb, only: &
167 : ! Variable(s)
168 : Cp, & ! Dry air specific heat at constant p [J/kg/K]
169 : Lv ! Latent heat of vaporization [J/kg]
170 :
171 : use clubb_precision, only: &
172 : core_rknd ! Variable(s)
173 :
174 : implicit none
175 :
176 : ! Input
177 : real( kind = core_rknd ), intent(in) :: &
178 : T_in_K, &! Result temperature [K]
179 : exner, & ! Exner function [-]
180 : rcm ! Liquid water mixing ratio [kg/kg]
181 :
182 : real( kind = core_rknd ) :: &
183 : thlm ! Liquid potential temperature [K]
184 :
185 : ! ---- Begin Code ----
186 :
187 0 : thlm = ( T_in_K - Lv/Cp * rcm ) / exner
188 :
189 : return
190 : end function T_in_K2thlm
191 : !-------------------------------------------------------------------------------
192 :
193 : end module T_in_K_module
|