IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Sortir d'une subroutine


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut Sortir d'une subroutine
    Bonjour,
    alors j aimerais avoir un peu d aide, sachant que je suis novice en Fortran. Alors je raisous un système et suivant que ma méthode converge ou pas je continu ou je veux diviser mon pas de temps pour adapter, en gros, mon maillage.
    J ai pensé à faire un "goto" mais a priori ca ne marche pas, sachant que mon pas de temps et toutes les interpolation qui en découle est définit dans un autre fichier.

    Si quelqu un a une petite idée ce serrait sympa.
    Merci.

  2. #2
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    fait montrer comment sont imbriqué (en gros) tes boucles, sinon tu a la boucle DO avec condition final et la commande EXIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Boucletemporelle:do while(t<TempsFinal)
      Boucle_pas_de_temps:Do
        <.................>
        <tout ton calcul + calcul de l'erreur (servant à adapter le pas)
        <.................>
        if (erreur<seuil)then 
          t=t+dt
          c=(Constante/erreur)**(1.d0/5.d0)   !facteur d"adaptation du pas          
          if (c>2.d0) c=2.d0
          if (c<5.d-1) c=5.d-1 
          dt=c*dt
          EXIT
        else
          dt=dt/2.d0
        endif
      end do Boucle_pas_de_temps
    end do boucle temporelle
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    En gros ce que j ai c est:

    Boucle de temps:
    subroutine(1) qui fait tout les calculs
    subroutine(2) qui dit si ca converge
    Fin boucle de temps

    et je voudrais que quand (2) me dit que ca converge pas retourner au début de la boucle temps.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    ?le facteur d adaptation c est quoi?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    la subroutine (2) est dans la (1), c est très simplifié mais en gros c est ce qui ce passe.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Mais le schéma que tu m as donné ressemble à ce que j ai dans la tête et ce que je veux programmer.

  7. #7
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    typiquement, cela ne change rien, à condition de bien laissé le 'EXIT' dans la boucle (et pas dans une subroutine) mais dans ton cas, plutot que de dire si convergence ou pas, ta subroutine2 devrais te renvoyé une estimation de la majoration de l'erreur et tu fais des conditions de sortie sur cette erreur.... en gros le facteur c permet d'agrandir le pas te temps lorsque l'erreur est petite et de le diminuer si l'erreur et un peu trop grande mais sans recalculer le pas que l'on viend de faire, en fait, on adapte le par de temps de l'itération d'après.... (cela permet d'améliaurer les convergences) cependant il faut que 1/2<c<2 sinon l'écart entre les différents pas de temps est un peu trop grand...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Je dit peut etre une connerie et je m en excuse si c est le cas mais de la où je suis j ai aucun moyen de modifié le pas de temps ce que mon programme fait c est qu a chaque pas de temps il calcul la valeur de mon inconnue a tout les pas d'espace et après il fait t=t+dt.
    D après ce que tu me dit je suis tentée de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (not.converge)
    exit
    dt=dt/2
    endif
    un truc dans le genre....

    Merci pour tes réponse et encore une fois désolée si je suis pas très réactive, je trouve ce langage un peu rustique..

  9. #9
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    déjà, oublie pas les balises [CODE], ensuite, oublie pas le THEN, ensuite(bis), le EXIT met le en fin d'instruction sinon ce qu'il y a parès n'est pas calculer, ENFIN, si tu peux faire "dt=dt/2.d0" alors tu peux faire "dt=c*dt"...

    au passage oublie pas le ".D0" signifiant que le "2" est un double precision et non un entier sinon tu te retrouverai avec la division euclidienne....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Tout d abord je te remercie pour ton aide c est gentil.

    Ensuite j ai bien fait ce que tu m as dit mais à la compilation y a une erreur:
    "unclassificable statement (starts "exit")"

    je comprend pas.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Je crois savoir pourquoi ça me donne cette erreur et c est très con ce que j ai fait en fait je suis pas dans une bouble...

  12. #12
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    quand tu écris sur ce forum, y a un icone en forme de # en haut et cela t'ouvre les balise code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    là je suis dans les balises code
    cela permet de mieux voir où sont tes morceaux de codes... c tout!!!

    ensuite pour EXIT, certain compilateur comme g95 comprennent une fonction exit(errcode) qui quitte complètement le programme et revoie errcode au système d'exploitation. lorsque que tu es dans une boucle DO, (qu'elle soit infinie ou non) la commande EXIT te sort de cette boucle (et cette boucle seulement)

    sinon je te renvoie à un super cours :http://www.idris.fr/data/cours/lang/...tran_cours.pdf tu va au chapitre 5.2 et y a tout d'expliqué sur les boucles...

    le chapitre commence par les GOTO mais si l'on veux programmer de façon propre, à mon avis, cette instruction n'est à utiliser que si on ne peux VRAIMENT pas faire autrement.... il y a toujours au moins deux solution à un problème....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Merci...
    Je vais jeter un oeil au cours.

    D'après ce que je comprend en fait "exit" va pas me servir a grand chose moi je veux que quand il se rend compte qu il ne converge pas il revienne au debut du programme et qu il divise le pas de temps d avant en fait...

  14. #14
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    il faut que l'avancement en temps se fasse à la fin de ta boucle temporelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (converge)then
      t=t+dt
      n=n+1 !ça c'est pour tes stockages en tableau (par exemple)
    else
      dt=dt/2
      cycle
    endif
    si il a convergé, alors il avance dans le temp et dans les indices de tableau, sinon divise le pas de temps par deux et revien au début de la boucle
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Excuse moi encore. Mais je comprend^pas ca me met encore cette erreur
    "unclassifiable statement (starts "cycle")"

  16. #16
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    t'es pas dans une boucle....

    ou alors peut-être est-ce là des instruction Fortran95 mais il me semble pas....

    quel est ton compilo/environement?
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Finalement je m en suis sortie avec un "goto" c est pas très élégant mais a priori ca à l air de marcher.

    Je te remercie pour ton aide et à bientot pour de prochaines aventures..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DEBUTANT] sortir d'une boucle avec un touche particulière
    Par thibouille dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 06h44
  2. SORTIR D'UNE BOUCLE
    Par chekibperl dans le forum Langage
    Réponses: 2
    Dernier message: 22/10/2005, 12h48
  3. [HTML/JAVASCRIPT]Sortir d'une iframe
    Par tidou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/01/2005, 15h26
  4. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12
  5. Comment sortir d'une dll ?
    Par Fred007 dans le forum Langage
    Réponses: 3
    Dernier message: 19/02/2004, 08h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo