Télécharger chasup.eso

Retour à la liste

Numérotation des lignes :

chasup
  1. C CHASUP SOURCE OF166741 23/12/06 21:15:03 11803
  2.  
  3. C---------------------------------------------------------------------
  4.  
  5. C ENTREES:
  6. C
  7. C IPMODL Pointeur sur un MMODEL
  8. C IPOI1 Pointeur sur un MCHAML
  9. C IPLAC Indique le type de support demandé :
  10. C 1 scalaire aux NOEUDS
  11. C 2 scalaire au CENTRE DE GRAVITE
  12. C 3 scalaire aux points d'integration de la RAIDEUR
  13. C 4 scalaire aux points d'integration de la MASSE
  14. C 5 scalaire aux points de CONTRAINTES
  15. C
  16. C AM 14/6/07 SI IPLAC EST NEGATIF, ON RECUPERE UN CHAMP QUI
  17. C NE CONTIENT PAS LES COMPOSANTES COMPLEXES (NON SCALAIRES)
  18. C QU'ON A N'A PAS PU CHANGER
  19. C SINON, ON SORT EN ERREUR
  20. C
  21. C SORTIE:
  22. C
  23. C IPOI2 Pointeur sur un MCHAML
  24. C IRET =0 Si tout est ok
  25. C Sinon contient le numero d'erreur
  26. C
  27. C I.MONNIER le 31.05.90
  28. C
  29. C---------------------------------------------------------------------
  30. SUBROUTINE CHASUP(IPMODL,IPOI1,IPOI2,IRET,IPLAC)
  31.  
  32. IMPLICIT INTEGER(I-N)
  33. IMPLICIT REAL*8(A-H,O-Z)
  34.  
  35. -INC PPARAM
  36. -INC CCOPTIO
  37. -INC SMMODEL
  38. -INC SMCHAML
  39. -INC SMELEME
  40. -INC SMINTE
  41. -INC SMCOORD
  42. CHARACTER*8 CHARIN,CHARTY,MO24a,MO24b
  43. CHARACTER*(LOCOMP) MOCOMP
  44.  
  45. SEGMENT SWORK
  46. REAL*8 VAL1(NBPGA1),VAL2(NBPGAU),VALN(NBNN)
  47. REAL*8 SHP(6,NBNN) ,XE(3,NBNN)
  48. ENDSEGMENT
  49.  
  50. SEGMENT SWORK2
  51. INTEGER LETAB(N22)
  52. ENDSEGMENT
  53. *
  54. * NBPGA1,NBPGAU DESIGNENT LES TAILLES MAX DES CHAMPS CH1 ET CH2
  55. * N1PTE1,N1PTEL DESIGNENT LES TAILLES EFFECTIVES DE CES CHAMPS
  56. *
  57. SEGMENT INFO
  58. INTEGER INFELL(JG)
  59. ENDSEGMENT
  60.  
  61. * write(ioimp,*) 'coucou chasup'
  62. * write(ioimp,*) 'iplac=',iplac
  63. * write(ioimp,*) ' MCHAML'
  64. * call ecrobj('MCHAML ',IPOI1)
  65. * call prlist
  66. * CALL ACTOBJ('MCHAML ',IPOI1,1)
  67. * write(ioimp,*) ' MCHAML'
  68. * call ecrobj('MMODEL ',IPMODL)
  69. * call prlist
  70. * CALL ACTOBJ('MMODEL ',IPMODL,1)
  71.  
  72. IRET =0
  73. IPOIN1=0
  74. call oooeta(mcoord,ieta,imod)
  75. C
  76. C ACTIVATION DU MODELE
  77. C
  78. MMODEL=IPMODL
  79. NSOUS1=KMODEL(/1)
  80. C
  81. C ACTIVATION DES MCHELM
  82. C
  83. MCHEL1 =IPOI1
  84. NSOUS=MCHEL1.ICHAML(/1)
  85. IF(NSOUS.GT.NSOUS1)THEN
  86. * on va essayer de reduir le champ
  87. call reduaf(mchel1,mmodel,mchel2,0,ire,kerre)
  88. ** if (ire.ne.1) then
  89. ** call erreur(kerre)
  90. ** IRET=553
  91. ** RETURN
  92. ** endif
  93. if (ire.eq.1) mchel1=mchel2
  94. NSOUS=MCHEL1.ICHAML(/1)
  95. ENDIF
  96. N1=NSOUS
  97. L1=MCHEL1.TITCHE(/1)
  98. N3=MCHEL1.INFCHE(/2)
  99. NINF=N3
  100. IF (N3.LT.6) N3=6
  101. SEGINI MCHELM
  102. TITCHE=MCHEL1.TITCHE
  103. IFOCHE=IFOUR
  104.  
  105. IPOI2=MCHELM
  106. iresu=0
  107. C
  108. C ON BOUCLE SUR LES SOUS-ZONES DU MCHAML
  109. C
  110. DO 100 ISOUS=1,NSOUS
  111.  
  112. IMACHE(ISOUS)=MCHEL1.IMACHE(ISOUS)
  113. CONCHE(ISOUS)=MCHEL1.CONCHE(ISOUS)
  114. DO IP=1,NINF
  115. INFCHE(ISOUS,IP)=MCHEL1.INFCHE(ISOUS,IP)
  116. ENDDO
  117. C
  118. C MISE EN CONCORDANCE DES POINTEURS DE MAILLAGE
  119. C
  120. MELEME=IMACHE(ISOUS)
  121. MO24a =CONCHE(ISOUS)
  122.  
  123. INS=0
  124. DO IO=1,NSOUS1
  125. IMODEL=KMODEL(IO)
  126. IPMAIL=IMAMOD
  127. C
  128. C CAS DE LA FORMULATION DARCY ON VA EXTRAIRE LE MAILLAGE SOMMET
  129. CALL PLACE(FORMOD,FORMOD(/2),IDARC,'DARCY ')
  130. IF (IDARC.NE.0)THEN
  131. CALL LEKMOD(MMODEL,IPTABL,INEFMD)
  132. CHARIN = 'MAILLAGE'
  133. CALL LEKTAB(IPTABL,CHARIN, IOBRE)
  134. IF (IERR.NE.0) RETURN
  135. IPT1 = IOBRE
  136. IPMAIL= IOBRE
  137. IF(N1.GT.1.and.ipt1.lisous(/1).ge.n1)THEN
  138. IPMAIL= IPT1.LISOUS(ISOUS)
  139. ENDIF
  140. ENDIF
  141. IF (IPMAIL.EQ.MELEME) INS=INS+1
  142. ENDDO
  143.  
  144. DO IO=1,NSOUS1
  145. IMODEL=KMODEL(IO)
  146. C
  147. IPMAIL=imodel.IMAMOD
  148. C
  149. C CAS DE LA FORMULATION DARCY ON VA EXTRAIRE LE MAILLAGE SOMMET
  150. CALL PLACE(FORMOD,FORMOD(/2),IDARC,'DARCY ')
  151. IF(IDARC.NE.0)THEN
  152. CALL LEKMOD(MMODEL,IPTABL,INEFMD)
  153. CHARIN = 'MAILLAGE'
  154. CALL LEKTAB(IPTABL,CHARIN, IOBRE)
  155. IF (IERR.NE.0) RETURN
  156. IPT1 = IOBRE
  157. IPMAIL= IOBRE
  158. IF(N1.GT.1.and.ipt1.lisous(/1).ge.n1)THEN
  159. IPMAIL= IPT1.LISOUS(ISOUS)
  160. ENDIF
  161. ENDIF
  162.  
  163. MO24b=imodel.CONMOD
  164. IF (IPMAIL.EQ.MELEME.AND.(INS.GE.1.OR.MO24a.EQ.MO24b))GOTO
  165. $ 160
  166. ENDDO
  167. *
  168. IRET=472
  169. SEGSUP MCHELM
  170. RETURN
  171. *
  172. 160 CONTINUE
  173. MELE=NEFMOD
  174.  
  175. c* write(6,*) 'chasup - mele ',mele,imodel,ipmail
  176. * on saute si element sans les supports
  177. if(mele.eq.22 ) go to 100
  178. if(mele.eq.259) go to 100
  179. if(mele.eq.107) go to 100
  180. if(mele.eq.165) go to 100
  181. if(mele.eq.261) go to 100
  182. *
  183. * DANS LE CAS DES COQUES INTEGREES ON SORT EN ERREUR
  184. *
  185. IF (NINF.LT.4.OR.MCHEL1.INFCHE(ISOUS,4).EQ.0) THEN
  186. MINTE1=0
  187. IPLACA=0
  188. ELSE
  189. MINTE1=MCHEL1.INFCHE(ISOUS,4)
  190. IPLACA=MCHEL1.INFCHE(ISOUS,6)
  191. ENDIF
  192. C
  193. ithdm = 0
  194. if (formod(1).eq.'LIAISON ') then
  195. IPLAC1 = 1
  196. else
  197. IPLAC1 = ABS(IPLAC)
  198. IF ( IPLAC1 .EQ. 6 ) ithdm = 1
  199. C le modele contient t il de la thermique OU diffusion OU metallurgie ?
  200. C ==> le segment d'integration est particulier
  201. IF ( FORMOD(1).EQ.'THERMIQUE ' .OR.
  202. & FORMOD(1).EQ.'DIFFUSION ' .OR.
  203. & FORMOD(1).EQ.'METALLURGIE ' ) THEN
  204. ithdm = 1
  205. icov = 0
  206. nmat = matmod(/2)
  207. CALL PLACE(matmod,nmat,iray,'RAYONNEMENT ')
  208. IF (icov+iray.EQ.0) THEN
  209. IF ( IPLAC1 .GT. 2 ) IPLAC1 = 6
  210. ENDIF
  211.  
  212. IF(MELE .EQ. 265)THEN
  213. C Cas des JOI1 ==> Ressorts THERMIQUES
  214. C ============
  215. ithdm = 0
  216. IPLAC1 = 1
  217. ENDIF
  218.  
  219. ENDIF
  220. endif
  221. C
  222. IF (ithdm.NE.0 .AND. IPLAC1.GT.1) THEN
  223. IF (IPLAC1.EQ.1) CALL TSHAPE(MELE,'NOEUD ',IPMINT)
  224. IF (IPLAC1.EQ.2) CALL TSHAPE(MELE,'GRAVITE',IPMINT)
  225. IF (IPLAC1.EQ.6) CALL TSHAPE(MELE,'GAUSS ',IPMINT)
  226. IF (IERR .NE. 0) GOTO 665
  227. MINTE=IPMINT
  228. MELGEO=NUMGEO(MELE)
  229. ELSE
  230. if(2+iplac1.gt.infmod(/1))then
  231. CALL ELQUOI(MELE,0,IPLAC1,IPTR2,IMODEL)
  232. IF ( IERR .NE. 0) GOTO 665
  233. INFO=IPTR2
  234. MINTE=INFELL(11)
  235. MELGEO=INFELL(14)
  236. SEGSUP,INFO
  237. else
  238. minte=infmod(2+iplac1)
  239. MELGEO=INFELE(14)
  240. endif
  241. ENDIF
  242. INFCHE(ISOUS,4)=MINTE
  243. IF(IPLAC1.EQ.1)INFCHE(ISOUS,4)=0
  244. INFCHE(ISOUS,6)=IPLAC1
  245. C
  246. C ON RECUPERE LE NOMBRE D ELEMENTS
  247. C
  248. NBNN =NUM(/1)
  249. NBELEM=NUM(/2)
  250. C
  251. C ON RECUPERE LE NOMBRE DE POINTS SUPPORT
  252. C NBPGA1 POUR L'ANCIEN CHAMP ET NBPGAU POUR LE NOUVEAU
  253. C
  254. IF(MINTE1.NE.0)THEN
  255. NBPGA1 = MINTE1.SHPTOT(/3)
  256. ELSE
  257. NBPGA1=NBNN
  258. ENDIF
  259. if (minte.eq.0) then
  260. call erreur(5)
  261. return
  262. endif
  263. NBPGAU = SHPTOT(/3)
  264. nbpga1=max(nbpga1,nbpgau)
  265. C
  266. NEL =NBELEM
  267. SEGINI SWORK
  268. C
  269. C PREPARATION POUR CREATION DU MCHAML
  270. C
  271. MCHAM1=MCHEL1.ICHAML(ISOUS)
  272. C
  273. N22 = MCHAM1.NOMCHE(/2)
  274. *
  275. * SI IPLAC < 0, ON CHERCHE LE NOMBRE DE COMPOSANTES A CONSERVER
  276. *
  277. SEGINI SWORK2
  278. *
  279. IF(IPLAC.GE.0) THEN
  280. N2 = N22
  281. DO ICOMP=1,N22
  282. LETAB(ICOMP) = ICOMP
  283. ENDDO
  284. *
  285. ELSE
  286. *
  287. * BOUCLE SUR LES COMPOSANTES
  288. *
  289. JECO = 0
  290. DO ICOMP=1,N22
  291. C
  292. CHARTY=MCHAM1.TYPCHE(ICOMP)
  293. MELVA1=MCHAM1.IELVAL(ICOMP)
  294. LETAB(ICOMP) = 0
  295. *
  296. IF(CHARTY(1:6).EQ.'REAL*8') THEN
  297. JECO = JECO + 1
  298. LETAB(ICOMP) = JECO
  299. ENDIF
  300. *
  301. * cas de variables complexes
  302. *
  303. IF(CHARTY(1:8).EQ.'POINTEUR') THEN
  304. N2PTE1=MELVA1.IELCHE(/1)
  305. *
  306. * ... Comme on ne sait pas extrapoler ou interpoler de variables
  307. * composées, on n'en accepte qu'une par élément ...
  308.  
  309. IF(N2PTE1.EQ.1) THEN
  310. JECO = JECO + 1
  311. LETAB(ICOMP) = JECO
  312. ENDIF
  313. ENDIF
  314. ENDDO
  315. N2 = JECO
  316. *
  317. ENDIF
  318. *
  319. * CREATION DU MCHAML
  320. *
  321. SEGINI MCHAML
  322. iresu=iresu+1
  323. ICHAML(iresu)=MCHAML
  324. C
  325. C BOUCLE SUR LES COMPOSANTES EN ENTREE
  326. C
  327. DO 180 ICOMP=1,N22
  328. C
  329. JCOMP = LETAB(ICOMP)
  330. IF(JCOMP.EQ.0) GO TO 180
  331.  
  332. NOMCHE(JCOMP)=MCHAM1.NOMCHE(ICOMP)
  333. TYPCHE(JCOMP)=MCHAM1.TYPCHE(ICOMP)
  334. C
  335. MELVA1=MCHAM1.IELVAL(ICOMP)
  336. *
  337. * RECHERCHE DES TAILLES DU NOUVEAU CHAMELEM - dans le cas scalaire
  338. *
  339. IF(TYPCHE(JCOMP)(1:6).EQ.'REAL*8') THEN
  340. N1PTE1=MELVA1.VELCHE(/1)
  341. IF (N1PTE1.EQ.1) THEN
  342. N1PTEL=1
  343. ELSE
  344. N1PTEL=NBPGAU
  345. ENDIF
  346. N1EL =MELVA1.VELCHE(/2)
  347. *
  348. * PETIT TEST DE COMPATIBILITE DES NOMBRES D'ELEMENTS
  349. *
  350. IF(N1EL.NE.NEL.AND.N1EL.NE.1.AND.NEL.NE.1) THEN
  351. SEGSUP SWORK,SWORK2,MCHAML
  352. IRET=146
  353. MOTERR(1:8)='CHASUP '
  354. GO TO 665
  355. ENDIF
  356. *
  357. N1PAUX=N1PTE1
  358. C
  359. C-----------------------------------------------------------------------
  360. C PETIT TEST POUR LE COQ4
  361. C SI LE NOMBRE DE POINTS DE GAUSS VAUT 5 , ON NE PREND QUE
  362. C LES 4 PREMIERS , LE 5-EME SERVANT UNIQUEMENT AU CISAILLEMENT
  363. C
  364. IF (MELE.EQ.49.AND.N1PAUX.EQ.5) N1PAUX=4
  365. C-----------------------------------------------------------------------
  366. C
  367. ELSE
  368. N1PTEL=0
  369. N1EL=0
  370. ENDIF
  371. *
  372. * ... Et dans le cas de variables complexes ...
  373. *
  374. IF(TYPCHE(JCOMP)(1:8).EQ.'POINTEUR') THEN
  375. N2PTE1=MELVA1.IELCHE(/1)
  376. IF (N2PTE1.EQ.1) THEN
  377. N2PTEL=1
  378. ELSE
  379. N2PTEL=NBPGAU
  380. ENDIF
  381. N2EL =MELVA1.IELCHE(/2)
  382. *
  383. * ... Comme on ne sait pas extrapoler ou interpoler de variables
  384. * composées, on n'en accepte qu'une par élément ...
  385.  
  386. * IF(N2PTEL.NE.1) THEN
  387. * SEGSUP SWORK,SWORK2,MCHAML
  388. * IRET=755
  389. * GO TO 665
  390. * ENDIF
  391. *
  392. * PETIT TEST DE COMPATIBILITE DES NOMBRES D'ELEMENTS
  393. *
  394. IF(N2EL.NE.NEL.AND.N2EL.NE.1.AND.NEL.NE.1) THEN
  395. SEGSUP SWORK,SWORK2,MCHAML
  396. IRET=146
  397. MOTERR(1:8)='CHASUP '
  398. GO TO 665
  399. ENDIF
  400.  
  401. ELSE
  402. N2PTEL=0
  403. N2EL=0
  404. ENDIF
  405. SEGINI MELVAL
  406. IELVAL(JCOMP)=MELVAL
  407. *
  408. * TRAITEMENT IMMEDIAT SI CHAMP CONSTANT
  409. *
  410. * if(iplac1.eq.4) write(6,*)' n2ptel n1ptel',n2ptel,n1ptelq
  411. IF(n2ptel.ne.0) then
  412. IF(N2PTEL.EQ.1) THEN
  413. DO 4119 IEL=1,N2EL
  414. IELCHE(1,IEL)=MELVA1.IELCHE(1,IEL)
  415. 4119 CONTINUE
  416. C* ELSE IF (N2PTEL.NE.1) THEN
  417. ELSE
  418. IF (MINTE.NE.MINTE1. AND. IPLAC1.NE.IPLACA) THEN
  419. SEGSUP SWORK,SWORK2,MCHAML
  420. IRET=755
  421. GO TO 665
  422. ENDIF
  423. DO 4109 IGAU=1,N2PTEL
  424. DO 41091 IEL=1,N2EL
  425. IELCHE(IGAU,IEL)=MELVA1.IELCHE(IGAU,IEL)
  426. 41091 CONTINUE
  427. 4109 CONTINUE
  428. ENDIF
  429. else
  430. IF(N1PTE1.EQ.1) THEN
  431. DO 4120 IEL=1,N1EL
  432. VELCHE(1,IEL)=MELVA1.VELCHE(1,IEL)
  433. 4120 CONTINUE
  434. *
  435. ELSE
  436. *
  437. * write (6,*) melva1.velche(/1),melva1.velche(/2)
  438.  
  439. DO 3120 IEL=1,NEL
  440. IF(IEL.GT.1.AND.N1EL.EQ.1) GO TO 3130
  441. DO 3121 IGAU=1,N1PTE1
  442. VAL1(IGAU)=MELVA1.VELCHE(IGAU,IEL)
  443. 3121 CONTINUE
  444.  
  445. * write(6,*) 'MINTE1 = ',minte1
  446.  
  447. C
  448. C 1-ER CAS : LE CHAMELEM N'EST PAS AUX NOEUDS
  449. C
  450. IF(MINTE1.NE.0)THEN
  451. C
  452. C MEME SUPPORT? ( attention test sur iplaca et iplac1 pour DKT)
  453. C
  454. * write(6,*) ' meme support?',minte,minte1,iplac1,iplaca
  455. IF(MINTE.EQ.MINTE1. OR. IPLAC1.eq.IPLACA)
  456. $ THEN
  457. DO 3124 IGAU=1,N1PTE1
  458. VELCHE(IGAU,IEL)=VAL1(IGAU)
  459. 3124 CONTINUE
  460. C
  461. C SUPPORTS DIFFERENTS
  462. C
  463. ELSE
  464. C
  465. C COQUE INTEGREE OU PAS ?
  466. C
  467. IF(INFMOD(/1).NE.0)THEN
  468. NPINT=INFMOD(1)
  469. ELSE
  470. NPINT=0
  471. ENDIF
  472. IF (NPINT.NE.0.AND.NPINT.NE.1)THEN
  473. IRET = 19
  474. SEGSUP SWORK,SWORK2,MCHAML,MELVAL
  475. GO TO 665
  476. ENDIF
  477. C
  478. if (ieta.ne.1) then
  479. ieta=1
  480. segact mcoord
  481. endif
  482. CALL DOXE(XCOOR,IDIM,NBNN,NUM,IEL,XE)
  483. CALL QUEDIM(MELGEO,KERRE)
  484. CALL CH1CH2(MELE,MINTE,MINTE1,N1PTEL
  485. $ ,N1PAUX,NBNN,SWORK,IPOIN1,KERRE)
  486. IF(KERRE.NE.0) THEN
  487. IRET=KERRE
  488. SEGSUP SWORK,SWORK2,MCHAML,MELVAL
  489. GO TO 665
  490. ENDIF
  491. *
  492. DO 3122 IGAU=1,N1PTEL
  493. VELCHE(IGAU,IEL)=VAL2(IGAU)
  494. 3122 CONTINUE
  495. ENDIF
  496. C
  497. C 2-EME CAS : LE CHAMELEM EST AUX NOEUDS
  498. C
  499. ELSE
  500. *
  501. * AM 1/4/16 CAS PARTICULIER DES JOINTS
  502. *
  503. IF( MELGEO.EQ.12.OR.MELGEO.EQ.13
  504. & .OR.MELGEO.EQ.29.OR.MELGEO.EQ.30
  505. & .OR.MELGEO.EQ.31) THEN
  506. *
  507. IF(((IPLACA.EQ.0.OR.IPLACA.EQ.1).AND.
  508. $ IPLAC1.EQ.1).AND.(N1PTEL.EQ.N1PTE1))
  509. $ THEN
  510. DO IGAU=1,N1PTE1
  511. VELCHE(IGAU,IEL)=VAL1(IGAU)
  512. ENDDO
  513. ELSE
  514. *
  515. IDECA=0
  516. IF(MELGEO.EQ.29) IDECA=2
  517. IF(MELGEO.EQ.30) IDECA=3
  518. IF(MELGEO.EQ.31) IDECA=4
  519. NBNOU=NBNN-IDECA
  520. NBNOV=SHPTOT(/2)-IDECA
  521. *
  522. MOCOMP=NOMCHE(JCOMP)
  523. IF (MOCOMP.EQ.'P '.OR.
  524. & MOCOMP.EQ.'PQ '.OR.
  525. & MOCOMP.EQ.'TP ' ) THEN
  526. DO IGAU=1,N1PTEL
  527. VALG=0.D0
  528. DO INO=1,IDECA
  529. INO1 = NBNOU + INO
  530. INO2 = NBNOV + INO
  531. VALG=VALG+SHPTOT(1,INO2,IGAU)
  532. $ *VAL1(INO1)
  533. ENDDO
  534. VELCHE(IGAU,IEL)=VALG
  535. ENDDO
  536.  
  537. ELSE
  538. DO IGAU=1,N1PTEL
  539. VALG=0.D0
  540. DO INO=1,NBNOU
  541. VALG=VALG+SHPTOT(1,INO,IGAU)
  542. $ *VAL1(INO)
  543. ENDDO
  544. VELCHE(IGAU,IEL)=VALG/2.D0
  545. ENDDO
  546. ENDIF
  547. ENDIF
  548.  
  549. ELSE
  550. DO IGAU=1,N1PTEL
  551. VALG=0.D0
  552. DO INO=1,NBNN
  553. VALG=VALG+SHPTOT(1,INO,IGAU)*VAL1(INO)
  554. ENDDO
  555. VELCHE(IGAU,IEL)=VALG
  556. ENDDO
  557. ENDIF
  558.  
  559. ENDIF
  560. 3120 CONTINUE
  561. 3130 CONTINUE
  562.  
  563. ENDIF
  564. endif
  565. 180 CONTINUE
  566. SEGSUP SWORK,SWORK2
  567.  
  568. 100 CONTINUE
  569. if (iresu.ne.nsous) then
  570. n1=iresu
  571. segadj mchelm
  572. endif
  573.  
  574. 665 CONTINUE
  575. c return
  576. END
  577.  
  578.  
  579.  
  580.  

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