copyright (C) 2001 MSC-RPN COMM %%%MC2%%%
***s/r rhs3_r0
*

      subroutine rhs3_r0 ( w1 ) 1,1
      implicit none
*
      real*8 w1(*)
*
*AUTHORs    C. Girard & M. Desgagne
*
*OBJECT
*
*    *******************************************************************
*    *                                                                 *
*    *     CALCULATES                                                  *
*    *                right-hand-side CORIOLIS+KE+NON-LINEAR           *
*    *                                                                 *
*    *                explicit terms:                                  *
*    *                Ru, Rv, Rw, Rb, Rp                               *
*    *       FROM                                                      *
*    *                centered time-level t variables:                 *
*    *                u0, v0, w0, b0, p0, hu0, tr0                     *
*    *      STORES                                                     *
*    *                results in                                       *
*    *                ur, vr, wr, br, pr                               *
*    *                                                                 *
*    *     PERFORMS   essentially the following calculations:          *
*    *                                                                 *
*    *                                                                 *
*    *  bv0 = bv0(b0,hu0,tr0)                                          *
*    *                                                                 *
*    *          __XY ____Y       _XY                ___XZ  ~           *
*    *   ur = + v0  *fcor - KE*d(S  )/dX      - c04*bv0  * d(p0)/dX    *
*    *                                                                 *
*    *                                                                 *
*    *          __XY ____X       _XY                ___YZ  ~           *
*    *   vr = - u0  *fcor - KE*d(S  )/dY      - c04*bv0  * d(p0)/dY    *
*    *                                                                 *
*    *                                                     ~           *
*    *   wr = b0*alfa/(1+alfa) + c02*(bv0-b0) - c04*bv0  * d(p0)/dZ    *
*    *                                                                 *
*    *                                            _____________Z       *
*    *   br = - c06*n02g * w0 * alfa - c07 * b0 * DIV(u0,v0,w0)        *
*    *                                                                 *
*    *                     __Z  ____Z                                  *
*    *   pr =       gc02 * w0 * alfa                                   *
*    *                                                                 *
*    *                                                                 *
*    *                                        ~     ~     ~            *
*    *     SEE - rhs3_pm for description of d/dX, d/dY, d/dZ           *
*    *                                                                 *
*    *         - divcal for calculation of DIV                         *
*    *                                                                 *
*    *         - cxxpar for definitions of parameters c02,c04,c06,c07  *
*    *                                                                 *
*    *         - nacbar for calculation of alfa, n02g, gc02            *
*    *                                                                 *
*    *                                                                 *
*    *******************************************************************
*
#include "consdyn_8.cdk"
#include "yomdyn.cdk"
#include "yomdyn1.cdk"
#include "dynpar.cdk"
#include "dynmem.cdk"
#include "topo.cdk"
#include "wrnmem.cdk"
#include "physcom.cdk"
#include "nbcpu.cdk"
#include "alfmem.cdk"
*
      integer i, j, k, n, kkk,kp1, km1, id, jd, iff, jf
      real*8 div,bv0,g1d,g2d,t1
      pointer (padiv, div(minx:maxx,miny:maxy,*)),
     $        (pabv0, bv0(minx:maxx,miny:maxy,*)),
     $        (pag1d, g1d(minx:maxx,miny:maxy,*)),
     $        (pag2d, g2d(minx:maxx,miny:maxy,*)),
     $        (pat1,  t1 (minx:maxx,miny:maxy,*))
      real*8  p25, pt5, one, two, coe1,
     $        d1, vbarxy, ubarxy, rtbarxz, rtbaryz, kinetic
      parameter (p25=0.25d0, pt5=0.5d0, one=1.0d0, two=2.0d0)
*
*----------------------------------------------------------------------
*
      padiv  = loc(w1(        1))
      pabv0  = loc(w1(  dim3d+1))
      pag1d  = loc(w1(2*dim3d+1))
      pag2d  = loc(w1(3*dim3d+1))
      pat1   = loc(w1(4*dim3d+1))
*
!$omp do
      do k = 1, gnk
*
         id  = (1-hx)*west
         jd  = (1-hy)*south
         iff = ldni+(hx-1)*east
         jf  = ldnj+(hy-1)*north
*
         do j = jd,jf
         do i = id,iff
            t1(i,j,k) = 0.0
         end do
         end do
*
         if (k.gt.1.and.gnload.eq.1) then
            do n = bghyd, edhyd
               do j = jd,jf
               do i = id,iff
                  t1(i,j,k) =t1(i,j,k) + tr0(i,j,k,n)
               end do
               end do
            end do
         endif
         do j = jd,jf
         do i = id,iff
            d1         = bb0(i,j,k) + grav_8
            bv0(i,j,k) = bb0(i,j,k) + d1 *
     $                 ( hu0(i,j,k)*(rgasv_8/rgasd_8-one)-t1(i,j,k))
         end do
         end do
*
         id  = 1-hx*west
         jd  = 1-hy*south
         iff = ldni+(hx-1)*east
         jf  = ldnj+(hy-1)*north
*
         coe1 = 0.5
         if(k.eq.1.or.k.eq.gnk) coe1 = 1.
         km1  = max( k-1, 1 )
