  MODULE phy_typ
!=========================== DOCUMENTATION ============================= 
!DOCDEBm*    PHY/phy_typ  *
!
!    NOM
! phy_typ
!    DESCRIPTION  
!*
! Descrition des types de structures PHYsiques
!
! Description of PHYsical structure types
!*!
! Type:
!     vect_nvar  -> vecteur de taille nvarmax (seules les nvar premieres sont utiles)
!     vect_3     -> vecteur de taille 3
!     state      -> objet "etat": variables conservatives, variables primitives, gradient des variables primitives
!                   modele Saint-Venant: h,u,v,entropie,z_b
!                   modele Bifluide    : rho,u,v,w, p, entropie
!
!    SOURCE
! Ce logiciel est regi par la licence [CeCILL-B]
! This software is governed by the [CeCILL-B] license
!=========================== DEBUT DES DECLARATIONS ==================== 
!.1-----  Implicit, Use
  use, intrinsic :: iso_fortran_env, only : output_unit, error_unit
  IMPLICIT NONE
!.2-----  Declaration
! ----- nbre de variables de bilan
  integer,parameter               :: nvarmax=6 , phy_nb_cl=10 
  integer                         :: nvar=5    
! Indice de variable reserve pour l entropie
! A DEFINIR DANS LA ROUTINE ENTROPIE
  integer                         :: ive_phy=0 
  integer :: imodel_phy=2  ! type de modele physique
! =2   --> bifluide isotherme (loi de pression isobare ou non)
! =1   --> Saint Venant

  real(kind=kind(0.D0)) ::etac_phy=0.D0 ! constante eta
  integer :: inoncons_phy=0 ! indicateur de modele non-conservatif
                            !=0 : pas de termes non conservatifs
                            !=1 : possede des termes non-conservatifs
  real(kind=kind(0.d0)) :: vi_phy   ! vitesse d interface du modele non conservatif
  integer               :: icell_phy   ! no de cellule (debogage)

!----- quelques constantes physiques
  real(kind=kind(0.D0)) :: gpes_phy=9.81d0 !pesanteur

! modele bi-fluide isotherme
  real(kind=kind(0.D0)) :: c_phy=20.d0                       ! vitesses du son dans le melange air / eau (en m/s)
  real(kind=kind(0.D0)) :: p0_phy=1.d5                       ! pression de reference (en Pa)
  real(kind=kind(0.D0)) :: rho0A_phy=1.d0, rho0W_phy=1000.d0 ! masses volumiques de reference pour l air et l eau (en kg/m^3)
  real(kind=kind(0.D0)) :: sharp_phy=0.d0                    ! parametre de compression de l interface
  integer               :: pes_xyz=2                         ! orientation de la pesanteur 0/aucune, 1/suivant x, 2/suivant y, 3/suivant z

! modele de Saint Venant
  real(kind=kind(0.D0)) :: tc
  real(kind=kind(0.D0)) :: hzero_phy=1.d-4

  integer               :: ibathy=0 ! 0/ fond plat
                                    ! 1/ bathy et friction definies par fonction de numero num_bathy
                                    ! 2/ bathy et friction definies lineairement par bloc aux sommets
                                    ! 3/ bathy et friction definies par bloc sur le niveau de raffinement max
  character(30)         :: fich_bathy
  integer               :: num_bathy=0   ! numero de la fonction utilisateur definissant la bathymetrie, son gradient et la friction
  integer               :: ngrad_bathy=0 ! gradient de bathymetrie numerique 0/non , 1/oui
  integer               :: ifrict=0 ! 0/ Pas de Fiction
                                    ! 1/ Friction Manning-Sticker Cf u u /h**4/3
                                    ! 2/ Friction Darcy-Weisbach Cf u u /h
                                    
!=========================== DEBUT DU CODE EXECUTABLE ==================
!----- Debut Type ------------------------------------------------------
!  vecteur de taille nvar (surdimensionne à nvarmax)
  TYPE vect_nvar
     real(kind=kind(0.d0)),dimension(nvarmax):: v
  END TYPE vect_nvar
!----- Fin Type -------------------------------------------------------

!----- Debut Type -----------------------------------------------------
! vecteur de taille 3
  TYPE vect_3
     real(kind=kind(0.d0)),dimension(3):: v
  END TYPE vect_3
!----- Fin Type -------------------------------------------------------
  
!----- Debut Type -----------------------------------------------------
! etat physique: variables de bilan et primitives
! gradient des variables primitives
  TYPE state
     type(vect_nvar)             :: vbal,vprim
     type(vect_nvar),dimension(3):: gprim
     real(kind=kind(0.d0))       :: enti,entf,pe,chi
  END TYPE state
!----- Fin Type -------------------------------------------------------



 CONTAINS
 
 SUBROUTINE print_err(fich,msg)
  implicit none
  character(len=*), intent(in)       :: msg, fich
 write(output_unit,*)achar(27)//'[31mX ERR-'//fich//' : '//msg  ! en rouge
 write(output_unit,*)'X ERR-'//fich//' : end program.'//achar(27)//'[0m'
 stop
 END SUBROUTINE print_err

 SUBROUTINE print_avert(fich,msg)
  implicit none
  character(len=*), intent(in)       :: msg, fich
  write(output_unit,*)achar(27)//'[34m! AVERT-'//fich//' : '//msg//achar(27)//'[0m' ! en bleu
 END SUBROUTINE print_avert

 SUBROUTINE print_info(fich,msg)
  implicit none
  character(len=*), intent(in)       :: msg, fich
  write(output_unit,*)achar(27)//'[32m> INFO-'//fich//' : '//msg//achar(27)//'[0m' ! en vert
 END SUBROUTINE print_info

!===========================   FIN DU MODULE   =========================
  END MODULE phy_typ
!DOCFIN