* DARCYSAT PROCEDUR JC220346 16/07/08 21:15:01 9008 * GBM REGLER LE PROBLEME DES TRACES - VF EFMH * DARCYSAT PROCEDUR MAUGIS 02/12/19 21:15:02 4527 *********************************************************************** * MESSAGE * Par défaut, on affiche beaucoup d'information 'SI' ('EXISTE' SATUR 'MESSAGES' ) ; DEBUG = SATUR.'MESSAGES' > 0 ; 'SINON' ; DEBUG = VRAI ; 'FINSI' ; * ******************************************************************** ********************************************************************* ********************************************************************* * LECTURES * ********************************************************************* ********************************************************************* ********************************************************************* * * CONDITIONS INITIALES OU DU DERNIER PAS CALCULE * * * DONNEES PHYSIQUES, GEOMETRIQUES ET MATERIELLES * * * LOI_SATURATION * * * LOI_PERMEABILITE * * * param physiques * * * RECUPERATION DES DONNEES NUMERIQUES * NIVEAU TETA NPAS0 NITER0 ERR0 CFL0 ITMAXI OKPENAL * TEMPS_CALCULES isauv = LAST1 ; DCAL LTCALCUL DTAUTO ICAL tmin NPAS0 DELTAT TFINAL isor tpsor dsor * * initialisations pour TRANGEOL * * * integrale des chargements * startflu startmix startsou FLUIMP FLUMIX TERSOU = SATUTILS YNTGFLUX SATUR ; ******************************************************************* * PARAMETRES DIVERS PRECALCULES ******************************************************************* * Coordonnées à prendre en compte pour la gravité * (si AXE_G est nul, ZGRAV aussi, et donc pas d'effet de gravité). XAXE = 'COORDONNEE' 1 DAXE; YAXE = 'COORDONNEE' 2 DAXE; 'SI' (NDIME 'EGA' 2) ; ((XCO * XAXE) + (YCO * YAXE)); ((XCO * XAXE) + (YCO * YAXE)) ; 'SINON' ; ZAXE = 'COORDONNEE' 3 DAXE; ((XCO * XAXE) + (YCO * YAXE) + (ZCO * ZAXE)); ((XCO * XAXE) + (YCO * YAXE) + (ZCO * ZAXE)) ; 'FINSI' ; *--------------------------------------------------------------------* * RAPPEL DES DONNEES ENTREES DANS LA PROCEDURE * *--------------------------------------------------------------------* SATUTILS rekapitu SATUR L_GRAV rhowg DAXE convh cfl0 teta LAST1 debug ; *********************************************************************** *********************************************************************** *********************************************************************** * RESOLUTION * *********************************************************************** *********************************************************************** *********************************************************************** * *--------------------------------------------------------------------* * BOUCLE RESOLVANT LE SYSTEME POUR CHAQUE PAS DE TEMPS * *--------------------------------------------------------------------* * * Initialisations : * ================= * gbm a bugué sur PENAL à FAUX PENAL = OKPENAL ; TPS = TPSINI + DELTAT ; * *-- Paramètres physiques *- Pression tronquée à utiliser dans les lois de comportement : * tronkature pression et chgt 'unités *- calcul teneur en eau, saturation et premier terme capacité capillaire * Attention, la teneur calculée utilise une porosité constante au cours * du pas de temps. GBM refait à l'identique dans boucle plus loin. * GBM - ATTENTION PEUT ETRE INUTIL ICI SAUF INITIALISATION FLUX 'SI' ( 'EXISTE' SATUR 'CONSERVATIF' ) ; CONSER = SATUR .'CONSERVATIF' ; 'FINSI' ; 'SI' ('EGA' CONSER VRAI) ; 'SINON' ; 'FINSI'; *- pas de temps initial automatique - rendre calcul CFL optionnel VVOL = VHYB * PORO1 ; DELTAT DTI = SATUTILS YNYTDT MDMH FLU0 MCHYB VVOL CFL0 debug DTAUTO DELTAT ; *- Valeur des variables au pas de temps précédent * GBM PAS TOUTES UTILES - A REVOIR TRHANC = TRH ; CHRGANC = CHRG ; FLUANC = FLU0 ; PNSANC = PNS ; PNSCANC = PNSC ; TENANC = TEN ; SATANC = SAT ; TPSANC = TPSINI ; PERFANC = 0.D0 ; *- Valeur des variables à l'itération précédente * pour la trace de charge servant au calcul du résidu, * on met n'importe quoi qui ait la bonne structure. * Ici, TRH n'a pas de multiplicateur de lagrange, donc l'estimation * de FLRES sera foireuse au tout prsavreemier calcul du résidu. TRH2N = TRH ; CAPAN = 0.D0 ; PERFN = 0.D0 ; NOMESPL = 'H' ; * * initialisation du terme source intégral. * 'SI' ( 'EXISTE' SATUR 'SOURCE' ) ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'FLUX_IMPOSE') ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'FLUMIXTE') ; 'FINSI' ; FLU1 = FLU0 ; GEOL1 . 'CONCENTRATION' = CHRG ; 'SI' ('EGA' CONSER VRAI) ; TENNC = TENN ; 'FINSI' ; ************** NPX*************************************************** * * Sauvegarde * ========== TRHANC TRH CHRGANC CHRG TENANC TEN PNSCANC PNSC SATANC SAT FLUANC FLU0 NIVEAU DSOR 0 MDMH ; ***************FIN NPX*********************************************** *======================================================== transitoire 'SI' ('EGA' NPAS0 0) ; NPAS0 = -1 ; 'FINSI' ; 'REPETER' TRANSI NPAS0 ; *==================================================================== * IPAS = ICAL + &TRANSI - 1 ; *----------------------------------------------------------------- 'REPETER' PENALDT NPENALDT ; CHRG = CHRGANC ; TPS = TPSANC + DELTAT ; *------------------------------------------------------------------ * Affichage information si debug vrai 'MESSAGE' 'deltat dti' deltat dti; debug ; ***************** INITIALISATION PAS DE TPS ************************** * *- Incorporation des CLs * 'SI' ('EXISTE' SATUR 'TRACE_IMPOSE') ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'FLUX_IMPOSE') ; 'SI' (tpsanc '<EG' startflu) ; 'SINON' ; FLUIMPO = 'COPIER' FLUIMPM1 ; 'FINSI' ; 'SI' (('EGA' (SATUR . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (SATUR . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' teta 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH. On les différentie ici FLUMP = (FLUIMPO '-' FLUIMPM1) '/' DELTAT ; 'SINON' ; FLUMP = 'COPIER' FLUIMPO ; 'FINSI' ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'FLUMIXTE') ; 'SI' (tpsanc '<EG' startmix) ; 'SINON' ; FLUMMPO = 'COPIER' FLUMMPM1 ; 'FINSI' ; 'SI' (('EGA' (SATUR . 'TYPDISCRETISATION') 'VF') 'OU' (('EGA' (SATUR . 'TYPDISCRETISATION') 'EFMH') 'ET' ('EGA' teta 1.D0))) ; * On écrit les flux sous forme intégrale sauf en explicite et * kranck-Nickholson pour EFMH. On les différentie ici FLUMMP = ( FLUMMPO '-' FLUMMPM1) '/' DELTAT ; 'SINON' ; FLUMMP = 'COPIER' FLUMMPO ; 'FINSI' ; CHCLIM . 'FLUMIXTE' = TABLE ; CHCLIM . 'FLUMIXTE' . 'COEFA' = SATUR . 'FLUMIXTE' . 'MIXCOFA' ; * GBM rappel il y aura des modifs à faire car HYDRAU CHCLIM . 'FLUMIXTE' . 'COEFB' = SATUR . 'FLUMIXTE' . 'MIXCOFB' ; 'FINSI' ; GEOL1 . 'CLIMITES' = CHCLIM ; * *- Calcul de la contribution des termes sources * * Terme source propre : 'SI' ( 'EXISTE' SATUR 'SOURCE' ) ; 'SI' (tpsans <EG startsou) ; * la source varie encore et est non nulle 'SINON' ; * la source est nulle on garde l'intégrale précédente TERSC2 = TERSC2M1 ; 'FINSI' ; TERSCV = (TERSC2 '-' TERSC2M1) '/' DELTAT ; TERSCE = TERSCV + TERSCE ; 'FINSI' ; * Le terme source physique est tersce. GEOL1 . 'DELTAT' = DELTAT ; GEOL1 . 'METHINV' = SATUR . 'METHINV' ; *----------------------------------------------------- non linéaire 'REPETER' LINEAR itmaxi ; 'SI' ('EGA' CONSER VRAI) ; GEOL1 . 'CONCENTRATION' = CHRG ; 'FINSI' ; *__________________________________________________________________ * Préparation relaxation - GBM tester efficacité * ====================== 'SI' ('EGA' &LINEAR 1) ; * pas de relaxation à la première itération cofrelax = 1.D0 ; 'SINON' ; 'SI' (&LINEAR '<EG' (itmaxi/2)) ; * on relaxe à partir du deuxième pas de temps cofrelax = SATUR.'SOUS_RELAXATION' ; 'SINON' ; * on relaxe plus si on dépasse itmaxi/2 * GBM GBM GBMGBM 0.5 normalement cofrelax = 0.5D0 ; 'FINSI' ; 'FINSI' ; * Calcul des nouveaux paramètres * ============================== *-- Pression tronquée à utiliser dans les lois de comportement: * P1 pression pascal, PNS pression tronquée * GBM reprendre calcul sat, ten et capa * mettre un flag pour calculer CAPA ou pas * retirer PNSANC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * TENANC 'SI' ('EGA' CONSER VRAI) ; 'SINON' ; 'FINSI' ; *-- Calcul perméabilité * PERF = 0. ; NOMT = 'CHAINE' LOIP.'INDEX'.&BB ; LOI1 = LOIP . NOMT ; MOD1 = LOI1.'MODELE' ; 'SI' (('EGA' LOI1.'SOUSTYPE' ('CHAINE' PUISSANCE) ) 'OU' ('EGA' LOI1.'SOUSTYPE' ('CHAINE' PERSONNELLE)) 'OU' ('EGA' LOI1.'SOUSTYPE' ('CHAINE' MUALEM)) 'OU' ('EGA' LOI1.'SOUSTYPE' ('CHAINE' BURDINE)) 'OU' ('EGA' LOI1.'SOUSTYPE' ('CHAINE' BROOKS_COREY)) 'OU' ('EGA' LOI1.'SOUSTYPE' ('CHAINE' MUALEM_BURDINE))) ; * réduction de la saturation au sous-domaine (local) PERFL = ('TEXTE' NOMKR) LOI1 SATL ; 'SINON' ; PERFL = ('TEXTE' NOMKR) LOI1 PNL ; 'FINSI' ; * 'SI' ('EGA' NIVEAU 'FACE') ; * LOI1.'ABMC' = 'ABS' ('DOMA' MOD1 'ORIENTAT') ; * 'FINSI' ; * concaténation perméabilité 'REPETER' CONSPER NCOMP ; J = &CONSPER ; 'NATURE' 'DISCRET' ; * 'SI' (&BB 'EGA' 1) ; 'SI' ('EGA' J 1) ; PERFT = PERFI ; 'SINON' ; PERFT = PERFT 'ET' PERFI ; 'FINSI' ; 'SINON' ; 'SI' ('EGA' J 1) ; PERFT = PERFT 'ET' PERFI ; 'SINON' ; PERFT = PERFT 'ET' PERFI ; 'FINSI' ; 'FINSI' ; * 'FIN' CONSPER ; * 'OUBLIER' satl ; 'OUBLIER' perl; 'FIN' BB ; *-- coefficient d'emmagasinement si milieu saturé * GBM ATTENTION ICI BIZARRE * GBM MET A 0 CAR DISCONTINUITE DU TERME DEVANT DT, 0 AVANT * SAT ET POSITIF APRES. DOIT ETRE MIS DANS LES LOIS DE SAT * ET EVOLUER CONTINUEMENT. * EMMAG = NOMC SCAL (SATC * COFEMMAG) ; * 'MESSAGE' 'maxi min emmag' ('MINIMUM' emmag) ('MAXIMUM' emmag); * Construction système matriciel * ============================== *-- Penalisation - * GBM ERREUR sur NOMC 'SOUR' 'SI' PENAL ; ((CHRG - CHRGANC) * VHYB / DELTAT * cofpenal)) ; 'SINON' ; TERSC1 = TERSCE ; 'FINSI' ; 'SI' ('EGA' CONSER VRAI) ; ((TENC - TENNC) * VHYB / DELTAT )) ; 'FINSI' ; * relaxation * 'MESSAGE' 'coefrelaaaaaaaaaaaaaaaa' cofrelax; 'SI' ('NEG' cofrelax 1.D0 1.D-14) ; * on relaxe CAPA et PERF '+' (CAPAN '*' (1. - cofrelax)) ; PERFR = ( PERFT '*' cofrelax) '+' (PERFN '*' (1. - cofrelax)) ; 'SINON' ; PERFR = PERFT ; 'FINSI' ; *-- coef devant la derivée temps COFDT = CAPAR '+' EMMAG ; * permeabilité * LAM = ('NOMC' PERFR 'K' NATURE DIFFUS) ; * GBM - penalisation un peu particuliere ! ecrire ce que cela * veut dire 'SI' PENAL ; COFDT = COFDT '+' COFPENAL ; 'FINSI' ; * initialisation TRANSGEOL - gbm bien verif les tabmodi GEOL1 . 'POROSITE' = COFDT ; TABMODI . 'POROSITE' = VRAI ; GEOL1 . 'DIFFUSIVITE' = PERFR ; TABMODI . 'DIFFUSIV' = VRAI ; * Résolution : * ============ * GBM appel trangeol - tester peut etre aussi premier penal 'SI' ( (&TRANSI 'EGA' 1)) ; 'SINON' ; 'FINSI' ; CHRG = GEOLPF1 . 'CONCENTRATION' ; FLU1 = GEOLPF1 . 'FLUXDIFF' ; 'SI' ('EGA' SATUR . 'TYPDISCRETISATION' EFMH) ; TRH2 = GEOLPF2 . 'TRACE_CONC' ; 'SINON' ; * GBM §§§§§§§§§§§§§§§§§§§§§§§ TRH2 = 0.D0 * FLU1; 'FINSI' ; * GBM - a clarifier TRH = TRH2 ; * FIN DE BOUCLE : * ================= * test de convergence sur le résidu * ================================= * A-t-on convergé à l'itération précédente (avec les nouveaux paramètres) ? * flux correspondant au résidu système résolu sans relaxation ** ** GBM reflechir comment améliorer la conservation 'SI' (&LINEAR 'EGA' 1) ; OKCONV = FAUX ; maxer = 1.D0; 'SINON' ; RES1 = 'MAXIMUM' ('RESULT' ('ABS' (TEN - TENN))) ; RES2 = ((0.1D0 * ('MAXIMUM' ('RESULT' ('ABS' (TEN))))) + ( ('MAXIMUM' ('RESULT' ('ABS' (TEN '-' TENANC)))))); RES3 = 'MAXIMUM' ('RESULT' ('ABS' (PERFR - PERFN))) ; RES4 = ('MAXIMUM' ('RESULT' ('ABS' ((perfr '-' perfn))))) '/' ('MAXIMUM' ('RESULT' PERFR)) ; RES3 = RES3 '/' ( 'MAXIMUM' ('RESULT' ('ABS' (PERFR - PERFANC))) + 1.D-100) ; * 'MESSAGE' 'minmax res1 res2' res1 res2 ('MAXIMUM' * (TEN - TENANC)) ; MAXER = RES1 '/' RES2 ; MAXER = MAXER '+' RES3 ; * on prend en compte la taille du pas de tps comparé à CFL 'SI' (&TRANSI 'EGA' 1) ; * Pour le premier pas de temps les flux ne sont pas connus * donc le pas de temps CFL est mal évalué. On ne l'inclue * pas dans le crtiere de convergence OKCONV = MAXER < (ERR0) ; 'SINON' ; OKCONV = MAXER < (ERR0 * DTI '/' DELTAT) ; * 'MESSAGE' 'error4 err3' res4 res3 ; OKCONV = OKCONV 'ET' (RES4 < ( ERR0)) ; 'FINSI' ; 'SI' (DTAUTO) ; 'SI' (&LINEAR 'EGA' 2) ; * on impose de boucler au moins 2 fois en pas de tps auto OKCONV = FAUX ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * sorties textes * ============== * 'SI' debug ; * nb d'espaces avant le nb d'itérations, pour faire joli * moins joli si &LINEAR > 9999. IL = &LINEAR - 1 ; TXT = '| ' ; 'SI' (IL < 1000) ; txt = 'CHAINE' txt ' ' ; 'FINSI' ; 'SI' (IL < 100) ; txt = 'CHAINE' txt ' ' ; 'FINSI' ; 'SI' (IL < 10) ; txt = 'CHAINE' txt ' ' ; 'FINSI' ; * nb d'espaces avant le nb d'éléments désaturés, pour faire joli * moins joli si nbds > 9999. esp = ' ' ; 'SI' (nbds < 1000) ; esp = 'CHAINE' esp ' ' ; 'FINSI' ; 'SI' (nbds < 100) ; esp = 'CHAINE' esp ' ' ; 'FINSI' ; 'SI' (nbds < 10) ; esp = 'CHAINE' esp ' ' ; 'FINSI' ; * affichage des paramètres pour chaque itération * GBM change les maxi affichés - pas maxi TP1 mais maxi CHRG 'SI' OKCONV ; '-------------------------------' '-------------------------------') ; 'FINSI' ; 'FINSI' ; * tests sortie * ============ *--- sortie si convergence 'SI' OKCONV ; * GBM - NON ON NE PEUT PAS SORTIR SI ON n'A PAS FAIT DE CALCUL * Le test précédent n'a pas de sens au premier indice. 'QUITTER' LINEAR ; 'FINSI' ; * petit message pour prévenir qu'on a changé la relaxation 'SI' (DEBUG 'ET' ('EGA' &LINEAR (itmaxi/2))) ; 'FINSI' ; *-- Sauvegarde des valeurs du pas de l'itération précédente TRH2N = TRH2 ; CAPAN = CAPAR ; PERFN = PERFR ; CHRGN = CHRG ; TENN = TEN ; *_____________________________________________________ non linéaire 'FIN' LINEAR ; *__________________________________________________________________ 'SI' ('EGA' CONSER VRAI) ; TENNC = TENC ; 'FINSI' ; * GBM - gerer les tabmodi à faux !!!!!!!!!!!!!!!!!!!!!!!!! 'SI' ('NON' OKCONV) ; * message, adaptation du pas de tps ou penalisation DELTAT maxer OKPENAL cofpenal CFL0 COFDIV debug SATUR tps ; 'SINON' ; * on a convergé * PENAL = FAUX ; 'QUITTER' PENALDT ; 'FINSI' ; *--------------------------------------------------------- artifice 'FIN' PENALDT ; *------------------------------------------------------------------ FLU0 = FLU1 ; LAST1 = LAST1 + 1 ; * Sauvegarde * ========== ISOR ISAUV = SATUTILS SAVRESU SATUR TPSOR ISOR TPSANC TPS ISAUV DELTAT TRHANC TRH CHRGANC CHRG TENANC TEN PNSCANC PNSC SATANC SAT FLUANC FLU0 NIVEAU DSOR &LINEAR MDMH ; 'MESSAGE' ' ' ; 'MESSAGE' ' ' ; 'MESSAGE' 'RESIDU EN TEMPS ' ((tfinal '-' tpsini) * ('MAXIMUM' (('RESULT' ('ABS' (TEN '-' TENANC))) '/' (deltat * ('RESULT' ('ABS' TEN)))))) ; 'MESSAGE' ' ' ; 'MESSAGE' ' ' ; * Temps caractéristique et nouveau pas de temps : * =============================================== *-- pas de temps idéal lié à la cinétique d'hydratation : * nb de face avec des flux pas trop faibles (> 1.D-9 x maximum) *-- Nouveau pas de temps : 'SI' ('EXISTE' SATUR 'TEMPS_CALCULES') ; 'SI' (ICAL < DCAL) ; ICAL = ICAL + 1 ; * GBM verifier que DTAUTO = FAUX dans ce cas sinon écrasé apres. 'FINSI' ; 'SINON' ; * quand on a donné SATUR.'DT_INITIAL', le pas de temps n'est * imposé qu'au départ. Après, il est automatique. DTAUTO = VRAI ; 'FINSI' ; 'SI' DTAUTO ; * pas de temps automatique * on modifie le CFL de façon à approcher nb d'itérations visé. 'MESSAGE' 'avant' CFL0; CFL0 = ((((Niter0 '/' 1.)) / &LINEAR) ** 0.5) ; 'MESSAGE' 'apres' CFL0; 'FINSI' ; VVOL = VHYB * PORO1 ; *'MESS' 'mini max perm' ('MINIMUM' (PERFR)) * ('MAXIMUM' (PERFR)) ; DELTAT DTI = SATUTILS YNYTDT MDMH FLU0 MCHYB VVOL CFL0 debug DTAUTO DELTAT TERSCE ; *-- sortie en cas de temps limite dépassé 'SI' ( TPS '>EG' TFINAL ) ; 'MENAGE' ; 'QUITTER' TRANSI ; 'FINSI' ; * Préparation pas de temps suivant : * ================================== * Sauvegarde des valeurs du pas de temps précédent TRHANC = TRH ; CHRGANC = CHRG ; FLUANC = FLU0 ; PNSANC = PNS ; PNSCANC = PNSC ; TENANC = TEN ; SATANC = SAT ; TPSANC = TPS ; PERFANC = PERFR ; * GBM REGARDE 'SI' ('EXISTE' SATUR 'FLUX_IMPOSE') ; FLUIMPM1 = FLUIMPO ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'FLUMIXTE') ; FLUMMPM1 = FLUMMPO ; 'FINSI' ; 'SI' ('EXISTE' SATUR 'SOURCE') ; TERSC2M1 = TERSC2 ; 'FINSI' ; GEOL1 = 'TABLE' GEOLPF1 ; GEOL2 = 'TABLE' GEOLPF2 ; *================================================= boucle transitoire 'FIN' TRANSI ; *==================================================================== * 'FINPROC' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales