* INITVF PROCEDUR GOUNAND 11/05/24 21:15:27 6976 ********************************************************************** ChPSour*'CHPOINT' DeltaT*'FLOTTANT' Cini*'CHPOINT' TetaDiff*'FLOTTANT' TetaConv*'FLOTTANT' TetaLin*'FLOTTANT' Qface/'CHPOINT' QELEM/'CHPOINT' DISPL/'CHPOINT' DISPT/'CHPOINT' CHCLIM*'TABLE' OPTRESOL/'TABLE' LCONV*'LOGIQUE' ; * ATTENTION La vitesse est optionnelle, L'ordre est important * et les types d'arguments qui se suivent aussi pour tester leur * présence * * Attention il faudra transformer les vitesses en débits face * et sortir le champ * * |-----------------------------------------------------------------| * | Phrase d'appel (en GIBIANE) | * |-----------------------------------------------------------------| * | | * | RESI Matot jaco Mpor2 Mchamt mchamt1 difftot nomespec nbespece | * | nbsource TABRES TABMODI NOUVMAT = INITVF MoDARCY Porosite | * | MateDiff ChPSour DeltaT Cini TetaDiff | * | TetaConv TetaLin (QFACE) QELEM | * | DISPL DISPT CHCLIM optresol ; | * | | * |-----------------------------------------------------------------| * | Généralités : INITVF construit la matrice de discrétisation | * | du problème de transport convection-diffusion pour| * | le premier pas de tps d'un algorithme transitoire.| * | Le second membre et les Conditions limites de flux| * | sont pris en compte. | * | RESTE TCINI, DECENTR et TERME LIN | * |-----------------------------------------------------------------| * | | * |-----------------------------------------------------------------| * | ENTREES | * |-----------------------------------------------------------------| * | MoDARCY : modele Darcy. | * | | * | Porosite : champ par elements de composante 'CK' | * | | * | MateDiff : Tenseur de diffusion (type iso, ..) champ par | * | elements de composante 'K' en isotrope, 'K11', 'K21',| * | 'K22' en anisotrope 2d et 'K11', 'K21', 'K22', 'K31'| * | 'K32', 'K33' en anisotrope 3d. Type 'CARACTERISTIQ * | | * | ChPSour : Champ par points des sources volumiques par unité de | * | temps (support maillage centre). Composante ?????? | * | | * | DeltaT : Pas de temps. | * | | * | Cini : Concentration initiale, CHPOINT centre. | * | | * | TetaDiff : Valeur de theta pour theta-schéma en temps, opérateur| * | de diffusion. Entre 0 et 1. 0 = explicite, 1 = euler | * | implicite. | * | | * | TetaConv : Valeur de theta pour theta-schéma en temps, opérateur| * | de convection. Entre 0 et 1. 0 = explicite, 1 = Euler| * | implicite. | * | | * | TetaLin : valeur de theta pour theta-schéma en temps, opérateur| * | linéaire du type coef * C, où C est l'inconnue. | * | Entre 0 et 1. 0 = explicite, 1 = euler implicite. | * | ??????????? A voir car peut etre identique à Tetadiff| * | | * | | * | Qface : vitesse aux faces, CHPO face de composantes Vx, Vy | * | en 2d et Vx, Vy, Vz en 3d. Il s'agit plus exatement | * | de (V.n)n, c'est à dire de la composante normale de | * | la vitesse aux faces. ???????? (je pressens que | * | castem va sortir des flux, cad intégrés sur surfaces)| * | | * | CHCLIM : table d'indice 'NEUMANN' et 'DIRICHLET' contenant les| * | Chpoint à n composantes contenant les conditions aux | * | limites de Neumann et Dirichlet par espece. | * | | * | OPTRESOL : Table dont l'entree est optionnelle définissant | * | les options de résolution pour 'KRES'. | * | | * |-----------------------------------------------------------------| * | SORTIES | * |-----------------------------------------------------------------| * | | * | | * | RESI : second membre | * | | * | Matot : matrice globale de discretisation en VF | * | | * | Jaco : matrice globale de discretisation en VF pour le problème * | stationnaire | * | | * | Mpor : matrice globale de discretisation en VF pour le problème * | stationnaire | * | | * | Mchamt : Coef permettant de calculer le flux total | * | | * | Mchamt1 : Coef permettant de calculer le flux diffusif | * | | * | Difftot : Coefficient de diffusion totale, integre decentrement| * | | * | Diffdisp : Coefficient de dispersivité | * | | * | nomespc : liste des noms de composante des espèces dans Cini | * | | * | nbespece : nombre de composante de Cini, soit nombre d'especes | * | | * | nbsource : nombre de composantes du terme source qd X especes | * | | * | TABRES : Table complète définissant les options de résolution | * | pour 'KRES'. | * | | * | TABMODI : table contenant des logiques indiquant la nécessité | * | ou non de reclalculer certains termes. | * | 'POROSITE' : VRAI si le coefficient devant D/DT | * | (porosité) est modifié depuis le dernier| * | appel | * | 'DELTAT' : VRAI si le pas de tps a changé | * | 'CONVECTI' : VRAI si la vitesse a changé | * | 'COEF_LIN' : VRAI si le coef en facteur de C a changé| * | 'DIFFUSI' : VRAI si les diffusivités ont changé | * | | * | NOUVMAT : Logique affecté à VRAI lorsque que Matot vient * | d'etre calculée * |-----------------------------------------------------------------| * | VARIABLES INTERNES | * |-----------------------------------------------------------------| * | | * | PCONV : Logique indiquant VRAI si présence de convection | * | | * | toltheta : 1.D-4 seuil en dessous duquel on considère que la | * | valeur de theta du theta-schéma est nulle (schéma | * | explicite) ou au contraire euler-implicite si | * | theta > 0.9999 | * | | * | SSource : Source aux centre (une composante) | * | | * | CCini : concentration aux centres (une composante) | * | | * | lstcps : liste des noms de composante des espèces dans Chpsour| * | | * | SSMTr : second membre sur les traces pour une espèce | * | | * | FLUNEU : LOGIQUE valant VRAI si conditions de Neumann | * | | * | CLFLUX : Chpoint à n composantes contenant les flux imposés | * | pour chaque espece chimique. nul si pas de flux | * | OPTIONNEL | * | | ********************************************************************** *--------------------------------------------------------------------- *---------- On récupere les conditions limites ------------------ *--------------------------------------------------------------------- *MESS 'MODARCY'; *LIST MODARCY; FLUNEU = FAUX; DIRCLI = FAUX; FLUTOT = FAUX; FLUMIX = FAUX; EXFLU = CLFLUX; EXDIR = CLDIRI; EXFLUT = CLFLUT; EXFLUX3 = CLFLUX3; * Neumann 'SI' ('EXISTE' CHCLIM 'NEUMANN') ; CLFLUX = CHCLIM . 'NEUMANN'; FLUNEU = VRAI; 'FINSI'; 'SI' ('EXISTE' CHCLIM 'DIRICHLET') ; CLDIRI = CHCLIM . 'DIRICHLET'; DIRCLI = VRAI; 'FINSI'; 'SI' ('EXISTE' CHCLIM 'FLUTOTAL') ; CLFLT = CHCLIM . 'FLUTOTAL'; FLUTOT = VRAI; 'FINSI'; * Flux mixte 'SI' ('EXISTE' CHCLIM 'FLUMIXTE') ; * comme on impose A Dgrad C + B C = flumix, on le traite sous * la forme D grad C + (B/A) C = flumix/A plus naturelle en EFMH car * D grad C est le flux diffusif COFA = -1.D0 * CHCLIM . 'FLUMIXTE' . 'COEFA' ; CLFLUX3 = CHCLIM . 'FLUMIXTE' . 'VAL' '/' COFA ; FLUMIX = VRAI ; mayage = 'EXTRAIRE' CHCLIM . 'FLUMIXTE' . 'VAL' maillage ; cofb = CHCLIM . 'FLUMIXTE' . 'COEFB' ; coefm = (1.D0 * cofb) '/' cofa ; 'OUBLIER' cofa ; 'OUBLIER' cofb ; 'FINSI' ; *MESS 'DIRICHLET'; *LIST CLDIRI ; *--------------------------------------------------------------------- *---------- Initialisations de tables, coefficients ------------------ *--------------------------------------------------------------------- * Table de logiques indiquant des modifications. Initialisation TABMODI = TABLE; TABMODI . 'POROSITE' = FAUX; TABMODI . 'CONVECTI' = FAUX; TABMODI . 'DELTAT' = FAUX; TABMODI . 'COEF_LIN' = FAUX; TABMODI . 'DIFFUSIV' = FAUX; 'SI' ('EXISTE' QFACE) ; PCONV = VRAI; 'SI' ('EXISTE' DISPL) ; DISPERSI = VRAI ; 'SINON' ; DISPERSI = FAUX; 'FINSI' ; 'SINON' ; PCONV = FAUX; DISPERSI = FAUX; 'FINSI' ; * tolerance sur theta du theta schéma de discrétisation en temps. * il faudrait remmettre les theta à 0 ou 1 si nécessaire dans * procédure amont. toltheta = 1.D-4; 'SI' (TetaConv 'EGA' 0.D0 toltheta) ; TetaConv = 0.D0; 'FINSI' ; 'SI' (TetaConv 'EGA' 1.D0 toltheta) ; TetaConv = 1.D0; 'FINSI' ; 'SI' (TetaDiff 'EGA' 0.D0 toltheta) ; TetaDiff = 0.D0; 'FINSI' ; 'SI' (TetaDiff 'EGA' 1.D0 toltheta) ; TetaDiff = 1.D0; 'FINSI' ; 'SI' (TetaLin 'EGA' 0.D0 toltheta) ; TetaLin = 0.D0; 'FINSI' ; 'SI' (TetaLin 'EGA' 1.D0 toltheta) ; TetaLin = 1.D0; 'FINSI' ; * Calcul du terme devant le dC/dt integré sur le volume *MPOR2 = 'KOPS' 'MATDIAGO' ('MOTS' 'RETN') Porosite ; *--------------------------------------------------------------------- *----------------------- CREATION TABLE POUR RESOLUTION -------------- *--------------------------------------------------------------------- **************** OPTIONS PAR DEFAUT ************************** * création de la table de résolution pour l'opérateur KRES * On crée la table de résolution avec les options par défaut * On y remplacera les valeurs définit par l'utilisateur ensuite. TABRES = 'TABLE' 'METHINV' ; * option BCGSTAB par défaut pour une matrice non symétrique METHRES = 3; TABRES . 'TYPINV' = METHRES ; * niveau d'impression. TABRES . 'IMPINV' = 0 ; * Type de renumérotation. Option SLOANE par défaut TABRES . 'TYRENU' = 'SLOANE' ; * La gestion des multiplicateurs sera modifiée * par la suite. Pas d'option pour l'instant TABRES . 'PCMLAG' = 'APR2' ; TABRES . 'OUBMAT' = 0 ; TABRES . 'SCALING' = 0 ; *INDICES SPÉCIFIQUES POUR UNE MÉTHODE ITÉRATIVE * Nombre maxi d'itérations TABRES . 'NITMAX' = 1500 ; * résidu pour la convergence de la méthode TABRES . 'RESID' = 1.D-15 ; * valeur minimale du pivot de la méthode TABRES . 'BCGSBTOL' = 1.D-120 ; * preconditionnement ILU(0) TABRES . 'PRECOND' = 3 ; *relaxation pour MILU0 TABRES . 'MILURELX' = 1.D0 ; *GMRESTART TABRES . 'GMRESTRT' = 100 ; *ILUTLFIL TABRES . 'ILUTLFIL' = 2; * drop tolerence pour ILUT2 TABRES . 'ILUTDTOL' = 0.D0; TABRES . 'ILUTPTOL' = 0.01D0; TABRES . 'ILUTALPH' = 0.D0 ; ************** OPTIONS UTILISATEUR ************************** * L'utilisateur a défini des options pour la méthode * de résolution. * Type d'inversion 'SI' ('EXISTE' OPTRESOL 'TYPINV') ; TABRES . 'TYPINV' = OPTRESOL . 'TYPINV'; 'FINSI' ; * Niveau d'impression 'SI' ('EXISTE' OPTRESOL 'IMPINV') ; TABRES . 'IMPINV' = OPTRESOL . 'IMPINV'; 'FINSI' ; * Type de renumérotation. 'SI' ('EXISTE' OPTRESOL 'TYRENU') ; TABRES . 'TYRENU' = OPTRESOL . 'TYRENU'; 'FINSI' ; * Indices spécifiques aux méthodes itératives 'SI' ((TABRES . 'TYPINV') > 1); * Nombre maxi d'iterations 'SI' ('EXISTE' OPTRESOL 'NITMAX') ; TABRES . 'NITMAX' = OPTRESOL . 'NITMAX'; 'FINSI' ; * Valeur du résidu de la méthode 'SI' ('EXISTE' OPTRESOL 'RESID') ; TABRES . 'RESID' = OPTRESOL . 'RESID'; 'FINSI' ; * valeur minimal du pivot de la méthode 'SI' ('EXISTE' OPTRESOL 'BCGSBTOL') ; TABRES . 'BCGSBTOL' = OPTRESOL . 'BCGSBTOL'; 'FINSI' ; * precond par diagonale 'SI' ('EXISTE' OPTRESOL 'PRECOND') ; TABRES . 'PRECOND' = OPTRESOL . 'PRECOND'; 'FINSI' ; * precon ILUT2 'SI' ('EXISTE' OPTRESOL 'ILUTLFIL') ; TABRES . 'ILUTLFIL' = OPTRESOL . 'ILUTLFIL' ; 'FINSI' ; 'FINSI' ; * Pour GMRES 'SI' ((TABRES . 'TYPINV') EGA 5); 'SI' ('EXISTE' OPTRESOL 'GMRESTRT') ; TABRES . 'GMRESTRT' = OPTRESOL . 'GMRESTRT'; 'SINON' ; TABRES . 'GMRESTRT' = 50; 'FINSI' ; 'FINSI' ; 'FINSI' ; SI (('EGA' TABRES . 'PRECOND' 8) 'OU' ('EGA' TABRES . 'PRECOND' 7)); TABRES . 'ILUTDTOL' = 0.1D-2; FINSI ; *--------------------------------------------------------------------- *--------------------- CALCUL DE LA DISPERSIVITE---------------------- *--------------------------------------------------------------------- * On remmet la matrice de diffusivité avec les bons noms de composantes * anisotropes Matediff = zozo ; * Seulement si présence de convection et présence de * dispersivité et disp_l et disp_t 'SI' (DISPERSI 'ET' PCONV) ; 'SINON' ; Diffdisp = 0.D0 * Matediff ; 'FINSI' ; Difftot = Matediff '+' Diffdisp ; *---------------------------------------------------------------------- *--- CALCUL DE LA MATRICE DE CONVECTION ET DES SECONDS MEMBRES -------- *---------------------------------------------------------------------- ************** Nombres d'espèces à gérer ****************************** ** évaluation du nombre d'espèces. * nb de termes sources, commun (1), ou egal au nombre * d'especes (nbcompi) 'SI' ((nbsource 'NEG' 1) 'ET' (nbsource 'NEG' nbespece)) ; 'MESSAGE' 'La source doit avoir le meme nombre de composantes'; 'MESSAGE' 'que les espèces ou 1 seule composante'; ERREUR 5; 'FINSI' ; ********************* Une ou plusieurs espèces ************************ 'SI' (nbespece > 0) ; DTI = 1.D0/DeltaT; 'REPETER' bloc1 nbespece; * On extrait la composante de Cini, Tcini et de la source 'SI' (nbsource > 1) ; Chpsour); 'SINON' ; 'FINSI' ; * Conditions initiales * Extraction des conditions aux limites 'SI' (FLUNEU) ; EXFLU = CLFLUX)) ; * MESS 'EXFLU ='; LIST EXFLU; 'FINSI' ; 'SI' (DIRCLI) ; EXDIR = CLDIRI)) ; * MESS 'EXDIR ='; LIST EXDIR; 'FINSI' ; 'SI' (FLUTOT) ; EXFLUT = CLFLT )) ; * MESS 'QLIM ='; XPAR1 = 1.D0 + (0.0*CLFLT) ; * MESS 'XPAR1 ='; 'SI' LCONV ; MUSCN = USCNR*(-1.D0) ; * MESS 'XPAR2 ='; 'SINON' ; MUSCN = (0.D0*CLFLT) ; 'FINSI' ; EXFLUT = XPAR1 + XPAR2 + QLIM ; * MESS 'EXFLUT ='; LIST EXFLUT; 'FINSI' ; 'SI' (FLUMIX) ; EXFLUM = CLFLUX3 )) ; XPAR1 = 1.D0 + (0.0*CLFLUX3) ; * MESS 'XPAR1 ='; MUSCN = coefm; EXFLUM = XPAR1 + XPAR2 + QLIM ; EXFLUT = EXFLUT 'ET' EXFLUM ; 'FINSI' ; * calcul des coefs mchamt1 et mchamt qui permettent d'assembler la * matrice et de calculer les flux diffusifs et convectifs * On recalcule deux fois les coefficients. En général, cela doit etre * négligeable en temps de calcul; HHS 'DISPDIF' difftot 'TIMP' EXDIR 'QIMP' EXFLU 'MIXT' EXFLUT ; MCHAMT = MCHAMT1; MCHAJA = TetaDiff*MCHAMT1 ; 'SI' LCONV ; HHS 'DISPDIF' difftot 'TIMP' EXDIR 'QIMP' EXFLU 'MIXT' EXFLUT 'UPWICENT' QFace ; * ATTENTION PEUT ETRE FAUX SI TetaConv different de TetaDiff MCHCONV = MCHAMT + ((-1.D0)*MCHAMT1) ; MCHAJA = (TetaConv*MCHCONV) + (TetaDiff*MCHAMT1) ; * VERRUE MCHAJA = tetadiff*MCHAMT; 'DETRUIT' MCHCONV ; 'FINSI' ; * On ne calcule la jacobienne que pour la première espèce 'SI' ((&bloc1) 'EGA' 1) ; MoDARCY HHS GRADT0 MCHAJA 'QIMP' EXFLU 'MIXT' EXFLUT 'TIMP' EXDIR ; MATI = '*' MPOR2 DTI ; MATOT = MATOT 'ET' MATI ; 'SINON' ; JACOB CHPRES DT = 'LAPN' 'VF' 'CLAUDEIS' 'EXPL' MoDARCY HHS GRADT0 ; 'FINSI'; * On reconstitue un champ de second membre 'SI' ((&bloc1) 'EGA' 1) ; 'SINON' ; ('COPIER' CHPRES) ; 'FINSI' ; 'FIN' bloc1; 'FINSI' ; 'MENAGE' ; NOUVMAT = VRAI; nbespece nbsource TABRES TABMODI NOUVMAT;
© Cast3M 2003 - Tous droits réservés.
Mentions légales