Download equ_chaleurVF2_dirneuvfsym.dgibi

Back to the list

* 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   = FAUX ;
logxmgr = FAUX ;
*
'OPTION' 'DIME' 2 'ELEM' TRI3 'MODE' 'PLAN' ;
'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) ;
  err = MAXI (AUX) 'ABS' ;
FINPROC err ;
*
** Erreur L2 entre deux Champoints.
*
DEBPROC CALCERR2 vitp1*'CHPOINT' vit*'CHPOINT' vol*'CHPOINT' ;
  er2 = vitp1 '-' vit ;
  compv  = 'EXTRAIRE' er2 'COMP' ;
  er2 = 'PSCAL' er2 er2 compv compv ;
  suppv  = 'EXTRAIRE' vol 'MAIL' ;
  chpun = 'MANUEL' 'CHPO' suppv 1 'SCAL' 1 ;
  voltot = 'XTY' chpun ('MOTS' 'SCAL') vol ('MOTS' 'SCAL') ;
  error = 'XTY' er2 ('MOTS' 'SCAL') vol ('MOTS' 'SCAL') ;
  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 ;
lesdens = 'PROG' (1. '/' nAB) (1. '/' nCD) (1. '/' nBC) (1. '/' nDA) ;
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' ;
inmt= 'DIFF' pmt pcnt;
brbl1 = 'BRUIT' 'BLAN' 'GAUS' 0.D0 ampbruit inmt ;
brbl2 = 'BRUIT' 'BLAN' 'GAUS' 0.D0 ampbruit inmt ;
brbl = 'ET' ('NOMC' 'UX' brbl1) ('NOMC' 'UY' brbl2) ;
*'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' ;
    $mt = 'DOMA' mt 'MACRO' ;
    mt  = ('DOMA '$mt 'MAILLAGE') ;
    'MENAGE' ;
  'FIN' bcl ;
'FINSI' ;
*
* Eventuellement, on trace le résultat
*
'SI' graph ;
   titgeo = 'CHAINE' 'mt ' 'NBPO=' ('NBNO' mt)
                      ' NBELEM=' ('NBEL' mt) titglob ;
   'TRACER' mt 'NOEUD' 'TITRE' titgeo ;
'FINSI' ;
*
* Modèles
*
Mmt   = 'CHAN' mt   'QUAF' ;
'ELIM' Mmt 1.E-5 ;
MDNS  = 'NAVIER_STOKES' ;
$mt   = 'MODE' Mmt MDNS 'LINE'  ;
mt    = 'DOMA' $mt 'MAILLAGE' ;

modmt = 'MODELISER' ('DOMA' $mt 'MAILLAGE') 'THERMIQUE' ;
mtm = ('DOMA' $mt 'MAILLAGE') ;
mtc = 'COULEUR' ('DOMA' $mt 'CENTRE') 'JAUN' ;
mtf = 'COULEUR' ('DOMA' $mt 'FACE') 'BLEU' ;
cmt = 'DOMA' $mt 'ENVELOPP' ;
Mcmt   = 'CHAN' cmt   'QUAF' ;
'ELIM' (Mmt 'ET' Mcmt) 1.E-5 ;
$cmt   = 'MODE' Mcmt MDNS  'LINE' ;

* DEFINITION DES DIFFERENTS BORD DE LA FRONTIERE
gau1 = cmt 'ELEM' 'COMPRIS' PA PD ;
bas1  = cmt 'ELEM' 'COMPRIS' PA PB ;
Mbas  = 'CHAN' bas1  'QUAF' ;
Mgau  = 'CHAN' gau1  'QUAF' ;
Mcvn  = 'CHAN' cmt   'QUAF' ;
'ELIM' (Mmt 'ET' Mbas 'ET' Mgau 'ET' Mcvn) 1.E-5 ;
$bas  = 'MODE' Mbas MDNS 'LINE' ;
$gau  = 'MODE' Mgau MDNS 'LINE';
$cvn  = 'MODE' Mcvn MDNS 'LINE';
cvn   = 'DOMA' $cvn 'MAILLAGE' ;

cdir = 'MANUEL' 'POI1' pa ;
pdir1 = 'MANUEL' 'POI1' (('DOMA' $bas 'CENTRE') 'POIN' 'PROC' pA) ;
pdir2 = 'MANUEL' 'POI1' (('DOMA' $gau 'CENTRE') 'POIN' 'PROC' pA) ;
ptot = ('DOMA' $cvn 'CENTRE')  ;
pdir2 = ('DOMA' $gau 'CENTRE') ;
cvn = 'DIFF' ptot ('DOMA' $gau 'CENTRE');
pdir3 = ('DOMA' $gau 'SOMMET');


'SI' graph ;
  'TRACER' (mt et (cvn 'COULEUR' 'ROUG')) 'TITRE' 'Von Neumann B.C.' ;
  'TRACER' (mt et (pdir2 'COULEUR' 'ROUG')) 'TITRE' 'DIRI' ;
  'TRACER' (mt et (pdir3 'COULEUR' 'VERT')) 'TITRE' 'DIRI' ;
'FINSI' ;



*
*
*
* Solution exacte aux centres
*
xxc yyc = 'COORDONNEE' ('DOMA' $mt 'CENTRE') ;
solexc = (exp ((-1.D0)*(xxc + yyc))) ;
solexc = 'KCHT' $mt 'SCAL' 'CENTRE' solexc ;
*
* Gradient exact (aux faces)
*
xxf yyf = 'COORDONNEE' ('DOMA' $mt 'FACE') ;
*
*
* Second membre de l'équation 
*
sour = (exp ((-1.D0)*(xxc + yyc)))* ((3*xxc) + yyc) ;
sour = 'KCHT' $mt 'SCAL' 'CENTRE' sour ;


xxlim yylim = 'COORDONNEE' ('DOMA' $cmt 'CENTRE') ;
solim = (exp ((-1.D0)*(xxlim + yylim))) ;
solim = 'KCHT' $cmt 'SCAL' 'CENTRE' solim ;

xxlin yylin = 'COORDONNEE' ('DOMA' $cmt 'SOMMET') ;
solin = (exp ((-1.D0)*(xxlin + yylin))) ;
solin = 'KCHT' $cmt 'SCAL' 'SOMMET' solin ;

*
xxf yyf = 'COORDONNEE' ('DOMA' $cmt 'CENTRE') ;
gradtx = (-1.D0)*(2. + (2*xxf)) *(exp ((-1.D0)*(xxf + yyf))) ;
gradty = (-1.D0)*(1. + (xxf+yyf)) * (exp ((-1.D0)*(xxf + yyf)))  ;
gradtx = 'NOMC' 'UX' gradtx 'NATU' 'DISCRET' ; 
gradty = 'NOMC' 'UY' gradty 'NATU' 'DISCRET' ; 
*


CHYB2 = 'DOMA' $mt 'NORMALE'         ;
qchal = (gradtx 'ET' gradty) ;
qchal = -1.0 * (gradtx + gradty) ;
* CONDITION DE FLUX
qlim2 = 'REDU' qchal cvn  ;
CHYB2R = 'REDU' CHYB2 cvn    ;
MOT1  = 'MOTS' 'UX' 'UY'                     ;
MOT2  = 'MOTS' 'UX' 'UY'                     ;
FLU1  = 'PSCA' CHYB2R qlim2 MOT1 MOT2         ;
qlim2 = NOMC(FLU1) 'FLUX';


* CONDITION DE DIRICHLET
solim = 'REDU' solim pdir2;
solin = 'REDU' solin pdir3;


*
* Calcul du tenseur
*
K11 = 'KOPS' xxc  '+' 2. ;
K22 = 'KOPS' yyc  '+' 1. ;
K21 =   xxc  ;

K11 = NOMC(K11) 'K11' 'NATU' 'DISCRET';
K22 = NOMC(K22) 'K22' 'NATU' 'DISCRET';
K21 = NOMC(K21) 'K21' 'NATU' 'DISCRET';
PERM = (K11 'ET' K22) ;
PERM = PERM 'ET' K21;

*
* 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 ;
t0 = 'KCHT' $mt 'SCAL' 'CENTRE' 0.D0 ;

gradt0 mchamt = 'PENT'  $mt  'FACE' 'VFSYM' t0 
         'DISPDIF' PERM 'TIMP' solin 'QIMP' qlim2 ;

jaco chpres dt = 'LAPN' 'VF' 'CLAUDEIS'  'IMPL'
$mt t0 gradt0 mchamt 'QIMP' qlim2 'TIMP' solim ;



mamat = 'KOPS' 'MULT' -1.000D0 jaco ;
matot =  mamat  ;

AUX = ('EXCO' chpres 'RETN' 'RETN') - (NOMC(sour) 'RETN');
rv = 'EQEX' ;
rv . 'METHINV' . 'TYPINV'   = 3 ;
rv . 'METHINV' . 'PRECOND'  = 3 ;
rv . 'METHINV' . 'MATASS'   = matot ;
rv . 'METHINV' . 'MAPREC'   = matot ;
res = 'KRES' matot 'TYPI' (rv . 'METHINV')
                      'SMBR'AUX 
                      'IMPR' 0 ;
