You are on page 1of 10

Univerzitet u Tuzli Mainski fakultet

RAUNARI I PROGRAMIRANJE
Fortran 90, osnove

Dr. Salko Dosid

kolska 2010/2011
1

Dinamika alokacija Dinamike i statike biblioteke, Windows aplikacije Generator sluajnih brojeva, PRIMJERI

DINAMIKA ALOKACIJA MEMORIJSKOG PROSTORA ZA NIZOVE I MATRICE ALLOCATABLE odgoena deklaracija, trenutno nepoznata format matrice Primjer: Real allocatable A(:), B(:,:) Allocate (A(57),B(12,12)) Oslobaanje prostora: Deallocate (A,B)

Primjer:
Mjerenjem promjene neke fizike veliine (npr. temperatura/vrijeme) dolazi se do diskretnog skupa rezultata mjerenja. Rezultati su ispisani u datoteku mjerenja.dat. Napraviti program koji ita rezultate mjerenja, za iste, metodom najmanje kvadratne greke, odreuje najbolju aproksimativnu linearnu zavisnost te ispisuje u eksternu datoteku dijagram.dat vrijednosti potrebne za grafiki prikaz aproksimacije.

program Lin_regresija ! ovaj program vrsi aproksimaciju diskretnog skupa tacaka datih u eksternom file-u u linearnu ! funkcionalnu zavisnost primjenom metode najmanjih kvadrata implicit none integer:: i,N,ulaz,izlaz; real:: a,b,Y; real, allocatable:: U(:,:); character (15) velicina1,velicina2; ulaz=11; ! logicka jedinica iz koje se citaju diskretne vrijednosti (eksterni file) open (ulaz,file='mjerenja.dat',status='old') read(ulaz,*) velicina1,velicina2; read(ulaz,*)N ! broj uzoraka (rezultata mjerenja) print*,'N=',N
3

print*, velicina1,velicina2; allocate (U(N,2)) ! formiranje matrice rezultata mjeranje do i=1,N read(ulaz,*) U(i,1),U(i,2) end do do i=1,N print*,U(i,1), U(i,2) end do close(ulaz) call Aprox(U,N,a,b) print*,'Koeficijent pravca a=',a,'slobodni clan b=',b izlaz=12 ! logicka jedinica za ispis podataka (externi file) open(izlaz,file='dijagram.dat',status='unknown') do i=1,N Y=a*U(i,1)+b write(izlaz,*) U(i,1),U(i,2),Y end do close(izlaz) ; end program Lin_regresija
4

ULAZNI FILE (mjerenja.dat) vrijeme temperatura 10 0.0 12.5 1.2 15.00 3.0 15.75 4.25 18.05 5.22 22.22 6.12 25.44 8.22 28.11 9.12 29.36 10.47 31.02 11.36 33.15

subroutine Aprox(U,N,a,b) implicit none integer:: i,N; real:: U(N,2),a,b,sx,sy,sx2,sy2,sxy; sx=0.d0; sx2=0.d0; sxy=0.d0 sy=0.d0; sy2=0.d0;

do i=1,N sx=sx+U(i,1) sy=sy+U(i,2) sx2=sx2+U(i,1)*U(i,1) sxy=sxy+U(i,1)*U(i,2) end do b=(sx*sxy - sy*sx2)/(sx*sx - N*sx2) a=(sy - N*b)/sx end subroutine Aprox

STATIKE I DINAMIKE BIBLIOTEKE (TIPOVI PROJEKATA)


Statika biblioteka je blok koda, izdvojen i kompajliran nezavisno od glavnog programa. Moe sadravati samo subroutinu ali ne i glavni program. Vrlo je korisna u organizovanju velikih programa i dijeljenju subroutina izmeu razliitih programa. Prethodno kompajlirana,ista se dodaje se workspace glavnog programa te se njegovim kompajliranjem ugrauje u izvrni (.exe) file. Znatno smanjuje vrijeme kompajliranja glavnog programa. Moe se koristiti za vie programa ili podprograma.

