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 :

Section d'un tableau en paramètre d'une fonction


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 37
    Par défaut Section d'un tableau en paramètre d'une fonction
    Bonjour à tous,

    Voila mon problème,
    J'ai pour global un tableau "tres" grand, permetant de gerer toute les données de mon application:
    Dans mon main, j'apelle une fonction foo:
    Dans ma fonction FOO, ce paramètre corespond a un tableau a 5 dimensions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SUBROUTINE FOO(FIELDS)
       /*input/output*/
        REAL FIELDS(MXLON,NLAT,NVER,NF,NLAYERS)
    La shape de FIELDS corespond a une signification logique au niveau des données.
    ...La tout va bien dans le meilleur des mondes

    Maintenant je veut appeller une autre fonction a partir de mon main,
    le meme tableau en fait, mais pas toutes les données,
    du point de vu logique je veut passer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FIELDS(1:NLON,NLAT,NVER,NF,NLAYERS)
    avec NLON<MXLON

    Ce qui corespont pour mon tableaux WS, (de rang 1) a une sous section non contigus.
    Je peut, par l'intermediaire d'un vecteur d'indice, faire une indexation directe
    (i.e. je fait un vecteur avec tous les indices que je veux voir dans ma sous section)
    Le probleme, c'est qu'un tel sous-tableau ne peut pas figurer à gauche d’un signe d’affectation, donc le passage en parametre ne marche pas non plus.


    De plus j'ai lu dans un tutorial:
    Sections non régulières en argument de procédures
    Si on passe une section non régulière en argument d’appel d’une
    procédure, il faut savoir que :
    • c’est une copie contiguë en mémoire qui est passée par le
    compilateur,
    • l’argument muet correspondant de la procédure ne doit pas avoir la
    vocation INTENT(inout) ou INTENT(out) ; autrement dit, en
    retour de la procédure, il n’y a pas mise-à-jour du tableau “père” de la
    section irrégulière.
    Toutes les remarques seront les bienvenues

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Je te conseille de travailler sur une copie locale dans la fonction FOO, avec recopie des elements necessaires avant l'appel a BAR. Ainsi, dans FOO et BAR tu auras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REAL L_FIELDS(NLON,NLAT,NVER,NF,NLAYERS)
    ce qui simplifie grandement les choses.

  3. #3
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 37
    Par défaut
    Merci pour ta reponse,

    C'est actuellement ce que je fais, et ca marche tres bien.
    Mais le problème c'est que c'est du code scientific, et j'ai besoin des meilleurs
    performances possibles.
    L'utilisation d'un tableau "swap", bien que tres pratique, me coute bien trop cher en temps et en memoire (jusqu'a 1E6 element de type double precisions).

  4. #4
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 37
    Par défaut
    Pas d'idées?
    J commence à croire que c'est pas possible :-(
    j trouve rien sur le net, meme avec du f95

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    J'ai trouvé !

    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
     
    program Test
    ...
    REAL WS(COM_SIZE)
    ...
    call InterfaceBar(WS(Offset))
    ...
    end
    subroutine InterfaceBar(FIELDS)
       /*input/output*/
        REAL FIELDS(MXLON,NLAT,NVER,NF,NLAYERS)
     
       interface
          subroutine Bar(a)
             real, intent(inout) :: a(:,:,:,:,:)
          end subroutine
       end interface
     
       call Bar(Fields(1:NLON,NLAT,NVER,NF,NLAYERS))
       end subroutine
     
    subroutine Bar(Fields)
      implicit none
      real,intent(inout) :: Fields(:,:,:,:,:)
     
    ...

  6. #6
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 37
    Par défaut
    Je n'ai qu'une chose à dire, bien joué

    Fallait y penser, ca parait tellement trivial quand la réponse apparait comme
    par magie.

    Le seul hic c'est que dans mon projet ca marche pas, mais la fonction que j'appelle est un petit peu plus compliquée.
    En fait Bar(), vas juste enregistrer la variable pour chaque process (programation parallele) selon une distribution donnée. Puis a l appelle d'une autre fonction, les variable enregistrée (comme FIELDS par example) sont sauvegarder a travers le grid via un logicielle appeller Internet Backplane Protocol, et c'est la que ca marche pas.
    Bref je suis presque sur que ta solution fonctionne a merveille, et si ca marche pas chez moi, c'est que mon programme est assez complex ( de plus Bar est ecrit en c ).
    Je suis maintenant le seul a pouvoir m'aider

    En tout cas merci Sylvain pour ta soluce,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/06/2013, 17h16
  2. [AC-2007] Déclaration d'un tableau en paramètre d'une fonction calcul de tranche
    Par jpg75014 dans le forum VBA Access
    Réponses: 11
    Dernier message: 31/07/2012, 17h30
  3. Tableau en paramètre d'une fonction d'une dll C++
    Par declencher dans le forum Débuter
    Réponses: 18
    Dernier message: 05/08/2011, 23h27
  4. Réponses: 0
    Dernier message: 23/12/2009, 12h38
  5. Réponses: 6
    Dernier message: 24/07/2006, 15h22

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