read_obj.f90

### TABLE OF CONTENTS

- 1. UTI/PRE/read_obj

## UTI/PRE/read_obj [ Modules ]

[ Top ] [ Modules ]

NOM

     read_obj(isol,sol,file)

DESCRIPTION

      Lecture d un fichier de description de maillage au format OBJ.
      La connectivite entre les elements du maillage est stockee dans conn_edge (2D) et conn_face (3D)
      Les coordonnéees des noeuds du maillage sont stockees dans x,y et z
      Sur le format OBJ ==> https://fr.wikipedia.org/wiki/Objet_3D_%28format_de_fichier%29

      Reading a mesh description file in OBJ format.
      Connectivity between mesh elements is stored in conn_edge (2D) and conn_face (3D).
      Mesh node coordinates are stored in x,y and z
      In OBJ format ==> https://fr.wikipedia.org/wiki/Objet_3D_%28format_de_fichier%29

        ENTREES / INPUT
        isol   : numero du solide / solid number
        sol    : solide / solid
        file   : fichier de definition du solide au format OBJ / file defining the solid in OBJ format

        SORTIES / OUTPUT
        sol    : solide / solid

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 geo
      IMPLICIT NONE
    !.2-----  Declaration
      integer, intent(in)         :: isol !! numero du solide / Solid number
      type(solide), intent(inout) :: sol !! Solide / Solid
      CHARACTER*20, intent(in)    :: file !! Nom du fichier definissant le solide / Name of the file defining the solid

      CHARACTER(len=2)            :: c
      integer                     :: i,j
      integer                     :: i1,i2,i3
      real(kind=kind(0.d0))       :: x,y,z
    !=========================== DEBUT DU CODE EXECUTABLE ==================

      write(*,*) 'OBST-INFO == Reading the mesh defining the obstacle ',isol,'file ', file

      ! Initialisations
      sol%nb_vert=0
      sol%nb_face=0
      sol%xmin_s = 1.d20
      sol%xmax_s =-1.d20
      sol%ymin_s = 1.d20
      sol%ymax_s =-1.d20
      sol%zmin_s = 1.d20
      sol%zmax_s =-1.d20

      i=0
      j=0

      ! Lecture du fichier OBJ
      OPEN(UNIT=10,FILE=file,STATUS='old')
      DO
          read(10,'(A2)',end=12)  c
          SELECT CASE (c)
              CASE('v') ! Vertex
                  sol%nb_vert = sol%nb_vert + 1 ! Nombre de vertex
              CASE('f','l') ! Face
                  sol%nb_face = sol%nb_face + 1 ! Nombre de faces
              CASE DEFAULT

          END SELECT
      END DO

      12 continue

      ! Allocation des tableaux de coordonnees et de connectivite
      allocate(sol%list_facette(sol%nb_face))
      allocate(sol%list_vertex(sol%nb_vert))

      rewind(10)

      DO ! Lecture du fichier OBJ
          read(10,'(A2)', ADVANCE='NO',end=11)  c ! On lit les deux premiers caracteres de chaque ligne sans retour chariot

          SELECT CASE (c)

              ! Lecture de la table de connectivite

              CASE('v') ! Vertex
                  i=i+1
                  read(10,*) x,y,z ! On lit 3 flottants, il s agit des coordonnees de chaque vertex
                  sol%list_vertex(i)%x=x
                  sol%list_vertex(i)%y=y
                  sol%list_vertex(i)%z=z
                  IF (x.lt.sol%xmin_s)sol%xmin_s=x
                  IF (x.gt.sol%xmax_s)sol%xmax_s=x
                  IF (y.lt.sol%ymin_s)sol%ymin_s=y
                  IF (y.gt.sol%ymax_s)sol%ymax_s=y
                  IF (z.lt.sol%zmin_s)sol%zmin_s=z
                  IF (z.gt.sol%zmax_s)sol%zmax_s=z

              CASE('f') ! Face
                  j=j+1
                  read(10,*) i1,i2,i3 ! On lit 3 entiers, il s agit des numeros des vertex qui composent la face
                  sol%list_facette(j)%vertex(1)=i1
                  sol%list_facette(j)%vertex(2)=i2
                  sol%list_facette(j)%vertex(3)=i3
              CASE('l') ! Line/Edge
                  j=j+1
                  read(10,*) i1,i2 ! On lit 2 entiers, il s agit des numeros des vertex qui composent le segment
                  sol%list_facette(j)%vertex(1)=i1
                  sol%list_facette(j)%vertex(2)=i2
                  sol%list_facette(j)%vertex(3)=i2

              CASE DEFAULT
                  read(10,*) ! On saute toute autre ligne

          END SELECT

      END DO

      11 continue

      write(*,*) 'OBST-INFO == End reading the mesh defining the obstacle ', file,sol%nb_vert,sol%nb_face
      ! Fin de lecture du fichier OBJ
      CLOSE(10)

      ! Creation de la bounding box
      sol%xmin_s = sol%xmin_s-0.02d0*dabs(sol%xmin_s)
      sol%xmax_s = sol%xmax_s+0.02d0*dabs(sol%xmax_s)
      sol%ymin_s = sol%ymin_s-0.02d0*dabs(sol%ymin_s)
      sol%ymax_s = sol%ymax_s+0.02d0*dabs(sol%ymax_s)
      sol%zmin_s = sol%zmin_s-0.02d0*dabs(sol%zmin_s)
      sol%zmax_s = sol%zmax_s+0.02d0*dabs(sol%zmax_s)

      sol%id = isol

    !===========================   FIN DE LA ROUTINE    ====================
    END SUBROUTINE read_obj