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 :

Module et changement de précision


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut Module et changement de précision
    Bonjour,

    Voilà mon problème. Je dois moderniser un code fortran qui utilise les blocs Common en les remplacant par des modules. Une fois celà fait, je constate que les calculs effectués par le programme change petit à petit pour ne plus ressembler du tout à ceux obtenus avec la version précédente. Celà laisse suggérer un changement de précision de certaines variables mais je les ais toutes vérifiées et leurs déclarations n'ont pas changés (seuls celles déclarées implicitement ont été déclarés explicitement en conservant le bon type). les variables sont des real ou integer.

    Est-ce que quelqu'un aurait eu une idée du pourquoi du comment ? Le type implicite de variable ne commencant pas par i,j,k,l,m,n est bien real ?

    Merci de votre aide !

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Pour le type implicite, ça dépend. Si rien n'est écrit dans le programme, je crois que le défaut est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    implicit real (a-h,o-z)
    Mais, il est plus fréquent d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    implicit real*8 (a-h,o-z)
    Les deux cas sont différents. Il y a encore une histoire de defaut (mais qui peut dépendre du compilateur ou de la machine).

    la déclaration real est en fait real*4.

    Si tu ne connais pas le 77 :
    real*4 est équivalent à real(kind=4) c'est un réel simple précision. Déclaration équivalente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    real :: x
    real*4 :: x
    real(kind=4) ::x
    real*8 est équilvalent à real((kind=8) ou double precision c'est un réel double precision déclaration équivalente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    real*8 :: x
    real(kind=8) ::x
    double precision :: x
    Donc si dans ton code 77 tu avais implicit real*8, dans ton code avec module tu dois mettre double precision ou real(kind=8).

    Ceci étant dit. Tout réel est arrondi, et les erreurs d'arrondis dépendent de la machine, de la charge du processeur ect ... donc il est possible que les résultats de deux programmes diffèrent un petit peu. Je ne sais pas à quoi sert ton programme, mais tu as l'air de suivre un résultat en fonction de l'avancement (une trajectoire ?). Dans ce cas, les deux trajectoires peuvent être différentes mais la moyenne sur la trajectoire doit être identique (ou presque).

    Bon courage

  3. #3
    Membre émérite 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
    Par défaut
    qu'entend-tu exactement par 'changent petit à petit' ???

    et par défaut si tu ne mets rien (pas bien) au début d'un prog/subroutine/fonction/module c'est exactement pareil que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    implicit integer
    implicit real (a-h,o-z)
    donc toute variable i* j* k* l* m* n* est integer (kind=4) et toute les autre sont des réél simple précision (sous PC (Linux ou windows): kind=4)

    de plus si c'est au court d'un calcul que cela varie, c'est peut-être une variable que tu modifie alors qu'il ne le fallait pas!!!
    pour cela je suggère des déclaration 100% explicite (et je milite pour cela!!! surtout avec mes élèves!!! :p )
    et donc, par exemple pour une 'function toto(e,es,s)' avec toto,es,s tous des tableaux, e un entier et e est une entrée pure es une entrée sortie et s une sortie pure, le cartouche de déclaration donnerai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function toto(e,es,s)
      <eventuelement des use>
      implicit none
      integer, intent(in) :: e
      real(kind=8),dimension(:,:,:,:),intent(inout) :: es
      real(kind=8),dimension(:),intent(out) ::s
      real(kind=8),dimenssion(e,e) :: toto
    ...
      e=8 !<<<<<<<<<erreur on ne peut stocker dans e
      es(1,1,1,1)=s(1) <<<<<<<erreur on ne peut lire dans s
    ...
    end function toto
    bon dans l'idéal, il ne faut utiliser que des entrée ou sortie pure et éviter autant que possible les variable que j'appele 'de passage' mais parfois on ne peut faire autrement...

Discussions similaires

  1. linux : Les changements sur mes modules ne sont pas prix en compte
    Par pylearner dans le forum Général Python
    Réponses: 7
    Dernier message: 09/11/2010, 11h12
  2. Besoin de précision pour module DBD::mysql
    Par mensoif dans le forum SGBD
    Réponses: 7
    Dernier message: 10/08/2009, 12h50
  3. précision math module
    Par vega95 dans le forum Calcul scientifique
    Réponses: 10
    Dernier message: 06/01/2009, 07h53
  4. Réponses: 1
    Dernier message: 31/05/2007, 19h04
  5. Problème du module login lors du changement de mot de passe
    Par MIC94 dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 31/08/2006, 11h51

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