lecture_elements.f90
上传用户:goto8899
上传日期:2014-01-20
资源大小:303k
文件大小:8k
源码类别:

并行计算

开发平台:

MultiPlatform

  1. subroutine lecture_elements(index_cg, nb, nz, nbcell, origine)                  
  2. use CGNSLIB               ! definition des mots-clefs
  3. use mod_origine           ! structure de donnees receptrices du maillage CGNS
  4. use mod_connectivite      ! structure generale pour la connectivite
  5. implicit none
  6. ! -- Entrees --
  7. integer     :: index_cg   ! numero d'unite du fichier CGNS
  8. integer     :: nb, nz     ! index de base et de zone du fichier CGNS
  9. integer     :: nbcell     ! nombre de cellules
  10. ! -- Sorties --
  11. type(type_origine) :: origine     ! structure receptrice de la connectivite 
  12. ! -- Variables internes --                                        
  13. integer           :: ier        ! code erreur
  14. integer           :: ideb, ifin ! indice des cellules repertoriees dans la section
  15. integer           :: itype      ! type de cellule
  16. integer           :: nbd, ip    ! entiers non utilises en sortie
  17. integer           :: nelem      ! nombre d'elements dans la section
  18. integer           :: nbtot      ! nombre total de sections
  19. integer           :: nbnodes    ! nombre de noeuds pour un type d'element donne
  20. integer, dimension(:), allocatable &
  21.                   :: typelem    ! tableau des types d'element
  22. integer, dimension(:), allocatable &
  23.                   :: typesect   ! flag de type de section i
  24.                                 !   0 : section a supprimer
  25.                                 !   1 : section LIMITE
  26.                                 !   2 : section ELEMENT
  27. integer, dimension(:,:), allocatable &
  28.                   :: elem       ! tableau de connectivite
  29. real,    dimension(:),   allocatable &
  30.                   :: v          ! tableau de valeurs intermediaires pour la lecture
  31. integer           :: i, j, isect, ilim, last
  32. character(len=32) :: nom
  33. ! -- Debut de procedure
  34. ! --- allocation  ---
  35. print*
  36. print*,"  * Lecture des connectivites :",nbcell,"elements"
  37. ! --- Lecture du nombre de sections ---
  38. ! ( les cellules sont regroupees par section selon leur type )
  39. call cg_nsections_f(index_cg, nb, nz, nbtot, ier)
  40. if (ier /= 0)   call erreur("Probleme a la lecture du nombre de sections")
  41. ! --- Lecture des types de section ---
  42. allocate( typelem(nbtot))
  43. allocate(typesect(nbtot))
  44. do i = 1, nbtot
  45.   call cg_section_read_f(index_cg, nb, nz, i, nom, typelem(i), ideb, ifin, nbd, ip, ier)
  46.   if (ier /= 0) call erreur("Probleme a la lecture de section")
  47. enddo
  48. ! --- Determination maillage 2D ou 3D ---
  49. origine%m3d = .false.    ! par defaut
  50. do i = 1, nbtot
  51.   select case(typelem(i))
  52.     case(NODE)
  53.       ! call erreur("Element NODE inattendu")
  54.     case(BAR_2)
  55.     case(TRI_3, QUAD_4)
  56.     case(TETRA_4, PYRA_5, PENTA_6, HEXA_8)
  57.       origine%m3d = .true.
  58.     case(BAR_3,TRI_6,QUAD_8,QUAD_9,TETRA_10,PYRA_14,PENTA_15,PENTA_18,HEXA_20,HEXA_27)
  59.       call erreur("Element avec centres inter-sommets non geres par CGNS_CEDRE")
  60.     case(MIXED, NGON_n)
  61.       call erreur("Type d'element interdit dans CGNS_CEDRE")
  62.     case default
  63.       call erreur("Type d'element non reconnu dans CGNSLIB")
  64.   endselect
  65. enddo
  66. ! --- Lecture du nombre de sections CELLULES et sections LIMITES ---
  67. ! ( le type depend du maillage, 3D ou non )
  68. origine%nbsect = 0
  69. origine%nblim  = 0
  70. do i = 1, nbtot
  71.   select case(typelem(i))
  72.     case(NODE)
  73.       typesect(i) = 0    ! section a supprimer (ne pas lire)
  74.     case(BAR_2)
  75.       if (origine%m3d) then
  76.         ! call erreur("Element BAR_2 inattendu dans un maillage 3D")
  77.         typesect(i) = 0  ! section a supprimer (ne pas lire)
  78.       else
  79.         origine%nblim  = origine%nblim  + 1
  80.         typesect(i)    = 1   ! section de type LIMITE
  81.       endif
  82.     case(TRI_3, QUAD_4)
  83.       if (origine%m3d) then
  84.         origine%nblim  = origine%nblim  + 1
  85.         typesect(i)    = 1   ! section de type LIMITE
  86.       else
  87.         origine%nbsect = origine%nbsect + 1
  88.         typesect(i)    = 2   ! section de type CELLULE
  89.       endif
  90.     case(TETRA_4, PYRA_5, PENTA_6, HEXA_8)
  91.       if (origine%m3d) then
  92.         origine%nbsect = origine%nbsect + 1
  93.         typesect(i)    = 2   ! section de type CELLULE
  94.       else
  95.         call erreur("Element inattendu dans un maillage 2D")
  96.       endif
  97.     case default
  98.       call erreur("Type d'element de CGNSLIB non traite par CGNS_CEDRE")
  99.   endselect
  100. enddo
  101. print*,"    .",origine%nbsect,"section(s) de cellules"
  102. print*,"    .",origine%nblim, "section(s) de faces limites"
  103. allocate(origine%section(origine%nbsect))
  104. allocate(origine%limite (origine%nblim))
  105. ! --- Boucle sur les sections (CELLULES et LIMITE) et lecture des connectivites  ---
  106. nom   = ""
  107. isect = 0     ! index de section CELLULE
  108. ilim  = 0     ! index de section LIMITE
  109. do i = 1, nbtot
  110.   if (typesect(i) /= 0) then
  111.     call cg_section_read_f(index_cg, nb, nz, i, nom, itype, ideb, ifin, nbd, ip, ier)
  112.     if (ier /= 0) call erreur("Probleme a la lecture de section")
  113.     nelem = ifin-ideb+1
  114.     !--- Calcul des nombres d'elements et allocation ---
  115.     select case(typesect(i))
  116.     case(2) ! --- section type CELLULE ---
  117.       isect = isect + 1
  118.       print*
  119.       print*,"    * section",i,"(",trim(nom),") de cellules      :",&
  120.              nelem,trim(ElementTypeName(itype))
  121.       origine%section(isect)%type = itype      ! type d'element
  122.       origine%section(isect)%elements%nombre = nelem
  123.       origine%section(isect)%nb              = nelem
  124.       origine%section(isect)%ideb            = ideb
  125.       origine%section(isect)%ifin            = ifin
  126.       allocate(origine%section(isect)%elements%liste(ideb:ifin))
  127.     case(1) ! --- section type LIMITE ---
  128.       ilim = ilim + 1
  129.       print*
  130.       print*,"    * section",i,"(",trim(nom),") de faces limites :",&
  131.              nelem,trim(ElementTypeName(itype))
  132.       origine%limite(ilim)%type = itype      ! type d'element
  133.       origine%limite(ilim)%elements%nombre = nelem
  134.       origine%limite(ilim)%nb              = nelem
  135.       origine%limite(ilim)%ideb            = ideb
  136.       origine%limite(ilim)%ifin            = ifin
  137.       allocate(origine%limite(ilim)%elements%liste(ideb:ifin))
  138.     case default
  139.       call erreur("Probleme de coherence interne CGNS_CEDRE")
  140.     endselect
  141.     ! --- Lecture du nombre de noeuds pour le type itype ---
  142.  
  143.     call cg_npe_f(itype, nbnodes, ier)
  144.     if (ier /= 0)    call erreur("Probleme a la lecture du type d'element")
  145.     if (nbnodes > maxconnect) &
  146.       call erreur("Nombre de sommets maximal (8) depasse pour ce type")
  147.     print*, "      . indices CGNS",ideb,"a",ifin,": lecture de connectivites"
  148.   
  149.     allocate(elem(nbnodes,ideb:ifin))
  150.     elem = 0
  151.     call cg_elements_read_f(index_cg, nb, nz, i, elem, ip, ier)
  152.     if (ier /= 0) &
  153.       call erreur("Probleme a la lecture de connectivite dans une section")
  154.     ! --- Retranscription des donnees dans la structure origine ---
  155.     select case(typesect(i))
  156.     case(2) ! --- section type CELLULE ---
  157.       do j = ideb, ifin
  158.         ! allocation de (nbnodes) sommets par cellules 
  159.         allocate(origine%section(isect)%elements%liste(j)%article(nbnodes)) 
  160.       enddo 
  161.       ! -- retranscription dans la structure "origine" --
  162.       do j = ideb, ifin
  163.         origine%section(isect)%elements%liste(j)%article(1:nbnodes) = elem(1:nbnodes,j)
  164.       enddo
  165.     case(1) ! --- section type LIMITE ---
  166.       do j = ideb, ifin
  167.         ! allocation de (nbnodes) sommets par cellules 
  168.         allocate(origine%limite(ilim)%elements%liste(j)%article(nbnodes)) 
  169.       enddo 
  170.       ! -- retranscription dans la structure "origine" --
  171.       do j = ideb, ifin
  172.         origine%limite(ilim)%elements%liste(j)%article(1:nbnodes) = elem(1:nbnodes,j)
  173.       enddo
  174.     case default
  175.       call erreur("Probleme de coherence interne CGNS_CEDRE")
  176.     endselect
  177.     ! --- desallocation ---
  178.     deallocate(elem)
  179.   endif ! test si section a supprimer
  180. enddo ! boucle sur section
  181. ! --- Calcul des nouveaux index de cellules pour chacun des types ---
  182. ! (on renumerote les cellules pour avoir une continuite de la numerotation)
  183. print*
  184. print*,"  * Renumerotation continue des cellules et faces limites"
  185. last = 0
  186. do i = 1, origine%nbsect
  187.   origine%section(i)%ideb = last + 1
  188.   origine%section(i)%ifin = last + origine%section(i)%nb
  189.   last = origine%section(i)%nb
  190. enddo
  191. last = 0
  192. do i = 1, origine%nblim
  193.   origine%limite(i)%ideb = last + 1
  194.   origine%limite(i)%ifin = last + origine%limite(i)%nb
  195.   last = origine%limite(i)%nb
  196. enddo
  197. ! --- desallocation ---
  198. deallocate(typelem, typesect)
  199.    
  200. !------------------------------
  201. endsubroutine lecture_elements