$$$$ PASAPAS * PASAPAS PROCEDUR SP204843 26/04/22 21:15:02 12521 'DEBP' PASAPAS PRECED*'TABLE'; 'SAUT' 1 'LIGNE'; 'MESS' '------------------ DEBUT DE LA PROCEDURE PASAPAS --------------------'; ************************************************************************ * * * PRECED objet de type TABLE * * C'est une table donnant , les arguments d'entrees, les * * options, puis les resultats des pas precedents * * * * champs de materiaux : * * WTAB.'MAT_REF' materiau etat a la temperature de REFERENCE * * WTAB.'MAT0' materiau etat debut de calcul * * WTAB.'MAT1' materiau fin du pas de temps * * * ************************************************************************ **************** I PARTIE ****************************************** * Verifications des infos transmises et valeurs par defaut PAS_DEFA PRECED ; * Creation des tables de sortie et initialisations PAS_INIT PRECED ; WTAB = PRECED.'WTABLE' ; conti = PRECED.'CONTINUATION'; estim = PRECED.'ESTIMATION' ; *----------------------------------------------------------------------- * Appel aux procedures utilisateurs *----------------------------------------------------------------------- 'SI' WTAB.'PROCEDURE_PERSO1'; PRECED.'PERSO1_APPEL' = 1 ; PERSO1 PRECED ; 'SI' ('EXIS' PRECED 'ARRET') ; WTAB.'ARRET' = PRECED.'ARRET' ; 'FINSI' ; 'FINSI'; * 'SI' WTAB.'PROCEDURE_REEV_MEC' ; REEV_MEC PRECED 0 ; 'FINSI' ; * 'SI' WTAB.'PROCEDURE_REEV_THE' ; REEV_THE PRECED 0 ; 'FINSI' ; *----------------------------------------------------------------------- * Initialisation ETAT et MATERIAUX *----------------------------------------------------------------------- TEMP0 = conti.'TEMPS'; ETAT0 = PAS_ETAT PRECED TEMP0 ; WTAB.'MAT0' = PAS_MATE PRECED ETAT0 ; WTAB.'MAT1' = WTAB.'MAT0' ; * *--------- initialisation deformation thermique de reference 'SI' WTAB.'FOR_MECA' ; 'SI' WTAB.'ITHER' ; 'SI' ('EGA' WTAB.'ETREF' 'INCONNU'); WTAB.'ETAT_REF' = PAS_ETAT PRECED TEMP0 'T_REFERENCE'; WTAB.'MAT_REF' = PAS_MATE PRECED WTAB.'ETAT_REF' ; WTAB.'ETREF' = 'EPTH' WTAB.'MO_TOT' WTAB.'MAT_REF' WTAB.'TEMPERATURE_REFERENCE' ; 'FINS' ; * TET1 = WTAB.'TET1' ; 'SI' ('EGA' ('TYPE' TET1) 'CHPOINT'); TET1 ='CHAN' 'CHAM' TET1 WTAB.'MO_TOT' 'STRESSES' 'TEMPERATURES' ; 'FINS'; ETT0 = 'EPTH' WTAB.'MO_TOT' WTAB.'MAT0' TET1 ; WTAB.'ETHER1' = ETT0 - WTAB.'ETREF' ; * 'SI' WTAB.'POR1'; WTAB.'MSRTHER1'= PAS_EPTH PRECED WTAB.'MO_TOT' WTAB.'MAT0' TET1 ; 'FINS' ; 'FINS' ; 'FINS' ; ************************** II PARTIE ************************* ****************************************************************** ******************* boucle sur les pas de temps ***************** ****************************************************************** * ------------quelques initialisations de l'algorithme IPAS = 0 ; IAUTO = 1 ; ISAUV = VRAI; DTV = ('EXTR' WTAB.'TEMPS_CALCULES' 1) - TEMP0 ; 'SI' ( DTV '<' 1.e-15 ); 'SI' WTAB.'FREQUENTIEL' ; DTV = 1.e-14 ; 'SINON' ; DTV =('EXTR' WTAB.'TEMPS_CALCULES' 2) - TEMP0 ; 'FINSI'; 'FINSI'; * Pour l'option PAS_AJUSTE DT_AVANT = DTV ; IREREDU = VRAI; PASFINAL = 0 ; *----------------------------------------------------------------------- * Debut de la boucle sur les pas de temps *----------------------------------------------------------------------- 'REPETER' BEXTERN ; * * ----- Determiner le nouvel instant a calculer TI * TEMP0 = conti.'TEMPS' ; NPAS = 'DIME' WTAB.'TEMPS_CALCULES'; ICHG = WTAB.'ICHG'; ICHG = ICHG + 1; WTAB.'ICHG' = ICHG; 'SI' ( ICHG '>' NPAS) ; 'QUITTER' BEXTERN; 'FINSI'; TI = 'EXTRAIRE' WTAB.'TEMPS_CALCULES' ICHG ; ITERTPS = (TI '<' TEMP0 ) ; 'SI' ('NON' WTAB.'FREQUENTIEL') ; ITERTPS = ITERTPS 'OU' (TI 'EGA' PRECED.'TEMPS'. 0) ; 'SI' ('NON' WTAB.'REEQUILIBRAGE') ; ITERTPS = ITERTPS 'OU' ('EGA' TI TEMP0) ; 'FINSI'; 'FINSI'; 'SI' ITERTPS ; 'ITERER' BEXTERN ; 'FINSI'; * * ----- Ajustement du pas en fonction du nb d iteration du pas precedent * 'SI' WTAB.'PAS_AJUSTE'; PASFINAL=PASFINAL+1; TIV=TI; DTV=DT_AVANT; 'SI' WTAB.'CONV'; 'SI' (WTAB.'NOMBRE_ITERATIONS' > 20); DTV=DTV'/' (2. ** 0.5); 'FINSI'; 'SI' (WTAB.'NOMBRE_ITERATIONS' < 7); 'SI' IREREDU; DTV=DTV '*' (2. ** 0.5); 'FINSI'; 'FINSI'; DT_AVANT= DTV; IREREDU=VRAI; 'SINON'; DTV=0.0000000001D0* DT_AVANT; DT_AVANT= DT_AVANT /2.; IREREDU=FAUX; 'FINSI'; TTI = DTV* 1.0000000001 + TEMP0; 'SI' ( TTI 'EG' 1.5) ; DT_AVANT = TI-TEMP0; 'FINSI'; 'FINSI'; * estim.'TEMPS' = TI; WTAB.'DT' = TI '-' TEMP0 ; 'SI'((WTAB.'CONSOLIDATION' 'OU' WTAB.'DYNAMIQUE') 'ET' (WTAB.'DT' 'EGA' 0.)); WTAB.'DT' = WTAB.'DTPREC' ; 'ITERER' BEXTERN; 'FINSI'; * * ----- Compteur IPAS des pas de temps calcules IPAS = IPAS + 1; WTAB.'PAS'=IPAS; * ----- Mise a jour du modele si chargement de type MODE : 'SI' WTAB.'CHAR_MODE' ; MOD1P = WTAB.'MODELE' ; MODEVOL1 = 'TIRE' PRECED.'MODELE' 'MODE' TI ; WTAB.'MODELE' = MODEVOL1 ; 'SI' WTAB.'CHAR_MATE' ; MATEVOL1 = 'TIRE' PRECED.'CARACTERISTIQUES' 'MATE' TI ; WTAB.'CARACTERISTIQUES' = MATEVOL1 ; 'FINSI' ; PAS_MODL PRECED ; * MaJ table rayonnement : 'SI' WTAB.'RAYO' ; WTAB.'RAYONNEMENT' = 'PRRA' WTAB.'MOD_RAY' ; 'FINSI' ; * On sauvegarde les modeles successifs pour analyse resultats : ESTIM.'MODELES' = WTAB.'MODELE' ; * Initialisation TINI si thermique : 'SI' WTAB.'THE1' ; MODX = WTAB.'MOD_COND' ; MODXP = MOD1P 'EXTR' 'MATE' 'CONDUCTION' ; GEO1 = MODX 'EXTR' 'MAIL' ; GEO1P = MODXP 'EXTR' 'MAIL' ; DGEO1 = GEO1 'DIFF' GEO1P ; * Adapation du modele : transport de la solution 'SI' ((WTAB.'ADAP_MODE') 'ET' ('NON' (TI '<' (WTAB.'TPS1_ADAP')))) ; mess '***** Transport solution adaptation' ; IADAP1 = (WTAB.'INDI_ADAP') + 1 ; 'SI' (IADAP1 ' 1) ; 'SI' WTAB.'GRANDS_DEPLACEMENTS' ; WTAB.'RECARI' = VRAI ; WTAB.'REA_GEOM' = VRAI ; 'FORM' WTAB.'FOR' ; 'FINSI'; 'SINON' ; 'FORM' WTAB.'GE0_DEB' ; 'FINSI' ; 'FINSI' ; * 'SI' (TI 'NEG' TEMP0); WTAB.'TEM_CALC' = 'PROG' TI; 'SI' ('EXISTE' PRECED 'PAS_MAX'); 'SI' ((TEMP0 + PRECED.'PAS_MAX') '<' TI); WTAB.'TEM_CALC' = 'PROG' TEMP0 'PAS' PRECED.'PAS_MAX' TI ; WTAB.'TEM_CALC' = 'ENLE' WTAB.'TEM_CALC' 1; 'FINSI'; 'FINSI'; * Mise a jour blocages passes dans chargement * -> ISO AVANT MAIS A FAIRE A CHAQUE FOIS SI DEPEND DE LA MECA ?? 'SI' ('EGA' I_BOTH 1) ; * Cas BLOCAGES_THERMIQUES (BLOT) : 'SI' WTAB.'CHAR_BLOT' ; BLOT1 = 'TIRE' PRECED.'BLOCAGES_THERMIQUES' 'BLOT' TI ; WTAB.'BLOCAGES_THERMIQUES' = BLOT1 ; 'FINSI' ; * * Cas BLOCAGES_DIFFUSIONS (BLOD) : 'SI' WTAB.'CHAR_BLOD' ; BLOD1 = 'TIRE' PRECED.'BLOCAGES_DIFFUSIONS' 'BLOD' TI ; WTAB.'BLOCAGES_DIFFUSIONS' = BLOD1 ; 'FINSI' ; 'FINSI' ; * * ----- Appel a la procedure thermique (lineaire ou nonlineaire) ---- * 'SI' ('NON' WTAB.'COUPLAGE'); 'MENAGE'; 'FINSI'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'NONLINEAIRE'); CHTER = TRANSNON PRECED; 'FINSI'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'LINEAIRE'); CHTER = TRANSLIN PRECED; 'FINSI'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'DUPONT'); WTAB.'NOUV_PAS' = ('EXTR' WTAB.'TEM_CALC' 1) - TEMP0; CHTER = DUPONT2 PRECED; 'FINSI'; * * Verification d'une erreur en sortie 'SI' CHTER.'ERREUR'; 'ERREUR' ' '; 'FINSI'; * * Se placer sur la configuration de reference (appel proc ut.) 'FORM' WTAB.'FOR0' ; * * Reevaluation des donnees du calcul dependant de la temperature 'SI' WTAB.'PROCEDURE_REEV_THE' ; REEV_THE PRECED 1 ; 'FINSI' ; 'FINS'; * 'FINSI' ; * #################################################################### * ###### RESOLUTION D'UN PAS SI MECANIQUE/MECANIQUE DES FLUIDES ###### * #################################################################### 'SI' (WTAB.'FOR_MECA' 'OU' WTAB .'NVSTNL') ; 'SAUT' 1 'LIGN'; 'MESSAGE' ' Numero du pas : ' IPAS ' Indice d evolution : ' ICHG ' -> temps :' TI; * * Se placer sur la configuration de debut de pas 'FORM' WTAB.'GE0_DEB' ; * 'MENA' ; IERRMEC = UNPAS PRECED; * * Se placer sur la configuration de reference 'FORM' WTAB.'FOR0' ; * * Test si on a converge 'SI' IERRMEC ; 'ERREUR' 997 ; 'FINSI'; * * Reevaluation des donnees du calcul dependant de la mecanique 'SI' WTAB.'PROCEDURE_REEV_MEC' ; REEV_MEC PRECED 1; 'FINSI' ; * 'FINSI'; * #################################################################### * ############ TEST DE LA CONVERGENCE MECANIQUE THERMIQUE ############ * #################################################################### 'SI' WTAB.'CONVERGENCE_MEC_THE' ; * je cherche la convergence thermo-mecanique : je dois au moins * calculer deux fois mon probleme WTAB.'CONV_THMEC' = FAUX ; 'SI' (I_BOTH > 1) ; * Test sur toutes les composantes (notamment, si DIFFUSION) CHT1 = WTAB.'THER_COURANT' ; DUABS2 = 'ABS' (WTAB.'THER_COURANTP' - CHT1) ; CRICOH1 = 0. ; NBINCO1 = 'DIME' WTAB.'PRIM_TOT' ; 'REPE' BINCO1 NBINCO1 ; LINCOI1 = 'MOTS' ('EXTR' WTAB.'PRIM_TOT' &BINCO1) ; MDUABSI1 = 'MAXI' DUABS2 'AVEC' LINCOI1 ; NORMI1 = 'MAXI' 'ABS' CHT1 'AVEC' LINCOI1 ; 'SI' (NORMI1 '' CRICOH1) ; CRICOH1 = CRICOHI1 ; 'FINS' ; 'FIN' BINCO1 ; WTAB.'CONV_THMEC' = CRICOH1 '<' (WTAB . 'CRITERE_COHERENCE') ; * Fin de boucle Si ne converge Pas 'SI'('NON' WTAB.'CONV_THMEC') ; 'SI' (I_BOTH >EG WTAB.'BOU_METH'); 'MESS' 'PAS DE COHERENCE TROUVEE MECANIQUE THERMIQUE' ; 'ERREUR' 999; 'FINSI' ; 'FINSI' ; 'FINSI' ; * THER_COURANTPrecedent dans WTAB pour test CONVERGENCE_MEC_THE WTAB.'THER_COURANTP' = WTAB.'THER_COURANT' ; 'FINSI' ; * 'SI' WTAB.'CONV_THMEC' ; 'QUITTER' BO_BOTH ; 'FINSI' ; * 'FIN' BO_BOTH ; * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * +++++++++++++++++ BOUCLE interne de bouclage mec_ther ++++++++++++++++ * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * * ---------------------------------------------------------------------- * Mise a jour de quantites de WTAB a partir de celles a TI * ---------------------------------------------------------------------- * * Formulation THERMIQUE 'SI' WTAB.'FOR_THER'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'DUPONT'); WTAB.'TET0' = estim.'TEMPERATURES' ; WTAB.'VIEUXPAS' = WTAB.'NOUV_PAS' ; WTAB.'RELAXATION_DUPONT' = CHTER.'RELAXATION_DUPONT'; 'FINSI'; 'FINSI' ; * Cas du modele THERMOHYDRIQUE BETON_THM (Sciume) : mise a jour des variables internes ITHM1=WTAB.'THM1'; 'SI' ITHM1; 'SI' ('EXIS' WTAB 'VAR_THM1') ; WTAB . 'VAR_THM1' = WTAB . 'VAR_THM2' ; 'FINS'; 'FINS'; * * Formulation MECANIQUE 'SI' WTAB.'FOR_MECA' ; * 'SI' WTAB.'ITHER' ; WTAB.'TET1' = WTAB.'TET2'; WTAB.'ETHER1' = WTAB.'ETHER2'; 'SI' WTAB.'POR1'; WTAB.'MSRTHER1'= WTAB.'MSRTHER2'; 'FINSI'; 'FINSI' ; * * Cas du modle VISCOPLASTIQUE BETON_THM (Sciume) 'SI' WTAB.'BETON_THM'; WTAB.'BETON_MCR1' = WTAB.'BETON_MCR2'; 'FINS' ; * 'SI' WTAB.'CHAR_DEFI' ; WTAB.'DEFOR1' = WTAB.'DEFOR2'; 'FINSI'; * 'SI' WTAB.'DYNAMIQUE' ; 'SI' ('NON' WTAB.'LIAISON_PERSISTANTE') ; WTAB.'FREA1' = WTAB.'FOPL' ; 'FINSI'; WTAB.'REAPREC' = estim.'REACTIONS'; 'FINSI'; * * Actualiser la configuration de debut de pas 'SI' ( WTAB.'GRANDS_DEPLACEMENTS' 'OU' (WTAB.'FEFP_FORMULATION' 'ET' WTAB.'UPDATE_LAGRANGIAN')) ; WTAB.'GE0_DEB' = WTAB.'FOR' ; 'FINSI'; * 'FINSI'; * * Option AUTOMATIQUE : temps effectivement calcule 'SI' (WTAB.'AUTOMATIQUE' 'OU' ('NON' WTAB.'CONV')); TEMP0 = (TI '-' TEMP0) '*' WTAB.'AUTOCOEF' '+' TEMP0; estim.'TEMPS' = TEMP0 ; MSGZ = 'CHAI' ' Temps effectivement calcule'; 'SI' ('NON' WTAB.'CONV'); MSGZ = 'CHAI' MSGZ ' et non converge'; 'FINSI'; 'MESS' MSGZ ' : 'TEMP0; 'FINSI'; * Procedure utilisateur 'SI' WTAB.'FOR_MECA' ; 'SI' WTAB.'PROCEDURE_PERSO1' ; PRECED.'PERSO1_APPEL' = 2 ; PERSO1 PRECED; 'SI' ('EXIS' PRECED 'ARRET') ; WTAB.'ARRET' = PRECED.'ARRET' ; 'FINSI' ; 'FINSI'; * * Redefinir WTAB.'CHARGEMENT_I' 'SI' WTAB.'CONVERGENCE_MEC_THE' ; WTAB.'CHARGEMENT_I' = WTAB.'CHARGEMENT' ; 'FINSI'; 'FINSI'; * * pour ne pas sauvegarder la matrice de raideur si on doit la recalculer 'SI' ('EXIS' WTAB 'RRRR') ; 'SI' WTAB.'RECARI' ; 'OUBL' WTAB 'RRRR' ; 'FINSI'; 'FINSI'; * * ---------------------------------------------------------------------- * Remplir CONTINUATION et table de resultats + sauvegarde * ---------------------------------------------------------------------- ISAUV = PAS_RESU iauto PRECED ; * * Option AUTOMATIQUE 'SI' WTAB.'AUTOMATIQUE'; 'SI' ((WTAB.'AUTOCOEF' 'EGA' 0.9999999D0) 'OU' (TEMP0 '>EG' TI)) ; 'MESS' ' Objectif atteint '; 'MESS' ' '; WTAB.'AUTODEUX' = FAUX ; WTAB.'AUTORED1' = 0 ; WTAB.'AUTOREDU' = 1. ; IAUTO = 1; 'SINON'; 'MESS' ' Objectif non atteint: On recommence'; 'MESS' ' '; IAUTO = IAUTO+1; 'SI' (IAUTO >EG WTAB.'AUTOPAS'); 'ERREUR' 1000; * 'MESS' 'Pilotage non converge apres ' IAUTO ' pas.'; 'FINSI'; WTAB.'AUTODEUX'=VRAI; ICHG=ICHG - 1; WTAB.'ICHG' = ICHG ; 'FINSI'; 'FINSI'; * * Option PAS_AJUSTE 'SI' WTAB.'PAS_AJUSTE'; 'SI' ((TI < TIV) 'OU' ('NON' WTAB.'CONV')); ICHG=ICHG-1; WTAB.'ICHG' = ICHG ; 'FINSI'; 'FINSI'; * 'SI' WTAB.'ARRET'; 'QUITTER' BEXTERN; 'FINSI'; * 'FIN' BEXTERN; *----------------------------------------------------------------------- * Fin de la boucle sur les pas de temps *----------------------------------------------------------------------- 'SI' ('NEG' WTAB.'AMORTISSEMENT' 'INCONNU'); WTAB.'AMORTISSEMENT' = TOTO ; 'FINSI'; * 'SI' ('NEG' ('TYPE' WTAB.'GE0_DEB') 'MOT') ; 'OUBL' WTAB 'GE0_DEB' ; 'FINSI' ; * * pour forcer le calcul de la rigidite si on rappele pasapas 'SI' ('EXIS' WTAB 'RRRR') ; 'OUBL' WTAB 'RRRR'; 'FINSI'; * * on tue WTAB.'MAT1' s'il existe car il peut etre tres gourmand en place WTAB.'MAT1' = 'MOT' 'INCONNU'; * 'MESS' ' '; 'MESS' '------------------- FIN DE LA PROCEDURE PASAPAS ---------------------'; 'SAUT' 1 'LIGNE'; ************************************************************************ 'FINPROC' PRECED ;