* fichier : ccar5w.dgibi ************************************************************************ ************************************************************************ ** ** --- 4 AVRIL 2001 --- ** ** TEST CAVITE CARRE A PAROI DEFILANTE RE=400 ** ** Algorithme projection implicite ** teste LAPL KONV NS (CENTREE) KBBT ** Formulation MACRO CENTRE (Stabilisation) ELEMENT QUA9 *$$$$ 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' ; OPTION ISOV 'SULI' ; *OPTION TRACE PS; GRAPH = VRAI ; GRAPH = FAUX ; COMPLET = FAUX ; Rey = 400. ; SI ( COMPLET ) ; ds1=0.017; ds2=0.05; ds1=0.02 ; ds2=0.2 ; ITMAX = 30 ; SINON ; err1=1.e-4 ; ds1=0.03 ; ds2=0.3 ; ITMAX = 15 ; FINSI ; KPRESS = 'CENTRE' ; *KPRESS = 'MSOMMET'; *KPRESS = 'CENTREP1'; DISCR = 'MACRO' ; *DISCR = 'QUAF' ; *DISCR = 'LINE' ; TYPK = 'QUA8' ; *TYPK = 'TRI6' ; KSUPG = 'CENTREE'; ITMAX*ENTIER ; p1= 0 0 ; p12=0.5 0. ; p2= 1 0 ; ab=p1 d dini ds1 dfin ds2 p12 d dini ds2 dfin ds1 p2 ; mt= ab trans dini ds1 dfin ds2 (0 0.5) trans dini ds2 dfin ds1 (0 0.5) ; MU =1. ; RO= Rey ; DT=1. ; * La cavité est fermée il faut imposer la pression en 1 point ! doma $mt 'IMPR' ; * betastab = 1.e2; Si (EGA TYPK 'TRI6') ; betastab = 1.e5 ; Finsi ; RV= eqex EQUA 'U' 'P' $mt 'VITESSE' 'PRESSION' KPRESS 'PROJ' DT 'EUL_IMPL' 'UN' 'PN' 'OMEGA' 1. 'NITER' 1 ITMA ITMAX 'FIDT' 1 'OPTI' KSUPG KPRESS 'DIV2' 'STABP' betastab ZONE $mt 'OPER' 'LAPN' MU 'INCO' 'U' ZONE $mt 'OPER' 'KONV' RO 'UN' 'INCO' 'U' 'OPTI' 'MMDIAGO' ZONE $mt 'OPER' 'DFDT' RO 'INCO' 'U' ; RV= eqex RV CLIM 'U' UIMP CD 1. 'U' VIMP CD 0. 'U' UIMP DA 0. 'U' VIMP DA 0. 'U' UIMP AB 0. 'U' VIMP AB 0. 'U' UIMP BC 0. 'U' VIMP BC 0. 'P' TIMP bcp 0. ; rv.'METHINV'.TYPINV=3 ; rv.'METHINV'.IMPINV=0 ; rv.'METHINV'.NITMAX=400; rv.'METHINV'.PRECOND=3 ; rv.'METHINV'.RESID =1.e-8 ; rv. 'METHINV' . 'FCPRECT'=1 ; rv. 'METHINV' . 'FCPRECI'=1 ; rv.inco= table inco ; rv.'IMPR'=0 ; rv.'FIDT'=5 ; exec rv ; exec rv ; list evx ; rv.'EVOLV'=evolV ; rv.'EVOLH'=evolH ; si GRAPH; TAB1=TABLE; TAB1.'TITRE'=TABLE ; TAB1 . 1 ='MARQ REGU ' ; trace c1 mt ; trace pn mt ; *pn= rv.inco.'PN' ; *trace pn (doma $mt 'MMAIL') ; finsi ; FINPROC RV ; RV1= test 'CENTRE' TYPK 'MACRO' GRAPH ITMAX ; evv= (rv1.'EVOLV'); evh= (rv1.'EVOLH'); TAB1 = TABLE; TAB1.1 = 'MARQ LOSA'; TAB1.'TITRE'=TABLE ; ERUN=rv1.'PASDETPS'.'ERLIUN' ; EVTP=rv1.'PASDETPS'.'NUPDT' ; Si GRAPH ; 'TITRE' 'Erreurs L-infini U '; Finsi ; Si (erli < 2.); erreur 5 ; Finsi ; FIN;
© Cast3M 2003 - Tous droits réservés.
Mentions légales