Télécharger soravs.eso

Retour à la liste

Numérotation des lignes :

soravs
  1. C SORAVS SOURCE FANDEUR 22/03/10 21:15:05 11313
  2. SUBROUTINE SORAVS
  3. ************************************************************************
  4. * NOM : soravs.eso
  5. * DESCRIPTION : Sortie d'un CHPOINT et/ou d'un MCHAML (s'appuyant au
  6. C centres de gravité des éléments) avec le maillage
  7. C support au format AVS (Unstructured Cell Data, ASCII)
  8. ************************************************************************
  9. * HISTORIQUE : 25/11/1994 : BULIK : création de la subroutine
  10. * HISTORIQUE : 22/09/1995 : BULIK : ajout des options SUIT et TEMP
  11. * HISTORIQUE : 21/12/1998 : COURTOIS : modif des sorties pour maillage
  12. * HISTORIQUE : 12/02/2010 : GOUNAND : evite l'impression de *******
  13. * HISTORIQUE : 07/06/2012 : JCARDO : ajout de l'extension .inp
  14. * + fermeture du fichier
  15. * HISTORIQUE :
  16. ************************************************************************
  17. * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES
  18. * en cas de modification de ce sous-programme afin de faciliter
  19. * la maintenance !
  20. ************************************************************************
  21. * APPELÉ PAR : opérateur SORTir (prsort.eso)
  22. ************************************************************************
  23. * ENTRÉES :: aucune
  24. * SORTIES :: aucune (sur fichier uniquement)
  25. ************************************************************************
  26. * SYNTAXE (GIBIANE) :
  27. *
  28. * SORT 'AVS' (MAIL1) (CHPO1) (CHML1) ('SUIT') ('TEMP' FLOT1) ;
  29. *
  30. ************************************************************************
  31. IMPLICIT INTEGER(I-N)
  32.  
  33. -INC PPARAM
  34. -INC CCOPTIO
  35. -INC SMCOORD
  36. -INC SMELEME
  37. -INC SMCHPOI
  38. -INC SMCHAML
  39. -INC SMLMOTS
  40.  
  41. EXTERNAL LONG
  42.  
  43. POINTEUR MAPOIN.MELEME, MAELEM.MELEME
  44. POINTEUR IPT10.MELEME, IPT11.MELEME
  45.  
  46. POINTEUR NCMCHA.MLMOTS, NCCHPO.MLMOTS
  47.  
  48. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  49. C
  50. SEGMENT VALMCH
  51. REAL*8 RVAMCH(NBCMCH,NELMAI)
  52. END SEGMENT
  53. C
  54. C Segment : VALeurs du MCHaml
  55. C
  56. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  57.  
  58. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  59. C
  60. SEGMENT VALCHP
  61. REAL*8 RVACHP(NBCCHP,NBNMAP)
  62. END SEGMENT
  63. C
  64. C Segment : VALeurs du CHPoint
  65. C
  66. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  67.  
  68. SEGMENT IEQUIV
  69. INTEGER LEQUIV(IECART)
  70. END SEGMENT
  71.  
  72. CHARACTER*8 MTYP
  73. CHARACTER*(LOCOMP) MOCOMP
  74.  
  75. REAL*8 VALTEM
  76.  
  77. LOGICAL SORMAI, SORCHP, SORMCH, EXISEL, CNDTN
  78.  
  79. LOGICAL CMPINT
  80. EXTERNAL CMPINT
  81.  
  82. PARAMETER(NBMCLE=2)
  83. CHARACTER*4 MTSCLE(NBMCLE)
  84.  
  85. DATA MTSCLE/'SUIT','TEMP'/
  86.  
  87. CHARACTER*(LOCHAI) FICAVS
  88. LOGICAL ZOPEN
  89.  
  90. NCCHPO=0
  91. NCMCHA=0
  92. VALCHP=0
  93. VALMCH=0
  94. IEQUIV=0
  95.  
  96. SORMAI=.FALSE.
  97. SORCHP=.FALSE.
  98. SORMCH=.FALSE.
  99.  
  100. C ... Recherche des objets à sortir ...
  101.  
  102. CALL LIROBJ('MAILLAGE',IVAL,0,IRETOU)
  103. IF(IRETOU.EQ.1) THEN
  104.  
  105. MELEME=IVAL
  106. SORMAI=.TRUE.
  107.  
  108. MAELEM=MELEME
  109. EXISEL=.TRUE.
  110.  
  111. MAPOIN=MAELEM
  112. CALL CHANGE(MAPOIN,1)
  113. C ... Attention ! MAPOIN est déjà actif (voir CHANGE) ...
  114.  
  115. ENDIF
  116.  
  117. CALL LIROBJ('MCHAML ',IVAL,0,IRETOU)
  118. IF(IRETOU.EQ.1) THEN
  119.  
  120. MCHELM=IVAL
  121. SORMCH=.TRUE.
  122.  
  123. IF(.NOT.SORMAI) THEN
  124. CALL ECRCHA('MAIL')
  125. CALL ECROBJ('MCHAML ',MCHELM)
  126. CALL EXTRAI
  127. CALL LIROBJ('MAILLAGE',MAELEM,1,IRETOU)
  128. IF(IERR.NE.0) GOTO 9999
  129. EXISEL=.TRUE.
  130.  
  131. MAPOIN=MAELEM
  132. CALL CHANGE(MAPOIN,1)
  133. C ... Attention ! MAPOIN est déjà actif (voir CHANGE) ...
  134. ENDIF
  135.  
  136. ENDIF
  137.  
  138. CALL LIROBJ('CHPOINT ',IVAL,0,IRETOU)
  139. IF(IRETOU.EQ.1) THEN
  140. MCHPOI=IVAL
  141. SORCHP=.TRUE.
  142.  
  143. IF((.NOT.SORMAI).AND.(.NOT.SORMCH)) THEN
  144. MAELEM=0
  145. EXISEL=.FALSE.
  146.  
  147. CALL ECRCHA('MAIL')
  148. CALL ECROBJ('CHPOINT ',MCHPOI)
  149. CALL EXTRAI
  150. CALL LIROBJ('MAILLAGE',MAPOIN,1,IRETOU)
  151. IF(IERR.NE.0) GOTO 9999
  152. SEGACT MAPOIN
  153. ENDIF
  154.  
  155. ENDIF
  156.  
  157. IF((.NOT.SORMAI).AND.(.NOT.SORMCH).AND.(.NOT.SORCHP)) THEN
  158. CALL ERREUR(704)
  159. RETURN
  160. ENDIF
  161.  
  162. C ... Lecture des mots clés éventuels ...
  163.  
  164. NBCGLO=0
  165. INOREW=0
  166.  
  167. 10 CALL LIRMOT(MTSCLE,NBMCLE,IRAN,0)
  168.  
  169. IF(IRAN.EQ.1) INOREW=1
  170.  
  171. IF(IRAN.EQ.2) THEN
  172. NBCGLO=1
  173. CALL LIRREE(VALTEM,1,IRETOU)
  174. IF(IERR.NE.0) GOTO 9999
  175. cdebug write(*,*) 'Le temps lu = ',VALTEM
  176. ENDIF
  177.  
  178. IF(IRAN.NE.0) GOTO 10
  179.  
  180. C ... NELMAI = Nombre d'ÉLéments du MAIllage ...
  181. IF(EXISEL) THEN
  182. CALL ECROBJ('MAILLAGE',MAELEM)
  183. CALL NBEL
  184. CALL LIRENT(NELMAI,1,IRETOU)
  185. IF(IERR.NE.0) GOTO 9999
  186. ELSE
  187. NELMAI=0
  188. ENDIF
  189.  
  190. C ... NBNMAP = NomBre de Noeuds du MAPoin ...
  191. CALL ECROBJ('MAILLAGE',MAPOIN)
  192. CALL NBNO
  193. CALL LIRENT(NBNMAP,1,IRETOU)
  194. IF(IERR.NE.0) GOTO 9999
  195.  
  196. C ... Si le MAILLAGE et le MCHAML sont donnés, on vérifiera que le
  197. C MAILLAGE est un sous-ensemble du support du MCHAML ...
  198.  
  199. IF(SORMAI.AND.SORMCH) THEN
  200.  
  201. C ... IPT1 = support du MCHAML ...
  202. CALL ECRCHA('MAIL')
  203. CALL ECROBJ('MCHAML ',MCHELM)
  204. CALL EXTRAI
  205. CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
  206. IF(IERR.NE.0) GOTO 9999
  207.  
  208. CALL ECROBJ('MAILLAGE',IPT1)
  209. CALL NBEL
  210. CALL LIRENT(NELSMC,1,IRETOU)
  211. IF(IERR.NE.0) GOTO 9999
  212.  
  213. C ... IPT2 = intersection du MAILLAGE et du support du MCHAML ...
  214. C Si les deux sont distincts, INTERS sortira une ERREUR,
  215. C on commence donc par une différence symétrique :
  216. C si sa taille = NELMAI + NELSMC, ils sont distincts ...
  217. C ... Le problème est que lorsque les deux sont égaux, PRDIFF
  218. C se plante car il ne veut pas sortir un maillage nul,
  219. C il lui manque une option NOVERIF. On commence donc par vérifier
  220. C si les deux nombres d'éléments sont égaux - si OUI, un danger
  221. C guette, on va donc regarder ça de plus près, sinon PRDIFF etc ...
  222. C ... CNDTN est un logique qui décrit l'égalité des deux maillages ...
  223. IF(NELMAI.EQ.NELSMC) THEN
  224. SEGACT MAELEM
  225. SEGACT IPT1
  226. NBEL1=MAELEM.NUM(/2)
  227. NBEL2= IPT1.NUM(/2)
  228. IF(NBEL1.EQ.NBEL2 .AND. NBEL1.GT.0) THEN
  229. C ... Le cas où les deux maillages sont simples ...
  230. NBNN1=MAELEM.NUM(/1)
  231. NBNN2= IPT1.NUM(/1)
  232. IF((NBNN1.EQ.NBNN2).AND.(MAELEM.ITYPEL.EQ.IPT1.ITYPEL))
  233. & THEN
  234. ILONG=NBEL1*NBNN1
  235. CNDTN=CMPINT(MAELEM.NUM(1,1),IPT1.NUM(1,1),ILONG)
  236. ELSE
  237. CNDTN=.FALSE.
  238. ENDIF
  239. ELSE IF(NBEL1.EQ.NBEL2 .AND. NBEL1.EQ.0) THEN
  240. C ... Le cas où les deux maillages sont composés ...
  241. NBS1=MAELEM.LISOUS(/1)
  242. NBS2= IPT1.LISOUS(/1)
  243. IF(NBS1.EQ.NBS2) THEN
  244. CNDTN=.TRUE.
  245. DO 1100 I=1,NBS1
  246. IPT10=MAELEM.LISOUS(I)
  247. IPT11= IPT1.LISOUS(I)
  248. SEGACT IPT10
  249. SEGACT IPT11
  250. IF((IPT10.NUM(/1).EQ.IPT11.NUM(/1)) .AND.
  251. & (IPT10.NUM(/2).EQ.IPT11.NUM(/2)) .AND.
  252. & (IPT10.ITYPEL .EQ.IPT11.ITYPEL) ) THEN
  253. ILONG=IPT10.NUM(/1)*IPT10.NUM(/2)
  254. CNDTN=CNDTN.AND.CMPINT(IPT10.NUM(1,1),
  255. & IPT11.NUM(1,1),ILONG)
  256. ELSE
  257. CNDTN=.FALSE.
  258. ENDIF
  259. SEGDES IPT10
  260. SEGDES IPT11
  261. 1100 CONTINUE
  262. ELSE
  263. CNDTN=.FALSE.
  264. ENDIF
  265. ELSE
  266. C ... Dans le cas où NBEL1 n'est pas egal à NBEL2 il est peu
  267. C probable quoique pas exclu que les deux maillages soient
  268. C égaux, on met donc CoNDiTioN à FAUX ...
  269. CNDTN=.FALSE.
  270. ENDIF
  271. SEGDES MAELEM
  272. SEGDES IPT1
  273. ELSE
  274. CNDTN=.FALSE.
  275. ENDIF
  276.  
  277. IF(CNDTN) THEN
  278. NELDS=0
  279. ELSE
  280. CALL ECROBJ('MAILLAGE',MAELEM)
  281. CALL ECROBJ('MAILLAGE',IPT1)
  282. CALL PRDIFF
  283. CALL LIROBJ('MAILLAGE',IPT2,1,IRETOU)
  284. IF(IERR.NE.0) GOTO 9999
  285.  
  286. CALL ECROBJ('MAILLAGE',IPT2)
  287. CALL NBEL
  288. CALL LIRENT(NELDS,1,IRETOU)
  289. IF(IERR.NE.0) GOTO 9999
  290. ENDIF
  291.  
  292. IF(NELDS.EQ.NELMAI+NELSMC) THEN
  293. IPT2=0
  294. NELINT=0
  295. ELSE
  296. CALL ECROBJ('MAILLAGE',MAELEM)
  297. CALL ECROBJ('MAILLAGE',IPT1)
  298. CALL INTERS
  299. CALL LIROBJ('MAILLAGE',IPT2,1,IRETOU)
  300. IF(IERR.NE.0) GOTO 9999
  301.  
  302. C ... NELINT = nombre d'éléments de l'INTersection IPT2 ...
  303. CALL ECROBJ('MAILLAGE',IPT2)
  304. CALL NBEL
  305. CALL LIRENT(NELINT,1,IRETOU)
  306. IF(IERR.NE.0) GOTO 9999
  307. ENDIF
  308.  
  309. C ... S'il n'y pas égalité, MAILLAGE n'est pas un sous ensemble ...
  310. IF(NELINT.NE.NELMAI) THEN
  311. CALL ERREUR(706)
  312. GOTO 10000
  313. ENDIF
  314.  
  315. C ... Maintenant on réduit le MCHAML su MELEME pour être sûr de
  316. C l'ordre des éléments ...
  317. CALL REDUIC(MCHELM,MELEME,IRETOU)
  318. IF(IRETOU.EQ.0) THEN
  319. GOTO 9999
  320. ELSE
  321. MCHELM=IRETOU
  322. ENDIF
  323.  
  324. C ... Maintenant MCHELM est consistant avec MAELEM et MAPOIN ...
  325. C ... Il reste deux maillages comme effet (IPT1, IPT2) ...
  326.  
  327. ENDIF
  328.  
  329. C ... Si le MAILLAGE (ou MCHAML) et le CHPOINT sont présents, on vérifiera que
  330. C le MAILLAGE et le support du CHPOINT ont une partie commune ...
  331.  
  332. IF((SORMAI.OR.SORMCH).AND.SORCHP) THEN
  333.  
  334. C ... IPT3 = support du CHPOINT ...
  335. CALL ECRCHA('MAIL')
  336. CALL ECROBJ('CHPOINT ',MCHPOI)
  337. CALL EXTRAI
  338. CALL LIROBJ('MAILLAGE',IPT3,1,IRETOU)
  339. IF(IERR.NE.0) GOTO 9999
  340.  
  341. C ... NNSCHP = Nombre de Noeuds du Support du CHPoint ...
  342. CALL ECROBJ('MAILLAGE',IPT3)
  343. CALL NBNO
  344. CALL LIRENT(NNSCHP,1,IRETOU)
  345. IF(IERR.NE.0) GOTO 9999
  346.  
  347. C ... Pour les explications de cette partie voir la partie
  348. C équivalente ci-dessus, au niveau du traitement du MCHAML ...
  349. IF(NBNMAP.EQ.NNSCHP) THEN
  350. SEGACT MAPOIN
  351. SEGACT IPT3
  352. NBEL1=MAPOIN.NUM(/2)
  353. NBEL2= IPT3.NUM(/2)
  354. IF(NBEL1.EQ.NBEL2 .AND. NBEL1.GT.0) THEN
  355. C ... Le cas où les deux maillages sont simples ...
  356. NBNN1=MAPOIN.NUM(/1)
  357. NBNN2= IPT3.NUM(/1)
  358. IF((NBNN1.EQ.NBNN2).AND.(MAPOIN.ITYPEL.EQ.IPT3.ITYPEL))
  359. & THEN
  360. ILONG=NBEL1*NBNN1
  361. CNDTN=CMPINT(MAPOIN.NUM(1,1),IPT3.NUM(1,1),ILONG)
  362. ELSE
  363. CNDTN=.FALSE.
  364. ENDIF
  365. ELSE IF(NBEL1.EQ.NBEL2 .AND. NBEL1.EQ.0) THEN
  366. C ... Le cas où les deux maillages sont composés ...
  367. NBS1=MAPOIN.LISOUS(/1)
  368. NBS2= IPT3.LISOUS(/1)
  369. IF(NBS1.EQ.NBS2) THEN
  370. CNDTN=.TRUE.
  371. DO 1200 I=1,NBS1
  372. IPT10=MAPOIN.LISOUS(I)
  373. IPT11= IPT3.LISOUS(I)
  374. SEGACT IPT10
  375. SEGACT IPT11
  376. IF((IPT10.NUM(/1).EQ.IPT11.NUM(/1)) .AND.
  377. & (IPT10.NUM(/2).EQ.IPT11.NUM(/2)) .AND.
  378. & (IPT10.ITYPEL .EQ.IPT11.ITYPEL) ) THEN
  379. ILONG=IPT10.NUM(/1)*IPT10.NUM(/2)
  380. CNDTN=CNDTN.AND.CMPINT(IPT10.NUM(1,1),
  381. & IPT11.NUM(1,1),ILONG)
  382. ELSE
  383. CNDTN=.FALSE.
  384. ENDIF
  385. SEGDES IPT10
  386. SEGDES IPT11
  387. 1200 CONTINUE
  388. ELSE
  389. CNDTN=.FALSE.
  390. ENDIF
  391. ELSE
  392. C ... Dans le cas où NBEL1 n'est pas egal à NBEL2 il est peu
  393. C probable quoique pas exclu que les deux maillages soient
  394. C égaux, on met donc CoNDiTioN à FAUX ...
  395. CNDTN=.FALSE.
  396. ENDIF
  397. SEGDES MAPOIN
  398. SEGDES IPT3
  399. ELSE
  400. CNDTN=.FALSE.
  401. ENDIF
  402.  
  403. IF(CNDTN) THEN
  404. NNDS=0
  405. ELSE
  406. C ... IPT4 = ici à la différence symétrique du MAPOIN et du support du CHPOINT ...
  407. CALL ECROBJ('MAILLAGE',MAPOIN)
  408. CALL ECROBJ('MAILLAGE',IPT3)
  409. CALL PRDIFF
  410. CALL LIROBJ('MAILLAGE',IPT4,1,IRETOU)
  411. IF(IERR.NE.0) GOTO 9999
  412.  
  413. CALL ECROBJ('MAILLAGE',IPT4)
  414. CALL NBNO
  415. CALL LIRENT(NNDS,1,IRETOU)
  416. IF(IERR.NE.0) GOTO 9999
  417. ENDIF
  418.  
  419. C ... IPT4 = intersection du MAPOIN et du support du CHPOINT ...
  420. IF(NNDS.EQ.NBNMAP+NNSCHP) THEN
  421. IPT4=0
  422. NBNIN4=0
  423. ELSE
  424. CALL ECROBJ('MAILLAGE',MAPOIN)
  425. CALL ECROBJ('MAILLAGE',IPT3)
  426. CALL INTERS
  427. CALL LIROBJ('MAILLAGE',IPT4,1,IRETOU)
  428. IF(IERR.NE.0) GOTO 9999
  429.  
  430. C ... NBNIN4 = NomBre de Noeuds de l'INtersection ipt4 ...
  431. CALL ECROBJ('MAILLAGE',IPT4)
  432. CALL NBNO
  433. CALL LIRENT(NBNIN4,1,IRETOU)
  434. IF(IERR.NE.0) GOTO 9999
  435. ENDIF
  436.  
  437. IF(NBNIN4.EQ.0) THEN
  438. C ... Quand NBNIN4=0 -> cas No 1 ...
  439. SORCHP=.FALSE.
  440. CALL ERREUR(-297)
  441. CALL ERREUR(-296)
  442. ELSE IF(NBNIN4.EQ.NBNMAP) THEN
  443. C ... Si NBNIN4=NBNMAP (cas 2), il faut réduire le CHPOINT sur le maillage ...
  444. CALL REDUIR(MCHPOI,MAPOIN,IRETOU)
  445. IF(IRETOU.EQ.0) THEN
  446. GOTO 9999
  447. ELSE
  448. MCHPOI=IRETOU
  449. ENDIF
  450. ELSE IF (NBNIN4.EQ.NNSCHP) THEN
  451. C ... Cas No 4 - le support du CHPOINT est entièrement contenu dans le
  452. C maillage, donc on ne fait rien ...
  453. ELSE
  454. C ... Sinon, c'est le cas 3, il faut donc "aggrandir" le CHPOINT,
  455. C en fait on va le réduire sur l'intersection IPT4, ceci pour
  456. C éliminer les composantes dont le support est en dehors du maillage ...
  457. CALL REDUIR(MCHPOI,IPT4,IRETOU)
  458. IF(IRETOU.EQ.0) THEN
  459. GOTO 9999
  460. ELSE
  461. MCHPOI=IRETOU
  462. ENDIF
  463. ENDIF
  464.  
  465. ENDIF
  466.  
  467. C ... Puisqu'on ne sort que certains noeuds il faut transformer les
  468. C connectivités, pour ceci on se servira du SEGMENT IEQUIV ...
  469.  
  470. C ... Recherche des numéros maxi et mini des noeuds dont on a besoin ...
  471.  
  472. SEGACT MAPOIN
  473. NBELEM=MAPOIN.NUM(/2)
  474. NBNN=MAPOIN.NUM(/1)
  475. IF(NBELEM.EQ.NBNMAP) THEN
  476.  
  477. IF(NBNN.NE.1) GOTO 9999
  478. IPTMIN=MAPOIN.NUM(1,1)
  479. IPTMAX=MAPOIN.NUM(1,1)
  480. DO 1500 I=1,NBELEM
  481. IF(MAPOIN.NUM(1,I).LT.IPTMIN) IPTMIN=MAPOIN.NUM(1,I)
  482. IF(MAPOIN.NUM(1,I).GT.IPTMAX) IPTMAX=MAPOIN.NUM(1,I)
  483. 1500 CONTINUE
  484.  
  485. ELSE IF(NBELEM.EQ.0) THEN
  486.  
  487. NBSOUS=MAPOIN.LISOUS(/1)
  488. DO 1505 I=1,NBSOUS
  489. IPT5=LISOUS(I)
  490. SEGACT IPT5
  491. NBNTMP=IPT5.NUM(/1)
  492. NBETMP=IPT5.NUM(/2)
  493. IF(NBNTMP.NE.1) GOTO 9999
  494. IF(I.EQ.1) THEN
  495. IPTMIN=IPT5.NUM(1,1)
  496. IPTMAX=IPT5.NUM(1,1)
  497. ENDIF
  498. DO 1506 J=1,NBETMP
  499. IF(IPT5.NUM(1,J).LT.IPTMIN) IPTMIN=IPT5.NUM(1,J)
  500. IF(IPT5.NUM(1,J).GT.IPTMAX) IPTMAX=IPT5.NUM(1,J)
  501. 1506 CONTINUE
  502. SEGDES IPT5
  503. 1505 CONTINUE
  504.  
  505. ENDIF
  506.  
  507. C ... Initialisation du segment IEQUIV ...
  508.  
  509. IECART=IPTMAX-IPTMIN+1
  510. SEGINI IEQUIV
  511.  
  512. C ... et son remplissage ...
  513.  
  514. IF(NBELEM.EQ.NBNMAP) THEN
  515.  
  516. DO 1510 I=1,NBELEM
  517. LEQUIV(MAPOIN.NUM(1,I)-IPTMIN+1)=I
  518. 1510 CONTINUE
  519.  
  520. ELSE IF(NBELEM.EQ.0) THEN
  521.  
  522. NBSOUS=MAPOIN.LISOUS(/1)
  523. K=0
  524. DO 1515 I=1,NBSOUS
  525. IPT5=LISOUS(I)
  526. SEGACT IPT5
  527. NBNTMP=IPT5.NUM(/1)
  528. NBETMP=IPT5.NUM(/2)
  529. IF(NBNTMP.NE.1) GOTO 9999
  530. DO 1516 J=1,NBETMP
  531. K=K+1
  532. C ... Ici je suppose que chaque point n'est représenté qu'une
  533. C seule fois dans MAPOIN. En conséquence, dans la ligne en dessous
  534. C je n'ai pas mis de test si LEQUIV(IPT5.NUM(1,J)-IPTMIN+1) est
  535. C différent de zéro ...
  536. LEQUIV(IPT5.NUM(1,J)-IPTMIN+1)=K
  537. 1516 CONTINUE
  538. SEGDES IPT5
  539. 1515 CONTINUE
  540.  
  541. ENDIF
  542.  
  543. C ... Préparation de la première ligne du fichier AVS, on connaît déjà
  544. C les nombres de noeuds et d'éléments, il manque les nombres de composantes
  545. C du CHPOINT et du MCHAML (s'ils sont présents) ...
  546.  
  547. C ... On commence par le MCHAML ...
  548. IF(SORMCH) THEN
  549. CALL EXTR17(MCHELM,NCMCHA)
  550. SEGACT NCMCHA
  551. NBCMCH=NCMCHA.MOTS(/2)
  552. ccc SEGDES NCMCHA
  553. ELSE
  554. NBCMCH=0
  555. ENDIF
  556.  
  557. C ... Et ensuite c'est le tour du CHPOINT ...
  558. IF(SORCHP) THEN
  559. CALL EXTR11(MCHPOI,NCCHPO)
  560. SEGACT NCCHPO
  561. NBCCHP=NCCHPO.MOTS(/2)
  562. ccc SEGDES NCCHPO
  563. ELSE
  564. NBCCHP=0
  565. ENDIF
  566.  
  567. C ... Maintenant on va remplir des segments contenant toutes les valeurs
  568. C et composantes du MCHAML et du CHPOINT en un seul morceau ...
  569.  
  570. C ... On commence par le MCHAML ...
  571. C ... On va vérifier aussi qu'il y a une seule valeur par élément ...
  572. IF(SORMCH) THEN
  573. C ... On ne le met pas à zero car toutes les cases vont etre remplies ...
  574. SEGINI VALMCH
  575. SEGACT MCHELM
  576. N1=ICHAML(/1)
  577. C ... IDECNE = DECalage des Numéros d'Eléments ...
  578. IDECNE=0
  579. C ... Boucle sur les zones élémentaires, dont chacune possède son ...
  580. DO 1600 I=1,N1
  581. C ... segment MCHAML ...
  582. MCHAML=ICHAML(I)
  583. SEGACT MCHAML
  584. N2=IELVAL(/1)
  585. C ... et le maillage support ...
  586. IPT6=IMACHE(I)
  587. CALL ECROBJ('MAILLAGE',IPT6)
  588. CALL NBEL
  589. CALL LIRENT(NELSMC,1,IRETOU)
  590. IF(IERR.NE.0) GOTO 9999
  591. C ... Boucle sur les composantes du MCHAML ...
  592. DO 1610 J=1,N2
  593. MOCOMP=NOMCHE(J)
  594. IF(TYPCHE(J).NE.'REAL*8 ') THEN
  595. MOTERR(1:8)=MOCOMP
  596. CALL ERREUR(679)
  597. GOTO 10000
  598. ENDIF
  599. C ... Maintenant on cherche la position du nom de la composante No J
  600. C dans NCMCHA ...
  601. DO 1620 K=1,NBCMCH
  602. IF(NCMCHA.MOTS(K).EQ.MOCOMP) GOTO 1630
  603. 1620 CONTINUE
  604. 1630 CONTINUE
  605. C ... K est maintenant le numéro de la composante J dans NCMCHA ...
  606. MELVAL=IELVAL(J)
  607. SEGACT MELVAL
  608. N1PTEL=VELCHE(/1)
  609. N1EL =VELCHE(/2)
  610. IF(N1PTEL.NE.1) THEN
  611. CALL ERREUR(707)
  612. GOTO 10000
  613. ENDIF
  614. C ... Si N1EL==1 c'est un champ constant ...
  615. IF(N1EL.EQ.1) THEN
  616. DO 1680 L=1,NELSMC
  617. RVAMCH(K,L+IDECNE)=VELCHE(1,1)
  618. 1680 CONTINUE
  619. ELSE IF(N1EL.EQ.NELSMC) THEN
  620. DO 1660 L=1,NELSMC
  621. RVAMCH(K,L+IDECNE)=VELCHE(1,L)
  622. 1660 CONTINUE
  623. ELSE
  624. MOTERR(1:8)='MCHAML '
  625. CALL ERREUR(708)
  626. GOTO 10000
  627. ENDIF
  628. SEGDES MELVAL
  629. 1610 CONTINUE
  630. IDECNE=IDECNE+NELSMC
  631. SEGDES MCHAML
  632. 1600 CONTINUE
  633. SEGDES MCHELM
  634. ENDIF
  635.  
  636. C ... Remplissage des valeurs du CHPOINT ...
  637. IF(SORCHP) THEN
  638.  
  639. SEGINI VALCHP
  640. CDEBUG WRITE(IOIMP,*) 'NBCCHP = ',NBCCHP
  641. CDEBUG WRITE(IOIMP,*) 'NBNMAP = ',NBNMAP
  642. DO 1700 I=1,NBCCHP
  643. DO 1701 J=1,NBNMAP
  644. RVACHP(I,J)=0.D0
  645. 1701 CONTINUE
  646. 1700 CONTINUE
  647.  
  648. SEGACT MCHPOI
  649. NSOUPO=IPCHP(/1)
  650. C ... IDECNP = DECalage des Numéros de Points ...
  651. C inutile IDECNP=0
  652. C ... Boucle sur les sous-zones du CHPOINT dont chacune est définie par ...
  653. DO 1710 I=1,NSOUPO
  654. C ... un segment MSOUPO ...
  655. CDEBUG WRITE(IOIMP,*) 'Sous-zone No ',I
  656. MSOUPO=IPCHP(I)
  657. SEGACT MSOUPO
  658. NC=NOHARM(/1)
  659. C ... son support géométrique ...
  660. IPT7=IGEOC
  661. CALL NOMOBJ('MAILLAGE','MASUPCHP',IPT7)
  662. CALL ECROBJ('MAILLAGE',IPT7)
  663. CALL NBNO
  664. CALL LIRENT(NPOSCH,1,IRETOU)
  665. IF(IERR.NE.0) GOTO 9999
  666. SEGACT IPT7
  667. CDEBUG WRITE(IOIMP,*) ' -> ',NPOSCH,' noeuds'
  668. CDEBUG WRITE(IOIMP,*) 'IPT7 : ITYPEL = ',IPT7.ITYPEL
  669. CDEBUG WRITE(IOIMP,*) 'IPT7 : NBELEM = ',IPT7.NUM(/2)
  670. C ... et ses valeurs ...
  671. MPOVAL=IPOVAL
  672. SEGACT MPOVAL
  673. N=VPOCHA(/1)
  674. IF(N.NE.NPOSCH) THEN
  675. MOTERR(1:8)='CHPOINT '
  676. CALL ERREUR(708)
  677. GOTO 10000
  678. ENDIF
  679. C ... Boucle sur les composantes du CHPOINT ...
  680. DO 1720 J=1,NC
  681. C ... dont on cherche la place dans NCCHPO ...
  682. MOCOMP=NOCOMP(J)
  683. DO 1730 K=1,NBCCHP
  684. IF(NCCHPO.MOTS(K).EQ.MOCOMP) GOTO 1740
  685. 1730 CONTINUE
  686. 1740 CONTINUE
  687. C ... Maintenant K pointe le NOCOMP(J) dans NCCHPO ...
  688. CDEBUG WRITE(IOIMP,*) 'Composante No',J,' correspond à K = ',K
  689. C ... Maintenant il faut parcourir les noeuds du support du CHPOINT ...
  690. C ... Si ce support est un maillage élémentaire, ceci est simple ...
  691. IF(IPT7.NUM(/2).GT.0) THEN
  692. CDEBUG WRITE(IOIMP,*) 'Support = Maillage élémentaire'
  693. DO 1750 L=1,N
  694. C ... ça ne marchera pas dans le cas général, car l'ordre des n'est pas
  695. C forcément le meme dans le MAPOIN et dans le support du CHPOINT ...
  696. C RVACHP(K,L+IDECNP)=VPOCHA(L,J) ...
  697. C ... il faut chercher la position du noeud ...
  698. NNSCHP=IPT7.NUM(1,L)
  699. IF(NNSCHP.GE.IPTMIN.AND.NNSCHP.LE.IPTMAX) THEN
  700. NNMAPO=LEQUIV(NNSCHP-IPTMIN+1)
  701. ELSE
  702. NNMAPO=0
  703. ENDIF
  704. CDEBUG WRITE(IOIMP,*) 'Noeud ',L,' = ',NNSCHP,' -> NNMAPO = ',NNMAPO
  705. IF(NNMAPO.NE.0) RVACHP(K,NNMAPO)=VPOCHA(L,J)
  706. 1750 CONTINUE
  707. C ... Sinon on va s'amuser ...
  708. ELSE
  709. CDEBUG WRITE(IOIMP,*) 'Support = Maillage composé'
  710. L=0
  711. NBSOUS=IPT7.LISOUS(/1)
  712. DO 1765 M=1,NBSOUS
  713. IPT8=IPT7.LISOUS(M)
  714. SEGACT IPT8
  715. NBELEM=IPT8.NUM(/2)
  716. CDEBUG WRITE(IOIMP,*) 'IPT8 : ITYPEL = ',IPT8.ITYPEL
  717. CDEBUG WRITE(IOIMP,*) 'IPT8 : NBELEM = ',NBELEM
  718. DO 1770 MM=1,NBELEM
  719. L=L+1
  720. NNSCHP=IPT8.NUM(1,MM)
  721. IF(NNSCHP.GE.IPTMIN.AND.NNSCHP.LE.IPTMAX) THEN
  722. NNMAPO=LEQUIV(NNSCHP-IPTMIN+1)
  723. ELSE
  724. NNMAPO=0
  725. ENDIF
  726. CDEBUG WRITE(IOIMP,*) 'Noeud ',L,' = ',NNSCHP,' -> NNMAPO = ',NNMAPO
  727. IF(NNMAPO.NE.0) RVACHP(K,NNMAPO)=VPOCHA(L,J)
  728. 1770 CONTINUE
  729. SEGDES IPT8
  730. 1765 CONTINUE
  731. ENDIF
  732. 1720 CONTINUE
  733. C inutile IDECNP=IDECNP+NPOSCH
  734. SEGDES MPOVAL
  735. SEGDES MSOUPO
  736. SEGDES IPT7
  737. 1710 CONTINUE
  738. SEGDES MCHPOI
  739.  
  740. ENDIF
  741.  
  742. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  743. C ... Sortie au format AVS ...
  744. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  745.  
  746.  
  747. * Récupération du nom du fichier et ajout de l'extension au
  748. * nom du fichier
  749. INQUIRE(UNIT=IOPER,OPENED=ZOPEN)
  750. IF (.NOT.ZOPEN) THEN
  751. CALL ERREUR(-212)
  752. WRITE(IOIMP,*) '(via OPTI "SORT")'
  753. MOTERR(1:8)='AVS '
  754. CALL ERREUR(705)
  755. RETURN
  756. ENDIF
  757.  
  758. * Quel est le nom du fichier ouvert ?
  759. INQUIRE(UNIT=IOPER,NAME=FICAVS)
  760.  
  761. * Si pas d'extension .inp, on le réouvre
  762. CALL LENCHA(FICAVS,LC)
  763. IF (FICAVS(LC-3:LC).NE.'.inp') THEN
  764. CLOSE(UNIT=IOPER,STATUS='DELETE')
  765. IF (LC+4.GT.LOCHAI) THEN
  766. write(ioimp,*) 'AVS Filename too long with extension'
  767. CALL ERREUR(1111)
  768. RETURN
  769. ENDIF
  770. FICAVS(LC+1:LC+4)='.inp'
  771. IOS=0
  772. OPEN(UNIT=IOPER,STATUS='UNKNOWN',FILE=FICAVS(1:LONG(FICAVS)),
  773. & IOSTAT=IOS,FORM='FORMATTED')
  774. ENDIF
  775.  
  776. * Pas d'option 'SUIT' => on rembobine
  777. IF (INOREW.EQ.0) REWIND IOPER
  778.  
  779. C ... Ligne de tete ...
  780. WRITE(IOPER,4000) NBNMAP,NELMAI,NBCCHP,NBCMCH,NBCGLO
  781.  
  782. C ... On active le segment MCOORD au cas ou !
  783. SEGACT,MCOORD*NOMOD
  784.  
  785. C ... Les noeuds ... MAPOIN est un MELEME de POI1
  786. SEGACT MAPOIN
  787. IDIMP1 = IDIM + 1
  788. IF (IDIM.EQ.3) THEN
  789. DO I=1,NBNMAP
  790. NUMNO=(MAPOIN.NUM(1,I)-1)*IDIMP1
  791. WRITE(IOPER,4010) I,XCOOR(NUMNO+1),XCOOR(NUMNO+2),
  792. & XCOOR(NUMNO+3)
  793. ENDDO
  794. ELSE IF (IDIM.EQ.2) THEN
  795. DO I=1,NBNMAP
  796. NUMNO=(MAPOIN.NUM(1,I)-1)*IDIMP1
  797. WRITE(IOPER,4010) I,XCOOR(NUMNO+1),XCOOR(NUMNO+2),0.D0
  798. ENDDO
  799. ELSE IF (IDIM.EQ.1) THEN
  800. DO I=1,NBNMAP
  801. NUMNO=(MAPOIN.NUM(1,I)-1)*IDIMP1
  802. WRITE(IOPER,4010) I,XCOOR(NUMNO+1),0.D0,0.D0
  803. ENDDO
  804. ENDIF
  805. SEGDES MAPOIN
  806.  
  807. C ... Le maillage ...
  808. IDECAL=0
  809. IF(EXISEL) THEN
  810. SEGACT MAELEM
  811. NBELEM=MAELEM.NUM(/2)
  812. IF(NBELEM.GT.0) THEN
  813. LESOUS = MAELEM
  814. CALL AVSMEL(LESOUS,IDECAL,1,IEQUIV,IPTMIN)
  815. ELSE
  816. NBSOUS=MAELEM.LISOUS(/1)
  817. DO 2100 I=1,NBSOUS
  818. LESOUS=MAELEM.LISOUS(I)
  819. CALL AVSMEL(LESOUS,IDECAL,I,IEQUIV,IPTMIN)
  820. 2100 CONTINUE
  821. ENDIF
  822. SEGDES MAELEM
  823. ENDIF
  824.  
  825. C ... Le CHPOINT ...
  826. IF(SORCHP) THEN
  827. C ... On commence par les noms des composantes ...
  828. WRITE(IOPER,4030) NBCCHP,(1,K=1,NBCCHP)
  829. C+DC
  830. DO 2101 I=1,NBCCHP
  831. WRITE(IOPER,4042) (NCCHPO.MOTS(I))
  832. 2101 CONTINUE
  833. C
  834. SEGSUP NCCHPO
  835.  
  836. C ... Et ensuite leurs valeurs ...
  837. DO 2200 I=1,NBNMAP
  838. WRITE(IOPER,4050) I,(RVACHP(K,I),K=1,NBCCHP)
  839. 2200 CONTINUE
  840. SEGSUP VALCHP
  841. ENDIF
  842.  
  843. C ... Le MCHAML ...
  844. IF(SORMCH) THEN
  845. C ... On commence par les noms des composantes ...
  846. WRITE(IOPER,4030) NBCMCH,(1,K=1,NBCMCH)
  847. WRITE(IOPER,4043) (NCMCHA.MOTS(I),I=1,NBCMCH)
  848. SEGSUP NCMCHA
  849.  
  850. C ... Et ensuite leurs valeurs ...
  851. DO 2300 I=1,NELMAI
  852. WRITE(IOPER,4050) I,(RVAMCH(K,I),K=1,NBCMCH)
  853. 2300 CONTINUE
  854. SEGSUP VALMCH
  855. ENDIF
  856.  
  857. C ... Le champ global ...
  858.  
  859. IF(NBCGLO.EQ.1) THEN
  860. WRITE(IOPER,4030) 1,1
  861. WRITE(IOPER,4040) 'time'
  862. WRITE(IOPER,4050) 1,VALTEM
  863. ENDIF
  864.  
  865. C ... Le ménage ...
  866.  
  867. SEGSUP IEQUIV
  868.  
  869. * Pas d'option 'SUIT' => Fermeture du fichier
  870. IF (INOREW.EQ.0) CLOSE(UNIT=IOPER)
  871.  
  872. C ... Il n'y a pas de champ global, donc ...
  873.  
  874. RETURN
  875.  
  876. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  877. C ... Fin de la partie où tout se passe bien ...
  878. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  879.  
  880. 9999 CONTINUE
  881. MOTERR(1:8)='AVS '
  882. CALL ERREUR(705)
  883.  
  884. 10000 CONTINUE
  885. IF(NCCHPO.NE.0) THEN
  886. SEGSUP NCCHPO
  887. ENDIF
  888. IF(NCMCHA.NE.0) THEN
  889. SEGSUP NCMCHA
  890. ENDIF
  891. IF(VALCHP.NE.0) THEN
  892. SEGSUP VALCHP
  893. ENDIF
  894. IF(VALMCH.NE.0) THEN
  895. SEGSUP VALMCH
  896. ENDIF
  897. IF(IEQUIV.NE.0) THEN
  898. SEGSUP IEQUIV
  899. ENDIF
  900.  
  901. RETURN
  902.  
  903. 4000 FORMAT(5I11)
  904. 4010 FORMAT(I11,3(1X,1P,1E20.13))
  905. 4020 FORMAT(2I11,' pt',I11)
  906. 4030 FORMAT(13I11)
  907. 4040 FORMAT(1X,A4,',')
  908. 4041 FORMAT(1X,A8,',')
  909. C Modif DC 12/2006 - Sortie AVS compatible PARAVIEW
  910. 4042 FORMAT(1X,A8,',1 ')
  911. 4043 FORMAT(1X,A8,',1 1')
  912. C+ Fin modif
  913. 4050 FORMAT(I11,12(1X,1P,E20.13))
  914.  
  915. END
  916.  
  917.  
  918.  

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