Bonjour,

J'ai une question à poser aux Dieux de matlab...

Je travaille sur des simulations complexes d'un système. Ces simulations sont codées en Fortran et ont été traduits en Mex-file pour pouvoir les utiliser sous matlab. Du coup, sous matlab, j’exécute cette "boite-noire" pour mes simulations. Le seul hic, c'est qu'à certains moments, cette boite noire plante et me fait littéralement planter matlab, et me fait quitter matlab. Matlab quitte sans crier gare, comme ça, et quand je relance matlab, je n'ai aucune info, ça donne l'impression qu'il ne s'est rien passé (ou alors je ne sais pas comment récupérer les bonne informations...)

Je n'ai pas accès au code source fortran de la boîte noire (du moins, je ne peux pas la modifier, ou très difficilement). Du coup, je cherche à savoir comment je dois m'y prendre pour que matlab ne plante pas lorsque l'erreur dû au mexfile arrive (de façon à ce que ça ne quitte pas matlab). J'avais pensé à faire un try-catch... mais je ne connais pas très bien le try-catch et je doute que cette méthode me permette de gérer ce type de problème. J'ai fait rapidement un essai sans succès (après, il se peut que je m'y sois mal pris, j'en n'ai jamais fait : donc je n'ai aucune expérience en try-catch et comme ça quitte matlab à chaque fois... ben je n'avance pas)

Dernier indice que j'ai... j'ai fait le test suivant pour tenter de récupérer un message du mexfile : j'ai lancé mon programme dans une invite de commande linux (je travaille sous linux) avec "matlab -nodesktop". Une erreur est lancée du type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
ARRET DU PROGRAMME
NOM_DERREUR  NUMERO_DERREUR: simulation impossible (nom du fichier fortran a l'origine de l'erreur)
... et comme je suis dans une invite de commande, même si matlab quitte sans rien dire, j'ai cette erreur qui reste affiché dans l'invite de commande, et c'est pour cela que je peux la voir. Si j'ai bien compris, cette erreur est une erreur qui a été prévue par le programmeur de la boite noire, en fortran, et c'est lui qui a écrit ce message. Sinon, mis à part ces deux lignes, je n'ai rien d'autre qui s'affiche dans l'invite de commande. Je reviens juste à la racine, et matlab ne tourne plus, donc a quitté.

Je ne peux pas donner plus de détail quand au nom de l'erreur, à son numéro et au nom du fichier fortran associé car ces informations sont confidentielles, et je doute qu'elles soient utiles pour la solution que je cherche...

Avis aux experts, je cherche une piste miraculeuse...

Je cherche donc un moyen de stopper ma simulation (même brutalement) quand l'erreur en provenance du mexfile survient, mais sans que ça fasse quitter matlab. Le fait que la simulation s'arrete ne pose aucun souci. Je veux juste que matlab ne quitte pas.

Cordialement,

ps: une alternative que j'ai est de faire une analyse sur les sorties à chaque pas de temps et arrêter la simulation lorsque je constate qu'une erreur "risque" de survenir. Mais c'est la solution de dernier recours, je préfèrerais pousser la simulation "jusqu'au bout".

[EDIT] Après discussion avec quelques collègues, ce que je cherche à faire ressemble à mission impossible... donc je vais me contenter d'analyser mes sorties à chaque pas de temps, et arrêter la simulation lorsque mes sorties commencent à fournir des valeurs "aberrantes". Je laisse tout de même ce message au cas où il y aurait une solution purement "matlab", même si je doute fort que cela existe.

[EDIT2] Pour être plus exact, le code fortran a été appelé à partir d'une routine codé en C elle-même transformé en mex, et c'est ce mex que j'appelle depuis matlab. Bref, l'enfer quoi

[EDIT3] J'ai plus de détail, maintenant que je suis allé fouiner dans les codes sources... en fait la fermeture de matlab survient quand le calcul diverge dans le code : des tests sont effectués, et si le calcul diverge, alors un QUIT (exit process) est demandé et c'est le système qui s'occupe de fermer le processus complet qui fait appel au code... or ici, le processus en question, c'est matlab. Pour éviter cela : soit je me transforme en cador de l'informatique et je peux re-coder la gestion intelligente de l'exit système dans LE cas qui m'intéresse, soit je bidouille le code C qui a permis de transformer le code FORTRAN en mex pour gérer une exception or ceci implique de modifier le code fortran ce qui pose 2 soucis : 1)si je le modifie le code n'est plus certifié 2) les exceptions n'existent pas en fortran à ce que j'ai cru comprendre. Enfin, dernière possibilité (et c'est celle pour laquelle j'ai opté) : j'analyse mes variables au cours de la simulation pour stopper l'appel au code fortran dès que je détecte une divergence dans les calculs (cf mon "ps").

CONCLUSION : j'ai opté pour la solution de mon "PS".