* PASAPAS PROCEDUR MB234859 24/09/11 21:15:03 12008 'MESS' ************************************************************************ * * * PRECED objet de type TABLE * * C'est une table donnant , les arguments d'entrees, les * * options, puis les resultats des pas precedents * * * * Etat initial au debut du pas de temps decrit par le MCHELM WTAB.ETAT1* * 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 ; 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'; WTAB.'ETAT1' = WTAB.'ETAT0' ; WTAB.'MAT1' = WTAB.'MAT0' ; * *--------- initialisation deformation thermique de reference 'SI' WTAB.'FOR_MECA' ; 'SI' WTAB.'ITHER' ; 'SI' ('EGA' WTAB.'ETREF' 'INCONNU'); 'FINS' ; * 'FINS'; WTAB.'ETHER1' = ETT0 - WTAB.'ETREF' ; * 'SI' WTAB.'POR1'; 'FINS' ; 'FINS' ; 'FINS' ; ************************** II PARTIE ************************* ****************************************************************** ******************* boucle sur les pas de temps ***************** ****************************************************************** * ------------quelques initialisations de l'algorithme IPAS = 0 ; IAUTO = 1 ; ISAUV = VRAI; 'SI' ( DTV '<' 1.e-15 ); 'SI' WTAB.'FREQUENTIEL' ; DTV = 1.e-14 ; 'SINON' ; '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' ; 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.'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' TIV ); TI=TTI; PASFINAL=0; 'FINSI'; 'SI' (PASFINAL '>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' ; WTAB.'MODELE' = MODEVOL1 ; 'SI' WTAB.'CHAR_MATE' ; WTAB.'CARACTERISTIQUES' = MATEVOL1 ; 'FINSI' ; PAS_MODL PRECED ; * MaJ table rayonnement : 'SI' WTAB.'RAYO' ; 'FINSI' ; * On sauvegarde les modeles successifs pour analyse resultats : ESTIM.'MODELES' = WTAB.'MODELE' ; * Initialisation TINI si thermique : 'SI' WTAB.'THE1' ; MODX = WTAB.'MOD_COND' ; * Adapation du modele : transport de la solution 'SI' ((WTAB.'ADAP_MODE') 'ET' ('NON' (TI '<' (WTAB.'TPS1_ADAP')))) ; IADAP1 = (WTAB.'INDI_ADAP') + 1 ; WTAB.'INDI_ADAP' = IADAP1 ; 'SINON' ; 'FINSI' ; * Projection du champ de temperature sur la partie adaptee : CONTI.'TEMPERATURES' = CHT1P ; * Calcul de la capacite courante sur la partie adaptee : WTAB.'CAPA_COURANTE' = CAPA1P ; 'FINSI' ; * Calcul temperature dans partie apportee du modele : * Quantite de chaleur sur geometrie GEO1P : CHQ1P = CAPA1P * CHT1P ; * Quantite de chaleur dans apport : CHQX = CAPAX * CHTINIX ; * Calcul T sur GEO1 : CAPA1 = CAPA1P et CAPAX ; CHQX1 = CAPA1 * CHTX1; * CHT1 = reso CAPA1 (CHQ1P + CHQX) ; comm plus lent avec RESO ; CONTI.'TEMPERATURES' = CHT1 ; 'FINSI' ; * Sauvegarde TEMPERATURES au debut du pas apres APPORT : PRECED.'TEMPERATURES_APPORT' . IND1 = CHTAPP1 ; ESTIM .'TEMPERATURES_APPORT' = CHTAPP1 ; * Finsi formulation thermiquue 'FINSI' ; * Initialisation PROPORTIONS_PHASES si metallurgie : 'SI' WTAB.'FOR_METALLU' ; CHMET0 = CONTI.'PROPORTIONS_PHASES' ; CHMET1 = CHMET1 + (CMP1 + 1.D0); CHMET1 = CHMET0 'ET' CHMET1 ; *trac CHMET1 MODX ; 'FINSI' ; 'FINS' ; * Initialisation MECA si besoin : 'SI' WTAB.'FOR_MECA' ; 'SI' WTAB.'MEC1' ; MODM1 = MODM1 'ET' WTAB.'MOD_MEC' ; 'FINSI' ; 'SI' WTAB.'POR1' ; MODM1 = MODM1 'ET' WTAB.'MOD_POR' ; 'FINSI' ; * Mise a jour ETREF : WTAB.'ETREF' = WTAB.'ETREF' 'ET' DETREF1 ; * Mise a jour ETHER1 : WTAB.'ETHER1' = WTAB.'ETHER1' 'ET' DETHER1 ; * Mise a jour deplacements et deformations : * Mise a jour table estimation : estim.DEPLACEMENTS = conti.DEPLACEMENTS 'ET' DEPDGEO1 ; 'SI' ('EXISTE' PRECED 'DEFORMATIONS_APPORT'); estim.DEFORMATIONS_APPORT = conti.DEFORMATIONS_APPORT 'ET' DEPSL1 ; 'FINSI' ; 'FINSI' ; 'SINON' ; estim.DEFORMATIONS_APPORT = conti.DEFORMATIONS_APPORT ; 'FINSI' ; 'FINSI' ; * Fin traitement CHAR_MODE 'FINSI' ; * * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * +++++++++++++++++ BOUCLE interne de bouclage mec_ther ++++++++++++++++ * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ I_BOTH = 0 ; 'REPETER' BO_BOTH WTAB.'BOU_METH' ; I_BOTH = I_BOTH + 1 ; * * Re-initialisation de WTAB.'CHARGEMENT' en tete de boucle mec-ther 'SI' WTAB.'CONVERGENCE_MEC_THE' ; WTAB.'CHARGEMENT' = WTAB.'CHARGEMENT_I' ; 'FINSI'; * * #################################################################### * ########### RESOLUTION D'UN PAS SI THERMIQUE/DIFFUSION ############# * #################################################################### 'SI' (WTAB.'FOR_THER' 'OU' WTAB.'FOR_DIFF') ; * * Se placer dans la configuration adequate 'SI' WTAB.'FOR_MECA' ; 'SI' (I_BOTH > 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); 'SI' ('EXISTE' PRECED 'PAS_MAX'); 'SI' ((TEMP0 + PRECED.'PAS_MAX') '<' TI); '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' ; WTAB.'BLOCAGES_THERMIQUES' = BLOT1 ; 'FINSI' ; * * Cas BLOCAGES_DIFFUSIONS (BLOD) : 'SI' WTAB.'CHAR_BLOD' ; 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'); 'FINSI'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'LINEAIRE'); 'FINSI'; 'SI' ('EGA' WTAB.'PROCEDURE_THERMIQUE' 'DUPONT'); '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') ; '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' ; * * 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. ; 'REPE' BINCO1 NBINCO1 ; 'SI' (NORMI1 '<EG' (1.E-14 * MDUABSI1)) ; NORMI1 = 1. ; 'FINS' ; CRICOHI1 = MDUABSI1 / NORMI1 ; 'SI' (CRICOHI1 '>' 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' ; * * 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' ; * '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 TEMP0 = (TI '-' TEMP0) '*' WTAB.'AUTOCOEF' '+' TEMP0; estim.'TEMPS' = TEMP0 ; 'FINSI'; 'MESS' MSGZ ' : 'TEMP0; 'FINSI'; * Procedure utilisateur 'SI' WTAB.'FOR_MECA' ; 'SI' WTAB.'PROCEDURE_PERSO1' ; PRECED.'PERSO1_APPEL' = 2 ; PERSO1 PRECED; 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' WTAB.'RECARI' ; 'OUBL' WTAB 'RRRR' ; 'FINSI'; 'FINSI'; * * ---------------------------------------------------------------------- * Remplir CONTINUATION et table de resultats + sauvegarde * ---------------------------------------------------------------------- * * Option AUTOMATIQUE 'SI' WTAB.'AUTOMATIQUE'; 'SI' ((WTAB.'AUTOCOEF' 'EGA' 0.9999999D0) 'OU' (TEMP0 '>EG' TI)) ; WTAB.'AUTODEUX' = FAUX ; WTAB.'AUTORED1' = 0 ; WTAB.'AUTOREDU' = 1. ; IAUTO = 1; 'SINON'; 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'; 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'; * 'OUBL' WTAB 'GE0_DEB' ; 'FINSI' ; * * pour forcer le calcul de la rigidite si on rappele pasapas 'OUBL' WTAB 'RRRR'; 'FINSI'; * * on tue WTAB.'MAT1' s'il existe car il peut etre tres gourmand en place * 'MESS' ' '; 'MESS' ************************************************************************ 'FINPROC' PRECED ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales