Télécharger elemap.eso

Retour à la liste

Numérotation des lignes :

elemap
  1. C ELEMAP SOURCE GOUNAND 25/08/04 21:15:04 12340
  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. mpapp=mappu
  57. segact mpapp
  58. if((mpapp.itypel).ne.1) call change(mpapp, 1)
  59. C
  60. segini icpr
  61. do i=1,nbpts
  62. icpr(i) = 0
  63. enddo
  64. C Identification des noeuds de mpapp
  65. do j=1,mpapp.num(/2)
  66. icpr(mpapp.num(1, j)) = 1
  67. enddo
  68. if (mpapp.ne.mappu) segsup mpapp
  69. C
  70. nbels = 0
  71. segini icps
  72. C nso est le nombre de sous-objets de mextr
  73. nso = mextr.lisous(/1)
  74. C nso est egal a nso si mextr a des sous-objets, 1 sinon
  75. nsm = max(1, nso)
  76. segini imail
  77. C nnvid permet de compter le nombre de sous-objets non-vides extraits
  78. nnvid = 0
  79. nltot = 0
  80.  
  81.  
  82. C --------------------------------------------------------------------
  83. C On fait le travail
  84. C --------------------------------------------------------------------
  85.  
  86. do iso=1,nsm
  87. C Boucle sur le nombre de sous-objets
  88.  
  89. if(nso.ne.0) then
  90. msouz = mextr.lisous(iso)
  91. segact msouz
  92. else
  93. msouz = mextr
  94. endif
  95. C Nombre de noeuds par element et nombre d'elements du sous-objet
  96. nbnn = msouz.num(/1)
  97. nbels = msouz.num(/2)
  98. segadj icps
  99. C On commence par compter le nombre d'elements a extraire => icount
  100. icount = 0
  101. macro, (strictement, largement)
  102. case, iopt
  103. when, strictement
  104. do iel=1,nbels
  105. C Boucle sur les elements du sous-objet
  106. contenu = .true.
  107. ino = 1
  108. do while (ino.le.nbnn.and.contenu)
  109. C Boucle sur les noeuds de l'element
  110. C On s'arrete avant la fin si on trouve un noeud pas dans ipt2
  111. contenu = icpr(msouz.num(ino, iel)).eq.1
  112. ino = ino + 1
  113. enddo
  114. if(contenu) then
  115. C Si on arrive ici avec contenu = .true. alors l'element est a extraire
  116. icount = icount + 1
  117. icps(icount) = iel
  118. endif
  119. enddo
  120. when, largement
  121. do iel=1,nbels
  122. contenu = .false.
  123. ino = 1
  124. do while (ino.le.nbnn.and..not.contenu)
  125. C Boucle sur les noeuds de l'element
  126. C On s'arrete des qu'on trouve un noeud dans ipt2
  127. contenu = icpr(msouz.num(ino, iel)).eq.1
  128. ino = ino + 1
  129. enddo
  130. if(contenu) then
  131. C Si on arrive ici avec contenu = .true. alors l'element est a extraire
  132. icount = icount + 1
  133. icps(icount) = iel
  134. endif
  135. enddo
  136. endcase
  137. C On extrait ensuite les elements si on en a trouve a extraire
  138. if(icount.gt.0) then
  139. C on initialise le maillage resultant de la sous-zone
  140. nnvid = nnvid + 1
  141. nbsous = 0
  142. nbref = 0
  143. nbelem = icount
  144. segini mrsou
  145. mrsou.itypel = msouz.itypel
  146. C Puis on extrait les elements
  147. do iel=1,nbelem
  148. do ino=1,nbnn
  149. mrsou.num(ino, iel) = msouz.num(ino, icps(iel))
  150. enddo
  151. mrsou.icolor(iel) = msouz.icolor(icps(iel))
  152. enddo
  153. imail(nnvid) = mrsou
  154. nltot = nltot + icount
  155. endif
  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