* fichier : sine_bumpBM.dgibi ****************************************************************** * CALCUL DE L'ECOULEMENT SUBSONIQUE STATIONNAIRE DANS UN CANAL * * AVEC SINE-SHAPED BUMP * * FORMULATION VF COMPRESSIBLE EXPLICITE/IMPLICIT * * * * H. PAILLERE/P. GALON TTMF AOUT 1997 * * * * MODIF BECCANTINI MARS 97 * * * * BECCANTINI NOVEMBRE 98 * * MODIF BECCANTINI AUGUST 2021 * * * * Compressible AUSM+ scheme is used for computation * ****************************************************************** GRAPH = VRAI ; COMPLET = VRAI ; GRAPH = FAUX ; COMPLET = FAUX ; 'SI' complet ; RAF = 8 ; NITER = 20 ; 'SINON' ; RAF = 5 ; NITER = 20 ; 'FINSI' ; TYEL = 'QUA4' ; * *** C.L. et initiales * RO_INF = 1.4D0 ; P_INF = 1.0D0 ; U_INF = 0.50 ; GAMSCAL = 1.4D0; * * ************************************************************************ ************************************************************************ ***************** PARTIE PROCEDURES ************************************ ************************************************************************ ************************************************************************ ************************************************************************ * * * Put it in utilproc * Procedures will finish in FIN PARTIE PROCEDURES * ***** $$$$ EXEXCH * ***************************************************** ***************************************************** ** PROCEDURE EXEX POUR FORMULATION VF COMPRESSIBLE ** ***************************************************** ***************************************************** * * We check wether the table RV is complete * * 'DEBPROC' EXEXCH ; 'ARGUMENT' RV*TABLE ; 'MESSAGE' ; 'MESSAGE' 'PROCEDURE EXEXCH' ; * **** Initialisation d'un CHPOINT 'ET' d'une MATRIK vide * RESPRO CHPVID MATVID ; * **** Les inconnues * 'SI' ('NON' ('EXISTE' RV 'UN')) ; 'MESSAGE' ; 'MESSAGE' 'UN = ???' ; 'ERREUR' 21 ; 'FINSI' ; * **** We check the compatibility between the variables and their names * 'SI' ('NON' ('EXISTE' RV 'LISTCONS')) ; 'MESSAGE' ; 'MESSAGE' 'LISTCONS = ???' ; 'ERREUR' 21 ; 'FINSI' ; 'MESSAGE' ; 'MESSAGE' 'Conservative variables check' ; ERRO = 'MAXIMUM' (UNCELL '-' (RV . 'UN')) 'ABS' ; ERRO = ERRO '/' (('MAXIMUM' UNCELL 'ABS') '+' 1.0D-15) ; 'SI' (ERRO > 1.0D-6) ; 'MESSAGE' ; 'MESSAGE' 'UN = ???' ; 'MESSAGE' 'LISTCONS = ???' ; 'ERREUR' 21 ; 'SINON' ; 'MESSAGE' 'OK' ; 'FINSI' ; * **** On which variables the error has to be computed? * 'SI' ('NON' ('EXISTE' RV 'ERROMOTS')) ; 'MESSAGE' ; 'MESSAGE' 'ERROMOTS = ???' ; 'ERREUR' 21 ; 'FINSI' ; * **** Definition of the table containing some results * 'SI' ('NON' ('EXISTE' RV 'RESULTATS')) ; RV . 'RESULTATS' = 'TABLE' ; 'FINSI' ; * **** Existence d'une procédure pour imposer le conditions aux limites * à chaque iteration (interne ou externe) * 'SI' ('NON' ('EXISTE' RV 'CLIM')) ; 'MESSAGE' ; 'MESSAGE' 'CLIM = ???' ; 'ERREUR' 21 ; 'FINSI' ; * Par securité, on les impose tout de suite 'SI' (RV . 'CLIM') ; 'SI' ('NON' ('EXISTE' RV 'MAIFAN')) ; 'MESSAGE' ; 'MESSAGE' 'MAIFAN = ???' ; 'ERREUR' 21 ; 'FINSI' ; RV . 'UN' = PROLIM RV ; * DUCLIM à imposer dans l'inversion matricielle: * pas d'increment sur les cellules fantomes 'SINON' ; DUCLIM = 'COPIER' CHPVID ; 'FINSI' ; RESPRO DUCLIM ; * * ****** Mise a jour de la matrice à inverser pendant les iterations internes? * * RV . 'MATUPDAT' * RV . 'MUPINT' * 'SI' ('NON' ('EXISTE' RV 'MATUPDAT')) ; 'MESSAGE' ; 'MESSAGE' 'MATUPDAT = ???' ; 'ERREUR' 21 ; 'FINSI' ; 'SI' (RV . 'MATUPDAT') ; 'MESSAGE' ; 'MESSAGE' 'We always update the matrix to inverse' ; LOGMAOLD = FAUX ; 'SINON' ; 'MESSAGE' ; 'MESSAGE' 'We don t always update the matrix to inverse' ; LOGMAOLD = VRAI ; 'FINSI' ; * RESPRO LOGMAOLD ; * **** Iterations externes et/ou temps final * La table 'PASDETPS' * 'SI' ('NON' (('EXISTE' RV 'NITMAEX') 'OU' ('EXISTE' RV 'TFINAL'))) ; 'MESSAGE' ; 'MESSAGE' 'NITMAEX = ???' ; 'MESSAGE' 'ou' ; 'MESSAGE' 'TFINAL = ???' ; 'ERREUR' 21 ; 'FINSI' ; * **** Gas model * 'SI' ('NON' ('EXISTE' RV 'PGAZ')) ; 'MESSAGE' ; 'MESSAGE' 'PGAZ = ???' ; 'ERREUR' 21 ; 'FINSI' ; * **** BAS MACH * 'SI' ('NON' ('EXISTE' RV 'BASMACH')) ; 'MESSAGE' ; 'MESSAGE' 'BASMACH = ???' ; 'ERREUR' 21 ; 'SINON' ; 'SI' (RV . 'BASMACH') ; 'SI' (('NON' ('EXISTE' RV 'CO1')) 'OU' ('NON' ('EXISTE' RV 'CO2'))) ; 'MESSAGE' ; 'MESSAGE' 'CO1 = ???' ; 'MESSAGE' 'CO2 = ???' ; 'ERREUR' 21 ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * *** La table PASDETPS * 'SI' ('NON' ('EXISTE' RV 'PASDETPS')) ; 'MESSAGE' ; 'MESSAGE' 'We create the table PASDETPS' ; RV . 'PASDETPS' = 'TABLE' ; 'SINON' ; 'MESSAGE' ; 'MESSAGE' 'We use the table PASDETPS that already exists' ; 'FINSI' ; KTPS = RV . 'PASDETPS' ; * RESPRO KTPS ; * Initialisation éventuelle de la table 'SI' (('NON' ('EXISTE' KTPS 'NUPASDT')) 'OU' ('NON' ('EXISTE' KTPS 'TPS')) 'OU' ('NON' ('EXISTE' KTPS 'TPSM'))) ; 'MESSAGE' ; 'MESSAGE' 'Table PASDETPS' ; 'MESSAGE' 'NUPASDT = 0' ; 'MESSAGE' 'TPS = 0.0' ; 'MESSAGE' ; KTPS . 'NUPASDT' = 0 ; KTPS . 'TPSM' = 0.0D0 ; KTPS . 'TPS' = 0.0D0 ; 'FINSI' ; * * KTPS contient * * KTPS . 'NUPASDT' = numero de pas de TPS actuel dans les itérations * internes * * KTPS . 'TPSM' = le TPS aprés (KTPS . 'NUPASDT' '-' 2) itérations * KTPS . 'TPS' = le TPS aprés (KTPS . 'NUPASDT' '-' 1) itérations * KTPS . 'TPSP' = le TPS aprés (KTPS . 'NUPASDT') itérations, i.e. à * la fin de l'itération actuelle * * * * N.B. 'XINIT' is used in the iterative methods * We have decided to keep it 0 RV . 'MATINV' . 'XINIT' = 0.0 '*' (RV . 'UN') ; 'FINPROC' ; **** $$$$ EXEXIM * ***************************************************** ***************************************************** ** PROCEDURE EXEX POUR FORMULATION VF COMPRESSIBLE ** ***************************************************** ***************************************************** * * RV . 'UN' = les variables conservatives * * RV . 'ANOM' = LOGIQUE (anomalie detectée ?) * * RV . 'DTIMP' = pas de tmps imposé (facultatif) * * RV . 'LISTCONS'= noms des variables conservatives * * RV . 'ERROMOTS'= noms des variables sur lesquelles on calcule Linf * * RV . 'CLIM' = logique qui me dit si existe une procédure pour le * calcul de conditions limites (procédure PROLIM) * * RV . 'MAIFAN' = (a définir si RV . 'CLIM') * les cellules fantômes * * RV . 'TFINAL' = le temps final * * RV . 'NITMAEX' = le nombre d'itération externes * * N.B. Si RV . 'TFINAL' et RV . 'NITMAEX' sont les deux spécifiés, on * s'arrête quand un des deux critères est satisfait * * RV . 'MATUPDAT' = si VRAI, on ne met pas toujours à jour la matrice * à inverser * * RV . 'MUPEXT' = si (RV . 'MATUPDAT'), indice de mise à jours de la * matrice jacobienne pendant les itérations externes * * RV . 'MUPINT' = si (RV . 'MATUPDAT'), indice de mise à jours de la * matrice jacobienne pendant les itérations internes * * RV . 'MUPINI' = si (RV . 'MATUPDAT'), nombre initial de pas de temps * pendant lesquels on met à jour la matrice à chaque * itération externe * * RV . 'MUPLIN' = si (RV . 'MATUPDAT') et on utilise un solveur * itératif pour la résolution du système linéaire, * si le nombre d'itérations linéaires est > que * RV . 'MUPLIN', alors on met à jour le * preconditionneur * * RV . 'MATACC' = si (RV . 'MATUPDAT'), logique qui nous dit si on * veut utiliser la méthode de Broyden. * * RV . 'LISTOPER' = liste des opérateurs (ou des procédures) qui * interviennent dans le calcul (chaque opérateur a une * table associée), qui s'appelle &NOMPER ou * & = position de l'opérateur dedans cette liste * NOMPER = noms de l'opérateur ou de la procédure * * RV . 'NITMAIN' = (à définir dans le cas d'un calcul implicite) * le nombre max d'itération internes * RV . 'NITMIIN' = (à définir dans le cas d'un calcul implicite) * le nombre min d'itération internes * * RV . 'EPSINT' = (à définir dans le cas d'un calcul implicite) * l'erreur pour le critère de convergence sur les * itérations internes * * RV . 'MATHINV' = (a définir sans la cas d'un calcul implicite) * table de SOUSTYPE 'TYPINV' pour l'inversion de * MATRIK (pour l'opérateur 'KRES') * * RV . 'RESULTATS' = table qui contient des resultats * 'NITERLIN' = nombre de iterations lineaires * dans le solveur iteratif * 'ERROLIN' = residu de l'erreur du solveur * iteratif * 'ITERIN' = iteration interne (0, 1, ...) * ************************************************************************* * MODIF ************************************************************************* * Message en anglais! * 'DEBPROC' EXEXIM ; 'ARGUMENT' RV*TABLE ; 'MESSAGE' ; 'MESSAGE' 'PROCEDURE EXEXIM' ; * **** Initialisation and controls into exexch * CHPVID MATVID DUCLIM LOGMAOLD KTPS = EXEXCH RV ; ************************************************************************* ************************************************************************* ************************************************************************* ************************************************************************* ************** ITÉRATIONS EXTERNES ************************************ ************************************************************************* ************************************************************************* ************************************************************************* ************************************************************************* LOGEXP = VRAI ; * LOGEXP = variable logique qui me dit si on est en explicite ; LOGQIE = FAUX ; * **** Boucle qui s'arrête quand LOGQIE = VRAI ; i.e. * * (KTPS . NUPASDT) = (RV . 'NITMAEX') * ou * (KTPS . 'TPS') = (RV . 'TFINAL'); * * 'SI' ('EXISTE' RV 'DTIMP') ; ALPDT = RV . 'DTIMP' ; 'SINON' ; ALPDT = 0.0 ; 'FINSI' ; NITEX = 0 ; 'REPETER' BLEX -1 ; NITEX = NITEX '+' 1 ; * ****** Iteration interne * RV . 'RESULTATS' . 'ITERIN' = 0 ; * ****** Mise à jour de la matrice à inverser * 'SI' ((NITEX 'EGA' 1) 'OU' (RV . 'ANOM')) ; * A la premiere iteration externe on doit calculer la matrice LOGUPEX = VRAI ; 'SINON' ; 'SI' LOGMAOLD ; MUPEXT = RV . 'MUPEXT' ; * On met a jour la matrice toutes les MUPEXT iterations externes LOGUPEX = ((NITEX '/' MUPEXT) '*' MUPEXT) 'EGA' NITEX ; 'FINSI' ; 'FINSI' ; * ****** Trop d'iterations externes? * KTPS . 'NUPASDT' = KTPS . 'NUPASDT' '+' 1 ; 'SI' ('EXISTE' RV 'NITMAEX') ; 'SI' ( (KTPS . 'NUPASDT') '>EG' (RV . 'NITMAEX')) ; LOGQIE = VRAI ; 'FINSI' ; 'FINSI' ; * ****** Impression * 'MESSAGE' ; 'MESSAGE' ('CHAINE' 'PASDETPS = ' (KTPS . 'NUPASDT') ' TPS = ' (KTPS . 'TPS') ' DTM1 = ' ALPDT) ; * *** ALGORITHM A RESOUDRE * * F(U^{n+1}) = 0 * * if (RV . INST) then * * F(U^{n+1}) = -1. * (U^{n+1} - U^{n}) '/' (\delta t) * '+' \sum_k Res_k(U^{n+1}) '+' \sum_kexpl Res_kexpl(U^{n}) * * else * * F(U^{n+1}) = -\sum_k Res_k(U^{n+1}) * * endif * * * Avec une methode de type Newton-Raphson * * a) U^{n+1,0} = U^{n} * * b) for l=0,1,2,... * * MAT(U^{n+1,l}) \delta U^{n+1,l} = -F(U^{n+1,l}) * * U^{n+1,l+1} = U^{n+1,l} '+' \delta U^{n+1,l} * * if || \delta U^{n+1,l} ||_{\inf} < \epsilon goto c) * * c) * * U^{n+1} = U^{n+1,l+1} * * endif * *** LES VARIABLES * * RESIMP = \sum_k Res_k(U^{n+1,l}) * RESEXP = \sum_kexpl Res_kexpl(U^{n}) * MATASS = - \sum_k JACR_k(U^{n+1,l}) * UNM = conserved variables at t^{n} * UNM = conserved variables at t^{n-1} * LREEDT = LISTREEL de (\delta t)_k t.q. * \delta t = min (\delta t)_k * RESIMP = 'COPIER' CHPVID ; RESEXP = 'COPIER' CHPVID ; 'SI' ('EXISTE' RV 'UNM2') ; RV . 'UNM3' = 'COPIER' (RV . 'UNM2') ; 'FINSI' ; 'SI' ('EXISTE' RV 'UNM') ; RV . 'UNM2' = 'COPIER' (RV . 'UNM') ; 'FINSI' ; RV . 'UNM' = 'COPIER' (RV . 'UN') ; * *********************************************** ********* Boucle sur les operateurs *********** *********************************************** *** On calcule: LREEDT * RESIMP * RESEXP * (MATASS) * NOMPER = 'EXTRAIRE' &BLOP (RV . 'LISTOPER') ; 'SI' (RV . NOTABLE . 'IMPL') ; 'SI' ('EGA' NITEX 1) ; 'MESSAGE' ; 'FINSI' ; * JACO = objet de type MATRIK (éventuellement vide) * RESIDU = " RESIDU " * ALPHADT = " LISTREEL " LOGEXP = FAUX ; 'SI' (RV . NOTABLE . 'ANOM') ; RV . 'ANOM' = VRAI ; RV . NOTABLE . 'ANOM' = FAUX ; 'QUITTER' BLOP ; 'SINON' ; RESIMP = RESIMP 'ET' RESIDU ; 'FINSI' ; 'SINON' ; 'SI' ('EGA' NITEX 1) ; 'MESSAGE' ; 'FINSI' ; RESIDU ALPHADT = ('TEXTE' NOMPER) (RV . NOTABLE) ; 'SI' (RV . NOTABLE . 'ANOM') ; RV . 'ANOM' = VRAI ; 'QUITTER' BLOP ; 'SINON' ; RESEXP = RESEXP 'ET' RESIDU ; 'FINSI' ; 'FINSI' ; LREEDT = LREEDT 'ET' ALPHADT ; 'FIN' BLOP ; *********************************************** ***** Fin de la boucle sur les operateurs **** *********************************************** * ******* Anomalie detectée (CTRL+S 9999) * On arrete ici * 'SI' ('NON' (RV . 'ANOM')) ; * ******* On controlle la compatibilité E/S (si NITEX = 1) * 'SI' ('EGA' NITEX 1) ; * **** Dans le cas implicite, on verifie l'existence * des parametres pour les itérations internes * 'SI' ('NON' LOGEXP) ; 'SI' ('NON' (('EXISTE' RV 'NITMAIN') 'ET' ('EXISTE' RV 'EPSINT') 'ET' ('EXISTE' RV 'NITMIIN'))); 'MESSAGE' ; 'MESSAGE' 'NITMAIN = ??? ' ; 'MESSAGE' 'NITMIIN = ??? ' ; 'MESSAGE' 'EPSINT = ??? ' ; 'ERREUR' 21 ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * ******* Fin contrôle compatibilité E/S * *** Mise a jour de la table RV . 'PASDETPS' au debu du calcul * 'SI' ('EXISTE' RV 'DTIMP') ; ALPDT = RV . 'DTIMP' ; 'SINON' ; ALPDT = 'MINIMUM' LREEDT ; 'FINSI' ; ALPDT1 = (RV . 'TFINAL') '-' (KTPS . 'TPS') ; 'SI' ((ALPDT 'EGA' ALPDT1 (ALPDT '*' 1.0D-6)) 'OU' (ALPDT > ALPDT1)) ; KTPS . 'TPSP' = (RV . 'TFINAL') ; ALPDT = ALPDT1 ; LOGQIE = VRAI ; * Dans ce cas, il faut metre a jour la matrice à inverser * car elle peut etre tres differnte pas rapport à celle * calculé precedentment LOGMAOLD = FAUX ; 'SINO' ; KTPS . 'TPSP' = (KTPS . 'TPS') '+' ALPDT ; 'FINSI' ; * 'SI' LOGEXP ; ************************************************************************* ********** Cas explicite pour les variables conservatives *************** ************************************************************************* 'SI' ((NITEX 'EGA' 1) 'OU' ((RV . 'ORDTPS') 'EGA' 1)) ; RV . 'UN' = (RV . 'UNM') '+' (ALPDT '*' RESEXP) ; 'SINON' ; RV . 'UN' = ((4. '/' 3.) '*' (RV . 'UNM')) '+' ((-1. '/' 3.) '*' (RV . 'UNM2')) '+' (((2. * ALPDT) '/' 3.) '*' RESEXP) ; 'FINSI' ; 'SI' (RV . 'CLIM') ; * 'MESSAGE' 'PROLIM after an explicit iteration' ; RV . 'UN' = PROLIM RV ; 'FINSI' ; 'SINON' ; ************************************************************************* ********** Cas implicite pour les variables conservatives *************** ************************************************************************* * ****** Initialisation of RV . 'RESULTATS' . 'ERRONLIN' ; * * ************************************************************************* ************** Les iterations internes ********************************** ************************************************************************* * 'REPETER' BLINT (RV . 'NITMAIN') ; * RV . 'RESULTATS' . 'ITERIN' = &BLINT ; * ****** Implicite * 'SI' ((NITEX 'EGA' 1) 'OU' ((RV . 'ORDTPS') 'EGA' 1)) ; * *************** Implicit Euler * (RV . 'MATIDE') ; SMB = ((RV . 'UNM') '-' (RV . 'UN')) '/' ALPDT ; 'SINON' ; * **************** BDF2 * (RV . 'MATIDE') ; SMB = ((4. '*' (RV . 'UNM')) '+' (-3. '*' (RV . 'UN')) '+' (-1. '*' (RV . 'UNM2'))) '/' (2. '*' ALPDT) ; 'FINSI' ; * ********* Bas Mach * 'SI' (RV . 'BASMACH') ; MAT1 = MAT1 'ET' (RV . 'GAMSDTAU') ; 'FINSI' ; * MATTOT = MAT1 'ET' MATASS ; RESTOT = SMB 'ET' RESIMP 'ET' RESEXP ; * ********* LOGOLD = VRAI * Si methode directe, on utilise la meme parametrisation LU * Si methode iterative, on utilise le meme preconditionneur * LOGOLD = VRAI ; 'SI' LOGMAOLD ; 'SI' (LOGUPEX 'ET' (&BLINT 'EGA' 1)) ; * LOGUPEX = VRAI -> At this external iteration we can * update the matrix to inverse 'OUBLIER' MATOLD ; 'MENAGE' ; MATOLD = MATTOT ; LOGOLD = FAUX ; 'MESSAGE' ; 'MESSAGE' 'We update the matrix' ; 'SINON' ; * We don't care about LOGUPEX if (&BLINT > 1) * In this case we update the matrix each MUPINT-th * iteration 'SI' (((&BLINT '/' (RV . 'MUPINT')) '*' (RV . 'MUPINT')) 'EGA' &BLINT) ; 'OUBLIER' MATOLD ; 'MENAGE' ; MATOLD = MATTOT ; LOGOLD = FAUX ; 'MESSAGE' ; 'MESSAGE' 'We update the matrix' ; 'FINSI' ; 'FINSI' ; 'SINON' ; * * We always update the matrix to inverse * 'OUBLIER' MATOLD ; 'MENAGE' ; LOGOLD = FAUX ; MATOLD = MATTOT ; 'FINSI' ; * 'SI' ('EXISTE' (RV . 'MATINV') 'CONVINV') ; 'SI' LOGOLD ; 'SI' (NLIT > RV . 'MUPLIN') ; 'MESSAGE' ; 'MESSAGE' 'We update the matrix' ; 'OUBLIER' MATOLD ; 'MENAGE' ; MATOLD = MATTOT ; 'FINSI' ; 'FINSI' ; 'FINSI' ; RV . 'MATINV' . 'MATASS' = MATOLD ; RV . 'MATINV' . 'MAPREC' = MATOLD ; * 'SI' LOGOLD ; * * LOGOLD vrai si on utilise la meme * parametrisation LU ou le meme preconditionneur * pour calculer la solution du systeme lineaire * 'SI' ((RV . 'MATINV' . 'TYPINV') 'EGA' 1) ; * Meme parametrisation LU que MATOLD DELTAU = 'KRES' MATOLD 'TYPI' (RV . 'MATINV') 'CLIM' DUCLIM 'SMBR' RESTOT 'IMPR' 0 ; 'SINON' ; * Meme preconditionneur que MATOLD DELTAU = 'KRES' MATTOT 'TYPI' (RV . 'MATINV') 'CLIM' DUCLIM 'SMBR' RESTOT 'IMPR' 0 ; 'FINSI' ; 'SINON' ; DELTAU = 'KRES' MATOLD 'TYPI' (RV . 'MATINV') 'CLIM' DUCLIM 'SMBR' RESTOT 'IMPR' 0 ; 'FINSI' ; RV . 'UN' = (RV . 'UN') '+' DELTAU ; 'SI' (RV . 'CLIM') ; UNCELL = RV . 'UN' ; * 'PROLIM after the matrix inversion' ; RV . 'UN' = PROLIM RV ; * We redefine DELTAU to compute the error DELTAU = ((RV . 'UN') '-' UNCELL) '+' DELTAU ; 'FINSI' ; * ********* Boucle sur les operateurs implicites pour calculer RESIMP * et MATASS de RV . 'UN' RESIMP = 'COPIER' CHPVID ; NOMPER = 'EXTRAIRE' &BLOP (RV . 'LISTOPER') ; 'SI' (RV . NOTABLE . 'IMPL') ; JACO RESIDU ALPHADT = ('TEXTE' NOMPER) (RV . NOTABLE) ; 'SI' (RV . NOTABLE . 'ANOM') ; RV . 'ANOM' = VRAI ; 'QUITTER' BLINT ; 'SINON' ; RESIMP = RESIMP 'ET' RESIDU ; 'FINSI' ; 'FINSI' ; 'FIN' BLOP ; * ********* Test de convergence * ERRO = 'MAXIMUM' DELTAU 'ABS' 'AVEC' (RV . 'ERROMOTS') ; 'SI' (&blint 'EGA' 1) ; ERRO0 = ERRO ; 'FINSI' ; RV . 'RESULTATS' . 'ERRONLIN' = (RV . 'RESULTATS' * ********* Impression * 'MESSAGE' ; 'MESSAGE' ('CHAINE' 'PASDETPS = ' (KTPS . 'NUPASDT') ' TPS = ' (KTPS . 'TPS') ' DT = ' ALPDT) ; 'MESSAGE' ('CHAINE' 'ITERIN = ' &BLINT) ; MOTERR = 'EXTRAIRE' (RV . 'LISTCONS') &BLERRO ; ERRBLE = 'MAXIMUM' DELTAU 'ABS' 'AVEC' 'MESSAGE' (CHAIN 'ERREUR on ' MOTERR ' = ' ERRBLE) ; 'FIN' BLERRO ; 'SI' (('EXISTE' (RV . 'MATINV') 'CONVINV')) ; 'MESSAGE' ('CHAINE' 'Linear iterations = ' NLIT ); RV . 'RESULTATS' . 'NITERLIN' = NLIT ; 'MESSAGE' ('CHAINE' 'Linear residuum = ' REIT ); RV . 'RESULTATS' . 'ERROLIN' = REIT ; 'FINSI' ; * ************ Criteres de sortie * 'SI' (&BLINT > (RV . 'NITMIIN')) ; 'SI' ('EXISTE' RV 'EPSREL') ; 'SI' (ERRO < ((RV . 'EPSREL') '*' ERRO0)) ; 'QUITTER' BLINT ; 'FINSI' ; 'FINSI' ; 'SI' (ERRO '<' (RV . 'EPSINT')) ; 'QUITTER' BLINT ; 'FINSI' ; 'FINSI' ; * 'SI' (ERRO > (1.0D3 '*' ERRO0)) ; * RV . 'ANOM' = VRAI ; * 'QUITTER' BLINT ; * 'FINSI' ; * 'SI' (&BLINT '>EG' (RV . 'NITMAIN')) ; * RV . 'ANOM' = VRAI ; * 'QUITTER' BLINT ; * 'FINSI' ; 'FIN' BLINT ; ************************************************************************* **************** Fin boucle iterations internes ************************* ************************************************************************* *********************************************** ************* Fin cas implicite *************** *********************************************** 'FINSI' ; * ('SI' (RV . 'ANOM') ;) 'FINSI' ; * 'SI' (RV . 'ANOM') ; LOGQIE = FAUX ; NITEX = NITEX '-' 1 ; KTPS . 'NUPASDT' = KTPS . 'NUPASDT' '-' 1 ; KTPS . 'TPSP' = KTPS . 'TPS' ; RV . 'UN' = 'COPIER' RV . 'UNM' ; 'SI' ('EXISTE' RV 'UNM2') ; RV . 'UNM' = 'COPIER' (RV . 'UNM2') ; 'FINSI' ; 'SINON' ; * *** Mise a jour de la table RV . 'PASDETPS' à la fin du calcul * KTPS . 'TPSM' = KTPS . 'TPS' ; KTPS . 'TPS' = KTPS . 'TPSP' ; 'FINSI' ; * **** Dernier commande de BLEX * 'SI' LOGQIE ; 'QUITTER' BLEX ; 'FINSI' ; 'FIN' BLEX ; 'FINPROC' ; ***************************************************** ***************************************************** ** FIN PROCEDURE EXEX ** ***************************************************** ***************************************************** *****$$$$ PKON ***************************************************** ***************************************************** ** PROCÉDURE PKON ** ***************************************************** ***************************************************** * Il faut définir: * * *KKONV . 'EQEX' = table générale, qui contient toutes les * informations sur le calcul qu'on va faire. * Dans ce table, on ne prend que: * - la table (KKONV . 'EQEX' . 'PASDETPS') * - les inconnues du problème * (KKONV . 'EQEX' . 'UN') * - le maillage fantome * (KKONV . 'EQEX' . 'MAIFAN') * - les vitesses de cut-off pour le bas Mach * (KKONV . 'EQEX' . 'CO1') * (KKONV . 'EQEX' . 'CO2') * * *KKONV . 'GAZ' = le modelé de gaz qu'on considère * - si KKONV . 'GAZ' = 'PERFMONO', alors * on considère un gaz parfait mono-espèce * polytropique * * *KKONV . 'MODELE' = objet modele * * *KKONV . 'LISTCONS' = les noms des variables conservatives, i.e. * densité, q.d.m., energie totale par unité de * volume * * *KKONV . 'IMPL' = calcul implicite ou non ? * * *KKONV . 'METHODE' = méthode pour le calcul du flux convectif * * *KKONV . 'TYPEJACO' = 'VLH' * 'AUSMPLUS' * 'AUSMPLM' * (à donner si (KKONV . 'IMPL')) * * *KKONV . 'ORDREESP' = ordre en espace (1 ou 2) ; * * *KKONV . 'GRADRN' coeff. pour calculer le gradient de la densité * *KKONV . 'GRADVN' coeff. pour calculer le gradient de la vitesse * *KKONV . 'GRADPN' coeff. pour calculer le gradient de la pression * *KKONV . 'VLIM' vitesses au bord imposées * (à donner si (KKONV . 'ORDREESP') = 2) * * *KKONV . 'LIMITEUR' = limiteur utilisé * (à donner si (KKONV . 'ORDREESP') = 2) * * *KKONV . 'NFROZLIM' = entier * On gele les limiteurs quand * RV . 'PASDETPS' . 'NUPASDT' = KKONV . 'NFROZLIM' * On le met dedans * *KKONV . 'FROZALR' * *KKONV . 'FROZALP' * *KKONV . 'FROZALV' * * *KKONV . 'ALPHA' = coefficient de securité pour le quel on * multiplie le pas de tps determiné par un * condition de type CFL. * Il peut etre: * - un flottant * - une mot que veut 'INF' * * *KKON . 'FACELIM' = maillage de centres de face ou on ne calcule pas * le flux convectif et le jacobien * * *KKON . 'CLIM' = LOGIQUE * si vrai on doit definir une procedure PKOCLI * * *KKON . 'DT' = output. Donne les pas de temps plus petit * (r_elem/(u+c)) * 'DEBPROC' PKON ; 'ARGUMENT' KKONV * TABLE ; * * METO = KKONV . 'METHODE' ; * * LOGIMP = KKONV . 'IMPL'; LOGEXP = 'NON' LOGIMP ; * ORDESP = KKONV . 'ORDREESP' ; * 'SI' (('NEG' (KKONV . 'ALPHA') 'INF') 'ET' 'MESSAGE' 'PKON . ALPHA = ???' ; 'ERREUR' 21 ; 'FINSI' ; * * 'SI' ('NEG' (KKONV . 'GAZ') 'PERFMONO') ; * ******** EULER, monoespece, "calorically perfect" (cv = constant) * 'MESSAGE' ; 'MESSAGE' 'PKON . GAZ = ???' ; 'ERREUR' 21 ; 'FINSI' ; * **** Type de jacobien (Bas Mach ?) * 'SI' LOGIMP ; ITJACO = 0 ; 'SI' (('EGA' (KKONV . 'TYPEJACO') 'AUSMPLM') 'OU' ('EGA' (KKONV . 'TYPEJACO') 'RUSANOLM') 'OU' ('EGA' (KKONV . 'TYPEJACO') 'ROELM') 'OU' ('EGA' (KKONV . 'TYPEJACO') 'HLLCLM')) ; ITJACO = -1 ; 'FINSI' ; 'FINSI' ; * ITMETO = 0 ; 'SI' (('EGA' METO 'AUSMPLM') 'OU' ('EGA' METO 'RUSANOLM') 'OU' ('EGA' METO 'ROELM') 'OU' ('EGA' METO 'HLLCLM')) ; ITMETO = -1 ; 'FINSI' ; * ***** Les variables conservatives * MOT1 = 'EXTRAIRE' (KKONV . 'LISTCONS') 1 ; NOMMOM = 'EXTRAIRE' (KKONV . 'LISTCONS') MOT2 = 'EXTRAIRE' (KKONV . 'LISTCONS') 4 ; 'SINON' ; NOMMOM = 'EXTRAIRE' (KKONV . 'LISTCONS') MOT2 = 'EXTRAIRE' (KKONV . 'LISTCONS') 5 ; 'FINSI' ; * ***** On calcule les variables primitive * GAMN = (RV . 'PGAZ' . 'GAMN') ; * VN PN = PPRIM RN GN RETN GAMN ; * 'SI' ((('MINIMUM' PN) < 0) 'OU' (('MINIMUM' RN) < 0)) ; * 'MESSAGE' 'Negative density or pressure' ; * KKONV . 'ANOM' = VRAI ; * RN = ('ABS' RN) '+' (('MAXIMUM' RN 'ABS') '*' 1.001) ; * PN = ('ABS' PN) '+' (('MAXIMUM' PN 'ABS') '*' 1.001) ; * 'FINSI' ; * **** Conditions aux limits ??? * 'SI' (KKONV . 'CLIM') ; * TABLIM = 'TABLE' definie dans le programme principal ; KKONV . 'TABLIM' . 'RN' = RN ; KKONV . 'TABLIM' . 'VN' = VN ; KKONV . 'TABLIM' . 'PN' = PN ; KKONV . 'TABLIM' . 'GAMN' = GAMN ; CHPLIM RESLIM JACLIM = PKOLIM (KKONV . 'TABLIM') ; MAILLIM = ('EXTRAIRE' CHPLIM 'MAILLAGE') 'ET' (KKONV . 'FACELIM') ; 'SINON' ; MAILLIM = KKONV . 'FACELIM' ; CHPLIM = 'COPIER' RESLIM ; 'FINSI' ; MAILLIM = 'CHANGER' 'POI1' MAILLIM ; * **** La gravite * * RN GN (KKONV . 'GRAVITE') ; * RN GN (KKONV . 'GRAVITE') ; * * Fin contribution gravité * * ***** On calcule les variables aux faces * ORDTPS = 1 ; * 'SI' (ORDESP 'EGA' 1) ; * ********* Ordre 1 en espace * (KKONV . 'MODELE') RN VN PN GAMN ; 'SINON' ; * ********* Ordre 2 en espace * 'SI' (KKONV . 'CLIM') ; (KKONV . 'LIMITEUR') NOMVEL VN 'CLIM' 'GRADGEO' (KKONV . 'GRADVN') ; * * 'SINON' ; (KKONV . 'LIMITEUR') NOMVEL VN 'CLIM' (KKONV . 'VLIM') 'GRADGEO' (KKONV . 'GRADVN') ; 'GRADGEO' (KKONV . 'GRADRN') ; * 'GRADGEO' (KKONV . 'GRADPN') ; 'FINSI' ; * ****** Limiters = 0 on ghostcells * 'SI' (('EXISTE' RV 'MAIFAN')) ; CELL = ALR ; ALR = ALR '-' ALRLEV ; 'DETR' CELL ; CELL = ALP ; ALP = ALP '-' ALPLEV ; 'DETR' CELL ; CELL = ALV ; ALV = ALV '-' ALVLEV ; 'DETR' CELL ; 'FINSI' ; * ****** Frozen Limiters * * External iterations * 'SI' ('EXISTE' KKONV 'NFROZLIM') ; ITEREX = RV . 'PASDETPS' . 'NUPASDT' ; 'SI' (ITEREX 'EGA' (KKONV . 'NFROZLIM')) ; 'MESSAGE' ; 'MESSAGE' 'External iterations' ; 'MESSAGE' 'We froze the limiters' ; KKONV . 'FROZALR' = 'COPIER' ALR ; KKONV . 'FROZALP' = 'COPIER' ALP ; KKONV . 'FROZALV' = 'COPIER' ALV ; 'SINON' ; 'SI' (ITEREX > (KKONV . 'NFROZLIM')) ; * * Min * DAR = (ALR '-' (KKONV . 'FROZALR')) 'ABS' ; DAP = (ALP '-' (KKONV . 'FROZALP')) 'ABS' ; DAV = (ALV '-' (KKONV . 'FROZALV')) 'ABS' ; ALR = (ALR '+' (KKONV . 'FROZALR')) '-' DAR ; ALP = (ALP '+' (KKONV . 'FROZALP')) '-' DAP ; ALV = (ALV '+' (KKONV . 'FROZALV')) '-' DAV ; ALR = ALR '/' 2.0 ; ALV = ALV '/' 2.0 ; ALP = ALP '/' 2.0 ; KKONV . 'FROZALR' = 'COPIER' ALR ; KKONV . 'FROZALP' = 'COPIER' ALP ; KKONV . 'FROZALV' = 'COPIER' ALV ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * * Internal iterations * 'SI' ('EXISTE' KKONV 'NFROZLII') ; ITERIN = RV . 'RESULTATS' . 'ITERIN' ; 'SI' (ITERIN 'EGA' (KKONV . 'NFROZLII')) ; 'MESSAGE' ; 'MESSAGE' 'Internal iterations' ; 'MESSAGE' 'We froze the limiters' ; KKONV . 'FROZALR' = 'COPIER' ALR ; KKONV . 'FROZALP' = 'COPIER' ALP ; KKONV . 'FROZALV' = 'COPIER' ALV ; 'SINON' ; 'SI' (ITERIN > (KKONV . 'NFROZLII')) ; DAR = (ALR '-' (KKONV . 'FROZALR')) 'ABS' ; DAP = (ALP '-' (KKONV . 'FROZALP')) 'ABS' ; DAV = (ALV '-' (KKONV . 'FROZALV')) 'ABS' ; ALR = (ALR '+' (KKONV . 'FROZALR')) '-' DAR ; ALP = (ALP '+' (KKONV . 'FROZALP')) '-' DAP ; ALV = (ALV '+' (KKONV . 'FROZALV')) '-' DAV ; ALR = ALR '/' 2.0 ; ALV = ALV '/' 2.0 ; ALP = ALP '/' 2.0 ; KKONV . 'FROZALR' = 'COPIER' ALR ; KKONV . 'FROZALP' = 'COPIER' ALP ; KKONV . 'FROZALV' = 'COPIER' ALV ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * * ********* Ordre 1 en temps * ROF VITF PF GAMF = 'PRET' 'PERFMONO' ORDESP ORDTPS (KKONV . 'MODELE') RN GRADR ALR VN GRADV ALV PN GRADP ALP GAMN ; 'FINSI' ; * 'SI' (ITMETO 'EGA' (-1)) ; (KKONV . 'LISTCONS') (KKONV . 'MODELE') ROF VITF PF GAMF MAILLIM (RV . 'CO1') (RV . 'CO2') ; 'SINON' ; (KKONV . 'LISTCONS') (KKONV . 'MODELE') ROF VITF PF GAMF MAILLIM ; 'FINSI' ; * 'SINON' ; 'FINSI' ; KKONV . 'DT' = DELTAT ; * **** Low Mach * 'SI' (RV . 'BASMACH') ; RN VN PN GAMN (RV . 'CO1') (RV . 'CO2') ; (1. '/' (KKONV . 'CFLDTAU')) MATBM ; 'FINSI' ; * 'SI' LOGIMP ; 'SI' (ITJACO 'EGA' 0) ; (KKONV . 'LISTCONS') MAILLIM (KKONV . 'TYPEJACO') RN VN PN GAMN ; 'SINON' ; (KKONV . 'LISTCONS') MAILLIM (KKONV . 'TYPEJACO') RN VN PN GAMN (RV . 'CO1') (RV . 'CO2') ; 'FINSI' ; (RESIDU '+' RESLIM '+' RESGRA) ALPDT ; 'SINON' ; 'RESPRO' (RESIDU '+' RESLIM '+' RESGRA) ALPDT ; 'FINSI' ; * **** On detrui les choses qui ne servent plus * 'DETR' UN ; 'OUBL' UN ; 'DETR' RN ; 'DETR' GN ; 'DETR' RETN ; 'DETR' VN ; 'DETR' PN ; 'OUBL' RN ; 'OUBL' GN ; 'OUBL' RETN ; 'OUBL' VN ; 'OUBL' PN ; * **** Les MCHAML faces * 'DETR' ROF ; 'DETR' VITF ; 'DETR' PF ; 'DETR' GAMF ; 'OUBL' ROF ; 'OUBL' VITF ; 'OUBL' PF ; 'OUBL' GAMF ; * **** Les pentes et les limiteurs * 'SI' (ORDESP 'EGA' 2); * 'DETR' GRADR ; 'DETR' GRADP ; 'DETR' GRADV ; 'DETR' ALR ; 'DETR' ALP ; 'DETR' ALV; * 'OUBL' GRADR ; 'OUBL' GRADP ; 'OUBL' GRADV ; 'OUBL' ALR ; 'OUBL' ALP ; 'OUBL' ALV; * 'FINSI' ; 'FINPROC' ; ***************************************************** ***************************************************** ** FIN PROCEDURE PKON ** ***************************************************** ***************************************************** ********************************************************************* **** Procedure PKOLIM *********************************************** ********************************************************************* 'DEBPROC' PKOLIM ; 'ARGUMENT' TABLIM*'TABLE' ; MDOMINT MLIGG LISTCONS LISTP (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN') (TABLIM . 'GAMN') (TABLIM . 'CHINRI') 'INRI' ; RJACO1 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'JACOCONS' MDOMINT MLIGG LISTCONS LISTP (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN') (TABLIM . 'GAMN') (TABLIM . 'CHINRI') 'INRI' ; MDOMINT MLIGD LISTCONS LISTP (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN') (TABLIM . 'GAMN') (TABLIM . 'CHOUTR') 'OUTRI' ; RJACO2 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'JACOCONS' MDOMINT MLIGD LISTCONS LISTP (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN') (TABLIM . 'GAMN') (TABLIM . 'CHOUTR') 'OUTRI' ; CHPLIM = RCHLIM1 '+' RCHLIM2 ; RESLIM = RCHRES1 '+' RCHRES2 ; JACLIM = RJACO1 'ET' RJACO2 ; 'RESPRO' CHPLIM RESLIM JACLIM ; 'FINPROC' ; ********************************************************************* **** Procedure CALC ************************************************* ********************************************************************* * * Personal procedure * 'DEBP' CALC ; * UN = RV . 'UN' ; MCALC = RVX . 'MODELE' ; * * During the external iteration (except the first; in which * UNM = UN of the previous step ) * 'SI' ('NEG' 0 (RV . 'RESULTATS' . 'ITERIN')) ; * 'SI' ('EGA' (RVX . 'COMPT') 0) ; 'SINON' ; ERRO = 'ABS' (PN '-' (RVX . 'PN0')) ; ERRO = ERRO '/' VOLTOT ; (RVX . 'COMPT')) ; 'FINSI' ; RVX . 'PN0' = PN ; RVX . 'COMPT' = (RVX . 'COMPT') '+' 1 ; 'FINSI' ; * * We change the cut-off during the internal iterations * 'SI' FAUX ; 'SI' ((RV . 'RESULTATS' . 'ITERIN') > 0) ; CUMAX = RV . 'CO1MAX' ; CUMIN = RV . 'CO1MIN' ; DCU = (CUMIN '-' CUMAX) '/' 5 ; CU = CUMAX '+' (DCU * (RV . 'RESULTATS' . 'ITERIN')) ; * Take the max between CU and CUMIN A = CUMIN '+' CU ; B = 'ABS' (CUMIN '-' CU) ; CU = 0.5 '*' (A '+' B) ; * RV . 'CO1' = CU ; RV . 'CO2' = CU ; 'FINSI' ; 'FINSI' ; * * 'MENAGE' ; * 'SI' (RVX . 'IMPL') ; 'RESPRO' IJACO IRESU IALPDT ; 'SINON' ; 'RESPRO' IRESU IALPDT ; 'FINSI' ; * 'FINP' ; * ************************************************************************ ************************************************************************ ***************** FIN PARTIE PROCEDURES ******************************** ************************************************************************ ************************************************************************ ************************************************************************ ************************************************************************ ************************************************************************ **************************** MESH ************************************** ************************************************************************ ************************************************************************ NY = 5 '*' RAF ; NX1 = 4 '*' RAF ; NX2 = 2 '*' NX1 ; NX3 = NX1 ; NX = (NX1 '+' NX2 '+' NX3) ; DX = (4.0 '/' NX) ; A0 = -2.0 0.0 ; A1 = -1.0 0.0 ; A2 = 1.0 0.0 ; A3 = 2.0 0.0 ; A4 = 2.0 1.0 ; A5 = -2.0 1.0 ; * **** LIGB * LIGB1 = A0 'DROIT' NX1 A1 ; * LIGB2 (On utilise un propriete de 'ET' ; si 'ET' change ?) xcel = ('COORDONNEE' 1 A1) '+' DX ; ycel = 0.1 '*' ( 1.0 '+' ('COS' (180 '*' xcel))); ACEL = xcel ycel ; LIGB2 = A1 'DROIT' 1 ACEL ; 'REPETER' BL1 (NX2 '-' 2) ; ACEL0 = ACEL ; xcel = xcel '+' DX ; ycel = 0.1 '*' ( 1.0 '+' ('COS' (180 '*' xcel))); ACEL = xcel ycel ; LIGB2 = LIGB2 'ET' (ACEL0 'DROIT' 1 ACEL) ; 'FIN' BL1; LIGB2 = LIGB2 'ET' (ACEL 'DROIT' 1 A2) ; LIGB3 = A2 'DROIT' NX3 A3 ; LIGB = LIGB1 'ET' LIGB2 'ET' LIGB3 ; * **** LIGH * LIGH = A4 'DROIT' NX A5 ; * **** DOMINT * DOMINT = LIGH 'REGLER' NY ('INVERSE' LIGB) ; LIGCON = 'CONTOUR' DOMINT ; * *** LIGG * * **** LIGD * * **** MODEL OBJECTS * MDOMINT = 'MODELISER' DOMINT 'EULER' ; MLIGG = 'MODELISER' LIGG 'EULER' ; MLIGD = 'MODELISER' LIGD 'EULER' ; * **** Creation of DOMAINE tables via the MODEL object * QDOMINT = TDOMINT . 'QUAF' ; QLIGD = TLIGD . 'QUAF' ; QLIGG = TLIGG . 'QUAF' ; 'ELIMINATION' QDOMINT (DX '/' 100.) QLIGG ; 'ELIMINATION' QDOMINT (DX '/' 100.) QLIGD ; 'SI' GRAPH ; 'TRACER' (DOMINT 'ET' (LIGG 'COULEUR' 'ROUG') 'ET' (LIGD 'COULEUR' 'BLEU')) 'TITRE' 'Domaine total' ; 'FINSI' ; ******************************************* ****** LIGNE de Post-traitement *********** ******************************************* X1 Y1 = 'COORDONNEE' POIN0 ; X0 = X1 ; Y0 = Y1 ; X1 Y1 = 'COORDONNEE' POIN0 ; XFAC = (X0 '+' X1) '/' 2 ; YFAC = (Y0 '+' Y1) '/' 2 ; 'LARGEMENT' PFAC ; * **** Tranformation en POI1 * GEO1POI1 = 'CHANGER' 'POI1' GEOFAC1 ; * **** Il faur verifier que PFAC = PCEL12 = PCEL22 * ('NBEL' GEO1POI1) = ('NBEL' GEO2POI1) = 2 * 'MESSAGE' ; 'MESSAGE' 'Probleme dans la creation de la ligne pour le post.'; 'MESSAGE' ; 'ERREUR' 21 ; 'FINSI' ; 'SI' ( PCEL12 'NEG' PFAC); 'MESSAGE' ; 'MESSAGE' 'Probleme dans la creation de la ligne pour le post.'; 'MESSAGE' ; 'ERREUR' 21 ; 'FINSI' ; * *** Creation d'un maillage SEG2 * 'SI' (&BLLIM 'EGA' 1); PCEN0 = PCEL11 ; 'SINON' ; 'SI' (&BLLIM 'EGA' 2); LIGPOST = 'MANUEL' 'SEG2' PCEN0 PCEL11 ; PCEN0 = PCEL11 ; 'SINO' ; LIGPOST = LIGPOST 'ET' ('MANUEL' 'SEG2' PCEN0 PCEL11) ; PCEN0 = PCEL11 ; 'FINSI' ; 'FINSI' ; 'FIN' BLLIM ; 'SI' GRAPH ; 'TRACER' (DOMINT 'ET' (LIGPOST 'COULEUR' 'VERT')) 'TITRE' 'LIGPOST' ; 'FINSI' ; *************************************************************** *************************************************************** *************************************************************** ************** Initial conditions ***************************** *************************************************************** *************************************************************** *************************************************************** * *** C.L. et initiales * C_INF = GAMSCAL * P_INF '/' RO_INF ; C_INF = C_INF '**' 0.5 ; M_INF = U_INF '/' C_INF ; * * Names of conserved variables and others * * NOMPRE = 'MOTS' 'NOMPRE' ; LISTCONS = NOMDEN 'ET' NOMMOM 'ET' NOMRET ; * rek_inf = 0.5D0 * u_inf * u_inf * ro_inf ; rei_inf = P_INF '/' (gamscal '-' 1.0D0) ; 'UY' 0.0 ; (rei_inf '+' rek_inf) ; ERRO = ('MAXIMUM' (PN0 '-' p_inf) 'ABS') / p_inf ; 'SI' (ERRO > 1.0D-16) ; 'ERREUR' 21 ; 'FINSI' ; ERRO = ('MAXIMUM' (aa '-' u_inf) 'ABS') / u_inf ; 'SI' (ERRO > 1.0D-16) ; 'ERREUR' 21 ; 'FINSI' ; C2 = GAMN '*' ( PN0 '/' RN0) ; CN0 = C2 '**' 0.5 ; MACH2 = VN2 '/' C2; MACHN0 = MACH2 '**' 0.5; * **** Plot of IC * 'SI' GRAPH ; 'TRACER' CHM_RN MDOMINT 'TRACER' CHM_PN MDOMINT 'TRACER' CHM_VN MDOMINT 'TRACER' CHM_MACH MDOMINT 'FINSI' ; ***************************************************** ***************************************************** ***************************************************** **************** La table RV ********************** ***************************************************** ***************************************************** ***************************************************** * RV = 'TABLE' ; RV . 'ANOM' = FAUX ; * Constant time step CFLREF = 100.0 ; UREF = u_inf ; UREF = c_inf ; RV . 'DTIMP' = CFLREF * DX '/' UREF ; * RV . 'ORDTPS' = 1 ; * RV . 'UN' = UNCONS ; RV . 'LISTCONS' = LISTCONS ; RV . 'ERROMOTS' = NOMRET ; * RV . 'CLIM' = FAUX ; * RV . 'CONS' = FAUX ; * RV . 'TFINAL' = 1.0E6 ; RV . 'NITMAEX' = NITER ; * RV . 'NITMAIN' = 6 ; RV . 'NITMIIN' = 6 ; RV . 'EPSINT' = 1.0D-16 ; * * RV . 'FEXT' = 20 ; * RV . 'FINT' = 1 ; * * CALCTAB = 'TABLE' ; RV . '1CALC' = CALCTAB ; PKONTAB = 'TABLE' ; RV . '2PKON' = PKONTAB ; * 'MATRIK' ; * **** Parametres de la procedure PROLIM * * Gas model * Gas properties RV . 'PGAZ' = 'TABLE' ; RV . 'PGAZ' . 'R' = Rair ; RV . 'PGAZ' . 'GAMN' = gamn ; * RV . 'PGAZ' . 'MU' = 0.0 ; * RV . 'PGAZ' . 'LAMBDA' = 0.0 ; * Bas Mach (PKON) RV . 'BASMACH' = FAUX ; 1 'SCAL' (10 * U_INF) ; 1 'SCAL' (10 * U_INF) ; 1 'SCAL' (10 * U_INF) ; RV . 'CO2' = 'COPIER' ( RV . 'CO1') ; * RV . 'CO2' can be Modified into PDIF ***************** ** CALCUL ******* ***************** * Personal procedure * CALCTAB . 'ANOM' = FAUX ; CALCTAB . 'MODELE' = MDOMINT ; * We call this procedure during the external iterations -> CALCTAB . 'IMPL' = VRAI ; CALCTAB . 'COMPT' = 0 ; * ***************** * PKON ********** ***************** PKONTAB . 'CFLDTAU' = 10000. ; PKONTAB . 'ANOM' = FAUX ; PKONTAB . 'GAZ' = 'PERFMONO' ; PKONTAB . 'MODELE' = MDOMINT ; PKONTAB . 'LISTCONS' = LISTCONS ; * PKONTAB . 'METHODE' = 'CENTERED' ; * PKONTAB . 'METHODE' = 'RUSANOLM' ; * PKONTAB . 'METHODE' = 'AUSMPLM' ; PKONTAB . 'METHODE' = 'AUSMPLUS' ; * PKONTAB . 'METHODE' = 'VLH' ; * PKONTAB . 'METHODE' = 'ROELM' ; * PKONTAB . 'METHODE' = 'ROE' ; * PKONTAB . 'METHODE' = 'HLLCLM' ; * PKONTAB . 'IMPL' = VRAI ; 'SI' (PKONTAB . 'IMPL') ; PKONTAB . 'TYPEJACO' = 'AUSMPLUS' ; * PKONTAB . 'TYPEJACO' = 'VLH' ; * PKONTAB . 'TYPEJACO' = 'RUSANOLM' ; * PKONTAB . 'TYPEJACO' = 'AUSMPLM' ; 'FINSI' ; * PKONTAB . 'ORDREESP' = 2 ; 'SI' ((PKONTAB . 'ORDREESP') 'EGA' 2) ; PKONTAB . 'VLIM' = CHPVID ; 'UX' 1.0 'UY' 0.0 ; TOTO TITI MCHRCON = 'PENTE' MDOMINT 'CENTRE' 'EULESCAL' TOTO TITI MCHVCON = 'PENTE' MDOMINT 'CENTRE' 'EULEVECT' PKONTAB . 'LIMITEUR' = 'NOLIMITE' ; PKONTAB . 'GRADRN' = MCHRCON ; PKONTAB . 'GRADPN' = MCHRCON ; PKONTAB . 'GRADVN' = MCHVCON ; 'FINSI' ; PKONTAB . 'NFROZLIM' = 50 ; * Gravité * PKONTAB . 'CORRGRA' = FAUX ; 'UX' 0.0 'UY' 0.0 ; * PKONTAB . 'FACELIM' = MAIVID ; PKONTAB . 'ALPHA' = 'INF' ; PKONTAB . 'CLIM' = VRAI ; PKONTAB . 'TABLIM' = TABLE ; * * Normalisation du profile parabolique, pour obtenir que * le flux rentrante vaut MINJ * 'CENTRE') 4 'RN' ro_inf 'UX' U_INF 'UY' 0.0 'PN' p_inf ; 'CENTRE') 4 'RN' ro_inf 'UX' U_INF 'UY' 0.0 'PN' p_inf ; * *********************************** * Inversion de la matrice ********* *********************************** * * RV . 'MATUPDAT' updating * RV . 'MUPEXT' external iterations updating * RV . 'MUPINT' internal iterations updating * RV . 'MUPLIN' We update the matrix if in the previous * internal iteration the number of linear * iterations to solve the system were bigger * than (RV . 'MUPLIN') RV . 'MATUPDAT' = FAUX ; 'SI' ('NON' ( RV . 'MATUPDAT')) ; RV . 'MUPEXT' = 1 ; RV . 'MUPINT' = 50 ; RV . 'MUPLIN' = 4000 ; 'FINSI' ; RV . 'MATINV' = 'TABLE' 'METHINV' ; MATTAB = RV . 'MATINV' ; * MATTAB . 'TYPINV' = 1 : methode exact * MATTAB . 'TYPINV' = 5 ; GMRES MATTAB . 'TYPINV' = 1 ; MATTAB . 'IMPINV' = 0 ; * * Matrice pour assurer que la matrice à inverser est correctement * assemblé * * MATTAB . 'MATASS' definie en EXEXIM * MATTAB . 'MAPREC' " * MATTAB . 'XINIT' " * * Methode de numerotation de DDL MATTAB . 'TYRENU' = 'RIEN' ; MATTAB . 'PCMLAG' = 'APR2' ; MATTAB . 'GMRESTRT' = 500 ; MATTAB . 'SCALING' = 1 ; * ILU 3 * ILUT (dual truncation) 5 * ILUTP 9 * Dans le cas ILUT il faut definir * ILUTLFIL * ILUTDTOL MATTAB . 'PRECOND' = 7 ; MATTAB . 'OUBMAT' = 0 ; MATTAB . 'ILUTPPIV' = 0.1 ; MATTAB . 'ILUTPMBL' = 0 ; MATTAB . 'ILUTLFIL' = 4. ; MATTAB . 'ILUTDTOL' = 0. ; MATTAB . 'NITMAX' = 3000 ; MATTAB . 'RESID' = 1.D-6 ; * **** Save results into a file * SI FAUX ; FICHER1 = ('CHAINE' FICHER 'main' RAF (PKONTAB . 'METHODE') 'OE' (PKONTAB . 'ORDREESP') 'OPTION' 'SAUVER' FICHER1 ; 'MESSAGE' 'We save results into' ; 'MESSAGE' FICHER ; 'MESSAGE' ; 'FINSI' ; * **** Exexcution EXEXIM * 'SI' FAUX ; RV . 'TFINAL' = 'EXTRAIRE' LISTTPS &BL1 ; 'TEMPS' 'ZERO' ; EXEXIM RV ; 'TEMPS' 'IMPR' ; * **** To save memory storage * 'OUBLIER' MATTAB MATASS ; 'OUBLIER' MATTAB MAPREC ; 'MENAGE' ; 'SI' FAUX ; 'SAUVER' 'LABEL' ('CHAINE' &BL1) ; 'FINSI' ; 'FIN' BL1 ; SINON ; * 'TEMPS' 'ZERO' ; EXEXIM RV ; * 'TEMPS' 'IMPR' ; 'FINSI' ; * *************************************************************** *************************************************************** *************************************************************** ************** Plot of the solutions ************************** *************************************************************** *************************************************************** *************************************************************** * * GRAPH = VRAI ; * 'SI' FAUX ; FICHER = 'OPTION' 'RESTITUER' FICHER ; 'RESTITUER' ; 'FINSI' ; * * LOGGNP = logical. If VRAI, files for gnuplot are created * LOGGNP = VRAI ; VALECH = 1 ; 'OPTION' 'ECHO' VALECH 'TRAC' 'X' ; TPS = RV . 'PASDETPS' . 'TPS' ; METO = PKONTAB . 'METHODE' ; ORD_ESP = PKONTAB . 'ORDREESP' ; ORD_TPS = RV . 'ORDTPS' ; * **** Les variables conservatives * * **** Les variables primitives * VN PN = 'PRIM' 'PERFMONO' RN GN RETN GAMN ; CSON2 = (GAMN '*' PN) '/' RN ; MACHN2 = VN2 '/' CSON2 ; MACHN = MACHN2 '**' 0.5 ; TITOLO = ('CHAINE' METO ', OE = ' ORD_ESP ', OT =' ORD_TPS ((CALCTAB . 'ER') '+' 1.0D-16) ; * *** GRAPHIQUE DES SOLUTIONS * 'SI' GRAPH ; 'TRACER' DOMINT 'TITRE' ('CHAINE' 'Maillage') ; 'TRACER' CHM_RN MDOMINT ('CONTOUR' DOMINT) 'TRACER' DOMINT RNV ('CONTOUR' DOMINT) 'TITRE' ('CHAINE' 'RN : ' TITOLO) 15 ; 'OPTION' 'ISOV' 'SULI' ; 'TRACER' CHM_PN MDOMINT ('CONTOUR' DOMINT) 'TRACER' DOMINT PNV ('CONTOUR' DOMINT) 'TITRE' ('CHAINE' 'PN : ' TITOLO) 15 ; 'OPTION' 'ISOV' 'SULI' ; 'TRACER' CHM_MACH MDOMINT ('CONTOUR' DOMINT) 'TRACER' DOMINT MACHNV ('CONTOUR' DOMINT) 'TITRE' ('CHAINE' 'Mach : ' TITOLO) 15 ; 'OPTION' 'ISOV' 'SULI' ; 'TRACER' CHM_VN MDOMINT ('CONTOUR' DOMINT) VECN = 'VECTEUR' VN (8. '/' RAF) 'UX' 'UY' 'JAUNE' ; 'TRACER' DOMINT VECN ('CONTOUR' DOMINT) 'TITRE' ('CHAINE' 'VN : ' TITOLO) ; * 'OPTION' 'ISOV' 'SULI' ; 'DESSIN' EVO1 LOGY 'TITRE' 'Error' ; * 'FINSI' ; * **** Test de convergence * 'SI' (AA > 1.0D-8) ; 'MESSAGE' 'Probleme' ; 'ERREUR' 5 ; 'FINSI' ; * XLIGPOST = 'COORDONNEE' 1 LIGPOST ; 'SI' GRAPH ; 'DESSIN' EVMACH 'MIMA' 'TITRE' TITOLO ; 'FINSI' ; MMAX = 'MAXIMUM' MACHN ; MMIN = 'MINIMUM' MACHN ; MMAX_REF = 0.93624 ; MMIN_REF = 0.42153 ; ERRO = 'ABS' (MMAX_REF '-' MMAX) '/' M_INF ; 'SI' (ERRO > 5.0D-2) ; 'MESSAGE' 'Probleme' ; 'ERREUR' 5 ; 'FINSI' ; * ERRO = 'ABS' (MMIN_REF '-' MMIN) '/' M_INF ; 'SI' (ERRO > 1.0D-2) ; 'MESSAGE' 'Probleme' ; 'ERREUR' 5 ; 'FINSI' ; 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales