* CONTINU PROCEDUR BP208322 20/12/18 21:15:01 10821 *======================================================= * * CONTINU * ANALyse : calcul de la REPONSE_BALOURD NONlineaire par CONTINUATION * procédure de résolution non-linéaire * par une méthode de continuation par pseudo-longueur d'arc * creation : BP 28/01/2014 * *======================================================= * ************************************************************************ * * CREATION : BP208322 28/01/2014 * MODIF : LX236206 23/06/2015 HBM (n harmoniques), adimensionnement * analyse de stabilite * BP208322 08/2016 Mise au propre * * OBJET : Procedure de resolution Non-Lineaire * Methode de continuation par longueur d'arc * * ENTREEs et SORTIES : Voir la notice * * PROCEDURES APPELEES : CON_CALC, MONOSTA * * * ************************************************************************ mess '__________________________________________________________________________' ; mess ' d8P `Y8b ' ; mess ' `Y8bood8P 88ooo88 o888o o888o 888o o888o o888o o888o 888o88 8o' ; mess '__________________________________________________________________________' ; ************************************************************************ * * * VERIFICATION DES DONNEES D'ENTREE + VALEURS PAR DEFAUT * * * ************************************************************************ * fldebug = vrai; fldebug = faux; * definition du probleme a resoudre ************************************ * prendre les matrices constantes ou HBM ? FLHBM = FAUX; FINSI; * Alternating Frequency / Time ? IAFT = 0; IDIFF = FAUX; * SI (EGA TAB1 . 'PROCEDURE_FREQUENCE_TEMPS' 'DFT'); IAFT = 1; FINSI; SI (EGA IAFT 0); FINSI; TAB1 . 'CALC_VITE' = FAUX; FINSI; * si AFT, Jacobienne calculee par TFR(Knl*gamma+Cnl*w*gamma°) * ou par differentiation numerique ? SI (EGA IAFT 2); IDIFF = VRAI; SINON; * TAB1 . 'JACOBIENNE' = 'DIFFERENTIATION'; FINSI; FINSI; FINSI; * modele et materiau SI (FLMOD1); MOD1 = TAB1 . 'MODELE'; MAT1 = TAB1 . 'CARACTERISTIQUES'; SINON; MESS 'IL MANQUE LES CARACTERISTIQUES : on poursuit malgré tout...'; FINSI; SINON; MESS 'IL MANQUE LE MODELE : on poursuit malgré tout... '; FINSI; CHAR1 = TAB1 . 'CHARGEMENT'; SINON; SINON; * MESS 'IL MANQUE LE CHARGEMENT : on poursuit malgré tout...'; MESS 'IL MANQUE LE CHARGEMENT !'; FINSI; FINSI; * conditions initiales eventuelles ************************************* * s'agit-il d'une reprise ? (reprise si IPAS0 > 0) IPASM1 = 0; IPAS0 = 0; * SI (EXIS TAB1 'TEMPS'); * recherche du dernier pas enregistre fin BPAS0; * recherche de l'avant-dernier pas enregistre IPASM1 = IPAS0; repe BPASM1; IPASM1 = IPASM1 - 1; fin BPASM1; TIME0 = TAB1 . 'TEMPS' . IPAS0; MESS 'Reprise du calcul au pas ' IPAS0 ' temps ' TIME0; SINON; TIME0 = 0.; TAB1 . 'TEMPS' . 0 = TIME0; FINSI; TIME00=TIME0; FINSI; DEPTOT = TAB1 . 'DEPLACEMENTS' . IPAS0; SINON; TAB1 . 'DEPLACEMENTS' . IPAS0 = DEPTOT; FINSI; SI (FLMOD1); FINSI; SIGTOT = TAB1 . 'CONTRAINTES' . IPAS0; SINON; TAB1 . 'CONTRAINTES' . IPAS0 = SIGTOT; FINSI; FINSI; * plage de pseudo-temps a calculer ************************************* PRTIME0 = TAB1 . 'TEMPS_CALCULES'; * croissante ou decroissante? si ((dtimemin * dtimemax) < 0.); finsi; si (dtimemin < 0.); finsi; * le 1er pas doit etre 0 si non reprise si (MinTIME0 < 0.); finsi; si ((MinTIME0 > 0.) et (TIME0 ega 0.)); *bp MinTIME0 = mini PRTIME0; MaxTIME0 = maxi PRTIME0; finsi; * * finesse (=PRDT0) dans le cas croissant * DTIME0 = (extr PRTIME0 2) - TIME0; * PRDT0 = (prog DTIME0) et ((PRTIME0 enle 1) - (PRTIME0 enle NTIME0)); *bp* on prolonge pour etre coherent en longueur *bp PRDT0 = PRDT0 et (extr PRDT0 (NTIME0 - 1)); * pour eviter erreurs d arrondi * lorsqu'on teste si toute la plage est couverte *bp : les CI ne sont pas forcement en equilibre : MinTIME0 = MinTIME0 + dtpetit; MaxTIME0 = MaxTIME0 - dtpetit; SINON; FINSI; * plage de frequence (cas dynamique frequentiel) *********************** FINSI; SINON; FINSI; FINSI; SINON; TAB1 . 'FREQUENCE' = evfrqt; FINSI; * parametres de la resolution nonlineaire ****************************** * nombre d iteration maxi et ideal NMAXIT = TAB1 . 'MAXITERATION'; SINON; * NMAXIT = 50; NMAXIT = 24; TAB1 . 'MAXITERATION' = NMAXIT; FINSI; itideal = TAB1 . 'NB_ITERATION'; si ((itideal > (NMAXIT/2)) ou (itideal <eg 4)); finsi; SINON; itideal = 6; TAB1 . 'NB_ITERATION' = itideal; FINSI; itmin = (enti (0.5*itideal)) + 1; itmax = (enti (1.5*itideal)) + 1; * nombre de pas total souhaité NPAS = TAB1 . 'MAXIPAS'; SINON; NPAS = 1000; TAB1 . 'MAXIPAS' = NPAS; FINSI; * nombre de sous-pas total souhaité maxsous = TAB1 . 'MAXSOUSPAS'; SINON; maxsous = 5; TAB1 . 'MAXSOUSPAS' = maxsous; FINSI; * precision XPREC = TAB1 . 'PRECISION'; SINON; XPREC = 1.E-6; TAB1 . 'PRECISION' = XPREC; FINSI; * norme de reference pour le residu NF20 = TAB1 . 'NORME_RESIDU'; SINON; FINSI; * acceleration toutes les iterations nacc = TAB1 . 'ACCELERATION'; SINON; nacc = 4; TAB1 . 'ACCELERATION' = nacc; FINSI; * LINESEARCH ? FLAGLS = TAB1 . 'LINESEARCH'; SINON; FLAGLS = FAUX; TAB1 . 'LINESEARCH' = FLAGLS; FINSI; *Quasi Newton ou Full Newton ? FLFULL0 = ega (TAB1 . 'NEWTON') 'FULL'; SINON; FLFULL0 = FAUX; TAB1 . 'NEWTON' = FLFULL0; FINSI; FLFULL = FLFULL0; * calcul a omega fixe ? OMEFIXE = FAUX; SINON; OMEFIXE = VRAI; SINON; FINSI; FINSI; * verification de la stabilité ? SI (TAB1 . 'STABILITE') ; FINSI; FINSI; SINON; MOSTAB = TAB1 . 'STABILITE'; SINON; FINSI; FINSI; finsi; FINSI; *-via DIAG(K) *-via calcul de la matrice de monodromie *-par la theorie de HILL? (exposants de FLOQuet) * resultats a stocker ************************************************* SI (FLRES1); SI(FLHBM); TRES1 = TAB1 . 'RESULTATS_HBM'; SINON; TRES1 = TAB1 . 'RESULTATS'; FINSI; FINSI; *pas a sauver ISAUV = TAB1 . 'PAS_SAUVES'; SINON; si (ega TAB1 . 'PAS_SAUVES' 'TOUS'); ISAUV = 1; finsi; si (ega TAB1 . 'PAS_SAUVES' 'AUCUN'); ISAUV = NPAS; finsi; FINSI; SINON; ISAUV = 10; FINSI; MESS 'ON SAUVE TOUS LES ' ISAUV ' PAS DE CALCULS'; *stabilite *-via DIAG(K) SI FLDIAG; FINSI; FINSI; *-via Hill (exposants de floquet) SI FLFLOQ; TFLOQ = TAB1 . 'RESULTATS_STABILITE' . 'FLOQ'; nfloq=-3; SINON; TFLOQ = TAB1 . 'RESULTATS_STABILITE' . 'FLOQ'; FINSI; FINSI; * resultats a afficher ************************************************ laffich = TAB1 . 'AFFICHAGE_RESULTATS'; SINON; FINSI; si(affich1 > affich2); mess 'les AFFICHAGE_RESULTATS doivent etre par ordre croissant!'; finsi; * sorties a effectuer ************************************************* list FLSOR1; FINSI; SI (FLSOR1); list TAB1; FINSI; FINSI; SINON; FINSI; FINSI; SINON; FINSI; FINSI; * on suppose qu'on sort toujours le deplacement, * sort-on aussi les contraintes? SINON; MESS 'PAS DE SORTIE VTK'; FINSI; * grands deplacements ? et options associées *************************** FLGDEP = TAB1 . 'GRANDS_DEPLACEMENTS'; SINON; TAB1 . 'GRANDS_DEPLACEMENTS' = FLGDEP; FINSI; SINON; FINSI; TAB1 . 'HYPOTHESE_DEFORMATIONS' = HYPDEF; FINSI; FLKSIG = TAB1 . 'K_SIGMA'; SINON; TAB1 . 'K_SIGMA' = FLKSIG; FINSI; * recalcul de K apres la prediction? FLRECA = TAB1 . 'RECALCUL_K'; SINON; TAB1 . 'RECALCUL_K' = FLRECA; FINSI; * procedures perso1, charmeca ? **************************************** FLPERSO1 = TAB1 . 'PROCEDURE_PERSO1'; SINON; FLPERSO1 = FAUX; TAB1 . 'PROCEDURE_PERSO1' = FLPERSO1; FINSI; FLSUIV = TAB1 . 'PROCEDURE_CHARMECA'; SINON; FLSUIV = FAUX; TAB1 . 'PROCEDURE_CHARMECA' = FLSUIV; FINSI; * parametres du pilotage par longueur d'arc **************************** *limitation de la variation de l increment relatif en deplacement *choix d'une norme = 'I' pour Identite * = 'K' pour la diagonale de la raideur tangente * = ... NONORM = TAB1 . 'NORME_DEPLACEMENT'; SINON; FINSI; FINSI; *ordre de grandeur du deplacement attendu MAXDEPL = TAB1 . 'MAXI_DEPLACEMENT'; MAXDEP2 = MAXDEPL**2; SINO; * a estimer + tard FINSI; * nom des composantes pour le produit scalaire u^T * u FLMOME = faux; SI(FLHBM); motCf = TAB1 . 'COMPOSANTES' . 'FORCE_HBM'; motCu = TAB1 . 'COMPOSANTES' . 'DEPLACEMENT_HBM'; SINON; motCf = TAB1 . 'COMPOSANTES' . 'FORCE'; motCu = TAB1 . 'COMPOSANTES' . 'DEPLACEMENT'; motCm = TAB1 . 'COMPOSANTES' . 'MOMENT'; motCr = TAB1 . 'COMPOSANTES' . 'ROTATION'; FLMOME = vrai; finsi; FINSI; SINO; MESS 'COMPOSANTES prises par defaut'; * on enleve eventuel rotation et moment iCu = 0; repe BCu nCu; iCu = iCu + 1; finsi; finsi; fin BCu; * FLMOME = (dime motCm) > 0; FLMOME = faux; sino; * motCf = mots 'FALF'; * motCu = mots 'ALFA'; sino; fins; motCf = motfx et motifx; motCu = motux et motiux; fins; FINSI; * nom de composantes definie dans le bdata ************************************************************************ * * * INITIALISATIONS * * * ************************************************************************ *creation (eventuelle) et remplissage de WTAB ************************** WTAB = TAB1 . 'WTABLE'; *cas reprise / initialisation de ds = longueur de pas sino; dsP = 1.; WTAB . 'DS' = dsP; finsi; sinon; dsPmin = 1.E-4; finsi; sinon; dsPmax = 1.; finsi; si (dsP < dsPmin); dsP=dsPmin; finsi; si (dsP > dsPmax); dsP=dsPmax; finsi; *parametres lus et ranges dans WTAB (utiles pour CON_CALC , etc ...) WTAB . 'DIFFERENTIATION' = IDIFF; *creation point support pour la frequence si declaree comme une inconnue si (WTAB . 'FREQ_INCONNUE'); * ptf = point support de la frequence FINSI; WTAB . 'PT_FREQ' = ptf; finsi; * +creation du nom d'inconnue pour la frequence OPTI 'INCO' 'FREQ' 'FFRE'; finsi; * +initialisation de la valeur courante de frequence si besoin sinon; WTAB . 'FREQ' = 1.; DEPTOT = DEPTOT finsi; * +creation d'une condition de phase sur le dual de la frequence CHPPHA = TAB1 . 'CHPO_PHASE'; sinon; p2 = TRES1 . 1 . 'POINT_MESURE'; finsi; TAB1 . 'RIGIDITE_HBM' = TAB1 . 'RIGIDITE_HBM' et CLPHASE; finsi; *preparation des mesures *********************************************** SI (FLRES1); ires1 = 0; repe BRES1 nRES1; ires1 = ires1 + 1; moc1 = TRES1 . ires1 . 'COMPOSANTE'; * -mesure de la frequence si (ega moc1 'FREQ'); x1 = WTAB . 'FREQ'; sinon; pt1 = TRES1 . ires1 . 'POINT_MESURE'; * -mesure de force * x1 = resu (redu (exco (REAC RIGTOT0 DEPTOT) moc1) pt1); * on met les reactions a 0 pour l instant x1 = 0.; sinon; * -mesure de deplacement sinon; finsi; * -mesure autre (???) sinon; finsi; finsi; finsi; * pour la reprise eventuelle * TRES1 . ires1 . 'RESULTATS' = prog x1; *bp : les CI ne sont pas forcement en equilibre : finsi; fin BRES1; FINSI; *1ere sortie *********************************************** SI (FLSOR1); si FLSOR2; finsi; FINSI; *creation (eventuelle) et remplissage de WTAB ************************** * --> déplacé + haut *on initialise ********************************************************* *le pseudo-temps *PRTIME = liste des temps reellement calcules *DTIME0 = t_n - t_n-1 * sinon; PRTIME = prog TIME0; *bp : les CI ne sont pas forcement en equilibre : finsi; * DTIME0 = +1; sauf si reprise (possibilité <0) si (IPAS0 > 0); DTIME0 = WTAB . 'DTIME0'; sinon; DTIME0 = (TAB1 . 'TEMPS' . IPAS0) - (TAB1 . 'TEMPS' . IPASM1); finsi; sinon; finsi; *ptt = point support du pseudo-temps FINSI; WTAB . 'PT_TAU' = ptt; *+creation du nom d'inconnue pour le pseudo-temps OPTI 'INCO' 'TAU' 'FTAU'; finsi; *le deplacement *DDEP0 = u_n - u_n-1 si (IPAS0 > 0); * reprise : DDEP0 = WTAB . 'DDEP0'; sinon; DDEP0 = DEPTOT - (TAB1 . 'DEPLACEMENTS' . IPASM1); finsi; sinon; * debut du calcul : DDEP0 = DEPTOT; finsi; *les parametres numeriques (longueur de pas ...) itconv = itideal; isconv=1; *nombre total d'iterations nittot = 0; *recup de la config initiale (non deformee) SI (FLGDEP); WTAB . 'FOR0' = GEOM0; FINSI; WTAB . 'DEPLACEMENTS' = DEPTOT; SI (FLMOD1); WTAB . 'CONTRAINTES' = SIGTOT; FINSI; *listmots utiles ******************************************************* *pour appel a CON_CALC * mopred = mots 'RESI' 'RIGI' 'DRES'; *petit entete des messages ********************************************* '--------------------------------------------------------------------'; mess chaline; mess chaline; mess ' Pas |Sous|iter| Temps |' ' Resultats | Residu '; * ' 1 | 2 | relatif'); affich1*37 ' |' affich2*50 ' | relatif'); mess chaline; ************************************************************************ * * *==========================> Boucle BEXTERN sur les pas * * * ************************************************************************ * ipas = IPAS0; REPETER BEXTERN NPAS; ipas = ipas + 1; WTAB . 'PAS' = IPAS; ************************************************************************ * * * PREDICTION * * * ************************************************************************ si(fldebug); finsi; * longueur de pas souhaité : DT^p (a ajouter a t_n = TIME0) *********** * on limite l'augmentation trop brutale de DTP si (ipas > (IPAS0 + 1)); si (DTP > (1.10 * DTP0)); DTP = 1.10 * DTP0; finsi; finsi; DTP0 = DTP; DTP2 = DTP**2; * Calcul des Force, Matrices et leurs dérivées par rapport a t ********* * appel a CON_CALC qui calcule tout ! * on se met dans la configuration deformee si (FLGDEP); FORM GEOM0; finsi; CON_CALC TAB1 mopred TIME0 DTP; * Calcul du Résidu initial * et verif qu'il est bien < precision --> inutile en general sauf pour le 1er pa si (&BEXTERN ega 1); Res2 = WTAB . 'RESIDU' ; finsi; * Construction de la matrice a resoudre : RIGTOT0 = RIGTOTF + K^{NL} + ... * avec RIGTOTF = K + TIME^2*M + TIME*C +/-H * et raideur NL : K^{NL\ (0)}_n = -\frac{dF^{NL \ (0)}}{dU} * etc ... RIGTOT0 = WTAB . 'RAIDEUR' ; * Derivee de la raideur par rapport à TIME : DRIGTOT = AMOTOT1 + 2*time*M * Derivee des efforts par rapport à TIME : DRES0 DRES0 = WTAB . 'DERIVEE_RESIDU'; * resolution ********************************************************** * stabilité en début de pas ******************************************* *-via DIAG * SI (FLDIAG); *-via HILL (calcul des exposants de FLOQuet) SI FLFLOQ; FINSI; * calcul de alpha ***************************************************** * * on peut etre tenté d'introduire le nombre de ddls, mais on ne le fait pas... * nddl = dime RIGTOT0; * nddl2 = nddl**2; * choix de la norme 2 (Identité) pour DDEP2P si (ega NONORM 'I'); KDDEP2P = DDEP2P; finsi; * choix de la norme diag(K) pour DDEP2P si (ega NONORM 'K'); * KDDEP2P = * diagK DDEP2P motCu motCu motCu; * maxdd2 = XTY KDDEP2P DDEP2P motCu motCu; KDDEP2P = * (diagK**0.5) DDEP2P motCu motCu motCu; finsi; * calcul de alpha alpha = (maxdd2/MAXDEP2) + 1.; alpha = 1./(alpha**0.5); si OMEFIXE; salpha= +1.; sinon; + ((DTIME0 * DTP)); finsi; * pas adaptatif dsP si (itconv > itmax); dsP = 0.5*dsP; si (dsP < dsPmin); dsP=dsPmin; finsi; finsi; si (itconv <eg itmin); dsP0=dsP; dsP = 1.2*dsP; si (dsP > dsPmax); dsP=dsPmax; si (dsP > dsP0); finsi; sinon; finsi; finsi; * finsi; WTAB . 'DS' = dsP; alpha0 = salpha * alpha; * si (ega ipas 3); erre 21; finsi; alpha = alpha0 * dsP; si(fldebug); finsi; * Mise A Jour du vecteur inconnu prenant en compte la reduction du predicteur * deplacement *dl DDEP2 = ( (1. - alpha) * (DEPTOT EXCO 'LX' 'NOID' 'LX')) *dl + (alpha * DDEP2P); DDEP2 = alpha * DDEP2P; DDEP2P = DDEP2; *dl DEP2 = (DEPTOT ENLE 'LX') + DDEP2; DEP2 = DEPTOT + DDEP2; DEP2P = DEP2; WTAB . 'DEPLACEMENTS' = DEP2; * temps DTIME0 = alpha * DTP; TIME = TIME0 + DTIME0; TIMEP = TIME; * contrainte SI (FLMOD1); SIG2 = SIGTOT + DSIGT ; si (FLGDEP); finsi; WTAB . 'CONTRAINTES' = SIG2; SIG2P = SIG2; FINSI; * affichage du0 = alpha * (maxdd2**0.5); * recup des mesures SI (FLRES1); ires1 = 0; repe BRES1 nRES1; ires1 = ires1 + 1; moc1 = TRES1 . ires1 . 'COMPOSANTE'; * -mesure de la frequence si (ega moc1 'FREQ'); x1 = WTAB . 'FREQ'; * -autres mesures (U, F ...) sinon; pt1 = TRES1 . ires1 . 'POINT_MESURE'; sinon; finsi; finsi; * pour l'affichage * si (ires1 <eg 2); finsi; fin BRES1; FINSI; * erre 21; ************************************************************************ * * * CORRECTION * * * ************************************************************************ * initialisation du pas * NREL2i= 1.E30; NF2 = NF20; DUTR1 = 1.E30; XCONV = faux; WTAB . 'RECA_K' = FLRECA ou OMEFIXE; RECA_CO= NON OMEFIXE; isouspas = 0; * recup d'info de la prediction (considérée comme l'iteration 0) DTIME = DTIME0; DRES0 = alpha*DRES0; Res2i = DRES0; DEPTOTi=DEPTOT; SI (FLMOD1); SIGTOTi=SIGTOT; FINSI; *-----------------------------------------------------> boucle iterative REPE BSOUPAS maxsous; isouspas = isouspas + 1; * initialisation du pas it = 0; iacc = 0; itacc = nacc; * variables du linesearch : compteur, longueur beta , activation du LS nls = 10; ils = 0; beta = 1.; FLLS = FAUX; *-----------------------------------------------------> boucle iterative REPE BRESONL (nls*NMAXIT); it = it + 1; SI (it > NMAXIT) ; QUIT BRESONL; FINSI; *---Mise a jour : * -de la matrice de raideur : SI (WTAB . 'RECA_K' ou FLFULL); * appel a CON_CALC qui calcule tout ! * on se met dans la derniere configuration deformee si (FLGDEP); FORM GEOM0; finsi; CON_CALC TAB1 mopred TIME DTIME; * la matrice a resoudre RIGTOT0 = K + OMEG^2*M + OMEG*C +/-H mess 'recalcul de K'; RIGTOT0 = WTAB . 'RAIDEUR' ; DRES0 = WTAB . 'DERIVEE_RESIDU'; FINSI; *---Mise a jour : * -des matrices colonne et ligne supplementaires : SI (RECA_CO ou FLFULL); * on adimensionne DRES0 * on fait les corrections dans le plan orthogonal a la prediction si (ega NONORM 'I'); finsi; * choix de la norme diag(K) pour DDEP2P si (ega NONORM 'K'); KDDEP2 = * diagK (DDEP2P) motCu motCu motCu; finsi; DUPT = (1./MAXDEP2) * DUPT; DTT = (1./DTP2) * DTT ; * rem: on pourrait sans doute mieux adimensionner ca, voire meme * utiliser une expression symetrique de dRdT a la place de DUPT FINSI; * -de l'operateur final : SI ((NON OMEFIXE) et (WTAB . 'RECA_K' ou RECA_CO ou FLFULL)); RIGTOT2 = RIGTOT0 et dRdT et DUPT et DTT; FINSI; WTAB . 'RECA_K' = faux; RECA_CO= faux; *---appel a CON_CALC qui calcule le residu dans la config n+1 SI (FLGDEP); FORM GEOM0; FINSI; CON_CALC TAB1 mocorr TIME DTIME; * attention : si on détecte un changement brutal de comportement (mise * en contact, etc ..), alors il faut recommencer en recalculant K si (WTAB . 'RECA_K'); it = it - 1; ITER BRESONL; finsi; * on recupere le residu fraichement calculé Res2 = WTAB . 'RESIDU' ; * puis retour a la config n (en debut de pas) SI (FLGDEP); FORM GEOM1 ; FINSI; * FINSI; *---calcul des reactions *dl Freac2 = REAC KBLO1 DEP2; Freac2 = WTAB . 'REACTION'; *---calcul de la norme NF2 de ce pas si (ega NF2 'NONDEFINI'); NF2 = NF2 + NF2r; si (FLMOME); * NF2M = maxi ((PSCA Res2 Res2 motCm motCm)**0.5); * mess 'normes pour tester la convergence du Residu =' NF2 NF2M; sino; * mess 'norme pour tester la convergence du Residu =' NF2; finsi; finsi; * -condition d'equilibre des forces : *dl* Equi^{(i)} = Res^{(i)} - C^T*\lambda^{(i)} *dl Equi2 = (Res2 + (REAC KBLO1 DEP2)) ENLE 'FLX'; NREL2 = Neq2 / NF2; si (FLMOME); NREL2M = Neq2M / NF2M; finsi; *---affichage mess chacha; *---Convergence? XCONV = (NREL2 < XPREC); si (FLMOME); XCONV = XCONV et (NREL2M < XPREC); finsi; SI XCONV; isconv = isouspas; itconv = it; SI (ils > 0); FINSI; QUIT BRESONL; FINSI; * SI (NON FLFULL); *---Acceleration d'Aitken pour le Residu * avec CHR0k = Residu^(i-k) et CHEOk = Equilibre^(i-k) si (ega itacc 4); CHR03 = Res2; CHE03 = Equi2; finsi; si (ega itacc 3); CHR02 = Res2; CHE02 = Equi2; finsi; si (ega itacc 2); CHR01 = Res2; CHE01 = Equi2; finsi; si (ega itacc 1); CHR00 = Res2; CHE00 = Equi2; finsi; itacc = itacc - 1; si (ega itacc 0); Res2 = Res2 - CORREC; itacc = nacc; mess 'acceleration Residu'; finsi; *---> ne semble pas tres compatible avec le linesearch... * FINSI; *---Resolution du pb augmenté : * SI (it ega 2) ; erre 21; FINSI; * [K^{tan (i)} C^T dR/dt ] (\Delta U ) (Res^{(i-1)}) * [C 0 0 ] * (\lambda^{(i)}) = (U^{imp}_n ) * [Du(i-1)^T 0 Dt(i-1)] (\Delta t ) (0 ) * si (ega ipas 21); erre 21; finsi; si (OMEFIXE); DTIME = 0.; sinon; * -Extraction de DT et de (DU,lambda) * rem : si thermique faudra changer... finsi; *---Actualisation du vecteur inconnu : * -calcul du alpha^(i) de l itéré * la longueur de l'itéré doit etre << dsP si (ega NONORM 'I'); finsi; si (ega NONORM 'K'); * KDDEP2 = * (diagK) DDEP2 motCu motCu motCu; * maxdd2 = XTY KDDEP2 DDEP2 motCu motCu; KDDEP2 = * (diagK**0.5) DDEP2 motCu motCu motCu; finsi; alphai = (maxdd2i/MAXDEP2) + ((DTIME/DTP)**2); alphai = dsP / (alphai**0.5); si (alphai < 1.); si (alphai < 1.E-6); alphai = 1.E-6; finsi; mess 'reduction de l itéré par ' alphai; DTIME = alphai * DTIME; *dl DDEP2 = ((1.-alphai) * (exco DEP2 'LX' 'NOID' 'LX')) *dl + (alphai * DDEP2); DDEP2 = alphai * DDEP2; sinon; alphai = 1.; finsi; * -on sauve les vecteurs a literation i + Mise A Jour du vecteur inconnu * U^{(i)} = U^{(i-1)} + \Delta U * \lambda^{(i)} = 0 + \Delta \lambda * deplacement DEP2i = DEP2; *dl DEP2 = (ENLE DEP2i 'LX') + DDEP2; DEP2 = DEP2i + DDEP2; WTAB . 'DEPLACEMENTS' = DEP2; * temps TIMEi = TIME; DTIMEi= DTIME; TIME = TIMEi + DTIMEi; * residu * Res2i = Res2; * -increment de deformation et de contrainte calculé sur config n * rem : pourrait etre calculée sur config intermediaire t_n+0.5 SI (FLMOD1); SIG2i = SIG2; SIG2 = SIGTOTi + DSIGT ; * SIG2 = contrainte PK2 calculée sur config n, * car SIGTOT = contrainte de Cauchy au temps n * = contrainte de PK au temps n sur config n * (cf cours Brunet, p.43) si (FLGDEP); * on calcul les contraintes de Cauchy (sur config n+1) finsi; WTAB . 'CONTRAINTES' = SIG2; FINSI; *---affichage * dup = alphai * (maxdd2i**0.5); *---recup des mesures SI (FLRES1); ires1 = 0; TRES1 . ires1 . 'ITERES' = TRES1 . ires1 . 'ITERES' et TIME; repe BRES1 nRES1; ires1 = ires1 + 1; moc1 = TRES1 . ires1 . 'COMPOSANTE'; * -mesure de la frequence si (ega moc1 'FREQ'); x1 = WTAB . 'FREQ'; * -autres mesures (U, F ...) sinon; pt1 = TRES1 . ires1 . 'POINT_MESURE'; sinon; finsi; finsi; TRES1 . ires1 . 'ITERES' = TRES1 . ires1 . 'ITERES' et x1; * pour l'affichage * si (ires1 <eg 2); finsi; fin BRES1; FINSI; FIN BRESONL; *<------------------------------------------- fin de la boucle iterative ************************************************************************ * * * NON CONVERGENCE * * * ************************************************************************ *-on sort si convergence! si (XCONV); nittot = nittot + itconv; quit BSOUPAS; *-erreur si non-convergence! sino; si (isouspas >eg maxsous); * erre 997; mess 'On retourne le resultat malgré tout...'; * si le dernier pas converge n'a pas ete sauve, * on le sauve pour eventuelle reprise * sauvegarde du dernier pas converge TAB1 . 'TEMPS' . (ipas - 1) = TIME0; TAB1 . 'DEPLACEMENTS' . (ipas - 1) = DEPTOTi; SI (FLMOD1); TAB1 . 'CONTRAINTES' . ipas = SIGTOTi; FINSI; FINSI; * doit on faire qqchose sur WTAB ?...? quit BEXTERN; finsi; * si (isouspas < maxsous); * si ((isouspas <eg 3) et (dsP > dsPmin)); si ((isouspas <eg 3)); si ((dsP > dsPmin)); * on recommence avec un pas predicitif 1/xred fois + petit xred = 0.2; dsP = xred * dsP; si (dsP < dsPmin); dsP=dsPmin; finsi; alpha = xred * alpha; mess ' reduction du pas predicteur de ' xred; sinon; * on recommence avec un pas predicitif tq ds = 1 ! alpha = alpha0; xred = 1. / dsP; dsP = 1; mess ' augmentation du pas predicteur de ' xred; finsi; * deplacement *dl DDEP2 = ( (1. - alpha) * (DEPTOT EXCO 'LX' 'NOID' 'LX')) *dl + (alpha * DDEP2P); DDEP2 = (alpha * DDEP2P); DDEP2P = DDEP2; *dl DEP2 = (DEPTOT ENLE 'LX') + DDEP2; DEP2 = DEPTOT + DDEP2; DEP2P = DEP2; WTAB . 'DEPLACEMENTS' = DEP2; * temps DTIME = alpha * DTP; DTP = xred * DTP; TIME = TIME0 + DTIME; TIMEP = TIME; * contrainte SI (FLMOD1); SIG2 = SIGTOT + DSIGT ; si (FLGDEP); finsi; WTAB . 'CONTRAINTES' = SIG2; SIG2P = SIG2; FINSI; * affichage * du0 = alpha * (maxdd2**0.5); TIME '|'; *---recup des mesures SI (FLRES1); ires1 = 0; TRES1 . ires1 . 'ITERES' = TRES1 . ires1 . 'ITERES' et TIME; repe BRES1 nRES1; ires1 = ires1 + 1; moc1 = TRES1 . ires1 . 'COMPOSANTE'; * -mesure de la frequence si (ega moc1 'FREQ'); x1 = WTAB . 'FREQ'; * -autres mesures (U, F ...) sinon; pt1 = TRES1 . ires1 . 'POINT_MESURE'; sinon; finsi; finsi; TRES1 . ires1 . 'ITERES' = TRES1 . ires1 . 'ITERES' et x1; * pour l'affichage * si (ires1 <eg 2); finsi; fin BRES1; FINSI; sinon; * autre chance : RECA_K = vrai; RECA_CO = NON OMEFIXE; * Pour le prochain sous-pas, on repart de la position non-convergée DTP = TIME - TIME0; * TIME0 = TIME; DDEP2P = DEP2 - DEPTOT; DEPTOTi = DEP2; WTAB . 'DEPLACEMENTS' = DEPTOTi; SI (FLMOD1); SIGTOTi = SIG2; WTAB . 'CONTRAINTES' = SIGTOTi; FINSI; SI (FLGDEP); FORM GEOM0; FINSI; finsi; fins; FIN BSOUPAS; *<------------------------------------------- fin de la boucle iterative ************************************************************************ * * * CONVERGENCE * * * ************************************************************************ *-Ici on a convergé : ****************************** * Pour le prochain pas DTIME0 = TIME - TIME0; TIME0 = TIME; DDEP0 = DEP2 - DEPTOT; DEPTOT = DEP2; SI (FLMOD1); SIGTOT = SIG2; FINSI; * affichage ds2 = ((maxdd2 / MAXDEP2) + ((DTIME0 / DTP)**2))**0.5; mess 'convergence en ' itconv ' iterations ' ndiag; dsPP = dsP; * si on est trop grand c'est que les corrections sont grandes par * rapport a la prediction -> "on tourne" vite -> il faut reduire le pas * dsP = 0.5*dsP; finsi; finsi; ' (Du=' (maxdd2**0.5) ' Dt=' DTIME0 ')' ; mess chaconv; * si convergence on enregistre cette frequence PRTIME = PRTIME et TIME; * sauvegarde pour eventuelle reprise WTAB . 'DEPLACEMENTS' = DEPTOT; SI (FLMOD1); WTAB . 'CONTRAINTES' = SIGTOT; FINSI; WTAB . 'DDEP0' = DDEP0; WTAB . 'DTIME0' = DTIME0; WTAB . 'TIME0' = TIME0; * sauvegarde du pas TAB1 . 'TEMPS' . ipas = TIME; TAB1 . 'DEPLACEMENTS' . ipas = DEPTOT; SI (FLMOD1); TAB1 . 'CONTRAINTES' . ipas = SIGTOT; FINSI; FINSI; * eventuellement recombinaison modale * Sauvegarde des Resultats ****************************** * recup des mesures SI (FLRES1); ires1 = 0; repe BRES1 nRES1; ires1 = ires1 + 1; moc1 = TRES1 . ires1 . 'COMPOSANTE'; * -mesure de la frequence si (ega moc1 'FREQ'); x1 = WTAB . 'FREQ'; sinon; * -mesure de U ou F pt1 = TRES1 . ires1 . 'POINT_MESURE'; sinon; sinon; finsi; finsi; finsi; TRES1 . ires1 . 'RESULTATS' = TRES1 . ires1 . 'RESULTATS' et x1; fin BRES1; FINSI; * stockage de la stabilite (calculee avec les matrices en debut de pas) *-via DIAG SI FLDIAG; TAB1 . 'RESULTATS_STABILITE' . 'DIAG' = * En theorie, il faudrait aussi trouver un moyen pour detecter les * changements de signe de la jacobienne augmentee * et s'assurer que la matrice utilisee soit bien celle en début de pas * Ici, on se contente de prendre la valeur ci dessous * (dont le sens reste a prouver car matrice non symetrique) : TAB1 . 'RESULTATS_STABILITE' . 'DIAG_AUGMENTEE' = TAB1 . 'RESULTATS_STABILITE' . 'DIAG_AUGMENTEE' et (flot ndiag2); FINSI; *-via HILL (calcul des exposants de FLOQuet) SI FLFLOQ; * lrprog liprog = FLOQUET TAB1; --> fait en debut de pas * initialisation des objets en sortie si (nfloq ega -3); ifloq = 0; repe Bfloq nfloq; ifloq = ifloq + 1; fin Bfloq ; * finsi; *bp : les CI ne sont pas forcement en equilibre : sinon; * remplissage des tables de listreel en sortie ifloq = 0; repe Bfloq nfloq; ifloq = ifloq + 1; TFLOQ . 'EXPOSANT_REEL' . ifloq TFLOQ . 'EXPOSANT_IMAG' . ifloq fin Bfloq ; * on teste la stabilite sur tous les exposants de Floquet * OU * on ne conserve que les (2*nddls) valeurs centrées autour de 0 si (minlr > 1.E-16); ifloq = 1; sinon; ifloq = 0; finsi; TFLOQ . 'STABILITE' = TFLOQ . 'STABILITE' et ifloq; finsi; FINSI; * sortie *********************************************** SI (FLSOR1); * sortie sur la config initiale si FLSOR2; * SORT TYPSOR MAISOR DEPTOT 'DEPL' SIGGRA 'SIGM' 'TEMP' TIME; * sinon; * SORT TYPSOR MAISOR DEPTOT 'DEPL' 'TEMP' TIME; finsi; FINSI; * trait de fin du pas ****************************************** mess chaline; * On sort si on a fini ! ************************************** TAB1 . 'TEMPS_PROG' = PRTIME; PRTIME1 = PRTIME et TIME00; mess chaline; ' <----------------------'; QUIT BEXTERN; FINSI; FIN BEXTERN; ************************************************************************ * * *<=== Fin de la Boucle BEXTERN sur les pas de chargement * * ************************************************************************ mess chaline; ************************************************************************ * * * SAUVEGARDE DES RESULTATS (convergés jusqu'à arret de bextern) * * * ************************************************************************ * evolutions SI (FLRES1); * tables des titres pour l operateur DESSIN mycoul1 = mots 'VIOL' 'BLEU' 'TURQ' 'VERT' 'OLIV' 'ORAN' 'ROUG' 'ROSE' 'AZUR' 'DEFA'; ires1 = 0; repe BRES1 nRES1; ires1 = ires1 + 1; * titre tit1 = TRES1 . ires1 . 'TITRE'; sinon; tit1 = TRES1 . ires1 . 'TITRE'; finsi; TRES1 . 'TITRE' . ires1 = tit1; * couleur coul1 = TRES1 . ires1 . 'COULEUR'; sinon; icoul1 = icoul1 + 1; si (icoul1 > ncoul1); icoul1 = 1; finsi; TRES1 . ires1 . 'COULEUR' = coul1; finsi; tit1 (TRES1 . ires1 . 'RESULTATS'); TRES1 . ires1 . 'RESULTATS_EVOL' = ev1; evtot = evtot et ev1; fin BRES1; TRES1 . 'RESULTATS_EVOL' = evtot; FINSI; * on quitte on revenant sur la config initiale SI (FLGDEP); FORM GEOM0; finsi; FINPROC ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales