* fichier : murh.dgibi ************************************************************************ ************************************************************************ * Thermique * Conduction dans un mur avec source et échange thermique. * Comparaison à la solution analytique en régime permanent. * Teste les opérateurs LAPN ECHI FIMP DFDT * La source volumique est imposée avec FIMP * * |y phi=0 * -------------------- * | | * | | phi=h(T-T0) *Tw | | * | | * -------------------->x * O phi=0 L * * Solution analytique: * * T(x)=Tw - q/2(X**2+LX)/lambda + (Tl-Tw)X/L * * avec Tl = (lambdaTw + LhT0)/(lambda+LH) + q/2 L**2/(lambda+LH) * * *$$$$ EXEC * EXEC PROCEDUR MAGN 03/03/31 21:15:04 4631 *X EXEC (Procedure) * Procedure EXEC * * Objet : Execute un algorithme décrit dans une table RV * de type EQEX. * Cette table est créée par l'opérateur EQEX * * Syntaxe : EXEC RV ; * *********************************************************************** * VERSION : ???? * HISTORIQUE : 20/12/99: gounand * Rajout de la gestion de la matrice servant à l'assemblage * (rv . 'METHINV' . 'MATASS') * * HISTORIQUE : 10/11/00: magnaud * Reecriture de exec pour tirer parti du // (operateur ASSI et RESO) * Pour l'instant cette procedure est testee experimentalement dans * la directive EQUA de EXEC * * HISTORIQUE : 04/04/01: magnaud * Calcul et impression tout les FIDT cycles de la norme Linf du residu * * HISTORIQUE : * HISTORIQUE : ************************************************************************ * DISCPRES = (d'apres KMIC) * KPRE=3 pression P0 KPRE=4 pression P1 KPRE=2 cas macro 1ère génération * KPRE=5 pression MSOMMET ************************************************************************ 'ARGUMENT' rv*'TABLE ' ; * Logique pilotant le recalcul de la matrice de pression CALPRE=FAUX ; Si ('EXIST' rv 'CALPRE') ; vertytab rv 'CALPRE' 'LOGIQUE' ; CALPRE=rv.'CALPRE' ; Finsi ; Si(NON('EXIST' rv 'XEQUA')); rv.'XEQUA'= FAUX ; Finsi ; ******************************************************************************** ******************************************************************************** ****** Directive EQUA ********************************************************** ******************************************************************************** ******************************************************************************** Si (rv.'XEQUA'); IMPKRES=0 ; Si ('EXIST' rv 'NUMASSI'); numassi=rv.'NUMASSI'; Sinon; numassi=1 ; Finsi; Xdfdt = FAUX ; ITMA=rv . 'ITMA'; 'SI' ('<EG' ITMA 1) ; ITMA=1 ; 'FINSI' ; NITER=rv . 'NITER'; 'SI' ('<EG' NITER 1) ; NITER=1 ; 'FINSI' ; OMEGA=rv . 'OMEGA'; 'SI' ('<EG' NITER 1) ; OMEGA=1.; 'FINSI' ; NUPDT=rv.'PASDETPS'.'NUPASDT'; 'FINSI' ; 'FINSI' ; mess 'Algorithme de Projection'; 'FINSI' ; mess 'Algorithme de recherche d un permanent '; 'FINSI' ; 'REPETER' BCLTPS ITMA ; testp1 = non ( exist rv 'MATC') ; sinon ; testp1 = FAUX ; finsi ; 'REPETER' BCLINT NITER ; Finsi ; Si (rv.'XRIG'); MRIG='RGDT '; Sinon ; Finsi ; NRES=0 ; ***************************************************** * ._._. \|/ * ._._. CALCUL MATRICES ELEMENTAIRES * ._._. /|\ ***************************************************** nomper = 'EXTRAIRE' &bloc2 (rv . 'LISTOPER') ; * mess ' Début BLOC2 nomper=' nomper ; td=rv.notable ; tdk=td.'KOPT' ; iarg= rv.notable.'IARG' ; Si ('>EG' iarg 1 ); arg1=rv.'INCO'.(td.'ARG1') ; Sinon ; arg1=(td.'ARG1') ; Finsi ; Finsi ; Si ('>EG' iarg 2 ); arg2=rv.'INCO'.(td.'ARG2') ; Sinon ; arg2=(td.'ARG2') ; Finsi ; Finsi ; Si ('>EG' iarg 3 ); arg3=rv.'INCO'.(td.'ARG3') ; Sinon ; arg3=(td.'ARG3') ; Finsi ; Finsi ; Si ('>EG' iarg 4 ); arg4=rv.'INCO'.(td.'ARG4') ; Sinon ; arg4=(td.'ARG4') ; Finsi ; Finsi ; * Traitement du cas transitoire XBDF2 = FAUX ; Finsi ; Xdfdt = VRAI ; DT=(rv.'DELTAT') ; DT=rv.'INCO'.DT ; Finsi ; SCHE = rv.'SCHEMAT'; Si (EGA SCHE 'SEMI'); BETAT=(rv.'Betat') ; Finsi ; Si (EGA SCHE 'BDF2'); XBDF2 = VRAI ; Finsi ; Finsi ; Si ('>EG' nbic 1 ); inc1=rv.'INCO'.(rv.a); Si (XBDF2) ; imc1=rv.'INCO'.(rv.a); Finsi; Finsi ; Si ('>EG' nbic 2 ); inc2=rv.'INCO'.(rv.a); Si (XBDF2) ; imc2=rv.'INCO'.(rv.a); Finsi; Finsi ; DCEN='????' ; Si(EGA (tdk.'MTRMASS') 2 );MM='MMDIAGO';Finsi; Si(EGA (tdk.'IDCEN') 1 );DCEN='CENTREE';Finsi; Si(EGA (tdk.'IDCEN') 2 );DCEN='SUPGDC ';Finsi; Si(EGA (tdk.'IDCEN') 3 );DCEN='SUPG ';Finsi; Si(EGA (tdk.'IKOMP') 1 );MC='CONS';Finsi; INEFMD= tdk.'INEFMD' ; Finsi ; * temp place ; * mess ' Avant ' nomper ' tdz ' tdz ' DT=' DT ' XTRA=' ; list xtra ; * mess SCHE ; mess BETAT; msi mai =assi numassi nomper tdz (td.'DOMZ') (td.'LISTINCO') (td.'TYPEINCO') (rv.'TYPPRESS') INEFMD MRIG MM 'CONS' 'STABP' (tdk.'STABP') 'CMD' (tdk.'CMD') DCEN XTRA DT SCHE BETAT 'INCO' inc1 imc1 inc2 imc2 (td.'IARG') arg1 arg2 arg3 arg4 ; * temp place ; * mess ' Apres ' nomper; 'ITER' bloc2 ; Finsi ; Finsi ; * Si ((rv.'PROJ') et ('EGA' nomper 'TOIMP ')); * list msi ; * Finsi ; DT=(rv.'DELTAT') ; DT=rv.'INCO'.DT ; Finsi ; SCHE = rv.'SCHEMAT'; Si (EGA SCHE 'SEMI'); BETAT=(rv.'Betat') ; Finsi ; Si (EGA SCHE 'BDF2'); XBDF2 = VRAI ; Finsi ; * mess ' Appel DFDT DT=' DT ' XTRA=' ; list xtra ; (td.'DOMZ') (td.'LISTINCO') (td.'TYPEINCO') (rv.'TYPPRESS') INEFMD MRIG MM 'CONS' 'CMD' (tdk.'CMD') DCEN XTRA DT SCHE BETAT 'INCO' inc1 imc1 inc2 imc2 1 arg1 ; oubli msm; Finsi ; rv.'TVNP'=FAUX; rv.'TVNPC'=FAUX; Si (ega (rv.'TYPPRESS') 'MSOMMET'); rv.'TVNPC'=VRAI; mvnpc=mai ; svnpc=msi ; Sinon ; rv.'TVNP'=VRAI ; Finsi ; Sinon ; Finsi ; 'FIN' bloc2 ; *mess 'Fin Bloc2 ' ; Mess ' Incoherence : Algorithme Transitoire ' ' et pas d increment en temps'; 'FINSI' ; NRES=NRES+1; *mess 'NRES=' NRES; Si (NON('EXIST' rv TABRES)); rv.TABRES=TABLE ; Finsi ; rv.TABRES=TABLE ; Finsi ; rv.TABRES.'mau' =mau ; rv.TABRES.'sf' =sf ; rv.TABRES.'clim'=rv.'CLIM' ; rv.TABRES.'METHINV'=rv.'METHINV' ; ***************************************************** * __ |\ * \ /_/o | | \|/ * \=> \_\/ \| --O-- PROJECTION * /|\ /\ /|\ *************/*|*\*********************************** SCHE = rv.'SCHEMAT'; 'SI' (testp1) ; Finsi ; * Diag : Matrice diagonale de base ('SCAL') * Digv : Matrice diagonale de base ('1U' '2U' '3U') * Digvl: Matrice diagonale contenant les conditions aux limites IDiag = 'INVERSE' Digv ; IDigvl= 'INVERSE' Digvl ; * * Calcul matrices MD-1 * Si ('EGA' SCHE 'BDF2'); MDM1=MDM1 * (((rv.'DELTAT')*2.)/3.) ; Sinon ; MDM1=MDM1 * (rv.'DELTAT') ; Finsi ; * * Calcul matrices C * * msp mac =assi numassi 'KBBT' * (rv.'MODELE') (rv.'LISTINCO') (rv.'TYPEINCO') (rv.'TYPPRESS') * MRIG (1) (1.) ; Si ('EGA' (rv.'TYPPRESS') 'MSOMMET'); mess ' Cas des pressions continues' ; MRIG 'LINE' (1) (1.) ; Sinon ; mess ' Cas des pressions discontinues' ; Si (rv.'TVNPC'); mac=mac et mvnpc; Finsi; rv . 'MATC' = mac ; * list mac 4 ; Si (rv.'TVNP') ; rv . 'MBTR' = mar ; Dunit=Idigv; mcr= mcr et crt et ctr et rrt ; Finsi ; * list mac 3 ;list IDigvl; * mess 'APRES CMCT' ; list matpr 3 ; matpr = matpc et matpr et mcr ; Finsi ; rv.'IDigvl'= IDigvl ; rv.'MATC' = mac ; rv.'MDM1' = MDM1 ; 'FINSI' ; IDigvl= rv.'IDigvl'; mac = rv.'MATC' ; MDM1 = rv.'MDM1' ; 'SI' ('EXIST' (rv.'INCO') 'PINM1') ; ** ** mess ' t n-1' ; ** mess 'Calcul de C P' ; ** pinm1= rv.'INCO'.'PINM1'; * cpi2=(extr rv.'LISTINCO' 2) ; * pinm1= nomc (rv.'INCO'.(rv.'INC2')) cpi2; Si (rv.'TVNP') ; cpre = cpre et cxre ; Finsi ; Si ('EGA' (rv.'TYPPRESS') 'MSOMMET'); Sinon ; Finsi ; oublier cpre ; rv.'INCO'.'GRADPRES' = gradpres ; sf = sf - (rv.'INCO'.'GRADPRES') ; rv.'TABRES1'.'sf'=sf ; 'FINSI' ; rv.'TABRES1'.'clim'=clim ; ********** FIN Traitement PRESSION ************************ * mess ' FIN Traitement PRESSION' ; 'FINSI' ; ******************************************************* ***************************************************** * \___\ / * \/ RESOLUTION * \ \|/ *************************--O--*********************** Si (rv.XRIG); Finsi ; Repeter Bclres NRES ; * mess ' Resolution ' NRES ; MTIV = TABRES.'METHINV'; mau = TABRES.'mau' ; sf = TABRES.'sf' ; clim = TABRES.'clim'; *........................................................ Si (rv.'XRIG') ; mau = mau et rclim ; sf = sf et dclim ; * list mau; list sf ; Sinon ; MATASS= mau ; TYRENU=MTIV.'TYRENU';PCMLAG=MTIV.'PCMLAG';KTYPI =MTIV.'TYPINV'; Si (('>EG' KTYPI 2) ET ('<EG' KTYPI 5)); DI2=MTIV.'NITMAX';DI3=MTIV.'RESID';DI4=MTIV.'BCGSBTOL'; Si ('EGA' KTYPI 5);DI5=MTIV.'GMRESTRT';Finsi ; MAPREC= mau ; KPREC=MTIV.'PRECOND'; Si ('EGA' KPREC 4);PR3=MTIV.'MILURELX';Finsi ; Si (('EGA' KPREC 5) OU ('EGA' KPREC 6)); PR4=MTIV.'ILUTLFIL';PR5=MTIV.'ILUTDTOL'; Finsi ; Finsi ; * list mau 3 ; * list sf ; 'TYPI' MTIV KTYPI 'CLIM' clim 'SMBR' sf 'IMPR' IMPKRES MATASS TYRENU PCMLAG XINIT DI2 DI3 DI4 DI5 MAPREC KPREC PR3 PR4 PR5; Finsi; *........................................................ Fin Bclres ; rv.inco.'Res'=res ; ** * mess 'RESOLUTION : ETAPE DE PROJECTION ' ; ** _n ** C U Si (rv.'TVNP'); cun = cun et cxn ; Finsi ; MTIV=rv.'METHINV2' ; *........................................................ Si (rv.'XRIG') ; matpr = matpr et rclim ; cun = cun et dclim ; Sinon ; MATASS= matpr ; TYRENU=MTIV.'TYRENU';PCMLAG=MTIV.'PCMLAG';KTYPI =MTIV.'TYPINV'; Si (('>EG' KTYPI 2) ET ('<EG' KTYPI 5)); DI2=MTIV.'NITMAX';DI3=MTIV.'RESID';DI4=MTIV.'BCGSBTOL'; Si ('EGA' KTYPI 5);DI5=MTIV.'GMRESTRT';Finsi ; MAPREC= matpr; KPREC=MTIV.'PRECOND'; Si ('EGA' KPREC 4);PR3=MTIV.'MILURELX';Finsi ; Si (('EGA' KPREC 5) OU ('EGA' KPREC 6)); PR4=MTIV.'ILUTLFIL';PR5=MTIV.'ILUTDTOL'; Finsi ; Finsi ; 'TYPI' MTIV KTYPI 'CLIM' clim 'SMBR' cun 'IMPR' IMPKRES MATASS TYRENU PCMLAG XINIT DI2 DI3 DI4 DI5 MAPREC KPREC PR3 PR4 PR5; Finsi; *........................................................ Si(rv.'TVNP') ; ctl = ctl + cxl ; Finsi ; oublier ctl ; res = res - (au*(rv.'DELTAT')) ; 'FINSI' ; *************************--O--*********************** * \ /|\ * /\____ RELAXATION * / \ \ ***************************************************** omega=rv.'OMEGA'; NUPDT=rv.'PASDETPS'.'NUPASDT'; Si('EXIST' rv.'PASDETPS' 'NUPDT'); Sinon ; Finsi ; 'FINSI' ; Repeter Relax nbic; Si (XBDF2) ; rv.'INCO'.(rv.b)=rv.'INCO'.(rv.a); * mess ' On fait ' (rv.a) ' -> ' (rv.b) ; Finsi ; * mess ' Composante ' nc ' Type inco ' ty ; Finsi ; Finsi ; Si('EGA' nbc 0); Si('EGA' NUPDT 1); ' calculees' ; list nc1 ; Finsi ; Sinon ; eri=ri - rv.'INCO'.(rv.a); ELI=(LOG (ELI + 1.0E-10))/(LOG 10.); Si('EXIST' rv.'PASDETPS' ERA); rv.'PASDETPS'.ERA=rv.'PASDETPS'.ERA et ER ; Sinon ; rv.'PASDETPS'.ERA= ER ; Finsi ; 'FINSI' ; rv.'INCO'.(rv.a)=(omega*ri) + ((1. - omega)*rv.'INCO'.(rv.a)) ; Finsi ; Fin Relax ; MESS LRA ; 'FINSI' ; Fin BCLINT ; ***** Avancement en temps rv.inco.'Resnm'=res ; rv.'PASDETPS'.'NUPASDT'=rv.'PASDETPS'.'NUPASDT' + 1 ; * Algorithme de projection P(n+1) = P(n) + (sl / dt) 'SI' ('EXIST' (rv.'INCO') 'PINM1') ; * PNM1=(-1.)*rv.'INCO'.'PRESSION' ; PNM1=(-1.)*rv.'INCO'.(rv.'INC2') ; si (XBDF2) ; PN=PNM1 + (1.5*sl) ; sinon ; PN=PNM1 + (sl) ; finsi ; * rv.'INCO'.'PRESSION'=(-1.)*PN ; rv.'INCO'.(rv.'INC2')=(-1.)*PN ; rv.'INCO'.'PINM1'=PN ; 'SINON' ; * rv.'INCO'.'PRESSION' = (-1.)*(sl) ; rv.'INCO'.(rv.'INC2')= (-1.)*(sl) ; rv.'INCO'.'PINM1'=(2.*sl); 'FINSI' ; 'OUBLIER' sl ; 'FINSI' ; ***** Avancement en temps FIN Fin BCLTPS ; Finsi ; ******************************************************************************** ******************************************************************************** ****** Fin directive EQUA ****************************************************** ******************************************************************************** ******************************************************************************** 'SI' ('EGA' (rv . 'NAVISTOK') 0) ; EXAC rv ; 'FINSI' ; *******PROJ************************************************************* *******PROJ Trois possibilités ***************************************** *******PROJ TMDM1 (vrai)_> Correction Gresho NON *******PROJ TGRAD (vrai)-> Formulation Gradient NON *******PROJ TPNM2 (vrai)-> elimination end of step velocity OUI *******PROJ TMDM1 = VRAI TGRAD = FAUX TPNM2 = FAUX ancien algo TYPROJ='VPI1' ; 'SI' ('EXIST' RV 'TYPROJ') ; TYPROJ=RV.'TYPROJ' ; Mess ' ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ' ; Mess ' ' ; Mess 'Les méthodes de projection autorisées sont :'; erreur 21 ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' TYPROJ 'PSCT') ; TGRAD = FAUX ; TMDM1 = FAUX ; TPNM2 = FAUX ; 'FINSI' ; 'SI' ('EGA' TYPROJ 'VPI1') ; TGRAD = FAUX ; TMDM1 = VRAI ; TPNM2 = FAUX ; 'FINSI' ; 'SI' ('EGA' TYPROJ 'VPI2') ; TGRAD = FAUX ; TMDM1 = FAUX ; TPNM2 = VRAI ; 'FINSI' ; *******PROJ Trois possibilités ***************************************** *******PROJ************************************************************* nomvi=rv . 'NOMVI' ; vnul=0.D0 0.D0 ; vuni=1.D0 1.D0 ; 'SINON' ; vnul=0.D0 0.D0 0.D0 ; vuni=1.D0 1.D0 1.D0 ; 'FINSI' ; 'SI' ('NON' ('EXISTE' rv 'OMEGA')) ; omeg=1.D0 ; 'SINON' ; omeg=rv . 'OMEGA' ; 'FINSI' ; testpr ='EXISTE' rv 'PRESSION' ; testran=testpr 'ET' ('EXISTE' rv 'CO') ; si testpr ; rvp = rv.'PRESSION' ; finsi ; 'SI' (rv.'IMPR' >EG 1) ; si testpr ; Finsi ; si testprj; mess 'Algorithme de Projection'; finsi ; si ( non (testpr ou testprj)) ; finsi ; 'FINSI' ; 'FINSI' ; ITMA=(rv . 'ITMA') ; IMPTCRR=0 ; IMPKRES=0 ; 'SI' ('<EG' ITMA 1) ; ITMA=1 ; IMPTCRR=1 ; 'FINSI' ; Si (testprj ) ; IMPTCRR=1 ; finsi ; Si ( non (testpr ou testprj)) ; IMPTCRR=1 ; finsi ; * Gestion de la matrice de préconditionnement * * calass : doit-on recalculer l'assemblage * calprec : doit-on recalculer le préconditionneur * calassp : idem pour la matrice de pression * calprecp: idem pour la matrice de pression * fcprect : fréquence de recalcul du préc. en fn du pas de temps * fcpreci : fréquence de recalcul du préc. dans la boucle * d'itérations internes pour les non-linéarités * resmn : le résidu au pas de temps ou à l'itération interne précédente * calprec = VRAI ; fcprect = rv. 'METHINV' . 'FCPRECT' ; fcpreci = rv. 'METHINV' . 'FCPRECI' ; 'SI'(exist rv 'resmn');resmn=rv.'resmn' ; finsi ; 'SI'(non (exist rv 'calprec'));rv.'calprec'=VRAI;finsi; 'SI'(non (exist rv 'calass' ));rv.'calass' =VRAI;calass =VRAI;finsi; 'REPETER' bloc1 ITMA ; * mess ' DEBUT BLOC1 '; testp1 = FAUX ; si (testpr ou testprj) ; Si CALPRE ; testp1=VRAI ; Finsi ; Si (non (exist rvp 'MATC')) ; testp1=VRAI ; Finsi ; finsi ; rv.'calprec' = VRAI ; 'FINSI' ; 'REPETER' bloci (rv . 'NITER') ; rv.'calprec' = VRAI ; 'FINSI' ; 'SI' (testprj) ; calprecp=VRAI ; calassp =VRAI ; si (exist rvp 'calprecp' ) ; calprecp=rvp.'calprecp'; maprec1=rvp.'maprec1' ;finsi ; si (exist rvp 'calassp' ) ; calassp=rvp.'calassp'; matass1=rvp.'matass1' ;finsi ; fcprectp = rvp . 'METHINV' . 'FCPRECT' ; calprecp= VRAI ; 'FINSI' ; 'FINSI' ; mdfdt = 0 ; nomper = 'EXTRAIRE' &bloc2 (rv . 'LISTOPER') ; * mess 'Operateur Bloc2 mdfdt ? ' nomper ; mdfdt = mdfdt + rv. notable . 'KOPT' . 'KFORM' ; ISCHT= (rv . notable.kopt.'ISCHT') ; msi mai=('TEXTE' nomper) (rv . notable) ; mat = mat 'ET' mai ; st = st 'ET' msi ; sinon ; * mess ' 1OPER =' nomper; msi mai=('TEXTE' nomper) (rv . notable) ; mau = mau 'ET' mai ; sf = sf 'ET' msi ; finsi ; 'FIN' bloc2 ; s2 = sf et st ; ma1 = mau 'ET' mat ; ********** Traitement PRESSION **************************** *mess 'Traitement PRESSION'; 'SI' (exist rv 'rvpd') ; rvpd = rv.'rvpd' ; IDigv=rv.'IDigv'; Digv=rv.'Digv'; 'FINSI' ; */1 CALCUL de CMCT pour PRESSION 'SI' (testpr et testp1) ; rvpd = (rvp.'DOMAINE') ; sinon ; finsi ; 'SI' ('EXISTE' rv 'CLIM') ; rvp . 'CLIM' = rv . 'CLIM' ; 'FINSI' ; IDigv= 'INVERSE' digv ; 'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ; rvp . 'DIAGV' = digv ; 'FINSI' ; rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL' 'CENTRE' 0.D0 ; 'SOMMET' vnul ; rv.'rvpd'=rvpd; rv.'IDigv'=IDigv; rv.'Digv'=Digv; 'FINSI' ; */3 CALCUL de CMCT pour PROJ 'SI' (testprj et testp1) ; idfdt = 0 ; nomper = 'EXTRAIRE' &blocj (rv . 'LISTOPER') ; *? mess 'Operateur ' nomper ; idfdt=idfdt + 1 ; rvpd=rv. notable . 'DOMZ'; finsi ; 'FIN' blocj ; sinon ; finsi ; * Matrice diagonale ne contenant pas les conditions aux limites : Diag IDigv= 'INVERSE' digv ; 'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ; rvp . 'DIAGV' = digv ; 'FINSI' ; rvp.'INCO'=rv.'INCO' ; nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ; rvp . notable . 'KOPT' . 'IKOMP' = 1 ; finsi ; msi mai=('TEXTE' nomper) (rvp . notable) ; *******PROJ************************************************************* *******PROJ TGRAD calcul maig (Formulation en Gradient) DEBUT*** ******* Si TGRAD ; rvp . notable . 'KOPT' . 'IKOMP' = 0 ; msig maig=('TEXTE' nomper) (rvp . notable) ; Finsi ; *******PROJ -> MATG FIN***** *******PROJ///////////////////////////////////////////////////////////// TVNP=FAUX; TVNPC=FAUX; TVNP=VRAI ; mar = mar 'ET' mai ; sr = sr 'ET' msi ; Finsi ; * mess 'nomper=' nomper (rvp.'DISCPRES'); TVNPC=VRAI; mvnpc=mvnpc et mai ; svnpc=svnpc et msi ; Finsi ; map = map 'ET' mai ; sp = sp 'ET' msi ; Finsi ; 'FIN' blocpj ; *******PROJ************************************************************* *******PROJ TGRAD (vrai Formulation en Gradient) CMCTSPLT DEBUT*** ******* Si TGRAD ; Finsi ; *******PROJ -> MATG FIN***** *******PROJ///////////////////////////////////////////////////////////// Si TVNPC; mac=mac et mvnpc; Finsi; rvp . 'MATC' = mac ; *******PROJ************************************************************* *******PROJ TGRAD (vrai Formulation en Gradient) -> MATG DEBUT*** ******* SI TGRAD ; rvp . 'MATG' = macg; FINSI ; *******PROJ -> MATG FIN***** *******PROJ///////////////////////////////////////////////////////////// Si TVNP ; rvp . 'MBTR' = mar ; Dunit=Idigv; mcr= mcr et crt et ctr et rrt ; Finsi ; rvp . 'TVNP' = TVNP ; Si( ega (rvp.'DISCPRES') 5 ) ; mess ' Cas des pressions continues' ; matpr = matpc et mcr ; Sinon ; mess ' Cas des pressions discontinues' ; matpr = matpc et matpr et mcr ; Finsi ; rv.'rvpd'=rvpd; rv.'IDigv'=IDigv; rv.'Digv'=Digv; 'FINSI' ; ************* ** Fin calcul CMCT pour testp1 et testprj ****************************************** * t *************** Calcul de C p Pression 'SI' testpr ; dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ; rvp . 'DELTAT' = dt ; f = 'COPIER' s2 ; u = rv . 'INCO' . nomvi ; 'SI' ('EXISTE' rv 'CLIM') ; dti = -1.D0 '/' dt ; 'CLIM' (rv . 'CLIM') 3 ; dm1f= dti * dm1f ; 'SINON' ; 'FINSI' ; 'BETA' (rvp . 'KBETA') (rvp . 'BETA') 'PIMP' (rvp . 'KPIMP') (rvp . 'PIMP') ; (rvp . 'PRESSION') lc ; s2 = s2 + (rvp . 'GRADP') ; rv.'INCO'.'PRESSION'=rvp . 'PRESSION'; 'FINSI' ; *******PROJ************************************************************* *******PROJ MDM1 Ici on calcule M D-1 pour ensuite calculer Ctp DEBUT*** ******* *******PROJ on ne calcule M D-1 que si (rv 'MDM1') n'existe pas DEBUT*** ******* *******PROJ ou CALPRE VRAI DEBUT*** ******* 'SI' testprj ; dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ; rvp . 'DELTAT' = dt ; ** Produit M D-1 'SI' TMDM1 ; 'SI' (('EXIST' rv 'MDM1') et (NON CALPRE)) ; MDM1=rv.'MDM1' ; 'SINON' ; nomper1 = 'EXTRAIRE' &blocpj1 (rvp . 'LISTOPER') ; * mess 'Operateur ' nomper1 ; nomper2 = 'EXTRAIRE' &blocpj2 (rv . 'LISTOPER') ; * mess 'Operateur ' nomper2 ; si ('EGA' nomiv2 nomiv1) ; domzp=rv . notable2 . 'DOMZ' ; matn = matn et mai ; finsi ; finsi ; 'FIN' blocpj2 ; finsi ; 'FIN' blocpj1 ; Si(EGA ISCHT 1); MDM1=MDM1 * ((dt*2.)/3.) ; Sinon ; MDM1=MDM1 * dt ; Finsi ; rv.'MDM1' = MDM1 ; *******PROJ MDM1 -> rv.'MDM1' FIN***** *******PROJ///////////////////////////////////////////////////////////// 'FINSI'; 'FINSI'; *******PROJ************************************************************* *******PROJ t n-1 DEBUT*** ******* *******PROJ Calcul de C P DEBUT*** ******* TVNP=rvp.'TVNP' ; 'SI' ('EXIST' (rv.'INCO') 'PRESSION') ; PPI = rv.'INCO'.'PRESSION' ; 'SI' ('EXIST' (rv.'INCO') 'PNM2') ; * TPNM2 elimination of end of step velocity (2 Pn - Pn-1) PPI = 2*(PPI) - rv.'INCO'.'PNM2' ; 'FINSI' ; *Formulation en u grad p Si (Exist rvp 'MATG'); *Formulation en p div u Sinon; Finsi ; Si TVNP ; cpre = cpre et cxre ; Finsi ; *******PROJ MDM1 Si TMDM1 ; * consistence selon (Gresho) Sinon ; * consistence selon (Guermond) gradpres = cpre ; Finsi ; oublier cpre ; *Formulation en u grad p Si (Exist rvp 'MATG'); s2 = sf - (rv.'INCO'.'GRADPRES') + st ; Sinon ; *Formulation en p div u s2 = sf + (rv.'INCO'.'GRADPRES') + st ; Finsi ; 'FINSI' ; *******PROJ t n-1 FIN***** *******PROJ MDM1 '*' C P -> rv.'INCO'.'GRADPRES' FIN***** *******PROJ t n-1 FIN***** *******PROJ si (p div u) -> S2 = F + C P + st FIN***** *******PROJ t n-1 FIN***** *******PROJ si (u grad p) -> S2 = F - C P + st FIN***** *******PROJ///////////////////////////////////////////////////////////// 'FINSI' ; ********** FIN Traitement PRESSION ************************ * mess ' FIN Traitement PRESSION' ; 'SI' ('EXISTE' rv 'CLIM') ; s1 = rv . 'CLIM' ; 'SINON' ; s1=' ' ; 'FINSI' ; rv . 'S2' = s2 ; ******************************************************************* * Résolution hors QDM méthode de projection 'SI'((NON testprj) ou (EGA mdfdt 0)); *mess '* Résolution hors QDM méthode de projection '; * mess ' ====================> calprec '; list calprec ; 'SI' rv.'calass' ; rv . 'METHINV' . 'MATASS' =ma1 ; rv.'calass'=FAUX ; 'FINSI' ; 'SI' rv.'calprec' ; rv . 'METHINV' . 'MAPREC' = ma1 ; rv.'calprec'=FAUX ; 'FINSI' ; rv . 'METHINV' . 'XINIT' = resmn ; 'CLIM' s1 'SMBR' s2 'IMPR' IMPKRES ; 'FINSI' ; 'SI' (testprj et (non(EGA mdfdt 0))); *******PROJ************************************************************* *******PROJ Résolution QDM DEBUT*** ******* *******PROJ (On éclate les résolutions) DEBUT*** ******* * Résolution QDM méthode de projection (On éclate les résolutions) *mess ' Résolution QDM méthode de projection'; * MEss ' NBCOM=' nbcom ; Si(NON(EXIST RV 'TABRES')); RV.'TABRES'=TABLE ; Finsi ; repeter Bclcom nbcom ; * Mess ' Composante : ' nmc ; 'SI' (rv.'calass' ou (NON ('EXIST' (RV.'TABRES') MATASSI))) ; rv . 'TABRES' . MATASSI = ma1i; rv.'calass'=FAUX ; 'FINSI' ; 'SI' (rv.'calprec' ou (NON ('EXIST' (RV.'TABRES') MAPRECI))); mess 'On recalcule le preconditionneur '; rv . 'TABRES' . MAPRECI = ma1i; rv.'calprec'=FAUX ; 'FINSI' ; rv . 'METHINV' . 'MATASS' = rv . 'TABRES' . MATASSI ; rv . 'METHINV' . 'MAPREC' = rv . 'TABRES' . MAPRECI ; rv . 'METHINV' . 'XINIT' = resmni ; 'CLIM' s1i 'SMBR' s2i 'IMPR' IMPKRES ; Fin Bclcom ; oubli ma1 ; *mess ' Fin Résolution QDM méthode de projection'; * Fin Résolution QDM méthode de projection *******PROJ Résolution QDM -> res FIN***** *******PROJ (On éclate les résolutions) FIN***** *******PROJ///////////////////////////////////////////////////////////// 'FINSI' ; 'SI' testprj ; *******PROJ************************************************************* *******PROJ ETAPE DE PROJECTION DEBUT*** ******* *******PROJ on calcul cun (alias c U tilde) DEBUT*** ******* * mess 'ETAPE DE PROJECTION ' ; * _n * C U Si TVNP ; cun = cun et cxn ; Finsi ; * mess ' On calcule les seconds membres de l équation de pression ' ; * mess ' s ils existent (opérateurs FIMP) ' ; nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ; * mess 'Seconds membres de l équation de pression Opérateur ' nomper ; msi mai=('TEXTE' nomper) (rvp . notable) ; cun = cun et msi ; finsi ; 'FIN' blocpj ; cun = cun * (-1./dt) ; * mess ' ====================> calprecp '; list calprecp ; 'SI' calassp; matass1=matpr ; rvp.'matass1'=matass1 ; 'FINSI' ; 'SI' calprecp ; 'SI' (RV.IMPR >EG 1) ; 'FINSI' ; maprec1 = matpr ; rvp.'maprec1'=maprec1 ; 'FINSI' ; rvp . 'METHINV' . 'MATASS' = matass1 ; rvp . 'METHINV' . 'MAPREC' = maprec1 ; rvp . 'METHINV' . 'XINIT' = resmn2 ; 'CLIM' (rvp . CLIM ) 'SMBR' cun 'IMPR' IMPKRES ; oublier cun ; oublier resmn2 ; resmn2 = sl ; Si TVNP ; ctl = ctl + cxl ; Finsi ; * elimination of end of step velocity (Si exist PNM2) (on ne corrige pas) 'SI'(NON(TPNM2)); 'SI' (NON ('EXIST' (rv.'INCO') 'PNM2')) ; res = res + (a*dt) ; 'FINSI' ; 'FINSI' ; oublier ctl ; *******PROJ -> (alias c U tilde) FIN***** *******PROJ -> sl (alias lambda) FIN***** *******PROJ -> on corrige u FIN***** *******PROJ///////////////////////////////////////////////////////////// 'FINSI' ; ***** Avancement en temps *? Si (testprj et ('EGA' mdfdt 0)) ; IMPTCRR=RV.'IMPR' ; finsi ; Si ('EGA' mdfdt 0) ; IMPTCRR=RV.'IMPR' ; finsi ; IMPKRES=0 ; * mess 'On passe dans TCRR ' ; 'OUBLIER' resmn ; resmn = res ; 'MENAGE' ; 'FIN' bloci ; irt=0 ; * mess ' ITMA= ' (rv . 'ITMA') ' mdfdt= ' mdfdt ; 'SI' ('EGA' (rv . 'ITMA') 0) ; * mess ' ON PASSE PLUS DS TCNM>>>>>>>>>>>>>>' ; 'SINON' ; * mess ' ON PASSE DS TCNM>>>>' (rv . 'ITMA') mdfdt; 'FINSI' ; ***** Avancement en temps algorithme de projection 'SI' (testprj) ; 'SI' calprecp; calprecp= FAUX ; 'SINON' ; 'SI' ('NON' calassp) ; 'OUBLIER' matpr ; 'FINSI' ; 'FINSI' ; calassp=FAUX ; rvp.'calassp'=calassp ; rvp.'calprecp'=calprecp ; 'FINSI' ; *******PROJ************************************************************* *******PROJ P(n+1) = P(n) + sl DEBUT*** ******* * Algorithme de projection P(n+1) = P(n) + sl 'SI' testprj ; 'SI' (NON ('EXIST' (rv.'INCO') 'PRESSION')); rv.'INCO'.'PRESSION' = sl; Si TPNM2 ; rv.'INCO'.'PNM2' = sl ; Finsi ; 'SINON' ; PNM1=rv.'INCO'.'PRESSION'; si ( EGA ISCHT 1) ; PN=PNM1 + (1.5*sl) ; sinon ; PN=PNM1 + sl ; finsi ; Si TPNM2 ; rv.'INCO'.'PNM2'=PNM1 ; Finsi ; rv.'INCO'.'PRESSION'=PN ; 'FINSI' ; Si (EGA TYPROJ 'PSCT') ; rv.'INCO'.'PRESSION' = sl; Finsi ; 'OUBLIER' sl ; 'FINSI' ; *******PROJ P(n+1) = P(n) + sl FIN***** *******PROJ///////////////////////////////////////////////////////////// ***** Avancement en temps FIN 'SI' testran ; '-' (rv . 'SEDIM') ; k = 'ABS' (rv . 'INCO' . 'KN') ; e = 'ABS' (rv . 'INCO' . 'EN') ; rv . 'CO' . 'TEMPERA' = rv . 'INCO' . 'CN' ; 'FINSI' ; 'MENAGE' ; 'SI' ('EGA' irt 1) ; 'MESSAGE' ' Temps final atteint : ' (rv . 'PASDETPS' . 'TPS') ; 'QUITTER' bloc1 ; 'FINSI' ; 'FIN' bloc1 ; 'SI' testpr ; rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL' 'CENTRE' (rvp . 'PRESSION') ; rvp . 'PN' = 'ELNO' rvpd (rvp . 'PRESSION') ; 'FINSI' ; ************************ E X E C ************************************ 'FINPROC' ; GRAPH=VRAI ; GRAPH=FAUX ; DISCR = LINE ; NBIT = 3 ; hz= 2. ; r0=1.16 ; p0=0 0 ;P1= r0 0 ; p2= r0 0.1 ; P3= 0 0.1 ; n1 = 16 ; n2 = 2 ; nz = 2 ; ab = p0 d n1 p1 ; axe = p1 d n2 p2 ; bc = p2 d n1 p3 ; wall = P3 d n2 p0 ; mtor= daller ab wall bc axe ; Si(EGA GRAPH VRAI) ; trace mt ; Finsi ; * Beton Lambda = 0.92 ; SRC= 75 ; tw= 14.6 ; h=50.; T0=8.; DT=20. ; rt=eqex EQUA 'T' $mt 'TEMPERAT' 'TRAN' DT 'EUL_IMPL' 'TN' 'OMEGA' 1. 'NITER' 1 ITMA 1 'FIDT' 1 ZONE $mt 'OPER' 'DFDT' 1. 'INCO' 'T' ZONE $mt 'OPER' 'LAPN' lambda 'INCO' 'T' ZONE $mt 'OPER' 'FIMP' src 'INCO' 'T' ZONE $axe 'OPER' 'ECHI' 'H' 'T0' 'INCO' 'T' ; RT= eqex RT CLIM 'T' TIMP wall tw ; ; rt.'METHINV'.TYPINV=1 ; rt.'METHINV'.IMPINV=0 ; rt.'METHINV'.NITMAX=400; rt.'METHINV'.PRECOND=3 ; rt.'METHINV'.RESID =1.e-8 ; rt. 'METHINV' . 'FCPRECT'=1 ; rt. 'METHINV' . 'FCPRECI'=1 ; rt.'INCO'=table 'INCO'; ilb=1./lambda/2. ; Tlt=((lambda*Tw)+(r0*h*T0))/(lambda + (r0*h)); Tlt=Tlt + ((0.5 * src *r0 *r0)/(lambda + (r0*h))); a=(Tlt - Tw + (0.5*src*r0*r0/lambda))/r0 ; t =tw - (src * ilb * xr * xr) + (a * xr); repeter bloc1 nbit ; exec rt ; tn= rt.inco.'TN' ; ec= t - tn ; mess 'Erreur L2 ' el2 ; fin bloc1 ; tab1=table ; tab1.1 = 'MARQ CROI REGU' ; tab1.3 = 'MARQ LOSA REGU' ; tab1.'TITRE' = table ; Si GRAPH ; 'TITX' 'X (m)' 'TITY' 'Temperature (oC)' ' Temperature ' ; Finsi ; si ( El2 > 1.E-8 ) ; erreur 5 ; finsi ; mt = mt1 et mt0 ; axe = ax trans nz (0 0 hz) ; wall = wal trans nz (0 0 hz) ; *** Cas 3D * Granit Lambda = 2.5; SRC= -250.; tw= 20 ; t0= 37; h=50. ; DT=10. ; rt=eqex EQUA 'RIGIDITE' 'T' $mt 'TEMPERAT' 'TRAN' DT 'EUL_IMPL' 'TN' *'PERM' 'TN' 'OMEGA' 1. 'NITER' 1 ITMA 1 'FIDT' 1 * 'OPTI' 'MMDIAGO' ZONE $mt 'OPER' 'DFDT' 1. 'INCO' 'T' ZONE $mt 'OPER' 'LAPN' lambda 'INCO' 'T' ZONE $mt 'OPER' 'FIMP' src 'INCO' 'T' 'OPTI' 'MMDIAGO' ZONE $axe 'OPER' 'ECHI' 'H' 'T0' 'INCO' 'T' ; RT= eqex RT CLIM 'T' TIMP wall tw ; rt.'METHINV'.TYPINV=3 ; rt.'METHINV'.IMPINV=0 ; rt.'METHINV'.NITMAX=400; rt.'METHINV'.PRECOND=3 ; rt.'METHINV'.RESID =1.e-8 ; rt. 'METHINV' . 'FCPRECT'=1 ; rt. 'METHINV' . 'FCPRECI'=1 ; rt.'INCO'=table 'INCO'; ilb=1./lambda/2. ; Tlt=((lambda*Tw)+(r0*h*T0))/(lambda + (r0*h)); Tlt=Tlt + ((0.5 * src *r0 *r0)/(lambda + (r0*h))); a=(Tlt - Tw + (0.5*src*r0*r0/lambda))/r0 ; t =tw - (src * ilb * xr * xr) + (a * xr); repeter bloc1 nbit ; exec rt ; tn=rt.inco.'TN' ; ec= t - tn ; mess 'Erreur L2 ' el2 ; fin bloc1 ; tab1=table ; tab1.1 = 'MARQ CROI REGU' ; tab1.3 = 'MARQ LOSA REGU' ; tab1.'TITRE' = table ; Si GRAPH ; 'TITX' 'X (m)' 'TITY' 'Temperature (oC)' ' Temperature ' ; Finsi ; si ( El2 > 1.E-9 ) ; erreur 5 ; finsi ; FIN ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales