Télécharger ydiag.eso

Retour à la liste

Numérotation des lignes :

ydiag
  1. C YDIAG SOURCE CB215821 20/11/25 13:43:45 10792
  2. SUBROUTINE YDIAG
  3. C======================================================================
  4. C L'opérateur MDIA calcul une matrice de couplage entre deux inconnues.
  5. C----------------------------------------------------------------------
  6. C La discrétisation est de type 0D ou multiD. Le sous type de la table
  7. C d'entrée permet d'identifier la discrétisation utilisée.
  8. C----------------------------------------------------------------------
  9. C
  10. C-------------------------
  11. C Phrase d'appel GIBIANE :
  12. C-------------------------
  13. C
  14. C 'MDIA' TAB1 ;
  15. C
  16. C TAB1 : Table de sous-type 'OPER_0D' ou 'KIZX' selon la discrétisation
  17. C
  18. C--------------------------------
  19. C Construction de KIZX via EQEX :
  20. C--------------------------------
  21. C
  22. C 'ZONE' TAB2 'OPER' 'MDIA' OBJ1 'INCO' MOT1 (MOT2)
  23. C
  24. C TAB2 : TABLE DOMAINE associée à la zone d'action de l'opérateur.
  25. C OBJ1 : Coefficient multiplicateur h (CHPO, ENTIER, FLOTTANT,
  26. C POINT ou MOT).
  27. C MOT1 : Nom de l'inconnue primale (MOT).
  28. C MOT2 : Nom de l'inconnue duale (facultatif si égal à MOT1 - MOT).
  29. C
  30. C-----------
  31. C Résultat :
  32. C-----------
  33. C
  34. C On crée une matrice diagonale : en multiD, stockée dans un MATRIK et
  35. C rangée à l'indice 'MATELM' de la table de sous-type 'KIZX' ; en 0D,
  36. C dans un objet 'RIGIDITE' à l'indice 'LHS' de la table de sous-type
  37. C 'OPER_0D'.
  38. C
  39. C------------------------------------
  40. C Dimensions et supports des données :
  41. C------------------------------------
  42. C
  43. C Les cas considérés sont les suivants :
  44. C
  45. C +--------------------------------+
  46. C | D i m e n s i o n |
  47. C --------------+--------------------------------+
  48. C cas considéré | duale V | primale T | coeff. a |
  49. C --------------+--------------------------------+
  50. C a T dans V 1 1 1
  51. C ->->
  52. C a T dans V 1 IDIM IDIM
  53. C -> ->
  54. C a T dans V IDIM 1 IDIM
  55. C -> ->
  56. C a T dans V IDIM IDIM 1
  57. C --------------+--------------------------------+
  58. C
  59. C
  60. C Pour chaque champ, on désigne par S, C et F les spg SOMMET, CENTRE
  61. C et FACE. Les cas considérés sont :
  62. C
  63. C --------------+-------------+
  64. C cas considéré | 1 2 3 4 5 6 |
  65. C --------------+-------------+
  66. C primale S C F S S C
  67. C duale S C F C C S
  68. C coeff S C F S C C
  69. C --------------+-------------+
  70. C IKAS 1 1 1 si primale et duale meme nom
  71. C 2 2 2 3 3 4 si nom primal <> nom dual
  72. C --------------+-------------+
  73. C
  74. C Le croisement de ces deux tableaux donnent les différents cas.
  75. C
  76. C
  77. C-----------------------
  78. C Variables importante :
  79. C-----------------------
  80. C
  81. C IK1 = Type du coefficient (0:CHPOINT, 1:ENTIERouFLOTTANT, 2:POINT)
  82. C IKOU = 0 si la matrice de couplage est sur la diagonale, 1 sinon
  83. C KFORM = Discrétisation spatiale (0:SI, 1:EF, 2:VF)
  84. C KIMPL = Discrétisation temporelle (0:EXPL, 1:IMPL, 2:CN)
  85. C KK = Rang d'un élément dans la numérotation globale
  86. C KPOIN = Support du CHAMPOIN (0:SOMMET, 1:FACE, 2:CENTRE)
  87. C NC = Rang de la composante du champ multiplicateur à considérer
  88. C
  89. C----------------------------------------------------------------------
  90. IMPLICIT INTEGER(I-N)
  91. IMPLICIT REAL*8 (A-H,O-Z)
  92. C
  93.  
  94. -INC PPARAM
  95. -INC CCOPTIO
  96. -INC CCGEOME
  97. -INC SMCOORD
  98. -INC SMLENTI
  99. -INC SMELEME
  100. POINTEUR MELEMP.MELEME
  101. -INC SMCHPOI
  102. -INC SMCHAML
  103. -INC SMTABLE
  104. -INC SMLMOTS
  105. C
  106. CHARACTER*8 TYPE,TYPC,NOM,NOMP,NOMD,CHAI,MTYP
  107. PARAMETER (NTB=2)
  108. CHARACTER*8 LTAB(NTB)
  109. DIMENSION KTAB(NTB),IXV(4)
  110.  
  111. C******************************************************************
  112. segact mcoord
  113. CMDIA
  114. C write(6,*)' Debut MDIA '
  115.  
  116. C Nouvelle directive EQUA de EQEX
  117. MTYP=' '
  118. CALL QUETYP(MTYP,0,IRET)
  119. IF(IRET.EQ.0)THEN
  120. C% On attend un des objets : %m1:8 %m9:16 %m17:24 %m25:32 %m33:40
  121. MOTERR( 1: 8) = 'CHAI '
  122. MOTERR( 9:16) = 'MMODEL '
  123. MOTERR(17:24) = 'TABLE '
  124. CALL ERREUR(472)
  125. RETURN
  126. ENDIF
  127.  
  128. IF(MTYP.EQ.'MMODEL')THEN
  129. CALL YTCLSF(' M ','MDIA ')
  130. RETURN
  131. ELSEIF(MTYP.EQ.'MOT ')THEN
  132. CALL LIRCHA(CHAI,1,IRET)
  133. CALL YTCLSF(CHAI,'MDIA ')
  134. RETURN
  135. ENDIF
  136. C Fin Nouvelle directive EQUA de EQEX
  137.  
  138. C
  139. C- LECTURE de la table TAB1 contenant les données et bifurcation si 0D.
  140. C- (repérage de la discrétisation 2D/3D ou 0D par le sous-type de TAB1
  141. C- [respectivement, KIZX ou OPER_0D]).
  142. C
  143. LTAB(1) = 'KIZX '
  144. LTAB(2) = 'OPER_0D '
  145. KTAB(1) = 0
  146. KTAB(2) = 0
  147. CALL LITABS(LTAB,KTAB,NTB,0,IRET)
  148. IF (IERR.NE.0) RETURN
  149. IF (KTAB(1).NE.0) THEN
  150. MTABX = KTAB(1)
  151. ELSEIF (KTAB(2).NE.0) THEN
  152. IPTAB1 = KTAB(2)
  153. CALL TDIAG (IPTAB1)
  154. RETURN
  155. ELSE
  156. C Le sous-type de la table est incorrect
  157. CALL ERREUR(648)
  158. RETURN
  159. ENDIF
  160. C
  161. C- Récupération de la table des options KOPT
  162. C
  163. CALL LEKTAB(MTABX,'KOPT',KOPTI)
  164. IF (KOPTI.EQ.0) THEN
  165. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  166. MOTERR( 1: 8) = ' KOPT '
  167. MOTERR( 9:16) = ' KOPT '
  168. MOTERR(17:24) = ' KIZX '
  169. CALL ERREUR(786)
  170. RETURN
  171. ELSE
  172. CALL ACME(KOPTI,'KIMPL',KIMPL)
  173. IF (IERR.NE.0) RETURN
  174. CALL ACME(KOPTI,'KFORM',KFORM)
  175. IF (IERR.NE.0) RETURN
  176. ENDIF
  177. IF (KIMPL.NE.1) THEN
  178. C Tentative d'utilisation d'une option non implémentée
  179. CALL ERREUR(251)
  180. RETURN
  181. ENDIF
  182. C
  183. C- Récupération des tables : EQEX, INCO, DOMAINE
  184. C
  185. CALL LEKTAB(MTABX,'EQEX',MTAB1)
  186. IF (MTAB1.EQ.0) THEN
  187. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  188. MOTERR( 1: 8) = ' EQEX '
  189. MOTERR( 9:16) = ' EQEX '
  190. MOTERR(17:24) = ' KIZX '
  191. CALL ERREUR(786)
  192. RETURN
  193. ENDIF
  194. CALL ACME(MTAB1,'NAVISTOK',NASTOK)
  195. CALL LEKTAB(MTAB1,'INCO',KINC)
  196. IF (KINC.EQ.0) THEN
  197. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  198. MOTERR( 1: 8) = ' INCO '
  199. MOTERR( 9:16) = ' INCO '
  200. MOTERR(17:24) = ' EQEX '
  201. CALL ERREUR(786)
  202. RETURN
  203. ENDIF
  204. CALL LEKTAB(MTABX,'DOMZ',MTABZ)
  205. IF (MTABZ.EQ.0) THEN
  206. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  207. MOTERR( 1: 8) = ' DOMZ '
  208. MOTERR( 9:16) = ' DOMZ '
  209. MOTERR(17:24) = ' EQEX '
  210. CALL ERREUR(786)
  211. RETURN
  212. ENDIF
  213. C
  214. C- Récupération des indices MAILLAGE, CENTRE, FACE
  215. C- et SOMMET du DOMAINE local
  216. C
  217. TYPE = 'MAILLAGE'
  218. CALL ACMO(MTABZ,'CENTRE',TYPE,MELEMC)
  219. IF (IERR.NE.0) RETURN
  220. CALL ACMO(MTABZ,'FACE',TYPE,MELEMF)
  221. IF (IERR.NE.0) RETURN
  222. CALL ACMO(MTABZ,'SOMMET',TYPE,MELEMS)
  223. IF (IERR.NE.0) RETURN
  224. CALL ACMO(MTABZ,'MAILLAGE',TYPE,MELEME)
  225. IF (IERR.NE.0) RETURN
  226. C
  227. C- Récupération du nom des inconnues primale et duale
  228. C
  229. TYPE = 'LISTMOTS'
  230. CALL ACMO(MTABX,'LISTINCO',TYPE,MLMOTS)
  231. SEGACT MLMOTS
  232. NBINC = MOTS(/2)
  233. IF (NBINC.LE.0.OR.NBINC.GE.3) THEN
  234. C Indice %m1:8 : contient plus de %i1 %m9:16
  235. MOTERR( 1:8) = 'LISTINCO'
  236. INTERR(1) = 2
  237. MOTERR(9:16) = ' MOTS '
  238. CALL ERREUR(799)
  239. RETURN
  240. ENDIF
  241. NOMP = MOTS(1)//' '
  242. IF (NBINC.EQ.1) THEN
  243. NOMD = NOMP
  244. IKOU = 0
  245. ELSE
  246. NOMD = MOTS(2)//' '
  247. IF (NOMP.EQ.NOMD) THEN
  248. IKOU = 0
  249. ELSE
  250. IKOU = 1
  251. ENDIF
  252. ENDIF
  253. SEGDES MLMOTS
  254. C
  255. C- Récupération de l'inconnue primale et de son spg
  256. C
  257. TYPE = ' '
  258. CALL ACMO(KINC,NOMP,TYPE,MCHPOI)
  259. IF (TYPE.NE.'CHPOINT ') THEN
  260. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  261. MOTERR( 1: 8) = 'INCO'//NOMP(1:4)
  262. MOTERR( 9:16) = 'CHPOINT '
  263. CALL ERREUR(800)
  264. RETURN
  265. ELSE
  266. CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMP)
  267. NINKOP = VPOCHA(/2)
  268. SEGDES MPOVAL
  269. IF (NINKOP.NE.1.AND.NINKOP.NE.IDIM) THEN
  270. C Indice %m1:8 : Le %m9:16 n'a pas le bon nombre de composantes
  271. MOTERR( 1: 8) = 'INCO'//NOMP(1:4)
  272. MOTERR( 9:16) = 'CHPOINT '
  273. CALL ERREUR(784)
  274. RETURN
  275. ENDIF
  276. ENDIF
  277. C
  278. C- Récupération de l'inconnue duale et de son spg
  279. C
  280. IF (IKOU.EQ.0) THEN
  281. MELEMD = MELEMP
  282. NINKOD = NINKOP
  283. ELSE
  284. TYPE = ' '
  285. CALL ACMO(KINC,NOMD,TYPE,MCHPOI)
  286. IF (TYPE.NE.'CHPOINT ') THEN
  287. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  288. MOTERR( 1: 8) = 'INCO'//NOMD(1:4)
  289. MOTERR( 9:16) = 'CHPOINT '
  290. CALL ERREUR(800)
  291. RETURN
  292. ELSE
  293. CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMD)
  294. NINKOD = VPOCHA(/2)
  295. SEGDES MPOVAL
  296. IF (NINKOD.NE.1.AND.NINKOD.NE.IDIM) THEN
  297. C Indice %m1:8 : Le %m9:16 n'a pas le bon nombre de comp...
  298. MOTERR( 1: 8) = 'INCO'//NOMD(1:4)
  299. MOTERR( 9:16) = 'CHPOINT '
  300. CALL ERREUR(784)
  301. RETURN
  302. ENDIF
  303. ENDIF
  304. ENDIF
  305. C
  306. C- Identification du spg de l'inconnue primale
  307. C Cas 1D (IRET1=1) : face et sommet sont confondus
  308. C Elt de degré 2 (IRET1=0) : face et centre inclus dans sommet
  309. C
  310. CALL KRIPAD(MELEMP,MLENT1)
  311. CALL VERPAD(MLENT1,MELEMS,IRETS)
  312. CALL VERPAD(MLENT1,MELEMF,IRETF)
  313. CALL VERPAD(MLENT1,MELEMC,IRETC)
  314. SEGSUP MLENT1
  315. IRET1 = IRETS + IRETC + IRETF
  316. IF (IRET1.EQ.0) THEN
  317. IRETF = 1
  318. IRETC = 1
  319. IRET1 = 2
  320. ENDIF
  321. IF (IRET1.EQ.1.AND.IRETF.EQ.1) THEN
  322. IRETS = 1
  323. IRET1 = 2
  324. ENDIF
  325. IF (IRET1.EQ.1.AND.IRETC.EQ.1) THEN
  326. IRETF = 1
  327. IRET1 = 2
  328. ENDIF
  329. IF (IRET1.EQ.2) THEN
  330. IF (IRETS.EQ.0) THEN
  331. KPOINP = 0
  332. MELEMP = MELEMS
  333. ELSEIF (IRETF.EQ.0) THEN
  334. KPOINP = 1
  335. MELEMP = MELEMF
  336. ELSEIF (IRETC.EQ.0) THEN
  337. KPOINP = 2
  338. MELEMP = MELEMC
  339. ENDIF
  340. ELSE
  341. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  342. MOTERR(1: 8) = 'INCO'//NOMP(1:4)
  343. MOTERR(9:16) = 'CHPOINT '
  344. CALL ERREUR(788)
  345. RETURN
  346. ENDIF
  347. C
  348. C- Identification du spg de l'inconnue duale
  349. C
  350. IF (IKOU.EQ.0) THEN
  351. KPOIND = KPOINP
  352. MELEMD = MELEMP
  353. ELSE
  354. CALL KRIPAD(MELEMD,MLENT2)
  355. CALL VERPAD(MLENT2,MELEMS,IRETS)
  356. CALL VERPAD(MLENT2,MELEMF,IRETF)
  357. CALL VERPAD(MLENT2,MELEMC,IRETC)
  358. SEGSUP MLENT2
  359. IRET1 = IRETS + IRETC + IRETF
  360. IF (IRET1.EQ.0) THEN
  361. IRETF = 1
  362. IRETC = 1
  363. IRET1 = 2
  364. ENDIF
  365. IF (IRET1.EQ.1.AND.IRETF.EQ.1) THEN
  366. IRETS = 1
  367. IRET1 = 2
  368. ENDIF
  369. IF (IRET1.EQ.1.AND.IRETC.EQ.1) THEN
  370. IRETF = 1
  371. IRET1 = 2
  372. ENDIF
  373. IF (IRET1.EQ.2) THEN
  374. IF (IRETS.EQ.0) THEN
  375. KPOIND = 0
  376. MELEMD = MELEMS
  377. ELSEIF (IRETF.EQ.0) THEN
  378. KPOIND = 1
  379. MELEMD = MELEMF
  380. ELSEIF (IRETC.EQ.0) THEN
  381. KPOIND = 2
  382. MELEMD = MELEMC
  383. ENDIF
  384. ELSE
  385. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon spg
  386. MOTERR(1: 8) = 'INCO'//NOMD(1:4)
  387. MOTERR(9:16) = 'CHPOINT '
  388. CALL ERREUR(788)
  389. RETURN
  390. ENDIF
  391. ENDIF
  392. C
  393. C- Compatibilité du spg de la duale avec les options
  394. C
  395. IF (KPOIND.NE.2.AND.KFORM.EQ.2) THEN
  396. C Option %m1:8 incompatible avec les données
  397. MOTERR( 1: 8) = ' VF '
  398. CALL ERREUR(803)
  399. RETURN
  400. ENDIF
  401. C
  402. C- Identification du cas à traiter
  403. C
  404. IF (KPOINP.EQ.KPOIND) THEN
  405. IF (IKOU.EQ.0) THEN
  406. IKAS = 1
  407. ELSE
  408. IKAS = 2
  409. ENDIF
  410. ELSEIF (KPOINP.EQ.0.AND.KPOIND.EQ.2) THEN
  411. IKAS = 3
  412. ELSEIF (KPOINP.EQ.2.AND.KPOIND.EQ.0)THEN
  413. IKAS = 4
  414. ELSE
  415. C Option indisponible
  416. CALL ERREUR(19)
  417. RETURN
  418. ENDIF
  419. C
  420. C- Récupération suivant IKAS des "matrices masses" élémentaires
  421. C
  422. IF (IKAS.EQ.1.OR.IKAS.EQ.2) THEN
  423. IF (KPOINP.EQ.0) THEN
  424. CALL LEKTAB(MTABZ,'XXDIAGSI',MCHPOI)
  425. ELSEIF (KPOINP.EQ.1) THEN
  426. CALL LEKTAB(MTABZ,'XXDIAGFA',MCHPOI)
  427. ELSEIF (KPOINP.EQ.2) THEN
  428. CALL LEKTAB(MTABZ,'XXVOLUM ',MCHPOI)
  429. ENDIF
  430. IF (IERR.NE.0) RETURN
  431. ELSE
  432. CALL LEKTAB(MTABZ,'XXPSOML',MCHELM)
  433. IF (IERR.NE.0) RETURN
  434. ENDIF
  435. C
  436. C- Lecture du coefficient multiplicateur :
  437. C- 1) son support est celui de la primale ou CENTRE si primale<>FACE
  438. C- 2) sa dimension dépend de primale et duale (cf cas prévu en tete)
  439. C
  440. CALL ACME(MTABX,'IARG',IARG)
  441. IF (IERR.NE.0) RETURN
  442. IF (IARG.NE.1)THEN
  443. C Indice %m1:8 : nombre d'argument incorrect
  444. MOTERR(1:8) = 'IARG '
  445. CALL ERREUR(804)
  446. RETURN
  447. ENDIF
  448. IF (NINKOP.EQ.NINKOD) THEN
  449. IXV(1) = MELEMP
  450. IXV(2) = 1
  451. IXV(3) = 0
  452. IF (IKAS.NE.3) THEN
  453. IRET = 0
  454. ELSE
  455. IRET = 4
  456. IXV(4) = MELEMC
  457. ENDIF
  458. ELSE
  459. IXV(1) = - MELEMP
  460. IXV(2) = 1
  461. IXV(3) = 1
  462. IF (IKAS.NE.3) THEN
  463. IRET = 0
  464. ELSE
  465. IRET = 4
  466. IXV(4) = - MELEMC
  467. ENDIF
  468. ENDIF
  469. CALL LEKCOF('Opérateur MDIA : ',
  470. & MTABX,KINC,1,IXV,MCHPO1,MPOVA1,NPT1,NCOF,IK1,IRET)
  471. IF (IRET.EQ.0) RETURN
  472. C
  473. C------------------------------------------------------------
  474. C- Spg des inconnues primale et duale identique (IKAS=1 ou 2)
  475. C------------------------------------------------------------
  476. C
  477. IF (IKAS.EQ.1.OR.IKAS.EQ.2) THEN
  478. NBSOUS = 1
  479. NRIGE = 7
  480. NKID = 9
  481. NKMT = 7
  482. NMATRI = 1
  483. SEGINI MATRIK
  484. IRIGEL(1,1) = MELEMP
  485. IRIGEL(2,1) = MELEMD
  486. IF (IKOU.EQ.0) THEN
  487. IRIGEL(7,1) = 5
  488. ELSE
  489. IRIGEL(7,1) = 2
  490. ENDIF
  491. IF (NINKOD*NINKOP.EQ.1) THEN
  492. NBME = 1
  493. ELSE
  494. NBME = IDIM
  495. ENDIF
  496. SEGINI IMATRI
  497. IRIGEL(4,1) = IMATRI
  498. KSPGP = MELEMP
  499. KSPGD = MELEMD
  500. SEGACT MELEMP
  501. NP = 1
  502. MP = 1
  503. NBEL = MELEMP.NUM(/2)
  504. SEGDES MELEMP
  505. CALL LICHT(MCHPOI,MPOVAL,TYPC,IGEOM)
  506. DO 130 N=1,NBME
  507. NC = MIN(N,NCOF)
  508. C
  509. C- Initialisation du nom des composantes primale et duale
  510. C- associées au Nième bloc de matrices élémentaires
  511. C
  512. IF (NINKOP.EQ.1) THEN
  513. NOM = NOMP
  514. ELSE
  515. WRITE(NOM,FMT='(I1,A7)') N,NOMP(1:7)
  516. ENDIF
  517. LISPRI(N)=NOM(1:4)//' '
  518. IF (NINKOD.EQ.1) THEN
  519. NOM = NOMD
  520. ELSE
  521. WRITE(NOM,FMT='(I1,A7)') N,NOMD(1:7)
  522. ENDIF
  523. LISDUA(N)=NOM(1:4)//' '
  524. C
  525. C- Calcul des matrices élémentaires associées au Nième bloc
  526. C
  527. SEGINI IZAFM
  528. LIZAFM(1,N) = IZAFM
  529. IF (IK1.EQ.1) THEN
  530. DO 100 K=1,NBEL
  531. AM(K,1,1) = VPOCHA(K,1) * MPOVA1.VPOCHA(1,1)
  532. 100 CONTINUE
  533. ELSEIF(IK1.EQ.2)THEN
  534. DO 110 K=1,NBEL
  535. AM(K,1,1) = VPOCHA(K,1) * MPOVA1.VPOCHA(1,N)
  536. 110 CONTINUE
  537. ELSEIF(IK1.EQ.0)THEN
  538. DO 120 K=1,NBEL
  539. AM(K,1,1) = VPOCHA(K,1) * MPOVA1.VPOCHA(K,NC)
  540. 120 CONTINUE
  541. ENDIF
  542. SEGDES IZAFM
  543. 130 CONTINUE
  544. SEGDES MPOVAL
  545. SEGDES IMATRI,MATRIK
  546. C
  547. C-------------------------------------
  548. C Primale au CENTRE et Duale au SOMMET
  549. C-------------------------------------
  550. C
  551. ELSEIF (IKAS.EQ.3) THEN
  552. IF (IK1.EQ.0) THEN
  553. ITEST = ABS(IXV(1))
  554. CALL KRIPAD(ITEST,MLENT3)
  555. ENDIF
  556. SEGACT MCHELM
  557. NBSOUS = IMACHE(/1)
  558. NRIGE = 7
  559. NKID = 9
  560. NKMT = 7
  561. NMATRI = 1
  562. SEGINI MATRIK
  563. IRIGEL(1,1) = MELEME
  564. IRIGEL(2,1) = MELEMC
  565. IRIGEL(7,1) = 3
  566. IF (NINKOD*NINKOP.EQ.1) THEN
  567. NBME = 1
  568. ELSE
  569. NBME = IDIM
  570. ENDIF
  571. SEGINI IMATRI
  572. IRIGEL(4,1) = IMATRI
  573. KSPGP = MELEMS
  574. KSPGD = MELEMC
  575. DO 350 N=1,NBME
  576. NC = MIN(N,NCOF)
  577. C
  578. C- Initialisation du nom des composantes primale et duale
  579. C- associées au Nième bloc de matrices élémentaires
  580. C
  581. IF (NINKOP.EQ.1) THEN
  582. NOM = NOMP
  583. ELSE
  584. WRITE(NOM,FMT='(I1,A7)') N,NOMP(1:7)
  585. ENDIF
  586. LISPRI(N)=NOM(1:4)//' '
  587. IF (NINKOD.EQ.1) THEN
  588. NOM = NOMD
  589. ELSE
  590. WRITE(NOM,FMT='(I1,A7)') N,NOMD(1:7)
  591. ENDIF
  592. LISDUA(N)=NOM(1:4)//' '
  593. C
  594. C- Calcul des matrices élémentaires associées au Nième bloc
  595. C
  596. KK = 0
  597. DO 340 L=1,NBSOUS
  598. MCHAML = ICHAML(L)
  599. SEGACT MCHAML
  600. MELVAL = IELVAL(1)
  601. SEGACT MELVAL
  602. IPT1 = IMACHE(L)
  603. SEGACT IPT1
  604. MP = 1
  605. NP = IPT1.NUM(/1)
  606. NBEL = IPT1.NUM(/2)
  607. SEGINI IZAFM
  608. LIZAFM(L,N) = IZAFM
  609. IF (IK1.EQ.1) THEN
  610. DO K=1,NBEL
  611. DO II=1,NP
  612. AM(K,II,1) = VELCHE(II,K) * MPOVA1.VPOCHA(1,1)
  613. ENDDO
  614. ENDDO
  615. ELSEIF (IK1.EQ.2) THEN
  616. DO K=1,NBEL
  617. DO II=1,NP
  618. AM(K,II,1) = VELCHE(II,K) * MPOVA1.VPOCHA(1,N)
  619. ENDDO
  620. ENDDO
  621. ELSEIF (IK1.EQ.4) THEN
  622. DO K=1,NBEL
  623. KK = KK + 1
  624. DO II=1,NP
  625. AM(K,II,1)=VELCHE(II,K)*MPOVA1.VPOCHA(KK,NC)
  626. ENDDO
  627. ENDDO
  628. ELSEIF (IK1.EQ.0) THEN
  629. DO K=1,NBEL
  630. DO II=1,NP
  631. KD = MLENT3.LECT(IPT1.NUM(II,K))
  632. AM(K,II,1) = VELCHE(II,K) * MPOVA1.VPOCHA(KD,NC)
  633. ENDDO
  634. ENDDO
  635. ENDIF
  636. SEGDES IZAFM
  637. SEGDES IPT1,MELVAL,MCHAML
  638. 340 CONTINUE
  639. 350 CONTINUE
  640. SEGDES IMATRI,MATRIK
  641. SEGDES MCHELM
  642. IF (IK1.EQ.0) SEGSUP MLENT3
  643. C
  644. C-------------------------------------
  645. C Primale au CENTRE et Duale au SOMMET
  646. C-------------------------------------
  647. C
  648. ELSEIF (IKAS.EQ.4) THEN
  649. SEGACT MCHELM
  650. NBSOUS = IMACHE(/1)
  651. NRIGE = 7
  652. NKID = 9
  653. NKMT = 7
  654. NMATRI = 1
  655. SEGINI MATRIK
  656. IRIGEL(1,1) = MELEMC
  657. IRIGEL(2,1) = MELEME
  658. IRIGEL(7,1) = 3
  659. IF (NINKOD*NINKOP.EQ.1) THEN
  660. NBME = 1
  661. ELSE
  662. NBME = IDIM
  663. ENDIF
  664. SEGINI IMATRI
  665. IRIGEL(4,1) = IMATRI
  666. KSPGP = MELEMC
  667. KSPGD = MELEMS
  668. DO 440 N=1,NBME
  669. NC = MIN(N,NCOF)
  670. C
  671. C- Initialisation du nom des composantes primale et duale
  672. C- associées au Nième bloc de matrices élémentaires
  673. C
  674. IF (NINKOP.EQ.1) THEN
  675. NOM = NOMP
  676. ELSE
  677. WRITE(NOM,FMT='(I1,A7)') N,NOMP(1:7)
  678. ENDIF
  679. LISPRI(N)=NOM(1:4)//' '
  680. IF (NINKOD.EQ.1) THEN
  681. NOM = NOMD
  682. ELSE
  683. WRITE(NOM,FMT='(I1,A7)') N,NOMD(1:7)
  684. ENDIF
  685. LISDUA(N)=NOM(1:4)//' '
  686. C
  687. C- Calcul des matrices élémentaires associées au Nième bloc
  688. C
  689. KK = 0
  690. DO 430 L=1,NBSOUS
  691. MCHAML = ICHAML(L)
  692. SEGACT MCHAML
  693. MELVAL = IELVAL(1)
  694. SEGACT MELVAL
  695. IPT1 = IMACHE(L)
  696. SEGACT IPT1
  697. MP = IPT1.NUM(/1)
  698. NP = 1
  699. NBEL = IPT1.NUM(/2)
  700. SEGINI IZAFM
  701. LIZAFM(L,N) = IZAFM
  702. IF (IK1.EQ.1) THEN
  703. DO K=1,NBEL
  704. DO II=1,MP
  705. AM(K,1,II) = VELCHE(II,K) * MPOVA1.VPOCHA(1,1)
  706. ENDDO
  707. ENDDO
  708. ELSEIF (IK1.EQ.2) THEN
  709. DO K=1,NBEL
  710. DO II=1,MP
  711. AM(K,1,II) = VELCHE(II,K) * MPOVA1.VPOCHA(1,N)
  712. ENDDO
  713. ENDDO
  714. ELSEIF (IK1.EQ.0) THEN
  715. DO K=1,NBEL
  716. KK = KK + 1
  717. DO II=1,MP
  718. AM(K,1,II) = VELCHE(II,K) * MPOVA1.VPOCHA(KK,NC)
  719. ENDDO
  720. ENDDO
  721. ENDIF
  722. SEGDES IZAFM
  723. SEGDES IPT1,MELVAL,MCHAML
  724. 430 CONTINUE
  725. 440 CONTINUE
  726. SEGDES IMATRI,MATRIK
  727. SEGDES MCHELM
  728. ENDIF
  729. SEGDES MPOVA1
  730. C
  731. IF(NASTOK.EQ.0)THEN
  732. C
  733. C- Ecriture du résultat à l'indice 'MATELM' de la table 'KIZX'
  734. C
  735. CALL ECMO(MTABX,'MATELM','MATRIK',MATRIK)
  736. ELSE
  737. C
  738. C- Ecriture des résultats dans la pile des objets
  739. C
  740. NAT=2
  741. NSOUPO=0
  742. SEGINI MCHPO1
  743. MCHPO1.JATTRI(1)=2
  744. CALL ECROBJ('MATRIK',MATRIK)
  745. CALL ECROBJ('CHPOINT',MCHPO1)
  746. ENDIF
  747. RETURN
  748. END
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  

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