@@ -233,6 +233,8 @@ subroutine mpas_atm_dynamics_init(domain)
233
233
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
234
234
real (kind= RKIND), dimension (:), pointer :: fzm
235
235
real (kind= RKIND), dimension (:), pointer :: fzp
236
+ real (kind= RKIND), dimension (:), pointer :: meshScalingRegionalCell
237
+ real (kind= RKIND), dimension (:), pointer :: meshScalingRegionalEdge
236
238
#endif
237
239
238
240
@@ -356,6 +358,12 @@ subroutine mpas_atm_dynamics_init(domain)
356
358
call mpas_pool_get_array(mesh, ' fzp' , fzp)
357
359
!$acc enter data copyin(fzp)
358
360
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
+
359
367
#endif
360
368
361
369
end subroutine mpas_atm_dynamics_init
@@ -425,6 +433,8 @@ subroutine mpas_atm_dynamics_finalize(domain)
425
433
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
426
434
real (kind= RKIND), dimension (:), pointer :: fzm
427
435
real (kind= RKIND), dimension (:), pointer :: fzp
436
+ real (kind= RKIND), dimension (:), pointer :: meshScalingRegionalCell
437
+ real (kind= RKIND), dimension (:), pointer :: meshScalingRegionalEdge
428
438
#endif
429
439
430
440
@@ -547,6 +557,13 @@ subroutine mpas_atm_dynamics_finalize(domain)
547
557
548
558
call mpas_pool_get_array(mesh, ' fzp' , fzp)
549
559
!$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
+
550
567
#endif
551
568
552
569
end subroutine mpas_atm_dynamics_finalize
@@ -1040,6 +1057,7 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
1040
1057
rt_driving_values(1 :nVertLevels,1 :nCells+1 ) = mpas_atm_get_bdy_state( clock, block, nVertLevels, nCells, ' rtheta_m' , time_dyn_step )
1041
1058
rho_driving_values(1 :nVertLevels,1 :nCells+1 ) = mpas_atm_get_bdy_state( clock, block, nVertLevels, nCells, ' rho_zz' , time_dyn_step )
1042
1059
1060
+ call mpas_timer_start(' atm_bdy_adjust_dynamics_relaxzone_tend' )
1043
1061
!$OMP PARALLEL DO
1044
1062
do thread= 1 ,nThreads
1045
1063
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)
1050
1068
edgeSolveThreadStart(thread), edgeSolveThreadEnd(thread) )
1051
1069
end do
1052
1070
!$OMP END PARALLEL DO
1071
+ call mpas_timer_stop(' atm_bdy_adjust_dynamics_relaxzone_tend' )
1053
1072
1054
1073
deallocate(ru_driving_values)
1055
1074
deallocate(rt_driving_values)
@@ -6489,11 +6508,13 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
6489
6508
real (kind= RKIND), dimension (:,:), pointer :: edgesOnCell_sign, edgesOnVertex_sign
6490
6509
integer , dimension (:), pointer :: bdyMaskCell, bdyMaskEdge, nEdgesOnCell
6491
6510
integer , dimension (:,:), pointer :: cellsOnEdge, verticesOnEdge, edgesOnCell, edgesOnVertex
6492
- integer , pointer :: vertexDegree
6511
+ integer , pointer :: vertexDegree_ptr
6512
+ integer :: vertexDegree
6493
6513
6494
6514
6495
6515
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
6497
6518
real (kind= RKIND), dimension (nVertLevels) :: divergence1, divergence2, vorticity1, vorticity2
6498
6519
integer :: iCell, iEdge, i, k, cell1, cell2, iEdge_vort, iEdge_div
6499
6520
integer :: vertex1, vertex2, iVertex
@@ -6514,7 +6535,7 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
6514
6535
call mpas_pool_get_array(state, ' theta_m' , theta_m, 2 )
6515
6536
call mpas_pool_get_array(state, ' rho_zz' , rho_zz, 2 )
6516
6537
6517
- call mpas_pool_get_dimension(mesh, ' vertexDegree' , vertexDegree )
6538
+ call mpas_pool_get_dimension(mesh, ' vertexDegree' , vertexDegree_ptr )
6518
6539
call mpas_pool_get_array(mesh, ' dcEdge' , dcEdge)
6519
6540
call mpas_pool_get_array(mesh, ' dvEdge' , dvEdge)
6520
6541
call mpas_pool_get_array(mesh, ' invDcEdge' , invDcEdge)
@@ -6529,37 +6550,55 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
6529
6550
call mpas_pool_get_array(mesh, ' nEdgesOnCell' ,nEdgesOnCell)
6530
6551
call mpas_pool_get_array(mesh, ' verticesOnEdge' , verticesOnEdge)
6531
6552
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]' )
6533
6563
6534
6564
! First, Rayleigh damping terms for ru, rtheta_m and rho_zz
6535
-
6565
+ !$acc parallel default(present)
6566
+ !$acc loop gang worker
6536
6567
do iCell = cellSolveStart, cellSolveEnd
6537
6568
if ( (bdyMaskCell(iCell) > 1 ) .and. (bdyMaskCell(iCell) <= nRelaxZone) ) then
6538
6569
rayleigh_damping_coef = (real (bdyMaskCell(iCell)) - 1 .)/ real (nRelaxZone)/ (50 .* dt* meshScalingRegionalCell(iCell))
6570
+ !$acc loop vector
6539
6571
do k= 1 , nVertLevels
6540
6572
tend_rho(k,iCell) = tend_rho(k,iCell) - rayleigh_damping_coef * (rho_zz(k,iCell) - rho_driving_values(k,iCell))
6541
6573
tend_rt(k,iCell) = tend_rt(k,iCell) - rayleigh_damping_coef * (rho_zz(k,iCell)* theta_m(k,iCell) - rt_driving_values(k,iCell))
6542
6574
end do
6543
6575
end if
6544
6576
end do
6577
+ !$acc end parallel
6545
6578
6579
+ !$acc parallel default(present)
6580
+ !$acc loop gang worker
6546
6581
do iEdge = edgeStart, edgeEnd
6547
6582
if ( (bdyMaskEdge(iEdge) > 1 ) .and. (bdyMaskEdge(iEdge) <= nRelaxZone) ) then
6548
6583
rayleigh_damping_coef = (real (bdyMaskEdge(iEdge)) - 1 .)/ real (nRelaxZone)/ (50 .* dt* meshScalingRegionalEdge(iEdge))
6584
+ !$acc loop vector
6549
6585
do k= 1 , nVertLevels
6550
6586
tend_ru(k,iEdge) = tend_ru(k,iEdge) - rayleigh_damping_coef * (ru(k,iEdge) - ru_driving_values(k,iEdge))
6551
6587
end do
6552
6588
end if
6553
6589
end do
6554
-
6555
- ! Second, the horizontal filter for rtheta_m and rho_zz
6590
+ !$acc end parallel
6556
6591
6592
+ ! Second, the horizontal filter for rtheta_m and rho_zz
6593
+ !$acc parallel default(present)
6594
+ !$acc loop gang worker
6557
6595
do iCell = cellSolveStart, cellSolveEnd ! threaded over cells
6558
6596
6559
6597
if ( (bdyMaskCell(iCell) > 1 ) .and. (bdyMaskCell(iCell) <= nRelaxZone) ) then ! relaxation zone
6560
6598
6561
6599
laplacian_filter_coef = (real (bdyMaskCell(iCell)) - 1 .)/ real (nRelaxZone)/ (10 .* dt* meshScalingRegionalCell(iCell))
6562
6600
!
6601
+ !$acc loop seq
6563
6602
do i= 1 ,nEdgesOnCell(iCell)
6564
6603
iEdge = edgesOnCell(i,iCell)
6565
6604
! 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
6568
6607
cell1 = cellsOnEdge(1 ,iEdge)
6569
6608
cell2 = cellsOnEdge(2 ,iEdge)
6570
6609
!DIR$ IVDEP
6610
+ !$acc loop vector
6571
6611
do k= 1 ,nVertLevels
6572
6612
tend_rt(k,iCell) = tend_rt(k,iCell) + edge_sign* ( (rho_zz(k,cell2)* theta_m(k,cell2)- rt_driving_values(k,cell2)) &
6573
6613
- (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
6579
6619
end if
6580
6620
6581
6621
end do
6622
+ !$acc end parallel
6582
6623
6583
6624
! 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)
6585
6629
do iEdge = edgeStart, edgeEnd
6586
6630
6587
6631
if ( (bdyMaskEdge(iEdge) > 1 ) .and. (bdyMaskEdge(iEdge) <= nRelaxZone) ) then ! relaxation zone
6588
6632
6589
- laplacian_filter_coef = dcEdge(iEdge)** 2 * (real (bdyMaskEdge(iEdge)) - 1 .)/ &
6633
+ laplacian_filter_coef = dcEdge(iEdge)* dcEdge(iEdge) * (real (bdyMaskEdge(iEdge)) - 1 .)/ &
6590
6634
real (nRelaxZone)/ (10 .* dt* meshScalingRegionalEdge(iEdge))
6591
6635
6592
6636
cell1 = cellsOnEdge(1 ,iEdge)
@@ -6598,48 +6642,61 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
6598
6642
6599
6643
iCell = cell1
6600
6644
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
6602
6654
do i= 1 ,nEdgesOnCell(iCell)
6603
6655
iEdge_div = edgesOnCell(i,iCell)
6604
6656
edge_sign = invArea * dvEdge(iEdge_div) * edgesOnCell_sign(i,iCell)
6657
+ !$acc loop vector
6605
6658
do k= 1 ,nVertLevels
6606
6659
divergence1(k) = divergence1(k) + edge_sign * (ru(k,iEdge_div) - ru_driving_values(k,iEdge_div))
6607
6660
end do
6608
6661
end do
6609
6662
6610
6663
iCell = cell2
6611
6664
invArea = invAreaCell(iCell)
6612
- divergence2( 1 :nVertLevels) = 0 .
6665
+ !$acc loop seq
6613
6666
do i= 1 ,nEdgesOnCell(iCell)
6614
6667
iEdge_div = edgesOnCell(i,iCell)
6615
6668
edge_sign = invArea * dvEdge(iEdge_div) * edgesOnCell_sign(i,iCell)
6669
+ !$acc loop vector
6616
6670
do k= 1 ,nVertLevels
6617
6671
divergence2(k) = divergence2(k) + edge_sign * (ru(k,iEdge_div) - ru_driving_values(k,iEdge_div))
6618
6672
end do
6619
6673
end do
6620
6674
6621
6675
iVertex = vertex1
6622
- vorticity1( 1 :nVertLevels) = 0 .
6676
+ !$acc loop seq
6623
6677
do i= 1 ,vertexDegree
6624
6678
iEdge_vort = edgesOnVertex(i,iVertex)
6625
6679
edge_sign = invAreaTriangle(iVertex) * dcEdge(iEdge_vort) * edgesOnVertex_sign(i,iVertex)
6680
+ !$acc loop vector
6626
6681
do k= 1 ,nVertLevels
6627
6682
vorticity1(k) = vorticity1(k) + edge_sign * (ru(k,iEdge_vort) - ru_driving_values(k,iEdge_vort))
6628
6683
end do
6629
6684
end do
6630
6685
6631
6686
iVertex = vertex2
6632
- vorticity2( 1 :nVertLevels) = 0 .
6687
+ !$acc loop seq
6633
6688
do i= 1 ,vertexDegree
6634
6689
iEdge_vort = edgesOnVertex(i,iVertex)
6635
6690
edge_sign = invAreaTriangle(iVertex) * dcEdge(iEdge_vort) * edgesOnVertex_sign(i,iVertex)
6691
+ !$acc loop vector
6636
6692
do k= 1 ,nVertLevels
6637
6693
vorticity2(k) = vorticity2(k) + edge_sign * (ru(k,iEdge_vort) - ru_driving_values(k,iEdge_vort))
6638
6694
end do
6639
6695
end do
6640
6696
6641
6697
! Compute diffusion, computed as \nabla divergence - k \times \nabla vorticity
6642
6698
!
6699
+ !$acc loop vector
6643
6700
do k= 1 ,nVertLevels
6644
6701
tend_ru(k,iEdge) = tend_ru(k,iEdge) + laplacian_filter_coef &
6645
6702
* (divdamp_coef * (divergence2(k) - divergence1(k)) * r_dc &
@@ -6649,6 +6706,13 @@ subroutine atm_bdy_adjust_dynamics_relaxzone_tend( config, tend, state, diag, me
6649
6706
end if ! end test for relaxation- zone edge
6650
6707
6651
6708
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]' )
6652
6716
6653
6717
end subroutine atm_bdy_adjust_dynamics_relaxzone_tend
6654
6718
0 commit comments