* DYNAMIC PROCEDUR FANDEUR 22/03/01 21:15:03 11301 * ====================================================================== * CALCUL DE LA REPONSE DYNAMIQUE PAR INTEGRATION TEMPORELLE * (SCHEMA DE NEWMARK OU HHT OU ALPHA-GENERALISE) * ====================================================================== * Creation : ???, 1988 ??? * Refonte : Benoit Prabel, 23/07/2015 * Modifications : JCARDO 15/02/2017 => post-traitement tableur + VTK * ====================================================================== * +-----------------------------------------------------------------+ * | | * | L E C T U R E D E S P A R A M E T R E S | * | | * +-----------------------------------------------------------------+ * ================ * OPTIONS INTERNES * ================ KMENAG = VRAI ; * =================================================== * PARAMETRES DE L'ALGORITHME D'INTEGRATION TEMPORELLE * =================================================== FINS ; * => Newmark acceleration moyenne (IALGO = 0) IALGO = 0 ; ALPHAM = 0. ; ALPHAF = 0. ; * => HHT (IALGO = 1) ALPHAF = ETAB.'ALPHA_F' ; SI (IECHO >EG 0) ; FINS ; IALGO = 1 ; FINS ; * => alpha-generalise (IALGO = 2) RHOINF = ETAB . 'RHO_INF' ; ALPHAM = ((2.*RHOINF) - 1.) / (1.+RHOINF) ; ALPHAF = RHOINF / (1.+RHOINF) ; SI (IECHO >EG 0) ; ' & ALPHA_F=' ALPHAF ')' ; FINS ; IALGO = 2 ; FINS ; * ==================== * CONDITIONS INITIALES * ==================== V0 = ETAB.'VITE' ; * ======================= * MATRICES ET CHARGEMENTS * ======================= * Matrices et chargements constants SI KAMOR ; SI (IECHO >EG 0) ; MESS 'Presence d une matrice d amortissement' ; FINS ; FINS ; * Matrices et chargements "utilisateur" via la procedure CHARMECA KCHARM = FAUX ; KCHARM = ETAB.'CHARMECA' ; FINS ; * ==================================== * APPEL A VITEUNIL POUR LES CONTACTS ? * ==================================== SINON ; KVITUN = (EGA IALGO 0) ; FINS ; SI (KVITUN ET (NEG IALGO 0)) ; 'acceleration moyenne' ; FINS ; * ==================== * PARAMETRES TEMPORELS * ==================== * Nouvelle syntaxe : TPROG = ETAB.'TEMPS_CALCULES' ; MESS 'La liste des TEMPS_CALCULES doit etre strictement ' 'croissante !' ; FINS ; * Ancienne syntaxe : on avertit et on traduit MESS '!!! SYNTAXE BIENTOT OSBOLETE : CONSULTEZ LA NOTICE !!!' ; DTFREQ = 0.25 / ETAB.'FREQ' ; T0 = ETAB.'DEBU' ; SINON ; T0 = 0. ; FINS ; ETAB.'TEMPS_SAUVES' = TSORT ; ETAB.'TEMPS_CALCULES' = TPROG ; SINON ; MESS 'Liste des TEMPS_CALCULES absente de la table !' ; FINS ; FINS ; * ======================== * PARAMETRES DE SAUVEGARDE * ======================== IGIB = 0 ; ICSV = 0 ; IVTK = 0 ; * SAUVEGARDE VTK * -------------- * Instants de sauvegarde IPASVTK = ETAB.'PAS_SAUVES_VTK' ; SINON ; SI (EGA (ETAB.'PAS_SAUVES_VTK') 'TOUS') ; IPASVTK = 1 ; SINON ; SI (EGA (ETAB.'PAS_SAUVES_VTK') 'FINAL') ; IPASVTK = NPAS ; SINON ; FINS ; FINS ; FINS ; IVTK = 1 ; FINS ; IVTK = 2 ; FINS ; FINS ; * Emplacement de sauvegarde FICVTK = ETAB.'FICHIER_VTK' ; SINON ; FINS ; * Liste des maillages a sauvegarder SI (IVTK > 0) ; MAIVTK = ETAB.'MAILLAGE_VTK' ; SINON ; MESS 'L indice MAILLAGE_VTK est obligatoire !' ; FINS ; FINS ; * SAUVEGARDE CSV (TABLEUR) * ------------------------ * Instants de sauvegarde IPASCSV = ETAB.'PAS_SAUVES_CSV' ; SINON ; SI (EGA (ETAB.'PAS_SAUVES_CSV') 'TOUS') ; IPASCSV = 1 ; SINON ; SI (EGA (ETAB.'PAS_SAUVES_CSV') 'FINAL') ; IPASCSV = NPAS ; SINON ; FINS ; FINS ; FINS ; ICSV = 1 ; FINS ; ICSV = 2 ; FINS ; FINS ; * Emplacement de sauvegarde (eventuellement a la fin du calcul) KFICCSV = VRAI ; FICCSV = ETAB.'FICHIER_CSV' ; SINON ; KFICCSV = FAUX ; FINS ; * Liste des noeuds et composantes a sauvegarder SI (ICSV > 0) ; SI (NELCSV EGA 0) ; FINS ; SINON ; MESS 'L indice MAILLAGE_CSV est obligatoire !' ; FINS ; KLISCO = FAUX ; LISCO = ETAB.'COMPOSANTES_CSV' ; KLISCO = VRAI ; FINS ; FINS ; FINS ; * SAUVEGARDE GIBIANE * ------------------ * Instants de sauvegarde IPASGIB = ETAB.'PAS_SAUVES' ; SINON ; SI (EGA (ETAB.'PAS_SAUVES') 'TOUS') ; IPASGIB = 1 ; SINON ; SI (EGA (ETAB.'PAS_SAUVES') 'FINAL') ; IPASGIB = NPAS ; SINON ; FINS ; FINS ; FINS ; IGIB = 1 ; FINS ; IGIB = 2 ; SINON ; IPASGIB = 4 ; IGIB = 1 ; FINS ; FINS ; * Sauvegarde incrementale ? * (appel a "SAUV MUET ETAB" => ecriture sur disque) KINCR = FAUX ; SI (KINCR ET (IECHO >EG 0)) ; MESS 'SAUVegarde incrementale activee' ; FINS ; FINS ; * Fantomisation des resultats au fur et a mesure du calcul KECON = FAUX ; KECON = ETAB.'ECON' ; FINS ; * Restriction de la geometrie a sauvegarder SI KMAIGIB ; MAIGIB = ETAB.'MAILLAGE_SAUVE' ; FINS ; * +-----------------------------------------------------------------+ * | | * | I N I T I A L I S A T I O N S | * | | * +-----------------------------------------------------------------+ * =================================================== * PARAMETRES DE L'ALGORITHME D'INTEGRATION TEMPORELLE * =================================================== ALPHA = ALPHAF - ALPHAM ; GAMMA = 0.5 + ALPHA ; BETA = 0.25 * ((1.+ALPHA)**2) ; 1MAF = 1. - ALPHAF ; 1MAM = 1. - ALPHAM ; GAMBET = GAMMA / BETA ; SI (IECHO >EG 0) ; ' (GAMMA/BETA=' GAMBET ')') ; FINS ; * ==================== * PARAMETRES TEMPORELS * ==================== IPAS = 1 ; DT0 = 0. ; * =================== * SYSTEME D'EQUATIONS * =================== * ===================================================== * ACCELERATION INITIALE A0 (NOUVEAUX SCHEMAS TEMPORELS) * ===================================================== A0 = ETAB.'ACCE' ; SINON ; K0 = K ; SI KAMOR ; F2ND = F2ND - (C * V0) ; FINS ; SI KCHARM ; TCHAR = CHARMECA WTAB ; SI KCHAF ; F2ND = F2ND + TCHAR.'ADDI_SECOND' ; FINS ; SI KCHAK ; K0 = K0 ET TCHAR.'ADDI_MATRICE' ; FINS ; FINS ; F2ND = F2ND + FREAC0 ; * (1.*M) POUR EVITER PB HORODATAGE SI REUTILISATION DE M PLUS TARD FINS ; * =================== * TABLES DE RESULTATS * =================== INDVTK = 0 ; INDCSV = 0 ; INDGIB = 0 ; NFANTO = 0 ; * SAUVEGARDE VTK * -------------- SI (IVTK > 0) ; SI (IVTK EGA 1) ; KVTK = VRAI ; SINON ; FINS ; SI KVTK ; INDVTK = INDVTK + 1 ; FINS ; FINS ; * SAUVEGARDE CSV * -------------- SI (ICSV > 0) ; * Initialisation de la table TABCSV ETAB.'RESULTATS_CSV' = TABCSV ; * Titres de colonnes et initialisation des LISTREEL REPE I1 NELCSV ; SI KLISCO ; FINS ; SI (NCO1 EGA 0) ; ITER I1 ; FINS ; REPE I2 NCO1 ; REPE I3 4 ; J3 = 5 - &I3 ; QUIT I3 ; FINS ; FIN I3 ; LCOCSV = LCOCSV ET CHA1 ; FIN I2 ; FIN I1 ; * Garder l'instant initial ? SI (ICSV EGA 1) ; KCSV = VRAI ; SINON ; FINS ; SI KCSV ; INDCSV = INDCSV + 1 ; TABCSV.'TEMPS' = TABCSV.'TEMPS' ET T0 ; REPE I1 NBCSV ; K1 = 2*&I1 ; K2 = K1 + 1 ; TABCSV.MOT1 = TABCSV.MOT1 ET X1 ; TABCSV.MOT2 = TABCSV.MOT2 ET X2 ; FIN I1 ; FINS ; FINS ; * SAUVEGARDE GIBIANE * ------------------ SI (IGIB > 0) ; * Initialisation de la table STAB (indicee par INDGIB) ETAB.'RESULTATS' = STAB ; * Garder l'instant initial ? SI (EGA IGIB 1) ; KGIB = VRAI ; SINON ; FINS ; SI (KGIB OU (EGA IPAS NPAS)) ; * (on force la sauvegarde si dernier pas) INDGIB = INDGIB + 1 ; STAB.INDGIB = STN ; SI KMAIGIB ; SINON ; STN.'VITE' = V0 ; FINS ; FINS ; FINS ; * ======================= * TABLE DE CALCUL INTERNE * ======================= * On transmet a WTAB la table de PARAmetres utilisateurs si elle existe FINS ; WTAB.'VITE' = V0 ; * +-----------------------------------------------------------------+ * | | * | B O U C L E S U R L E S P A S D E T E M P S | * | | * +-----------------------------------------------------------------+ * AFFICHAGE DU MESSAGE D'INFORMATION POUR L'ETAT INITIAL MESS CHACHA ; REPE BPAS (NPAS - 1) ; IPAS = IPAS + 1 ; * =========================== * PREPARATION DU PAS DE TEMPS * =========================== * PARAMETRES TEMPORELS * -------------------- DT = T1 - T0 ; DT2 = DT ** 2 ; * QUELQUES CONSTANTES * ------------------- XM = 1. / (BETA*DT2) ; XC = GAMMA / (BETA*DT) ; * WTAB AVEC U_N ET T_N+1 WTAB.'VITE' = V0 ; * WTAB.'ACCE' = A0 ; * PROCEDURE "UTILISATEUR" (CHARMECA) * ---------------------------------- KCHAF = FAUX ; KCHAK = FAUX ; KCHAFNL = FAUX ; KCHAKNL = FAUX ; KCHACNL = FAUX ; SI KCHARM ; TCHAR = CHARMECA WTAB ; * Indices destines a l'ajout de relations (mult. de Lagrange) * entre deplacements SI KCHAF ; FCHAR1 = TCHAR.'ADDI_SECOND' ; FINS ; SI KCHAK ; KCHAR1 = TCHAR.'ADDI_MATRICE' ; FINS ; * Indices destines aux autres comportements non lineaires SI KCHAFNL ; FNL0 = TCHAR.'ADDI_FNL' ; FINS ; SI KCHAKNL ; KNL1 = TCHAR.'ADDI_KNL' ; FINS ; SI KCHACNL ; CNL1 = TCHAR.'ADDI_CNL' ; FINS ; FINS ; * CALCUL DU SECOND MEMBRE * ----------------------- * (aucune difference entre ADDI_SECOND et ADDI_FNL si ce n'est * l'affichage dans CHACHA) SI KCHAF ; F1 = F1 + FCHAR1 ; FINS ; SI KCHAFNL ; F1 = F1 + FNL0 ; FINS ; * ANCIEN SCHEMA => COMPATIBLE AVEC VITEUNIL SI KVITUN ; * SI (EGA IALGO 0) ; FA = M * A1PRED ; SINON ; U0PRED = U0 ; FINS ; FG = K2 * U0PRED ; * SYNTAXE ADAPTEE AU HHT ET ALPHA-GEN (MAIS NON COMPATIBLE AVEC * RELATIONS UNILATERALES ET VITEUNIL) SINON ; A0 ( (1MAM * 0.5 / BETA) - 1. ) ; A0 ( 1MAF * DT * ((0.5*GAMBET) - 1.) ) ; F2ND = FEXT1 - (K * (U0PRED)) + (M * A1PRED) ; SI KAMOR ; F2ND = F2ND + (C * V1PRED) ; FINS ; SI KCHACNL ; F2ND = F2ND + (CNL1 * (V1PRED + V0)) ; FINS ; * 2nd membre complet = Fext_n+1 - Fint_n + Famor_n + M*(4/dt*V_n+A_n) FINS ; * ON RECALCULE L'OPERATEUR... * ...SI LE PAS DE TEMPS CHANGE OU SI UNE MATRICE CHANGE * ----------------------------------------------------- SI ((DT NEG DT0 DTTOL) OU KCHAK) ; SI (KMENAG) ; DETR OPER ; FINS ; OPER = (1MAF * K) ET ((1MAM * XM) * M) ; SI KAMOR ; OPER = OPER ET ((1MAF * XC) * C) ; FINS ; SI KCHAK ; OPER = OPER ET KCHAR1 ; FINS ; SI KCHAKNL ; OPER = OPER ET (1MAF * KNL1) ; FINS ; SI KCHACNL ; OPER = OPER ET ((1MAF * XC) * CNL1) ; FINS ; FINS ; * ====================== * CALCUL DU PAS DE TEMPS * ====================== * RESOLUTION DU SYSTEME LINEAIRE * MISE A JOUR DES VARIABLES AU TEMPS N+1 * U1 = U0 + DU ; * A priori inutile d'enlever les LX, mais histoire d'etre sur... * * Calcul du Residu (a n+1 ou avec les alphas pour NL?) * * rem : inutile en lineaire * * K*U1 contient deja les reactions * Res1 = F1 - (K * U1) - (M * A1); * MaxRes1 = MAXI Res1 'ABS' 'SANS' (mots 'FLX'); * chacha = chai chacha ' max(R)=' MaxRes1; * * * Calcul de l'energie (a n+1) * Wmeca1 = 0.5 * (XTMX K (U1 enle LX) + (XTMX M V1)) ; * chacha = chai chacha ' Wmeca=' FORMAT '(F8.1)' Wmeca1 ; * CORRECTION DES VITESSES (SEULEMENT POUR NEWMARK ACC. MOY.) SI KVITUN ; * Eventuelle mise a jour de l'indicateur de presence de relations * unilaterales SI (KCHAK OU (IPAS <EG 2)) ; FINS ; SI KCONTA ; FINS ; FINS ; FINS ; * ========================== * SAUVEGARDE DU PAS DE TEMPS * ========================== * SAUVEGARDE VTK * -------------- SI (IVTK > 0) ; SI (IVTK EGA 1) ; SINON ; FINS ; SI KVTK ; INDVTK = INDVTK + 1 ; FINS ; FINS ; * SAUVEGARDE CSV * -------------- SI (ICSV > 0) ; SI (ICSV EGA 1) ; SINON ; FINS ; SI KCSV ; INDCSV = INDCSV + 1 ; TABCSV.'TEMPS' = TABCSV.'TEMPS' ET T1 ; REPE I1 NBCSV ; K1 = 2*&I1 ; K2 = K1 + 1 ; TABCSV.MOT1 = TABCSV.MOT1 ET X1 ; TABCSV.MOT2 = TABCSV.MOT2 ET X2 ; FIN I1 ; FINS ; SI ((EGA IPAS NPAS) ET KFICCSV) ; FINS ; FINS ; * SAUVEGARDE GIBIANE * ------------------ SI (IGIB > 0) ; SI (IGIB EGA 1) ; SINON ; FINS ; SI ((IPAS 'EGA' NPAS) 'OU' KGIB); * (on force la sauvegarde si dernier pas) INDGIB = INDGIB + 1 ; STAB.INDGIB = STN ; SI KMAIGIB ; SINON ; STN.'VITE' = V1 ; FINS ; * Ecriture incrementale sur disque dur SI (KINCR 'ET' (((EPOCH1 - EPOCH0) '>EG' 300.D0) 'OU' ((EPOCH0 EGA 0.D0) 'ET' (EPOCH1 EGA 0.D0)) 'OU' (IPAS 'EGA' NPAS))) ; * (Il est necessaire de sauver aussi OPER : RIGIDITE) ETAB.'OPER' = OPER ; SAUV 'MUET' ETAB ; * Fantomisation des resultats sauves precedemment * (attention : on a encore besoin de ceux en cours pour le * prochain pas) SI (KECON) ; NFANTOL=(INDGIB - 1) - NFANTO ; SI(NFANTOL > 0); REPE SURI NFANTOL; JJ=NFANTO + &SURI; SI(JJ <EG 0); ITER SURI; FINS; FIN SURI; NFANTO=NFANTO+NFANTOL; FINS ; FINS ; FINS ; FINS ; FINS ; * =============================== * PASSAGE AU PAS DE TEMPS SUIVANT * =============================== * AFFICHAGE DU MESSAGE D'INFORMATION DU PAS DE TEMPS COURANT MESS CHACHA ; T0 = T1 ; DT0 = DT ; * U0 = U1 ENLE 'LX' ; U0 = U1 ; V0 = V1 ; DETR A0 ; A0 = A1 ; DETR F0 ; F0 = F1 ; SI (KMENAG) ; DETR A1PRED ; DETR DU ; FINS ; FIN BPAS ; * Sauvegarde de la derniere acceleration (pour reprise eventuelle) STN.'ACCE' = A1 ; FINP STAB ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales