Fortran 90 Numeričke Metode DECEMBAR 2007. ĐURĐEVAC NATAŠA
Zašto Fortran? jer je konstruisan da bi se koristio za rešavanje matematičkih problema. jer je jednostavan jezik sa dobrim performansama (odlična podrška za brz i jednostavan rad sa kompleksnim brojevima, matricama i vektorima). jer je najpopularniji p. jezik za rešavanje problema iz oblasti numeričkih metoda (Scientific computing)
Fortran ili C++? In the early 1990s, C++ programs were much slower than their Fortran counterparts -- typical benchmarks showed C++ lagging behind Fortran's performance by anywhere from 20% to a factor of ten. Users of C++ often rewrote the number crunching parts of their programs in Fortran to get acceptable performance. In the past five years, the performance of C++ programs has improved markedly due to a combination of better optimizing C++ compilers and new library techniques (Blitz++). Now, C++ has caught up with Fortran and is giving it stiff competition (http://www.oonumerics.org/blitz/)
Literatura: knjiga; disk Filipa Marića GNU Fortran 95 compiler (Windows, Linux), Salford Fortran 95 Compiler 4.8.0 ( Windows), Intel Fortran 95 Compiler (Linux). e-knjige. Kod-ovi. vežbe;
Osnovni elementi jezika :!prvi primer =komentar program hello!ime programa je hello implicit none!neophodno zbog pravila iz f77 (tamo nije bila neophodna deklaracija svih prom. vec je kompajler to sam radio na osnovu imena promenljivih) write (*, *) Hello, world!! Prvo * je za std.izlaz, a drugo * za listu prom.koja se ispisuje end program hello!kraj programa
Tipovi podataka: <tip pod.>(<opc. atr.>)* :: <ime prom.>(=init vr.)* (,<ime promenljive> >(=inicijalna vrednost)*)* tip pod.: character za stringove (dužina mora da se navede prilikom deklaracije i ne može da se menja) logical za istinitosne vrednosti integer za cele brojeve real za realne brojeve complex za kompleksne brojeve
program deklaracije implicit none! Deklarišu se promenljive.! Realni brojevi. real :: masa, visina! Karakter.Kad se ne zada duzina stringa podrazumeva se da je 1. Nije terminiran nulom. character :: c! Niska. character(len=5) :: hello! Ceo 16-bitan broj.kind odredjuje sirinu u bajtovima. Podrazumevana vr.za kind je 4. integer(kind=2) :: brojac! Realan broj sirine 8 bajtova. real(kind=3) :: duzina
! Kao logicke konstante se koriste!.true. i.false.! Logicka promenljiva. logical :: zastavica=.true.! Kompleksan broj. complex :: i=(0,1), comp comp = 4 + i write(*,*) 'Kompleksan broj', comp! Niska. character(len=4) :: poruka1='blah'! Moze i: character(len=4) :: poruka2="blah"! Niska koja sadrzi apostrof: character(len=5) :: poruka3= 'ajde"
! Jos jedna niska :) character(len=42) :: poruka4="in the beginning the Universe was created"! Ispisuje se vrednost promenljive poruka4. write(*,*) poruka4! Deklaracija konstantne promenljive,atribut parameter. integer, parameter :: answer=42 real, parameter :: pi=3.14! Ucitava se promenljiva duzina: read(*,*) duzina! Uvecava se duzina za 1, i zatim ispisuje na ekran. duzina = duzina + 1 write(*,*) duzina
! Izvedeni, korisnicki tip, tacka u 3D prostoru. type tacka real :: x1, x2, x3 end type tacka type(tacka) :: a type(tacka) :: b! Referenciranje izvedenog tipa. a%x1 = 2.3 a%x2 = 3.14 a%x3 = 0 write(*,*) 'A je tacka i ima koordinate', a%x1, a%x2, a%x3 end program deklaracije
Izrazi : Aritmetički operatori +,-,*,/,**. Relacioni operatori ==, /=, <,<=,>,>=. Logički operatori.nor.(negacija),.and.,.or.,.eqv. Operator konkatenacije // Konverzija int(),real(),cmplx() Matematičke f-je sqrt(),exp(), log(),sin(),cos(),abs(),min(), max()
program operatori implicit none real, parameter :: dva=2.00 real :: x, y x = 2.71 y = 10.00 write(*,*) 'x + y je', x+y! Zbir celog i realnog broja je realan broj. write(*,*) 1 + 2.45 write(*,*) 'Koren iz dva je', dva ** 0.5! Kosinus korena iz 3 je: write(*,*) cos(sqrt(3.0)) end program operatori
Kontrolne strukture : Naredba grananja if (log.izraz) then blok naredbi elseif (log.izraz) then else blok naredbi blok naredbi end if select case
program case implicit none integer :: x x = 4 select case (x) case(:6) write(*,*) 'prvi slucaj' case(7, 9, 10) write(*,*) 'drugi slucaj' case default write(*,*) 'treci slucaj' end select end program case
Napisati program koji za unete realne brojeve a,b,c resava kvadratnu jednacinu ax^2+bx+c=0.
Petlje do blok naredbi end do do i=poc,kraj blok naredbi end do do while (uslov) blok naredbi end do
program petlja1 implicit none integer :: i, j! Do petlja. do i=1,10 if (sin(real(i)) > 0) write(*,*) i, sin(i+0.0) end do! Do while petlja. do while(i<20) write(*,*) i i = i + 1 end do
j = 0! Cycle - naredba za prelazak na sledeci krug! petlje. do i=1,30 j = j + 1 if (i>20) cycle write(*,*) i end do write(*,*) 'j ima vrednost', j end program petlja1
Napisati program koji racuna n-ti clan Fibonacijevog niza. Neka su prvi i drugi clan jedinice, a svaki naredni clan zbir prethodna dva.
Nizovi : Jednodimenzioni i visedimenzioni nizovi. tip, DIMENSION( (indeks:indeks)+ ) :: ime1, ime2,..., imen ime ( ceo broj )=vrednost
program nizovi implicit none integer :: I! Deklaracija niza integer, dimension(0:2) :: niz real, dimension(-2:4) :: niz2!inicijalizacija 1-dim niza integer, dimension(0:4) :: nule=(/0,3,0,9,0/)! Dvodimenzioni niz real, dimension(0:2, 2:7) :: niz3! Inicijalizacija vise-dim niza: real, dimension(0:2, 0:2) ::eye=reshape((/1,0,0,0,1,0,0,0,1/),(/3,3/))
niz(0) = 3 niz(1) = 5 niz(2) = -25 niz3(0,4) = 4.4343! Ispis vrednosti write(*,*) niz3(0,4) nule(1) = (nule(1)) ** 2 do i=0,4 write(*,*) nule(i) end do end program nizovi
Nizovi promenljive dužine: tip, DIMENSION(:,:),allocatable :: ime1,ime2,..., imen Alociranje i dealociranje niza: allocate(ime(ind1:ind2, )) deallocate(ime) Napisati program kojim se racuna nedijagonalna norma matrice (koren iz zbira kvadrata svih elemenata koji nisu na dijagonali)
! Program racuna koren iz zbira kvadrata svih elemenata koji nisu na dijagonali. program nednorma implicit none integer :: n! Dimenzija matrice real, dimension (:,:), allocatable :: a! Matrica integer :: i, j! Brojaci u petljama real :: rezultat! Konacni rezultat! Ucitava se dimenzija matrica. read (*,*) n! Alocira se prostor. allocate(a(1:n, 1:n))
! Ucitava se matrica! read(*,*) ucitava matricu kolonu po kolonu,! a ne vrstu po vrstu. read (*,*) a rezultat = 0 do i=1, n do j=1, n if (i/=j) then rezultat = rezultat + a(i,j) ** 2 endif end do end do rezultat = rezultat ** 0.5 write (*,*) "Rezultat je ", rezultat deallocate(a); end program nednorma
Procedure i funkcije tip FUNCTION (SUBROUTINE) ime f-je (arg1, arg2,..., argn) Deklarisanje prom. (spec. tip,intent(in/out/inout) :: arg1, argn) Naredbe (za f-je ime f-je=.vrednost) END FUNCTION (SUBROUTINE) ime f-je Poziv u programu Za f-je : Za procedure : prom=ime f-je( ); call ime proc( ). Rekurzivne f-je : recursive ispred function, tj. subroutine
Napisati f-ju koja racuna euklidsku normu vektora. Napisati funkciju trag() koja racuna trag matrice.
Programi i moduli Programi su namenjeni izvrsavanju, a moduli grupisanju deklaracija i procedura koje se koriste u vecem broju programa. Moduli: module <ime-modula> implicit none public <ime-prom.> contains end module <ime-modula>
Korišćenje modula u programu program <ime programa> use <ime modula> implicit none end <ime programa> (norma.f90)