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 pour un programme fortran


Sujet :

Fortran

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Aide pour un programme fortran
    Bonjour à tous,

    J'essaie de convertir un fichier de données de réanalyse qui est en format netCDF vers un format intermédiaire (format intermédiaire lisible par WPS, le programme de préprocessing du modèle mésoscale ARW-WRF).

    Je possède des données MERRA (fichiers donnant des paramètres atmosphériques comme la température, la pression, etc. à différents niveaux de pression et de coordonnées) au format netcdf que je voudrais convertir à l'aide de ce programme fortran:

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    program merra2wps
    ! Fortran 90 version.
     
    !   This is a simple program to write data in the WPS intermediate
    !   format.  It is included mainly as an aid to understanding said 
    !   format.
     
      implicit none
     
    ! Declarations:
     
      integer, parameter :: IUNIT = 10
      integer, parameter :: OUNIT = 11
      integer :: ierr
     
      integer :: IFV=5
      character(len=24) :: HDATE
      real :: XFCST
      character(len=8) :: STARTLOC
      character(len=9) :: FIELD
      character(len=25) :: UNITS
      character(len=46) :: DESC
      character(len=32) :: MAP_SOURCE
      real :: XLVL=42
      integer :: NX
      integer :: NY
      integer :: IPROJ=3
      real :: STARTLAT=34
      real :: STARTLON=45
      real :: DELTALAT
      real :: DELTALON
      real :: DX=30
      real :: DY=30
      real :: XLONC=4.87
      real :: TRUELAT1=50.404
      real :: TRUELAT2
      real :: NLATS
      real :: EARTH_RADIUS = 6367470. * .001
      logical :: IS_WIND_EARTH_REL = .FALSE.
     
     
    ! SLAB is an allocatable array, because we do not necessarily know in 
    ! advance the size of the array we need to read.
      real, allocatable, dimension(:,:) :: SLAB
     
      DATALOOP : DO
     
    !====================================================================================!
    ! READ in your data from the original source - you need to add the reading code here !
    !                                                                                    !
     
    open(10,FILE='MERRA300.prod.assim.inst6_3d_ana_Np.20100301.SUB')
     
     
    ! You need to allocate SLAB (this is a 2D array) and place each 2D slab here before  !
    ! you can write it out to into the intermadiate file format                          !
    !                                                                                    !
    ! Other information you need to know about your data:                                !
    !    Time at which data is valid                                                     !
    !    Forecast time of the data                                                       !
    !    Source of data - you can make something up, it is never used                    !
    !    Field name - NOTE THEY NEED TO MATCH THOSE EXPECTED BY METGRID                  !
    !    Units of field                                                                  !
    !    Description of data                                                             !
    !    Level of data - Pa, 200100 Pa is used for surface, and 201300 Pa is used        !
    !          for sea-level pressure                                                    !
    !    X dimension                                                                     !
    !    Y dimension                                                                     !
    !    Data projection - only recognize                                                !
    !         0:  Cylindrical Equidistant (Lat/lon) projection.                          !
    !         1:  Mercator projection.                                                   !
    !         3:  Lambert-conformal projection.                                          !
    !         4:  Gaussian projection.                                                   !
    !         5:  Polar-stereographic projection.                                        !
    !    Start location of data - "CENTER", "SWCORNER". "SWCORNER" is typical            !
    !    Start lat & long of data                                                        !
    !    Lat/Lon increment                                                               !
    !    Number of latitudes north of equator (for Gaussian grids)                       !
    !    Grid-spacing in x/y                                                             !
    !    Center long                                                                     !
    !    truelat1/2                                                                      !
    !    Has the winds been rotated                                                      !
    !====================================================================================!
     
         write (IUNIT, IOSTAT=IERR) IFV
     
         ! WRITE the second record, common to all projections:
     
         write (IUNIT) HDATE, XFCST, MAP_SOURCE, FIELD, UNITS, DESC, XLVL, NX, NY, IPROJ
         print*, HDATE//"  ", XLVL, FIELD
     
         ! WRITE the third record, which depends on the projection:
     
         if (IPROJ == 0) then 
     
            !  This is the Cylindrical Equidistant (lat/lon) projection:
            WRITE (IUNIT) STARTLOC, STARTLAT, STARTLON, DELTALAT, DELTALON, EARTH_RADIUS
     
         elseif (IPROJ == 1) then 
     
            ! This is the Mercator projection:
            WRITE (IUNIT) STARTLOC, STARTLAT, STARTLON, DX, DY, TRUELAT1, EARTH_RADIUS
     
         elseif (IPROJ == 3) then
     
            ! This is the Lambert Conformal projection:
            WRITE (IUNIT) STARTLOC, STARTLAT, STARTLON, DX, DY, XLONC, TRUELAT1, TRUELAT2, EARTH_RADIUS
     
     
         elseif (IPROJ == 4) then
     
            ! Gaussian projection                         
            WRITE (IUNIT) STARTLOC, STARTLAT, STARTLON, NLATS, DELTALON, EARTH_RADIUS
     
         elseif (IPROJ == 5) then
     
            ! This is the Polar Stereographic projection:
            WRITE (IUNIT) STARTLOC, STARTLAT, STARTLON, DX, DY, XLONC, TRUELAT1, EARTH_RADIUS
     
         endif
     
     
         WRITE (IUNIT) IS_WIND_EARTH_REL
     
     
         WRITE (IUNIT) slab
     
         ! Now that we have done all that we want to with SLAB, we need to
         ! deallocate it:
     
         deallocate(slab)
     
         ! Loop back to read/write the next field.
      ENDDO DATALOOP
     
      write(*,'(/,"End of read loop.  Program finished.")')
     
    end program merra2wps
    Je suis un novice en fortran, donc je ne comprend pas trop ce que je dois modifier pour pouvoir compiler et exécuter ce programme.

    La compilation fonctionne, mais quand je tente de l'exécuter, j'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    At line 89 of file merra2wps.f90 (unit = 10, file = 'MERRA300.prod.assim.inst6_3d_ana_Np.20100301.SUB')
    Fortran runtime error: Missing format for FORMATTED data transfer
    Est ce que quelqu'un aurait une idée?

    Merci beaucoup

    Greg

  2. #2
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    Salut

    T'as juste oublié un format d'écriture. À la ligne 89 t'as juste écris
    c'est à dire tu dis "écrit ici", mais tu ne dis pas comment écrire. Si ça passe tu peux essayer
    et là c'est fortran qui va gérer comment il va écrire ce que tu lui demandes, ou sinon il faut préciser. Je te conseilles de lire : http://fortran.developpez.com/cours/notions-base/
    et surtout le passage sur les formats d'édition vers la page 110.

    Bonne soirée
    Libérez vos documents http://fr.libreoffice.org/ et vos doigts en tapant en BÉPO http://bepo.fr/wiki/Accueil:, rangez les cartes perforées dans une armoire et GOTO work

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai modifié le code mais j'ai l'erreur suivante quand j'exécute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      /����ؿ&F��:�     42.000000     t�
    At line 126 of file merra2wps.f90 (unit = 10, file = 'MERRA300.prod.assim.inst6_3d_ana_Np.20100301.SUB')
    Internal Error: transfer_array(): Bad type

  4. #4
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    Salut,

    Ou-est ce que tu alloues "slab" ? Je pense que ça vient juste de ce point, après il y a possiblement d'autres erreurs. Lis bien les messages d'erreurs, ils t'indiquent la ligne à laquelle il y a un problème, puis après en remontant dans le code tu peux facilement les retrouver.

    Bonne journée
    Libérez vos documents http://fr.libreoffice.org/ et vos doigts en tapant en BÉPO http://bepo.fr/wiki/Accueil:, rangez les cartes perforées dans une armoire et GOTO work

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Désolé mais je ne comprend pas bien, je suis un peu trop novice en fortran...

    Lorsque je vais à la ligne 126 (erreur), je ne comprend pas trop ce que je dois faire

  6. #6
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    En fait à cette ligne tu fais un write (que normalement tu as déjà corrigé car mal écrit, cf. première question) d'un tableau nommé "slab". Je n'ai pas vu dans le code ou-est ce que tu l'allouais. En fortran tu as :

    - Des tableaux à taille fixe comme le superbe tableau d'entier de taille 10 "lala" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       integer, dimension(10) :: lala
    - Des tableaux à taille non définie lors de la déclaration comme par exemple "toto" suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       integer, dimension(:) :: toto
    du coup avant de l'utiliser, il faut l'allouer parce que pour l'instant "toto" à une taille nulle. On fait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        allocate( toto(10)  )
    pour que toto ait une taille de 10. Dans la foulée comme c'est nous qui gérons l'allocation mémoire c'est aussi un peu à nous de la désallouer. Quand on en a fini avec toto :
    .

    En espérant t'avoir un peu plus éclairé ce coup là.

    Bonne journée
    Libérez vos documents http://fr.libreoffice.org/ et vos doigts en tapant en BÉPO http://bepo.fr/wiki/Accueil:, rangez les cartes perforées dans une armoire et GOTO work

  7. #7
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    ... si tu veux afficher ton tableau tu peux faire une petite boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      integer :: i
      !
      ! Du code
      !
      do i=1, size(lala,1)
          write(6, *) lala(i) ! on affiche à l'écran (d'où le 6) là ième case de lala
      end do
    Libérez vos documents http://fr.libreoffice.org/ et vos doigts en tapant en BÉPO http://bepo.fr/wiki/Accueil:, rangez les cartes perforées dans une armoire et GOTO work

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ok merci c'est un peu plus clair, je vais essayer ça!

    Merci beaucoup!

  9. #9
    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
    Citation Envoyé par leroygr Voir le message
    Bonjour à tous,

    J'essaie de convertir un fichier de données de réanalyse qui est en format netCDF vers un format intermédiaire (format intermédiaire lisible par WPS, le programme de préprocessing du modèle mésoscale ARW-WRF).
    Bonjour,

    Je pense que tu pars sur une fausse piste en tentant d'écrire un fichier formatté et qu'il faudrait rester sur du "non-formatté".
    Pour cela il faut simplement préciser les choses lors de la création du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(10,FILE='MERRA300.prod.assim.inst6_3d_ana_Np.20100301.SUB',form='UNFORMATTED')
    Et bien sûr ne pas ajouter d'instruction de format lors des écritures dans le fichier (ainsi que cela était fait dans l'exemple initial).

    Par ailleurs, je te conseille de compiler ton programme avec toutes les options de compilation de "déboggage" possible (voir la doc de ton compilateur) pour rapidement déceller des problèmes de variables non allouées, dépassements de tableaux, etc.

    Bonne continuation.

    Ehouarn

Discussions similaires

  1. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  2. Réponses: 13
    Dernier message: 26/10/2006, 21h02
  3. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01
  4. aide pour un programme a compiler
    Par letombeur dans le forum C++
    Réponses: 8
    Dernier message: 11/01/2006, 21h53
  5. une IHM pour mon programme fortran
    Par mehdouchi dans le forum Fortran
    Réponses: 5
    Dernier message: 09/09/2005, 16h00

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