 MODULE comvars3d
!!======================================================================
!!                   ***  MODULE comvars3d  ***
!!
!! ** Description :
!!
!! ** Reference :
!!
!! ** History :
!!
!!======================================================================





























































!! * Modules used
   USE parameters

!! * Shared or public module variables
   
!-------------------------------------------------------------------
! l_equisig : logique positionne a .true. pour repartir uniformement les
!             niveaux sigma sur la verticale.
! sig       : tableau contenant la valeur de sigma sur les differents
!             niveau de calcul des points (uz, vz, sal, temp...). Cette
!             valeur est interpretee comme un pourcentage de la colonne
!             d eau sous le niveau considere (valeur comprise entre 0 et 1).
! dsigu     : epaisseur sigma de la couche encadrant le niveau de calcul uz.
! dsigw     : epaisseur sigma de la couche encadrant le niveau de calcul wz
!             (ou nz, kz, ect).
   LOGICAL                                 :: l_equisig
   REAL(kind=rsh),DIMENSION(0:kmax+1)      :: sig
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:) :: dsigu,dsigw

!-------------------------------------------------------------------
! l_stability : logique positionne a .true. pour melanger les colonnes d eau
!             trop instables.
! turb_nbeq : nombre d equations dans le modele de fermeture turbulente (0,1 ou 2)
! turb_0eq_option : choix de l option pour le modele a zero equation
!              1- Kz et Nz constants
!              2- Csanady
!              3- Quetin
!              4- Pacanowski et Philander
! kzinit    : valeur initiale du coefficient vertical de melange en m2/s.
! nzinit    : valeur initiale du coefficient vertical de viscosite en m2/s.
! kz        : tableau du coefficient turbulent vertical de melange en m2/s
!             estime au cours du calcul en 3d.
! kz        : tableau du coefficient turbulent vertical de viscosite en m2/s
!             estime au cours du calcul en 3d.
! bgdiff    : background diffusivity : valeur en deca de laquelle ne descendent
!             ni les kz ni les nz. en m2/s
   LOGICAL        :: l_stability
   INTEGER        :: turb_nbeq,turb_0eq_option,turb_2eq_option,OptionSF
   REAL(kind=rsh) :: kzinit,nzinit,bgdiff
   REAL(kind=rsh),DIMENSION(:,:,:),ALLOCATABLE        :: kz,nz

!-------------------------------------------------------------------
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:,:,:) :: wz
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:)     :: sigw

!-------------------------------------------------------------------
   LOGICAL        :: l_stateeq_lin
   REAL(kind=rsh) :: saliref,tetaref,rhoref,saliref_lin,tetaref_lin


   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:,:) :: roswat_bot


!-------------------------------------------------------------------
! seuil pour choix schema centre ou upstream sur la verticale (key_tssub_wquickupwind uniquement)
   REAL(kind=rsh) :: qmaxz

!-------------------------------------------------------------------
! Variables used for turbulence advection
! uzsw       : zonal component of total (barotropic+baroclinic) velocity (in m/s)
!              at vertical half-grid cells (sigw)
! vzsw       : meridional component of total (barotropic+baroclinic) velocity (in m/s)
!              at vertical half-grid cells (sigw)
! wzsw       : vertical component of velocity at vertical half-grid cells
! fxsw       : fxeau re-sampled at vertical half-grid cells (sigw)
! fysw       : fyeau re-sampled at vertical half-grid cells (sigw)
! phisw      : phieau re-sampled at vertical half-grid cells (sigw)
! fxect, fyect
! fxpsi, fypsi



! Adaptive implicit vertical advection
   REAL(kind=rsh),PARAMETER :: theta_wz=0.55_rsh
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:,:,:) :: f_alpha_T  ! w dT/dz * 1 / f(alpha)
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:,:,:) :: wmo_exp_x  ! w du/dz * 1 / f(alpha)
   REAL(kind=rsh),ALLOCATABLE,DIMENSION(:,:,:) :: wmo_exp_y  ! w dv/dz * 1 / f(alpha)



 CONTAINS

!!==============================================================================

  SUBROUTINE alloc_comvars3d

!&E--------------------------------------------------------------------------
!&E                 ***  ROUTINE alloc_comvars3d  ***
!&E
!&E--------------------------------------------------------------------------
!! * Modules used
   IMPLICIT NONE

!!----------------------------------------------------------------------
!! * Executable part

   ALLOCATE(nz(0:kmax,limin  :limaxp1,ljmin  :ljmaxp1) )
!ALLOCATE(kz(kmax,limin:limax  ,ljmin:ljmax  ) )
! larger extension because of traj_3d routine
! might be not sufficient because of the medium location
   ALLOCATE(kz(0:kmax,liminm1:limaxp1,ljminm1:ljmaxp1) )
   ALLOCATE(sigw(0:kmax+1))
   ALLOCATE(dsigu(kmax),dsigw(kmax))




   ALLOCATE( wmo_exp_x(1:kmax,liminm1:limaxp2,ljminm1:ljmaxp2) )
   ALLOCATE( wmo_exp_y(1:kmax,liminm1:limaxp2,ljminm1:ljmaxp2) )
   ALLOCATE( f_alpha_T(1:kmax,liminm1:limaxp1,ljminm1:ljmaxp1) )
   wmo_exp_x = 1.0_rsh
   wmo_exp_y = 1.0_rsh
   f_alpha_T = 1.0_rsh



   ALLOCATE( roswat_bot(limin:limax,ljmin:ljmax) )
   roswat_bot(:,:)=0.0_rsh


  END SUBROUTINE alloc_comvars3d

!!==============================================================================

  SUBROUTINE dealloc_comvars3d

!&E--------------------------------------------------------------------------
!&E                 ***  ROUTINE dealloc_comvars3d  ***
!&E
!&E--------------------------------------------------------------------------
!! * Modules used
   IMPLICIT NONE

!!----------------------------------------------------------------------
!! * Executable part

   DEALLOCATE(kz,nz)
   DEALLOCATE(sigw,dsigu,dsigw)




   DEALLOCATE(wmo_exp_x,wmo_exp_y,f_alpha_T)



  END SUBROUTINE dealloc_comvars3d

!!==============================================================================


 END MODULE comvars3d
