@@ -761,9 +761,9 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
761
761
#ifdef DO_PHYSICS
762
762
call mpas_pool_get_dimension(state, ' index_qv' , index_qv)
763
763
#endif
764
- if (config_apply_lbcs) then
765
- call mpas_pool_get_dimension(state, ' num_scalars' , num_scalars)
766
- endif
764
+ if (config_apply_lbcs) then
765
+ call mpas_pool_get_dimension(state, ' num_scalars' , num_scalars)
766
+ endif
767
767
768
768
!
769
769
! allocate storage for physics tendency save
@@ -1287,7 +1287,7 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
1287
1287
1288
1288
!$OMP PARALLEL DO
1289
1289
do thread= 1 ,nThreads
1290
- call atm_rk_dynamics_substep_finish(state, diag, dynamics_substep, dynamics_split, &
1290
+ call atm_rk_dynamics_substep_finish(state, diag, nVertLevels, dynamics_substep, dynamics_split, &
1291
1291
cellThreadStart(thread), cellThreadEnd(thread), &
1292
1292
vertexThreadStart(thread), vertexThreadEnd(thread), &
1293
1293
edgeThreadStart(thread), edgeThreadEnd(thread), &
@@ -6200,7 +6200,7 @@ subroutine atm_init_coupled_diagnostics(state, time_lev, diag, mesh, configs, &
6200
6200
end subroutine atm_init_coupled_diagnostics
6201
6201
6202
6202
6203
- subroutine atm_rk_dynamics_substep_finish ( state , diag , dynamics_substep , dynamics_split , &
6203
+ subroutine atm_rk_dynamics_substep_finish ( state , diag , nVertLevels , dynamics_substep , dynamics_split , &
6204
6204
cellStart , cellEnd , vertexStart , vertexEnd , edgeStart , edgeEnd , &
6205
6205
cellSolveStart , cellSolveEnd , vertexSolveStart , vertexSolveEnd , edgeSolveStart , edgeSolveEnd )
6206
6206
@@ -6214,7 +6214,7 @@ subroutine atm_rk_dynamics_substep_finish( state, diag, dynamics_substep, dynami
6214
6214
6215
6215
type (mpas_pool_type), intent (inout ) :: state
6216
6216
type (mpas_pool_type), intent (inout ) :: diag
6217
- integer , intent (in ) :: dynamics_substep, dynamics_split
6217
+ integer , intent (in ) :: nVertLevels, dynamics_substep, dynamics_split
6218
6218
integer , intent (in ) :: cellStart, cellEnd, vertexStart, vertexEnd, edgeStart, edgeEnd
6219
6219
integer , intent (in ) :: cellSolveStart, cellSolveEnd, vertexSolveStart, vertexSolveEnd, edgeSolveStart, edgeSolveEnd
6220
6220
@@ -6234,6 +6234,7 @@ subroutine atm_rk_dynamics_substep_finish( state, diag, dynamics_substep, dynami
6234
6234
real (kind= RKIND), dimension (:,:), pointer :: theta_m_1, theta_m_2
6235
6235
real (kind= RKIND), dimension (:,:), pointer :: rho_zz_1, rho_zz_2, rho_zz_old_split
6236
6236
real (kind= RKIND), dimension (:,:), pointer :: ruAvg, wwAvg, ruAvg_split, wwAvg_split
6237
+ integer :: iCell, iEdge, j, k
6237
6238
6238
6239
call mpas_pool_get_array(diag, ' ru' , ru)
6239
6240
call mpas_pool_get_array(diag, ' ru_save' , ru_save)
@@ -6258,35 +6259,118 @@ subroutine atm_rk_dynamics_substep_finish( state, diag, dynamics_substep, dynami
6258
6259
call mpas_pool_get_array(state, ' rho_zz' , rho_zz_1, 1 )
6259
6260
call mpas_pool_get_array(state, ' rho_zz' , rho_zz_2, 2 )
6260
6261
6262
+
6263
+ MPAS_ACC_TIMER_START(' atm_rk_dynamics_substep_finish [ACC_data_xfer]' )
6264
+ !$acc enter data create(ru_save, u_1, rtheta_p_save, theta_m_1, rho_p_save, rw_save, &
6265
+ !$acc w_1, rho_zz_1) &
6266
+ !$acc copyin(ru, u_2, rtheta_p, rho_p, theta_m_2, rho_zz_2, rw, &
6267
+ !$acc w_2, ruAvg, wwAvg, ruAvg_split, wwAvg_split, rho_zz_old_split)
6268
+ MPAS_ACC_TIMER_STOP(' atm_rk_dynamics_substep_finish [ACC_data_xfer]' )
6269
+
6261
6270
inv_dynamics_split = 1.0_RKIND / real (dynamics_split)
6262
6271
6272
+ !$acc parallel
6263
6273
if (dynamics_substep < dynamics_split) then
6264
6274
6265
- ru_save(:,edgeStart:edgeEnd) = ru(:,edgeStart:edgeEnd)
6266
- rw_save(:,cellStart:cellEnd) = rw(:,cellStart:cellEnd)
6267
- rtheta_p_save(:,cellStart:cellEnd) = rtheta_p(:,cellStart:cellEnd)
6268
- rho_p_save(:,cellStart:cellEnd) = rho_p(:,cellStart:cellEnd)
6275
+ !$acc loop gang worker
6276
+ do iEdge = edgeStart,edgeEnd
6277
+ !$acc loop vector
6278
+ do k = 1 ,nVertLevels
6279
+ ru_save(k,iEdge) = ru(k,iEdge)
6280
+ u_1(k,iEdge) = u_2(k,iEdge)
6281
+ end do
6282
+ end do
6283
+
6269
6284
6270
- u_1(:,edgeStart:edgeEnd) = u_2(:,edgeStart:edgeEnd)
6271
- w_1(:,cellStart:cellEnd) = w_2(:,cellStart:cellEnd)
6272
- theta_m_1(:,cellStart:cellEnd) = theta_m_2(:,cellStart:cellEnd)
6273
- rho_zz_1(:,cellStart:cellEnd) = rho_zz_2(:,cellStart:cellEnd)
6285
+ !$acc loop gang worker
6286
+ do iCell = cellStart,cellEnd
6287
+ !$acc loop vector
6288
+ do k = 1 ,nVertLevels
6289
+ rtheta_p_save(k,iCell) = rtheta_p(k,iCell)
6290
+ rho_p_save(k,iCell) = rho_p(k,iCell)
6291
+ theta_m_1(k,iCell) = theta_m_2(k,iCell)
6292
+ rho_zz_1(k,iCell) = rho_zz_2(k,iCell)
6293
+ end do
6294
+ end do
6274
6295
6296
+ !$acc loop gang worker
6297
+ do iCell = cellStart,cellEnd
6298
+ !$acc loop vector
6299
+ do k = 1 ,nVertLevels+1
6300
+ rw_save(k,iCell) = rw(k,iCell)
6301
+ w_1(k,iCell) = w_2(k,iCell)
6302
+ end do
6303
+ end do
6275
6304
end if
6276
6305
6306
+
6307
+ !!$acc parallel
6277
6308
if (dynamics_substep == 1 ) then
6278
- ruAvg_split(:,edgeStart:edgeEnd) = ruAvg(:,edgeStart:edgeEnd)
6279
- wwAvg_split(:,cellStart:cellEnd) = wwAvg(:,cellStart:cellEnd)
6309
+ !$acc loop gang worker
6310
+ do iEdge = edgeStart,edgeEnd
6311
+ !$acc loop vector
6312
+ do k = 1 ,nVertLevels
6313
+ ruAvg_split(k,iEdge) = ruAvg(k,iEdge)
6314
+ end do
6315
+ end do
6316
+ !$acc loop gang worker
6317
+ do iCell = cellStart,cellEnd
6318
+ !$acc loop vector
6319
+ do k = 1 ,nVertLevels+1
6320
+ wwAvg_split(k,iCell) = wwAvg(k,iCell)
6321
+ end do
6322
+ end do
6280
6323
else
6281
- ruAvg_split(:,edgeStart:edgeEnd) = ruAvg(:,edgeStart:edgeEnd)+ ruAvg_split(:,edgeStart:edgeEnd)
6282
- wwAvg_split(:,cellStart:cellEnd) = wwAvg(:,cellStart:cellEnd)+ wwAvg_split(:,cellStart:cellEnd)
6324
+ !$acc loop gang worker
6325
+ do iEdge = edgeStart,edgeEnd
6326
+ !$acc loop vector
6327
+ do k = 1 ,nVertLevels
6328
+ ruAvg_split(k,iEdge) = ruAvg(k,iEdge) + ruAvg_split(k,iEdge)
6329
+ end do
6330
+ end do
6331
+ !$acc loop gang worker
6332
+ do iCell = cellStart,cellEnd
6333
+ !$acc loop vector
6334
+ do k = 1 ,nVertLevels+1
6335
+ wwAvg_split(k,iCell) = wwAvg(k,iCell) + wwAvg_split(k,iCell)
6336
+ end do
6337
+ end do
6283
6338
end if
6284
6339
6285
6340
if (dynamics_substep == dynamics_split) then
6286
- ruAvg(:,edgeStart:edgeEnd) = ruAvg_split(:,edgeStart:edgeEnd) * inv_dynamics_split
6287
- wwAvg(:,cellStart:cellEnd) = wwAvg_split(:,cellStart:cellEnd) * inv_dynamics_split
6288
- rho_zz_1(:,cellStart:cellEnd) = rho_zz_old_split(:,cellStart:cellEnd)
6341
+ !$acc loop gang worker
6342
+ do iEdge = edgeStart,edgeEnd
6343
+ !$acc loop vector
6344
+ do k = 1 ,nVertLevels
6345
+ ruAvg(k,iEdge) = ruAvg_split(k,iEdge) * inv_dynamics_split
6346
+ end do
6347
+ end do
6348
+ !$acc loop gang worker
6349
+ do iCell = cellStart,cellEnd
6350
+ !$acc loop vector
6351
+ do k = 1 ,nVertLevels+1
6352
+ wwAvg(k,iCell) = wwAvg_split(k,iCell) * inv_dynamics_split
6353
+ end do
6354
+ end do
6355
+ !$acc loop gang worker
6356
+ do iCell = cellStart,cellEnd
6357
+ !$acc loop vector
6358
+ do k = 1 ,nVertLevels
6359
+ rho_zz_1(k,iCell) = rho_zz_old_split(k,iCell)
6360
+ end do
6361
+ end do
6289
6362
end if
6363
+ !$acc end parallel
6364
+
6365
+ !!$acc exit data copyout(rho_zz_1, ruAvg, wwAvg, ruAvg_split, wwAvg_split)
6366
+
6367
+ MPAS_ACC_TIMER_START(' atm_rk_dynamics_substep_finish [ACC_data_xfer]' )
6368
+ !$acc exit data copyout(ru_save, u_1, rtheta_p_save, rho_p_save, rw_save, &
6369
+ !$acc w_1, theta_m_1, rho_zz_1, ruAvg, wwAvg, ruAvg_split, &
6370
+ !$acc wwAvg_split) &
6371
+ !$acc delete(ru, u_2, rtheta_p, rho_p, theta_m_2, rho_zz_2, rw, &
6372
+ !$acc w_2, rho_zz_old_split)
6373
+ MPAS_ACC_TIMER_STOP(' atm_rk_dynamics_substep_finish [ACC_data_xfer]' )
6290
6374
6291
6375
end subroutine atm_rk_dynamics_substep_finish
6292
6376
0 commit comments