@@ -153,7 +153,6 @@ void chm_diags(
153153 // ... local variables
154154 // --------------------------------------------------------------------
155155
156- Real wgt;
157156 // Real pointer :: fldcw(:,:) //working pointer to extract data from pbuf for
158157 // sum of mass for aerosol classes
159158
@@ -170,7 +169,8 @@ void chm_diags(
170169 // --------------------------------------------------------------------
171170 // ... "diagnostic" groups
172171 // --------------------------------------------------------------------
173- for (int kk = 0 ; kk < pver; kk++) {
172+ constexpr int pver_local = pver;
173+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local), [&](int kk) {
174174 vmr_nox (kk) = 0 ;
175175 vmr_noy (kk) = 0 ;
176176 vmr_clox (kk) = 0 ;
@@ -180,7 +180,7 @@ void chm_diags(
180180 mmr_noy (kk) = 0 ;
181181 mmr_sox (kk) = 0 ;
182182 mmr_nhx (kk) = 0 ;
183- }
183+ });
184184 df_noy (0 ) = 0 ;
185185 df_sox (0 ) = 0 ;
186186 df_nhx (0 ) = 0 ;
@@ -199,99 +199,116 @@ void chm_diags(
199199 // initialize the mass arrays
200200 // if (history_aerosol .and. .not. history_verbose) then // what was this used
201201 // for?
202- for (int kk = 0 ; kk < pver; kk++ ) {
202+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local), [&] (int kk) {
203203 mass_bc (kk) = 0 ;
204204 mass_dst (kk) = 0 ;
205205 mass_mom (kk) = 0 ;
206206 mass_ncl (kk) = 0 ;
207207 mass_pom (kk) = 0 ;
208208 mass_so4 (kk) = 0 ;
209209 mass_soa (kk) = 0 ;
210- }
210+ });
211+
212+ Kokkos::single (Kokkos::PerTeam (team),
213+ [=]() { area (0 ) *= haero::square (rearth); });
211214
212- area ( 0 ) *= haero::square (rearth );
215+ team. team_barrier ( );
213216
214- for (int kk = 0 ; kk < pver; kk++ ) {
217+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local), [&] (int kk) {
215218 mass (kk) = pdel (kk) * area (0 ) * rgrav;
216219 drymass (kk) = pdeldry (kk) * area (0 ) * rgrav;
217- }
220+ });
218221
219222 // convert ozone from mol/mol (w.r.t. dry air mass) to DU
220- for (int kk = 0 ; kk < pver; kk++ ) {
223+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local), [&] (int kk) {
221224 ozone_layer (kk) =
222225 pdeldry (kk) * vmr[id_o3](kk) * avogadro * rgrav / mwdry / DUfac * 1e3 ;
223- }
226+ });
224227 // total column ozone
225228 ozone_col (0 ) = 0 ;
226229 ozone_trop (0 ) = 0 ;
227230 ozone_strat (0 ) = 0 ;
228-
229- for (int kk = 0 ; kk < pver; kk++) {
230- ozone_col (0 ) += ozone_layer (kk);
231- if (kk <= ltrop) {
232- // stratospheric column ozone
233- ozone_strat (0 ) += ozone_layer (kk);
234- } else {
235- // tropospheric column ozone
236- ozone_trop (0 ) += ozone_layer (kk);
237- }
238- }
231+ team.team_barrier ();
232+
233+ Kokkos::parallel_reduce (
234+ Kokkos::TeamVectorRange (team, pver_local),
235+ [&](int kk, Real &update) { update += ozone_layer (kk); }, ozone_col (0 ));
236+
237+ // stratospheric column ozone
238+ Kokkos::parallel_reduce (
239+ Kokkos::TeamVectorRange (team, pver_local),
240+ [&](int kk, Real &update) {
241+ if (kk <= ltrop)
242+ update += ozone_layer (kk);
243+ },
244+ ozone_strat (0 ));
245+
246+ // tropospheric column ozone
247+ Kokkos::parallel_reduce (
248+ Kokkos::TeamVectorRange (team, pver_local),
249+ [&](int kk, Real &update) {
250+ if (kk > ltrop)
251+ update += ozone_layer (kk);
252+ },
253+ ozone_trop (0 ));
239254
240255 for (int mm = 0 ; mm < gas_pcnst; mm++) {
241256 // other options of species are not used, only use weight=1
242- wgt = 1 ;
257+ constexpr Real wgt = 1 ;
243258
244259 for (int i = 0 ; i < 3 ; i++) { // FIXME: bad constant (len of sox species)
245260 if (sox_species[i] == mm) {
246- for ( int kk = 0 ; kk < pver; kk++) {
247- mmr_sox (kk) = mmr_sox (kk) + wgt * mmr[mm](kk);
248- }
261+
262+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local),
263+ [&]( int kk) { mmr_sox (kk) += wgt * mmr[mm](kk); });
249264 }
250265 }
251266
252267 if (aer_species[mm] == mm) {
253268 const char *symbol = solsym[mm];
254269 if (name_matches (symbol, " bc_a" )) {
255- for ( int kk = 0 ; kk < pver; kk++) {
256- mass_bc (kk) += mmr[mm](kk);
257- }
270+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local),
271+ [&]( int kk) { mass_bc (kk) += mmr[mm](kk); } );
272+
258273 } else if (name_matches (symbol, " dst_a" )) {
259- for (int kk = 0 ; kk < pver; kk++) {
260- mass_dst (kk) += mmr[mm](kk);
261- }
274+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
275+ [&](int kk) { mass_dst (kk) += mmr[mm](kk); });
262276 } else if (name_matches (symbol, " mom_a" )) {
263- for ( int kk = 0 ; kk < pver; kk++) {
264- mass_mom (kk) += mmr[mm](kk);
265- }
277+ Kokkos::parallel_for ( Kokkos::TeamVectorRange (team, pver_local),
278+ [&]( int kk) { mass_mom (kk) += mmr[mm](kk); } );
279+
266280 } else if (name_matches (symbol, " ncl_a" )) {
267- for (int kk = 0 ; kk < pver; kk++) {
268- mass_ncl (kk) += mmr[mm](kk);
269- }
281+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
282+ [&](int kk) { mass_ncl (kk) += mmr[mm](kk); });
270283 } else if (name_matches (symbol, " pom_a" )) {
271- for (int kk = 0 ; kk < pver; kk++) {
272- mass_pom (kk) += mmr[mm](kk);
273- }
284+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
285+ [&](int kk) { mass_pom (kk) += mmr[mm](kk); });
274286 } else if (name_matches (symbol, " so4_a" )) {
275- for (int kk = 0 ; kk < pver; kk++) {
276- mass_so4 (kk) += mmr[mm](kk);
277- }
287+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
288+ [&](int kk) { mass_so4 (kk) += mmr[mm](kk); });
278289 } else if (name_matches (symbol, " soa_a" )) {
279- for (int kk = 0 ; kk < pver; kk++) {
280- mass_soa (kk) += mmr[mm](kk);
281- }
282- }
283- }
284-
285- for (int i = 0 ; i < 3 ; i++) { // FIXME: bad constant (len of sox species)
286- if (sox_species[i] == mm) {
287- df_sox (0 ) += wgt * depflx[mm] * S_molwgt / adv_mass[mm];
290+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
291+ [&](int kk) { mass_soa (kk) += mmr[mm](kk); });
288292 }
289293 }
290-
291- for (int kk = 0 ; kk < pver; kk++) {
292- net_chem (kk) = mmr_tend[mm](kk) * mass (kk);
293- }
294+ Kokkos::parallel_for (
295+ Kokkos::TeamVectorRange (team, pver_local),
296+ [&](int kk) { net_chem (kk) = mmr_tend[mm](kk) * mass (kk); });
294297 }
298+ constexpr int gas_pcnst_local = gas_pcnst;
299+ Kokkos::parallel_reduce (
300+ Kokkos::TeamVectorRange (team, gas_pcnst_local),
301+ [&](int mm, Real &update) {
302+ // other options of species are not used, only use weight=1
303+ constexpr Real wgt = 1 ;
304+ for (int i = 0 ; i < 3 ;
305+ i++) { // FIXME: bad constant (len of sox species)
306+ if (sox_species[i] == mm) {
307+ update += wgt * depflx[mm] * S_molwgt / adv_mass[mm];
308+ }
309+ }
310+ },
311+ df_sox (0 ));
295312
296313 // diagnostics for cloud-borne aerosols, then add to corresponding mass
297314 // accumulators
@@ -320,36 +337,29 @@ void chm_diags(
320337 }
321338 }
322339 if (name_matches (symbol_cw, " bc_c" )) {
323- for (int kk = 0 ; kk < pver; kk++) {
324- mass_bc (kk) += fldcw[nn](kk);
325- }
340+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
341+ [&](int kk) { mass_bc (kk) += fldcw[nn](kk); });
326342 } else if (name_matches (symbol_cw, " dst_c" )) {
327- for (int kk = 0 ; kk < pver; kk++) {
328- mass_dst (kk) += fldcw[nn](kk);
329- }
343+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
344+ [&](int kk) { mass_dst (kk) += fldcw[nn](kk); });
330345 } else if (name_matches (symbol_cw, " mom_c" )) {
331- for (int kk = 0 ; kk < pver; kk++) {
332- mass_mom (kk) += fldcw[nn](kk);
333- }
346+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
347+ [&](int kk) { mass_mom (kk) += fldcw[nn](kk); });
334348 } else if (name_matches (symbol_cw, " ncl_c" )) {
335- for (int kk = 0 ; kk < pver; kk++) {
336- mass_ncl (kk) += fldcw[nn](kk);
337- }
349+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
350+ [&](int kk) { mass_ncl (kk) += fldcw[nn](kk); });
338351 } else if (name_matches (symbol_cw, " pom_c" )) {
339- for (int kk = 0 ; kk < pver; kk++) {
340- mass_pom (kk) += fldcw[nn](kk);
341- }
352+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
353+ [&](int kk) { mass_pom (kk) += fldcw[nn](kk); });
342354 } else if (name_matches (symbol_cw, " so4_c" )) {
343- for (int kk = 0 ; kk < pver; kk++) {
344- mass_so4 (kk) += fldcw[nn](kk);
345- }
355+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
356+ [&](int kk) { mass_so4 (kk) += fldcw[nn](kk); });
346357 } else if (name_matches (symbol_cw, " soa_c" )) {
347- for (int kk = 0 ; kk < pver; kk++) {
348- mass_soa (kk) += fldcw[nn](kk);
349- }
358+ Kokkos::parallel_for (Kokkos::TeamVectorRange (team, pver_local),
359+ [&](int kk) { mass_soa (kk) += fldcw[nn](kk); });
350360 }
351361 }
352362} // chm_diags
353363} // namespace mo_chm_diags
354364} // namespace mam4
355- #endif
365+ #endif
0 commit comments