fortran per ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · fortran per...

21
Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo [email protected] Ing. Simone Zen [email protected] ufficio: Laboratorio didattico di modellistica ambientale (2° piano) Tel interno: 2488

Upload: dinhkhuong

Post on 08-May-2018

217 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

Fortran per Ingegneri

Lezione 5

A.A. 2013/2014

Ing. Davide Vanzo [email protected]

Ing. Simone Zen [email protected]

ufficio:

Laboratorio didattico di modellistica ambientale (2° piano)

Tel interno: 2488

Page 2: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

 

Page 3: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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.

Page 4: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 5: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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)

Page 6: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 7: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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)

Page 8: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

8

Apertura di un file di lunghezza ignota

Page 9: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

9

Page 10: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 11: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 12: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 13: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 14: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 15: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 16: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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)

Page 17: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 18: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 19: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 20: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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

Page 21: Fortran per Ingegneri - web.unitn.itweb.unitn.it/files/download/34153/lezione_5.pdf · Fortran per Ingegneri Lezione 5 A.A. 2013/2014 Ing. Davide Vanzo davide.vanzo@unitn.it Ing

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