!-------------------------------------- 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 rhs - compute rhs of different equations 
*            ( memory management and call to rhsp_2 )
*
#include "model_macros_f.h"
*

      subroutine rhs() 1,1
*
      implicit none
*
*author
*     Alain Patoine - Gabriel Lemay
*
*revision
* v2_00 - Desgagne M.       - initial MPI version
* v2_30 - Edouard S.        - adapt for vertical hybrid coordinate
* v2_31 - Desgagne M.       - remove treatment of hut1 and qct1
* v3_00 - Desgagne & Lee    - Lam configuration
* v3_21 - Desgagne M.       - Revision Openmp
*
*object
***********************************************************************
*                                                                     *
*        1  a         b                    1  a         b             *
* R  = - -- -- F   -  -- G          R  = - -- -- F   -  -- G          *
*  U     dt b   U     b   U          V     dt b   V     b   V         *
*            0         0                       0         0            *
*                                                                     *
*                                            _____________________    *
*                                           |                     |   *
* where:                                    | NONHYDROSTATIC ONLY |   *
*                                           |_____________________|   *
*                                                                     *
*                               1  dq      1  dphi  |   1       dphi  *
* F  =  U          G   =  R  T --- --  +  --- ----  +  --- (mu) ----  *
*  U                U      d     2          2       |    2            *
*                               a  dx      a   dx   |   a        dx   *
*                                                   |                 *
*                                                   |                 *
*                               C  dq      1  dphi  |   1       dphi  *
* F  =  V          G   =  R  T --- --  +  --- ----  +  --- (mu) ----  *
*  V                V      d     2          2       |    2            *
*                               a  dy      a   dy   |   a        dy   *
*                                                                     *
*         _                                                      _    *
*        DV       _   _       D    _           _    _           DV'   *
*        -- + f ( k ^ V )  =  -- [ V + 2 Omg ( k' ^ r ) ]  -->  --    *
*        Dt                   Dt                                Dt    *
*                                                                     *
***********************************************************************
*                                                                     *
*         1  a          b                                             *
* R   = - -- -- F    -  -- G                                          *
*  cn     dt b   cn     b   cn                                        *
*             0          0                                            *
*                                                                     *
*                                                                     *
* where:                                                              *
*            /  /\A + /\b exp(s) \                                    *
* F   =  log | ----------------- |    ;  where  /\(.) = d/d(eta) (.)  *
*  cn        \    /\A + /\b      /                                    *
*                                                                     *
*         . *                                                         *
*        dpi                                                          *
* G   =  ----  + D                                                    *
*  cn     dz                                                          *
*                                                                     *
***********************************************************************
*                                                                     *
*         1  a          b                                             *
* R   = - -- -- F    -  -- G                                          *
*  th     dt b   th     b   th                                        *
*             0          0                                            *
*                                                                 .   *
*           T          /          \                               pi* *
* F   =  ln -- + cappa | ln z - q |                 G   = - cappa --- 
*  th       T*         \          /                  th            z  *
*                                                                     *
***********************************************************************
*                                            _____________________    *
*          1  a         b                   |                     |   *
* R  =  -  -- -- F   -  -- G                | NONHYDROSTATIC ONLY |   *
*  w       dt b   w     b   w               |_____________________|   *
*              0         0                                            *
*                                                                     *
*                                                                     *
* F  =  &  w   (& refers to "delta")                  G  = - (mu) g   *
*  w     H                                             w              *
*                                                                     *
***********************************************************************
*                                            _____________________    *
*         1  a          b                   |                     |   *
* R   = - -- -- F    -  -- G                | NONHYDROSTATIC ONLY |   *
*  vv     dt b   vv     b   vv              |_____________________|   *
*             0          0                                            *
*                                                                .    *
*                                               /     *  pi*       \  *
* F   =  phi  + phi'                    G   = - | R  T   --- + g w |  *
*  vv       s                            vv     \  d      z        /  *
*                                                                     *
***********************************************************************
*                                                                     *
*                  1  a                                               *
* R            = - -- -- F                                            *
*  (hu,qc,tr)      dt b   (hu,qc,tr)                                  *
*                      0                                              *
*                                                                     *
* F  is the field to be advected (specific humidity, mixing ratio     *
*  (hu,qc,tr)   of cloud water/ice or passive tracer(s))              *
*                                                                     *
***********************************************************************
*                                                                     *
* Interpolate Ru, Rv from wind grids to geopotential grid             *
*                                                                     *
***********************************************************************
*
*arguments
*        None
*
*implicits
#include "glb_ld.cdk"
#include "schm.cdk"
#include "lun.cdk"
#include "orh.cdk"
#include "p_geof.cdk" 
#include "rhsc.cdk"
#include "vt1.cdk" 
#include "nest.cdk"
*
*modules
      integer  vmmlod, vmmget, vmmuld
      external vmmlod, vmmget, vmmuld
*
      integer  pnerr, pnlod, pnlkey1(30), i,j,k
**
*     __________________________________________________________________
*
      if (Lun_debug_L) write (Lun_out,1000)

      pnlkey1( 1) = VMM_KEY(ru)
      pnlkey1( 2) = VMM_KEY(rv)
      pnlkey1( 3) = VMM_KEY(rcn)
      pnlkey1( 4) = VMM_KEY(rth)
      pnlkey1( 5) = VMM_KEY(oru)
      pnlkey1( 6) = VMM_KEY(orv)
      pnlkey1( 7) = VMM_KEY(orcn)
      pnlkey1( 8) = VMM_KEY(orth)
      pnlkey1( 9) = VMM_KEY(ruw1)
      pnlkey1(10) = VMM_KEY(rvw1)
      pnlkey1(11) = VMM_KEY(ut1)
      pnlkey1(12) = VMM_KEY(vt1)
      pnlkey1(13) = VMM_KEY(tt1)
      pnlkey1(14) = VMM_KEY(qt1)
      pnlkey1(15) = VMM_KEY(fit1)
      pnlkey1(16) = VMM_KEY(st1)
      pnlkey1(17) = VMM_KEY(tdt1)
      pnlkey1(18) = VMM_KEY(psdt1)
      pnlod = 18
      if (.not. Schm_hydro_L) then
         pnlkey1(pnlod+1) = VMM_KEY(rw)
         pnlkey1(pnlod+2) = VMM_KEY(rvv)
         pnlkey1(pnlod+3) = VMM_KEY(orw)
         pnlkey1(pnlod+4) = VMM_KEY(orvv)
         pnlkey1(pnlod+5) = VMM_KEY(wt1)
         pnlkey1(pnlod+6) = VMM_KEY(topo)
         pnlkey1(pnlod+7) = VMM_KEY(fipt1)
         pnlkey1(pnlod+8) = VMM_KEY(mut1)
         pnlod = pnlod+8
      endif
      if (G_lam) then
         pnlkey1(pnlod+1) = VMM_KEY(nest_u)
         pnlkey1(pnlod+2) = VMM_KEY(nest_v)
         pnlod = pnlod+2
      endif
*     - - - - - - - - - - - - - 
      pnerr = vmmlod(pnlkey1,pnlod)
*     - - - - - - - - - - - - - 
      pnerr = VMM_GET_VAR(ru)
      pnerr = VMM_GET_VAR(rv)
      pnerr = VMM_GET_VAR(rcn)
      pnerr = VMM_GET_VAR(rth)
      pnerr = VMM_GET_VAR(oru)
      pnerr = VMM_GET_VAR(orv)
      pnerr = VMM_GET_VAR(orcn)
      pnerr = VMM_GET_VAR(orth)
      pnerr = VMM_GET_VAR(ruw1)
      pnerr = VMM_GET_VAR(rvw1)
      pnerr = VMM_GET_VAR(ut1)
      pnerr = VMM_GET_VAR(vt1)
      pnerr = VMM_GET_VAR(tt1)
      pnerr = VMM_GET_VAR(qt1)
      pnerr = VMM_GET_VAR(fit1)
      pnerr = VMM_GET_VAR(st1)
      pnerr = VMM_GET_VAR(tdt1)
      pnerr = VMM_GET_VAR(psdt1)
      if (.not. Schm_hydro_L) then
         pnerr = VMM_GET_VAR(rw)
         pnerr = VMM_GET_VAR(rvv)
         pnerr = VMM_GET_VAR(orw)
         pnerr = VMM_GET_VAR(orvv)
         pnerr = VMM_GET_VAR(wt1)
         pnerr = VMM_GET_VAR(topo)
         pnerr = VMM_GET_VAR(fipt1)
         pnerr = VMM_GET_VAR(mut1)
      else
         rw_   = 0
         rvv_  = 0
         orw_  = 0
         orvv_ = 0
         wt1_  = 0
         topo_ = 0
         fipt1_= 0
         mut1_ = 0
      endif
      if (G_lam) then
         pnerr = VMM_GET_VAR(nest_u)
         pnerr = VMM_GET_VAR(nest_v)
      else
         nest_u_ = 0
         nest_v_ = 0
      endif
*
*     Perform the computation in the first 
*     cycle of Crank-Nicholson procedure only
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if ( Orh_icn .eq. 1 ) then
*
*
         call rhsp_2  (    ru,    rv,   rcn,   rth,    rw,   rvv,
     %                    oru,   orv,  orcn,  orth,   orw,  orvv,
     %                   ruw1,  rvw1,   ut1,   vt1,   tt1,   qt1,
     %                   fit1,   st1,  tdt1, psdt1,nest_u,nest_v,
     %                    wt1,  topo, fipt1,  mut1, LDIST_DIM,l_nk  )
*
      else

!$omp parallel
!$omp do 
         do k=1,l_nk
         do j= 1, l_nj 
         do i= 1, l_ni
            ru (i,j,k) = oru (i,j,k)
            rv (i,j,k) = orv (i,j,k)
            rcn(i,j,k) = orcn(i,j,k)
            rth(i,j,k) = orth(i,j,k)
         end do
         end do
         end do
!$omp enddo
         if (.not. Schm_hydro_L) then
!$omp do 
            do k=1,l_nk
            do j= 1, l_nj 
            do i= 1, l_ni
               rw (i,j,k) = orw (i,j,k)
               rvv(i,j,k) = orvv(i,j,k)
            end do
            end do
            end do
!$omp enddo
         endif
!$omp end parallel
*
      endif
*
c     if (Acid_test_L) then
c     If (Lun_out.gt.0) write(Lun_out,*) 'After rhsp_2, computed area'
c     call glbstat (ru,'RU0',LDIST_DIM,G_nk,8+acid_i0,G_ni-8-acid_in,
c    %                                      8+acid_j0,G_nj-7-acid_jn,1,G_nk)
c     call glbstat (ruw1,'RUW1',LDIST_DIM,G_nk,6+acid_i0,G_ni-5-acid_in,
c    %                                      5+acid_j0,G_nj-4-acid_jn,1,G_nk)
c     call glbstat (rth,'RTH',LDIST_DIM,G_nk,8+acid_i0,G_ni-7-acid_in,
c    %                                      8+acid_j0,G_nj-7-acid_jn,1,G_nk)
*     Rcn0 will not match to the piloting run because it includes new Ru,Rv
c     If (Lun_out.gt.0) 
c    %  write(Lun_out,*) 'Rcn0 includes nesting area and new Ru,Rv, will not match'
c     call glbstat (rcn,'Rcn0',LDIST_DIM,G_nk,1+acid_i0,G_ni-acid_in,
c    %                                        1+acid_j0,G_nj-acid_jn,1,G_nk)
c     endif
      pnerr = vmmuld(-1,0)
      pnerr = vmmuld(-1,0)
*
1000  format(3X,'COMPUTE THE RIGHT-HAND-SIDES: (S/R RHS)')
*
*     __________________________________________________________________
*
      return
      end