@@ -32,16 +32,16 @@ ::p3_main_init_disp(
3232 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,
3333 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,
3434 const uview_2d<Spack>& nevapr, const uview_2d<Spack>& precip_liq_flux, const uview_2d<Spack>& precip_ice_flux)
35- {
35+ {
3636 using ExeSpace = typename KT::ExeSpace;
3737 const auto policy = ekat::ExeSpaceUtils<ExeSpace>::get_default_team_policy (nj, nk_pack);
3838
3939 Kokkos::parallel_for (" p3_main_init" ,
4040 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 ;
4545
4646 Kokkos::parallel_for (
4747 Kokkos::TeamVectorRange (team, nk_pack), [&] (Int k) {
@@ -107,17 +107,14 @@ ::p3_main_internal_disp(
107107 const P3Infrastructure& infrastructure,
108108 const P3HistoryOnly& history_only,
109109 const P3LookupTables& lookup_tables,
110+ const P3Temporaries& temporaries,
110111 const WorkspaceManager& workspace_mgr,
111112 Int nj,
112113 Int nk,
113114 const physics::P3_Constants<Real> & p3constants)
114115{
115116 using ExeSpace = typename KT::ExeSpace;
116117
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-
121118 const Int nk_pack = ekat::npack<Spack>(nk);
122119
123120 // load constants into local vars
@@ -131,87 +128,99 @@ ::p3_main_internal_disp(
131128 view_1d<bool > nucleationPossible (" nucleationPossible" , nj);
132129 view_1d<bool > hydrometeorsPresent (" hydrometeorsPresent" , nj);
133130
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-
178131 // 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 ;
215224
216225 // we do not want to measure init stuff
217226 auto start = std::chrono::steady_clock::now ();
@@ -231,7 +240,7 @@ ::p3_main_internal_disp(
231240 p3_main_part1_disp (
232241 nj, nk, infrastructure.predictNc , infrastructure.prescribedCCN , infrastructure.dt ,
233242 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,
235244 T_atm, rho, inv_rho, qv_sat_l, qv_sat_i, qv_supersat_i, rhofacr,
236245 rhofaci, acn, qv, th, qc, nc, qr, nr, qi, ni, qm,
237246 bm, qc_incld, qr_incld, qi_incld, qm_incld, nc_incld, nr_incld,
@@ -242,12 +251,11 @@ ::p3_main_internal_disp(
242251
243252 p3_main_part2_disp (
244253 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 ,
246255 lookup_tables.revap_table_vals , pres, dpres, dz, nc_nuceat_tend, inv_exner,
247256 exner, inv_cld_frac_l, inv_cld_frac_i, inv_cld_frac_r, ni_activated, inv_qc_relvar, cld_frac_i,
248257 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,
251259 nr_incld, ni_incld, bm_incld, mu_c, nu, lamc, cdist, cdist1, cdistr,
252260 mu_r, lamr, logn0r, qv2qi_depos_tend, precip_total_tend, nevapr, qr_evap_tend,
253261 vap_liq_exchange, vap_ice_exchange, liq_ice_exchange,
@@ -288,7 +296,7 @@ ::p3_main_internal_disp(
288296
289297 // homogeneous freezing f cloud and rain
290298 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,
292300 ni, qm, bm, th, nucleationPossible, hydrometeorsPresent);
293301
294302 //
@@ -298,7 +306,7 @@ ::p3_main_internal_disp(
298306 p3_main_part3_disp (
299307 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,
300308 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,
302310 vap_liq_exchange, ze_rain, ze_ice, diag_vm_qi, diag_eff_radius_qi, diag_diam_qi,
303311 rho_qi, diag_equiv_reflectivity, diag_eff_radius_qc, diag_eff_radius_qr, nucleationPossible, hydrometeorsPresent,
304312 p3constants);
0 commit comments