Télécharger part2.eso

Retour à la liste

Numérotation des lignes :

part2
  1. C PART2 SOURCE CB215821 26/08/24 21:17:36 12622
  2. C partition de domaine
  3. C
  4. C methode utilisee: Monte Carlo avec fonction de cout
  5. C dérivé de numop2
  6. C
  7. SUBROUTINE PART2(MELEME,IPOS,NB,ICPR,IADJ,JADJC)
  8. IMPLICIT INTEGER(I-N)
  9. -INC SMELEME
  10. -INC SMCOORD
  11.  
  12. -INC PPARAM
  13. -INC CCOPTIO
  14. -INC CCASSIS
  15.  
  16.  
  17. SEGMENT JMEM(NODES+1),JMEMN(NODES+1)
  18. C JMEM et JMEMN contiennent le nombre d'element auquel appartient un noeud
  19.  
  20. SEGMENT JNT(NODES)
  21. C JNT contient la nouvelle numerotation
  22.  
  23. SEGMENT ICPR(nbpts)
  24. C ICPR au debut contient l'ancienne numerotation ,
  25. C a la fin la nouvelle.
  26.  
  27. SEGMENT IADJ(NODES+1)
  28. SEGMENT JADJC(0)
  29. C IADJ(i) pointe sur JADJC qui contient les voisins de i entre
  30. C IADJ(i) et IADJ(i+1)-1
  31.  
  32. SEGMENT BOOLEEN
  33. LOGICAL BOOL(NODES)
  34. ENDSEGMENT
  35. C BOOL(i) = true si le noeud i a ete deja mentionne dans la liste
  36. C des voisins JADJC.
  37.  
  38. SEGMENT IMEMOIR(NBV),LMEMOIR(NBV)
  39. C contient les elements appartenant a chaque noeud,sous forme de liste.
  40.  
  41. INTEGER ELEM
  42. C nom d'un element
  43.  
  44. INTEGER N
  45.  
  46.  
  47. SEGMENT MASQUE
  48. LOGICAL MASQ(NODES)
  49. ENDSEGMENT
  50. C MASQ(X)=.TRUE. si le noeud X n'a pas ete renumerote;
  51. C .FALSE. si il l'a ete.
  52.  
  53. INTEGER DIM,DIMSEP
  54. C DIM= nombre de noeuds renumerotes.
  55.  
  56. INTEGER PIVOT
  57. C PIVOT est le noeud utile a la division du domaine.
  58.  
  59. SEGMENT IPOS(NODES*3)
  60. C est le vecteur contenant le numero de zone et le poid de la zone a NODES
  61. C puis de NODES+1 a 2* NODES, cf la subroutine SEPAR
  62. C
  63. C segments utilisés dans sepa2
  64. C
  65. SEGMENT NRELONG(NODES*nbthr)
  66. C NRELONG contient pour chaque noeud sa profondeur.
  67.  
  68. SEGMENT NOELON(NODES*nbthr)
  69. SEGMENT NOEL2(NODES)
  70. SEGMENT LONDIM(NODES*nbthr)
  71. C NOELON contient les noeuds de profondeur LONG.
  72. C DIMLON= dimension de NOELON.
  73. c
  74. C**********************************
  75.  
  76. C debut du program
  77.  
  78. C**********************************
  79.  
  80.  
  81.  
  82. C initialisation
  83. C*******************************
  84. IUN=1
  85. IENORM=2000000000
  86. C norme d'erreur
  87. SEGINI ICPR
  88. NODES=ICPR(/1)
  89. SEGACT MELEME
  90. C icpr: numero des noeuds.
  91.  
  92. IPT1=MELEME
  93. IKOU=0
  94. NBV=0
  95. NB1=0
  96. NB2=0
  97.  
  98. DO 100 IO=1,MAX(1,LISOUS(/1))
  99. IF (LISOUS(/1).GT.0) THEN
  100. IPT1=LISOUS(IO)
  101. SEGACT IPT1
  102. ENDIF
  103. C on cree la numerotation des noeuds.
  104. C 'nb noeuds/element'=IPT1.NUM(/1)
  105. C 'nb element'=IPT1.NUM(/2)
  106. IF(IPT1.ITYPEL.EQ.22) THEN
  107. NB1=NB1+IPT1.NUM(/2)
  108. NB2=MAX(NB2,IPT1.NUM(/1))
  109. C NB1= nbre d'éléments de type 22.
  110. C NB2=nbre de noeuds/élément maximum parmi
  111. C les éléments de type 22.
  112. ENDIF
  113. DO 601 J=1,IPT1.NUM(/2)
  114. DO 150 I=1,IPT1.NUM(/1)
  115. IJ=IPT1.NUM(I,J)
  116. C IJ est le Ième noeud du Jème élément.
  117. IF (ICPR(IJ).EQ.0) THEN
  118. C s'il est déjà numéroté, on ne fait rien.
  119. IKOU=IKOU+1
  120. ICPR(IJ)=IKOU
  121. ENDIF
  122. 150 CONTINUE
  123. 601 CONTINUE
  124. 100 CONTINUE
  125.  
  126. NODES=IKOU
  127.  
  128. C***** initalisation des segments*********
  129.  
  130. SEGINI IADJ,JADJC,JMEM,JMEMN
  131. SEGINI BOOLEEN,JNT
  132.  
  133. DO 20 I=1,NODES+1
  134. IADJ(I)=0
  135. JMEM(I)=0
  136. JMEMN(I)=0
  137. 20 CONTINUE
  138.  
  139. C******************************************
  140.  
  141. IPT1=MELEME
  142. NGRAND=0
  143. IADJ(1)=1
  144. INC=0
  145. DO 200 IO=1,MAX(1,LISOUS(/1))
  146.  
  147. IF (LISOUS(/1).NE.0) THEN
  148. IPT1=LISOUS(IO)
  149. ENDIF
  150.  
  151. DO 210 J=1,IPT1.NUM(/2)
  152.  
  153. DO 230 I=1,IPT1.NUM(/1)
  154. IJ=ICPR(IPT1.NUM(I,J))+1
  155. JMEM(IJ)=JMEM(IJ)+1
  156. C JMEM(I+1): nb elements auquel le noeud I appartient
  157. 230 CONTINUE
  158. 210 CONTINUE
  159. NGRAND=MAX(NGRAND,IPT1.NUM(/2))
  160.  
  161. 200 CONTINUE
  162.  
  163. NGRAND=NGRAND+1
  164.  
  165. JMEM(1)=1
  166. DO 30 I=1,NODES
  167. JMEM(I+1)=JMEM(I)+JMEM(I+1)
  168. C JMEM(I+1)=indice de depart des elements
  169. C auxquels le noeud I appartient.
  170. 30 CONTINUE
  171. NBV=JMEM(NODES+1)
  172. C NBV= dimension de IMEMOIR.
  173. SEGINI IMEMOIR,LMEMOIR
  174.  
  175.  
  176.  
  177. IPT1=MELEME
  178.  
  179. DO 300 IO=1,MAX(1,LISOUS(/1))
  180. IF (LISOUS(/1).NE.0) THEN
  181. IPT1=LISOUS(IO)
  182. ENDIF
  183. DO 602 J=1,IPT1.NUM(/2)
  184. DO 350 I=1,IPT1.NUM(/1)
  185. IJ=ICPR(IPT1.NUM(I,J))
  186. JMEMN(IJ+1)=JMEMN(IJ+1)+1
  187. IMEMOIR(JMEM(IJ)+JMEMN(IJ+1)-1)=J
  188. LMEMOIR(JMEM(IJ)+JMEMN(IJ+1)-1)=IO
  189. C on range dans IMEMOIR tous les elements des sous-objets
  190. C IO auxquels appartient le noeud ICPR(IPT1.NUM(I,J)).
  191. C On connait pour chaque element, le sous-objet auquel
  192. C il appartient.
  193. 350 CONTINUE
  194. 602 CONTINUE
  195. 300 CONTINUE
  196.  
  197. DO 410 J=1,NODES
  198. BOOL(J)=.FALSE.
  199. 410 CONTINUE
  200. DO 400 I=1,NODES
  201. IADJ(I+1)=IADJ(I)
  202. DO 420 J=JMEM(I),JMEM(I+1)-1
  203. ELEM=IMEMOIR(J)
  204. C ELEM=element auquel appartient le noeud I.
  205.  
  206. IPT1=MELEME
  207. IF (LISOUS(/1).NE.0) IPT1=LISOUS(LMEMOIR(J))
  208. DO 430 K=1,IPT1.NUM(/1)
  209. C k representatif du nb de noeuds par elements.
  210. IK=ICPR(IPT1.NUM(K,ELEM))
  211. IF ((I.NE.IK).AND.
  212. & (.NOT.(BOOL(IK)))) THEN
  213. C si i n'est pas egal a un des nouveaux numeros des noeuds
  214. C de l'element ELEM et si il n'appartient pas deja a l'ens des
  215. C voisins du noeud i(jadjc(i)),alors on le rajoute.
  216. C JADJC(IADJ(I+1))=IK
  217. JADJC(**)=IK
  218. IADJ(I+1)=IADJ(I+1)+1
  219. BOOL(IK)=.TRUE.
  220. ENDIF
  221. 430 CONTINUE
  222. 420 CONTINUE
  223. * remise a faux de bool
  224. DO 412 J=IADJ(I),IADJ(I+1)-1
  225. IK=JADJC(J)
  226. BOOL(IK)=.FALSE.
  227. 412 CONTINUE
  228. 400 CONTINUE
  229.  
  230. SEGSUP JMEM,JMEMN,IMEMOIR,LMEMOIR,BOOLEEN
  231.  
  232.  
  233.  
  234. C**************************************************************************
  235.  
  236.  
  237. C affectation
  238. C************************
  239.  
  240.  
  241. SEGINI IPOS,MASQUE
  242. IPOSMAX=0
  243.  
  244. DO 50 I=1,NODES
  245. MASQ(I)=.TRUE.
  246. IPOS(I)=0
  247. IPOS(NODES+I)=0
  248. IPOS(2*NODES+I)=0
  249. 50 CONTINUE
  250. C initialement, les noeuds ne sont pas masques,ont donc
  251. C une position nulle.
  252.  
  253. DIM=0
  254. C le nombre de noeuds renumerotes DIM est initialement egal a zero.
  255.  
  256.  
  257. C ****************************************
  258. C boucle principale
  259. NS=NODES
  260.  
  261. nbthr=max(1,nbthrs)
  262. nbthr=min(64,nbthr)
  263. if (nbthr.gt.1) call threadii
  264. SEGINI NRELONG,NOELON,noel2,londim
  265. ** write (6,*) ' avant appel sepa2 '
  266. DO 500 I=1,NODES
  267. 550 IF (ipos(i+2*nodes).eq.nb) masq(i)=.false.
  268. ** write (6,*) ' part2 i ipos nb ',i,ipos(i+2*nodes),nb
  269. IF(.NOT.MASQ(I)) GOTO 500
  270. C si le noeud est masque alors ne rien faire: il est deja
  271. C renumerote. On passe au noeud suivant.
  272.  
  273. PIVOT=I
  274. CALL SEPA2(IADJ,JADJC,PIVOT,MASQUE,DIMSEP,NS,
  275. > IPOS,NODES,IPOSMAX,nrelong,noelon,noel2,
  276. > londim,nbthr,IUN)
  277. C separe le domaine d'etude en 2 parties.
  278. C on decrit le domaine d'etude a partir du pivot et on cherche la
  279. C longueur maximale en decrivant les voisins de pivot, et leurs
  280. C voisins... jusqu'a rencontrer un voisin masque. On cree alors
  281. C une nouvelle separation.
  282. C les noeuds masques delimitent la separation du domaine.
  283. do ii=1,nodes
  284. IF (ipos(ii+2*nodes).eq.nb) masq(ii)=.false.
  285. enddo
  286.  
  287. DIM=DIM+DIMSEP
  288. NS=NS-DIMSEP
  289. C la dimension de noeuds renumerotes est augmente de DIMSEP.
  290. C Celle de noeuds a renumeroter est diminue de DIMSEP.
  291.  
  292. ***** IF (DIM.GE.NODES) GOTO 600
  293. C si tous les noeuds ont ete renumerotes, on arrete.
  294.  
  295. GOTO 550
  296.  
  297. 500 CONTINUE
  298. ** write (6,*) ' apres appel sepa2 '
  299.  
  300. SEGSUP NRELONG,NOELON,noel2,londim
  301. if (nbthr.gt.1) call threadis
  302.  
  303.  
  304. 600 SEGSUP MASQUE
  305. *
  306. * CALL SORTI2(IPOS,JNT,NODES)
  307. ** write (6,*) ' apres sorti2 '
  308.  
  309. SEGSUP JNT
  310.  
  311.  
  312. RETURN
  313. END
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  

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