Cicli in Fortran
I cicli consentono di eseguire una sequenza di
istruzioni più di una volta
due tipi:
Cicli iterativi
Cicli while
Ciclo Iterativo
DO indice=inizio,fine,incremento
istruzione 1
istruzione 2
……………
END DO
blocco
indice è una variabile intera ed è utilizzatata
come contatore del ciclo
inizio, fine, incremento sono parametri
incremento è facoltativo se è omesso si assume
che è uguale a 1
Ciclo Iterativo
1) inizio, fine, incremento possono essere costanti,
variabili o espressioni;
se sono variabili o espressioni devono essere
valutate prima del ciclo
2) all’inizio del ciclo il programma pone indice=inizio
se indice*incremento =< fine*incremento
il programma esegue le istruzioni all’interno del ciclo
Ciclo Iterativo3) eseguite le istruzioni all’interno del ciclo il
programma pone indice=indice+incremento
se indice*incremento =< fine*incremento
vengono eseguite nuovamente le istruzioni del ciclo
4) si ripete il punto 3) finchè
indice*incremento =< fine*incremento
quando questa condizione non è più vera viene
eseguita la prima istruzione dopo il ciclo
5) Si eseguono
n.iter.= (fine-inizio+incremento)/incremento
Ciclo Iterativo (esempi)
DO i=1,10,2
istruzione
……………
END DO
5 iterazioni
DO i=3,-3,-2
istruzione
……………
END DO
4 iterazioni
Istruzione CYCLE
Istruzione CYCLE interrompe l’esecuzione delle
istruzioni del ciclo e fa ritornare all’inizio del ciclo
L’indice del ciclo viene incrementato e l’esecuzione
delle istruzioni del ciclo riprende se l’indice non ha
raggiunto il suo valore
Istruzione CYCLE (esempio)
PROBLEM esempio
INTEGER :: I
DO i=1,10
IF ( i == 3 ) CYCLE
WRITE(*,*) i
END DO
END PROGRAM esempio
Si stampano tutti i numeri interi compresi tra 1 e 10
Escluso il numero 3
Istruzione EXIT
Istruzione EXIT interrompe l’esecuzione delle
istruzioni del ciclo, fa uscire dal ciclo
Viene eseguita la prima istruzione dopo END DO
del ciclo
Istruzione EXIT (esempio)
PROBLEM esempio
INTEGER :: I
DO i=1,10
IF ( i == 3 ) EXIT
WRITE(*,*) i
END DO
END PROGRAM esempio
Si stampa solamente il numero 1
Ciclo while
DO WHILE (espressione logica)
istruzione 1
istruzione 2
……………
END DO
blocco
quando l’espressione logica è .TRUE. il blocco
delle istruzioni del ciclo vengono ripetute
quando l’espressione logica è .FALSE. viene
eseguita la prima istruzione dopo END DO
Ciclo while
DO
…………...
IF (espressione logica) EXIT
……………
END DO
blocco
quando l’espressione logica è .TRUE. il blocco
delle istruzioni del ciclo vengono ripetute
quando l’espressione logica è .FALSE. viene
eseguita la prima istruzione dopo END DO
PROBLEM esempio
DOUBLE PRECISION :: var,eps
eps=1.D0
DO
var=1.D0+eps
IF ( var.EQ.1.D0) EXIT
eps=eps/2.d0
END DO
WRITE(*,*) ‘ eps =’, eps
END PROGRAM esempio
Ciclo while
Cicli DO con nome
DO indice = inizio, fine, incremento
…………...
…………...
IF (espressione logica) CYCLE
……………
……………
END DO
[nome]
[nome]
[nome]
Cicli DO con nome
DO
…………...
IF (espressione logica) CYCLE
……………
END DO
…………...
IF (espressione logica) EXIT
……………
[nome]
[nome]
[nome]
[nome]
SUBROUTINE
SUBROUTINE nome_subr ( lista_argomenti )
sezione esecutiva
sezione dichiarativa
RETURN
END SUBROUTINE nome_subr
SUBROUTINE
PROGRAM nome_prog
CALL nome_subr ( lista_argomenti )
END PROGRAM nome_prog
SUBROUTINE
1) ogni subroutine è compilata separatamente dal programma principale e da altre subroutine quindi può usare le stessi nomi delle variabili e le stesse etichette utilizzate dal programma principale o da altre subroutine
2) l’ordine e il tipo degli argomenti della chiamata devono corrispondere a quelli della definizione
SUBROUTINE
PROGRAM mainINTEGER, PARAMETER :: n=2DOUBLE PRECISION :: f,x(n)
END PROGRAM main
CALL funct( n,x,f )
SUBROUTINE funct(n,x,f ) INTEGER :: n DOUBLE PRECISION :: f,x(n)
Istruzione INTENT
INTENT(IN) l’argomento è un dato di input
INTENT(OUT) l’argomento è un dato di output
INTENT(IN OUT) l’argomento è sia un dato di input che di output
se l’istruzione INTENT è assente l’argomento è sia un dato di input che di output
Istruzione INTENT
SUBROUTINE funct(n,x,f ) INTEGER, INTENT(IN) :: n DOUBLE PRECISION, INTENT(IN) :: x(n) DOUBLE PRECISION, INTENT(OUT) :: f
FUNCTION
FUNCTION nome_funct ( lista_argomenti )
sezione esecutiva nome_funct=espressione
sezione dichiarativa
RETURN
END FUNCTION nome_funct
PROGRAM nome_prog
var=nome_funct( lista_argomenti )
END PROGRAM nome_prog
FUNCTION
Calcolo del gradiente approssimato
xfxfx
yxf
0
lim,
0 ,0)(
)(,
app
troncapp
err
errerrxfxfx
yxf
Calcolo del gradiente approssimato
xfxfx
yxf
0
lim,
0 ,0)(
)(,
app
troncapp
err
errerrxfxfx
yxf
xfxf
xyxf
,
per valori di sufficientemente piccoli
Forward formula
xfxfx
yxf , Backward formula
2
,
xfxfx
yxf Symmetric formula
Calcolo del gradiente approssimato
subroutine gradapp(n,x,f)................................. call funct(n,x,f) do i=1,n z=x z(i)=x(i)+eps call funct(n,z,fp) g(i)=(fp-f)/eps end do return end subroutine gradapp
Generatore di Numeri Pseudo-casuali
RANDOM_NUMBER(x)
x è un REAL
ritorna un valore estratto da una sequenza di numeri pseudo-casuali
il valore restituito nella variabile x è compreso tra 0 (incluso) e 1 (escluso)
10 x
Gen. di Num. Cas. (esempio di numero in [l,u) )
PROGRAM num_cas implicit none real :: num double precision, parameter :: l=-10, u=10 double precision :: dnum,x call RANDOM_NUMBER(num) dnum=dble(num) x=l+dnum*(u-l) stopend program num_cas
Sequenza pesudo-casuale
seed della sequenza
… s … …s … …s
circa 1018 numeri circa 1018 numeri
Inizializzazione della sequenza
RANDOM_SEED()
imposta l’innesco della sequenza random s ad un valore ottenuto sulla base del tempo di sistema.
se CALL RANDOM_SEED() precedel’istruzione CALL RANDOM_NUMBER(num)ad ogni esecuzione del programma vengonogenerati numeri differentialtrimenti vengono generati gli stessi numeri
Top Related