!-------------------------------------- LICENCE BEGIN ------------------------------------ !Environment Canada - Atmospheric Science and Technology License/Disclaimer, ! version 3; Last Modified: May 7, 2008. !This is free but copyrighted software; you can use/redistribute/modify it under the terms !of the Environment Canada - Atmospheric Science and Technology License/Disclaimer !version 3 or (at your option) any later version that should be found at: !http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html ! !This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; !without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. !See the above mentioned License/Disclaimer for more details. !You should have received a copy of the License/Disclaimer along with this software; !if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), !CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca !-------------------------------------- LICENCE END -------------------------------------- ***s/r rhsp_2 - compute rhs of different equations * ( computation and microtasking ) * #include "model_macros_f.h"*
subroutine rhsp_2 ( F_ru, F_rv, F_rcn, F_rth, F_rw, F_rvv, 2 % F_oru, F_orv, F_orcn, F_orth, F_orw, F_orvv, % F_ruw1, F_rvw1, F_u, F_v, F_t, F_q, $ F_fi, F_s, F_td, F_psd,F_nest_u,F_nest_v, % F_w, F_fis, F_fip, F_mu, DIST_DIM, Nk ) * implicit none * integer DIST_DIM, Nk * real F_ru (DIST_SHAPE,Nk), F_rv (DIST_SHAPE,Nk), % F_rcn (DIST_SHAPE,Nk), F_rth (DIST_SHAPE,Nk), % F_rw (DIST_SHAPE,Nk), F_rvv (DIST_SHAPE,Nk), % F_oru (DIST_SHAPE,Nk), F_orv (DIST_SHAPE,Nk), % F_orcn (DIST_SHAPE,Nk), F_orth (DIST_SHAPE,Nk), % F_orw (DIST_SHAPE,Nk), F_orvv (DIST_SHAPE,Nk), % F_ruw1 (DIST_SHAPE,Nk), F_rvw1 (DIST_SHAPE,Nk), % F_nest_u(DIST_SHAPE,Nk), F_nest_v(DIST_SHAPE,Nk), % F_U (DIST_SHAPE,Nk), F_v (DIST_SHAPE,Nk), % F_t (DIST_SHAPE,Nk), F_q (DIST_SHAPE,Nk), % F_fi (DIST_SHAPE,Nk), F_s (DIST_SHAPE) , % F_td (DIST_SHAPE,Nk), F_psd (DIST_SHAPE,Nk), % F_w (DIST_SHAPE,Nk), F_fis (DIST_SHAPE) , % F_fip (DIST_SHAPE,Nk), F_mu (DIST_SHAPE,Nk) * *author * Alain Patoine * *revision * v2_00 - Desgagne M. - initial MPI version (from rhs v1_03) * v2_21 - Lee V. - modifications for LAM version * v2_30 - Edouard S. - adapt for vertical hybrid coordinate * (Change to Rcn) * v2_31 - Desgagne M. - remove treatment of hut1 and qct1 * v3_00 - Qaddouri & Lee - For LAM, Change Ru, Rv values on the boundaries * v3_00 of the LAM grid with values from Nesting data * v3_02 - Edouard S. - correct bug in Ru and Rv in the non hydrostatic version * v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP * v3_30 - Lee V. - Optimization * v3_31 - Desgagne M. - Scope of operator for LAM configs * *object * see rhs * *arguments * Name I/O Description *---------------------------------------------------------------- * F_ru O *---------------------------------------------------------------- * *implicits #include "glb_ld.cdk"
#include "cori.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "offc.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
* integer i, j, k, i0, j0, in, jn, i00, inn, j00, jnn, nij real*8 aaa, bbb, zero, one, r, pd1,c1,c2,c3,c4,c5,c6,c7,c8 parameter( zero=0.0, one=1.0 ) * - - - - - - - - - - - - - - - - real wk1(DIST_SHAPE), wk2(DIST_SHAPE) * real*8 xmass_8(l_ni,l_nj), y1log_8(l_ni,l_nj), y2log_8(l_ni,l_nj), $ expf_8(l_ni,l_nj) * real*8 inv_Cstv_tstr_8 real*8 inv_geomg_hx_8(l_niu) real*8 inv_Geomg_z_8(l_nk) ** * __________________________________________________________________ * * Common coefficients aaa = ( Offc_a1_8 / Offc_b0_8 )/ Cstv_dt_8 bbb = ( Offc_b1_8 / Offc_b0_8 ) c1 = bbb * Dcst_rgasd_8 / ( Dcst_rayt_8*Dcst_rayt_8 ) c2 = bbb / ( Dcst_rayt_8*Dcst_rayt_8 ) c3 = aaa*Dcst_cappa_8 c4 = bbb*Dcst_cappa_8 c5 = aaa*Schm_nonhy_8 c6 = bbb*Dcst_grav_8 c7 = bbb*Dcst_rgasd_8*Cstv_tstr_8 if (Cori_cornl_L) then c8 = Offc_b1_8 / Offc_b0_8 else c8 = ( Offc_b1_8 - Offc_b0_8 ) / Offc_b0_8 endif * Exchange halos for derivatives & interpolation * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ call rpn_comm_xch_halo( F_u , LDIST_DIM,l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo( F_v , LDIST_DIM,l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo( F_t , LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo( F_q , LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo( F_fi, LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) if (.not. Schm_hydro_L) then call rpn_comm_xch_halo( F_mu, LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) endif * nij = l_ni*l_nj !$omp parallel !$omp do do j = 1, l_nj do i = 1, l_ni xmass_8(i,j) = F_s(i,j) end do end do !$omp enddo !$omp single call vexp (expf_8,xmass_8,nij) !$omp end single !$omp do do j = 1, l_nj do i = 1, l_ni expf_8(i,j) = expf_8(i,j) - one end do end do !$omp enddo * inv_Cstv_tstr_8 = 1.0d0 / Cstv_tstr_8 * !$omp do do i = 1, l_niu inv_geomg_hx_8(i) = 1.0d0 / geomg_hx_8(i) end do !$omp enddo * !$omp do do k = 1, l_nk inv_Geomg_z_8(k) = 1.0d0 / Geomg_z_8(k) end do !$omp enddo !$omp end parallel * c if (Acid_test_L) then F_u,F_v,F_t,F_q,F_s,F_fi c call glbstat (F_u,'F_u',LDIST_DIM,G_nk, c % 1+acid_i0,G_ni-1-acid_in,1+acid_j0,G_nj-acid_jn,1,G_nk) * !$omp parallel private(i,j,i0,j0,jn,in,i00,inn,j00,jnn, !$omp$ pd1,xmass_8,y1log_8,y2log_8,wk1,wk2) !$omp do do 1000 k = 1,l_nk if (Schm_hydro_L) then do j = 1, l_nj do i = 1, l_ni wk1 (i,j) = one end do end do endif ***************************** * Compute RHS of U equation * ***************************** * set indices for calculating Ru i0 = 1 j0 = 1 in = l_niu jn = l_nj if (.not. Schm_hydro_L) then do j = j0, jn do i = i0, in wk1(i,j) = ( 1. - intuv_c0xxu_8(i) )*(1.+F_mu(i ,j,k)) % + intuv_c0xxu_8(i) * (1.+ F_mu(i+1,j,k)) end do end do endif if ( abs(c8) .lt. 1.0e-6 ) then do j= j0, jn do i= i0, in F_ru(i,j,k) = - aaa*F_u(i,j,k) % - c1 * ( ( 1. - intuv_c0xxu_8(i) )* F_t(i ,j,k) % + intuv_c0xxu_8(i) * F_t(i+1,j,k) ) % * ( F_q (i+1,j,k) - F_q (i,j,k) ) * inv_geomg_hx_8(i) % - c2 *wk1(i,j) * ( F_fi(i+1,j,k) - F_fi(i,j,k) ) $ * inv_geomg_hx_8(i) F_oru(i,j,k) = F_ru (i,j,k) end do end do else * Set indices for calculating wk2 i00=minx inn=maxx j00 = 1 jnn = l_njv if (l_south) j00 = 3 if (l_north) jnn = l_njv-1 * do j = j00, jnn do i = i00, inn wk2(i,j) = inuvl_wyvy3_8(j,1) * F_v(i,j-2,k) % + inuvl_wyvy3_8(j,2) * F_v(i,j-1,k) % + inuvl_wyvy3_8(j,3) * F_v(i,j ,k) % + inuvl_wyvy3_8(j,4) * F_v(i,j+1,k) end do end do * if (.not.G_lam) then if (l_south) then do i = i00, inn wk2(i,j00-2)= inuvl_wyvy3_8(j00-2,3) * F_v(i,j00-2,k) % + inuvl_wyvy3_8(j00-2,4) * F_v(i,j00-1,k) wk2(i,j00-1)= inuvl_wyvy3_8(j00-1,2) * F_v(i,j00-2,k) % + inuvl_wyvy3_8(j00-1,3) * F_v(i,j00-1,k) % + inuvl_wyvy3_8(j00-1,4) * F_v(i,j00 ,k) end do endif if (l_north) then do i = i00, inn wk2(i,jnn+2)= inuvl_wyvy3_8(jnn+2,1) * F_v(i,jnn ,k) % + inuvl_wyvy3_8(jnn+2,2) * F_v(i,jnn+1,k) wk2(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1) * F_v(i,jnn-1,k) % + inuvl_wyvy3_8(jnn+1,2) * F_v(i,jnn ,k) % + inuvl_wyvy3_8(jnn+1,3) * F_v(i,jnn+1,k) end do endif * endif * * Set indices for calculating Ru if (G_lam) then if (l_west ) i0 = 2 if (l_east ) in = l_niu-1 if (l_south) j0 = 3 if (l_north) jn = l_njv-1 endif * * Adding coriolis factor to Ru do j= j0, jn do i= i0, in F_ru(i,j,k) = - aaa*F_u(i,j,k) % - c1 *( ( 1. - intuv_c0xxu_8(i) )* F_t(i ,j,k) % + intuv_c0xxu_8(i) * F_t(i+1,j,k) ) % * ( F_q (i+1,j,k) - F_q (i,j,k) )* inv_geomg_hx_8(i) % - c2 *wk1(i,j) * ( F_fi(i+1,j,k) - F_fi(i,j,k) ) $ * inv_geomg_hx_8(i) + c8 * Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,1)*wk2(i-1,j)+inuvl_wxxu3_8(i,2)*wk2(i ,j) % + inuvl_wxxu3_8(i,3)*wk2(i+1,j)+inuvl_wxxu3_8(i,4)*wk2(i+2,j)) F_oru(i,j,k) = F_ru (i,j,k) end do end do endif ***************************** * Compute RHS of V equation * ***************************** * set indices for calculating Rv i0 = 1 j0 = 1 in = l_ni jn = l_njv if (.not. Schm_hydro_L) then do j = j0, jn do i = i0, in wk1(i,j) = ( 1. - intuv_c0yyv_8(j) )*(1.+ F_mu(i,j ,k)) % + intuv_c0yyv_8(j) *(1.+F_mu(i,j+1,k)) end do end do endif if ( abs(c8) .lt. 1.0e-6 ) then do j= j0, jn do i= i0, in F_rv(i,j,k) = - aaa*F_v(i,j,k) % - c1 *( ( 1. - intuv_c0yyv_8(j) )*F_t(i,j ,k) % + intuv_c0yyv_8(j) *F_t(i,j+1,k) ) % * (F_q (i,j+1,k)-F_q (i,j,k))*geomg_cyv2_8(j)*geomg_invhsy_8(j) % - c2 * wk1(i,j) * ( F_fi(i,j+1,k) - F_fi(i,j,k) ) $ * geomg_cyv2_8(j)*geomg_invhsy_8(j) F_orv(i,j,k) = F_rv (i,j,k) end do end do else * * Set indices for calculating wk2 j00=miny jnn=maxy i00 = 1 inn = l_niu if (G_lam) then if (l_west) i00 = 3 if (l_east) inn = l_niu-1 endif * do j = j00, jnn do i = i00, inn wk2(i,j) = inuvl_wxux3_8(i,1)*F_u(i-2,j,k) % + inuvl_wxux3_8(i,2)*F_u(i-1,j,k) % + inuvl_wxux3_8(i,3)*F_u(i ,j,k) % + inuvl_wxux3_8(i,4)*F_u(i+1,j,k) end do end do * * Set indices for calculating Rv if (l_south) j0 = 2 if (l_north) jn = l_njv-1 if (G_lam) then if (l_west) i0 = 3 if (l_east) in = l_niu-1 endif * * Adding coriolis factor to Rv do j = j0, jn do i = i0, in F_rv(i,j,k) = - aaa*F_v(i,j,k) % - c1 *( ( 1. - intuv_c0yyv_8(j) )*F_t(i,j ,k) % + intuv_c0yyv_8(j) *F_t(i,j+1,k) ) % * (F_q(i,j+1,k)-F_q (i,j,k))*geomg_cyv2_8(j)*geomg_invhsy_8(j) % - c2 *wk1(i,j)*( F_fi(i,j+1,k) - F_fi(i,j,k) ) $ * geomg_cyv2_8(j)*geomg_invhsy_8(j) - c8 * Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,1)*wk2(i,j-1)+inuvl_wyyv3_8(j,2)*wk2(i,j ) % + inuvl_wyyv3_8(j,3)*wk2(i,j+1)+inuvl_wyyv3_8(j,4)*wk2(i,j+2)) F_orv(i,j,k) = F_rv (i,j,k) end do end do * if (.not.G_lam) then if (l_south) then do i = i0, in F_rv(i,1,k) = - aaa*F_v(i,1,k) % - c1 *( ( 1. - intuv_c0yyv_8(1) )*F_t(i,1 ,k) % + intuv_c0yyv_8(1) *F_t(i,1+1,k) ) % * (F_q (i,1+1,k)-F_q(i,1,k))*geomg_cyv2_8(1)*geomg_invhsy_8(1) % - c2 * wk1(i,1) * ( F_fi(i,1+1,k) - F_fi(i,1,k) ) $ * geomg_cyv2_8(1)*geomg_invhsy_8(1) - c8 * Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,2)*wk2(i,1)+inuvl_wyyv3_8(1,3)*wk2(i,2) % +inuvl_wyyv3_8(1,4)*wk2(i,3)) F_orv(i,1,k) = F_rv (i,1,k) end do endif * if (l_north) then do i = i0, in F_rv(i,l_njv,k) = - aaa*F_v(i,l_njv,k) % - c1 *(( 1. - intuv_c0yyv_8(l_njv) )*F_t(i,l_njv ,k) % + intuv_c0yyv_8(l_njv) *F_t(i,l_njv+1,k)) % * ( F_q (i,l_njv+1,k) - F_q (i,l_njv,k) ) $ * geomg_cyv2_8(l_njv)*geomg_invhsy_8(l_njv) % - c2 *wk1(i,l_njv)*( F_fi(i,l_njv+1,k) $ - F_fi(i,l_njv,k))*geomg_cyv2_8(l_njv)*geomg_invhsy_8(l_njv) % - c8 * Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,1)*wk2(i,l_njv-1) % + inuvl_wyyv3_8(l_njv,2)*wk2(i,l_njv ) % + inuvl_wyyv3_8(l_njv,3)*wk2(i,l_njv+1) ) F_orv(i,l_njv,k) = F_rv (i,l_njv,k) end do endif endif endif * RHS of continuity, thermodynamic, passive advection equations * i0 = 1 j0 = 1 in = l_ni jn = l_nj * do j = j0, jn do i = i0, in xmass_8(i,j) = 1.0d0 +geomg_dpba(k)*expf_8(i,j) end do end do call vlog(y1log_8, xmass_8, nij) * do j = j0, jn do i = i0, in xmass_8(i,j) = F_t(i,j,k)*inv_Cstv_tstr_8 end do end do call vlog(y2log_8, xmass_8, nij) * pd1 = log(Geomg_z_8(k)) do j= j0, jn do i= i0, in F_rcn(i,j,k)= -aaa*y1log_8(i,j) - bbb*F_td(i,j,k) F_rth(i,j,k)= -aaa*y2log_8(i,j) - c3*(pd1-F_q(i,j,k)) $ +c4*F_psd(i,j,k)*inv_Geomg_z_8(k) F_orcn(i,j,k)= F_rcn(i,j,k) F_orth(i,j,k)= F_rth(i,j,k) end do end do * RHS of vertical momentum, vertical velocity equation * if (.not. Schm_hydro_L) then do j= j0, jn do i= i0, in F_rw (i,j,k) = - c5*F_w(i,j,k) + c6*F_mu(i,j,k) F_rvv(i,j,k) = - aaa*( F_fis(i,j) + F_fip(i,j,k) ) % + c7*F_psd(i,j,k)*inv_Geomg_z_8(k)+c6*F_w(i,j,k) F_orw (i,j,k) = F_rw (i,j,k) F_orvv(i,j,k) = F_rvv(i,j,k) end do end do endif 1000 continue !$omp enddo !$omp single * ******************************************************* * Interpolate Ru, Rv from U-, V-grid to G-grid, resp. * ******************************************************* call rpn_comm_xch_halo ( F_ru, LDIST_DIM,l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo ( F_rv, LDIST_DIM,l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) !$omp end single * c if (Acid_test_L) then c call glbstat (F_ru,'RU',LDIST_DIM,G_nk,3+acid_i0,G_ni-2-acid_in, c % 3+acid_j0,G_nj-2-acid_jn,1,G_nk) c call glbstat (F_rv,'RV',LDIST_DIM,G_nk,3+acid_i0,G_ni-2-acid_in, c % 3+acid_j0,G_nj-2-acid_jn,1,G_nk) c endif * set indices for Ruw1 i0 = 1 in = l_niu j0 = 1 jn = l_nj if (G_lam) then if (l_west) i0 = 4 if (l_east) in = l_niu - 2 if (l_south) j0 = 4 if (l_north) jn = l_njv - 2 endif * !$omp do do k=1,l_nk do j = j0, jn do i = i0, in F_ruw1(i,j,k) = inuvl_wxux3_8(i,1) * F_ru(i-2,j,k) $ + inuvl_wxux3_8(i,2) * F_ru(i-1,j,k) $ + inuvl_wxux3_8(i,3) * F_ru(i ,j,k) $ + inuvl_wxux3_8(i,4) * F_ru(i+1,j,k) end do end do end do !$omp enddo * * set indices for Rvw1 i0 = 1 in = l_ni j0 = 1 jn = l_njv if (l_south) j0 = 3 if (l_north) jn = l_njv-1 if (G_lam) then if (l_west) i0 = 4 if (l_east) in = l_niu - 2 if (l_south) j0 = 4 if (l_north) jn = l_njv - 2 endif * !$omp do do k=1,l_nk do j = j0, jn do i = i0, in F_rvw1(i,j,k) = inuvl_wyvy3_8(j,1) * F_rv(i,j-2,k) % + inuvl_wyvy3_8(j,2) * F_rv(i,j-1,k) % + inuvl_wyvy3_8(j,3) * F_rv(i,j ,k) % + inuvl_wyvy3_8(j,4) * F_rv(i,j+1,k) end do end do if (.not.G_lam) then if (l_south) then do i = i0, in F_rvw1(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * F_rv(i,j0-2,k) % + inuvl_wyvy3_8(j0-2,4) * F_rv(i,j0-1,k) F_rvw1(i,j0-1,k) = inuvl_wyvy3_8(j0-1,2) * F_rv(i,j0-2,k) % + inuvl_wyvy3_8(j0-1,3) * F_rv(i,j0-1,k) % + inuvl_wyvy3_8(j0-1,4) * F_rv(i,j0,k ) end do endif if (l_north) then do i = i0, in F_rvw1(i,jn+2,k) = inuvl_wyvy3_8(jn+2,1) * F_rv(i,jn ,k) % + inuvl_wyvy3_8(jn+2,2) * F_rv(i,jn+1,k) F_rvw1(i,jn+1,k) = inuvl_wyvy3_8(jn+1,1) * F_rv(i,jn-1,k) % + inuvl_wyvy3_8(jn+1,2) * F_rv(i,jn ,k) % + inuvl_wyvy3_8(jn+1,3) * F_rv(i,jn+1,k) end do endif endif end do !$omp enddo * * Change Ru, Rv values on the boundaries of the LAM grid if (G_lam) then if (l_west) then !$omp do do k=1,l_nk do j= 1+pil_s, l_nj-pil_n F_ru(pil_w,j,k) = - aaa*F_nest_u(pil_w,j,k) F_oru(pil_w,j,k) = F_ru(pil_w,j,k) enddo enddo !$omp enddo endif if (l_east) then !$omp do do k=1,l_nk do j= 1+pil_s, l_nj-pil_n F_ru(l_ni-pil_e,j,k) = - aaa*F_nest_u(l_ni-pil_e,j,k) F_oru(l_ni-pil_e,j,k) = F_ru(l_ni-pil_e,j,k) enddo enddo !$omp enddo endif if (l_south) then !$omp do do k=1,l_nk do i= 1+pil_w, l_ni-pil_e F_rv(i,pil_s,k) = - aaa*F_nest_v(i,pil_s,k) F_orv(i,pil_s,k) = F_rv(i,pil_s,k) enddo enddo !$omp enddo endif if (l_north) then !$omp do do k=1,l_nk do i= 1+pil_w, l_ni-pil_e F_rv(i,l_nj-pil_n,k) = - aaa*F_nest_v(i,l_nj-pil_n,k) F_orv(i,l_nj-pil_n,k) = F_rv(i,l_nj-pil_n,k) enddo enddo !$omp enddo endif endif !$omp end parallel * return end