Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per...

Post on 08-May-2018

217 views 1 download

Transcript of Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per...

Fortran per Ingegneri

Lezione 5

A.A. 2013/2014

Ing. Davide Vanzo davide.vanzo@unitn.it

Ing. Simone Zen simone.zen@unitn.it

ufficio:

Laboratorio didattico di modellistica ambientale (2° piano)

Tel interno: 2488

2

FILE PROCESSING

I dati da processare sono immagazzinati all'interno di files. Si pone il problema di

leggere questi dati, di processarli e di immagazzinare i risultati in un nuovo file .

Nelle istruzioni WRITE(*,*) e READ(*,*) l'asterisco nella prima posizione

indica dove andare a scrivere e da dove leggere i dati.

* ----> indica la standard input/output device (sui pc sono la tastiera e il video).

Spesso vengono usati anche il 5 per indicare la tastiera e il 6 per il video

WRITE(6,*) ----> scrivi su video

READ(5,*) ----> leggi da tastiera

 

3

ISTRUZIONE OPEN (apertura file)

OPEN (open_list)

La open_list è una lista di opzioni che contiene il numero

dell'unità da aprire, il nome del file, e informazioni su come

accedere al file. Le singoli opzioni sono separate da una virgola.

4

ISTRUZIONE OPEN (apertura file)

unit  indica il numero dell'unità associato al file da aprire

unit = numero intero

Le 5 più importanti opzioni per l'istruzione open sono...

file  specifica il nome del file da aprire

file = è un valore carattere

5

ISTRUZIONE OPEN (apertura file)

status  indica lo status del file da aprire

status = 'old' status = 'new'

status = 'scratch'** status = 'unknown'

       status = 'replace'

action  specifica se un file deve essere aperto solo in lettura,

solo in scrittura o entrambi

action = 'read', action = 'write', action = 'readwrite',

**file temporaneo (usare con cautela)

6

ISTRUZIONE OPEN (apertura file)

iostat=inter_var indica il nome della variabile intera in cui viene inserito un numero intero che dice se l'operazione di open è stata eseguita correttamente o meno.

inter_var = 0--> apertura/lettura corretta

inter_var >  0 --> errore nella lettura o nel formato,

inter_var <  0----> indica che è stata raggiunta la fine del file)

INTEGER:: status

OPEN(UNIT=8,FILE='esempio.dat',status='old',action='read', &

iostat=status)

Write(*,*)status

7

ISTRUZIONE CLOSE (chiusura file)

Quando si finisce di utilizzare un file è buona norma chiudere il

file lasciando libera così l'unità di i/o associata.

ES:

CLOSE(unit)

8

Apertura di un file di lunghezza ignota

9

10

Vettori e Matrici a più dimensioni (Terminologia)Un array (vettore o matrici a più dimensioni) permette di specificare

con un nome ed un insieme di indici una serie di elementi in modo molto semplice. Ogni array ha un tipo ed ogni elemento è di tale tipo. La terminologia relativa agli array è la seguente:

• RANGO (RANK) - Numero di dimensioni

A(n,m) ==> rank 2; A(n,m,l) ==> rank=3

• LIMITI (BOUNDS) - Limite superiore ed inferiore di ogni

dimensione

A(5,10) ==> lower bound = 1 per entrambe le dimensioni

==> upper bound = 5 e 10

B(-2:7 , 0:12) ==> lower bound = -2 per prima dim e 0 per seconda dim

==> upper bound = 7 e 12

11

Vettori e Matrici (Terminologia)

ESTENSIONE (EXTENT) - Numero di elementi in ogni dimensione

B(-2:7 , 0:12) ==> extension = 10 per prima dim e 13 per seconda dim

•GRANDEZZA (SIZE) - Numero totale di elementi

B(-2:7 , 0:12) ==> size = 23

•FORMA (SHAPE) - Rango ed estensione

•CONFORMI (CONFORMABLE) - Stessa forma

12

Array bidimensionali (rank=2)

Col 1 Col 2 Col 3 Col 4 Col 5

Riga 1

Riga 2

Riga 3

Riga 4

Sono utili quando si devono immagazzinare alcuni tipi di dati che sono

funzione di più variabili indipendenti. ES 1: Misure di temperature in 4

differenti tempi in 5 sezioni diverse.

a11

a21

a31

a41 a42 a43 a44 a45

a11 a12 a13 a14 a15

a22

a32a32 a33 a34 a35

a23 a24 a25

13

Lettura da file degli elementi degli array

INITIAL.DAT 1 2 34 5 67 8 93 9 2

           

REAL, DIMENSION(4,3) :: array_rank2 ! Questo è un array di dimensione 2­­> rank=2

OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read')

do i =1,4

 READ(7,*) array_rank2(i,1),array_rank2(i,2),array_rank2(i,3)

end do  

21

4

7

3

5

8

9

3

6

9

2

array_rank2(4,3)

Per ogni riga i, leggo i 3 elementi

sulle colonne

14

Lettura da file degli elementi degli array

Lettura con istruzione READ

INITIAL.DAT

1 1 1 1 2 2 2 2 3 3 3 3

INTEGER, DIMENSION(4,3) :: istat

OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read')

READ(7,*) istat

  

21

1

1

1

2

2

2

3

3

3

3

INTEGER, DIMENSION(4,3) :: istat

In assenza di istruzioni diverse, i dati vengono letti in colonna

15

Lettura da file degli elementi degli array

Lettura con istruzione READ

INITIAL.DAT

1 2 3 1 2 3 1 2 3 1 2 3

INTEGER::i,j

INTEGER, DIMENSION(4,3) :: istat

OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read')

READ(7,*) ((istat(i,j),j=1,3),i=1,4)

  

21

1

1

1

2

2

2

3

3

3

3

16

Array subset

21

4

7

10

5

8

11

3

1

9

12

A =A(:,1)=

1

4

7

10

A(1,:)= 21 3

real,dimension(4,3)::A

Somma   = sum(A(:,1))    = 22.0  (reale)

massimo = maxval(A(:,2)) = 11.0  (reale)

pos_min = minloc(A(2,:)) = 3     (intera)

17

Array multidimensionali

Il fortran suporta al massimo array che al massimo hanno 7 subscript,

cioè rank=7

REAL, DIMENSION (10,10,20):: array_1

REAL, DIMENSION (10,10,20,30):: array_2

REAL, DIMENSION (10,10,10,50,50,100):: array_3

REAL, DIMENSION (5,7,2,2,2,3,3):: array_max_rank

18

Funzioni intrinseche per array

REAL,DIMENSION(4):: x=(/0.,3.141592,1.,2./)

REAL, DIMENSION(4)::y

INTEGER:: i

y = sin(x)             !Operazione su intero array

DO i=1,4

  y(i) = sin(x(i))     !Operazione elemento per elemento

END DO

Elemental intrinsic function

19

Funzioni intrinseche per array

ALLOCATED(array)      Determina lo stato di allocazione

LBOUND(array,DIM)     Indica i lower bound di  array

UBOUND(array,DIM)     Indica gli upper bound di array 

SHAPE(array)          Ritorna la forma di array

SIZE(array,DIM)       Ritorna l'estensione di array

Inquiry functions

20

Funzioni intrinseche per array

DOT_PRODUCT(vector_a,vector_b) :: calcola il prodotto di due array con size =

MATMUL(matrix_a,matrix_b) :: prodotto matriciale

MAXLOC(array):: ritorna la locazione del massimo di array

MINLOC(array):: ritorna la locazione del minimo di array

MAXVAL(array):: ritorna il valore massimo di array 

MINVAL(array):: ritorna il valore minimo di array 

SUM(array):: calcola la somma degli elementi di un array

Transformational intrinsic function

21

ESERCIZIO 1Leggere 10 dati contenuti in un file (che dovete generare) e calcolare

la media e la deviazione standard. Scrivere i risultati in un file di

output.

Leggere i dati di portata contenuti nel file 'portata.txt' (3 colonne n

righe) e salvarli in 2 array time (INTEGER, rango 2) e Q (REAL,

rango 1).

Calcolare:

- portata media giornaliera (mc/s)

- portata massima giornaliera (mc/s) e ora

- portata minima giornaliera (mc/s) e ora

- rapporto tra portata massima e minima giornaliera (-)

Scrivere i risultati in un file di output.

ESERCIZIO 2