@@ -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 :: zb
237
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb3
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, ' zb' , zb)
362
+ !$acc enter data copyin(zb)
363
+
364
+ call mpas_pool_get_array(mesh, ' zb3' , zb3)
365
+ !$acc enter data copyin(zb3)
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 :: zb
437
+ real (kind= RKIND), dimension (:,:,:), pointer :: zb3
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, ' zb' , zb)
562
+ !$acc exit data delete(zb)
563
+
564
+ call mpas_pool_get_array(mesh, ' zb3' , zb3)
565
+ !$acc exit data delete(zb3)
566
+
550
567
#endif
551
568
552
569
end subroutine mpas_atm_dynamics_finalize
@@ -2682,7 +2699,7 @@ subroutine atm_recover_large_step_variables( state, diag, tend, mesh, configs, d
2682
2699
cellStart, cellEnd, vertexStart, vertexEnd, edgeStart, edgeEnd, &
2683
2700
cellSolveStart, cellSolveEnd, vertexSolveStart, vertexSolveEnd, edgeSolveStart, edgeSolveEnd)
2684
2701
2685
- ! reconstitute state variables from acoustic-step perturbation variables
2702
+ ! reconstitute state variables from acoustic-step perturbation variables
2686
2703
! after the acoustic steps. The perturbation variables were originally set in
2687
2704
! subroutine atm_set_smlstep_pert_variables prior to their acoustic-steps update.
2688
2705
! we are also computing a few other state-derived variables here.
@@ -2812,7 +2829,7 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2812
2829
real (kind=RKIND), intent(in) :: dt
2813
2830
2814
2831
integer, dimension(nCells+1), intent(in) :: bdyMaskCell
2815
-
2832
+
2816
2833
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: wwAvg
2817
2834
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: rw_save
2818
2835
real (kind=RKIND), dimension(nVertLevels+1,nCells+1) :: w
@@ -2863,45 +2880,70 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2863
2880
integer :: i, iCell, iEdge, k, cell1, cell2
2864
2881
real (kind=RKIND) :: invNs, rcv, p0, flux
2865
2882
2883
+ MPAS_ACC_TIMER_START(' atm_recover_large_step_variables [ACC_data_xfer]' )
2884
+ !$acc enter data copyin(rho_p_save,rho_pp,rho_base,rw_save,rw_p, &
2885
+ !$acc rtheta_p_save,rtheta_pp,rtheta_base, &
2886
+ !$acc ru_save,ru_p,wwAvg,ruAvg) &
2887
+ !$acc create(rho_zz,rho_p,rw,w,rtheta_p,theta_m, &
2888
+ !$acc ru,u)
2889
+ if (rk_step == 3) then
2890
+ !$acc enter data copyin(rt_diabatic_tend,exner_base) &
2891
+ !$acc create(exner,pressure_p)
2892
+ end if
2893
+ MPAS_ACC_TIMER_STOP(' atm_recover_large_step_variables [ACC_data_xfer]' )
2866
2894
2867
2895
rcv = rgas/(cp-rgas)
2868
2896
p0 = 1.0e+05 ! this should come from somewhere else...
2869
2897
2870
- ! Avoid FP errors caused by a potential division by zero below by
2898
+ ! Avoid FP errors caused by a potential division by zero below by
2871
2899
! initializing the "garbage cell" of rho_zz to a non-zero value
2900
+ !$acc parallel default(present)
2901
+ !$acc loop gang vector
2872
2902
do k=1,nVertLevels
2873
2903
rho_zz(k,nCells+1) = 1.0
2874
2904
end do
2905
+ !$acc end parallel
2875
2906
2876
2907
! compute new density everywhere so we can compute u from ru.
2877
2908
! we will also need it to compute theta_m below
2878
2909
2879
2910
invNs = 1 / real(ns,RKIND)
2880
2911
2912
+ !$acc parallel default(present)
2913
+ !$acc loop gang worker
2881
2914
do iCell=cellStart,cellEnd
2882
2915
2883
2916
!DIR$ IVDEP
2917
+ !$acc loop vector
2884
2918
do k = 1, nVertLevels
2885
2919
rho_p(k,iCell) = rho_p_save(k,iCell) + rho_pp(k,iCell)
2886
2920
2887
2921
rho_zz(k,iCell) = rho_p(k,iCell) + rho_base(k,iCell)
2888
2922
end do
2889
2923
2924
+ rw(1,iCell) = 0.0
2890
2925
w(1,iCell) = 0.0
2891
2926
2892
2927
!DIR$ IVDEP
2928
+ !$acc loop vector
2893
2929
do k = 2, nVertLevels
2894
2930
wwAvg(k,iCell) = rw_save(k,iCell) + (wwAvg(k,iCell) * invNs)
2895
2931
rw(k,iCell) = rw_save(k,iCell) + rw_p(k,iCell)
2896
2932
2897
2933
! pick up part of diagnosed w from omega - divide by density later
2898
2934
w(k,iCell) = rw(k,iCell)/(fzm(k)*zz(k,iCell)+fzp(k)*zz(k-1,iCell))
2899
-
2935
+
2900
2936
end do
2901
2937
2938
+ rw(nVertLevels+1,iCell) = 0.0
2902
2939
w(nVertLevels+1,iCell) = 0.0
2940
+ end do
2941
+ !$acc end parallel
2903
2942
2904
- if (rk_step == 3) then
2943
+ if (rk_step == 3) then
2944
+ !$acc parallel default(present)
2945
+ !$acc loop collapse(2)
2946
+ do iCell=cellStart,cellEnd
2905
2947
!DIR$ IVDEP
2906
2948
do k = 1, nVertLevels
2907
2949
rtheta_p(k,iCell) = rtheta_p_save(k,iCell) + rtheta_pp(k,iCell) &
@@ -2912,37 +2954,48 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2912
2954
pressure_p(k,iCell) = zz(k,iCell) * rgas * (exner(k,iCell)*rtheta_p(k,iCell)+rtheta_base(k,iCell) &
2913
2955
* (exner(k,iCell)-exner_base(k,iCell)))
2914
2956
end do
2915
- else
2957
+ end do
2958
+ !$acc end parallel
2959
+ else
2960
+ !$acc parallel default(present)
2961
+ !$acc loop collapse(2)
2962
+ do iCell=cellStart,cellEnd
2916
2963
!DIR$ IVDEP
2917
2964
do k = 1, nVertLevels
2918
2965
rtheta_p(k,iCell) = rtheta_p_save(k,iCell) + rtheta_pp(k,iCell)
2919
2966
theta_m(k,iCell) = (rtheta_p(k,iCell) + rtheta_base(k,iCell))/rho_zz(k,iCell)
2920
2967
end do
2921
- end if
2922
-
2923
- end do
2968
+ end do
2969
+ !$acc end parallel
2970
+ end if
2924
2971
2925
- ! recover time-averaged ruAvg on all edges of owned cells (for upcoming scalar transport).
2926
- ! we solved for these in the acoustic-step loop.
2972
+ ! recover time-averaged ruAvg on all edges of owned cells (for upcoming scalar transport).
2973
+ ! we solved for these in the acoustic-step loop.
2927
2974
! we will compute ru and u here also, given we are here, even though we only need them on nEdgesSolve
2928
2975
2929
2976
!$OMP BARRIER
2930
2977
2978
+ !$acc parallel default(present)
2979
+ !$acc loop gang worker
2931
2980
do iEdge=edgeStart,edgeEnd
2932
2981
2933
2982
cell1 = cellsOnEdge(1,iEdge)
2934
2983
cell2 = cellsOnEdge(2,iEdge)
2935
2984
2936
2985
!DIR$ IVDEP
2986
+ !$acc loop vector
2937
2987
do k = 1, nVertLevels
2938
2988
ruAvg(k,iEdge) = ru_save(k,iEdge) + (ruAvg(k,iEdge) * invNs)
2939
2989
ru(k,iEdge) = ru_save(k,iEdge) + ru_p(k,iEdge)
2940
2990
u(k,iEdge) = 2.*ru(k,iEdge)/(rho_zz(k,cell1)+rho_zz(k,cell2))
2941
2991
end do
2942
2992
end do
2993
+ !$acc end parallel
2943
2994
2944
2995
!$OMP BARRIER
2945
2996
2997
+ !$acc parallel default(present)
2998
+ !$acc loop gang worker
2946
2999
do iCell=cellStart,cellEnd
2947
3000
2948
3001
! finish recovering w from (rho*omega)_p. as when we formed (rho*omega)_p from u and w, we need
@@ -2951,33 +3004,49 @@ subroutine atm_recover_large_step_variables_work(nCells, nEdges, nCellsSolve, nE
2951
3004
2952
3005
if (bdyMaskCell(iCell) <= nRelaxZone) then ! addition for regional_MPAS, no spec zone update
2953
3006
2954
- do i=1,nEdgesOnCell(iCell)
2955
- iEdge=edgesOnCell(i,iCell)
3007
+ !$acc loop seq
3008
+ do i=1,nEdgesOnCell(iCell)
3009
+ iEdge=edgesOnCell(i,iCell)
2956
3010
2957
- flux = (cf1*ru(1,iEdge) + cf2*ru(2,iEdge) + cf3*ru(3,iEdge))
2958
- w(1,iCell) = w(1,iCell) + edgesOnCell_sign(i,iCell) * &
2959
- (zb_cell(1,i,iCell) + sign(1.0_RKIND,flux)*zb3_cell(1,i,iCell))*flux
3011
+ flux = (cf1*ru(1,iEdge) + cf2*ru(2,iEdge) + cf3*ru(3,iEdge))
3012
+ w(1,iCell) = w(1,iCell) + edgesOnCell_sign(i,iCell) * &
3013
+ (zb_cell(1,i,iCell) + sign(1.0_RKIND,flux)*zb3_cell(1,i,iCell))*flux
2960
3014
2961
3015
!DIR$ IVDEP
2962
- do k = 2, nVertLevels
2963
- flux = (fzm(k)*ru(k,iEdge)+fzp(k)*ru(k-1,iEdge))
2964
- w(k,iCell) = w(k,iCell) + edgesOnCell_sign(i,iCell) * &
2965
- (zb_cell(k,i,iCell)+sign(1.0_RKIND,flux)*zb3_cell(k,i,iCell))*flux
2966
- end do
3016
+ !$acc loop vector
3017
+ do k = 2, nVertLevels
3018
+ flux = (fzm(k)*ru(k,iEdge)+fzp(k)*ru(k-1,iEdge))
3019
+ w(k,iCell) = w(k,iCell) + edgesOnCell_sign(i,iCell) * &
3020
+ (zb_cell(k,i,iCell)+sign(1.0_RKIND,flux)*zb3_cell(k,i,iCell))*flux
3021
+ end do
2967
3022
2968
- end do
3023
+ end do
2969
3024
2970
- w(1,iCell) = w(1,iCell)/(cf1*rho_zz(1,iCell)+cf2*rho_zz(2,iCell)+cf3*rho_zz(3,iCell))
3025
+ w(1,iCell) = w(1,iCell)/(cf1*rho_zz(1,iCell)+cf2*rho_zz(2,iCell)+cf3*rho_zz(3,iCell))
2971
3026
2972
3027
2973
- !DIR$ IVDEP
2974
- do k = 2, nVertLevels
2975
- w(k,iCell) = w(k,iCell)/(fzm(k)*rho_zz(k,iCell)+fzp(k)*rho_zz(k-1,iCell))
2976
- end do
3028
+ !DIR$ IVDEP
3029
+ !$acc loop vector
3030
+ do k = 2, nVertLevels
3031
+ w(k,iCell) = w(k,iCell)/(fzm(k)*rho_zz(k,iCell)+fzp(k)*rho_zz(k-1,iCell))
3032
+ end do
2977
3033
2978
3034
end if ! addition for regional_MPAS, no spec zone update
2979
3035
2980
3036
end do
3037
+ !$acc end parallel
3038
+
3039
+ MPAS_ACC_TIMER_START(' atm_recover_large_step_variables [ACC_data_xfer]' )
3040
+ !$acc exit data delete(rho_p_save,rho_pp,rho_base,rw_save,rw_p, &
3041
+ !$acc rtheta_p_save,rtheta_pp,rtheta_base, &
3042
+ !$acc ru_save,ru_p) &
3043
+ !$acc copyout(rho_zz,rho_p,rw,w,rtheta_p,theta_m, &
3044
+ !$acc ru,u,wwAvg,ruAvg)
3045
+ if (rk_step == 3) then
3046
+ !$acc exit data delete(rt_diabatic_tend,exner_base) &
3047
+ !$acc copyout(exner,pressure_p)
3048
+ end if
3049
+ MPAS_ACC_TIMER_STOP(' atm_recover_large_step_variables [ACC_data_xfer]' )
2981
3050
2982
3051
end subroutine atm_recover_large_step_variables_work
2983
3052
0 commit comments