t1 = t0 '+' ('EXCO' res 'RETN' 'SCAL') ;
gradt1  mchamt1 = 'PENT'  $mt  'FACE' 'VFSYM' t1 
'DISPDIF' PERM 'TIMP' solin 'QIMP' qlim2;
jacbid chpres1 dt = 'LAPN' 'VF' 'CLAUDEIS'  'IMPL'
$mt  t0 gradt1 mchamt 'QIMP' qlim2 'TIMP' solim ;
AUX = ('EXCO' chpres1 'RETN' 'RETN') - (NOMC(sour) 'RETN');
res = 'KRES' matot 'TYPI' (rv . 'METHINV')
                      'SMBR'AUX 
                      'IMPR' 0 ;
mres1 = 'MAXIMUM' res  'ABS' ;
'MESSAGE' ('CHAINE' 'Maxi. mres1 =' mres1) ;
'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 ;
  chm_tnex = 'KCHA' $mt 'CHAM' tn ;
  titt = 'CHAINE' 'Température exacte' titglob ;
  'TRACER' chm_tnex modmt nbisov 'TITRE' titt ;
*
* graphe de convergence de la méthode itérative
*
    conver = (rv . 'METHINV' . 'CONVINV') ;
    dimcon = 'DIME' conver ;
    labs = 'PROG' 1.D0 'PAS' 1.D0 dimcon ;
    lord = ('LOG' conver) '/' ('LOG' 10.D0) ;
    evtot = 'EVOL' 'MANU' 'ITER' labs 'RESID' lord ;
    titev = 'CHAINE' 'Historique de convergence' titglob ;
    'DESSIN' evtot 'TITR' titev 'LEGE' ;
*
* solutions calculées
*
  tn = t1 ;
  chm_tn = 'KCHA' $mt 'CHAM' tn ;
  titt = 'CHAINE' 'Température calculée' titglob ;
  'TRACER' chm_tn modmt nbisov 'TITRE' titt ;
*
* erreur
*
  titt = 'CHAINE' 'Abs (Température calculée - Température exacte)'
         titglob ;
  'TRACER' ('ABS' (chm_tnex '-' chm_tn)) modmt nbisov 'TITRE' titt ;
'FINSI' ;
*
* Calcul des erreurs par rapport à la solution analytique
*
vol = 'DOMA' $mt 'VOLUME' ;
echloc = (('MESURE' mt) '/' ('NBEL' mt)) ** 0.5 ;
tn = t1 ;
errlit = CALCERR  tn solexc ;
errl2t = CALCERR2 tn solexc vol ;
mres1 = 'MAXIMUM' solexc  'ABS' ;
'MESSAGE' ('CHAINE' 'Maxi. solexc =' mres1) ;
'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 ;
  lraff  = 'LECT' 0 PAS 1 3 ;
'SINON' ;
  lraff  = 'LECT' 0 PAS 1 1 ;
'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
*
    lh = 'PROG' ;
    lerl2t = 'PROG' ;
    'REPETER' iraff ('DIME' lraff)  ;
      raff = 'EXTRAIRE' lraff &iraff ;
      h errt = CALCUL raff ;
      lh     = 'ET' lh     ('PROG' h ) ;
      lerl2t = 'ET' lerl2t ('PROG' errt) ;
    'FIN' iraff ;
*     'TEMPS' 'PLACE';
    lh = lh '/' ('EXTRAIRE' lh 1) ;
    lh     = ('LOG' lh)     '/' ('LOG' 10.D0) ;
    lerl2t = ('LOG' lerl2t) '/' ('LOG' 10.D0) ;
    tl2 = 'EVOL' 'MANU' 'Long. carac.' lh
                        'Err. tempér.' lerl2t ;

*
* Recherche des ordres de convergence
*
    cpt tlipol = @POMI tl2 1 'IDEM' ;
    ordt = cpt . 1 ;
    'MESSAGE' ('CHAINE' 'ordre température=' ordt) ;
*
* 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' ;
      titdest= 'CHAINE' 'Err L2 Tempér., ordre=' ordt ;
      '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' ;
      ndim = 'DIME' lh ;
      'REPETER' BL1 ndim ;
         'MESSAGE' ('EXTRAIRE' lh &BL1) '  '  ('EXTRAIRE' lerl2t &BL1) ;
      'FIN' BL1 ;
      lh1 = 'EXTRAIRE' tlipol 'ABSC' ;
      lerr = 'EXTRAIRE' tlipol 'ORDO' ;
      ndim = 'DIME' lh1 ;
      '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 - All rights reserved.
Disclaimer