* fichier : tp3.dgibi ************************************************************************ ************************************************************************ * ************************************************************************ * Cours MF307 - Tp3 * Diffusion d'un champ scalaire * Solution stationnaire de l'équation de la chaleur ************************************************************************ * * Pour la non-regression, on vérifie que dans le cas d'une solution * bilinéaire sur un maillage régulier de quadrangles la solution * calculée est exacte à la précision machine près. * GRAPH = faux ; * *----------------------------------------------------------------------- 'DEBP' CALCUL ; *----------------------------------------------------------------------- * Cette procédure, utilisée comme un opérateur, calcule la différence * entre deux pas de temps toutes les 5 itérations. * L'evolution de cette différence (erreur absolue) au cours du temps * est conservée en vue d'un post-traitement. *----------------------------------------------------------------------- * TN = RV . 'INCO' . 'TN' ; * RVX . 'COMPT' = RVX . 'COMPT' + 1 ; 'SINO' ; RVX . 'COMPT' = 1 ; * 'FINS' ; 'FINS' ; * DD = RVX . 'COMPT' ; NN = DD / 5 ; LO = (DD-(5*NN)) 'EGA' 0 ; 'SI' LO ; ERR = (RV . 'INCO' . 'TN') - (RV . 'INCO' . 'TBIS') ; ELI = ('LOG' (ERRINF + 1.0E-50))/('LOG' 10.) ; RV . 'INCO' . 'IT' = (RV . 'INCO' . 'IT') 'ET' IT ; RV . 'INCO' . 'ER' = (RV . 'INCO' . 'ER') 'ET' ER ; 'FINS' ; *----------------------------------------------------------------------- 'FINP' mat1 chp1; *----------------------------------------------------------------------- * * *=================================== * OPTIONS FOURNIES PAR L'UTILISATEUR *=================================== * (les choix par menus sont à réactiver en interactif) * * *- Choix du type de problème * 'MESS' 'Choix du problème à traiter :' ; **** 'OBTE' ISOL0 ; ISOL0 = 2 ; TEST1 = (ISOL0 '>' 3) 'OU' (ISOL0 '<' 1) ; 'SI' TEST1 ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; * *- Choix du type d'éléments * 'MESS' 'Choix des elements maillant le domaine :' ; **** 'OBTE' CHOIX ; CHOIX = 2 ; TEST1 = (CHOIX '>' 3) 'OU' (CHOIX '<' 1) ; 'SI' TEST1 ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; * *- Choix du type d'interpolation * 'MESS' 'Choix des degrés des éléments finis :' ; **** 'OBTE' IDEGR ; IDEGR = 1 ; TEST1 = (IDEGR '>' 2) 'OU' (IDEGR '<' 1) ; 'SI' TEST1 ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; * *- Choix du nombre d'éléments * **** 'OBTE' NX ; NX = 10 ; 'SI' (NX '<' 1) ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; NY = NX ; * *- Choix de la méthode * **** 'OBTE' IMETH ; IMETH = 3 ; TEST1 = (IMETH '>' 3) 'OU' (IMETH '<' 1) ; 'SI' TEST1 ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; 'SI' (('EGA' IMETH 1) 'ET' ('EGA' IDEGR 2)); 'FIN'; 'FINS' ; * *- Nombre de pas de temps * 'SI' ('NEG' IMETH 3) ; 'MESS' 'Nombre de pas de temps :'; 'OBTE' NITER ; 'SI' (NX '<' 1) ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; 'FINS' ; * *- Choix de la méthode d'inversion * **** 'OBTE' ININV ; ININV = 1 ; TEST1 = (ININV '>' 3) 'OU' (ININV '<' 1) ; 'SI' TEST1 ; 'MESS' 'Erreur lors de la saisie du choix.'; 'FIN'; 'FINS' ; * * *========= * MAILLAGE *========= * * *- Initialisation des options * 'SI' (CHOIX 'EGA' 1) ; 'SINO' ; FINSI; * *- Definition des sommets de la plaque * LX = 1.D0 ; LY = 1.D0 ; XMIN = 0.D0 ; YMIN = 0.D0 ; XMAX = XMIN + LX ; YMAX = YMIN + LY ; * A1 = XMIN YMIN ; A2 = XMAX YMIN ; A3 = XMAX YMAX ; A4 = XMIN YMAX ; * *- Definition des aretes * 'SI' (CHOIX 'EGA' 3) ; R = 10. ** (1. / (NX - 1)); DA = 1. * ((R - 1.) / ((R ** NX) - 1)); DB = 10. * DA ; 'SINO' ; 'FINS' ; * *- Maillage de la plaque * SI (CHOIX EGA 1); CNT = FBAS ET FDRO ET FHAU ET FGAU ; SINON; MT = 'DALLER' FBAS FDRO FHAU FGAU 'PLAN' ; FINSI; * *- MODELE NAVIER_STOKES * MT = 'CHANGER' QUAF mt; 'SI' ('EGA' IDEGR 1); SINON ; 'FINSI'; CNT = 'CONTOUR' MT; * * *================ * SOLUTION EXACTE *================ * * 'SI' (ISOL0 '<' 3) ; * *-> T(x,y) = 11xy + 7x + 5y + 3 + NORMALISATION * 'SI' (ISOL0 'EGA' 1) ; AXY = 0. ; 'SINO' ; AXY = 11. ; 'FINSI' ; SOLEX = AXY*XX*YY + (7.*XX) + (5.*YY) + 3. ; 'SINO' ; * *-> T(x,y) = 0.2 + sin(180*x) * e(-PI*y) * SINUS = 'SIN' ( XX * 180.) ; EXPON = 'EXP' ( YY * (0. - PI)) ; SOLEX = SINUS * EXPON + 0.2 ; 'FINSI' ; * * *================== * SOLUTION CALCULEE *================== * * * La structure du bloc de chaque méthode est identique : * -> description de la modélisation physique et numérique (EQEX) * -> conditions aux limites (EQEX, option CLIM) * -> initialisations des champs (table INCO) * -> initialisations des données numériques (table RV) * -> resolution (EXEC) * Les données numériques suivantes permettent de piloter le calcul : * NITER : Nombre d'iterations internes (cas non-lineaire) * OMEGA : Coefficient de relaxation (cas non-linéaire) * IMPR : Flag d'impression (1 pour oui, 0 pour non) * ITMA : Nombre de pas de temps * EPS : Critere de convergence pour les iterations internes * DT : Pas de temps * *------------------------------------------------ * Méthode de résolution instationnaire explicite * Utilisation de l'opérateur TSCAL *------------------------------------------------ * 'SI' (IMETH 'EGA' 1) ; 'ZONE' $MT 'OPER' CALCUL 'OPTI' 'EFM1' 'CENTREE' 'EXPL' 'OPTI' 'EFM1' 'CENTREE' 'EXPL' 'ZONE' $MT 'OPER' 'DFDT' 1. 'TN' 'DELTAT' 'INCO' 'TN' ; RV . 'INCO' = 'TABLE' 'INCO' ; 'FINS' ; * *------------------------------------------------ * Méthode de résolution instationnaire implicite * Utilisation des opérateurs DFDT et LAPN *------------------------------------------------ * 'SI' (IMETH 'EGA' 2) ; * 'ZONE' $MT 'OPER' 'DFDT' 1. 'TNM' 'DT' (0. 0.) 0. 'INCO' 'TN' 'ZONE' $MT 'OPER' 'DFDT' 1. 'TNM' 'DT' 'INCO' 'TN' 'ZONE' $MT 'OPER' 'LAPN' 1. 'INCO' 'TN' 'ZONE' $MT 'OPER' CALCUL ; RV . 'INCO' = 'TABLE' 'INCO' ; RV . 'NITER' = 1 ; RV . 'OMEGA' = 1.D0 ; RV . 'IMPR' = 1 ; RV . 'ITMA' = NITER ; RV . 'EPS' = 1.D-15 ; RV . 'DT' = 1.D-1 ; RV . 'INCO' . 'DT' = RV . 'DT' ; 'FINS' ; * *------------------------------------------------ * Méthode de résolution stationnaire (implicite) * Utilisation de l'opérateur LAPN *------------------------------------------------ * 'SI' (IMETH 'EGA' 3) ; RV . 'INCO' = 'TABLE' 'INCO' ; RV . 'NITER' = 2 ; RV . 'OMEGA' = 1.D0 ; RV . 'IMPR' = 1 ; RV . 'ITMA' = 1 ; RV . 'EPS' = 1.D-15 ; RV . 'DT' = 1.D3 ; RV . 'INCO' . 'DT' = RV . 'DT' ; 'FINS' ; * * rv. 'METHINV' . 'TYPINV' = ININV ; rv. 'METHINV' . 'IMPINV' = 2 ; rv. 'METHINV' . 'NITMAX' = 1500 ; rv. 'METHINV' . 'PRECOND' = 3 ; rv. 'METHINV' . 'RESID' = 1.e-14 ; rv. 'METHINV' . 'FCPRECT' = 1 ; rv. 'METHINV' . 'FCPRECI' = 1 ; rv. 'METHINV' . 'XINIT' = RV.INCO.'TN'; rv. 'METHINV' . 'TYRENU' = 'SLOANE' ; * EXEC rv; * * *================================== * POST TRAITEMENT ET VISUALISATIONS *================================== * * ER0 : Erreur absolue * ER1 : Erreur relative * ER2 : Erreur absolue au carrée * ERR : Erreur L2 discrète * ER0 = 'ABS' (RV.INCO.'TN' - SOLEX) ; ER1 = ER0 '/' SOLEX ; ER2 = ER0 '*' ER0 ; * *------------------------> Début des tracés 'SI' GRAPH ; * Evolution de l'erreur au cours des itérations 'SI' ('NEG' IMETH 3) ; 'DESS' EVO1 'TITRE' 'Histoire de l erreur absolue' 'TITX' 'Iterations' 'TITY' 'Log(Erreur)'; 'FINSI' ; * Tracé de la solution exacte en faux 3D 'SI' ('<' ISOL0 3) ; 'SINON' ; 'FINSI' ; 'FINSI' ; *------------------------> Fin des tracés * * *======================= * TEST DE NON-REGRESSION *======================= * TEST1 = ERR < 1E-15 ; si test1 ; sinon ; finsi ; 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales