1 : C ZCHIMP SOURCE CHAT 05/01/13 04:21:24 5004 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 T0En 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 : -INC CCOPTIO 105 : -INC SMCHPOI 106 : -INC SMLENTI 107 : -INC SMELEME 108 : POINTEUR MELEMC.MELEME 109 : -INC SMLMOTS 110 : C 111 : CHARACTER*8 NOMD,NOMP,TYPE,TYPC 112 : PARAMETER (NTB=1) 113 : CHARACTER*8 LTAB(NTB) 114 : DIMENSION KTAB(NTB),IXV(4) 115 : DATA LTAB/'KIZX '/ 116 : C 117 : C- Récupération de la table DOMAINE associée au domaine local 118 : C 118 : CALL LEKTAB(MTABX,'DOMZ',MTABZ) 119 : IF (MTABZ.EQ.0) THEN 120 : C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24 121 : MOTERR( 1: 8) = ' DOMZ ' 122 : MOTERR( 9:16) = ' DOMZ ' 123 : MOTERR(17:24) = ' KIZX ' 123 : CALL ERREUR(786) 124 : RETURN 125 : ENDIF 126 : C 127 : C- Récupération de la table INCO (pointeur KINC) 128 : C 128 : CALL LEKTAB(MTAB1,'INCO',KINC) 129 : IF (KINC.EQ.0) THEN 130 : C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24 131 : MOTERR( 1: 8) = ' INCO ' 132 : MOTERR( 9:16) = ' INCO ' 133 : MOTERR(17:24) = ' EQEX ' 133 : CALL ERREUR(786) 134 : RETURN 135 : ENDIF 136 : C 137 : C- Identification du type d'échange : 138 : C- Surfacique (ISURF1=1) ou volumique (IVOL1=1). 139 : C 140 : ISURF1 = 0 141 : IVOL1 = 0 141 : CALL LEKTAB(MTABZ,'MAILLAGE',MELEME) 142 : IF (IERR.NE.0) RETURN 143 : SEGACT MELEME 144 : NBSOUS = LISOUS(/1) 145 : IF (NBSOUS.EQ.0) NBSOUS=1 146 : DO 10 I=1,NBSOUS 147 : IPT1=MELEME 148 : IF (NBSOUS.NE.1) IPT1=LISOUS(I) 149 : SEGACT IPT1 150 : C write(6,*) '***************************',ipt1.itypel 151 : IF (IDIM.EQ.2) THEN 152 : IF (IPT1.ITYPEL.EQ.2) THEN 153 : ISURF1 = 1 154 : ELSEIF (IPT1.ITYPEL.EQ.4.OR.IPT1.ITYPEL.EQ.8) THEN 155 : IVOL1 = 1 156 : ELSE 157 : C Type d'élément incorrect 157 : CALL ERREUR(16) 158 : RETURN 159 : ENDIF 160 : ELSEIF (IDIM.EQ.3) THEN 161 : IF (IPT1.ITYPEL.EQ.4.OR.IPT1.ITYPEL.EQ.8) THEN 162 : ISURF1 = 1 163 : ELSEIF (IPT1.ITYPEL.EQ.14.OR.IPT1.ITYPEL.EQ.16.OR. 164 : C pb PYR5 IPT1.ITYPEL.EQ.23.OR.IPT1.ITYPEL.EQ.25) THEN 165 : & IPT1.ITYPEL.EQ.23) THEN 166 : IVOL1 = 1 167 : ELSE 168 : C Type d'élément incorrect 168 : CALL ERREUR(16) 169 : RETURN 170 : ENDIF 171 : ENDIF 172 : SEGDES IPT1 173 : 10 CONTINUE 174 : IF (IVOL1.EQ.1.AND.ISURF1.EQ.1) THEN 175 : C Maillage incorrect : contient des éléments 1D et 2D 175 : CALL ERREUR(798) 176 : RETURN 177 : ENDIF 178 : IF (NBSOUS.NE.1) SEGDES MELEME 179 : C 180 : C- Récupération du nom des inconnues (primale et duale) 181 : C 182 : TYPE = 'LISTMOTS' 182 : CALL ACMO(MTABX,'LISTINCO',TYPE,MLMOTS) 183 : IF (IERR.NE.0) RETURN 184 : SEGACT MLMOTS 185 : NBINC = MOTS(/2) 186 : IF (NBINC.LE.0.OR.NBINC.GE.3) THEN 187 : C Indice %m1:8 : contient plus de %i1 %m9:16 188 : MOTERR( 1:8) = 'LISTINCO' 189 : INTERR(1) = 2 190 : MOTERR(9:16) = ' MOTS ' 190 : CALL ERREUR(799) 191 : RETURN 192 : ENDIF 193 : NOMP = MOTS(1) 194 : IF (NBINC.EQ.1) THEN 195 : NOMD = MOTS(1) 196 : ELSE 197 : NOMD = MOTS(2) 198 : ENDIF 199 : SEGDES MLMOTS 200 : C 201 : C- Informations géométriques locales associées à l'opérateur 202 : C 202 : CALL LEKTAB(MTABZ,'CENTRE',MELEMC) 203 : IF (IERR.NE.0) RETURN 203 : CALL LEKTAB(MTABZ,'SOMMET',MELEMS) 204 : IF (IERR.NE.0) RETURN 205 : C 206 : C- Identification du spg de l'inconnue duale 207 : C- Trois cas sont possible (identifier par IKAS) 208 : C- 1) spg contenant melems -> formulation EF 209 : C- 2) spg contenant melemc -> formulation VF si IVOL1=1; ERREUR sinon 210 : C- 3) ni 2) ni 3) -> formulation VF si IVOL1=0; ERREUR sinon 211 : C 212 : TYPE = ' ' 213 : IKAS = 0 213 : CALL ACMO(KINC,NOMD,TYPE,MCHPOI) 214 : IF (TYPE.NE.'CHPOINT ') THEN 215 : C Indice %m1:8 : ne contient pas un objet de type %m9:16 216 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 217 : MOTERR(9:16) = 'CHPOINT ' 217 : CALL ERREUR(800) 218 : RETURN 219 : ELSE 219 : CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMD) 220 : NC = VPOCHA(/2) 221 : SEGDES MPOVAL 222 : IF (NC.NE.1) THEN 223 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon nombre de composantes 224 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 225 : MOTERR(9:16) = 'CHPOINT ' 225 : CALL ERREUR(784) 226 : RETURN 227 : ENDIF 228 : ENDIF 228 : CALL KRIPAD(MELEMD,MLENTI) 228 : CALL VERPAD(MLENTI,MELEMS,IRET1) 228 : CALL VERPAD(MLENTI,MELEMC,IRET2) 229 : IF (IRET1.EQ.0.AND.IRET2.EQ.1) THEN 230 : IKAS = 1 231 : ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.0) THEN 232 : IKAS = 2 233 : IF (IVOL1.EQ.0) THEN 234 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique 235 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 236 : MOTERR(9:16) = 'CHPOINT ' 236 : CALL ERREUR(788) 237 : RETURN 238 : ENDIF 239 : ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.1) THEN 240 : IKAS = 3 241 : IF (IVOL1.EQ.1) THEN 242 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique 243 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 244 : MOTERR(9:16) = 'CHPOINT ' 244 : CALL ERREUR(788) 245 : RETURN 246 : ENDIF 247 : SEGINI,IPT4=MELEMC 248 : ELSE 249 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique 250 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 251 : MOTERR(9:16) = 'CHPOINT ' 251 : CALL ERREUR(788) 252 : RETURN 253 : ENDIF 254 : C 255 : C- Identification du spg de l'inconnue primale 256 : C- Deux cas sont possibles (identifier par IKP) 257 : C- 1) spg contenant melemc -> IKP=0 258 : C- 2) spg contenant melems -> IKP=4 259 : C 260 : IF (NBINC.EQ.1) THEN 261 : IF (IKAS.EQ.1) THEN 262 : IKP = 4 263 : ELSE 264 : IKP = 0 265 : ENDIF 266 : ELSE 267 : TYPE = ' ' 267 : CALL ACMO(KINC,NOMP,TYPE,MCHPOI) 268 : IF (TYPE.NE.'CHPOINT ') THEN 269 : C Indice %m1:8 : ne contient pas un objet de type %m9:16 270 : MOTERR(1: 8) = 'INCO'//NOMP(1:4) 271 : MOTERR(9:16) = 'CHPOINT ' 271 : CALL ERREUR(800) 272 : RETURN 273 : ELSE 273 : CALL LICHT(MCHPOI,MPOVAL,TYPC,MELEMP) 274 : NC = VPOCHA(/2) 275 : SEGDES MPOVAL 276 : IF (NC.NE.1) THEN 277 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon nombre de composantes 278 : MOTERR(1: 8) = 'INCO'//NOMP(1:4) 279 : MOTERR(9:16) = 'CHPOINT ' 279 : CALL ERREUR(784) 280 : RETURN 281 : ENDIF 282 : ENDIF 282 : CALL KRIPAD(MELEMP,MLENT3) 282 : CALL VERPAD(MLENT3,MELEMS,IRET1) 282 : CALL VERPAD(MLENT3,MELEMC,IRET2) 283 : SEGSUP MLENT3 284 : IF (IRET1.EQ.0.AND.IRET2.EQ.1) THEN 285 : IKP = 4 286 : ELSEIF (IRET1.EQ.1.AND.IRET2.EQ.0) THEN 287 : IKP = 0 288 : ELSE 289 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique 290 : MOTERR(1: 8) = 'INCO'//NOMP(1:4) 291 : MOTERR(9:16) = 'CHPOINT ' 291 : CALL ERREUR(788) 292 : RETURN 293 : ENDIF 294 : ENDIF 295 : C 296 : C- On vérifie dans le cas surfacique que la surface est une frontière 297 : C- du domaine global dont la table DOMAINE est à l'indice 'PERE' de 298 : C- la table domaine locale. 299 : C 300 : C- Si IKAS=3, récupération des points CENTREs du maillage volumique 301 : C- associés aux points CENTREs du maillage surfacique. 302 : C 303 : IF (IVOL1.EQ.0) THEN 304 : TYPE = 'TABLE ' 304 : CALL ACMO(MTABZ,'PERE',TYPE,KPERE) 305 : IF (IERR.NE.0) RETURN 305 : CALL LEKTAB(KPERE,'FACE ',IPT2) 305 : CALL KRIPAD(IPT2,MLENT2) 305 : CALL VERPAD(MLENT2,MELEMC,IRET) 306 : IF (IRET.EQ.1) THEN 307 : C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique 308 : MOTERR(1: 8) = 'INCO'//NOMD(1:4) 309 : MOTERR(9:16) = 'CHPOINT ' 309 : CALL ERREUR(788) 310 : RETURN 311 : ENDIF 311 : CALL LEKTAB(KPERE,'FACEL ',IPT3) 312 : IF (IERR.NE.0) RETURN 313 : SEGACT MELEMC 314 : SEGACT IPT3 315 : SEGACT MLENT2 316 : NBC = MELEMC.NUM(/2) 317 : DO 20 I=1,NBC 318 : J = MLENT2.LECT(MELEMC.NUM(1,I)) 319 : IF (IPT3.NUM(2,J) .NE. MELEMC.NUM(1,I)) THEN 320 : C Incohérence entre tables DOMAINE 320 : CALL ERREUR(801) 321 : RETURN 322 : ELSE 323 : IF ( IPT3.NUM(1,J) .NE. IPT3.NUM(3,J)) THEN 324 : C La face %i1 n'est pas une frontière 325 : INTERR(1) = IPT3.NUM(2,J) 325 : CALL ERREUR(802) 326 : RETURN 327 : ENDIF 328 : IF (IKAS.EQ.3) THEN 329 : IPT4.NUM(1,I) = IPT3.NUM(1,J) 330 : ENDIF 331 : ENDIF 332 : 20 CONTINUE 333 : SEGDES MELEMC 334 : SEGDES IPT3 335 : IF (IVOL1.EQ.0 .AND. IKAS.EQ.3) SEGDES IPT4 336 : SEGDES MLENT2 337 : ENDIF 338 : C 339 : C- Récupération de la table des options KOPT (pointeur KOPTI) 340 : C- et initialisations des options (par défaut SI et EXPL) 341 : C- KFORM = 0 -> SI 1 -> EF 2 -> VF 342 : C- KIMPL = 0 -> EXPL 1 -> IMPL 2 -> CN 343 : C 344 : KFORM = 0 345 : KIMPL = 0 346 : TYPE = ' ' 346 : CALL ACMO(MTABX,'KOPT',TYPE,KOPTI) 347 : IF (TYPE.EQ.'TABLE') THEN 348 : TYPE = ' ' 348 : CALL ACMO(KOPTI,'KFORM',TYPE,IENT) 348 : IF (TYPE.EQ.'ENTIER') CALL ACME(KOPTI,'KFORM',KFORM) 349 : TYPE = ' ' 349 : CALL ACMO(KOPTI,'KIMPL',TYPE,IENT) 349 : IF (TYPE.EQ.'ENTIER') CALL ACME(KOPTI,'KIMPL',KIMPL) 350 : ENDIF 351 : C 352 : C- Cohérance des options avec le support de l'inconnue duale et IKAS 353 : C Option %m1:8 incompatible avec les données 354 : IF (IKAS.EQ.1 .AND. KFORM.EQ.2) THEN 355 : MOTERR(1:8) = ' VF ' 355 : CALL ERREUR(803) 356 : RETURN 357 : ENDIF 358 : IF (IKAS.NE.1 .AND. KFORM.NE.2) THEN 359 : MOTERR(1:8) = ' EF ' 359 : CALL ERREUR(803) 360 : RETURN 361 : ENDIF 362 : IF (NBINC.NE.1 .AND. KIMPL.EQ.0) THEN 363 : MOTERR(1:8) = ' EXPL ' 363 : CALL ERREUR(803) 364 : RETURN 365 : ENDIF 366 : C 367 : C- Récupération des arguments (2 arguments attendus) : 368 : C- 1) Coefficient d'échange 369 : C- 2) Champ exterieur connu 370 : C 370 : CALL ACME(MTABX,'IARG',IARG) 371 : IF (IERR.NE.0) RETURN 372 : IF (IARG.NE.2) THEN 373 : C Indice %m1:8 : nombre d'arguments incorrect 374 : MOTERR(1:8) = 'IARG ' 374 : CALL ERREUR(804) 375 : RETURN 376 : ENDIF 377 : IXV(1) = MELEMC 378 : IXV(2) = 1 379 : IXV(3) = 0 380 : IRET = 0 380 : CALL LEKCOF('Opérateur ECHI :', 381 : & MTABX,KINC,1,IXV,MCHPO1,MPOVA1,NPT1,NC1,IKH,IRET) 382 : IF (IRET.EQ.0) RETURN 383 : IXV(1) = MELEMC 384 : IXV(2) = 1 385 : IXV(3) = 0 386 : IXV(4) = MELEMS 387 : IRET = 4 387 : CALL LEKCOF('Opérateur ECHI :', 388 : & MTABX,KINC,2,IXV,MCHPO2,MPOVA2,NPT2,NC2,IKT,IRET) 389 : IF (IRET.EQ.0) RETURN 390 : IF (IKT.EQ.0) THEN 391 : MELEME = MELEMC 392 : ELSE 393 : MELEME = MELEMS 394 : ENDIF 394 : CALL KRIPAD(MELEME,MLENT1) 395 : C 396 : C- Calcul de la discrétisation du terme d'échange 397 : C 398 : IF (KIMPL.EQ.0) THEN 398 : CALL ZECHI1(IKAS,IVOL1,MTAB1,MTABZ,MPOVA1,MPOVA2,IKH,IKT, 399 : & MELEMD,IPT4,MLENTI,MLENT1,NOMD) 400 : ELSE 400 : CALL ZECHI2(IKAS,IVOL1,MTAB1,MTABZ,MTABX,MPOVA1,MPOVA2, 401 : & IKH,IKT,IKP,IPT4,MLENT1,NOMP,NOMD) 402 : ENDIF 403 : RETURN 404 : END 405 : 406 : 407 :
© Cast3M 2003 - All rights reserved.
Disclaimer