@@ -32,16 +32,16 @@ ::p3_main_init_disp(
32
32
const uview_2d<Spack>& qv_supersat_i, const uview_2d<Spack>& qtend_ignore, const uview_2d<Spack>& ntend_ignore, const uview_2d<Spack>& mu_c,
33
33
const uview_2d<Spack>& lamc, const uview_2d<Spack>& rho_qi, const uview_2d<Spack>& qv2qi_depos_tend, const uview_2d<Spack>& precip_total_tend,
34
34
const uview_2d<Spack>& nevapr, const uview_2d<Spack>& precip_liq_flux, const uview_2d<Spack>& precip_ice_flux)
35
- {
35
+ {
36
36
using ExeSpace = typename KT::ExeSpace;
37
37
const auto policy = ekat::ExeSpaceUtils<ExeSpace>::get_default_team_policy (nj, nk_pack);
38
38
39
39
Kokkos::parallel_for (" p3_main_init" ,
40
40
policy, KOKKOS_LAMBDA (const MemberType& team) {
41
-
42
- const Int i = team.league_rank ();
43
- precip_liq_surf (i) = 0 ;
44
- precip_ice_surf (i) = 0 ;
41
+
42
+ const Int i = team.league_rank ();
43
+ precip_liq_surf (i) = 0 ;
44
+ precip_ice_surf (i) = 0 ;
45
45
46
46
Kokkos::parallel_for (
47
47
Kokkos::TeamVectorRange (team, nk_pack), [&] (Int k) {
@@ -107,17 +107,14 @@ ::p3_main_internal_disp(
107
107
const P3Infrastructure& infrastructure,
108
108
const P3HistoryOnly& history_only,
109
109
const P3LookupTables& lookup_tables,
110
+ const P3Temporaries& temporaries,
110
111
const WorkspaceManager& workspace_mgr,
111
112
Int nj,
112
113
Int nk,
113
114
const physics::P3_Constants<Real> & p3constants)
114
115
{
115
116
using ExeSpace = typename KT::ExeSpace;
116
117
117
- view_2d<Spack> latent_heat_sublim (" latent_heat_sublim" , nj, nk), latent_heat_vapor (" latent_heat_vapor" , nj, nk), latent_heat_fusion (" latent_heat_fusion" , nj, nk);
118
-
119
- get_latent_heat (nj, nk, latent_heat_vapor, latent_heat_sublim, latent_heat_fusion);
120
-
121
118
const Int nk_pack = ekat::npack<Spack>(nk);
122
119
123
120
// load constants into local vars
@@ -131,87 +128,99 @@ ::p3_main_internal_disp(
131
128
view_1d<bool > nucleationPossible (" nucleationPossible" , nj);
132
129
view_1d<bool > hydrometeorsPresent (" hydrometeorsPresent" , nj);
133
130
134
- //
135
- // Create temporary variables needed for p3
136
- //
137
- view_2d<Spack>
138
- mu_r (" mu_r" , nj, nk_pack), // shape parameter of rain
139
- T_atm (" T_atm" , nj, nk_pack), // temperature at the beginning of the microphysics step [K]
140
-
141
- // 2D size distribution and fallspeed parameters
142
- lamr (" lamr" , nj, nk_pack), logn0r (" logn0r" , nj, nk_pack), nu (" nu" , nj, nk_pack),
143
- cdist (" cdist" , nj, nk_pack), cdist1 (" cdist1" , nj, nk_pack), cdistr (" cdistr" , nj, nk_pack),
144
-
145
- // Variables needed for in-cloud calculations
146
- // Inverse cloud fractions (1/cld)
147
- inv_cld_frac_i (" inv_cld_frac_i" , nj, nk_pack), inv_cld_frac_l (" inv_cld_frac_l" , nj, nk_pack), inv_cld_frac_r (" inv_cld_frac_r" , nj, nk_pack),
148
- // In cloud mass-mixing ratios
149
- qc_incld (" qc_incld" , nj, nk_pack), qr_incld (" qr_incld" , nj, nk_pack), qi_incld (" qi_incld" , nj, nk_pack), qm_incld (" qm_incld" , nj, nk_pack),
150
- // In cloud number concentrations
151
- nc_incld (" nc_incld" , nj, nk_pack), nr_incld (" nr_incld" , nj, nk_pack), ni_incld (" ni_incld" , nj, nk_pack), bm_incld (" bm_incld" , nj, nk_pack),
152
-
153
- // Other
154
- inv_dz (" inv_dz" , nj, nk_pack), inv_rho (" inv_rho" , nj, nk_pack), ze_ice (" ze_ice" , nj, nk_pack), ze_rain (" ze_rain" , nj, nk_pack),
155
- prec (" prec" , nj, nk_pack), rho (" rho" , nj, nk_pack), rhofacr (" rhofacr" , nj, nk_pack), rhofaci (" rhofaci" , nj, nk_pack),
156
- acn (" acn" , nj, nk_pack), qv_sat_l (" qv_sat" , nj, nk_pack), qv_sat_i (" qv_sat_i" , nj, nk_pack), sup (" sup" , nj, nk_pack),
157
- qv_supersat_i (" qv_supersat" , nj, nk_pack), tmparr2 (" tmparr2" , nj, nk_pack), exner (" exner" , nj, nk_pack),
158
- diag_equiv_reflectivity (" diag_equiv_ref" , nj, nk_pack), diag_vm_qi (" diag_vm_qi" , nj, nk_pack), diag_diam_qi (" diag_diam_qi" , nj, nk_pack),
159
- pratot (" pratot" , nj, nk_pack), prctot (" prctot" , nj, nk_pack),
160
-
161
- // p3_tend_out, may not need these
162
- qtend_ignore (" qtend_ignore" , nj, nk_pack), ntend_ignore (" ntend_ignore" , nj, nk_pack),
163
-
164
- // Variables still used in F90 but removed from C++ interface
165
- mu_c (" mu_c" , nj, nk_pack), lamc (" lamc" , nj, nk_pack),
166
- qr_evap_tend (" qr_evap_tend" , nj, nk_pack),
167
-
168
- // cloud sedimentation
169
- v_qc (" v_qc" , nj, nk_pack), v_nc (" v_nc" , nj, nk_pack), flux_qx (" flux_qx" , nj, nk_pack), flux_nx (" flux_nx" , nj, nk_pack),
170
-
171
- // ice sedimentation
172
- v_qit (" v_qit" , nj, nk_pack), v_nit (" v_nit" , nj, nk_pack), flux_nit (" flux_nit" , nj, nk_pack), flux_bir (" flux_bir" , nj, nk_pack),
173
- flux_qir (" flux_qir" , nj, nk_pack), flux_qit (" flux_qit" , nj, nk_pack),
174
-
175
- // rain sedimentation
176
- v_qr (" v_qr" , nj, nk_pack), v_nr (" v_nr" , nj, nk_pack);
177
-
178
131
// Get views of all inputs
179
- auto pres = diagnostic_inputs.pres ;
180
- auto dz = diagnostic_inputs.dz ;
181
- auto nc_nuceat_tend = diagnostic_inputs.nc_nuceat_tend ;
182
- auto nccn_prescribed = diagnostic_inputs.nccn ;
183
- auto ni_activated = diagnostic_inputs.ni_activated ;
184
- auto inv_qc_relvar = diagnostic_inputs.inv_qc_relvar ;
185
- auto dpres = diagnostic_inputs.dpres ;
186
- auto inv_exner = diagnostic_inputs.inv_exner ;
187
- auto cld_frac_i = diagnostic_inputs.cld_frac_i ;
188
- auto cld_frac_l = diagnostic_inputs.cld_frac_l ;
189
- auto cld_frac_r = diagnostic_inputs.cld_frac_r ;
190
- auto col_location = infrastructure.col_location ;
191
- auto qc = prognostic_state.qc ;
192
- auto nc = prognostic_state.nc ;
193
- auto qr = prognostic_state.qr ;
194
- auto nr = prognostic_state.nr ;
195
- auto qi = prognostic_state.qi ;
196
- auto qm = prognostic_state.qm ;
197
- auto ni = prognostic_state.ni ;
198
- auto bm = prognostic_state.bm ;
199
- auto qv = prognostic_state.qv ;
200
- auto th = prognostic_state.th ;
201
- auto diag_eff_radius_qc = diagnostic_outputs.diag_eff_radius_qc ;
202
- auto diag_eff_radius_qi = diagnostic_outputs.diag_eff_radius_qi ;
203
- auto diag_eff_radius_qr = diagnostic_outputs.diag_eff_radius_qr ;
204
- auto qv2qi_depos_tend = diagnostic_outputs.qv2qi_depos_tend ;
205
- auto rho_qi = diagnostic_outputs.rho_qi ;
206
- auto precip_liq_flux = diagnostic_outputs.precip_liq_flux ;
207
- auto precip_ice_flux = diagnostic_outputs.precip_ice_flux ;
208
- auto precip_total_tend = diagnostic_outputs.precip_total_tend ;
209
- auto nevapr = diagnostic_outputs.nevapr ;
210
- auto qv_prev = diagnostic_inputs.qv_prev ;
211
- auto t_prev = diagnostic_inputs.t_prev ;
212
- auto liq_ice_exchange = history_only.liq_ice_exchange ;
213
- auto vap_liq_exchange = history_only.vap_liq_exchange ;
214
- auto vap_ice_exchange = history_only.vap_ice_exchange ;
132
+ auto pres = diagnostic_inputs.pres ;
133
+ auto dz = diagnostic_inputs.dz ;
134
+ auto nc_nuceat_tend = diagnostic_inputs.nc_nuceat_tend ;
135
+ auto nccn_prescribed = diagnostic_inputs.nccn ;
136
+ auto ni_activated = diagnostic_inputs.ni_activated ;
137
+ auto inv_qc_relvar = diagnostic_inputs.inv_qc_relvar ;
138
+ auto dpres = diagnostic_inputs.dpres ;
139
+ auto inv_exner = diagnostic_inputs.inv_exner ;
140
+ auto cld_frac_i = diagnostic_inputs.cld_frac_i ;
141
+ auto cld_frac_l = diagnostic_inputs.cld_frac_l ;
142
+ auto cld_frac_r = diagnostic_inputs.cld_frac_r ;
143
+ auto col_location = infrastructure.col_location ;
144
+ auto qc = prognostic_state.qc ;
145
+ auto nc = prognostic_state.nc ;
146
+ auto qr = prognostic_state.qr ;
147
+ auto nr = prognostic_state.nr ;
148
+ auto qi = prognostic_state.qi ;
149
+ auto qm = prognostic_state.qm ;
150
+ auto ni = prognostic_state.ni ;
151
+ auto bm = prognostic_state.bm ;
152
+ auto qv = prognostic_state.qv ;
153
+ auto th = prognostic_state.th ;
154
+ auto diag_eff_radius_qc = diagnostic_outputs.diag_eff_radius_qc ;
155
+ auto diag_eff_radius_qi = diagnostic_outputs.diag_eff_radius_qi ;
156
+ auto diag_eff_radius_qr = diagnostic_outputs.diag_eff_radius_qr ;
157
+ auto qv2qi_depos_tend = diagnostic_outputs.qv2qi_depos_tend ;
158
+ auto rho_qi = diagnostic_outputs.rho_qi ;
159
+ auto precip_liq_flux = diagnostic_outputs.precip_liq_flux ;
160
+ auto precip_ice_flux = diagnostic_outputs.precip_ice_flux ;
161
+ auto precip_total_tend = diagnostic_outputs.precip_total_tend ;
162
+ auto nevapr = diagnostic_outputs.nevapr ;
163
+ auto qv_prev = diagnostic_inputs.qv_prev ;
164
+ auto t_prev = diagnostic_inputs.t_prev ;
165
+ auto liq_ice_exchange = history_only.liq_ice_exchange ;
166
+ auto vap_liq_exchange = history_only.vap_liq_exchange ;
167
+ auto vap_ice_exchange = history_only.vap_ice_exchange ;
168
+ auto mu_r = temporaries.mu_r ;
169
+ auto T_atm = temporaries.T_atm ;
170
+ auto lamr = temporaries.lamr ;
171
+ auto logn0r = temporaries.logn0r ;
172
+ auto nu = temporaries.nu ;
173
+ auto cdist = temporaries.cdist ;
174
+ auto cdist1 = temporaries.cdist1 ;
175
+ auto cdistr = temporaries.cdistr ;
176
+ auto inv_cld_frac_i = temporaries.inv_cld_frac_i ;
177
+ auto inv_cld_frac_l = temporaries.inv_cld_frac_l ;
178
+ auto inv_cld_frac_r = temporaries.inv_cld_frac_r ;
179
+ auto qc_incld = temporaries.qc_incld ;
180
+ auto qr_incld = temporaries.qr_incld ;
181
+ auto qi_incld = temporaries.qi_incld ;
182
+ auto qm_incld = temporaries.qm_incld ;
183
+ auto nc_incld = temporaries.nc_incld ;
184
+ auto nr_incld = temporaries.nr_incld ;
185
+ auto ni_incld = temporaries.ni_incld ;
186
+ auto bm_incld = temporaries.bm_incld ;
187
+ auto inv_dz = temporaries.inv_dz ;
188
+ auto inv_rho = temporaries.inv_rho ;
189
+ auto ze_ice = temporaries.ze_ice ;
190
+ auto ze_rain = temporaries.ze_rain ;
191
+ auto prec = temporaries.prec ;
192
+ auto rho = temporaries.rho ;
193
+ auto rhofacr = temporaries.rhofacr ;
194
+ auto rhofaci = temporaries.rhofaci ;
195
+ auto acn = temporaries.acn ;
196
+ auto qv_sat_l = temporaries.qv_sat_l ;
197
+ auto qv_sat_i = temporaries.qv_sat_i ;
198
+ auto sup = temporaries.sup ;
199
+ auto qv_supersat_i = temporaries.qv_supersat_i ;
200
+ auto tmparr2 = temporaries.tmparr2 ;
201
+ auto exner = temporaries.exner ;
202
+ auto diag_equiv_reflectivity = temporaries.diag_equiv_reflectivity ;
203
+ auto diag_vm_qi = temporaries.diag_vm_qi ;
204
+ auto diag_diam_qi = temporaries.diag_diam_qi ;
205
+ auto pratot = temporaries.pratot ;
206
+ auto prctot = temporaries.prctot ;
207
+ auto qtend_ignore = temporaries.qtend_ignore ;
208
+ auto ntend_ignore = temporaries.ntend_ignore ;
209
+ auto mu_c = temporaries.mu_c ;
210
+ auto lamc = temporaries.lamc ;
211
+ auto qr_evap_tend = temporaries.qr_evap_tend ;
212
+ auto v_qc = temporaries.v_qc ;
213
+ auto v_nc = temporaries.v_nc ;
214
+ auto flux_qx = temporaries.flux_qx ;
215
+ auto flux_nx = temporaries.flux_nx ;
216
+ auto v_qit = temporaries.v_qit ;
217
+ auto v_nit = temporaries.v_nit ;
218
+ auto flux_nit = temporaries.flux_nit ;
219
+ auto flux_bir = temporaries.flux_bir ;
220
+ auto flux_qir = temporaries.flux_qir ;
221
+ auto flux_qit = temporaries.flux_qit ;
222
+ auto v_qr = temporaries.v_qr ;
223
+ auto v_nr = temporaries.v_nr ;
215
224
216
225
// we do not want to measure init stuff
217
226
auto start = std::chrono::steady_clock::now ();
@@ -231,7 +240,7 @@ ::p3_main_internal_disp(
231
240
p3_main_part1_disp (
232
241
nj, nk, infrastructure.predictNc , infrastructure.prescribedCCN , infrastructure.dt ,
233
242
pres, dpres, dz, nc_nuceat_tend, nccn_prescribed, inv_exner, exner, inv_cld_frac_l, inv_cld_frac_i,
234
- inv_cld_frac_r, latent_heat_vapor, latent_heat_sublim, latent_heat_fusion,
243
+ inv_cld_frac_r,
235
244
T_atm, rho, inv_rho, qv_sat_l, qv_sat_i, qv_supersat_i, rhofacr,
236
245
rhofaci, acn, qv, th, qc, nc, qr, nr, qi, ni, qm,
237
246
bm, qc_incld, qr_incld, qi_incld, qm_incld, nc_incld, nr_incld,
@@ -242,12 +251,11 @@ ::p3_main_internal_disp(
242
251
243
252
p3_main_part2_disp (
244
253
nj, nk, runtime_options.max_total_ni , infrastructure.predictNc , infrastructure.prescribedCCN , infrastructure.dt , inv_dt,
245
- lookup_tables.dnu_table_vals , lookup_tables.ice_table_vals , lookup_tables.collect_table_vals ,
254
+ lookup_tables.dnu_table_vals , lookup_tables.ice_table_vals , lookup_tables.collect_table_vals ,
246
255
lookup_tables.revap_table_vals , pres, dpres, dz, nc_nuceat_tend, inv_exner,
247
256
exner, inv_cld_frac_l, inv_cld_frac_i, inv_cld_frac_r, ni_activated, inv_qc_relvar, cld_frac_i,
248
257
cld_frac_l, cld_frac_r, qv_prev, t_prev, T_atm, rho, inv_rho, qv_sat_l, qv_sat_i, qv_supersat_i, rhofacr, rhofaci, acn,
249
- qv, th, qc, nc, qr, nr, qi, ni, qm, bm, latent_heat_vapor,
250
- latent_heat_sublim, latent_heat_fusion, qc_incld, qr_incld, qi_incld, qm_incld, nc_incld,
258
+ qv, th, qc, nc, qr, nr, qi, ni, qm, bm, qc_incld, qr_incld, qi_incld, qm_incld, nc_incld,
251
259
nr_incld, ni_incld, bm_incld, mu_c, nu, lamc, cdist, cdist1, cdistr,
252
260
mu_r, lamr, logn0r, qv2qi_depos_tend, precip_total_tend, nevapr, qr_evap_tend,
253
261
vap_liq_exchange, vap_ice_exchange, liq_ice_exchange,
@@ -288,7 +296,7 @@ ::p3_main_internal_disp(
288
296
289
297
// homogeneous freezing f cloud and rain
290
298
homogeneous_freezing_disp (
291
- T_atm, inv_exner, latent_heat_fusion, nj, nk, ktop, kbot, kdir, qc, nc, qr, nr, qi,
299
+ T_atm, inv_exner, nj, nk, ktop, kbot, kdir, qc, nc, qr, nr, qi,
292
300
ni, qm, bm, th, nucleationPossible, hydrometeorsPresent);
293
301
294
302
//
@@ -298,7 +306,7 @@ ::p3_main_internal_disp(
298
306
p3_main_part3_disp (
299
307
nj, nk_pack, runtime_options.max_total_ni , lookup_tables.dnu_table_vals , lookup_tables.ice_table_vals , inv_exner, cld_frac_l, cld_frac_r, cld_frac_i,
300
308
rho, inv_rho, rhofaci, qv, th, qc, nc, qr, nr, qi, ni,
301
- qm, bm, latent_heat_vapor, latent_heat_sublim, mu_c, nu, lamc, mu_r, lamr,
309
+ qm, bm, mu_c, nu, lamc, mu_r, lamr,
302
310
vap_liq_exchange, ze_rain, ze_ice, diag_vm_qi, diag_eff_radius_qi, diag_diam_qi,
303
311
rho_qi, diag_equiv_reflectivity, diag_eff_radius_qc, diag_eff_radius_qr, nucleationPossible, hydrometeorsPresent,
304
312
p3constants);
0 commit comments