Professional Documents
Culture Documents
Fortran Skripta PDF
Fortran Skripta PDF
Interni materijali
Ovi radni materijali nastali su kao pomo pri jednom kratkom teaju
(radionici) za programski jezik FORTRAN. Ovi materijali nemaju
pretenziju davanja uvida u potpune mogunosti programskog jezika
FORTRAN. U tom smislu itatelji se upuuju u dokumentaciju: Compaq
Developer Studia, kao i niz knjiga koje postoje o ovom programskom
jeziku.
Izraeni primjeri i objanjenja vrijede za Compaq Developer Studio, ver
6.6.0. Neki primjeri koji su ovdje navedeni mogue nee raditi pod
nekim drugim okruenjem.
Takoer, u materijalima nisu spomenute neke mogunosti koje
posjeduje moderni FORTRAN. Kolege koje se misle ozbiljnije posvetiti
programiranju svakako se upuuje na izuavanje modernih
programskih rjeenja.
Takoer, u ovim materijalima navedeno je niz programskih rjeenja koji
su zastarjeli i vie se ne koriste. Ovo je iskljuivo iz razloga to
Graevinski fakultet u Splitu ima dugu tradiciju programiranja u ovom
jeziku s poecima sa standardom FORTRAN IV na raunalima PDP i
VAX. Dio kdova s ovih raunala jo je prisutan u praksi, efikasan je i
nema veih problema pri njihovom kompajliranju i linkanju.
Autor
Sadraj stranica
1. UVOD .....................................................................................................................................................5
1.1 O FORTRAN-u ...................................................................................................................................................................... 5
2. Rad u integriranom okruenju: Compaq Developer Studio (ver. 6.6.0)............................................6
2.1 Kreiranje radnog okruenja.................................................................................................................................................... 6
2.2 Kreiranje datoteke s izvornim kodom programa .................................................................................................................... 7
2.3 Kompajliranje, linkanje i izvravanje programa...................................................................................................................... 8
2.4 Upozorenja i greke............................................................................................................................................................... 8
2.5 Kompatibilnost ..................................................................................................................................................................... 10
2.6 Release i debug mod........................................................................................................................................................... 10
2.7 Traenje greaka (debugiranje)........................................................................................................................................... 11
3. Tipovi podataka u FORTRANU ..........................................................................................................12
3.1 Pohrana podataka u raunalu.............................................................................................................................................. 12
3.2 Osnovni tipovi podataka....................................................................................................................................................... 12
3.2.1 Tip CHARACTER ...................................................................................................................................................... 12
3.2.2 Tip INTEGER ............................................................................................................................................................ 13
3.2.3 Tip REAL ................................................................................................................................................................... 14
3.2.4 Konverzija tipova varijabli.......................................................................................................................................... 14
3.2.5 Tip LOGICAL............................................................................................................................................................. 15
3.2.6 Tip COMPLEX........................................................................................................................................................... 15
3.2.7 Nepromjenjive konstante........................................................................................................................................... 15
3.3 Izvedeni (sloeni) tipovi podataka........................................................................................................................................ 16
3.4 Vektori i Matrice (nizovi podataka)....................................................................................................................................... 16
3.4.1 Openito .................................................................................................................................................................... 16
3.4.2 Agregatne operacije .................................................................................................................................................. 17
3.4.3 Matrini raun............................................................................................................................................................ 17
3.5 Dinamiko zauzimanje memorije (dinamiko alociranje) ..................................................................................................... 17
3.6 Zajedniko memorijsko podruje COMMON blok i MODULE........................................................................................... 18
4. Strukturiranje programa.....................................................................................................................20
4.1 Pravilo o strukturi programa................................................................................................................................................. 20
4.2 Konvencija o imenima varijabli............................................................................................................................................. 20
4.3 Komentari i aliniranje ........................................................................................................................................................... 21
5. Kontrola toka programa .....................................................................................................................22
5.1 Grananje programa.............................................................................................................................................................. 22
5.1.1 Uvjetna naredba grananja: IF.................................................................................................................................... 22
5.1.1.1 Logika IF naredba............................................................................................................................................. 22
5.1.1.2 Blok IF naredba.................................................................................................................................................. 22
5.1.1.3 Arihmetika IF naredba - zastarjeli oblik IF naredbe .......................................................................................... 23
5.1.2 Uvjetna naredba grananja: CASE ............................................................................................................................. 23
5.1.3 Bezuvjetna naredba grananja: GOTO....................................................................................................................... 24
5.2 Petlje.................................................................................................................................................................................... 24
5.2.1 Petlja s kontrolnim parametrom................................................................................................................................. 24
5.2.2 DO-WHILE petlja....................................................................................................................................................... 25
5.2.3 Beskonana DO petlja............................................................................................................................................... 25
6. Formatirani ispis podataka i rad s datotekama................................................................................25
6.1 Openito .............................................................................................................................................................................. 25
6.2 Naredba FORMAT............................................................................................................................................................... 26
6.2.1 Ispis cijelih brojeva .................................................................................................................................................... 26
6.2.2 Ispis logikih varijabli................................................................................................................................................. 27
6.2.3 Ispis niza znakova ..................................................................................................................................................... 27
6.2.4 Ispis realnih varijabli .................................................................................................................................................. 27
6.2.5 Posebni znakovi pri formatiranju ispisa ..................................................................................................................... 28
6.2.6 Ostale korisne napomene pri formatiranju ispisa ...................................................................................................... 28
1. UVOD
1.1 O FORTRAN-u
Fortran (FORmula TRANslation) je najstariji tzv. vii programski jezik. Sintaksa je vremenom mijenjana i propisana je nizom
standarda, koji su donoeni u razmacima od 10 ili vie godina. Poznati standardi su: fortran II (1958.) fortran IV (1961.), fortran66
(1966.), fortran77 (1977.), fortran90 (1990.), fortran95 (1995.), Velika razlika u sintaksi nastaje izmeu Fortrana77 i Fortrana90.
Razliiti standardi se obino razlikuju prema nastavku (eksenziji) imena datoteke, pa tako nastavke .f90 imaju datoteke koje sadre
izvorni kod u Fortranu-90, a nastavke .for ili .f imaju datoteke koje sadre izvorni kod u Fortranu-77 ili ranijim verzijama.
Kako je naglaeno, osnovna razlika Fortranskih standarda je u sintaksi zapisa, pa tako Fortran 77 (i nie) koristi fiksni format zapisa
programa sa sljedeim ogranienjima:
U jednoj liniji smije biti samo jedna naredba;
Mjesta 1-5 u retku se koriste za labele;
Popunjeno 6. mjesto indicira da je linija nastavak fortranske naredbe iz prethodne linije;
Mjesta 7-72 rezervirana za pisanje fortranskih naredbi;
Preko 72 mjesta je zabranjeno pisati.
Razlika od Fortrana 90 prema novijim verzijama je sljedea:
Mjesta 1-6 nisu rezervirana;
Naredba u liniji moe biti vrlo dugaka;
Nastavljanje naredbe u sljedei red vri se s ampersand-om (&) na kraju;
Na istoj liniji moe biti vie naredbi, a meusobno su razdvojene s toka-zarezom (;);
Posjeduje naredbe za rad s vektorima i matricama;
Dinamiko rezerviranje memorije (velike matrice i vektori).
PRIMJER: FORTRAN77
c234567890123456789012345678901234567890
c komentar
c234567890123456789012345678901234567890
Program hello
write (*,*) Pozdrav i mir cijelom
& svijetu
goto 100
print *,ovo nece biti ispisano
100 continue
end program
PRIMJER: FORTRAN90
Program hello
write (*,*) Pozdrav i mir cijelom &
svijetu
write (*,*) svim bicima ; write (*,*) u svemiru i okolici !
End program
Fortran 90 prepoznaje kd pisan u Fortranu 77 ili ranijim verzijama i uredno ih kompajlira i linka. Sitne nekompatibilne razlike
kompajler prijavi i lako ih je ispraviti i doraditi. Obrnuti sluaj ne vrijedi.
Nakon pokretanja ove opcije pojavljuje se novi prozor u kojem je mogue odabrati tip aplikacije koju mislimo razvijati.
Tip akplikacije moe biti: Konzolna aplikacija (standardni DOS program), Windows aplikacija, Statika biblioteka, Dinamika
biblioteka (Dynamic Link Library) i sl.
Upisivanjem imena projekta (npr. Program1) i izbora lokacije gdje e se taj program nalaziti kreiramo novo Radni okruenje
(Workspace).
Radno okruenje je jo uvijek prazno. Sad je potrebno kreirati datoteku s izvornim kodom programa.
Tekui projekt
NAPOMENA: Ako je check-irano: Add to project,
datoteka se automatski dodaje projektu
Ime datoteke
NAPOMENA: Ako je izabrano: Fortran fixed format
source file, automatske se dodaje nastavak: .for.
Nakon izbora ove opcije, datoteka Prog1.for se pojavljuje u sredinjem dijelu ekrana, a s lijeve strane je vidljivo da je i dodana
projektu.
Ako je datoteka s izvornim kdom ranije kreirana, mogue ju je pridruiti programu desnim klikom mia dok se kursor nalazi u
statusnom prozoru nad labelom Source files. Tada se otvara dodatni prozor u kojem je potrebno odabrati opciju: Add files to
folder. Odabirom ove opcije otvara se standardni prozor za izbor datoteke. Dobra praksa je sve datoteke s izvornim kdom drati
u istom direktoriju (folder-u).
Ako kompajler i linker nisu nali (sintaktike) greke u izvornom kodu, to e biti prikazano u prozoru za poruke, program je spreman
za startanje. Izvravanje programa se provodi opcijom: BuildExecute (Ctrl+F5). Rezultat izvrenja programa biti e prikazan u
posebnom (DOS) prozoru.
Ako se izabere opcija: BuildExecute (Ctrl+F5), prije kompajliranja i linkanja, program e se prvo prekompajlirati i linkati, a zatim i
izvriti.
Npr. u kdu u nastavku grekom je u etvrtom retku umjesto nule (DO I=1,100) upisano veliko slovo O (DO I=1.10O).
PROGRAM ZBRAJANJE
INTEGER ZBROJ
ZBROJ=0
DO I=1,10O
ZBROJ=ZBROJ+I
ENDDO
PRINT *,' Zbroj : ',ZBROJ
END
Prilikom kompajliranja, kompajler javlja poruku o greci. Dvostruki klik na tu poruku vraa nas u glavni prozor tono na etvrtu liniju.
No pogledajmo sljedei primjer. U kdu u nastavku, grekom je u etvrtom retku umjesto zareza (DO I=1,100) upisana toka (DO
I=1.100).
PROGRAM ZBRAJANJE
INTEGER ZBROJ
ZBROJ=0
DO I=1.100
ZBROJ=ZBROJ+I
ENDDO
PRINT *,' Zbroj : ',ZBROJ
END
Greka koju kompajler generira ukazuje na 6. redak, a ne na redak gdje mi prividno smatramo da se greka dogodila. U stvarnosti
kompajler, zbog toke, nije registrirao da se pojavila (DO) naredba, te se buni na pojavu (ENDDO) naredbe bez prethodne (DO) ili (DO
WHILE).
Kod izvjetaja kompajliranja/linkanja potrebno je strogo razlikovati greke (errors) od upozorenja (warnings). Kada se pojave greke
kompajler/linker nee izraditi izvrnu (.exe) verziju i program se nee moi startati. Potrebno je tada ispraviti sve greke i ponovo
prekompajlirati/linkati progam.
Upozorenje (warning) samo napominje programeru da je neto sumnjivo u programu, ali e izraditi (.exe) verziju koja s moe startati.
Najee i upozorenja predstavljaju neloginosti u programu i potrebno im je posvetiti dunu panju.
2.5 Kompatibilnost
Izvrni (.exe) program nalazi se u podfolderu: Debug, foldera kojeg smo kreirali kao folder projekta. Taj izvrni program mogue je
kopirati na CD, Memory stick ili slino i prebaciti na drugo raunalo koje radi na istoj platformi (DOS-DOS, Windows XP-Windows
XP). Nije mogue (bar ne u svim sluajevima) prijenos izvrnog programa izmeu platformi (npr. izvrni program kreiran u
Windows XP okruju prebaciti na klaster raunalo koje radi pod Linux-om).
Meutim, kako je ranije naglaeno, mogue je prenijeti izvorni kd programa te ga ponovno prekompajlirati. Podrazumijeva se,
naravno, da postoji instaliran kompajler/linker na tom drugom raunalu.
Kompajler/linker e uredno napraviti izvrni file, no prilikom izvrenja programa dolazi do greke (vidjeti sliku). Iako naizgled nije
bitna razlika u izvjetaju, razlika jest bitna. U oba sluaja javlja se tip greke: sqrt: DOMAIN Error (Kvadratni korijen Greka u
domeni), u prvom sluaju kompajler nam tono javlja liniju gdje je ta greka nastala, dok u drugom sluaju toga nemamo.
Stop debugging Prestanak debugiranja prekida program i vraa se u glavni prozor s kodom
Ako je trenutna linija izvrenja programa poziv subrutine ili funkcije program ulazi u nju i zaustavlja se na prvoj
Step Into izvrnoj naredbi unutar subrutine/funkcije.
Ako je trenutna linija izvrenja programa poziv subrutine ili funkcije program je izvrava i zaustavlja se na sljedeoj
Step Over liniji nakon poziva.
Ako je trenutna linija izvrenja programa unutar subrutine ili funkcije program je izvrava do kraja, izlazi iz nje i
Step Out zaustavlja se na sljedeoj liniji nakon poziva.
Program se izvrava sve do trenutne pozicije kursora. U sluaju da naie na Prekidnu toku (Brek Point) zaustavlja
Run to Cursor se na njoj.
Nakon postavljanja Prekidnih toaka i startanja programa naredbom Go, Prozor u dnu ekrana se mijenja. U lijevom dijelu otvara se
prozor sa svim varijablama, a u desnom tzv. Watch prozor u kojem se mogu pratiti eljene varijable. Klikom u Watch prozor i upisom
imena pojedine varijable mogue je dobiti njenu trenutnu vrijednost.
Definiranje karakterne varijable vri se naredbom CHARACTER. Pridjeljivanje znakovne vrijednosti karakternoj varijabli vri se na
nain da se eljeni znak stavi u jednostruke navodnike.
PRIMJER:
Program hello
CHARACTER a
a=a
print *, Varijabla a = ,a
end
Matrica karakternih varijabli predstavlja string. Vano je imati na umu da duina pridijeljenog teksta ne prijee broj rezerviranih
znakovnih mjesta. O stringovima e biti rijei kasnije.
Program hello
CHARACTER a(20) ! Stari nain deklaracije stringa
CHARACTER (len=20) :: a ! Novi nain deklaracije stringa
Rije KIND, tj. broj iza zvjezdice (kod starog naina) odreuje broj byte-ova koji se rezerviraju za varijablu. Ali taj broj ne moe biti
proizvoljan nego su mogue vrijednosti zadane kompajlerom i hardware-om raunala. Maksimalni cijeli broj koji je mogue pohraniti
u raunalu direktno je ovisan o broju rezerviranih bytova. Pa tako:
INTEGER (KIND=1) : -128 do +127
INTEGER (KIND=2) : -32768 do +32767
INTEGER (KIND=4) : -2147483648 do +2147483647
INTEGER (KIND=8) : -9223372036854775808 do +9223372036854775807
Prvi bit u bajtu slui za prikaz predznaka (0: +; 1: -), a ostali za prikaz broja. Tako npr.
Binarni Heksadecimalni Decimalni Binarni Heksadecimalni Decimalni
00000000 00 0 00000000 00000000 00 00 0
01000001 41 65 00000000 10000000 00 80 128
01111111 7F 127 00000001 00000000 01 00 256
10000000 80 -128 01000000 00000000 06 00 16384
10000001 81 -127 10000000 00000001 80 01 -32768
11111111 FF -1 11111111 11111111 FF FF -1
01100111 = (+ ) 1 26 + 1 25 + 0 2 4 + 0 23 + 1 22 + 1 21 + 1 20 = (+ )1 64 + 1 32 + 0 16 + 0 8 + 1 4 + 1 2 + 1 1 = 103
Compaq Developer Studio podrava cjelobrojne vrijednosti (INTEGER) od 2 ili 4 byte-a.
Eksplicitno napisani cijeli broj, string ili realni broj u programu zovemo konstantom.
Rije KIND, tj. broj iza zvjezdice (kod starog naina), kao i kod cjelobrojnih varijabli, odreuje broj byte-ova koji se rezerviraju za
varijablu. Taj broj, takoer, ne moe biti proizvoljan nego su mogue vrijednosti zadane kompajlerom i hardware-om raunala.
Preciznost (KIND=16) podrava samo mali broj prevoditelja, ne i Compaq Developer Studio.
Stari nain definiranja realne varijable s poveanom preciznou (REAL*8 a) je: DOUBLE PRECISION a
Treba imati na umu da realni brojevi na raunalu nisu realni brojevi koji postoje u matematici. U matematici realni brojevi ine
kontinuum. Za svaka dva, proizvoljno bliska, realna broja postoji realni broj koji se nalazi izmeu njih. Dapae, izmeu njih se nalazi
beskonano mnogo realnih brojeva. Na raunalu to nije tako. To je zbog toga to na raunalu prikazujemo realni broj s konanim
brojem byte-ova. Tipino koristi se 4 ili 8 byte-ova. Izmeu realnih brojeva na raunalu postoji razmak, a izmeu dva susjedna NEMA
drugih realnih brojeva. Ovaj je razmak ujedno numerika greka koju inimo prikazujui neki pravi realni broj (u principu s
beskonanim brojem decimala) pomou konanog broja byte-ova na raunalu.
Stoga, numerike operacije s realnim brojevima na raunalu pate od greaka. Te greke se ponekad mogu akumulirati, i tako dovesti
do velikih nepredvidivih greaka u konanom rezultatu.
Raunalo realni broj sprema na sljedei nain:
Od ukupnog broja bitova, jedan bit (onaj najvii) se koristi za oznaku predznaka. Ako je on jednak 1, radi se o negativnom
broju.
Jedan broj bitova se koristi za binarni prikaz eksponenta.
Ostatak slui za prikaz decimala.
Broj bitova namjenjen za prikaz eksponenta i za broj decimala standardiziran je. Postoje ovi standardi:
Jednostruka preciznost. Ukupno se koriste 32 bita (4 byte-a):
1 bit - predznak
24 bita - frakcija (decimale) (jedan bit je implicitan) mogu se zapisati
8 bita - eksponent (jedan bit za predznak eksponenta)
Dvostruka preciznost. Ukupno se koriste 64 bita (8 byte-a):
1 bit - predznak
53 bita - frakcija (decimale) (jedan bit je implicitan)
11 bita - eksponent (jedan bit za predznak eksponenta)
Za oznaavanje ekponenta realne konstante u jednostrukoj preciznosti koristimo slovo E (npr. 1.0E-5). Za oznaavanje ekponenta
realne konstante u dvostrukoj preciznosti koristimo slovo D (npr. 1.0D+50).
Operacije koje se mogu provoditi nad realnim brojevima su standardne matematike operacije: zbrajanje (+), mnoenje (*),
oduzimanje (-), dijeljenje (/) i potenciranje (**). Takoer je mogue provoditi i operacije pretvaranja:
cijeli broj realni broj
INT(a) a
i REAL(i)
nula) koja se potom konvertira u realni broj na lijevoj strani. Ako se u izraz na desnoj strani umijea realna konstanta, onda se cijeli
brojevi prvo pretvaraju u realne, a tek onda se izvode numerike operacije.
PROGRAM konverzija
REAL a
a = 1/(1 + 1)
PRINT *,a ! ispisuje: 0.0000000E+00
a = 1.0/(1 + 1)
PRINT *,a ! ispisuje: 0.5000000
END PROGRAM
Iz kompleksnog broja moemo izdvojiti realni dio i imaginarni dio s funkcijama REAL i AIMAG, a konjugirani kompleksni broj dobiva
se funkcijom CONJG.
COMPLEX (KIND=4) :: c
REAL (KIND=4) :: a,b
c = (1.0,-5.3)
a = REAL(c) ; PRINT *,a ! 1.0
b = AIMAG(c); PRINT *,b ! -5.3
d = CONJG(c)
Umjesto ovog pristupa moemo koristiti sloeni tip podataka, tzv. strukturu ili objekt:
TYPE Koordinate STRUCTURE /Koordinate/
REAL x,y,z REAL x,y,z
END TYPE Koordinate END STRUCTURE
TYPE(Koordinate) :: v1,v2 RECORD /Koordinate/ v1,v2
v1%x = 1.0 v1.x = 1.0
v1%y = 1.0 v1.y = 1.0
v1%z = 1.0 v1.z = 1.0
v2 = Koordinate(-1.0,0.0,5.0) v2 = Koordinate(-1.0,0.0,5.0)
PRINT *,v1 ! 1.0 1.0 1.0 PRINT *,v1 ! 1.0 1.0 1.0
PRINT *,v2 ! -1.0 0.0 5.0 PRINT *,v2 ! -1.0 0.0 5.0
U starijim Fortran programima mogue je nai funkciju DIMENSION, koja postie isti uinak. U sljedeem primjeru naredbom
DIMENSION biti e rezervirano 120 mjesta, ali za spremanje realnih varijabli jednostruke preciznosti (Vidi dalje dio: Konvencija o
imenima varijabli). Ako je zadana naredba: IMPLICIT NONE, tada e kompajler dojaviti poruku o greci.
DIMENSION a(120)
Prema novoj konvenciji pisanja Fortran programa takoer se pri deklariranju koristi naredba DIMENSION. Sljedea sintaksa vrijedi
samo za Fortran 90 i vie verzije
INTEGER, PARAMETER :: n=3
REAL, DIMENSION(n,n) :: a
a = 0.0 ! svi a(i,j) = 0.0
Dakle kada se navede samo ime niza (vektora/matrice) umerike operacije primjenjuju se svakom pojedinom lanu niza, a rezultat
se sprema u niz na lijevoj strani znaka jednakosti. U Fortranu 77 bilo je potrebno koristiti DO-petlje da bi se postigao isti rezultat.
U Fortranu matrica se u memoriji raunala sprema po stupcima tj. po prvom indeksu.
REAL, DIMENSION(3,3) :: a
Matrica se ne smije rabiti prije rezervacije memorije, a to se moe provjeriti naredbom ALLOCATED.
Umjesto brojke u zagradama se upisuje : (dvotoka).
Primjer programa koji ita sa standardnog unosa (inputa) podatke te izraunava srednju vrijednost i standardnu devijaciju.
PROGRAM analiza
REAL, ALLOCATABLE::PODACI(:)
INTEGER :: n
REAL :: aver,sigma
PRINT *,Upisi broj podataka; READ (*,*) n
ALLOCATE (podaci(n))
PRINT *,Upisi podatke; READ (*,*) podaci(1:n)
aver = SUM(podaci(1:n))/REAL(n)
sigma = SQRT(SUM((podaci(1:n)-aver)**2 )/REAL(n-1))
PRINT *,prosjecna vrijednost = ,aver
PRINT *,standardna devijacija = ,sigma
DEALLOCATE (podaci)
END PROGRAM
Programske cjeline ne moraju koristiti sve raspoloive podatke iz modula, ve samo dio njih izlistan iza naznake ONLY.
USE zajednicki_podaci, ONLY : a,b
Varijable, novi tipovi podataka, funkcije i podprogrami mogu se deklarirati javnim ili privatnim.
MODULE zajednicki podaci
INTEGER, PRIVATE :: i,j
REAL, PUBLIC :: a
REAL, DIMENSION(5) :: b ! PUBLIC !
END MODULE
Ako podaci nisu eksplicitno naznaeni da su privatni onda su javni. Javni znai dostupni drugim programskim cjelinama koje koriste
taj modul. Ako definicija modula zapoinje s PRIVATE onda su svi podaci po pretpostavci privatni, osim onih koji su eksplicitno
naznaeni da su javni. Privatni podaci dostupni su svim funkcijama i potprogramima unutar modula, pa i onima koje su naznaeni
kao javni. Uporaba privatnih podataka mogua je posredno kroz javno dostupne funkcije i potprograme.
4. Strukturiranje programa
Prilikom pisanja programa u Fortranu potrebno je potovati neka pravila strukturiranja programa. Neka pravila su stroga i ne smije se
odstupiti od njih, dok su druga opcionalna, ali ih je dobro potivati.
javiti e greku jer varijabla (I) nije eksplicitno deklarirana. Bez naredbe (IMPLICIT NONE) program bi se uredno iskompajlirao i
izvrio bez greke. U ovom sluaju (ovom jednostavnom programu) naredba (IMPLICIT NONE) ak nije ni potrebna. Meutim u
sljedeem sluaju:
PROGRAM ZBRAJANJE
INTEGER I,ZBROJ
DO I=1,100
ZBROJ=ZBROJ+I
ENDDO
PRINT *,' Zbroj : ',ZBROJ
END
Varijabla (ZBROJ) nije deklarirana niti ponitena. U etvrtom retku prilikom prvog koritenja uzima se vrijednost varijable (ZBROJ) i
dodaje joj se (I). Kompajler e prilikom izvrenja moda javiti upozorenje (warning) ali nee prekinuti prevoenje programa. Program
e se izvriti s nepredvidivim rezultatom1.
Jedna dobra praksa je oznaavanje imena varijabli nazivima koji opisuju svrhu te varijable. Npr. u prethodno prikazanom kdu
Varijabla ZBROJ oznaava zbroj svih brojeva (1-100). Potpuno funkcionalan bio bi i sljedei kd:
PROGRAM ZBRAJANJE
INTEGER I,GFCD
DO I=1,100
GFCD = GFCD+I
ENDDO
PRINT *, GFCD
END
Takoer je zgodno pri programu zasebne cjeline (npr. DO petlje, deklaraciju varijabli) uvlaenjem nastojati vizualno odvojiti od
samog tijela programa. Takvi programi su vizualno pregledniji i lake ih je itati i analizirati
1 U ovom sluaju vjerojatni rezultat e biti toan jer veina kompajlera ponitava sve varijable prije koritenja (izjednaava ih s nulom). Meutim, kod velikih programa
rezultat je stvarno nepredvidiv.
IF (logiki izraz) THEN zapoinje blok (skupinu) naredbi koja e se izvravati samo ako je logiki izraz toan, a ENDIF (ili END IF) je
oznaka kraja bloka naredbi. Unutar bloka mogue imati ili jednu ili vie naredbi. U blok naredbi IF - THEN - ENDIF mogue je
ugnjezditi jedan ili vie drugih IF - THEN - ENDIF blokova ili logikih IF-ova.
Prethodni primjer bi se mogao proiriti na sljedei nain:
POGRAM kvadratni_korijen
REAL :: a
PRINT *,Upii neki realni broj
READ (*,*) a
IF (a < 0.0) THEN
PRINT *,Negativni broj
END IF
IF (a >= 0.0) THEN
IF (INT(SQRT(a))**2 == a) THEN
PRINT *,Upisani broj je kvadrat cijelog broja = ,INT(SQRT(a))
END IF
IF (INT(SQRT(a))**2 /= a) THEN
PRINT *,Kvadratni korijen je = ,SQRT(a)
END IF
END IF
END
Jo sloenija forma IF naredbe (IF-THEN-ELSE-ENDIF) sastoji se od dva bloka. Prvi blok naredbi se izvrava ako je logiki izraz
toan, a drugi ako je logiki izraz pogrean.
IF (a >= 0.0) THEN
PRINT *,Kvadratni korijen je = ,SQRT(a)
ELSE
PRINT *,Zadan je negativni broj
END IF
Svaki blok naredbi (IF-dio i ELSE-dio) mogu sadravati druge sloenije i jednostavnije verzije IF-naredbe.
Prethodni primjer:
POGRAM kvadratni_korijen
REAL :: a
PRINT *,Upii neki realni broj
READ (*,*) a
IF (a .GE. 0.0) THEN
IF (INT(SQRT(a))**2 .EQ. a) THEN
PRINT *,Upisani broj je kvadrat cijelog broja = ,INT(SQRT(a))
ELSE
PRINT *,Kvadratni korijen je = ,SQRT(a)
END IF
ELSE
PRINT *,Zadan je negativni broj
END IF
END
Postoji i vrlo sloena forma IF naredbe koja moe provjeravati vie razliitih logikih izraza, te izvravati blok (skupinu) fortranskih
naredbi ako je samo jedan od njih toan, te opcionalno ELSE grupu naredbi ako niti jedan od logikih izraza nije toan.
IF (a < 0.0) THEN
PRINT *,Zadan je negativni broj
ELSE IF ((a > 0.0) .AND. (a < 100.0)) THEN
PRINT *,Kvadratni korijen broja ,a, je ,SQRT(a)
ELSE
PRINT *,Ne znam vaditi korjene brojeva vecih od 100
END IF
Mogue je navesti podruje vrijednosti pomou dvotoke. Ispred dvotoke stoji poetna vrijednost, a iza dvotoke stoji konana
vrijednost intervala. Granice su ukljuene. Za navoenje polubeskonanog intervala moe se donja ili gornja granica ispustiti.
Vrsta vrijednosti (konstanti) mora odgovarati vrsti izraza koji se navodi u poetnoj SELECT liniji CASE naredbe.
Izvrava se jedna ili vie naredbi koje se nalaze u bloku koji slijedi iza CASE iskaza ovisno o vrijednosti izraza.
PROGRAM izbornik
CHARACTER i
PRINT *,Odaberi opciju izbornika; READ (*,*) i
SELECT CASE (i)
CASE (f,'F'); PRINT *,Odabrao si opciju: File
CASE (e,'E'); PRINT *,Odabrao si opciju: Edit
CASE (i,'I'); PRINT *,Odabrao si opciju: Insert
CASE (w,'W'); PRINT *,Odabrao si opciju: Window
...
CASE DEFAULT; PRINT *,Nema takve opcije!
END SELECT
END PROGRAM
S toka-zarezom odvojene su razliite fortranske naredbe na istoj liniji!
Nakon izvrenja naredbe GOTO program nastavlja radom na naredbi: 100 continue i tekst: ovo nece biti ispisano
stvarno nee biti ispisano.
5.2 Petlje
Za viestruko ponavljanje grupe naredbi sluimo se petljama. U Fortranu petlja poinje s rjeju DO a zavrava s ENDDO (END DO).
Postoji vie verzija DO-petlje:
Petlja s kontrolnim parametrom;
Petlja DO-WHILE koja se ponavlja dok je neki uvjet zadovoljen;
Beskonana petlja.
Tijelo petlje se izvrava za svaku vrijednost kontrolnog parametra (I). Vrijednost kontrolnog parametra u prvom izvravanju je (poc).
Pri svakom sljedeem izvravanju poveava se za (korak), sve dok je vrijednost I<kraj.
Primjer zbrajanja samo parnih brojeva od 1 do 256, pomou DO petlje moe se napisati na nain:
PROGRAM Zbrajanje
INTEGER I, ZBROJ
ZBROJ=0
DO I = 2, 256, 2
ZBROJ = ZBROJ + I
ENDDO
PRINT *,Zbroj=,ZBROJ
END
Za DO petlju vrijedi:
Ako korak nije naveden onda se podrazumijeva da je on jedan.
Ako je poetna vrijednost vea od konane, a korak je pozitivan petlja se ne izvodi.
Ako je poetna vrijednost manja od konane, a korak je negativan petlja se ne izvodi.
Unutar DO petlje mogu se nalaziti druge DO petlje ali se ne smiju preplitati (svaka unutarnja DO petlja mora zavriti prije
vanjske).
Takoer se DO petlju moe prisiliti na sljedei korak ili prisilno izai iz nje. Vrijedi:
Naredba CYCLE prisiljava izvoenje slijedeeg koraka DO-petlje. Podrazumijeva se da se prelazi na sljedei korak najnie
petlje ako je nekoliko DO petlji ugnjedeno.
Naredba EXIT prekida izvoenje DO-petlje. Podrazumijeva se da se prekida najnia petlju ako je nekoliko DO petlji
ugnjedeno.
Naredni primjer zbrajat e brojeve samo dok je ZBROJ < 1000. Kada ZBROJ prijee 1000 izvriti e se IF naredba i petlja e biti
nasilno prekinuta. Slijedi ispis i kraj programa.
PROGRAM Zbrajanje
INTEGER I, ZBROJ
ZBROJ=0
DO I = 2, 256, 2
ZBROJ = ZBROJ + I
IF (ZBROJ > 1000) EXIT
ENDDO
PRINT *,Zbroj=,ZBROJ
END
Iza oznake ureivanja, slova I, B i Z moe stajati broj koji je irina podruja unutar kojeg treba ispisati cijeli broj (npr. (I10)). Ako ispis
broja ne stane u naznaenu irinu, ispisuju se zvjezdice. Ako je broj krai od naznaene irine, broj se ispisuje na desnom kraju s
prazninom (ne raunajui predznak) ispred. Praznina ispred moe se popuniti s nulama ako iza naznaene irine se doda toka i
dodatna brojka. Dodatna brojka oznaava minimalni broj znamenki u broju, raunajui i nule ispred. Obavezno ili opcionalno
ispisivanje predznaka se posebno moe regulirati s ureivanjem.
i = 1234 ! 123456789_123456789_
PRINT (i3),i ! ***
PRINT (i5),i ! 1234
PRINT (i10),i ! 1234
PRINT (i10.7),i ! 0001234
PRINT (i16),i ! 1234
Stari format ispisa niza znakova je H format (Hollerith format). U ovom formatu se ispisuje svaki znak posebno.
Format F je normalni ispis. Prvi broj ispred toke oznaava ukupan broj mjesta rezerviran za ispis broja, a broj iza toke oznaava
broj mjesta rezerviran za decimale. U prvi broj se broje i predznak, decimalna toka, eksponent i predznak eksponenta. Ako je broj
koji se eli ispisati malen, biti e ispisane nule, a ako je velik ispisati e se zvjezdice.
REAL A
A=.123E-12 ! 123456789_123456789_
PRINT (f15.5)',A ! 0.00000
A=.123E+12
PRINT (f8.2)',A ! ********
Format E je za znanstveni (eksponencijalni) ispis.Kao i kod F formata broj ispred toke oznaava ukupan broj mjesta rezerviran za
ispis broja, a broj iza toke oznaava broj mjesta rezerviran za decimale. G format, u sluaju kada je broj normalne veliine ispisuje
ga u F formatu, a ako je velik ili malen u E formatu
REAL A
A=.123E-12 ! 123456789_123456789_
PRINT (e15.5)',A ! 0.12300-12
PRINT (g15.5)',A ! 0.12300-12
A=123.1
PRINT (e15.5)',A ! 0.12310+03
PRINT (g15.5)',A ! 123.10
Kako je vidljivo na gornjem primjeru, iako broj 123.1 zapisuje u normalnom formatu, G format ostavlja 3 mjesta rezervirana za
eksponent i predznak eksponenta, pa to treba uzeti u obzir prilikom dimenzioniranja formata.
Takoer, treba imati na umu da kod realnih varijabli dvostruke preciznosti (KIND=8), eksponent se sastoji od tri znamenke.
Kod E formata neeksponencijalni dio broja je izmeu 1.0 i 0.1 (broj uvijek ima oblik: 0.xxxx-yy). ES oznaava tz. znanstveno
ureivanje, sve brojke se ispisuju tako da je neeksponencijalni dio broja manji od 10 a vei od 1. EN je tzv. inenjersko ureivanje,
neeksponencijalni dio broja je manji od 1000 a vei od 1.
Opcionalno mogue je regulirati broj znamenki u eksponentu (e20.5E3 - 3 znamenke za eksponent).
Argument [UNIT=]<cijeli_broj> specificira broj ureaja. Ime argumenta UNIT je opcionalno, tj. moe se ispustiti, to je
naznaeno stavljanjem toga argumenta u uglate zagrade konvencija iz help-a.
Argument FILE odreuje ime datoteke koja se otvara.
Opcionalni argument FORM ima dvije vrijednosti:
FORMATTED - Zapisi su ureeni i moe ih se itati. Ova vrijednost je pretpostavljena ako drugaije nije navedeno.
UNFORMATTED - zapisi su u binarnom obliku.
Argument STATUS govori o stanju ureaja, da li je stara ili nova datoteka. Mogue vrijednosti su:
OLD - radi se o datoteci koja ve postoji.
NEW - treba otvoriti novu datoteku.
REPLACE - staru datoteku treba zamijeniti novom.
SCRATCH - privremena datoteka koja e po zatvaranju biti izbrisana.
UNKNOWN - Ako postoji otvara se kao OLD datoteka, a ako ne postoji onda kao NEW.
Argument ACCESS specificira nain pristupa zapisima u ureaju. Postoje dvije mogunosti:
SEQUENTIAL - za itanje ili pisanje liniju po liniju,
DIRECT - za direktni pristup pojedinim zapisima uz pomo ID broja zapisa. U ovom sluaju je potrebno kod otvaranja
navesti i duinu zapisa pomou opcionalnog argumenta RECL=duina_zapisa.
Argument ACTION navodi nau nakanu: itanje, pisanje ili oboje. Mogue vrijednosti su:
READ - otvaramo ureaj samo za itanje,
WRITE - otvaramo ureaj samo za pisanje,
READWRITE - otvaramo ureaj za itanje i pisanje (pretpostavljena vrijednost).
Argument ERR navodi broj labele u Fortranskom programu na koju treba ii ako doe do greke kod otvaranja ureaja.
Opcionalni argument IOSTAT=<int_varijabla> pridjeljuje vrijednost cjelobrojnoj varijabli u sluaju greke. Iznos varijable
indicira vrst greke.
Ako IOSTAT ili/i ERR nisu prisutni u pozivu naredbe OPEN, greka kod otvaranja izazvat e prijevremeni zavretak programa.
Ureaj zatvaramo naredbom CLOSE(<broj_ureaja>). Pri tome treba navesti broj ureaja koji se zatvara. Dodatni argument je
STATUS s dvije mogue vrijednosti: 'KEEP' ili 'DELETE'.
PROGRAM Datoteka
INTEGER :: ioerr
OPEN(14, FILE=input.dat, STATUS=OLD, FORM=FORMATTED,
& ACCESS=SEQUENTIAL, ACTION=READ, ERR=10, IOSTAT=ioerr)
................
READ(14,..) ....
................
CLOSE(14, STATUS=KEEP)
10 IF (ioerr>0) THEN
WRITE (*,*) Greska kod otvaranja :,iostat
STOP
END IF
END PROGRAM
Veina argumenata ima standardno znaenje kao i kod naredbi OPEN, tj. WRITE. Osim njih kao dodatne opcionalne argumente
imamo:
END=<labela>, koje imenuje broj labele na koju treba programa skoiti ako se pokua itati iza oznake kraja datoteke.
Argument EOR imenuje broj labele s koje se nastavlja izvravanje programa ako se pokua itati iza kraja zapisa datoteke.
S argumentom REC navodi se broj zapisa kod direktnog itanja.
Argument SIZE se koristi zajedno s argumentom ADVANCE i njime se imenuje varijabla koja sadri podatak koliko je znakova
proitano.
Kao i kod WRITE kod naredbe READ najee se koriste samo oznaka jedinice i oznaka formata.
C
SUBROUTINE INPUT
CHARACTER*80 TEXT
C
C*** OTVARANJE ULAZNOG I IZLAZNOG FAJLA
OPEN (UNIT=10,FILE='Input.dat',FORM='FORMATTED',STATUS='OLD',ERR=9990)
OPEN (UNIT=11,FILE='Output.dat',FORM='FORMATTED')
C
C*** UCITAVANJE OSNOVNOG RETKA
READ (10,'(A80)') TEXT
WRITE (11,'(A10,A80)') ' Naslov: ',TEXT
C
C*** UCITAVANJE OSNOVNIH PARAMETARA MODELA
READ (10,*) NELEM,NPOIN,NFIXE,NMATS
WRITE (11,20)
20 FORMAT (//,' Broj stapova : ',I5,
& ' Broj cvorova : ',I5,
& ' Broj pridrz. cvorova : ',I5,
& ' Broj materijala : ',I5)
C
C*** UCITAVANJE KOORDINATA CVOROVA
WRITE (11,30)
WRITE (11,31)
DO I=1,NPOIN
READ (10,*) IPOIN, CVOR(IPOIN).CX, CVOR(IPOIN).CY,
& CVOR(IPOIN).BC(1),CVOR(IPOIN).BC(2),CVOR(IPOIN).BC(3)
WRITE (11,32) IPOIN, CVOR(IPOIN).CX, CVOR(IPOIN).CY,
& CVOR(IPOIN).BC(1),CVOR(IPOIN).BC(2),CVOR(IPOIN).BC(3)
ENDDO
30 FORMAT (/,/,' CVOR X Y PRIDRZ')
31 FORMAT ( '---------------------------------------------')
32 FORMAT (I5,2F14.3,5X,3I3)
................
C...itd..........
................
GOTO 9999
9990 WRITE (*,'(/,A40)') ' Nepostojeca ulazna datoteka!'
C
9999 CONTINUE
RETURN
END
7. Funkcije i Subrutine
7.1 Openito
Funkcije i Subrutine (FUNCTION i SUBROUTINE) su zasebni dijelovi programa koji obavljaju odreenu operaciju. Osnovna razlika
Funkcija i Subrutina je ta to funkcije povratno vraaju samo jednu vrijednost, dok Subrutine mogu imati cijeli niz povratnih
vrijednosti.
Veliki niz funkcija su bibliotene funkcije, koje esto i nesvjesno koristimo. To su obino matematike funkcije koje dolaze s radnim
okrujem i automatski se linkaju s programom (ako je potrebno). To su npr. (jedan mali podskup):
FUNKCIJA to radi
ABS (a) absolutna vrijednost
SIGN (a,b) vrijednost od a s predznakom od b
SQRT (a) kvadratni korjen
SIN (a) sinus od a (argument u radijanima)
COS (a) kosinus od a
TAN (a) tanges od a
ASIN (a) arkus sinus - inverzna funkcija od sinusa
ACOS (a) arkus kosinus
ATAN (a) arkus tanges od a
EXP (a) eksponent (prirodni)
LOG (a) prirodni logaritam
LOG10 (a) logaritam u bazi 10
SINH (a) hiperbolini sinus
COSH (a) hiperbolini kosinus
TANH (a) hiperbolini tanges
Upotreba ovih funkcija je jednostavna, kako je prethodno pokazano na primjeru funkcije SQRT.
Osim bibliotenih mogue je formirati i cijeli niz drugih funkcija.
Kompajler ne prijavljuje greku u kdu, pa ako programer ne obrati panju na dobivene rezultate, rezultat je stvarno nepredvidiv.
Takoer, argumenti koji se predaju funkciji i argumenti u funkciji moraju biti istog tipa (iako nije vano da imaju i isto ime). Pogrean
tip varijable esto dovodi do nepredvidivih greaka. Primjer s grekom u argumentima prikazan je kod subrutine.
PROGRAM NNN
IMPLICIT NONE
INTEGER*4 NN
WRITE (*,10)
READ (*,20) NN
WRITE (*,30) ' N je : ',NN
CALL PROMIJENI(NN)
WRITE (*,30) ' N je : ',NN
10 FORMAT (' Upisi broj : ',$)
20 FORMAT (I5)
30 FORMAT (A,I15)
END PROGRAM
C
SUBROUTINE PROMIJENI(N)
IMPLICIT NONE
INTEGER*4 N
N=N+1
RETURN
END
Rezultat izvrenja donjeg programa (ako za N upiemo npr. broj 12) je:
Kratki komentar:
Glavni program inicira cjelobrojnu varijablu NN i uita je s tipkovnice. Tu varijablu sprema na odreeno mjesto u memoriji
(memorijsku lokaciju) veliine 4 byte-a. Program zatim poziva subrutinu istovremeno joj aljui memorijsku lokaciju na kojoj je
spremljena varijabla NN. Subrutina prima tu varijablu, ali je grekom inicira kao realnu. Odlazi na dobru memorijsku lokaciju ali ita
varijablu na pogrean nain (s nepredvidivim rezultatom). Usput, ime ove varijable je N, to je sasvim nebitno raunalu.
Vrijednost varijable uveava za 1 te tako uveanu vrijednost sprema na istu lokaciju, te se vraa u glavni program. Glavni program
ispisuje vrijednost iz zadane memorijske lokacije, ali sada ponovno itajui varijablu kao cjelobrojnu. Konana vrijednost je sasvim
nepredvidiva.
Posebnu panju treba posvetiti prilikom prijenosa polja (matrica) u subrutinu. Sljedei primjer pokazuje neke osobitosti prijenosa
matrica u i iz subrutine.
PROGRAM POLJA
IMPLICIT NONE
INTEGER*4 I,J,A(5,5)
C Punjenje vrijednsti u 'A'
CALL NAPUNI_A(A)
C Original matrica 'A'
WRITE (*,10) ((A(I,J),J=1,5),I=1,5)
WRITE (*,20) '----------------------'
C Promijeni vrijednsti u 'A'
CALL PROMJENI_A_1(A)
C Promijenjena matrica 'A' - 1. put
WRITE (*,10) ((A(I,J),J=1,5),I=1,5)
WRITE (*,20) '----------------------'
C Vrati na staro
CALL NAPUNI_A(A)
C Promijeni vrijednsti u 'A'
CALL PROMJENI_A_2(A)
C Promijenjena matrica 'A' - 2. put
WRITE (*,10) ((A(I,J),J=1,5),I=1,5)
WRITE (*,20) '----------------------'
C Vrati na staro
CALL NAPUNI_A(A)
C Promijeni vrijednsti u trecem stupcu 'A'
CALL PROMJENI_A_3(A(1,3))
C Promijenjena matrica 'A' - 3. put
WRITE (*,10) ((A(I,J),J=1,5),I=1,5)
WRITE (*,20) '----------------------'
C
10 FORMAT (5I10)
20 FORMAT (A)
C
END PROGRAM
C------------------------------------------
SUBROUTINE NAPUNI_A(A)
IMPLICIT NONE
INTEGER*4 I,J,A(5,5)
DO I=1,5
DO J=1,5
A(I,J)=I*10+J
ENDDO
ENDDO
RETURN
END
C------------------------------------------
SUBROUTINE PROMJENI_A_1(A)
IMPLICIT NONE
INTEGER*4 I,J,A(5,5)
DO I=1,5
DO J=1,5
A(I,J)=A(I,J)+100
ENDDO
ENDDO
RETURN
END
C------------------------------------------
SUBROUTINE PROMJENI_A_1_1(A)
IMPLICIT NONE
INTEGER*4 I,J,A(5,5)
A=A+100
RETURN
END
C------------------------------------------
SUBROUTINE PROMJENI_A_2(A)
IMPLICIT NONE
INTEGER*4 I,A(25)
DO I=1,25
A(I)=A(I)+100
ENDDO
RETURN
END
C------------------------------------------
SUBROUTINE PROMJENI_A_3(A)
IMPLICIT NONE
INTEGER*4 I,A(5)
DO I=1,5
A(I)=A(I)+100
ENDDO
RETURN
END
C------------------------------------------
Sljedea subrutina (FILNAM) prima ime ulazne datoteke, skida joj ekstenziju, te vraa ime s dodanom novom ekstenzijom. Tako se
nakon to korisnik upie ime ulazne datoteke (npr. podaci.dat), stvaraju dvije nove datoteke: podaci.izl za izlazne rezultate i
podaci.dxf za dxf (AutoCAD) file.
PROGRAM AAAA
IMPLICIT NONE
CHARACTER*13 INPUT1,OUTPUT,DXFOUT
C
C*** DEKLARACIJA OSTALIH VARIJABLI U PROGRAMU
................
................
C
C*** UCITAVANJE ULAZNOG I IZLAZNOG FAJLA
WRITE (*,14)
READ (*,15) INPUT1
CALL FILNAM(INPUT1,OUTPUT,'IZL')
CALL FILNAM(INPUT1,DXFOUT,'DXF')
WRITE (*,16) OUTPUT
WRITE (*,18) DXFOUT
C
14 FORMAT (' Ulazna datoteka: ',$)
15 FORMAT (A13)
16 FORMAT (' Izlazna datoteka: ',A13)
18 FORMAT (' DXF datoteka: ',A13)
C
OPEN (UNIT=10,FILE=INPUT1,FORM='FORMATTED',STATUS='OLD',ERR=9990)
OPEN (UNIT=11,FILE=OUTPUT,FORM='FORMATTED')
OPEN (UNIT=88,FILE=DXFOUT,FORM='FORMATTED')
................
C...itd..........
................
CLOSE (UNIT=10)
CLOSE (UNIT=11)
CLOSE (UNIT=88)
END
C
C
C---------------------------------------------------------------------
SUBROUTINE FILNAM(FILEIN,FILEOU,EXT)
IMPLICIT NONE
CHARACTER*13 FILEIN,FILEOU
CHARACTER*3 EXT
INTEGER I, NUM
NUM=0
DO I=1,9
NUM=I
IF(FILEIN(I:I).EQ.' ') EXIT
IF(FILEIN(I:I).EQ.'.') EXIT
FILEOU(I:I)=FILEIN(I:I)
ENDDO
C
FILEOU(NUM:NUM)='.'
DO I=1,3
FILEOU((NUM+I):(NUM+I))=EXT(I:I)
ENDDO
RETURN
END
C---------------------------------------------------------------------
(2)
f = {f , f , m }
T
x y z
1.0 1.0
h1 h3
h4
1.0
0 l 0 l 0 l
1.0 1.0
h2 h5
0 l
h6 1.0
0 l 0 l
u Ts + p T f dx = D dx (8)
odnosno:
(
u Ts + u T H T f dx = u B T D B u dx ) (9)
tj., nakon mnoenja s lijeve strane s uT :
s= (B )
D B u dx H T f dx (10)
T
ili skraeno:
se = k e u F e (11)
gdje su:
se - vektor reznih sila na krajevima konanog elementa
k e - matrica krutosti elementa
F e - vektor sila pune upetosti
Kombinacija otputanja mora dati k nn kao regularnu matricu, inae smo otputanjem element pretvorili u lokalni
mehanizam. Iz grupe jednadbi otputenih veza otputeni pomaci se mogu izraziti u funkciji neotputenih, prema:
1
u o = k oo (
Fo k on u n ) (14)
Sile u neotputenim vezama dobivamo iz grupe jednadbi neotputenih veza kao:
s en = k nn u n k no u o Fn (15)
Uvoenjem (6.16) u (6.17) moemo eliminirati otputene pomake:
1 1
s en = k nn u n + k nok oo k on u n k nok oo Fo Fn (16)
ili skraeno
( )
s en = k nn + k nn u n F n Fn (17)
odnosno
sen = k u n F (18)
Posljednja relacija (18) predstavlja kondenzirane jednadbe ravnotee konanog elementa koje moramo rastegnuti na
poetno stanje tako da svaku pojedinu jednadbu vratimo na poziciju veze koja nije otputena, dok e se na pozicijama otputenih
veza javiti nul jednadbe.
k egl = TT k e T
(19)
Fgle = T F e
Preslikavanje se vri matricom transformacije (T), koja ima oblik:
(
cos x l , x g ) ( )
cos y l , x g
T= (20)
(
cos x l , y g ) ( )
cos y l , y g
Uvrtavanjem rubnih uvjeta dobivamo ravnoteu globalnog sustava u sljedeem obliku:
K= k
e
e
gl ; F= F e
e
gl
(21)
Ku = F
gdje su K i F matrice krutosti i optereenja, a u vektor globalnih pomaka.
Odmah zatim kreirajmo i osnovnu datoteku s izvornim Fortranskim kdom. Koristit emo fiksni zapis.
Definirajmo odmah i duinu zapisa realnih i cjelobrojnih varijabli. Upotrijebimo opcije: ProjectSettings, pa na tabu: Fortran
izaberimo opciju Fortran data.
Podesimo Default real kind na 8 (8 byte-ova po jednoj realnoj varijabli) i Default integer kind na 4 (4 byte-a po jednoj cjelobrojnoj
varijabli to je i default vrijednost).
Ako prihvatimo ovaj tok programa, tada moemo kreirati (kodirati) osnovno tijelo programa:
PROGRAM Stasus2D
C Definiranje varijabli
Ovaj program je sasvim korektan, iako jo uvijek nije funkcionalan. Ako ga probamo kompajlirati vidjet emo da ga kompajler uredno
prevodi. S druge strane linker javlja greke. To je sasvim razumljivo jer navedene subrutine nismo jo definirali niti se one nalaze u
standardnim bibliotekama okruenja.
Prije prijelaza na definiranje samih dijelova programa (subrutina), definirajmo osnovne varijable.
Tekui projekt
NAPOMENA: Iskljuiti Add to project, datoteka se
ne dodaje projektu
Ime datoteke
NAPOMENA: Upisati ime i dodati nastavak: .inc.
Datoteka Stasus2D.inc se pojavljuje u radnom dijelu okruenja (sredinji prozor). Vidljivo je da nema zelenu crtu, jer je program
ne prepoznaje kao fortransku datoteku.
Definirajmo odmah na poetku neke maksimalne vrijednosti. Ove vrijednosti je, dakako, kasnije mogue mijenjati. Definirajmo
vrijednosti za maksimalni broj tapova, maksimalni broj vorova i maksimalni broj materijala. Upotrijebit emo naredbu PARAMETER
koja definira nepromjenjivu konstantu.
C---------------------------------------------------
C INCLUDE FILE ZA PROGRAM
C STAPNI SUSTAVI
C
C---------------------------------------------------
C MAKSIMALNI PARAMETRI
C
C MXNODE - MAKSIMALNI BROJ CVOROVA
C MXELEM - MAKSIMALNI BROJ ELEMENATA
C MXMATE - MAKSIMALNI BROJ MATERIJALA
C
PARAMETER (MXNODE=500, MXELEM=100, MXMATE=10)
C---------------------------------------------------
Definirajmo takoer i stvarni broj tapova, vorova, pridranih vorova i materijala. Ovi podaci e se uitavati za svaki model
posebno. Dakle, to su cjelobrojne varijable.
C---------------------------------------------------
C STVARNI PARAMETRI MODELA
C
C NELEM - BROJ STAPOVA
C NPOIN - BROJ CVOROVA
C NFIXE - BROJ PRIDRZANIH CVOROVA
C NMATS - BROJ MATERIJALA
C
INTEGER NELEM,NPOIN,NFIXE,NMATS
C---------------------------------------------------
Za opis vorova definirat emo sloeni tip podataka u kojem emo uvati sve podatke za svaki pojedini vor. Dakle, svaki vor ima
svoju oznaku, koordinate (x i y), oznaku rubnog uvjeta, nain pridranja, prisilni (poetni) pomak u x i/ili y smjeru te rotaciju i rezultate
prorauna: pomak u x i y smjeru i rotaciju. Svaki ovaj podatak moe se uvati u posebnoj varijabli (polju, matrici) ili se moe kreirati
sloeni tip podataka koji e sve ove podatke uvati na jednom mjestu.
C---------------------------------------------------
C STRUKTURA CVORA
C
C ICVOR - oznaka cvora
C COORD(2) - koordinata cvora: X-COORD(1) i Y-COORD(2)
C BC - rubni uvjet cvora (0 - slobodan, 1 - pridrzan)
Zadnji redak kreira sloeni tip podataka CVOR, koji je tipa OPIS_CVORA i ukupno sadrava MXNODE lanova.
Jednaki postupak emo upotrijebiti za tapove. Kreirati emo sloeni tip podataka strukturu, koja e u sebi sadravati: oznaku
(ime) tapa, poetni i krajnji vor tapa, oznaku materijala od kojeg je tap izraen te duinu tapa (koja e se naknadno izraunati i
upisati u strukturu). Takoer u strukturi emo uvati izlazne rezultate: rezne sile na oba kraja tapa
C---------------------------------------------------
C STRUKTURA STAPA
C
C ISTAP - oznaka stapa
C C1 - Pocetni cvor na stapu
C C2 - Krajnji cvor na stapu
C MAT - materijal stapa
C LEN - duzina stapa (interno)
C FORC(6) izracunate rezne sile
C N1,T1,M1 i N2,T2,M2
C
STRUCTURE /OPIS_STAPA/
INTEGER ISTAP
INTEGER C1,C2
INTEGER MAT
REAL LEN
REAL FORC(6)
END STRUCTURE
RECORD /OPIS_STAPA/ STAP(MXELEM)
C
C---------------------------------------------------
Zadnji redak kreira sloeni tip podataka STAP, koji je tipa OPIS_STAPA i ukupno sadrava MXELEM lanova.
Takoer, isti postupak emo upotrijebiti za opis materijala. U strukturu materijala uvrstiti emo materijalne karakteristike tapa i
karakteristike poprenog presjeka tapa:
C---------------------------------------------------
C
C MATERIJALNE I GEOMETRIJSKE KARAKTERISTIKE
C
C E - modul elasticnosti
C NI Poissonov koeficijent
C G - MODUL POSMIKA
C A - POVRSINA
C I - MOMENT INERCIJE
C
STRUCTURE /MAT_GEOM_KAR/
REAL A,I,E,NI,G
END STRUCTURE
RECORD /MAT_GEOM_KAR/ GEOM(MXMATE)
C
C---------------------------------------------------
Zadnji redak,kao i u ranijim sluajevima, kreira sloeni tip podataka GEOM, koji je tipa MAT_GEOM_KAR i ukupno sadrava
MXMATE lanova.
Definirajmo i strukturu optereenje, koju emo detaljno komentirati kasnije:
C---------------------------------------------------
C
C STRUKTURA OPTERECENJA
C
C TIP OPTERECENJA 1 - CVORNO
C MOZE SE ZADATI: SILA U SMJEROVIMA X I Y I MOMENT OKO Z
C TIP OPTERECENJA 2 - JEDNOLIKO PO STAPU
C ZADAJE SE Q - INTENZITET
C L1 - POCETAK DJELOVANJA OD CVORA 1
C L - DUZINA DJELOVANJA
STRUCTURE /OPTERECENJE/
Ovdje su definirana dva polja iz sloenog tipa podataka strukture OPTERECENJE: PLOAD (Point Load) koja uva podatke o
vornom optereenju i MLOAD (Member Load) koja uva podatke o optereenju po elementima.
Konano, omoguimo da svi ovi globalni podaci budu na zajednikom dijelu memorije:
C---------------------------------------------------
C
C ZAJEDNICKO PODRUCJE ZA DOSTUPNOST PODATAKA
COMMON /GEOM_1/ CVOR, STAP, GEOM
COMMON /GEOM_2/ NELEM,NPOIN,NFIXE,NMATS
COMMON /GEOM_3/ PLOAD, SLOAD
C
C---------------------------------------------------
Da bi glavni dio programa vidio ove globalne podatke potrebno ih je ukljuiti u njemu. To postiemo naredbom INCLUDE u
glavnom dijelu programa. Dakle, u glavnom programu dodajmo sljedei redak ( oznaavaju da ostatak ostaje nepromijenjen):
PROGRAM Stasus2D
C Definiranje varijabli
INCLUDE Stasus2D.inc
C Ucitavanje ulaznih podataka
......
Naredba: INCLUDE Stasus2D.inc daje nalog kompajleru da na tom mjestu u potpunosti ukljui sadraj datoteke Stasus2D.inc. Ovo
ujedno i znai da datoteka mora biti pisana po svim pravilima fortranskog zapisa. Dakle, ako je fiksni zapis tada stupci 1-6 moraju
ostati slobodni, ne smije se pisati preko 72. stupca itd.
1 OSUBROUTINE INPUT()
2 C Definiranje varijabli
3 OIMPLICIT NONE
4 OINCLUDE Stasus2D.inc
5 OCHARACTER*13 INPUT1,OUTPU1,DXFOU1
6 C
7 C Ucitavanje imena datoteka
8 OWRITE (*,14)
9 OREAD (*,15) INPUT1
10 OCALL FILNAM(INPUT1,OUTPU1,'IZL')
11 OCALL FILNAM(INPUT1,DXFOU1,'DXF')
12 OWRITE (*,16) OUTPUT
13 OWRITE (*,18) DXFOUT
14 C
15 14OFORMAT (' Ulazna datoteka: ',$)
16 15OFORMAT (A13)
17 16OFORMAT (' Izlazna datoteka: ',A13)
18 18OFORMAT (' DXF datoteka: ',A13)
19 C
20 OOPEN (UNIT=10,FILE=INPUT1,FORM='FORMATTED',STATUS='OLD',ERR=9990)
21 OOPEN (UNIT=11,FILE=OUTPU1,FORM='FORMATTED')
22 OOPEN (UNIT=88,FILE=DXFOU1,FORM='FORMATTED')
23 C
24 C Ucitavanje osnovnog retka
25 READ (10,'(A80)') TEXT
26 WRITE (11,'(A10,A80)') ' Naslov: ',TEXT
27 C
28 C UCITAVANJE OSNOVNIH PARAMETARA MODELA
29 READ (10,*) NELEM,NPOIN,NFIXE,NMATS
30 WRITE (11,20)
31 20 FORMAT (//,' Broj stapova : ',I5,
32 & ' Broj cvorova : ',I5,
33 & ' Broj pridrz. cvorova : ',I5,
1 OSUBROUTINE FILNAM(FILEIN,FILEOU,EXT)
2 OIMPLICIT NONE
3 OCHARACTER*13 FILEIN, FILEOU
4 OCHARACTER*3 EXT
5 OINTEGER NUM, I
6 ONUM=0
7 O DO I=1,9
8 O NUM=I
9 O IF(FILEIN(I:I).EQ.' ') EXIT
10 O IF(FILEIN(I:I).EQ.'.') EXIT
11 O FILEOU(I:I)=FILEIN(I:I)
12 O ENDDO
13 C
14 O FILEOU(NUM:NUM)='.'
15 O DO I=1,3
16 O FILEOU((NUM+I):(NUM+I))=EXT(I:I)
17 O ENDDO
18 ORETURN
19 OEND