Télécharger zzfimp.eso

Retour à la liste

Numérotation des lignes :

zzfimp
  1. C ZZFIMP SOURCE GOUNAND 25/11/12 21:16:04 12399
  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. C? SG 2025/11/10 MELEMO jamais utilise ?
  258. C IF(MACRO.NE.0)MELEMO=MACRO1
  259. C IF(MQUAD.NE.0)MELEMO=MELEMZ
  260. C ELSEIF(KPOIND.NE.2.AND.KPOIND.NE.3.AND.KPOIND.NE.4)THEN
  261. ELSE
  262. C Option %m1:8 incompatible avec les données
  263. MOTERR( 1: 8) = ' EFMC '
  264. CALL ERREUR(803)
  265. RETURN
  266. ENDIF
  267.  
  268. ENDIF
  269. C*************************************************************************
  270. C VERIFICATIONS SUR LES INCONNUES
  271. C
  272. C- Récupération du nombre d'inconnues et du nom de l'inconnue NOMI
  273. C
  274. TYPE='LISTMOTS'
  275. CALL ACMO(MTABX,'LISTINCO',TYPE,LINCO)
  276. IF (IERR.NE.0) RETURN
  277. SEGACT LINCO
  278. NBINC=LINCO.MOTS(/2)
  279. IF(NBINC.NE.1)THEN
  280. C Indice %m1:8 : contient plus de %i1 %m9:16
  281. MOTERR( 1:8) = 'LISTINCO'
  282. INTERR(1) = 1
  283. MOTERR(9:16) = ' MOTS '
  284. CALL ERREUR(799)
  285. RETURN
  286. ENDIF
  287.  
  288. NOMI=LINCO.MOTS(1)
  289.  
  290. IF(KIMPL.EQ.0)THEN
  291. CALL LEKTAB(MTAB1,'KIZG',KIZG)
  292. IF(KIZG.EQ.0)THEN
  293. CALL CRTABL(KIZG)
  294. CALL ECMM(KIZG,'SOUSTYPE','KIZG')
  295. CALL ECMO(MTAB1,'KIZG','TABLE ',KIZG)
  296. ENDIF
  297. ENDIF
  298.  
  299. C --> 1 ere Inconnue
  300.  
  301. NOMI=LINCO.MOTS(1)
  302.  
  303. TYPE=' '
  304. CALL ACMO(KINC,NOMI,TYPE,MCHPOI)
  305. IF(TYPE.NE.'CHPOINT ')THEN
  306. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  307. MOTERR( 1: 8) = 'INC '//NOMI
  308. MOTERR( 9:16) = 'CHPOINT '
  309. CALL ERREUR(800)
  310. RETURN
  311. ELSE
  312. CALL LICHT(MCHPOI,IZTU1,TYPC,SPGID)
  313. ENDIF
  314.  
  315. C*************************************************************************
  316. C Le domaine de definition est donne par le SPG de la premiere inconnue
  317. C Les inconnues suivantes devront posseder ce meme pointeur
  318. C On verifie que les points de la zone sont tous inclus dans ce SPG
  319.  
  320. CALL KRIPAD(SPGID,MLENTI)
  321. IF(IPAS.EQ.0)THEN
  322. CALL VERPAD(MLENTI,SPGZ,IRET)
  323. IF(IRET.NE.0)THEN
  324. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  325. MOTERR(1: 8) = 'INC '//NOMI
  326. MOTERR(9:16) = 'CHPOINT '
  327. CALL ERREUR(788)
  328. IPAS=0
  329. RETURN
  330. ENDIF
  331. ENDIF
  332.  
  333. C*************************************************************************
  334. C Lecture du coefficient
  335. C Type du coefficient :
  336. C IK1=0 CHPOINT IK1=1 scalaire IK1=2 vecteur
  337. C write(6,*)' Lecture des coefficients '
  338.  
  339. CALL ACME(MTABX,'IARG',IARG)
  340. IF(IARG.NE.1)THEN
  341. C Indice %m1:8 : nombre d'arguments incorrect
  342. MOTERR(1:8) = 'IARG '
  343. CALL ERREUR(804)
  344. RETURN
  345. ENDIF
  346.  
  347. IRET=3
  348. IXV(1)=MELEMC
  349. IXV(2)=1
  350. IXV(3)=0
  351. C? IXV(4)=MELEMS
  352. C write(6,*)' MELEMQ=',melemq
  353. CALL LEKCOF('Opérateur FIMP :',
  354. & MTABX,KINC,1,IXV,MFLU,MZFLU,NPT1,NC1,IK1,IRET)
  355. IF(IRET.EQ.0)RETURN
  356.  
  357. C Fin lecture Arguments **************************************************
  358.  
  359.  
  360. IF(KIMPL.EQ.0)THEN
  361. TYPE=' '
  362. CALL ACMO(KIZG,NOMI,TYPE,IZG1)
  363. IF(TYPE.NE.'CHPOINT ')THEN
  364. NC=IZTU1.VPOCHA(/2)
  365. TYPE='SOMMET'
  366. CALL CRCHPT(TYPE,SPGID,NC,2,IZG1)
  367. C SEGACT IZG1
  368. C MSOUPO=IZG1.IPCHP(1)
  369. C SEGACT MSOUPO
  370. C NOCOMP(1)=NOMI
  371. C SEGDES MSOUPO
  372. CALL ECMO(KIZG,NOMI,'CHPOINT ',IZG1)
  373. ENDIF
  374.  
  375. ELSE
  376. NC=IZTU1.VPOCHA(/2)
  377. TYPE='SOMMET'
  378. C? pour plutard CALL CRCHPT(TYPE,SPGZ,NC,2,IZG1)
  379. CALL CRCHPT(TYPE,SPGID,NC,2,IZG1)
  380. SEGACT IZG1
  381. MSOUPO=IZG1.IPCHP(1)
  382. SEGACT MSOUPO*MOD
  383. NOCOMP(1)=NOMI
  384. ENDIF
  385.  
  386. CALL LICHT(IZG1,IZGG1,TYPC,IGEOM)
  387.  
  388. IF(IGEOM.NE.SPGID)THEN
  389. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  390. MOTERR(1: 8) = 'INC '//NOMI
  391. MOTERR(9:16) = 'CHPOINT '
  392. CALL ERREUR(788)
  393. RETURN
  394. ENDIF
  395.  
  396. SEGACT MELEME
  397. NBSOUS=LISOUS(/1)
  398. IF(NBSOUS.EQ.0)NBSOUS=1
  399. NUTOEL=0
  400.  
  401. NPTD=IZTU1.VPOCHA(/1)
  402. IES=IDIM
  403.  
  404. DO 1 L=1,NBSOUS
  405. IPT1=MELEME
  406. IF(NBSOUS.NE.1)IPT1=LISOUS(L)
  407. SEGACT IPT1
  408.  
  409. MCHAML=ICHAML(L)
  410. SEGACT MCHAML
  411. MELVAL=IELVAL(1)
  412. SEGACT MELVAL
  413.  
  414. NP =IPT1.NUM(/1)
  415. NBEL=IPT1.NUM(/2)
  416.  
  417. IF(KPOIND.EQ.0)THEN
  418.  
  419. CALL ZXFIMP(NBEL,NUTOEL,NP,LECT,IPT1.NUM,
  420. & VELCHE,IZGG1.VPOCHA,MZFLU.VPOCHA,IK1)
  421.  
  422. ELSE
  423. IPT2=MELEMP
  424. IF(NBSOUS.NE.1)IPT2=LISOUS(L)
  425. SEGACT IPT2
  426.  
  427. IF(MQUAD.NE.0)THEN
  428. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)//'PRP0'
  429. IF(KPOIND.EQ.3)NOM0=NOMS(IPT1.ITYPEL)//'PRP0'
  430. IF(KPOIND.EQ.4)NOM0=NOMS(IPT1.ITYPEL)//'PRP1'
  431. ELSEIF(MACRO.NE.0)THEN
  432. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)
  433. IF(KPOIND.EQ.3)NOM0=NOMS(IPT1.ITYPEL)//'MCP0'
  434. IF(KPOIND.EQ.4)NOM0=NOMS(IPT1.ITYPEL)//'MCP1'
  435. ELSE
  436. IF(KPOIND.EQ.2)NOM0=NOMS(IPT1.ITYPEL)
  437. ENDIF
  438.  
  439. CALL KALPBG(NOM0,'FONFORM ',IZFFM)
  440.  
  441.  
  442. SEGACT IZFFM*MOD
  443. IZHR=KZHR(1)
  444. SEGACT IZHR*MOD
  445. NES=GR(/1)
  446. NPG=GR(/3)
  447. IZF1=KTP(1)
  448. SEGACT IZF1*MOD
  449. MP1=IZF1.FN(/1)
  450. NP = IPT1.NUM(/1)
  451.  
  452. NK=NUTOEL
  453. DO 21 K=1,NBEL
  454.  
  455. NK=NK+1
  456. JC=(1-IK1)*(NK-1)+1
  457. DO 109 I=1,NP
  458. J=IPT1.NUM(I,K)
  459. DO 1091 N=1,IDIM
  460. XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N)
  461. 1091 CONTINUE
  462. 109 CONTINUE
  463.  
  464. CALL CALJBC(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP,NPG,IAXI,AIRE)
  465.  
  466. DO 39 M=1,MP1
  467. M1=LECT(IPT2.NUM(M,K))
  468. U=0.D0
  469. DO 33 LL=1,NPG
  470. U=U+IZF1.FN(M,LL)*MZFLU.VPOCHA(JC,1)*PGSQ(LL)
  471. 33 CONTINUE
  472. IZGG1.VPOCHA(M1,1)=IZGG1.VPOCHA(M1,1)-U
  473. 39 CONTINUE
  474.  
  475. 21 CONTINUE
  476.  
  477. ENDIF
  478.  
  479. SEGDES IPT1,MCHAML,MELVAL
  480. NUTOEL=NUTOEL+NBEL
  481.  
  482. 1 CONTINUE
  483. C SEGDES MZFLU,IZVOL
  484. SEGDES MZFLU
  485.  
  486. IF(KIMPL.NE.0)THEN
  487. TYPE=' '
  488. CALL ACMO(MTAB1,'SMBR',TYPE,MCHPO2)
  489. IF(TYPE.NE.'CHPOINT')THEN
  490. CALL ECMO(MTAB1,'SMBR','CHPOINT',IZG1)
  491. ELSE
  492. CALL ECROBJ('CHPOINT',MCHPO2)
  493. CALL ECROBJ('CHPOINT',IZG1)
  494. CALL PRFUSE
  495. CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  496. CALL ECMO(MTAB1,'SMBR','CHPOINT',MCHPOI)
  497. ENDIF
  498.  
  499. ENDIF
  500.  
  501. SEGDES MELEME
  502.  
  503. SEGDES IZTU1
  504. SEGDES IZG1,IZGG1
  505. SEGDES LINCO
  506. SEGSUP MLENTI
  507.  
  508. IPAS=1
  509. RETURN
  510. 90 CONTINUE
  511. C Option %m1:8 incompatible avec les données
  512. MOTERR( 1: 8) = MTERR
  513. CALL ERREUR(803)
  514. RETURN
  515.  
  516. 1002 FORMAT(10(1X,1PE11.4))
  517. END
  518.  
  519.  

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