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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    doctorant
    Inscrit en
    décembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut utilisation d'un programme fortran 77 dans un programme 90
    Bonjour à tous,
    J'utilise fortran dans mes travaux de recherche et je me heurte actuellement à une difficulté que j'aimerais vous exposer afin que vous puissiez me porter assistance.
    En fait, j'ai un code écrit en fortran 77 qui me permet de faire des simulations que je désignerai pas code1.f . J'aimerais implémenter un module en fortran 90 (code2.f90) qui fera appel à ce code. Ce module sera plus tard utilisé dans un code c++ pour des calculs. J'ai déjà un canevas du module et il me manque juste à coder la partie faisant appel à mon code1. J'ai fait un peu de recherche mais je n'arrive pas à trouver la bonne méthode à appliquer.
    Je fais appel à vous et je vous remercie d'avance pour vos contributions. Si vous avez besoin d'informations supplémentaires, je sera ravi de vous en fournir.
    Cordialement

  2. #2
    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
    Points : 1 390
    Points
    1 390
    Par défaut
    Je vais faire les hypothèses que tu compiles tes 2 codes avec le même compilateur et que code.f contient seulement des fonctions et subroutines, pas de program.

    En fait, le Fortran 77 est un sous-ensemble de Fortran 90. Ton code1.f est en format fixe à cause de l'extension .f du fichier, mais pour le compilateur, c'est du F90 en format fixe.

    Il y a 2 stratégies simples à mon avis :

    • Tu appelles directement de code2 ce qui t'intéresse dans code1 (fonction ? subroutine ?). Sans interface explicite, c'est le mode d'appel F77 qui prévaut. Tu dois donc te limiter au types de variables natifs, et passer les dimensions de tes tableaux en paramètres additionnels. Si tu appelle des fonctions, tu devras possiblement déclarer le type de celle-ci dans code2.
    • Tu encapsule le code1 dans un module en insérant tout en haut de celui-ci une ligne « module code1_f », suivi d'une ligne « contains », puis à la toute fin, un « end module ». Tu ne fais aucune conversion de format : les 3 lignes doivent donc commencer en 7. Dans code2, tu ajoute un « use code1_f » et tu peux appeler ce que tu veux de façon plus robuste à cause des interfaces fournies par le module.


    J'ai fait l'une et l'autre souvent. Et ça fonctionne très bien. Si tu n'es pas de contrainte additionnelle, perso, je prendrais la solution 2 : pas plus compliqué, mais plus robuste. Tu amortiras rapidement en temps de débogage le temps d'insertion des 3 lignes...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    doctorant
    Inscrit en
    décembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    D'abord merci pour ton intervention.
    Le code en fortran 77 au fait est un programme permettant de faire des calculs . Je n'ai pas la possibilité de vous le partager mais je vais essayer de l'expliciter afin que vous ayez une idée plus précise. C'est un programme qui après la déclaration des variables globales , ouvre des fichiers texte et les lis pour initialiser les différentes variables à utiliser. Après c'est une succession d'appels à des subroutines dans une boucle qui s'arrête lorsque la valeur de contrôle est atteinte. Les subroutines sont toutes définies dans le meme fichier, en plus de celles dont elle font appel.
    Maintenant, l'objectif final est un interfaçage avec C et nous avons décidé alors d'implémenter un module en f90 qui nous permettra cet interfaçage. Nous avons même déjà un canevas pour le module f90.
    Nous avons pensé aux deux approches que vous nous proposez mais nous nous heurtons à quelques difficultés.
    ----Dans le premier cas, nous avons transformé le programme principal du code f77 en subroutine avec les arguments que nous voulons passer aux subroutines du module qui vont essentiellement juste copier les valeurs dans les tableaux et nous avons exécuté la commande ifort -c code1.f .Ainsi nous avons obtenu un fichier objet code1.o et nous avons fait un appel direct à la subroutine principale du code f77 et à celles qui nous intéressent. La compilation en librairie marche et même avec le programme ecrit en c, ca semble marcher. Le seul souci est qu'en voulant faire des calculs , nous avons finalement un problème de reconnaissance de code1.
    ----Nous avons alors pensé à transformer le code1 en module et l'utiliser dans le code 2 mais apparemment le fait qu'il y ait des instructions d'entrée/sortie surtout les fonction OPEN empêche la compilation.
    ----Nous avons tenté d'ajouter en début la commande include 'code1.f' mais à la compliation il y a plein d'erreurs qui surgissent à cause des différences d'écriture entre le f77 et f90. Mais en lisant votre intervention, je me demande si en transformant code1.f en code1.f90, ca marcherait

  4. #4
    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
    Points : 1 390
    Points
    1 390
    Par défaut
    Je ne pense pas que de changer le format de code1 à format libre (f90) va changer quoi que ce soit. Ton problème a rapport au fait que tu as du C et du Fortran.

    Jadis (parce que ça fait plusieurs années que j'ai fait ça !), il y avait un problème à faire des lectures-écritures en Fortran si le programme principal n'était pas en Fortran. Ça ressemble beaucoup à ton cas.

    Le problème venait du fait qu'en Fortran, il y a un « service » global gérant l'allocation des file-units avec les file-handles du OS, et ce service était lancé (de façon invisible) par le lancement du programme principal qui devait donc être en Fortran. Peut-être est-ce toujours le problème et qu'il est possible de lancer cette initialisation (suffit de connaître la fonction!) manuellement ? Ta piste de solution est donc dans un userguide ou sur le forum d'Intel Fortran. Je commencerais par là avant de tester trop de patente.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    doctorant
    Inscrit en
    décembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut module fortran en format fixe????
    désolé de vous répondre si tardivement mais je pense que je n'arrive malheureusement pas à bien exprimer le problème que j'ai. Je pense qu'il serait plus interessant de poser des questions plus simples afin de savoir ce que je peux faire et comment je peux le faire. Ma première question sera de savoir s'il est possible d'écrire un module fortran en format fixe .

  6. #6
    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
    Points : 1 390
    Points
    1 390
    Par défaut
    Bien sûr que tu peux faire un module en format fixe. Tu peux écrire tout un programme F90 en format fixe.

Discussions similaires

  1. utilisation d'une manette ps3 sixaxis dans un programme
    Par dddj77 dans le forum Matériel
    Réponses: 0
    Dernier message: 31/01/2010, 22h24
  2. Réponses: 5
    Dernier message: 02/02/2008, 11h35
  3. Réponses: 10
    Dernier message: 01/02/2008, 17h14
  4. Utiliser les solveurs ODE de MATLAB dans un programme en C++
    Par yanndublanche dans le forum MATLAB
    Réponses: 8
    Dernier message: 12/12/2007, 15h40
  5. Réponses: 1
    Dernier message: 26/03/2007, 11h27

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