diff --git a/src/core_atmosphere/dynamics/mpas_atm_time_integration.F b/src/core_atmosphere/dynamics/mpas_atm_time_integration.F index 227fbde862..8b26643538 100644 --- a/src/core_atmosphere/dynamics/mpas_atm_time_integration.F +++ b/src/core_atmosphere/dynamics/mpas_atm_time_integration.F @@ -4725,7 +4725,7 @@ subroutine atm_advance_scalars_work(nCells, num_scalars, dt, & real (kind=RKIND) :: weight_time_old, weight_time_new real (kind=RKIND), dimension(num_scalars,nVertLevels) :: scalar_tend_column ! local storage to accumulate tendency - real (kind=RKIND) :: u_direction, u_positive, u_negative + real (kind=RKIND) :: u_direction, u_positive, u_negative, local_sign flux4(q_im2, q_im1, q_i, q_ip1, ua) = & ua*( 7.*(q_i + q_im1) - (q_ip1 + q_im2) )/12.0 @@ -4755,10 +4755,10 @@ subroutine atm_advance_scalars_work(nCells, num_scalars, dt, & if(rk_step == 3) weight_time_new = 1. end if weight_time_old = 1. - weight_time_new - - + local_sign = 1.0_RKIND + call mpas_timer_start('atm_advance_scalars_4760') !$acc parallel async - !$acc loop gang worker private(scalar_weight2, ica) + !$acc loop gang worker do iEdge=edgeStart,edgeEnd if ((.not.config_apply_lbcs) & @@ -4768,32 +4768,21 @@ subroutine atm_advance_scalars_work(nCells, num_scalars, dt, & case(10) - !$acc loop vector collapse(2) - do j=1,10 - do k=1,nVertLevels - scalar_weight2(k,j) = adv_coefs(j,iEdge) + sign(1.0_RKIND,uhAvg(k,iEdge))*adv_coefs_3rd(j,iEdge) - end do - end do - - !$acc loop vector - do j=1,10 - ica(j) = advCellsForEdge(j,iEdge) - end do - !$acc loop vector collapse(2) do k = 1,nVertLevels do iScalar = 1,num_scalars + local_sign = sign(1.0_RKIND,uhAvg(k,iEdge)) horiz_flux_arr(iScalar,k,iEdge) = & - scalar_weight2(k,1) * scalar_new(iScalar,k,ica(1)) + & - scalar_weight2(k,2) * scalar_new(iScalar,k,ica(2)) + & - scalar_weight2(k,3) * scalar_new(iScalar,k,ica(3)) + & - scalar_weight2(k,4) * scalar_new(iScalar,k,ica(4)) + & - scalar_weight2(k,5) * scalar_new(iScalar,k,ica(5)) + & - scalar_weight2(k,6) * scalar_new(iScalar,k,ica(6)) + & - scalar_weight2(k,7) * scalar_new(iScalar,k,ica(7)) + & - scalar_weight2(k,8) * scalar_new(iScalar,k,ica(8)) + & - scalar_weight2(k,9) * scalar_new(iScalar,k,ica(9)) + & - scalar_weight2(k,10) * scalar_new(iScalar,k,ica(10)) + (adv_coefs(1,iEdge) + local_sign*adv_coefs_3rd(1,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(1,iEdge)) + & + (adv_coefs(2,iEdge) + local_sign*adv_coefs_3rd(2,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(2,iEdge)) + & + (adv_coefs(3,iEdge) + local_sign*adv_coefs_3rd(3,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(3,iEdge)) + & + (adv_coefs(4,iEdge) + local_sign*adv_coefs_3rd(4,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(4,iEdge)) + & + (adv_coefs(5,iEdge) + local_sign*adv_coefs_3rd(5,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(5,iEdge)) + & + (adv_coefs(6,iEdge) + local_sign*adv_coefs_3rd(6,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(6,iEdge)) + & + (adv_coefs(7,iEdge) + local_sign*adv_coefs_3rd(7,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(7,iEdge)) + & + (adv_coefs(8,iEdge) + local_sign*adv_coefs_3rd(8,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(8,iEdge)) + & + (adv_coefs(9,iEdge) + local_sign*adv_coefs_3rd(9,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(9,iEdge)) + & + (adv_coefs(10,iEdge) + local_sign*adv_coefs_3rd(10,iEdge)) * scalar_new(iScalar,k,advCellsForEdge(10,iEdge)) end do end do @@ -4803,16 +4792,9 @@ subroutine atm_advance_scalars_work(nCells, num_scalars, dt, & do k=1,nVertLevels do iScalar=1,num_scalars horiz_flux_arr(iScalar,k,iEdge) = 0.0_RKIND - end do - end do - - !$acc loop seq - do j=1,nAdvCellsForEdge(iEdge) - iAdvCell = advCellsForEdge(j,iEdge) - - !$acc loop vector collapse(2) - do k=1,nVertLevels - do iScalar=1,num_scalars + !$acc loop seq + do j=1,nAdvCellsForEdge(iEdge) + iAdvCell = advCellsForEdge(j,iEdge) scalar_weight = adv_coefs(j,iEdge) + sign(1.0_RKIND,uhAvg(k,iEdge))*adv_coefs_3rd(j,iEdge) horiz_flux_arr(iScalar,k,iEdge) = horiz_flux_arr(iScalar,k,iEdge) & + scalar_weight * scalar_new(iScalar,k,iAdvCell) @@ -4842,7 +4824,7 @@ subroutine atm_advance_scalars_work(nCells, num_scalars, dt, & end if ! end of regional MPAS test end do !$acc end parallel - + call mpas_timer_stop('atm_advance_scalars_4760') !$OMP BARRIER !