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 :

affichage des résultats (par fortran) pour tracer une courbe avec gnuplot


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut affichage des résultats (par fortran) pour tracer une courbe avec gnuplot
    Bonjour,
    Mon problème d'une façon générale est de résoudre l'équation de la chaleur avec fortran.
    J'ai obtenu un fichier de résultats pour les positions x à chaque itération comme suit:
    Xstep adimensionné= 0.100000000000 Realposition selon xr, le xtep réel n'est pas constant
    0.00000000000 9.486832980505E-03 1.341640786500E-02 1.643167672515E-02
    1.897366596101E-02 2.121320343560E-02 2.323790007724E-02 2.509980079602E-02
    2.683281573000E-02 2.846049894152E-02 3.000000000000E-02
    0.00000000000 9.486832980505E-03 1.341640786500E-02 1.643167672515E-02
    1.897366596101E-02 2.121320343560E-02 2.323790007724E-02 2.509980079602E-02
    2.683281573000E-02 2.846049894152E-02 3.000000000000E-02
    0.00000000000 9.486832980505E-03 1.341640786500E-02 1.643167672515E-02
    1.897366596101E-02 2.121320343560E-02 2.323790007724E-02 2.509980079602E-02
    2.683281573000E-02 2.846049894152E-02 3.000000000000E-02....
    Ce qui signifie x(1)=0.000;x(2)=9.4868...e-3;...P.S:pour toutes les itérations on a les mêmes valeurs de x(i)
    et un fichier de températures à chaque itération de temps comme suit:
    Timestep= 4.500000E-05température au cours du temps
    iter= 1temps= 4.500000000000E-05 300.000000000 293.000420000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000
    iter= 2temps= 9.000000000000E-05 300.000000000 293.000839933
    293.000000042 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000
    iter= 3temps= 1.350000000000E-04 300.000000000 293.001259798
    293.000000126 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000
    iter= 4temps= 1.800000000000E-04 300.000000000 293.001679597
    293.000000252 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000...
    ce qui signifie qu'à chaque itération, on affiche les différentes valeurs de températures à différentes positions. exemple: pour l'itéartion N°1; temps=4.5e-5s;T(x=0)=300; T(x=1)=293.000420000; T(x=2)=293.000000000...


    J'essaye de tracer ces résultats (c-à-d T(x,t) avec gnuplot. Pour ce faire, il faut que je présente un fichier de données sous la forme suivante:
    Nom : gnu.PNG
Affichages : 2275
Taille : 33,9 Ko

    comment procéder pour créer un fichier de ce type (avec les valeurs de x et T en colonnes pour chaque itération) ainsi de séparer ces blocs par de lignes vides.
    Merci pour votre coopération,

  2. #2
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut autre issue
    La problématique est donc cernée à l'affichage de la matrice par fortran.
    J'ai essayé de générer une matrice à chaque itération de N lignes (N=nbre de positions selon x) et de 2 colonnes (pour x et T) comme l'exige gnuplot.
    Le code est le suivant:
    integer,parameter ::nligne=N+1! nombre de ligne de la matrice de traçage de courbe sous gnuplot est égal à N avec N=nombre d'abscisses
    integer,parameter ::ncolonne=2 ! 2 colonnes correspondant respectivement à x et T
    double precision w(0:nligne-1,ncolonne)
    [...structure du code pour calculer x et T à chaque itération...]

    do i=0,nligne-1
    w(i,1)=xr(i)
    w(i,2)=Tnf(i)
    end do
    !j'attribue à chaque pas de temps les valeurs de w: donc , normalement, à chaque itération je dois avoir une matrice de N lignes et de 2 colonnes

    alors que moi j'ai eu
    #Timestep= 4.500000E-05xstep= 0.100000000000
    0.00000000000 9.486832980505E-03 1.341640786500E-02 1.643167672515E-02
    1.897366596101E-02 2.121320343560E-02 2.323790007724E-02 2.509980079602E-02
    2.683281573000E-02 2.846049894152E-02 3.000000000000E-02 300.000000000
    293.000140000 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000
    Comment faire pour afficher la matrice avec N lignes et 2 colonnes ainsi que d'insérer 2 lignes vides à la fin de chaque itération.
    Merci d'avance,

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #Timestep= 4.500000E-05xstep= 0.100000000000
    0.00000000000 9.486832980505E-03 1.341640786500E-02 1.643167672515E-02
    1.897366596101E-02 2.121320343560E-02 2.323790007724E-02 2.509980079602E-02
    2.683281573000E-02 2.846049894152E-02 3.000000000000E-02 300.000000000
    293.000140000 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000 293.000000000 293.000000000
    293.000000000 293.000000000
    On ne sait pas comment ça a été obtenu (comme l'a déjà signalé LiittleOwl).
    Tu peux t'en sortir avec une boucle et l'écriture formatée, comme dans ce petit exemple :
    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
    program data_gnuplot
        implicit none
        integer, parameter :: n=10, m=5
        integer :: i, record
        real, allocatable :: t(:), w(:,:)
     
        t = (/ (i, i = 1, n) /)
        w = reshape((/ (i, i = 1, n * m) /), shape=(/n, m/))
     
        do record = 1, m
            write(6,'(2(e12.6, x))') (t(i), w(i, record), i = 1, n)
            write(6,'(/)')
        enddo
     
    end program data_gnuplot

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut explication code
    Bonjour,
    Je vous remercie pour votre proposition.
    Néanmoins, J'arrive pas à bien distinguer entre les différents paramètres (n,m) ainsi que les matrices (t,w)...
    Voulez vous me fournir une explication du code pour bien comprendre la structure et pouvoir l'appliquer à mon problème.
    Ainsi que plus de détails sur la syntaxe de shape et reshape.
    Merci d'avance,

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    Le programme est en Fortran 2003.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        implicit none
        integer, parameter :: n=10, m=5
        integer :: i, record
        real, allocatable :: t(:), w(:,:)
    Je déclare 2 entiers n et m, affectés respectivement à 10 et 5. Ils sont non modifiables (parameter).
    Puis 2 tableaux de réels t (à 1 dimension) et w (à 2 dimensions). Ils sont allouables, ce qui permet en Fortran 2003, de faire des affectations sans avoir fait explicitement l'allocation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        t = (/ (i, i = 1, n) /)
        w = reshape((/ (i, i = 1, n * m) /), shape=(/n, m/))
    L'initialisation se fait avec des boucles implicites. t vaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    De la même façon, il faut comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        (/ (i, i = 1, n * m) /) <=> (1, 2, 3, ..., 49, 50)
    La fonction intrinsèque permet de retailler le tableau à 1 dimension de n * m éléments, en un tableau à 2 dimensions ayant n éléments sur son premier indice et m éléments sur le second.

    Disons qu'il y a m enregistrements à analyser. Chaque enregistrement contient n points. Les abscisses étant invariantes, un tableau 1D suffit (t(1:n)), et les ordonnées sont placées dans w(1:n, 1:m).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        do record = 1, m
            write(6,'(2(e12.6, x))') (t(i), w(i, record), i = 1, n)
            write(6,'(/)')
        enddo
    L'idée est de boucler sur les enregistrements. Avec la boucle implicite je crée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        (t(1), w(1, record), t(2), w(2, record), ..., t(n), w(n, record))
    Le format '(2(e12.6, x))' permet de consommer des groupes de 2 réels, et de faire un retour à la ligne pour imprimer ce qui reste. L'unité 6 correspond à la sortie standard.
    Et comme le '(/)' correspond à un retour à la ligne, et que par défaut write termine par un retour à la ligne, il y en aura bien 2 entre chaque bloc.

    Tes bases en Fortran n'ont pas l'air solide. Passer du temps à lire un tutoriel, te serais profitable. Le cours d'IDRIS est une référence.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut
    Merci encore une fois,
    J'ai essayé de suivre la structure de ton code(avec quelques modif vu que je travaille afec fortran 90).
    et voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    integer, parameter::K8=selected_int_kind(8)
    integer(kind=k8)::k=4,l=5
    integer::j,record
    real,allocatable::v(:),p(:,:)
     
    v=(/(j,j=1,k)/)
    p=reshape ((/(j,j=1,k*l)/),shape=(/k,l/))
    do record=1,l
        write(6,'(2(e12.6, 1x))')(v(j),p(j,record),j=1,k)
        write(6,'(/)')
    enddo
    La compilation est sans erreur
    Mais pour l'exécution, j'ai eu un message d'erreur : intreger overflow à la ligne qui correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=reshape ((/(j,j=1,k*l)/),shape=(/k,l/))

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut
    à titre de rectification, j'ai exécuté le code avec un autre compilateur (gfortran pour une machine sous linux) et ça l'air de bien marcher. Donc je pense le pbm est du au compilateur( silverfrost sous windows)

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut
    En ce qui concerne mon cas, je veux pas créer des tableaux t et w (à la main). Je veux utiliser les valeurs déjà obtenues par simulation.c-à-d:
    Dans mon code, j'ai obtenu un fichier de résultats correspondant à x(i), i=0,N et un autre fichier T(i),i=0,N pour chaque itération dans le temps.
    Donc, en se basant sur votre proposition, j'ai incrémenté dans la boucle d'itération temporelle la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    write(12,*)x
    write(14,*)'iter=',it,'temps=',tpsf,T
     
    write(6,'(2(e12.6, 1x))')(x(i),T(i),i=0,N)
    write(6,'(/)')
    Le résultat ne correspond pas à mes attentes

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut
    Ce que je voulais dire par résultat inattendu: c'est qu'il m'a affiché toutes les valeurs de X (i) suivies des valeurs de T(i) en une seule ligne. Au lieu de les aficher verticalement, il les a affiché horizontalement ce qui ne fait pas la correspondance entre x(i) et T(i).
    Pour mieux expliquer , je prend ton exemple de t et w: donc dans mon cas, il les a affiché comme suit:
    t(1) t(2) t(3) t(4) w(1,1) w(2,1) w(3,1) w(4,1) pour record=1, au lieu de les afficher comme:
    t(1) w(1,1)
    t(2) w(2,1)
    t(3) w(3,1)
    t(4) w(4,1)
    Rq: Dans mon cas T(qui est analogue à w) est un vecteur de déclaré comme T(0:N) et non pas une matrice comme w; c'est pour celà que j'ai pas fait la boucle selon record(colonne).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Il ne fait que ce que tu lui dis de faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(6,'(2(e12.6, 1x))')(x(i),T(i),i=0,N)
    Ecrit sur une seule ligne.
    Pour avoir deux colonnes, il suffit que la boucle sur les indices soit externe au write:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do i=0,N
    write(6,'(2(e12.6, 1x))') x(i),T(i)
    enddo
    Bonne continuation.

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 30
    Points : 26
    Points
    26
    Par défaut
    Merci à vous deux pour votre contribution

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/05/2011, 16h01
  2. Affichage des résultats du khi-deux dans une table
    Par jenyo7 dans le forum SAS STAT
    Réponses: 14
    Dernier message: 29/04/2010, 15h03
  3. Réponses: 3
    Dernier message: 24/11/2008, 14h09
  4. Problème pour tracer une courbe
    Par benji2642 dans le forum MATLAB
    Réponses: 2
    Dernier message: 04/12/2006, 18h23
  5. probleme pour tracer une ligne avec OleExcel
    Par blondelle dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/08/2006, 19h10

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