11. luento

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