Skip to content

Commit c1a4f70

Browse files
committed
First working version
1 parent 4ea6abb commit c1a4f70

File tree

1 file changed

+77
-13
lines changed

1 file changed

+77
-13
lines changed

src/core_atmosphere/dynamics/mpas_atm_time_integration.F

Lines changed: 77 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ subroutine mpas_atm_dynamics_init(domain)
233233
real (kind=RKIND), dimension(:,:,:), pointer :: zb3_cell
234234
real (kind=RKIND), dimension(:), pointer :: fzm
235235
real (kind=RKIND), dimension(:), pointer :: fzp
236+
real (kind=RKIND), dimension(:), pointer :: meshScalingRegionalCell
237+
real (kind=RKIND), dimension(:), pointer :: meshScalingRegionalEdge
236238
#endif
237239

238240

@@ -356,6 +358,12 @@ subroutine mpas_atm_dynamics_init(domain)
356358
call mpas_pool_get_array(mesh, 'fzp', fzp)
357359
!$acc enter data copyin(fzp)
358360

361+
call mpas_pool_get_array(mesh, 'meshScalingRegionalCell', meshScalingRegionalCell)
362+
!$acc enter data copyin(meshScalingRegionalCell)
363+
364+
call mpas_pool_get_array(mesh, 'meshScalingRegionalEdge', meshScalingRegionalEdge)
365+
!$acc enter data copyin(meshScalingRegionalEdge)
366+
359367
#endif
360368

361369
end subroutine mpas_atm_dynamics_init
@@ -425,6 +433,8 @@ subroutine mpas_atm_dynamics_finalize(domain)
425433
real (kind=RKIND), dimension(:,:,:), pointer :: zb3_cell
426434
real (kind=RKIND), dimension(:), pointer :: fzm
427435
real (kind=RKIND), dimension(:), pointer :: fzp
436+
real (kind=RKIND), dimension(:), pointer :: meshScalingRegionalCell
437+
real (kind=RKIND), dimension(:), pointer :: meshScalingRegionalEdge
428438
#endif
429439

430440

@@ -547,6 +557,13 @@ subroutine mpas_atm_dynamics_finalize(domain)
547557

548558
call mpas_pool_get_array(mesh, 'fzp', fzp)
549559
!$acc exit data delete(fzp)
560+
561+
call mpas_pool_get_array(mesh, 'meshScalingRegionalCell', meshScalingRegionalCell)
562+
!$acc exit data delete(meshScalingRegionalCell)
563+
564+
call mpas_pool_get_array(mesh, 'meshScalingRegionalEdge', meshScalingRegionalEdge)
565+
!$acc exit data delete(meshScalingRegionalEdge)
566+
550567
#endif
551568

552569
end subroutine mpas_atm_dynamics_finalize
@@ -1040,6 +1057,7 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
10401057
rt_driving_values(1:nVertLevels,1:nCells+1) = mpas_atm_get_bdy_state( clock, block, nVertLevels, nCells, 'rtheta_m', time_dyn_step )
10411058
rho_driving_values(1:nVertLevels,1:nCells+1) = mpas_atm_get_bdy_state( clock, block, nVertLevels, nCells, 'rho_zz', time_dyn_step )
10421059

1060+
call mpas_timer_start('atm_bdy_adjust_dynamics_relaxzone_tend')
10431061
!$OMP PARALLEL DO
10441062
do thread=1,nThreads
10451063
call atm_bdy_adjust_dynamics_relaxzone_tend( block % configs, tend, state, diag, mesh, nVertLevels, dt, &
@@ -1050,6 +1068,7 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
10501068
edgeSolveThreadStart(thread), edgeSolveThreadEnd(thread) )
10511069
end do
10521070
!$OMP END PARALLEL DO
1071+
call mpas_timer_stop('atm_bdy_adjust_dynamics_relaxzone_tend')
10531072

10541073
deallocate(ru_driving_values)
10551074
deallocate(rt_driving_values)
@@ -6489,11 +6508,13 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
64896508
real (kind=RKIND), dimension(:,:), pointer :: edgesOnCell_sign, edgesOnVertex_sign
64906509
integer, dimension(:), pointer :: bdyMaskCell, bdyMaskEdge, nEdgesOnCell
64916510
integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgesOnCell, edgesOnVertex
6492-
integer, pointer :: vertexDegree
6511+
integer, pointer :: vertexDegree_ptr
6512+
integer :: vertexDegree
64936513

64946514

64956515
real (kind=RKIND) :: edge_sign, laplacian_filter_coef, rayleigh_damping_coef, r_dc, r_dv, invArea
6496-
real (kind=RKIND), pointer :: divdamp_coef
6516+
real (kind=RKIND), pointer :: divdamp_coef_ptr
6517+
real (kind=RKIND) :: divdamp_coef
64976518
real (kind=RKIND), dimension(nVertLevels) :: divergence1, divergence2, vorticity1, vorticity2
64986519
integer :: iCell, iEdge, i, k, cell1, cell2, iEdge_vort, iEdge_div
64996520
integer :: vertex1, vertex2, iVertex
@@ -6514,7 +6535,7 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
65146535
call mpas_pool_get_array(state, 'theta_m', theta_m, 2)
65156536
call mpas_pool_get_array(state, 'rho_zz', rho_zz, 2)
65166537

6517-
call mpas_pool_get_dimension(mesh, 'vertexDegree', vertexDegree)
6538+
call mpas_pool_get_dimension(mesh, 'vertexDegree', vertexDegree_ptr)
65186539
call mpas_pool_get_array(mesh, 'dcEdge', dcEdge)
65196540
call mpas_pool_get_array(mesh, 'dvEdge', dvEdge)
65206541
call mpas_pool_get_array(mesh, 'invDcEdge', invDcEdge)
@@ -6529,37 +6550,55 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
65296550
call mpas_pool_get_array(mesh, 'nEdgesOnCell',nEdgesOnCell)
65306551
call mpas_pool_get_array(mesh, 'verticesOnEdge', verticesOnEdge)
65316552

6532-
call mpas_pool_get_config(config, 'config_relax_zone_divdamp_coef', divdamp_coef)
6553+
call mpas_pool_get_config(config, 'config_relax_zone_divdamp_coef', divdamp_coef_ptr)
6554+
6555+
divdamp_coef = divdamp_coef_ptr
6556+
vertexDegree = vertexDegree_ptr
6557+
6558+
MPAS_ACC_TIMER_START('atm_bdy_adjust_dynamics_relaxzone_tend [ACC_data_xfer]')
6559+
!$acc enter data copyin(tend_rho, tend_rt, rho_zz, theta_m, rho_driving_values, &
6560+
!$acc rt_driving_values, tend_ru, ru, ru_driving_values)
6561+
!$acc enter data create(divergence1, divergence2, vorticity1, vorticity2)
6562+
MPAS_ACC_TIMER_STOP('atm_bdy_adjust_dynamics_relaxzone_tend [ACC_data_xfer]')
65336563

65346564
! First, Rayleigh damping terms for ru, rtheta_m and rho_zz
6535-
6565+
!$acc parallel default(present)
6566+
!$acc loop gang worker
65366567
do iCell = cellSolveStart, cellSolveEnd
65376568
if( (bdyMaskCell(iCell) > 1) .and. (bdyMaskCell(iCell) <= nRelaxZone) ) then
65386569
rayleigh_damping_coef = (real(bdyMaskCell(iCell)) - 1.)/real(nRelaxZone)/(50.*dt*meshScalingRegionalCell(iCell))
6570+
!$acc loop vector
65396571
do k=1, nVertLevels
65406572
tend_rho(k,iCell) = tend_rho(k,iCell) - rayleigh_damping_coef * (rho_zz(k,iCell) - rho_driving_values(k,iCell))
65416573
tend_rt(k,iCell) = tend_rt(k,iCell) - rayleigh_damping_coef * (rho_zz(k,iCell)*theta_m(k,iCell) - rt_driving_values(k,iCell))
65426574
end do
65436575
end if
65446576
end do
6577+
!$acc end parallel
65456578

6579+
!$acc parallel default(present)
6580+
!$acc loop gang worker
65466581
do iEdge = edgeStart, edgeEnd
65476582
if( (bdyMaskEdge(iEdge) > 1) .and. (bdyMaskEdge(iEdge) <= nRelaxZone) ) then
65486583
rayleigh_damping_coef = (real(bdyMaskEdge(iEdge)) - 1.)/real(nRelaxZone)/(50.*dt*meshScalingRegionalEdge(iEdge))
6584+
!$acc loop vector
65496585
do k=1, nVertLevels
65506586
tend_ru(k,iEdge) = tend_ru(k,iEdge) - rayleigh_damping_coef * (ru(k,iEdge) - ru_driving_values(k,iEdge))
65516587
end do
65526588
end if
65536589
end do
6554-
6555-
! Second, the horizontal filter for rtheta_m and rho_zz
6590+
!$acc end parallel
65566591

6592+
! Second, the horizontal filter for rtheta_m and rho_zz
6593+
!$acc parallel default(present)
6594+
!$acc loop gang worker
65576595
do iCell = cellSolveStart, cellSolveEnd ! threaded over cells
65586596

65596597
if ( (bdyMaskCell(iCell) > 1) .and. (bdyMaskCell(iCell) <= nRelaxZone) ) then ! relaxation zone
65606598

65616599
laplacian_filter_coef = (real(bdyMaskCell(iCell)) - 1.)/real(nRelaxZone)/(10.*dt*meshScalingRegionalCell(iCell))
65626600
!
6601+
!$acc loop seq
65636602
do i=1,nEdgesOnCell(iCell)
65646603
iEdge = edgesOnCell(i,iCell)
65656604
! edge_sign = r_areaCell*edgesOnCell_sign(i,iCell) * dvEdge(iEdge) * invDcEdge(iEdge) * laplacian_filter_coef
@@ -6568,6 +6607,7 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
65686607
cell1 = cellsOnEdge(1,iEdge)
65696608
cell2 = cellsOnEdge(2,iEdge)
65706609
!DIR$ IVDEP
6610+
!$acc loop vector
65716611
do k=1,nVertLevels
65726612
tend_rt(k,iCell) = tend_rt(k,iCell) + edge_sign*( (rho_zz(k,cell2)*theta_m(k,cell2)-rt_driving_values(k,cell2)) &
65736613
- (rho_zz(k,cell1)*theta_m(k,cell1)-rt_driving_values(k,cell1)) )
@@ -6579,14 +6619,18 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
65796619
end if
65806620

65816621
end do
6622+
!$acc end parallel
65826623

65836624
! Third (and last), the horizontal filter for ru
6584-
6625+
!$acc parallel default(present)
6626+
!$acc loop gang worker private(cell1, cell2, vertex1, vertex2, r_dc, r_dv, &
6627+
!$acc iCell, iVertex, invArea, iEdge_div, iEdge_vort, edge_sign, &
6628+
!$acc laplacian_filter_coef, divergence1, divergence2, vorticity1, vorticity2)
65856629
do iEdge = edgeStart, edgeEnd
65866630

65876631
if ( (bdyMaskEdge(iEdge) > 1) .and. (bdyMaskEdge(iEdge) <= nRelaxZone) ) then ! relaxation zone
65886632

6589-
laplacian_filter_coef = dcEdge(iEdge)**2 * (real(bdyMaskEdge(iEdge)) - 1.)/ &
6633+
laplacian_filter_coef = dcEdge(iEdge)*dcEdge(iEdge)* (real(bdyMaskEdge(iEdge)) - 1.)/ &
65906634
real(nRelaxZone)/(10.*dt*meshScalingRegionalEdge(iEdge))
65916635

65926636
cell1 = cellsOnEdge(1,iEdge)
@@ -6598,48 +6642,61 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
65986642

