* EXEC PROCEDUR GOUNAND 22/11/22 21:15:01 11504 ************************************************************************ * EXECUTE UN ALGORITHME DÉCRIT DANS UNE TABL RV DE TYPE EQEX * CETTE TABL EST CRÉÉE PAR L'OPÉRATEUR EQEX ************************************************************************ * HISTORIQUE * 20/12/99 = Rajout de la gestion de la matrice servant à l'assemblage * (rv.'METHINV'.'MATASS') * 12/05/06 = ajout STOPITER, NUITER et STOPPDT * 21/12/07 = ajout projection algébrique incrémentale (cf. GRESP) * 06/05/14 = ajout test DFDT : qd niter>1, on vérifie que le 2eme * argument est distinct de linconnue * 05/06/14 = on teste qd niter>1 et itma>1, car certains cas utilisent * DFDT pour pénaliser (dvisi et ccar3) * 05/02/16 = ajout de l'historique RV.'INCO'.'HIST' * 16/05/18 = corrections mineures + lifting ************************************************************************ * * * * * +-------------------------------------------------------------------+ * | | * | I N I T I A L I S A T I O N S E T V É R I F I C A T I O N S | * | | * +-------------------------------------------------------------------+ * * ************************************************************************ * * Ajout test DFDT : qd niter>1, on vérifie que le 2eme argument est * distinct de linconnue (anomalie #8050) SI (((RV.'NITER') > 1) ET ((RV.'ITMA') > 1)) ; REPE IOP NOP ; RVN = RV.NOMTAB ; SI (EGA NOMUN RVN.'ARG2') ; FINS ; FINS ; FINS ; FIN IOP ; FINS ; * ************************************************************************ * * Utilisation de RESOU plutot que KRES ? TRESOU = FAUX ; TRESOU = RV.'TRESOU' ; FINS ; * ************************************************************************ * * Parallélisation des résolutions lorsqu'elles sont découplées TKPR = FAUX ; TKPR = RV.'TKPR' ; FINS ; * ************************************************************************ * * Impressions liées au parallélisme IMPARA = FAUX ; IMPARA = RV.'IMPARA' ; FINS ; * ************************************************************************ * * Niveau d'impression global IIMPR = RV.'IMPR' ; * ************************************************************************ * * Liste des opérateurs potentiellement parallélisables * LOPERPAR = MOTS 'NS' 'TSCA' 'DFDT' 'KONV' 'LAPN' 'FROT' 'FIMP' 'TOIMP' ; * LOPERPAR = MOTS 'NS' 'TSCA' 'DFDT' 'LAPN' 'KONV' ; * LOPERPAR = MOTS 'NSQT' ; * * Parallélisation du calcul des matrices élémentaires si : * 1) RV.'TCPT' = VRAI * 2) NPART > 1 * 3) On a bien des objets MMODEL et non pas des tables 'DOMAINE' * TCPT = FAUX ; TCPT = RV.'TCPT' ; FINS ; * * Préparation pour paralléliser le calcul des matrices élémentaires SI TCPT ; * * On partitionne en fonction du nombre d'assstants (= processeurs) * par défaut ou bien N (si précisé dans l'instruction EXEC RV N) NPART = NPARTI ; SINON ; FINS ; * RV.'TABPARTM' = TABPARTM ; * RVN = RV.NOMTAB ; $MD = RVN.'DOMZ' ; * SI (NON (EGA TYM 'MMODEL')) ; TCPT = FAUX ; QUIT IOP ; FINS ; * SI IMPARA ; FINS ; * REPE BIBI NPART ; * $BID.&BIBI = TABL 'KIZX' ; $BID.&BIBI.'DOMZ'= $MDP.&BIBI ; $BID.&BIBI.'TDOMZ'= $TDZ ; FIN BIBI ; * TABPARTM.'$bid' = $BID ; * TABPARTM.'$mdp' = $MDP ; RVN.'$mdp' = $MDP ; RVN.'$bid' = $BID ; FINS ; SINON ; SI IMPARA ; MESS 'On ne parallélise pas ' NOMPER ; FINS ; FINS ; * FIN IOP ; * SINON ; TABPARTM = RV.'TABPARTM' ; FINS ; * TCPT=FAUX ; SI IMPARA ; MESS 'Il n y a pas d opérateurs à paralléliser !' ; FINS ; FINS ; * SI (NPART <EG 1) ; SI IMPARA ; FINS ; TCPT = FAUX ; FINS ; * FINS ; * ************************************************************************ * * Initialisation des critères d'arrêt (type LOGIQUE) positionnables * par l'utilisateur pendant la simulation * * (boucle interne) RV.'STOPITER' = FAUX ; FINS ; * * (boucle externe) RV.'STOPPDT' = FAUX ; FINS ; * ************************************************************************ * * LOGIQUE forçant le recalcul de la matrice de pression a chaque pas * de temps (boucle externe) CALPRE = FAUX ; VERTYTAB RV 'CALPRE' 'LOGIQUE' ; CALPRE = RV.'CALPRE' ; FINS ; * ************************************************************************ * * Option 'XEQUA' (non documentée...) RV.'XEQUA' = FAUX ; FINS ; * ************************************************************************ ************************************************************************ ************************************************************************ ************************************************************************ * * Bifurcation gérée en interne (l'indice 'NAVISTOK' n'a pas vocation * a être ajouté par l'utilisateur) SI (EGA (RV.'NAVISTOK') 0) ; EXAC RV ; FINS ; * ************************************************************************ ************************************************************************ ************************************************************************ ************************************************************************ * * Schéma temporel pour Navier-Stokes * SI TESTPR ; RVP = RV.'PRESSION' ; FINS ; * SI TESTPRJ ; FINS ; * SI (IIMPR > 0) ; SI TESTPR ; FINS ; SI TESTPRJ ; MESS 'Algorithme de Projection' ; FINS ; SI (NON (TESTPR OU TESTPRJ)) ; FINS ; FINS ; * ************************************************************************ * * (ancien algo) * Choix du type de schéma de projection : | * PSCT VPI1 VPI2 PENA * -----------------------------------------+-----+-----+-----++------ * TGRAD = Formulation en gradient | NON | NON | NON || NON * TMDM1 = Correction Gresho | NON | OUI | NON || NON * TPNM2 = Elimination end of step velocity | NON | NON | OUI || NON * | * (nouvel algo) TYPROJ = 'VPI1' ; ROW = 1. ; TYPROJ=RV.'TYPROJ' ; MESS ' ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ' ; MESS ' ' ; MESS ' Les méthodes de projection autorisées sont : ' ; FINS ; FINS ; * SI (EGA TYPROJ 'PSCT') ; TGRAD = FAUX ; TMDM1 = FAUX ; TPNM2 = FAUX ; FINS ; * SI (EGA TYPROJ 'VPI1') ; TGRAD = FAUX ; TMDM1 = VRAI ; TPNM2 = FAUX ; FINS ; * SI (EGA TYPROJ 'VPI2') ; TGRAD = FAUX ; TMDM1 = FAUX ; TPNM2 = VRAI ; FINS ; * SI (EGA TYPROJ 'PENA') ; TGRAD = FAUX ; TMDM1 = FAUX ; TPNM2 = FAUX ; FINS ; * ************************************************************************ * * Affectations différentes selon que l'on est en 2D ou en 3D NOMVI = RV.'NOMVI' ; SI (EGA IDIM1 2) ; VNUL = 0.D0 0.D0 ; VUNI = 1.D0 1.D0 ; SINON ; VNUL = 0.D0 0.D0 0.D0 ; VUNI = 1.D0 1.D0 1.D0 ; FINS ; * ************************************************************************ * * Facteur de relaxation OMEG = 1.D0 ; SINON ; OMEG = RV.'OMEGA' ; FINS ; * ************************************************************************ * * Traitement d'un cas particulier = verrue (non documenté...) * ************************************************************************ * * Initialisation de la table d'historique FINS ; * ************************************************************************ * * Nombre d'itérations externes (pas de temps) ITMAX = RV.'ITMA' ; SI (ITMAX < 1) ; ITMAX = 1 ; FINS ; * ************************************************************************ * * Fréquence d'impression du solveur KRES IMPKRES = 0 ; * ************************************************************************ * * Fréquence d'impression des pas de temps (opérateur TCRR) IMPTCRR = 0 ; SI (IIMPR >EG 0) ; SI (ITMAX EGA 1) ; IMPTCRR = 1 ; FINS ; SI TESTPRJ ; IMPTCRR = 1 ; FINS ; SI (NON (TESTPR OU TESTPRJ)) ; IMPTCRR = 1 ; FINS ; FINS ; * ************************************************************************ * * FCPRECT : fréquence de recalcul des préc. dans la boucle externe * FCPRECI : fréquence de recalcul des préc. dans la boucle interne * FCPRECTP : idem pour la matrice de pression * FCPRECIP : idem pour la matrice de pression FCPRECT = RV. 'METHINV'.'FCPRECT' ; FCPRECI = RV. 'METHINV'.'FCPRECI' ; SI TESTPRJ ; FCPRECTP = RVP.'METHINV'.'FCPRECT' ; FCPRECIP = RVP.'METHINV'.'FCPRECI' ; FINS ; * * Force le calcul des préconditionneurs pour la première itération RV.'METHINV'.'CALPREC' = VRAI ; FINS ; SI TESTPRJ ; RVP.'METHINV'.'CALPREC' = VRAI ; FINS ; FINS ; * ************************************************************************ * * RESMN : résidu au pas de temps ou à l'itération interne précédente * RESMNP : idem pour la pression RV.'resmn' = RESMN ; FINS ; RV.'resmnp' = RESMNP ; FINS ; * * * * * +-------------------------------------------------------------------+ * | | * | A L G O R I T H M E D E R É S O L U T I O N | * | | * +-------------------------------------------------------------------+ * * ******************************************* * ******************************************* * DEBUT DE LA BOUCLE EXTERNE (= PAS DE TEMPS) * ******************************************* * ******************************************* REPE BLOC1 ITMAX ; * * Doit-on recalculer les préconditionneurs ? RV.'METHINV'.'CALPREC' = VRAI ; FINS ; SI TESTPRJ ; RVP.'METHINV'.'CALPREC' = VRAI ; FINS ; FINS ; * * Doit-on recalculer la matrice de pression ? TESTP1 = FAUX ; SI (TESTPR OU TESTPRJ) ; SI CALPRE ; TESTP1 = VRAI ; FINS ; TESTP1 = VRAI ; FINS ; FINS ; * * * ******************************************** * ******************************************** * DEBUT DE LA BOUCLE INTERNE (= NON-LINEARITE) * ******************************************** * ******************************************** REPE BLOCI (RV.'NITER') ; * * Numéro de l'itération interne courante RV.'NUITER' = &BLOCI ; * * Doit-on recalculer les préconditionneurs ? RV.'METHINV'.'CALPREC' = VRAI ; FINS ; SI TESTPRJ ; RVP.'METHINV'.'CALPREC' = VRAI ; FINS ; FINS ; * * * ========================================================== * EXÉCUTION DE TOUS LES OPÉRATEURS/PROCÉDURES DE LA TABLE RV * => CONSTRUCTION DU SYSTÈME D'ÉQUATIONS DE Q.D.M. * ========================================================== * MDFDT = 0 ; RVN = RV.NOMTAB ; * * KFORM vaut 0 (EFM1) ou 1 (EF) ou 2 (VF) ou 3 (EFMC) MDFDT = MDFDT + RVN.'KOPT'.'KFORM' ; * * Exécution séquentielle SI (NON TCPT) ; MSI MAI = (TEXTE NOMPER) RVN ; * * Exécution parallèle (mémoire partagée) SINON ; SI IMPARA ; FINS ; $MDP = RVN.'$mdp' ; $BID = RVN.'$bid' ; SINON ; SI IMPARA ; MESS NOMPER ' n est pas parallélisable' ; FINS ; MSI MAI = (TEXTE NOMPER) RVN ; FINS ; FINS ; * * ISCHT vaut 1 (BDF2) ou 2 (BDF4) ou 0 sinon (ordre 1) ISCHT = RVN.KOPT.'ISCHT' ; MAT = MAT ET MAI ; ST = ST ET MSI ; SINON ; MAU = MAU ET MAI ; SF = SF ET MSI ; FINS ; FIN BLOC2 ; * * ST/MAT contient le second membre et la matrice pour DFDT * SF/MAU contient le second membre et la matrice pour les autres opérateurs * S2/MA1 contient le second membre et la matrice pour l'ensemble S2 = SF ET ST ; MA1 = MAU ET MAT ; * * * ==================================================== * TRAITEMENTS SPÉCIFIQUES POUR LA PRESSION (SI REQUIS) * ==================================================== * RVPD = RV.'rvpd' ; IDIGV = RV.'IDigv' ; DIGV = RV.'Digv' ; FINS ; * * * 1) Calcul de C*D^(-1)*Ct pour l'algorithme semi-explicite (RV.'PRESSION') * ********************************************************************** * SI (TESTPR ET TESTP1) ; RVPD = RVP.'DOMAINE' ; SI (IDIM1 EGA 2) ; SINON ; FINS ; * * Les noeuds de DIGV sur lesquels existe une CLIM en vitesse sont mis a 1.E30 RVP.'CLIM' = RV.'CLIM' ; FINS ; * * RVP.'DIAGV' = DIGV ; FINS ; * * KMAB => discrétisation de l'opérateur div(U) RV.'rvpd' = RVPD ; RV.'IDigv' = IDIGV ; RV.'Digv' = DIGV ; * FINS ; * * * 2) Calcul de C*D^(-1)*Ct pour l'algorithme de projection (RV.'PROJ') * ***************************************************************** * SI (TESTPRJ ET TESTP1) ; * * ------------------------------------------------------------------- * Construction de la matrice masse diagonale à partir des tables DFDT * ------------------------------------------------------------------- * IDFDT = 0 ; IDFDT = IDFDT + 1 ; RVPD = RV.NOMTAB.'DOMZ' ; FINS ; FINS ; FIN BLOCJ ; * SI (EGA IDFDT 0) ; FINS ; * SI (IDIM1 EGA 2) ; SINON ; FINS ; * * DIG1 = matrice diagonale indépendante des conditions aux limites * * Les noeuds de DIGV sur lesquels existe une CLIM en vitesse sont mis a 1.E30 * * RVP.'DIAGV' = DIGV ; FINS ; RVP.'INCO' = RV.'INCO' ; * * * ----------------------------------------------------------- * Exécution de tous les opérateurs/procédures de la table RVP * ----------------------------------------------------------- * * TVNPC et TVNP indiquent que l'opérateur VNIMP est présent * (respectivement avec MSOMMET ou CENTREP0/CENTREP1) TVNP = FAUX ; TVNPC = FAUX ; * * SVNPC/MVNPC contient le second membre et la matrice pour VNIMP+MSOMMET * SR/MAR contient le second membre et la matrice pour les VNIMP+CENTREPx * SP/MAP contient le second membre et la matrice pour les autres opérateurs * * * IKOMP vaut 0 (NOCONS) ou 1 (CONS) ou 2 (CONS2) RVP.NOMTAB.'KOPT'.'IKOMP' = 1 ; FINS ; MSI MAI = (TEXTE NOMPER) (RVP.NOMTAB) ; * *######################## ATTENTION !!!!!!!! *######################## MSIG/MAIG SONT UTILISES HORS DE BLOCPJ *######################## LEUR VALEUR EST INCERTAINE...... SI TGRAD ; SI (IIMPR > 0) ; FINS ; * IKOMP vaut 0 (NOCONS) ou 1 (CONS) ou 2 (CONS2) RVP.NOMTAB.'KOPT'.'IKOMP' = 0 ; MSIG MAIG = (TEXTE NOMPER) (RVP.NOMTAB) ; FINS ; *######################## *######################## *######################## * * DISCPRES vaut 3 (CENTREP0) ou 4 (CENTREP1) ou 5 (MSOMMET) SI (EGA (RVP.'DISCPRES') 5) ; TVNPC = VRAI ; MVNPC = MVNPC ET MAI ; SVNPC = SVNPC ET MSI ; SINON ; TVNP = VRAI ; MAR = MAR ET MAI ; SR = SR ET MSI ; FINS ; SINON ; MAP = MAP ET MAI ; SP = SP ET MSI ; FINS ; FIN BLOCPJ ; * * Séparation des sous-matrices type C*Ct (MAC) des autres sous-matrices (MATPC) * *######################## ATTENTION !!!!!!!! *######################## LA VALEUR DE MAIG EST INCERTAINE...... SI TGRAD ; RVP.'MATG' = MACG ; FINS ; *######################## *######################## * SI TVNPC ; MAC = MAC ET MVNPC ; FINS ; RVP.'MATC' = MAC ; * SI TVNP ; RVP.'MBTR' = MAR ; DUNIT = IDIGV ; * KOPS 'CMCT' A B C calcule la matrice A*C^(-1)*Bt * MCR = MCR ET CRT ET CTR ET RRT ; MCR = CRT ET CTR ET RRT ; FINS ; RVP.'TVNP' = TVNP ; * SI (EGA (RVP.'DISCPRES') 5) ; SI (IIMPR > 0) ; MESS 'Cas des pressions CONTINUES' ; FINS ; * MATPR = MATPC ET MCR ; * MCR est vide ! MATPR = MATPC ; SINON ; SI (IIMPR > 0) ; MESS 'Cas des pressions DISCONTINUES' ; FINS ; MATPR = MATPC ET MATPR ET MCR ; * SI TRESOU ; INCUP = INCU ET INCP ; OPTI 'INCO' INCUP INCUP ; * * RIGIDITE/CHPOINT associés aux C.L. en pression rigp=rvp.'rigp' ; fpi =rvp.'climreso' ; Sinon ; rvp.'rigp'=rigp ; rvp.'climreso'=fpi ; Finsi ; matpr = matpr et rigp ; SI (IIMPR > 0) ; FINS ; SINON ; SI (IIMPR > 0) ; FINS ; FINS ; FINS ; * RV.'rvpd' = RVPD ; RV.'IDigv' = IDIGV ; RV.'Digv' = DIGV ; * FINS ; * * * 3) Calcul de Ct*P pour l'algorithme semi-explicite (RV.'PRESSION') * *************************************************************** * SI TESTPR ; DT = (RV.'PASDETPS'.'DELTAT') * (RV.'ALFA') ; RVP.'DELTAT' = DT ; * * F = COPI S2 ; * LC = EXTR DIGV 'COMP' ; F = S2 ; * * DM1F vaut (-1 * RV.'CLIM' / DT) aux noeuds supportant une C.L. * DM1F vaut (-1 * FU * IDIGV) partout ailleurs DTI = -1.D0 / DT ; DM1F = DTI * DM1F ; SINON ; FINS ; * * Calcul de -C*D^(-1)*F * * /\/\/\/\/\/\/\/\/\/\/ * Calcul de la pression (vieille syntaxe KRES) * /\/\/\/\/\/\/\/\/\/\/ 'PIMP' (RVP.'KPIMP') (RVP.'PIMP') ; RV.'INCO'.'PRESSION' = RVP.'PRESSION' ; * Calcul de CtP, c'est-à-dire grad(p) S2 = S2 + (RVP.'GRADP') ; FINS ; * * * 4) Calcul de M*D^(-1) puis Ct*P pour l'algorithme de projection (RV.'PROJ') * ************************************************************************ * SI TESTPRJ ; DT = (RV.'PASDETPS'.'DELTAT') * (RV.'ALFA') ; RVP.'DELTAT' = DT ; * * * ------------------------------------ * Calcul du produit M*D^(-1) si requis * ------------------------------------ * SI TMDM1 ; MDM1 = RV.'MDM1' ; SINON ; SI (IIMPR > 0) ; FINS ; * ROW = 0. ; * * SI (EGA NOMIV2 NOMIV1) ; SI (EGA TYPROJ 'PENA') ; RWI = (RV.NOMTAB2).ARG1 ; RWI = RV.'INCO'.RWI ; FINS ; SI (IIMPR > 0) ; FINS ; * SI (EGA TRWI 'FLOTTANT') ; FINS ; SI ((EGA TRWI 'CHPOINT') OU (EGA TRWI 'MCHAML')) ; FINS ; SINON ; ROW = 1. ; FINS ; * MESS 'ROW = ' ROW ; * MATN = MATN ET MAI ; * DOMZP = RV.NOMTAB2.'DOMZ' ; * STI = KCHT DOMZP 'VECT' 'SOMMET' 'COMP' LC VUNI ; FINS ; FINS ; FIN BLOCPJ2 ; FINS ; FIN BLOCPJ1 ; * SI (EGA TYPROJ 'PENA') ; MDM1 = 1. ; SINON ; FINS ; * SI (EGA ISCHT 1) ; MDM1 = MDM1 * ((DT*2.)/3.) ; SINON ; MDM1 = MDM1 * DT ; FINS ; * RV.'MDM1' = MDM1 ; FINS ; FINS ; * * * --------------------------- * Calcul du produit Ct*P[n-1] * --------------------------- * TVNP = RVP.'TVNP' ; PPI = RV.'INCO'.'PRESSION' ; * * TPNM2 Elimination of end of step velocity (2*P[n] - P[n-1]) PPI = (2 * PPI) - (RV.'INCO'.'PNM2') ; FINS ; * * TGRAD=VRAI => Formulation en u*grad(p) * TGRAD=FAUX => Formulation en p*div(u) SI TGRAD ; SINON ; FINS ; * * Prise en compte des C.L. (opérateur VNIMP avec CENTREP0/CENTREP1) SI TVNP ; CPRE = CPRE ET CXRE ; FINS ; * Consistence selon Gresho SI TMDM1 ; * Consistence selon Guermond SINON ; GRADPRES = CPRE ; FINS ; OUBL CPRE ; * SI TGRAD ; S2 = SF - (RV.'INCO'.'GRADPRES') + ST ; SINON ; S2 = SF + (RV.'INCO'.'GRADPRES') + ST ; FINS ; * FINS ; FINS ; * S1 = RV.'CLIM' ; SINON ; S1 = ' ' ; FINS ; RV.'S2' = S2 ; * * * =========================================== * RÉSOLUTION DU SYSTÈME D'ÉQUATIONS DE Q.D.M. * =========================================== * SI ((NON TESTPRJ) OU (EGA MDFDT 0)) ; * RV.'METHINV'.'XINIT' = RV.'resmn' ; * * Méthode de projection incrémentale * ********************************** SI (IIMPR > 0) ; FINS ; * * Système monolithique d'équations (U-P) * ************************************** SINON ; SI (IIMPR > 0) ; FINS ; * SI ((RV.'METHINV'.'TYPINV' EGA 1) ET TRESOU) ; SI (IIMPR > 0) ; FINS ; * OPTI 'INCO' INCPRES INCPRES ; * * RIGIDITE/CHPOINT associés aux C.L. TRICO = RV.'trico1' ; SINON ; RV.'trico1' = TRICO ; REPE BINC NCMP ; FIN BINC ; FINS ; REPE BINC NCMP ; RIGP = TRICO.&BINC ; FIN BINC ; * RIGP = ET TRICO ; MA1 = MA1 ET RIGP ; FINS ; * 'CLIM' S1 'SMBR' S2 'IMPR' IMPKRES ; FINS ; FINS ; * * Méthode de projection standard * ****************************** SI (TESTPRJ ET (NEG MDFDT 0)) ; SI (IIMPR > 0) ; FINS ; * * LPART = EXTR MA1 'COMP' ; * MESS 'Liste des composantes' ; * LIST LPART ; * * $TRICO = RV.'$trico' ; SINON ; RV.'$trico' = $TRICO ; REPE BCLCOM NBPART ; FIN BCLCOM ; FINS ; * * On boucle sur les partitions du domaine (déjà déterminées plus haut) REPE BCLCOM NBPART ; * NMC = EXTR LPART &BCLCOM ; NMC = LPART.&BCLCOM ; * MESS 'NMC=' NMC &BCLCOM ; * MA1I = EXTR MA1 (MOTS NMC) (MOTS NMC) ; $MA1.&BCLCOM = MA1I ; * $S1.&BCLCOM = EXCO S1 NMC NMC ; * $S2.&BCLCOM = EXCO S2 NMC NMC ; * RESMNI = EXCO (RV.'resmn') NMC 'NOID' NMC ; * TAB1 = RV.'METHINV' ; TAB1.'XINIT' = RESMNI ; $TAB1.&BCLCOM = TAB1 ; * SI (IIMPR > 0) ; FINS ; SI (TAB1.'TYPINV' >EG 2) ; * FINS ; TABRES = RV.'TABRES' ; * SI (TAB1.'CALPREC') ; FINS ; TABRES.WORD1.'MATASS' = MA1I ; TABRES.WORD1.'MAPREC' = MA1I ; FINS ; TAB1.'MATASS' = TABRES.WORD1.'MATASS' ; TAB1.'MAPREC' = TABRES.WORD1.'MAPREC' ; FINS ; FIN BCLCOM ; * * RÉSOLUTION PARALLÈLE SI TKPR ; SI IMPARA ; MESS 'Les résolutions sont traitées en parallèle' ; FINS ; * 'CLIM' $S1 'SMBR' $S2 'IMPR' IMPKRES ; * * RÉSOLUTION SÉQUENTIELLE SINON ; SI IMPARA ; MESS 'Les résolutions sont traitées séquentiellement' ; FINS ; * $TRICO = RV.'$trico' ; REPE BCLCOM NBPART ; SI (($TAB1.&BCLCOM.'TYPINV' EGA 1) ET TRESOU) ; * MATCOM = $MA1.&BCLCOM ; * * RIGIDITE/CHPOINT associés aux C.L. REPE BINC NCMP ; OPTI 'INCO' ICO ICO ; FIN BINC ; FINS ; REPE BINC NCMP ; RIGP = $TRICO.(&BCLCOM).&BINC ; FIN BINC ; * MATCOM = MATCOM ET RIGP ; * SINON ; 'CLIM' ($S1.&BCLCOM) 'SMBR' ($S2.&BCLCOM) 'IMPR' IMPKRES ; FINS ; RES = RES ET RES1 ; FIN BCLCOM ; FINS ; FINS ; * * * =============================================== * ÉTAPE DE PROJECTION STANDARD : CALCUL DE C*Û[n] * =============================================== * SI TESTPRJ ; * SI TVNP ; CUN = CUN ET CXN ; FINS ; * * On calcule les seconds membres de l'équation de pression * s'ils existent (opérateurs FIMP) MSI MAI = (TEXTE NOMPER) (RVP.NOMTAB) ; CUN = CUN ET MSI ; FINS ; FIN BLOCPJ ; * CUN = CUN * ROW * (-1./DT) ; * * Calcul de Lamdba[n] RVP.'METHINV'.'XINIT' = RV.'resmnp' ; 'CLIM' (RVP.'CLIM' ) 'SMBR' CUN 'IMPR' IMPKRES ; OUBL CUN ; RV.'resmnp' = SL ; * SI TVNP ; CTL = CTL + CXL ; FINS ; * * Elimination of end of step velocity * (si 'PNM2' existe, on ne corrige pas) SI (NON TPNM2) ; RES = RES + ((1./ROW)*A*DT) ; FINS ; FINS ; OUBL CTL ; * FINS ; * * * =================== * AVANCEMENT EN TEMPS * =================== * * SI (TESTPRJ ET (EGA MDFDT 0)) ; * IMPTCRR = IIMPR ; * FINS ; SI (EGA MDFDT 0) ; IMPTCRR = IIMPR ; FINS ; IMPKRES = 0 ; * * MESS 'On passe dans TCRR ' ; * AG = EXTR (EXCO RES 'LX') 'MAILLAGE' ; * AR = EXTR RES 'MAILLAGE' ; * ATN = DIFF AR AG ; * RES = REDU RES ATN ; FINS ; * * RV.'METHINV'.'CALPREC' = FAUX ; SI (TESTPRJ) ; RVP.'METHINV'.'CALPREC'= FAUX ; FINS ; * RV.'resmn' = RES ; * MENA ; * SI (RV.'STOPITER') ; RV.'STOPITER' = FAUX ; QUIT BLOCI ; FINS ; * FIN BLOCI ; * ****************************************** * ****************************************** * FIN DE LA BOUCLE INTERNE (= NON-LINEARITE) * ****************************************** * ****************************************** * * * MESS ' ITMAX= ' ITMAX ' MDFDT= ' MDFDT ; * IRT=0 ; SI (EGA ITMAX 0) ; SINON ; FINS ; * * ------------------------------------------------------------ * Avancement en temps pour l'algorithme de projection standard * => P[n+1] = P[n] + Lambda * ------------------------------------------------------------ SI TESTPRJ ; RV.'INCO'.'PRESSION' = SL ; SI TPNM2 ; RV.'INCO'.'PNM2' = SL ; FINS ; SINON ; PNM1 = RV.'INCO'.'PRESSION' ; SI (EGA ISCHT 1) ; PN = PNM1 + (1.5*SL) ; SINON ; PN = PNM1 + SL ; FINS ; SI TPNM2 ; RV.'INCO'.'PNM2' = PNM1 ; FINS ; RV.'INCO'.'PRESSION' = PN ; FINS ; SI ((EGA TYPROJ 'PSCT') OU (EGA TYPROJ 'PENA')) ; RV.'INCO'.'PRESSION' = SL ; FINS ; OUBL SL ; FINS ; * * ---------------------------------------- * Traitement spécifique (non documenté...) * ---------------------------------------- SI TESTRAN ; K = 'ABS' (RV.'INCO'.'KN') ; E = 'ABS' (RV.'INCO'.'EN') ; RV.'CO'.'TEMPERA' = RV.'INCO'.'CN' ; FINS ; * * * RV.'METHINV'.'CALPREC' = FAUX ; SI (TESTPRJ) ; RVP.'METHINV'.'CALPREC'= FAUX ; FINS ; * MENA ; * SI (EGA IRT 1) ; QUIT BLOC1 ; FINS ; * SI (RV.'STOPPDT') ; RV.'STOPPDT' = FAUX ; QUIT BLOC1 ; FINS ; * FIN BLOC1 ; * ***************************************** * ***************************************** * FIN DE LA BOUCLE EXTERNE (= PAS DE TEMPS) * ***************************************** * ***************************************** * * SI TESTPR ; FINS ; * * OUBLI EVENTUEL des matrices présentes dans la table RV et qui prennent de * la place dans les sauvegardes * ldetmat = rv . 'DETMAT' ; 'SINO' ; ldetmat = faux ; 'FINS' ; 'SI' ldetmat ; REPIX rv ; 'FINS' ; * FINP ; *
© Cast3M 2003 - Tous droits réservés.
Mentions légales