!-------------------------------------- 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_ad - ADJ of rhsp_2_tl * #include "model_macros_f.h"*
subroutine rhsp_2_ad ( F_ru, F_rv, F_rcn, F_rth, F_rw, F_rvv, 1,7 % 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, * % F_tm, F_qm, % F_fim, F_sm, % F_mum, * % 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) * real % F_tm (DIST_SHAPE,Nk), F_qm (DIST_SHAPE,Nk), % F_fim (DIST_SHAPE,Nk), F_sm (DIST_SHAPE), % F_mum (DIST_SHAPE,Nk) * *author * M.Tanguay * *revision * v2_10 - Tanguay M. - initial MPI version * v2_31 - Tanguay M. - adapt for vertical hybrid coordinate and LAM version * - adapt for tracers in tr3d * v3_03 - Tanguay M. - Adjoint Lam and NoHyd configuration * v3_11 - Tanguay M. - AIXport+Opti+OpenMP for TLM-ADJ * v3_30 - Tanguay M. - Validation for LAM Nonhyd * v3_31 - Tanguay M. - new scope for operator + adw_cliptraj (LAM) * *object * see id section * ----------------------------------------- * REMARK:INPUT TRAJ:F_tm, F_qm, F_sm, F_fim * ----------------------------------------- * *arguments * Name I/O Description *---------------------------------------------------------------- * F_ru IO *---------------------------------------------------------------- * *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_8, bbb_8, ZERO_8, ONE_8, pd1_8 real*8 c1_8,c2_8,c3_8,c4_8,c5_8,c6_8,c7_8,c8_8 parameter( ZERO_8=0.0, ONE_8=1.0 ) * - - - - - - - - - - - - - - - - real wk1 (DIST_SHAPE), wk2 (DIST_SHAPE) real wk1m(DIST_SHAPE) * real*8 xmassm_8(l_ni,l_nj), expfm_8(l_ni,l_nj), invsm_8(l_ni,l_nj), invtm_8(l_ni,l_nj) real*8 invksm_8(l_ni,l_nj,l_nk) * real*8 inv_Cstv_tstr_8 real*8 inv_Geomg_hx_8(l_niu) real*8 inv_Geomg_z_8(l_nk) * ______________________________________________________ * * --------------------------- * START TRAJECTORY EVALUATION * --------------------------- * * Common coefficients aaa_8 = ( Offc_a1_8 / Offc_b0_8 )/ Cstv_dt_8 bbb_8 = ( Offc_b1_8 / Offc_b0_8 ) c1_8 = bbb_8 * Dcst_rgasd_8 / ( Dcst_rayt_8*Dcst_rayt_8 ) c2_8 = bbb_8 / ( Dcst_rayt_8*Dcst_rayt_8 ) c3_8 = aaa_8*Dcst_cappa_8 c4_8 = bbb_8*Dcst_cappa_8 c5_8 = aaa_8*Schm_nonhy_8 c6_8 = bbb_8*Dcst_grav_8 c7_8 = bbb_8*Dcst_rgasd_8*Cstv_tstr_8 if (Cori_cornl_L) then c8_8 = Offc_b1_8 / Offc_b0_8 else c8_8 = ( Offc_b1_8 - Offc_b0_8 ) / Offc_b0_8 endif * * Exchange haloes for derivatives & interpolation * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * TRAJECTORY * ---------- call rpn_comm_xch_halo( F_tm, 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_qm, 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_fim,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * nij = l_ni*l_nj * !$omp parallel * !$omp do do j = 1, l_nj do i = 1, l_ni * xmassm_8(i,j) = F_sm(i,j) * end do end do !$omp enddo * !$omp single call vexp (expfm_8,xmassm_8,nij) !$omp end single * 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 * * ------------------------- * START ADJOINT CALCULATION * ------------------------- * !$omp parallel private(i,j,i0,j0,jn,in,i00,inn,j00,jnn, !$omp$ pd1_8,xmassm_8,invsm_8,invtm_8, !$omp$ wk1m,wk1,wk2) * * ADJOINT of * Change Ru, Rv values on the boundaries of the LAM grid * if (G_lam) then if (l_north) then !$omp do do k=1,l_nk do i= l_ni-pil_e,1+pil_w,-1 * F_rv (i,l_nj-pil_n,k) = F_orv(i,l_nj-pil_n,k) + F_rv(i,l_nj-pil_n,k) F_orv (i,l_nj-pil_n,k) = ZERO_8 * F_nest_v(i,l_nj-pil_n,k) = - aaa_8* F_rv (i,l_nj-pil_n,k) + F_nest_v(i,l_nj-pil_n,k) F_rv (i,l_nj-pil_n,k) = ZERO_8 * enddo enddo !$omp enddo endif if (l_south) then !$omp do do k=1,l_nk do i= l_ni-pil_e,1+pil_w,-1 * F_rv (i,pil_s,k) = F_orv(i,pil_s,k) + F_rv(i,pil_s,k) F_orv (i,pil_s,k) = ZERO_8 * F_nest_v(i,pil_s,k) = - aaa_8*F_rv(i,pil_s,k) + F_nest_v(i,pil_s,k) F_rv (i,pil_s,k) = ZERO_8 * enddo enddo !$omp enddo endif if (l_east) then !$omp do do k=1,l_nk do j= l_nj-pil_n,1+pil_s,-1 * F_ru (l_ni-pil_e,j,k) = F_oru(l_ni-pil_e,j,k) + F_ru(l_ni-pil_e,j,k) F_oru (l_ni-pil_e,j,k) = ZERO_8 * F_nest_u(l_ni-pil_e,j,k) = - aaa_8*F_ru(l_ni-pil_e,j,k) + F_nest_u(l_ni-pil_e,j,k) F_ru (l_ni-pil_e,j,k) = ZERO_8 * enddo enddo !$omp enddo endif if (l_west) then !$omp do do k=1,l_nk do j= l_nj-pil_n,1+pil_s,-1 * F_ru (pil_w,j,k) = F_oru(pil_w,j,k) + F_ru(pil_w,j,k) F_oru (pil_w,j,k) = ZERO_8 * F_nest_u(pil_w,j,k) = - aaa_8* F_ru(pil_w,j,k) + F_nest_u(pil_w,j,k) F_ru (pil_w,j,k) = ZERO_8 * enddo enddo !$omp enddo endif endif * ******************************************************* * ADJ of * * Interpolate Ru, Rv from U-, V-grid to G-grid, resp. * ******************************************************* * * 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 if (.not.G_lam) then if (l_north) then do i = i0, in * * ADJ * --- F_rv(i,jn+1,k) = inuvl_wyvy3_8(jn+1,3) * F_rvw1(i,jn+1,k) % + F_rv(i,jn+1,k) F_rv(i,jn ,k) = inuvl_wyvy3_8(jn+1,2) * F_rvw1(i,jn+1,k) % + F_rv(i,jn ,k) F_rv(i,jn-1,k) = inuvl_wyvy3_8(jn+1,1) * F_rvw1(i,jn+1,k) % + F_rv(i,jn-1,k) F_rvw1(i,jn+1,k) = ZERO_8 * F_rv(i,jn+1,k) = inuvl_wyvy3_8(jn+2,2) * F_rvw1(i,jn+2,k) % + F_rv(i,jn+1,k) F_rv(i,jn ,k) = inuvl_wyvy3_8(jn+2,1) * F_rvw1(i,jn+2,k) % + F_rv(i,jn ,k) F_rvw1(i,jn+2,k) = ZERO_8 * end do endif * if (l_south) then do i = i0, in * * ADJ * --- F_rv(i,j0, k) = inuvl_wyvy3_8(j0-1,4) * F_rvw1(i,j0-1,k) % + F_rv(i,j0,k ) F_rv(i,j0-1,k) = inuvl_wyvy3_8(j0-1,3) * F_rvw1(i,j0-1,k) % + F_rv(i,j0-1,k) F_rv(i,j0-2,k) = inuvl_wyvy3_8(j0-1,2) * F_rvw1(i,j0-1,k) % + F_rv(i,j0-2,k) F_rvw1(i,j0-1,k) = ZERO_8 * F_rv(i,j0-1,k) = inuvl_wyvy3_8(j0-2,4) * F_rvw1(i,j0-2,k) % + F_rv(i,j0-1,k) F_rv(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * F_rvw1(i,j0-2,k) % + F_rv(i,j0-2,k) F_rvw1(i,j0-2,k) = ZERO_8 * end do endif * endif * do j = jn, j0, -1 do i = i0, in * * ADJ * --- F_rv(i,j+1,k) = inuvl_wyvy3_8(j,4) * F_rvw1(i,j,k) + F_rv(i,j+1,k) F_rv(i,j ,k) = inuvl_wyvy3_8(j,3) * F_rvw1(i,j,k) + F_rv(i,j ,k) F_rv(i,j-1,k) = inuvl_wyvy3_8(j,2) * F_rvw1(i,j,k) + F_rv(i,j-1,k) F_rv(i,j-2,k) = inuvl_wyvy3_8(j,1) * F_rvw1(i,j,k) + F_rv(i,j-2,k) F_rvw1(i,j, k) = ZERO_8 * end do end do * end do !$omp enddo * * 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 = in, i0, -1 * * ADJ * --- F_ru(i+1,j,k) = inuvl_wxux3_8(i,4) * F_ruw1(i,j,k) + F_ru(i+1,j,k) F_ru(i ,j,k) = inuvl_wxux3_8(i,3) * F_ruw1(i,j,k) + F_ru(i ,j,k) F_ru(i-1,j,k) = inuvl_wxux3_8(i,2) * F_ruw1(i,j,k) + F_ru(i-1,j,k) F_ru(i-2,j,k) = inuvl_wxux3_8(i,1) * F_ruw1(i,j,k) + F_ru(i-2,j,k) F_ruw1(i, j,k) = ZERO_8 end do end do end do !$omp enddo * !$omp single * call rpn_comm_adj_halo ( F_rv,LDIST_DIM,l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * call rpn_comm_adj_halo ( F_ru,LDIST_DIM,l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * * Zero F_rv halo * -------------- call v4d_zerohalo
( F_rv,l_ni,l_njv,LDIST_DIM, l_nk) * * Zero F_ru halo * -------------- call v4d_zerohalo
( F_ru,l_niu,l_nj,LDIST_DIM, l_nk) * !$omp end single * !$omp do do 1001 k = l_nk,1,-1 * * ADJ of * RHS of vertical momentum, vertical velocity equation * if (.not. Schm_hydro_L) then do j= j0, jn do i= i0, in * * ADJ * --- F_rvv (i,j,k)= F_orvv(i,j,k) + F_rvv(i,j,k) F_orvv(i,j,k)= ZERO_8 * F_rw (i,j,k)= F_orw (i,j,k) + F_rw (i,j,k) F_orw (i,j,k)= ZERO_8 * F_fip (i,j,k)= - aaa_8*F_rvv(i,j,k) + F_fip(i,j,k) F_psd (i,j,k)= c7_8*F_rvv(i,j,k)*inv_Geomg_z_8(k) + F_psd(i,j,k) F_w (i,j,k)= c6_8*F_rvv(i,j,k) + F_w (i,j,k) F_rvv (i,j,k)= ZERO_8 * F_w (i,j,k)= - c5_8*F_rw(i,j,k) + F_w (i,j,k) F_mu (i,j,k)= c6_8*F_rw(i,j,k) + F_mu(i,j,k) F_rw (i,j,k)= ZERO_8 * end do end do endif * * ADJ of * 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 xmassm_8(i,j) = ONE_8+Geomg_dpba(k)*(expfm_8(i,j) - ONE_8) end do end do call vrec( invksm_8(1,1,k), xmassm_8, nij) * do j = j0, jn do i = i0, in xmassm_8(i,j) = F_tm(i,j,k)*inv_Cstv_tstr_8 end do end do call vrec( invtm_8, xmassm_8, nij) * pd1_8 = log(Geomg_z_8(k)) do j= j0, jn do i= i0, in * * ADJ * --- F_rth (i,j,k) = F_orth(i,j,k) + F_rth(i,j,k) F_orth(i,j,k) = ZERO_8 * F_rcn (i,j,k) = F_orcn(i,j,k) + F_rcn(i,j,k) F_orcn(i,j,k) = ZERO_8 * F_q (i,j,k) = - c3_8*(-F_rth(i,j,k)) + F_q (i,j,k) F_psd (i,j,k) = c4_8* F_rth(i,j,k)*inv_Geomg_z_8(k) + F_psd(i,j,k) F_t (i,j,k) =- aaa_8*( F_rth(i,j,k)*inv_Cstv_tstr_8 )* invtm_8(i,j) % + F_t (i,j,k) F_rth (i,j,k) = ZERO_8 * C F_s (i,j) = -aaa_8*(Geomg_dpba(k)*(F_rcn(i,j,k)*expfm_8(i,j))) * invsm_8(i,j) C % + F_s(i,j) C F_td (i,j,k) = -bbb_8* F_rcn(i,j,k) + F_td(i,j,k) C F_rcn (i,j,k) = ZERO_8 * end do end do * 1001 continue !$omp enddo * !$omp do do j= j0, jn * do k = l_nk,1,-1 do i= i0, in * * ADJ * --- F_s (i,j) = -aaa_8*(Geomg_dpba(k)*(F_rcn(i,j,k)*expfm_8(i,j))) * invksm_8(i,j,k) % + F_s(i,j) F_td (i,j,k) = -bbb_8* F_rcn(i,j,k) + F_td(i,j,k) F_rcn (i,j,k) = ZERO_8 * end do end do * end do !$omp enddo * !$omp do do 1002 k = l_nk,1,-1 * * Zero adjoint variables * ---------------------- do j = l_miny,l_maxy do i = l_minx,l_maxx wk1(i,j) = ZERO_8 wk2(i,j) = ZERO_8 enddo enddo * * TRAJECTORY * ---------- if (Schm_hydro_L) then do j = 1, l_nj do i = 1, l_ni * wk1m(i,j) = ONE_8 * end do end do endif * * ADJ ***************************** * 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 * * TRAJECTORY * ---------- wk1m(i,j) = ( 1. - intuv_c0yyv_8(j) )*(1.+F_mum(i,j ,k)) % + intuv_c0yyv_8(j) *(1.+F_mum(i,j+1,k)) * end do end do endif * if ( abs(c8_8) .lt. 1.0e-6 ) then do j= jn,j0,-1 do i= in,i0,-1 * * ADJ * --- F_rv (i,j,k) = F_orv(i,j,k) + F_rv(i,j,k) F_orv(i,j,k) = ZERO_8 * F_fi(i,j+1,k)= - c2_8 * wk1m(i,j)*( F_rv(i,j,k)) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_fi(i,j+1,k) F_fi(i,j,k) = - c2_8 * wk1m(i,j)*( - F_rv(i,j,k)) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_fi(i,j,k) * wk1(i,j) = - c2_8 * F_rv(i,j,k) *( F_fim(i,j+1,k) - F_fim(i,j,k) ) % * Geomg_cyv2_8(j) * Geomg_invhsy_8(j) + wk1(i,j) * F_t(i,j,k) = - c1_8 * ( ( 1. - intuv_c0yyv_8(j) )*F_rv(i,j,k) ) % * ( F_qm(i,j+1,k) - F_qm(i,j,k) ) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_t(i,j,k) * F_t(i,j+1,k) = - c1_8 * ( intuv_c0yyv_8(j) *F_rv(i,j,k) ) % * ( F_qm(i,j+1,k) - F_qm(i,j,k) ) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_t(i,j+1,k) * F_q(i,j+1,k) = - c1_8 * ( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j,k) % + intuv_c0yyv_8(j) *F_tm(i,j+1,k) ) % * ( F_rv(i,j,k) ) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_q(i,j+1,k) * F_q(i,j,k) = - c1_8 * ( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j,k) % + intuv_c0yyv_8(j) *F_tm(i,j+1,k) ) % * ( -F_rv(i,j,k) ) * % Geomg_cyv2_8(j) * Geomg_invhsy_8(j) % + F_q(i,j,k) * F_v(i,j,k) = - aaa_8 * F_rv(i,j,k) + F_v(i,j,k) F_rv(i,j,k) = ZERO_8 * 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 * * 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 * if (.not.G_lam) then * if (l_north) then do i = in,i0,-1 * * ADJ * --- F_rv (i,l_njv,k) = F_orv(i,l_njv,k) + F_rv (i,l_njv,k) F_orv(i,l_njv,k) = ZERO_8 * wk2(i,l_njv-1) = - c8_8 * Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,1)*F_rv(i,l_njv,k) ) + wk2(i,l_njv-1) wk2(i,l_njv) = - c8_8 * Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,2)*F_rv(i,l_njv,k) ) + wk2(i,l_njv) * wk2(i,l_njv+1) = - c8_8 * Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,3)*F_rv(i,l_njv,k) ) + wk2(i,l_njv+1) * F_fi(i,l_njv+1,k)= - c2_8 *wk1m(i,l_njv)*( F_rv(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_fi(i,l_njv+1,k) F_fi(i,l_njv,k) = - c2_8 *wk1m(i,l_njv)*( - F_rv(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_fi(i,l_njv,k) * wk1 (i,l_njv) = - c2_8 * F_rv(i,l_njv,k)*( F_fim(i,l_njv+1,k)- F_fim(i,l_njv,k)) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + wk1 (i,l_njv) * F_q(i,l_njv+1,k) = - c1_8 *(( 1. - intuv_c0yyv_8(l_njv) )*F_tm(i,l_njv,k) % + intuv_c0yyv_8(l_njv) *F_tm(i,l_njv+1,k)) % * ( F_rv(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_q(i,l_njv+1,k) * F_q(i,l_njv,k) = - c1_8 *(( 1. - intuv_c0yyv_8(l_njv) )*F_tm(i,l_njv,k) % + intuv_c0yyv_8(l_njv) *F_tm(i,l_njv+1,k)) % * (- F_rv(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_q(i,l_njv,k) * F_t(i,l_njv,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(l_njv) ) % * F_rv(i,l_njv,k) ) % * ( F_qm(i,l_njv+1,k) - F_qm(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_t(i,l_njv,k) * F_t(i,l_njv+1,k) = - c1_8 *( intuv_c0yyv_8(l_njv) % * F_rv(i,l_njv,k) ) % * ( F_qm(i,l_njv+1,k) - F_qm(i,l_njv,k) ) % * Geomg_cyv2_8(l_njv)*Geomg_invhsy_8(l_njv) + F_t(i,l_njv+1,k) * F_v (i,l_njv,k) = - aaa_8*F_rv(i,l_njv,k) + F_v(i,l_njv,k) F_rv(i,l_njv,k) = ZERO_8 * end do endif * if (l_south) then do i = in,i0,-1 * F_rv (i,1,k) = F_orv(i,1,k) + F_rv (i,1,k) F_orv(i,1,k) = ZERO_8 * wk2(i,1) = - c8_8 * Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,2)*F_rv(i,1,k)) + wk2(i,1) wk2(i,2) = - c8_8 * Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,3)*F_rv(i,1,k)) + wk2(i,2) wk2(i,3) = - c8_8 * Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,4)*F_rv(i,1,k)) + wk2(i,3) * F_fi(i,1+1,k) = - c2_8 * wk1m(i,1) * ( F_rv(i,1,k) ) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_fi(i,1+1,k) F_fi(i,1,k) = - c2_8 * wk1m(i,1) * ( - F_rv(i,1,k) ) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_fi(i,1,k) * wk1 (i,1) = - c2_8 * F_rv(i,1,k) * ( F_fim(i,1+1,k) - F_fim(i,1,k) ) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + wk1 (i,1) * F_q(i,1+1,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(1) )*F_tm(i,1,k) % + intuv_c0yyv_8(1) *F_tm(i,1+1,k) ) % *( F_rv(i,1,k) ) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_q(i,1+1,k) * F_q(i,1,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(1) )*F_tm(i,1,k) % + intuv_c0yyv_8(1) *F_tm(i,1+1,k) ) % *(-F_rv(i,1,k) ) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_q(i,1,k) * F_t(i,1,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(1) )* F_rv(i,1,k)) % * (F_qm(i,1+1,k)-F_qm(i,1,k)) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_t(i,1,k) * F_t(i,1+1,k)= - c1_8 *( intuv_c0yyv_8(1) * F_rv(i,1,k)) % * (F_qm(i,1+1,k)-F_qm(i,1,k)) % * Geomg_cyv2_8(1)*Geomg_invhsy_8(1) + F_t(i,1+1,k) * F_v (i,1,k) = - aaa_8* F_rv(i,1,k) + F_v(i,1,k) F_rv(i,1,k) = ZERO_8 end do endif * endif * * ADJ of * Adding coriolis factor to Rv do j = jn,j0,-1 do i = in,i0,-1 * F_rv (i,j,k) = F_orv(i,j,k) + F_rv (i,j,k) F_orv(i,j,k) = ZERO_8 * wk2(i,j-1) = - c8_8 * Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,1)*F_rv(i,j,k)) + wk2(i,j-1) * wk2(i,j) = - c8_8 * Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,2)*F_rv(i,j,k)) + wk2(i,j ) * wk2(i,j+1) = - c8_8 * Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,3)*F_rv(i,j,k)) + wk2(i,j+1) wk2(i,j+2) = - c8_8 * Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,4)*F_rv(i,j,k)) + wk2(i,j+2) * F_fi(i,j+1,k) = - c2_8 *wk1m(i,j)*( F_rv(i,j,k) ) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_fi(i,j+1,k) F_fi(i,j,k) = - c2_8 *wk1m(i,j)*( - F_rv(i,j,k) ) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_fi(i,j,k) * wk1(i,j) = - c2_8 * F_rv(i,j,k)*( F_fim(i,j+1,k) - F_fim(i,j,k) ) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + wk1(i,j) * F_q(i,j+1,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j,k) % + intuv_c0yyv_8(j) *F_tm(i,j+1,k) ) % * ( F_rv(i,j,k) ) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_q(i,j+1,k) * F_q(i,j,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j,k) % + intuv_c0yyv_8(j) *F_tm(i,j+1,k) ) % * ( - F_rv(i,j,k) ) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_q (i,j,k) * F_t(i,j,k) = - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_rv(i,j,k) ) % * (F_qm(i,j+1,k)-F_qm(i,j,k)) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_t(i,j,k) * F_t(i,j+1,k) = - c1_8 *( intuv_c0yyv_8(j) *F_rv(i,j,k) ) % * (F_qm(i,j+1,k)-F_qm(i,j,k)) % * Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_t(i,j+1,k) * F_v (i,j,k) = - aaa_8* F_rv(i,j,k) + F_v(i,j,k) F_rv(i,j,k) = ZERO_8 * end do end do * * 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 = jnn,j00,-1 do i = inn,i00,-1 * * ADJ * --- F_u(i-2,j,k) = inuvl_wxux3_8(i,1)*wk2(i,j) + F_u(i-2,j,k) F_u(i-1,j,k) = inuvl_wxux3_8(i,2)*wk2(i,j) + F_u(i-1,j,k) F_u(i ,j,k) = inuvl_wxux3_8(i,3)*wk2(i,j) + F_u(i ,j,k) F_u(i+1,j,k) = inuvl_wxux3_8(i,4)*wk2(i,j) + F_u(i+1,j,k) wk2(i,j) = ZERO_8 end do end do * endif * if (.not. Schm_hydro_L) then do j = jn, j0,-1 do i = in, i0,-1 * * ADJ * --- F_mu(i,j ,k) = ( 1. - intuv_c0yyv_8(j) )* wk1 (i,j) + F_mu(i,j ,k) F_mu(i,j+1,k) = intuv_c0yyv_8(j) * wk1 (i,j) + F_mu(i,j+1,k) wk1 (i,j) = ZERO_8 * end do end do endif * *ADJ of ***************************** * 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 * * TRAJECTORY * ---------- wk1m(i,j) = ( 1. - intuv_c0xxu_8(i) )*(1.+ F_mum(i ,j,k)) % + intuv_c0xxu_8(i) *(1.+ F_mum(i+1,j,k)) * end do end do endif * if ( abs(c8_8) .lt. 1.0e-6 ) then do j= jn,j0,-1 do i= in,i0,-1 * * ADJ * --- F_ru (i,j,k) = F_oru (i,j,k) + F_ru (i,j,k) F_oru(i,j,k) = ZERO_8 * F_fi(i+1,j,k) = -c2_8 * wk1m(i,j)*( F_ru(i,j,k) ) % * inv_Geomg_hx_8(i) + F_fi(i+1,j,k) * F_fi(i,j,k) = -c2_8 * wk1m(i,j)*( - F_ru(i,j,k) ) % * inv_Geomg_hx_8(i) + F_fi(i,j,k) * wk1 (i,j) = - c2_8 * F_ru(i,j,k)*( F_fim(i+1,j,k) - F_fim(i,j,k) ) * inv_Geomg_hx_8(i) % + wk1 (i,j) * F_t (i,j,k) = - c1_8 * ( ( 1. - intuv_c0xxu_8(i) )*F_ru(i,j,k) ) % * ( F_qm(i+1,j,k)-F_qm(i,j,k) ) % * inv_Geomg_hx_8(i) + F_t(i,j,k) * F_t (i+1,j,k) = - c1_8 * ( intuv_c0xxu_8(i) *F_ru(i,j,k) ) % * ( F_qm(i+1,j,k)-F_qm(i,j,k) ) % * inv_Geomg_hx_8(i) + F_t(i+1,j,k) * F_q (i+1,j,k) = - c1_8 * ( ( 1. - intuv_c0xxu_8(i) )*F_tm(i,j,k) % + intuv_c0xxu_8(i) *F_tm(i+1,j,k) ) % * ( F_ru(i,j,k) ) % * inv_Geomg_hx_8(i) + F_q(i+1,j,k) * F_q (i,j,k) = - c1_8 * ( ( 1. - intuv_c0xxu_8(i) )*F_tm(i,j,k) % + intuv_c0xxu_8(i) *F_tm(i+1,j,k) ) % * ( - F_ru(i,j,k) ) % * inv_Geomg_hx_8(i) + F_q(i,j,k) * F_u (i,j,k) = - aaa_8 * F_ru(i,j,k)+ F_u(i,j,k) F_ru(i,j,k) = ZERO_8 * 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 * * 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 * * ADJ of * Adding coriolis factor to Ru do j= jn,j0,-1 do i= in,i0,-1 F_ru (i,j,k) = F_oru(i,j,k) + F_ru (i,j,k) F_oru(i,j,k) = ZERO_8 * wk2(i-1,j) = c8_8 * Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,1)*F_ru(i,j,k)) + wk2(i-1,j) * wk2(i,j) = c8_8 * Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,2)*F_ru(i,j,k)) + wk2(i ,j) * wk2(i+1,j) = c8_8 * Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,3)*F_ru(i,j,k)) + wk2(i+1,j) wk2(i+2,j) = c8_8 * Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,4)*F_ru(i,j,k)) + wk2(i+2,j) * F_fi(i+1,j,k)= - c2_8 *wk1m(i,j) * ( F_ru(i,j,k) ) * inv_Geomg_hx_8(i) % + F_fi(i+1,j,k) * F_fi(i,j,k) = - c2_8 *wk1m(i,j) * ( - F_ru(i,j,k) ) * inv_Geomg_hx_8(i) % + F_fi(i,j,k) * wk1(i,j) = - c2_8 *F_ru(i,j,k)*( F_fim(i+1,j,k) - F_fim(i,j,k) ) * inv_Geomg_hx_8(i) + wk1(i,j) * F_q(i+1,j,k) = - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i,j,k) % + intuv_c0xxu_8(i) * F_tm(i+1,j,k) ) % * ( F_ru(i,j,k) ) * inv_Geomg_hx_8(i) + F_q (i+1,j,k) * F_q(i,j,k) = - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i,j,k) % + intuv_c0xxu_8(i) * F_tm(i+1,j,k) ) % * ( - F_ru(i,j,k) ) * inv_Geomg_hx_8(i) + F_q (i,j,k) * F_t(i,j,k) = - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_ru(i,j,k) ) % * ( F_qm(i+1,j,k) - F_qm(i,j,k) ) * inv_Geomg_hx_8(i) + F_t(i,j,k) * F_t(i+1,j,k) = - c1_8 *( intuv_c0xxu_8(i) * F_ru(i,j,k) ) % * ( F_qm(i+1,j,k) - F_qm(i,j,k) ) * inv_Geomg_hx_8(i) + F_t(i+1,j,k) * F_u (i,j,k) = - aaa_8* F_ru(i,j,k) + F_u(i,j,k) F_ru(i,j,k) = ZERO_8 * end do end do * * 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 * if (.not.G_lam) then if (l_north) then do i = inn,i00,-1 * * ADJ * --- F_v(i,jnn-1,k) = inuvl_wyvy3_8(jnn+1,1) * wk2(i,jnn+1) + F_v(i,jnn-1,k) F_v(i,jnn ,k) = inuvl_wyvy3_8(jnn+1,2) * wk2(i,jnn+1) + F_v(i,jnn ,k) F_v(i,jnn+1,k) = inuvl_wyvy3_8(jnn+1,3) * wk2(i,jnn+1) + F_v(i,jnn+1,k) wk2(i,jnn+1) = ZERO_8 F_v(i,jnn ,k) = inuvl_wyvy3_8(jnn+2,1) * wk2(i,jnn+2) + F_v(i,jnn ,k) F_v(i,jnn+1,k) = inuvl_wyvy3_8(jnn+2,2) * wk2(i,jnn+2) + F_v(i,jnn+1,k) wk2(i,jnn+2) = ZERO_8 end do endif if (l_south) then do i = inn,i00,-1 * * ADJ * --- F_v(i,j00-2,k) = inuvl_wyvy3_8(j00-1,2) * wk2(i,j00-1) % + F_v(i,j00-2,k) F_v(i,j00-1,k) = inuvl_wyvy3_8(j00-1,3) * wk2(i,j00-1) % + F_v(i,j00-1,k) F_v(i,j00 ,k) = inuvl_wyvy3_8(j00-1,4) * wk2(i,j00-1) % + F_v(i,j00 ,k) wk2(i,j00-1) = ZERO_8 * F_v(i,j00-2,k) = inuvl_wyvy3_8(j00-2,3) * wk2(i,j00-2) % + F_v(i,j00-2,k) F_v(i,j00-1,k) = inuvl_wyvy3_8(j00-2,4) * wk2(i,j00-2) % + F_v(i,j00-1,k) wk2(i,j00-2) = ZERO_8 end do endif * endif * do j = jnn,j00,-1 do i = inn,i00,-1 * * ADJ * --- F_v(i,j+1,k) = inuvl_wyvy3_8(j,4) * wk2(i,j) + F_v(i,j+1,k) F_v(i,j ,k) = inuvl_wyvy3_8(j,3) * wk2(i,j) + F_v(i,j ,k) F_v(i,j-1,k) = inuvl_wyvy3_8(j,2) * wk2(i,j) + F_v(i,j-1,k) F_v(i,j-2,k) = inuvl_wyvy3_8(j,1) * wk2(i,j) + F_v(i,j-2,k) wk2(i,j) = ZERO_8 * end do end do * endif if (.not. Schm_hydro_L) then do j = jn,j0,-1 do i = in,i0,-1 * * ADJ * --- F_mu(i ,j,k) = ( 1. - intuv_c0xxu_8(i) )* wk1(i,j) + F_mu(i ,j,k) F_mu(i+1,j,k) = intuv_c0xxu_8(i) * wk1(i,j) + F_mu(i+1,j,k) wk1 (i, j) = ZERO_8 * end do end do endif * 1002 continue !$omp enddo * * ADJ of * Exchange haloes for derivatives & interpolation * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * !$omp single * call rpn_comm_adj_halo( F_fi,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * call rpn_comm_adj_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_adj_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_adj_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_adj_halo( F_u, LDIST_DIM,l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * * Zero F_fi,F_q,F_t,F_v,F_u halo * ------------------------- call v4d_zerohalo
( F_fi,l_ni, l_nj, LDIST_DIM, l_nk) call v4d_zerohalo
( F_q, l_ni, l_nj, LDIST_DIM, l_nk) call v4d_zerohalo
( F_t, l_ni, l_nj, LDIST_DIM, l_nk) call v4d_zerohalo
( F_v, l_ni, l_njv,LDIST_DIM, l_nk) call v4d_zerohalo
( F_u, l_niu,l_nj, LDIST_DIM, l_nk) * !$omp end single * !$omp end parallel * return end