65996643
iCell = cell1
66006644
invArea = invAreaCell(iCell)
6601-
divergence1(1:nVertLevels) = 0.
6645+
!$acc loop vector
6646+
do k=1,nVertLevels
6647+
divergence1(k) = 0.
6648+
divergence2(k) = 0.
6649+
vorticity1(k) = 0.
6650+
vorticity2(k) = 0.
6651+
end do
6652+
6653+
!$acc loop seq
66026654
do i=1,nEdgesOnCell(iCell)
66036655
iEdge_div = edgesOnCell(i,iCell)
66046656
edge_sign = invArea * dvEdge(iEdge_div) * edgesOnCell_sign(i,iCell)
6657+
!$acc loop vector
66056658
do k=1,nVertLevels
66066659
divergence1(k) = divergence1(k) + edge_sign * (ru(k,iEdge_div) - ru_driving_values(k,iEdge_div))
66076660
end do
66086661
end do
66096662

66106663
iCell = cell2
66116664
invArea = invAreaCell(iCell)
6612-
divergence2(1:nVertLevels) = 0.
6665+
!$acc loop seq
66136666
do i=1,nEdgesOnCell(iCell)
66146667
iEdge_div = edgesOnCell(i,iCell)
66156668
edge_sign = invArea * dvEdge(iEdge_div) * edgesOnCell_sign(i,iCell)
6669+
!$acc loop vector
66166670
do k=1,nVertLevels
66176671
divergence2(k) = divergence2(k) + edge_sign * (ru(k,iEdge_div) - ru_driving_values(k,iEdge_div))
66186672
end do
66196673
end do
66206674

66216675
iVertex = vertex1
6622-
vorticity1(1:nVertLevels) = 0.
6676+
!$acc loop seq
66236677
do i=1,vertexDegree
66246678
iEdge_vort = edgesOnVertex(i,iVertex)
66256679
edge_sign = invAreaTriangle(iVertex) * dcEdge(iEdge_vort) * edgesOnVertex_sign(i,iVertex)
6680+
!$acc loop vector
66266681
do k=1,nVertLevels
66276682
vorticity1(k) = vorticity1(k) + edge_sign * (ru(k,iEdge_vort) - ru_driving_values(k,iEdge_vort))
66286683
end do
66296684
end do
66306685

66316686
iVertex = vertex2
6632-
vorticity2(1:nVertLevels) = 0.
6687+
!$acc loop seq
66336688
do i=1,vertexDegree
66346689
iEdge_vort = edgesOnVertex(i,iVertex)
66356690
edge_sign = invAreaTriangle(iVertex) * dcEdge(iEdge_vort) * edgesOnVertex_sign(i,iVertex)
6691+
!$acc loop vector
66366692
do k=1,nVertLevels
66376693
vorticity2(k) = vorticity2(k) + edge_sign * (ru(k,iEdge_vort) - ru_driving_values(k,iEdge_vort))
66386694
end do
66396695
end do
66406696

66416697
! Compute diffusion, computed as \nabla divergence - k \times \nabla vorticity
66426698
!
6699+
!$acc loop vector
66436700
do k=1,nVertLevels
66446701
tend_ru(k,iEdge) = tend_ru(k,iEdge) + laplacian_filter_coef &
66456702
* (divdamp_coef * (divergence2(k) - divergence1(k)) * r_dc &
@@ -6649,6 +6706,13 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
66496706
end if ! end test for relaxation-zone edge
66506707

66516708
end do ! end of loop over edges
6709+
!$acc end parallel
6710+
6711+
MPAS_ACC_TIMER_START('atm_bdy_adjust_dynamics_relaxzone_tend [ACC_data_xfer]')
6712+
!$acc exit data copyout(tend_rho, tend_rt, tend_ru)
6713+
!$acc exit data delete(rho_zz, theta_m, ru, rho_driving_values, rt_driving_values, &
6714+
!$acc ru_driving_values, divergence1, divergence2, vorticity1, vorticity2)
6715+
MPAS_ACC_TIMER_STOP('atm_bdy_adjust_dynamics_relaxzone_tend [ACC_data_xfer]')
66526716

66536717
end subroutine atm_bdy_adjust_dynamics_relaxzone_tend
66546718

0 commit comments

Comments
 (0)