Télécharger zchimp.eso

Retour à la liste

Numérotation des lignes :

zchimp
  1. C ZCHIMP SOURCE CB215821 20/11/25 13:44:44 10792
  2. SUBROUTINE ZCHIMP(MTABX,MTAB1)
  3. C=======================================================================
  4. C L'opérateur ECHIMP discrétise un échange surfacique ou volumique
  5. C avec un milieu exterieur. Le terme d'échange est de la forme
  6. * h(T-T0) où h est un coefficient d'échange, T une des inconnues du
  7. C problème traité et T0 "un champ exterieur connu".
  8. C-----------------------------------------------------------------------
  9. C La convention de signe associée à ce terme est la suivante : lorsque
  10. C h est positif et T0<T, le terme d'échange tant à faire diminuer la
  11. C quantité T présente dans le domaine.
  12. C D'un point de vue numérique, ce terme est dans l'équation traitée du
  13. C meme coté que le terme de dérivée en temps.
  14. C-----------------------------------------------------------------------
  15. C
  16. C-------------------------
  17. C Phrase d'appel GIBIANE :
  18. C-------------------------
  19. C
  20. C 'ECHI' KIZX ;
  21. C
  22. C KIZX : Table de sous-type KIZX associée à l'opérateur ECHI
  23. C
  24. C--------------------------------
  25. C Construction de KIZX via EQEX :
  26. C--------------------------------
  27. C
  28. C 'ZONE' TAB1 'OPER' 'ECHI' CHPO1 CHPO2 'INCO' MOT1 (MOT2) ;
  29. C
  30. C TAB1 : TABLE DOMAINE associée à la zone d'échange. On trouvera
  31. C à l'indice MAILLAGE de cette table la surface ou le volume
  32. C sur lequel à lieu l'échange avec le milieu exterieur.
  33. C CHPO1 : Coefficient d'échange (par unité de surface ou de volume
  34. C suivant le type d'échange traité) (CHPO, FLOTTANT ou MOT).
  35. C (spg du CHPO : CENTRE)
  36. C CHPO2 : Champ scalaire exterieur connu (CHPO, FLOTTANT ou MOT)
  37. C (spg du CHPO : CENTRE ou SOMMET)
  38. C MOT1 : Nom de l'inconnue scalaire primale sur laquelle porte
  39. C l'échange surfacique ou volumique (MOT).
  40. C MOT2 : Nom de l'inconnue scalaire duale (facultatif - MOT).
  41. C Indique l'équation dans laquelle le terme d'échange est à
  42. C considérer. Si MOT2 est omis, les inconnues primales et
  43. C duale sont identiques (obligatoire en explicite).
  44. C
  45. C------------
  46. C Résultats :
  47. C------------
  48. C du terme h*T et un second membre correspondant au terme h*T0.
  49. C
  50. C
  51. C-> En explicite :
  52. C
  53. C On suppose que les inconnues primales et duales sont identiques
  54. C Pour cela, on condense la matrice masse, quelle que soit la
  55. C formulation utilisée (donc EF -> EFM1).
  56. C 1) La matrice diagonale est stockée dans un CHPO et rangée dans la
  57. C table KIZG1 à l'indice de type MOT MOT1 (nom de l'inconnue).
  58. C 2) Le second membre est stocké dans un CHPO et rangé dans la
  59. C table KIZG à l'indice de type MOT MOT1 (nom de l'inconnue).
  60. C
  61. C
  62. C Les inconnues primales et duales peuvent etre différentes et de
  63. C masse (donc EFM1 -> EF).
  64. C 1) La matrice "masse" est stockée dans un MATRIK et rangée dans la
  65. C table KIZX à l'indice de type MOT MATELM.
  66. C 2) Le second membre est stocké dans un CHPO et assemblé dans la
  67. C table EQEX à l'indice de type MOT SMBR. Le nom de l'inconnue
  68. C duale MOT2 étant le nom de la composante du CHPO créé.
  69. C
  70. C-------------------------
  71. C Formulations acceptées :
  72. C-------------------------
  73. C 0) Défaut : EFM1 explicite.
  74. C
  75. C----------------------
  76. C Support des données :
  77. C----------------------
  78. C H : SCAL ou CHPO SCAL CENTRE
  79. C T0 : SCAL ou CHPO SCAL CENTRE ou CHPO SCAL SOMMET
  80. C
  81. C------------------------------------------
  82. C Indices de table utilisés (racine KIZX) :
  83. C------------------------------------------
  84. C 'DOMZ' : Table domaine associé à l'opérateur (domaine local)
  85. C E/ 'MAILLAGE' -> Maillage du domaine local
  86. C E/ 'CENTRE' -> Points centre du domaine local
  87. C E/ 'XXPSOML' -> Intégrale des fonctions de base par élément (MCHAML)
  88. C E/ 'IARG' : Nombre d'arguments de l'opérateur
  89. C E/ 'ARG1' : Premier argument (coefficient d'échange)
  90. C E/ 'ARG2' : Deuxième argument (champ exterieur)
  91. C E/ 'LISTINCO' : Listmot contenant le nom de l'inconnue
  92. C 'KOPT' : Table des options
  93. C E/ 'KFORM' -> Formulation spatiale
  94. C E/ 'KIMPL' -> Formulation temporelle
  95. C 'EQEX' : Table décrivant la modélisation (modèle fluide)
  96. C E/ 'INCO' -> Table des inconnues et des données
  97. C /S 'KIZG' -> Table des seconds membres (cas explicite)
  98. C /S 'KIZG1' -> Table des matrices diagonales (cas explicite)
  99. C-----------------------------------------------------------------------
  100. C
  101. IMPLICIT INTEGER(I-N)
  102. IMPLICIT REAL*8 (A-H,O-Z)
  103. C
  104.  
  105. -INC PPARAM
  106. -INC CCOPTIO
  107. -INC SMCHPOI
  108. -INC SMLENTI
  109. -INC SMELEME
  110. POINTEUR MELEMC.MELEME
  111.  
  112. -INC SMLMOTS
  113. C
  114. CHARACTER*8 TYPE,TYPC
  115. CHARACTER*(LOCOMP) NOMD,NOMP
  116. PARAMETER (NTB=1)
  117. CHARACTER*8 LTAB(NTB)
  118. DIMENSION KTAB(NTB),IXV(4)
  119. DATA LTAB/'KIZX '/
  120. C
  121. C- Récupération de la table DOMAINE associée au domaine local
  122. C
  123. CALL LEKTAB(MTABX,'DOMZ',MTABZ)
  124. IF (MTABZ.EQ.0) THEN
  125. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  126. MOTERR( 1: 8) = ' DOMZ '
  127. MOTERR( 9:16) = ' DOMZ '
  128. MOTERR(17:24) = ' KIZX '
  129. CALL ERREUR(786)
  130. RETURN
  131. ENDIF
  132. C
  133. C- Récupération de la table INCO (pointeur KINC)
  134. C
  135. CALL LEKTAB(MTAB1,'INCO',KINC)
  136. IF (KINC.EQ.0) THEN
  137. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  138. MOTERR( 1: 8) = ' INCO '
  139. MOTERR( 9:16) = ' INCO '
  140. MOTERR(17:24) = ' EQEX '
  141. CALL ERREUR(786)
  142. RETURN
  143. ENDIF
  144. C
  145. C- Identification du type d'échange :
  146. C- Surfacique (ISURF1=1) ou volumique (IVOL1=1).
  147. C
  148. ISURF1 = 0
  149. IVOL1 = 0
  150. CALL LEKTAB(MTABZ,'MAILLAGE',MELEME)
  151. IF (IERR.NE.0) RETURN
  152. SEGACT MELEME
  153. NBSOUS = LISOUS(/1)
  154. IF (NBSOUS.EQ.0) NBSOUS=1
  155. DO 10 I=1,NBSOUS
  156. IPT1=MELEME
  157. IF (NBSOUS.NE.1) IPT1=LISOUS(I)
  158. SEGACT IPT1
  159. C write(6,*) '***************************',ipt1.itypel
  160. IF (IDIM.EQ.2) THEN
  161. IF (IPT1.ITYPEL.EQ.2) THEN
  162. ISURF1 = 1
  163. ELSEIF (IPT1.ITYPEL.EQ.4.OR.IPT1.ITYPEL.EQ.8) THEN
  164. IVOL1 = 1
  165. ELSE
  166. C Type d'élément incorrect
  167. CALL ERREUR(16)
  168. RETURN
  169. ENDIF
  170. ELSEIF (IDIM.EQ.3) THEN
  171. IF (IPT1.ITYPEL.EQ.4.OR.IPT1.ITYPEL.EQ.8) THEN
  172. ISURF1 = 1
  173. ELSEIF (IPT1.ITYPEL.EQ.14.OR.IPT1.ITYPEL.EQ.16.OR.
  174. C pb PYR5 IPT1.ITYPEL.EQ.23.OR.IPT1.ITYPEL.EQ.25) THEN
  175. & IPT1.ITYPEL.EQ.23) THEN
  176. IVOL1 = 1
  177. ELSE
  178. C Type d'élément incorrect
  179. CALL ERREUR(16)
  180. RETURN
  181. ENDIF
  182. ENDIF
  183. SEGDES IPT1
  184. 10 CONTINUE
  185. IF (IVOL1.EQ.1.AND.ISURF1.EQ.1) THEN
  186. C Maillage incorrect : contient des éléments 1D et 2D
  187. CALL ERREUR(798)
  188. RETURN
  189. ENDIF
  190. IF (NBSOUS.NE.1) SEGDES MELEME
  191. C
  192. C- Récupération du nom des inconnues (primale et duale)
  193. C
  194. TYPE = 'LISTMOTS'
  195. CALL ACMO(MTABX,'LISTINCO',TYPE,MLMOTS)
  196. IF (IERR.NE.0) RETURN
  197. SEGACT MLMOTS
  198. NBINC = MOTS(/2)
  199. IF (NBINC.LE.0.OR.NBINC.GE.3) THEN
  200. C Indice %m1:8 : contient plus de %i1 %m9:16
  201. MOTERR( 1:8) = 'LISTINCO'
  202. INTERR(1) = 2
  203. MOTERR(9:16) = ' MOTS '
  204. CALL ERREUR(799)
  205. RETURN
  206. ENDIF
  207. NOMP = MOTS(1)
  208. IF (NBINC.EQ.1) THEN
  209. NOMD = MOTS(1)
  210. ELSE
  211. NOMD = MOTS(2)
  212. ENDIF
  213. SEGDES MLMOTS
  214. C
  215. C- Informations géométriques locales associées à l'opérateur
  216. C
  217. CALL LEKTAB(MTABZ,'CENTRE',MELEMC)
  218. IF (IERR.NE.0) RETURN
  219. CALL LEKTAB(MTABZ,'SOMMET',MELEMS)
  220. IF (IERR.NE.0) RETURN
  221. C
  222. C- Identification du spg de l'inconnue duale
  223. C- Trois cas sont possible (identifier par IKAS)
  224. C- 1) spg contenant melems -> formulation EF
  225. C- 2) spg contenant melemc -> formulation VF si IVOL1=1; ERREUR sinon
  226. C- 3) ni 2) ni 3) -> formulation VF si IVOL1=0; ERREUR sinon
  227. C
  228. TYPE = ' '
  229. IKAS = 0
  230. CALL ACMO(KINC,NOMD,TYPE,MCHPOI)
  231. IF (TYPE.NE.'CHPOINT ') THEN
  232. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  233. MOTERR(1: 8) = 'INCO'//NOMD
  234. MOTERR(9:16) = 'CHPOINT '
  235. CALL ERREUR(800)
  236. RETURN
  237. ELSE
  238. CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMD)
  239. NC = VPOCHA(/2)
  240. SEGDES MPOVAL
  241. IF (NC.NE.1) THEN
  242. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon nombre de composantes
  243. MOTERR(1: 8) = 'INCO'//NOMD
  244. MOTERR(9:16) = 'CHPOINT '
  245. CALL ERREUR(784)
  246. RETURN
  247. ENDIF
  248. ENDIF
  249. CALL KRIPAD(MELEMD,MLENTI)
  250. CALL VERPAD(MLENTI,MELEMS,IRET1)
  251. CALL VERPAD(MLENTI,MELEMC,IRET2)
  252. IF (IRET1.EQ.0.AND.IRET2.EQ.1) THEN
  253. IKAS = 1
  254. ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.0) THEN
  255. IKAS = 2
  256. IF (IVOL1.EQ.0) THEN
  257. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  258. MOTERR(1: 8) = 'INCO'//NOMD
  259. MOTERR(9:16) = 'CHPOINT '
  260. CALL ERREUR(788)
  261. RETURN
  262. ENDIF
  263. ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.1) THEN
  264. IKAS = 3
  265. IF (IVOL1.EQ.1) THEN
  266. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  267. MOTERR(1: 8) = 'INCO'//NOMD
  268. MOTERR(9:16) = 'CHPOINT '
  269. CALL ERREUR(788)
  270. RETURN
  271. ENDIF
  272. SEGINI,IPT4=MELEMC
  273. ELSE
  274. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  275. MOTERR(1: 8) = 'INCO'//NOMD
  276. MOTERR(9:16) = 'CHPOINT '
  277. CALL ERREUR(788)
  278. RETURN
  279. ENDIF
  280. C
  281. C- Identification du spg de l'inconnue primale
  282. C- Deux cas sont possibles (identifier par IKP)
  283. C- 1) spg contenant melemc -> IKP=0
  284. C- 2) spg contenant melems -> IKP=4
  285. C
  286. IF (NBINC.EQ.1) THEN
  287. IF (IKAS.EQ.1) THEN
  288. IKP = 4
  289. ELSE
  290. IKP = 0
  291. ENDIF
  292. ELSE
  293. TYPE = ' '
  294. CALL ACMO(KINC,NOMP,TYPE,MCHPOI)
  295. IF (TYPE.NE.'CHPOINT ') THEN
  296. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  297. MOTERR(1: 8) = 'INCO'//NOMP
  298. MOTERR(9:16) = 'CHPOINT '
  299. CALL ERREUR(800)
  300. RETURN
  301. ELSE
  302. CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMP)
  303. NC = VPOCHA(/2)
  304. SEGDES MPOVAL
  305. IF (NC.NE.1) THEN
  306. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon nombre de composantes
  307. MOTERR(1: 8) = 'INCO'//NOMP
  308. MOTERR(9:16) = 'CHPOINT '
  309. CALL ERREUR(784)
  310. RETURN
  311. ENDIF
  312. ENDIF
  313. CALL KRIPAD(MELEMP,MLENT3)
  314. CALL VERPAD(MLENT3,MELEMS,IRET1)
  315. CALL VERPAD(MLENT3,MELEMC,IRET2)
  316. SEGSUP MLENT3
  317. IF (IRET1.EQ.0.AND.IRET2.EQ.1) THEN
  318. IKP = 4
  319. ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.0) THEN
  320. IKP = 0
  321. ELSE
  322. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  323. MOTERR(1: 8) = 'INCO'//NOMP
  324. MOTERR(9:16) = 'CHPOINT '
  325. CALL ERREUR(788)
  326. RETURN
  327. ENDIF
  328. ENDIF
  329. C
  330. C- On vérifie dans le cas surfacique que la surface est une frontière
  331. C- du domaine global dont la table DOMAINE est à l'indice 'PERE' de
  332. C- la table domaine locale.
  333. C
  334. C- Si IKAS=3, récupération des points CENTREs du maillage volumique
  335. C- associés aux points CENTREs du maillage surfacique.
  336. C
  337. IF (IVOL1.EQ.0) THEN
  338. TYPE = 'TABLE '
  339. CALL ACMO(MTABZ,'PERE',TYPE,KPERE)
  340. IF (IERR.NE.0) RETURN
  341. CALL LEKTAB(KPERE,'FACE ',IPT2)
  342. CALL KRIPAD(IPT2,MLENT2)
  343. CALL VERPAD(MLENT2,MELEMC,IRET)
  344. IF (IRET.EQ.1) THEN
  345. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  346. MOTERR(1: 8) = 'INCO'//NOMD
  347. MOTERR(9:16) = 'CHPOINT '
  348. CALL ERREUR(788)
  349. RETURN
  350. ENDIF
  351. CALL LEKTAB(KPERE,'FACEL ',IPT3)
  352. IF (IERR.NE.0) RETURN
  353. SEGACT MELEMC
  354. SEGACT IPT3
  355. SEGACT MLENT2
  356. NBC = MELEMC.NUM(/2)
  357. DO 20 I=1,NBC
  358. J = MLENT2.LECT(MELEMC.NUM(1,I))
  359. IF (IPT3.NUM(2,J) .NE. MELEMC.NUM(1,I)) THEN
  360. C Incohérence entre tables DOMAINE
  361. CALL ERREUR(801)
  362. RETURN
  363. ELSE
  364. IF ( IPT3.NUM(1,J) .NE. IPT3.NUM(3,J)) THEN
  365. C La face %i1 n'est pas une frontière
  366. INTERR(1) = IPT3.NUM(2,J)
  367. CALL ERREUR(802)
  368. RETURN
  369. ENDIF
  370. IF (IKAS.EQ.3) THEN
  371. IPT4.NUM(1,I) = IPT3.NUM(1,J)
  372. ENDIF
  373. ENDIF
  374. 20 CONTINUE
  375. SEGDES MELEMC
  376. SEGDES IPT3
  377. IF (IVOL1.EQ.0 .AND. IKAS.EQ.3) SEGDES IPT4
  378. SEGDES MLENT2
  379. ENDIF
  380. C
  381. C- Récupération de la table des options KOPT (pointeur KOPTI)
  382. C- et initialisations des options (par défaut SI et EXPL)
  383. C- KFORM = 0 -> SI 1 -> EF 2 -> VF
  384. C- KIMPL = 0 -> EXPL 1 -> IMPL 2 -> CN
  385. C
  386. KFORM = 0
  387. KIMPL = 0
  388. TYPE = ' '
  389. CALL ACMO(MTABX,'KOPT',TYPE,KOPTI)
  390. IF (TYPE.EQ.'TABLE') THEN
  391. TYPE = ' '
  392. CALL ACMO(KOPTI,'KFORM',TYPE,IENT)
  393. IF (TYPE.EQ.'ENTIER') CALL ACME(KOPTI,'KFORM',KFORM)
  394. TYPE = ' '
  395. CALL ACMO(KOPTI,'KIMPL',TYPE,IENT)
  396. IF (TYPE.EQ.'ENTIER') CALL ACME(KOPTI,'KIMPL',KIMPL)
  397. ENDIF
  398. C
  399. C- Cohérance des options avec le support de l'inconnue duale et IKAS
  400. C Option %m1:8 incompatible avec les données
  401. IF (IKAS.EQ.1 .AND. KFORM.EQ.2) THEN
  402. MOTERR(1:8) = ' VF '
  403. CALL ERREUR(803)
  404. RETURN
  405. ENDIF
  406. IF (IKAS.NE.1 .AND. KFORM.NE.2) THEN
  407. MOTERR(1:8) = ' EF '
  408. CALL ERREUR(803)
  409. RETURN
  410. ENDIF
  411. IF (NBINC.NE.1 .AND. KIMPL.EQ.0) THEN
  412. MOTERR(1:8) = ' EXPL '
  413. CALL ERREUR(803)
  414. RETURN
  415. ENDIF
  416. C
  417. C- Récupération des arguments (2 arguments attendus) :
  418. C- 1) Coefficient d'échange
  419. C- 2) Champ exterieur connu
  420. C
  421. CALL ACME(MTABX,'IARG',IARG)
  422. IF (IERR.NE.0) RETURN
  423. IF (IARG.NE.2) THEN
  424. C Indice %m1:8 : nombre d'arguments incorrect
  425. MOTERR(1:8) = 'IARG '
  426. CALL ERREUR(804)
  427. RETURN
  428. ENDIF
  429. IXV(1) = MELEMC
  430. IXV(2) = 1
  431. IXV(3) = 0
  432. IRET = 0
  433. CALL LEKCOF('Opérateur ECHI :',
  434. & MTABX,KINC,1,IXV,MCHPO1,MPOVA1,NPT1,NC1,IKH,IRET)
  435. IF (IRET.EQ.0) RETURN
  436. IXV(1) = MELEMC
  437. IXV(2) = 1
  438. IXV(3) = 0
  439. IXV(4) = MELEMS
  440. IRET = 4
  441. CALL LEKCOF('Opérateur ECHI :',
  442. & MTABX,KINC,2,IXV,MCHPO2,MPOVA2,NPT2,NC2,IKT,IRET)
  443. IF (IRET.EQ.0) RETURN
  444. IF (IKT.EQ.0) THEN
  445. MELEME = MELEMC
  446. ELSE
  447. MELEME = MELEMS
  448. ENDIF
  449. CALL KRIPAD(MELEME,MLENT1)
  450. C
  451. C- Calcul de la discrétisation du terme d'échange
  452. C
  453. IF (KIMPL.EQ.0) THEN
  454. CALL ZECHI1(IKAS,IVOL1,MTAB1,MTABZ,MPOVA1,MPOVA2,IKH,IKT,
  455. & MELEMD,IPT4,MLENTI,MLENT1,NOMD)
  456. ELSE
  457. CALL ZECHI2(IKAS,IVOL1,MTAB1,MTABZ,MTABX,MPOVA1,MPOVA2,
  458. & IKH,IKT,IKP,IPT4,MLENT1,NOMP,NOMD)
  459. ENDIF
  460. RETURN
  461. END
  462.  
  463.  
  464.  
  465.  
  466.  

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