BJ30A1000 Kemiantekniikan tietotekniikka Fortran



Samankaltaiset tiedostot
Johdatus f90/95 ohjelmointiin. H, R & R luvut 1-3

Fortran 90/95. + sopii erityisesti numeriikkaan:

Tietotyypit ja operaattorit

Johdatus Ohjelmointiin

Java-kielen perusteet

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteet

Ohjelmoinnin peruskurssi Y1

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Kielioppia: toisin kuin Javassa

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin peruskurssi Y1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin perusteet Y Python

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Ohjelmoinnin perusteet Y Python

Numeeriset menetelmät

Harjoitus 1 -- Ratkaisut

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Ehto- ja toistolauseet

Merkitse kertolasku potenssin avulla ja laske sen arvo.

4. Lausekielinen ohjelmointi 4.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

811120P Diskreetit rakenteet

TIE Johdatus ohjelmointiin

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Python-ohjelmointi Harjoitus 2

811120P Diskreetit rakenteet

Java-kielen perusteita

Valitse ruudun yläosassa oleva painike Download Scilab.

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Ohjelmoinnin perusteet Y Python

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Juha Haataja, Jussi Rahola ja Juha Ruokolainen

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Makrojen mystinen maailma lyhyt oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python


Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

etunimi, sukunimi ja opiskelijanumero ja näillä

Harjoitus 1 -- Ratkaisut

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 5

811120P Diskreetit rakenteet

PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2

3. Muuttujat ja operaatiot 3.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Aloitustunti MAA22 Starttikurssi pitkän matematiikan opiskeluun

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

Muistutus aikatauluista

811120P Diskreetit rakenteet

7. Näytölle tulostaminen 7.1

PHP tehtävä 3 Atte Pekarinen TIKT13A

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Ohjelmoinnin perusteet Y Python

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Datatähti 2019 alku. task type time limit memory limit. A Kolikot standard 1.00 s 512 MB. B Leimasin standard 1.00 s 512 MB

Tutoriaaliläsnäoloista

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

4 Yleinen potenssifunktio ja polynomifunktio

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Zeon PDF Driver Trial

Numeeriset menetelmät

Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet:

Transkriptio:

BJ30A1000 Kemiantekniikan tietotekniikka Fortran Kimmo Klemola 21.04.2008 April 18, 2008 Kimmo Klemola 1 Fortran johdatusta Fortran-ohjelmointiin Materiaalina käytetty mm. CSC:n Fortran 90/95 opasta (Haataja, Rahola, Ruoholainen) http://www.csc.fi/oppaat/f95/ April 18, 2008 Kimmo Klemola 2 Fortran 1

Fortran Fortran on vanhin, tärkein ja käytetyin ohjelmointikieli tieteellisessä ja teknisessä laskennassa (numeerisessa laskennassa). Fortran-kielen kehitys lähti käyntiin IBM:llä vuonna 1954, jolloin esiteltiin suunnitelma ohjelmointikielestä nimeltä FORmula TRANslator eli FORTRAN. Fortranin käytetyimpiä versioita ovat olleet FORTRAN IV, FORTRAN 66 ja FORTRAN 77. Fortran oli myös ensimmäinen ohjelmointikieli, josta luotiin standardi (FORTRAN 66 vuonna 1966). Vuonna 1978 valmistui vielä nykyäänkin yleisesti käytetty vaikkakin jo vanhahtava FORTRAN 77 -standardi. Fortran 95 on kielen uusin ANSI- ja ISO-standardi, joka on vakiinnuttamassa asemansa tieteellisen ja teknisen laskennan valtakielenä. Fortran 95 on pienehkö päivitys Fortran 90 -standardiin. Fortran 95 on uusin kielen versio. Se hyväksyttiin vuonna 1997 kansainväliseksi standardiksi. Vanha Fortran-kielen standardi (FORTRAN 77) muodostaa Fortran 90/95:n osajoukon, joten kieli on yhteensopiva vanhojenkin koodien kanssa. Fortran-kieltä kehitetään edelleen aktiivisesti. April 18, 2008 Kimmo Klemola 3 Tietokone ja ohjelmointi Tietokoneen ymmärtämä kieli koostuu joukosta konekäskyjä, joita suorittamalla tietokone saadaan tekemään haluttuja asioita. Tietokoneet pystyvät suorittamaan miljardeja konekäskyjä sekunnissa. Erityyppiset tietokoneet ymmärtävät kukin omaa konekieltään, joten konekielisen ohjelman siirto koneesta toiseen on hankalaa ellei peräti mahdotonta. Lisäksi ohjelmointi konekäskyjen avulla on aikaa vievää ja virhealtista puuhaa. Tietokoneen ohjaaminen hoidetaan konekielen sijaan yleensä ohjelmointikielen avulla. Tämä mahdollistaa konekieltä paremman ohjelmistojen siirrettävyyden. Ohjelmointikielen kääntäjä (compiler) hoitaa automaattisesti konekäskyjen tuottamisen ohjelmakoodista. Täten ohjelmointikielen käyttö helpottaa huomattavasti tehtävien ratkaisua tietokoneella. Eri ohjelmointikielet on suunniteltu erilaisiin tehtäviin. Ohjelmointikieliä on kehitetty tuhansia, mutta vain muutamat niistä ovat laajassa käytössä. April 18, 2008 Kimmo Klemola 4 Fortran 2

Tietokone ja ohjelmointi Tietokoneen keskusyksikkö toimii ohjelmakoodin sisältämien käskyjen mukaisesti. Ohjelma lukee tavallisesti joukon syöttötietoja, jotka vaihtelevat ohjelman ajokerrasta toiseen. Ohjelma lukee syöttötiedot sisään esimerkiksi tiedostoista tai käyttäjän näppäimistöltä. Syöttötietoja voisivat olla esimerkiksi säähavaintopisteistä kerätyt mittausarvot kuten lämpötila, ilmanpaine ja kosteus. Sääennusteen laskemiseen kehitetty ohjelma voisi näiden syöttötietojen perusteella laskea ja tulostaa ennusteen seuraavien 48 tunnin ajaksi. Tietokoneen keskusyksikkö käsittelee keskusmuistissa sijaitsevaa dataa. Esimerkiksi sääennusteen laskennan eri vaiheissa tarvittava data voidaan pitää tietokoneen keskusmuistissa. Keskusyksikkö voi myös kirjoittaa ja lukea tiedostoja, jotka mahdollistavat tiedon säilyttämisen ohjelman suorittamisen loppuessa: kun ohjelman suoritus päättyy, käytetään vapautunut keskusmuisti seuraavien ohjelmien ajamiseen. Tätä ennen tulee laskentatulokset tallettaa tiedostoihin, sillä pysyvien tiedostojen sisältö säilyy ohjelman suorittamisen loputtuakin. April 18, 2008 Kimmo Klemola 5 Tietokone ja ohjelmointi Tiedostojen käsittely on yleensä hitaampaa kuin keskusmuistin käyttö. Keskusyksikkö voi tiedostoihin tallettamisen lisäksi tulostaa tietoa käyttäjän laitteen (päätteen, mikron tai työaseman) kuvaruudulle. Tietokoneen toiminnan periaate: April 18, 2008 Kimmo Klemola 6 Fortran 3

Ohjelmointikielet Ohjelmointikielten tulee olla: täysin yksiselitteisiä (toisin kuin esimerkiksi suomen kielen) helppokäyttöisiä käytännöllisiä kääntäjän tulee kyetä helposti kääntämään ohjelman käskyt konekielelle Kaikilla ohjelmointikielillä on erittäin tarkka syntaksi ja kielioppi, jotta ohjelman käskyt olisivat yksiselitteisiä. April 18, 2008 Kimmo Klemola 7 Ohjelmoinnin eri vaiheet Kun kehität ohjelmistoa annettuun tehtävään, pidä mielessä seuraavat ohjelmoinnin vaiheet: 1. tehtävän tavoitteen määrittely 2. tehtävän analyysi ja ohjelmakoodin suunnittelu 3. ohjelmakoodin kirjoittaminen 4. testaaminen ja virheiden korjaaminen 5. dokumentointi 6. ohjelmiston käyttö ja ylläpitäminen. April 18, 2008 Kimmo Klemola 8 Fortran 4

Ohjelman kääntäminen ja linkitys Käytännössä Fortran-koodista saa ajokelpoisen ohjelman seuraavasti: 1. kirjoita suunnitelman mukainen ohjelmakoodi yhteen tai useampaan tiedostoon 2. käännä lähdekooditiedostot objektikooditiedostoiksi 3. linkitä objektikooditiedostot ja mahdolliset aliohjelmakirjastot suorituskelpoiseksi ohjelmaksi 4. aja syntynyt ohjelma ja tarkista tulokset. April 18, 2008 Kimmo Klemola 9 Fortran-kääntäjä ja linkittäjä esimerkkinä Compaq Visual Fortran (keten mikroluokka) Lasketaan yksinkertainen lasku 7*52+1: 1. Avataan Compaq Visual Fortran, ikoni DFDEV 2. File New Files Fortran free format source file. Avautuvaan ikkunaan kirjoitetaan seuraava teksti: PROGRAM laskuesimerkki WRITE (*,*) 7*52+1 END PROGRAM laskuesimerkki 3. Tallennetaan tiedosto esimerkiksi nimellä laskuesimerkki. Tiedosto on laskuesimerkki.f90. f90-pääte tarkoittaa Fortran 90 -muotoista Free format source -tiedostoa. 4. Käännetään tiedosto konekielelle: Build Compile laskuesimerkki.f90 tai ikonista työkaluriviltä tai Ctrl+F7. 5. Linkitetään: Build Build laskuesimerkki.exe tai ikonista työkaluriviltä tai F7. 6. Ajetaan ohjelma: Build Execute laskuesimerkki.exe tai ikonista työkaluriviltä tai Ctrl-F5. 7. Näytölle tulostuu vastaus 365. April 18, 2008 Kimmo Klemola 10 Fortran 5

esimerkki PROGRAM laskuesimerkki WRITE (*,*) 7*52+1 END PROGRAM laskuesimerkki Pääohjelma aloitettiin PROGRAM-lauseella. Ohjelmakoodi lopetettiin lauseella END PROGRAM. Jokaisessa ajokelpoisessa ohjelmassa on vain yksi pääohjelma. Ohjelman tunnus oli ensimmäisessä esimerkissä laskuesimerkki. Tunnuksen pituus saa olla korkeintaan 31 merkkiä, ja tunnukseen kelpaavat kirjaimet A... Z, alaviiva _ sekä numerot. WRITE-lausetta käytetään tulostukseen. Merkintä 7*52 tarkoittaa kertolaskua ja merkki + yhteenlaskua. Lause WRITE (*,*) 7*52 + 1 tulostaa laskutoimituksen 7 52 + 1 tuloksen kuvaruudulle. WRITE (*,*) pitempi muoto on WRITE (UNIT=*,FMT=*): Ensimmäinen tähti vastaa oletusarvoista tulostuskanavaa (unit), joka on yleensä käyttäjän laitteen näyttö. Toinen tähti tarkoittaa, että kääntäjä valitsee tulostettavalle datalle sopivan oletusarvoisen tulostusasun (format). April 18, 2008 Kimmo Klemola 11 esimerkki Muutetaan edellistä ohjelmaa: PROGRAM laskuesimerkki WRITE (*,'(A9,F9.4)') 'Vastaus: ',7*52.0+1 END PROGRAM laskuesimerkki Ohjelman tuloste ruudulle on seuraava: Vastaus: 365.0000 Merkkijonovakio tulostettiin yhdeksän merkin levyiseen kenttään (muotoilukoodi A9). Laskutoimitus tulostettiin yhdeksän merkin levyiseen kenttään siten, että desimaalipisteen oikealla puolella oli neljä numeroa (F9.4). Huom! Voit kopioida copy-paste tämän esityksen ohjelmakoodia kääntäjälle ja tallettaa koodin *.f90-muotoon. Yläpilkun merkit saattaa joutua vaihtamaan manuaalisesti ä:n oikealla puolella olevaan. Näitä esimerkkejä kannattaa testata. April 18, 2008 Kimmo Klemola 12 Fortran 6

Muotoilukoodit Muotoilukoodi määrää, miten tieto pitää syötön tai tulostuksen yhteydessä muotoilla. Muotoilukoodi siis ilmaisee, kuinka leveään kenttään ja miten muotoiltuna kukin muuttuja tulisi kirjoittaa. Muotoilukoodi voidaan antaa eri tavoin: merkkijonovakiona, merkkijonolausekkeena, merkkijonomuuttujana tai FORMAT-lauseen lausenumerona. Aikaisemmissa esimerkeissä muotoilukoodi korvattiin symbolilla *, jolloin valittiin listan ohjaama muotoilu. Seuraavassa esimerkissä on muotoilukoodi I5 ilmaistu kolmella eri tavalla. Tämä koodi tulostaa kokonaisluvun (Integer) n viisi merkkiä leveään kenttään. PROGRAM tulosta INTEGER :: n = 34 CHARACTER(LEN=*), PARAMETER :: form = (I5) WRITE (*, (I5) ) n! Merkkivakio muotoilukoodina WRITE (*, form) n! Merkkijonomuuttuja (tässä vakio) WRITE (*, 30) n! FORMAT-lauseen käyttö 30 FORMAT (I5) END PROGRAM tulosta April 18, 2008 Kimmo Klemola 13 Muotoilukoodit - yhteenveto Yhteenveto eri tietotyypeille sopivista muotoilukoodeista. Merkintä w tarkoittaa kentän leveyttä, d desimaaliosan pituutta ja e eksponentin pituutta. April 18, 2008 Kimmo Klemola 14 Fortran 7

Muotoilukoodit - esimerkki PROGRAM muotoilukoodit WRITE (*,*) 42, 42.0, 0.42E2 WRITE (*,'(I10)') 42 WRITE (*,'(F12.8)') 42.0 WRITE (*,'(E12.4)') 42.0 WRITE (*,'(EN12.4)') 42.0 WRITE (*,'(ES12.4)') 42.0 WRITE (*,'(G9.4)') 42.0 END PROGRAM muotoilukoodit antaa ruudulle 42 42.00000000 0.4200E+02 42.0000E+00 4.2000E+00 42.00 42 42.00000 42.00000 Viimeisen desimaaliosa on kaventunut kahdella (E-koodin eksponenttiosan verran). April 18, 2008 Kimmo Klemola 15 Peruslaskutoimitukset Fortranin ymmärtämät peruslaskutoimitukset ovat +, -, *, / ja **. Nämä operaatiot vastaavat yhteen-, vähennys-, kerto- ja jakolaskua sekä potenssiin korottamista. Esimerkiksi lausekkeen 2**3 arvo on 2 3 = 2*2*2 = 8. Laskutoimitusten tulos riippuu argumenttien tyypistä. Lause WRITE (*,*) 52.0/7.0 =, 52.0/7.0,, 52/7 =, 52/7 tulostaa seuraavaa: 52.0/7.0 = 7.4285712, 52/7 = 7 Siis kokonaislukujen jakolaskun 52/7 tulos on myös kokonaisluku, ja murto-osa jätettiin huomiotta. Tarkista siis aina jakolaskun argumenttien tyypit! Jos jakolaskun argumenteista toinen on reaalilukutyyppiä, on tuloskin reaaliluku. Siten lausekkeen 52.0/7 arvoksi saadaan 7.4285712. April 18, 2008 Kimmo Klemola 16 Fortran 8

Muuttujat Edellisissä esimerkeissä käytettiin pelkästään ohjelmakoodiin sijoitettuja vakioita. Jos ohjelman halutaan laskevan jotain muuta, joudutaan tällöin muuttamaan ohjelmakoodia ja kääntämään ohjelma uudestaan. Muun muassa tämän takia ohjelmoinnissa käytetään muuttujia, jotka voivat saada eri arvoja ohjelman ajokerrasta toiseen. Esimerkki: 1. pyydetään syöttämään kaksi kokonaislukua 2. luetaan lukuarvot näppäimistöltä 3. tulostetaan syötetyt luvut ja niiden tulo. PROGRAM kertolasku! Ohjelma lukee kaksi kokonaislukua sekä! laskee ja tulostaa niiden tulon. INTEGER :: i, j WRITE (*,*) 'Syota luku i:' READ (*,*) i WRITE (*,*) 'Syota luku j:' READ (*,*) j WRITE (*,*) 'Luku i:', i WRITE (*,*) 'Luku j:', j WRITE (*,*) 'Tulo i*j:', i*j END PROGRAM kertolasku April 18, 2008 Kimmo Klemola 17 Muuttujat Huutomerkillä (!) alkavat rivit ovat kommentteja ja ne on tarkoitettu ohjeeksi ohjelman lukijalle ja käyttäjälle. Ohjelma ei siis ota huomioon huutomerkin jälkeen tulevaa tekstiä. Määrittely parantaa kääntäjän tekemiä virheentarkistuksia ja se on syytä laittaa jokaiseen ohjelmayksikköön otsikkolauseen (PROGRAM tms.) jälkeen! Tämä lause poistaa käytöstä tunnuksen ensimmäiseen kirjaimeen perustuvan tyyppimäärittelyn. Ohjelmassa määritellään kokonaislukumuuttujat i ja j rivillä INTEGER :: i, j Ohjelman toiminta voisi olla seuraavaa: April 18, 2008 Kimmo Klemola 18 Fortran 9

Muuttujat ja alkukirjainsääntö Vanhoissa Fortran-koodeissa on käytetty hyväksi muuttujien alkukirjainsääntöä (implicit typing), jolloin muuttujan tyypin määräsi tunnuksen ensimmäinen kirjain. Muuttujat, joiden ensimmäinen kirjain oli I... N, olivat kokonaislukuja. Kaikki muut muuttujat olivat reaalilukuja. Lause kytkee alkukirjainsäännön pois käytöstä. Tällöin kääntäjä tarkistaa, että jokainen tunnus on määritelty. Väärin kirjoitetut muuttujien nimet paljastuvat siten usein jo käännösaikana. April 18, 2008 Kimmo Klemola 19 Muuttujien tyypit Edellä määrittelimme kokonaislukutyyppisiä (INTEGER) muuttujia. Kokonaislukujen lisäksi voimme määritellä reaalilukutyypin (REAL) muuttujia: PROGRAM potenssi! Ohjelma laskee ja tulostaa numeerisen lausekkeen arvon. REAL :: k, x INTEGER :: n WRITE (*,*) Syötä lausekkeen k*x**n luvut k, x ja n: READ (*,*) k, x, n WRITE (*,*) Luku k:, k, Luku x:, x, Luku n:, n WRITE (*,*) Arvo k*x**n:, k*x**n END PROGRAM potenssi Muuttujat k ja x ovat reaalilukuja ja muuttuja n on kokonaisluku. Ohjelma lukee muuttujien arvot, tulostaa ne sekä laskee lausekkeen kx n arvon. April 18, 2008 Kimmo Klemola 20 Fortran 10

Fortranin perustyypit Tietokoneohjelmilla käsitellään tieto-olioita, jotka rakentuvat luvuista ja merkkijonoista sekä näiden yhdistelmistä. Fortran sisältää viisi perustyyppiä (intrinsic type): kokonaisluvut (INTEGER) reaaliluvut (REAL) kompleksiluvut (COMPLEX) totuusarvot (LOGICAL) merkkijonot (CHARACTER). Näitä tietotyyppejä käsitellään Fortran-kielen operaatioilla, proseduureilla ja lauseilla. April 18, 2008 Kimmo Klemola 21 Kompleksiluvut Kompleksilukutyyppi vastaa matemaattista kompleksiluvun käsitettä. Siten kompleksiluku z koostuu reaaliosasta x ja imaginääriosasta y eli z = x+iy, missä i = Kompleksilukuvakiot kirjoitetaan sulkujen sisään: WRITE (*,*) (0, -1)*(1.2345E-2, 8) Tässä lasketaan kompleksilukujen 1.0i ja 0.012345 + 8.0i tulo. Tulostus voisi näyttää tältä: (8.000000,-1.2345000E-02) 1 April 18, 2008 Kimmo Klemola 22 Fortran 11

Totuusarvot Fortranissa voidaan esittää totuusarvot tosi ja epätosi vakioilla.true. ja.false.. Vakioiden alussa ja lopussa olevat pisteet ovat tarpeen! Totuusarvoja voi käsitellä loogisilla operaatioilla.not.,.and.,.or.,.eqv. ja.neqv.. Loogiset operaattorit: April 18, 2008 Kimmo Klemola 23 Loogiset lausekkeet Loogisia lausekkeita käytetään IF-lauseen ja muiden ohjausrakenteiden yhteydessä, ja niillä siis toteutetaan ohjelman logiikka. Loogisiin lausekkeisiin kuuluvat lukujen ja merkkijonojen vertailuoperaattoreiden lisäksi loogiset operaattorit. Taulukossa on annettu Fortran-kielen vertailuoperaattorit ja myös vanhat FORTRAN 77:n mukaiset operaattorit (.EQ. jne.). April 18, 2008 Kimmo Klemola 24 Fortran 12

Merkkijonot Merkkijonotyypillä voidaan esittää merkkijonoja. Merkkijonovakio sijoitetaan ohjelmakoodiin yksinkertaisten tai kaksinkertaisten lainausmerkkien sisään: WRITE (*,*) "Äkkiä eräänä päivänä..." WRITE (*,*) Äkkiä eräänä päivänä... April 18, 2008 Kimmo Klemola 25 Loogiset lausekkeet ja merkkijonomuuttuja CHARACTER esimerkki Annetaan kokonaisluku, jonka neliö lasketaan. Annetun kokonaisluvun on oltava välillä [1 5]. PROGRAM nelio INTEGER :: i, j CHARACTER (LEN=30) :: virhe = 'Virhe: i ei ole valilla [1, 5]' CHARACTER (LEN=10) :: pot2 = 'i**2:' WRITE (*,*) 'Luku i:' READ (*,*) i IF (i < 1.OR. i > 5) THEN WRITE (*,*) virhe ELSE j=i**2 WRITE (*,*) pot2, j END IF END PROGRAM nelio Merkkijonomuuttujissa on 30 ja 10 merkkiä. April 18, 2008 Kimmo Klemola 26 Fortran 13

Vakioiden määrittely Vakioiksi voidaan määrittää INTEGER, REAL, COMPLEX, CHARACTER tyyppejä. Seuraavassa on kolme tapaa määrittää INTEGER- ja CHARACTER-tyyppiset vakiot. PROGRAM vakiot INTEGER :: lkm CHARACTER (LEN=20) teksti lkm = 120 teksti = 'lukumaara on: ' WRITE (*,*) teksti, lkm END PROGRAM vakiot PROGRAM vakiot INTEGER, PARAMETER :: lkm = 120 CHARACTER (LEN=20), PARAMETER :: teksti = 'lukumaara on: ' WRITE (*,*) teksti, lkm END PROGRAM vakiot PROGRAM vakiot INTEGER :: lkm = 120 CHARACTER (LEN=20) :: teksti = 'lukumaara on: ' WRITE (*,*) teksti, lkm END PROGRAM vakiot April 18, 2008 Kimmo Klemola 27 Sijoituslauseet Sijoituslauseella voimme antaa muuttujalle arvon. Seuraavassa on pieni esimerkkiohjelma: PROGRAM neliojuuri! Ohjelma laskee neliöjuurilausekkeen arvon. REAL :: x, y WRITE (*,*) Syota luku x: READ (*,*) x y = x**2 + 1 WRITE (*,*) Luku x:, x WRITE (*,*) Arvo x**2 + 1:, y WRITE (*,*) Arvo SQRT(x**2 + 1):, SQRT(y) END PROGRAM neliojuuri Tässä ohjelmassa määrittelimme kaksi reaalilukumuuttujaa rivillä REAL :: x, y Lauseella INTRINSIC SQRT (mahdollinen) voidaan kertoa, että ohjelmassa käytetään Fortranin standardifunktiota SQRT, joka laskee luvun neliöjuuren arvon. Muuttujaan x luetaan arvo näppäimistöltä, ja tämän jälkeen sijoitetaan lausekkeen x**2 + 1 arvo muuttujaan y rivillä y = x**2 + 1 April 18, 2008 Kimmo Klemola 28 Fortran 14

Omien funktioiden määrittely ja käyttö Edellä käytimme Fortranin standardifunktiota SQRT neliöjuuren laskemiseksi. Myös omien funktioiden määritteleminen on mahdollista. Seuraavassa ohjelmakoodissa määrittelemme funktion f, joka vastaa matemaattista määritelmää f(a) = a 2 + 1: PROGRAM funktio_esimerkki! Ohjelma lukee reaaliluvun x ja tulostaa! funktion f arvon tässä pisteessä. REAL :: x WRITE (*,*) 'Syota luku x:' READ (*,*) x WRITE (*,*) 'Luku x:', x WRITE (*,*) 'Arvo f(x):', f(x) CONTAINS FUNCTION f(a) RESULT(f_arvo) REAL :: a, f_arvo f_arvo = a**2 + 1 END FUNCTION f END PROGRAM funktio_esimerkki Funktion f arvo lasketaan funktiokutsulla f(x). Funktio f on määritelty pääohjelman sisäisenä funktiona CONTAINS-lauseen jälkeen. April 18, 2008 Kimmo Klemola 29 Toistorakenteet Fortranissa hoidetaan lauseiden toistaminen DO-silmukkojen avulla. Laskemme esimerkkinä lausekkeen (luonnollisen luvun yhä tarkempi likiarvo) arvot, kun x on 2 1, 2 2,..., 2 10 eli 2, 4,..., 1024. Seuraava ohjelmakoodi tulostaa halutut arvot: PROGRAM silmukka REAL :: x INTEGER :: i DO i = 1, 10 x = 2**i WRITE (*,*) 'arvot:', x, (1 + 1/x)**x END DO END PROGRAM silmukka April 18, 2008 Kimmo Klemola 30 Fortran 15

Toistorakenteet Muuttuja x on määritelty REAL-tyyppiseksi, jolloin lausekkeessa 1/x vältetään kokonaislukujen jakolasku. Funktiokutsu REAL(2**i) muuttaa puolestaan kokonaislukulausekkeen 2**i reaalilukutyyppiseksi. DO-silmukka määritellään seuraavasti: Silmukkamuuttuja käy järjestyksessä läpi arvot alaraja, alaraja + 1, alaraja + 2,..., yläraja. Tulostus (tarkka arvo e = 2.718282): April 18, 2008 Kimmo Klemola 31 Fortran-kielen INCLUDE-lause Fortran 90/95:ssä voidaan ohjelmakoodiin sisällyttää toisessa tiedostossa olevia määrittelyjä käyttämällä INCLUDE-lausetta. Esimerkiksi: PROGRAM sisalto INCLUDE 'vakiot.inc' REAL :: x = pii WRITE (*,*) 'Piin arvo: ', x END PROGRAM sisalto Tiedoston vakiot.inc sisältö voisi olla seuraava: REAL, PARAMETER :: pii = 3.14159265358979 Edellinen siis tulostaa piin arvon April 18, 2008 Kimmo Klemola 32 Fortran 16

