Télécharger volumg.eso

Retour à la liste

Numérotation des lignes :

volumg
  1. C VOLUMG SOURCE PV 20/03/24 21:23:15 10554
  2. C FABRICATION DE CUBES ET PRISMES PAR TRANSLATION D'UNE SURFACE
  3. C SELON UNE GENERATRICE (NOVEMBRE 1985)
  4. SUBROUTINE VOLUMG
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT real*8 (a-h,o-z)
  7. -INC SMELEME
  8.  
  9. -INC PPARAM
  10. -INC CCOPTIO
  11. -INC SMCOORD
  12. -INC CCGEOME
  13. logical ltelq
  14. SEGMENT ICPR(NBNNEL,NBELEC)
  15. IF (ILCOUR.LT.14.OR.ILCOUR.GT.17) CALL ERREUR(16)
  16. IF (IERR.NE.0) RETURN
  17. CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
  18. CALL LIROBJ('MAILLAGE',IPT9,1,IRETOU)
  19. IF(IERR.NE.0) RETURN
  20. C IPT9 EST LA GENERATRICE VERIFICATION DU TYPE
  21. SEGACT IPT9
  22. IF (IPT9.ITYPEL.NE.KDEGRE(ILCOUR)) THEN
  23. CALL ERREUR(16)
  24. SEGDES IPT9
  25. RETURN
  26. ENDIF
  27. ISVOL1=0
  28. SEGACT IPT1
  29. C SI IPT1 VOLUME IL FAUT EN EXTRAIRE LA FACE 2
  30. 3100 IF (IPT1.LISOUS(/1).EQ.0) GOTO 1000
  31. IF (IPT1.LISOUS(/1).NE.2) GOTO 3102
  32. IDEUX=2
  33. IPT3=IPT1.LISOUS(1)
  34. IPT4=IPT1.LISOUS(2)
  35. SEGACT IPT3,IPT4
  36. IP=IPT3.ITYPEL*IPT4.ITYPEL
  37. IF (IP.NE.32.AND.IP.NE.60) GOTO 3101
  38. IS=IPT3.ITYPEL+IPT4.ITYPEL
  39. IF (IS.NE.12.AND.IS.NE.16) GOTO 3101
  40. INCR=1
  41. IF (IS.EQ.16) INCR=2
  42. NBNNEL=4*INCR
  43. C EN FAIT ON CREE UN SEGMENT QUI CONTIENT LES CUBES ET LES TRIANGLES
  44. C 0 DANS LA DERNIERE POSITION DU TRIANGLE
  45. NBSOUS=0
  46. NBREF=0
  47. NBNN=NBNNEL
  48. NBELE3=IPT3.NUM(/2)
  49. IF (IPT3.ITYPEL.LE.6) NBTRI=NBELE3
  50. IF (IPT3.ITYPEL.GE.8) NBQUA=NBELE3
  51. NBELE4=IPT4.NUM(/2)
  52. IF (IPT4.ITYPEL.LE.6) NBTRI=NBELE4
  53. IF (IPT4.ITYPEL.GE.8) NBQUA=NBELE4
  54. NBELEM=NBELE3+NBELE4
  55. SEGINI MELEME
  56. DO 1100 I=1,NBNN
  57. DO 1100 J=1,NBELEM
  58. NUM(I,J)=0
  59. 1100 CONTINUE
  60. DO 1101 J=1,NBELE3
  61. ICOLOR(J)=IPT3.ICOLOR(J)
  62. DO 1101 I=1,IPT3.NUM(/1)
  63. NUM(I,J)=IPT3.NUM(I,J)
  64. 1101 CONTINUE
  65. DO 1102 J=1,NBELE4
  66. ICOLOR(J+NBELE3)=IPT4.ICOLOR(J)
  67. DO 1102 I=1,IPT4.NUM(/1)
  68. NUM(I,J+NBELE3)=IPT4.NUM(I,J)
  69. 1102 CONTINUE
  70. SEGDES IPT3,IPT4
  71. GOTO 1001
  72. C RECHERCHE DE LA PREMIERE FACE DE IPT1
  73. 3101 SEGDES IPT3,IPT4
  74. 3102 IF (IPT1.LISREF(/1).LT.2) CALL ERREUR(16)
  75. IF (IERR.NE.0) RETURN
  76. ISVOL1=IPT1
  77. IAUX=IPT1.LISREF(2)
  78. SEGDES IPT1
  79. IPT1=IAUX
  80. SEGACT IPT1
  81. GOTO 3100
  82. 1000 CONTINUE
  83. IDEUX=1
  84. NBNNEL=IPT1.NUM(/1)
  85. NBELEM=IPT1.NUM(/2)
  86. IF (IPT1.ITYPEL.NE.8.AND.IPT1.ITYPEL.NE.10.AND.IPT1.ITYPEL.NE.4
  87. #.AND.IPT1.ITYPEL.NE.6) GOTO 3102
  88. INCR=1
  89. IF (KDEGRE(IPT1.ITYPEL).EQ.3) INCR=2
  90. MELEME=IPT1
  91. 1001 SEGACT MCOORD*mod
  92. IPT3=MELEME
  93. NCOUCH=IPT9.NUM(/2)
  94. NX=NCOUCH-1
  95. IF (IIMPI.EQ.1) WRITE(IOIMP,9000) NCOUCH
  96. 9000 FORMAT(/,' COUCHES ',I6)
  97. C ON FAIT TOUJOURS COMME SI IL N'Y AVAIT QU'UN TYPE D'ELEMENT
  98. NBSOUS=0
  99. C MODIF POUR CONSTRUIRE TOUJOURS LE POURTOUR
  100. NBREF=3
  101. IF (IPT1.LISREF(/1).NE.0) NBREF=3
  102. NBNN=2*NBNNEL+(INCR-1)*(NBNNEL/2)
  103. NBNNV=NBNN
  104. NBASE=NBELEM
  105. NBELEM=NBELEM*NCOUCH
  106. SEGINI IPT7
  107. IF (NBNNV.EQ.6 ) IPT7.ITYPEL=16
  108. IF (NBNNV.EQ.15) IPT7.ITYPEL=17
  109. IF (NBNNV.EQ.8 ) IPT7.ITYPEL=14
  110. IF (NBNNV.EQ.20) IPT7.ITYPEL=15
  111. IPT7.LISREF(1)=IPT1
  112. DO 1040 I=1,NBNN
  113. DO 1040 J=1,NBELEM
  114. IPT7.NUM(I,J)=0
  115. 1040 CONTINUE
  116. IOPTG=1
  117. C CALCUL DU VECTEUR TRANSLATION TOTALE
  118. IREFB=(IPT9.NUM(1,1)-1)*4
  119. IREFH=(IPT9.NUM(IPT9.NUM(/1),NCOUCH)-1)*4
  120. NBPTS=nbpts+1
  121. SEGADJ MCOORD
  122. XCOOR((NBPTS-1)*(IDIM+1)+1)=XCOOR(IREFH+1)-XCOOR(IREFB+1)
  123. XCOOR((NBPTS-1)*(IDIM+1)+2)=XCOOR(IREFH+2)-XCOOR(IREFB+2)
  124. XCOOR((NBPTS-1)*(IDIM+1)+3)=XCOOR(IREFH+3)-XCOOR(IREFB+3)
  125. XCOOR(NBPTS*(IDIM+1))=XCOOR(IREFH+4)
  126. IVEC=NBPTS
  127. IDEB=IVEC+1
  128. CALL ECROBJ('POINT ',IVEC)
  129. CALL ECROBJ('MAILLAGE',IPT1)
  130. CALL PROPER(IOPTG)
  131. CALL LIROBJ('MAILLAGE',IPT2,1,IRETOU)
  132. IF (IERR.NE.0) RETURN
  133. C IPT3 ET IPT4 ONT ETE DESCENDU DANS L'OPERATION AINSI QUE MCOORD/REFPO
  134. 16 SEGACT IPT1,IPT2,MCOORD
  135. IPT4=IPT2
  136. IF (IDEUX.EQ.1) GOTO 15
  137. IPT5=IPT2.LISOUS(1)
  138. IPT6=IPT2.LISOUS(2)
  139. SEGACT IPT5,IPT6
  140. C ON FAIT COMME POUR LE BAS
  141. NBSOUS=0
  142. NBREF=0
  143. NBNN=4*INCR
  144. NBNNR=NBNN
  145. NBELEM=NBELE3+NBELE4
  146. SEGINI MELEME
  147. DO 1110 J=1,NBELEM
  148. DO 1110 I=1,NBNN
  149. NUM(I,J)=0
  150. 1110 CONTINUE
  151. DO 1111 J=1,NBELE3
  152. ICOLOR(J)=IPT5.ICOLOR(J)
  153. DO 1111 I=1,IPT5.NUM(/1)
  154. NUM(I,J)=IPT5.NUM(I,J)
  155. 1111 CONTINUE
  156. DO 1112 J=1,NBELE4
  157. ICOLOR(J+NBELE3)=IPT6.ICOLOR(J)
  158. DO 1112 I=1,IPT6.NUM(/1)
  159. NUM(I,J+NBELE3)=IPT6.NUM(I,J)
  160. 1112 CONTINUE
  161. SEGDES IPT5,IPT6,IPT2
  162. IPT4=MELEME
  163. 15 IPT7.LISREF(2)=IPT2
  164. C CONSTRUCTION DE LA TABLE DES POINTS EFFECTIFS
  165. NBELEC=IPT3.NUM(/2)
  166. SEGINI ICPR
  167. DO 12 I=1,NBNNEL
  168. DO 12 J=1,NBELEC
  169. 12 ICPR(I,J)=0
  170. DO 13 J=1,NBELEC
  171. DO 13 I=1,NBNNEL
  172. IR=IPT3.NUM(I,J)
  173. IR2=IPT4.NUM(I,J)
  174. IF (IR.EQ.0) GOTO 1120
  175. IF (IR2.EQ.0) GOTO 8833
  176. I1=IR
  177. I1R2=IR2
  178. IF (J.EQ.1) GOTO 13
  179. JM1=J-1
  180. DO 14 JJ=1,JM1
  181. DO 14 II=1,NBNNEL
  182. IR=IPT3.NUM(II,JJ)
  183. IR2=IPT4.NUM(II,JJ)
  184. IF (IR.EQ.0) GOTO 14
  185. IF (IR.NE.I1) GOTO 8834
  186. IF (IR2.NE.I1R2) GOTO 8833
  187. ICPR(I,J)=II+(JJ-1)*8
  188. GOTO 13
  189. 8834 IF (IR2.EQ.I1R2) GOTO 8833
  190. 14 CONTINUE
  191. GOTO 13
  192. 1120 ICPR(I,J)=-1
  193. IF (IR2.NE.0) GOTO 8833
  194. 13 CONTINUE
  195. GOTO 8835
  196. 8833 CONTINUE
  197. C LES TOPOLOGIES SONT DIFFERENTES
  198. SEGSUP ICPR
  199. CALL ERREUR(21)
  200. RETURN
  201. 8835 CONTINUE
  202. C ON FABRIQUE POUR LE MOMENT DES CUBES A 8 OU 20 NOEUDS ET DES PRISMES
  203. C A 6 OU 15 NOEUDS
  204. C D'ABORD LES POINTS DU BAS
  205. DO 20 I=1,NBELEC
  206. IPT7.ICOLOR(I)=IPT3.ICOLOR(I)
  207. DO 20 J=1,NBNNEL
  208. IR=IPT3.NUM(J,I)
  209. IF (IR.EQ.0) GOTO 20
  210. IPT7.NUM(J,I)=IR
  211. 20 CONTINUE
  212. IBASE=nbpts
  213. C ON FABRIQUE ENSUITE LES COUCHES
  214. C ON AFFECTE SEULEMENT LES NUMEROS DE NOEUDS
  215. IDIF=(INCR-1)*(NBNNEL/2)
  216. NX=NCOUCH-1
  217. DO 21 ICOUCH=1,NCOUCH
  218. IF (ICOUCH.EQ.NCOUCH) GOTO 21
  219. JBASE=(ICOUCH-1)*NBELEC
  220. IF (INCR.EQ.1) GOTO 2000
  221. C ON FABRIQUE D'ABORD LA COUCHE INTERMEDIAIRE
  222. DO 2001 J=1,NBELEC
  223. IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J)
  224. DO 2001 IA=1,(NBNNEL/2)
  225. I=2*IA-1
  226. IF (ICPR(I,J).EQ.-1) GOTO 2001
  227. IF (ICPR(I,J).NE.0) GOTO 2002
  228. IBASE=IBASE+1
  229. IPT7.NUM(IA+NBNNEL,J+JBASE)=IBASE
  230. GOTO 2001
  231. 2002 IAUX=ICPR(I,J)
  232. JJ=(IAUX-1)/8+1
  233. II=IAUX-8*JJ+8
  234. IIA=(II+1)/2
  235. IPT7.NUM(IA+NBNNEL,J+JBASE)=IPT7.NUM(IIA+NBNNEL,JJ+JBASE)
  236. 2001 CONTINUE
  237. 2000 CONTINUE
  238. DO 22 J=1,NBELEC
  239. IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J)
  240. DO 22 I=1,NBNNEL
  241. IF (ICPR(I,J).EQ.-1) GOTO 22
  242. IF (ICPR(I,J).NE.0) GOTO 23
  243. IBASE=IBASE+1
  244. IPT7.NUM(I,J+JBASE+NBELEC)=IBASE
  245. IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IBASE
  246. GOTO 22
  247. 23 IAUX=ICPR(I,J)
  248. JJ=(IAUX-1)/8+1
  249. II=IAUX-8*JJ+8
  250. IPT7.NUM(I,J+JBASE+NBELEC)=IPT7.NUM(II,JJ+JBASE+NBELEC)
  251. IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IPT7.NUM(II+NBNNEL+IDIF,JJ+JBASE)
  252. 22 CONTINUE
  253. 21 CONTINUE
  254. 25 CONTINUE
  255. C ON FAIT LES POINTS DU HAUT ET EVENTUELLEMENT LA COUCHE INTERMEDIAIRE
  256. C PRECEDENTE
  257. JBASE=NBELEC*NX
  258. IF (INCR.EQ.1) GOTO 2003
  259. DO 2004 J=1,NBELEC
  260. IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J)
  261. DO 2004 IA=1,(NBNNEL/2)
  262. I=2*IA-1
  263. IF (ICPR(I,J).EQ.-1) GOTO 2004
  264. IF (ICPR(I,J).NE.0) GOTO 2005
  265. IBASE=IBASE+1
  266. IPT7.NUM(IA+NBNNEL,J+JBASE)=IBASE
  267. GOTO 2004
  268. 2005 IAUX=ICPR(I,J)
  269. JJ=(IAUX-1)/8+1
  270. II=IAUX-8*JJ+8
  271. IIA=(II+1)/2
  272. IPT7.NUM(IA+NBNNEL,J+JBASE)=IPT7.NUM(IIA+NBNNEL,JJ+JBASE)
  273. 2004 CONTINUE
  274. 2003 CONTINUE
  275. DO 30 J=1,NBELEC
  276. IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J)
  277. DO 30 I=1,NBNNEL
  278. IF (ICPR(I,J).EQ.-1) GOTO 30
  279. IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IPT4.NUM(I,J)
  280. 30 CONTINUE
  281. C CREATION DES POINTS
  282. IADR=nbpts
  283. NBPTS=IADR+NCOUCH*INCR*NBELEC*NBNNEL
  284. SEGADJ MCOORD
  285. DO 61 ICOUCH=1,NCOUCH
  286. DO 610 IC=1,INCR
  287. IREFC=(IPT9.NUM(IC+1,ICOUCH)-1)*4
  288. XPLUS=XCOOR(IREFC+1)-XCOOR(IREFB+1)
  289. YPLUS=XCOOR(IREFC+2)-XCOOR(IREFB+2)
  290. ZPLUS=XCOOR(IREFC+3)-XCOOR(IREFB+3)
  291. TPLUS=XCOOR(IREFC+4)
  292. IC1=INCR+1-IC
  293. IF (ICOUCH.EQ.NCOUCH.AND.IC.EQ.INCR) GOTO 610
  294. DO 620 J=1,NBELEC
  295. DO 62 I=1,NBNNEL,IC1
  296. IF (ICPR(I,J).NE.0) GOTO 62
  297. IREF=4*IPT3.NUM(I,J)-4
  298. XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XPLUS
  299. XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YPLUS
  300. XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZPLUS
  301. XCOOR((IADR+1)*(IDIM+1))=TPLUS
  302. IADR=IADR+1
  303. 62 CONTINUE
  304. 620 CONTINUE
  305. 610 CONTINUE
  306. 61 CONTINUE
  307. NBPTS=IADR
  308. SEGADJ MCOORD
  309. C C'EST FINI
  310. C IL RESTE DANS LE CAS OU ON A DES CUBES ET DES PRISMES A LES SEPARER
  311. C ET A SUPPRIMER LES SEGMENTS SUPPLEMENTAIRES DE TRAVAIL
  312. C D'ABORD FAIRE LE POURTOUR A PARTIR DU CONTOUR
  313. IF (IPT7.LISREF(/1).EQ.2) GOTO 3000
  314. CALL ECROBJ('MAILLAGE',IPT1)
  315. CALL PRCONT
  316. CALL LIROBJ('MAILLAGE',IPT5,1,IRETOU)
  317. IF (IERR.NE.0) GOTO 3000
  318. C IPT5 LE CONTOUR IPT6 SERA LE POURTOUR
  319. SEGACT IPT5
  320. NBASE=IPT5.NUM(/2)
  321. NBNN=INCR*4
  322. NBELEM=NBASE*NCOUCH
  323. NBSOUS=0
  324. NBREF=0
  325. SEGINI IPT6
  326. IPT6.ITYPEL=6+2*INCR
  327. SEGACT IPT3
  328. DO 3001 IEL=1,NBASE
  329. DO 3001 IP=1,INCR+1
  330. INP=IPT5.NUM(IP,IEL)
  331. DO 3003 IELS=1,NBELEC
  332. DO 3003 IPS=1,NBNNEL
  333. IPSP=IPT3.NUM(IPS,IELS)
  334. IF (IPSP.EQ.0) GOTO 3003
  335. IF (IPSP.EQ.INP) GOTO 3002
  336. 3003 CONTINUE
  337. GOTO 3000
  338. 3002 CONTINUE
  339. DO 3004 IC=1,NCOUCH
  340. IBASE=(IC-1)*NBASE
  341. JBASE=(IC-1)*NBELEC
  342. C PTS DU BAS
  343. IPT6.NUM(IP,IEL+IBASE)=IPT7.NUM(IPS,IELS+JBASE)
  344. C PTS DU HAUT
  345. IPT6.NUM(NBNN+2-INCR-IP,IEL+IBASE)=
  346. # IPT7.NUM(IPS+NBNNEL+IDIF,IELS+JBASE)
  347. C EVENTUELLEMENT PTS MILIEUX
  348. IF (INCR.EQ.1.OR.IP.EQ.2) GOTO 3004
  349. IPT6.NUM(10-2*IP,IEL+IBASE)=IPT7.NUM((IPS+1)/2+NBNNEL,IELS+JBASE)
  350. 3004 CONTINUE
  351. 3001 CONTINUE
  352. DO 3005 I=1,NCOUCH
  353. DO 3005 J=1,NBASE
  354. IPT6.ICOLOR(J+(I-1)*NBASE)=IPT5.ICOLOR(J)
  355. 3005 CONTINUE
  356. SEGDES IPT5,IPT6
  357. IPT7.LISREF(3)=IPT6
  358. 3000 CONTINUE
  359. IF (IDEUX.EQ.1) GOTO 1500
  360. SEGSUP IPT3,IPT4
  361. MELEME=IPT7
  362. NBSOUS=2
  363. NBREF=LISREF(/1)
  364. NBNN=0
  365. NBELEM=0
  366. SEGINI IPT7
  367. IPT7.LISREF(1)=LISREF(1)
  368. IPT7.LISREF(2)=LISREF(2)
  369. IF (NBREF.EQ.3) IPT7.LISREF(3)=LISREF(3)
  370. NBSOUS=0
  371. NBREF=0
  372. NBNN=6
  373. IF (INCR.EQ.2) NBNN=15
  374. NBELEM=NBTRI*NCOUCH
  375. SEGINI IPT3
  376. IPT3.ITYPEL=16
  377. IF (INCR.EQ.2) IPT3.ITYPEL=17
  378. IPT7.LISOUS(1)=IPT3
  379. NBNN=8
  380. IF (INCR.EQ.2) NBNN=20
  381. NBELEM=NBQUA*NCOUCH
  382. SEGINI IPT4
  383. IPT4.ITYPEL=14
  384. IF (INCR.EQ.2) IPT4.ITYPEL=15
  385. IPT7.LISOUS(2)=IPT4
  386. IT=0
  387. IQ=0
  388. DO 1501 J=1,NUM(/2)
  389. IF (NUM(NBNNV,J).EQ.0) GOTO 1502
  390. C C'EST UN CUBE
  391. IQ=IQ+1
  392. IPT4.ICOLOR(IQ)=ICOLOR(J)
  393. DO 1503 K=1,IPT4.NUM(/1)
  394. IPT4.NUM(K,IQ)=NUM(K,J)
  395. 1503 CONTINUE
  396. GOTO 1501
  397. 1502 IT=IT+1
  398. IPT3.ICOLOR(IT)=ICOLOR(J)
  399. C C'EST UN PRISME
  400. IF (INCR.EQ.2) GOTO 2020
  401. IPT3.NUM(1,IT)=NUM(1,J)
  402. IPT3.NUM(2,IT)=NUM(2,J)
  403. IPT3.NUM(3,IT)=NUM(3,J)
  404. IPT3.NUM(4,IT)=NUM(NBNNEL+1,J)
  405. IPT3.NUM(5,IT)=NUM(NBNNEL+2,J)
  406. IPT3.NUM(6,IT)=NUM(NBNNEL+3,J)
  407. GOTO 1501
  408. 2020 CONTINUE
  409. DO 2021 L=1,6
  410. IPT3.NUM(L,IT)=NUM(L,J)
  411. 2021 CONTINUE
  412. IPT3.NUM(7,IT)=NUM(NBNNEL+1,J)
  413. IPT3.NUM(8,IT)=NUM(NBNNEL+2,J)
  414. IPT3.NUM(9,IT)=NUM(NBNNEL+3,J)
  415. DO 2022 L=1,6
  416. IPT3.NUM(L+9,IT)=NUM(NBNNEL+IDIF+L,J)
  417. 2022 CONTINUE
  418. 1501 CONTINUE
  419. SEGDES IPT3,IPT4
  420. SEGSUP MELEME
  421. 1500 SEGDES IPT1,IPT2
  422. SEGSUP ICPR
  423. IF (ISVOL1.EQ.0) GOTO 3200
  424. IPT8=ISVOL1
  425. SEGACT IPT8
  426. ltelq=.false.
  427. CALL FUSE(IPT8,IPT7,IRET,ltelq)
  428. SEGDES IPT7,IPT8
  429. IPT7=IRET
  430. 3200 CONTINUE
  431. SEGDES IPT7,IPT9
  432. CALL ECROBJ('MAILLAGE',IPT7)
  433. RETURN
  434. END
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  

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