287 11 Jälkikäsittely ja visualisointi Virtauslaskentatehtävä voidaan jakaa kolmeen vaiheeseen: esikäsittelyyn, laskentaan ja tulosten jälkikäsittelyyn. Kolmas ja viimeinen vaihe (jälkikäsittely, postprocessing) tarkoittaa virtausratkaisijan laskemien raakatulosten jalostamista havainnollisempaan muotoon. Jälkikäsittelyyn voi esikäsittelyn tapaan kulua huomattavan suuri osa käytettävästä kokonaisajasta. Vanhan fraasin mukaelma “yksi kuva kertoo enemmän kuin satatuhatta numeroa” pätee hyvin myös CFD-tulosten jälkikäsittelyyn. Simuloidusta virtauskentästä kannattaa luoda kuvia ja animaatioita, jotka havainnollistavat virtauksessa esiintyviä mielenkiintoisia ilmiöitä. Jälkikäsittely mielletäänkin usein synonyymiksi sanalle visualisointi (visualization), vaikka tulosten jälkikäsittelyyn kuuluu muutakin kuin kuvien piirtelyä. Tyypillistä jälkikäsittelyä on esimerkiksi uusien fysikaalisten suureiden laskeminen virtausratkaisijan ratkomista perussuureista. Tässä luvussa tarkastellaan tavallisimpia visualisointikeinoja ja ohjelmarutiineja, joihin ne perustuvat. Rutiinien tunteminen auttaa tunnistamaan visualisoinnissa toisinaan syntyvät vääristymät ja toivottavasti välttämään ne. Luvun lopussa käsitellään jälkikäsittelyssä syntyviä virheitä ja tarkastellaan lähemmin kahta jälkikäsittelyssä käytettävää algoritmia. 11.1 Erilaisia visualisointikeinoja Visualisoinnin avulla virtauskentästä pyritään paikallistamaan mm. pyörteet, selvät virtauksen irtoamiset ja ylisoonisessa virtauksessa tiivistysaallot. Tavallisimpia virtausilmiöiden havainnollistamiseen käytettyjä keinoja ovat tasa-arvokäyrät ja pinnat, vektorit ja virtaviivat. Ensiksi mainituilla kuvataan skalaarisuureita ja jälkimmäisillä vektorisuureita. 11.1. ERILAISIA VISUALISOINTIKEINOJA 288 11.1.1 Tasa-arvokäyrät Tavallisin skalaarisuureen kuvaamistapa on kappaleen pinnalle tai leikkaustasolle piirretty tasa-arvokäyrä (contour) tai tasa-arvokäyrien joukko. Kyseisillä käyrillä tarkasteltava suure on vakio. Kuvassa 11.1 havainnollistetaan tasa-arvokäyrillä Huygens-luotainta1 ympäröivää virtauskenttää sen laskeutuessa kohti Titanin pintaa. Kuva 11.1: Huygens-luotainta ympäröivä virtauskenttä havainnollistettuna painekertoimen tasa-arvokäyrillä. Alkuperäisessä värikuvassa eri painekertoimen arvoja vastaavat käyrät on piirretty eri väreillä. 1 Cassini-Huygens oli NASAn ja ESAn yhteinen miehittämätön avaruuslento, jonka tarkoituk- sena on tutkia Saturnusta ja sen kuita. Cassini-Huygens laukaistiin matkaan 15. lokakuuta 1997 Kennedyn avaruuskeskuksesta. ESA:n Huygens-luotain irrotettiin Cassinista 25. joulukuuta 2004 ja se laskeutui Saturnuksen Titan-kuun pinnalle 14. tammikuuta 2005. HASIn (Huygens Atmosphere Structure Instrument) painemittausjärjestelmän suunnitteli Ilmatieteen laitos Teknillisen horkeakoulun Aerodynamiikan laboratorion virtaussimulointien ja tuulitunnelikokeiden perusteella. 11.1. ERILAISIA VISUALISOINTIKEINOJA 289 Kuva 11.2: Huygens-luotain. Tasa-arvokäyrät on helpointa muodostaa kolmioiden yli lasketuista janoista, sillä tasa-arvokäyrä voi leikata kolmion reunakäyrän vain kahdessa pisteessä, joiden yhdistäminen on yksikäsitteistä. Jos simulointi on tehty rakenteellista hilaa käyttäen, nelikulmaiset pintaelementit voidaan aina jakaa kahdeksi kolmioksi. Tässäkin siis rakenteellisella hilalla käytetään apuna kolmioita. Toinen vastaava tilanne on geometristen suureiden laskenta. Pintaelementtien jako ei ole kuitenkaan yksikäsitteinen, sillä jakava lävistäjä voidaan valita kahdella eri tavalla. Yksikäsitteiseen jakoon päästään jakamalla elementti neljäksi kolmioksi. Kolmiot muodostetaan lisäämällä nelikulmaisen elementin keskelle viides piste, jonka sijainti saadaan suoraan nurkkapisteiden koordinaattien keskiarvona. Myös nurkkapisteissä tunnettu skalaarisuure keskiarvotetaan viidenteen pisteeseen. Näin menetellen tasa-arvokäyristä saadaan juoheampia, mutta toisaalta niiden laskemiseen kuluu hieman enemmän aikaa ja kuvatiedoston koko kasvaa. Tasa-arvokäyrän (s) ja kolmion reunakäyrän leikkauspiste (x, y, z) saadaan lineaarisesti interpoloimalla kolmion sivun päätepisteiden (x1 , y1 , z1 ) ja (x2 , y2 , z2 ) sekä niissä tunnettujen skalaarisuureen arvojen (s1 , s2 ) avulla seuraavasti (ks. kuva 11.3): x − x1 y − y1 z − z1 s − s1 = = = (11.1) s2 − s1 x2 − x1 y2 − y1 z2 − z1 Kun suureen arvo s on määrätty tasa-arvokäyrällä, saadaan yhtälöstä (11.1) ratkais- tua reunakäyrän ja tasa-arvokäyrän leikkauspisteen koordinaatit. Kun koordinaatit on laskettu, piirretään tasa-arvokäyrä paloittain suorina janoina. 11.1.2 Tasa-arvovyöhykkeet Tasa-arvovyöhykkeet (filled contours, fringes) esitystapana muistuttaa tasa-arvokäyriä. Ne muodostetaan värittämällä aina kahden vierekkäisen tasa-arvokäyrän välinen 11.1. ERILAISIA VISUALISOINTIKEINOJA 290 (x,y,z)2, s2 (x,y,z), s (x,y,z)1, s1 Kuva 11.3: Tasa-arvokäyrän kulkureitin laskeminen yhden nelikulmaisen elementin alueella osakolmioiden ja lineaarisen interpoloinnin avulla. alue vakiovärillä, joka kuvaa skalaarin suuruutta. Esimerkki tasa-arvovyöhykkeiden käytöstä nähdään kuvassa 11.4, jossa Huygens-luotainta ympäröivää virtauskenttää on havainnollistettu Machin luvun tasa-arvovyöhykkeillä. Kuvaan on piirretty mustalla värillä myös tasa-arvokäyrät. Tasa-arvovyöhykkeiden piirtäminen on huomattavasti työläämpi tehtävä kuin tasa-arvokäyrien piirtäminen. Tässäkin tapauksessa helpointa on jakaa tarkasteltavat elementit ensin kolmioiksi ja määrittää vyöhykkeet kolmioiden alueelle osuvista vyöhykkeiden osista. Nämä osat ovat monikulmioita, joissa on kolme, neljä tai viisi kulmaa. Tasa-arvovyöhyke voi ylittää kolmion 27 eri tavalla. Kaksi näistä on triviaaleja, joissa skalaarin arvo on sellainen, että vyöhyke jää kokonaan kolmion ulkopuolelle. Kun otetaan huomioon erilaiset permutaatiot, jotka saadaan kolmion kärkien järjestystä vaihtamalla, päädytään kymmeneen erilaiseen vaihtoehtoon (kuva 11.5). Piirtorutiinin ohjelmoiminen vaatii kuitenkin kaikkien 27 tapauksen käsittelyn. Kolmion kärjissä vallitsevien arvojen perusteella voidaan laskea ns. maaginen luku, joka suoraan kertoo mikä tapauksista on kyseessä. Tässä tapauksessa maaginen luku saadaan kaavasta MAGIC = C(3) × 9 + C(2) × 3 + C(1) × 1 (11.2) missä arvoiksi kolmion kärjissä C(1), C(2), C(3) asetetaan 0, jos kulmassa vallitseva skalaarin arvo on tarkasteltavan vyöhykkeen alapuolella, 1, jos kulman arvo osuu vyöhykkeelle ja 2, jos arvo on tarkasteltavan vyöhykkeen yläpuolella. Tässä tapauksessa maaginen luku voi saada arvot 0 . . . 26. Kunkin eri vaihtoehdon piirtämiseksi joudutaan kirjoittamaan oma rutiininsa, mutta maagisen luvun avulla oi- 11.1. ERILAISIA VISUALISOINTIKEINOJA 291 Kuva 11.4: Huygens-luotainta ympäröivä virtauskenttä havainnollistettuna Machin luvun tasa-arvovyöhykkeillä. (Harmaasävykuvana kuvan luettavuus on huonompi kuin värikuvana.) keaan CASE-haaraan ohjautuminen saadaan sentään toteutettua helposti. Maagisen luvun avulla vältetään monimutkainen ehtotestirakennelma. Tasa-arvovyöhykkeet voidaan värittää myös siten, että värit liukuvat vyöhykkeiden yli kuljettaessa. Tällä tavalla väritetyt jakautumat vastaavat paremmin suureiden todellisia jakautumia ja kuvat näyttävät hienommilta, mutta samalla kuvan informaatioarvo pienenee. 11.1.3 Tasa-arvopinnat Tasa-arvokäyrien vastine kolmessa ulottuvuudessa on tasa-arvopinta (contour surface, iso-surface), joka saadaan muodostamalla laskenta-avaruuteen pinta, jolla tarkasteltavan skalaarisuureen arvo on vakio. Tasa-arvokäyriä piirretään tyypillisesti 11.1. ERILAISIA VISUALISOINTIKEINOJA 292 s < sm in smin < s < smax (va¨riteta¨ a¨n ) smax < s Kuva 11.5: Tapoja, joilla tasa-arvovyöhyke (harmaa) voi ylittää kolmion. Riippumattomia tapoja on yhteensä 27. parvi, joka edustaa useita vakioarvoja. Sen sijaan tasa-arvopintoja kannattaa yleensä piirtää kerrallaan vain yksi, sillä muodostuvat pinnat ovat sisäkkäisiä peittäen näin toinen toisensa. Joissakin tilanteissa pintojen läpinäkyvyyttä hyväksi käyttäen on mahdollista piirtää useampiakin tasa-arvopintoja samaan kuvaan. Kuvassa 11.6 paine-eron tasa-arvopinnalla on havainnollistettu tylpän kappaleen vanaveteen muodostunutta rengasmaista pyörrettä. Saman suuruisia paine-eroja löytyy myös kappaleen pinnalta. Tasa-arvopinnat saadaan laskettua periaatteessa samaan tapaan kuin tasa-arvokäyrätkin eli etsimällä laskentatilavuuksien särmiltä lineaarisesti interpoloimalla pisteet, jossa tasa-arvopinta leikkaa särmän. Leikkauspisteistä muodostuu monikulmio, joka on osa tasa-arvopintaa. Jos leikkauspisteiden määritys tehdään tetraedreille, syntyvät monikulmiot ovat kolmioita tai nelikulmioita (kuva 11.7). Jos määritys tehdään suoraan kahdeksankulmaisille laskentatilavuuksille, saadaan tulokseksi monikulmioita, joissa on kolme, neljä, viisi tai kuusi kulmaa (kuva 11.8). Kolmioita lukuunottamatta leikkauspisteitä yhdistettässä tulee olla tarkkana pisteiden järjestyksen suhteen. Jo neljä pistettä on mahdollista yhdistää siten, etteivät ne 11.1. ERILAISIA VISUALISOINTIKEINOJA 293 Kuva 11.6: Paine-eron tasa-arvopinnalla ja virtaviivoilla havainnollistettu Huygensluotaimen vanaveteen syntynyt rengasmainen pyörre. CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC CCCCCCC Kuva 11.7: Tasa-arvopinnan leikkaama tetraedri. 11.1. ERILAISIA VISUALISOINTIKEINOJA CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC CCCCCCCCCC 294 Kuva 11.8: Tasa-arvopinnan leikkaama kahdeksankulmainen laskentatilavuus. muodostakaan kelvollista monikulmiota. Tasa-arvopintojen määrittäminen on laskennallisesti raskas tehtävä. Käytännössä helpointa on käydä kaikki laskentatilavuudet läpi ja tutkia osuuko tasa-arvopinta siihen vai ei. Jos pinta osuu, muodostetaan monikulmio, joka on osa tasa-arvopintaa. Miljoonien laskentatilavuuksien kyseessä ollessa tähän kuluu huomattavasti laskentaaikaa. 11.1.4 Vektorit Luonteva keino vektorisuureen kuvaamiseen on vektori. Tavallisimpia vektorisuureita ovat nopeus, liikemäärä ja pyörteisyys. Tosin pyörteisyyden kuvaaminen suoraan vektoreilla ei ole kovin tavallista. Esimerkki vektoreilla toteutetusta virtauskentän visualisoinnista nähdään kuvassa 11.9. Vektorit voidaan piirtää joko vakiopituisina, jolloin ne esittävät vain paikallisia virtaussuuntia, tai siten, että niiden pituudet skaalataan paikallisten virtausnopeuksien mukaan. Vektorit voidaan piirtää laskentatilavuuksien keskipisteisiin tai laskentahilan solmupisteisiin. Jälkimmäinen tapa on tavallisempi. Esimerkik- 11.1. ERILAISIA VISUALISOINTIKEINOJA 295 Kuva 11.9: Huygens-luotainta ympäröivä virtauskenttä havainnollistettuna nopeusvektoreilla. Vektorit on piirretty tasavälisen suorakaidehilan solmupisteisiin, joihin nopeudet on ennen piirtämistä interpoloitu. si FLUENTissa, jossa jälkikäsittelijä liittyy kiinteästi ratkaisijaan, myös ensiksi mainittu tapa on mahdollinen. FLUENTissakin hilapistevaihtoehto on kuitenkin oletusarvo. Jos vektorit piirretään laskentahilan solmuihin (tai laskentatilavuuksien keskipisteisiin) kuvasta tulee vaikeasti luettava kohdissa, joissa hila tihenee. Ongelman kiertämiseksi virtauskenttä voidaan interpoloida tasaväliseen hilaan ja esittää vektorit tämän interpolointihilan solmupisteissä. Tavallisimmin interpolointihila on muodoltaan taso, mutta se voi tietysti yhtä hyvin olla esimerkiksi virtauskenttää leikkaava sylinteri tai hila, joka muodostuu mittauspisteistä. Tulokseksi saatava kuva on yleensä paljon havainnollisempi, mutta interpolointi aiheuttaa lisätyötä. Vektorit soveltuvat hyvin paikallisten virtaussuuntien kuvaamiseen kahdessa ulottovuudessa. Kolmiulotteisina vektoreiden todellista suuntaa on vaikea hahmottaa kaksiulotteisella kuvapinnalla. Katsojaa kohti tai katsojasta poispäin osoittava vek- 11.1. ERILAISIA VISUALISOINTIKEINOJA 296 tori näyttää todellista lyhyemmältä. Tämä voi johtaa kuvien virheelliseen tulkintaan. Joissakin ohjelmissa vektorit on mahdollista piirtää “kolmiulotteisina” kartio-sylinteri-yhdistelminä, jolloin sopivasti varjostamalla niiden suunta saadaan paremmin esille myös kaksiulotteisella kuvapinnalla. 11.1.5 Virtaviivat Virtaviivat ovat erittäin käyttökelpoinen tapa numeeristen virtaussimulointitulosten kuvaamiseen. Virtaviivat eivät ole pelkästään vektorikentän visualisointikeino vaan ne antavat myös helposti tajuttavan kuvan väliaineen liikkeestä tavalla, joka muistuttaa kokeellisissa menetelmissä käytettyä savuvisualisointia. Esimerkki virtaviivojen käytöstä visualisointikeinona nähtiin jo kuvassa 11.6. Virtaviivojen käyttöä monimutkaisten virtaustilanteiden yhteydessä voidaan voimakkaasti suositella, koska usein ne antavat tietoa enemmän kuin pelkät nopeusvektorit ja niiden avulla saadaan esille helpommin virtauksen irtoaminen. Virtaviivan asemesta visualisointiohjelmissa saatetaan käyttää myös nimityksiä ’path line’, ’streak line’ tai ’particle trace’. On syytä huomata, että virtaviiva (stream line), rataviiva (path line) ja juovaviiva (streak line) tarkoittavat eri asioita. Virtaviiva on viiva, jonka tangentti kussakin pisteessä on paikallisen nopeusvektorin suuntainen. Rataviiva eli ratakäyrä puolestaan on tietyn nestepartikkelin liikkuessaan piirtämä käyrä ja juovaviiva on viiva, jonka muodostavat tietyn kiinteän pisteen kautta aikaisemmin kulkeneet nestepartikkelit (kuva 11.10). Juovaviiva syntyy, kun väliaineeseen päästetään jatkuvasti väriainetta samasta pisteestä. Virtaviiva liittyy tiettyyn ajan hetkeen, kun taas rataviiva ja juovaviiva liittyvät perättäisiin ajan hetkiin. Ajasta riippumattomassa virtauksessa virtaviivat, rataviivat ja juovaviivat yhtyvät. Virtaviivoja voidaan piirtää joko suhteellisten tai inertiaalikoordinaatistossa Ilmapallo Väriaineet (a) virtaviiva (b) juovaviiva (c) ratakäyrä Kuva 11.10: Virtaviiva, juovaviiva ja rataviiva eli -käyrä. 11.1. ERILAISIA VISUALISOINTIKEINOJA 297 lausuttujen nopeuksien avulla. Kuvista tulee varsin erilaisia ja visualisoinnin suorittajan on valittava kulloinkin paras esitysmuoto. Esimerkiksi turbokoneiden virtaviivavisualisoinneissa saatetaan jopa samassa kuvassa käyttää sekä pyörivässä että pyörimättömässä koordinaatistossa lausuttuja nopeuksia. Virtaviivan yksinkertaisin esitystapa on käyrä, joka kuvaa annetusta alkupisteestä (x, y, z) vapaaksi päästetyn massattoman partikkelin radan ajan funktiona. Virtaviivojen kuvaamiseen voidaan käyttää myös kuplia, nauhoja tai “lakanoita”. FLUENTissa virtaviiva voi olla poikkileikkaukseltaan myös ympyrä tai kolmio. Piirtämällä kuplat tasaisin aika-askelein kuvaan saadaan lisätieto paikallisesta virtausnopeudesta. Mitä etäämpänä kuplat ovat toisistaan, sitä suurempi on virtausnopeus. Nauhamainen virtaviiva synnytetään vapauttamalla virtauskenttään kaksi partikkelia lähellä toisiaan sijaitsevista pisteistä ja värittämällä syntyneiden käyrien välinen alue. Käyrät voidaan myös kiinnittää toisiinsa siten, että niiden välinen etäisyys pysyy vakiona. Nauhoilla toteutettuun visualisointiin saadaan lisäinformaationa virtauksen mahdollinen pyörimisliike. Sama lisäinformaatio saadaan FLUENTin kolmiomaisista virtaviivoista. Lakanaa muistuttava virtaviivavisualisointi saadaan aikaiseksi vapauttamalla virtaukseen useita partikkelita lähellä toisiaan olevista pisteistä ja yhdistämällä niiden piirtämät radat. Tällä tavalla synnytetystä kuvasta tulee helposti epähavainnollinen, mistä johtuen sen käyttö on vähäistä. Sopivissa tilanteissa pintojen läpinäkyvyyttä hyödyntäen tälläkin tavalla voidaan kuitenkin aikaansaada hyviä visualisointeja, mikä muilla tavoilla ei onnistuisi. Kaikissa edellä esitetyissä tavoissa virtaviivaa kuvaavaan elementtiin voidaan lisätä värin avulla jokin skalaarisuure. Kuplavisualisoinnissa myös kuplan kokoa vaihtelemalla voidaan kuvata jonkin skalaarisuureen vaihtelu virtaviivalla. Liika informaatio yhdessä kuvassa saattaa kuitenkin pilata muuten erinomaisen visualisoinnin. Liiallista visualisointiohjelmien tarjoamilla mahdollisuuksilla kikkailua kannattaa välttää. Virtaviivan muodostaminen koostuu kolmesta osatehtävästä: 1) sen laskentatilavuuden etsiminen, jossa piste (x, y, z) sijaitsee, 2) nopeuskomponenttien interpolointi pisteeseen (x, y, z) ja 3) yhtälön v¯ = d¯ x/dt integrointi liikeradan laskemiseksi. Oikean laskentatilavuuden etsiminen on eniten laskenta-aikaa vaativa osatehtävä. Tehokkaan algoritmin avulla laskentaa voidaan huomattavasti nopeuttaa. Erästä hakualgoritmia käsitellään kohdassa 11.3.2, joten laskentatilavuuden etsimistä ei käsitellä tässä tarkemmin. Nopeuksien interpoloimiseksi laskentatilavuuden nurkkapisteistä tarkastelupis- 11.1. ERILAISIA VISUALISOINTIKEINOJA 298 teeseen on olemassa useita eri tapoja. Suoraviivainen tapa on laskentatilavuuden jakaminen kuudeksi (tai viideksi) osatetraedriksi ja interpoloinnin suorittaminen tetraedrin neljässä kärkipisteessä tunnettujen nopeuskomponenttien avulla. Mahdollisesti jo edellisessä vaiheessa etsittäessä oikeata laskentatilavuutta se jouduttiin jakamaan tetraedreihin, joten myös tarvittava tetraedri on jo tiedossa. Laskentatilavuus voidaan jakaa kuudeksi tetraedriksi kuvassa 11.11 esitetyllä tavalla. Edellä on 5 6 7 8 1 2 3 4 tetraedrit: /1,2,5,3/ /2,6,5,3/ /3,6,5,7/ /3,8,7,5/ /3,4,8,5/ /1,4,3,5/ Kuva 11.11: Kahdeksankulmaisen laskentatilavuuden pilkkominen kuudeksi osatetraedriksi. koko ajan oletettu, että virtaussimulointi on tehty rakenteellista hilaa käyttäen. Mikäli simulointi on tehty rakenteettomalla hilalla, käytettävissä saattaa olla valmiiksi tetraedrit eikä laskentatilavuuden pilkkomista tarvita. Monimutkaisemmilla laskentatilavuuksilla on rakenteettomallakin hilalla käytettävä jakoa osatetraedreihin. Itse interpolointi tehdään jakamalla tetraedri kohdepisteen avulla edelleen neljäksi osatetraedriksi ja käyttämällä näiden osatetraedrien suhteellisia tilavuuksia kärkipisteissä tunnettujen arvojen painokertoimina. Menettely on helpompi havainnollistaa kahdessa ulottuvuudessa, joten tarkastellaan seuraavassa kolmion nurkkapisteissä tunnettujen suureiden interpolointia kolmion sisällä olevaan pisteeseen. Kolmion alueella sijaitsevaan pisteeseen P0 saadaan arvo nurkkapisteissä tunnetuista arvoista pinta-alakoordinaatien avulla painottaen seuraavasti ξ P0 = A1 A2 A3 ξ1 + ξ2 + ξ3 A A A (11.3) missä ξn on interpoloitava suure kolmion kärjessä, A on tarkasteltavan kolmion 11.1. ERILAISIA VISUALISOINTIKEINOJA 299 pinta-ala ja An osakolmion pinta-ala (kuva 11.12). Tässä on syytä huomata, että 2 A A1 P0 3 A3 A2 1 Kuva 11.12: Pinta-alakoordinaatit. painokertoimeen tulee aina painotettavaa nurkkaa vastapäätä oleva pinta-ala. Kolmessa ulottovuudessa ja tetraedrien kyseessä ollessa kaava 11.3 muuntuu muotoon ξ P0 = V2 V3 V4 V1 ξ1 + ξ2 + ξ3 + ξ4 V V V V (11.4) missä ξn on interpoloitava suure tetraedrin kärjessä, V on tarkasteltavan tetraedrin tilavuus ja Vn osatetraedrin tilavuus. Kolmantena ja viimeisenä osatehtävänä virtaviivan laskennassa on tavallisen differentiaaliyhtälön v¯ = d¯ x/dt integrointi. Koska Eulerin yksiaskelmenetelmä x¯n+1 = x¯n + ∆t¯ v (¯ xn ) (11.5) on varsin epätarkka, voidaan käyttää esimerkiksi toisen kertaluvun Runge-Kuttamenetelmää x¯∗ = x¯n + ∆t¯ v (¯ xn ) ∆t x¯n+1 = x¯n + (¯ v (¯ xn ) + v¯(¯ x∗ )) 2 (11.6) Tässä Runge-Kutta-menetelmässä otetaan ensin tunnusteleva askel ja vasta sitten varsinainen integrointiaskel. Laskentatilavuuksien hakuja ja interpolointeja joudutaan kullakin aika-askeleella tekemään kaksi. Yhtälöiden (11.6) menetelmän vaatima laskenta-aika on kaksinkertainen Eulerin menetelmään verrattuna. 11.1. ERILAISIA VISUALISOINTIKEINOJA 300 Edellä esitetty partikkelin radan integroimismenettely toimii vain massattomille partikkeleille. Mikäli halutaan tutkia massallisen partikkelin käyttäytymistä simuloidussa virtauskentässä, liikeradan kuvaamiseen tarvitaan useampia yhtälöitä. Täydellisessä kuuden vapausteen mallissa on kolme voimayhtälöä ja kolme momenttiyhtälöä. 11.1.6 Pinnalle pakotetut virtaviivat Edellä esitetty virtaviivojen integrointi voidaan toteuttaa myös siten, että virtaviivat pakotetaan pysymään tietyllä etäisyydellä – esimerkiksi yhden koppikerroksen päässä – kiinteästä pinnasta (surface-restricted stream lines, oil-flow visualization). Lopputuloksena on visualisointi, joka muistuttaa tuulitunnelitekniikassa yleisesti käytettyä väriainekoetta. Virtaviivojen kasautuminen yhteen ennustaa virtauksen irtoamista ja virtaviivojen hajaantuminen uudelleen kiinnittymistä. Kuvassa 11.13 nähdään pinnalle pakotetuilla virtaviivoilla ennustetut virtauksen irtoamis- ja uudelleenkiinnittymiskohdat Huygens-luotaimen pinnalla. Käytetyn laskentahilan resoluutiolla on kuitenkin huomattava vaikutus lopputulokseen, joten tällaisista kuvista tehtävien johtopäätösten kanssa tulee olla varovainen. On myös huomattava kolmidimensioisen virtauksen monimutkaisuus kaksidimensioiseen verrattuna. Kaksiulotteisessa tilanteessa ’virtauksen irtoaminen’ on selvästi määritelty käsite, jolle pätee: • virtaviiva erkanee pinnasta • leikkausjännitys pinnalla häviää • tapahtuu paluuvirtausta Kolmidimensioisessa tilanteessa tulosten tarkastelu on näiltä osin monimutkaisempaa, koska • leikkausjännitys ei yleensä häviä, vaikka virtaviiva erkanee pinnasta • virtaviiva ei välttämättä erkane pinnasta, vaikka leikkausjännitys häviääkin • myös paluuvirtauksen käsite on epämääräinen Tämän vuoksi tilannetta on visualisoitava monin eri tavoin. Rajakerrostyyppisissä virtauksissa on aina tarkasteltava myös pinnalle pakotettuja virtaviivoja. 11.2. JÄLKIKÄSITTELYSSÄ SYNTYVIÄ VIRHEITÄ 301 Kuva 11.13: Huygens-luotaimen pinnalle pakotetut virtaviivat. 11.2 Jälkikäsittelyssä syntyviä virheitä Erilaisia visualisointitekniikoita käytetään laajasti numeeristen virtaussimulointitulosten analysointiin. Joissakin tapauksissa visualisointitekniikka itsessään vääristää saatua tulosta. Näiden virheiden ymmärtäminen on tärkeää simulointitulosten tulkinnassa ja vertailussa koetuloksiin. Osa virheistä aiheutuu kaksiulotteisen kuvaruudun tai paperikuvan rajallisesta kyvystä esittää kolmiulotteista virtauskenttää ja osa taas aiheutuu todellisista numeeristen algoritmien puutteista. Joitakin laskentaalgoritmeissä olevia heikkouksia ei halutakaan korjata, koska korjaamisen hintana olisi visualisointiohjelman huomattava hidastuminen. Usein riittää, että virheet tiedostetaan ja niiden vaikutus eliminoidaan tuloksia tarkasteltaessa. Jälkikäsittelyn virheitä syntyy paitsi itse visualisointialgoritmeista, myös siitä, että visualisointitehtävän eri vaiheita on yllättävän hankalaa pukea tietokoneen ymmärtämään muotoon. Esimerkkinä voidaan mainita ns. keskipiste-kärkipiste ongelma. Visualisoinnissa koko avaruus on saatava katettua ja tämän vuoksi ratkaistavien suureiden arvot on siirrettävä koppien keskipisteistä, mikäli on käytetty keskipisteformalismia, koppien kärkiin. Reunoilla, symmetriakseleilla ja muis- 11.2. JÄLKIKÄSITTELYSSÄ SYNTYVIÄ VIRHEITÄ 302 sa vastaavissa paikoissa voidaan nähdä hyvin usein tulosten käsittelyvirheitä, jotka kokenut tulosten tarkastelija tunnistaa juuri keskipiste-kärkipiste -ongelmasta johtuviksi. Seuraavassa tarkastellaan lähemmin vain itse visualisointialgoritmien ongelmia. 11.2.1 Tasa-arvokäyrien piirtämisessä syntyviä virheitä Tarkastellaan tasa-arvokäyrien määrittämistä nelikulmaisen elementin yli algoritmillä, jossa lineaarisen interpoloinnin ja elementin reunojen päätepisteissä tunnettujen arvojen avulla etsitään reunojen ja tasa-arvokäyrän leikkauspisteet (kuva 11.14). Tasa-arvokäyrä leikkaa elementin reunaviivan, jos tarkasteltavan suureen piirrettävä Y A Y A (a) Y A Y A A Y A Y (b) (c) Kuva 11.14: Kolme erilaista tapaa, joilla nelikulmaisen elementin reunoille lasketut tasaarvot voidaan yhdistää tasa-arvokäyriksi. A viittaan arvoon, joka on alempi kuin tarkasteltava tasa-arvo ja vastaavasti Y viittaa arvoon, joka on ylempi kuin tarkasteltava arvo. arvo on reunaviivan päissä tunnettujen arvojen välissä. Leikkauspisteiden laskeminen on siis yksinkertaista, mutta joissakin tilanteissa niiden yhdistäminen janoiksi ei ole yksikäsitteistä. Ongelman välttämiseksi nelikulmio voidaan jakaa kahdeksi kolmioksi tai etsiä aina ensimmäistä löydetyn pisteen oikealla puolella olevaa pistettä. Nämäkään tarkennukset eivät takaa tasa-arvokäyrien yksikäsitteisyyttä, mutta yleensä johtavat kohtuullisen virheettömään lopputulokseen. Valitettavasti nelikulmio voidaan jakaa kahdeksi kolmioksi kahdella eri tavalla, mikä puolestaan johtaa kahteen hieman toisistaan poikkeavaan tasa-arvokäyrästöön. Tästä puolestaan seuraa se, että lohkorajoilla tasa-arvokäyrät saattavat olla epäjatkuvia. Yksikäsitteinen tasa-arvokäyrästö saadaan jakamalla nelikulmaiset elementit niiden keskelle sijoitetun pisteen avulla neljäksi pienemmäksi kolmioksi, kuten ai- 11.2. JÄLKIKÄSITTELYSSÄ SYNTYVIÄ VIRHEITÄ 303 emmin esitettiin (kuva 11.3). Neljän kolmion käyttäminen tekee tasa-arvokäyristä myös jonkin verran juoheampia, vaikka käytetty laskentaverkko olisi harvakin. Kuvan 11.14 vaihtoehtoehto (c) on kuvitteellinen, eikä tällaista tilannetta käytännössä esiinny. Tasa-arvokäyrähän jakaa kentän kahteen alueeseen, joissa toisessa tarkasteltavan suureen arvo on tarkasteltavaa arvoa alempi ja toisessa ylempi eli tasaarvokäyrät eivät voi leikata toisiaan. Kuvan 11.14 vaihtoehto (c) olisi siis mahdollinen vain siten, että tasa-arvokäyrät kääntyisivät jyrkästi elementin keskellä leikkaamatta toisiaan. 11.2.2 Kolmiulotteisia vektoreita piirrettäessä syntyviä virheitä Kaksiulotteiselle kuvapinnalle kolmiulotteisia vektoreita piirrettäessä osa vektoreiden kuvaamasta tiedosta menetetään. Tiedon häviäminen voi olla harhaanjohtavaa varsinkin, jos kyseessä on mustavalkoinen hetkellinen kuva vektorikentästä. Esimerkki katselukulman vaikutuksesta vektorikentästä syntyvään tulkintaan nähdään kuvassa 11.15. Tasolevyn ja evän liitoskohdassa tapahtuva virtauksen irtoaminen ei näy oikeanpuoleisessa osakuvassa lainkaan. Kaksiulotteisen kuvapinnan rajoittu- Kuva 11.15: Vektoreilla havainnollistettu virtaus tasolevyyn kiinnitetyn paksun siiven ohi. Vasemmanpuoleinen kuva paljastaa liitoskohdassa tapahtuvan virtauksen irtoamisen, mikä oikeanpuoleisen osakuvan katsekulmasta jää kokonaan havaitsematta. neisuutta voidaan osittain kiertää esimerkiksi värittämällä vektorit niiden pituuden mukaan. Näin katselukulmasta riippumatta nopeusvektoreidenkin avulla on mahdollista saada käsitys paikallisista virtausnopeuksista. Nykyaikaisilla grafiikkatyöasemilla on mahdollista pyörittää kuvaa reaaliaikaisesti, mikä vähentää katselukulman aiheuttamaa virhetulkintamahdollisuutta. 11.2. JÄLKIKÄSITTELYSSÄ SYNTYVIÄ VIRHEITÄ 304 11.2.3 Virtaviivojen laskennassa syntyviä virheitä Virtaviivojen laskennassa syntyy aina jonkin verran numeerista virhettä. Tavallisen differentiaaliyhtälön v¯ = d¯ x/dt integroinnin tuloksena saatavan virtaviivan muoto riippuu integrointialgoritmista ja aika-askeleesta. Integrointivirheestä on haittaa erityisesti silloin kun halutaan selvittää mistä kohdin virtauskenttää ovat lähtöisin partikkelit, jotka osuvat johonkin tiettyyn alueeseen, esimerkiksi moottorin ilmanottoaukkoon. Integointivirheen suuruuden voi helposti havainnollistaa laskemalla toisen virtaviivan takaperin kohdasta, jossa ensimmäinen virtaviiva poistuu laskenta-alueesta. Mitä lähempänä viivat ovat toisiaan, sitä virheettömämpi integrointi. Integrointimenetelmän vaikutusta virtaviivan muotoon havainnollistetaan kuvassa 11.16. Helikopterin roottorin synnyttämää virtauskenttää havainnollistava virtaviiva etääntyy roottorista, jos se lasketaan Eulerin yksiaskelmenetelmällä. Tässä erikoistilanteessa integrointivirhe vaikuttaa ja kasaantuu jokaisella aikaaskeleella samaan suuntaan. Toisinaan virtaviivat näyttävät tunkeutuvan kiinteiden Kuva 11.16: Helikopterin roottorin lavan kärjestä vapaaksi päästetty virtaviiva integroituna Eulerin yksiaskelmenetelmällä (vasemmalla) ja toisen kertaluvun Runga-Kuttamenetelmällä (oikealla). pintojen läpi. Syynä tähän on liian suuri aika-askel. Yhden aika-askeleen kuluessa partikkeli etenee useiden rajakerroksessa olevien laskentatilavuuksien yli osumatta aivan pinnan lähellä oleviin tilavuuksiin, joissa pintaa vastaa kohtisuora nopeuskomponenti olisi nolla. 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 305 11.3 Kaksi jälkikäsittelyssä usein tarvittua algoritmia Virtaussimulointitulosten jälkikäsittelyssä joudutaan toistuvasti lajittelemaan elementtejä ja etsimään laskentatilavuuksia, joiden sisälle jokin kiinnostava piste osuu. Alla kuvataan esimerkkialgoritmit kummankin tehtävän hoitamiseen. Kuvattava lajittelualgoritmi tekee lajittelun vain likimääräisesti eikä siksi sovellu kaikkiin tilanteisiin. 11.3.1 Likimääräinen lajittelualgoritmi Kolmiulotteista kappaletta piirrettäessä on jotenkin huolehdittava siitä, että toisten pintojen taakse jääviä pintoja ei piirretä tai että ne piirretään ennen näkyviä pintoja, jolloin jäljempänä piirrettävät pinnat peittävät ne. Piilopintojenpoistoalgoritmi, jossa elementtien piirtäminen aloitetaan katsojasta kauimpana olevasta elementistä ja lähinnä katsojaa oleva elementti piirretään viimeisenä, tunnetaan “maalarin algoritmina”. Kukin elementti vuorollaan “maalataan”, jolloin se peittää kauempana olevat elementit alleen. Ennen piirtämistä elementit joudutaan lajittelemaan, mutta lajittelun ei tarvitse olla täsmällinen, sillä samalla pinnalla lähekkäin olevien elementtien keskinäisellä piirtojärjestyksellä ei ole väliä. Seuraava lajittelualgoritmi sopii tehtävään oivallisesti, sillä se on nopea, mutta alkioden keskenäinen järjestys ei välttämättä aina tule lajittelukriteerin mukaiseksi. Lajittelu aloitetaan laskemalla etäisyydet katselupisteestä kunkin elementin keskipisteeseen. Periaatteessa tässä voitaisiin käyttää myös etäisyyksien neliöitä, jolloin aikaavievä neliöjuuren laskeminen jäisi pois. Tietokoneiden laskentanopeudet ovat kuitenkin kasvaneet sellaisiksi, että tässä voidaan hyvin käyttää todellisia etäisyyksiä, sillä piirrettäviä elementtejä on todennäköisemmin vain joitakin kymmeniätuhansia kuin miljoonia. Lisäksi todellisten etäisyyksien käyttäminen johtaa tarkempaan lajitteluun. Etäisyyksiä laskettaessa kirjataan muistiin myös minimi- ja maksimietäisyys. Tämän jälkeen etäisyydet skaalataan kokonaisluvuiksi, jollekin sopivalle välille esim. 1. . .100 000 siten, että minimietäisyys saa arvon 1 ja maksimietäisyys arvon 100 000. Lukualueen täytyy olla vähintään noin kaksi kertaa niin suuri kuin lajiteltavien elementtien lukumäärä, mutta se voi olla suurempikin. Lukualueen kasvattaminen parantaa lajittelun tarkkuutta. Samalla kun elementin etäisyys skaalataan kokonaisluvuksi, sen numero sijoitetaan kokonaisluvuksi skaalatun etäisyyden osoittamaan kohtaan vektoriin, jonka pituus täytyy olla sama kuin edel- 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 306 lä valittu kokonaislukualue. Koska on mahdollista, että johonkin vektorin muistipaikkaan osuu useampi kuin yksi elementti, lajittelu tehdään kahdesti. Ensimmäisellä kerralla elementtien numeroita ei talleteta vaan vektorin muistipaikkoja käytetään laskureina, jotka laskevat kuinka monta elementtiä kuhunkin muistipaikkaan tulee osumaan. Suuri osa vektorin muistipaikoista jää tyhjiksi ja loppuihin osuu vain yksi elementti. Päällekirjoittamisen välttämiseksi perustetaan osoitinvektori, jonka avulla päällekirjoittuvien elementtien numerot voidaan ohjata seuraaviin vapaisiin muistipaikkoihin. Lajittelu toistetaan siten, että elementtien numerot talletetaan kokonaisluvuiksi skaalattujen etäisyyksien ja osoitinvektorin osoittamiin muistipaikkoihin. Hieman viimeisteltympänä ja FORTRAN-kielellä algoritmi näyttää seuraavalta: DO IZ=1,NVE+NZBUF IFLAG(IZ) = 0 ENDDO RANGE = MAX(DDMAX-DDMIN,1.0E-8) DO N=1,NVE IZ = NINT((DD(N)-DDMIN)/RANGE*(NZBUF-1) + 1.0) IFLAG(IZ+NVE) = IFLAG(IZ+NVE) + 1 ENDDO IFLAG(NVE) = 1 DO N=NVE+1,NVE+NZBUF IFLAG(N) = IFLAG(N) + IFLAG(N-1) ENDDO DO N=1,NVE IZ = NINT((DD(N)-DDMIN)/RANGE*(NZBUF-1) + 1.0) IFLAG(IZ+NVE) = IFLAG(IZ+NVE) - 1 IFLAG(IFLAG(IZ+NVE)) = N ENDDO Yllä olevassa koodissa IFLAG-vektorin yläosaa [NVE+1...NVE+NZBUF], missä NVE on lajiteltavien elementtien lukumäärä ja NZBUF on valitun lukualueen koko, käytettiin ensimmäisessä toistosilmukassa laskurina ja toisessa toistosilmukas- 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 307 sa siitä tehtiin tarvittava osoitinvektori. Kolmannessa toistosilmukassa elementtien numerot talletettiin suoraan IFLAG-vektorin alkuosaan, jossa on siis käytettävissä vain yhtä monta muistipaikkaa kuin on lajiteltavia elementtejä. Osoitinvektori huolehtii siitä, ettei yksikään elementti tule päällekirjoitetuksi. Operaation lopputuloksena elementtien numerot löytyvät IFLAG-vektorin alkuosasta toivotussa piirtojärjestyksessä. Koska katsojasta kauimpana oleva elementti halutaan piirtää ensimmäisenä, vektorin lukeminen aloitetaan IFLAG-vektorin alkuosan lopusta eli muistipaikasta NVE ja edetään takaperin muistipaikkaan 1. Edellä kuvattu lajittelualgoritmi ei oikeastaan ole mikään lajittelualgoritmi, sillä elementtien etäisyyksiähän ei missään vaiheessa vertailtu keskenään. Lopputulos vain näyttää siltä kuin elementit olisi lajiteltu! Algoritmin nopeus perustuu juuri siihen, että vertailuja ei tehdä. Kyseessä on lajittelu ilman IF-testejä. 11.3.2 Algoritmi laskentatilavuuden paikantamiseksi Monissa virtaussimulointitulosten jälkikäsittelyyn liittyvissä tehtävissä, kuten esimerkiksi tasa-arvopintojen laskennassa, virtaviivojen laskennassa ja interpoloitaessa tuloksia erilaisten hilojen välillä, joudutaan useita kertoja paikantamaan laskentatilavuuksia, joiden sisälle tarkasteltavat pisteet osuvat. Jos simulointimalli on suuri, hakuun kuluu suhteellisen paljon aikaa. Useimmat kehitetyt hakualgoritmit perustuvat erilaisten “tuntosarvien” käyttöön, mikä tarkoittaa sitä, että haku aloitetaan aina edellisestä löydetystä tilavuudesta ja se rajoittuu ainakin aluksi jo löydetyn pisteen lähiavaruuteen. Esimerkiksi virtaviivojen laskennassa tällainen algoritmi voi olla hyvinkin tehokas. Tilanteissa, joissa virtaviiva ylittää lohkorajan (rakenteellisen ratkaisijan yhteydessä) tai rajapinnan, jolla lohko liimautuu itseensä, “tuntosarvet” eivät kuitenkaan toimi ja saatetaan joutua tutkimaan jopa tuhansia laskentatilavuuksia ennenkuin hakualgoritmi saadaan taas palautettua raiteilleen. Alla kuvattava periaatteeltaan hieman erilainen hakualgoritmi on täysin tunteeton lohkorajoille, hilan topologialle ja sille onko kyseessä rakenteellinen, rakenteeton vai hybridihila. Keskeisenä ideana tässä algoritmissä on se, että ennen haun aloittamista laskentatilavuudet ryhmitellään niiden sijainnin perusteella. Ryhmittelyn vaatima kirjanpito aiheuttaa jonkin verran muistin tarvetta, mutta tietokoneiden muistit ovat kasvaneet niin suuriksi, ettei tällä ole käytännössä mitään merkitystä. Laskentatilavuudet ryhmitellään lokeroihin, jotka syntyvät, kun laskentahilan tai sen kiinnostavan osan ympärille ajatellaan generoiduksi tasavälinen suorakaidehila. Hilan koko voi 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 308 olla esimerkiksi 50 × 50 × 50 tai 100 × 100 × 100 lokeroa. Laskentatilavuus merkitään osuvaksi kaikkiin niihin lokeroihin, joihin sen ääripisteet eri suunnissa osuvat. Ääripisteiden sijainti lokerikossa saadaan kaavoista Imin = min(INT((xN − xmin )∆x) + 1, N = 1, 8) Imax = max(INT((xN − xmin )∆x) + 1, N = 1, 8) Jmin = min(INT((yN − ymin )∆y) + 1, N = 1, 8) Jmax = max(INT((yN − ymin )∆y) + 1, N = 1, 8) Kmin = min(INT((zN − zmin )∆z) + 1, N = 1, 8) Kmax = max(INT((zN − zmin )∆z) + 1, N = 1, 8) joissa (xmin ,ymin,zmin ) on lokerikon alimman kulman sijainti ja ∆x, ∆y, ∆z ovat lokeroiden pituudet eri koordinaattiakselien suunnissa. Kaavoissa oletettiin, että kyseessä on kahdeksankulmaisista laskentatilavuuksista koostuva hila. Jos kyseessä olisi tetraedrihila, toistosilmukat pyörisivät vai neljään. Hybridihilan kyseessä ollessa algoritmin on jotenkin saatava tieto siitä minkä tyyppistä laskentatilavuutta tarkastellaan. Käytännössä laskentatilavuus merkitään osuvaksi useampaan kuin yhteen lokeroon ja myös sellaisiin lokeroihin, joihin se ei todellisuudessa lainkaan osu. Esimerkiksi kuvan 11.17 tapauksessa laskentakopin 2 nurkat osuvat alueeseen I = 1 . . . 4 ja J = 2 . . . 4. Kaikki tähän alueeseen osuvat lokerot merkitään laskentakopin 2 vaikutusalueeksi. Tarpeettomasti merkityiksi tulevat lokerot (1,4), (2,4) ja (4,2). Oleellista on, ettei ryhmittelyssä tarvita lainkaan ehtolauseita. Näin ryhmittely tapahtuu nopeasti, vaikka laskentatilavuuksia olisi useita miljoonia. Ryhmittelyn lopputuloksena saadaan vektori, jossa samaan lokeroon osuvien laskentatilavuuksien numerot ovat peräkkäin. Ryhmittelyyn liittyy kuitenkin yksi käytännön ongelma, joka jätettiin edellä mainitsematta. Koska yksi laskentatilavuus voi osua – ja käytännössä useimmiten osuukin – useampaan kuin yhteen lokeroon, ryhmittelyvektorin pituutta ei etukäteen tunneta. Tästä johtuen ryhmittely tehdään kahdesti. Ensimmäistä ryhmittelyä varten varataan muistitila vektorille, jossa on yhtä monta muistipaikkaa kuin kuvitellussa lokerikossa on lokeroita. Vektori toimii laskurina, jonka avulla selvitetään kuinta monta laskentatilavuutta kuhunkin lokeroon tulee osumaan. Laskentatilavuuksien numeroita ei siis ensimmäisessä ryhmittelyssä kirjata lainkaan. Kun osumat on saatu laskettua, ryhmittelyvektorille voidaan allokoida tarvittava muisti. Tässä vaiheessa perustetaan myös osoitinvektori, jossa on tieto siitä mistä ryhmittelyvektorin kohdasta alkavat kuhunkin lokeroon osuvien laskentatilavuuksien nume- 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 309 j 4 4 3 8 7 3 2 12 11 6 16 15 10 14 2 1 5 9 13 1 1 2 3 4 5 6 7 8 i Kuva 11.17: Laskentatilavuuden paikantamisen nopeuttamiseksi tehtävä laskentatilavuuksien ryhmittely esitettynä yksinkertaisuuden vuoksi kahdessa dimensiossa. rot ja kuinka monta niitä on tai vaihtoehtoisesti mihin kohtaan ne päättyvät. Kaikki on nyt valmista lopullista ryhmittelyä varten. Toisessa ryhmittelyssä kuhunkin lokeroon osuvien laskentatilavuuksien numerot talletetaan ryhmittelyvektoriin asianmukaisiin kohtiin. Osoitinvektorin avulla tiedetään kunkin ryhmän alkukohta ja aina uuden laskentatilavuuden osuessa ryhmään osoitinta kasvatetaan yhdellä, jotta seuraavan laskentatilavuuden numero tulee sijoitetuksi seuraavaan vapaaseen paikkaan. Laskentatilavuudet on nyt ryhmitelty siten, että kuhunkin lokeroon osuu tyypillisesti vain muutama laskentatilavuus tai optimitilanteessa vain yksi tilavuus ja tietysti mahdollista on sekin, ettei johonkin lokeroon osu yhtään tilavuutta. Tässä kohdassa on syytä huomata, että jos lokerikko muodostettiin vain jonkin kiinnostavan laskenta-avaruuden osan ympärille, suuri osa laskentatilavuuksista tuli kokonaan hylätyiksi. Sopivissa tilanteissa tämä pudottaa hakuihin kuluvan ajan murto-osaan siitä mitä se olisi, jos kaikki laskentatilavuudet olisivat haussa mukana. 11.3. KAKSI JÄLKIKÄSITTELYSSÄ USEIN TARVITTUA ALGORITMIA 310 Oletetaan nyt, että tehtävämme on interpoloida jokin suure, esimerkiksi nopeus, pisteeseen (x, y, z). Ensiksi selvitämme mihin lokeroon tämä piste osuu eli I = INT((x − xmin )∆x) + 1 J = INT((y − ymin)∆y) + 1 K = INT((z − zmin )∆z) + 1 Kun lokero tunnetaan, tiedetään välittömästi myös kaikki potentiaaliset laskentatilavuudet, joiden sisällä se voi olla. Tarkempi tarkastelu joudutaan siis tekemään vain muutamalle laskentatilavuudelle ja ihannetilanteessa lokerossa on vain yksi laskentatilavuus, jolloin tarvitaan vain varmistus siitä, että piste todella sijaitsee sen sisällä. Tarkistusta varten kahdeksankulmainen laskentatilavuus tavallisesti pilkotaan kuudeksi tetraedriksi. Tarkistus tehdään jakamalla tetraedri(t) kohdepistettä yhtenä kärkenä käyttäen neljäksi osatetraedriksi ja laskemalla näiden osatetraedrien tilavuudet. Jos ne kaikki ovat positiivisia, piste sijaitsee tetraedrin sisällä. Tilavuuksien laskenta täytyy tehdä kaikille osatetraedreille samanlaisella vektorioperaatiolla, jotta merkkisääntö toimisi. Tarkistus on mahdollista tehdä suoraan myös kahdeksankulmaiselle tilavuudelle toisenlaista algoritmiä käyttäen. Kuten alussa mainittiin, kuvatun hakualgoritmin vahvuus on se, että se on täysin tunteeton lohkorajoille ja hilan topologialle. Kun ryhmittely on kerran tehty, on jokseenkin samantekevää onko hilassa satatuhatta vai kymmenen miljoonaa laskentatilavuutta. Yhteen hakuun kuluu keskimäärin aina sama aika. “Tuntosarvialgoritmeistä” poiketen haku toimii myös yhtä nopeasti, vaikka koko ajan hypittäisiin lohkosta toiseen tai laskenta-alueen reunalta vastakkaiselle. Lokeroiden määrää kasvattamalla hakua voidaan nopeuttaa, mutta käytännössä on osoittautunut, että lokerikon optimikoko on noin 503 . . . 1003 lokeroa. Lokerikon tiheyden kasvaessa ryhmittelyyn tarvittava aika kasvaa, eikä lokeroiden määrän lisäämisestä saada enää merkittävää hyötyä. Koko riippuu tietenkin jossain määrin laskentahilan koosta. Kuvattu algoritmi soveltuu kahteen ulottuvuuteen sovitettuna myös piilopintojen poistoon. Piirrettävät elementit ryhmitellään ensin niiden sijainnin perusteella ruudukkoon samaan tapaan kuin edellä ryhmiteltiin laskentatilavuudet. Tässä oletetaan, että käytettävissä on kuvapinnalle projisoidut koordinaatit, ns. piirtokoordinaatit. Elementtejä piirrettäessä tiedetään välittömästi ne elementit, jotka sijaitsevat suunnilleen samassa kohdassa piirtoalaa kuin piirrettävä elementti. Piiloonjäämisvertailu joudutaan näin tekemään vain muutaman elementin kesken. 11.4. KERTAUS 311 11.4 Kertaus Yleisimmät visualisointitavat ovat: • tasa-arvokäyrät, -vyöhykkeet ja -pinnat • vektorit • virta-, rata- ja juovaviivat • maaginen luku kertoo, millä 27:stä mahdollisesta tavasta tasa-arvovyöhyke ylittää kolmion pinnan • tasa-arvopintoja piirretään yleensä vain yksi • vektorit ovat joskus erotuskyvyltään huonoja. Parhaan näköiset kuvat saadaan piirtämällä ne tasavälisiksi, mutta tällöin saattaa kadota informaatiota. • virtaviivoilla saadaan yksityiskohdat vektoreita paremmin, mutta nopeuksien suuruuden tarkasteluun tarvitaan lisäksi vektoreita tai jakaumakuvia • virtaviivojen laskennassa ja muissakin visualisointitilanteissa kannattaa yleensä käyttää heksaedrien jakamista osatetraedreiksi • pinnalle pakotetut virtaviivat antavat tietoa mm. virtauksen irtoamisesta, mutta kolmidimensioisella kappaleella irtoaminen on epämääräisesti määritelty käsite ja tulosten tulkinta on joskus vaikeaa • jälkikäsittelyn eri laskentavaiheet voivat olla aikaavieviä vielä nykyisilläkin tietokoneilla. Lajittelualgoritmi ja paikantamisalgoritmi ovat esimerkkejä nopeista laskentatavoista. • visualisoinnissa syntyy aina vähän virhettä, mutta yleensä silmä ei erota sitä. Visualisointialgoritmeissa voidaan käyttää hyväksi tätä piirrettä, jolloin algoritmien ei tarvitse olla ’täydellisiä’. • jälkikäsittely on altis ns. kauneusvirheille , jotka eivät sinänsä pilaa tuloksia, mutta voivat olla haitallisia johtoryhmien kokouksissa 11.4. KERTAUS 312 • jälkikäsittelyvaiheessa (visualisointi mukaan lukien) syntyy joskus myös pahoja väärään tulkintaan johtavia virheitä, vaikka laskentatulokset olisivat aivan kelvollisia! Päivitetty 25.3.2014
© Copyright 2025