Télécharger benchmark_imst.dgibi
* fichier : benchmark_imst.dgibi ************************************************************************ ************************************************************************ *************************************************************** * * * NOM : benchmark_imst.dgibi * * DESCRIPTION : fiche de validation CASTEM2000 * * Mecanique des Fluides * * Convection naturelle laminaire * * en cavite rectangulaire (2D) * * FONCTIONS * * TESTEES : 'NS' algorithme semi-implicite * * option CENTREE * * approximation de Boussinesq * * elements QUA8 'MACRO' * * * * AUTEUR : Stephane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) * * e-mail : gounand@semt2.smts.cea.fr * * * *************************************************************** * * * VERSION : v1, 19/9/97, version initiale * * HISTORIQUE : v1, 19/9/97, creation * * HISTORIQUE : 15/06/2014 passage EQPR -> EQEX * * HISTORIQUE : 11/07/2023 fixer la pression en 1 point * * HISTORIQUE : * * HISTORIQUE : * * * *************************************************************** * * * Priere de completer la partie HISTORIQUE apres modification * * du jeu de donnees afin de faciliter la maintenance * * * *************************************************************** * * DESCRIPTION DETAILLEE : * * -- IMST -- Convection naturelle laminaire à Prandtl (Pr) = 0 * Algorithme semi implicite * operateur NS (option CENTREE) * * phi = 0 * ------------------------ * | | * T1 = 0 | H | T2 = A * | L | * ------------------------ * phi = 0 * * A = L/H = 4 l'allongement * U = 0 sur les parois * Le profil de temperature est impose T = T1 + (T2-T1)*(x/L) * * La structure de l'ecoulement ne depend que * du nombre de Grashof Gr : * Gr = g beta (T2 - T1) H**3 A / nu**2 * * ^ * | Psi max (valeur max de la fonction de courant) * | * | * -| o o * | unsteady -> o v * | (3 cells) . v * | ----------- o v . o * | steady -> .^ v o * | (3 cells) . ^ v . * | ----------- o ^ o * -| ^ . * | steady -> . ^ . <-- steady (2 cells) * | o * | (1 cell) . * | * | . * | o * -|-------------------------------------------> Gr * I I I * 1.E4 2.E4 3.E4 ************************************************************** * References : - Gounand, S. 1997 * Simulation numerique de cellules * thermoconvectives. * Rapport CEA/DMT 97/357. * - Le Garrec, S. 1988 * Convection naturelle en cavite pour des * fluides à faible nombre de Prandtl. * Rapport CEA/DMT 88/216. * - Le Garrec, S. & Magnaud, J.-P. * Numerical Simulation of oscillatory * convection in low Prandtl Fluids with * TRIO-EF. * A GAMM Workshop Edited by Bernard Roux * Notes on Numerical Fluid Mechanics,Volume 27 * pp. 189-199. (Vieweg, Braunschweig 1990) * *************************************************************** * * JEU DE DONNEE : * prg = ('CHAINE' 'Benchmark Imst') ; **** Options * court = VRAI : le cas-test s'effectue en une dizaine * de secondes. * Gr = 5000 => une cellule stationnaire * la comparaison s'effectue sur le profil * Uy(x) le long de la mediane horizontale. * On verifie egalement que l'ecoulement * est centrosymetrique. * court = FAUX : maillage raffine ; * Gr = 40000 => bifurcation 3->2 cellules * environ 1h30 CPU avec les graphiques * * graph = VRAI : on trace les graphiques (historiques, champs) * On a plus de calculs avec cette option * (fonction de courant, convergence...) * On mettra donc graph = faux pour la fiche * de validation * * inta = VRAI si on est en interactif ; 0 sinon * * discconv : option de discretisation des termes de * convection pour les equations de Navier-Stokes * choix possibles : 'CENTREE', 'SUPG'... * voir notice de 'NS' court = VRAI ; graph = FAUX ; inta = FAUX ; typelem = 'QUA8' ; discconv = 'CENTREE' ; DISCR = 'MACRO' ; KPRESS = 'CENTRE' ; * betap : parametre de stabilisation de la pression BETAP = 1. ; 'SI' ('NON' inta) ; 'OPTION' 'TRAC' 'PSC'; 'SINON' ; **od = 'TEXTE' 'OPTION DONN 3' ; 'FINSI' ; ************************************************************* **** Definition de quelques procedures : ** -> SUMMARY : affiche un resume des parametres ** -> CALCPSI : calcul de la fonction de courant ** (appelee par 'EXEC' via la table 'EQEX') ** -> MAJHIST : mise à jour d'historiques ** (appelee par 'EXEC' via la table 'EQEX') ** -> TRHIST : trace des historiques ** -> TRCHAMP : trace des differents champs ** (appelee par 'EXEC' via la table 'EQEX') ** NB : pour simplifier, on ne transmet pas les parametres à ** SUMMARY. C'est de la mauvaise programmation... ** Les autres procedures sont correctes ** sous toutes reserves * ** SUMMARY 'DEBPROC' SUMMARY ; 'MESSAGE' ('CHAINE' 'Programme :' ' ' prg) ; 'SAUTER' 'LIGNE' ; 'MESSAGE' ('CHAINE' '*** GEOMETRIE :') ; 'MESSAGE' ('CHAINE' ' soient :' ' ' nl 'x' nh '=' (nl '*' nh) ' elements' ' ' typelem) ; 'MESSAGE' ('CHAINE' ' soient :' ' ' (nl '*' nh '*' 4) ' elements lineaires') ; 'SAUTER' 'LIGNE' ; 'MESSAGE' ('CHAINE' '*** PHYSIQUE :') ; 'MESSAGE' ('CHAINE' 'Rapport d_aspect : ' ' ' ('ENTIER' aspect)) ; 'MESSAGE' ('CHAINE' 'Nombre de Grashof :' ' '('ENTIER' Gr) ) ; 'MESSAGE' ('CHAINE' 'Temperature de reference :' ' ' tref ' comprise entre 0 et ' ('ENTIER' aspect)) ; 'SAUTER' 'LIGNE' ; 'MESSAGE' ('CHAINE' '*** NUMERIQUE :') ; 'MESSAGE' ('CHAINE' 'Discretisation' ' ' discconv ' des termes de convection.'); 'MESSAGE' ('CHAINE' ' Beta (stab. pression) =' ' ' betap) ; 'SAUTER' 'LIGNE' ; rvpdt = rv . 'PASDETPS' ; 'MESSAGE' ('CHAINE' '*** TEMPS :') ; 'MESSAGE' ('CHAINE' 'Nb. iterations :' ' ' ((rvpdt . 'NUPASDT') '-' 1)) ; 'MESSAGE' ('CHAINE' 'Temps physique :' ' ' (rvpdt . 'TPS')) ; 'MESSAGE' ('CHAINE' 'Temps CPU :' ' ' ('ENTIER' (thist . 'tpscpu')) ' ms') ; 'FINPROC' ; ** CALCPSI 'DEBPROC' CALCPSI ; 'ARGUMENT' trx*'TABLE ' ; tinco = (trv . 'INCO') ; $dom = (trx . 'DOMZ') ; 'INCO' 'PSI' 'ZONE' $dom 'OPER' 'FIMP' sw 'INCO' 'PSI' 'CLIM' 'PSI' 'TIMP' cdom 0.0D0 ; rk . 'INCO' = 'TABLE' 'INCO' ; *-*-*-*- A remplacer par EXEC qd ca marchera... EXEC rk ; *-*-*-*- tinco . 'PSI' = (rk . 'INCO' . 'PSI') ; 'FINPROC' as2 ama1 ; ** MAJHIST 'DEBPROC' MAJHIST ; 'ARGUMENT' trx*'TABLE ' ; tinco = (trv . 'INCO') ; th = (trv . 'HISTOIRE') ; tp = (trv . 'PASDETPS') ; vit = (tinco . 'UN') ; vitm1 = (tinco . 'UN-1') ; vitref = (tinco . 'UREF') ; psi = (tinco . 'PSI') ; npdt = (tp . 'NUPASDT') ; * Calcul de l'erreur relative (norme Linfini) entre deux * champs de vitesse successifs errrel = ('MAXIMUM' (vit '-' vitm1) 'ABS') '/' vitref ; 'MESSAGE' ('CHAINE' 'Pdt : ' npdt ' |Un - Un_1| Linf = ' errrel) ; 'FINSI' ; tinco . 'UN-1' = 'COPIER' vit ; * Mise à jour des differentes listes mpsi = 'MAXIMUM' psi 'ABS' ; thl = (th . 'lpdt') ; 'FINPROC' as2 ama1 ; ** TRHIST 'DEBPROC' TRHIST ; 'ARGUMENT' th*'TABLE ' ; * On enleve le premier indice des listes hltps = 'ENLEVER' (th . 'ltps') 1 ; hlpsi = 'ENLEVER' (th . 'lpsi') 1 ; hlerr = 'ENLEVER' (th . 'lerr') 1 ; thl = (th . 'lpdt') ; hlpdt = 'ENLEVER' (thl . 'min') 1 ; * Pas de temps = fn(t) 'DESSIN' evpdt 'MIMA' 'TITR' 'Pas de temps' ; * LOG10(pas de temps) = fn(t) ltco = ('LOG' (hlconv '*' alpha)) '/' ('LOG' 10.0D0) ; ltdi = ('LOG' (hldiff '*' alpha)) '/' ('LOG' 10.0D0) ; ltmi = ('LOG' hlpdt) '/' ('LOG' 10.0D0) ; tabt = 'TABLE' ; tabt . 'TITRE' = 'TABLE' ; tabt . 1 = 'TIRC' ; tabt . 2 = 'TIRL' ; tabt . 3 = 'NOLI' ; tabt . 'TITRE' . 1 = 'CHAINE' 'Pdt convection' ; tabt . 'TITRE' . 2 = 'CHAINE' 'Pdt diffusion' ; * Max |Fn de courant| = fn(t) 'DESSIN' evpsi 'MIMA' 'TITR' 'Max |Fn de courant|' ; * Max |Erreur Linf Vit.| = fn(t) (convergence) 'FINPROC' ; ** TRCHAMP 'DEBPROC' TRCHAMP ; 'ARGUMENT' trx*'TABLE ' ; 'QUITTER' TRCHAMP ; 'FINSI' ; tinco = (trv . 'INCO') ; $dom = (trx . 'DOMZ') ; cdom = 'CONTOUR' dom ; tphy = (trv . 'PASDETPS' . 'TPS') ; * Vitesses vitesse = (tinco . 'UN') ; vref = (tinco . 'UREF') ; vv = 'VECTEUR' vitesse (0.2D0 '/' vref) 'UX' 'UY' 'JAUNE' ; 'TRACER' vv cdom 'TITR' titv ; * Fonction de courant 'OPTION' 'ISOV' 'SULI' ; psi = (tinco . 'PSI') ; titpsi = ('CHAINE' 'Fonction de courant (SCAL SOMMET) à t = ' tphy) ; * Pression * NB : On n'utilise pas 'ELNO' : on dessine une pression * constante sur un element. pression = (trv . 'INCO' . 'PRESSION') ; modelp = 'MODELISER' dom 'THERMIQUE' ; titpres = ('CHAINE' 'Pression (SCAL CENTRE) à t = ' tphy) ; 'TRACER' elemp modelp cdom 'TITR' titpres ; 'FINPROC' as2 ama1 ; * ** Fin de la definition des procedures ************************************************************** ************************************************************** ** Debut du 'main' * **** Definition des constantes * l, h, nl, nh : donnees pour la boite. * egeom : erreur geometrique pour 'ELIMINATION' * aspect : rapport d'aspect de la boite * nu, g, rho : parametres du fluide * tg, td : temperatures sur les murs gauches et droits h = 1.0D0 ; 'SI' court ; nh = 3 ; 'SINON' ; nh = 5 ; 'FINSI' ; aspect = 4.0D0 ; l = h '*' aspect ; 'SI' court ; nl = 'ENTIER' (nh '*' 3) ; 'SINON' ; nl = 'ENTIER' (nh '*' aspect) ; 'FINSI' ; egeom = 1.0D-4 ; nu = 1.0D0 ; g = (0.D0 -1.D0) ; tg = 0.D0 ; td = aspect ; **** Creation des maillages lp = l '/' 2.0D0 ; hp = h '/' 2.0D0 ; mlp = (-1.0D0) '*' lp ; mhp = (-1.0D0 '*' hp) ; pmil = lp hp ; pA = 0.0D0 0.0D0 ; pB = l 0.0D0 ; pC = l h ; pD = 0.0D0 h ; pDA = 0.0D0 hp ; pBC = l hp ; bas = pA 'DROIT' nl pB ; haut = pD 'DROIT' nl pC ; rwall = pB 'DROIT' nh pC ; lwall = pA 'DROIT' nh pD ; median = pDA 'DROIT' nl pBC ; mt = 'DALLER' haut rwall bas lwall ; haut = 'CHANGER' haut SEG2 ; bas = 'CHANGER' bas SEG2 ; lwall = 'CHANGER' lwall SEG2 ; rwall = 'CHANGER' rwall SEG2 ; median = 'CHANGER' median SEG2 ; cmt = (lwall 'ET' bas 'ET' rwall 'ET' haut) ; 'ELIMINATION' (mt 'ET' bas 'ET' rwall 'ET' haut 'ET' lwall 'ET' cmt 'ET' median) egeom ; **** Initialisation de la table des historiques * TABTPS= 'TEMPS' 'NOEC'; thist . 'tpscpu' = TABTPS.'TEMPS_CPU'.'INITIAL' ; * Listes thist . 'lpdt' = 'TABLE' 'LPDT' ; thl = (thist . 'lpdt') ; **** Initialisation des tables rv et rvp * Conditions aux limites 'SI' graph ; rv = 'EQEX' rv 'ZONE' $mt 'OPER' 'CALCPSI' 'ZONE' $mt 'OPER' 'MAJHIST' 'ZONE' $mt 'OPER' 'TRCHAMP' ; 'FINSI' ; rvp.'METHINV'.TYPINV=1 ; rvp.'METHINV'.IMPINV=0 ; rvp.'METHINV'.NITMAX=300; rvp.'METHINV'.PRECOND=3 ; rvp.'METHINV'.RESID =1.e-8 ; rvp.'METHINV' . 'FCPRECT'=100 ; rvp.'METHINV' . 'FCPRECI'=100 ; rv . 'INCO' = 'TABLE' 'INCO' ; rv . 'HISTOIRE' = thist ; **** Initialisation des inconnues * V -> 0 ; T gradient constant avec tg sur lwall, td sur rwall rv . 'INCO' . 'TN' = 'KCHT' $mt 'SCAL' 'SOMMET' (tg '+' ((('COORDONNEE' 1 mt) '/' l) '*' (td '-' tg)) ) ; **** Valeurs des parametres : * ** Physiques * * Gr : Nombre de Grashof * tref : temperature de reference (approx. de Boussinesq) * Il faut la dissymetriser pour observer la transition * 3 -> 2 cellules * uref : echelle de vitesse (cf. adimensionnement) * ampvit : facteur d'amplification pour le trace des vitesses * 'SI' court ; Gr = 5.0D3 ; tref = (tg '+' td) '/' 2.0D0 ; 'SINON' ; Gr = 40.0D3 ; tref = tg ; 'FINSI' ; uref = (Gr '**' 0.5D0) ; * ** Numeriques * * nbiter : nombre d'iterations * nptrc : frequence pour le trace des champs (.ps ou à l'ecran) * fidt : frequence d'affichage des messages à l'ecran * alpha : multiplicateur du pas de temps * pour les elements MACRO 'SI' court ; nbiter = 250 ; nptrc = 125 ; fidt = 50 ; 'SINON' ; nbiter = 15000 ; nptrc = 2500 ; fidt = 100 ; 'FINSI' ; alpha = 0.9D0 ; * ** Remplissage des tables * rv . 'INCO' . 'NU' = nu ; rv . 'INCO' . 'GB' = g '*' Gr ; rv . 'INCO' . 'TREF' = tref ; rv . 'INCO' . 'UREF' = uref ; rv . 'ALFA' = alpha ; rv . 'FIDT' = fidt ; rv . 'NPTRC' = nptrc ; rv . 'ITMA' = nbiter ; * ** *** **** Execution SUMMARY ; 'SI' inta ; 'OPTION' 'DONN' 5 ; 'FINSI' ; EXEC rv ; TABTP1= 'TEMPS' 'NOEC'; thist . 'tpscpu' = (thist . 'tpscpu') '+' TABTP1.'TEMPS_CPU'.'INITIAL' ; 'SI' graph ; TRHIST thist ; 'FINSI' ; **** *** ** * ** Le cas-test donne-t-il un resultat correct ?? 'SI' court ; * ** Verification de la centrosymetrie sur les vitesse * vit = (rv . 'INCO' . 'UN') ; tvit = vit 'TOURNER' 180.0D0 pmil ; 'ELIMINATION' (('EXTRAIRE' tvit 'MAIL') 'ET' mt) egeom ; critere1 = ('MAXIMUM' dv 'ABS') '/' uref ; * Valeur de critere1 au 2/10/97 : 1.718764099177966D-15 limite1 = 1.0D-12 ; * ** Evolution vitesse verticale le long de la mediane * * * Resultat obtenu le 2/10/97 * correspondant à critere2 = 1.507288760336422D-16 evvref = 'PROG' 0.0D0 -.2205372973655706D+02 -.1537657415971809D+02 -.9886959157032784D+01 -.4994589224716669D+01 -.1325630316341117D+01 .5065207872228873D+00 .9297558065189220D+00 .5908058903982639D+00 .2945842774751989D-13 -.5908058903982122D+00 -.9297558065189337D+00 -.5065207872229142D+00 .1325630316341034D+01 .4994589224716784D+01 .9886959157032821D+01 .1537657415971808D+02 .2205372973655705D+02 0.0D0 ; * Resultat obtenu le 15/06/2014 evvref = 'PROG' -7.24189E-39 -22.049 -15.375 -9.8821 -4.9918 -1.3199 0.50926 0.93264 0.59143 -1.04084E-12 -0.59143 -0.93264 -0.50926 1.3199 4.9918 9.8821 15.375 22.049 7.24188E-39 ; critere2 = ('MAXIMUM' (evym '-' evvref) 'ABS') '/' uref ; limite2 = 1.0D-4 ; * pour tenir compte de l'affichage de 5 chiffres significatifs * Tps CPU (le 2/10/97) ; 1009 centiemes de secondes * (court = VRAI ; graph = FAUX ; inta = FAUX ;) TABTP1= 'TEMPS' 'NOEC'; thist . 'tpscpu'= (thist . 'tpscpu') '+' TABTP1.'TEMPS_CPU'.'INITIAL'; * ** Affichage des messages et des erreurs eventuelles * 'SAUTER' 2 'LIGNE' ; 'MESSAGE' 'Debriefing :' ; 'MESSAGE' '------------' ; 'SAUTER' 'LIGNE' ; 'MESSAGE' ('CHAINE' 'Erreur/Limite de centrosymetrie du champ de vitesses :') ; 'MESSAGE' ('CHAINE' 'FORMAT' '(D24.16)' critere1 ' / ' limite1) ; 'MESSAGE' ('CHAINE' 'Erreur/Limite Vy sur la mediane horizontale') ; 'MESSAGE' ('CHAINE' 'FORMAT' '(D24.16)' critere2 ' / ' limite2) ; 'MESSAGE' ('CHAINE' 'Temps CPU / Temps CPU (30/9/97) : ') ; 'MESSAGE' ('CHAINE' ('ENTIER' (thist . 'tpscpu')) ' / ~1000' ' centieme(s) de secondes') ; 'SI' ('OU' (critere1 '>' limite1) (critere2 '>' limite2)) ; 'ERREUR' 5 ; 'FINSI' ; 'MESSAGE' 'Tout s_est bien passe' ; 'OPTION' 'ECHO' 1 ; 'FINSI' ; SUMMARY ; 'SI' inta ; 'OPTION' 'DONN' 5 ; 'FINSI' ; 'FIN' ; * ** Fin du 'main' **************************************************************
© Cast3M 2003 - Tous droits réservés.
Mentions légales