Télécharger elemap.eso

Retour à la liste

Numérotation des lignes :

elemap
  1. C ELEMAP SOURCE JB251061 22/01/05 21:15:02 11253
  2.  
  3. SUBROUTINE ELEMAP(mextr, mappu, iopt, mresu, nltot)
  4. C ====================================================================
  5. C Sous-programme ELEMAP :
  6. C
  7. C --------------------------
  8. C Paramètres Entrée/Sortie :
  9. C --------------------------
  10. C
  11. C E/ mextr : MAILLAGE dont on veut extraire des elements
  12. C E/ mappu : MAILLAGE sur lequel on s'appuie
  13. C E/ iopt : ENTIER valant 1 (resp. 2) si l'on veut les elements de
  14. C mextr appuyes strictement (resp. largement) sur les
  15. C noeuds de mappu
  16. C
  17. C /S mresu : MAILLAGE resultat (potentiellement vide)
  18. C /S nltot : ENTIER egal au nombre total d'elements extraits
  19. C
  20. C --------------------------------------------------------------------
  21. C Appelé par : extrel.eso
  22. C ====================================================================
  23.  
  24. IMPLICIT INTEGER(I-N)
  25. IMPLICIT REAL*8(A-H,O-Z)
  26.  
  27. C --------------------------------------------------------------------
  28. C Declarations
  29. C --------------------------------------------------------------------
  30.  
  31. C Includes
  32. -INC PPARAM
  33. -INC CCOPTIO
  34. -INC CCREEL
  35. -INC CCGEOME
  36. -INC SMELEME
  37. -INC SMCOORD
  38.  
  39. C icpr permet d'identifier les noeuds appartenants à mappu
  40. segment icpr(nbpts)
  41. C icps est une liste de numeros d'elements a extraire
  42. segment icps(nbels)
  43. C on stocke les pointeurs des differents maillages extraits dans imail
  44. segment imail(nsm)
  45. logical contenu
  46. pointeur mextr.meleme, mappu.meleme, mresu.meleme, mpapp.meleme
  47. pointeur msouz.meleme, mrsou.meleme
  48.  
  49.  
  50. C --------------------------------------------------------------------
  51. C Initialisation
  52. C --------------------------------------------------------------------
  53.  
  54. segact mcoord
  55. C
  56. segini,mpapp = mappu
  57. if((mpapp.itypel).ne.1) call change(mpapp, 1)
  58. C
  59. segini icpr
  60. do i=1,nbpts
  61. icpr(i) = 0
  62. enddo
  63. C Identification des noeuds de mpapp
  64. do j=1,mpapp.num(/2)
  65. icpr(mpapp.num(1, j)) = 1
  66. enddo
  67. C
  68. nbels = 0
  69. segini icps
  70. C nso est le nombre de sous-objets de mextr
  71. nso = mextr.lisous(/1)
  72. C nso est egal a nso si mextr a des sous-objets, 1 sinon
  73. nsm = max(1, nso)
  74. segini imail
  75. C nnvid permet de compter le nombre de sous-objets non-vides extraits
  76. nnvid = 0
  77. nltot = 0
  78.  
  79.  
  80. C --------------------------------------------------------------------
  81. C On fait le travail
  82. C --------------------------------------------------------------------
  83.  
  84. do iso=1,nsm
  85. C Boucle sur le nombre de sous-objets
  86.  
  87. if(nso.ne.0) then
  88. msouz = mextr.lisous(iso)
  89. segact msouz
  90. else
  91. msouz = mextr
  92. endif
  93. C Nombre de noeuds par element et nombre d'elements du sous-objet
  94. nbnn = msouz.num(/1)
  95. nbels = msouz.num(/2)
  96. segadj icps
  97. C On commence par compter le nombre d'elements a extraire => icount
  98. icount = 0
  99. macro, (strictement, largement)
  100. case, iopt
  101. when, strictement
  102. do iel=1,nbels
  103. C Boucle sur les elements du sous-objet
  104. contenu = .true.
  105. ino = 1
  106. do while (ino.le.nbnn.and.contenu)
  107. C Boucle sur les noeuds de l'element
  108. C On s'arrete avant la fin si on trouve un noeud pas dans ipt2
  109. contenu = icpr(msouz.num(ino, iel)).eq.1
  110. ino = ino + 1
  111. enddo
  112. if(contenu) then
  113. C Si on arrive ici avec contenu = .true. alors l'element est a extraire
  114. icount = icount + 1
  115. icps(icount) = iel
  116. endif
  117. enddo
  118. when, largement
  119. do iel=1,nbels
  120. contenu = .false.
  121. ino = 1
  122. do while (ino.le.nbnn.and..not.contenu)
  123. C Boucle sur les noeuds de l'element
  124. C On s'arrete des qu'on trouve un noeud dans ipt2
  125. contenu = icpr(msouz.num(ino, iel)).eq.1
  126. ino = ino + 1
  127. enddo
  128. if(contenu) then
  129. C Si on arrive ici avec contenu = .true. alors l'element est a extraire
  130. icount = icount + 1
  131. icps(icount) = iel
  132. endif
  133. enddo
  134. endcase
  135. C On extrait ensuite les elements si on en a trouve a extraire
  136. if(icount.gt.0) then
  137. C on initialise le maillage resultant de la sous-zone
  138. nnvid = nnvid + 1
  139. nbsous = 0
  140. nbref = 0
  141. nbelem = icount
  142. segini mrsou
  143. mrsou.itypel = msouz.itypel
  144. C Puis on extrait les elements
  145. do iel=1,nbelem
  146. do ino=1,nbnn
  147. mrsou.num(ino, iel) = msouz.num(ino, icps(iel))
  148. enddo
  149. mrsou.icolor(iel) = msouz.icolor(icps(iel))
  150. enddo
  151. imail(nnvid) = mrsou
  152. nltot = nltot + icount
  153. segdes mrsou
  154. endif
  155. if(nso.ne.0) segdes msouz
  156. enddo
  157. C On met finalement les sous-objets dans un meme MAILLAGE
  158. if(nltot.eq.0) then
  159. C On renvoie un maillage vide si aucun element trouve
  160. call melvid(ilcour, mresu)
  161. else
  162. C On ne garde que les maillages non-vides
  163. if(nnvid.eq.1) then
  164. mresu = imail(1)
  165. else
  166. nbsous = nnvid
  167. nbref = 0
  168. nbnn = 0
  169. nbelem = 0
  170. segini mresu
  171. do iso=1,nnvid
  172. mresu.lisous(iso) = imail(iso)
  173. enddo
  174. endif
  175. endif
  176. segsup icpr, icps, imail
  177.  
  178. END
  179.  
  180.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales