@@ -229,6 +229,8 @@ subroutine mpas_atm_dynamics_init(domain)
229
229
real (kind= RKIND), dimension (:), pointer :: fEdge
230
230
real (kind= RKIND), dimension (:), pointer :: fVertex
231
231
real (kind= RKIND), dimension (:,:), pointer :: zz
232
+ real (kind= RKIND), dimension (:), pointer :: rdzw
233
+ real (kind= RKIND), dimension (:), pointer :: rdzu
232
234
real (kind= RKIND), dimension (:,:,:), pointer :: zb_cell
233
235
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
234
236
real (kind= RKIND), dimension (:), pointer :: fzm
@@ -344,6 +346,12 @@ subroutine mpas_atm_dynamics_init(domain)
344
346
call mpas_pool_get_array(mesh, ' zz' , zz)
345
347
!$acc enter data copyin(zz)
346
348
349
+ call mpas_pool_get_array(mesh, ' rdzw' , rdzw)
350
+ !$acc enter data copyin(rdzw)
351
+
352
+ call mpas_pool_get_array(mesh, ' rdzu' , rdzu)
353
+ !$acc enter data copyin(rdzu)
354
+
347
355
call mpas_pool_get_array(mesh, ' zb_cell' , zb_cell)
348
356
!$acc enter data copyin(zb_cell)
349
357
@@ -421,6 +429,8 @@ subroutine mpas_atm_dynamics_finalize(domain)
421
429
real (kind= RKIND), dimension (:), pointer :: fEdge
422
430
real (kind= RKIND), dimension (:), pointer :: fVertex
423
431
real (kind= RKIND), dimension (:,:), pointer :: zz
432
+ real (kind= RKIND), dimension (:), pointer :: rdzw
433
+ real (kind= RKIND), dimension (:), pointer :: rdzu
424
434
real (kind= RKIND), dimension (:,:,:), pointer :: zb_cell
425
435
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
426
436
real (kind= RKIND), dimension (:), pointer :: fzm
@@ -536,6 +546,12 @@ subroutine mpas_atm_dynamics_finalize(domain)
536
546
call mpas_pool_get_array(mesh, ' zz' , zz)
537
547
!$acc exit data delete(zz)
538
548
549
+ call mpas_pool_get_array(mesh, ' rdzw' , rdzw)
550
+ !$acc exit data delete(rdzw)
551
+
552
+ call mpas_pool_get_array(mesh, ' rdzu' , rdzu)
553
+ !$acc exit data delete(rdzu)
554
+
539
555
call mpas_pool_get_array(mesh, ' zb_cell' , zb_cell)
540
556
!$acc exit data delete(zb_cell)
541
557
@@ -2012,32 +2028,45 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
2012
2028
real (kind= RKIND) :: dtseps, c2, qtotal, rcv
2013
2029
real (kind= RKIND), dimension ( nVertLevels ) :: b_tri, c_tri
2014
2030
2031
+ MPAS_ACC_TIMER_START(' atm_compute_vert_imp_coefs_work [ACC_data_xfer]' )
2032
+ !$acc enter data copyin(cqw, p, t, qtot, rb, rtb, rt, pb)
2033
+ !$acc enter data create(cofrz, cofwr, cofwz, coftz, cofwt, a_tri, b_tri, &
2034
+ !$acc c_tri, alpha_tri, gamma_tri)
2035
+ MPAS_ACC_TIMER_STOP(' atm_compute_vert_imp_coefs_work [ACC_data_xfer]' )
2015
2036
2016
2037
! set coefficients
2017
2038
dtseps = .5 * dts* (1 .+ epssm)
2018
2039
rcv = rgas/ (cp- rgas)
2019
2040
c2 = cp* rcv
2020
2041
2042
+ !$acc parallel default(present)
2043
+ !$acc loop gang worker
2021
2044
! MGD bad to have all threads setting this variable?
2022
2045
do k= 1 ,nVertLevels
2023
2046
cofrz(k) = dtseps* rdzw(k)
2024
2047
end do
2048
+ !$acc end parallel
2025
2049
2050
+ !$acc parallel default(present)
2051
+ !$acc loop gang worker private(b_tri,c_tri)
2026
2052
do iCell = cellSolveStart,cellSolveEnd ! we only need to do cells we are solving for, not halo cells
2027
2053
2028
2054
!DIR$ IVDEP
2055
+ !$acc loop vector
2029
2056
do k= 2 ,nVertLevels
2030
2057
cofwr(k,iCell) = .5 * dtseps* gravity* (fzm(k)* zz(k,iCell)+ fzp(k)* zz(k-1 ,iCell))
2031
2058
end do
2032
2059
coftz(1 ,iCell) = 0.0
2033
2060
!DIR$ IVDEP
2061
+ !$acc loop vector
2034
2062
do k= 2 ,nVertLevels
2035
2063
cofwz(k,iCell) = dtseps* c2* (fzm(k)* zz(k,iCell)+ fzp(k)* zz(k-1 ,iCell)) &
2036
2064
* rdzu(k)* cqw(k,iCell)* (fzm(k)* p (k,iCell)+ fzp(k)* p (k-1 ,iCell))
2037
2065
coftz(k,iCell) = dtseps* (fzm(k)* t (k,iCell)+ fzp(k)* t (k-1 ,iCell))
2038
2066
end do
2039
2067
coftz(nVertLevels+1 ,iCell) = 0.0
2040
2068
!DIR$ IVDEP
2069
+ !$acc loop vector
2041
2070
do k= 1 ,nVertLevels
2042
2071
2043
2072
! qtotal = 0 .
@@ -2058,6 +2087,7 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
2058
2087
alpha_tri(1 ,iCell) = 0 . ! note, this value is never used
2059
2088
2060
2089
!DIR$ IVDEP
2090
+ !$acc loop vector
2061
2091
do k= 2 ,nVertLevels
2062
2092
a_tri(k,iCell) = - cofwz(k ,iCell)* coftz(k-1 ,iCell)* rdzw(k-1 )* zz(k-1 ,iCell) &
2063
2093
+ cofwr(k ,iCell)* cofrz(k-1 ) &
@@ -2073,12 +2103,20 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
2073
2103
+ cofwt(k ,iCell)* coftz(k+1 ,iCell)* rdzw(k )
2074
2104
end do
2075
2105
!MGD VECTOR DEPENDENCE
2106
+ !$acc loop seq
2076
2107
do k= 2 ,nVertLevels
2077
2108
alpha_tri(k,iCell) = 1 ./ (b_tri(k)- a_tri(k,iCell)* gamma_tri(k-1 ,iCell))
2078
2109
gamma_tri(k,iCell) = c_tri(k)* alpha_tri(k,iCell)
2079
2110
end do
2080
2111
2081
2112
end do ! loop over cells
2113
+ !$acc end parallel
2114
+
2115
+ MPAS_ACC_TIMER_START(' atm_compute_vert_imp_coefs_work [ACC_data_xfer]' )
2116
+ !$acc exit data copyout(cofrz, cofwr, cofwz, coftz, cofwt, a_tri, b_tri, &
2117
+ !$acc c_tri, alpha_tri, gamma_tri)
2118
+ !$acc exit data delete(cqw, p, t, qtot, rb, rtb, rt, pb)
2119
+ MPAS_ACC_TIMER_STOP(' atm_compute_vert_imp_coefs_work [ACC_data_xfer]' )
2082
2120
2083
2121
end subroutine atm_compute_vert_imp_coefs_work
2084
2122
0 commit comments