* TRANSGEN PROCEDUR JC220346 12/09/12 21:15:09 7501 *TRANSGEN PROCEDUR GBM 04/01/03 * SUPPRIMER TOUS LES 'H', stocker composante de CHRG 'ET' * REMPLACER LES 'H' par cela. A faire. *--------------------------------------------------------------------- * Résolution de l'équation de darcy pour un problème d'écoulement ou * de transport par une méthode d'éléments * finis mixtes hybrides ou VF. Les inconnues du problème sont * - en EFMH, la concentration (H), la trace de * concentration (TH) et le débit diffusif (FLUX). * - en VF, la concentration (H) *--------------------------------------------------------------------- * *------------------------------ * Phrase d'appel (en GIBIANE) : *------------------------------ * * TRANSGEN TABLE ; * *---------------------------------- * Opérandes (à mettre dans TABLE) : *---------------------------------- * * ___________________________________________________________________ * | | * | Indice Contenu | * | | * ------------------------------------------------------------------- * | | * |------------------------------------------------ | * |Données physiques, géométriques et materielles : | * |------------------------------------------------ | * | | * |'MODELE' Objet modèle (MMODEL créé par MODE) | * | | * |'CARACTERISTIQUES' Données physiques et materielles : | * | diffusivité effective (CHAMELEM créé par MATE) | * | | * |'POROSITE' Valeur de la porosité (Type Champoint, Comp | * | 'SCAL', ou FLOTTANT) - Défaut 1. | * | | * |'DECROISSANCE' Valeur du terme de décroissance (Type FLOTTANT) | * | Tel que dC/dt = - Lambda * C - Défaut 0. | * | | * |'COEF_RETARD' Coefficient de retard linéaire dans le cas simple, | * | ou Pente à l'origine de la fonction F(C) dans le | * | cas d'isotherme non linéaire de Langmuir | * | ou Coefficient K de l'isotherme de Freundlich | * | (Type CHPO Centre 'SCAL', ou FLOTTANT) | * | | * |'LANGMUIR' Quantité maximale 'Fsat' adsorbée sur le solide | * | rapportée à l'unité de volume du fluide et exprimée| * | dans la meme unité que le soluté. | * | (Type CHPO Centre 'SCAL', ou FLOTTANT). | * | F = (R-1) C / [1 + ((R-1) C / Fsat)] | * | Si cet indice et le suivant sont absents, | * | l'équilibre d'adsorption est linéaire. Cet indice a| * | priorité sur l'indice FREUNDLICH. | * | | * |'FREUNDLICH' Exposant de la loi de Freundlich F = K (C ^ 1/n) | * | (Type FLOTTANT). | * | Dans ce cas (et si l'indice LANGMUIR n'existe pas),| * | l'indice 'COEF_RETARD' contient le coefficient | * | K ramené à une unité de volume de fluide. | * | - Non disponible pour l'instant - | * | | * |'LIMITE_SOLUBILITE' Limite de solubilité (Type chpoin, Comp 'H') | * | | * |'COEF_DISSOLUTION' Coef. de dissolution (Type CHPO Centre, Comp | * | 'SCAL'). Tel que dC/dt = Coef * (Csat - C) - Par | * | défaut, la dissolution est instantanée | * | | * |'CONVECTION' Débit intégré de la vitesse convective à travers | * | chaque face des éléments (Type CHPO Face, comp. | * | 'FLUX') | * | | * |---------------------- | * |Conditions initiales : | * |---------------------- | * | | * |'TEMPS' TABLE contenant à l'indice 0 la valeur du temps | * | initial (FLOTTANT) | * | | * | | * |'CONCENTRATION' TABLE contenant à l'indice 0 la concentration | * | (quantité d'élément par unité de volume d'eau) | * | (Type CHPO Centre, Comp 'H') | * | | * |'FLUX' TABLE contenant à l'indice 0 le flux diffusif | * | initial intégré sur chaque face (Type CHPO Face, | * | comp. 'FLUX') | * | | * |'PRECIPITE' TABLE contenant à l'indice 0 la quantité initiale | * | de précipité par unité de volume de milieu solide | * | (Type CHPO Centre, Comp 'H') | * | | * |'DISSOLUTION' TABLE contenant à l'indice 0 la quantité initiale | * | pour estimer la dissolution au premier pas de temps| * | (Type CHPO, Comp 'H'), voir plus loin. | * | | * |-------------------------------------- | * |Conditions aux limites / chargements : | * |-------------------------------------- | * | | * |'BLOCAGE' Contient les matrices de blocage (RIGIDITE) | * | | * |'TRACE_IMPOSE' Valeurs des traces imposées (charge ou concentra- | * | -tion) (CHARGEMENT 'TH' - Obligatoire si BLOCAGE) | * | | * |'FLUX_IMPOSE' Valeurs des flux imposés intégrés par face | * | (Type CHARGEMENT de CHPO Face, comp. 'FLUX'- | * | défaut 0.) | * | | * |'FLUXTOT_IMP' Valeurs des flux totaux imposés intégrés par face | * | (Type CHARGEMENT de CHPO Face, comp. 'FLUX'- | * | défaut 0.). Il s'agit du flux diffusif + convectif | * | | * |'MIXTES' Table : indice C contient les valeurs des flux | * | mixtes imposés intégrés par face | * | (Type CHARGEMENT de CHPO Face, comp. 'FLUX'- | * | défaut 0.) il est égal à A * flux diffusif + | * | B * Concentration | * | Indice A et B sont les réels A et B | * | | * |'SOURCE' Valeurs du terme source par maille et par unité de | * | temps (ex : puits, filiation) | * | Les valeurs à l'indice i sont les valeurs entre | * | les temps i-1 et i. | * | (CHARGEMENT de CHPO Centre, comp 'SOUR'- défaut 0.)| * | | * | | * |'DISSOLUTION_IMPOSEE' Valeurs des dissolutions imposées par unité| * | de temps et par maille. (Type CHARGEMENT de CHPO, | * | Comp 'H'). Les valeurs à l'indice i sont les | * | valeurs moyennes de dissolution par unité de temps | * | entre les temps i-1 et i. | * | Priorité de la dissolution imposée sur les | * | cinétiques. | * | | * |-------------------- | * |Données numériques : | * |-------------------- | * | | * | | * |'TEMPS_CALCULES' Valeur des temps calculés (LISTREEL) | * | Contient obligatoirement le temps final. | * | | * |'TEMPS_SAUVES' Valeur des temps sauvegardés (LISTREEL - défaut : | * | on sauve tous les pas de temps) | * | | * | | * | | * |'THETA_DIFF' Coefficient de relaxation compris entre 0. et 1. | * | (theta-méthode diffusion) ('FLOTTANT' - défaut 1.) | * | | * |'THETA_CONV' Idem pour la convection | * | ('FLOTTANT', Défaut = THETA_DIFF) | * |'THETA_DEC' Idem mais pour la décroissance | * | ('FLOTTANT' - défaut 1/2) | * | | * |'THETA_DISS' Idem mais pour la dissolution | * | ('FLOTTANT' - défaut 1.) | * | | * |'PENALISATION' Coefficient de pénalisation pour la prise en | * | compte de la limite de solubilité. La présence de | * | cet indice ou du suivant indique quel schéma a été | * | choisi. | * | (Type 'FLOTTANT') - Valeur conseillée 1.D7 | * | | * |'EPSI_LIM' Précision relative d'arrêt pour le shéma limite de | * | solubilité prédicteur-correcteur itératif | * | (Type FLOTTANT) - Valeur conseillée 5.D-3 | * | | * |'ITMAX_LIM' Nombre maxi d'itérations correspondant aux modules | * | de dissolution avant d'abandonner | * | (Type 'ENTIER') - Défaut 50 | * | | * |'EPSI_RET' Précision relative d'arrêt pour la résolution | * | itérative (Picard) de l'adsorption non linéaire | * | (Type FLOTTANT) - Défaut 1.D-4 | * | | * |'EPSI_COR' Petit saut de concentration pour calculer le coef. | * | de retard par la méthode de la corde lorsque le | * | retard est non-linéaire. | * | (Type FLOTTANT) - Défaut 1.D-4 | * | | * |'ITMAX_RET' Nombre maxi d'itérations correspondant au retard | * | non linéaire avant d'abandonner. | * | (Type 'ENTIER') - Défaut 20 | * |_________________________________________________________________| * * * *--------------------------------- * Résultats (stockés dans TABLE) : *--------------------------------- * * ___________________________________________________________________ * | | * | Indice Contenu | * | | * ------------------------------------------------------------------- * | | * | | * |'TEMPS' TABLE contenant les temps sauvegardés (FLOTTANT) | * | | * |'CONCENTRATION' TABLE contenant les concentrations | * | (Type CHPO Centre, Comp 'H') | * | | * |'FLUX' TABLE contenant les débits diffusifs intégrés | * | par face (Type CHPO Face, comp. 'FLUX') | * | | * |'PRECIPITE' TABLE contenant la quantité de précipité par maille| * | (Type CHPO Centre, Comp 'H') | * | | * |'DISSOLUTION' TABLE contenant la quantité de précipité dissoute | * | entre deux pas de temps par unité de volume et par | * | unité de temps. La valeur stockée à l'indice i, | * | est valable entre les temps i-1 et i | * | (Type CHPO, Comp 'H'). | * | ATTENTION, les valeurs de cette table résultat | * | n'ont aucun sens lorsque les temps sauvegardés ne | * | sont pas les memes que les temps calculés. Toute | * | tentative d'exploitation donnera alors des | * | résultats incohérents (erreurs de bilan) | * | | * |'RETARD' Si cet indice a été préalablement défini comme une | * | TABLE, alors il contient les valeurs du coefficient| * | de retard (Type 'CHPO' centre, Comp 'SCAL'). Sinon,| * | les valeurs du coefficient de retard ne sont pas | * | sauvegardées. | * |_________________________________________________________________| * * * ___________________________________________________________________ * | | * | Les tables résultats sont indicées par des entiers variant de 0 | * | à N . | * | A l'indice 0 on stocke les valeurs initiales, aux indices | * | suivants les champs correspondant au temps de sortie TEMPS.I . | * | Les champs servant en cas de reprise sont ceux correpondant au | * | dernier indice. | * |_________________________________________________________________| * * * TYPE DE RESOLUTION * *--------------------------------------------------------------------* * RECUPERATION DES DONNEES PHYSIQUES, GEOMETRIQUES ET MATERIELLES * *--------------------------------------------------------------------* * * MODELE 'SI' ( 'EXISTE' TRANSI 'MODELE' ) ; MODDARCY = TRANSI . 'MODELE' ; * METTRE LE PRECOND à 1 pour ne pas recalculer les préconditionnements * sur le maillage 'SINON' ; 'ERREUR' 'Il manque le modele.' ; 'FINSI' ; * VOLUME * ORIENTATION * * * * FILIATION 'SI' ('NON' ('EXISTE' TRANSI 'PERE')) ; TRANSI . 'PERE' = FAUX ; 'FINSI' ; * CARACTERISTIQUES 'SI' ( 'EXISTE' TRANSI 'CARACTERISTIQUES' ) ; MAT1 = TRANSI . 'CARACTERISTIQUES' ; 'FINSI' ; * Si la diffusion est un chargement, le traitement à lieu dans le * corps du programme 'SINON' ; 'ERREUR' 'Indice CARACTERISTIQUES absent de la table de données.' ; 'FINSI' ; * EMMAGASINEMENT OU POROSITE 'SI' ( 'EXISTE' TRANSI NOMDDT ) ; POROS = TRANSI . NOMDDT ; 'SINON' ; POROS = 1.D0 ; 'FINSI' ; * VERRUE * POROS = 'MANU' 'CHPO' MCENT 'SCAL' 1.D0 NATURE DISCRET ; * 'FINSI' ; 'ERREUR' ('CHAINE' 'L indice ' NOMDDT ' doit etre de type ' 'FLOTTANT ou CHAMPOINT') ; 'SINON' ; 'FINSI' ; *'SI' ((('MINI' POROS) < 0.D0) 'OU' (('MAXI' POROS) > 1.D0)) ; * 'ERREUR' 'La porosité doit etre comprise entre 0 et 1' ; *'FINSI' ; * RETARD 'SI' ( 'EXISTE' TRANSI 'COEF_RETARD' ) ; RETAR1 = TRANSI . 'COEF_RETARD' ; 'SINON' ; MINRET = RETAR1 ; 'FINSI' ; 'SI' (MINRET < 1.D0) ; 'ERREUR' 'Le coefficient de retard doit etre supérieur à 1'; 'FINSI' ; 'SINON' ; * RETAR1 = kcht modhyb scal centre 1.D0 ; 'FINSI' ; RETAR1M1 = RETAR1 - 1. ; SAUVRET = 'EXISTE' TRANSI 'RETARD' ; * RETARD NON LINEAIRE RNONLINL = ('EXISTE' TRANSI 'COEF_RETARD') 'ET' ('EXISTE' TRANSI 'LANGMUIR') ; RNONLINF = ('EXISTE' TRANSI 'COEF_RETARD') 'ET' ('EXISTE' TRANSI 'FREUNDLICH') 'ET' ('NON' RNONLINL) ; RNONLIN = RNONLINL 'OU' RNONLINF ; * Cas Langmuir : 'SI' RNONLINL ; FSAT = TRANSI . 'LANGMUIR' ; 'ERREUR' 'La masse adsorbee a saturation doit etre positive' ; 'FINSI' ; 'SINON' ; 'SI' (FSAT < 0.D0) ; 'ERREUR' 'La masse adsorbee a saturation doit etre positive' ; 'FINSI' ; 'FINSI' ; RM1SURF = RETAR1M1 / FSAT ; 'FINSI' ; * Cas Freundlich : 'SI' RNONLINF ; UNSURN = TRANSI . 'FREUNDLICH' ; 'SI' ((UNSURN <EG 0.D0) 'OU' (UNSURN > 1.D0)) ; 'ERREUR' 'L exposant de Freundlich doit etre compris entre 0' ' (exclu) et 1' ; 'FINSI' ; 'FINSI' ; * DECROISSANCE DECRO = ( 'EXISTE' TRANSI 'DECROISSANCE' ) ; 'SI' DECRO ; LAMBD0 = TRANSI . 'DECROISSANCE' ; 'SI' (LAMBD0 < 0.D0) ; 'ERREUR' 'Le coefficient de décroissance doit etre positif.'; 'FINSI' ; 'SINON' ; LAMBD0 = 0. ; 'FINSI' ; * DISSOLUTION_IMPOSEE SOLUA = ('EXISTE' TRANSI 'DISSOLUTION_IMPOSEE' ) ; 'SI' SOLUA ; DISIMP = TRANSI . 'DISSOLUTION_IMPOSEE' ; 'FINSI' ; * LIMITE_SOLUBILITE * (Priorité de la dissolution imposée sur les autres processus) SOLUL = (('EXISTE' TRANSI 'LIMITE_SOLUBILITE' ) 'ET' ('NON' SOLUA)) ; 'SI' SOLUL ; 'FINSI' ; 'ERREUR' 'La limite de solubilité doit etre positive.' ; 'FINSI' ; 'FINSI' ; * COEF_DISSOLUTION SOLUP = SOLUL 'ET' ('EXISTE' TRANSI 'COEF_DISSOLUTION' ) ; SOLUI = SOLUL 'ET' ('NON' SOLUP) ; 'SI' SOLUP ; codis = TRANSI . 'COEF_DISSOLUTION' ; 'ERREUR' 'Le coefficient de dissolution doit etre positif.'; 'FINSI' ; 'SINON' ; CODIS = TRANSI . 'COEF_DISSOLUTION' ; 'ERREUR' 'Le coefficient de dissolution doit etre positif.'; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'SI' (SOLUP) ; * Là où la précipitation est nulle (codis =0) on choisit * une limite de solubilité élevée à des fins d'optimisation * algorithmique dum = 'MASQUE' CODIS INFERIEUR 1.D-30 ; 'FINSI' ; 'FINSI' ; SOLUB = SOLUL 'OU' SOLUA ; * * ------------------------------------------------------------------ * * VERIFICATION DE LA BONNE STRUCTURE DES TABLES RESULTAT D'ORIGINE * * ------------------------------------------------------------------ * * * TEMPS 'SI' ( 'NON' ('EXISTE' TRANSI 'TEMPS' ) ) ; 'ERREUR' 'Indice TEMPS absent de la table de données.' ; 'FINSI' ; * INCONNUE 'SI' ( 'NON' ('EXISTE' TRANSI NOMINC ) ) ; 'ERREUR' ('CHAINE' 'Indice ' NOMINC ' absent de la table de données.') ; 'FINSI' ; * FLUXDIFF 'SI' ( 'NON' ('EXISTE' TRANSI 'FLUXDIFF' ) ) ; 'ERREUR' 'Indice FLUX diffusif absent de la table de données.' ; 'FINSI' ; * FLUXCONV 'SI' ( 'NON' ('EXISTE' TRANSI 'FLUXCONV' ) ) ; 'ERREUR' 'Indice FLUX convectif absent de la table de données.' ; 'FINSI' ; * DISSOLUTION, PRECIPITE 'SI' SOLUB ; * GBM mettre a jour dissolution . * 'SI' ( 'NON' ('EXISTE' TRANSI 'DISSOLUTION' ) ) ; * 'ERREUR' * 'Indice DISSOLUTION absent de la table de données.' ; * 'QUITTER' TRANSGEN ; * 'FINSI' ; 'SI' ( 'NON' ('EXISTE' TRANSI 'PRECIPITE' ) ) ; 'ERREUR' 'Indice PRECIPITE absent de la table de données.' ; 'FINSI' ; 'FINSI' ; * TEST DES TAILLES DE TABLE IND1 = 'INDEX' ( TRANSI . 'TEMPS' ) ; IND3 = 'INDEX' ( TRANSI . NOMINC ) ; IND4 = 'INDEX' ( TRANSI . 'FLUXDIFF' ) ; 'SI' ( LIN1 'NEG' LIN3 ) ; 'ERREUR' ('CHAINE' 'FINSI' ; 'SI' ( LIN1 'NEG' LIN4 ) ; 'ERREUR' 'FINSI' ; 'SI' SOLUB ; * GBM mettre a jour dissolution . * IND5 = 'INDEX' ( TRANSI . 'DISSOLUTION' ) ; IND6 = 'INDEX' ( TRANSI . 'PRECIPITE' ) ; * LIN5 = 'DIME' IND5 ; * 'SI' ( LIN1 'NEG' LIN5 ) ; * 'ERREUR' * 'Longueur des tables TEMPS et DISSOLUTION différente.' ; * 'QUITTER' TRANSGEN ; * 'FINSI' ; 'SI' ( LIN1 'NEG' LIN6 ) ; 'ERREUR' 'FINSI' ; 'FINSI' ; * TEST DES INDICES DE TABLE IPO1 = 0 ; 'REPETER' BOU1 LIN1 ; IPO1 = IPO1 + 1 ; LAST1 = IND1 . IPO1 ; LAST3 = IND3 . IPO1 ; LAST4 = IND4 . IPO1 ; 'SI' SOLUB ; * GBM mettre a jour dissolution . * LAST5 = IND5 . IPO1 ; LAST6 = IND6 . IPO1 ; 'FINSI' ; 'SI' ( 'NEG' LAST1 LAST3 ) ; 'ERREUR' 'Indices des tables TEMPS et CONCENTRATION incohérents.' ; 'FINSI' ; 'SI' ( 'NEG' LAST1 LAST4 ) ; 'ERREUR' 'FINSI' ; 'SI' SOLUB ; * GBM mettre a jour dissolution . * 'SI' ( 'NEG' LAST1 LAST5 ) ; * 'ERREUR' * 'Indices des tables TEMPS et DISSOLUTION incohérents.'; * 'QUITTER' TRANSGEN ; * 'FINSI' ; 'SI' ( 'NEG' LAST1 LAST6 ) ; 'ERREUR' 'Indices des tables TEMPS et PRECIPITE incohérents.' ; 'FINSI' ; 'FINSI' ; 'FIN' BOU1 ; * * ------------------------------------------------------------------ * * RECUPERATION DES CONDITIONS INITIALES OU DU DERNIER PAS SAUVE * * ------------------------------------------------------------------ * * TPSINI = TRANSI . 'TEMPS' . LAST1 ; *Momentanée pour la trace * On extrait les noms de composante des espèces * nomespl est un nom d'espece locale à la procédure car * les EFMH veulent voir une composante 'H' *VERRUE * *--------------------------------------------------------------------* * RECUPERATION DES THETA SCHEMAS DIFFUSION-CONVECTION * *--------------------------------------------------------------------* * THETA DIFFUSION 'SI' ( 'EXISTE' TRANSI 'THETA_DIFF' ) ; TETA = TRANSI . 'THETA_DIFF' ; 'SINON' ; TETA = 1.D0 ; 'FINSI' ; * THETA CONVECTION 'SI' ( 'EXISTE' TRANSI 'THETA_CONVECTION' ) ; TETAC = TRANSI . 'THETA_CONVECTION' ; 'SINON' ; TETAC = TETA ; 'FINSI' ; * *--------------------------------------------------------------------* * RECUPERATION DES CONDITIONS AUX LIMITES ET DES CHARGEMENTS * *--------------------------------------------------------------------* * * CL de type Dirichlet : BLOCAGE * TRACE_IMPOSE * On débranche les tests sur les longueurs de flux non nuls * en CL pour les cas ou ils ne sont pas intégrés en temps startflu = 1.D30; startflt = 1.D30; startmix = 1.D30; 'SI' ( 'EXISTE' TRANSI 'TRACE_IMPOSE') ; CHDIRI = TRANSI . 'TRACE_IMPOSE' ; 'FINSI' ; * CL de type Neumann : FLUX_IMPOSE 'SI' ( 'EXISTE' TRANSI 'FLUX_IMPOSE' ) ; FLUIMP = TRANSI . 'FLUX_IMPOSE' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH 'FINSI' ; 'FINSI' ; * CL de type flux total: FLUXTOT_IMP 'SI' ( 'EXISTE' TRANSI 'FLUXTOT_IMP' ) ; FLTOTIMP = TRANSI . 'FLUXTOT_IMP' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH 'FINSI' ; 'FINSI' ; * CL de type mixte : MIXTES 'SI' ( 'EXISTE' TRANSI 'MIXTES' ) ; FLUMIX = TRANSI . 'MIXTES' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH 'FINSI' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; TERSOU = TRANSI . 'SOURCE' ; * on crée une evolution intégrée temporellement pour assurer la * conservation lors de liste de pas de temps de chargement differente * des temps de discrétisation 'FINSI' ; * *--------------------------------------------------------------------* * RECUPERATION DES données NUMERIQUES * *--------------------------------------------------------------------* * * PARAMETRES DE SOLUBILITE 'SI' (SOLUI 'OU' SOLUP) ; 'SI' ( 'EXISTE' TRANSI 'ITMAX_LIM') ; ITMAXI = TRANSI . 'ITMAX_LIM' ; 'SINON' ; ITMAXI = 50 ; 'FINSI' ; 'FINSI' ; 'SI' SOLUI ; 'SI' ( 'EXISTE' TRANSI 'PENALISATION') ; PENAL = TRANSI . 'PENALISATION' ; MET0 = 'PENALISATION' ; 'SINON' ; 'SI' ( 'EXISTE' TRANSI 'EPSI_LIM') ; EPS1 = TRANSI . 'EPSI_LIM' ; MET0 = 'PF DISSOLUTION' ; 'SINON' ; 'MESS' 'Il manque le paramètre ' ; 'ERREUR' 'du schéma numérique de limite de solubilité'; 'FINSI' ; 'FINSI' ; 'FINSI' ; * PARAMETRES DE RETARD NON LINEAIRE 'SI' RNONLIN ; 'SI' ( 'EXISTE' TRANSI 'EPSI_RET' ) ; EPSRNL = TRANSI . 'EPSI_RET' ; 'SINON' ; EPSRNL = 1.D-4 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'ITMAX_RET' ) ; ITMAXRNL = TRANSI . 'ITMAX_RET' ; 'SINON' ; ITMAXRNL = 20 ; 'FINSI' ; * Petit saut de concentration minimal pour le calcul de dérivée 'SI' ( 'EXISTE' TRANSI 'EPSI_COR' ) ; EPSCORD = TRANSI 'EPSI_COR' ; 'SINON' ; 'SI' RNONLINL ; / RETAR1 * FSAT ; 'FINSI' ; 'SI' RNONLINF ; EPSCORD = 1.D-4 ; 'FINSI' ; 'FINSI' ; * Pour les isothermes linéaires la boucle de prise en compte de * retard non linéaire n'est parcourue qu'une fois : NPicard = ITMAXRNL ; 'SINON' ; NPicard = 1 ; 'FINSI' ; * THETA_DECROISSANCE 'SI' ( 'EXISTE' TRANSI 'THETA_DEC' ) ; BETA = TRANSI . 'THETA_DEC' ; 'SINON' ; BETA = 0.5 ; 'FINSI' ; * THETA_DISSOLUTION 'SI' ( 'EXISTE' TRANSI 'THETA_DIS' ) ; GAMMA = TRANSI . 'THETA_DIS' ; 'SINON' ; GAMMA = 1. ; 'FINSI' ; * TEMPS_CALCULES 'SI' ( 'EXISTE' TRANSI 'TEMPS_CALCULES' ) ; TRANSI . 'TEMPS_CALCULES' = TPCAL ; 'SI' ('NEG' DCAL 1) ; DT10 = TPS1 - TPS0 ; DT21 = TPSFIN - TPSANT ; DTEPS = 'MINIMUM' PROPS ; 'SINON' ; DTEPS = TPSFIN - TPS0 ; 'FINSI' ; * EPS0 = DTEPS * 1.D-6 ; * ICAL est le premier indice des temps à calculer supérieur à * TpsIni + eps IOK1 = 0 ; 'REPETER' BOU2 DCAL ; ICAL = &BOU2 ; 'SI' ( TPSINI '<' (TEMS - EPS0) ) ; IOK1 = 1 ; 'QUITTER' BOU2 ; 'FINSI' ; 'FIN' BOU2 ; 'SI' ( IOK1 'EGA' 0) ; 'MESS' 'Listreel des temps de calcul inférieur à tini.' ; 'MESS' 'On ne fait donc rien. ' ; 'FINSI' ; DELTAT0 = TEMS - TPSINI ; 'SINON' ; 'ERREUR' 'Indice TEMPS_CALCULES absent de la table de données.' ; 'FINSI' ; * TEMPS_SAUVES 'SI' ( 'EXISTE' TRANSI 'TEMPS_SAUVES' ) ; TRANSI . 'TEMPS_SAUVES' = TPSOR ; ISOR = 0 ; IOK1 = 0 ; 'REPETER' BOU3 DSOR ; ISOR = ISOR + 1 ; 'SI' ( ( TPSINI '<' (TEMS - EPS0) ) 'ET' ( TEMS '<EG' (TPSFIN +EPS0)) ) ; IOK1 = 1 ; 'QUITTER' BOU3 ; 'FINSI' ; 'FIN' BOU3 ; 'SI' ( IOK1 'EGA' 0) ; 'ERREUR' 'Listreel des temps de sauvegarde hors tmin,tmax.'; 'FINSI' ; 'FINSI' ; * *--------------------------------------------------------------------* * RAPPEL DES DONNEES ENTREES DANS LA PROCEDURE * *--------------------------------------------------------------------* * * 'SI' (EXISTE TRANSI 'AFFICH') ; affich = TRANSI . 'AFFICH' ; SINON; affich = VRAI; 'FINSI' ; 'SI' (affich) ; 'MESS' ' ' ; 'MESS' 'MODELISATION Darcy en transitoire.' (TRANSI . 'TYPDISCRETISATION') ; 'MESS' ' ' ; 'MESS' 'Donnees présentes en entrée : ' ; 'SI' ( 'EXISTE' TRANSI 'BLOCAGE' ) ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FLUX_IMPOSE' ) ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FLUXTOT_IMP' ) ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'CONVECTION' ) ; 'MESS' 'Ce problème comporte un terme convectif' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; 'MESS' 'Ce problème comporte un terme source' ; 'FINSI' ; 'SI' DECRO ; 'MESS' 'Ce problème comporte un terme de décroissance' ; 'FINSI' ; 'SI' RNONLIN ; 'MESS' 'Ce problème comporte la prise en compte d isothermes ' 'd adsorption non-linéaires' ; 'SI' RNONLINL ; 'FINSI' ; 'SI' RNONLINF ; 'FINSI' ; 'FINSI' ; 'SI' SOLUL ; 'MESS' 'Ce problème comporte une limite de solubilité' ; 'SI' SOLUP ; 'FINSI' ; 'SI' (EGA MET0 'PENALISATION') ; 'FINSI' ; 'SI' (EGA MET0 'PF DISSOLUTION') ; 'FINSI' ; 'FINSI' ; 'SI' SOLUA ; 'MESS' 'Ce probleme comporte une dissolution imposée' ; 'FINSI' ; 'MESS' ' ' ; 'MESS' ' diffusion : ' TETA ; 'SI' ( 'EXISTE' TRANSI 'CONVECTION' ) ; 'MESS' ' convection : ' TETAC ; 'FINSI' ; 'SI' DECRO ; 'MESS' ' décroissance : ' BETA ; 'FINSI' ; 'SI' SOLUP ; 'FINSI' ; 'MESS' ' ' ; 'MESS' 'Valeur du temps initial : ' TPSINI ; 'MESS' 'Valeur du temps final : ' TPSFIN ; 'FINSI' ; * * *--------------------------------------------------------------------* * BOUCLE RESOLVANT LE SYSTEME POUR CHAQUE PAS DE TEMPS * *--------------------------------------------------------------------* * *============== * Préparation préliminaire de la boucle sur les pas de temps : *============== * NBIT = 0 ; NBITRNL = 0 ; PRECED = TPSINI ; IPAS = ICAL ; DELOLD = 0.D0 ; DELTAT = TPS1 - TPSINI ; * initialisation de l'indice de stockage des intégrales de concentrat LASTINT = LAST1 ; 'MESS' 'Incrément de temps initial : ' DELTAT ; 'MESS' ' ' ; * * initialisation du terme source intégral. * 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUX_IMPOSE') ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUXTOT_IMP') ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'MIXTES') ; 'FINSI' ; * * Initialisation du materiau - diffusivité * 'FINSI' ; * * Initialisation de la quantité dissoute * 'SI' SOLUB ; 'FINSI' ; * * Calcul de la fraction adsorbée initiale : * 'SI' RNONLIN ; 'SI' RNONLINL ; * Langmuir : FF0 = RETAR1M1 * CC0 /(1.D0 + ( RM1SURF * CC0 )) ; 'FINSI' ; 'SI' RNONLINF ; * Freundlich : * La bidouille utilisant les masques sert à obtenir le champ point * des signes de CC0. a = 'MASQUE' CC0 'SUPERIEUR' 0. ; b = 'MASQUE' CC0 'INFERIEUR' 0. ; FF0 = RETAR1 * (('ABS' CC0) ** UNSURN) * (a - b) ; 'OUBLI' a ; 'OUBLI' b ; 'FINSI' ; 'SINON' ; * Isotherme linéaire : FF0 = RETAR1M1 * CC0 ; 'FINSI' ; FF = FF0 ; * * Calcul du coefficient de retard initial : * Le facteur de retard s'exprime comme * R(C) = 1 + ( F'(Ct+dt + eps) - F'(Ct) ) / ( Ct+dt + eps - Ct) ) * C'est la méthode de la corde employée ici pour ses vertus * stabilisantes. Le petit 'eps' (EpsCord) intervient pour évacuer les * questions de conditions initiales ou de régime permanent. 'SI' RNONLIN ; CC1 = CC0 + EpsCord ; 'SI' RNONLINL ; * Langmuir FF1 = RETAR1M1 * CC1 / (1.D0 + ( RM1SURF * CC1 )) ; 'SINON' ; * Freundlich a = 'MASQUE' CC1 'SUPERIEUR' 0. ; b = 'MASQUE' CC1 'INFERIEUR' 0. ; FF1 = RETAR1 * (('ABS' CC1) ** UNSURN) * (a - b) ; 'DETRUIT' a ; 'DETRUIT' b ; 'FINSI' ; RETARC = 1.D0 + ( (FF1 - FF0) / EpsCord ) ; 'OUBLI' CC1 ; 'OUBLI' FF1 ; 'SINON' ; RETARC = RETAR1 ; 'FINSI' ; RETAR0 = RETARC ; 'SI' SAUVRET ; TRANSI . 'RETARD' . 0 = RETARC ; 'FINSI' ; * * Fonctions de volume : PORETSU = RETARC * POROS ; DECROI0 = VOLU1 * DECROI0 ; BDECROI0 = BETA * DECROI0 ; BMDCROI0 = (1.D0 - BETA) * DECROI0 ; POROM1V = (1.D0 - POROS) * VOLU1 ; POROV = POROS * VOLU1 ; * * Indicateur les recalculs de matrices à effectuer * TABMODI = TABLE ; TABMODI . 'POROSITE' = VRAI ; TABMODI . 'CONVECTI' = VRAI ; TABMODI . 'DELTAT' = VRAI ; TABMODI . 'COEF_LIN' = VRAI ; TABMODI . 'DIFFUSIV' = VRAI ; * * Initialisation de la table de calcul de trangeol * pour le calcul d'un itéré de l'équation de transport * CHCLIM = 'TABLE' ; GEOL1 = 'TABLE' ; * l'option abandon indique qu'en dessous de 10**-13 pour la concentr * et pour des sources ou flux n'impliquant pas des variation de C * superieurs à 10**-16 on sort 0 sans calcul 'SI' ('EXISTE' TRANSI 'SEUILCALC') ; GEOL1 . 'ABANDON' = VRAI ; GEOL1 . 'SEUILCALC' = TRANSI . 'SEUILCALC' ; 'SINON' ; GEOL1 . 'ABANDON' = FAUX ; GEOL1 . 'SEUILCALC' = 1.D-30 ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'NUM_PECLET' ) ; GEOL1 . 'NUM_PECLET' = TRANSI . 'NUM_PECLET' ; 'SINON' ; GEOL1 . 'NUM_PECLET' = 2.D0 ; 'FINSI' ; GEOL1 . 'CONCENTRATION' = CHRG ; GEOL1 . 'TYPDISCRETISATION' = TRANSI . 'TYPDISCRETISATION' ; GEOL1 . 'THETA_DIFFUSION' = TETA ; GEOL1 . 'THETA_CONVECTION' = TETAC ; GEOL1 . 'DECENTREMENT' = TRANSI . 'DECENTR' ; GEOL1 . 'DIFFUSIVITE' = MAT1 ; *GEOL1 . 'SOLVEUR' = TRANSI . 'METHINV' . TYPINV ; *GEOL1 . 'PRECONDITIONNEUR' = TRANSI . 'METHINV' . PRECOND ; GEOL1 . 'MODIFICATI' = TABMODI ; GEOL1 . 'POROSITE' = PORETSU ; GEOL1 . 'SOURCE' = 'NOMC' NOMESPL *================================= *================================= *MESS 'TEMPS1' ; TEMPS; * IPAS = ICAL + &BOUTPS - 1 ; * *-- Initialisation en-tête de boucle sur le temps * *list ((PLACE) * 4. / 1000000.) ; DELTAT = TPS - PRECED ; GEOL1 . 'DELTAT' = DELTAT ; EPSDT = DELTAT + DELOLD / 2.D0 * 1.D-6 ; TABMODI . 'DELTAT' = TABMODI . 'DELTAT' 'OU' ( DELOLD 'NEG' DELTAT EPSDT ) ; * CONVECTION 'SI' ( 'EXISTE' TRANSI 'CONVECTION' ) ; GEOL1 . 'CONVECTION' = TRANSI . 'CONVECTION' ; 'FINSI' ; * VITESSE CENTRE 'SI' ( 'EXISTE' TRANSI 'VITELEM' ) ; GEOL1 . 'VITELEM' = TRANSI . 'VITELEM' ; 'FINSI' ; * ALPHAL 'SI' ( 'EXISTE' TRANSI 'ALPHAL' ) ; GEOL1 . 'ALPHAL' = TRANSI . 'ALPHAL' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'ALPHAT') ; GEOL1 . 'ALPHAT' = TRANSI . 'ALPHAT' ; 'FINSI' ; * *- Calcul de la contribution des termes sources * * Terme source propre : 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; 'SI' (tpsm1 <EG startsou) ; * la source varie encore et est non nulle 'SINON' ; * la source est nulle on garde l'intégrale précédente zozo = 'COPIER' TERSC2M1 ; 'FINSI' ; 'DETRUIT' zozo ; zozo = TERSC2 '-' TERSC2M1 ; TERSCV = zozo '/' DELTAT ; 'DETRUIT' zozo ; zozo = TERSCV + TERSCE ; 'DETRUIT' TERSCE ; TERSCE = 'COPIER' zozo ; 'DETRUIT' zozo ; 'DETRUIT' TERSCV ; 'FINSI' ; * * Terme source de décroissance explicite : * du soluté et de l'adsorbat 'SI' DECRO ; * modif GBM suppression de FF, revient à compter R * R * TERSC3 = ( ('NOMC' CHRG 'SCAL') + FF ) * DECROI0 ; zuzu = zozo * DECROI0 ; 'DETRUIT' zozo ; 'DETRUIT' zuzu ; zozo = TERSC3 + TERSCE ; 'DETRUIT' TERSCE ; TERSCE = 'COPIER' zozo ; 'DETRUIT' zozo ; 'SINON' ; * pas de filiation explicite TERSC3 = 0.D0 * TERSCE ; 'FINSI' ; * Chaine de filiation source venant du pere 'SI' ('EXISTE' TRANSI 'FILIATION') ; * TERSC4 = VOLU1 * (TRANSI . 'FILIATION' . (IPAS '-' 1) * '-' TRANSI . 'FILIATION' . (IPAS '-' 2)) '/' DELTAT ; zozo = TRANSI . 'FILIATION' . (IPAS '-' 1) '-' TRANSI . 'FILIATION' . (IPAS '-' 2) ; * GBM attention à cette destruction 'DETRUIT' (TRANSI . 'FILIATION' . (IPAS '-' 2)) ; zuzu = zozo '/' DELTAT ; 'DETRUIT' zozo ; zozo = VOLU1 * zuzu ; 'DETRUIT' zuzu ; 'DETRUIT' zozo ; zozo = TERSC4 '+' TERSCE ; TERSCE = 'COPIER' zozo ; 'DETRUIT' zozo ; 'DETRUIT' TERSC4 ; 'FINSI' ; * * Gestion d'un CSAT variable (t) - chargement * 'SI' ('EXISTE' TRANSI 'LIMITE_SOLUBILITE') ; * GBM ON PEUT OPTIMISER EN TESTANT SI LIMSOL CHANGE REELEMENT EN ECART * RELATIF PAR RAPPORT AU TEMPS PRECEDENT TABMODI . 'LIMSOL' = VRAI ; 'SI' (SOLUP) ; * Là où la précipitation est nulle (codis =0) on choisit * une limite de solubilité élevée à des fins d'optimisation * algorithmique dum = 'MASQUE' CODIS INFERIEUR 1.D-30 ; 'FINSI' ; 'SINON' ; TABMODI . 'LIMSOL' = FAUX ; 'FINSI' ; 'FINSI' ; * * Gestion de la diffusivité variable en temps - chargement. Donnée * explicite, ie au temps n lors du traitement vers n+1 * * On peut optimiser en testant la variation réelle de la diffusion * elle pourrait en effet être constante par palliers TABMODI . 'DIFFUSIV' = VRAI ; * Estelle : affectation de la diffusion dans geol1 GEOL1 . 'DIFFUSIVITE' = MAT1 ; 'SINON' ; TABMODI . 'DIFFUSIV' = FAUX ; 'FINSI' ; * *- Incorporation des CLs * 'SI' ('EXISTE' TRANSI 'TRACE_IMPOSE') ; 'DETRUIT' CHARIMPO ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUX_IMPOSE') ; 'SI' (tpsm1 '<EG' startflu) ; 'SINON' ; FLUIMPO = 'COPIER' FLUIMPM1 ; 'FINSI' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH. On les différentie ici zozo = FLUIMPO '-' FLUIMPM1 ; FLUMP = zozo '/' DELTAT ; 'DETRUIT' zozo ; 'SINON' ; FLUMP = 'COPIER' FLUIMPO ; 'FINSI' ; 'DETRUIT' FLUMP ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUXTOT_IMP') ; 'SI' (tpsm1 '<EG' startflt) ; 'SINON' ; FLUTMPO = 'COPIER' FLUTMPM1 ; 'FINSI' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH. On les différentie ici zozo = FLUTMPO '-' FLUTMPM1 ; FLUTMP = zozo '/' DELTAT ; 'DETRUIT' zozo ; 'SINON' ; FLUTMP = 'COPIER' FLUTMPO ; 'FINSI' ; 'DETRUIT' FLUTMP ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'MIXTES') ; 'SI' (tpsm1 '<EG' startmix) ; 'SINON' ; FLUMMPO = 'COPIER' FLUMMPM1 ; 'FINSI' ; 'SI' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (TRANSI . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' (teta * tetac) 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH. On les différentie ici zozo = FLUMMPO '-' FLUMMPM1 ; FLUMMP = zozo '/' DELTAT ; 'DETRUIT' zozo ; 'SINON' ; FLUMMP = 'COPIER' FLUMMPO ; 'FINSI' ; CHCLIM . 'FLUMIXTE' = TABLE ; CHCLIM . 'FLUMIXTE' . 'COEFA' = TRANSI . 'MIXCOFA' ; CHCLIM . 'FLUMIXTE' . 'COEFB' = TRANSI . 'MIXCOFB' ; 'DETRUIT' FLUMMP ; 'FINSI' ; GEOL1 . 'CLIMITES' = CHCLIM ; * initialisation de la table de préconditionnement et eventuellement * des traces de concentration en EFMH au premier temps * A virer dès modification arguments transgeol 'SI' ('EGA' &BOUTPS 1) ; * VERRUE d'initialisation à virer * il s'agit d'une avancée de DT = 0. GEOL1 . 'DELTAT' = 1.D-15 ; GEOL1 . 'METHINV' = TRANSI . 'METHINV' ; * Dans ce cas particulier d'un dt petit, precond diagonal, bcgs GEOL1 . 'SOLVEUR' = 3 ; GEOL1 . 'PRECONDITIONNEUR' = 1 ; * On remet les choix utilisateur pour la suite GEOL2 . 'METHINV' . 'TYPINV' = TRANSI . 'METHINV' . 'TYPINV' ; GEOL2 . 'METHINV' . 'PRECOND' = TRANSI . 'METHINV' . 'PRECOND' ; SI (EGA (TRANSI . 'METHINV' . 'PRECOND') 8) ; GEOL2 . 'METHINV' . 'ILUTDTOL' = 1.D-2 ; FINSI ; * remise à jour des paramètres d'entrée de EFMHTgen GEOL1 . 'DELTAT' = DELTAT ; TABMODI . 'POROSITE' = FAUX ; TABMODI . 'CONVECTI' = FAUX ; TABMODI . 'COEF_LIN' = FAUX ; * TABMODI . DIFFUSIV est écrasé à FAUX meme si chargement car * un premier appel à trangeol a déjà été fait pour initialiser les * préconditionnements, seul le pas de temps change ici. C'est vrai * uniquement pour le premier pas de temps. TABMODI . 'DIFFUSIV' = FAUX ; TABMODI . 'DELTAT' = VRAI ; 'FINSI' ; * * *|-------------------------------------------------------------------| *| Boucle de Retard Non Linéaire | *|-------------------------------------------------------------------| * * Boucle de Picard pour la prise en compte * d'isothermes d'adsorption non linéaires : isothermes de Langmuir et * de Freundlich. Ce point nécessite d'effectuer une boucle sur * le facteur de retard qui devient fonction de la concentration * en solution. * *------------------------ *------------------------ * IRNL = &BOURNL ; * * Quatre grands blocs selon que l'on traite : * ------------------------------------------- * -1- sans limite de solubilité ou avec dissolution arbitraire * -2- avec limite de solubilité et dissolution d'ordre 1 * -3- avec limite suivant méthode de pénalisation, * -4- avec limite suivant schéma prédicteur/correcteur itératif *|----------------------------------------------------| *| Pas de limite de solubilité ou Dissolution imposée | *|----------------------------------------------------| 'SI' (('NON' SOLUB) 'OU' SOLUA) ; * * On recalcule la matrice hybride si DeltaT ou le coefdt ont changé : 'SI' (TABMODI.'DELTAT' 'OU' TABMODI . 'POROSITE') ; * GBM FAIRE MEILLEUR TEST SI DELTAT BOUGE SEULEMENT TABMODI.PORO * NE CHANGE PAS * Coefficients correspondant à la décroissance expl. et implicite : NUM0 = (BETA - 1.) * LAMBD0 * DELTAT + 1. ; DEN0 = LAMBD0 * BETA * DELTAT + 1. ; * Calcul du coefficient devant (Ct+dt - Ct)/dt COFDC = PORETSU * DEN0 ; * On charge le coef de DC/DT dans GEOL1 pour TRANGEOL GEOL1 . 'POROSITE' = COFDC ; * On indique que le coef devant DC/DT a changé TABMODI . 'POROSITE' = VRAI ; 'FINSI' ; * 'SI' SOLUA ; * Evaluation des termes sources de dissolution : * Dissolution arbitraire (ordre 0 par exemple), limitée au total * précipité : DISSOLT = PRCI * (NUM0 / DELTAT) * VOLU1 ; TERSC4 = 0.5 * (DISSOLT + DISSOLP - ('ABS' (DISSOLT - DISSOLP))); TERSCT = TERSCE + TERSC4 ; 'SINON' ; TERSCT = TERSCE ; 'FINSI' ; * On charge le terme source dans GEOL1 * options de calcul GEOL1 . 'MODIFICATI' = TABMODI ; *- Résolution - APPEL TRANGEOL * OPTIMISER STOCKAGE DOUBLE DES MATRICES PRECOND ????? * faire transgeol mat1 mat2 et stocké tracini tracfin, conini concfin... * on pourrait alors écraser les matrices sytématiquement et faire un * advance comme philippe : stocke cfin dans cini * transgeol doit pouvoir accepter matrice vide precond en option CHA2 = GEOLPF1 . 'CONCENTRATION' ; FLU2 = GEOLPF1 . 'FLUXDIFF' ; FLUCO2 = GEOLPF1 . 'FLUXCONV' ; * Remise à jour des coef de recalcul des matrices - dans le point * fixe, ces propriétés ne changent pas TABMODI . 'POROSITE' = FAUX ; TABMODI . 'CONVECTI' = FAUX ; TABMODI . 'DELTAT' = FAUX ; TABMODI . 'COEF_LIN' = FAUX ; TABMODI . 'DIFFUSIV' = FAUX ; 'SI' SOLUA ; PRE2 = ((NUM0 * PRCI) - (DIS1 / VOLU1)) / DEN0 ; 'FINSI' ; * 'Fin module dissolution arbitraire' 'FINSI' ; *list ((PLACE) * 4. / 1000000.) ; *|---------------------------| *| Dissolution d'ordre 1 | *|---------------------------| 'SI' SOLUP; * On recalcule la matrice hybride si DeltaT ou le coefdt ont changé ou * la limite de solubilité a changé: 'SI' (TABMODI.'DELTAT' 'OU' TABMODI . 'POROSITE' 'OU' TABMODI . 'LIMSOL') ; * présence de précipitation dissolution 'DETRUIT' zozo ; zozo = (1.D0 '+' 1.D-10) * LIMSOL ; 'DETRUIT' zozo ; 'DETRUIT' zuzu ; zozo = ANTP '+' ANTC ; 'DETRUIT' ANTC ; 'DETRUIT' zozo ; * Coefficients correspondant à la décroissance expl. et implicite : NUM0 = (BETA - 1.) * LAMBD0 * DELTAT + 1. ; DEN0 = LAMBD0 * BETA * DELTAT + 1. ; * Terme implicite de dissolution, schéma Euler zozo = DELTAT * CODIS ; 'DETRUIT' zozo ; * Calcul du coefficient devant (Ct+dt - Ct)/dt * solub en poros*codis Id et non Retard*poros*codis 'DETRUIT' zozo ; 'DETRUIT' zeze ; * On charge le coef de DC/DT dans GEOL1 pour TRANGEOL GEOL1 . 'POROSITE' = COFDC ; * On indique que le coef devant DC/DT a changé TABMODI . 'POROSITE' = VRAI ; 'FINSI' ; * ON charge dans une variable point fixe le precipité * initial PRCIPF = 'COPIER' PRCI ; * On initialise le terme correspondant à une dissolution * complete du précipité le derniere itération avant sa disparition * Pour eviter des précipités négatifs SRCPRCI = 0.D0 * PRCI ; *--------------- *--------------- * terme source modifié en raison du coef de solubilité : * on calcul deltat codis (cn+1 - cn) /deltat, astuce informatique * pour créer le terme deprécipitation. Il faut retirer le - codis cn * au second membre : - codis * posos * volume (car source integrale) * TERSC5 = TERSCE '-' ( CODIS * ANT0 * POROS * VOLU1 * CHRG) ; * On a également la source liée au terme codis poros limsol * TERSC5 = TERSC5 '+' ( CODIS * ANT0 * POROS * VOLU1 * LIMSOL) ; 'DETRUIT' zozo ; zuzu = LIMSOL '-' CHRG ; zozo = zeze * zuzu ; 'DETRUIT' zeze ; 'DETRUIT' zuzu ; TERSC5 = TERSCE '+' zozo ; 'DETRUIT' zozo ; * On a également la source liée a la dissolution * instantanée du précipité là 'OU' il est devenu négatif * artifice numérique permettant d'avoir toujours un * précipité négatif. Bilan de matiere verifie, erreur en * O(DT) su le reste de la physique * TERSC5 = TERSC5 '+' (VOLU1 * SRCPRCI) ; zozo = VOLU1 * SRCPRCI ; zuzu = TERSC5 '+' zozo ; 'DETRUIT' zozo ; 'DETRUIT' TERSC5 ; TERSC5 = 'COPIER' zuzu ; 'DETRUIT' zuzu ; * le fait que codis puisse etre gigantesque est sans influence * sur la précision car le précipité est calulé par des bilans de flux * et n'utilisera plus ces valeurs. * On charge le terme source dans GEOL1. * options de calcul GEOL1 . 'MODIFICATI' = TABMODI ; *- Résolution - APPEL TRANGEOL * OPTIMISER STOCKAGE DOUBLE DES MATRICES PRECOND ????? * faire transgeol mat1 mat2 et stocké tracini tracfin, conini concfin... * on pourrait alors écraser les matrices sytématiquement et faire un * advance comme philippe : stocke cfin dans cini * transgeol doit pouvoir accepter matrice vide precond en option *list ((PLACE) * 4. / 1000000.) ; *list ((PLACE) * 4. / 1000000.) ; CHA2 = GEOLPF1 . 'CONCENTRATION' ; FLU2 = GEOLPF1 . 'FLUXDIFF' ; FLUCO2 = GEOLPF1 . 'FLUXCONV' ; * remise à jour de XINIT pour le point fixe. Pourra etre retirer * quand transgeol stockera les état initiaux- finaux et intermédiaire * pour un point fixe. Permet uniquement d'accélérer la convergence * des méthodes itératives. Sans incidence sur les résultats physiques GEOL2 . 'METHINV' . 'XINIT' = GEOLPF2 . 'METHINV' . 'XINIT' ; 'SI' ('EXISTE' GEOL2 TRACE_CONC) ; * On conserva absolument la trace en EFMH car c'est la vraie * inconnue et on doit garder celle du début du point fixe * (sinon on incrémente en temps dans le point fixe). ** 'MESSAGE' 'yoyououou'; dum = GEOL2 . 'TRACE_CONC' ; GEOL2 = GEOLPF2 ; GEOL2 . 'TRACE_CONC' = dum ; 'FINSI' ; * Remise à jour des coef de recalcul des matrices TABMODI . 'POROSITE' = FAUX ; TABMODI . 'CONVECTI' = FAUX ; TABMODI . 'DELTAT' = FAUX ; TABMODI . 'COEF_LIN' = FAUX ; TABMODI . 'DIFFUSIV' = FAUX ; * SI ANT0 nul partout alors pas de prec dissolution donc le precipité * est forcément nul partout. On ne fait pas de calcul. 'SI' (('MAXIMUM' ANT0) 'EGA' 0) ; * on met à 0 le précipité, on utilise le champ de concentration * pour avoir la géométrie du support. PRE2 = 0.D0 * CHRG ; 'SINON' ; * Calcul du précipité par bilan des variations des quantités et des * flux diffusifs et convectifs sur la maille. On n'utilise surtout * pas la loi de dissolution codis * (C - limsol) car si codis * est grand (pénalisation) le calcul est très imprécis. * le précipité est en mole/volume de milieu solide. * On décompose le calcul en plusieurs termes : * Faire ATTENTION rien n'est intuitif. Si des schémas sont modifiés * en amont, que les termes sources sont modifiés, il faudra * s'assurer que cela ne modifie pas les lignes suivantes. * la variation de concentration dans le milieu (et du sorba) * poros * retar * (delta COncentration) * volum / deltat *list ((PLACE) * 4. / 1000000.) ; PRR1 = (-1.D0 '/' DELTAT) * VOLU1 ; 'DETRUIT' PRR1; 'DETRUIT' zozo; 'DETRUIT' PRR2; * la variation de concentration disparue par filiation. Il faut * écrire les équations de bilan pour se convaincre que tout n'est pas * compté plusieurs fois de trop: - lambda * poros * retard * volume * * Cn+1 multiplié par beta (valeur du theta schéma pour décroissance). * plkus partie explicite : - lambda * poros * retard * volume * * Cn * (1 - beta). Le signe '-' est dans DECROI0 'DETRUIT' zozo; 'DETRUIT' PRR1; 'DETRUIT' zozo; 'DETRUIT' PRR2; * Le terme source de C qui comprend d'ailleurs, la filiation venant * du pere (concentration + précipité cumulés), et les termes * source de l'utilisateur issu de l'indice SOURCE de la table * d'entrée. La multiplication par le volume de l'élément * est déjà effectuée. On a retirer TERSC3 (source de filiation) * déjà comptée ligne précédente. Encore une fois faire très * attention lors de modif de ces lignes, on peut s'y perdre. * A la limite tout coder en Fortran 'DETRUIT' zaza; 'DETRUIT' PRR1 ; * le variation par filiation du précipité - partie explicite * du theta schéma de décroissance radioactive : - (1 - poros) * fois LAMBDA * (1 - BETA) * volume maille * precipité (instant n) zozo = (LAMBD0 * (1.D0 '-' BETA)) * PRR1 ; 'DETRUIT' PRR1 ; 'DETRUIT' zozo; 'DETRUIT' PRR2 ; * Les flux diffusifs et convectifs intégrés au travers des faces de * l'élément. flux SORTANT donc diminuant le précipité * fluttot = (TETA * FLU2) + (1.D0 '-' TETA) * FLU0) '+' * ((TETAC * FLUCO2) '+' ((1.D0 '-' TETAC) * FLUCO0)) ; zozo = TETA '*' FLU2 ; zizi = ((1.D0 '-' TETA) * FLU0) ; 'DETRUIT' zizi; 'DETRUIT' zozo; zozo = TETAC * FLUCO2 ; zizi = ((1.D0 '-' TETAC) * FLUCO0) ; 'DETRUIT' zizi; 'DETRUIT' zozo; 'DETRUIT' zeze; 'DETRUIT' zaza; * DIVU veut une composante FLUX 'DETRUIT' fluttot1; 'DETRUIT' fluttot; 'DETRUIT' divflt; 'DETRUIT' divfll; 'DETRUIT' PRR1; * La quantité de précipité à l'instant précédent : * (1 '-' POROS) PRCI * VOLU1 '/' DELTAT * AFIN d'éviter les problemes lorsque DELTAT = 0 * on multiplie tout par DELTAT, donc ne pas le faire 'PLUS' loin * PRE2 = (deltat * PRE2) '+' ((1.D0 '-' POROS) * VOLU1 * PRCIPF) ; PRR1 = deltat * PRR2 ; 'DETRUIT' PRR2 ; 'DETRUIT' zozo; 'DETRUIT' PRR1; * On résout alors (vol * (1 - poros) /deltat) + (1 - poros) vol lambda * beta le tout fois precipité instant N+1 = PRE2 calculé au dessus * * coff = ((DELTAT * LAMBD0 * BETA) '+' 1.D0) * (1.D0 '-' POROS) * * VOLU1 ; * PRE2 = PRE2 '/' coff ; coff = ((DELTAT * LAMBD0 * BETA) '+' 1.D0) * POROM1V; 'DETRUIT' coff; 'DETRUIT' PRR2; * ATTENTION SI IL Y A DU PR2CIPITE, POROSITE = 1 INTERDIT CAR * DIT QU'il NY A PAS DE SOLIDE * On multiplie par la fonction caractéristique de présence du précipité * inutile en pratique si les schémas sont conservatifs sur l'élément * c'est mis pour ne pas propager d'erreurs machines. 'DETRUIT' PRR1 ; PRE2 = 'COPIER' zozo; 'DETRUIT' zozo ; * Fin du calcul du précipité par bilan 'FINSI' ; * mess 'maximum precipite' (maxi pre2); * mess 'maximum concentration' (maxi cha2); * Critère de sortie et mise à jour de la nouvelle distribution : * On sort la distribution de précipité n'a pas changé (ie le précpité * est toujours positif aux memes endoits) et que la concentration ne * dépasse pas limsol dans la partie ou il n'y a pas de précipité * LTI2 = 'CHAINE' 'Front 1D-h temps ' ; * 'TITR' LTI2 ; * drmil = 'QUELCONQUE' 'SEG2' ('EXTRAIRE' CHA2 maillage) ; * drmil = 'INVERSE' drmil ; * AV2 = 'EVOL' 'ROUG' 'CHPO' CHA2 'H' drmil ; * 'DESS' AV2 'MIMA' ; * AV2 = 'EVOL' 'ROUG' 'CHPO' PRE2 'H' drmil ; * 'DESS' AV2 'MIMA' 'NCLK' ; * ANT2 caracterise la présence de dissolution quant vaut 1 'DETRUIT' zozo ; * ANT3 caracterise la précipitation quand vaut 1 * On autorise une seuil supérieur legerement car on relache du * precipité en solution dans le point fixe 'DETRUIT' zozo ; * 'MESSAGE' 'maxi cha2' ('MAXIMUM' cha2); * 'MESSAGE' 'maxi ant2' ('MAXIMUM' ant2); * 'MESSAGE' 'maxi ant3' ('MAXIMUM' ant3); * 'SI' (TPS 'EGA' 8.0D5 1.) ; * DEPLA (DOMA moddarcy 'MAILLAGE') AFFI (1./15.) (0. 0.) (1. 0.) ; * toto = kcha MODDARCY pre2 'CHAM'; * trac MODDARCY toto; * toto = kcha MODDARCY ANT2 'CHAM'; ** trac MODDARCY toto; * tutu = kcha MODDARCY ANT3 'CHAM'; * trac MODDARCY (toto '-' tutu); * DEPLA (DOMA moddarcy 'MAILLAGE') AFFI (15.) (0. 0.) (1. 0.) ; * 'FINSI' ; * le nouveau ANT2 caracterise la précipitation dissolution zozo = ANT2 '+' ANT3 ; 'DETRUIT' ANT3 ; 'DETRUIT' zozo ; zozo = ANT4 '-' ANT0 ; 'DETRUIT' zozo ; 'DETRUIT' ANT0 ; ANT0 = 'COPIER' ANT4 ; 'DETRUIT' ANT4 ; 'DETRUIT' CRIT ; 'SI' (MAXCRIT < 0.1) ; * On a convergé dans le point fixe. * On stocke la nouvelle distribution du précipité, ANT0 * est déjà à jour (prec et dissolution) 'DETRUIT' ANTP ; ANTP = 'COPIER' ANT2 ; 'DETRUIT' ANT2 ; 'DETRUIT' PRCIPF ; 'DETRUIT' SRCPRCI ; 'QUITTER' BOU8 ; 'SINON' ; * On résout par point fixe * La où precipitation apparait, on ne fait rien de * special. C'est pris en compte dans le nouveau ant0 * La 'OU' le precipité a diparu, le fait qu'il devienne * négatif est génant. ON dissout en fait le précipité * entierement au début du nouvel itéré de point fixe. * Dans la mesure où il est censé disparaître, on espere * que la concentration finale sera en dessous de la * saturation. Sinon plusieurs itérés auront lieu avant * convergence. Par contre on ne veut SURTOUT pas faire * précipiter cet exces temporaire de concentration. DOnc * on met valeur de ant0 indiquant qu'il n'a 'PLUS' * de précipité ('ET' pas de précipitation 'NON' 'PLUS') * 1 là 'OU' le précipité vient de diparaitre par * rapport à l'état initial du point fixe !!!! ANTDMM = ANTP '-' ANT2 ; * on teste les valeurs positives correspondant à une disparition * effective du precipité (le cas écheant c'est une apparition) ANTDUM = 'MASQUE' ANTDMM SUPERIEUR 0.1 ; 'DETRUIT' ANTDMM ; * 0 la 'OU' le precipité vient de disparaitre, 1 ailleurs ANTDM1 = 1.D0 '-' ANTDUM ; * On s'assure d'interdire toute précipitation là 'OU' le * précipité à disparu 'ET' l'on relache son état initial * sous forme d'exces de concentration dans le point fixe. zozo = ANTDM1 * ANT0 ; 'DETRUIT' ANT0 ; ANT0 = 'COPIER' zozo ; 'DETRUIT' zozo ; * relâchement de l'état initial du précipité par volume * quantité (1 '-' poros) prec * volum '/' DELTAT * on retire la patie explicite de décroissance du précipité * SRCPRCI = coff * * ((1.D0 '-' POROS)) * ANTDUM * PRCI '/' DELTAT ; coff = (1.D0 '-' (DELTAT * LAMBD0 * (1.D0 '-' BETA))) ; zozo = 1.D0 '-' POROS ; zizi = zozo * ANTDUM ; 'DETRUIT' zozo ; zozo = zizi * PRCI ; 'DETRUIT' zizi ; SRCPRCI = (coff '/' DELTAT) * zozo ; 'DETRUIT' zozo ; * On retire cela du precipité initial 'DETRUIT' PRCIPF ; PRCIPF = ANTDM1 * PRCI ; 'DETRUIT' ANTDUM ; 'DETRUIT' ANTDM1 ; 'DETRUIT' ANT2 ; * Coefficient correspondant à la décroissance implicite : DEN0 = LAMBD0 * BETA * DELTAT + 1. ; * Terme implicite de dissolution, schéma Euler DEN1 = CODIS * ANT0 * DELTAT ; * Calcul du coefficient devant (Ct+dt - Ct)/dt * solub en poros*codis Id et non Retard*poros*codis zozo = DEN0 * PORETSU ; zeze = DEN1 * POROS ; 'DETRUIT' COFDC ; COFDC = zozo '+' zeze ; 'DETRUIT' zozo ; 'DETRUIT' zeze ; * On charge le coef de DC/DT dans GEOL1 pour TRANGEOL GEOL1 . 'POROSITE' = COFDC ; * On indque que le coef devant DC/DT a changé TABMODI . 'POROSITE' = VRAI ; NBIT = NBIT + 1 ; * 'FINSI' ; 'SI' (&BOU8 EGA ITMAXI) ; 'MESS' 'Sortie sans convergence' ; 'QUITTER' BOU8 ; 'FINSI' ; *----------- 'FIN' BOU8 ; *----------- NB0 = &BOU8 - 2 ; 'SI' (NB0 >EG 1) ; 'MESS' ' ' NB0 ' itérations supp de solubilité' ; 'FINSI' ; * 'Fin module Dissolution d ordre 1' 'FINSI' ; *|-------------------------------------| *| Retard Non Linéaire | *|-------------------------------------| *- Calcul du nouveau coefficient de retard et de l'adsorbât 'SI' RNONLIN ; * 1. F(C) 'SI' RNONLINL ; * Langmuir FF = RETAR1M1 * CC0 / (1.D0 + ( RM1SURF * CC0 )) ; 'SINON' ; * Freundlich * La bidouille utilisant les masques sert à obtenir le champ * des signes de CC0. a = 'MASQUE' CC0 'SUPERIEUR' 0. ; b = 'MASQUE' CC0 'INFERIEUR' 0. ; FF = RETAR1 * (('ABS' CC0) ** UNSURN) * (a - b) ; 'DETRUIT' a ; 'DETRUIT' b ; 'FINSI' ; FF0 = FF ; * 2. F(C + dC) 'SI' RNONLINL ; * Langmuir FF1 = RETAR1M1 * CC1 / (1.D0 + ( RM1SURF * CC1 )) ; 'SINON' ; * Freundlich a = 'MASQUE' CC1 'SUPERIEUR' 0. ; b = 'MASQUE' CC1 'INFERIEUR' 0. ; FF1 = RETAR1 * (('ABS' CC1) ** UNSURN) * (a - b) ; 'DETRUIT' a ; 'DETRUIT' b ; 'FINSI' ; * 3. R = 1 + dF/dC RETAR2 = 1.D0 + ( (FF1 - FF0) / (CC1 - CC0) ) ; 'DETRUIT' CC1 ; 'DETRUIT' FF1 ; * *- Critère de sortie de la boucle de retard non linéaire : 'QUITTER' BOURNL ; 'SINON' ; * Le coef. de retard ne change que si le critère est mauvais. * Réévaluation des variables affectées devant DC/DT: RETARC = RETAR2 ; PORETSU = RETARC * POROS ; * coef devant dc/dt modifié TABMODI . 'POROSITE' = VRAI ; * Fonctions de volume réactualisées PORETSU = RETARC * POROS ; DECROI0 = VOLU1 * DECROI0 ; 'FINSI' ; 'SINON' ; * NE sert a rien GBM * Retard linéaire F = (R - 1) C * zozo = 'NOMC' CHRG 'SCAL' ; * FF = RETAR1M1 * zozo ; * 'DETRUIT' zozo ; 'FINSI' ; * Si on atteint le nombre maximum d'itérations - en particulier si le * retard est linéaire - on quitte la boucle : 'SI' (IRNL 'EGA' ITMAXRNL) ; ' sortie boucle de retard non linéaire sans convergence' ; 'QUITTER' BOURNL ; 'FINSI' ; *------------- 'FIN' BOURNL ; *------------- 'SI' (IRNL > 1 ) ; 'MESS' ' ' IRNL ' itérations de retard non linéaire.' 'FINSI' ; NBITRNL = NBITRNL + (IRNL - 1) ; *|-----------------------------------| *| Fin des modules de résolution | *|-----------------------------------| * *- Calcul de la dissolution par unité de volume et par unité de temps : * 'SI' SOLUA ; DIS2 = DIS1 / VOLU1 / DELTAT ; 'FINSI' ; * *- Archivage des resultats * * si le prochain temps à sauver tombe entre les deux * incréments de temps, on obtient les valeurs à sauver * par interpolation linéaire puis on les stocke. * *list ((PLACE) * 4. / 1000000.) ; 'SI' ( 'EXISTE' TRANSI 'TEMPS_SAUVES' ) ; * Sauvegarde de tous les temps intermédiaires, s'il y en a : 'REPETER' BOU9 ; 'SI' ( ( PRECED '<' TEMS ) 'ET' ( TEMS '<EG' TPS ) ) ; * on interpole les variables linéairement entre * les pas de temps LAST1 = LAST1 + 1 ; DTEM = ( TPS - TEMS ) / DELTAT ; UNMO = 1.D0 - DTEM ; 'SINON' ; RETBIS = (DTEM * RETAR0) + (UNMO * RETARC) ; 'FINSI' ; 'SI' SOLUB ; 'FINSI' ; TRANSI . 'TEMPS' . LAST1 = TEMS ; CHBIS ; 'DETRUIT' CHBIS ; FLUBIS ; 'DETRUIT' FLUBIS ; FLUBISCO ; 'DETRUIT' FLUBISCO ; 'SI' SOLUB ; PRBIS ; 'DETRUIT' PRBIS ; 'FINSI' ; 'SI' SAUVRET ; RETBIS ; 'DETRUIT' RETBIS ; 'FINSI' ; ISOR = ISOR + 1 ; 'SINON' ; 'QUITTER' BOU9 ; 'FINSI' ; 'SI' ( ISOR '>' DSOR ) ; ISOR = DSOR ; 'QUITTER' BOU9 ; 'FINSI' ; 'FIN' BOU9 ; 'SINON' ; * sinon, on sauvegarde tous les temps : LAST1 = LAST1 + 1 ; TRANSI . 'TEMPS' . LAST1 = TPS ; 'SI' SOLUB ; 'FINSI' ; 'SI' SAUVRET ; 'FINSI' ; 'FINSI' ; *On sauve l'intégrale de decroissance*concentration et * decroissance*précipité au cours du temps * stockée pour l'instant à tous les temps. Peut s'améliorer. * indice pour le stockage des intégrales de concentration LASTINT = LASTINT '+' 1; BM1 = 1.D0 '-' BETA ; * si l'espece fait l'objet d'une filiation on stocke les intégrales * du précipité et de la concentration. SI ((EXISTE TRANSI DECROISSANCE) 'ET' (TRANSI . 'PERE')) ; *TRANSI . 'INTFILI' . LASTINT = TRANSI . 'INTFILI' . (LASTINT '-' 1) * '+' (DELTAT * PORETSU * TRANSI . 'DECROISSANCE' * * ((BM1 * ('NOMC' NOMESP CHRG)) * '+' ((BETA) * ('NOMC' NOMESP CHA2)))) ; zozo = (DELTAT * TRANSI . 'DECROISSANCE') * PORETSU ; zaza = BM1 * CHRG ; zuzu = BETA * CHA2 ; 'DETRUIT' zaza ; 'DETRUIT' zuzu ; 'DETRUIT' zozo ; 'DETRUIT' zeze ; 'DETRUIT' zaza ; TRANSI . 'INTFILI' . LASTINT = TRANSI . 'INTFILI' . (LASTINT '-' 1) '+' zozo ; 'DETRUIT' zozo ; 'SI' SOLUB ; * TRANSI . 'INTFILI' . LASTINT = TRANSI . 'INTFILI' . LASTINT * '+' (DELTAT * (1.D0 '-' POROS) * TRANSI . 'DECROISSANCE' * * ((BM1 * ('NOMC' NOMESP PRCI)) * '+' ((BETA) * ('NOMC' NOMESP PRE2)))) ; zizi = (1.D0 '-' POROS) ; zozo = (DELTAT * TRANSI . 'DECROISSANCE') * zizi ; 'DETRUIT' zizi ; zaza = BM1 * PRCI ; zuzu = BETA * PRE2 ; 'DETRUIT' zaza ; 'DETRUIT' zuzu ; 'DETRUIT' zozo ; 'DETRUIT' zeze ; 'DETRUIT' zaza ; zaza = TRANSI . 'INTFILI' . LASTINT '+' zozo ; 'DETRUIT' TRANSI . 'INTFILI' . LASTINT ; 'DETRUIT' zozo ; TRANSI . 'INTFILI' . LASTINT = zaza ; 'OUBLIER' zaza ; 'FINSI' ; FINSI ; * Sauvegarde du dernier pas de temps si ça n'a pas déjà été fait. * Le dernier pas de temps ne peut pas faire l'objet d'interpolation * linéaire si le temps sauvegardé ne tombe pas pile dessus. 'SI' (IPAS 'EGA' DCAL) ; TPSDER = TRANSI. 'TEMPS' . LAST1 ; 'SI' ( TPSDER 'NEG' TPSFIN EPSDT ) ; LAST1 = LAST1 + 1 ; TRANSI . 'TEMPS' . LAST1 = TPS ; 'SI' SOLUB ; 'FINSI' ; 'SI' SAUVRET ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * *- Initialisations pour le pas suivant * PRECED = TPS ; 'DETRUIT' CHRG ; CHRG = CHA2 ; 'DETRUIT' FLU0 ; FLU0 = FLU2 ; 'DETRUIT' FLUCO0 ; FLUCO0 = FLUCO2 ; 'OUBLIER' GEOL1 ; 'OUBLIER' GEOL2 ; GEOL1 = 'TABLE' GEOLPF1 ; GEOL2 = 'TABLE' GEOLPF2 ; 'DETRUIT' RETAR0 ; RETAR0 = RETARC ; DELOLD = DELTAT ; 'SI' SOLUB ; 'DETRUIT' PRCI ; PRCI = PRE2 ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'SOURCE') ; 'DETRUIT' TERSC2M1 ; TERSC2M1 = TERSC2 ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUX_IMPOSE') ; 'DETRUIT' FLUIMPM1 ; FLUIMPM1 = FLUIMPO ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUXTOT_IMP') ; 'DETRUIT' FLUTMPM1 ; FLUTMPM1 = FLUTMPO ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'MIXTES') ; 'DETRUIT' FLUMMPM1 ; FLUMMPM1 = FLUMMPO ; 'FINSI' ; *MESS 'TEMPS2' ; TEMPS; *'MENAGE' ; * destruction d'objets temporaires 'DETRUIT' TERSC3 ; *list ((PLACE) * 4. / 1000000.) ; *temps impr; * *============= *============= * *- Indication du nombre de passages : * 'SI' (SOLUI 'ET' ('EGA' MET0 'PENALISATION')) ; 'MESS' 'Nombre total de matrices calculées : ' NBIT ; 'FINSI' ; 'SI' (SOLUI 'ET' ('EGA' MET0 'PF DISSOLUTION')) ; 'MESS' 'Nombre total d itérations supplémentaires de solubilité : ' NBIT ; 'FINSI' ; 'SI' SOLUP ; 'MESS' 'Nombre total d itérations supplémentaires de solubilité : ' NBIT; 'FINSI' ; 'SI' RNONLIN ; 'MESS' 'Nombre total d itérations supplémentaires de ' 'retard non linéaire : ' NBITRNL; 'FINSI' ; 'FINP' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales