Télécharger kmfn.eso

Retour à la liste

Numérotation des lignes :

kmfn
  1. C KMFN SOURCE GOUNAND 25/11/12 21:15:27 12399
  2. SUBROUTINE KMFN
  3. C ***********************************************************************
  4. C
  5. C Objet : Cet operateur calcule soit A * U
  6. C t
  7. C soit A U
  8. C Syntaxe :
  9. C CAS 1 /
  10. C
  11. C B = KMF MATRIK MCHPOI ;
  12. C
  13. C
  14. C CAS 2 /
  15. C
  16. C B = KMF MATRIK MCHPOI 'TRAN' ;
  17. C
  18. C MATRIK MATRICES ELEMENTAIRES
  19. C MCHPOI CHPOINT CONTENANT U
  20. C
  21. C ***********************************************************************
  22. IMPLICIT INTEGER(I-N)
  23. IMPLICIT REAL*8 (A-H,O-Z)
  24.  
  25. -INC PPARAM
  26. -INC CCOPTIO
  27. -INC SMELEME
  28. POINTEUR MELEMP.MELEME,MELEMD.MELEME,MELEM1.MELEME
  29. POINTEUR ISPGD.MELEME
  30. -INC SMLENTI
  31. -INC SMCHPOI
  32. POINTEUR MCHINI.MCHPOI
  33. LOGICAL LNEW,LFIRST
  34. CHARACTER*(LOCOMP) NOMP,NOMD,NOMD0,LDLP
  35. CHARACTER*4 LISMOT(1)
  36. DATA LISMOT/'TRAN'/
  37. C****
  38. MPOVA1=0
  39. C write(6,*)' SUBROUTINE KMFN'
  40. C LECTURE DES ARGUMENTS
  41. CALL LIROBJ('MATRIK',MATRIK,1,IRET)
  42. IF(IRET.EQ.0) RETURN
  43. CALL LIROBJ('CHPOINT ',MCHPOI,1,IRET)
  44. CALL ACTOBJ('CHPOINT ',MCHPOI,1)
  45. IF(IRET.EQ.0) RETURN
  46. CALL LIRMOT(LISMOT,1,ITRAN,0)
  47. ITRAN0=ITRAN
  48. SEGACT MATRIK
  49. SEGINI,MCHINI=MCHPOI
  50. NSOUPO=0
  51. NAT=MCHINI.JATTRI(/1)
  52. * Le resultat change de nature de par la multiplication par une
  53. * matrice ou une matrice inverse.
  54. IF (NAT.GT.0) THEN
  55. NATI=MCHINI.JATTRI(1)
  56. NATF=0
  57. IF (NATI.NE.0) NATF=3-NATI
  58. MCHINI.JATTRI(1)=NATF
  59. ENDIF
  60. SEGADJ MCHINI
  61. SEGACT MCHINI*NOMOD
  62. CALL ACTOBJ('CHPOINT ',MCHINI,1)
  63. CALL ECROBJ('CHPOINT ',MCHINI)
  64. NOMD0=' '
  65. MLENT2=0
  66. ISPGD0=0
  67. MCHPO1=0
  68. IT=0
  69. NMATRI=IRIGEL(/2)
  70. NSP2 =IPCHP(/1)
  71. LFIRST=.TRUE.
  72. DO 5000 IM=1,NMATRI
  73. IKT=1
  74. IMATRI=IRIGEL(4,IM)
  75. SEGACT IMATRI
  76. NBME =LIZAFM(/2)
  77. ITYM=IRIGEL(7,IM)
  78. IF(ITYM.EQ.4)ITRAN=0
  79. 777 CONTINUE
  80. DO 5001 LP=NBME,1,-1
  81. IF(ITRAN.EQ.0)THEN
  82. NOMP=LISPRI(LP)
  83. ELSE
  84. NOMP=LISDUA(LP)
  85. ENDIF
  86. C write(6,*)' LP,NBME,ITRAN,LISPRI(LP),LISDUA(LP)=',
  87. C &LP,NBME,ITRAN,LISPRI(LP),LISDUA(LP)
  88. DO 4000 KS=1,NSP2
  89. MSOUPO=IPCHP(KS)
  90. NC=NOCOMP(/2)
  91. DO 4001 KC=1,NC
  92. C WRITE(IOIMP,*)'KMFN : NOCOMP=',NOCOMP(KC),' NOMP=',NOMP(1:4)
  93. IF (NOCOMP(KC).EQ.NOMP) THEN
  94. IT=1
  95. MELEM1=IGEOC
  96. C In KRIPAD : SEGACT MELEM1
  97. C In KRIPAD : SEGINI MLENTI
  98. CALL KRIPAD(MELEM1,MLENTI)
  99. C segact melem1
  100. C nk1=melem1.num(/1)
  101. C nk2=melem1.num(/2)
  102. C write(6,*)'Controle MELEM1=IGEOC',MELEM1,NK1,NK2
  103. C write(6,1101)(melem1.num(1,kk),kk=1,nk2)
  104.  
  105. MPOVAL=IPOVAL
  106. IF (ITRAN.EQ.0) THEN
  107. MELEMP=IRIGEL(1,IM)
  108. MELEMD=IRIGEL(2,IM)
  109. IKSPGD=KSPGD
  110. LDLP=LISDUA(LP)
  111. ELSE
  112. MELEMP=IRIGEL(2,IM)
  113. MELEMD=IRIGEL(1,IM)
  114. IKSPGD=KSPGP
  115. LDLP=LISPRI(LP)
  116. ENDIF
  117. ISPGD=ISPGD0
  118. NOMD=NOMD0
  119. LNEW=((ISPGD0.NE.IKSPGD).OR.(NOMD0.NE.LDLP))
  120. IF (LNEW) THEN
  121. IF (.NOT.LFIRST) THEN
  122. SEGSUP MLENT2
  123. ELSE
  124. LFIRST=.FALSE.
  125. ENDIF
  126. IF (ITRAN.EQ.0) THEN
  127. NOMD=LISDUA(LP)
  128. NOMD0=LISDUA(LP)
  129. ISPGD=KSPGD
  130. ISPGD0=KSPGD
  131. ELSE
  132. NOMD=LISPRI(LP)
  133. NOMD0=LISPRI(LP)
  134. ISPGD=KSPGP
  135. ISPGD0=KSPGP
  136. ENDIF
  137. SEGACT ISPGD
  138. N=ISPGD.NUM(/2)
  139. NC=1
  140. C WRITE(IOIMP,*)' Creation MPOVA1 N,NC=',n,nc
  141. IF (MCHPO1.NE.0)THEN
  142. CALL ECROBJ('CHPOINT',MCHPO1)
  143. CALL PRFUSE
  144. C CALL DTCHPO(MCHPO1)
  145. ENDIF
  146. SEGINI,MCHPO1=MCHPOI
  147. NSOUPO=1
  148. NAT=MCHPO1.JATTRI(/1)
  149. SEGADJ MCHPO1
  150. IF (NAT.GT.0) MCHPO1.JATTRI(1)=NATF
  151. C WRITE(IOIMP,*)' On cree MPOVA1 -> ',NOMD(1:4)
  152. SEGINI MSOUP1
  153. SEGINI MPOVA1
  154. MCHPO1.IPCHP(NSOUPO)=MSOUP1
  155. MSOUP1.NOCOMP(1)=NOMD
  156. MSOUP1.IGEOC=ISPGD
  157. MSOUP1.IPOVAL=MPOVA1
  158. C In KRIPAD : SEGINI MLENT2
  159. CALL KRIPAD(ISPGD,MLENT2)
  160. C segact ISPGD
  161. C nk1=ISPGD.num(/1)
  162. C nk2=ISPGD.num(/2)
  163. C write(6,*)'Controle ISPGD',ISPGD,NK1,NK2
  164. C write(6,1101)(ISPGD.num(1,kk),kk=1,nk2)
  165.  
  166. SEGDES ISPGD
  167. ENDIF
  168. C WRITE(IOIMP,*)' On charge dans ',MSOUP1.NOCOMP(1)
  169.  
  170.  
  171. C CALL VERPAD(MLENTI,MELEMP,IRET)
  172. C IRET=0
  173. C IF(IRET.NE.0)THEN
  174. C write(6,*)' VERPAD Pb MELEMP '
  175. C write(6,*)' MELEMP=',MELEMP,'ITRAN=',ITRAN
  176. C segact melemp
  177. C nk1= melemp.num(/1)
  178. C nk2= melemp.num(/2)
  179. C do 6317 kkk=1,nk2
  180. C write(6,1101)(melemp.num(kk,kkk),kk=1,nk1)
  181. C6317 continue
  182. C
  183. C
  184. C MOTERR(1:40)=' '
  185. C MOTERR(1:8) ='MATRIK '
  186. C MOTERR(9:16)='CHPOINT '
  187. C Incompatibilité entre l'objet %m1:8 et l'objet %m9:16
  188. C CALL ERREUR(135)
  189. C RETURN
  190. C ENDIF
  191.  
  192. CALL VERPAD(MLENT2,MELEMD,IRET)
  193. C IRET=0
  194. IF(IRET.NE.0)THEN
  195. C write(6,*)' VERPAD Pb MELEMD '
  196. C write(6,*)' MELEMD=',MELEMD,'ITRAN=',ITRAN
  197. C segact melemd
  198. C nk1= melemd.num(/1)
  199. C nk2= melemd.num(/2)
  200. C do 6318 kkk=1,nk2
  201. C write(6,1101)(melemd.num(kk,kkk),kk=1,nk1)
  202. C6318 continue
  203.  
  204. MOTERR(1:40)=' '
  205. MOTERR(1:8) ='MATRIK '
  206. MOTERR(9:16)='CHPOINT '
  207. C Incompatibilité entre l'objet %m1:8 et l'objet %m9:16
  208. CALL ERREUR(135)
  209. RETURN
  210. ENDIF
  211. SEGACT MELEMP
  212. SEGACT MELEMD
  213. NBSOUM=LIZAFM(/1)
  214.  
  215. NBSP=MELEMP.LISOUS(/1)
  216. NBSD=MELEMD.LISOUS(/1)
  217. IPT1=MELEMP
  218. IPT2=MELEMD
  219. IF(NBSP.NE.0)IPT1=MELEMP.LISOUS(1)
  220. IF(NBSD.NE.0)IPT2=MELEMD.LISOUS(1)
  221. SEGACT IPT1,IPT2
  222. NBELP=IPT1.NUM(/2)
  223. NBELD=IPT2.NUM(/2)
  224. KKP=0
  225. KKD=0
  226. NSP=1
  227. NSD=1
  228.  
  229. DO 4002 LS=1,NBSOUM
  230. IZAFM=LIZAFM(LS,LP)
  231. SEGACT IZAFM
  232. NBEL=AM(/1)
  233. NP=AM(/2)
  234. MP=AM(/3)
  235. C WRITE(IOIMP,*)' BCL 4002 LS=',ls,nbel,np,mp
  236. IF(ITRAN.EQ.0)THEN
  237. DO 4033 K=1,NBEL
  238. KKP=KKP+1
  239. KKD=KKD+1
  240.  
  241. DO 4034 J=1,MP
  242. U=0.D0
  243. DO 4035 I=1,NP
  244. I1=LECT(IPT1 .NUM(I,KKP))
  245. IF(I1.EQ.0)GO TO 4035
  246. U=U+AM(K,I,J)*VPOCHA(I1,KC)
  247. 4035 CONTINUE
  248. III=IPT2 .NUM(J,KKD)
  249. I2=MLENT2.LECT(III)
  250. MPOVA1.VPOCHA(I2,1)=MPOVA1.VPOCHA(I2,1)
  251. $ +U
  252. 4034 CONTINUE
  253. 4033 CONTINUE
  254.  
  255. IF(KKP.EQ.NBELP.AND.NSP.LT.NBSP)THEN
  256. NSP=NSP+1
  257. IPT1=MELEMP.LISOUS(NSP)
  258. SEGACT IPT1
  259. NBELP=IPT1.NUM(/2)
  260. KKP=0
  261. ENDIF
  262.  
  263. IF(KKD.EQ.NBELD.AND.NSD.LT.NBSD)THEN
  264. NSD=NSD+1
  265. IPT2=MELEMD.LISOUS(NSD)
  266. SEGACT IPT2
  267. NBELD=IPT2.NUM(/2)
  268. KKD=0
  269. ENDIF
  270.  
  271. ELSE
  272. DO 3033 K=1,NBEL
  273. KKP=KKP+1
  274. KKD=KKD+1
  275.  
  276. DO 3034 J=1,NP
  277. U=0.D0
  278. DO 3035 I=1,MP
  279. I1=LECT(IPT1 .NUM(I,KKP))
  280. IF(I1.EQ.0)GO TO 3035
  281. U=U+AM(K,J,I)*VPOCHA(I1,KC)
  282. 3035 CONTINUE
  283. I2=MLENT2.LECT(IPT2 .NUM(J,KKD))
  284. MPOVA1.VPOCHA(I2,1)=MPOVA1.VPOCHA(I2,1)
  285. $ +U
  286. 3034 CONTINUE
  287. 3033 CONTINUE
  288.  
  289. IF(KKP.EQ.NBELP.AND.NSP.LT.NBSP)THEN
  290. NSP=NSP+1
  291. IPT1=MELEMP.LISOUS(NSP)
  292. SEGACT IPT1
  293. NBELP=IPT1.NUM(/2)
  294. KKP=0
  295. ENDIF
  296.  
  297. IF(KKD.EQ.NBELD.AND.NSD.LT.NBSD)THEN
  298. NSD=NSD+1
  299. IPT2=MELEMD.LISOUS(NSD)
  300. SEGACT IPT2
  301. NBELD=IPT2.NUM(/2)
  302. KKD=0
  303. ENDIF
  304.  
  305. ENDIF
  306. 4002 CONTINUE
  307. SEGSUP MLENTI
  308. ENDIF
  309. 4001 CONTINUE
  310. 4000 CONTINUE
  311. 5001 CONTINUE
  312. C write(6,*)' ITYM,IKT,ITRAN=',ITYM,IKT,ITRAN
  313. IF(ITYM.EQ.4)THEN
  314. IF(IKT.EQ.1)THEN
  315. IKT=2
  316. ITRAN=1
  317. GO TO 777
  318. ELSE
  319. ITRAN=ITRAN0
  320. IKT=1
  321. ENDIF
  322. ENDIF
  323. SEGDES IMATRI
  324. 5000 CONTINUE
  325. SEGSUP MLENT2
  326. C write(6,*)' MPOVA1=',MPOVA1
  327. C write(6,*)' FIN SUBROUTINE KMFN'
  328. IF(MPOVA1.EQ.0)THEN
  329. MOTERR(1:40)=' '
  330. MOTERR(1:8) ='MATRIK '
  331. MOTERR(9:16)='CHPOINT '
  332. C Incompatibilité entre l'objet %m1:8 et l'objet %m9:16
  333. CALL ERREUR(135)
  334. RETURN
  335. ENDIF
  336. SEGDES MATRIK
  337.  
  338. IF(IT.EQ.1)THEN
  339. CALL ACTOBJ('CHPOINT ',MCHPO1,1)
  340. CALL ECROBJ('CHPOINT ',MCHPO1)
  341. CALL PRFUSE
  342. C CALL DTCHPO(MCHPO1)
  343. ELSE
  344. MOTERR(1:40)=' '
  345. MOTERR(1:8) ='MATRIK '
  346. MOTERR(9:16)='CHPOINT '
  347. C Incompatibilité entre l'objet %m1:8 et l'objet %m9:16
  348. CALL ERREUR(135)
  349. ENDIF
  350.  
  351. 1101 FORMAT(20(1X,I5))
  352. END
  353.  
  354.  

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