Télécharger equ_chaleur3D_VFSYM.dgibi
* fichier : equ_chaleur3D_VFSYM.dgibi ************************************************************************ ************************************************************************ ************************************************************************ * NOM : equ_chaleur3D_VF.dgibi * ___ * * DESCRIPTION : Solution stationnaire de l'équation de la chaleur (3D) * ___________ * * GEOMETRIE : Un cube de côté 1 maillé avec 'VOLU'. * * EQUATIONS : * ---------- * * EQUATIONS : * ---------- * * - Equations : * * div K GRAD T = F * * | * avec K = |+1 0 0| * |0 1 0| * |0 0 1| * * * - Conditions aux limites : * * conditions de Dirichlet * * - Solution exacte : * * T(x,y)= sin pix sin piy sin pi z * * * * * DISCRETISATION : une méthode de Volume Finis d'ordre 2 en espace, avec la * methode VFSYM . * SCHEMA PROPOSE PAR Christophe Le Potier * Références : {C. Le Potier} * \emph{Schema volumes finis pour des operateurs de diffusion * fortement anisotropes sur des maillages non structures}, * C. R. Acad. Sci. Ser. I \textbf{340}, 2005, pp. 921--926. * interfaces * * * * Le maillage est construit avec l'opérateur VOLU. * * 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 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 : Christophe Le Potier(CEA/DEN/DM2S/SFME/LSET) * mél : clepotier@cea.fr ************************************************************************ * VERSION : v1, 24/03/2010, 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 = FAUX ; * 'OPTION' 'ISOV' 'SULI' ; 'OPTION' 'ECHO' 1 ; nbisov = 15 ; 'SI' ('NON' interact) ; 'OPTION' 'TRAC' 'PSC' ; * 'OPTION' 'ISOV' 'LIGNE' ; 'FINSI' ; ******************************************************************* ** Erreur Linfini entre deux Champoints. * ******************************************************************* DEBPROC CALCERR vitp1*'CHPOINT' vit*'CHPOINT' ; AUX = (vitp1 - vit) ; FINPROC err ; * * ******************************************************************* ** Erreur Pseudo L2 entre deux Champoints. * ******************************************************************* DEBPROC CALCERR2 vitp1*'CHPOINT' vit*'CHPOINT' ; err = 0.D0 ; erl = 0.D0; suppv = 'EXTRAIRE' er2 'MAIL' ; 'REPETER' numcomp nbcomp ; lacomp = 'EXTRAIRE' compv &numcomp ; 'REPETER' numpo nptd ; err = err '+' ('EXTRAIRE' er2 lacomp lepoi) ; erl = erl '+' ('EXTRAIRE' er3 lacomp lepoi) ; 'FIN' numpo ; 'FIN' numcomp ; err = err '/' erl ; err = err ** 0.5D0 ; FINPROC err ; * ******************************************************************* * Procédure paramétrée (raffinement) * renvoyant l'erreur en norme L2 sur la température. * On calcule une solution exacte de l'équation de Laplace * (équation de la chaleur) ; * 'DEBPROC' CALCUL nraff*'ENTIER' ; * * titre global pour les dessins * titglob = 'CHAINE' ' ; nraff=' nraff ; * * Géométrie * pA = 0. 0. 0. ; pB = 1.0 0. 0. ; pC = 1.0 1.0 0. ; pD = 0. 1.0 0. ; pE = 0. 0. 1. ; * * Paramètres de la discrétisation de base * 'SI' complet ; nAB = 1 ; nBC = 1 ; nCD = 1 ; nDA = 1 ; nH = 1 ; 'SINON' ; nAB = 2 '*' (nraff '+' 1) ; nBC = 2 '*' (nraff '+' 1) ; nCD = 2 '*' (nraff '+' 1) ; nDA = 2 '*' (nraff '+' 1) ; nH = 2 '*' (nraff '+' 1) ; 'FINSI' ; * ******************************************************************* * Géométrie discrétisée ******************************************************************* * *'OPTION' 'ELEM' 'TRI3' ; bas = 'DROIT' nAB pA pB ; droite = 'DROIT' nBC pB pC ; haut = 'DROIT' nCD pC pD ; gauche = 'DROIT' nDA pD pA ; spourt = bas 'ET' droite 'ET' haut 'ET' gauche ; sbas = 'SURFACE' spourt 'PLAN' ; *'OPTION' 'DIME' 3 'ELEM' TET4 ; f1 = 'CHANGER' f1 'TRI3' ; f2 = 'CHANGER' f2 'TRI3' ; f3 = 'CHANGER' f3 'TRI3' ; ss = (f1 'ET' f2 'ET' f3) ; *'OPTION' 'ELEM' 'TET4' ; mt = 'VOLUME' ss ; *'OPTION' 'ELEM' 'TET4' ; * VERRUE pourtour = 'ENVELOPPE' mt ; * * Eventuellement, on trace le résultat * * list mt; 'SI' graph ; 'TRACER' mt 'NOEUD' 'TITRE' titgeo ; 'FINSI' ; ******************************************************************* * * Modèle * ******************************************************************* L = 10.D0; MDNS = 'DARCY' ; * list ('DOMA' $mt 'FACEP') ; cmt = pourtour; ******************************************************************* * Solution exacte aux centres ******************************************************************* re = 180.; ep = 1.D0; solexc = (sin(re*xxc))*(sin(re*yyc))*(sin(re*zzc/L)); ******************************************************************* * terme source ******************************************************************* ******************************************************************* * CONDITION DE DIRICHLET ******************************************************************* solim = (sin(re*xxlim))*(sin(re*yylim))*(sin(re*zzlim/L)); ******************************************************************* * * Calcul du tenseur * ******************************************************************* K11 = 1.D0 + (0.0*xxc); K22 = 1.D0 + (0.0*yyc); K33 = 1.D0 + (0.0*zzc); K21 = (0.0*zzc); K31 = (0.0*zzc); K32 = (0.0*zzc); * 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 T_{\partial \Omega} donné (CL de Dirichlet) * 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. * * gradt0 mchamt = 'PENT' $mt 'FACE' 'VFSYM' t0 'DISPDIF' PERM 'TIMP' solim ; $mt t0 gradt0 mchamt 'TIMP' solim ; matot = mamat ; rv . 'METHINV' . 'TYPINV' = 3 ; rv . 'METHINV' . 'PRECOND' = 3 ; rv . 'METHINV' . 'MATASS' = matot ; rv . 'METHINV' . 'MAPREC' = matot ; 'SMBR' AUX 'IMPR' 0 ; ******************************************************************* * Verification de la convergence ******************************************************************* 'DISPDIF' PERM 'TIMP' solim 'GRADGEO' mchamt; jacbid chpres1 dt = 'LAPN' 'VF' 'CLAUDEISl' 'IMPL' $mt t0 gradt1 mchamt '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_tn modmt 'TITRE' titt ; * * graphe de convergence de la méthode itérative * conver = (rv . 'METHINV' . 'CONVINV') ; 'SI' ('>' dimcon 1) ; lord = ('LOG' conver) '/' ('LOG' 10.D0) ; titev = 'CHAINE' 'Historique de convergence' titglob ; 'DESSIN' evtot 'TITR' titev 'LEGE' ; 'FINSI' ; * * solutions calculées * tn = t1 ; 'TRACER' chm_tn modmt 'TITRE' titt ; * erreur * titt = 'CHAINE' 'erreur relative' ; 'TRACER' (erlcham) modmt 'TITRE' titt ; 'FINSI' ; * * Calcul des erreurs par rapport à la solution analytique * tn = t1 ; errlit = CALCERR tn solexc ; errl2t = CALCERR2 tn solexc ; '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 1, complet=FAUX) errtmax = 1.6605D-2 ; * * Boucle sur les raffinements * 'FIN' iraff ; 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' ; '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 ; 'FINSI' ; 'MESSAGE' 'Tout s_est bien passé' ; 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales