Bonjour à vous,

Je débute en Fortran et j'ai un problème qui peut se résumer ainsi. Je dispose de deux programmes utilisant exactement les mêmes datas et qui doivent être inclus dans une procédure récursive. J'aimerais pouvoir charger une fois pour toute ces datas, au lieu de les recharger à chaque fois que je re rentre dans la boucle.

Dans un premier programme, j'ai les déclarations suivantes :

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
program main
  implicit none
  
  integer, parameter :: nbniv=220
  integer, parameter :: nfreq=3000
  real, dimension(nbniv) :: ener,g
  integer, dimension(nbniv) :: n,charge,nlast,llast,nel_eq
  integer, dimension(3) :: i0_ion
  integer, dimension(10) :: aa, bb
  real, dimension(10) :: corr_ener
  real, dimension(nbniv,nbniv) :: a,c,s,rrad,t
  real, dimension(nbniv-1,nbniv-1) :: q
  real, dimension(nbniv-1) :: y
  real, dimension(nbniv) :: pop,boltz

...
...

open(10,file='donnes_LIBS_clair',form='formatted',status='unknown')
  read(10,'(a14,a15,a14)') tex6,tex7,tex8
  do Z=1,val
     read(10,'(e16.7,e16.7,e16.7)',iostat=ios) tps,densi,temp
     if (Z==1) then
        call modstat(temp,densi,choix,pop,poptot0,ener,g,nlast,llast,nel_eq,charge,a)
        !pause
     else
        call modnonstat(temp,densi,choix,pop,poptot0,ener,g,nlast,llast,nel_eq,charge,a)
        !pause
     endif
  enddo
  close(10)
Les six derniers arguments sont en fait les data communes aux programmes. La taille de ces data est annoncée en gras plus haut.

Donc dans les procédures modstat et modnonstat, j'utilise la syntaxe suivante :

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
SUBROUTINE modnonstat(telec,dens,choix,pop,poptot0,ener,g,nlast,llast,nel_eq,charge,a)
      implicit none
      
      integer, parameter :: nbniv=220 
      integer, parameter :: nfreq=3000 
      integer, dimension(nbniv) :: n
      integer, dimension(3) :: i0_ion
      integer, dimension(10) :: aa, bb
      real, dimension(10) :: corr_ener
      real, dimension(nbniv,nbniv) :: c,s,rrad,t,q
      real, dimension(nbniv) :: y
      real, dimension(nbniv) :: boltz
      real, dimension(*) :: pop,ener,g
      real, dimension(*,*) :: a
      integer, dimension (*) :: charge,nlast,llast,nel_eq
Cette déclaration (dimension (*)) marche bien pour les vecteurs, mais pas pour la matrice a(nbniv, nbniv). En effet, quand on compile avec g95 le code :
In file modnonstat.f90:14

real, dimension(*,*) :: a
1
Error: Bad specification for assumed size array at (1)
Auriez vous des conseils à me donner concernant cette erreur ? La syntaxe de déclaration en dimension(*) est elle correcte, ou y'a t'il une méthode alternative ?

Merci d'avance pour vos réponses !