@@ -761,9 +761,7 @@ 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
+ call mpas_pool_get_dimension(state, ' num_scalars' , num_scalars)
767
765
768
766
!
769
767
! allocate storage for physics tendency save
@@ -845,7 +843,7 @@ subroutine atm_srk3(domain, dt, itimestep, exchange_halo_group)
845
843
846
844
!$OMP PARALLEL DO
847
845
do thread= 1 ,nThreads
848
- call atm_rk_integration_setup(state, diag, &
846
+ call atm_rk_integration_setup(state, diag, nVertLevels, num_scalars, &
849
847
cellThreadStart(thread), cellThreadEnd(thread), &
850
848
vertexThreadStart(thread), vertexThreadEnd(thread), &
851
849
edgeThreadStart(thread), edgeThreadEnd(thread), &
@@ -1668,16 +1666,17 @@ subroutine advance_scalars(field_name, domain, rk_step, rk_timestep, config_mono
1668
1666
end subroutine advance_scalars
1669
1667
1670
1668
1671
- subroutine atm_rk_integration_setup ( state , diag , &
1669
+ subroutine atm_rk_integration_setup ( state , diag , nVertLevels , num_scalars , &
1672
1670
cellStart , cellEnd , vertexStart , vertexEnd , edgeStart , edgeEnd , &
1673
1671
cellSolveStart , cellSolveEnd , vertexSolveStart , vertexSolveEnd , edgeSolveStart , edgeSolveEnd )
1674
1672
1675
1673
implicit none
1676
1674
1677
1675
type (mpas_pool_type), intent (inout ) :: state
1678
1676
type (mpas_pool_type), intent (inout ) :: diag
1679
- integer , intent (in ) :: cellStart, cellEnd, vertexStart, vertexEnd, edgeStart, edgeEnd
1677
+ integer , intent (in ) :: nVertLevels, num_scalars, cellStart, cellEnd, vertexStart, vertexEnd, edgeStart, edgeEnd
1680
1678
integer , intent (in ) :: cellSolveStart, cellSolveEnd, vertexSolveStart, vertexSolveEnd, edgeSolveStart, edgeSolveEnd
1679
+ integer :: iCell, iEdge, j, k
1681
1680
1682
1681
real (kind= RKIND), dimension (:,:), pointer :: ru
1683
1682
real (kind= RKIND), dimension (:,:), pointer :: ru_save
@@ -1716,17 +1715,65 @@ subroutine atm_rk_integration_setup( state, diag, &
1716
1715
call mpas_pool_get_array(state, ' scalars' , scalars_1, 1 )
1717
1716
call mpas_pool_get_array(state, ' scalars' , scalars_2, 2 )
1718
1717
1719
- ru_save(:,edgeStart:edgeEnd) = ru(:,edgeStart:edgeEnd)
1720
- rw_save(:,cellStart:cellEnd) = rw(:,cellStart:cellEnd)
1721
- rtheta_p_save(:,cellStart:cellEnd) = rtheta_p(:,cellStart:cellEnd)
1722
- rho_p_save(:,cellStart:cellEnd) = rho_p(:,cellStart:cellEnd)
1723
-
1724
- u_2(:,edgeStart:edgeEnd) = u_1(:,edgeStart:edgeEnd)
1725
- w_2(:,cellStart:cellEnd) = w_1(:,cellStart:cellEnd)
1726
- theta_m_2(:,cellStart:cellEnd) = theta_m_1(:,cellStart:cellEnd)
1727
- rho_zz_2(:,cellStart:cellEnd) = rho_zz_1(:,cellStart:cellEnd)
1728
- rho_zz_old_split(:,cellStart:cellEnd) = rho_zz_1(:,cellStart:cellEnd)
1729
- scalars_2(:,:,cellStart:cellEnd) = scalars_1(:,:,cellStart:cellEnd)
1718
+ MPAS_ACC_TIMER_START(' atm_rk_integration_setup [ACC_data_xfer]' )
1719
+ !$acc enter data create(ru_save, u_2, rw_save, rtheta_p_save, rho_p_save, &
1720
+ !$acc w_2, theta_m_2, rho_zz_2, rho_zz_old_split, scalars_2) &
1721
+ !$acc copyin(ru, rw, rtheta_p, rho_p, u_1, w_1, theta_m_1, &
1722
+ !$acc rho_zz_1, scalars_1)
1723
+ MPAS_ACC_TIMER_STOP(' atm_rk_integration_setup [ACC_data_xfer]' )
1724
+
1725
+ !$acc kernels
1726
+ theta_m_2(:,cellEnd+1 ) = 0.0_RKIND
1727
+ !$acc end kernels
1728
+
1729
+ !$acc parallel default(present)
1730
+ !$acc loop gang worker
1731
+ do iEdge = edgeStart,edgeEnd
1732
+ !$acc loop vector
1733
+ do k = 1 ,nVertLevels
1734
+ ru_save(k,iEdge) = ru(k,iEdge)
1735
+ u_2(k,iEdge) = u_1(k,iEdge)
1736
+ end do
1737
+ end do
1738
+
1739
+ !$acc loop gang worker
1740
+ do iCell = cellStart,cellEnd
1741
+ !$acc loop vector
1742
+ do k = 1 ,nVertLevels
1743
+ rtheta_p_save(k,iCell) = rtheta_p(k,iCell)
1744
+ rho_p_save(k,iCell) = rho_p(k,iCell)
1745
+ theta_m_2(k,iCell) = theta_m_1(k,iCell)
1746
+ rho_zz_2(k,iCell) = rho_zz_1(k,iCell)
1747
+ rho_zz_old_split(k,iCell) = rho_zz_1(k,iCell)
1748
+ end do
1749
+ end do
1750
+
1751
+ !$acc loop gang worker
1752
+ do iCell = cellStart,cellEnd
1753
+ !$acc loop vector
1754
+ do k = 1 ,nVertLevels+1
1755
+ rw_save(k,iCell) = rw(k,iCell)
1756
+ w_2(k,iCell) = w_1(k,iCell)
1757
+ end do
1758
+ end do
1759
+
1760
+ !$acc loop gang worker
1761
+ do iCell = cellStart,cellEnd
1762
+ !$acc loop vector collapse(2 )
1763
+ do k = 1 ,nVertLevels
1764
+ do j = 1 ,num_scalars
1765
+ scalars_2(j,k,iCell) = scalars_1(j,k,iCell)
1766
+ end do
1767
+ end do
1768
+ end do
1769
+ !$acc end parallel
1770
+
1771
+ MPAS_ACC_TIMER_START(' atm_rk_integration_setup [ACC_data_xfer]' )
1772
+ !$acc exit data copyout(ru_save, rw_save, rtheta_p_save, rho_p_save, u_2, &
1773
+ !$acc w_2, theta_m_2, rho_zz_2, rho_zz_old_split, scalars_2) &
1774
+ !$acc delete(ru, rw, rtheta_p, rho_p, u_1, w_1, theta_m_1, &
1775
+ !$acc rho_zz_1, scalars_1)
1776
+ MPAS_ACC_TIMER_STOP(' atm_rk_integration_setup [ACC_data_xfer]' )
1730
1777
1731
1778
end subroutine atm_rk_integration_setup
1732
1779
0 commit comments