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 :

Aide Fortran 90


Sujet :

Fortran

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Aide Fortran 90
    Bonjour aux professionnels en Informatique;
    Mon problème est comme suit : j'ai un fichier de données et je souhaite apporter certaines modifications, ce n'est malheureusement pas possible à réaliser sur Excel puisque c'est inutile de copier les données sur le tableur Excel , y'a automatiquement déformation des données et c'est un fichier qui comporte à peu près 80 pages
    En fait, on m'a proposé de faire ceci via un script FORTRAN 90, vu que je n'ai jamais étudié ce language je me suis bien mise à le faire y'a un moment, j'ai réalisé un script, je le compile sous MSDEV ca me donne 0 errors , 0 warnings mais le fichier output est totalement vierge
    J'espère vraiment trouver une solution efficace sur ce forum, et puis je suis préte méme à déposer mon script si quelqu'un pourrait le revoir et me dire si ce que j'ai fait est bon .
    Merci d'avance les développeurs!

  2. #2
    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,
    Montre nous ce que tu as codé, si tu veux avoir de l'aide.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Voici bien mon script:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    program interpolation 
     
    implicit none  
     
    integer hour, day, year, stime, index, var, altitude, line
    integer tempi, nlines, harp, maxwp, tropp, topindex, source  
    integer nlevs				! ss sounding start   
    character (len=6), month, lat, lon, sindex, tempc, ss, unit,tempj
    integer, allocatable ::	pressure(:), height(:), winddir(:),windspeed(:) 
    integer, allocatable :: temperature(:), dewpoint(:), leveltype(:)
    integer i, j, k 
     
    integer, dimension (15,3) :: t
      t= reshape ((/10000., 9250., 8500., 7000., 5000., 4000., 3000., 2500., 2000., 1500., 1000., 700., 500., 300., 200.,	83., 49., -6., -35., 1., -17., -1., 27., -107., -27., -3., 11., 10., 28., -2.,2.,2.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1./), (/15,3/))
     
    open (unit=20, file="data", status="old")
    open (unit=30, file="output", status="replace")
     
    ss = "254"
    read(20,*) tempc
    tempc = trim(tempc)
     
    if (tempc .eq. ss)  then 
    	print*, "debut de la ligne "
    	backspace(20)
    end if
     
    do while (tempc.eq.ss)
    	read(20,*) tempc, hour, day, month, year
    	read(20,*) line, tempi, index, lat, lon, altitude, stime
    	read(20,*) line, harp, maxwp, tropp, nlines, topindex, source
    	read(20,*) line, sindex, tempc, unit
    	print*, tempc, hour, day, month, year
    	print*, line, tempi, index, lat, lon, altitude, stime
    	print*, line, harp, maxwp, tropp, nlines, topindex, source
    	print*, line, sindex, tempc, unit
    end do
     
    	nlevs= nlines - 4
     
    	allocate(pressure(nlevs), height(nlevs), winddir(nlevs),windspeed(nlevs))
    	allocate(temperature(nlevs), dewpoint(nlevs), leveltype(nlevs))
     
    	do i = 1, nlevs
    		read(20,*) leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i),windspeed(i)
    		print*, leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i),windspeed(i)
    	end do
     
    	do i = 1, nlevs
    	  do j=1,3
    	   if (pressure(i).eq.t(i,1)) then
    	   write(30,*) leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i)- t(i,2),windspeed(i)*t(i,3)
    	   end if
    	  end do
    	end do
     
     
     
     
     
     
     
    deallocate(pressure, height, winddir,windspeed,temperature, dewpoint, leveltype)
     
     
     
    close(20)
    end program
    Impatiente vraiment d'avoir votre aide ! Merci d'avance

  4. #4
    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
    Et un exemple de "data" ?

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    le fichier de données data est consultable depuis ce lien : http://esrl.noaa.gov/raobs/temp/raob_soundings9472.tmp .

  6. #6
    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
    Il y avait un premier problème sur t déclaré comme un tableau d'entiers, mais initialisé avec des réels. De plus le nombre de caractères par ligne est limité à 132.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        integer, dimension(15,3) :: t
        t= reshape( (/ 10000, 9250, 8500, 7000, 5000, 4000, 3000, 2500, 2000, 1500, 1000, 700, 500, 300, 200,&
                    &     83,   49,   -6,  -35,    1,  -17,   -1,   27, -107,  -27,   -3,  11,  10,  28,  -2,&
                    &      2,    2,    1,    1,    1,    1,    1,    1,    1,    1,    1,   1,   1,   1,   1/), &
                    & (/15,3/) )
    Le programme compile et tourne mais le test suivant n'est jamais vérifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        do i = 1, nlevs
          do j=1,3
           if (pressure(i) == t(i,1)) then
           write(30,*) leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i)- t(i,2),windspeed(i)*t(i,3)
           end if
          end do
        end do
    L'indice j n'intervient pas. Une erreur ? t(j,1) ?

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    En fait ce que je voulais à travers cette boucle c'est comparer les valeurs de pressure(i) indiquées dans le fichier data avec les valeurs de la première colonne du tableau que j'ai déclaré et quand c'est égal qu'il m'apporte les modifications indiquées en colonne 2 et 3 du tableau au niveau de Winddir et windspeed pour me retourner les résultats dans le fichier output. Je ne sais pas si la structure de ma boucle convient à mon but que je viens d'expliquer !

  8. #8
    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
    Avec cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        do i = 1, nlevs
            do j = 1, 3
                if (pressure(i) == t(j,1)) then
                    write(30,*) leveltype(i), pressure(i), height(i), temperature(i), &
                        & dewpoint(i), winddir(i)- t(i,2), windspeed(i)*t(i,3)
                end if
            end do
        end do
    Le fichier "output" contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               4       10000         292         136         100          66          50
               4        9250         952         158        -122          51          82
               4        8500        1667         132         -28         100          46

  9. #9
    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
    Il y avait une erreur sur les indices de t à l'intérieur de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        do i = 1, nlevs
            do j = 1, size(t,1)
                if (pressure(i) == t(j,1)) then
                    write(30,*) leveltype(i), pressure(i), height(i), temperature(i), &
                        & dewpoint(i), winddir(i) - t(j,2), windspeed(i) * t(j,3)
                else
                    write(30,*) leveltype(i), pressure(i), height(i), temperature(i), &
                        & dewpoint(i), winddir(i), windspeed(i)
                end if
            end do
        end do
    J'ai vérifié et ça me semble correct. La première fois que le test est vérifié, presssure(i) vaut 10000 (ligne 6 de "data" avec windir(i)=115 et windspeed(i)=25), ce qui correspond à t(1,1:3) = (/10000,83,2/). Après correction, dir = 115 - 83 = 32 et speed = 25 * 2 = 50.

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Excusez moi, juste pour information , si la première ligne de mon tableau contien plus que 132 caractères comment pourrais je la coder sous fortran, en revenant à la ligne uniquement ca ne marche pas apparement .

  11. #11
    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
    La limitation est uniquement pour les fichiers FORTRAN. Il n'y en a pas pour les fichiers de données.

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    oui je sais , je parlais aussi du tableau que j'ai déclaré sur fortran .... !
    par exemple si j'ai :

    t= reshape( (/10280,10000,9250,8500,7000,5000,4000,3000,2500,2000,1830,
    1500,1000,886,823,818,786,751, 741,709,700,691,500,300,200,&
    & 0, 83, 40, -5, -35, 1, -16, -1, 27, -106, 0, -27, -2, 0, 0, 0, 0, 0, 0, 0, 11, 0, 10, 28, -1,&
    & 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1/), &
    & (/25,3/) )
    Comment pourrais je tronquer ma première ligne ?

  13. #13
    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
    On tronque où on veut :
    t= reshape( (/10280,10000,9250,8500,7000,5000,4000,3000,2500,2000,1830,&
    &1500,1000,886,823,818,786,751, 741,709,700,691,500,300,200,&
    & 0, 83, 40, -5, -35, 1, -16, -1, 27, -106, 0, -27, -2, 0, 0, 0, 0, 0, 0, 0, 11, 0, 10, 28, -1,&
    & 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1/), &
    & (/25,3/) )
    J'avais fait en fin de ligne pour que ce soit plus propre.

  14. #14
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'ai apporté certaines modifications sur mon script, ca marche sauf qu'à l'affichage chaque ligne et écrite 3 fois de suite . Pouvez vous me dire ou réside cette erreur sur mon script s'il vous plait? je joins encore une fois mon script modifié .

    program interpolation

    implicit none

    integer hour, day, year, stime, index, var, altitude, line
    integer tempi, nlines, harp, maxwp, tropp, topindex, source
    integer nlevs ! ss sounding start
    character (len=6), month, lat, lon, sindex, tempc, ss, unit,tempj
    integer, allocatable :: pressure(, height(, winddir(,windspeed(
    integer, allocatable :: temperature(, dewpoint(, leveltype(
    integer i, j, k
    integer, dimension(25,3) :: t
    t= reshape( (/ 10280,10000,9250,8500,7000,5000,4000,3000,2500,2000,1830,1500,1000,886,&
    & 823,818,786,751, 741,709,700,691,500,300,200,&
    & 0, 83, 40, -5, -35, 1, -16, -1, 27, -106, 0, -27, -2,&
    & 0, 0, 0, 0, 0, 0, 0, 11, 0, 10, 28, -1,&
    & 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1/), &
    & (/25,3/) )
    open (unit=20, file="data", status="old")
    open (unit=30, file="output", status="replace")

    ss = "254"
    read(20,*) tempc
    tempc = trim(tempc)

    if (tempc .eq. ss) then
    print*, "debut de la ligne "
    backspace(20)
    end if

    do while (tempc.eq.ss)
    read(20,*) tempc, hour, day, month, year
    read(20,*) line, tempi, index, lat, lon, altitude, stime
    read(20,*) line, harp, maxwp, tropp, nlines, topindex, source
    read(20,*) line, sindex, tempc, unit
    print*, tempc, hour, day, month, year
    print*, line, tempi, index, lat, lon, altitude, stime
    print*, line, harp, maxwp, tropp, nlines, topindex, source
    print*, line, sindex, tempc, unit
    end do

    nlevs= nlines - 4

    allocate(pressure(nlevs), height(nlevs), winddir(nlevs),windspeed(nlevs))
    allocate(temperature(nlevs), dewpoint(nlevs), leveltype(nlevs))

    do i = 1, nlevs
    read(20,*) leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i),windspeed(i)
    print*, leveltype(i), pressure(i), height(i),temperature(i), dewpoint(i),winddir(i),windspeed(i)

    end do

    do i = 1, nlevs
    do j = 1, 3
    if (pressure(i) == t(i,1)) then
    write(30,*) leveltype(i), pressure(i), height(i), temperature(i), &
    & dewpoint(i), winddir(i)- t(i,2), windspeed(i)*t(i,3)
    end if
    end do
    end do





    deallocate(pressure, height, winddir,windspeed,temperature, dewpoint, leveltype)



    close(20)
    end program

  15. #15
    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
    Bon ben si ça marche, lorsque le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pressure(i) == t(i,1)) then
    est vérifié pour une valeur de i, les données sont forcément écrites 3 fois car le test est à l'intérieur de la boucle sur j.

  16. #16
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour tes réponses, mais méme en placant la condition avant la boucle sur j ca reste inchangé toujours les lignes sont répétées trois fois de suite ...!

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2013, 14h34
  2. Beosin d'aide FORTRAN
    Par HULK dans le forum Fortran
    Réponses: 0
    Dernier message: 16/06/2009, 21h10
  3. [Fortran 77] Aide message d'erreur
    Par Rémirem dans le forum Fortran
    Réponses: 6
    Dernier message: 05/04/2007, 08h32

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