Dinamika biblioteka za povezivanje (dll) je blok koda, izdvojen i kompajliran nezavisno od glavnog programa. Moe sadravati samo subroutinu ali ne i glavni program. Vrlo je korisna u organizovanju velikih programa. Ista se dodaje glavnom programu u fazi izvrsenja (run-time) ime se postie niz prednosti. Ista dll moe se koristiti od strane vie pozivnih programa, izvrni file pozivnog programa je manji, bolji je menadent memorijom, update programa je jednostavan jer nije potrebno ponovno kompajliranje ili instaliranje programa nego samo zamjena postojede dll novom.

Primjer:
program hrapavost ! INTERFACE za dll subroutinu !DEC$ ATTRIBUTES DLLIMPORT :: povrsina implicit none integer*4:: N,M; real*4:: h; ! ! N,M dimenzije baze h maksimalna visina neravnina N=20; M=20; h=0.5d0 call povrsina(N,M,h) end program hrapavost

!************************************************************************** subroutine povrsina(N,M,h) !DEC$ ATTRIBUTES DLLEXPORT :: povrsina implicit none integer*4:: i,j,N,M,output,ran1; real*4:: h,x,y,z; ! file za spremanje podataka output=20 open(output,file='hrapavost1.dat',status='unknown')
7

write(output,*)'TITLE = "HRAPAVOST"' write(output,*)'VARIABLES = "x", "y", "z"' write(output,*)'ZONE T="first zone"', 'I=',N, 'J=',M, 'F=POINT' ! pocetni (seed) slucajni broj (veliki, neparni integer) ran1=789457 do i=1,N do j=1,M x=i; y=j; random number generation z= h*ran(ran1); write(output,*)x,y,z; end do end do close(output) end subroutine povrsina

PRIMJER: TROKUT SIERPINSKI


Izaberi tri proizvoljne komplanarne tacke koje ine trougao i oznai ih sa 1,2,3. Uzmi kocku za sluajni izbor brojeva sa opcijama 1,2,3. Izaberi proizvoljnu taku u ravni unutar ili izvan trogla 1,2,3 (prva game-point) Sluajnim izborom vrha (1,2,3) spoji navedenu taku sa sluajno izabranim vrhom. Odredi taku na polovini dobijene dui i oznai istu kao novu game-point. Ponovi proceduru iz prethodna dva koraka program sierpinski ! ovaj program generise sierpinski trougao na osnovu chaos-game postupka, implicit none real:: Vrhovi(3,2),A,pocetna(2),Gen_Point(2); integer:: i,n,initial,VRH,poc,ran1; ran1=789457 ! seed for random number generator ! print*,'unesi koordinate vrhova trokuta A(x,y),B(x,y),C(x,y)' ! ! ! do i=1,3 read(*,*) Vrhovi(i,1),Vrhovi(i,2) end do Vrhovi(1,1)=1.0 Vrhovi(1,2)=1.0 Vrhovi(2,1)=30.0 Vrhovi(2,2)=1.0
9

Vrhovi(3,1)=0.5*(Vrhovi(2,1)+ Vrhovi(1,1)) Vrhovi(3,2)=Vrhovi(3,1)+1. ! ! print*,'izaberi pocetnu tacku, A,B,C ' read(*,*) Poc poc=1; pocetna(1)=Vrhovi(poc,1) pocetna(2)=Vrhovi(poc,2) open(unit=11,file="sierpinski.dat",status="unknown"); do i=1,3 write(11,*)Vrhovi(i,1),Vrhovi(i,2); end do ! generisanje tacaka, izbor vrha do i=1,50000 A=ran(ran1); VRH=3; if(A.le.0.66666666666) VRH=2; If(A.le.0.33333333333) VRH=1; Gen_Point(1)=0.5*(pocetna(1)+Vrhovi(VRH,1)) Gen_Point(2)=0.5*(pocetna(2)+Vrhovi(VRH,2)) write(11,*)Gen_Point(1),Gen_Point(2); pocetna(1)=Gen_Point(1) pocetna(2)=Gen_Point(2) end do ; end program sierpinski
10

You might also like