fortran predavanje 9

Upload: karbon1

Post on 14-Jan-2016

15 views

Category:

Documents


0 download

DESCRIPTION

predavanje iz programiranja, fortran i proceduralno i OO programiranje

TRANSCRIPT

  • 1

    Univerzitet u Tuzli Mainski fakultet

    RAUNARI I PROGRAMIRANJE

    Fortran 90 - programske jedinice

    Dr. Salko osi

    kolska 2014/2015

  • 2

    Kompleksni program dekompozicija na vie modula (procedura, potprog.)

    Programske jedinice (eksterne procedure) mogu se graditi i kompajlirati izvan glavnog programa, interne procedure unutar glavnog programa (contains)

    Programski zadatak moe obavljati tim programera

    Bra izrada, lake testiranje, krai programski kod glavnog programa, nema ponavljanja koda

    Reusable code, lake odravanje i unapreenje

    Izolacija varijabli od glavnog programa (data hiding) Programske jedinice

    Glavni program (main)

    Funkcije

    Subroutine

    Moduli Podaci iz svake programske jedinice dostupni su samo unutar te jedinice (scope).

  • 3

    FORTRAN FUNCTIONS: unutranje i eksterne Korisnika funkcija je procedura iji je rezultat jedna varijabla proizvoljnog tipa, koja je deklarisana preko imena funkcije. ! Deklaracija funkcije, opti sluaj: Type FUNCTION ime_funkcije ([ lista argumenata ]) [declaration statements] [executable statements] END [FUNCTION [name]]

    Program polinom ! generie polinomsku krivu za zadate koeficijente (4) implicit none real:: x, coef(0:3), dx, x0, y; integer:: i; real:: polinom; dx=0.1; x0=0.; coef(0)=1.55 ! proizvoljni koeficijent coef(1)=55.687 coef(2)=3.57 coef(3)=-2.506

  • 4

    do i=0,100 x = x0 + i*dx y=polinom(x,coef) print*,x,y end do end program polinom !***************************** ! contains (unutranja ili externa) ! unutranje ne mogu imati vanjske, vanjske mogu imati unutranje

    REAL FUNCTION polinom ( x, a ) ! vrednuje kubni polinom a(3) * x**3 + a(2)* x**2 + a(1)*x+ a(0) IMPLICIT NONE REAL:: x, a(0:3) polinom = a(0) + x*(a(1)+x*(a(2)+x*a(3))) ! efikasnije vrednovanje polinoma END FUNCTION polinom

  • 5

    Primjer 2: napisati program kojim se vrednje (rauna) slijedei izraz:

    I rjeenje: II rjeenje:

  • 6

    Subroutine (podprogram)

    kao rezultat moe vratiti vie argumenata

    ime subroutine ne mora biti deklarisano (nije varijabla)

    poziva se sa CALL

    moe biti bez liste argumenata

    definicija: SUBROUTINE subroutine_name ( argument_list) (Declaration section)

    (Execution section) RETURN ! (OPTIONAL) END SUBROUTINE [name] ! Imenovanje varijabli u listi argumenata:

  • 7

    Primjer 3: program LinSistem ! ovaj program Kramerovom metodom rjesava sistem od tri linearne jednacine implicit none integer:: i,j,u; real:: A(3,3),B(3),X(3); do i=1,3 print*,'Unesi koeficijente reda i i vektor B(i) za jednacinu AX=B',i read(*,*)(A(i,j),j=1,3),B(i) ! primjer petlje unutar naredbe read end do call cramer(A,B,X,u) if (u.eq.1) print*,'Rjesenje sistema je',(X(i),i=1,3) ! primjer prostog if uslova end program LinSistem

  • 8

    !***************************************** subroutine cramer(A,B,X,u) implicit none integer::i,u real:: A(3,3),B(3),X(3), detsis, det, A1(3,3), A2(3,3), A3(3,3); ! sistem ima rjesenje u=1, sistem nema rjesenja u=0 detsis=det(A) u=1 if (detsis.eq.0) then print*,'sistem nema rjesenja' u=0 return end if A1=A; A2=A; A3=A; ! istovremeni pristup svim elementima do i=1,3 A1(i,1)=B(i)

  • 9

    A2(i,2)=B(i) A3(i,3)=B(i) end do X(1)=det(A1)/detsis ! pozivi korisnikoj funkciji det X(2)=det(A2)/detsis X(3)=det(A3)/detsis return end subroutine cramer !*************************************** real function det(A) implicit none real A(3,3); det=A(1,1)*A(2,2)*A(3,3) + A(1,2)*A(2,3)*A(3,1) + A(2,1)*A(3,2)*A(1,3) - & & A(3,1)*A(2,2)*A(1,3) - A(2,1)*A(1,2)*A(3,3) - A(3,2)*A(2,3)*A(1,1) return end

  • 10

    Primjer: OSCILACIJE Za oscilatorni sistem prikazan na slici, izraunaj vrijednosti funkcija pomjeranja i brzine za dati interval vremenski T. Dobijeni rezultat spremi u datoteku rezultata pogodnu za analizu

    eksternim programom.

    program SlobodneOscilacije1D ! deklaracija varijabli implicit none integer:: Nts; real*8:: T,dt,K,M,Xo,Vxo; ! unosenje vremenskih parametara print*,'Unesi posmatrano vrijeme [s]' read(*,*)T print*,'Posmatrano vrijeme T=',T,'[s]' print*,'***********************************' print*,'Unesi vremenski korak dt [s]' read(*,*)dt print*,'Vremenski korak dt=',dt,'[s]' print*,'***********************************' ! dinamicki parametri print*,'Unesi KRUTOST K [N/m]' read(*,*)K print*,'KRUTOST SISTEMA K=',K,'[N/m]'

  • 11

    print*,'***********************************' print*,'Unesi masu M [kg]' read(*,*)M print*,'MASA SISTEMA M=',M,'[kg]' print*,'***********************************' ! granicni i pocetni uslovi print*,'Unesi pocetnu elongaciju Xo [m]' read(*,*)Xo print*,'Pocetna elongacija Xo=',Xo,'[m]' print*,'***********************************' print*,'Unesi pocetnu brzinu Vxo [m/s]' read(*,*)Vxo print*,'Pocetna brzina Vxo=',Vxo,'[m/s]' print*,'***********************************' Nts = T/dt ! broj vremenskih koraka ! poziv potprograma za vrednovanje funkcije call CALCULATOR(Nts,dt,K,M,Xo,Vxo) end program SlobodneOscilacije1D SUBROUTINE CALCULATOR(Nts,dt,K,M,Xo,Vxo) ! deklaracija varijabli implicit none integer:: Nts,IZLAZ,i real*8:: dt,K,M,OMEGA,Xo,Vxo,X,Vx

  • 12

    ! otvaranje file-a za upis izracunatih vrijednosti IZLAZ = 20 ! proizvoljni integer za izlaznu jedinicu open(IZLAZ,file='slobodne1D.dat',STATUS='UNKNOWN') OMEGA = dsqrt(K/M) ! sopstvena frekvencija [1/s] ! vrednovanje funkcije write(IZLAZ,*)'0.0',Xo,Vxo !upis pocetnih vrijednosti do i=1,Nts X=Xo*cos(OMEGA*dt*i)+(Vxo/OMEGA)*sin(OMEGA*dt*i) Vx=-Xo*OMEGA*sin(OMEGA*dt*i)+Vxo*cos(OMEGA*dt*i) write(IZLAZ,*)(dt*i),X,Vx end do close(IZLAZ) END subroutine CALCULATOR

  • 13

    MODUL: programska jedinica koja se pojavljuje u Fortranu 90 Razmjena podataka izmeu glavnog programa i drugih jedinica, umjesto liste varijabli Modul moe sadravati vlastite podprograme (modulski podprogrami) Modul moe sadravati deklaracije i specifikacije varijabli koje su dostupne svim drugim programima jedinicama koje koriste taj modul (suprotno od data hiding) Modul se kompajlira odvojeno od glavnog programa Definicija: MODULE Ime Deklaracije varijabli, inicijalizacija Contains ! unutranji podprogram (opciono) End module (Ime) Upotreba modula: Program Ime_programa(pr_jedinice) Use Ime_modula

    Izrazi End program Ime_programa

  • 14

    Primjer: rastojanje izmeu taaka

  • 15

    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)) ! nakon to smo saznali potrebni format niza i matrice Deallocate (A,B) ! oslobaanje prostora kada A i B vie nisu potrebni

  • 16

    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

  • 17

    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

    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

  • 18

    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; sy=0.d0; sx2=0.d0; sy2=0.d0; sxy=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

  • 19

    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 work-

    space 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 postojee dll novom.

    Primjer:

  • 20

    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') write(output,*)'TITLE = "HRAPAVOST"'

  • 21

    write(output,*)'VARIABLES = "x", "y", "z"' write(output,*)'ZONE T="first zone"', 'I=',N, 'J=',M, 'F=POINT' ! pocetni (seed) sluajni 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

  • 22

    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

  • 23

    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

  • 24

  • 25

    Next week: OOP (objektno orijentisano programiranje)

    za vjebu:

    1. Napisati program za konverziju iz binarnog brojnog sistema u decimalni i obratno. Program treba da sadri subroutine koje kao ulaznu veliinu dobijaju proizvoljan broj u jednom od navedenih formata i vraaju isti broj konvertovan u drugi format.

    2. Za diskretan skup podataka x(i) napisati program koji primjenom potprograma rauna srednju vrijednost (mean) i varijansu prema slijedeim formulama: