Fortran - Arrays

Gli array possono memorizzare una raccolta sequenziale di dimensioni fisse di elementi dello stesso tipo. Un array viene utilizzato per memorizzare una raccolta di dati, ma spesso è più utile pensare a un array come una raccolta di variabili dello stesso tipo.

Tutti gli array sono costituiti da posizioni di memoria contigue. L'indirizzo più basso corrisponde al primo elemento e l'indirizzo più alto all'ultimo elemento.

Numeri (1) Numeri (2) Numeri (3) Numeri (4) ...

Gli array possono essere unidimensionali (come i vettori), bidimensionali (come le matrici) e Fortran consente di creare array fino a 7 dimensioni.

Dichiarazione di array

Gli array vengono dichiarati con l'estensione dimension attributo.

Ad esempio, per dichiarare una matrice unidimensionale denominata numero, di numeri reali contenenti 5 elementi, scrivi,

real, dimension(5) :: numbers

Si fa riferimento ai singoli elementi degli array specificandone i pedici. Il primo elemento di un array ha un pedice di uno. La serie di numeri contiene cinque variabili reali: numeri (1), numeri (2), numeri (3), numeri (4) e numeri (5).

Per creare una matrice bidimensionale di numeri interi 5 x 5 denominata matrice, scrivi:

integer, dimension (5,5) :: matrix

Puoi anche dichiarare un array con un limite inferiore esplicito, ad esempio:

real, dimension(2:6) :: numbers
integer, dimension (-3:2,0:4) :: matrix

Assegnazione di valori

Puoi assegnare valori a singoli membri, come,

numbers(1) = 2.0

oppure puoi usare un loop,

do i  =1,5
   numbers(i) = i * 2.0
end do

Agli elementi di array unidimensionali possono essere assegnati direttamente valori utilizzando un simbolo a mano breve, chiamato costruttore di array, come,

numbers = (/1.5, 3.2,4.5,0.9,7.2 /)

please note that there are no spaces allowed between the brackets ‘( ‘and the back slash ‘/’

Esempio

L'esempio seguente mostra i concetti discussi sopra.

program arrayProg

   real :: numbers(5) !one dimensional integer array
   integer :: matrix(3,3), i , j !two dimensional real array
   
   !assigning some values to the array numbers
   do i=1,5
      numbers(i) = i * 2.0
   end do
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
   !assigning some values to the array matrix
   do i=1,3
      do j = 1, 3
         matrix(i, j) = i+j
      end do
   end do
   
   !display the values
   do i=1,3
      do j = 1, 3
         Print *, matrix(i,j)
      end do
   end do
   
   !short hand assignment
   numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
end program arrayProg

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

2.00000000    
 4.00000000    
 6.00000000    
 8.00000000    
 10.0000000    
         2
         3
         4
         3
         4
         5
         4
         5
         6
 1.50000000    
 3.20000005    
 4.50000000    
0.899999976    
 7.19999981

Alcuni termini relativi agli array

La tabella seguente fornisce alcuni termini relativi agli array:

Termine Senso
Rango È il numero di dimensioni di un array. Ad esempio, per la matrice denominata matrice, il rango è 2 e per la matrice denominata numeri, il rango è 1.
Estensione È il numero di elementi lungo una dimensione. Ad esempio, i numeri della matrice hanno estensione 5 e la matrice denominata matrice ha estensione 3 in entrambe le dimensioni.
Forma La forma di una matrice è una matrice intera unidimensionale, contenente il numero di elementi (l'estensione) in ciascuna dimensione. Ad esempio, per la matrice dell'array, la forma è (3, 3) e i numeri dell'array è (5).
Taglia È il numero di elementi contenuti in un array. Per la matrice di array, è 9 e per i numeri di array è 5.

Passaggio di array alle procedure

È possibile passare un array a una procedura come argomento. Il seguente esempio dimostra il concetto:

program arrayToProcedure      
implicit none      

   integer, dimension (5) :: myArray  
   integer :: i
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      

   integer, dimension (5), intent (out) :: a
   
   ! local variables     
   integer :: i     
   do i = 1, 5         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)

   integer, dimension (5) :: a  
   integer::i
   
   do i = 1, 5
      Print *, a(i)
   end do
   
end subroutine printArray

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

1
2
3
4
5

Nell'esempio precedente, le subroutine fillArray e printArray possono essere chiamate solo con array con dimensione 5. Tuttavia, per scrivere subroutine che possono essere utilizzate per array di qualsiasi dimensione, è possibile riscriverle utilizzando la seguente tecnica:

program arrayToProcedure      
implicit  none    

   integer, dimension (10) :: myArray  
   integer :: i
   
   interface 
      subroutine fillArray (a)
         integer, dimension(:), intent (out) :: a 
         integer :: i         
      end subroutine fillArray      

      subroutine printArray (a)
         integer, dimension(:) :: a 
         integer :: i         
      end subroutine printArray   
   end interface 
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      
   integer,dimension (:), intent (out) :: a      
   
   ! local variables     
   integer :: i, arraySize  
   arraySize = size(a)
   
   do i = 1, arraySize         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)
implicit none

   integer,dimension (:) :: a  
   integer::i, arraySize
   arraySize = size(a)
   
   do i = 1, arraySize
     Print *, a(i)
   end do
   
end subroutine printArray

Tieni presente che il programma utilizza l'estensione size funzione per ottenere la dimensione dell'array.

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

1
2
3
4
5
6
7
8
9
10

Sezioni array

Finora ci siamo riferiti all'intero array, Fortran fornisce un modo semplice per fare riferimento a diversi elementi, o una sezione di un array, utilizzando una singola istruzione.

Per accedere a una sezione della matrice, è necessario fornire il limite inferiore e superiore della sezione, nonché un passo (incremento), per tutte le dimensioni. Questa notazione è chiamata asubscript triplet:

array ([lower]:[upper][:stride], ...)

Quando non vengono menzionati limiti inferiore e superiore, il valore predefinito è l'estensione dichiarata e il valore di stride predefinito è 1.

Il seguente esempio dimostra il concetto:

program arraySubsection

   real, dimension(10) :: a, b
   integer:: i, asize, bsize
   
   a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
   a(8:) = 0.0  ! rest are 0.0 
   b(2:10:2) = 3.9
   b(1:9:2) = 2.5
   
   !display
   asize = size(a)
   bsize = size(b)
   
   do i = 1, asize
      Print *, a(i)
   end do
   
   do i = 1, bsize
      Print *, b(i)
   end do
   
end program arraySubsection

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
0.00000000E+00
0.00000000E+00
0.00000000E+00
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010

Funzioni intrinseche degli array

Fortran 90/95 fornisce diverse procedure intrinseche. Possono essere suddivisi in 7 categorie.

  • Moltiplicazione di vettori e matrici

  • Reduction

  • Inquiry

  • Construction

  • Reshape

  • Manipulation

  • Location