Télécharger genera.eso

Retour à la liste

Numérotation des lignes :

genera
  1. C GENERA SOURCE SP204843 24/03/15 21:15:04 11871
  2. C OPTION GENERATRICE
  3. C
  4. SUBROUTINE GENERA
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. DIMENSION XCO(4)
  8.  
  9. -INC PPARAM
  10. -INC CCOPTIO
  11. -INC CCGEOME
  12. -INC SMCOORD
  13. -INC SMELEME
  14. logical ltelq
  15. SEGMENT ICPR(2,NBELEC)
  16. SEGMENT ICPP(nbpts)
  17. COMMON/CTOURN/XPT1,YPT1,ZPT1,XV1,YV1,ZV1,XV2,YV2,ZV2,XVEC,YVEC,
  18. # ZVEC,ANGLE,ICLE,XP1,YP1,ZP1
  19.  
  20. IF (KSURF(ILCOUR).EQ.0) CALL ERREUR(16)
  21. IF (IERR.NE.0) RETURN
  22. CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
  23. IF (IERR.NE.0) RETURN
  24. CALL EXTRLI(IPT1,3,IRET,-1)
  25. IF (IERR.NE.0) RETURN
  26.  
  27. IFUSE=0
  28. IF (IPT1.NE.IRET) IFUSE=IPT1
  29. IPT1=IRET
  30. CALL LIROBJ('MAILLAGE',IPT8,1,IRETOU)
  31. IF (IERR.NE.0) RETURN
  32.  
  33. SEGACT IPT8
  34. IF (IPT8.ITYPEL.NE.KDEGRE(ILCOUR)) CALL ERREUR(16)
  35. IF (IERR.NE.0) RETURN
  36.  
  37. NCOUCH=IPT8.NUM(/2)
  38. SEGACT IPT1
  39. SEGACT MCOORD*mod
  40. NBNN =IPT1.NUM(/1)
  41. NBELEM=IPT1.NUM(/2)
  42. IBOUCL=0
  43. IF (IPT1.NUM(1,1).EQ.IPT1.NUM(NBNN,NBELEM)) IBOUCL=1
  44.  
  45. 20 CONTINUE
  46. NX=NCOUCH-1
  47. IF (IIMPI.EQ.1) WRITE (IOIMP,1000) NCOUCH
  48. 1000 FORMAT(/,' COUCHES ',I6)
  49. NBNN =4
  50. NBELEM=IPT1.NUM(/2)*NCOUCH
  51. NBSOUS=0
  52. NBREF =4
  53. SEGINI,MELEME
  54. ITYPEL=8
  55. INCR =IPT1.ITYPEL-1
  56. IL =1
  57. NBELEC=IPT1.NUM(/2)
  58. SEGINI,ICPR
  59.  
  60. C ON FAIT D'ABORD L' EXTREMITEE
  61. SEGINI,ICPP
  62. DO 52 I=1,ICPP(/1)
  63. ICPP(I)=0
  64. 52 CONTINUE
  65.  
  66. ICLE =1
  67. IPBAS =IPT8.NUM(1,1)
  68. IPHAU =IPT8.NUM(IPT8.NUM(/1),NCOUCH)
  69. IREFB =(IDIM+1)*(IPBAS-1)
  70. IREFH =(IDIM+1)*(IPHAU-1)
  71.  
  72. DO 200 I=1,IDIM+1
  73. XCO(I)=XCOOR(IREFH+I)-XCOOR(IREFB+I)
  74. 200 CONTINUE
  75.  
  76. CALL ADDITE(XCO,IPT1,IPT3,ICPP,0)
  77. IF (IERR.NE.0) RETURN
  78. SEGSUP ICPP
  79. SEGACT MCOORD*mod
  80. SEGACT IPT3
  81. CALL INVERS(IPT3,IPT4)
  82. SEGDES IPT4
  83. LISREF(3)=IPT4
  84. C ON REMPLIT LE TABLEAU ICPR DES PTS EFFECTIFS
  85. IDEB=nbpts+1
  86. DO 70 I=1,2
  87. DO 700 J=1,NBELEC
  88. ICPR(I,J)=0
  89. 700 CONTINUE
  90. 70 CONTINUE
  91. LCPR=0
  92. DO 71 J=1,NBELEC
  93. DO 710 I=1,2
  94. I1=IPT1.NUM((I-1)*INCR+1,J)
  95. LCPR=LCPR+1
  96. DO 72 JJ=1,J
  97. DO 720 II=1,2
  98. IF (IPT1.NUM((II-1)*INCR+1,JJ).NE.I1) GOTO 72
  99. IF (II.NE.I) GOTO 73
  100. IF (JJ.EQ.J) GOTO 71
  101. 73 ICPR(I,J)=II+(JJ-1)*2
  102. LCPR=LCPR-1
  103. IF (J.EQ.NBELEC.AND.I.EQ.2) GOTO 75
  104. GOTO 71
  105. 75 IF (IBOUCL.EQ.1) GOTO 71
  106. ICPR(I,J)=0
  107. ICPR(II,JJ)=I+(J-1)*2
  108. GOTO 71
  109. 720 CONTINUE
  110. 72 CONTINUE
  111. 710 CONTINUE
  112. 71 CONTINUE
  113. * IL SEMBLERAIT QUE L'ON AIT NCOUCH A FAIRE AVEC LCPR POINTS EFFECTIFS
  114. C ON NE S'OCCUPE QUE DE FABRIQUER DES RECTANGLES A 4 NOEUDS POUR
  115. C LE MOMENT D'ABORD LES POINTS DU BAS QUI NE SONT PAS A FABRIQUER
  116. DO 40 I=1,IPT1.NUM(/2)
  117. NUM(1,I)=IPT1.NUM(1,I)
  118. NUM(2,I)=IPT1.NUM(1+INCR,I)
  119. 40 CONTINUE
  120. ILASI=IDEB-1
  121. ILASJ=ILASI+(INCR*NX)+INCR-1
  122. IF (IBOUCL.EQ.1) ILASJ=ILASI
  123. ILAS=ILASJ+INCR*NX+INCR
  124. DO 42 ICOUCH=1,NCOUCH
  125. IF (NCOUCH.EQ.ICOUCH) GOTO 41
  126. ILASI=ILASI+INCR
  127. ILASJ=ILASJ+INCR
  128. INI=(ICOUCH-1)*IPT1.NUM(/2)
  129. NUM(1,1+INI+NBELEC)=ILASI
  130. NUM(4,1+INI)=ILASI
  131. NUM(2,INI+2*NBELEC)=ILASJ
  132. NUM(3,INI+NBELEC)=ILASJ
  133. DO 420 J=1,IPT1.NUM(/2)
  134. DO 421 I=1,2
  135. ILL=ILAS
  136. IF (I.EQ.1.AND.J.EQ.1) GOTO 421
  137. IF (I.EQ.2.AND.J.EQ.NBELEC) GOTO 421
  138. IF (ICPR(I,J).NE.0) ILL=NUM(MOD(ICPR(I,J)-1,2)+1,
  139. # (ICPR(I,J)-1)/2+1+INI+NBELEC)
  140. NUM(I,J+INI+NBELEC)=ILL
  141. NUM(5-I,J+INI)=ILL
  142. IF (ICPR(I,J).NE.0) GOTO 421
  143. ILAS=ILL+1
  144. 421 CONTINUE
  145. 420 CONTINUE
  146. 42 CONTINUE
  147. 41 CONTINUE
  148. INI=(NCOUCH-1)*IPT1.NUM(/2)
  149. DO 43 I=1,NBELEC
  150. NUM(4,INI+I)=IPT3.NUM(1,I)
  151. NUM(3,INI+I)=IPT3.NUM(1+INCR,I)
  152. 43 CONTINUE
  153. DO 44 I=1,NCOUCH
  154. DO 440 J=1,IPT1.NUM(/2)
  155. II=(I-1)*IPT1.NUM(/2)+J
  156. ICOLOR(II)=IPT1.ICOLOR(J)
  157. 440 CONTINUE
  158. 44 CONTINUE
  159. LISREF(1)=IPT1
  160. C CREATION DES BORDS LATERAUX PAR LIGNE PETIT SOUCI
  161. C CECI EST A REVOIR (NOUVEAU S-P POUR CE CAS QUI RESPECTE LA
  162. C NUMEROTATION
  163. ILS=IPT1.ITYPEL
  164. IDS=IPT1.ICOLOR(1)
  165. LP1=IPT1.NUM(1,1)
  166. LP2=IPT3.NUM(1,1)
  167. CALL GENERL(LP1,LP2,IPT8,IPT2,IDS)
  168. IF (IERR.NE.0) RETURN
  169. CALL INVERS(IPT2,IPT4)
  170. LISREF(4)=IPT4
  171. SEGDES IPT4,IPT2
  172. IF (IBOUCL.EQ.0) GOTO 46
  173. LISREF(2)=IPT2
  174. GOTO 45
  175. 46 CONTINUE
  176. IDS=IPT1.ICOLOR(IPT1.ICOLOR(/1))
  177. LP2=IPT3.NUM(IPT3.NUM(/1),IPT3.NUM(/2))
  178. LP1=IPT1.NUM(IPT1.NUM(/1),IPT1.NUM(/2))
  179. CALL GENERL(LP1,LP2,IPT8,IPT2,IDS)
  180. IF (IERR.NE.0) RETURN
  181. SEGDES IPT2
  182. LISREF(2)=IPT2
  183. 45 CONTINUE
  184. SEGSUP IPT3
  185. C CREATION DES POINTS (PAS LES POINTS MILIEUX QUI SERONT FABRIQUES
  186. C EVENTUELLEMENT LORS DE LA CONVERSION DES ELEMENTS)
  187. IADR=nbpts
  188. IF (NCOUCH.EQ.1) GOTO 60
  189. NBPTS=IADR+IPT1.NUM(/2)*(NCOUCH-1)*2
  190. SEGADJ MCOORD
  191. DO 61 I=2,NCOUCH
  192. IF (IPT1.NUM(/2).EQ.1) GOTO 60
  193. IREFI=(IDIM+1)*(IPT8.NUM(1,I)-1)
  194. XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1)
  195. YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2)
  196. ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3)
  197. DO 62 J=1,IPT1.NUM(/2)
  198. DO 620 K=1,2
  199. IF (K.EQ.1.AND.J.EQ.1) GOTO 620
  200. IF (K.EQ.2.AND.J.EQ.NBELEC) GOTO 620
  201. IF (ICPR(K,J).NE.0) GOTO 620
  202. IREF=(IDIM+1)*IPT1.NUM((K-1)*INCR+1,J)-IDIM
  203. XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF)+XVI
  204. XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+1)+YVI
  205. IF (IDIM.NE.2) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+2)+ZVI
  206. XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM)
  207. IADR=IADR+1
  208. 620 CONTINUE
  209. 62 CONTINUE
  210. 61 CONTINUE
  211. 60 CONTINUE
  212. NBPTS=IADR
  213. SEGADJ MCOORD
  214. IF (KSURF(ILCOUR).EQ.8) GOTO 101
  215. IF (KSURF(ILCOUR).NE.4) GOTO 102
  216. NBNN=3
  217. NBELEM=2*NUM(/2)
  218. NBREF=4
  219. NBSOUS=0
  220. SEGINI IPT1
  221. IPT1.ITYPEL=4
  222. IPT1.LISREF(1)=LISREF(1)
  223. IPT1.LISREF(2)=LISREF(2)
  224. IPT1.LISREF(3)=LISREF(3)
  225. IPT1.LISREF(4)=LISREF(4)
  226. DO 103 I=1,NUM(/2),2
  227. J=2*I-1
  228. IPT1.NUM(1,J)=NUM(1,I)
  229. IPT1.NUM(2,J)=NUM(2,I)
  230. IPT1.NUM(3,J)=NUM(3,I)
  231. IPT1.ICOLOR(J)=ICOLOR(I)
  232. J=J+1
  233. IPT1.NUM(1,J)=NUM(1,I)
  234. IPT1.NUM(2,J)=NUM(3,I)
  235. IPT1.NUM(3,J)=NUM(4,I)
  236. IPT1.ICOLOR(J)=ICOLOR(I)
  237. J=J+1
  238. IF (J.GT.IPT1.NUM(/2)) GOTO 103
  239. IPT1.NUM(1,J)=NUM(1,I+1)
  240. IPT1.NUM(2,J)=NUM(2,I+1)
  241. IPT1.NUM(3,J)=NUM(4,I+1)
  242. IPT1.ICOLOR(J)=ICOLOR(I+1)
  243. J=J+1
  244. IPT1.NUM(1,J)=NUM(2,I+1)
  245. IPT1.NUM(2,J)=NUM(3,I+1)
  246. IPT1.NUM(3,J)=NUM(4,I+1)
  247. IPT1.ICOLOR(J)=ICOLOR(I+1)
  248. 103 CONTINUE
  249. SEGSUP MELEME
  250. MELEME=IPT1
  251. GOTO 101
  252. 102 CONTINUE
  253. IF (KSURF(ILCOUR).NE.10.AND.KSURF(ILCOUR).NE.6) GOTO 104
  254. C ON FAIT DES QUA8 OU DES TRI6
  255. NBNN=8
  256. NBELEM=NUM(/2)
  257. NBREF=4
  258. NBSOUS=0
  259. SEGINI IPT5
  260. IPT5.ITYPEL=10
  261. IPT1=LISREF(1)
  262. IPT2=LISREF(2)
  263. IPT3=LISREF(3)
  264. IPT4=LISREF(4)
  265. IPT5.LISREF(1)=IPT1
  266. IPT5.LISREF(2)=IPT2
  267. IPT5.LISREF(3)=IPT3
  268. IPT5.LISREF(4)=IPT4
  269. SEGACT IPT1,IPT2,IPT3,IPT4
  270. DO 105 J=1,NUM(/1)
  271. JJ=2*J-1
  272. DO 1050 I=1,NBELEM
  273. IPT5.NUM(JJ,I)=NUM(J,I)
  274. 1050 CONTINUE
  275. 105 CONTINUE
  276. DO 135 I=1,NBELEM
  277. IPT5.ICOLOR(I)=ICOLOR(I)
  278. 135 CONTINUE
  279. NLIG=IPT1.NUM(/2)
  280. DO 106 I=1,NLIG
  281. IPT5.NUM(2,I)=IPT1.NUM(2,I)
  282. IPT5.NUM(6,NBELEM+1-I)=IPT3.NUM(2,I)
  283. 106 CONTINUE
  284. NBPTA=nbpts
  285. NBPTS=NBPTA+NCOUCH*(NLIG+NLIG*2)
  286. SEGADJ MCOORD
  287. DO 107 I=1,NCOUCH
  288. IPT5.NUM(8,NLIG*(I-1)+1)=IPT4.NUM(2,NCOUCH+1-I)
  289. IPT5.NUM(4,NLIG*I)=IPT2.NUM(2,I)
  290. C ON FAIT D'ABORD LES NOEUDS 2 DU HAUT (6 DU BAS)
  291. C CREATION DES NOEUDS
  292. IF (I.EQ.NCOUCH) GOTO 108
  293. IREFI=(IDIM+1)*(IPT8.NUM(IPT8.NUM(/1),I)-1)
  294. XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1)
  295. YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2)
  296. ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3)
  297. DO 109 J=1,NLIG
  298. IREF=(IDIM+1)*(IPT1.NUM(2,J)-1)
  299. XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI
  300. XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI
  301. IF (IDIM.GE.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI
  302. XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1)
  303. IADR=IADR+1
  304. C ON MET LE NOEUD DANS LES ELEMENTS
  305. IPT5.NUM(6,(I-1)*NLIG+J)=IADR
  306. IPT5.NUM(2,I*NLIG+J)=IADR
  307. 109 CONTINUE
  308. 108 CONTINUE
  309. IF (NLIG.EQ.1) GOTO 113
  310. C ON MET LES NOEUDS 4 DE GAUCHE ET 8 DE DROITE
  311. C CREATION DES NOEUDS
  312. IREFI=(IDIM+1)*(IPT8.NUM(2,I)-1)
  313. XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1)
  314. YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2)
  315. ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3)
  316. DO 115 J=1,NLIG
  317. DO 1150 K=1,2
  318. IF (K.EQ.1.AND.J.EQ.1) GOTO 1150
  319. IF (K.EQ.2.AND.J.EQ.NLIG) GOTO 1150
  320. IF (ICPR(K,J).NE.0) GOTO 116
  321. IREF=(IPT1.NUM(2*K-1,J)-1)*(IDIM+1)
  322. XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI
  323. XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI
  324. IF (IDIM.GE.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI
  325. XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1)
  326. IADR=IADR+1
  327. 116 CONTINUE
  328. C NOEUDS DES ELEM
  329. IF (ICPR(K,J).NE.0) GOTO 119
  330. IPT5.NUM(4*(3-K),(I-1)*NLIG+J)=IADR
  331. GOTO 1150
  332. 119 CONTINUE
  333. IPT5.NUM(4*(3-K),(I-1)*NLIG+J)=IPT5.NUM(4*(2-MOD(ICPR(K,J)-1,2)),
  334. # (ICPR(K,J)+1)/2+(I-1)*NLIG)
  335. 1150 CONTINUE
  336. 115 CONTINUE
  337. 113 CONTINUE
  338. 107 CONTINUE
  339. NBPTS=IADR
  340. SEGADJ MCOORD
  341. SEGSUP MELEME
  342. MELEME=IPT5
  343. SEGDES IPT1,IPT2,IPT3,IPT4
  344. IF (KSURF(ILCOUR).NE.6) GOTO 101
  345. C ON FAIT DES TRI6
  346. NBNN=6
  347. NBELEM=2*NUM(/2)
  348. NBREF=4
  349. NBSOUS=0
  350. SEGINI IPT1
  351. IPT1.ITYPEL=6
  352. IPT1.LISREF(1)=LISREF(1)
  353. IPT1.LISREF(2)=LISREF(2)
  354. IPT1.LISREF(3)=LISREF(3)
  355. IPT1.LISREF(4)=LISREF(4)
  356. IALT=1
  357. NBPTS=nbpts+NCOUCH*NLIG
  358. SEGADJ MCOORD
  359. DO 120 I=1,NCOUCH
  360. IREFI=(IDIM+1)*(IPT8.NUM(2,I)-1)
  361. XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1)
  362. YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2)
  363. ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3)
  364. DO 1200 J=1,NLIG
  365. INU=(I-1)*NLIG+J
  366. IALT=3-IALT
  367. C CREATION DU POINT SUPPLEMENTAIRE
  368. IREF=(NUM(2,J)-1)*(IDIM+1)
  369. XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI
  370. XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI
  371. IF (IDIM.EQ.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI
  372. XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1)
  373. IADR=IADR+1
  374. ITR1=2*INU-1
  375. ITR2=2*INU
  376. GOTO (124,125),IALT
  377. C CREATION DES TRIANGLES
  378. 124 IPT1.NUM(1,ITR1)=NUM(1,INU)
  379. IPT1.NUM(2,ITR1)=NUM(2,INU)
  380. IPT1.NUM(3,ITR1)=NUM(3,INU)
  381. IPT1.NUM(5,ITR1)=NUM(7,INU)
  382. IPT1.NUM(6,ITR1)=NUM(8,INU)
  383. IPT1.NUM(4,ITR1)=IADR
  384. IPT1.NUM(1,ITR2)=NUM(3,INU)
  385. IPT1.NUM(2,ITR2)=NUM(4,INU)
  386. IPT1.NUM(3,ITR2)=NUM(5,INU)
  387. IPT1.NUM(4,ITR2)=NUM(6,INU)
  388. IPT1.NUM(5,ITR2)=NUM(7,INU)
  389. IPT1.NUM(6,ITR2)=IADR
  390. IPT1.ICOLOR(ITR1)=ICOLOR(INU)
  391. IPT1.ICOLOR(ITR2)=ICOLOR(INU)
  392. GOTO 126
  393. 125 IPT1.NUM(1,ITR1)=NUM(1,INU)
  394. IPT1.NUM(2,ITR1)=NUM(2,INU)
  395. IPT1.NUM(3,ITR1)=NUM(3,INU)
  396. IPT1.NUM(4,ITR1)=NUM(4,INU)
  397. IPT1.NUM(5,ITR1)=NUM(5,INU)
  398. IPT1.NUM(6,ITR1)=IADR
  399. IPT1.NUM(1,ITR2)=NUM(5,INU)
  400. IPT1.NUM(2,ITR2)=NUM(6,INU)
  401. IPT1.NUM(3,ITR2)=NUM(7,INU)
  402. IPT1.NUM(4,ITR2)=NUM(8,INU)
  403. IPT1.NUM(5,ITR2)=NUM(1,INU)
  404. IPT1.NUM(6,ITR2)=IADR
  405. IPT1.ICOLOR(ITR1)=ICOLOR(INU)
  406. IPT1.ICOLOR(ITR2)=ICOLOR(INU)
  407. GOTO 126
  408. 126 CONTINUE
  409. 1200 CONTINUE
  410. 120 CONTINUE
  411. SEGSUP MELEME
  412. MELEME=IPT1
  413. GOTO 101
  414. 104 CONTINUE
  415. 101 CONTINUE
  416. SEGSUP ICPR
  417. C S'IL Y A LIEU EXAMINER LA DEGENERESCENCE (ROTATION)
  418. SEGDES IPT1
  419. IF (IFUSE.EQ.0) GOTO 63
  420. IPT5=IFUSE
  421. SEGACT IPT5,MELEME
  422. ltelq=.false.
  423. CALL FUSE(IPT5,MELEME,IRET,ltelq)
  424. SEGDES IPT5
  425. SEGSUP MELEME
  426. MELEME=IRET
  427. 63 CONTINUE
  428. CALL ECROBJ('MAILLAGE',MELEME)
  429. SEGDES MELEME,IPT8
  430. RETURN
  431. END
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  

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