!-------------------------------------- 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 nlip_2 - compute non-linear portion of momentum, divergence and
*               thermodynamic equations
*               compute non-linear portion of reduced set of equations
*               ( computation and microtasking )
*
***********************************************************************
*
#include "model_macros_f.h"
*

      subroutine nlip_2 ( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p,  2,1
     $                    F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, 
     $                    F_ncn, F_st0  , F_qt0 , F_fipt0, F_fis  , 
     $                    F_ut0, F_vt0, F_mut0 , F_multx, 
     $                    F_wijk1, F_wijk2, DIST_DIM, Nk )
*
      implicit none
*
      integer DIST_DIM, Nk
      real    F_nu   (DIST_SHAPE,Nk), F_nv   (DIST_SHAPE,Nk),
     %        F_n1   (DIST_SHAPE,Nk), F_nth  (DIST_SHAPE,Nk),
     %        F_n3   (DIST_SHAPE,Nk), F_n3p  (DIST_SHAPE,Nk),
     %        F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk),
     %        F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk),
     %        F_pipt0(DIST_SHAPE,Nk), F_ncn  (DIST_SHAPE,Nk),
     %        F_st0  (DIST_SHAPE)   , F_qt0  (DIST_SHAPE,Nk),
     %        F_fipt0(DIST_SHAPE,Nk), F_fis  (DIST_SHAPE)   ,
     %        F_ut0  (DIST_SHAPE,Nk), F_vt0  (DIST_SHAPE,Nk),
     %        F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk),
     %        F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk)
*
*author
*     Alain Patoine - split from nli.ftn
*
*revision
* v2_00 - Desgagne M.       - initial MPI version (from rhs v1_03)
* v2_21 - Lee V.            - modifications for LAM version
* v2_30 - Edouard S.        - adapt for vertical hybrid coordinate
*                             remove F_pptt0 and introduce Ncn
* v3_00 - Qaddouri & Lee    - For LAM, set Nu, Nv values on the boundaries
* v3_00                       of the LAM grid to zeros.
* v3_02 - Edouard S.        - correct non-hydrostatic version (F_mut0,F_tpt0,b2)
* v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP
* v3_21 - Desgagne M.       - Revision OpenMP
* v3_30 - Desgagne M.       - Revision OpenMP
*
*object
*
*arguments
*     see documentation of appropriate comdecks
*
*implicits
#include "glb_ld.cdk"

*
      integer i01, in1, j01, jn1, nij, i02, in2, j02, jn2

**
*     __________________________________________________________________
*
*
*     Prepare the nonlinear perturbation q" of log hydro pressure 
*     and the "relative" geopotential ( phi' + phis ) for gradient
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      i01=1
      in1=l_ni
      j01=1
      jn1=l_nj
      i02=1
      in2=l_ni
      j02=1
      jn2=l_nj
      if (G_lam) then
          if (l_west) i01=1+pil_w -1 
          if (l_east) in1=l_ni-pil_e +1
          if (l_south)j01=1+pil_s -1 
          if (l_north)jn1=l_nj-pil_n +1 
          if (l_west) i02=1+pil_w
          if (l_east) in2=l_ni-pil_e
          if (l_south)j02=1+pil_s 
          if (l_north)jn2=l_nj-pil_n 
      endif
*
      call nlip_2_2 ( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p, 
     $                    F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, 
     $                    F_ncn, F_st0  , F_qt0 , F_fipt0, F_fis  , 
     $                    F_ut0, F_vt0, F_mut0 , F_multx, 
     $                    F_wijk1, F_wijk2, DIST_DIM, Nk,
     $                    i01,j01,in1,jn1,i02,j02,in2,jn2 )
      return
      end
!
! 2nd stage added for OpenMP
!

      subroutine nlip_2_2 ( F_nu, F_nv, F_n1, F_nth, F_n3, F_n3p,  1,1
     $                    F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0, 
     $                    F_ncn, F_st0  , F_qt0 , F_fipt0, F_fis  , 
     $                    F_ut0, F_vt0, F_mut0 , F_multx, 
     $                    F_wijk1, F_wijk2, DIST_DIM, Nk,
     $                    i01,j01,in1,jn1,i02,j02,in2,jn2 )
*
      implicit none
*
      integer DIST_DIM, Nk,i01,j01,in1,jn1,i02,j02,in2,jn2
      real    F_nu   (DIST_SHAPE,Nk), F_nv   (DIST_SHAPE,Nk),
     %        F_n1   (DIST_SHAPE,Nk), F_nth  (DIST_SHAPE,Nk),
     %        F_n3   (DIST_SHAPE,Nk), F_n3p  (DIST_SHAPE,Nk),
     %        F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk),
     %        F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk),
     %        F_pipt0(DIST_SHAPE,Nk), F_ncn  (DIST_SHAPE,Nk),
     %        F_st0  (DIST_SHAPE)   , F_qt0  (DIST_SHAPE,Nk),
     %        F_fipt0(DIST_SHAPE,Nk), F_fis  (DIST_SHAPE)   ,
     %        F_ut0  (DIST_SHAPE,Nk), F_vt0  (DIST_SHAPE,Nk),
     %        F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk),
     %        F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk)

