Fortran per Ingegneri Lezione 5 A.A. 0/04 Ing. Davide Vanzo davide.vanzo@unitn.it Ing. Simone Zen simone.zen@unitn.it ufficio: Laboratorio didattico di modellistica ambientale ( piano) Tel interno: 488
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
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.
ISTRUZIONE OPEN (apertura file) Le 5 più importanti opzioni per l'istruzione open sono... unit indica il numero dell'unità associato al file da aprire unit = numero intero file specifica il nome del file da aprire file = è un valore carattere 4
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) 5
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 6
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) 7
Apertura di un file di lunghezza ignota 8
9
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 ; A(n,m,l) ==> rank= LIMITI (BOUNDS) - Limite superiore ed inferiore di ogni dimensione A(5,0) ==> lower bound = per entrambe le dimensioni ==> upper bound = 5 e 0 B(-:7, 0:) ==> lower bound = - per prima dim e 0 per seconda dim ==> upper bound = 7 e 0
Vettori e Matrici (Terminologia) ESTENSIONE (EXTENT) - Numero di elementi in ogni dimensione B(-:7, 0:) ==> extension = 0 per prima dim e per seconda dim GRANDEZZA (SIZE) - Numero totale di elementi B(-:7, 0:) ==> size = FORMA (SHAPE) - Rango ed estensione CONFORMI (CONFORMABLE) - Stessa forma
Array bidimensionali (rank=) Riga a a a a4 a5 Riga a a a a4 a5 Riga a a a a4 a5 Riga 4 a4 a4 a4 a44 a45 Col Col Col Col 4 Col 5 Sono utili quando si devono immagazzinare alcuni tipi di dati che sono funzione di più variabili indipendenti. ES : Misure di temperature in 4 differenti tempi in 5 sezioni diverse.
Lettura da file degli elementi degli array array_rank(4,) INITIAL.DAT 4 5 6 7 8 9 9 Per ogni riga i, leggo i elementi sulle colonne 4 7 5 8 9 6 9 REAL, DIMENSION(4,) :: array_rank! Questo è un array di dimensione > rank= OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read') do i =,4 READ(7,*) array_rank(i,),array_rank(i,),array_rank(i,) end do
Lettura da file degli elementi degli array Lettura con istruzione READ INITIAL.DAT INTEGER, DIMENSION(4,) :: istat OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read') READ(7,*) istat In assenza di istruzioni diverse, i dati vengono letti in colonna INTEGER, DIMENSION(4,) :: istat 4
Lettura da file degli elementi degli array Lettura con istruzione READ INITIAL.DAT INTEGER::i,j INTEGER, DIMENSION(4,) :: istat OPEN (7,FILE='initial.dat'STATUS='old',ACTION='read') READ(7,*) ((istat(i,j),j=,),i=,4) 5
Array subset A = 4 7 5 8 9 A(:,)= 4 7 A(,:)= 0 0 real,dimension(4,)::a Somma = sum(a(:,)) =.0 (reale) massimo = maxval(a(:,)) =.0 (reale) pos_min = minloc(a(,:)) = (intera) 6
Array multidimensionali Il fortran suporta al massimo array che al massimo hanno 7 subscript, cioè rank=7 REAL, DIMENSION (0,0,0):: array_ REAL, DIMENSION (0,0,0,0):: array_ REAL, DIMENSION (0,0,0,50,50,00):: array_ REAL, DIMENSION (5,7,,,,,):: array_max_rank 7
Funzioni intrinseche per array Elemental intrinsic function REAL,DIMENSION(4):: x=(/0.,.459,.,./) REAL, DIMENSION(4)::y INTEGER:: i y = sin(x)!operazione su intero array DO i=,4 y(i) = sin(x(i))!operazione elemento per elemento END DO 8
Funzioni intrinseche per array Inquiry functions 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 9
Funzioni intrinseche per array Transformational intrinsic function 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 0
ESERCIZIO Leggere 0 dati contenuti in un file (che dovete generare) e calcolare la media e la deviazione standard. Scrivere i risultati in un file di output. ESERCIZIO Leggere i dati di portata contenuti nel file 'portata.txt' ( colonne n righe) e salvarli in array time (INTEGER, rango ) e Q (REAL, rango ). 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.