Télécharger part6.eso

Retour à la liste

Numérotation des lignes :

  1. C PART6 SOURCE JC220346 16/11/18 21:19:46 9187
  2.  
  3. subroutine part6(NBZON,mmodel,itab,ireter,kescl)
  4. C_______________________________________________________________________
  5. C
  6. C PARTITIONNEMENT DE MMODEL
  7. C -------------------------
  8. C HISTORIQUE :
  9. C CB215821 : Parallelisation du partitionnement des MMODEL
  10. C Reprise de la methode employee dans part5.eso
  11. C qui traite le partitionnement de MELEME
  12. C JCARDO : Ajout du parametre kescl
  13. C_______________________________________________________________________
  14.  
  15.  
  16. implicit integer (i-n)
  17. implicit real*8(a-h,o-z)
  18.  
  19. -INC CCOPTIO
  20. -INC SMELEME
  21. -INC SMMODEL
  22. -INC SMTABLE
  23. -INC CCASSIS
  24. -INC CCPRECO
  25.  
  26. SEGMENT SSREF
  27. C NBZON : Nombre de ZONES demandees
  28. C NBSM : Nombre de IMODEL du MMODEL
  29. C ISREF : Tableau indiquant si la sous-zone contient ou non des elements
  30. C IMELE : Tableau avec les references des MELEME SIMPLES de chaque ZONE
  31. C IMODE : Tableau avec les references des IMODEL ELEMENTAIRES de chaque ZONE
  32. C NBELE : Tableau indiquant le nombre d'elements reellement present dans le MELEME SIMPLE en COURS
  33. C MTA : Tableau avec les references des MMODEL de chaque ZONE
  34. C IPOS : Tableau indiquant le nombre de IMODEL contenus dans les MMODEL de chaque ZONE
  35. INTEGER ISREF(NBZON,NBSM)
  36. INTEGER IMELE(NBZON,NBSM)
  37. INTEGER IMODE(NBZON,NBSM)
  38. INTEGER NBELE(NBZON)
  39. INTEGER MTA (NBZON)
  40. INTEGER IPOS (NBZON)
  41. ENDSEGMENT
  42.  
  43. C Declaration du COMMON pour le travail en parallele
  44. COMMON/part6c/NBTHR,SSREF,JA,IPT2,NBNN,NBELEM,ISOUS,NBZONE
  45.  
  46. EXTERNAL part6i
  47.  
  48. character*1 cha
  49. logical bool
  50.  
  51. ireter=0
  52. itab =0
  53. bool = .FALSE.
  54. cha ='O'
  55.  
  56. C Verification que le MMODEL n'est pas deja dans le CCPRECO
  57. DO IIMOD1 = 1, NMOPAR
  58. IF (PARMOD(IIMOD1) .EQ. 0) GOTO 1
  59. IF (MMODEL .EQ. PARMOD(IIMOD1)) THEN
  60. itab = PESCLA(IIMOD1)
  61. C PRINT *,'PART6, CCPRECO :', IIMOD1
  62. C Mise a jour du preconditionnement dans CCPRECO : Deplacement en position 1
  63. IF (IIMOD1 .EQ. 1) RETURN
  64. DO IIMOD2 = IIMOD1,2,-1
  65. PARMOD(IIMOD2) = PARMOD(IIMOD2 - 1)
  66. PESCLA(IIMOD2) = PESCLA(IIMOD2 - 1)
  67. ENDDO
  68. PARMOD(1) = MMODEL
  69. PESCLA(1) = itab
  70. RETURN
  71. ENDIF
  72. ENDDO
  73.  
  74. 1 CONTINUE
  75. SEGACT,MMODEL
  76. n1=kmodel(/1)
  77. N1INI = n1
  78. NBSM=MAX(1,n1)
  79.  
  80. NBZMAX = 0
  81.  
  82. C Initialisation du SEGMENT de travail
  83. SEGINI,SSREF
  84.  
  85.  
  86. C Creation de la TABLE resultat
  87. m=NBZON
  88. IF (KESCL.GT.0) M=M+2
  89. NBZONE=NBZON
  90. segini,mtable
  91. itab=mtable
  92.  
  93.  
  94. C Mise a jour du preconditionnement dans CCPRECO
  95. C Glissement des valeurs vers le bas
  96. DO IIMOD = NMOPAR,2,-1
  97. PARMOD(IIMOD) = PARMOD(IIMOD - 1)
  98. PESCLA(IIMOD) = PESCLA(IIMOD - 1)
  99. ENDDO
  100. PARMOD(1) = MMODEL
  101. PESCLA(1) = itab
  102.  
  103. IF (KESCL.GT.0) THEN
  104. CALL ECCTAB(mtable,'MOT',0,0.D0,'SOUSTYPE',bool,0
  105. & ,'MOT',0,0.D0,'ESCLAVE' ,bool,0)
  106. CALL ECCTAB(mtable,'MOT',0,0.D0,'CREATEUR',bool,0
  107. & ,'MOT',0,0.D0,'PART' ,bool,0)
  108. ENDIF
  109.  
  110.  
  111.  
  112. IF (NBZON .EQ. 1) THEN
  113. C Cas trivial de travail
  114. SEGINI,mmode1=MMODEL
  115. call ecctab(mtable,'ENTIER',1,0.D0,cha,bool, 0
  116. & ,'MMODEL',0 ,0.D0,cha,bool,mmode1)
  117. SEGDES,MMODEL,MMODE1,MTABLE
  118. SEGSUP,SSREF
  119. RETURN
  120. ENDIF
  121.  
  122.  
  123. IF (NBTHRS .GT. 1) THEN
  124. ITHRD = 1
  125. CALL THREADII
  126. ELSE
  127. ITHRD = 0
  128. ENDIF
  129.  
  130. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  131. C Initialisations et Dimensionnement des MELEME, MMODEL, IMODEL
  132. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  133. JA = 0
  134. DO 10 ISOUS=1,N1INI
  135. imodel= kmodel(isous)
  136. SEGACT,imodel
  137.  
  138. C Recuperation du MAILLAGE ELEMENTAIRE du MODELE ELEMENTAIRE
  139. IPT2 = imamod
  140. SEGACT,IPT2
  141. NBEL0 =IPT2.NUM(/2)
  142. NF = MIN(NBEL0,NBZON)
  143.  
  144. NBZMAX= MAX(NBZMAX,NF)
  145.  
  146. C Dimentionnement des MELEME SIMPLES a 1 element pres
  147. if(MOD(NBEL0,NBZON) .EQ. 0)then
  148. nbelem= NBEL0 / NBZON
  149. else
  150. nbelem=(NBEL0 / NBZON) + 1
  151. endif
  152.  
  153. nbnn = IPT2.NUM(/1)
  154. nbsous = 0
  155. nbref = 0
  156.  
  157. DO 20 II=1,NF
  158. SEGINI,IPT5
  159. IPT5.ITYPEL = IPT2.ITYPEL
  160.  
  161. SEGINI,IMODE1=IMODEL
  162. C write(ioimp,*) conmod(/1), imode1.conmod(/1)
  163. C write(ioimp,*)' imode1 ' , imode1
  164. C write(ioimp,*) ' conmod imode1.conmod ',conmod,imode1.conmod
  165. IMODE1.IMAMOD=IPT5
  166. if (IMODE1.INFMOD(/1) .GE. 2) IMODE1.INFMOD(2) = 0
  167.  
  168.  
  169. C Sauvegarde des Informations dans le SEGMENT
  170. IZ = MOD(II + JA - 1,NBZON) + 1
  171. IMELE(IZ,ISOUS) = IPT5
  172. IMODE(IZ,ISOUS) = IMODE1
  173. ISREF(IZ,ISOUS) = 1
  174. IPOS (IZ) = IPOS(IZ)+1
  175.  
  176. NBZMAX = MAX(NBZMAX,IZ)
  177.  
  178. IF( MTA(IZ) .EQ. 0 ) THEN
  179. SEGINI,mmode1
  180. call ecctab(mtable,'ENTIER',IZ,0.D0,cha,bool, 0
  181. & ,'MMODEL',0 ,0.D0,cha,bool,mmode1)
  182. MTA(IZ) = mmode1
  183. ELSE
  184. mmode1 = MTA(IZ)
  185. ENDIF
  186.  
  187. mmode1.kmodel(IPOS(IZ))=IMODE1
  188. 20 CONTINUE
  189. JA = JA + NF
  190.  
  191. 10 CONTINUE
  192.  
  193.  
  194. C Ajustement des MMODEL de chacune des ZONES
  195. DO IZ=1,NBZON
  196. N1 = IPOS(IZ)
  197. IF(N1 .GT. 0) THEN
  198. mmode1 = MTA(IZ)
  199. IF(N1 .LT. N1INI) THEN
  200. SEGADJ,MMODE1
  201. ENDIF
  202.  
  203. SEGDES,MMODE1
  204. ENDIF
  205. ENDDO
  206.  
  207. C Ajustement de la TABLE
  208. MM=NBZMAX
  209. IF (KESCL.GT.0) MM=MM+2
  210. IF (MM .LT. M) THEN
  211. M = MM
  212. SEGADJ,mtable
  213. MLOTAB = M
  214. ENDIF
  215.  
  216. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  217. C Debut du travail de repartition
  218. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  219. JA = 0
  220. DO 30 ISOUS=1,N1INI
  221. C Chargement des infos sans SEGACT car deja fait au-dessus
  222. imodel= kmodel(isous)
  223. IPT2 = imamod
  224. NBELEM=IPT2.NUM(/2)
  225. NBNN =IPT2.NUM(/1)
  226. NF = MIN(NBELEM,NBZON)
  227.  
  228. C Reinitialisation du nombre d'element de ce type
  229. DO IZ = 1,NBZMAX
  230. NBELE(IZ) = 0
  231. ENDDO
  232.  
  233. NBTHR = MIN(NBELEM,NBTHRS)
  234. IF ((NBTHR .GT. 1) .AND. (ITHRD .EQ. 1)) THEN
  235. DO ith=2,NBTHR
  236. CALL THREADID(ith,part6i)
  237. ENDDO
  238. CALL part6i(1)
  239.  
  240. DO ith=2,NBTHR
  241. CALL THREADIF(ith)
  242. ENDDO
  243. C En multithread il peut y avoir n'importe quoi dans OOV(1)
  244. OOV(1) = 0
  245.  
  246. ELSE
  247. CALL part6i(1)
  248. ENDIF
  249.  
  250. DO 40 IZ = 1,NBZMAX
  251. JF = NBELE(IZ)
  252. IF (JF .EQ. 0) GOTO 40
  253. IPT5 = IMELE(IZ,ISOUS)
  254. IMODE1 = IMODE(IZ,ISOUS)
  255.  
  256. C Ajustement des MELEME SIMPLE si besoin
  257. IF (JF .NE. 0) THEN
  258. NBELEM = IPT5.NUM(/2)
  259.  
  260. IF(JF .EQ. (NBELEM - 1))THEN
  261. NBNN = IPT5.NUM(/1)
  262. NBELEM = JF
  263. NBREF = 0
  264. NBSOUS = 0
  265. SEGADJ,IPT5
  266. ENDIF
  267.  
  268. C Recherche du numero de FORMULATION associee aux XFEM
  269. IF (NUMMFR(nefmod) .EQ. 63) THEN
  270. CALL PARTXR(IMODEL,0,IMODE1)
  271. ENDIF
  272. ENDIF
  273. SEGDES,IMODE1,IPT5
  274. 40 CONTINUE
  275.  
  276. JA = JA + NF
  277. SEGDES,IPT2,IMODEL
  278.  
  279. 30 CONTINUE
  280. SEGDES,MMODEL,MTABLE
  281. SEGSUP,SSREF
  282.  
  283. IF (ITHRD .EQ. 1) CALL THREADIS
  284.  
  285. return
  286. end
  287.  
  288.  
  289.  
  290.  

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