@@ -236,6 +236,8 @@ subroutine mpas_atm_dynamics_init(domain)
236
236
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
237
237
real (kind= RKIND), dimension (:), pointer :: fzm
238
238
real (kind= RKIND), dimension (:), pointer :: fzp
239
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb
240
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb3
239
241
#endif
240
242
241
243
@@ -368,6 +370,12 @@ subroutine mpas_atm_dynamics_init(domain)
368
370
call mpas_pool_get_array(mesh, ' fzp' , fzp)
369
371
!$acc enter data copyin(fzp)
370
372
373
+ call mpas_pool_get_array(mesh, ' zb' , zb)
374
+ !$acc enter data copyin(zb)
375
+
376
+ call mpas_pool_get_array(mesh, ' zb3' , zb3)
377
+ !$acc enter data copyin(zb3)
378
+
371
379
#endif
372
380
373
381
end subroutine mpas_atm_dynamics_init
@@ -440,6 +448,8 @@ subroutine mpas_atm_dynamics_finalize(domain)
440
448
real (kind= RKIND), dimension (:,:,:), pointer :: zb3_cell
441
449
real (kind= RKIND), dimension (:), pointer :: fzm
442
450
real (kind= RKIND), dimension (:), pointer :: fzp
451
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb
452
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb3
443
453
#endif
444
454
445
455
@@ -571,6 +581,13 @@ subroutine mpas_atm_dynamics_finalize(domain)
571
581
572
582
call mpas_pool_get_array(mesh, ' fzp' , fzp)
573
583
!$acc exit data delete(fzp)
584
+
585
+ call mpas_pool_get_array(mesh, ' zb' , zb)
586
+ !$acc exit data delete(zb)
587
+
588
+ call mpas_pool_get_array(mesh, ' zb3' , zb3)
589
+ !$acc exit data delete(zb3)
590
+
574
591
#endif
575
592
576
593
end subroutine mpas_atm_dynamics_finalize
@@ -2780,7 +2797,7 @@ subroutine atm_recover_large_step_variables( state, diag, tend, mesh, configs, d
2780
2797
cellStart, cellEnd, vertexStart, vertexEnd, edgeStart, edgeEnd, &
2781
2798
cellSolveStart, cellSolveEnd, vertexSolveStart, vertexSolveEnd, edgeSolveStart, edgeSolveEnd)
2782
2799
2783
- ! reconstitute state variables from acoustic-step perturbation variables
2800
+ ! reconstitute state variables from acoustic-step perturbation variables
2784
2801
! after the acoustic steps. The perturbation variables were originally set in
2785
2802
! subroutine atm_set_smlstep_pert_variables prior to their acoustic-steps update.
2786
2803
! we are also computing a few other state-derived variables here.
@@ -2910,7 +2927,7 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2910
2927
real (kind=RKIND), intent(in) :: dt
2911
2928
2912
2929
integer, dimension(nCells+1), intent(in) :: bdyMaskCell
2913
-
2930
+
2914
2931
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: wwAvg
2915
2932
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: rw_save
2916
2933
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: w
@@ -2961,45 +2978,70 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2961
2978
integer :: i, iCell, iEdge, k, cell1, cell2
2962
2979
real (kind=RKIND) :: invNs, rcv, p0, flux
2963
2980
2981
+ MPAS_ACC_TIMER_START(' atm_recover_large_step_variables [ACC_data_xfer]' )
2982
+ !$acc enter data copyin(rho_p_save,rho_pp,rho_base,rw_save,rw_p, &
2983
+ !$acc rtheta_p_save,rtheta_pp,rtheta_base, &
2984
+ !$acc ru_save,ru_p,wwAvg,ruAvg) &
2985
+ !$acc create(rho_zz,rho_p,rw,w,rtheta_p,theta_m, &
2986
+ !$acc ru,u)
2987
+ if (rk_step == 3) then
2988
+ !$acc enter data copyin(rt_diabatic_tend,exner_base) &
2989
+ !$acc create(exner,pressure_p)
2990
+ end if
2991
+ MPAS_ACC_TIMER_STOP(' atm_recover_large_step_variables [ACC_data_xfer]' )
2964
2992
2965
2993
rcv = rgas/(cp-rgas)
2966
2994
p0 = 1.0e+05 ! this should come from somewhere else...
2967
2995
2968
- ! Avoid FP errors caused by a potential division by zero below by
2996
+ ! Avoid FP errors caused by a potential division by zero below by
2969
2997
! initializing the "garbage cell" of rho_zz to a non-zero value
2998
+ !$acc parallel default(present)
2999
+ !$acc loop gang vector
2970
3000
do k=1,nVertLevels
2971
3001
rho_zz(k,nCells+1) = 1.0
2972
3002
end do
3003
+ !$acc end parallel
2973
3004
2974
3005
! compute new density everywhere so we can compute u from ru.
2975
3006
! we will also need it to compute theta_m below
2976
3007
2977
3008
invNs = 1 / real(ns,RKIND)
2978
3009
3010
+ !$acc parallel default(present)
3011
+ !$acc loop gang worker
2979
3012
do iCell=cellStart,cellEnd
2980
3013
2981
3014
!DIR$ IVDEP
3015
+ !$acc loop vector
2982
3016
do k = 1, nVertLevels
2983
3017
rho_p(k,iCell) = rho_p_save(k,iCell) + rho_pp(k,iCell)
2984
3018
2985
3019
rho_zz(k,iCell) = rho_p(k,iCell) + rho_base(k,iCell)
2986
3020
end do
2987
3021
3022
+ rw(1,iCell) = 0.0
2988
3023
w(1,iCell) = 0.0
2989
3024
2990
3025
!DIR$ IVDEP
3026
+ !$acc loop vector
2991
3027
do k = 2, nVertLevels
2992
3028
wwAvg(k,iCell) = rw_save(k,iCell) + (wwAvg(k,iCell) * invNs)
2993
3029
rw(k,iCell) = rw_save(k,iCell) + rw_p(k,iCell)
2994
3030
2995
3031
! pick up part of diagnosed w from omega - divide by density later
2996
3032
w(k,iCell) = rw(k,iCell)/(fzm(k)*zz(k,iCell)+fzp(k)*zz(k-1,iCell))
2997
-
3033
+
2998
3034
end do
2999
3035
3036
+ rw(nVertLevels+1,iCell) = 0.0
3000
3037
w(nVertLevels+1,iCell) = 0.0
3038
+ end do
3039
+ !$acc end parallel
3001
3040
3002
- if (rk_step == 3) then
3041
+ if (rk_step == 3) then
3042
+ !$acc parallel default(present)
3043
+ !$acc loop collapse(2)
3044
+ do iCell=cellStart,cellEnd
3003
3045
!DIR$ IVDEP
3004
3046
do k = 1, nVertLevels
3005
3047
rtheta_p(k,iCell) = rtheta_p_save(k,iCell) + rtheta_pp(k,iCell) &
@@ -3010,37 +3052,48 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
3010
3052
pressure_p(k,iCell) = zz(k,iCell) * rgas * (exner(k,iCell)*rtheta_p(k,iCell)+rtheta_base(k,iCell) &
3011
3053
* (exner(k,iCell)-exner_base(k,iCell)))
3012
3054
end do
3013
- else
3055
+ end do
3056
+ !$acc end parallel
3057
+ else
3058
+ !$acc parallel default(present)
3059
+ !$acc loop collapse(2)
3060
+ do iCell=cellStart,cellEnd
3014
3061
!DIR$ IVDEP
3015
3062
do k = 1, nVertLevels
3016
3063
rtheta_p(k,iCell) = rtheta_p_save(k,iCell) + rtheta_pp(k,iCell)
3017
3064
theta_m(k,iCell) = (rtheta_p(k,iCell) + rtheta_base(k,iCell))/rho_zz(k,iCell)
3018
3065
end do
3019
- end if
3020
-
3021
- end do
3066
+ end do
3067
+ !$acc end parallel
3068
+ end if
3022
3069
3023
- ! recover time-averaged ruAvg on all edges of owned cells (for upcoming scalar transport).
3024
- ! we solved for these in the acoustic-step loop.
3070
+ ! recover time-averaged ruAvg on all edges of owned cells (for upcoming scalar transport).
3071
+ ! we solved for these in the acoustic-step loop.
3025
3072
! we will compute ru and u here also, given we are here, even though we only need them on nEdgesSolve
3026
3073
3027
3074
!$OMP BARRIER
3028
3075
3076
+ !$acc parallel default(present)
3077
+ !$acc loop gang worker
3029
3078
do iEdge=edgeStart,edgeEnd
3030
3079
3031
3080
cell1 = cellsOnEdge(1,iEdge)
3032
3081
cell2 = cellsOnEdge(2,iEdge)
3033
3082
3034
3083
!DIR$ IVDEP
3084
+ !$acc loop vector
3035
3085
do k = 1, nVertLevels
3036
3086
ruAvg(k,iEdge) = ru_save(k,iEdge) + (ruAvg(k,iEdge) * invNs)
3037
3087
ru(k,iEdge) = ru_save(k,iEdge) + ru_p(k,iEdge)
3038
3088
u(k,iEdge) = 2.*ru(k,iEdge)/(rho_zz(k,cell1)+rho_zz(k,cell2))
3039
3089
end do
3040
3090
end do
3091
+ !$acc end parallel
3041
3092
3042
3093
!$OMP BARRIER
3043
3094
3095
+ !$acc parallel default(present)
3096
+ !$acc loop gang worker
3044
3097
do iCell=cellStart,cellEnd
3045
3098
3046
3099
! finish recovering w from (rho*omega)_p. as when we formed (rho*omega)_p from u and w, we need
@@ -3049,33 +3102,49 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
3049
3102
3050
3103
if (bdyMaskCell(iCell) <= nRelaxZone) then ! addition for regional_MPAS, no spec zone update
3051
3104
3052
- do i=1,nEdgesOnCell(iCell)
3053
- iEdge=edgesOnCell(i,iCell)
3105
+ !$acc loop seq
3106
+ do i=1,nEdgesOnCell(iCell)
3107
+ iEdge=edgesOnCell(i,iCell)
3054
3108
3055
- flux = (cf1*ru(1,iEdge) + cf2*ru(2,iEdge) + cf3*ru(3,iEdge))
3056
- w(1,iCell) = w(1,iCell) + edgesOnCell_sign(i,iCell) * &
3057
- (zb_cell(1,i,iCell) + sign(1.0_RKIND,flux)*zb3_cell(1,i,iCell))*flux
3109
+ flux = (cf1*ru(1,iEdge) + cf2*ru(2,iEdge) + cf3*ru(3,iEdge))
3110
+ w(1,iCell) = w(1,iCell) + edgesOnCell_sign(i,iCell) * &
3111
+ (zb_cell(1,i,iCell) + sign(1.0_RKIND,flux)*zb3_cell(1,i,iCell))*flux
3058
3112
3059
3113
!DIR$ IVDEP
3060
- do k = 2, nVertLevels
3061
- flux = (fzm(k)*ru(k,iEdge)+fzp(k)*ru(k-1,iEdge))
3062
- w(k,iCell) = w(k,iCell) + edgesOnCell_sign(i,iCell) * &
3063
- (zb_cell(k,i,iCell)+sign(1.0_RKIND,flux)*zb3_cell(k,i,iCell))*flux
3064
- end do
3114
+ !$acc loop vector
3115
+ do k = 2, nVertLevels
3116
+ flux = (fzm(k)*ru(k,iEdge)+fzp(k)*ru(k-1,iEdge))
3117
+ w(k,iCell) = w(k,iCell) + edgesOnCell_sign(i,iCell) * &
3118
+ (zb_cell(k,i,iCell)+sign(1.0_RKIND,flux)*zb3_cell(k,i,iCell))*flux
3119
+ end do
3065
3120
3066
- end do
3121
+ end do
3067
3122
3068
- w(1,iCell) = w(1,iCell)/(cf1*rho_zz(1,iCell)+cf2*rho_zz(2,iCell)+cf3*rho_zz(3,iCell))
3123
+ w(1,iCell) = w(1,iCell)/(cf1*rho_zz(1,iCell)+cf2*rho_zz(2,iCell)+cf3*rho_zz(3,iCell))
3069
3124
3070
3125
3071
- !DIR$ IVDEP
3072
- do k = 2, nVertLevels
3073
- w(k,iCell) = w(k,iCell)/(fzm(k)*rho_zz(k,iCell)+fzp(k)*rho_zz(k-1,iCell))
3074
- end do
3126
+ !DIR$ IVDEP
3127
+ !$acc loop vector
3128
+ do k = 2, nVertLevels
3129
+ w(k,iCell) = w(k,iCell)/(fzm(k)*rho_zz(k,iCell)+fzp(k)*rho_zz(k-1,iCell))
3130
+ end do
3075
3131
3076
3132
end if ! addition for regional_MPAS, no spec zone update
3077
3133
3078
3134
end do
3135
+ !$acc end parallel
3136
+
3137
+ MPAS_ACC_TIMER_START(' atm_recover_large_step_variables [ACC_data_xfer]' )
3138
+ !$acc exit data delete(rho_p_save,rho_pp,rho_base,rw_save,rw_p, &
3139
+ !$acc rtheta_p_save,rtheta_pp,rtheta_base, &
3140
+ !$acc ru_save,ru_p) &
3141
+ !$acc copyout(rho_zz,rho_p,rw,w,rtheta_p,theta_m, &
3142
+ !$acc ru,u,wwAvg,ruAvg)
3143
+ if (rk_step == 3) then
3144
+ !$acc exit data delete(rt_diabatic_tend,exner_base) &
3145
+ !$acc copyout(exner,pressure_p)
3146
+ end if
3147
+ MPAS_ACC_TIMER_STOP(' atm_recover_large_step_variables [ACC_data_xfer]' )
3079
3148
3080
3149
end subroutine atm_recover_large_step_variables_work
3081
3150
0 commit comments