Vakaa-Nesteet on nesteen simulointi menetelmä ( MFN ) ovat kuvanneet Jos Stam vuonna 1999 osana SIGGRAPH99 konferenssin.
Se käyttää Eulerian-ruudukkoa : yksinomaan nesteestä koostuva tila, jossa nesteen liikettä kuvaa nopeusvektorien kenttä (jota kutsutaan myös nopeudeksi ).
Stable-Fluid-malli käyttää Navier-Stokes-yhtälöitä puristamattomien nesteiden tapauksessa.
Nämä yhtälöt voidaan tulkita seuraavasti:
Sieltä yritämme yksinkertaistaa Navier- ja Stokes-yhtälöitä käyttämällä Helmholtz-Hodge- hajoamislausetta . Tällä tavoin sisällytetään termi projektio .
Lisäksi tämän lauseen avulla voimme poistaa yhtälöstä useita elementtejä, kuten puristamaton yhtälö ja paineeseen liittyvä termi:
Siten pääsemme seuraavaan yhtälöön:
Digitaalisen resoluution osalta eri komponentteja (diffuusio, advektio, projektio, ulkoiset voimat) ei lasketa ja lasketa yhteen, toisin kuin matemaattisessa muodossaan. Pikemminkin katsomme, että jokainen komponentti, sisääntulovektorien kentästä, suorittaa modifikaatioita kentällä ja antaa tuloksen seuraavalle komponentille.
Määritämme operaattorit advektion ( ), diffuusion ( ), ulkoisten voimien ( ) ja projektion ( ) soveltamiseksi ja operaattorin, joka vastaa matemaattista formulaatiota aikavaiheelle.
Täten vektorikenttä u kulkee kussakin ajankohdassa peräkkäin advektio-operaattorin, sitten diffuusion, ulkoisten voimien ja lopuksi projektio-operaattorin läpi.
Tarkastellaan 2D- tapausta (pieni ero 3D: llä) ja tarkastellaan säännöllistä N × N-solujen ruudukkoa, jossa kukin solu määritetään nopeusvektorilla (solun keskellä) ja paineella (projektio-osalle).
Tiedot esitetään taulukoissa, joissa i ja j vastaavat nykyisen solun sijaintia ruudukossa.
Diffuusiovaihe vastaa viskositeetin erotuskykyä. Nesteen nopeus vaikuttaa naapurisoluihin. Tätä varten käytetään lineaarista ratkaisijaa.
Jos vastaa nopeutta yksi soluista ja , , ja viereisiin soluihin, sitten ratkaisija on ratkaista järjestelmä, jossa kunkin solun:
tai
Järjestelmän resoluutioksi voidaan käyttää Gauss-Seidel- ratkaisijaa . Tässä esimerkissä työskentelemme taulukossa, jossa käytetään vain suoria naapureita, muut solut eivät näy ja niiden kerroin on 0.
Advektion vaiheen aikana , joten katsomme, että nopeusvektorissa on hiukkanen, suorittaa taaksepäin jäljittämisen ( taaksepäin jäljittämisen ) hiukkasen sijainnin määrittämiseksi edellisessä ei-ajankohdassa, lopuksi suoritamme interpoloinnin tuntemaan nopeuden vektorin hiukkanen. Jälkimmäinen korvaa nopeusvektorin arvon. Siksi yritämme pitää hiukkasessa olevan energian.
Pseudokoodi, etsintäalgoritmi advection (int b, float * d, float * d0, float * u, float * v) { int i, j, i0, j0, i1, j1; float x, y, s0, t0, s1, t1, dt0; dt0 = _fm->dt()*_n; //coefficient FOR_EACH_CELL // position de la particule au pas de temps précédent x = i-dt0*u[IX(i,j)]; y = j-dt0*v[IX(i,j)]; // condition limites, les bords de la grille if (x<0.5f) x=0.5f; if (x>_n+0.5f) x=_n+0.5f; i0=(int)x; i1=i0+1; if (y<0.5f) y=0.5f; if (y>_n+0.5f) y=_n+0.5f; j0=(int)y; j1=j0+1; // interpolation s1 = x-i0; s0 = 1-s1; t1 = y-j0; t0 = 1-t1; d[IX(i,j)] = s0*(t0*d0[IX(i0,j0)]+t1*d0[IX(i0,j1)])+ s1*(t0*d0[IX(i1,j0)]+t1*d0[IX(i1,j1)]); END_FOR // conditions limites, bord de la grille set_bnd (b, d ); } advection_step() { SWAP ( u0, u ); SWAP ( v0, v ); diffuse_vel_x (1, u, u0, _visc,this->_algoVel_diffuse_k); diffuse_vel_y (2, v, v0, _visc,this->_algoVel_diffuse_k); }Projisointi mahdollistaa massan säilymisen ja siten nesteen puristamattomuuden palauttamisen. Tätä varten meidän on määritettävä saapuvan ja lähtevän materiaalin määrät kunkin solun tasolla, sitten korjattava nopeudet niin, että saapuvaa ja lähtevää materiaalia on yhtä paljon.
Divergenssi on ero saapuvien ja lähtevien virtausten välillä. Tätä varten otetaan vaakatasossa sijaitsevien naapurivektorien vaakakomponentti ja pystysuunnassa naapurivektorien pystykomponentti.
: nopeusvektorin vaakasuora komponentti : nopeusvektorin pystykomponentti : vektorien ja vektorien välinen etäisyys : vektorien ja vektorien välinen etäisyysN × N-solujen ruudukon tapauksessa meillä on
Pseudokoodi, projektioalgoritmi project (float * u, float * v, float * p, float * div, int kmax ) { int i, j; //Calcul de la divergence FOR_EACH_CELL div[i,j] = -0.5f*(u[i+1,j]-u[i-1,j]+v[i,j+1]-v[i,j-1])/_n; p[i,j] = 0; END_FOR set_bnd (0, div ); set_bnd (0, p ); //Résolution du système lin_solve (0, p, div, 1, 4, kmax); //Mise à jour des vélocités FOR_EACH_CELL u[i,j] -= 0.5f*_n*(p[i+1,j]-p[i-1,j]); v[i,j] -= 0.5f*_n*(p[i,j+)]-p[i,j-1]); END_FOR set_bnd (1, u ); set_bnd (2, v ); }On porrastettu-verkkoon skalaari muuttujat (kuten paine) varastoidaan keskuksia solujen, kun taas nopeudet reunoilla (tai osia) solun.
Porrastetun ruudukon käyttö estää paineen ja nopeuden parittoman irrottamisen . Voimme tietää tarkasti soluun tulevan ja sieltä lähtevän nesteen määrän, mikä ei ole asia, jos nopeudet ovat keskellä. Joten porrastettu verkko mahdollistaa tarkemmat laskelmat ja vähemmän digitaalista hajaantumista .
Haittana on, että arvot tallennetaan eri paikkoihin, mikä vaikeuttaa äänenvoimakkuuden säätämistä.
Takaisku ( backtracking ) on menetelmä hiukkasen sijainnin löytämiseksi nestemäisessä Eulerianissa edellisen no-time-ajan jälkeen. Perushyökkäyksessä on yksinkertaisesti kyse nopeuden ottamisesta, kertomalla aika-askelella ja solun mitoilla partikkelin edellisen sijainnin löytämiseksi.
Siitä huolimatta neste seuraa kaarevaa polkua, eikä yksinkertainen nopeuden käyttö riitä partikkelin vanhan asennon tarkkaan löytämiseen. Tarkkuuden parantamiseksi voidaan tehdä korjauksia. Siellä on Runge-Kutta , MacCormack ja BFECC ( edellisen ja toisen virhekorjaus ja korjaus ) .
Vastakkaisen kaavion ensimmäinen kuva esittää yksinkertaisen raidan paluun tapauksen: voimme huomata, että radan tuotto palauttaa nopeuden (harmaana), joka ei kuulu hyvään ominaisviivaan. MacCormackin avulla pääset lähemmäksi ominaisviivaa (kaavion viimeinen kuva, vektori harmaana).
Siinä tapauksessa, että päätetään työskennellä pinnan läpi kulkevalla nestevirtauksella, hän löytää itsensä tilanteessa, jossa järjestelmän muodostavat solut eivät ole neliöitä. Nämä muodonmuutokset on otettava huomioon epärealististen ilmiöiden välttämiseksi.
Vapaan pinnan käsite koskee veden pinnan mallintamista. On olemassa erilaisia menetelmiä, kuten tason asettaminen tai nesteen pinnan nopea ja vankka seuranta.
Aikaisemmissa tapauksissa 2D- tapauksille käytettiin neliösoluja (tai ainakin nelikulmioita) ja 3D- tapauksille kuutioita . On kuitenkin mahdollista käyttää kolmiomaisia soluja tai tetraedroja.
Kyse on projisointivaiheen korvaamisesta vaiheella, jossa pyritään säilyttämään pyörteys . Pyörteisyys vastaa pyörteiden ilmiöitä. Joten sen sijaan, että tarkistaisimme, että solu sisältää oikean määrän nestettä, tarkistamme puristamattomuuden pisteiden ympärillä olevien virtausten avulla.