!-------------------------------------- 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 nlip_2_ad - ADJ of nlip_2_tl * #include "model_macros_f.h"*
subroutine nlip_2_ad ( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p, 1,1 $ F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, $ F_ncn, F_st0, F_qt0, F_fipt0, F_fis, $ F_ut0, F_vt0, F_mut0 ,F_multx, $ F_wijk1, F_wijk2, * $ F_tpt0m, F_pipt0m, $ F_st0m, F_qt0m, F_fipt0m, $ F_mut0m, $ F_wijk2m, * $ DIST_DIM, Nk ) * implicit none * integer DIST_DIM, Nk real F_nu (DIST_SHAPE,Nk), F_nv (DIST_SHAPE,Nk), % F_n1 (DIST_SHAPE,Nk), F_nth (DIST_SHAPE,Nk), % F_n3 (DIST_SHAPE,Nk), F_n3p (DIST_SHAPE,Nk), % F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk), % F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk), % F_pipt0(DIST_SHAPE,Nk), F_ncn (DIST_SHAPE,Nk), % F_st0 (DIST_SHAPE) , F_qt0 (DIST_SHAPE,Nk), % F_fipt0(DIST_SHAPE,Nk), F_fis (DIST_SHAPE) , % F_ut0 (DIST_SHAPE,Nk), F_vt0 (DIST_SHAPE,Nk), % F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk), % F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk) * real F_tpt0m (DIST_SHAPE,Nk), % F_pipt0m(DIST_SHAPE,Nk), % F_st0m (DIST_SHAPE) , F_qt0m (DIST_SHAPE,Nk), % F_fipt0m(DIST_SHAPE,Nk), % F_mut0m (DIST_SHAPE,Nk), % F_wijk2m(DIST_SHAPE,Nk) * *author * M.Tanguay * *revision * v2_10 - Tanguay M. - initial MPI version * v2_30 - Edouard S. - remove pi' at the top * v2_31 - Tanguay M. - adapt for vertical hybrid coordinate and LAM version * v3_00 - Tanguay M. - adapt to restructured nlip_2 * v3_03 - Tanguay M. - Adjoint Lam and NoHyd configuration * v3_11 - Tanguay M. - AIXport+Opti+OpenMP for TLM-ADJ * v3_31 - Tanguay M. - Modify OPENMP * *object * see id section * -------------------------------------------------------- * REMARK: INPUT TRAJ:F_tpt0m, F_pipt0m, F_qt0m, F_st0m * F_fipt0m, F_mut0m (NoHyd) * -------------------------------------------------------- * *arguments * see documentation of appropriate comdecks * *implicits #include "glb_ld.cdk"
* integer i01, in1, j01, jn1, i02, in2, j02, jn2 * * Prepare the nonlinear perturbation q" of log hydro pressure * and the "relative" geopotential ( phi' + phis ) for gradient * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ i01=1 in1=l_ni j01=1 jn1=l_nj i02=1 in2=l_ni j02=1 jn2=l_nj if (G_lam) then if (l_west) i01=1+pil_w -1 if (l_east) in1=l_ni-pil_e +1 if (l_south)j01=1+pil_s -1 if (l_north)jn1=l_nj-pil_n +1 if (l_west) i02=1+pil_w if (l_east) in2=l_ni-pil_e if (l_south)j02=1+pil_s if (l_north)jn2=l_nj-pil_n endif * call nlip_2_2_ad
( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p, $ F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, $ F_ncn, F_st0, F_qt0, F_fipt0, F_fis, $ F_ut0, F_vt0, F_mut0 ,F_multx, $ F_wijk1, F_wijk2, * $ F_tpt0m, F_pipt0m, $ F_st0m, F_qt0m, F_fipt0m, $ F_mut0m, $ F_wijk2m, * $ DIST_DIM, Nk, $ i01,j01,in1,jn1,i02,j02,in2,jn2 ) * return end * ! 2nd stage added for OpenMP *
subroutine nlip_2_2_ad ( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p, 1,10 $ F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, $ F_ncn, F_st0, F_qt0, F_fipt0, F_fis, $ F_ut0, F_vt0, F_mut0 ,F_multx, $ F_wijk1, F_wijk2, * $ F_tpt0m, F_pipt0m, $ F_st0m, F_qt0m, F_fipt0m, $ F_mut0m, $ F_wijk2m, * $ DIST_DIM, Nk, $ i01,j01,in1,jn1,i02,j02,in2,jn2 ) * implicit none * integer DIST_DIM, Nk, i01,j01,in1,jn1,i02,j02,in2,jn2 real F_nu (DIST_SHAPE,Nk), F_nv (DIST_SHAPE,Nk), % F_n1 (DIST_SHAPE,Nk), F_nth (DIST_SHAPE,Nk), % F_n3 (DIST_SHAPE,Nk), F_n3p (DIST_SHAPE,Nk), % F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk), % F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk), % F_pipt0(DIST_SHAPE,Nk), F_ncn (DIST_SHAPE,Nk), % F_st0 (DIST_SHAPE) , F_qt0 (DIST_SHAPE,Nk), % F_fipt0(DIST_SHAPE,Nk), F_fis (DIST_SHAPE) , % F_ut0 (DIST_SHAPE,Nk), F_vt0 (DIST_SHAPE,Nk), % F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk), % F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk) * real F_tpt0m (DIST_SHAPE,Nk), % F_pipt0m(DIST_SHAPE,Nk), % F_st0m (DIST_SHAPE) , F_qt0m (DIST_SHAPE,Nk), % F_fipt0m(DIST_SHAPE,Nk), % F_mut0m (DIST_SHAPE,Nk), % F_wijk2m(DIST_SHAPE,Nk) * *author * M.Tanguay * *revision * v2_10 - Tanguay M. - initial MPI version * v2_30 - Edouard S. - remove pi' at the top * v2_31 - Tanguay M. - adapt for vertical hybrid coordinate and LAM version * v3_00 - Tanguay M. - adapt to restructured nlip_2 * v3_03 - Tanguay M. - Adjoint Lam and NoHyd configuration * v3_11 - Tanguay M. - AIXport+Opti+OpenMP for TLM-ADJ * v3_21 - Tanguay M. - Revision Openmp * *object * see id section * -------------------------------------------------------- * REMARK: INPUT TRAJ:F_tpt0m, F_pipt0m, F_qt0m, F_st0m * F_fipt0m, F_mut0m (NoHyd) * -------------------------------------------------------- * *arguments * see documentation of appropriate comdecks * *implicits #include "glb_ld.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "cori.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "ptopo.cdk"
* integer i, j, k, i00, inn, j00, jnn, i0, in, j0, jn real wk2(DIST_SHAPE),w1,w2,w3 * real*8 ONE_8, HALF_8, QUARTER_8, ZERO_8 parameter ( ONE_8=1.0, HALF_8=.5, QUARTER_8=.25, ZERO_8=0.0 ) * real*8 eps_8, gamma_8 real*8 p1_8,p2_8,p3_8,p4_8,p5_8,p6_8,p7_8,t1_8,t2_8,t3_8,t4_8 * real q1 * real w1m,w2m * real*8, dimension(i01:in1,j01:jn1) :: invm_8 real*8, dimension(i02:in2,j02:jn2) :: yexp2m_8,xlog2m_8,inv2m_8 * * ______________________________________________________ * * * TRAJECTORY * ---------- call rpn_comm_xch_halo( F_tpt0m ,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_qt0m ,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_mut0m ,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) endif * gamma_8 = ONE_8 if (.not. Schm_hydro_L) then eps_8 = Schm_nonhy_8 * Dcst_rgasd_8 * Cstv_tstr_8 % /( Dcst_cappa_8 * Dcst_grav_8**2 * Cstv_tau_8**2 ) gamma_8 = ONE_8/( ONE_8 + eps_8 ) endif p1_8 = Dcst_rayt_8*Dcst_rayt_8 p2_8 = ONE_8 / Cstv_tau_8 p3_8 = ONE_8 / p1_8 p4_8 = Dcst_rgasd_8 / p1_8 p5_8 = ONE_8 / Cstv_tstr_8 p6_8 = gamma_8 / Cstv_tau_8 p7_8 = p6_8 / Dcst_cappa_8 * q1 = ONE_8 / Cstv_tau_8 * i0=i01 j0=j01 in=in1 jn=jn1 * * ---------------------------- * START TRAJECTORY CALCULATION * ---------------------------- do k=1,l_nk if (.not. Schm_hydro_L) then do j= j0, jn do i= i0, in * F_wijk2m(i,j,k)= F_fipt0m(i,j,k) + F_fis(i,j) * enddo enddo endif enddo * * TRAJECTORY * ---------- if (.not. Schm_hydro_L) then call rpn_comm_xch_halo( F_wijk2m,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) endif * * -------------------------- * END TRAJECTORY CALCULATION * -------------------------- * * ------------------------- * START ADJOINT CALCULATION * ------------------------- i0=1 in=l_ni j0=1 jn=l_nj if (G_lam) then if (l_west) i0 = 1+pil_w if (l_east) in = l_ni-pil_e if (l_south) j0 = 1+pil_s if (l_north) jn = l_nj-pil_n endif * *********************************************** * ADJ of * The RHS of the nonlinear Helmholtz equation * *********************************************** * ************************************** * ADJ of * Combination of governing equations * ************************************** do k=l_nk,1,-1 * if (k.eq.1) then * t1_8 = QUARTER_8*Geomg_hz_8(k) t3_8 = HALF_8*Geomg_z_8(k) t4_8 = HALF_8*Geomg_z_8(k+1) * * ADJ * --- * do j= j0, jn do i= i0, in * F_rhell(i,j,k ) = p1_8 * ( F_rheln(i,j,k) ) + F_rhell(i,j,k ) F_wijk1(i,j,k ) = p1_8 * ( % - t1_8 * (F_rheln(i,j,k)) ) + F_wijk1(i,j,k ) F_wijk1(i,j,k+1) = p1_8 * ( % - t1_8 * (F_rheln(i,j,k)) ) + F_wijk1(i,j,k+1) F_wijk2(i,j,k ) = p1_8 * ( % t3_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k ) F_wijk2(i,j,k+1) = p1_8 * ( % t4_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k+1) F_rheln(i,j,k ) = ZERO_8 * end do end do * elseif (k.eq.l_nk) then * t1_8 = QUARTER_8*Geomg_hz_8(k-1) t3_8 = HALF_8*Geomg_z_8(k-1) t4_8 = HALF_8*Geomg_z_8(k) * do j= j0, jn do i= i0, in * F_rhell(i,j,k ) = p1_8 * ( F_rheln(i,j,k) ) + F_rhell(i,j,k ) F_wijk1(i,j,k-1) = p1_8 * ( % - t1_8 * (F_rheln(i,j,k)) ) + F_wijk1(i,j,k-1) F_wijk1(i,j,k ) = p1_8 * ( % - t1_8 * (F_rheln(i,j,k)) ) + F_wijk1(i,j,k ) F_wijk2(i,j,k-1) = p1_8 * ( % - t3_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k-1) F_wijk2(i,j,k ) = p1_8 * ( % - t4_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k ) F_rheln(i,j,k ) = ZERO_8 * end do end do * else * t1_8 = QUARTER_8*Geomg_hz_8(k-1) t2_8 = QUARTER_8*Geomg_hz_8(k) t3_8 = HALF_8*Geomg_z_8(k-1) t4_8 = HALF_8*Geomg_z_8(k+1) * * ADJ * --- do j= j0, jn do i= i0, in * F_rhell(i,j,k ) = p1_8 * ( F_rheln(i,j,k) ) + F_rhell(i,j,k ) F_wijk1(i,j,k-1) = p1_8 * ( % - t1_8 * F_rheln(i,j,k) ) + F_wijk1(i,j,k-1) F_wijk1(i,j,k ) = p1_8 * ( % - t1_8 * F_rheln(i,j,k) ) + F_wijk1(i,j,k ) F_wijk1(i,j,k ) = p1_8 * ( % - t2_8 * F_rheln(i,j,k) ) + F_wijk1(i,j,k ) F_wijk1(i,j,k+1) = p1_8 * ( % - t2_8 * F_rheln(i,j,k) ) + F_wijk1(i,j,k+1) F_wijk2(i,j,k-1) = p1_8 * ( % - t3_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k-1) F_wijk2(i,j,k+1) = p1_8 * ( % t4_8 * F_rheln(i,j,k) ) + F_wijk2(i,j,k+1) F_rheln(i,j,k ) = ZERO_8 * end do end do * end if * end do * !$omp parallel do private(invm_8,xlog2m_8, !$omp$ inv2m_8,wk2,w1m,w2m,w1,w2,w3, !$omp$ t1_8,t2_8,t3_8,t4_8) * * ADJ of * Compute the nonlinear deviation of horizontal divergence * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ do k=1,l_nk * if (.not. Schm_hydro_L) then do j= j0, jn do i= i0, in * * ADJ * --- F_n3 (i,j,k) = p7_8* F_wijk2(i,j,k) + F_n3 (i,j,k) * F_n3p(i,j,k) = p6_8* F_wijk1(i,j,k) + F_n3p(i,j,k) * F_n3 (i,j,k) = F_n3p(i,j,k) + F_n3 (i,j,k) F_nth(i,j,k) = - eps_8* F_n3p(i,j,k) + F_nth(i,j,k) F_n3p(i,j,k) = ZERO_8 * F_multx(i,j,k) = ( F_n3 (i,j,k) )*p2_8 + F_multx(i,j,k) F_mut0 (i,j,k) = ( -F_n3 (i,j,k) )*p2_8 + F_mut0 (i,j,k) F_n3 (i,j,k) = ZERO_8 * end do end do endif * do j= j0, jn do i= i0, in inv2m_8(i,j) = ONE_8+F_tpt0m(i,j,k)*p5_8 end do call vrec ( inv2m_8(i0,j), inv2m_8(i0,j), (in-i0+1) ) end do * do j= j0, jn do i= i0, in * F_nth (i,j,k) = p7_8* F_wijk2(i,j,k) + F_nth(i,j,k) F_wijk2(i,j,k) = ZERO_8 * F_n1 (i,j,k) = F_wijk1(i,j,k) + F_n1(i,j,k) F_ncn (i,j,k) = - q1 * F_wijk1(i,j,k) + F_ncn(i,j,k) F_wijk1(i,j,k) = ZERO_8 * F_wijk1(i,j,k) = (-Dcst_cappa_8*F_nth(i,j,k))*p2_8 + F_wijk1(i,j,k) t1_8 = ( F_nth(i,j,k))*p2_8 C t1_8 = ( F_nth(i,j,k))*p2_8 + t1_8 F_nth (i,j,k) = ZERO_8 * F_tplt0(i,j,k) = -t1_8 *p5_8 + F_tplt0(i,j,k) F_tpt0 (i,j,k) = ( t1_8 *p5_8 )*inv2m_8(i,j) + F_tpt0 (i,j,k) C t1_8 = ZERO_8 * end do end do * if (G_lam) then do j= jn,j0,-1 do i= in,i0,-1 * * ADJ * --- F_nv(i, j, k) = ( F_n1(i,j,k) )* Geomg_invhsyv_8(j-1) + F_nv(i,j, k) F_nv(i, j-1,k) = (- F_n1(i,j,k) )* Geomg_invhsyv_8(j-1) + F_nv(i,j-1,k) F_nu(i, j, k) = ( F_n1(i,j,k) )/( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) ) % + F_nu(i, j,k) F_nu(i-1,j, k) = (- F_n1(i,j,k) )/( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) ) % + F_nu(i-1,j,k) F_n1(i, j, k) = ZERO_8 * end do end do else * * ADJ * --- call caldiv_2_ad
( F_n1(minx,miny,k), F_nu(minx,miny,k), $ F_nv(minx,miny,k), LDIST_DIM, 1 ) * endif * end do !$omp end parallel do * do j = j0, jn do i = i0, in yexp2m_8(i,j) = F_st0m(i,j) end do call vexp ( yexp2m_8(i0,j), yexp2m_8(i0,j), (in-i0+1) ) end do * * ADJ * --- call rpn_comm_adj_halo( F_nv, 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_nu, LDIST_DIM,l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * do k= 1,l_nk * * Zero F_nv halo * -------------- call v4d_zerohalo
( F_nv(l_minx,l_miny,k),l_ni, l_njv,LDIST_DIM, 1) * * Zero F_nu halo * -------------- call v4d_zerohalo
( F_nu(l_minx,l_miny,k),l_niu,l_nj, LDIST_DIM, 1) * enddo * * ADJ of * compute Ncn * ~~~~~~~~~~~ * do k = 1, l_nk * do j = j0, jn do i = i0, in xlog2m_8(i,j) = 1. + Geomg_dpba(k) * (yexp2m_8(i,j) - 1.0) end do call vrec( inv2m_8(i0,j), xlog2m_8(i0,j), (in-i0+1)) end do * do j = j0, jn do i = i0, in * w1 = q1 * ( F_ncn(i,j,k) ) w2 = q1 * (- F_ncn(i,j,k) ) F_ncn(i,j,k) = ZERO_8 * F_st0(i,j) = Geomg_dpib(k) * w2 + % ( Geomg_dpba(k) * (yexp2m_8(i,j)*w1 ) ) * inv2m_8(i,j) % + F_st0(i,j) * enddo enddo * enddo * ************************************************************ * ADJ of * The nonlinear deviation of horizontal momentum equations * ************************************************************ * * ADJOINT of * For LAM, set Nu,Nv values on the boundaries of the LAM grid * if (G_lam) then if (l_north) then do k=1,l_nk do i=1+pil_w,l_ni-pil_e * F_nv(i,l_nj-pil_n,k) = 0. * end do enddo endif if (l_south) then do k=1,l_nk do i=1+pil_w,l_ni-pil_e * F_nv(i,pil_s,k) = 0. * end do enddo endif if (l_east) then do k=1,l_nk do j=1+pil_s,l_nj-pil_n * F_nu(l_ni-pil_e,j,k) = 0. * end do enddo endif if (l_west) then do k=1,l_nk do j=1+pil_s,l_nj-pil_n * F_nu(pil_w,j,k) = 0. * end do enddo endif endif * i0=i01 j0=j01 in=in1 jn=jn1 * !$omp parallel do private(invm_8,xlog2m_8, !$omp$ inv2m_8,wk2,w1m,w2m,w1,w2,w3, !$omp$ t1_8,t2_8,t3_8,t4_8) do 101 k=l_nk,1,-1 * * Zero adjoint variables * ---------------------- do j = l_miny,l_maxy do i = l_minx,l_maxx wk2(i,j) = ZERO_8 enddo enddo * i0 = 1 in = l_niu j0 = 1+pil_s jn = l_nj-pil_n if (G_lam) then if (l_west) i0 = 1+pil_w if (l_east) in = l_niu-pil_e endif i00 = 1+pil_w inn = l_ni-pil_e j00 = 1 jnn = l_njv if (G_lam) then if (l_south) j00 = 1+pil_s if (l_north) jnn = l_njv-pil_n endif * if (.not. Schm_hydro_L) then * * ADJ of * Add nonhydrostatic contributions to Nv * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ do j= jnn, j00, -1 do i= inn, i00, -1 * * TRAJECTORY * ---------- w1m = ( 1. - intuv_c0yyv_8(j) ) * F_mut0m(i,j ,k) % + intuv_c0yyv_8(j) * F_mut0m(i,j+1,k) w2m = (F_wijk2m (i,j+1,k) - F_wijk2m(i,j,k) ) % *Geomg_cyv2_8(j) * Geomg_invhsy_8(j) * * ADJ * --- C w2 = p3_8 *( w1m*F_nv(i,j,k)) + w2 C w1 = p3_8 *(F_nv(i,j,k)*w2m ) + w1 w2 = p3_8 *( w1m*F_nv(i,j,k)) w1 = p3_8 *(F_nv(i,j,k)*w2m ) * F_wijk2(i,j+1,k) = w2 % *Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_wijk2 (i,j+1,k) F_wijk2(i,j, k) = -w2 % *Geomg_cyv2_8(j)*Geomg_invhsy_8(j) + F_wijk2 (i,j, k) C w2 = ZERO_8 * F_mut0(i,j ,k) = ( 1. - intuv_c0yyv_8(j) ) * w1 + F_mut0(i,j ,k) F_mut0(i,j+1,k) = intuv_c0yyv_8(j) * w1 + F_mut0(i,j+1,k) C w1 = ZERO_8 * end do end do * * Add nonhydrostatic contributions to Nu * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ do j= jn, j0,-1 do i= in, i0,-1 * * TRAJECTORY * ---------- w1m = ( 1. - intuv_c0xxu_8(i) ) * F_mut0m(i ,j,k) % + intuv_c0xxu_8(i) * F_mut0m(i+1,j,k) w2m = ( F_wijk2m(i+1,j,k) -F_wijk2m (i,j,k) ) * Geomg_invhx_8(i) * * ADJ * --- C w2 = p3_8 *( w1m*F_nu(i,j,k) ) + w2 C w1 = p3_8 *(F_nu(i,j,k)*w2m ) + w1 w2 = p3_8 *( w1m*F_nu(i,j,k) ) w1 = p3_8 *(F_nu(i,j,k)*w2m ) * F_wijk2(i+1,j,k) = w2 * Geomg_invhx_8(i) + F_wijk2(i+1,j,k) F_wijk2(i, j,k) = - w2 * Geomg_invhx_8(i) + F_wijk2(i, j,k) C w2 = ZERO_8 * F_mut0(i ,j,k) = ( 1. - intuv_c0xxu_8(i) ) * w1 + F_mut0(i ,j,k) F_mut0(i+1,j,k) = intuv_c0xxu_8(i) * w1 + F_mut0(i+1,j,k) C w1 = ZERO_8 * end do end do * endif * * ADJ of * Compute Nv for hydrostatic version * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Set indices Nv * -------------- i0 = 1+pil_w in = l_ni-pil_e j0 = 1 jn = l_njv if (G_lam) then if (l_south) j0=1+pil_s if (l_north) jn=l_njv-pil_n endif * if (Cori_cornl_L) then * * Set indices for calculating Nv when Cori_cornl_L=.TRUE. * ------------------------------------------------------- if (.not.G_lam) then if (l_south) j0 = 2 if (l_north) jn = l_njv-1 endif * if (.not.G_lam) then if (l_north) then do i = i0, in * ADJ * --- wk2(i,l_njv-1) = Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,1)*F_nv(i,l_njv,k) ) + wk2(i,l_njv-1) wk2(i,l_njv ) = Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,2)*F_nv(i,l_njv,k) ) + wk2(i,l_njv ) wk2(i,l_njv+1) = Cori_fcorv_8(i,l_njv) * % ( inuvl_wyyv3_8(l_njv,3)*F_nv(i,l_njv,k) ) + wk2(i,l_njv+1) end do endif * if (l_south) then do i = i0, in * ADJ * --- wk2(i,1) = Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,2)*F_nv(i,1,k)) + wk2(i,1) wk2(i,2) = Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,3)*F_nv(i,1,k)) + wk2(i,2) wk2(i,3) = Cori_fcorv_8(i,1) % * (inuvl_wyyv3_8(1,4)*F_nv(i,1,k)) + wk2(i,3) end do endif endif * do j = jn, j0,-1 do i = i0, in * ADJ * --- wk2(i,j-1) = Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,1)*F_nv(i,j,k)) + wk2(i,j-1) wk2(i,j ) = Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,2)*F_nv(i,j,k)) + wk2(i,j ) wk2(i,j+1) = Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,3)*F_nv(i,j,k)) + wk2(i,j+1) wk2(i,j+2) = Cori_fcorv_8(i,j) * % (inuvl_wyyv3_8(j,4)*F_nv(i,j,k)) + wk2(i,j+2) end do end do * * * Set indices for calculating wk2 * ------------------------------- j00 = miny jnn = maxy i00 = 1+pil_w inn = l_niu if (G_lam) then if (l_south) j00=1+pil_s-2 if (l_north) jnn=l_njv-pil_n+3 if (l_east) inn = l_niu-pil_e +1 endif * do j = j00, jnn do i = inn, i00,-1 * ADJ * --- F_ut0(i-2,j,k) = inuvl_wxux3_8(i,1)*wk2(i,j) + F_ut0(i-2,j,k) F_ut0(i-1,j,k) = inuvl_wxux3_8(i,2)*wk2(i,j) + F_ut0(i-1,j,k) F_ut0(i ,j,k) = inuvl_wxux3_8(i,3)*wk2(i,j) + F_ut0(i ,j,k) F_ut0(i+1,j,k) = inuvl_wxux3_8(i,4)*wk2(i,j) + F_ut0(i+1,j,k) wk2(i,j) = ZERO_8 end do end do * endif * * Reset indices Nv * ---------------- i0 = 1+pil_w in = l_ni-pil_e j0 = 1 jn = l_njv if (G_lam) then if (l_south) j0=1+pil_s if (l_north) jn=l_njv-pil_n endif * * ADJ * --- do j= jn, j0, -1 t1_8 = Geomg_cyv2_8(j) * Geomg_invhsy_8(j) * do i= in, i0, -1 * * TRAJECTORY * ---------- w1m = ( 1. - intuv_c0yyv_8(j) ) * F_tpt0m(i,j ,k) % + intuv_c0yyv_8(j) * F_tpt0m(i,j+1,k) w2m = (F_qt0m(i,j+1,k) - F_qt0m(i,j,k)) * t1_8 * * ADJ * --- w2 = p4_8 * ( w1m * F_nv(i,j,k) ) w1 = p4_8 * ( F_nv(i,j,k) * w2m ) w3 = p4_8 * ( Cstv_tstr_8 * F_nv(i,j,k) ) F_nv(i,j,k) = ZERO_8 * F_wijk1(i,j+1,k) = ( w3)*t1_8 + F_wijk1(i,j+1,k) F_wijk1(i,j, k) = (-w3)*t1_8 + F_wijk1(i,j, k) C w3 = ZERO_8 * F_qt0(i,j+1,k) = ( w2)*t1_8 + F_qt0(i,j+1,k) F_qt0(i,j, k) = (- w2)*t1_8 + F_qt0(i,j, k) C w2 = ZERO_8 * F_tpt0(i,j+1,k)= intuv_c0yyv_8(j) * w1 + F_tpt0(i,j+1,k) F_tpt0(i,j ,k)= ( 1. - intuv_c0yyv_8(j) ) * w1 + F_tpt0(i,j ,k) C w1 = ZERO_8 * end do end do * * ADJ of * Compute Nu for hydrostatic version * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Set indices Nu * -------------- i0 = 1 in = l_niu j0 = 1+pil_s jn = l_nj-pil_n if (G_lam) then if (l_west) i0=1+pil_w if (l_east) in=l_niu-pil_e endif * if (Cori_cornl_L) then * * Set indices for calculating wk2 * ------------------------------- i00 = minx inn = maxx j00 = 1+pil_s jnn = l_njv if (G_lam) then if (l_west) i00 = 1+pil_w -2 if (l_east) inn = l_niu-pil_e +3 if (l_north)jnn = l_njv-pil_n +1 else if (l_south) j00 = 3 if (l_north) jnn = l_njv-1 endif * do j= j0, jn do i= in, i0, -1 * ADJ * --- wk2(i-1,j) = - Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,1)*F_nu(i,j,k)) + wk2(i-1,j) wk2(i ,j) = - Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,2)*F_nu(i,j,k)) + wk2(i ,j) wk2(i+1,j) = - Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,3)*F_nu(i,j,k)) + wk2(i+1,j) wk2(i+2,j) = - Cori_fcoru_8(i,j) * % (inuvl_wxxu3_8(i,4)*F_nu(i,j,k)) + wk2(i+2,j) end do end do * if (.not.G_lam) then if (l_north) then do i = i00, inn * ADJ * --- F_vt0(i,jnn+1,k)= inuvl_wyvy3_8(jnn+1,3)*wk2(i,jnn+1) + F_vt0(i,jnn+1,k) F_vt0(i,jnn ,k)= inuvl_wyvy3_8(jnn+1,2)*wk2(i,jnn+1) + F_vt0(i,jnn ,k) F_vt0(i,jnn-1,k)= inuvl_wyvy3_8(jnn+1,1)*wk2(i,jnn+1) + F_vt0(i,jnn-1,k) wk2(i,jnn+1)= ZERO_8 * F_vt0(i,jnn+1,k)= inuvl_wyvy3_8(jnn+2,2)*wk2(i,jnn+2) + F_vt0(i,jnn+1,k) F_vt0(i,jnn ,k)= inuvl_wyvy3_8(jnn+2,1)*wk2(i,jnn+2) + F_vt0(i,jnn ,k) wk2(i,jnn+2)= ZERO_8 end do endif if (l_south) then do i = i00, inn * ADJ * --- F_vt0(i,j00 ,k)= inuvl_wyvy3_8(j00-1,4)*wk2(i,j00-1) + F_vt0(i,j00 ,k) F_vt0(i,j00-1,k)= inuvl_wyvy3_8(j00-1,3)*wk2(i,j00-1) + F_vt0(i,j00-1,k) F_vt0(i,j00-2,k)= inuvl_wyvy3_8(j00-1,2)*wk2(i,j00-1) + F_vt0(i,j00-2,k) wk2(i,j00-1)= ZERO_8 * F_vt0(i,j00-1,k)= inuvl_wyvy3_8(j00-2,4)*wk2(i,j00-2) + F_vt0(i,j00-1,k) F_vt0(i,j00-2,k)= inuvl_wyvy3_8(j00-2,3)*wk2(i,j00-2) + F_vt0(i,j00-2,k) wk2(i,j00-2)= ZERO_8 end do endif endif * do j = jnn, j00,-1 do i = i00, inn * ADJ * --- F_vt0(i,j+1,k) = inuvl_wyvy3_8(j,4) * wk2(i,j) + F_vt0(i,j+1,k) F_vt0(i,j ,k) = inuvl_wyvy3_8(j,3) * wk2(i,j) + F_vt0(i,j ,k) F_vt0(i,j-1,k) = inuvl_wyvy3_8(j,2) * wk2(i,j) + F_vt0(i,j-1,k) F_vt0(i,j-2,k) = inuvl_wyvy3_8(j,1) * wk2(i,j) + F_vt0(i,j-2,k) wk2(i,j) = ZERO_8 end do end do * endif * do j= jn, j0,-1 * do i= in, i0,-1 * * TRAJECTORY * ---------- w1m = ( 1. - intuv_c0xxu_8(i) ) * F_tpt0m(i ,j,k) % + intuv_c0xxu_8(i) * F_tpt0m(i+1,j,k) w2m = ( F_qt0m(i+1,j,k) - F_qt0m(i,j,k) ) * Geomg_invhx_8(i) * * ADJ * --- w2 = p4_8 * ( w1m * F_nu(i,j,k) ) w1 = p4_8 * ( F_nu(i,j,k) * w2m ) w3 = p4_8 * ( Cstv_tstr_8 * F_nu(i,j,k) ) F_nu(i,j,k) = ZERO_8 * F_wijk1(i+1,j,k) = ( w3 ) * Geomg_invhx_8(i) + F_wijk1(i+1,j,k) F_wijk1(i, j,k) = ( - w3 ) * Geomg_invhx_8(i) + F_wijk1(i, j,k) C w3 = ZERO_8 * F_qt0(i+1,j,k) = ( w2 ) * Geomg_invhx_8(i) + F_qt0(i+1,j,k) F_qt0(i, j,k) = ( - w2 ) * Geomg_invhx_8(i) + F_qt0(i, j,k) C w2 = ZERO_8 * F_tpt0(i+1,j,k)= intuv_c0xxu_8(i) * w1 + F_tpt0(i+1,j,k) F_tpt0(i ,j,k)= ( 1. - intuv_c0xxu_8(i) ) * w1 + F_tpt0(i ,j,k) C w1 = ZERO_8 * end do end do * 101 continue !$omp end parallel do * * ADJ * --- if (Cori_cornl_L) then call rpn_comm_adj_halo( F_vt0 , 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_ut0 , LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) endif * if (.not. Schm_hydro_L) then call rpn_comm_adj_halo( F_wijk2,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_mut0 ,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) endif call rpn_comm_adj_halo( F_wijk1, 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_qt0 , 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_tpt0 , LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * if (Cori_cornl_L) then * do k= 1,l_nk * * Zero F_ut0,F_vt0 halo * --------------------- call v4d_zerohalo
( F_ut0(l_minx,l_miny,k),l_niu,l_nj, LDIST_DIM, 1) call v4d_zerohalo
( F_vt0(l_minx,l_miny,k),l_ni ,l_njv,LDIST_DIM, 1) * enddo * endif * if (.not. Schm_hydro_L) then * do k= 1,l_nk * * Zero F_wijk2,F_mut0 * ------------------- call v4d_zerohalo
( F_wijk2(l_minx,l_miny,k),l_ni, l_nj,LDIST_DIM, 1) call v4d_zerohalo
( F_mut0 (l_minx,l_miny,k),l_ni, l_nj,LDIST_DIM, 1) * enddo * endif * do k= 1,l_nk * * Zero F_wijk1,F_qt0,F_tpt0 halo * ------------------------------ call v4d_zerohalo
( F_wijk1(l_minx,l_miny,k),l_ni, l_nj,LDIST_DIM, 1) call v4d_zerohalo
( F_qt0 (l_minx,l_miny,k),l_ni, l_nj,LDIST_DIM, 1) call v4d_zerohalo
( F_tpt0 (l_minx,l_miny,k),l_ni, l_nj,LDIST_DIM, 1) * enddo * * ADJ of * Prepare the nonlinear perturbation q" of log hydro pressure * and the "relative" geopotential ( phi' + phis ) for gradient * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ i0=1 in=l_ni j0=1 jn=l_nj if (G_lam) then if (l_west) i0=1+pil_w -1 if (l_east) in=l_ni-pil_e +1 if (l_south)j0=1+pil_s -1 if (l_north)jn=l_nj-pil_n +1 endif * !$omp parallel do private(invm_8,xlog2m_8, !$omp$ inv2m_8,wk2,w1m,w2m,w1,w2,w3, !$omp$ t1_8,t2_8,t3_8,t4_8) do k=1,l_nk * if (.not. Schm_hydro_L) then do j= j0, jn do i= i0, in * * ADJ * --- F_fipt0(i,j,k) = F_wijk2(i,j,k) + F_fipt0(i,j,k) F_wijk2(i,j,k) = ZERO_8 * enddo enddo endif * t1_8 = ONE_8/Geomg_z_8(k) * do j= j0, jn do i= i0, in invm_8(i,j) = ONE_8 + F_pipt0m(i,j,k)*t1_8 end do call vrec ( invm_8(i0,j), invm_8(i0,j), (in-i0+1)) end do * do j= j0, jn do i= i0, in * * ADJ * --- C F_st0 (i,j) = - ( Geomg_pib(k)* F_wijk1(i,j,k))*t1_8 C % + F_st0 (i,j) F_pipt0(i,j,k) = ( F_wijk1(i,j,k) *t1_8 ) * invm_8(i,j) % + F_pipt0(i,j,k) C F_wijk1(i,j,k) = ZERO_8 * enddo enddo * enddo !$omp end parallel do * do k=1,l_nk * t1_8 = ONE_8/Geomg_z_8(k) * do j= j0, jn do i= i0, in * * ADJ * --- F_st0 (i,j) = - ( Geomg_pib(k)* F_wijk1(i,j,k))*t1_8 % + F_st0 (i,j) C F_pipt0(i,j,k) = ( F_wijk1(i,j,k) *t1_8 ) * invm_8(i,j) C % + F_pipt0(i,j,k) F_wijk1(i,j,k) = ZERO_8 * enddo enddo * enddo * __________________________________________________________________ * return end