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 :

fortran calcul Biais entre 2 fichiers [Débutant(e)]


Sujet :

Fortran

  1. #21
    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
    Les fichiers modele et observation doivent avoir le même préfixe. J'ai modifié le nom des fichiers modele (IT1247A2012 en IT1247A), mis à jour liste_fichiers_model.dat, et ça retourne des résultats.
    Ça marche pour l'Espagne, mais il y a des NAN pour les autres. A creuser.

    En fait, pour la France et pour l'Italie, les valeurs ne correspondent pas. Les dates du modele sont en 2009 et celle de l'observation en 2012.
    Il faudrait prévoir d'arrêter le traitement dans ce cas, pour éviter les NAN.

  2. #22
    Invité
    Invité(e)
    Par défaut Merci
    Oui en effet; Ah mais oui c'est ca... C'est parceque j'ai utilisé les resultats de 2009 en attendant d'avoir ceux de 2012 pour tester le programme et j'ai oublié je modifier mes 2 fichiers..............
    En tout cas, je te remercie infiniment pour ton aide si précieuse.


  3. #23
    Invité
    Invité(e)
    Par défaut
    J'ai un probleme de segmentation maintenant;
    Lorsque j'execute main il m'écrit Erreur de segmentation
    j'ai pu voir qu'une erreur de segmentation est une erreur générée lorsqu'un code tente d'accéder à un emplacement mémoire qui ne lui était pas alloué... ???

  4. #24
    Invité
    Invité(e)
    Par défaut
    Finalement, dans le programme comparaison_fichiers.f90 à la ligne 85, j'ai remplacé
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    allocate(tab(10000))
    et sa marche nickel;
    Merci encore

  5. #25
    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
    Je n'ai pas rencontré ce problème. D'après ce que tu proposes le soucie vient de premier qui est déclarée comme variable statique. Remplace plutôt par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            ...
            logical :: premier
     
            premier = .true.
            ...

  6. #26
    Invité
    Invité(e)
    Par défaut
    Oui ce que je propose n'est pas bon car mes valeurs des ecarts types et de la correlation changent en fonction du nombre que je mets...

    je ne sais pas si j'ai fait le bon remplacement??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
    subroutine extraire_donnees (file_o, file_m)
            character(len=*) :: file_o, file_m
            integer :: ios_o, ios_m
            integer :: date_o, date_m
            double precision :: conc_o, conc_m
            logical :: premier
            premier = .true.
     
            do
                open(unit=11, file= file_o, status='old')
                read(11,*) date_o, conc_o
    ...
    Est ce au bon endroit? Si oui voila ce qu'il m'indique lorsque j'execute le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fortran runtime error: Attempting to allocate already allocated array.

  7. #27
    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 désalloue le tableau quand on ne s'en sert plus :
    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
    module comparaison_fichiers
        implicit none
        type enreg
            integer :: date
            double precision :: conc_o
            double precision :: conc_m
        end type enreg
     
        integer, parameter :: nb_res = 4
        integer :: nb_conc
        type(enreg), dimension(:), allocatable :: tab
     
    contains
     
        function comparaison (file_o, file_m)
            character(len=*), intent(in) :: file_o, file_m
            double precision :: moy_o, moy_m, ecc_type_m, ecc_type_o, cov
            double precision, dimension(nb_res) :: comparaison
     
            call extraire_donnees(file_o, file_m)
     
            ! Biais
            print *, nb_conc
            comparaison(1) = sum( tab%conc_o - tab%conc_m ) / nb_conc
     
            ! Moyennes
            moy_o = sum(tab%conc_o) / nb_conc
            moy_m = sum(tab%conc_m) / nb_conc
     
            ! Ecarts types
            ecc_type_m = sqrt( sum( (tab%conc_m - moy_m)**2 ) / nb_conc )
            ecc_type_o = sqrt( sum( (tab%conc_o - moy_o)**2 ) / nb_conc )
            comparaison(2) = ecc_type_m ; comparaison(3) = ecc_type_o
     
            ! Covariance
            cov = sum( (tab%conc_m - moy_m)*(tab%conc_o - moy_o) ) / nb_conc
     
            ! Correlation
            comparaison(4) = cov / (ecc_type_o * ecc_type_m)
     
            deallocate(tab)
     
        end function comparaison
     
        subroutine extraire_donnees (file_o, file_m)
            character(len=*) :: file_o, file_m
            integer :: ios_o, ios_m
            integer :: date_o, date_m
            double precision :: conc_o, conc_m
            logical :: premier
     
            premier = .true.
            do
                open(unit=11, file= file_o, status='old')
                read(11,*) date_o, conc_o
     
                open(unit=12, file= file_m, status='old')
                read(12,*) date_m, conc_m
     
                nb_conc = 0
                lect_obs : do
     
                    ! Boucler tant que la date lue dans le fichier modele est
                    ! inferieure a la date lue dans le fichier observation
                    lect_model : do
                        if (date_m >= date_o) exit lect_model
                        read(12,*,iostat=ios_m) date_m, conc_m
                        if (ios_m /= 0) exit lect_obs
                    enddo lect_model
     
                    ! Date observation trouvée : ajout contribution
                    if (date_m == date_o) then
                        nb_conc = nb_conc + 1
                        if (.not. premier) then
                            tab(nb_conc) = enreg( date_o, conc_o, conc_m)
                        endif
                    endif
     
                    ! Lecture d'une nouvelle ligne dans le fichier observation
                    read(11,*,iostat=ios_o) date_o, conc_o
                    if (ios_o /= 0) exit lect_obs
     
                enddo lect_obs
                close(11) ; close(12)
     
                if (premier) then
                    premier = .false.
                    allocate(tab(nb_conc))
                else
                    return
                endif
     
            enddo
     
        end subroutine extraire_donnees
     
    end module comparaison_fichiers

  8. #28
    Invité
    Invité(e)
    Par défaut MERCI
    je te remercie Dardanos.
    Tout marche super bien!!!!

Discussions similaires

  1. [XL-MAC 2011] calcul entre deux fichiers différents
    Par tim343 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/07/2013, 09h09
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h07
  3. [langage] Passage d objet entre deux fichiers
    Par Slippers dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2005, 14h45
  4. automatisation entre un fichier .txt et sql server
    Par bibi2607 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2005, 10h18
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

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