Atom topic feed | site map | contact | login | Protection des données personnelles | Powered by FluxBB | réalisation artaban
You are not logged in.
Bonjour,
Un des problèmes récurrents de la non convergence est de comprendre pourquoi un calcul ne converge pas à un pas de temps donnée (P). Je relance alors le calcul jusqu'au pas précédemment convergé (P-1) pour comprendre ce qui se passe. C'est très utile mais assez long.
J'ai essayé, sans succès évidemment, de trouver une option permettant d'écrire les résultats convergés même si le calcul échoue.
Est-ce possible? Si oui, comment?
Merci par avance,
Offline
bonjour
simplelistr = DEFI_LIST_REEL(
DEBUT=0.0,
INTERVALLE=(
_F(JUSQU_A=1.0,NOMBRE=10),
_F(JUSQU_A=2.0,NOMBRE=100),
_F(JUSQU_A=2.8,NOMBRE=8),
#_F(JUSQU_A=3.0,NOMBRE=1),
),
);
quand on détecté ou cela s'arrète
il y a plus "propre"
jean pierre aubry
consider reading my book
freely available here https://framabook.org/beginning-with-code_aster/
Offline
une autre possibilité est
SOLVEUR=_F(....
STOP_SINGULIER='NON'
....
on n'a pas besoin de savoir le moment où l'erreur se produit
consider reading my book
freely available here https://framabook.org/beginning-with-code_aster/
Offline
Ce n'est pas exactement ce que j'avais en tête. Mais merci, le STOP_SINGULIER est intéressant dans certain oui.
Lorsqu'un calcul échoue durant la convergence, il peut s'arrêter à un pas de calcul non connu à l'avance.
Pour comprendre qui se passe, on peut vouloir étudier les résultats jusqu'au dernier convergé. Il faut donc relancer le calcul en le stoppant "manuellement" via le "end step time". Cela nécessite donc de relancer le calcul.
J'utilisais un autre code de calcul par le passé qui permettait de toujours écrire les résultats même si le calcul plantait. Je me demandais donc si une option similaire existait.
Offline
Hello,
Normalement on peut s'en sortir en gérant l'erreur avec python:
DEBUT(PAR_LOT='NON',);
...
try:
resnl=STAT_NON_LINE(...
)
except aster.NonConvergenceError, message:
print 'Convergence not reached. Exiting...'
except aster.MatriceSinguliereError, message:
print 'Singular matrix. Exiting...'
except aster.error, message:
print 'Error raised. Exiting...'
IMPR_RESU(...)
Une autre possibilité est de passer par une boucle qui fait chaque incrément, avec reuse et etat_init, avec un impr_resu par incrément. Désavantage: il faut renommer et déplacer le fichier fort.80 (par exemple) une fois par incrément, avantage: on peut post-processer en cours de calcul.
for ii,temps in enumerate(tps[1:]):
if ii==0:
resnl=STAT_NON_LINE(
...
INCREMENT=_F(LIST_INST=autostep, INST_FIN=float(temps),),
)
else:
resnl=STAT_NON_LINE( reuse=resnl,
INCREMENT=_F(LIST_INST=autostep,INST_FIN=float(temps),),
ETAT_INIT=_F(EVOL_NOLI=resnl, INST=float(tps[ii])),
)
IMPR_RESU(UNITE=80 ...)
DEFI_FICHIER(ACTION='LIBERER',UNITE=80)
shutil.move('fort.80',('/path/to/your/directory/%3.5f.rmed' % temps))
Bon courage !
Ect
Offline