copyright (C) 2001 MSC-RPN COMM %%%MC2%%% *subroutine rhs3_pm ( dimphy, wrk, lminx, lmaxx, lminy, lmaxy ) 1,1 implicit none * integer dimphy,lminx,lmaxx,lminy,lmaxy real*8 wrk(*) * *AUTHORs C. Girard & M. Desgagne * *OBJECT * * ******************************************************************* * * * * * CALCULATES * * * right-hand-side LINEAR Pm-terms: * * * Pu, Pv, Pw, Pb, Pp * * * FROM * * * time-level t-Dt variables: * * * um, vm, wm, bm, pm * * * STORES * * * results in * * * up=Pu, vp=Pv, wp=Pw, bp=Pb, pp=Pp * * * * * * PERFORMS essentially the following calculations: * * * * * * ~ * * * up = um - dtm * d(pm)/dX * * * * * * ~ * * * vp = vm - dtm * d(pm)/dY * * * * * * ~ * * * wp = c03 * wm - dtm * [ d(pm)/dZ - bm /(1+alfa) ] * * * * * * __Z * * * bp = bm - gama_star * pm - dtm * c06*n02g * wm * * * * * * __Z * * * pp = pm*c01k/c2_star + dtm*gc02* wm - dtm * DIV(um,vm,wm) * * * * * * * * * ******************************************* * * * * ________Z * * * * * ~ _X * * * * * dq/dX = dq/dX + G0ur*G1*dq/dZ * * * * * * * * * * ________Z * * * * * ~ _Y * * * * * dq/dY = dq/dY + G0vr*G2*dq/dZ * * * * * * * * * * ~ * * * * * dq/dz = G0wr*dq/dZ * * * * * * * * * ******************************************* * * * * * * * * * SEE - divcal for calculation of DIV * * * * * * - cxxpar for definitions of parameters c01, c03, c06 * * * and gama_star, c2_star * * * * * * -1 * * * - nacbar for calculation of ap1r=(1+alfa), n02g, gc02 * * * * * * * * ******************************************************************* * #include "consdyn_8.cdk"
#include "yomdyn.cdk"
#include "yomdyn1.cdk"
#include "dynpar.cdk"
#include "dynmem.cdk"
#include "topo.cdk"
#include "phymem.cdk"
#include "physnml.cdk"
#include "physcom.cdk"
#include "nbcpu.cdk"
#include "partopo.cdk"
#include "dtmdtp.cdk"
#include "alfmem.cdk"
* integer i, j, k, n, id, jd, iff, jf, km1, kp1 real*8 p25, pt5, one, fulltp, c01k real s, d pointer (pas ,s(*)), (pad ,d(*)) real*8 q3,div pointer (paq3 , q3(minx:maxx,miny:maxy,*)), $ (padiv, div(minx:maxx,miny:maxy,*)) parameter (p25=0.25d0, pt5=0.5d0, one=1.0d0) *---------------------------------------------------------------------- * paq3 = loc(wrk( 1)) padiv = loc(wrk(dim3d+1)) * id =1-hx*west jd =1-hy*south iff=ldni+(hx-1)*east jf =ldnj+(hy-1)*north * call divcal2
( div,uum,vvm,wwm,sbxy,gg1,gg2,gg0r,g0ur,g0vr,q3, $ odx,ody,minx,maxx,miny,maxy,gnk,id,jd,iff,jf ) !$omp do do k = gnk, 1, -1 km1 = max( k-1 , 1 ) if (k.lt.gnk) then if(topo_folwing) then kp1 = min( k+1 , gnk-1 ) do j = jd, jf do i = id+west, iff uup(i,j,k) = uum(i,j,k) - dtm * ( $ ( ppm(i,j,k ) - ppm(i-1,j,k) ) * odxu(1) + $ g0ur(i,j,k) * p25 * (-gg1(i,j,k+1) * $ ( ppm(i,j,kp1) + ppm(i-1,j,kp1) $ - ppm(i,j,k ) - ppm(i-1,j,k ) ) - $ gg1(i,j,k ) * $ ( ppm(i,j,k ) + ppm(i-1,j,k ) $ - ppm(i,j,km1) - ppm(i-1,j,km1) )) ) end do end do do j = jd+south, jf do i = id, iff vvp(i,j,k) = vvm(i,j,k) - dtm * ( $ ( ppm(i,j,k ) - ppm(i,j-1,k) ) * odyv(j) + $ g0vr(i,j,k) * p25 * (-gg2(i,j,k+1) * $ ( ppm(i,j,kp1) + ppm(i,j-1,kp1) $ - ppm(i,j,k ) - ppm(i,j-1,k ) ) - $ gg2(i,j,k ) * $ ( ppm(i,j,k ) + ppm(i,j-1,k ) $ - ppm(i,j,km1) - ppm(i,j-1,km1) )) ) end do end do else do j = jd, jf do i = id+west, iff uup(i,j,k) = uum(i,j,k) - dtm * $ ( ppm(i,j,k ) - ppm(i-1,j,k) ) * odxu(1) end do end do do j = jd+south, jf do i = id, iff vvp(i,j,k) = vvm(i,j,k) - dtm * $ ( ppm(i,j,k ) - ppm(i,j-1,k) ) * odyv(j) end do end do endif end if if (k.eq.gnk) then c01k=one else c01k=c01 endif kp1 = min( k+1 , gnk ) do j = jd, jf do i = id, iff wwp(i,j,k) = c03*wwm(i,j,k) - dtm * $ ( (ppm(i,j,k) - ppm(i,j,k-1) ) * g0wr(i,j,k) $ - bbm(i,j,k) * ap1r(i,j,k) ) bbp(i,j,k) = bbm(i,j,k) $ - gama_star*pt5*(ppm(i,j,k)+ppm(i,j,k-1)) $ - dtm*c06*n02g(i,j,k)*wwm(i,j,k) ppp(i,j,k) = c01k * c2r_star * ppm(i,j,k) $ + dtm*gc02(i,j,k)*pt5*(wwm(i,j,k)+wwm(i,j,kp1)) $ - dtm*div(i,j,k) end do end do end do !$omp enddo * if ((dimphy.gt.0).and.(gnpfb.gt.1)) then !$omp do do k = 1, gnk-1 do j = jd, jf do i = id+west, iff uup (i,j,k) = uup (i,j,k) + utdp2 (i,j,k) end do end do do j = jd+south, jf do i = id, iff vvp (i,j,k) = vvp (i,j,k) + vtdp2 (i,j,k) end do end do do j = jd, jf do i = id, iff fulltp = bbm(i,j,k)+grav_8 ppp(i,j,k) = ppp(i,j,k) + ttdp2 (i,j,k)/fulltp bbp(i,j,k) = bbp(i,j,k) + ttdp2 (i,j,k) $ * (1 + c07*bbm(i,j,k)/fulltp) hup(i,j,k) = hup(i,j,k) + hutdp2(i,j,k) end do end do if (diffuw) then do j = jd, jf do i = id, iff wwp (i,j,k) = wwp (i,j,k) + swtdp2 (i,j,k) end do end do endif do n = bghyd, edhyd do j = jd, jf do i = id, iff trp(i,j,k,n) = trp(i,j,k,n) + cltdp2(i,j,k,n) end do end do end do end do !$omp enddo * pas = pautp1 pad = pautp2 !$omp do do i=1,dimphy/2 d(i) = s(i) end do !$omp enddo endif * *---------------------------------------------------------------------- return end