#include "glb_ld.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "cori.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "ptopo.cdk"
*
      integer i, j, k, i00, inn, j00, jnn, i0, in, j0, jn, nij
      real wk2(DIST_SHAPE), w1, w2, w3, q1
      real*8 eps, gamma, p1,p2,p3,p4,p5,p6,p7, t1,t2,t3,t4
*
      real*8 one, half, quarter
      parameter ( one=1.0, half=.5, quarter=.25 )
*
      real*8, dimension(i01:in1,j01:jn1) :: xlog, ylog
      real*8, dimension(i02:in2,j02:jn2) :: xexp2, yexp2, xlog2, ylog2
*
* --------------------------------------------------------------------
      call rpn_comm_xch_halo( F_tpt0 , LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_qt0  , LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_mut0 ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
      if (Cori_cornl_L) then
        call rpn_comm_xch_halo( F_ut0 ,LDIST_DIM,l_niu,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
        call rpn_comm_xch_halo( F_vt0 ,LDIST_DIM,l_ni,l_njv,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
*
      gamma = one
      if (.not. Schm_hydro_L) then 
           eps =  Schm_nonhy_8 * Dcst_rgasd_8   * Cstv_tstr_8
     %         /( Dcst_cappa_8 * Dcst_grav_8**2 * Cstv_tau_8**2 )
         gamma =  one/( one + eps )
      endif 
      p1 = Dcst_rayt_8*Dcst_rayt_8
      p2 = one / Cstv_tau_8
      p3 = one / p1
      p4 = Dcst_rgasd_8 / p1
      p5 = one / Cstv_tstr_8
      p6 = gamma / Cstv_tau_8 
      p7 = p6 / Dcst_cappa_8
      q1 = one / Cstv_tau_8
*
!$omp parallel shared (yexp2) private(xlog, ylog, xlog2, ylog2, wk2,
!$omp$                 i0,in,j0,jn,nij,i00,j00,inn,jnn,w1,w2,w3,t1,
!$omp$                 t2,t3,t4)
      i0=i01
      j0=j01
      in=in1
      jn=jn1
      nij = (in - i0 + 1)*(jn - j0 + 1)
!$omp do
      do k=1,l_nk
         t1 = one/Geomg_z_8(k)
         do j= j0, jn
         do i= i0, in
           ylog(i,j) = one + F_pipt0(i,j,k)*t1
         end do
         end do
         call vlog (ylog, ylog, nij)
         do j= j0, jn
         do i= i0, in
            F_wijk1(i,j,k) = ylog(i,j) - ( geomg_pib(k)* F_st0(i,j))*t1
         enddo
         enddo
*
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
            F_wijk2(i,j,k) = F_fipt0(i,j,k) + F_fis(i,j) 
         enddo
         enddo
         endif
*
      enddo
!$omp enddo
*
************************************************************
* The nonlinear deviation of horizontal momentum equations *
************************************************************
*
!$omp single
      call rpn_comm_xch_halo( F_wijk1, LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_wijk2,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
!$omp end single
*
!$omp do
      do 100 k=1,l_nk
*
*     Compute Nu for hydrostatic version 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      i0 = 1
      in = l_niu
      j0 = 1+pil_s
      jn = l_nj-pil_n
      if (G_lam) then
         if (l_west) i0=1+pil_w
         if (l_east) in=l_niu-pil_e
      endif
*
      do j= j0, jn
      do i= i0, in
         w1 = ( 1. - intuv_c0xxu_8(i) ) * F_tpt0(i  ,j,k) 
     %             + intuv_c0xxu_8(i)   * F_tpt0(i+1,j,k)
         w2 = (   F_qt0(i+1,j,k) -   F_qt0(i,j,k) ) * Geomg_invhx_8(i)
         w3 = ( F_wijk1(i+1,j,k) - F_wijk1(i,j,k) ) * Geomg_invhx_8(i)
         F_nu(i,j,k) = p4 * ( w1*w2 + Cstv_tstr_8*w3 )
      end do
      end do
*
      if (Cori_cornl_L) then
*        Set indices for calculating wk2
         i00 = minx
         inn = maxx
         j00 = 1+pil_s
         jnn = l_njv
         if (G_lam) then
             if (l_west) i00 = 1+pil_w -2
             if (l_east) inn = l_niu-pil_e +3
             if (l_north)jnn = l_njv-pil_n +1
         else
             if (l_south) j00 = 3
             if (l_north) jnn = l_njv-1
         endif
*
         do j = j00, jnn
         do i = i00, inn
            wk2(i,j)  = inuvl_wyvy3_8(j,1) * F_vt0(i,j-2,k) 
     %                + inuvl_wyvy3_8(j,2) * F_vt0(i,j-1,k) 
     %                + inuvl_wyvy3_8(j,3) * F_vt0(i,j  ,k) 
     %                + inuvl_wyvy3_8(j,4) * F_vt0(i,j+1,k)          
         end do
         end do
*
         if (.not.G_lam) then 
            if (l_south) then
               do i = i00, inn
                  wk2(i,j00-2)= inuvl_wyvy3_8(j00-2,3)*F_vt0(i,j00-2,k) 
     %                       +  inuvl_wyvy3_8(j00-2,4)*F_vt0(i,j00-1,k) 
                  wk2(i,j00-1)= inuvl_wyvy3_8(j00-1,2)*F_vt0(i,j00-2,k) 
     %                        + inuvl_wyvy3_8(j00-1,3)*F_vt0(i,j00-1,k) 
     %                        + inuvl_wyvy3_8(j00-1,4)*F_vt0(i,j00  ,k) 
               end do
            endif
            if (l_north) then
               do i = i00, inn
                  wk2(i,jnn+2)= inuvl_wyvy3_8(jnn+2,1)*F_vt0(i,jnn  ,k) 
     %                        + inuvl_wyvy3_8(jnn+2,2)*F_vt0(i,jnn+1,k) 
                  wk2(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1)*F_vt0(i,jnn-1,k) 
     %                        + inuvl_wyvy3_8(jnn+1,2)*F_vt0(i,jnn  ,k) 
     %                        + inuvl_wyvy3_8(jnn+1,3)*F_vt0(i,jnn+1,k) 
               end do
            endif
         endif
*
         do j= j0, jn
         do i= i0, in
            F_nu(i,j,k) = F_nu(i,j,k) - Cori_fcoru_8(i,j) *
     %     (inuvl_wxxu3_8(i,1)*wk2(i-1,j)+inuvl_wxxu3_8(i,2)*wk2(i  ,j)
     %    + inuvl_wxxu3_8(i,3)*wk2(i+1,j)+inuvl_wxxu3_8(i,4)*wk2(i+2,j))
         end do
         end do
      endif
*
*     Compute Nv for hydrostatic version 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1
      jn = l_njv
      if (G_lam) then
         if (l_south) j0=1+pil_s
         if (l_north) jn=l_njv-pil_n
      endif
      do j= j0, jn
      t1 = geomg_cyv2_8(j) * Geomg_invhsy_8(j)
      do i= i0, in
         w1 = ( 1. - intuv_c0yyv_8(j) ) * F_tpt0(i,j  ,k) 
     %             + intuv_c0yyv_8(j)   * F_tpt0(i,j+1,k)
         w2 = (F_qt0  (i,j+1,k) - F_qt0  (i,j,k)) * t1
         w3 = (F_wijk1(i,j+1,k) - F_wijk1(i,j,k)) * t1
         F_nv(i,j,k) = p4 * ( w1*w2 + Cstv_tstr_8*w3 )
      end do
      end do
*
      if (Cori_cornl_L) then
*        Set indices for calculating wk2
         j00 = miny
         jnn = maxy
         i00 = 1+pil_w
         inn = l_niu
         if (G_lam) then
            if (l_south) j00=1+pil_s-2
            if (l_north) jnn=l_njv-pil_n+3
            if (l_east) inn = l_niu-pil_e +1
         endif
*
         do j = j00, jnn
         do i = i00, inn
            wk2(i,j)  = inuvl_wxux3_8(i,1)*F_ut0(i-2,j,k) 
     %                + inuvl_wxux3_8(i,2)*F_ut0(i-1,j,k) 
     %                + inuvl_wxux3_8(i,3)*F_ut0(i  ,j,k) 
     %                + inuvl_wxux3_8(i,4)*F_ut0(i+1,j,k) 
         end do
         end do
*
*        Set indices for calculating Nv
         if (.not.G_lam) then
            if (l_south) j0 = 2
            if (l_north) jn = l_njv-1
         endif
         do j = j0, jn
         do i = i0, in
            F_nv(i,j,k) =   F_nv(i,j,k) + Cori_fcorv_8(i,j) *
     %     (inuvl_wyyv3_8(j,1)*wk2(i,j-1)+inuvl_wyyv3_8(j,2)*wk2(i,j  )
     %    + inuvl_wyyv3_8(j,3)*wk2(i,j+1)+inuvl_wyyv3_8(j,4)*wk2(i,j+2))
         end do
         end do
*
         if (.not.G_lam) then
            if (l_south) then
               do i = i0, in
                  F_nv(i,1,k) = F_nv(i,1,k) + Cori_fcorv_8(i,1)
     %       * (inuvl_wyyv3_8(1,2)*wk2(i,1)+inuvl_wyyv3_8(1,3)*wk2(i,2) 
     %                                     +inuvl_wyyv3_8(1,4)*wk2(i,3))
               end do 
            endif 
*
            if (l_north) then
               do i = i0, in
                F_nv(i,l_njv,k)=F_nv(i,l_njv,k)+Cori_fcorv_8(i,l_njv) *
     %         (   inuvl_wyyv3_8(l_njv,1)*wk2(i,l_njv-1) 
     %           + inuvl_wyyv3_8(l_njv,2)*wk2(i,l_njv  ) 
     %           + inuvl_wyyv3_8(l_njv,3)*wk2(i,l_njv+1) )
               end do 
            endif 
         endif
      endif
*
      if (.not. Schm_hydro_L) then
         i0 = 1
         in = l_niu
         j0 = 1+pil_s
         jn = l_nj-pil_n
         if (G_lam) then
            if (l_west) i0 = 1+pil_w
            if (l_east) in = l_niu-pil_e
         endif
         i00 = 1+pil_w
         inn = l_ni-pil_e
         j00 = 1
         jnn = l_njv
         if (G_lam) then
            if (l_south) j00 = 1+pil_s
            if (l_north) jnn = l_njv-pil_n
         endif
*
*        Add nonhydrostatic contributions to Nu 
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do j= j0, jn
         do i= i0, in
            w1 = ( 1. - intuv_c0xxu_8(i) ) * F_mut0(i  ,j,k) 
     %                + intuv_c0xxu_8(i)   * F_mut0(i+1,j,k)
            w2 = ( F_wijk2(i+1,j,k)-F_wijk2 (i,j,k) ) * Geomg_invhx_8(i)
            F_nu(i,j,k) = F_nu(i,j,k) + p3*w1*w2
         end do
         end do
*
*        Add nonhydrostatic contributions to Nv 
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do j= j00, jnn
         do i= i00, inn
            w1 = ( 1. - intuv_c0yyv_8(j) ) * F_mut0(i,j  ,k) 
     %                + intuv_c0yyv_8(j)   * F_mut0(i,j+1,k)
            w2 = (F_wijk2 (i,j+1,k) - F_wijk2(i,j,k) ) 
     %            *geomg_cyv2_8(j) * Geomg_invhsy_8(j)
            F_nv(i,j,k) = F_nv(i,j,k) + p3*w1*w2
         end do
         end do

      endif
*
      if (k.eq.1) then
         i0=1
         in=l_ni
         j0=1
         jn=l_nj
         if (G_lam) then
            if (l_west)  i0 = 1+pil_w
            if (l_east)  in = l_ni-pil_e
            if (l_south) j0 = 1+pil_s
            if (l_north) jn = l_nj-pil_n
         endif
         nij = (in - i0 +1)*(jn - j0 +1)
         do j = j0, jn
         do i = i0, in
            yexp2(i,j) = F_st0(i,j)
         end do
         end do
         call vexp ( yexp2, yexp2, nij )
      endif
*
 100  continue
!$omp enddo
*
* For LAM, set  Nu,Nv values on the boundaries of the LAM grid
*
      if (G_lam) then
         if (l_west) then
!$omp do
             do k=1,l_nk
             do j=1+pil_s,l_nj-pil_n
                F_nu(pil_w,j,k) = 0.
             end do
             enddo
!$omp enddo
         endif
         if (l_east) then
!$omp do
            do k=1,l_nk
            do j=1+pil_s,l_nj-pil_n
               F_nu(l_ni-pil_e,j,k) = 0.
            end do
            enddo
!$omp enddo
         endif
         if (l_south) then
!$omp do
            do k=1,l_nk
            do i=1+pil_w,l_ni-pil_e
               F_nv(i,pil_s,k) = 0.
            end do
            enddo
!$omp enddo
         endif
         if (l_north) then
!$omp do
            do k=1,l_nk
            do i=1+pil_w,l_ni-pil_e
               F_nv(i,l_nj-pil_n,k) = 0.
            end do
            enddo
!$omp enddo
         endif
      endif
*
      i0=1
      in=l_ni
      j0=1
      jn=l_nj
      if (G_lam) then
         if (l_west)  i0 = 1+pil_w
         if (l_east)  in = l_ni-pil_e
         if (l_south) j0 = 1+pil_s
         if (l_north) jn = l_nj-pil_n
      endif
      nij = (in - i0 +1)*(jn - j0 +1)
*
**************************************
* Combination of governing equations * 
**************************************
*
*     compute Ncn
*     ~~~~~~~~~~~
!$omp do
      do k =  1, l_nk
         do j = j0, jn
         do i = i0, in
            ylog2(i,j) = 1. + geomg_dpba(k) * (yexp2(i,j) - 1.0)
         end do
         end do
         call vlog(ylog2, ylog2, nij)
         do j = j0, jn
         do i = i0, in
            w1 = ylog2(i,j)
            w2 = geomg_dpib(k) * F_st0(i,j)
            F_ncn(i,j,k) = q1 * ( w1 - w2 )
         enddo
         enddo
      enddo
!$omp enddo
*
*     Compute the nonlinear deviation of horizontal divergence 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!$omp single      
      call rpn_comm_xch_halo( F_nu, LDIST_DIM,l_niu,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_nv, 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,l_nk
*
         if (G_lam) then
             do j= j0,jn
             do i= i0,in
                F_n1(i,j,k) =  ( F_nu(i,j,k) - F_nu(i-1,j,k) ) 
     $                        /( geomg_cy2_8(j)*geomg_hxu_8(i-1) )
     $          + ( F_nv(i,j,k) - F_nv(i,j-1,k) ) * Geomg_invhsyv_8(j-1)
             end do
             end do
         else
             call caldiv_2 ( F_n1(minx,miny,k), F_nu(minx,miny,k), 
     $                       F_nv(minx,miny,k), LDIST_DIM, 1 )
         endif
*
         do j= j0, jn
         do i= i0, in
            ylog2(i,j) = one+F_tpt0(i,j,k)*p5
         end do
         end do
         call vlog ( ylog2, ylog2, nij )
*
         do j= j0, jn
         do i= i0, in
            t1 = ylog2(i,j) - F_tplt0(i,j,k)*p5
            F_nth(i,j,k) = (-Dcst_cappa_8*F_wijk1(i,j,k)+t1)*p2
            F_wijk1(i,j,k) = F_n1(i,j,k) - q1 * F_ncn(i,j,k)
            F_wijk2(i,j,k) = p7*F_nth(i,j,k) 
         end do
         end do
*
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
            F_n3 (i,j,k) = ( F_multx(i,j,k) - F_mut0(i,j,k) )*p2
            F_n3p(i,j,k) =  F_n3(i,j,k) - eps*F_nth(i,j,k)
            F_wijk1(i,j,k) = F_wijk1(i,j,k) +  p6*F_n3p(i,j,k)
            F_wijk2(i,j,k) = F_wijk2(i,j,k) +  p7*F_n3 (i,j,k)
         end do
         end do
         endif 
*
      end do
!$omp enddo
*
***********************************************
* The RHS of the nonlinear Helmholtz equation * 
***********************************************
*
*
!$omp do
      do 300 k=1,l_nk
*
      if ( k .eq. 1 ) then
*
         t1 = quarter*Geomg_hz_8(k)
         t3 = half*Geomg_z_8(k)
         t4 = half*Geomg_z_8(k+1)
         do j= j0, jn 
         do i= i0, in
            F_rheln(i,j,k) = p1 * (F_rhell(i,j,k)
     $                   - t1*( F_wijk1(i,j,k) + F_wijk1(i,j,k+1) )
     $                   + t3*F_wijk2(i,j,k)  + t4*F_wijk2(i,j,k+1))
         end do
         end do
*
      elseif ( k .eq. l_nk ) then
*
         t1 = quarter*Geomg_hz_8(k-1)
         t3 = half*Geomg_z_8(k-1)
         t4 = half*Geomg_z_8(k)
         do j= j0, jn
         do i= i0, in
            F_rheln(i,j,k) = p1 * (F_rhell(i,j,k)
     $                   - t1*( F_wijk1(i,j,k-1) + F_wijk1(i,j,k) )
     $                   - t3*F_wijk2(i,j,k-1)  - t4*F_wijk2(i,j,k))
         end do
         end do
*
      else
*
         t1 = quarter*Geomg_hz_8(k-1)
         t2 = quarter*Geomg_hz_8(k)
         t3 = half*Geomg_z_8(k-1)
         t4 = half*Geomg_z_8(k+1)
         do j= j0, jn
         do i= i0, in
            F_rheln(i,j,k) =  p1 * (F_rhell(i,j,k)
     $                   -  t1*( F_wijk1(i,j,k-1) + F_wijk1(i,j,k  ) )
     $                   -  t2*( F_wijk1(i,j,k  ) + F_wijk1(i,j,k+1) )
     $                   -  t3*F_wijk2(i,j,k-1) + t4*F_wijk2(i,j,k+1))
         end do
         end do
*
      endif
 300  continue
!$omp enddo
!$omp end parallel
*
*     __________________________________________________________________
*
      return
      end