460 likes | 568 Views
ENIAC E lectronic N umerical I ntegrator A nd C omputer. Fortran FORmula TRANslation. Linguaggio di programmazione in ambito scientifico ed ingegneristico. Fasi principali nella scrittura di un programma 1. EDITING : scrittura al calcolatore salvataggio su disco rigido del programma
E N D
Fortran FORmula TRANslation Linguaggio di programmazione in ambito scientifico ed ingegneristico
Fasi principali nella scrittura di un programma 1. EDITING: scrittura al calcolatore salvataggio su disco rigido del programma si usa un programma apposito (editor) RISULTATO: file sorgente (CIAO.F90) 2. COMPILAZIONE trasformazione in un linguaggio COMPRENSIBILE dalla CPU si usa un programma apposito (compilatore) RISULTATO: file oggetto (CIAO.OBJ) 3. COLLEGAMENTO trasformazione in un linguaggio eseguibile dalla CPU si usa un programma apposito (collegatore o linker) RISULTATO: file eseguibile (CIAO.EXE) 4. ESECUZIONE/VERIFICA si fa eseguire il programma se l’esecuzione è quella attesa, allora abbiamo terminato altrimenti, dobbiamo ritornare alla FASE 1
EDITING scrittura del programma con un editor salvarlo come nome.f90 nome e’ libero Aprire una finestra Linux ed eseguire i seguenti comandi COMPILAZIONE ifort -c nome.f90 RISULTATO: file oggetto nome.o COLLEGAMENTO ifort nome.o –o nome.exe RISULTATO: file eseguibile nome.exe COMPILAZIONE + COLLEGAMENTO ifort nome.f90 –o nome.exe RISULTATO: file eseguibile nome.exe ESECUZIONE eseguire il programma nome.exe
PROGRAM ciao ! Questo programma stampa un messaggio sullo schermo WRITE (*,*) ’CIAO ! ’ STOP END PROGRAM ciao
Struttura di un programma F90 PROGRAMnome-programma IMPLICIT NONE [sezione dichiarativa] [sezione esecutiva] [sezione di sottoprogrammi] END PROGRAMnome-programma nome-programma è il nome del programma sezione dichiarativa, sezione esecutiva, e sezione di sottoprogrammisono opzionali. Sebbene IMPLICIT NONE sia opzionale, è bene inserirlo per scrivere un programma sicuro.
Commenti in un programma I commenti cominciano con! Servono al programmatore, il computer li ignora ! Esempio ! PROGRAM Commenti .......... READ(*,*) anno ! leggi il valore dell’anno .......... anno = anno + 1 ! aggiungi 1 al valore dell’anno .......... END PROGRAM Commenti
Continuazione di una linea • Fortran 90 ha un formato quasi completamente libero • Scrivere un codice in formato leggibile !! • Ogni istruzione deve cominciare con una nuova linea. • Se l’istruzione è troppo lunga (> 132 caratteri) per stare in una linea deve essere continuata sulla successiva. • Il carattere di continuazione è &e non fa parte dell’istruzione. Totale = Totale + & A * B ! Totale = Totale + A*B PROGRAM & LineaContinuazione ! PROGRAM LineaContinuazione
Alfabeto • L’alfabeto delFortran 90 include: • lettere maiuscole e minuscole • numeri • caratteri speciali spazio ' " ( ) * + - / : = _ ! & $ ; < > % ? , . • Spazio bianconon deve apparire • entro una parola chiave INTEGER e non INTE GER • entro un identificatore nome e non nom e • deve apparire • tra due parole chiave • tra una parola chiave ed un identificatore
SEZIONE DICHIARATIVA
IDENTIFICATORI • Un identificatore (nome per indicare costanti, variabili ed unità del programma) non può avere più di 31 caratteri. • Il primo deve essere una lettera. I restanti caratteri, se ci sono, possono essere lettere, numeri o segno di sottolineatura. • A Name toTAL123 System_ • myFile_01 my_1st_F90_program_X_ • Gli identificatori sono indipendenti dai caratteri maiuscolo e minuscolo. Name nAmE naME NamE sono lo stesso identificatore. • Evitare di usare parole chiave (READ IF PROGRAM) come identificatori per evitare confusione.
TIPO DEGLI IDENTIFICATORI type-specifier :: list type-specifierINTEGER REAL LOGICAL COMPLEX CHARACTER list è una sequenza di identificatori separati da virgola. INTEGER :: Zip, Totale, angolo REAL :: AVERAGE, x, Differenza LOGICAL :: Condizione, OK COMPLEX :: Coniugato
Una variabileintegerè una stringa di numeri con un segno opzionale: 12345 +12345-345+789 +0 • Una variabile real ha due forme, decimale ed esponenziale: Forma decimale: è una stringa di numeri con un punto. Può avere un segno 2.45 .13 13. -0.12 -.12 • Forma esponenziale: inizia con un intero/reale seguito da E/e seguito da un intero (l’esponente). • 12E3 (12×103) -12e3 (-12×103) -12.e3 (-12×103) • 3.4E-8 (3.4×10-8) -3.4e-8 (-3.4×10-8) 0E0 (0×100=0) • 12.34-5 errato !
Una variabile logicalè .true. o .false. • Una stringacharactero una variabile characterè una stringa di caratteri racchiusa tra apici o doppi apici • “abc” ‘Giovanni’ “#$%^” ‘()()’
Le variabili CHARACTER richiedono la lunghezza della stringa di caratteri. • CHARACTER deve essere seguita da (LEN = l) , dove l è la lunghezza della stringa. • Se la lunghezza è 1, si può usare CHARACTER senza specificare la lunghezza. CHARACTER(LEN=20) :: Pippo, Casa CHARACTER(20) :: Pippo, Casa Le variabili Pippo e Casa possono contenere fino a 20 caratteri. CHARACTER :: alfa alfa può contenere 1 solo carattere (cioè LEN=1).
Costanti in Fortran PARAMETER associa ad un identificatore un valore che non può più essere modificato: definisce una costante con nome. L’attributo PARAMETER è usato dopo la dichiarazione di tipo Ciascun identificatore è seguito da = e dal valore di quell’identificatore. INTEGER, PARAMETER :: MASSIMO = 10 REAL, PARAMETER :: PI = 3.1415926, E = -2.9 LOGICAL, PARAMETER :: VERO = .true., FALSO = .false. CHARACTER(LEN=2), PARAMETER :: NO = “no” ! Len = 2 CHARACTER(LEN=*), PARAMETER :: & Domanda = “Cosa vuoi?” ! Len = 10
Le stringhe hanno lunghezza fissa • • Se una stringa è più lunga della (LEN=…) di PARAMETER è troncata a destra. • Se una stringa è più corta spazi sono aggiunti a destra. CHARACTER(LEN=4), PARAMETER :: ABC = “abcdef” CHARACTER(LEN=4), PARAMETER :: XYZ = “xy” ABC = XYZ =
SEZIONE ESECUTIVA
INIZIALIZZAZIONE DI UNA VARIABILE • Inizializzazione: fatta prima dell’esecuzione del programma. • Assegnazione: fatta quando il programma esegue un’istruzione di assegnazione. • Input: fatta con un’istruzione READ. INTEGER, PARAMETER :: Quanti = 10 INTEGER :: Case, sassi …. case = 5 …. READ (*,*) sassi
Struttura dell’istruzione di assegnazione: variabile = espressione Effetto dell’istruzione di assegnazione: 1. valuta espressione 2. assegna a variabile il valore ottenuto: modifica variabile non modifica espressione A = 0 A = A + 1 A = B
Espressioni Per costruire un’espressione possiamo usare • Operatori aritmetici • Operatori relazionali • Operatori logici
Operatori aritmetici • + addizione • - sottrazione • * moltiplicazione • / divisione • ** elevamento a potenza • NB: esistono predefinite regole di precedenza tra gli • operatori numerici: • ** Precedenza più alta • * o / • + o - Precedenza più bassa • Operatori relazionali • > < >= <= == /+ • Operatori logici • .AND. .OR. .NOT.
Conversione di tipo implicita In espressioni miste (cioè che contengono sia reali sia interi), viene effettuata automaticamente la conversione da intero a reale. REAL :: A A=6.*3 ! → 6.*3. = 18. A=5.-5/2 ! → 5.-2. = 3. A=5.-5./2 ! → 5.-2.5 = 2.5 A=2 ! A=2. Conversione di tipo esplicita REAL(A) reale corrispondente ad A INT(A) intero corrispondente ad A (troncamento) NINT(A) intero corrispondente ad A (arrotondamento)
Istruzioni condizionali di diramazione IF “logico”: IF (espressione logica) istruzione IF THEN ELSE [nome:] IF (espressione logica 1) THEN sequenza di istruzioni 1 ELSE IF (espressione logica 2) THEN [nome] sequenza di istruzioni 2 ELSE [nome] sequenza di istruzioni 3 END IF [nome]
SELECT CASE (espressione di CASE) CASE (selettore 1) sequenza di istruzioni 1 CASE (selettore 2) sequenza di istruzioni 2 CASE DEFAULT sequenza di istruzioni 3 END SELECT • espressione di CASE deve essere di tipo INTEGER o CHARACTER o LOGICAL • END SELECT è obbligatorio • CASE DEFAULT non è obbligatorio
Iterazione definita DO indice = inizio,fine [,incremento] sequenza di istruzioni END DO • indice è una variabile di tipo INTEGER • inizio, fine e incremento sono espressioni di tipo INTEGER • incremento è OPZIONALE, se assente implicitamente vale 1 • NESSUNA variabile che occorre in inizio, fine e incremento può essere cambiata in sequenza di istruzioni
Iterazione indefinita DO sequenza di istruzioni 1 IF espressione logica EXIT sequenza di istruzioni 2 END DO DO sequenza di istruzioni 1 IF espressione logica CYCLE sequenza di istruzioni 2 END DO sequenza di istruzioni 1 oppure sequenza di istruzioni 2 può essere vuota (non entrambe) EXIT interrompe l’esecuzione del ciclo DO CYCLE l’esecuzione del ciclo DO riprende dalla prima istruzione del ciclo
Lettura da tastiera READ(*,*) listaInput Primo argomento: dispositivo da cui leggere le informazioni (se asterisco è il dispositivo standard) Secondo argomento: informazioni di formattazione (se asterisco formattazione standard) listaInput è un elenco di variabili separate da virgole I valori digitati devono essere dello stesso tipo delle variabili (e anche nello stesso ordine)
Scrittura su schermo WRITE(*,*) listaOutput Primo argomento: dispositivo su cui scrivere le informazioni (se asterisco è il dispositivo standard) Secondo argomento: informazioni di formattazione (se asterisco formattazione standard) listaOutput è un elenco di variabili, costanti, funzioni ed espressioni separate da virgole
Ciclo DO implicito WRITE (*,*) (val1,val2,...., i = inizio,fine[,passo]) READ (*,*) (valore(i), i = inizio,fine[,passo]) WRITE (*,*) (valore(i), i = inizio,fine[,passo])
ARRAY Sequenza di variabili TUTTE DELLO STESSO TIPO (tutte intere, tutte reali, . . . ) identificate da un nome • array monodimensionale = VETTORE • array bidimensionale = MATRICE • array tridimensionale • array n-dimensionale (con n fino a 7) • Le variabili degli array (solitamente) occupano posizioni consecutive
tipo, DIMENSION( [estremo inferiore:] estremo superiore) :: nome array tipo può essere qualsiasi (INTEGER, REAL, LOGICAL, CHARACTER()). estremo inferiore è OPZIONALE, implicitamente vale 1 il numero di elementi dell’array è : estremo superiore - estremo inferiore + 1. estremo superiore ed estremo inferiore devono essere costanti di tipo INTEGER. nome array segue le stesse regole dei nomi di variabili e costanti Poiché un elemento di array è una variabile, può essere usato ogni volta che è lecito usare una variabile
INTEGER, DIMENSION(5) :: a INTEGER, DIMENSION(−1:3) :: b
Le operazioni aritmetiche possono essere applicate agli array, purché abbiano la stessa forma INTEGER, DIMENSION(5) :: risultato INTEGER, DIMENSION(−1:3) :: vettore_1 INTEGER, DIMENSION(12:16) :: vettore_2 risultato = vettore_1 + vettore_2 risultato = vettore_1 - vettore_2 risultato = vettore_1 * vettore_2 risultato = vettore_1 / vettore_2 risultato = vettore_1 ** vettore_2 Le operazioni vengono effettuate elemento per elemento Per fare il prodotto scalare occorre usare la funzione implicitaDOT PRODUCT(vettore_1 , vettore_2) E’ sempre possibile effettuare operazioni tra array e scalari
FUNZIONI INTRINSECHE DEGLI ARRAY MAXVAL(A, D): restituisce un array che contiene i valori massimi di A lungo la dimensione D (se la D è omessa, restituisce il valore massimo dell' intero array) MAXLOC(A) : restituisce la locazione di memoria del valore max lungo D di A SUM(A, D) : restituisce un array che contiene le somme degli elementi di A lungo la dimensione D (se la D è omessa, restituisce la somma degli elementi dell' intero array) MATMUL(A, B) : restituisce il prodotto di A e B TRANSPOSE(A) : restituisce la trasposta della matrice 2d A
Assegnazione di memoria per gli ARRAY REAL, DIMENSION(:,:), ALLOCATABLE :: A …….. ALLOCATE(A(N, N), STAT = AllocateStatus) IF (AllocateStatus/ = 0) then WRITE (*,*) " * * * non abbastanza memoria* * * " STOP ENDIF …… DEALLOCATE (A, Stat = DeAllocateStatus)
SEZIONE di SOTTOPROGRAMMI
2 tipi di unità di programma SUBROUTINE FUNCTION
SUBROUTINE SUBROUTINE nome subroutine ( lista argomenti FITTIZI ) sezione dichiarativa sezione esecutiva [RETURN] END SUBROUTINE nome subroutine Per invocare una subroutine è necessario utilizzare l’istruzione CALL CALL nome subroutine(lista argomenti)
Esistono tre modalità (INTENT) distinte per ogni parametro passato: INTENT(IN) INTENT(OUT) INTENT(IN OUT) La modalità va decisa a seconda del verso della comunicazione fra unità chiamante e unità chiamata, utilizzando opportunamente l’attributo INTENT
PROGRAM chiama REAL :: a,b,c a=3. b=5. CALL prod (a,b,c) WRITE (*,*) c END PROGRAM chiama SUBROUTINE prod (m1,m2,p) REAL,INTENT(IN) :: m1,m2 REAL,INTENT(OUT) :: p P=m1*m2 END SUBROUTINE prod
Generazione di numeri casuali con distribuzione uniforme 0-1 REAL :: casuale CALL RANDOM_SEED CALL RANDOM_NUMBER(casuale)
FUNZIONI • Funzione (ad un solo valore): legge che associa ad ogni gruppo di • valori in ingresso un solo valore. • Due meccanismi per utilizzare funzioni matematiche: • Funzioni intrinseche • Funzioni esterne • Le funzioni possono essere utilizzate nelle espressioni • anche all’interno di altre funzioni • nelle espressioni le funzioni possono essere considerate equivalenti ad una costante o una variabile
FUNCTION FUNCTION nomefunction ( lista argomenti ) sezione dichiarativa TIPO :: nomefunction sezione esecutiva nomefunction = espressione [RETURN] END FUNCTION [nome function] Le funzioni definite dall’utente possono essere utilizzate come qualsiasi funzione implicita. Non possono essere utilizzate nella parte sinistra di una istruzione di assegnazione. Forma equivalente: TIPO FUNCTION nome function( lista argomenti )
Differenze delle FUNCTION rispetto alle SUBROUTINE: • Restituiscono un valore • Il tipo di tale valore va dichiarato opportunamente • Vengono chiamate all’interno di espressioni • Nell’invocazione, non va usata la parola chiave CALL I parametri in ingresso non dovrebbero mai essere modificati