Bonjour,
J'utilise un programme qui permet de faire des appels à des fonctions et subroutines Fortran. J'en ai programmé qui permet de récupérer un fichier texte, de l'enregistrer sous une matrice. A partir de cette matrice, je peux faire des calculs. Jusque là ça fonctionne.
Le premier problème, c'est cette subroutine est tout le temps appelé, et recharger la matrice à chaque fois est chronophage. Pour palier à ce problème, j'utilise l'attribut SAVE. Elle permet de garder en mémoire la matrice lorsque la subroutine se termine. Ca fonctionne très bien...
... sauf si la fonction est appelé une deuxième fois. Dans ce cas là, il y a un conflit avec la variable déjà enregistrée.
Est-ce que quelqu'un aurait une solution pour sauvegarder ces matrices de façon indépendante?
Merci d'avance.
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
      subroutine sbilin(table,x,y,step,z)
      Implicit none
c Fonction d'interpolation bilinéaire
c table : nom du fichier
c X : première variable
c Y : seconde variable
c step : permet de ne sauvegarder qu'une seule fois la table
c Z : variable de sortie
 
      double precision :: x,y,z,num
      real,save :: xmin,xmax,ymin,ymax
      integer,save :: xn,yn
      integer :: i,i1,i2,j1,j2,ierr,step
      real,save,allocatable,dimension(:,:,:) :: m
      character(len=2000) :: string
      character*(*) :: table
 
      if (step==0) then
c Cette étape ne sera effectuée qu'une seule fois, elle permet de sauvegarder le fichier de données sous forme d'une matrice 
c Comptage du nombre de colonne 
      open(unit=11,file=table)
      read(11,fmt="(a)",iostat=ierr) string
      yn=1
      do i = 2, len_trim(string)
      if ( (string(i:i)=='	') .and. (string(i-1:i-1) /= '	') ) then
           yn=yn+1
      end if
      end do
      yn=yn-1
 
c Comptage du nombre de ligne
      xn=-1
      do while (ierr==0)
      read(11,*,iostat=ierr)
      xn=xn+1
      end do
      close(11)
 
c Creation de la matrice      
      allocate(m(0:xn,0:yn,1:10000))
      open(unit=11,file=table)
c Lecture du fichier et enregistrement dans une matrice      
      do i=0,xn
      read (11,*) m(i,:)
      end do
      close(11)   
 
 
c Définition de xmin,xmax,ymin, ymax,xmin
      xmin=m(1,0)
      xmax=m(xn,0)
      ymin=m(0,1)
      ymax=m(0,yn)
 
      step=1
      end if