*
         do j = jd, jf
         do i = id+west, iff
            g1d(i,j,k) = -gg1(i,j,k) * coe1 *
     $                    ( pp0(i,j,k  ) + pp0(i-1,j,k  )
     $                    - pp0(i,j,k-1) - pp0(i-1,j,k-1) )
         end do
         end do
         do j = jd+south, jf
         do i = id, iff
            g2d(i,j,k) = -gg2(i,j,k) * coe1 *
     $                    ( pp0(i,j,k  ) + pp0(i,j-1,k  )
     $                    - pp0(i,j,k-1) - pp0(i,j-1,k-1) )
         end do
         end do
*
      end do
!$omp enddo
*
      call divcal2 ( div,uu0,vv0,ww0,sbxy,gg1,gg2,gg0r,g0ur,g0vr,t1,
     $                 odx,ody,minx,maxx,miny,maxy,gnk,id,jd,iff,jf )
*
!$omp do
      do k = 1, gnk
         km1 = max( k-1, 1 )
*
         if (k.lt.gnk) then
*
         do j = jd, jf
         do i = id+west, iff
            vbarxy    = p25 * (vv0(i-1,j+1,k)+vv0(i-1,j,k  ) +
     $                         vv0(i  ,j+1,k)+vv0(i  ,j,k  ) )
            rtbarxz   = p25 * (bv0(i  ,j,k+1)+bv0(i-1,j,k+1) +
     $                         bv0(i  ,j,k  )+bv0(i-1,j,k  ) )  * c04
            kinetic   = ( uu0(i,j,k)*uu0(i,j,k) + vbarxy*vbarxy ) * pt5
            uur(i,j,k) =
     $                +  vbarxy * ( fcor(i,j+1) + fcor(i,j) ) * pt5
     $                - kinetic * ( sbxy(i,j) - sbxy(i-1,j) ) * odxu(1)
     $                - rtbarxz * ( (pp0(i,j,k)-pp0(i-1,j,k)) * odxu(1)
     $                + g0ur(i,j,k) * ( g1d(i,j,k+1)+g1d(i,j,k)) * pt5 )
         end do
         end do
*
         do j = jd+south, jf
         do i = id, iff
            ubarxy    = p25 * (uu0(i+1,j-1,k)+uu0(i,j-1,k  ) +
     $                         uu0(i+1,j  ,k)+uu0(i,j  ,k  ) )
            rtbaryz   = p25 * (bv0(i  ,j,k+1)+bv0(i,j-1,k+1) +
     $                         bv0(i  ,j,k  )+bv0(i,j-1,k  ) )  * c04
            kinetic   = ( vv0(i,j,k)*vv0(i,j,k) + ubarxy*ubarxy ) * pt5
            vvr(i,j,k) =
     $                -  ubarxy * ( fcor(i+1,j) + fcor(i,j) ) * pt5
     $                - kinetic * ( sbxy(i,j) - sbxy(i,j-1) ) * odyv(j)
     $                - rtbaryz * ( (pp0(i,j,k)-pp0(i,j-1,k)) * odyv(j)
     $                + g0vr(i,j,k) * ( g2d(i,j,k+1)+g2d(i,j,k)) * pt5 )
         end do
         end do
*
         endif
*
         kp1 = min( k+1, gnk )
         kkk = min( k, gnk-1 )
*
         do j = jd, jf
         do i = id,iff
            wwr(i,j,k) = - c04 * bv0(i,j,k) *
     $                          (pp0(i,j,k)-pp0(i,j,k-1))*g0wr(i,j,k)
     $                   + bb0(i,j,k) * alfa(i,j,k) * ap1r(i,j,k)
     $                   + c02 * ( bv0(i,j,k) - bb0(i,j,k  ) )
            bbr(i,j,k) = - c07*bb0(i,j,k)*(div(i,j,kkk)+div(i,j,km1))*pt5
     $                   - c06 * n02g(i,j,k) * ww0(i,j,k) * alfa(i,j,k)
            ppr(i,j,k) =   p25*gc02(i,j,k)*( ww0(i,j,k)+ ww0(i,j,kp1))
     $                                    *(alfa(i,j,k)+alfa(i,j,kp1))
         end do
         end do
*
         if (k.eq.1) then
            do j = jd, jf
            do i = id+west, iff
               uur(i,j,1)     = uur(i,j,1)     - pt5
     $                         * g0ur(i,j,1  ) * g1d(i,j,1  )
            end do
            end do
            do j = jd+south, jf
            do i = id, iff
               vvr(i,j,1)     = vvr(i,j,1)     - pt5
     $                         * g0vr(i,j,1  ) * g2d(i,j,1  )
            end do
            end do
         endif
         if (k.eq.gnk-1) then
            do j = jd, jf
            do i = id+west, iff
               uur(i,j,gnk-1) = uur(i,j,gnk-1) - pt5
     $                             * g0ur(i,j,gnk) * g1d(i,j,gnk)
            end do
            end do
            do j = jd+south, jf
            do i = id, iff
               vvr(i,j,gnk-1) = vvr(i,j,gnk-1) - pt5
     $                             * g0vr(i,j,gnk) * g2d(i,j,gnk)
            end do
            end do
         endif
*
      end do
!$omp enddo
*----------------------------------------------------------------------
*
      return
      end