Télécharger equ_chaleurVF2_dirneummixte.dgibi
* fichier : equ_chaleurVF2_dirneummixte.dgibi ************************************************************************ ************************************************************************ *********************************************************************** * NOM : equ_chaleurVF2_dirneummixte.dgibi * ___ * * DESCRIPTION : Solution stationnaire de l'équation de la chaleur (2D) * ___________ * * GEOMETRIE : Un carré * ---------- * * y * ^ y=1 * |------------ * | | * | | * | | * |x = 0 |x=1 * | | * | | * O-----------------------------> x * y=0 * * * EQUATIONS : * ---------- * * - Equations : * * div K GRAD T = f * * | | * avec K = |x+2 x | * |x y+2 | * | | * * f = e-(x+y) (3x+y) * * - Conditions aux limites : * * conditions de Dirichlet, conditions de flux, * conditions mixtes calculées à partir de la * restriction de la solution exacte sur le bord * exacte * * - Solution exacte : * * T(x,y)= e-(x+y) * * * DISCRETISATION : une méthode de Volume Finis en espace. * ______________ * * * * * * Opérateurs utilisés : PENT (option VF implicite) * LAPN (option VF implicite) * * RESOLUTION : - Solveur BiCGStab * __________ - Préconditionneur ILU(0) * * TESTS EFFECTUES : Vérification de l'ordre proche de 2 en espace de la méthode * _______________ (utilisation d'une norme pseudo-L2) et de la * précision absolue sur le maillage le plus fin. * * * * LANGAGE : GIBIANE-CASTEM 2000 * AUTEUR : C LE POTIER * mél : clepotier@cea.fr ************************************************************************ * VERSION : v2, 02/03, version initiale * HISTORIQUE : ************************************************************************ * Prière de PRENDRE LE TEMPS de compléter les commentaires * en cas de modification de ce sous-programme afin de faciliter * la maintenance ! ****************************************************************** interact= FAUX ; complet = FAUX ; graph = VRAI ; logxmgr = FAUX ; * 'OPTION' 'ISOV' 'SULI' ; 'OPTION' 'ECHO' 0 ; nbisov = 15 ; 'SI' ('NON' interact) ; 'OPTION' 'TRAC' 'PS' ; 'OPTION' 'ISOV' 'LIGNE' ; 'FINSI' ; * ** Erreur Linfini entre deux Champoints. * DEBPROC CALCERR vitp1*'CHPOINT' vit*'CHPOINT' ; AUX = (vitp1 - vit) ; FINPROC err ; * ** Erreur L2 entre deux Champoints. * DEBPROC CALCERR2 vitp1*'CHPOINT' vit*'CHPOINT' vol*'CHPOINT' ; er2 = vitp1 '-' vit ; er2 = 'PSCAL' er2 er2 compv compv ; suppv = 'EXTRAIRE' vol 'MAIL' ; error = error '/' voltot ; error = error '**' 0.5 ; FINPROC error ; * * Procédure paramétrée (raffinement) * renvoyant l'erreur en norme L2 sur la température. * On calcule une solution de l'équation de Laplace * (équations de la chaleur) ; * 'DEBPROC' CALCUL nraff*'ENTIER' ; *nraff=2 ; * * titre global pour les dessins * titglob = 'CHAINE' ' ; nraff=' nraff ; * * Paramètres physiques * cv= 1.0 ; mu = 0.0 ; kappa = 1.0 ; rho = 1.0 ; * * Géométrie * L = 1.; H = 1.; pA = 0. 0. ; pB = L 0. ; pC = L H ; pD = 0. H ; * * Paramètres de la discrétisation de base * 'SI' complet ; nAB = 8 ; nBC = 7 ; nCD = 5 ; nDA = 9 ; 'SINON' ; nAB = 2 ; nBC = 3 ; nCD = 4 ; nDA = 5 ; 'FINSI' ; * * Rotation et translation aditionnelle + bruit blanc * + raffinement * vtran = ((** 2 0.5) (* -1 (** 3 0.5))) ; orig = (0.D0 0.D0) ; arot = 11.3D0 ; ampbruit = (0.15 * ('MINIMUM' lesdens)) ; * * Géométrie discrétisée * bas = 'DROIT' nAB pA pB ; droite = 'DROIT' nBC pB pC ; haut = 'DROIT' nCD pC pD ; gauche = 'DROIT' nDA pD pA ; pourtour = bas 'ET' droite 'ET' haut 'ET' gauche ; mt = 'SURFACE' pourtour 'PLAN' ; *mt = 'DALLER' bas droite haut gauche 'PLAN' ; * * On rajoute le bruit * pmt = 'CHANGER' mt 'POI1' ; pcnt= 'CHANGER' pourtour 'POI1' ; brbl1 = 'BRUIT' 'BLAN' 'GAUS' 0.D0 ampbruit inmt ; brbl2 = 'BRUIT' 'BLAN' 'GAUS' 0.D0 ampbruit inmt ; *'DEPLACER' mt 'PLUS' brbl; * 'DEPLACER' mt 'AFFI' 10.0 PA PD; * * On raffine nraff fois * 'SI' (nraff > 0) ; 'REPETER' bcl nraff ; mt = 'CHANGER' mt 'QUADRATIQUE' ; 'MENAGE' ; 'FIN' bcl ; 'FINSI' ; * * Eventuellement, on trace le résultat * 'SI' graph ; 'TRACER' mt 'NOEUD' 'TITRE' titgeo ; 'FINSI' ; * * Modèles * MDNS = 'NAVIER_STOKES' ; * DEFINITION DES DIFFERENTS BORD DE LA FRONTIERE cdir = 'MANUEL' 'POI1' pa ; 'SI' graph ; 'TRACER' (mt et (cvn 'COULEUR' 'ROUG')) 'TITRE' 'Von Neumann B.C.' ; 'FINSI' ; * * * * Solution exacte aux centres * solexc = (exp ((-1.D0)*(xxc + yyc))) ; * * Gradient exact (aux faces) * * * * Second membre de l'équation * solim = (exp ((-1.D0)*(xxlim + yylim))) ; * gradtx = (-1.D0)*(2. + (2*xxf)) ; gradty = (-1.D0)*(1. + (xxf+yyf)) ; * qchal = (gradtx 'ET' gradty) ; qchal = -1.0 * (gradtx + gradty) ; * CONDITION DE FLUX * CONDITION DE DIRICHLET * DEFINITION DES PARAMETRES POUR LES CONDITIONS MIXTES qlim = (0.0*qaux); AUX = 1.D0 + (0.0D0*xxf); qchal = (-1.0) * (gradtx + gradty) ; VAL = XPAR1 + XPAR2 + QLIM; * * Calcul du tenseur * K21 = xxc ; * * Mise en place du calcul numérique * * Mise en place du calcul numérique * * équation de Laplace * * on utilise une méthode de Newton pour résoudre : * - \Delta T = 0 (\Delta opérateur laplacien) * - avec mélange de conditions aux limites (Dirichlet,Neuman,Mixte) * * T_0 : estimation initiale de la solution * On a T_1 = T_0 - {\Delta'}^{-1} (\Delta T_0) * * L'opérateur 'LAPN' 'VF' nous donne la matrice \Delta' et le * résidu \Delta T_0. * On n'inverse bien évidemment pas \Delta' mais on résoud le système: * \Delta' IncT = \Delta T_0 * => IncT = {\Delta'}^{-1} (\Delta T_0) * * La méthode de Newton doit converger en un pas (on vérifie que le * résidu (\Delta T_1) est nul après le premier pas. * * tmp = 0.0 ; 'DISPDIF' PERM 'TIMP' solim 'QIMP' qlim2 'MIXT' val; $mt t0 gradt0 mchamt 'QIMP' qlim2 'MIXT' val 'TIMP' solim ; matot = mamat ; rv . 'METHINV' . 'TYPINV' = 3 ; rv . 'METHINV' . 'PRECOND' = 3 ; rv . 'METHINV' . 'MATASS' = matot ; rv . 'METHINV' . 'MAPREC' = matot ; 'SMBR'AUX 'IMPR' 0 ; 'DISPDIF' PERM 'TIMP' solim 'QIMP' qlim2 'MIXT' val 'GRADGEO' mchamt; jacbid chpres1 dt = 'LAPN' 'VF' 'CLAUDEIS' 'IMPL' $mt t0 gradt1 mchamt 'QIMP' qlim2 'MIXT' val 'TIMP' solim ; 'SMBR'AUX 'IMPR' 0 ; mres1 = 'MAXIMUM' res 'ABS' ; 'SI' ('>' mres1 1.e-5) ; 'MESSAGE' 'La méthode de Newton na pas converge en un pas.' 'ERREUR' 5 ; 'FINSI' ; * * * Résultats * 'SI' graph ; * * solutions exactes * tn = solexc ; 'TRACER' chm_tnex modmt nbisov 'TITRE' titt ; * * graphe de convergence de la méthode itérative * conver = (rv . 'METHINV' . 'CONVINV') ; lord = ('LOG' conver) '/' ('LOG' 10.D0) ; titev = 'CHAINE' 'Historique de convergence' titglob ; 'DESSIN' evtot 'TITR' titev 'LEGE' ; * * solutions calculées * tn = t1 ; 'TRACER' chm_tn modmt nbisov 'TITRE' titt ; * * erreur * titglob ; 'TRACER' ('ABS' (chm_tnex '-' chm_tn)) modmt nbisov 'TITRE' titt ; 'FINSI' ; * * Calcul des erreurs par rapport à la solution analytique * tn = t1 ; errlit = CALCERR tn solexc ; errl2t = CALCERR2 tn solexc vol ; mres1 = 'MAXIMUM' solexc 'ABS' ; 'MESSAGE' '-------------------------------------------------' ; 'MESSAGE' ('CHAINE' 'Erreur en norme LINF : ' errlit) ; 'MESSAGE' ('CHAINE' 'Erreur en norme L2 : ' errl2t) ; 'MESSAGE' '-------------------------------------------------' ; *'OPTION' 'DONN' 5 ; 'FINPROC' echloc errl2t ; * Fin de la procédure de calcul * *___________________________________________________________* *----------------------------------------------------------- * Paramètres du calcul * * lraff : nb raffinement du maillage (à chaque fois, on découpe * les éléments en quatre). 'SI' complet ; 'SINON' ; 'FINSI' ; * *-----------------------------------------------------------* * Boucles sur les différents paramètres du calcul * ordok = VRAI ; precok = VRAI ; * ordre théorique en espace de la méthode ordtth = 2 ; * erreur L2 max pour la solution (raffinement 2, complet=FAUX) errtmax = 4.D-3 ; * * Boucle sur les raffinements * 'FIN' iraff ; * 'TEMPS' 'PLACE'; lh = lh '/' ('EXTRAIRE' lh 1) ; lh = ('LOG' lh) '/' ('LOG' 10.D0) ; lerl2t = ('LOG' lerl2t) '/' ('LOG' 10.D0) ; 'Err. tempér.' lerl2t ; * * Recherche des ordres de convergence * ordt = cpt . 1 ; * * Tracés graphiques * 'SI' graph ; tableg = 'TABLE' ; tableg . 'TITRE' = 'TABLE' ; tableg . 1 = 'MARQ CROI NOLI' ; tableg . 'TITRE' . 1 = 'Erreur L2 calculée' ; tableg . 2 = 'TIRR' ; tableg . 'TITRE' . 2 = 'Erreur L2 interpolée' ; 'DESSIN' (tl2 'ET' tlipol) 'TITRE' titdest tableg ; 'FINSI' ; * * Tests des ordres de convergence * Tests des erreurs L2 sur le maillage le plus fin dans le * cas complet=faux * ordok = 'ET' ordok ('EGA' ('ENTIER' ('+' ordt 0.5)) ordtth) ; 'SI' ('EGA' complet FAUX) ; precok = 'ET' precok ('<' errt errtmax) ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' ordok) ; 'MESSAGE' 'On n_obtient pas un ordre de convergence correct' ; 'ERREUR' 5 ; 'FINSI' ; 'SI' ('NON' precok) ; 'MESSAGE' 'On n_obtient pas une précision correcte' ; 'ERREUR' 5 ; 'FINSI' ; 'SI' interact ; 'OPTION' 'ECHO' 1 ; 'OPTION' 'DONN' 5 ; 'SI' logxmgr ; * Sortie pour xmgr 'OPTION' ECHO 0 ; 'OPTION' 'IMPR' 'file.txt' ; 'REPETER' BL1 ndim ; 'MESSAGE' ('EXTRAIRE' lh &BL1) ' ' ('EXTRAIRE' lerl2t &BL1) ; 'FIN' BL1 ; lh1 = 'EXTRAIRE' tlipol 'ABSC' ; 'OPTION' 'IMPR' 'file2.txt' ; 'REPETER' BL1 ndim ; 'MESSAGE' ('EXTRAIRE' lh1 &BL1) ' ' ('EXTRAIRE' lerr &BL1) ; 'FIN' BL1 ; 'OPTION' 'IMPR' 'poubelle.txt' ; 'FIN' ; 'FINSI' ; 'FINSI' ; 'MESSAGE' 'Tout s_est bien passé' ; 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales