Télécharger zdfdt.eso

Retour à la liste

Numérotation des lignes :

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

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