 SUBROUTINE read_cond(lst_bloc,icode,iarg,nb_bloc)
!=========================== DOCUMENTATION ============================= 
!DOCDEBh*    UTI/PRE/read_cond *
!
!    NOM
! read_cond(calc,icode,iarg,nb_bloc)
!    DESCRIPTION  
!*
! Lecture du Bloc COND du fichier de donnees .inp
! Reading the COND block of the .inp data file
!*
! 
!    ENTREES / INPUT
!    lst_bloc    : liste des blocs / list of blocks
!    icode  : 0/ tube a choc / shock tube
!             1/ Cas 2D / 2D case
!             2/ Cas 3D / 3D case
!             3/ condition par zones (gmsh) / condition by zones (gmsh)
!    iarg    : nombre de zones pour le cas 3 / number of zones for case 3
!    nb_bloc : nombre de blocs / number of blocks

!    SORTIES / OUTPUT
!    msh    : maillage / mesh
!
!    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 num
  IMPLICIT NONE
!.2-----  Declaration
  type(bloc), pointer, dimension(:), intent(inout) :: lst_bloc !! Liste des blocs / Block list
  integer, intent(inout)                           :: icode, iarg !! Code, argument
  integer, intent(inout)                           :: nb_bloc !! nombre de blocs / number of blocks
  
  integer                                   :: i,nzon,nbf,fctnum,icl,kkk,k
  integer                                   :: ityp,iz,izone
  real(kind=kind(0.d0)), dimension(nvarmax) :: val
!=========================== DEBUT DU CODE EXECUTABLE ==================
!-------  Initialisations
  nzon=0
  write(*,*)
  write(*,*)achar(27)//'[34m================================================'
  write(*,*)'Reading boundary condition: block COND'
  write(*,*)'================================================'//achar(27)//'[0m'
  write(*,*)
         
  SELECT CASE (icode)
!=====================================================================
! Conditions pour le tube a choc
!=====================================================================
      CASE (0)
          write(*,*)'COND-Info Boundary condition for shock tube already defined'
          DO i=1,nb_bloc
              if(lst_bloc(i)%cl(1).eq.-111) lst_bloc(i)%cl(1)=-101
              if(lst_bloc(i)%cl(2).eq.-222) lst_bloc(i)%cl(2)=-102
          END DO

!=====================================================================
! Conditions communes pour la marche et le cube
!=====================================================================
      CASE (1,2)
          IF (icode.eq.1) then
             write(*,*)'COND-Info 2D Conditions definition'
             kkk=4
           endif
          IF (icode.eq.2) then
              write(*,*)'COND-Info 3D Conditions definition'
              kkk=6
          endif

          ! condition en xmin, xmax, ymin, ymax (zmin, zmax)
          do k=1,kkk
              phy_state(k)%vprim%v=0.d0
              phy_state(k)%vbal%v =0.d0
              phy_state(k)%gprim(1)%v =0.d0
              phy_state(k)%gprim(2)%v =0.d0
              phy_state(k)%gprim(3)%v =0.d0
              val =0.d0
              read(33,*)ityp
              SELECT CASE (ityp)
                  CASE (0)
                      icl= 0
                  CASE (1)
                      icl=-1
                  CASE (2)
                      icl=-100-k
                      read(33,*)(val(i),i=1,nvar)
                      phy_state(k)%vprim%v=val
                      CALL Prim2Bal(phy_state(k))
                  CASE (3)
                      read(33,*)fctnum
                      icl=-(10000+fctnum)
                  !~CASE (6)
                  !~    icl=-2001 !condition de type periodique
                  CASE (4)
                      icl=-200-k
                      read(33,*)(val(i),i=1,nvar)
                      phy_state(k)%vbal%v=val
                      CALL bal2prim(phy_state(k))
                  CASE (999)
                      icl=-999
                  CASE DEFAULT
                  call print_err('READ_COND','unknown kind of boundary condition')
              END SELECT
            
              nbf=0
              DO i=1,nb_bloc
                  if(lst_bloc(i)%cl(k).eq.-111*k) then
                      lst_bloc(i)%cl(k)=icl
                      nbf=nbf+1
                  endif
              END DO
              if(k.eq.1)write( *,1011)icl,nbf
              if(k.eq.2)write( *,1012)icl,nbf
              if(k.eq.3)write( *,1013)icl,nbf
              if(k.eq.4)write( *,1014)icl,nbf
              if(k.eq.5)write( *,1015)icl,nbf
              if(k.eq.6)write( *,1016)icl,nbf
          enddo
1011 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Xmin')
1012 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Xmax')
1013 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Ymin')
1014 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Ymax')
1015 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Zmin')
1016 format(' COND-Info Condition',i8,' is affected to ',I8,' faces at Zmax')
         
         
!=====================================================================
! Conditions definis par zone au format GMSH
!=====================================================================
      CASE (3)
          write(*,*)'COND-Info Conditions defined using GMSH'
          DO iz=1,iarg
              nbf=0
              read(33,*)izone,ityp  !numero de zone, type de condition aux limites
              SELECT CASE (ityp)
                  CASE (0)
                      icl= 0
                  CASE (1)
                      icl=-1
                  CASE (2)
                      nzon=nzon+1
                      icl=-100-nzon
                      read(33,*)(val(i),i=1,nvar)
                      phy_state(nzon)%vprim%v=val
                      CALL Prim2Bal(phy_state(nzon))
                  CASE (3)
                      read(33,*)fctnum
                      icl=-(10000+fctnum)
                  CASE (4)
                      nzon=nzon+1
                      icl=-200-nzon
                      read(33,*)(val(i),i=1,nvar)
                      phy_state(nzon)%vbal%v=val
                      CALL bal2prim(phy_state(nzon))
                  CASE (999)
                      icl=-999
                  CASE DEFAULT
                     call print_err('READ_COND','unknown kind of boundary condition')
                     STOP
              END SELECT
              
              nbf=0
              DO i=1,nb_bloc
                do k=1,6
                  if(lst_bloc(i)%cl(k).eq.-izone) then
                      lst_bloc(i)%cl(k)=icl
                      nbf=nbf+1
                  endif
                enddo
              END DO

              write( *,1021)izone,icl,nbf
1021 format(' COND-Info Zone',i2,' affectation of the condition',i8,' to ',I8,' faces')
          END DO
      CASE DEFAULT
         call print_err('READ_COND','unknown code')

  END SELECT       
!===========================   FIN DE LA ROUTINE    ====================
END SUBROUTINE read_cond
!DOCFIN
