Télécharger zzfimp.eso

Retour à la liste

Numérotation des lignes :

zzfimp
  1. C ZZFIMP SOURCE CB215821 20/11/25 13:45:25 10792
  2. SUBROUTINE ZZFIMP(MTABX,MTAB1)
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. C***********************************************************************
  6. C
  7. C SYNTAXE :
  8. C
  9. C FIMP coef
  10. C
  11. C EN 2D
  12. C elements SEG2 -> Flux
  13. C elements TRI3 -> Source volumique
  14. C elements QUA4 -> Source volumique
  15. C EN 3D
  16. C elements SEG2 -> Pas de sens !!
  17. C elements TRI3 -> Flux
  18. C elements QUA4 -> Flux
  19. C elements CUB8 -> Source volumique
  20. C elements PRI6 -> Source volumique
  21. C elements TET4 -> Source volumique
  22. C
  23. C
  24. C MTAB1 : Table type EQEX -> RV
  25. C MTABZ : Table type DOMAINE -> Zone definition opérateur
  26. C MTABD : Table type DOMAINE -> Zone Totale apres assemblage
  27. C MTABX : Table type KIZX -> Description opérateur
  28. C
  29. C les cartes correspondantes sont commentées C¤.
  30. C Gare à l'explicite !!!
  31. C
  32. C
  33. C
  34. C
  35. C***********************************************************************
  36.  
  37.  
  38. -INC PPARAM
  39. -INC CCOPTIO
  40. -INC CCGEOME
  41. -INC SMCHAML
  42. -INC SMCOORD
  43. -INC SMLENTI
  44. -INC SMELEME
  45. POINTEUR MELEM1.MELEME,SPGID.MELEME,SPGZ.MELEME
  46. POINTEUR MELEMP.MELEME
  47. -INC SMCHPOI
  48. POINTEUR IZG1.MCHPOI, IZGG1.MPOVAL
  49. POINTEUR IZTU1.MPOVAL
  50. POINTEUR MZFLU.MPOVAL
  51. POINTEUR IZVOL.MPOVAL
  52. -INC SIZFFB
  53. POINTEUR IZF1.IZFFM
  54.  
  55. -INC SMLMOTS
  56. POINTEUR LINCO.MLMOTS
  57. CHARACTER*8 TYPE,TYPC,MTERR
  58. CHARACTER*(LOCOMP) NOMZ,NOMI,NOM0
  59. LOGICAL LOGI
  60. PARAMETER (NTB=1)
  61. CHARACTER*8 LTAB(NTB)
  62. DIMENSION KTAB(NTB),IXV(4)
  63. SAVE IPAS
  64. DATA LTAB/'KIZX '/,IPAS/0/
  65. C*****************************************************************************
  66. CFIMP
  67. C? write(6,*)' Debut FIMP'
  68. C
  69. C- Récupération de la table INCO (pointeur KINC)
  70. C
  71. CALL LEKTAB(MTAB1,'INCO',KINC)
  72. IF(KINC.EQ.0)THEN
  73. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  74. MOTERR( 1: 8) = ' INCO '
  75. MOTERR( 9:16) = ' INCO '
  76. MOTERR(17:24) = ' EQEX '
  77. CALL ERREUR(786)
  78. RETURN
  79. ENDIF
  80.  
  81. C*****************************************************************************
  82. C OPTIONS
  83. C KFORM = 0 -> SI 1 -> EF 2 -> VF 3 -> EFMC
  84. C IDCEN = 0->rien 1-> CENTREE 2-> SUPGDC 3-> SUPG 4-> TVISQUEU 5-> CNG
  85. C KPOIN = 0->SOMMET 1-> FACE 2-> CENTRE 3-> CENTREP0 4-> CENTREP1
  86.  
  87. IAXI=0
  88. IF(IFOMOD.EQ.0)IAXI=2
  89. C
  90. C- Récupération de la table des options KOPT (pointeur KOPTI)
  91. C
  92. CALL LEKTAB(MTABX,'KOPT',KOPTI)
  93. IF (KOPTI.EQ.0) THEN
  94. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  95. MOTERR( 1: 8) = ' KOPT '
  96. MOTERR( 9:16) = ' KOPT '
  97. MOTERR(17:24) = ' KIZX '
  98. CALL ERREUR(786)
  99. RETURN
  100. ENDIF
  101.  
  102.  
  103. CALL ACME(KOPTI,'MTRMASS ',MMPG)
  104. IPG=0
  105. IF(MMPG.EQ.3)IPG=1
  106. CALL ACME(KOPTI,'IDCEN',IDCEN)
  107. KDIM=1
  108. IF(IDCEN.EQ.2)KDIM=IDIM
  109. CALL ACME(KOPTI,'IKOMP',IKOMP)
  110. CALL ACME(KOPTI,'KIMPL',KIMPL)
  111. CALL ACME(KOPTI,'KFORM',KFORM)
  112. CALL ACME(KOPTI,'KPOIND',KPOIND)
  113. C write(6,*)' INCOD=',KPOIND
  114.  
  115. IF(KFORM.GE.2)THEN
  116. C Option %m1:8 incompatible avec les données
  117. MOTERR( 1: 8) = 'EF/EFM1 '
  118. CALL ERREUR(803)
  119. RETURN
  120. ENDIF
  121. CALL ACME(KOPTI,'KMACO',KMACO)
  122. CALL ACMF(KOPTI,'AIMPL',AIMPL)
  123. IF (IERR.NE.0) RETURN
  124.  
  125. C write(6,*)' Apres les options '
  126. C*****************************************************************************
  127. C
  128. C- Récupération de la table DOMAINE associée au domaine local
  129. C
  130. CALL ACMM(MTABX,'NOMZONE',NOMZ)
  131. CALL LEKTAB(MTABX,'DOMZ',MTABZ)
  132. IF(MTABZ.EQ.0)THEN
  133. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  134. MOTERR( 1: 8) = ' DOMZ '
  135. MOTERR( 9:16) = ' DOMZ '
  136. MOTERR(17:24) = ' KIZX '
  137. CALL ERREUR(786)
  138. RETURN
  139. ENDIF
  140. C
  141. C- Récupération des indices CENTRE, FACE, SOMMET et MAILLAGE
  142. C- de la table DOMAINE
  143. C
  144. C? CALL LEKTAB(MTABZ,'MAILLAGE',MELEME)
  145. CALL LEKTAB(MTABZ,'MAILLAGE',MELEMZ)
  146. CALL LEKTAB(MTABZ,'SOMMET',MELEMS)
  147. CALL LEKTAB(MTABZ,'CENTRE',MELEMC)
  148. CALL LEKTAB(MTABZ,'XXPSOML',MCHELM)
  149. CALL LEKTAB(MTABZ,'XXVOLUM',MCHVOL)
  150. CALL LEKTAB(MTABZ,'MACRO',MACRO)
  151. C? IF(CALL LEKTAB(MTABZ,'MACRO1',MACRO1)
  152. CALL LEKTAB(MTABZ,'QUADRATI',MQUAD)
  153. IF (IERR.NE.0) RETURN
  154.  
  155. CALL LICHT(MCHVOL,IZVOL,TYPC,IGEOM)
  156.  
  157. SEGACT MCHELM
  158.  
  159. C
  160. C- Vérification des compatiblités Formulation/SPG
  161. C- Identification du spg de l'inconnue
  162. C- SPGZ=spg inco duale de la zone; MELEME=connectivité associée ;
  163. C
  164.  
  165. C write(6,*)' KPOIND,KFORM=',KPOIND,KFORM
  166. IF(KFORM.EQ.0)THEN
  167. IF(KPOIND.EQ.99)THEN
  168. KPOIND=0
  169. SPGZ =MELEMS
  170. C MELEME=MELEMS
  171. MELEME=MELEMZ
  172. ELSEIF(KPOIND.EQ.2)THEN
  173. SPGZ =MELEMC
  174. MELEME=MELEMC
  175. MELEMP=MELEMC
  176. ELSEIF(KPOIND.EQ.0)THEN
  177. SPGZ =MELEMS
  178. C MELEME=MELEMS
  179. MELEME=MELEMZ
  180. ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.0)THEN
  181. C Option %m1:8 incompatible avec les données
  182. MOTERR( 1: 8) = ' EF '
  183. CALL ERREUR(803)
  184. RETURN
  185. ENDIF
  186.  
  187. ELSEIF(KFORM.EQ.1)THEN
  188. C write(6,*)' KFORM=',kform,' KPOIND=',kpoind
  189. IF(KPOIND.EQ.99)THEN
  190. KPOIND=0
  191. SPGZ =MELEMS
  192. MELEME=MELEMZ
  193. ELSEIF(KPOIND.EQ.0)THEN
  194. SPGZ =MELEMS
  195. MELEME=MELEMZ
  196. ELSEIF(KPOIND.EQ.2)THEN
  197. SPGZ =MELEMC
  198. MELEME=MELEMZ
  199. MELEMP=MELEMC
  200. ELSEIF(KPOIND.EQ.3)THEN
  201. MTERR='EF CTRP0'
  202. IF(MACRO.EQ.0.AND.MQUAD.EQ.0)GO TO 90
  203. CALL LEKTAB(MTABZ,'CENTREP0',MELEMC)
  204. SPGZ =MELEMC
  205. MELEME=MELEMZ
  206. IF(MACRO.NE.0)CALL LEKTAB(MTABZ,'MACRO1',MELEME)
  207. MELEMP=MELEMC
  208. ELSEIF(KPOIND.EQ.4)THEN
  209. MTERR='EF CTRP1'
  210. IF(MACRO.EQ.0.AND.MQUAD.EQ.0)GO TO 90
  211. CALL LEKTAB(MTABZ,'CENTREP1',MELEMC)
  212. SPGZ =MELEMC
  213. MELEME=MELEMZ
  214. IF(MACRO.NE.0)CALL LEKTAB(MTABZ,'MACRO1',MELEME)
  215. CALL LEKTAB(MTABZ,'ELTP1NC ',MELEMP)
  216. ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.0.AND.KPOIND.NE.3
  217. & .AND.KPOIND.NE.4)THEN
  218. C Option %m1:8 incompatible avec les données
  219. MOTERR( 1: 8) = ' EF '
  220. CALL ERREUR(803)
  221. RETURN
  222. ENDIF
  223.  
  224. ELSEIF(KFORM.EQ.2)THEN
  225. IF(KPOIND.EQ.99)THEN
  226. KPOIND=2
  227. SPGZ =MELEMC
  228. MELEME=MELEMC
  229. MELEMP=MELEMC
  230. ELSEIF(KPOIND.EQ.2)THEN
  231. SPGZ =MELEMC
  232. MELEME=MELEMC
  233. MELEMP=MELEMC
  234. ELSEIF(KPOIND.NE.2)THEN
  235. C Option %m1:8 incompatible avec les données
  236. MOTERR( 1: 8) = ' VF '
  237. CALL ERREUR(803)
  238. RETURN
  239. ENDIF
  240.  
  241. ELSEIF(KFORM.EQ.3)THEN
  242. MTERR='EFMC'
  243. GO TO 90
  244. IF(KPOIND.EQ.99.OR.KPOIND.EQ.2)THEN
  245. KPOIND=2
  246. SPGZ =MELEMC
  247. MELEME=MELEMC
  248. ELSEIF(KPOIND.EQ.3.AND.(MACRO.NE.0.OR.MQUAD.NE.0))THEN
  249. CALL LEKTAB(MTABZ,'CENTREP0',MELEMC)
  250. SPGZ =MELEMC
  251. MELEME=MELEMC
  252. ELSEIF(KPOIND.EQ.4.AND.(MACRO.NE.0.OR.MQUAD.NE.0))THEN
  253. CALL LEKTAB(MTABZ,'CENTREP1',MELEMC)
  254. CALL LEKTAB(MTABZ,'ELTP1NC',MELEMQ)
  255. SPGZ =MELEMC
  256. MELEME=MELEMQ
  257. IF(MACRO.NE.0)MELEMO=MACRO1
  258. IF(MQUAD.NE.0)MELEMO=MELEMZ
  259. C ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.3.AND.KPOIND.NE.4)THEN
  260. ELSE
  261. C Option %m1:8 incompatible avec les données
  262. MOTERR( 1: 8) = ' EFMC '
  263. CALL ERREUR(803)
  264. RETURN
  265. ENDIF
  266.  
  267. ENDIF
  268. C*************************************************************************
  269. C VERIFICATIONS SUR LES INCONNUES
  270. C
  271. C- Récupération du nombre d'inconnues et du nom de l'inconnue NOMI
  272. C
  273. TYPE='LISTMOTS'
  274. CALL ACMO(MTABX,'LISTINCO',TYPE,LINCO)
  275. IF (IERR.NE.0) RETURN
  276. SEGACT LINCO
  277. NBINC=LINCO.MOTS(/2)
  278. IF(NBINC.NE.1)THEN
  279. C Indice %m1:8 : contient plus de %i1 %m9:16
  280. MOTERR( 1:8) = 'LISTINCO'
  281. INTERR(1) = 1
  282. MOTERR(9:16) = ' MOTS '
  283. CALL ERREUR(799)
  284. RETURN
  285. ENDIF
  286.  
  287. NOMI=LINCO.MOTS(1)
  288.  
  289. IF(KIMPL.EQ.0)THEN
  290. CALL LEKTAB(MTAB1,'KIZG',KIZG)
  291. IF(KIZG.EQ.0)THEN
  292. CALL CRTABL(KIZG)
  293. CALL ECMM(KIZG,'SOUSTYPE','KIZG')
  294. CALL ECMO(MTAB1,'KIZG','TABLE ',KIZG)
  295. ENDIF
  296. ENDIF
  297.  
  298. C --> 1 ere Inconnue
  299.  
  300. NOMI=LINCO.MOTS(1)
  301.  
  302. TYPE=' '
  303. CALL ACMO(KINC,NOMI,TYPE,MCHPOI)
  304. IF(TYPE.NE.'CHPOINT ')THEN
  305. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  306. MOTERR( 1: 8) = 'INC '//NOMI
  307. MOTERR( 9:16) = 'CHPOINT '
  308. CALL ERREUR(800)
  309. RETURN
  310. ELSE
  311. CALL LICHT(MCHPOI,IZTU1,TYPC,SPGID)
  312. ENDIF
  313.  
  314. C*************************************************************************
  315. C Le domaine de definition est donne par le SPG de la premiere inconnue
  316. C Les inconnues suivantes devront posseder ce meme pointeur
  317. C On verifie que les points de la zone sont tous inclus dans ce SPG
  318.  
  319. CALL KRIPAD(SPGID,MLENTI)
  320. IF(IPAS.EQ.0)THEN
  321. CALL VERPAD(MLENTI,SPGZ,IRET)
  322. IF(IRET.NE.0)THEN
  323. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  324. MOTERR(1: 8) = 'INC '//NOMI
  325. MOTERR(9:16) = 'CHPOINT '
  326. CALL ERREUR(788)
  327. IPAS=0
  328. RETURN
  329. ENDIF
  330. ENDIF
  331.  
  332. C*************************************************************************
  333. C Lecture du coefficient
  334. C Type du coefficient :
  335. C IK1=0 CHPOINT IK1=1 scalaire IK1=2 vecteur
  336. C write(6,*)' Lecture des coefficients '
  337.  
  338. CALL ACME(MTABX,'IARG',IARG)
  339. IF(IARG.NE.1)THEN
  340. C Indice %m1:8 : nombre d'arguments incorrect
  341. MOTERR(1:8) = 'IARG '
  342. CALL ERREUR(804)
  343. RETURN
  344. ENDIF
  345.  
  346. IRET=3
  347. IXV(1)=MELEMC
  348. IXV(2)=1
  349. IXV(3)=0
  350. C? IXV(4)=MELEMS
  351. C write(6,*)' MELEMQ=',melemq
  352. CALL LEKCOF('Opérateur FIMP :',
  353. & MTABX,KINC,1,IXV,MFLU,MZFLU,NPT1,NC1,IK1,IRET)
  354. IF(IRET.EQ.0)RETURN
  355.  
  356. C Fin lecture Arguments **************************************************
  357.  
  358.  
  359. IF(KIMPL.EQ.0)THEN
  360. TYPE=' '
  361. CALL ACMO(KIZG,NOMI,TYPE,IZG1)
  362. IF(TYPE.NE.'CHPOINT ')THEN
  363. NC=IZTU1.VPOCHA(/2)
  364. TYPE='SOMMET'
  365. CALL CRCHPT(TYPE,SPGID,NC,IZG1)
  366. C SEGACT IZG1
  367. C MSOUPO=IZG1.IPCHP(1)
  368. C SEGACT MSOUPO
  369. C NOCOMP(1)=NOMI
  370. C SEGDES MSOUPO
  371. CALL ECMO(KIZG,NOMI,'CHPOINT ',IZG1)
  372. ENDIF
  373.  
  374. ELSE
  375. NC=IZTU1.VPOCHA(/2)
  376. TYPE='SOMMET'
  377. C? pour plutard CALL CRCHPT(TYPE,SPGZ,NC,IZG1)
  378. CALL CRCHPT(TYPE,SPGID,NC,IZG1)
  379. SEGACT IZG1
  380. MSOUPO=IZG1.IPCHP(1)
  381. SEGACT MSOUPO*MOD
  382. NOCOMP(1)=NOMI
  383. ENDIF
  384.  
  385. CALL LICHT(IZG1,IZGG1,TYPC,IGEOM)
  386.  
  387. IF(IGEOM.NE.SPGID)THEN
  388. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  389. MOTERR(1: 8) = 'INC '//NOMI
  390. MOTERR(9:16) = 'CHPOINT '
  391. CALL ERREUR(788)
  392. RETURN
  393. ENDIF
  394.  
  395. SEGACT MELEME
  396. NBSOUS=LISOUS(/1)
  397. IF(NBSOUS.EQ.0)NBSOUS=1
  398. NUTOEL=0
  399.  
  400. NPTD=IZTU1.VPOCHA(/1)
  401. IES=IDIM
  402.  
  403. DO 1 L=1,NBSOUS
  404. IPT1=MELEME
  405. IF(NBSOUS.NE.1)IPT1=LISOUS(L)
  406. SEGACT IPT1
  407.  
  408. MCHAML=ICHAML(L)
  409. SEGACT MCHAML
  410. MELVAL=IELVAL(1)
  411. SEGACT MELVAL
  412.  
  413. NP =IPT1.NUM(/1)
  414. NBEL=IPT1.NUM(/2)
  415.  
  416. IF(KPOIND.EQ.0)THEN
  417.  
  418. CALL ZXFIMP(NBEL,NUTOEL,NP,LECT,IPT1.NUM,
  419. & VELCHE,IZGG1.VPOCHA,MZFLU.VPOCHA,IK1)
  420.  
  421. ELSE
  422. IPT2=MELEMP
  423. IF(NBSOUS.NE.1)IPT2=LISOUS(L)
  424. SEGACT IPT2
  425.  
  426. IF(MQUAD.NE.0)THEN
  427. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)//'PRP0'
  428. IF(KPOIND.EQ.3)NOM0=NOMS(IPT1.ITYPEL)//'PRP0'
  429. IF(KPOIND.EQ.4)NOM0=NOMS(IPT1.ITYPEL)//'PRP1'
  430. ELSEIF(MACRO.NE.0)THEN
  431. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)
  432. IF(KPOIND.EQ.3)NOM0=NOMS(IPT1.ITYPEL)//'MCP0'
  433. IF(KPOIND.EQ.4)NOM0=NOMS(IPT1.ITYPEL)//'MCP1'
  434. ELSE
  435. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)
  436. ENDIF
  437.  
  438. CALL KALPBG(NOM0,'FONFORM ',IZFFM)
  439.  
  440.  
  441. SEGACT IZFFM*MOD
  442. IZHR=KZHR(1)
  443. SEGACT IZHR*MOD
  444. NES=GR(/1)
  445. NPG=GR(/3)
  446. IZF1=KTP(1)
  447. SEGACT IZF1*MOD
  448. MP1=IZF1.FN(/1)
  449. NP = IPT1.NUM(/1)
  450.  
  451. NK=NUTOEL
  452. DO 21 K=1,NBEL
  453.  
  454. NK=NK+1
  455. JC=(1-IK1)*(NK-1)+1
  456. DO 109 I=1,NP
  457. J=IPT1.NUM(I,K)
  458. DO 109 N=1,IDIM
  459. XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N)
  460. 109 CONTINUE
  461.  
  462. CALL CALJBC(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP,NPG,IAXI,AIRE)
  463.  
  464. DO 39 M=1,MP1
  465. M1=LECT(IPT2.NUM(M,K))
  466. U=0.D0
  467. DO 33 LL=1,NPG
  468. U=U+IZF1.FN(M,LL)*MZFLU.VPOCHA(JC,1)*PGSQ(LL)
  469. 33 CONTINUE
  470. IZGG1.VPOCHA(M1,1)=IZGG1.VPOCHA(M1,1)-U
  471. 39 CONTINUE
  472.  
  473. 21 CONTINUE
  474.  
  475. ENDIF
  476.  
  477. SEGDES IPT1,MCHAML,MELVAL
  478. NUTOEL=NUTOEL+NBEL
  479.  
  480. 1 CONTINUE
  481. C SEGDES MZFLU,IZVOL
  482. SEGDES MZFLU
  483.  
  484. IF(KIMPL.NE.0)THEN
  485. TYPE=' '
  486. CALL ACMO(MTAB1,'SMBR',TYPE,MCHPO2)
  487. IF(TYPE.NE.'CHPOINT')THEN
  488. CALL ECMO(MTAB1,'SMBR','CHPOINT',IZG1)
  489. ELSE
  490. CALL ECROBJ('CHPOINT',MCHPO2)
  491. CALL ECROBJ('CHPOINT',IZG1)
  492. CALL PRFUSE
  493. CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  494. CALL ECMO(MTAB1,'SMBR','CHPOINT',MCHPOI)
  495. ENDIF
  496.  
  497. ENDIF
  498.  
  499. SEGDES MELEME
  500.  
  501. SEGDES IZTU1
  502. SEGDES IZG1,IZGG1
  503. SEGDES LINCO
  504. SEGSUP MLENTI
  505.  
  506. IPAS=1
  507. RETURN
  508. 90 CONTINUE
  509. C Option %m1:8 incompatible avec les données
  510. MOTERR( 1: 8) = MTERR
  511. CALL ERREUR(803)
  512. RETURN
  513.  
  514. 1002 FORMAT(10(1X,1PE11.4))
  515. END
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  

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