  MODULE geo_typ
!=========================== DOCUMENTATION ============================= 
!DOCDEBm*    GEO/geo_typ  *
!
!    NOM 
! geo_typ
!    DESCRIPTION  
!*
! Descrition des types de structures GEOmetrie/maillage
!
! Description of GEOmetry/mesh structure types
!*
! 
!    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 phy
  IMPLICIT NONE
!=========================== DEBUT DU CODE EXECUTABLE ==================
!----- Grandeurs communes necessaires a la description de la geometrie
!----- Common variables necessary for the description of the geometry
! distance minimale de recollement / minimal distance for merging
  real(kind=kind(0.d0)) :: petit = 1.d-6, hpetit 
! distance minimale pour la numerotation de morton / minimal distance for morton numbering
  real(kind=kind(0.d0)) :: petit_morton = 1.d-6 
! decalage pour la numerotation de morton suivant x,y,z / offset for morton numbering in x,y,z
  real(kind=kind(0.d0)) :: x_min_morton = 0.d0    
  real(kind=kind(0.d0)) :: y_min_morton = 0.d0    
  real(kind=kind(0.d0)) :: z_min_morton = 0.d0    

! nombre maximum de solides dans le calcul / maximum number of solids in the calculation
    integer, parameter              :: nb_sol_max=10      

!----- Debut Type ------------------------------------------------------
  TYPE point
      real(kind=kind(0.d0)):: x,y,z
  END TYPE point
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
  TYPE face
    integer,dimension(4)    :: vertex    ! tableau des points (au plus 4) : numero LOCAL au domaine des sommets
    integer                 :: nbvertex  ! nombre effectif de points (3 ou 4)
    integer                 :: ic1,ic2   ! numero LOCAL des deux cellules voisines si ic2 <=0  ---> condition aux limites
    real(kind=kind(0.d0))   :: surf      ! surface
    integer                 :: flevel
    type(vect_3)            :: vnorm     ! vecteur normal, orienté de ic1 vers ic2 (obligatoire)
    type(point)             :: center    ! barycentre
  END TYPE face
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
  TYPE cell
      type(point)             :: center           ! barycentre
      real(kind=kind(0.d0))   :: vol              ! volume
      real(kind=kind(0.d0))   :: h                ! Rapport Volume sur surface du bord : homogene à une distance: soit le "diametre" de la cellule
      integer                 :: clevel           ! dans le cas de la turbulence distance a la paroi et yplus et indicateur solide
      !real(kind=kind(0.d0))   :: dip              
      !real(kind=kind(0.d0))   :: yplus            
      integer                 :: isolid=0           
      !type(vect_3)            :: vnpa             ! vecteur normal a la paroi
      type(state)             :: w                ! vecteur d etat au centre de la maille
      type(vect_nvar)         :: balance          ! bilan des flux et des sources sur la maille
      type(vect_nvar)         :: fp               ! flux precedent
      integer                 :: num,idom,numloc  ! numero de la maille, numero de sous-domaine, numero local 
  END TYPE cell
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type liste d entier allouable
  TYPE list_int
      integer,pointer,dimension(:):: L => null()
  END TYPE list_int
!----- Fin Type --------------------------------------------------------
 
