Download as pdf or txt
Download as pdf or txt
You are on page 1of 42

Uvod u FORTRAN-90

Numericke metode

Ivo Batistic
Fizicki odsjek, PMF
Sveucilite u Zagrebu

predavanja 2005/2006, dopunjeno 2007

Pregled predavanja
Uvod
Primjer FORTRANskog programa
Prevodenje
u izvrni program

Fortran-90 i Fortran-77
Prevodenje
fortranskog programa

Objektni zapis i izvrni program


Naredbe u FORTRANskom programu
Automatizacija poslova

Uvod

Fortran je prvi tz. programski jezik vie razine. Programski jezici


vie razine su: C, C++, Ada, Pascal, Cobol, . . . .
(programski jezik nie razine je npr. Assembler ili Assembly
language)

Fortran je razvijen 50-tih godina prolog stoljeca u IBM-u.


Ocem Fortrana smatra se John Backus.

(http://www-history.mcs.st-andrews.ac.uk/Biographies/Backus.html)

Fortran postaje komercijalno dostupan 1957. godine.


(2007. je pedesetogodinjica Fortrana.)

Fortran je skracenica od The IBM Mathematical Formula


Translating System.

Razvoj Fortrana

Fortran kao jezik za programiranje definiran je nizom pravila koja


se vremenom nadograduju.
Nadogradnja je motivirana

prilagodavanju
Fortrana
suvremenim
konceptima u programiranju

(objektno programiranje) kao i olakavanju uporabe Fortrana u


razvijanju aplikacija.

Postoji medunarodno
tijelo (povjerenstvo) koje se donosi odluke i

preporuke o nadogradnji Fortrana


(http://www.nag.co.uk/sc22wg5/).

Razvoj Fortrana moe se podjeliti u nekoliko stadija:

FORTRAN (1957)
FORTRAN II (1958)
FORTRAN IV (1961)
FORTRAN 66 (1966)

FORTRAN 77 (1977)
Fortran 90 (1992)
Fortran 95
Fortran 2003
Fortran 2008

Razvoj Fortrana

Radi se na razvijanju Fortrana 2008 koji c e vjerojatno ukljucivati


dodatne pravila za razvoj programa na vieprocesorskim
racunalima i grozdovima.

Nezavisno od medunarodnih
pravila, svaka tvrtka koja razvija

Fortranski prevoditelj ima neka svoja dodatna proirenja jezika,


ali i neke nedostatke u potovanju i primjeni dogovorenih pravila.
Tu je obicno rijec o nekim svojstvima koja se c esto ne koriste.
(Treba uvijek nastojati razvijati program prema dogovorenim i
prihvacenim standardima, a ne koristiti svojstva specificna za
Fortran neke tvrtke.)

ala: Kako c e izgledati programski jezik za razvoj znanstvenih


aplikacija u buducnosti?

Razvoj Fortrana

Radi se na razvijanju Fortrana 2008 koji c e vjerojatno ukljucivati


dodatne pravila za razvoj programa na vieprocesorskim
racunalima i grozdovima.

Nezavisno od medunarodnih
pravila, svaka tvrtka koja razvija

Fortranski prevoditelj ima neka svoja dodatna proirenja jezika,


ali i neke nedostatke u potovanju i primjeni dogovorenih pravila.
Tu je obicno rijec o nekim svojstvima koja se c esto ne koriste.
(Treba uvijek nastojati razvijati program prema dogovorenim i
prihvacenim standardima, a ne koristiti svojstva specificna za
Fortran neke tvrtke.)

ala: Kako c e izgledati programski jezik za razvoj znanstvenih


aplikacija u buducnosti?

Razvoj Fortrana

Radi se na razvijanju Fortrana 2008 koji c e vjerojatno ukljucivati


dodatne pravila za razvoj programa na vieprocesorskim
racunalima i grozdovima.

Nezavisno od medunarodnih
pravila, svaka tvrtka koja razvija

Fortranski prevoditelj ima neka svoja dodatna proirenja jezika,


ali i neke nedostatke u potovanju i primjeni dogovorenih pravila.
Tu je obicno rijec o nekim svojstvima koja se c esto ne koriste.
(Treba uvijek nastojati razvijati program prema dogovorenim i
prihvacenim standardima, a ne koristiti svojstva specificna za
Fortran neke tvrtke.)

ala: Kako c e izgledati programski jezik za razvoj znanstvenih


aplikacija u buducnosti?
To nitko ne zna, ali c e se sigurno zvati Fortran!

Jednostavni FORTRANski program

! komentar
Program hello
print *,Pozdrav svijetu
end program

Naredbe u FORTRANu: program, end, print


To su rezervirane rijeci koje se ne smiju koristiti za
imena varijabli, funkcija, procedura, programa itd.
Naredbe pocinju i zavravaju u jednom redu.
Komentar pocinje s usklicnikom !
String je omeden
s jednostrukim navodnim znakom ()

Jednostavni FORTRANski program

! komentar
Program hello
print *,Pozdrav svijetu
end program

Naredbe u FORTRANu: program, end, print


To su rezervirane rijeci koje se ne smiju koristiti za
imena varijabli, funkcija, procedura, programa itd.
Naredbe pocinju i zavravaju u jednom redu.
Komentar pocinje s usklicnikom !
String je omeden
s jednostrukim navodnim znakom ()

Usporedba s C-programom

/* komentar */
#include <stdio.h>
main()
{
printf("Pozdrav svijetu!\n");
}

Naredba za ispis: printf


String je omeden
s dvostrukim navodnim znakom (").
Naredbe Naredbe mogu ici preko vie linija a zavravaju s
tocka-zarezom (;).
Komentar pocinje s /* a zavrava s */.

to raditi s FORTRANskim programom ?

Spremiti program u datoteku koja zavrava s .f90, npr. datoteku


s imenom hello.f90.

Kompajlirati program ili


prevesti program napisan u fortanskom jeziku u izvrni program
(mainski).
Kako ? Pomocu prevoditelja ili engl. compiler-a - kompajlera :

prompt> ifort hello.f90 -o hello.exe

to raditi s FORTRANskim programom ?

Spremiti program u datoteku koja zavrava s .f90, npr. datoteku


s imenom hello.f90.

Kompajlirati program ili


prevesti program napisan u fortanskom jeziku u izvrni program
(mainski).
Kako ? Pomocu prevoditelja ili engl. compiler-a - kompajlera :

prompt> ifort hello.f90 -o hello.exe

to raditi s FORTRANskim programom ?

ifort je fortranski prevoditelj, koji je napravio Intel.

hello.exe je izvrni program:

prompt> ./hello.exe
Pozdrav svijetu
prompt>

Imena datoteka s FORTRANskim programom

Nastavke .f90 imaju datoteke napisane u Fortranu-90.

Za programe napisane u fortranu-77 uobicajeno je koristiti


nastavak .f.

Nastavci mogu biti i .for, .hpf, .f95, .F, F90, .F95, .FOR,
.HPF, .fpp, . . . .

Nastavci s velikim slovima c esto oznacavaju programe koji


sadre pseudo-fortranske naredbe. Takova datoteka prolazi
dodatnu obradu (s tz. predprocesorskim programom) prije
konacnog prevodenja
u objektnu datoteku.

Usporedba FORTRANa-77 i FORTRANa-90

Fortran-90

! komentar
Program hello
print *,Pozdrav svijetu
end program

Fortran-77

c234567890123456789012345678901234567890
c komentar
c234567890123456789012345678901234567890
Program hello
print *,Pozdrav svijetu
end program

O FORTRANu-77

Koristi se fiksni format zapisa programa:

mjesta 1-5 u retku se koriste za labela.


popunjeno 6. mjesto indicira da je linija nastavak fortranske
naredbe iz prethodne linije.
mjesta 7-72 rezervirana za pisanje fortranskih naredbi.

nema naredbi koje rade s vektorima i matricama.


Fortran-90 ima naredbe koje rade s vektorima i matricama (tj.
skupovima podataka)

O FORTRANu-90

Koristi se slobodni format zapisa programa:

Mjesta 1-6 nisu rezervirana


Naredba u liniji moe biti vrlo dugacka
Naredba se nastavlja na slijedeci red ako zavrava s
ampersandom (&) na kraju
Na istoj liniji moe biti vie naredbi, a medusobno
su razdvojene s

tocka-zarezom (;).

Fortran-90 ima naredbe koje rade s vektorima i matricama.

Bolja kontrola nad vrstama podataka

Dinamicko rezerviranje memorije skupove podataka (velike


matrice ili vektore).

primjer FORTRAN-77

c234567890123456789012345678901234567890
c komentar
c234567890123456789012345678901234567890
Program hello
print *,Pozdrav i mir cijelom
& svijetu
go to 100
print *,ovo nece biti ispisano
100
continue
end program

naredba go to 100 forsira program da se nastavi izvoditi od


mjesta oznacenog s labelom 100

continue ne c ini ita, program se naprosto nastavlja od tog mjesta


nadalje.

primjer FORTRAN-77

c234567890123456789012345678901234567890
c komentar
c234567890123456789012345678901234567890
Program hello
print *,Pozdrav i mir cijelom
& svijetu
go to 100
print *,ovo nece biti ispisano
100
continue
end program

naredba go to 100 forsira program da se nastavi izvoditi od


mjesta oznacenog s labelom 100

continue ne c ini ita, program se naprosto nastavlja od tog mjesta


nadalje.

primjer FORTRAN-90

Program hello
print *,Pozdrav i mir cijelom &
svijetu
print *,svim bicima ; print *,u svemiru i okolici
End program

& (ampersand, and) oznacava nastavak naredbe u slijedeci red

; (tocka-zarez) razdvaja vie fortranskih naredbi

primjer FORTRAN-90

Program hello
print *,Pozdrav i mir cijelom &
svijetu
print *,svim bicima ; print *,u svemiru i okolici
End program

& (ampersand, and) oznacava nastavak naredbe u slijedeci red

; (tocka-zarez) razdvaja vie fortranskih naredbi

O fortranskim prevoditeljima

Linux

Intelovi prevoditelji - slobodni za personalnu uporabu, ali uz


registraciju na njihovom web-site-u:
http://developer.intel.com/software/products/
Gnu prevoditelji: gfortran, gcc, g++, . . .
NAG prevoditelj: f95 - moe se dobiti trial verzija s njihovog
web-site-a: http://www.nag.com/
PGI prevoditelji: pgcc, pgf77, pgf90, pghpf, . . . - moe se dobiti
trial verzija s njihovog web-site-a: http://www.pgroup.com/

MS-windows:

F-Fortran - web-site: http://www.fortran.com/F/


gnu-Forran - web-site: http://www.cygwin.com/
Salford FTN95 - moe se dobiti besplatna personalna verzija na
njihovom web-site: http://www.silverfrost.com/
Lahey/Fujitsu Fortran - moe se dobiti trial verzija s njihovog
web-site-a: http://www.lahey.com/downloads.htm

Prevodenje
(kompailiranje)

prompt>

ifort

hello.f90

Program za prevodenje

-o

hello.exe

(naredba)

(f95 za NAGov prevoditelj, pgf90 za PGI prevoditelj, gfortran za


GNU)

Ime datoteke
s fortranskim programom. Nastavak .f90
indicira da se radi o Fortranu-90 u slobodnom formatu
zapisanom.

Iza

ove opcije

slijedi ime

izvrnog programa

Ime izvrnog programa moe biti bilo to, npr. hello ili hello.x ili
olleh ili virus.com
(Ipak dobro se je konzistentno drati odredenog
pravila)

Najcece koritene opcije kod prevoditelja

-o xxx.exe

Ime izvrnog programa

-O

Optimiziraj izvrni program

-c

Ne napravi kompletni izvrni program


nego samo napravi datoteku s tz. objektnim zapisom.
(Datoteka zavrava s .o ili .obj kod MS windows-a.)

-llapack

koristi biblioteku pomocnih programa


(soubrutine-a) liblapack.a ili liblapack.so

-L /usr/lib/

Biblioteku trai na tom mjestu na disku racunala

Primjeri prevodenja

prompt> ifort -O -c hello.f90

(rezultat prevodenja
je hello.o)

prompt> ifort -O hello.o -o hello.exe \


-L/usr/local/lib -llapack -lblas

Primjeri prevodenja
pod MS-windowzima

Setting Environment for FTN95 for Microsoft .NET and Win32


C:\Program Files\Salford Software\FTN95>z:
Z:\>cd mrvicaxp\NM_01
Z:\mrvicaxp\NM_01>ftn95 hello
[FTN95/Win32 Ver. 4.9.0 Copyright (C) Silverforst Ltd 1993-2005]
NO ERRORS [<HELLO> FTN95/Win32 v4.9.0]
Z:\mrvicaxp\NM_01>slink hello.obj
Creating executable: Z:\mrvicaxp\NM_01\hello.exe
Z:\mrvicaxp\NM_01>hello.exe
hello world

to je hello.o a to hello.exe

Objekti zapis (hello.o) je tocni ili ekvivalentni optimizirani mainski


zapis (prijevod) programa, s tim da ne postoje:

dijelovi mainskog programa koji se brinu za razmjenu podataka


s vanjskim jedinicama racunala (tipkovnica, ekran, tvrdi disk,
CD/DVD, mrea, ...)

dijelovi mainskog programa vanjskih funkcija i podprograma koje


program poziva (koristi).

to je hello.o a to hello.exe
Postoje dvije vrste izvrnih programa hello.exe: staticki povezani i oni
koji se dinamicki povezuju prije samog izvodenja.

Staticki povezani izvrni programi su gotovo potpuni, osim to im


jo nedostaje dio programa za komunikaciju s vanjskim
jedinicama racunala.

Dinamicki povezanim programima nedostaju i vanjske funkcije i


potprogrami koji se nalaze u dinamickim bibliotekama. Dinamicka
biblioteka se kopira u glavnu memoriju racunala u trenutku
izvodenja,
ako nije vec prije tamo iskopirana.

Svi programi izvode se unutar nekog operacijskog sustava. Izmedu

programa i vanjskih jedinica uvijek stoji operacijski sustav. Pristup do


njih je moguc samo kroz posredovanje operacijskog sustava.

Kako znati je li je program dinamicki ili staticki povezan ?

prompt> ldd hello.exe


linux-gate.so.1 => (0xffffe000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f18000)
libcxa.so.5 => /opt/intel/intel_fc_80/lib/libcxa.so.5 (0xb7ef2000)
libunwind.so.5 => /opt/intel/intel_fc_80/lib/libunwind.so.5 (0xb7eec000)
libc.so.6 =>
/lib/tls/i686/cmov/libc.so.6
(0xb7db6000)
/lib/ld-linux.so.2 (0xb7f60000)
prompt>

Dinamicke biblioteke

potprograma koje se povezuju u trenutku izvodenja.

prompt> ldd hello_static.exe


not a dynamic executable
prompt>

Struktura/format izvrnog programa

prompt> size hello.x


text
data
bss
302911
24616
10236

dec
337763

hex filename
52763 hello.x
za ELF-format (linux)

text Mainske naredbe programa.


data Podaci i konstante s unaprijed poznatim vrijednostima.
bss Podaci c ije vrijednosti nisu unaprijed poznate.
dec Ukupna velicina svih sekcija.

Primjer FORTRANskog programa s varijablama

Program

PROGRAM hello
CHARACTER(len=10) :: poruka
poruka = Pozdrav svijetu
PRINT *,poruka
END PROGRAM

Izvodenje

prompt> ./hello.exe
Pozdrav sv
prompt>

Primjer FORTRANskog programa s varijablama

Naredba CHARACTER(len=10) :: poruka rezervira mjesto u


memoriji i toj memorijskoj lokaciji daje ime poruka.

U nastavku programa, kada se navede rijec poruka, onda to


znaci bilo da se u tu memorijsku lokaciju stavljaju podaci, bilo da
se iz te memorijske lokacije izvlace podaci kako bi se negdje za
neto iskoristili.

Naredba poruka = Pozdrav svijetu znaci "u memorijsku lokaciju


poruka upii string Pozdr .... Ocito 10 bytova nije dovoljno za
cijeli string, pa je upisano samo prvih 10.

Naredba PRINT *,poruka kae iz memorijske lokacije poruka


uzmi podatke pa ih proslijedi podprogramu PRINT radi ispisa.

Jo jedan primjer programa

PROGRAM zbroji
INTEGER :: a
a = 1
a = a + 1
PRINT *,a
END PROGRAM

Naredba INTEGER :: a rezervira memorijsku lokaciju pod


imenom a u koju kanimo spremati cijele brojeve.

Naredba a = 1 u memorijsku lokaciju a sprema broj jedinicu.

Naredba a = a + 1 uzima sadraj memorijske lokacije a, njemu


pribraja jedinicu te rezultat pribrajanja ponovo stavlja u
memorijsku lokaciju a.

Jo jedan primjer programa

Naredba a = a + 1 u matematici je besmislena. Naredbe u


programu ne smijemo identificirati kao matematicke operacije.

Varijable a nisu matematicke varijable nego imena memorijskih


lokacija.

Naredba a = . . . znaci ono to je izracunato na desnoj strani


znaka jednakosti spremi u memorijsku lokaciju a.

Dio naredbe a+1 znaci uzmi sadraj iz memorijske lokacije a i


pribroji mu jedinicu.

Znak jednakosti nije znak jednakosti iz matematike nego


premjetanje rezultata desne strane u neku memorijsku lokaciju
naznacenu s imenom na lijevoj strani.

imati naredbu a + 1=a. Na lijevoj strani treba biti


Nije moguce
ime neke memorijske lokacije.

Jo jedan primjer programa

Kod izvodenja
dijela naredbe a+1, uzmi sadraj iz memorijske

lokacije a i pribroji mu jedinicu, ocito da treba imati neki


privremeni neimenovani memorijski prostor za njegovo
provodenje.

Program prevoditelj c e se pobrinuti za rezervaciju te privremene


memorijske lokacije.

Ako bi pisali program u assembleru, mainskom jeziku, onda bi


mi bili ti koji bi morali voditi racuna u tim privremenim
memorijskim lokacijama.

Make naredba
Makefile datoteka:

FC = ifort
FFLAGS =
# =======================
all: hello.exe
hello.exe: hello.f90
$(FC) $(FFLAGS) hello.f90 -o $@
clean:
rm -f *.o *.exe

prompt> make
ifort hello.f90 -o hello.exe

Make naredba

make omogucuje automatizaciju prevodenja


aplikacije.

Ako se u imeniku nalazi datoteka Makefile tada c e naredba make


izvravati one naredbe definirane u sekciji all (default-na
sekcija/cilj).

Ili, naredba make cilj izvravat c e one naredbe koje su definirane


u sekciji cilj.
Npr. naredba make clean c e izbrisati datoteke koje zavravaju s
*.o ili *.exe, one koje su rezultat prevodenja.

Ako hello.exe ima noviji datum stvaranja od hello.f90, naredba


make nece nita raditi.

Makefile datoteka

Prvi dio Makefile datoteke

FC = ifort
FFLAGS =

Prva linija definira varijablu koja sadri ime prevoditelja

Druga linija definira varijablu koja sadri opcije koje dajemo


prevoditelju. U ovom slucaju tih opcija nema.

Drugi dio Makefile datoteke


all: hello.exe
hello.exe : hello.f90
$(FC) $(FFLAGS) hello.f90 -o

$@

clean:
rm -f *.o *.exe
all je ime sekcije ili cilja koji se izvodi kada ni jedna sekcija nije
dana kao argument make naredbi.
Iza dvoto
cke slijedi ime datoteke koja mora postojati, ili biti
napravljena, da bi se cilj mogao ostvariti (uvjet).
Iza linije s imenom cilja slijedi niz linija koje po
cinju s TABom i
koje sadre komande koje je potrebno izvriti da bi se cilj ostvario.
Kao ime cilja, tj. hello.exe moe se koristiti $@.

Sloenija Makefile datoteka


FC = ifort
FFLAGS =
LFLAGS =
# =======================
.SUFFIXES: .f90 .exe .o
.f90.o:
$(FC) $(FFLAGS) -c $<
.o.exe:
$(FC) $< -o $@ $(LFLAGS)
# =======================
all: hello.exe
hello.exe: hello.f90
clean:
rm -f *.o *.exe

MS windoz-verzija Makefile datoteke


FC = ftn95
FFLAGS =
LINK = slink
LFLAGS =
# =======================
all: hello.exe
hello.obj: hello.f90
$(FC) $(FFLAGS) hello
hello.exe: hello.obj
$(LINK) $<
clean:
del *.obj *.exe

Vrste podataka - slijedece predavanje


U FORTRANu postoji nekoliko osnovnih vrsta podataka, te veci broj
njihovih podvrsta.
Niz znakova ili string odredene
duljine. Memorijska lokacija se

rezervira i imenuje naredbom CHARACTER(len=...) ::


ime.
Cijeli brojevi koji po apsolutnoj vrijednosti nisu veci od nekog
maksimalnog broja. Memorijska lokacija se imenuje i
rezervira naredbom INTEGER :: ime.
Realni brojevi koji imaju ogranicen broj decimalnih mjesta, i manji su
po iznosu od nekog maksimalno moguceg.
Logicki podaci: istina ili la.
Iz ovih osnovnih podataka (i njihovih podvrsta) moguce se konstruirati
sloenije podatke.

You might also like