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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : 2458
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
    Membre averti
    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
    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 émérite
    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
    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
    Membre averti
    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
    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 émérite
    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
    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
    Membre averti
    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
    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/))

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