!----- Debut Type ------------------------------------------------------
! type liste vect-nvar allouable
  TYPE list_vec
     type(vect_nvar),pointer,dimension(:):: vec => null()
  END TYPE list_vec
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type maillage
  TYPE mesh
     integer                             :: numdom,nb_cell,nb_face        ! numero du sous-domaine, nombre de cellules et de faces
     integer                             :: nb_dom,nb_vertex              ! nombre de sous-domaines, nombre de sommets
     integer                             :: nb_level_face,nb_level_cell   ! nombre de niveaux par faces et par cellules
     integer                             :: ndim                          ! dimension du maillage 0/ Axi, 1/1D, 2/2D , 3/3D 
     real(kind=kind(0.d0))               :: small,big                     ! dimensions de la plus petite et plus grosse cellule 
     type(face),pointer,dimension(:)     :: list_face => null()           ! tableaux des cellules
     type(cell),pointer,dimension(:)     :: list_cell => null()           ! tableaux des faces
     type(point),pointer,dimension(:)    :: list_vertex => null()         ! tableaux des vertex
     type(list_int),pointer,dimension(:) :: list_send => null()           ! tableau des listes de numeros de cellules à envoyer pour domaines voisins
     type(list_int),pointer,dimension(:) :: list_recv => null()           ! tableau des listes de numeros de cellules à recevoir des domaines voisins
  END TYPE mesh
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type Bloc
  TYPE bloc
     integer                            :: numbl,idom              ! numero de bloc et de domaine
     integer                            :: morton                  !  Numero issu du Z-order (code de morton)
     integer                            :: nrb,nx,ny,nz            ! nbre de cellules suivant x,y,z et niveau de raffinement (puissance de 2), 
     type(point),dimension(8)           :: s                       ! Definition geometrique de la boite par ces 8 sommets
     real(kind=kind(0.d0))              :: volc                    ! volume du bloc
     integer,dimension(6)               :: cl(6)                   ! Cl ou numero du bloc voisin: clxmin,clxmax,clymin,clymax,clzmin,clzmax
     integer,dimension(6)               :: nrf(6)                  ! Niveau de raffinement de la frontiere du bloc : nrxmin,nrxmax,nrymin,nrymax,nrzmin,nrzmax
     integer,dimension(6)               :: dom(6)                  ! Numero de domaine du bloc voisin:
     integer                            :: first_cell, nb_cell     ! Numero de la premiere cellule, nombre de cellules
     integer                            :: first_face, nb_face     ! Numero de la premiere face, nombre de faces
     integer                            :: first_vertex, nb_vertex ! Numero du premier sommet, nombre de sommet
     logical                            :: isol                    ! Indicatrice de presence du solide
     real(kind=kind(0.d0)),dimension(8) :: vb            ! valeurs stockees par bloc pour SV: bathymetrie aux 4 premiers sommets 
                                                         ! et coefficient de friction aux 4 premiers sommets
  END TYPE bloc
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type chaineR1
  TYPE chaineR1
     integer                  :: num, interieur
     real*8                   :: z,phi
     Type(chaineR1), pointer  :: prec,suiv
  END TYPE chaineR1
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type chaineR2
  TYPE chaineR2
     real*8                   :: y
     type(chaineR1), pointer  :: cr1
     type(chaineR2), pointer  :: prec,suiv
  END TYPE chaineR2
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
! type chaineR3
  TYPE chaineR3
      real*8                  :: x
      type(chaineR2), pointer :: cr2
      type(chaineR3), pointer :: prec,suiv
  END TYPE chaineR3
!----- Fin Type --------------------------------------------------------

!----- Debut Type ------------------------------------------------------
  TYPE facette
! tableau des points (au plus 3)
     integer,dimension(3)    :: vertex
  END TYPE facette
!----- Fin Type --------------------------------------------------------


!----- Debut Type ------------------------------------------------------
! --  TYPE solide
  TYPE solide
      integer                                   :: id=0                                                                    
! Identifiant (numero) du solide
      integer                                   :: imv=0                                                                    
! mouvement du solide: =-1 fixe ; =0 libre ; >0 prescrit par la fonction numero imv
      integer                                   :: nb_vert=0,nb_face=0                                                     
! Nbre de sommets, facettes ou aretes definissant le solide
      real(kind=kind(0.d0))                     :: xmin_s=0.d0,xmax_s=0.d0,ymin_s=0.d0,ymax_s=0.d0,zmin_s=0.d0,zmax_s=0.d0 
! Bounding Box du solide
      real(kind=kind(0.d0))                     :: rho=0.d0                                                                
! Masse volumique du solide
      type(vect_3)                              :: xg,theta                                                                
! Position du centre de gravite du solide, angle de rotation par rapport au referentiel global
      type(facette), dimension(:), allocatable  :: list_facette                                                            
! Liste des facettes constituant l'enveloppe du solide
      type(point), dimension(:), allocatable    :: list_vertex                                                             
! Liste des vertex sur l enveloppe du solide
      integer                                   :: nb_cell=0                                                               
! Nbre de cellules contenues dans le solide
!      integer, dimension(:), allocatable        :: list_cells
  END TYPE solide
!----- Fin Type --------------------------------------------------------
!===========================   FIN DU MODULE   =========================

  END MODULE geo_typ
!DOCFIN