Télécharger opto1.eso

Retour à la liste

Numérotation des lignes :

opto1
  1. C OPTO1 SOURCE PV 22/07/28 21:15:05 11419
  2. SUBROUTINE OPTO1(ITOPO,IELEM,IPVIRT,ICMETR,
  3. $ ITOPA,ICMETA)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. IMPLICIT INTEGER (I-N)
  6. C***********************************************************************
  7. C NOM : OPTO1
  8. C DESCRIPTION : Une implémentation de l'amélioration d'une topologie
  9. C autour d'un élément. On reprend OPTITOPO pour le corps
  10. C du programme. On reprend l'extraction et la topologie inverse de
  11. C EXTO. Le point crucial sera d'implémenter la modification de la
  12. C topologie : enlever les anciens éléments et mettre les nouveaux.
  13. C
  14. C
  15. C Ici, on fait quelques tests, on passe les entrées en numérotation
  16. C locale basée sur celle de ITOPO, on crée également un MCOORD local
  17. C avant de passer à OPTO2. En effet, OPTO2 sera suceptible de créer
  18. C des noeuds
  19. C
  20. C En sortie, on repasse en numérotation globale, on inclue les
  21. C éventuels nouveaux noeuds créés dans OPTO2 dans le MCOORD global.
  22. C
  23. C La programmation est inspirée de demete.eso et reprise de
  24. C exto1.eso
  25. C
  26. C
  27. C LANGAGE : ESOPE
  28. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SEMT/LTA)
  29. C mél : gounand@semt2.smts.cea.fr
  30. C***********************************************************************
  31. C APPELES : OPTO2
  32. C APPELES (E/S) :
  33. C APPELES (BLAS) :
  34. C APPELES (CALCUL) :
  35. C APPELE PAR : PROPTO
  36. C***********************************************************************
  37. C SYNTAXE GIBIANE :
  38. C ENTREES :
  39. C ENTREES/SORTIES :
  40. C SORTIES :
  41. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  42. C***********************************************************************
  43. C VERSION : v1, 06/10/2017, version initiale
  44. C HISTORIQUE : v1, 06/10/2017, création
  45. C HISTORIQUE :
  46. C HISTORIQUE :
  47. C***********************************************************************
  48. -INC PPARAM
  49. -INC CCOPTIO
  50. -INC TMATOP2
  51. -INC SMELEME
  52. * Numerotation globale
  53. POINTEUR ITOPO.MELEME,IELEM.MELEME
  54. POINTEUR ITOPA.MELEME
  55. ** Numerotation locale
  56. POINTEUR JTOPO.MELEME
  57. POINTEUR JELEM.MELEME
  58. -INC SMCHPOI
  59. POINTEUR ICMETR.MCHPOI
  60. POINTEUR ICMETA.MCHPOI
  61. -INC SMCOORD
  62. * Numerotation globale
  63. POINTEUR ICOORD.MCOORD
  64. ** Numerotation locale
  65. POINTEUR JCOORD.MCOORD
  66. -INC TMATOP1
  67. *-INC STOPINV
  68. *-INC STRAVJ
  69. *-INC SMETRIQ
  70. POINTEUR JCMETR.METRIQ
  71. -INC TMTRAV
  72. SEGMENT MISDEF
  73. INTEGER ISDEF(NNIN,NNNOE)
  74. ENDSEGMENT
  75. -INC SMLMOTS
  76. POINTEUR JNMETR.MLMOTS
  77. *
  78. * Passage de numerotation globale -> locale
  79. * et locale -> globale
  80. SEGMENT ICPR(XCOOR(/1)/(IDIM+1))
  81. SEGMENT IDCP(NPTINI)
  82. * integer oooval
  83. logical lnul
  84. CHARACTER*24 FORMA
  85. CHARACTER*4 MOT
  86. INTEGER IMPR,IRET
  87. * Noms de composantes pour la métrique
  88.  
  89. *
  90. * Executable statements
  91. *
  92. impr=0
  93. IF (IMPR.GE.5) WRITE(IOIMP,*) 'Entrée dans opto1.eso'
  94. IDIMP=IDIM+1
  95. ICOORD=MCOORD
  96. SEGACT MCOORD
  97. * write(ioimp,*) 'opto1 debut : nbpts, xcoor=',nbpts,xcoor(/1)/(idim
  98. * $ +1)
  99. IBPTS=NBPTS
  100. * On se simplifie la vie en ne considérant que des maillages simples
  101. * call ecmai1(itopo,0)
  102. SEGACT ITOPO
  103. NBSOUS=ITOPO.LISOUS(/1)
  104. NBNN=ITOPO.NUM(/1)
  105. IF (NBSOUS.NE.0.OR.NBNN.NE.IDIMP) THEN
  106. WRITE(IOIMP,*)
  107. $ 'Topologie : pas un maillage de simplex volumiques'
  108. GOTO 9999
  109. ENDIF
  110. SEGACT IELEM
  111. NBSOUS=IELEM.LISOUS(/1)
  112. NBELEM=IELEM.NUM(/2)
  113. * IF (NBSOUS.NE.0.OR.NBELEM.NE.1) THEN
  114. IF (NBSOUS.NE.0) THEN
  115. * WRITE(IOIMP,*) 'Deuxieme maillage : pas un element unique'
  116. WRITE(IOIMP,*) 'Deuxieme maillage : pas un maillage simple'
  117. GOTO 9999
  118. ENDIF
  119. * Correspondances de numérotation
  120. SEGINI ICPR
  121. IK=0
  122. DO 23 IEL=1,ITOPO.NUM(/2)
  123. DO 230 INO=1,ITOPO.NUM(/1)
  124. IP=ITOPO.NUM(INO,IEL)
  125. IF (ICPR(IP).EQ.0) THEN
  126. IK=IK+1
  127. ICPR(IP)=IK
  128. ENDIF
  129. 230 CONTINUE
  130. 23 CONTINUE
  131. NBLINI=ITOPO.NUM(/2)
  132. NPTINI=IK
  133. SEGINI IDCP
  134. NPTBAS=XCOOR(/1)/IDIMP
  135. DO 500 I=1,NPTBAS
  136. if (icpr(i).ne.0) IDCP(ICPR(I))=I
  137. 500 CONTINUE
  138. if (IMPR.GE.6) then
  139. write(ioimp,*) 'Nb noeud globaux,locaux=',NPTBAS,IK
  140. * write(ioimp,*) 'ICPR'
  141. * write(ioimp,187) (ICPR(I),I=1,ICPR(/1))
  142. write(ioimp,*) 'IDCP'
  143. write(ioimp,187) (IDCP(I),I=1,IDCP(/1))
  144. endif
  145. IF (IMPR.GE.3) THEN
  146. write(ioimp,*) 'opto1.eso : topologie en coord globales : '
  147. call ecmai1(itopo,0)
  148. segact itopo*mod
  149. ENDIF
  150. *
  151. IF (IDIM.EQ.2) THEN
  152. NELMOY=15
  153. NPOMOY=10
  154. ELSEIF (IDIM.EQ.3) THEN
  155. NELMOY=40
  156. NPOMOY=20
  157. ELSE
  158. write(ioimp,*) 'idim=',idim
  159. goto 9999
  160. ENDIF
  161.  
  162. SEGINI TRAVJ
  163. NVINI=NBLINI
  164. NVCOU=NBLINI
  165. NVMAX=NBLINI+MAX(NELMOY,NBLINI)
  166. NPINI=NPTINI
  167. NPCOU=NPTINI
  168. NPMAX=NPTINI
  169. *ijob IF (IJOB.NE.0) NPMAX=NPMAX+MAX(NPOMOY,NPTINI)
  170. IF (IAJNO.NE.0) NPMAX=NPMAX+MAX(NPOMOY,NPTINI)
  171. *
  172. * Melemes en coordonnées locales
  173. * Topologie
  174. NBELEM=travj.NVMAX
  175. NBNN=IDIMP
  176. NBSOUS=0
  177. NBREF=0
  178. SEGINI,JTOPO
  179. JTOPO.ITYPEL=ITOPO.ITYPEL
  180. TRAVJ.TOPO=JTOPO
  181. DO 33 IEL=1,travj.nvcou
  182. DO 330 INO=1,IDIMP
  183. IP=ITOPO.NUM(INO,IEL)
  184. JP=ICPR(IP)
  185. IF (JP.NE.0) THEN
  186. JTOPO.NUM(INO,IEL)=JP
  187. ELSE
  188. WRITE(IOIMP,*) 'Erreur de programmation'
  189. GOTO 9999
  190. ENDIF
  191. 330 CONTINUE
  192. 33 CONTINUE
  193. * Eventuellement, IELEM=ITOP donc à désactiver ici
  194. SEGDES IELEM
  195. SEGDES ITOPO
  196. IF (IMPR.GE.4) THEN
  197. write(ioimp,*) 'opto1.eso : topologie en coord locales : '
  198. call ecmai1(jtopo,0)
  199. segact jtopo*mod
  200. ENDIF
  201.  
  202. * Noeud virtuel en coordonnées locales
  203. IF (IPVIRT.NE.0) THEN
  204. JPVIRT=ICPR(IPVIRT)
  205. *! Ceci peut se produire quand on veut conserver le bord total
  206. *! On ne l'interdit plus
  207. *! IF (JPVIRT.EQ.0) THEN
  208. *! write(ioimp,*)
  209. *! $ 'Noeud virtuel non inclus dans la topologie ?'
  210. *! goto 9999
  211. *! ENDIF
  212. ELSE
  213. JPVIRT=0
  214. ENDIF
  215. TRAVJ.PVIRT=JPVIRT
  216. IF (IMPR.GE.4) THEN
  217. write(ioimp,*) 'opto1.eso : noeud virtuel en coord locales : '
  218. $ ,JPVIRT
  219. ENDIF
  220. * Element autour duquel on extrait
  221. * write(ioimp,*) 'opto1.eso : element en coord globales : '
  222. * call ecmai1(ielem,0)
  223. * segact ielem*mod
  224. SEGINI,JELEM=IELEM
  225. DO 43 IEL=1,JELEM.NUM(/2)
  226. DO 430 INO=1,JELEM.NUM(/1)
  227. IP=JELEM.NUM(INO,IEL)
  228. JP=ICPR(IP)
  229. * Il faudra gérer le cas où certains noeuds de JELEM sont nuls. Voir
  230. * dans EXTO3.
  231. * IF (JP.NE.0) THEN
  232. JELEM.NUM(INO,IEL)=JP
  233. * ELSE
  234. IF (JP.EQ.0) THEN
  235. WRITE(IOIMP,*)
  236. $ 'Element fourni non inclus dans la topologie'
  237. * Pour avoir un comportement identique à la version Gibiane de
  238. * EXTOPLOC, on annule l'élément. La gestion des éléments nuls est
  239. * faite dans exto3.eso
  240. DO INOO=1,JELEM.NUM(/1)
  241. JELEM.NUM(INOO,IEL)=0
  242. ENDDO
  243. GOTO 43
  244. ENDIF
  245. * GOTO 9999
  246. * ENDIF
  247. 430 CONTINUE
  248. 43 CONTINUE
  249. IF (IMPR.GE.6) THEN
  250. write(ioimp,*) 'opto1.eso : element en coord locales : '
  251. call ecmai1(jelem,0)
  252. segact jelem*mod
  253. ENDIF
  254. * debug
  255. impr=0
  256. * Passage des coordonnées en locale
  257. * NBPTS=NPTINI
  258. NBPTS=travj.NPMAX
  259. SEGINI,JCOORD
  260. TRAVJ.COORD=JCOORD
  261. DO 53 IPL=1,travj.npcou
  262. IREFL=IDIMP*(IPL-1)
  263. IP=IDCP(IPL)
  264. IREF=IDIMP*(IP-1)
  265. DO 530 IC=1,IDIMP
  266. JCOORD.XCOOR(IREFL+IC)=XCOOR(IREF+IC)
  267. 530 CONTINUE
  268. 53 CONTINUE
  269. * Passage de la métrique en local
  270. *
  271. IF (ICMETR.NE.0) THEN
  272. * Définition des noms de composantes
  273. JGN=4
  274. JGM=0
  275. IF (IMET.EQ.3) JGM=1
  276. * On a enlevé le cas orthotrope
  277. * IF (IMET.EQ.4) JGM=IDIM
  278. IF (IMET.EQ.4) JGM=IDIM*(IDIM+1)/2
  279. SEGINI JNMETR
  280. DO I=1,JGM
  281. JNMETR.MOTS(I)='G '
  282. ENDDO
  283. * On a enlevé le cas orthotrope
  284. * IF (IMET.EQ.4) THEN
  285. * DO I=1,IDIM
  286. * WRITE(JNMETR.MOTS(I)(2:2),FMT='(I1)') I
  287. * ENDDO
  288. * ELSEIF (IMET.EQ.5) THEN
  289. IF (IMET.EQ.4) THEN
  290. idx=0
  291. DO I=1,IDIM
  292. DO J=1,I
  293. idx=idx+1
  294. WRITE(JNMETR.MOTS(idx)(2:2),FMT='(I1)') I
  295. WRITE(JNMETR.MOTS(idx)(3:3),FMT='(I1)') J
  296. ENDDO
  297. ENDDO
  298. ENDIF
  299. *dbg WRITE (IOIMP,2019) (JNMETR.MOTS(I),I=1,JNMETR.MOTS(/2))
  300. *dbg 2019 FORMAT (20(2X,A4) )
  301. NNIN=JNMETR.MOTS(/2)
  302. NNNOE=travj.NPCOU
  303. if (iveri.ge.1) SEGINI MISDEF
  304. NNNOE=travj.NPMAX
  305. SEGINI JCMETR
  306. MCHPOI=ICMETR
  307. SEGACT MCHPOI
  308. NSOUPO=IPCHP(/1)
  309. DO ISOUPO=1,NSOUPO
  310. MSOUPO=IPCHP(ISOUPO)
  311. SEGACT MSOUPO
  312. NC=NOCOMP(/2)
  313. MELEME=IGEOC
  314. MPOVAL=IPOVAL
  315. SEGACT MELEME
  316. SEGACT MPOVAL
  317. N=VPOCHA(/1)
  318. DO IC=1,NC
  319. ININ=0
  320. DO JNIN=1,NNIN
  321. IF (NOCOMP(IC).EQ.JNMETR.MOTS(JNIN)) THEN
  322. ININ=JNIN
  323. GOTO 11
  324. ENDIF
  325. ENDDO
  326. 11 CONTINUE
  327. IF (ININ.NE.0) THEN
  328. DO I=1,N
  329. INNOE=ICPR(NUM(1,I))
  330. IF (INNOE.NE.0) THEN
  331. if (iveri.ge.1) ISDEF(ININ,INNOE)=1
  332. JCMETR.XIN(ININ,INNOE)=VPOCHA(I,IC)
  333. ENDIF
  334. ENDDO
  335. ENDIF
  336. ENDDO
  337. SEGDES MPOVAL
  338. SEGDES MELEME
  339. SEGDES MSOUPO
  340. ENDDO
  341. SEGDES MCHPOI
  342. if (iveri.ge.1) then
  343. * Vérification que la métrique a été définie sur tous les noeuds et
  344. * toutes les composantes
  345. DO J=1,ISDEF(/2)
  346. IF (J.NE.JPVIRT) THEN
  347. DO I=1,ISDEF(/1)
  348. IF (ISDEF(I,J).NE.1) THEN
  349. MOT=JNMETR.MOTS(I)
  350. INOD=IDCP(J)
  351. write(ioimp,*)
  352. $ 'Metrique non definie pour la composante '
  353. $ ,MOT,' au noeud ',INOD
  354. GOTO 9999
  355. ENDIF
  356. ENDDO
  357. ENDIF
  358. ENDDO
  359. SEGSUP MISDEF
  360. endif
  361. *dbg write(ioimp,*) 'Inimetr ok'
  362. ELSE
  363. JNMETR=0
  364. JCMETR=0
  365. ENDIF
  366. TRAVJ.NMETR=JNMETR
  367. TRAVJ.CMETR=JCMETR
  368. *tst WRITE(IOIMP,185) 'SEGMENT JCOORD ',JCOORD
  369. *tst WRITE(FORMA,FMT='("(1(",I1,"(1PG12.5,2X)))")') IDIMP
  370. *tst write(ioimp,*) 'forma=',forma
  371. *tst write(ioimp,*) 'XCOOR'
  372. *tst write(ioimp,forma) (jcoord.xcoor(I),I=1,jcoord.xcoor(/1))
  373.  
  374. * La numérotation globale devient la locale dans ce bloc !!!
  375. MCOORD=JCOORD
  376. * Tous les arguments sont potentiellement des entrées-sorties
  377. * in EXTO2 SEGINI JTOPA
  378. * write(ioimp,*) ' opto1 : avant opto2 =',OOOVAL(2,1)
  379. CALL OPTO2(TRAVJ,JELEM)
  380. * write(ioimp,*) ' opto1 : apres opto2 =',OOOVAL(2,1)
  381. * Point de branchement si erreur pendant le bloc en numérotation locale
  382. 555 CONTINUE
  383. * On rétablit la numérotation globale originelle et on rajoute les
  384. * noeuds nouvellement créés
  385. * ! Attention, il faut aussi rétablir le NBPTS suite aux changements
  386. * ! de Pierre dans SMCOORD
  387. NBPTS=IBPTS
  388. MCOORD=ICOORD
  389. * On part en erreur après le rétablissement du MCOORD global
  390. IF (IERR.NE.0) RETURN
  391. * NPTFIN=JCOORD.XCOOR(/1)/IDIMP
  392. NPTFIN=travj.npcou
  393. if (jchang.eq.0) then
  394. ITOPA=ITOPO
  395. ICMETA=ICMETR
  396. IF (NPTINI.NE.NPTFIN) THEN
  397. write(ioimp,*) nptfin-nptini,' nouveaux noeuds crees'
  398. write(ioimp,*) 'pas normal car topologie inchangee'
  399. ENDIF
  400. else
  401. IF (NPTINI.NE.NPTFIN) THEN
  402. SEGACT MCOORD*MOD
  403. if (impr.ge.4)
  404. $ write(ioimp,*) nptfin-nptini,' nouveaux noeuds crees'
  405. NBPTA=NPTBAS
  406. NBPTS=NBPTA+NPTFIN-NPTINI
  407. SEGADJ MCOORD
  408. nnonul=0
  409. DO 5000 I=NPTINI+1,NPTFIN
  410. lnul=.true.
  411. DO 5010 J=1,IDIMP
  412. XCOOR(NBPTA*IDIMP+J)=JCOORD.XCOOR((I-1)*IDIMP+J)
  413. lnul=lnul.and.(XCOOR(NBPTA*IDIMP+J).EQ.0.D0)
  414. 5010 CONTINUE
  415. NBPTA=NBPTA+1
  416. if (lnul) nnonul=nnonul+1
  417. 5000 CONTINUE
  418. if (iveri.ge.1.and.nnonul.ne.0) then
  419. write(ioimp,*) '!!! ',nnonul
  420. $ ,' nouveaux noeuds nuls crees'
  421. * goto 9999
  422. endif
  423. IF (JCMETR.NE.0) THEN
  424. * La nouvelle métrique
  425. NNIN=JCMETR.XIN(/1)
  426. NNNOE=TRAVJ.NPCOU
  427. *dbg npmax=jcmetr.xin(/2)
  428. *dbg write(ioimp,*) 'nnin,nnnoe,npmax=',nnin,nnnoe,npmax
  429. *
  430. NSOUPO=1
  431. NAT=1
  432. SEGINI,MCHPOI
  433. IFOPOI=IFOUR
  434. JATTRI(1)=0
  435. MTYPOI=' '
  436. MOCHDE=' CHPOINT CREE PAR OPTO '
  437. NC=NNIN
  438. SEGINI,MSOUPO
  439. IPCHP(1)=MSOUPO
  440. DO ININ=1,NNIN
  441. NOCOMP(ININ)=JNMETR.MOTS(ININ)
  442. ENDDO
  443. NBSOUS=0
  444. NBREF=0
  445. NBNN=1
  446. NBELEM=NNNOE
  447. N=NBELEM
  448. SEGINI,MPOVAL
  449. SEGINI,MELEME
  450. ITYPEL=1
  451. DO INNOE=1,NNNOE
  452. IF (INNOE.LE.NPTINI) THEN
  453. NUM(1,INNOE)=IDCP(INNOE)
  454. ELSE
  455. NUM(1,INNOE)=INNOE-NPTINI+NPTBAS
  456. ENDIF
  457. DO ININ=1,NNIN
  458. VPOCHA(INNOE,ININ)=JCMETR.XIN(ININ,INNOE)
  459. ENDDO
  460. ENDDO
  461. IGEOC=MELEME
  462. IPOVAL=MPOVAL
  463. SEGDES,MPOVAL
  464. SEGDES,MSOUPO
  465. SEGDES,MELEME
  466. ICMETA=MCHPOI
  467. SEGDES,MCHPOI
  468. ELSE
  469. ICMETA=0
  470. ENDIF
  471. ELSE
  472. ICMETA=ICMETR
  473. ENDIF
  474. * On ne serait pas obligé de faire ceci mais alors, il faut faire
  475. * attention au cas où JTOPA=JTOPO
  476. * SEGINI,ITOPA=JTOPA
  477. * write(ioimp,*) 'opto1.eso : on a genere la topologie : '
  478. * call ecmai1(jtopo,0)
  479. * segact jtopo*mod
  480. * En place
  481. JTOPO=TRAVJ.TOPO
  482. ITOPA =JTOPO
  483. * Pour éviter une suprression dans topsup
  484. travj.topo=0
  485. if (nvcou.ne.nvmax) then
  486. nbnn=idimp
  487. nbelem=nvcou
  488. nbsous=0
  489. nbref=0
  490. segadj,itopa
  491. endif
  492. * write(ioimp,*) 'itopa'
  493. * call ecmail(itopa,0)
  494. * segact itopa*mod
  495. * On ajuste le nombre d'éléments
  496. DO 63 IEL=1,ITOPA.NUM(/2)
  497. DO 630 INO=1,ITOPA.NUM(/1)
  498. IPL=ITOPA.NUM(INO,IEL)
  499. IF (IPL.LE.NPTINI) THEN
  500. IP=IDCP(IPL)
  501. ELSE
  502. IP=IPL-NPTINI+NPTBAS
  503. ENDIF
  504. ITOPA.NUM(INO,IEL)=IP
  505. 630 CONTINUE
  506. 63 CONTINUE
  507. IF (IMPR.GE.3) THEN
  508. write(ioimp,*) 'opto1.eso : topologie amelioree totale : '
  509. call ecmai1(itopa,0)
  510. segact itopa*mod
  511. ENDIF
  512. ENDIF
  513. * write(ioimp,*) 'opto1 fin : nbpts, xcoor=',nbpts,xcoor(/1)/(idim
  514. * $ +1)
  515. SEGDES MCOORD
  516. * write(ioimp,*) ' opto1 : avant segsup=',OOOVAL(2,1)
  517. if (icmeta.ne.0) SEGDES ICMETA
  518. SEGDES ITOPA
  519. SEGSUP JELEM
  520. SEGSUP IDCP
  521. SEGSUP ICPR
  522. CALL TOPSUP(TRAVJ)
  523. * write(ioimp,*) ' opto1 : apres segsup=',OOOVAL(2,1)
  524. *
  525. * Normal termination
  526. *
  527. RETURN
  528. *
  529. * Format handling
  530. *
  531. 184 FORMAT (2X,'noeud ip=',i4,' relie aux elements')
  532. 185 FORMAT (/2X,10(A16,'=',I8,2X)/)
  533. 186 FORMAT (2X,10(A6,'=',I6,2X))
  534. 187 FORMAT (5X,10I8)
  535. 188 FORMAT (5X,10(1X,1PG12.5))
  536. *
  537. * Error handling
  538. *
  539. 9999 CONTINUE
  540. MOTERR(1:8)='OPTO1 '
  541. * 349 2
  542. *Problème non prévu dans le s.p. %m1:8 contactez votre assistance
  543. CALL ERREUR(349)
  544. RETURN
  545. *
  546. * End of subroutine OPTO1
  547. *
  548. END
  549.  
  550.  
  551.  
  552.  
  553.  

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