Skip to content

Commit 37aa961

Browse files
committed
Merge branch 'atmosphere/port_divergence_damping_3d' into develop (PR #1237)
This merge enables GPU execution of the atm_divergence_damping_3d subroutine using OpenACC directives for the data movement and loops. A new timer, 'atm_divergence_damping_3d [ACC_data_xfer]', has been added for data transfers in the atm_divergence_damping_3d subroutine. Results from a regional simulation are bit-wise identical pre- and post-merge. * atmosphere/port_divergence_damping_3d: Initial OpenACC port of atm_divergence_damping_3d subroutine
2 parents 589bbe6 + 7db74f8 commit 37aa961

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

src/core_atmosphere/dynamics/mpas_atm_time_integration.F

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ subroutine mpas_atm_dynamics_init(domain)
212212
real (kind=RKIND), dimension(:), pointer :: invAreaCell
213213
integer, dimension(:), pointer :: bdyMaskCell
214214
integer, dimension(:), pointer :: bdyMaskEdge
215+
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
215216
real (kind=RKIND), dimension(:), pointer :: invDvEdge
216217
real (kind=RKIND), dimension(:), pointer :: dcEdge
217218
real (kind=RKIND), dimension(:), pointer :: invDcEdge
@@ -295,6 +296,9 @@ subroutine mpas_atm_dynamics_init(domain)
295296
call mpas_pool_get_array(mesh, 'bdyMaskEdge', bdyMaskEdge)
296297
!$acc enter data copyin(bdyMaskEdge)
297298

299+
call mpas_pool_get_array(mesh, 'specZoneMaskEdge', specZoneMaskEdge)
300+
!$acc enter data copyin(specZoneMaskEdge)
301+
298302
call mpas_pool_get_array(mesh, 'invDvEdge', invDvEdge)
299303
!$acc enter data copyin(invDvEdge)
300304

@@ -412,6 +416,7 @@ subroutine mpas_atm_dynamics_finalize(domain)
412416
real (kind=RKIND), dimension(:), pointer :: invAreaCell
413417
integer, dimension(:), pointer :: bdyMaskCell
414418
integer, dimension(:), pointer :: bdyMaskEdge
419+
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
415420
real (kind=RKIND), dimension(:), pointer :: invDvEdge
416421
real (kind=RKIND), dimension(:), pointer :: dcEdge
417422
real (kind=RKIND), dimension(:), pointer :: invDcEdge
@@ -495,6 +500,9 @@ subroutine mpas_atm_dynamics_finalize(domain)
495500
call mpas_pool_get_array(mesh, 'bdyMaskEdge', bdyMaskEdge)
496501
!$acc exit data delete(bdyMaskEdge)
497502

503+
call mpas_pool_get_array(mesh, 'specZoneMaskEdge', specZoneMaskEdge)
504+
!$acc exit data delete(specZoneMaskEdge)
505+
498506
call mpas_pool_get_array(mesh, 'invDvEdge', invDvEdge)
499507
!$acc exit data delete(invDvEdge)
500508

@@ -2696,8 +2704,10 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
26962704
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
26972705
26982706
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
27012711
27022712
real (kind=RKIND) :: divCell1, divCell2, rdts, coef_divdamp
27032713
integer :: cell1, cell2, iEdge, k
@@ -2710,15 +2720,24 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27102720
call mpas_pool_get_array(diag, 'rtheta_pp_old', rtheta_pp_old)
27112721
call mpas_pool_get_array(diag, 'ru_p', ru_p)
27122722
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)
27152725
27162726
call mpas_pool_get_config(configs, 'config_smdiv', smdiv)
27172727
call mpas_pool_get_config(configs, 'config_len_disp', config_len_disp)
27182728
27192729
rdts = 1.0_RKIND / dts
27202730
coef_divdamp = 2.0_RKIND * smdiv * config_len_disp * rdts
27212731
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
27222741
do iEdge=edgeStart,edgeEnd ! MGD do we really just need edges touching owned cells?
27232742
27242743
cell1 = cellsOnEdge(1,iEdge)
@@ -2728,6 +2747,7 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27282747
if (cell1 <= nCellsSolve .or. cell2 <= nCellsSolve ) then
27292748
27302749
!DIR$ IVDEP
2750+
!$acc loop vector
27312751
do k=1,nVertLevels
27322752
27332753
!! unscaled 3d divergence damping
@@ -2745,6 +2765,13 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27452765
end do
27462766
end if ! edges for block-owned cells
27472767
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+
27482775
27492776
end subroutine atm_divergence_damping_3d
27502777

0 commit comments

Comments
 (0)