Télécharger ydfdt.eso

Retour à la liste

Numérotation des lignes :

ydfdt
  1. C YDFDT SOURCE FANDEUR 22/01/03 21:15:57 11136
  2. SUBROUTINE YDFDT
  3. C---------------------------------------------------------------------
  4. C Cet opérateur discrétise le terme de dérivée temporelle.
  5. C---------------------------------------------------------------------
  6. C Les formulations numériques sont EF Galerkin, EF Petrov-Galerkin et
  7. C VF, la matrice masse pouvant etre condensée en EF.
  8. C Les schema en temps disponibles CRANK NICOLSON (DT**2) CNG (DT**4)
  9. C Les schema en temps disponibles BDF2 (DT**2) BDF4 (DT**4)
  10. C---------------------------------------------------------------------
  11. C
  12. C-------------------------
  13. C Phrase d'appel GIBIANE :
  14. C-------------------------
  15. C
  16. C 'DFDT' TAB1 ;
  17. C
  18. C TAB1 : Table de sous-type 'KIZX' contenant les données pour DFDT
  19. C
  20. C--------------------------------
  21. C Construction de TAB1 via EQEX :
  22. C--------------------------------
  23. C
  24. C 'ZONE' TAB2 'OPER' 'DFDT' CHP1 CHP2 FLOT1 (CHP3) (CHP4) 'INCO' MOT1
  25. C
  26. C TAB2 : TABLE DOMAINE associée à la zone d'action de l'opérateur
  27. C CHP1 : Coefficient multiplicateur de la dérivée temporelle
  28. C (densité dans le cas de la qdm ou rho*cp en thermique)
  29. C (FLOTTANT ou MOT ou CHPO) - (spg : CENTRE ou SOMMET)
  30. C CHP2 : Inconnue au pas de temps précédant
  31. C (MOT ou CHPO SCAL ou CHPO VECT) - (spg : CENTRE ou SOMMET)
  32. C FLOT1 : Valeur du pas de temps (MOT ou REEL ou ENTIER)
  33. C CHP3 : Champ de vitesse - Optionnel (utilisé en Petrov-Galerkin)
  34. C (POINT ou MOT ou CHPO) - (spg : CENTRE ou SOMMET)
  35. C CHP4 : Diffusion - Optionnel (utilisé en Petrov-Galerkin)
  36. C (FLOTTANT ou MOT ou CHPO) - (spg : CENTRE ou SOMMET)
  37. C MOT1 : Nom de l'inconnue sur laquelle agit l'opérateur (MOT)
  38. C
  39. C------------
  40. C Résultats :
  41. C------------
  42. C
  43. C Les matrices élémentaires sont stockés dans un objet MATRIK qui
  44. C est rangé à l'indice de type MOT MATELM de la table KIZX.
  45. C Le second membre est stocké dans un CHPO et assemblé dans la table
  46. C EQEX à l'indice de type MOT SMBR.
  47. C---------------------------------------------------------------------
  48. C
  49. IMPLICIT INTEGER(I-N)
  50. IMPLICIT REAL*8 (A-H,O-Z)
  51. C
  52.  
  53. -INC PPARAM
  54. -INC CCOPTIO
  55. -INC CCREEL
  56. *-
  57. -INC CCGEOME
  58. -INC SIZFFB
  59. POINTEUR IZF1.IZFFM
  60.  
  61. PARAMETER (LRV=64)
  62. SEGMENT PETROV
  63. REAL*8 WT(LRV,NP,NPG,KDIM),WS(LRV,NP,NPG,KDIM),HK(LRV,IDIM,NP,NPG)
  64. REAL*8 UIL(LRV,IDIM,NPG),DUIL(LRV,IDIM,NPG)
  65. REAL*8 PGSK(LRV,NPG),RPGK(LRV,NPG),AIRE(LRV),ANUK(LRV),COEFK(LRV)
  66. REAL*8 AJK(LRV,IDIM,IDIM,NPG)
  67. ENDSEGMENT
  68.  
  69. -INC SMCOORD
  70. -INC SMLENTI
  71. POINTEUR IPADU.MLENTI,IPADS.MLENTI,IPADI.MLENTI
  72. -INC SMELEME
  73. POINTEUR MELEM1.MELEME,MELEMS.MELEME,MELEMZ.MELEME
  74. POINTEUR MELEMO.MELEME
  75. -INC SMCHAML
  76. -INC SMCHPOI
  77. POINTEUR IZRO.MPOVAL,MZDT.MPOVAL,IZTGG2.MPOVAL,IZTU1.MPOVAL
  78. POINTEUR IZTGN2.MPOVAL
  79. POINTEUR IZTCO.MPOVAL,MZUN.MPOVAL,MZMU.MPOVAL
  80. -INC SMLMOTS
  81. C
  82. CHARACTER*8 NOMI,TYPE,TYPC,NOM,NOM0,NOMDT,MTYP,CHAI
  83. PARAMETER (NTB=1)
  84. CHARACTER*8 LTAB(NTB)
  85. DIMENSION KTAB(NTB),IXV(4)
  86. DATA LTAB/'KIZX '/
  87. C
  88. C DFDT
  89. C write(6,*)' Opérateur DFDT '
  90. segact mcoord
  91. C Nouvelle directive EQUA de EQEX
  92. MTYP=' '
  93. CALL QUETYP(MTYP,0,IRET)
  94. IF(IRET.EQ.0)THEN
  95. C% On attend un des objets : %m1:8 %m9:16 %m17:24 %m25:32 %m33:40
  96. MOTERR( 1: 8) = 'CHAI '
  97. MOTERR( 9:16) = 'MMODEL '
  98. MOTERR(17:24) = 'TABLE '
  99. CALL ERREUR(472)
  100. RETURN
  101. ENDIF
  102.  
  103. IF(MTYP.EQ.'MMODEL')THEN
  104. CALL YTCLSF('T ','DFDT ')
  105. RETURN
  106. ELSEIF(MTYP.EQ.'MOT ')THEN
  107. CALL LIRCHA(CHAI,1,IRET)
  108. CALL YTCLSF(CHAI,'DFDT ')
  109. RETURN
  110. ENDIF
  111. C Fin Nouvelle directive EQUA de EQEX
  112.  
  113. DTM1 = 0.D0
  114. DTX = 0.D0
  115. MLENTI = 0
  116. IAXI = 0
  117. NPTU = 0
  118. IF (IFOMOD.EQ.0) IAXI=2
  119. DEUPI=1.D0
  120. IF(IAXI.NE.0)DEUPI=2.D0*XPI
  121. C
  122. C- Lecture de la table KIZX (pointeur MTABX) associée à DFDT
  123. C
  124. c CALL LITABS(LTAB,KTAB,NTB,1,IRET)
  125. c IF (IERR.NE.0) RETURN
  126. c MTABX = KTAB(1)
  127.  
  128. C
  129. C- Récupération de la table xNS type KIZX (pointeur MTABX)
  130. C
  131. C write(6,*)'Récupération de la table xNS type KIZX pointeur MTABX'
  132. CALL LIROBJ('TABLE',MTABX,1,IRET)
  133. IF(IRET.EQ.0)THEN
  134. C% On ne trouve pas d'objet de type %m1:8
  135. MOTERR( 1: 8) = 'TABLE'
  136. CALL ERREUR(37)
  137. RETURN
  138. ENDIF
  139. C A tout hazard on regarde si une table ne peut en cacher une autre
  140. C write(6,*)' A tout hazard on regarde si une table ne peut en',
  141. C &' cacher une autre !!!!!'
  142.  
  143. MTYP='TABLE'
  144. CALL QUETYP(MTYP,0,IRET)
  145. IF(IRET.EQ.1)THEN
  146. CALL LIROBJ('TABLE',MTABX,1,IRET)
  147. IF(IRET.EQ.0)THEN
  148. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  149. MOTERR( 1: 8) = ' MTABX '
  150. MOTERR( 9:16) = ' MTABX '
  151. MOTERR(17:24) = ' KIZX '
  152. CALL ERREUR(786)
  153. RETURN
  154. ENDIF
  155. C write(6,*)' EH BEN C EST LE CAS une KIZX // !!!!!!!!!!'
  156. C call pplist(MTABX)
  157. C
  158. C- Récupération de la table DOMAINE associée au domaine local
  159. C
  160. TYPE=' '
  161. CALL ACMO(MTABX,'DOMZ',TYPE,MMDZ)
  162. IF(TYPE.EQ.'MMODEL')THEN
  163. CALL LEKMOD(MMDZ,MTABZ,INEFMD)
  164. TYPE='TABLE'
  165. CALL ECMO(MTABX,'TDOMZ',TYPE,MTABZ)
  166. ELSEIF(TYPE.EQ.'TABLE')THEN
  167. CALL ECMO(MTABX,'TDOMZ',TYPE,MMDZ)
  168. ELSE
  169. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  170. MOTERR( 1: 8) = ' DOMZ '
  171. MOTERR( 9:16) = ' DOMZ '
  172. MOTERR(17:24) = ' KIZX '
  173. CALL ERREUR(786)
  174. RETURN
  175. ENDIF
  176.  
  177. ELSE
  178.  
  179. TYPE=' '
  180. CALL ACMO(MTABX,'DOMZ',TYPE,MMDZ)
  181. IF(TYPE.EQ.'MMODEL')THEN
  182. CALL LEKMOD(MMDZ,MTABZ,INEFMD)
  183. TYPE='TABLE'
  184. CALL ECMO(MTABX,'TDOMZ',TYPE,MTABZ)
  185. ELSEIF(TYPE.EQ.'TABLE')THEN
  186. CALL ECMO(MTABX,'TDOMZ',TYPE,MMDZ)
  187. ELSE
  188. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  189. MOTERR( 1: 8) = ' DOMZ '
  190. MOTERR( 9:16) = ' DOMZ '
  191. MOTERR(17:24) = ' KIZX '
  192. CALL ERREUR(786)
  193. RETURN
  194. ENDIF
  195. ENDIF
  196. C.......................................................................
  197.  
  198.  
  199. C
  200. C- Récupération de la table EQEX (pointeur MTAB1)
  201. C
  202. CALL LEKTAB(MTABX,'EQEX',MTAB1)
  203. IF (MTAB1.EQ.0)THEN
  204. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  205. MOTERR( 1: 8) = ' EQEX '
  206. MOTERR( 9:16) = ' EQEX '
  207. MOTERR(17:24) = ' KIZX '
  208. CALL ERREUR(786)
  209. RETURN
  210. ENDIF
  211. CALL ACME(MTAB1,'NAVISTOK',NASTOK)
  212. IF(NASTOK.EQ.0)THEN
  213. CALL ZDFDT(MTABX,MTAB1)
  214. RETURN
  215. ENDIF
  216. C
  217. C- Récupération de la table DOMAINE associée au domaine local
  218. C
  219. MTYP='MMODEL'
  220. CALL QUETYP(MTYP,0,IRET)
  221. IF(IRET.EQ.1)THEN
  222. CALL LIROBJ('MMODEL',MMDZ,0,IRET)
  223. ELSE
  224. TYPE=' '
  225. CALL ACMO(MTABX,'DOMZ',TYPE,MMDZ)
  226. IF(TYPE.NE.'MMODEL')THEN
  227. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  228. MOTERR( 1: 8) = ' DOMZ '
  229. MOTERR( 9:16) = ' DOMZ '
  230. MOTERR(17:24) = ' KIZX '
  231. CALL ERREUR(786)
  232. RETURN
  233. ENDIF
  234. ENDIF
  235.  
  236. CALL LEKMOD(MMDZ,MTABZ,INEFMD)
  237. C
  238. C- Récupération de la table INCO (pointeur KINC)
  239. C
  240. CALL LEKTAB(MTAB1,'INCO',KINC)
  241. IF (KINC.EQ.0) THEN
  242. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  243. MOTERR( 1: 8) = ' INCO '
  244. MOTERR( 9:16) = ' INCO '
  245. MOTERR(17:24) = ' EQEX '
  246. CALL ERREUR(786)
  247. RETURN
  248. ENDIF
  249. C
  250. C- Récupération de la table PASDETPS (pointeur KINT)
  251. C
  252. CALL LEKTAB(MTAB1,'PASDETPS',KINT)
  253. C?2 IF(KINT.EQ.0)KINT=KINC
  254. C
  255. C- Récupération de la table des options KOPT (pointeur KOPTI)
  256. C
  257. CALL LEKTAB(MTABX,'KOPT',KOPTI)
  258. IF (KOPTI.EQ.0) THEN
  259. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  260. MOTERR( 1: 8) = ' KOPT '
  261. MOTERR( 9:16) = ' KOPT '
  262. MOTERR(17:24) = ' KIZX '
  263. CALL ERREUR(786)
  264. RETURN
  265. ELSE
  266. IKOMP=0
  267. CALL ACME(KOPTI,'ISCHT',ISCHT)
  268. C- Initialisation des constantes en fonction du schema
  269. CDT=1.D0
  270. CN=1.D0
  271. CNM=1.D0
  272. CNMM=0.D0
  273. IF(ISCHT.EQ.1)THEN
  274. CDT=2.D0
  275. CN=3.D0
  276. CNM=4.D0
  277. CNMM=-1.D0
  278. ELSEIF(ISCHT.EQ.2)THEN
  279. CDT=2.D0
  280. CN=6.D0
  281. CNM=0.D0
  282. CNMM=6.D0
  283. ENDIF
  284.  
  285. KDIM=1
  286. CALL ACME(KOPTI,'IDCEN',IDCEN)
  287. IF(IDCEN.EQ.2)KDIM=IDIM
  288. CALL ACME(KOPTI,'KFORM',KFORM)
  289. CALL ACME(KOPTI,'KPOIND',KPOIND)
  290. CALL ACME(KOPTI,'KMACO',KMACO)
  291. CALL ACMF(KOPTI,'CMD',CMD)
  292. ENDIF
  293.  
  294. IDCENV = IDCEN
  295. IF (IDCEN.EQ.5.OR.IDCEN.EQ.4) IDCENV=1
  296. C
  297. C- Récupération des indices CENTRE, FACE, SOMMET et MAILLAGE
  298. C- de la table DOMAINE
  299. C
  300. CALL LEKTAB(MTABZ,'SOMMET',MELEMS)
  301. CALL LEKTAB(MTABZ,'FACE',MELEMF)
  302. CALL LEKTAB(MTABZ,'CENTRE',MELEMC)
  303. CALL LEKTAB(MTABZ,'MAILLAGE',MELEMZ)
  304. CALL LEKTAB(MTABZ,'MACRO1',MELEMI)
  305. CALL LEKTAB(MTABZ,'MACRO',MACRO)
  306. CALL LEKTAB(MTABZ,'QUADRATI',MQUAD)
  307. IF (IERR.NE.0) RETURN
  308.  
  309. C
  310. C- Vérification des compatiblités Formulation/SPG
  311. C- Identification du spg de l'inconnue
  312. C- MELEM1=spg ; MELEME=connectivité associée ;
  313. C
  314.  
  315. IF(KFORM.EQ.0)THEN
  316. IF(KPOIND.EQ.99)THEN
  317. KPOIND=0
  318. MELEM1=MELEMS
  319. MELEME=MELEMS
  320. ELSEIF(KPOIND.EQ.2)THEN
  321. MELEM1=MELEMC
  322. MELEME=MELEMC
  323. ELSEIF(KPOIND.EQ.0)THEN
  324. MELEM1=MELEMS
  325. MELEME=MELEMS
  326. ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.0)THEN
  327. C Option %m1:8 incompatible avec les données
  328. MOTERR( 1: 8) = ' EF '
  329. CALL ERREUR(803)
  330. RETURN
  331. ENDIF
  332.  
  333. ELSEIF(KFORM.EQ.1)THEN
  334. IF(KPOIND.EQ.99)THEN
  335. KPOIND=0
  336. MELEM1=MELEMS
  337. MELEME=MELEMZ
  338. ELSEIF(KPOIND.EQ.0)THEN
  339. MELEM1=MELEMS
  340. MELEME=MELEMZ
  341. ELSEIF(KPOIND.EQ.2)THEN
  342. MELEM1=MELEMC
  343. MELEME=MELEMC
  344. ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.0)THEN
  345. C Option %m1:8 incompatible avec les données
  346. MOTERR( 1: 8) = ' EF '
  347. CALL ERREUR(803)
  348. RETURN
  349. ENDIF
  350.  
  351. ELSEIF(KFORM.EQ.2)THEN
  352. IF(KPOIND.EQ.99)THEN
  353. KPOIND=2
  354. MELEM1=MELEMC
  355. MELEME=MELEMC
  356. ELSEIF(KPOIND.EQ.2)THEN
  357. MELEM1=MELEMC
  358. MELEME=MELEMC
  359. ELSEIF(KPOIND.NE.2)THEN
  360. C Option %m1:8 incompatible avec les données
  361. MOTERR( 1: 8) = ' VF '
  362. CALL ERREUR(803)
  363. RETURN
  364. ENDIF
  365.  
  366. ELSEIF(KFORM.EQ.3)THEN
  367. IF(KPOIND.EQ.99.OR.KPOIND.EQ.2)THEN
  368. KPOIND=2
  369. MELEM1=MELEMC
  370. MELEME=MELEMC
  371. ELSEIF(KPOIND.EQ.3.AND.(MACRO.NE.0.OR.MQUAD.NE.0))THEN
  372. CALL LEKTAB(MTABZ,'CENTREP0',MELEMC)
  373. MELEM1=MELEMC
  374. MELEME=MELEMC
  375. ELSEIF(KPOIND.EQ.4.AND.(MACRO.NE.0.OR.MQUAD.NE.0))THEN
  376. CALL LEKTAB(MTABZ,'CENTREP1',MELEMC)
  377. CALL LEKTAB(MTABZ,'ELTP1NC',MELEMQ)
  378. MELEM1=MELEMC
  379. MELEME=MELEMQ
  380. IF(MACRO.NE.0)MELEMO=MELEMI
  381. IF(MQUAD.NE.0)MELEMO=MELEMZ
  382. C ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.3.AND.KPOIND.NE.4)THEN
  383. ELSE
  384. C Option %m1:8 incompatible avec les données
  385. MOTERR( 1: 8) = ' EFMC '
  386. CALL ERREUR(803)
  387. RETURN
  388. ENDIF
  389.  
  390. ENDIF
  391. C
  392. C- Récupération du nombre d'inconnues et du nom de l'inconnue NOMI
  393. C
  394. TYPE = 'LISTMOTS'
  395. CALL ACMO(MTABX,'LISTINCO',TYPE,MLMOTS)
  396. IF (IERR.NE.0) RETURN
  397. SEGACT MLMOTS
  398. NBINC = MOTS(/2)
  399. IF (NBINC.LE.0.OR.NBINC.GE.3) THEN
  400. C Indice %m1:8 : contient plus de %i1 %m9:16
  401. MOTERR( 1:8) = 'LISTINCO'
  402. INTERR(1) = 2
  403. MOTERR(9:16) = ' MOTS '
  404. CALL ERREUR(799)
  405. RETURN
  406. ENDIF
  407. NOMI = MOTS(1)
  408. IF (NBINC.EQ.2) THEN
  409. IF (MOTS(1).NE.MOTS(2)) THEN
  410. C Indice %m1:8 : contient plus de %i1 %m9:16
  411. MOTERR( 1:8) = 'LISTINCO'
  412. INTERR(1) = 1
  413. MOTERR(9:16) = ' MOT '
  414. CALL ERREUR(799)
  415. RETURN
  416. ENDIF
  417. ENDIF
  418. SEGDES MLMOTS
  419. C
  420. C- Récupération de l'inconnue
  421. C
  422. TYPE = ' '
  423. CALL ACMO(KINC,NOMI,TYPE,MCHPOI)
  424. IF (TYPE.NE.'CHPOINT ') THEN
  425. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  426. MOTERR( 1: 8) = 'INC '//NOMI
  427. MOTERR( 9:16) = 'CHPOINT '
  428. CALL ERREUR(800)
  429. RETURN
  430. ELSE
  431. CALL LICHTL(MCHPOI,IZTU1,TYPC,MELEMD)
  432. NINKO = IZTU1.VPOCHA(/2)
  433. IF (NINKO.NE.1.AND.NINKO.NE.IDIM) THEN
  434. C Indice %m1:8 : Le %m9:16 n'a pas le bon nombre de composantes
  435. MOTERR( 1: 8) = 'INC '//NOMI
  436. MOTERR( 9:16) = 'CHPOINT '
  437. CALL ERREUR(784)
  438. RETURN
  439. ENDIF
  440. ENDIF
  441. C
  442. C*************************************************************************
  443. C Le domaine de definition est donne par le SPG de la premiere inconnue
  444. C Les inconnues suivantes devront posseder ce meme pointeur
  445. C On verifie que les points de la zone sont tous inclus dans ce SPG
  446.  
  447. CALL KRIPAD(MELEMD,IPADI)
  448. IPADS=IPADI
  449. IPADU=IPADI
  450. IF(MELEMD.NE.MELEMS)CALL KRIPAD(MELEMS,IPADS)
  451. MLENTI=IPADI
  452. IF(MELEM1.NE.MELEMD)CALL KRIPAD(MELEM1,MLENTI)
  453.  
  454. CALL VERPAD(IPADI,MELEM1,IRET)
  455. IF (IRET.NE.0) THEN
  456. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  457. MOTERR(1: 8) = 'INC '//NOMI
  458. MOTERR(9:16) = 'CHPOINT '
  459. CALL ERREUR(788)
  460. RETURN
  461. ENDIF
  462. C
  463. C- Test du nombre d'arguments
  464. C
  465. ICD=0
  466. IF(ISCHT.NE.0)ICD=1
  467. CALL ACME(MTABX,'IARG',IARG)
  468. IF (IDCENV.EQ.1) THEN
  469. IF (IARG.NE.(3+ICD).AND.IARG.NE.(5+ICD)) THEN
  470. C Indice %m1:8 : nombre d'arguments incorrect
  471. MOTERR(1:8) = 'IARG '
  472. CALL ERREUR(804)
  473. RETURN
  474. ENDIF
  475. ELSE
  476. IF (IARG.NE.(5+ICD)) THEN
  477. C Indice %m1:8 : nombre d'arguments incorrect
  478. MOTERR(1:8) = 'IARG '
  479. CALL ERREUR(804)
  480. RETURN
  481. ENDIF
  482. ENDIF
  483. C
  484. C- Lecture du coefficient multiplicateur SCAL CENTRE ou SCAL SOMMET
  485. C
  486. IXV(1) = MELEMC
  487. IXV(2) = 1
  488. IXV(3) = 0
  489. IXV(4) = MELEMS
  490. IRET = 4
  491. CALL LEKCOF(' Operateur DFDT :',
  492. & MTABX,KINC,1,IXV,MRO,IZRO,NPT1,NC1,IK1,IRET)
  493. IF (IRET.EQ.0) RETURN
  494. C
  495. C- Lecture de l'inconnue au pas de temps précédant
  496. C
  497. IF (NINKO.EQ.1) THEN
  498. IXV(1) = MELEMD
  499. ELSE
  500. IXV(1) =-MELEMD
  501. ENDIF
  502. IXV(2) = 0
  503. IXV(3) = 0
  504. CALL LEKCOF(' Operateur DFDT :',
  505. & MTABX,KINC,2,IXV,IZTG2,IZTGG2,NPT2,NC2,IK2,IRET)
  506. IF (IRET.EQ.0) RETURN
  507. C
  508. C- Lecture de l'inconnue au pas de temps n-2 (ISCHT NE 0)
  509. C
  510. IF (NINKO.EQ.1) THEN
  511. IXV(1) = MELEMD
  512. ELSE
  513. IXV(1) =-MELEMD
  514. ENDIF
  515. IXV(2) = 0
  516. IXV(3) = 0
  517. CALL LEKCOF(' Operateur DFDT :',
  518. & MTABX,KINC,(2+ICD),IXV,IZTG22,IZTGN2,NPT21,NC21,
  519. & IK21,IRET)
  520. IF (IRET.EQ.0) RETURN
  521. C
  522. C- Lecture du pas de temps
  523. C
  524.  
  525. TYPE=' '
  526. CALL ACMO(MTABX,'ARG3',TYPE,KK)
  527. IF(TYPE.EQ.'FLOTTANT')THEN
  528. CALL ACMF(MTABX,'ARG3',DTR)
  529. IF(KINT.NE.0)CALL ECMF(KINT,'DELTAT',DTR)
  530. ELSEIF(TYPE.EQ.'MOT')THEN
  531. CALL ACMM(MTABX,'ARG3',NOMDT)
  532. IF(NOMDT.NE.'DELTAT')THEN
  533.  
  534. IXV(1) = 0
  535. IXV(2) = 1
  536. IXV(3) = 0
  537. CALL LEKCOF(' Operateur DFDT :',
  538. & MTABX,KINC,(3+ICD),IXV,IZTG3,MZDT,NPT3,NC3,IK3,IRET)
  539. IF (IRET.EQ.0) RETURN
  540. DTR = MZDT.VPOCHA(1,1)
  541. IF(KINT.NE.0)CALL ECMF(KINT,'DELTAT',DTR)
  542.  
  543. ELSE
  544. IF(KINT.EQ.0)THEN
  545. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  546. MOTERR( 1: 8) = 'PASDETPS'
  547. MOTERR( 9:16) = 'PASDETPS'
  548. MOTERR(17:24) = ' EQEX '
  549. CALL ERREUR(786)
  550. RETURN
  551. ENDIF
  552. CALL ACMF(KINT,'DELTAT',DTR)
  553. CALL ACMF(MTAB1,'ALFA',ALFA)
  554. C write(6,*)' DFDT nomdt=',nomdt,' DTR=',dtr,alfa,(DTR*ALFA)
  555. DTR=DTR*ALFA
  556. ENDIF
  557. ENDIF
  558.  
  559. DTR = DTR * CDT
  560.  
  561. C
  562. C- Lecture des données pour le décentrement
  563. C- Champ de vitesse et viscosité
  564. C
  565. IKU=1
  566. MZUN=IZTU1
  567. MZMU=IZRO
  568. IKMU=1
  569.  
  570. IF (IARG.EQ.5) THEN
  571. IXV(1) =-MELEMS
  572. IXV(2) = 0
  573. IXV(3) = 1
  574. CALL LEKCOF(' Operateur DFDT :',
  575. & MTABX,KINC,(4+ICD),IXV,MUN,MZUN,NPTU,NCU,IKU,IRET)
  576. IF (IRET.EQ.0) RETURN
  577. IPADU=IPADS
  578. IF (IKU.EQ.2) IKU=1
  579. C
  580. IXV(1) = MELEMC
  581. IXV(2) = 1
  582. IXV(3) = 0
  583. IXV(4) = MELEMS
  584. IRET = 4
  585. CALL LEKCOF(' Operateur DFDT :',
  586. & MTABX,KINC,(5+ICD),IXV,MMU,MZMU,NPTMU,NCMU,IKMU,IRET)
  587. IF (IRET.EQ.0) RETURN
  588. ENDIF
  589. C
  590. C- Transformation éventuelle des arguments du SOMMET vers le CENTRE
  591. C
  592. IF (IK1.EQ.4) THEN
  593. CALL COSOCE(MELEMC,MELEMS,MELEMZ,IZRO,MPOVAL)
  594. IZRO = MPOVAL
  595. IK1 = 0
  596. IK1DETR = 1
  597. ELSE
  598. IK1DETR = 0
  599. ENDIF
  600. IF (IKMU.EQ.4) THEN
  601. CALL COSOCE(MELEMC,MELEMS,MELEMZ,MZMU,MPOVAL)
  602. MZMU = MPOVAL
  603. IKMU = 0
  604. IKMUDETR = 1
  605. ELSE
  606. IKMUDETR = 0
  607. ENDIF
  608. C
  609. C- Récupération de caractéristiques géométriques dans le cas EF
  610. C- ou du volume de chaque élément dans le cas VF
  611. C
  612.  
  613. IF (KPOIND.EQ.0) THEN
  614. ELSEIF (KPOIND.EQ.2) THEN
  615. CALL LEKTAB(MTABZ,'XXVOLUM',MCHPOI)
  616. IF (IERR.NE.0) RETURN
  617. CALL LICHTL(MCHPOI,MPOVAL,TYPC,IGEOM)
  618. ELSEIF (KPOIND.EQ.3.AND.MACRO.EQ.0) THEN
  619. CALL LEKTAB(MTABZ,'XXVOLUM',MCHPOI)
  620. IF (IERR.NE.0) RETURN
  621. CALL LICHTL(MCHPOI,MPOVAL,TYPC,IGEOM)
  622. ELSEIF (KPOIND.EQ.3.AND.MACRO.NE.0) THEN
  623. CALL LEKTAB(MTABZ,'VOLUMAC',MCHPOI)
  624. IF (IERR.NE.0) RETURN
  625. CALL LICHTM(MCHPOI,MPOVAL,TYPC,IGEOM)
  626. ENDIF
  627. C
  628. C- Récupération/Construction du chapeau de l'objet MATRIK
  629. C
  630. TYPE = ' '
  631. CALL ACMO(MTABX,'MATELM',TYPE,MATRIK)
  632. IF (TYPE.EQ.'MATRIK'.AND.KMACO.NE.0) THEN
  633. SEGACT MATRIK
  634. NMATRI = IRIGEL(/2)
  635. MELEME = IRIGEL(1,1)
  636. SEGACT MELEME
  637. IMATRI = IRIGEL(4,1)
  638. SEGACT IMATRI
  639. NBME = LIZAFM(/2)
  640. NINKO = NBME
  641. NBSOUS = LIZAFM(/1)
  642. MELEM1 = KSPGP
  643. ELSE
  644. NRIGE = 7
  645. NKID = 9
  646. NKMT = 7
  647. NMATRI = 1
  648. SEGINI MATRIK
  649. IRIGEL(1,1) = MELEME
  650. IRIGEL(2,1) = MELEME
  651.  
  652. IF (KFORM.EQ.0.OR.KFORM.EQ.2) THEN
  653. C EFM1 ou VF -> Diagonale
  654. IRIGEL(7,1) = 5
  655. ELSEIF (KFORM.EQ.1) THEN
  656. C EF matrice pleine sym si centree non sinon
  657. IF (IDCENV.EQ.1) THEN
  658. IRIGEL(7,1) = 0
  659. ELSE
  660. IRIGEL(7,1) = 2
  661. ENDIF
  662. ELSEIF (KFORM.EQ.3) THEN
  663. IF(KPOIND.EQ.2.OR.KPOIND.EQ.3)THEN
  664. IRIGEL(7,1) = 5
  665. ELSEIF(KPOIND.EQ.4)THEN
  666. IRIGEL(7,1) = 0
  667. ENDIF
  668. ENDIF
  669.  
  670. NBME = NINKO
  671. SEGACT MELEME
  672. NBSOUS = LISOUS(/1)
  673. IF (NBSOUS.EQ.0) NBSOUS=1
  674. SEGINI IMATRI
  675. IRIGEL(4,1) = IMATRI
  676. KSPGP = MELEM1
  677. KSPGD = MELEM1
  678. IF (NBME.EQ.1) THEN
  679. LISPRI(1) = NOMI(1:4)//' '
  680. LISDUA(1) = NOMI(1:4)//' '
  681. ELSE
  682. DO 10 I=1,NBME
  683. WRITE(NOM,FMT='(I1,A7)')I,NOMI(1:7)
  684. LISPRI(I) = NOM(1:4)//' '
  685. LISDUA(I) = NOM(1:4)//' '
  686. 10 CONTINUE
  687. ENDIF
  688. ENDIF
  689. C
  690. C- Construction des segments IZAFM contenant les matrices élémentaires
  691. C
  692. IF (KMACO.NE.2) THEN
  693. DO 30 L=1,NBSOUS
  694. IPT1 = MELEME
  695. IF (NBSOUS.NE.1) IPT1=LISOUS(L)
  696. SEGACT IPT1
  697. NP = IPT1.NUM(/1)
  698. MP = NP
  699. NBEL = IPT1.NUM(/2)
  700. SEGDES IPT1
  701. DO 20 I=1,NBME
  702. SEGINI IZAFM
  703. LIZAFM(L,I) = IZAFM
  704. 20 CONTINUE
  705. 30 CONTINUE
  706. ENDIF
  707. C
  708. C---------------------
  709. C Calcul des matrices
  710. C---------------------
  711. C
  712. IF (KMACO.NE.2) THEN
  713. C
  714. C--------------------------------------------------
  715. C-- Cas ou l'inconnue est au SOMMET (EF ou EFM1) --
  716. C--------------------------------------------------
  717. C
  718. IF (KPOIND.EQ.0) THEN
  719. K0 = 0
  720. IF (KFORM.EQ.0) THEN
  721. MELEME = MELEMZ
  722. SEGACT MELEME
  723. NBSOUS = LISOUS(/1)
  724. IF (NBSOUS.EQ.0) NBSOUS=1
  725. ENDIF
  726. DO 140 L=1,NBSOUS
  727. IPT1 = MELEME
  728. IF (NBSOUS.NE.1) IPT1=LISOUS(L)
  729. SEGACT IPT1
  730. NP = IPT1.NUM(/1)
  731. NBEL = IPT1.NUM(/2)
  732. NOM0 = NOMS(IPT1.ITYPEL)//' '
  733. CALL KALPBG(NOM0,'FONFORM ',IZFFM)
  734. IF (IZFFM.EQ.0) THEN
  735. C Echec lors de la lecture des fonctions de forme d'un élément
  736. CALL ERREUR(662)
  737. RETURN
  738. ENDIF
  739. SEGACT IZFFM
  740. IZHR = KZHR(1)
  741. SEGACT IZHR*MOD
  742. NPG = GR(/3)
  743. NES = GR(/1)
  744. C
  745. C- Allocation des tableaux de travail pour PETROV-GALERKIN
  746. C
  747. SEGINI PETROV
  748. C
  749. C- Traitement des éléments par paquets de LRV éléments
  750. C
  751. NNN = MOD(NBEL,LRV)
  752. IF (NNN.EQ.0) THEN
  753. NPACK = NBEL / LRV
  754. ELSE
  755. NPACK = 1 + (NBEL-NNN)/LRV
  756. ENDIF
  757. KPACKD = 1
  758. KPACKF = NPACK
  759. DO 130 KPACK=KPACKD,KPACKF
  760. KDEB = 1 + (KPACK-1)*LRV
  761. KFIN = MIN(NBEL,KDEB+LRV-1)
  762. C
  763. C- Réduction des coefficients sur les éléments du paquet
  764. C
  765. DO 40 K=KDEB,KFIN
  766. KP = K - KDEB + 1
  767. NK = K + K0
  768. NKR = (1-IK1)*(NK-1) + 1
  769. COEFK(KP) = IZRO.VPOCHA(NKR,1) / DTR
  770. 40 CONTINUE
  771. IF(IDCENV.NE.1)THEN
  772. DO 41 K=KDEB,KFIN
  773. KP = K - KDEB + 1
  774. NK = K + K0
  775. NKR = (1-IK1)*(NK-1) + 1
  776. NKM = (1-IKMU)*(NK-1) + 1
  777. ANUK(KP) = MZMU.VPOCHA(NKM,1)/(IZRO.VPOCHA(NKR,1)+XPETIT)
  778. 41 CONTINUE
  779. ENDIF
  780. C
  781. C- Récupération de la fonction de projection suivant IDCEN
  782. C
  783.  
  784. C CB215821 : DT n'est pas utilise mais doit etre initialise sinon NAN
  785. DT=0.D0
  786. IF(IDCENV.EQ.2)THEN
  787. DO 119 N=1,NBME
  788. CALL SUPGEF(FN,GR,PG,XYZ,HR,PGSQ,RPG,AJ,
  789. & NES,NP,NPG,IAXI,XCOOR,
  790. & IPT1.NUM,KDEB,KFIN,LRV,IDCENV,CMD,IKOMP,
  791. & IZTU1.VPOCHA(1,N),IPADI.LECT,MZUN.VPOCHA,IPADU.LECT,NPTU,
  792. & ANUK,WT(1,1,1,N),WS(1,1,1,N),HK,PGSK,RPGK,AJK,AIRE,UIL,DUIL,
  793. & DTM1,DT,DTT1,DTT2,DIAEL,NUEL)
  794. 119 CONTINUE
  795.  
  796. ELSE
  797. CALL SUPGEF(FN,GR,PG,XYZ,HR,PGSQ,RPG,AJ,
  798. & NES,NP,NPG,IAXI,XCOOR,
  799. & IPT1.NUM,KDEB,KFIN,LRV,IDCENV,CMD,IKOMP,
  800. & IZTU1.VPOCHA,IPADI.LECT,MZUN.VPOCHA,IPADU.LECT,NPTU,
  801. & ANUK,WT(1,1,1,1),WS(1,1,1,1),HK,PGSK,RPGK,AJK,AIRE,UIL,DUIL,
  802. & DTM1,DT,DTT1,DTT2,DIAEL,NUEL)
  803.  
  804. ENDIF
  805. C
  806. DO 120 N=1,NBME
  807. N1=1
  808. IF(IDCEN.EQ.2)N1=N
  809. C
  810. C- Matrice masse consistante
  811. C
  812. IF (KFORM.EQ.1) THEN
  813. IZAFM = LIZAFM(L,N)
  814. DO 80 K=KDEB,KFIN
  815. KP = K - KDEB + 1
  816. DO 70 I=1,NP
  817. DO 60 J=1,NP
  818. UU = 0.D0
  819. DO 50 LG=1,NPG
  820. UU=UU+FN(I,LG)*WT(KP,J,LG,N1)*PGSK(KP,LG)
  821. & *DEUPI*RPGK(KP,LG)
  822. 50 CONTINUE
  823. AM(K,I,J)=UU*COEFK(KP)*CN
  824. 60 CONTINUE
  825. 70 CONTINUE
  826. 80 CONTINUE
  827. C
  828. C- Matrice masse condensée
  829. C
  830. ELSE
  831. IZAFM = LIZAFM(1,N)
  832. DO 110 K=KDEB,KFIN
  833. KP = K - KDEB + 1
  834.  
  835. DO 100 J=1,NP
  836. UU = 0.D0
  837. DO 90 LG=1,NPG
  838. UU = UU + WT(KP,J,LG,N1)*PGSK(KP,LG)
  839. & *DEUPI*RPGK(KP,LG)
  840. 90 CONTINUE
  841.  
  842. KJ = MLENTI.LECT(IPT1.NUM(J,K))
  843. AM(KJ,1,1)=AM(KJ,1,1) + (UU*COEFK(KP)*CN)
  844. 100 CONTINUE
  845. 110 CONTINUE
  846. ENDIF
  847. 120 CONTINUE
  848. 130 CONTINUE
  849. K0 = K0 + NBEL
  850. SEGSUP PETROV
  851. 140 CONTINUE
  852. C
  853. C--------------------------------------------------
  854. C-- Cas ou l'inconnue est au CENTRE (VF ou EFM1) --
  855. C--------------------------------------------------
  856. C
  857. ELSEIF (KPOIND.EQ.2) THEN
  858. DO 160 N=1,NBME
  859. IZAFM = LIZAFM(1,N)
  860. DO 150 I=1,NBEL
  861. NKR = (1-IK1)*(I-1) + 1
  862. AM(I,1,1) = (VPOCHA(I,1) * IZRO.VPOCHA(NKR,1)*CN)/DTR
  863. 150 CONTINUE
  864. 160 CONTINUE
  865. C
  866. C------------------------------------------------------------
  867. C-- Cas ou l'inconnue est au CENTREP0 (EFMC MACRO ou QUAD) --
  868. C------------------------------------------------------------
  869. C
  870. ELSEIF (KPOIND.EQ.3) THEN
  871. DO 163 N=1,NBME
  872. IZAFM = LIZAFM(1,N)
  873. DO 153 I=1,NBEL
  874. NKR = (1-IK1)*(I-1) + 1
  875. AM(I,1,1) = (VPOCHA(I,1) * IZRO.VPOCHA(NKR,1)*CN)/DTR
  876. 153 CONTINUE
  877. 163 CONTINUE
  878. C
  879. C------------------------------------------------------------
  880. C-- Cas ou l'inconnue est au CENTREP1 (EFMC MACRO ou QUAD) --
  881. C------------------------------------------------------------
  882. C
  883. ELSEIF (KPOIND.EQ.4) THEN
  884.  
  885. DO N=1,NBME
  886. IZAFM = LIZAFM(1,N)
  887.  
  888. SEGACT MELEMO
  889. NBSOUS=MELEMO.LISOUS(/1)
  890. IF(NBSOUS.EQ.0)NBSOUS=1
  891. DO LS=1,NBSOUS
  892. IPT1=MELEMO
  893. IF(NBSOUS.NE.1)IPT1=MELEMO.LISOUS(LS)
  894. SEGACT IPT1
  895. NP1=IPT1.NUM(/1)
  896. NBEL1=IPT1.NUM(/2)
  897. IF(MQUAD.NE.0)THEN
  898. WRITE(NOM0,FMT='(A8)')NOMS(IPT1.ITYPEL)//'PRP1'
  899. ELSEIF(MACRO.NE.0)THEN
  900. WRITE(NOM0,FMT='(A8)')NOMS(IPT1.ITYPEL)//'MCP1'
  901. ENDIF
  902. CALL KALPBG(NOM0,'FONFORM ',IZFFM)
  903.  
  904. SEGACT IZFFM*MOD
  905. IZHR=KZHR(1)
  906. SEGACT IZHR*MOD
  907. NES=GR(/1)
  908. NPG=GR(/3)
  909. IZF1=KTP(1)
  910. SEGACT IZF1*MOD
  911. MP=IZF1.FN(/1)
  912.  
  913. NKR=1
  914. DO K=1,NBEL
  915.  
  916. DO I1=1,NP1
  917. J1=IPT1.NUM(I1,K)
  918. DO ND=1,IDIM
  919. XYZ(ND,I1)=XCOOR((J1-1)*(IDIM+1)+ND)
  920. ENDDO
  921. ENDDO
  922. CALL CALJBC(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,
  923. & IDIM,NP1,NPG,IAXI,AIR1)
  924.  
  925. DO 154 I=1,MP
  926. DO 155 J=1,MP
  927. U=0.D0
  928. DO 157 L=1,NPG
  929. U=U+IZF1.FN(I,L)*IZF1.FN(J,L)*PGSQ(L)
  930. 157 CONTINUE
  931. AM(K,I,J)=(U*IZRO.VPOCHA(NKR,1) * CN) / DTR
  932. 155 CONTINUE
  933. NKR = NKR + (1-IK1)
  934. 154 CONTINUE
  935. ENDDO
  936. ENDDO
  937. ENDDO
  938. ENDIF
  939. ENDIF
  940. C
  941. C--------------------------
  942. C Création du second-membre
  943. C--------------------------
  944. C Saturation de la matrice calculée ci-dessus par l'inconnue
  945. C au pas de temps précédent
  946. C
  947. C
  948. C- Construction du chapeau de l'objet CHAMPOIN qui contiendra le RHS
  949. C
  950. NAT = 2
  951. NSOUPO = 1
  952. SEGINI MCHPO1
  953. MCHPO1.IFOPOI = IFOUR
  954. MCHPO1.MOCHDE = TITREE
  955. MCHPO1.MTYPOI = 'SMBR'
  956. MCHPO1.JATTRI(1) = 2
  957. NC = NINKO
  958. SEGINI MSOUP1
  959. MCHPO1.IPCHP(1) = MSOUP1
  960. DO 170 N=1,NINKO
  961. MSOUP1.NOCOMP(N) = LISDUA(N)
  962. 170 CONTINUE
  963. MSOUP1.IGEOC = MELEM1
  964. SEGACT MELEM1
  965. N = MELEM1.NUM(/2)
  966. SEGINI MPOVA1
  967. MSOUP1.IPOVAL = MPOVA1
  968. SEGACT MELEM1
  969. NBSOUS = LIZAFM(/1)
  970. C
  971. MELEME = IRIGEL(1,1)
  972. IF(ISCHT.NE.2)THEN
  973. DO 220 L=1,NBSOUS
  974. IPT1 = MELEME
  975. IF (NBSOUS.NE.1) IPT1=LISOUS(L)
  976. SEGACT IPT1
  977. NP = IPT1.NUM(/1)
  978. NBEL = IPT1.NUM(/2)
  979. DO 210 N=1,NINKO
  980. IZAFM = LIZAFM(L,N)
  981. SEGACT IZAFM
  982. DO 200 K=1,NBEL
  983. DO 190 J=1,NP
  984. UU = 0.D0
  985. IU = LECT(IPT1.NUM(J,K))
  986. DO 180 I=1,NP
  987. IK = IPADI.LECT(IPT1.NUM(I,K))
  988. UU = UU + AM(K,I,J)*IZTGG2.VPOCHA(IK,N)/CN*CNM
  989. 180 CONTINUE
  990. MPOVA1.VPOCHA(IU,N) = MPOVA1.VPOCHA(IU,N) + UU
  991. 190 CONTINUE
  992. 200 CONTINUE
  993. 210 CONTINUE
  994. 220 CONTINUE
  995. ENDIF
  996.  
  997. C Cas BDF2 M Tn-2
  998. IF(ISCHT.EQ.1)THEN
  999. DO 222 L=1,NBSOUS
  1000. IPT1 = MELEME
  1001. IF (NBSOUS.NE.1) IPT1=LISOUS(L)
  1002. SEGACT IPT1
  1003. NP = IPT1.NUM(/1)
  1004. NBEL = IPT1.NUM(/2)
  1005. DO 212 N=1,NINKO
  1006. IZAFM = LIZAFM(L,N)
  1007. SEGACT IZAFM
  1008. DO 202 K=1,NBEL
  1009. DO 192 J=1,NP
  1010. UU = 0.D0
  1011. IU = LECT(IPT1.NUM(J,K))
  1012. DO 182 I=1,NP
  1013. IK = IPADI.LECT(IPT1.NUM(I,K))
  1014. UU = UU + AM(K,I,J)*IZTGN2.VPOCHA(IK,N)/CN*CNMM
  1015. 182 CONTINUE
  1016. MPOVA1.VPOCHA(IU,N) = MPOVA1.VPOCHA(IU,N) + UU
  1017. 192 CONTINUE
  1018. 202 CONTINUE
  1019. 212 CONTINUE
  1020. 222 CONTINUE
  1021. ENDIF
  1022. C
  1023. C- Sauvegarde de l'objet MATRIK à l'indice MATELM de la table KIZX et du
  1024. C- second-membre à l'indice SMBR de la table EQEX (assemblage éventuel)
  1025. C
  1026. CALL ECROBJ('MATRIK',MATRIK)
  1027. CALL ECROBJ('CHPOINT ',MCHPO1)
  1028.  
  1029. C
  1030. C- Désactivation et ménage
  1031. C
  1032. SEGDES MCHPO1,MSOUP1,MPOVA1
  1033. SEGDES IZTGG2
  1034. SEGDES IMATRI,MATRIK*NOMOD
  1035. IF (IK1DETR.EQ.1) SEGSUP IZRO
  1036. IF (IKMUDETR.EQ.1) SEGSUP MZMU
  1037.  
  1038. IF(IPADS.NE.IPADI)SEGSUP IPADS
  1039. IF(MLENTI.NE.IPADI)SEGSUP IPADI
  1040. SEGSUP IPADI
  1041.  
  1042. RETURN
  1043. 1002 FORMAT(10(1X,1PE11.4))
  1044. END
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.  

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