Stabiilit nesteet

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 ).

Matemaattinen muotoilu

Navier-Stokes-yhtälöt

Stable-Fluid-malli käyttää Navier-Stokes-yhtälöitä puristamattomien nesteiden tapauksessa.

Nämä yhtälöt voidaan tulkita seuraavasti:

Helmholtz-Hodge-hajoamislause

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:

Digitaalinen malli

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.

Menetelmän toteutus

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.

Diffuusio

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.

Pseudokoodi, diffuusioalgoritmi int N = 100 // largeur et hauteur du tableau int kmax = 100 // nombre d'itérations à effectuer (solveur) float diff = 0.01 // coefficient de diffusion float u[N,N] // composante horizontale des vecteurs vélocité float v[N,N] // composante verticale des vecteurs vélocité float u0[N,N], v0[N,N] // tableaux temporaires relatifs à u et v // solveur linéaire Gauss-Seidel void linear_solver (int b, float * x, float * x0, float a, float c, int kmax ) { int i, j, k; for ( k=0 ; k<kmax ; k++ ) { FOR_EACH_CELL x[i,j] = (x0[i,j] + a*(x[i-1,j]+x[i+1,j]+x[i,j-1]+x[i,j+1]))/c; END_FOR set_bnd (b, x ); // conditions limites } } // opérateur de diffusion void diffuse_step() { SWAP ( u0, u ); SWAP ( v0, v ); float a=_fm->dt()*diff*N*N; lin_solve (1, u, u0, a, 1+4*a,kmax ); lin_solve (2, v, v0, a, 1+4*a,kmax ); }  

Advection

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); }  

Projektio

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äisyys

N × 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 ); }  

Edellytykset rajoille

Menetelmän laajennukset

Porrastettu ruudukko

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ä.

Takaisin raiteilleen

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).

Flux mielivaltaisella pinnalla ja vääristymä

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.

Vapaa pinta

Vapaan pinnan käsite koskee veden pinnan mallintamista. On olemassa erilaisia ​​menetelmiä, kuten tason asettaminen tai nesteen pinnan nopea ja vankka seuranta.

Kolmikulmaiset solut ja tetraederit

Aikaisemmissa tapauksissa 2D- tapauksille käytettiin neliösoluja (tai ainakin nelikulmioita) ja 3D- tapauksille kuutioita . On kuitenkin mahdollista käyttää kolmiomaisia ​​soluja tai tetraedroja.

Pyörteisyys

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.

Ulkoiset linkit

Huomautuksia

  1. "Stable Fluid" - Jos Stam - 1999
  2. Reaaliaikainen Fluid Dynamics peleille
  3. "Aikariippuvan viskoosin puristamattoman nesteen virtauksen numeerinen laskeminen vapaan pinnan kanssa" - Harlow, FH ja Welch, JE - 1965,
  4. "Numeerinen lämmönsiirto" - SV Patankar
  5. "Ehdottomasti vakaa MacCormack-menetelmä"
  6. "BFECC: n käyttö nestesimulointiin"
  7. "Virtaukset mielivaltaisen topologian pinnoilla"
  8. "tason asetettu menetelmä nesteen rajapinnalle"
  9. "Nestepintojen nopea ja kestävä seuranta"
  10. "Näkymätön ja pakkaamaton nestesimulaatio kolmioverkoissa"
  11. "Vakaa, verenkiertoa säilyttävä, yksinkertainen neste"