!-------------------------------------- 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 -- initialize vertical nonhydrostatic wind "wt1" * #include "model_macros_f.h"*
subroutine initw2 ( F_wt1, F_mul, F_mu, F_uu, F_vv, F_psd, F_fi, 3,2 $ F_tt, F_ss, 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,*) * *author * S. Edouard - november 2001 - hybrid version * *revisions * v2_31 - Edouard S. - initial version * v3_02 - Edouard S. - correct a bug * v3_21 - Desgagne M. - OpenMP optimization * v3_30 - Lee V. - use of geomg_invhsy_8, moved j0,jn,ng before * parallel region * *object * compute the vertical wind diagonostically in the hybrid coordinate * ***************************************************************************************** * * * Assume hydrostatic & adiabatic, the vertical wind "wt1" (DZ/Dt) * * can be approximated with the equation * * * * / pi* \ * * |/ gnk |* * || |* * || / / \ \ / \|* * DZ __ R T || b __ | | /\A + /\b exp(s) | | * . * | /\A + /\b exp(s) ||* * -- = V.\/Z + --- ||-- \/.| V | ---------------- | | d pi - pi | ---------------- ||* * Dt g pi|| z | | /\A + /\b | | | /\A + /\b ||* * || gnk \ \ / / \ /|* * (TERM1) || |* * |/ pi* (TERM2) |* * \ 1 / * * * * where * * * * D( )/Dt is the total derivative: pronounced as "d-( ) over d-t" * * * * /\A = 1 - db/dz * * * * /\A + /\b exp(s) * * ---------------- = 1 + db/dz (exp(s) -1) * * /\A + /\b * ***************************************************************************************** * * *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) ** * __________________________________________________________________ * 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 ) * 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) * **************************************************** * TERM1: HORIZONTAL ADVECTION OF GEOGRAPHIC HEIGHT * **************************************************** * * Gradient of geopotential * ~~~~~~~~~~~~~~~~~~~~~~~~ !$omp parallel * !$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. do j = 1, jn1 do i = 1, in2 wk1(i,j,k) = ( F_fi(i+1,j,k) - F_fi(i,j,k) ) / geomg_hx_8(i) $ * F_uu(i,j,k) / Dcst_grav_8 end do end do do j = 1, jn2 do i = 1, in1 wk2(i,j,k) = ( F_fi(i,j+1,k)-F_fi(i,j,k) ) * geomg_cyv2_8(j) $ * geomg_invhsy_8(j) * F_vv(i,j,k) / Dcst_grav_8 end do end do end do !$omp enddo * * Interpolate from staggered grids to basic grid * !$omp single call rpn_comm_xch_halo ( wk1, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo ( wk2, 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 wk3(i,j,k) = inuvl_wxux3_8(i,1) * wk1(i-2,j,k) $ + inuvl_wxux3_8(i,2) * wk1(i-1,j,k) $ + inuvl_wxux3_8(i,3) * wk1(i ,j,k) $ + inuvl_wxux3_8(i,4) * wk1(i+1,j,k) end do end do end do !$omp enddo * !$omp do do k=1,G_nk do j = j0, jn do i = 1, in1 wk1(i,j,k) = inuvl_wyvy3_8(j,1) * wk2(i,j-2,k) $ + inuvl_wyvy3_8(j,2) * wk2(i,j-1,k) $ + inuvl_wyvy3_8(j,3) * wk2(i,j ,k) $ + inuvl_wyvy3_8(j,4) * wk2(i,j+1,k) end do end do if (l_south) then do i = 1, in1 wk1(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * wk2(i,j0-2,k) $ + inuvl_wyvy3_8(j0-2,4) * wk2(i,j0-1,k) wk1(i,j0-1,k) = inuvl_wyvy3_8(j0-1,2) * wk2(i,j0-2,k) $ + inuvl_wyvy3_8(j0-1,3) * wk2(i,j0-1,k) $ + inuvl_wyvy3_8(j0-1,4) * wk2(i,j0 ,k) end do endif if (l_north) then do i = 1, in1 wk1(i,jn+2,k) = inuvl_wyvy3_8(jn+2,1) * wk2(i,jn ,k) $ + inuvl_wyvy3_8(jn+2,2) * wk2(i,jn+1,k) wk1(i,jn+1,k) = inuvl_wyvy3_8(jn+1,1) * wk2(i,jn-1,k) $ + inuvl_wyvy3_8(jn+1,2) * wk2(i,jn ,k) $ + inuvl_wyvy3_8(jn+1,3) * wk2(i,jn+1,k) end do endif do j = 1, jn1 do i = 1, in1 F_wt1(i,j,k) = ( wk3(i,j,k) + wk1(i,j,k) ) / geomg_cy2_8(j) wk1(i,j,k) = 1 + geomg_dpib(k) * (exp(F_ss(i,j)) - 1.0) end do end do end do !$omp enddo * ********* * TERM2 * ********* * * Prepare key factors of TERM2 * !$omp single call rpn_comm_xch_halo ( wk1, 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 wk3(i,j,k) = ((1.-intuv_c0xxu_8(i))*wk1(i ,j,k) $ + intuv_c0xxu_8(i) * wk1(i+1,j,k))*F_uu(i,j,k) end do end do do j = 1, jn2 do i = 1, in1 wk4(i,j,k) = ((1.-intuv_c0yyv_8(j))*wk1(i,j ,k) $ + intuv_c0yyv_8(j) * wk1(i,j+1,k))*F_vv(i,j,k) end do end do end do !$omp enddo * !$omp single call rpn_comm_xch_halo ( wk3, LDIST_DIM, l_niu,l_nj,G_nk, $ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo ( wk4, 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 call caldiv_2
( wk2(minx,miny,k), wk3(minx,miny,k), $ wk4(minx,miny,k), LDIST_DIM, 1 ) end do !$omp enddo !$omp end parallel * * Vertical integration over pi* * call hatoprg
(wk4,wk2,1.0,geomg_hz_8,ng,G_nk) * !$omp parallel !$omp do do k = 1, G_nk do j = 1, jn1 do i = 1, in1 F_wt1(i,j,k) = F_wt1(i,j,k) + $ Dcst_rgasd_8 * F_tt(i,j,k) / Dcst_grav_8 / $ ( geomg_pia(k) + geomg_pib(k)*exp(F_ss(i,j)) ) * $ ( wk4(i,j,1) * geomg_pib(k) / Cstv_pisrf_8 - $ F_psd(i,j,k) * wk1(i,j,k) ) end do end do end do !$omp enddo * !$omp end parallel * __________________________________________________________________ * return end