* 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