Fortran-kielen moduulit Kun ohjelma on vähänkin laajempi, kannattaa ohjelma jakaa moduuleihin, joissa kussakin lasketaan jokin tarkasti rajattu laskentatehtävän osa. Moduulissa voidaan määritellä mm. nimettyjä vakioita, muuttujia, rakenteisia tyyppejä ja proseduureja. Samaa moduulia voidaan usein käyttää hyväksi muissakin yhteyksissä, joten ohjelmoijan työmäärä vähenee. Yleensä INCLUDE-lauseiden sijaan kannattaa käyttää moduuleita ja USElausetta. Etuna tästä on mm. parempi käännösaikainen virheiden tarkistus. Seuraavassa on esimerkki moduulin vakiot käytöstä (& jatkaa riviä): MODULE vakiot REAL, PARAMETER :: & pii = 3.14159265358979, & e = 2.71828182845905 END MODULE vakiot PROGRAM sisalto USE vakiot! Tärkeitä matematiikan vakioita REAL :: x = pii WRITE (*,*) 'Piin arvo: ', x END PROGRAM sisalto April 18, 2008 Kimmo Klemola 33 Ohjelman perusrakenne Fortran-kääntäjä käsittelee ohjelmakoodia sisältäviä lähdekooditiedostoja. Fortran-ohjelma koostuu jonosta lauseita. Lauseet kirjoitetaan riveille, joiden pituus voi olla 0-132 merkkiä. Lausetta voi jatkaa seuraavalle riville käyttämällä jatkorivin merkkiä & seuraavasti: kk_era = kk_korko*lainasumma/ & (1 - (1 + kk_korko)**(-laina_aika)) Jos merkkijono halutaan jatkaa usealle riville, voi jatkorivin alkuun sijoittaa välilyöntejä sekä merkin &, jolloin merkkijono jatkuu vasta tästä kohtaa: WRITE (*,*) "Tämä on todella pitkä & monimutkainen& & merkkijono." Riville voi laittaa useamman lauseen erottamalla ne puolipisteellä (;): x = 1.0; b = 1.0 Rivin lopussa ei tarvita puolipistettä, koska rivin loppu automaattisesti lopettaa lauseen. Puolipisteen käyttöä kannattaa välttää, sillä turha tiivistäminen (rivimäärän minimointi) johtaa vaikeasti luettavaan koodiin. Sen sijaan tyhjiä rivejä kannattaa käyttää ryhmittelemään ohjelmayksikön eri osia. April 18, 2008 Kimmo Klemola 34 Fortran 17

Ohjelman perusrakenne Ohjelmakoodiin kannattaa sijoittaa ohjelman toimintaa kuvaavia kommentteja, jotka aloitetaan huutomerkillä (!): PROGRAM mahtava! Tämä ohjelma ratkaisee maailmankaikkeuden perusyhtälöt! käyttäen 10-ulotteista supersäieteoriaa. Kommentteja voi sijoittaa myös jatketun rivin loppuun: REAL :: nopeus = 0.0, &! raketin nopeus alussa (m/s) kiihtyvyys = 24.0! raketin kiihtyvyys (m/s**2) Seuraavassa on lueteltu Fortran 90/95:n erikoismerkit: April 18, 2008 Kimmo Klemola 35 Ohjelman perusrakenne Muuttujien ja vakioiden nimet Muuttujien ja vakioiden nimien tulee alkaa kirjaimella, ja nimen maksimipituus on 31 merkkiä. Seuraavassa on esimerkkejä laillisista nimistä: a, a2, a_2, a_b_c. Sen sijaan seuraavat nimet eivät käy: 2a, _a, a b. Fortran-kielessä ei ole ns. varattuja sanoja, joten myös Fortranin tunnukset voi määritellä vaikkapa omien muuttujien nimiksi. Tämä ei kuitenkaan ole suositeltavaa! Esimerkiksi jos muuttujan nimeksi valitaan sin, ei SIN-funktio ole enää käytettävissä. April 18, 2008 Kimmo Klemola 36 Fortran 18

Ohjelman perusrakenne Ohjelmakoodin lauseiden järjestys Tärkeimmät Fortran-kielen lauseet voidaan jakaa seuraaviin tyyppeihin: ohjelmayksikön otsikkolauseet: PROGRAM, FUNCTION, SUBROUTINE ja MODULE kommentit USE-lauseet lause tyyppien, muuttujien ja nimettyjen vakioiden määrittelyt kutsumuodon määrittelyt INTERFACE-lohkossa muut määrittelylauseet: EXTERNAL, INTRINSIC, OPTIONAL jne. FORMAT-lauseet suoritettavat lauseet ja rakenteet CONTAINS-lause ohjelmayksikön lopettava END-lause. Kukin ohjelmayksikkö alkaa otsikkolauseella (PROGRAM, FUNCTION jne.) ja päättyy vastaavaan END-lauseeseen. April 18, 2008 Kimmo Klemola 37 Ohjelman perusrakenne Ohjelmakoodin lauseiden järjestys Ohjelmayksikön sisällä lauseet voivat esiintyä kuvan havainnollistamassa järjestyksessä. April 18, 2008 Kimmo Klemola 38 Fortran 19

Ohjelman perusrakenne Ohjelmakoodin lauseiden järjestys Seuraava ohjelma havainnollistaa Fortranin pääohjelman omaohjelma ja sisäisen funktion f rakennetta: PROGRAM omaohjelma! Ohjelma laskee lausekkeen a**i + b**j arvon. REAL :: a, b INTEGER :: i, j WRITE (*,*) Anna a ja b: READ (*,*) a, b WRITE (*,*) Anna i ja j: READ (*,*) i, j WRITE (*,*) f(x) =, f(a, i, b, j) CONTAINS FUNCTION f(x, x_potenssi, y, y_potenssi) RESULT(f_arvo) REAL :: x, y INTEGER :: x_potenssi, y_potenssi REAL :: f_arvo f_arvo = x**x_potenssi + y**y_potenssi END FUNCTION f END PROGRAM omaohjelma April 18, 2008 Kimmo Klemola 39 Lukujen tarkkuus Tietokoneiden prosessorit mahdollistavat laskemisen usean eri tarkkuuden kokonais- ja reaaliluvuilla. Tarkkuuksia on käytettävissä yleensä kaksi tai kolme erilaista. Fortran-kielen lajiparametrien avulla on helppo valita ohjelmassa käytettävä laskentatarkkuus. Lisäksi lajiparametrit mahdollistavat laskentatarkkuuden säilymisen siirrettäessä ohjelma toiseen koneeseen. Fortranin perustyyppeihin voidaan liittää lajimääre (kind), joka kertoo, millaisen version tyypistä haluamme käyttöön esimerkiksi mikä on reaalilukujen haluttu esitystarkkuus ja lukualue. Lajiparametri annetaan osana muuttujan määrittelyä esimerkiksi seuraavasti: REAL (KIND=lajiparametri) :: x INTEGER (KIND=lajiparametri) :: i COMPLEX (KIND=lajiparametri) :: z LOGICAL (KIND=lajiparametri) :: testi CHARACTER (LEN=80, KIND=lajiparametri) :: rivi Lajiparametri on Fortran-kääntäjästä riippuva positiivinen kokonaislukuvakio, joka kannattaa selvittää tarkoitukseen varatuilla funktiokutsuilla (esimerkiksi SELECTED_INT_KIND). April 18, 2008 Kimmo Klemola 40 Fortran 20

Lukujen tarkkuus Esimerkki piin arvon laskeminen: PROGRAM kind INTEGER, PARAMETER :: suuritarkkuus = SELECTED_REAL_KIND(12) REAL :: pi1 REAL (KIND=suuritarkkuus) :: pi2 pi1 = 4*ATAN(1.0) pi2 = 4*ATAN(1.0) WRITE (*,*) 'pii: ', pi1, pi2 END PROGRAM kind Tulostus ruudulle on: pii: 3.141593 3.14159265358979 April 18, 2008 Kimmo Klemola 41 Lukujen tarkkuus Esimerkki: sarjan summa Seuraava ohjelmakoodi tekee tarvittavat laskut: April 18, 2008 Kimmo Klemola 42 Fortran 21

Lukujen tarkkuus Esimerkki: sarjan summa PROGRAM summaus REAL :: s = 0.0 INTEGER :: i, n WRITE (*,*) 'Anna termien lukumäärä:' READ (*,*) n WRITE (*,*) 'Termejä: ', n DO i = 1, n s = s + 1/(REAL(i)**2) END DO WRITE (*,*) 'Summa on:', s END PROGRAM summaus April 18, 2008 Kimmo Klemola 43 Lukujen tarkkuus Esimerkki: sarjan summa Jos ohjelmalle annetaan n:n arvoksi 1000000, saadaan summan arvoksi 1,6447253 (oikea 1,6449341). Miljoonalla termillä lasketussa tuloksessa on vain 3 desimaalia oikein, samoin kuin 10000 termin tapauksessa. Ohjelmakoodimme näyttäisi siis tuottavan epätarkkoja tuloksia. Tulosten huonous johtuu siitä, että summauksessa häviää liikaa informaatiota pyöristysvirheiden takia. Laskennan tarkkuutta lisätään April 18, 2008 Kimmo Klemola 44 Fortran 22

Lukujen tarkkuus Esimerkki: sarjan summa PROGRAM summaus INTEGER, PARAMETER :: tarkkuus = SELECTED_REAL_KIND(12) REAL (KIND=tarkkuus) :: s = 0.0 INTEGER :: i, n WRITE (*,*) 'Anna termien lukumäärä:' READ (*,*) n WRITE (*,*) 'Termejä: ', n DO i = 1, n s = s + 1/(REAL(i, KIND=tarkkuus)**2) END DO WRITE (*,*) 'Summa on:', s END PROGRAM summaus 1,64493306684877 (oikea 1,6449341) eli tarkkuus parani viiteen desimaaliin. April 18, 2008 Kimmo Klemola 45 Varoituksia kokonaisluvuista Esimerkiksi seuraava ohjelma antaa tulokseksi 0.0000000E+00 PROGRAM murtoluku INTEGER :: a, b REAL :: c a = 2 b = 4 c = a/b WRITE (*,*) c END PROGRAM murtoluku April 18, 2008 Kimmo Klemola 46 Fortran 23

Varoituksia kokonaisluvuista Funktiokutsu REAL(i) Seuraava ohjelma antaa tulokseksi 0.50000 PROGRAM murtoluku INTEGER :: a, b REAL :: c a = 2 b = 4 c = REAL(a)/REAL(b) WRITE (*,*) c END PROGRAM murtoluku April 18, 2008 Kimmo Klemola 47 Ohjausrakenteet IF, SELECT CASE, DO Ohjausrakenteiden avulla voimme toistaa laskutoimituksia niin usein kuin on tarpeen tai suorittaa ne vain halutun ehdon toteutuessa. Erityisesti IF- ja SELECT CASE -rakenteet sekä DOsilmukka mahdollistavat monimutkaisenkin ohjelmalogiikan selkeän toteuttamisen. April 18, 2008 Kimmo Klemola 48 Fortran 24

Ehdollinen suoritus: IF-rakenne Edellä oli jo esimerkki IF-rakenteesta: PROGRAM nelio INTEGER :: i, j CHARACTER (LEN=30) :: virhe = 'Virhe: i ei ole valilla [1, 5]' CHARACTER (LEN=10) :: pot2 = 'i**2:' WRITE (*,*) 'Luku i:' READ (*,*) i IF (i < 1.OR. i > 5) THEN WRITE (*,*) virhe ELSE j=i**2 WRITE (*,*) pot2, j END IF END PROGRAM nelio April 18, 2008 Kimmo Klemola 49 Tapausten käsittely: SELECT CASE -rakenne Ohjelma kysyy kokonaislukua ja kertoo onko se negatiivinen, positiivinen vai nolla: PROGRAM merkki INTEGER :: i CHARACTER (LEN=20) :: mark WRITE (*,*) 'Anna kokonaisluku :' READ (*,*) i SELECT CASE(i) CASE (:-1) mark='negatiivinen' CASE (0) mark='nolla' CASE (1:) mark='positiivinen' END SELECT WRITE (*,*) mark END PROGRAM merkki April 18, 2008 Kimmo Klemola 50 Fortran 25

Tapausten käsittely: SELECT CASE -rakenne Edellisessä Tapausta CASE (:-1) vastaavat negatiiviset kokonaisluvut { 1, 2,... }. Tapausta CASE (1:) vastaavat positiiviset kokonaisluvut {1, 2,... }. Jos i on nolla, saa muuttuja merkki arvon nolla. April 18, 2008 Kimmo Klemola 51 Toisto: DO-rakenne Edellä on ollut DO-esimerkkejä. Newtonin kaava etsii funktion f(x) nollakohtaa: Olkoon f(x) = e x + x - 5 PROGRAM newt CHARACTER(LEN=*), PARAMETER :: muoto = '(A,F9.6)' REAL :: x = 0.0 INTEGER :: i, n = 20 WRITE (*,'(A,I3)') 'iteraatioita:', n WRITE (*,muoto) 'x:n arvo alussa:', x DO i = 1, n x = x - (EXP(x) + x - 5)/(EXP(x) + 1) WRITE (*,muoto) 'x:n arvo:', x END DO END PROGRAM newt April 18, 2008 Kimmo Klemola 52 Fortran 26

Funktiot ja aliohjelmat Tehtävän jakaminen pienempiin osiin on yleensä paras lähestymistapa ratkaistaessa vähänkin suurempia tehtäviä. Fortran 90/95:n yhteydessä tarkoitetaan proseduurilla (procedure) joko funktiota (function) tai aliohjelmaa (subroutine). Proseduureja käyttämällä tehtävä voidaan jakaa pienempiin, nimettyihin osatehtäviin. Proseduurien käyttö paitsi helpottaa ohjelman hahmottamista myös parantaa ohjelman ylläpidettävyyttä: usein tarvitsee muuttaa vain osaa ohjelmakoodin proseduureista. Ohjelman jakaminen itsenäisiin proseduureihin helpottaa myös ohjelmakoodin testausta. Kutakin proseduuria voidaan testata erikseen, ja vian löytyessä se voidaan usein paikallistaa tiettyyn proseduuriin. Fortran-kieltä on käytetty jo vuosikymmeniä ohjelmistoteollisuuden välineenä. Ohjelmoijan käytettävissä onkin monipuolinen valikoima valmiita proseduureja. Saatavilla on esimerkiksi aliohjelmakirjastot IMSL ja NAG, jotka sisältävät kumpikin yli tuhat proseduuria tieteellisen ja teknisen laskennan perustehtäviin. April 18, 2008 Kimmo Klemola 53 Funktiot ja aliohjelmat Aliohjelman nimi määritellään SUBROUTINE-lauseessa, ja aliohjelmaa kutsutaan CALL-lauseella. Seuraavassa määrittelemme aliohjelman vaihda kahden reaaliluvun arvojen vaihtamiseksi keskenään, mikäli x > y: PROGRAM vaihtotesti REAL :: x, y WRITE (*,*) 'Anna x ja y: ' READ (*,*) x, y WRITE (*,*) 'x,y aluksi: ', x, y IF (x > y) THEN CALL vaihda(x,y) END IF WRITE (*,*) 'x,y lopuksi: ', x, y CONTAINS SUBROUTINE vaihda(a,b) REAL :: a, b REAL :: apu apu = a a = b b = apu END SUBROUTINE vaihda END PROGRAM vaihtotesti April 18, 2008 Kimmo Klemola 54 Fortran 27

Tiedostot ja Fortran Seuraavassa esimerkissä tulokset kirjoitetaan tiedostoksi eikä näytölle. Oletuskanavan sijasta käytetään kanavaa 10 (tiedostoon kirjoitus) PROGRAM newt CHARACTER(LEN=*), PARAMETER :: muoto = '(A,F9.6)' REAL :: x = 0.0 INTEGER :: i, n = 20 OPEN (10, FILE = 'esimerkki.txt') WRITE (10,'(A,I3)') 'iteraatioita:', n WRITE (10,muoto) 'x:n arvo alussa:', x DO i = 1, n x = x - (EXP(x) + x - 5)/(EXP(x) + 1) WRITE (10,muoto) 'x:n arvo:', x END DO CLOSE (10) END PROGRAM newt April 18, 2008 Kimmo Klemola 55 Tiedostot ja Fortran Esimerkki.txt näyttää tältä: iteraatioita: 20 x:n arvo alussa: 0.000000 x:n arvo: 2.000000 x:n arvo: 1.476812 x:n arvo: 1.317715 x:n arvo: 1.306608 April 18, 2008 Kimmo Klemola 56 Fortran 28

Tiedostot ja Fortran Seuraavassa esimerkissä tiedostosta datat.txt luetaan tiedot, jotka kirjoitetaan uuteen tiedostoon datauusi.txt. datat.txt-sisältö ja ohjelma sekä datauusi.txt: 2 4 3 5 PROGRAM lue_taulukko REAL, ALLOCATABLE, DIMENSION(:) :: a INTEGER :: n OPEN (10, FILE='datat.txt') READ (10, *) n ALLOCATE (a(n)) READ (10, *) a CLOSE (10) OPEN (10, FILE='datauusi.txt') WRITE (10, *) a(n) CLOSE (10) END PROGRAM lue_taulukko 2 4 3 5 April 18, 2008 Kimmo Klemola 57 Fortran 29