Professional Documents
Culture Documents
RAUNARI I PROGRAMIRANJE
Fortran 90, osnove
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
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
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