!-------------------------------------- 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 initw2_ad -- ADJ of initw2_tl * #include "model_macros_f.h"*
subroutine initw2_ad ( F_wt1, F_mul, F_mu,F_uu, F_vv, F_psd, F_fi, F_tt, F_ss, 1,10 $ F_uum,F_vvm,F_psdm,F_fim,F_ttm,F_ssm, $ DIST_DIM ) * implicit none * integer DIST_DIM real F_wt1(DIST_SHAPE,*),F_ss (DIST_SHAPE ),F_uu (DIST_SHAPE,*), $ F_vv (DIST_SHAPE,*),F_psd(DIST_SHAPE,*),F_fi (DIST_SHAPE,*), $ F_tt (DIST_SHAPE,*),F_mul(DIST_SHAPE,*),F_mu (DIST_SHAPE,*) * real F_ssm (DIST_SHAPE ),F_uum (DIST_SHAPE,*), $ F_vvm (DIST_SHAPE,*),F_psdm(DIST_SHAPE,*),F_fim (DIST_SHAPE,*), $ F_ttm (DIST_SHAPE,*) * *author * M.Tanguay * *revision * v3_03 - Tanguay M. - initial MPI version * v3_30 - Tanguay M. - Change parameters of initw2 * - use of geomg_invhsy_8, moved j0,jn,ng before * parallel region as in initw2 * *object * see id section * ------------------------------------------------- * REMARK: INPUT TRAJ: ssm, uum, vvm, psdm, fim, ttm * ------------------------------------------------- * *ADJ of *arguments * Name I/O Description *---------------------------------------------------------------- * F_wt1 O vertical velocity ( DZ/Dt ) * F_uu I x component of hor. velocity * F_vv I y component of hor. velocity * F_psd I vertical velocity ( pi star dot ) * F_fi I geopotential * F_tt I virtual temperature * F_ss I ln (pi / z ) * s s *---------------------------------------------------------------- * *implicits #include "glb_ld.cdk"
#include "geomg.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "dcst.cdk"
#include "cstv.cdk"
#include "schm.cdk"
* *modules integer i, j, k, j0, jn, in1, in2, jn1, jn2, ng real wk1 (DIST_SHAPE,G_nk), wk2 (DIST_SHAPE,G_nk), $ wk3 (DIST_SHAPE,G_nk), wk4 (DIST_SHAPE,G_nk) real wk1m(DIST_SHAPE,G_nk), wk2m(DIST_SHAPE,G_nk), $ wk3m(DIST_SHAPE,G_nk), wk4m(DIST_SHAPE,G_nk) * real*8, parameter :: ZERO_8 = 0.0 * __________________________________________________________________ * * TRAJECTORY * ---------- 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 ) * in1= l_ni in2= l_niu jn1= l_nj jn2= l_njv j0 = 1 jn = l_njv if (l_south) j0 = 3 if (l_north) jn = l_njv - 1 * ng is used in hatoprg ng = (l_maxx-l_minx+1)*(l_maxy-l_miny+1) * !$omp parallel shared( j0,jn,in1,in2,jn1,jn2,ng ) !$omp do do k = 1,G_nk * * Zero adjoint variables * ---------------------- wk1(:,:,k) = 0. wk2(:,:,k) = 0. wk3(:,:,k) = 0. wk4(:,:,k) = 0. * * ---------------- * START TRAJECTORY * ---------------- wk1m(:,:,k)= 0. wk2m(:,:,k)= 0. wk3m(:,:,k)= 0. wk4m(:,:,k)= 0. * end do !$omp enddo * **************************************************** * TERM1: HORIZONTAL ADVECTION OF GEOGRAPHIC HEIGHT * **************************************************** * * Gradient of geopotential * ~~~~~~~~~~~~~~~~~~~~~~~~ * !$omp do do k = 1, G_nk do j = 1, jn1 do i = 1, in2 * wk1m(i,j,k) = ( F_fim(i+1,j,k) - F_fim(i,j,k) ) / Geomg_hx_8(i) $ * F_uum(i,j,k) / Dcst_grav_8 * end do end do do j = 1, jn2 do i = 1, in1 * wk2m(i,j,k) = ( F_fim(i,j+1,k) - F_fim(i,j,k) ) * $ Geomg_cyv2_8(j) * Geomg_invhsy_8(j) $ * F_vvm(i,j,k) / Dcst_grav_8 * end do end do end do !$omp end do * * Interpolate from staggered grids to basic grid * !$omp single call rpn_comm_xch_halo ( wk1m, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo ( wk2m, LDIST_DIM, l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) !$omp end single * !$omp do do k = 1, G_nk do j = 1, jn1 do i = 1, in2 * wk3m(i,j,k) = inuvl_wxux3_8(i,1) * wk1m(i-2,j,k) $ + inuvl_wxux3_8(i,2) * wk1m(i-1,j,k) $ + inuvl_wxux3_8(i,3) * wk1m(i ,j,k) $ + inuvl_wxux3_8(i,4) * wk1m(i+1,j,k) * end do end do end do !$omp end do * j0 = 1 jn = l_njv if (l_south) j0 = 3 if (l_north) jn = l_njv - 1 !$omp do do k=1,G_nk do j = j0, jn do i = 1, in1 * wk1m(i,j,k) = inuvl_wyvy3_8(j,1) * wk2m(i,j-2,k) % + inuvl_wyvy3_8(j,2) * wk2m(i,j-1,k) % + inuvl_wyvy3_8(j,3) * wk2m(i,j ,k) % + inuvl_wyvy3_8(j,4) * wk2m(i,j+1,k) * end do end do if (l_south) then do i = 1, in1 * wk1m(i,j0-2,k)= inuvl_wyvy3_8(j0-2,3) * wk2m(i,j0-2,k) % + inuvl_wyvy3_8(j0-2,4) * wk2m(i,j0-1,k) wk1m(i,j0-1,k)= inuvl_wyvy3_8(j0-1,2) * wk2m(i,j0-2,k) % + inuvl_wyvy3_8(j0-1,3) * wk2m(i,j0-1,k) % + inuvl_wyvy3_8(j0-1,4) * wk2m(i,j0 ,k) * end do endif if (l_north) then do i = 1, in1 * wk1m(i,jn+2,k)= inuvl_wyvy3_8(jn+2,1) * wk2m(i,jn ,k) % + inuvl_wyvy3_8(jn+2,2) * wk2m(i,jn+1,k) wk1m(i,jn+1,k)= inuvl_wyvy3_8(jn+1,1) * wk2m(i,jn-1,k) % + inuvl_wyvy3_8(jn+1,2) * wk2m(i,jn ,k) % + inuvl_wyvy3_8(jn+1,3) * wk2m(i,jn+1,k) * end do endif * do j = 1, jn1 do i = 1, in1 * C F_wt1m(i,j,k) = ( wk3m(i,j,k) + wk1m(i,j,k) ) / Geomg_cy2_8(j) wk1m(i,j,k) = 1 + Geomg_dpib(k) * (exp(F_ssm(i,j)) - 1.0) * end do end do end do !$omp end do * ********* * TERM2 * ********* * * Prepare key factors of TERM2 * !$omp single call rpn_comm_xch_halo ( wk1m,LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) !$omp end single * !$omp do do k=1,G_nk do j = 1, jn1 do i = 1, in1 * wk3m(i,j,k) = ((1.-intuv_c0xxu_8(i))*wk1m(i ,j,k) % + intuv_c0xxu_8(i) *wk1m(i+1,j,k))*F_uum(i,j,k) * end do end do do j = 1, jn2 do i = 1, in1 * wk4m(i,j,k) = ((1.-intuv_c0yyv_8(j))*wk1m(i,j ,k) % + intuv_c0yyv_8(j) *wk1m(i,j+1,k))*F_vvm(i,j,k) * end do end do end do !$omp end do * !$omp single call rpn_comm_xch_halo ( wk3m, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo ( wk4m, LDIST_DIM, l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) !$omp end single * !$omp do do k=1,G_nk * * TRAJECTORY * ---------- call caldiv_2
( wk2m(minx,miny,k), wk3m(minx,miny,k), % wk4m(minx,miny,k), LDIST_DIM, 1 ) * enddo !$omp enddo * !$omp end parallel * * Vertical integration over pi* * call hatoprg
(wk4m,wk2m,1.0,Geomg_hz_8,ng,G_nk) * * -------------- * END TRAJECTORY * -------------- * * -------------------------- * START ADJOINT CALCULATIONS * -------------------------- * *ADJ of ********* * TERM2 * ********* * !$omp parallel shared( j0,jn,in1,in2,jn1,jn2,ng ) !$omp do do j = jn1, 1,-1 do k = G_nk,1,-1 do i = in1, 1,-1 * F_ss(i,j) = $ -( Dcst_rgasd_8 * F_ttm(i,j,k) / Dcst_grav_8 / $ ( Geomg_pia(k) + Geomg_pib(k)*exp(F_ssm(i,j)) )**2 * $ ( Geomg_pib(k)*exp(F_ssm(i,j))*F_wt1(i,j,k)) $ ) * $ ( wk4m(i,j,1) * Geomg_pib(k) / Cstv_pisrf_8 - $ F_psdm(i,j,k) * wk1m(i,j,k) ) + F_ss(i,j) * F_tt(i,j,k) = $ Dcst_rgasd_8 * F_wt1(i,j,k) / Dcst_grav_8 / $ ( Geomg_pia(k) + Geomg_pib(k)*exp(F_ssm(i,j)) ) * $ ( wk4m(i,j,1) * Geomg_pib(k) / Cstv_pisrf_8 - $ F_psdm(i,j,k) * wk1m(i,j,k) ) + F_tt (i,j,k) * wk4(i,j,1) = $ Dcst_rgasd_8 * F_ttm(i,j,k) / Dcst_grav_8 / $ ( Geomg_pia(k) + Geomg_pib(k)*exp(F_ssm(i,j)) ) * $ ( F_wt1(i,j,k) * Geomg_pib(k) / Cstv_pisrf_8 ) + wk4 (i,j,1) * wk1(i,j,k) = $ Dcst_rgasd_8 * F_ttm(i,j,k) / Dcst_grav_8 / $ ( Geomg_pia(k) + Geomg_pib(k)*exp(F_ssm(i,j)) ) * $ ( - F_psdm(i,j,k) * F_wt1(i,j,k) ) + wk1(i,j,k) * F_psd(i,j,k) = $ Dcst_rgasd_8 * F_ttm(i,j,k) / Dcst_grav_8 / $ ( Geomg_pia(k) + Geomg_pib(k)*exp(F_ssm(i,j)) ) * $ ( F_wt1(i,j,k) * wk1m (i,j,k) ) + F_psd(i,j,k) * end do end do end do !$omp end do !$omp end parallel * * ADJ of * Vertical integration over pi* * call hatoprg0_ad
(wk4,wk2,1.0,Geomg_hz_8,ng,G_nk) * !$omp parallel shared( j0,jn,in1,in2,jn1,jn2,ng ) * !$omp do do k=G_nk,1,-1 * call caldiv_2_ad
( wk2(minx,miny,k), wk3(minx,miny,k), % wk4(minx,miny,k), LDIST_DIM, 1 ) * enddo !$omp enddo * !$omp single call rpn_comm_adj_halo ( wk4, LDIST_DIM, l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_adj_halo ( wk3, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * call v4d_zerohalo
( wk4,l_ni,l_njv,LDIST_DIM, l_nk) call v4d_zerohalo
( wk3,l_niu,l_nj,LDIST_DIM, l_nk) !$omp end single * !$omp do do k=G_nk,1,-1 do j = jn2,1,-1 do i = in1,1,-1 * wk1 (i,j+1,k) = ( intuv_c0yyv_8(j) *wk4 (i,j, k))*F_vvm(i,j,k) + wk1 (i,j+1,k) wk1 (i,j ,k) = ((1.-intuv_c0yyv_8(j))*wk4 (i,j, k))*F_vvm(i,j,k) + wk1 (i,j ,k) F_vv(i,j, k) = ((1.-intuv_c0yyv_8(j))*wk1m(i,j, k) % + intuv_c0yyv_8(j) *wk1m(i,j+1,k))*wk4 (i,j,k) + F_vv(i,j, k) wk4 (i,j, k) = ZERO_8 * end do end do * do j = jn1,1,-1 do i = in1,1,-1 * wk1 (i+1,j,k) = ( intuv_c0xxu_8(i) *wk3 (i, j,k))*F_uum(i,j,k) + wk1 (i+1,j,k) wk1 (i ,j,k) = ((1.-intuv_c0xxu_8(i))*wk3 (i, j,k))*F_uum(i,j,k) + wk1 (i ,j,k) F_uu(i, j,k) = ((1.-intuv_c0xxu_8(i))*wk1m(i ,j,k) % + intuv_c0xxu_8(i) *wk1m(i+1,j,k))*wk3 (i,j,k) + F_uu(i, j,k) wk3 (i, j,k) = ZERO_8 * end do end do end do !$omp end do * !$omp end parallel * * Prepare key factors of TERM2 * call rpn_comm_adj_halo ( wk1, LDIST_DIM,l_ni,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * call v4d_zerohalo
( wk1,l_ni,l_nj,LDIST_DIM, l_nk) * **************************************************** * TERM1: HORIZONTAL ADVECTION OF GEOGRAPHIC HEIGHT * **************************************************** * !$omp parallel shared( j0,jn,in1,in2,jn1,jn2,ng ) !$omp do do j = jn1, 1,-1 do k = G_nk,1,-1 do i = in1, 1,-1 * F_ss (i,j) = Geomg_dpib(k) * (exp(F_ssm(i,j))*wk1(i,j,k)) + F_ss(i,j) wk1 (i,j,k) = ZERO_8 * wk3 (i,j,k) = ( F_wt1(i,j,k) ) / Geomg_cy2_8(j) + wk3(i,j,k) wk1 (i,j,k) = ( F_wt1(i,j,k) ) / Geomg_cy2_8(j) + wk1(i,j,k) F_wt1(i,j,k) = ZERO_8 * end do end do end do !$omp end do !$omp end parallel * !$omp parallel shared( j0,jn,in1,in2,jn1,jn2,ng ) * !$omp do do k = G_nk,1,-1 if (l_north) then do i = 1, in1 * wk2(i,jn-1,k) = inuvl_wyvy3_8(jn+1,1) * wk1(i,jn+1,k) + wk2(i,jn-1,k) wk2(i,jn ,k) = inuvl_wyvy3_8(jn+1,2) * wk1(i,jn+1,k) + wk2(i,jn ,k) wk2(i,jn+1,k) = inuvl_wyvy3_8(jn+1,3) * wk1(i,jn+1,k) + wk2(i,jn+1,k) wk1(i,jn+1,k) = ZERO_8 * wk2(i,jn ,k) = inuvl_wyvy3_8(jn+2,1) * wk1(i,jn+2,k) + wk2(i,jn ,k) wk2(i,jn+1,k) = inuvl_wyvy3_8(jn+2,2) * wk1(i,jn+2,k) + wk2(i,jn+1,k) wk1(i,jn+2,k) = ZERO_8 * end do endif if (l_south) then do i = 1, in1 * wk2(i,j0-2,k) = inuvl_wyvy3_8(j0-1,2) * wk1(i,j0-1,k) + wk2(i,j0-2,k) wk2(i,j0-1,k) = inuvl_wyvy3_8(j0-1,3) * wk1(i,j0-1,k) + wk2(i,j0-1,k) wk2(i,j0 ,k) = inuvl_wyvy3_8(j0-1,4) * wk1(i,j0-1,k) + wk2(i,j0 ,k) wk1(i,j0-1,k) = ZERO_8 * wk2(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * wk1(i,j0-2,k) + wk2(i,j0-2,k) wk2(i,j0-1,k) = inuvl_wyvy3_8(j0-2,4) * wk1(i,j0-2,k) + wk2(i,j0-1,k) wk1(i,j0-2,k) = ZERO_8 * end do endif do j = jn,j0,-1 do i = in1,1,-1 * wk2(i,j-2,k) = inuvl_wyvy3_8(j,1) * wk1(i,j,k) + wk2(i,j-2,k) wk2(i,j-1,k) = inuvl_wyvy3_8(j,2) * wk1(i,j,k) + wk2(i,j-1,k) wk2(i,j ,k) = inuvl_wyvy3_8(j,3) * wk1(i,j,k) + wk2(i,j ,k) wk2(i,j+1,k) = inuvl_wyvy3_8(j,4) * wk1(i,j,k) + wk2(i,j+1,k) wk1(i,j, k) = ZERO_8 * end do end do end do !$omp end do * !$omp do do k = G_nk,1,-1 do j = jn1,1,-1 do i = in2,1,-1 * wk1(i-2,j,k) = inuvl_wxux3_8(i,1) * wk3(i,j,k) + wk1(i-2,j,k) wk1(i-1,j,k) = inuvl_wxux3_8(i,2) * wk3(i,j,k) + wk1(i-1,j,k) wk1(i ,j,k) = inuvl_wxux3_8(i,3) * wk3(i,j,k) + wk1(i ,j,k) wk1(i+1,j,k) = inuvl_wxux3_8(i,4) * wk3(i,j,k) + wk1(i+1,j,k) wk3(i, j,k) = ZERO_8 end do end do end do !$omp end do * * ADJ of * Interpolate from staggered grids to basic grid * !$omp single * * ADJ * --- call rpn_comm_adj_halo ( wk2, LDIST_DIM, l_ni,l_njv,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_adj_halo ( wk1, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) * call v4d_zerohalo
( wk2,l_ni,l_njv,LDIST_DIM, l_nk) call v4d_zerohalo
( wk1,l_niu,l_nj,LDIST_DIM, l_nk) * !$omp end single * !$omp do do k = G_nk,1,-1 do j = jn2,1,-1 do i = in1,1,-1 * F_fi (i,j+1,k) = ( wk2 (i,j,k)) * $ Geomg_cyv2_8(j) * Geomg_invhsy_8(j) $ * F_vvm(i,j,k) / Dcst_grav_8 + F_fi (i,j+1,k) F_fi (i,j, k) = ( - wk2 (i,j,k)) * $ Geomg_cyv2_8(j) * Geomg_invhsy_8(j) $ * F_vvm(i,j,k) / Dcst_grav_8 + F_fi (i,j, k) F_vv (i,j, k) = ( F_fim(i,j+1,k) - F_fim(i,j,k) ) * $ Geomg_cyv2_8(j) * Geomg_invhsy_8(j) $ * wk2 (i,j,k) / Dcst_grav_8 + F_vv(i,j, k) wk2 (i,j, k) = ZERO_8 * end do end do do j = jn1,1,-1 do i = in2,1,-1 * F_fi (i+1,j,k) = ( wk1(i,j,k) ) / Geomg_hx_8(i) $ * F_uum(i,j,k) / Dcst_grav_8 + F_fi (i+1,j,k) F_fi (i, j,k) = (-wk1(i,j,k) ) / Geomg_hx_8(i) $ * F_uum(i,j,k) / Dcst_grav_8 + F_fi (i, j,k) F_uu (i, j,k) = ( F_fim(i+1,j,k) - F_fim(i,j,k) ) / Geomg_hx_8(i) $ * wk1(i,j,k) / Dcst_grav_8 + F_uu (i, j,k) wk1 (i, j,k) = ZERO_8 * end do end do end do !$omp end do * * Gradient of geopotential * ~~~~~~~~~~~~~~~~~~~~~~~~ * !$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 v4d_zerohalo
( F_fi,l_ni,l_nj,LDIST_DIM, l_nk) * !$omp end single * !$omp do do k = 1,G_nk F_mul(:,:,k) = 0. F_mu (:,:,k) = 0. wk1 (:,:,k) = 0. wk2 (:,:,k) = 0. wk3 (:,:,k) = 0. wk4 (:,:,k) = 0. end do !$omp end do * !$omp end parallel * * ------------------------ * END ADJOINT CALCULATIONS * ------------------------ * __________________________________________________________________ * return end