copyright (C) 2001  MSC-RPN COMM  %%%MC2%%%
*

      subroutine rhs3_p0m ( dimphy, wrk , lminx, lmaxx, lminy, lmaxy ) 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-levels t-Dt and t variables:                *
*    *                um, vm, wm, bm, pm                               *
*    *                u0, v0        , p0                               *
*    *      STORES                                                     *
*    *                results in                                       *
*    *                up=Pu, vp=Pv,  wp=Pw,  bp=Pb, pp=Pp              *
*    *                                                                 *
*    *     PERFORMS   essentially the following calculations:          *
*    *                                                                 *
*    *                          ~                                      *
*    *    up =       um - dt0 * d(p0)/dX                               *
*    *                                                                 *
*    *                          ~                                      *
*    *    vp =       vm - dt0 * d(p0)/dY                               *
*    *                                                                 *
*    *                            ~                                    *
*    *    wp = c03 * wm - dtm * [ d(pm)/dZ - bm / (1+alfa) ]           *
*    *                                                                 *
*    *                                __Z                              *
*    *    bp =       bm - gama_star * pm  - dtm*c06*n02g * wm          *
*    *                                                                 *
*    *                            ~             __Z                    *
*    *    pp = pm/c2_star - dtm*[ d(wm)/dZ-gc02*wm ] - dt0*hdiv(u0,v0) *
*    *                                                                 *
*    *                                                                 *
*    *                                                                 *
*    *******************************************************************
*  
*
#include "grd.cdk"
#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, dt0, 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))
*
      dt0 = dtm+dtp
*
      id =1-hx*west
      jd =1-hy*south
      iff=ldni+(hx-1)*east
      jf =ldnj+(hy-1)*north
*
      do k = gnk, 1, -1
         if (k.eq.gnk) then
            do j = jd, jf
            do i = id, iff
                q3(i,j,gnk) = 0.0
               div(i,j,gnk) = 0.0
            end do
            end do
         else
            km1 = max( k-1 , 1 )
            do j = jd, jf
            do i = id, iff
               q3(i,j,k) = sbxy(i,j) * pt5 *
     $                (-gg1(i+1,j,k) * ( uu0(i+1,j,k) - uu0(i+1,j,km1) )
     $                - gg1(i  ,j,k) * ( uu0(i  ,j,k) - uu0(i  ,j,km1) )
     $                - gg2(i,j+1,k) * ( vv0(i,j+1,k) - vv0(i,j+1,km1) )
     $                - gg2(i,j  ,k) * ( vv0(i,j  ,k) - vv0(i,j  ,km1) ) )
               div(i,j,k) = sbxy(i,j)* ((uu0(i+1,j,k) - uu0(i,j,k)) * odx(1) +
     $                                  (vv0(i,j+1,k) - vv0(i,j,k)) * ody(j) )
     $                 + gg0r(i,j,k) * ( q3(i,j,k+1) + q3(i,j,k)) * pt5
            end do
            end do
         endif
      end do
*
      do k = gnk, 1, -1
         km1 = max( k-1 , 1 )
         if (k.lt.gnk) then
            kp1 = min( k+1 , gnk-1 )
            do j = jd, jf
            do i = id+west, iff
                uup(i,j,k) = uum(i,j,k) - dt0 * (
     $                       ( pp0(i,j,k  ) - pp0(i-1,j,k) ) * odxu(1) +
     $              g0ur(i,j,k) * p25 * (-gg1(i,j,k+1) *
     $                       ( pp0(i,j,kp1) + pp0(i-1,j,kp1)
     $                       - pp0(i,j,k  ) - pp0(i-1,j,k  ) ) -
     $                                    gg1(i,j,k  ) *
     $                       ( pp0(i,j,k  ) + pp0(i-1,j,k  )
     $                       - pp0(i,j,km1) - pp0(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)  - dt0 * (
     $                       ( pp0(i,j,k  ) - pp0(i,j-1,k) ) * odyv(j) +
     $              g0vr(i,j,k) * p25 * (-gg2(i,j,k+1) *
     $                       ( pp0(i,j,kp1) + pp0(i,j-1,kp1)
     $                       - pp0(i,j,k  ) - pp0(i,j-1,k  ) ) -
     $                                    gg2(i,j,k  ) *
     $                       ( pp0(i,j,k  ) + pp0(i,j-1,k  )
     $                       - pp0(i,j,km1) - pp0(i,j-1,km1) )) )
            end do
            end do
         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*(pt5*gc02(i,j,k)*(wwm(i,j,kp1)+wwm(i,j,k))
     $                          - gg0r(i,j,k)*(wwm(i,j,kp1)-wwm(i,j,k)))
     $                 - dt0 * div(i,j,k)
         end do
         end do
      end do
*
*----------------------------------------------------------------------
      return
      end