@@ -212,6 +212,7 @@ subroutine mpas_atm_dynamics_init(domain)
212
212
real (kind= RKIND), dimension (:), pointer :: invAreaCell
213
213
integer , dimension (:), pointer :: bdyMaskCell
214
214
integer , dimension (:), pointer :: bdyMaskEdge
215
+ real (kind= RKIND), dimension (:), pointer :: specZoneMaskEdge
215
216
real (kind= RKIND), dimension (:), pointer :: invDvEdge
216
217
real (kind= RKIND), dimension (:), pointer :: dcEdge
217
218
real (kind= RKIND), dimension (:), pointer :: invDcEdge
@@ -295,6 +296,9 @@ subroutine mpas_atm_dynamics_init(domain)
295
296
call mpas_pool_get_array(mesh, ' bdyMaskEdge' , bdyMaskEdge)
296
297
!$acc enter data copyin(bdyMaskEdge)
297
298
299
+ call mpas_pool_get_array(mesh, ' specZoneMaskEdge' , specZoneMaskEdge)
300
+ !$acc enter data copyin(specZoneMaskEdge)
301
+
298
302
call mpas_pool_get_array(mesh, ' invDvEdge' , invDvEdge)
299
303
!$acc enter data copyin(invDvEdge)
300
304
@@ -412,6 +416,7 @@ subroutine mpas_atm_dynamics_finalize(domain)
412
416
real (kind= RKIND), dimension (:), pointer :: invAreaCell
413
417
integer , dimension (:), pointer :: bdyMaskCell
414
418
integer , dimension (:), pointer :: bdyMaskEdge
419
+ real (kind= RKIND), dimension (:), pointer :: specZoneMaskEdge
415
420
real (kind= RKIND), dimension (:), pointer :: invDvEdge
416
421
real (kind= RKIND), dimension (:), pointer :: dcEdge
417
422
real (kind= RKIND), dimension (:), pointer :: invDcEdge
@@ -495,6 +500,9 @@ subroutine mpas_atm_dynamics_finalize(domain)
495
500
call mpas_pool_get_array(mesh, ' bdyMaskEdge' , bdyMaskEdge)
496
501
!$acc exit data delete(bdyMaskEdge)
497
502
503
+ call mpas_pool_get_array(mesh, ' specZoneMaskEdge' , specZoneMaskEdge)
504
+ !$acc exit data delete(specZoneMaskEdge)
505
+
498
506
call mpas_pool_get_array(mesh, ' invDvEdge' , invDvEdge)
499
507
!$acc exit data delete(invDvEdge)
500
508
@@ -2696,8 +2704,10 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
2696
2704
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
2697
2705
2698
2706
integer, dimension(:,:), pointer :: cellsOnEdge
2699
- integer, pointer :: nCellsSolve
2700
- integer, pointer :: nVertLevels
2707
+ integer, pointer :: nCellsSolve_ptr
2708
+ integer, pointer :: nVertLevels_ptr
2709
+ integer :: nCellsSolve
2710
+ integer :: nVertLevels
2701
2711
2702
2712
real (kind=RKIND) :: divCell1, divCell2, rdts, coef_divdamp
2703
2713
integer :: cell1, cell2, iEdge, k
@@ -2710,15 +2720,24 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
2710
2720
call mpas_pool_get_array(diag, ' rtheta_pp_old' , rtheta_pp_old)
2711
2721
call mpas_pool_get_array(diag, ' ru_p' , ru_p)
2712
2722
2713
- call mpas_pool_get_dimension(mesh, ' nCellsSolve' , nCellsSolve )
2714
- call mpas_pool_get_dimension(mesh, ' nVertLevels' , nVertLevels )
2723
+ call mpas_pool_get_dimension(mesh, ' nCellsSolve' , nCellsSolve_ptr )
2724
+ call mpas_pool_get_dimension(mesh, ' nVertLevels' , nVertLevels_ptr )
2715
2725
2716
2726
call mpas_pool_get_config(configs, ' config_smdiv' , smdiv)
2717
2727
call mpas_pool_get_config(configs, ' config_len_disp' , config_len_disp)
2718
2728
2719
2729
rdts = 1.0_RKIND / dts
2720
2730
coef_divdamp = 2.0_RKIND * smdiv * config_len_disp * rdts
2721
2731
2732
+ nCellsSolve = nCellsSolve_ptr
2733
+ nVertLevels = nVertLevels_ptr
2734
+
2735
+ MPAS_ACC_TIMER_START(' atm_divergence_damping_3d [ACC_data_xfer]' )
2736
+ !$acc enter data copyin(ru_p, rtheta_pp, rtheta_pp_old, theta_m)
2737
+ MPAS_ACC_TIMER_STOP(' atm_divergence_damping_3d [ACC_data_xfer]' )
2738
+
2739
+ !$acc parallel default(present)
2740
+ !$acc loop gang worker
2722
2741
do iEdge=edgeStart,edgeEnd ! MGD do we really just need edges touching owned cells?
2723
2742
2724
2743
cell1 = cellsOnEdge(1,iEdge)
@@ -2728,6 +2747,7 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
2728
2747
if (cell1 <= nCellsSolve .or. cell2 <= nCellsSolve ) then
2729
2748
2730
2749
!DIR$ IVDEP
2750
+ !$acc loop vector
2731
2751
do k=1,nVertLevels
2732
2752
2733
2753
!! unscaled 3d divergence damping
@@ -2745,6 +2765,13 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
2745
2765
end do
2746
2766
end if ! edges for block-owned cells
2747
2767
end do ! end loop over edges
2768
+ !$acc end parallel
2769
+
2770
+ MPAS_ACC_TIMER_START(' atm_divergence_damping_3d [ACC_data_xfer]' )
2771
+ !$acc exit data copyout(ru_p) &
2772
+ !$acc delete(rtheta_pp, rtheta_pp_old, theta_m)
2773
+ MPAS_ACC_TIMER_STOP(' atm_divergence_damping_3d [ACC_data_xfer]' )
2774
+
2748
2775
2749
2776
end subroutine atm_divergence_damping_3d
2750
2777
0 commit comments