$$$$ CHITRNSP * CHITRNSP PROCEDUR BP208322 21/01/08 21:15:01 10844 'DEBPROC' CHITRNSP TRANSI*'TABLE' ; *---------------------------------------------------------------------- * Transport geochimie *---------------------------------------------------------------------- * *------------------------------ * Phrase d'appel (en GIBIANE) : *------------------------------ * * CHITRNSP TABLE ; * *---------------------------------- * Opérandes (à mettre dans TABLE) : *---------------------------------- * * ___________________________________________________________________ * | | * | Indice Contenu | * | | * ------------------------------------------------------------------- * | | * |------------------------------------------------ | * |Données physiques, géométriques et materielles : | * |------------------------------------------------ | * | | * |'MODELE' Objet modèle (MMODEL créé par MODE) | * | | * |'DIFFUSION' Données physiques et materielles : | * | conductivité hydraulique (MCHAML créé par MATE) | * | | * |'POROSITE' Contient pour chaque élément la valeur moyenne de la | * | porosité (défaut 1 ) nom CK | * | | * |'DOMAINE' Références géométriques (TABLE créée par KDOM) | * | | * |'CONVECTION' Flux de la vitesse convective (CHAMPOIN de support | * | DOMAINE.FACE) | * | | * | | * | 'CHIMI1' Table issue de CHI1 | * | | * | 'TAQU' concentration des aqueux au centre des faces | * | CHAMPOIN possedant une composante par composant | * | chimique. | * | | * | 'ITERC' nombre max d'itérations de couplage (défaut 100) | * | | * | 'PRECISION' précision critère de convergence pour le couplage | * | valeur par défaut 1.E-3 | * | | * | 'LOGC' parametres de calcul de CHI2 | * | 'TOT' | * | <'EPS'> <'ITMAX'> <'ITERSOLI'> <'PRECPE'> | * | <'NITERPE'> <'DELPE'> <'NFI'> <'FIONI'> <'NTY4'> <'TEMPE'> | * | <'CLIM'> <'SORTIE'> <'IMPRIM'> | * | | * |-------------------------------------- | * |Conditions aux limites / chargements : | * |-------------------------------------- | * | | * |'BLOCAGE' Contient les matrices de blocage (RIGIDITE) | * | | * |'TRACE_IMPOSE' Valeurs des traces de concentrations imposées | * | chargement de CHPOIN au centre des faces | * | | * |'FLUX_IMPOSE' Valeurs des flux de concentrations imposées | * | chargement de CHPOIN au centre des faces | * | | * |'SOURCE' Valeurs de la source | * | Chargement relatifs aux CHPOIN centre | * | ( défaut CHPOIN centre 0.) | * | | * |--------------------- | * |Algorithme en temps : | * |--------------------- | * | | * |'PAS_DE_TEMPS' Valeur du pas de temps de calcul (FLOTTANT) | * | | * | 'TEMPS_FINAL' Valeur du temps final (FLOTTANT) | * | | * |'TEMPS_SAUVES' Valeur des temps sauvegardés (LISTREEL - défaut | * | on sauve tous les pas de temps) | * | | * |'THETA' Coefficient de relaxation du terme de diffusion | * | compris entre 0. et 1. | * | (theta-méthode) (FLOTTANT - défaut 1.) | * | Possibilité de non-convergence lorsque theta<1/2 | * | Valeurs de theta généralement utilisées : | * | Schéma de Euler explicite : 0. | * | Schéma de Crank-Nicholson : 1/2 | * | Schéma de Euler implicite : 1. | * | | * | | * | 'SORTIE' listmots liste des élèments à conserver (cf CHI2) | * |_________________________________________________________________| * * * *--------------------------------- * Résultats (stockés dans TABLE) : *--------------------------------- * * ___________________________________________________________________ * | | * | Indice Contenu | * | | * ------------------------------------------------------------------- * | | * |'SOUSTYPE' 'GEOCHIMIE' (type MOT) | * | | * |'TEMPS' TABLE contenant les temps sauvegardés (FLOTTANT) | * | | * |'TOT' TABLE contenant les concentrations totales aux centres | * | CHPOIN centre ayant une composante par composant chimique | * | | * |'AQUE' TABLE contenant les concentrations des aqueux | * | CHPOIN centre ayant une composante par composant chimique | * | | * |'FIXE' TABLE contenant les concentrations des fixés | * | CHPOIN centre ayant une composante par composant chimique | * | | * |'TAQU' TABLE contenant les traces de concentrations des aqueux | * | CHPOIN face ayant une composante par composant chimique | * | on aura en plus une table pour chacun des éléments de la liste | * | SORTIE. Les sauvegardes des CHPOIN centre issus du calcul CHI2 | * | | * |_________________________________________________________________| * * * ___________________________________________________________________ * | | * | Les tables résultats sont indicés 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 stockés à l'indice N .| * |_________________________________________________________________| * * * *--------------------------------------------------------------------* * RECUPERATION DES DONNEES PHYSIQUES, GEOMETRIQUES ET MATERIELLES * *--------------------------------------------------------------------* * * SOUSTYPE 'SI' ( 'NON' ('EXIS' TRANSI 'SOUSTYPE') ) ; 'ERREUR' 'indice SOUSTYPE absent de la table des données ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SI' ( 'NEG' ( TRANSI. 'SOUSTYPE') 'GEOCHIMIE' ) ; 'ERREUR' 'indice SOUSTYPE incorrect dans la table des données ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * MODELE 'SI' ( 'EXISTE' TRANSI 'MODELE' ) ; MODHYB = TRANSI . 'MODELE' ; MCHYB = 'DOMA' MODHYB 'ORIENTAT' ; XVOLU = 'DOMA' MODHYB 'VOLUME' ; CEHYTOT = 'DOMA' MODHYB 'CENTRE' ; FACHYTOT = 'DOMA' MODHYB 'FACE' ; 'SINON' ; 'ERREUR' 'Il manque le modele' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * DIFFUSION 'SI' ( 'EXISTE' TRANSI 'DIFFUSION' ) ; MAT1 = TRANSI . 'DIFFUSION' ; 'SINON' ; 'ERREUR' 'Indice DIFFUSION absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * POROSITE 'SI' ( 'EXISTE' TRANSI 'POROSITE' ) ; COEMK = TRANSI . 'POROSITE' ; 'SINON' ; COEMK = 'MANU' 'CHPO' CEHYTOT 1 'CK' 1.D0 ; 'FINSI' ; COEMM= 'KCHA' MODHYB 'CHAM' COEMK ; COEMC= 'NOMC' 'SCAL' COEMK ; EMSURF = 'INTG' 'ELEM' MODHYB COEMM ; * CONVECTION 'SI' ( 'EXISTE' TRANSI 'CONVECTION' ) ; QFACE = TRANSI . 'CONVECTION' ; 'SINON' ; 'ERREUR' 'Indice CONVECTION absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * CHIMI1 'SI' ( 'EXISTE' TRANSI 'CHIMI1' ) ; TB1 = TRANSI . 'CHIMI1' ; 'SI' ( 'NON' ('EXISTE' TB1 'SOUSTYPE' ) ) ; 'ERREUR' 'Indice CHIMI1 ne convient pas.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SI' ( 'NEG' ( TB1.'SOUSTYPE' ) 'CHIMI1' ) ; 'ERREUR' 'Le sous-typage de la table CHIMI1 est incorrect'; 'QUITTER' CHITRNSP ; FINSI ; NBCOMP= DIME ( TB1 . 'DESCHI' .'IDX' ) ; 'MESS' ' NOMBRE DE COMPOSANTS ' NBCOMP ; 'SINON' ; 'ERREUR' 'Indice CHIMI1 absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * PRECISION 'SI' ( 'EXISTE' TRANSI 'PRECISION' ) ; EPSS = TRANSI . 'PRECISION' ; 'SINON' ; EPSS = 1.D-3 ; 'FINSI' ; * ITERC 'SI' ( 'EXISTE' TRANSI 'ITERC' ) ; ITERC = TRANSI . 'ITERC' ; 'SINON' ; ITERC= 100 ; 'FINSI' ; *--------------------------------------------------------------------* * RECUPERATION DES DONNEES POUR LE SCHEMA EN TEMPS * *--------------------------------------------------------------------* * * THETA 'SI' ( 'EXISTE' TRANSI 'THETA' ) ; TETA = TRANSI . 'THETA' ; 'SINON' ; TETA = 1.D0 ; 'FINSI' ; * PAS_DE_TEMPS 'SI' ( 'EXISTE' TRANSI 'PAS_DE_TEMPS' ) ; DELTAT = TRANSI . 'PAS_DE_TEMPS' ; 'SINON' ; 'ERREUR' 'Indice PAS_DE_TEMPS absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * TEMPS INITIAL 'SI' ( 'EXISTE' TRANSI 'TEMPS') ; IND1= 'INDE' (TRANSI. 'TEMPS') ; LN1= 'DIME' IND1 ; ISOR0 = IND1 . LN1 ; TINIT= TRANSI.'TEMPS' . ISOR0 ; 'SINON' ; TRANSI. 'TEMPS' = TABLE ; TINIT=0.D0 ; TRANSI. 'TEMPS'. 0 = TINIT ; ISOR0= 0 ; LN1=1 ; 'FINSI' ; * TEMPS_FINAL 'SI' ( 'EXISTE' TRANSI 'TEMPS_FINAL' ) ; TFINAL = TRANSI . 'TEMPS_FINAL' ; SI ( TFINAL DSOR ) ; 'QUITTER' BOU3 ; 'FINSI' ; 'FINSI' ; 'FIN' BOU3 ; DLSOR = DIME LTPSOR ; 'SI' ((EXTR LTPSOR DLSOR) NEG NBTPS ) ; DLSOR= DLSOR+1 ; LTPSOR = 'INSE' LTPSOR DLSOR NBTPS ; 'MESS' ' LA LISTE TEMPS_SAUVES EST INCORRECTE' ; MESS 'indices des temps sauvegardés' ; list ltpsor ; 'FINSI' ; 'SINON' ; * MESS 'NBTPS ' NBTPS ; 'SI'( NBTPS 'EGA' 1 ) ; LTPSOR= 'LECT' 1 ; 'SINON' ; LTPSOR= 'LECT' 1 'PAS' 1 NBTPS ; 'FINSI' ; 'FINSI' ; * IL FAUT CONTROLER LES LONGUEURS DES TABLES * TAQU 'SI' ( 'EXISTE' TRANSI 'TAQU' ) ; LNN='DIME' (TRANSI. 'TAQU' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et TAQU ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; TAQU0 = TRANSI . 'TAQU' . ISOR0 ; TAQU = TRANSI . 'TAQU' . ISOR0 ; 'SINON' ; 'ERREUR' 'Indice TAQU absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; * AQUE 'SI' ( 'EXISTE' TRANSI 'AQUE' ) ; LNN='DIME' (TRANSI. 'AQUE' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et AQUE ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SINON' ; 'SI' ( EGA ISOR0 0) ; TRANSI. 'AQUE'= TABLE ; 'SINON' ; 'ERREUR' 'Indice AQUE absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI'; 'FINSI' ; * FIXE 'SI' ( 'EXISTE' TRANSI 'FIXE' ) ; LNN='DIME' (TRANSI. 'FIXE' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et FIXE ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SINON' ; 'SI' ( EGA ISOR0 0) ; TRANSI. 'FIXE'= TABLE ; 'SINON' ; 'ERREUR' 'Indice FIXE absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI'; 'FINSI' ; * FLUX 'SI' ( 'EXISTE' TRANSI 'FLUX' ) ; LNN='DIME' (TRANSI. 'FLUX' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et FLUX ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SINON' ; 'SI' ( EGA ISOR0 0) ; TRANSI. 'FLUX'= TABLE ; * TRANSI. 'FLU2'= TABLE ; 'FINSI'; 'FINSI' ; * parametres de CHIMI2 TBPARM= TABLE ; TBPAR2= TABLE ; TBPAR2.'SOUSTYPE'='DONNEES_CHIMIQUES' ; * 'SI' ( 'EXISTE' TRANSI 'LOGC' ) ; LNN='DIME' (TRANSI. 'LOGC' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et LOGC ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; TBPAR2.'LOGC' = TRANSI . 'LOGC' . ISOR0 ; CLOGC = TRANSI . 'LOGC' . ISOR0 ; 'SINON' ; 'ERREUR' 'Indice LOGC absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TOT' ) ; LNN='DIME' (TRANSI. 'TOT' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et TOT ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; TBPAR2.'TOT' = TRANSI . 'TOT' . ISOR0 ; TNC = TRANSI . 'TOT' . ISOR0 ; TT1= 'EXTR' TNC 'COMP' ; 'SINON' ; 'ERREUR' 'Indice TOT absent de la table de données.' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'EPS' ) ; TBPARM.'EPS' = TRANSI . 'EPS' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'ITMAX' ) ; TBPARM.'ITMAX' = TRANSI . 'ITMAX' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'ITERSOLI' ) ; TBPARM.'ITERSOLI' = TRANSI . 'ITERSOLI' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'PRECPE' ) ; TBPARM.'PRECPE' = TRANSI . 'PRECPE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NITERPE' ) ; TBPARM.'NITERPE' = TRANSI . 'NITERPE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'DELPE' ) ; TBPARM.'DELPE' = TRANSI . 'DELPE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'MDELPE' ) ; TBPARM.'MDELPE' = TRANSI . 'MDELPE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NFI' ) ; TBPARM.'NFI' = TRANSI . 'NFI' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FION' ) ; LNN='DIME' (TRANSI. 'FION' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et FION ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; TBPAR2.'FIONI' = TRANSI . 'FION' . ISOR0 ; CFIONI= TRANSI . 'FION' ; 'SINO' ; CFIONI= TNC -TNC ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NTY4' ) ; LNN='DIME' (TRANSI. 'NTY4' ) ; 'SI' ('NEG' LN1 LNN) ; 'ERREUR' 'dimensions incohérentes entre TEMPS et NTY4 ' ; 'QUITTER' CHITRNSP ; 'FINSI' ; TBPAR2.'NTY4' = TRANSI . 'NTY4' . ISOR0 ; CNTY4 = TRANSI . 'NTY4' . ISOR0 ; ICTY4= 1 ; 'SINON' ; ICTY4= 0 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TEMPE' ) ; TBPAR2.'TEMPE' = TRANSI . 'TEMPE' ; TEMPERAT = TRANSI . 'TEMPE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'CLIM' ) ; TBPAR2.'CLIM' = TRANSI . 'CLIM' ; CCLIM= TRANSI . 'CLIM' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SORTIE' ) ; TBPARM.'SORTIE' = TRANSI . 'SORTIE' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'IMPRIM' ) ; TBPARM.'IMPRIM' = TRANSI . 'IMPRIM' ; 'FINSI' ; * * ------------------------------------------------------------ * DECROISSANCE * ------------------------------------------------------------ * 'SI' ( 'EXISTE' TRANSI 'DECROISSANCE') ; TETDEC= TRANSI.'DECROISSANCE'.TETA ; * MESS ' TDEC ' ; TDEC= INDEX ( TRANSI. 'DECROISSANCE' ) ; NBDEC= DIME TDEC ; * MESS 'NBDEC ' ; *list nbdec ; NBDEC= NBDEC-1 ; *list nbdec ; *LIST TDEC ; TBDEC= TRANSI.'DECROISSANCE'. 1 ; MO1PERE MOPERE NPERE = NOCOMCHI TB1 'NUMCOMP' (TBDEC.PERE) ; LAMP= EXCO (TNC -TNC) MOPERE MOPERE ; MALAMP= 'EXTR' LAMP 'MAIL' ; * MESS 'LAMP ' ; * LIST LAMP ; LISMPERE= MOTS ; LISMFILS= MOTS ; 'REPE' BDECR NBDEC ; TBDEC= TRANSI.'DECROISSANCE'. &BDECR ; MO1PERE MOPERE NPERE = NOCOMCHI TB1 'NUMCOMP' (TBDEC.PERE) ; MO1FILS MOFILS NFILS = NOCOMCHI TB1 'NUMCOMP' (TBDEC.FILS) ; * LAMP=LAMP+( NOMC TBDEC.LAMBDA MOPERE ) ; LAMP= LAMP+('MANU' 'CHPO' MALAMP 1 MOPERE TBDEC.LAMBDA ) ; LISMPERE= 'INSE' LISMPERE &BDECR MOPERE ; LISMFILS= 'INSE' LISMFILS &BDECR MOFILS ; 'FIN' BDECR ; 'FINSI' ; * MESS ' LAMP apres chargement ' ; * LIST LAMP ; * MESS ' LISMPERE ' ; * LIST LISMPERE ; * MESS ' LISMFILS ' ; * LIST LISMFILS ; * *--------------------------------------------------------------------* * RECUPERATION DES CONDITIONS AUX LIMITES ET DES CHARGEMENTS * *--------------------------------------------------------------------* * * CL de type Dirichlet : BLOCAGE * TRACE_IMPOSE 'SI' ( 'EXISTE' TRANSI 'BLOCAGE' ) ; MATBLOC = TRANSI . 'BLOCAGE' ; 'SI' ( 'EXISTE' TRANSI 'TRACE_IMPOSE') ; CCHAIMP = TRANSI . 'TRACE_IMPOSE' ; 'SINON' ; 'ERREUR' 'Valeurs de traces de charge imposée absentes' ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'FINSI' ; * FLUX_IMPOSE 'SI' ( 'EXISTE' TRANSI 'FLUX_IMPOSE') ; FLUIMPO = TRANSI . 'FLUX_IMPOSE' ; 'FINSI' ; * SOURCE 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; CHASOUR = TRANSI . 'SOURCE' ; 'SINON' ; MOCOMP= 'EXTR' TT1 1 ; SOURC0= 'MANU' 'CHPO' CEHYTOT 1 MOCOMP 0.D0 ; 'REPE' BOU6 NBCOMP ; MOCOMP= 'EXTR' TT1 &BOU6 ; TERSC = 'MANU' 'CHPO' CEHYTOT 1 MOCOMP 0.D0 ; SOURC0= SOURC0 +TERSC ; 'FIN' BOU6 ; 'FINSI' ; * tersc1 source a utiliser dans le calcul de AF TERSC1 = 'MANU' 'CHPO' CEHYTOT 1 'SOUR' 0.D0 ; * *------------------------------------------- ------------------------* * INITIALISATION DE LA TABLE RESULTAT *--------------------------------------------------------------------* * 'SI' ( 'EXISTE' TRANSI 'SORTIE' ) ; NBSOR = DIME ( TRANSI . 'SORTIE' ) ; SI (EGA ISOR0 0) ; 'REPETER' BOU1 NBSOR ; MOSOR= 'EXTR' ( TRANSI . 'SORTIE' ) &BOU1 ; TRANSI . MOSOR = TABLE ; 'FIN' BOU1 ; 'SINON' ; 'REPETER' BOU2 NBSOR ; MOSOR= 'EXTR' ( TRANSI . 'SORTIE' ) &BOU2 ; 'SI' ( 'EXIS' TRANSI MOSOR) ; LNN='DIME' (TRANSI. MOSOR ) ; 'SI' ('NEG' LN1 LNN) ; MESERR = 'CHAI' 'dimensions incohérentes entre TEMPS et' MOSOR ; 'ERREUR' MESERR ; 'QUITTER' CHITRNSP ; 'FINSI' ; 'SINON' ; 'ERREUR' ( CHAI 'Indice ' MOSOR ' absent de la table de données.' ) ; 'QUITTER' CHITRNSP ; FINSI ; 'FIN' BOU2 ; 'FINSI' ; 'FINSI' ; *--------------------------------------------------------------------* * CE QUI EST INDEPENDANT DU COMPOSANT ET DU TEMPS * *--------------------------------------------------------------------* * * on récupère les noms des reactifs * NBREA= 0 ; SI ( EXIS TB1 'IDEN' 'REAC') ; NOMREAC= MOTS ; NBREA=DIME TB1.IDEN.REAC ; REPETER BOUREA NBREA ; NUNU= EXTR ( TB1.IDEN.REAC ) &BOUREA ; NNCH NOM2 NUNU = NOCOMCHI TB1 'NUMCOMP' NUNU ; NOMREAC= NOMREAC ET ( MOTS NOM2 ) ; FIN BOUREA; * LIST NOMREAC ; FINSI ; * * on récupère les noms des non reactifs * NBNR= 0 ; SI ( EXIS TB1 'IDEN' 'PARF') ; NOMPARF= MOTS ; NBNR=DIME TB1.IDEN.PARF ; NBNR1= NBNR ; REPETER BOUNR NBNR1; NUNU= EXTR ( TB1.IDEN.PARF ) &BOUNR ; NNCH NOM2 NUNU = NOCOMCHI TB1 'NUMCOMP' NUNU ; * * les non reactifs intervenant dans les decroissances sont traités * comme des reactifs sinon les quantitées de matieres devenant non * reactives ne sont plus transportées 'SI' ( 'EXISTE' TRANSI 'DECROISSANCE') ; IREA= FAUX ; 'REPE' B2DECR NBDEC ; TBDEC= TRANSI.'DECROISSANCE'. &B2DECR ; 'SI' ('EGA' (TBDEC.'PERE') NUNU) ; IREA= VRAI ; 'QUITTER' B2DECR ; 'SINON' ; 'SI' ('EGA' (TBDEC.'FILS') NUNU) ; IREA= VRAI ; 'QUITTER' B2DECR ; 'FINSI' ; 'FINSI' ; 'FIN' B2DECR ; 'SI' IREA ; NBREA=NBREA+1 ; NBNR= NBNR-1 ; NOMREAC= NOMREAC ET ( MOTS NOM2 ) ; 'SINON' ; NOMPARF= NOMPARF ET ( MOTS NOM2 ) ; 'FINSI' ; 'SINON' ; NOMPARF= NOMPARF ET ( MOTS NOM2 ) ; 'FINSI' ; FIN BOUNR ; * LIST NOMPARF ; FINSI ; * * * Table utilisée par les operateurs MATP, SMTP, HYBP et HDEBI * TAB = 'TABLE' ; TAB.'SOUSTYPE' = 'DARCY_TRANSITOIRE' ; TAB.'THETA' = TETA ; TAB.'THETA_CONVECTION'= TETA ; TAB.'SURF' = EMSURF ; TAB.'PAS' = DELTAT ; TAB.'TRACE'= MANU CHPO FACHYTOT 1 TH 0.D0 ; TAB.'CHARGE'= MANU CHPO CEHYTOT 1 H 0.D0 ; * * Initialisations du calcul * MASHYB = 'MHYB' MODHYB MAT1 ; MC SMTR = 'SMTP' MODHYB MASHYB TAB TERSC1 QFACE ; MF = 'MATP' MODHYB MASHYB TAB ; AF = MF ET MC ; * * TB3= CHI2 TB1 TBPAR2 TBPARM ; * * CAQU=TB3.AQUE ; CAQU0=CAQU ; CFIX0=TB3.FIXE ; CFIXE=TB3.FIXE ; CLOGC= TB3.LOGC ; FLU00= TAQU -TAQU ; FLU01= FLU00 ; * * Les coefficients * COEMC= COEMC * XVOLU ; PETID= DMTD MODHYB MASHYB ; ALFA= (TETA* PETID) +(COEMC/DELTAT ) ; ALFA= ALFA ** (-1) ; COEF1=ALFA*COEMC/DELTAT ; COEF2= ALFA* PETID*(1. - TETA) ; COEF3= ALFA*(1. - TETA) ; COEF4= 1. - (ALFA * TETA * PETID ) ; COEF5= ALFA*TETA*PETID ; * * Indice ISOR0 de la table resulat * TMPS= TINIT ; TRANSI . 'TEMPS' . ISOR0 = TMPS ; TRANSI . 'TOT' . ISOR0 = TNC ; TRANSI . 'AQUE' . ISOR0 = CAQU ; TRANSI . 'FIXE' . ISOR0 = CFIXE ; TRANSI . 'TAQU' . ISOR0 = TAQU ; TRANSI . 'LOGC' . ISOR0 = CLOGC ; TRANSI . 'FLUX' . ISOR0 = 'HDEB' MODHYB MASHYB CAQU TAQU QFACE ; * 'MESS' ' FLUX 0' ; * LIST ( TRANSI . 'FLUX' . ISOR0 ) ; 'SI' ( 'EXISTE' TRANSI 'SORTIE' ) ; 'REPETER' BOU4 NBSOR ; MOSOR= 'EXTR' ( TRANSI . 'SORTIE' ) &BOU4 ; TRANSI . MOSOR . ISOR0 = TB3. MOSOR ; 'FIN' BOU4 ; 'SI' ( 'EXISTE' TRANSI 'PREC' ) ; CPRECIP= TB3.'PREC' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FION' ) ; CFIONI= TB3.'FION' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP6' ) ; CTYP6= TB3.'TYP6' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP5' ) ; CTYP5= TB3.'TYP5' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP3' ) ; CTYP3= TB3.'TYP3' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NTY4' ) ; CNTY4= TB3.'NTY4' ; ICTY4= 1 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SURF' ) ; CSURF= TB3.'SURF' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SOLU' ) ; CSOLU= TB3.'SOLU' ; 'FINSI' ; 'FINSI' ; * * ------------------------------------------------------------------- * Boucle sur le temps * ------------------------------------------------------------------- * ISOR=1 ; ITERCUM= 0 ; NPAFLUX= 0 ; REPETER BOUTMP NBTPS ; NUSOR= 'EXTR' LTPSOR ISOR ; TMPS= TMPS+DELTAT ; TNC1= TNC ; 'SI' ( 'EXISTE' TRANSI 'SOURCE' ) ; SOURC= TIRE CHASOUR TMPS ; 'SINON' ; SOURC= SOURC0 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'BLOCAGE' ) ; CHAIMP= TIRE CCHAIMP TMPS ; CHAIMP= 'CHAN' 'ATTRIBUT' CHAIMP 'NATURE' 'DISCRET' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FLUX_IMPOSE' ) ; FLUIMP= TIRE FLUIMPO TMPS ; FLUIMP= 'CHAN' 'ATTRIBUT' FLUIMP 'NATURE' 'DISCRET' ; 'FINSI' ; TOTO= TAQU ; * FLU2= TOTO - TOTO ; DOMERR= CEHYTOT ; * * --------------------------- * Transport des non réactifs * --------------------------- * SI (NBNR > 0 ) ; * I=0 ; REPETER BLOC1 NBNR ; I= I + 1 ; MOCOMP= EXTR NOMPARF I ; CONC= EXCO MOCOMP TOTO MOCOMP ; CHA2= EXCO MOCOMP TNC MOCOMP ; TSOUR= EXCO MOCOMP SOURC 'SOUR' ; TOTO= TOTO - CONC ; TNC = TNC - CHA2 ; * * = Conditions initiales = * TFHYB = NOMC 'TH' CONC ; TCHYB = 'HYBP' MODHYB MASHYB TFHYB ; TAB.'TRACE' = TFHYB ; TAB.'CHARGE' = TCHYB ; * * = VALEURS imposées = * * RIGS SMTR = 'SMTP' MODHYB MASHYB TAB TSOUR QFACE ; * 'SI' ('EXISTE' TRANSI 'BLOCAGE') ; CLIAB= EXCO MOCOMP CHAIMP 'H' ; EEBAS = 'DEPI' MATBLOC (NOMC CLIAB 'TH') ; AFF = AF 'ET' MATBLOC ; SMTR = SMTR 'ET' EEBAS ; 'SINON' ; AFF =AF ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUX_IMPOSE') ; FLUIMPC= EXCO MOCOMP FLUIMP 'FLUX' ; SMTR = SMTR ET FLUIMPC ; 'FINSI' ; TP1 = 'RESO' AFF SMTR ; TP2 = 'EXCO' TP1 'TH' 'TH' ; CONC0 = 'NOMC' 'SCAL' TP2 ; CONC1 = 'NOMC' 'SCAL' TFHYB ; CONC2 = TETA *CONC0 + ((1.D0-TETA )*CONC1) ; CONC3 = (-1.D0) * CONC2 * QFACE ; TERSC2 = 'DIVU' MODHYB CONC3 MCHYB ; TERSC2 = 'NOMC' 'SOUR' TERSC2 ; TERSCE = TSOUR + TERSC2 ; CHA2 = 'HYBP' MODHYB MASHYB TP2 TAB TERSCE ; CONC= NOMC MOCOMP TP2 ; CHA2= NOMC MOCOMP CHA2 ; TOTO= TOTO+CONC ; TNC = TNC + CHA2 ; FIN BLOC1 ; TAQU= TOTO ; TAQU0=TAQU ; FINSI ; * * * --------------------------- * Transport des réactifs * --------------------------- * AAS1= BMTD MODHYB MASHYB (COEF1*TNC) ; ABS1= BMTD MODHYB MASHYB (ALFA*SOURC) ; ACS1= BMTD MODHYB MASHYB ( COEF2 * CAQU0) ; ADS1=DMMU MODHYB MASHYB QFACE TAQU0 ; AES1= BMTD MODHYB MASHYB (COEF3*ADS1) ; AS1 = ACS1 - ABS1 - AAS1 - AES1 ; AT1=(COEF1*TNC) - (ALFA*(1.-TETA)*PETID*CAQU0) +(COEF3*ADS1) ; AT1=AT1+ (ALFA * SOURC ) ; CFION2=CFIONI; CLOGC2=CLOGC ; CAQU2=CAQU ; 'SI' ( 'EXISTE' TRANSI 'CLIM' ) ; CCLIM2=CCLIM ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TEMPE' ) ; TEMPERA2=TEMPERAT ; 'FINSI' ; CFIXE= CFIX0 ; CFIX2=CFIXE ; TAQU = TAQU0 ; * ------------- * Couplage * ------------- ITECO= 0 ; REPETER BLOC2 ITERC ; ITECO= ITECO+ 1 ; AS2 = BMTD MODHYB MASHYB ( COEF4 * CFIXE) ; AS = AS1 +AS2 ; ABT2= COEF5*CFIXE ; * * * Résolution composante par composante * TNC0=TNC ; REPETER BLOC4 NBREA ; MOCOMP= EXTR NOMREAC &BLOC4 ; * LIST MOCOMP ; * CONC0= EXCO MOCOMP TAQU MOCOMP ; TAQU = TAQU - CONC0 ; ASI = EXCO MOCOMP AS 'FLUX' ; 'SI' ('EXISTE' TRANSI 'BLOCAGE' ) ; CLIAB= EXCO MOCOMP CHAIMP 'H' ; EEBAS = 'DEPI' MATBLOC (NOMC CLIAB 'TH') ; AFF = AF 'ET' MATBLOC ; ASS = ASI ET EEBAS ; 'SINON' ; ASS = ASI ; AFF= AF ; 'FINSI' ; 'SI' ('EXISTE' TRANSI 'FLUX_IMPOSE' ) ; FLUIMPC=EXCO MOCOMP FLUIMP 'FLUX' ; ASS = ASS ET FLUIMPC ; 'FINSI' ; CONC1= 'RESOU' AFF ASS ; CONC0= EXCO CONC1 'TH' MOCOMP ; TAQU = TAQU + CONC0 ; LAT1=EXCOM MOCOMP AT1 MOCOMP ; EABT2=EXCO MOCOMP ABT2 MOCOMP ; AAT2= DMMU MODHYB MASHYB QFACE CONC0 ; AT2= EABT2 + (ALFA*TETA*AAT2 ); TNL=EXCO MOCOMP TNC MOCOMP ; TNC=TNC -TNL ; TNC= TNC +AT2 +LAT1 ; FIN BLOC4 ; * * Prise en compte de la décroissance * 'SI' ( 'EXISTE' TRANSI 'DECROISSANCE') ; * mess ' avant decroissance ' ; * list tnc ; TNDEC=(TETDEC*TNC)+((1.-TETDEC)*TNC1) ; TNDEC= EXCO TNDEC LISMPERE LISMPERE ; TTPERE= LAMP*TNDEC LISMPERE LISMPERE LISMPERE ; TTFILS=NOMC TTPERE LISMPERE LISMFILS 'NATU' 'DISCRET' ; TNC=TNC+(DELTAT*(TTFILS-TTPERE)) ; * mess ' apres decroissance ' ; * list tnc ; 'FINSI' ; * * Convergence sur TNC * * NBCOMP nombre de composantes de CTOT DIFTN=ABS(TNC-TNC0) ; EPSTN0=EPSS*((ABS TNC )+(MASQ TNC EGALE 0. ) ) ; MAMA0= MASQ DIFTN SUPERIEUR 'SOMME' EPSTN0 ; * MESS 'mama0 ' ; LIST MAMA0 ; SI ( MAMA0 EGA 0 ) ; MESS ' on a convergé ' ; QUITTER BLOC2 ; FINSI ; EPSTN=EPSS*0.001*((ABS TNC )+(MASQ TNC EGALE 0. ) ) ; MAMA= MASQ DIFTN SUPERIEUR EPSTN ; II=1 ; MOCOMP= EXTR TT1 II ; BB= EXCO MOCOMP MAMA ; NBC1= NBCOMP-1 ; SI ( NBC1 NEG 0 ) ; REPETER BLOC3 NBC1 ; II=II+1 ; MOCOMP= EXTR TT1 II ; CC= EXCO MOCOMP MAMA ; BB=BB+CC ; FIN BLOC3 ; FINSI ; DOMERR= BB POIN SUPERIEUR 0. ; * OPTION DONN 5 ; CFION2= REDU DOMERR CFIONI ; CLOGC2= REDU DOMERR CLOGC ; CAQU2= REDU DOMERR CAQU ; CFIX2= REDU DOMERR CFIXE ; TTNC= REDU DOMERR TNC ; TBPAR2.FIONI= CFION2 ; TBPAR2.LOGC= CLOGC2 ; TBPAR2.TOT= TTNC ; 'SI' ( 'EXISTE' TRANSI 'CLIM' ) ; CCLIM2= REDU DOMERR CCLIM ; TBPAR2.CLIM= CCLIM2 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TEMPE' ) ; TEMPERA2= REDU DOMERR TEMPERAT ; TBPAR2.'TEMPE'= TEMPERA2 ; 'FINSI' ; 'SI' ( ICTY4 'EGA' 1 ) ; CPPP = REDU DOMERR CNTY4 ; TBPAR2.'NTY4'= CPPP ; 'FINSI' ; * on va calculer chimi2 sur un sous maillage et on garde dans CCAQU * ce qui ne bougera pas CCFIXE= CFIXE -CFIX2 ; CCAQU= CAQU -CAQU2 ; CCLOGC= CLOGC -CLOGC2 ; * * TB3= CHI2 TB1 TBPAR2 TBPARM ; * * CAQU= CCAQU + TB3.AQUE ; CFIXE= CCFIXE + TB3.FIXE ; CLOGC= CCLOGC+TB3.LOGC ; 'SI' ( 'EXISTE' TRANSI 'PREC' ) ; CPPP='REDU' DOMERR CPRECIP ; CPRECIP= CPRECIP -CPPP + TB3.'PREC' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FION' ) ; CPPP='REDU' DOMERR CFIONI ; CFIONI= CFIONI - CPPP + TB3.'FION' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP6' ) ; CPPP='REDU' DOMERR CTYP6 ; CTYP6= CTYP6 - CPPP + TB3.'TYP6' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP5' ) ; CPPP='REDU' DOMERR CTYP5 ; CTYP5= CTYP5 -CPPP + TB3.'TYP5' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP3' ) ; CPPP='REDU' DOMERR CTYP3 ; CTYP3= CTYP3 -CPPP +TB3.'TYP3' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NTY4' ) ; CPPP='REDU' DOMERR CNTY4 ; CNTY4= CNTY4 -CPPP + TB3.'NTY4' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SURF' ) ; CPPP='REDU' DOMERR CSURF ; CSURF= CSURF -CPPP +TB3.'SURF' ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SOLU' ) ; CPPP='REDU' DOMERR CSOLU ; CSOLU= CSOLU -CPPP +TB3.'SOLU' ; 'FINSI' ; CAQU0=CAQU ; CFIX0= CFIXE ; * FIN BLOC2 ; * ------------ * CAQU0=CAQU ; CFIX0= CFIXE ; ITERCUM=ITERCUM+ ITECO ; MESS ' Iterations ' ITECO ITERCUM ; TAQU0=TAQU ; * Calcul du flux NPAFLUX= NPAFLUX+1 ; FLUPA= FLU01+('HDEB' MODHYB MASHYB CAQU TAQU QFACE ) ; 'OUBL' FLU01 ; SI( EXIS TB1 'IDEN' 'IMMO') ; NBIMMO=DIME TB1.IDEN.IMMO ; REPE BOUIMMO NBIMMO ; NUNU= EXTR( TB1.IDEN.IMMO) &BOUIMMO ; NNCH NOM2 NUNU = NOCOMCHI TB1 'NUMCOMP' NUNU ; FLU03= EXCO NOM2 FLUPA NOM2 ; FLUPA = FLUPA- FLU03 ; FIN BOUIMMO ; FINSI ; FLU01= FLUPA ; SI( NUSOR 'EGA' &BOUTMP ) ; ISOR2=ISOR0+ISOR ; TRANSI. 'TEMPS' . ISOR2 = TMPS ; TRANSI.TOT . ISOR2 = TNC ; TRANSI.AQUE . ISOR2 = CAQU ; TRANSI.FIXE . ISOR2 = CFIXE; TRANSI.'TAQU' . ISOR2 = TAQU; TRANSI.'LOGC' . ISOR2 = CLOGC ; TRANSI . 'FLUX' . ISOR2 = FLUPA / NPAFLUX ; * TRANSI . 'FLU2' . ISOR2 = FLU2 ; 'SI' ( 'EXISTE' TRANSI 'PREC' ) ; TRANSI.'PREC' . ISOR2 = CPRECIP ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'FION' ) ; TRANSI.'FION' . ISOR2 = CFIONI ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP6' ) ; TRANSI.'TYP6' . ISOR2 = CTYP6 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP5' ) ; TRANSI.'TYP5' . ISOR2 = CTYP5 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'TYP3' ) ; TRANSI.'TYP3' . ISOR2 = CTYP3 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'NTY4' ) ; TRANSI.'NTY4' . ISOR2 = CNTY4 ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SURF' ) ; TRANSI.'SURF' . ISOR2 = CSURF ; 'FINSI' ; 'SI' ( 'EXISTE' TRANSI 'SOLU' ) ; TRANSI.'SOLU' . ISOR2 =CSOLU ; 'FINSI' ; FLU01=FLU00 ; NPAFLUX= 0 ; ISOR=ISOR+1 ; 'FINSI' ; MENAGE ; FIN BOUTMP ; * 'FINP' TRANSI ;