@@ -1795,59 +1795,92 @@ subroutine atm_compute_moist_coefficients( dims, state, diag, mesh, &
1795
1795
integer , intent (in ) :: cellSolveStart, cellSolveEnd, vertexSolveStart, vertexSolveEnd, edgeSolveStart, edgeSolveEnd
1796
1796
1797
1797
integer :: iEdge, iCell, k, cell1, cell2, iq
1798
- integer , pointer :: nCells, nEdges, nVertLevels, nCellsSolve
1798
+ integer , pointer :: nCells_ptr, nEdges_ptr, nVertLevels_ptr, nCellsSolve_ptr
1799
+ integer :: nCells, nEdges, nVertLevels, nCellsSolve
1799
1800
real (kind= RKIND) :: qtotal
1800
1801
integer , dimension (:,:), pointer :: cellsOnEdge
1801
- integer , pointer :: moist_start, moist_end
1802
+ integer , pointer :: moist_start_ptr, moist_end_ptr
1803
+ integer :: moist_start, moist_end
1802
1804
real (kind= RKIND), dimension (:,:,:), pointer :: scalars
1803
1805
real (kind= RKIND), dimension (:,:), pointer :: cqw
1804
1806
real (kind= RKIND), dimension (:,:), pointer :: cqu
1805
1807
1806
- call mpas_pool_get_dimension(dims, ' nCells' , nCells )
1807
- call mpas_pool_get_dimension(dims, ' nEdges' , nEdges )
1808
- call mpas_pool_get_dimension(dims, ' nVertLevels' , nVertLevels )
1809
- call mpas_pool_get_dimension(dims, ' nCellsSolve' , nCellsSolve )
1810
- call mpas_pool_get_dimension(state, ' moist_start' , moist_start )
1811
- call mpas_pool_get_dimension(state, ' moist_end' , moist_end )
1808
+ call mpas_pool_get_dimension(dims, ' nCells' , nCells_ptr )
1809
+ call mpas_pool_get_dimension(dims, ' nEdges' , nEdges_ptr )
1810
+ call mpas_pool_get_dimension(dims, ' nVertLevels' , nVertLevels_ptr )
1811
+ call mpas_pool_get_dimension(dims, ' nCellsSolve' , nCellsSolve_ptr )
1812
+ call mpas_pool_get_dimension(state, ' moist_start' , moist_start_ptr )
1813
+ call mpas_pool_get_dimension(state, ' moist_end' , moist_end_ptr )
1812
1814
1813
1815
call mpas_pool_get_array(mesh, ' cellsOnEdge' , cellsOnEdge)
1814
1816
call mpas_pool_get_array(state, ' scalars' , scalars, 2 )
1815
1817
call mpas_pool_get_array(diag, ' cqw' , cqw)
1816
1818
call mpas_pool_get_array(diag, ' cqu' , cqu)
1817
1819
1820
+ nCells = nCells_ptr
1821
+ nEdges = nEdges_ptr
1822
+ nVertLevels = nVertLevels_ptr
1823
+ nCellsSolve = nCellsSolve_ptr
1824
+ moist_start = moist_start_ptr
1825
+ moist_end = moist_end_ptr
1826
+
1827
+ MPAS_ACC_TIMER_START(' atm_compute_moist_coefficients [ACC_data_xfer]' )
1828
+ !$acc enter data create(qtot, cqw, cqu) &
1829
+ !$acc copyin(scalars)
1830
+ MPAS_ACC_TIMER_STOP(' atm_compute_moist_coefficients [ACC_data_xfer]' )
1831
+
1832
+ !$acc parallel default(present)
1833
+ !$acc loop gang worker
1818
1834
! do iCell = cellSolveStart,cellSolveEnd
1819
1835
do iCell = cellStart,cellEnd
1820
- qtot( 1 :nVertLevels,iCell) = 0.0
1836
+ !$acc loop vector
1821
1837
do k = 1 ,nVertLevels
1838
+ qtot(k,iCell) = 0.0
1839
+ !$acc loop seq
1822
1840
do iq = moist_start, moist_end
1823
1841
qtot(k,iCell) = qtot(k,iCell) + scalars(iq, k, iCell)
1824
1842
end do
1825
1843
end do
1826
1844
end do
1845
+ !$acc end parallel
1827
1846
1828
1847
! do iCell = cellSolveStart,cellSolveEnd
1848
+ !$acc parallel default(present)
1849
+ !$acc loop gang worker
1829
1850
do iCell = cellStart,cellEnd
1851
+ !$acc loop vector
1830
1852
do k = 2 , nVertLevels
1831
1853
qtotal = 0.5 * (qtot(k,iCell)+ qtot(k-1 ,iCell))
1832
1854
cqw(k,iCell) = 1.0 / (1.0 + qtotal)
1833
1855
end do
1834
1856
end do
1857
+ !$acc end parallel
1835
1858
1836
1859
! would need to compute qtot for all cells and an openmp barrier to use qtot below.
1837
1860
1861
+ !$acc parallel default(present)
1862
+ !$acc loop gang worker
1838
1863
do iEdge = edgeStart,edgeEnd
1839
1864
cell1 = cellsOnEdge(1 ,iEdge)
1840
1865
cell2 = cellsOnEdge(2 ,iEdge)
1841
1866
if (cell1 <= nCellsSolve .or. cell2 <= nCellsSolve) then
1842
- do k = 1 , nVertLevels
1867
+ !$acc loop vector
1868
+ do k = 1 , nVertLevels
1843
1869
qtotal = 0.0
1870
+ !$acc loop seq
1844
1871
do iq = moist_start, moist_end
1845
1872
qtotal = qtotal + 0.5 * ( scalars(iq, k, cell1) + scalars(iq, k, cell2) )
1846
1873
end do
1847
1874
cqu(k,iEdge) = 1.0 / (1.0 + qtotal)
1848
1875
end do
1849
1876
end if
1850
1877
end do
1878
+ !$acc end parallel
1879
+
1880
+ MPAS_ACC_TIMER_START(' atm_compute_moist_coefficients [ACC_data_xfer]' )
1881
+ !$acc exit data copyout(cqw, cqu, qtot) &
1882
+ !$acc delete(scalars)
1883
+ MPAS_ACC_TIMER_STOP(' atm_compute_moist_coefficients [ACC_data_xfer]' )
1851
1884
1852
1885
end subroutine atm_compute_moist_coefficients
1853
1886
0 commit comments