Upload
dinhkhuong
View
220
Download
1
Embed Size (px)
Citation preview
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
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