FER - ZEMRIS - RG Animacija toka fluida

Programsko rješenje

Za potrebe ovog rada implementiran je postupak opisan u poglavlju 4. i to u dvodimenzionalnom prostoru. Kao baza za implementaciju poslužio je izvorni kod Stamove aplikacije čiji su rezultati prikazani u odjeljku 3.6. Korišten je programski jezik C++.

Strukture podataka

Definiran je razred TDSmokeSolver koji implementira navedeni postupak. Stanje fluida je zbog dvodimenzionalnog prostora opisano s četiri članske varijable, a to su u, v, r, p, odnosno brzina u smjeru osi x, brzina u smjeru osi y, gustoća dima i tlak. Željeno stanje dima predstavljeno je varijablom rs. Gustoća dima konvoluirana s Gaussovom jezgrom predstavljena je varijablama rt i rts. Sve navedene varijable su tipa std::vector <double>. Parametri simulacije označeni su varijablama vf, vd, vg i sigma koje su tipa double. Ostale varijable su većinom pomoćne. Ključna je metoda void MakeStep ( bool fst_order ) koja računa stanje fluida za sljedeći vremenski trenutak tt. Zaglavlje cijelog razreda izgleda ovako:

 class TDSmokeSolver
 {
 protected:
   std::vector <double> u, v, r, p; // stanje fluida
   std::vector <double> rs; // zeljeno stanje dima
   std::vector <double> rt, rts; // zagladjene verzije dima
   double vf, vd, vg, sigma; // parametri simulacije

   int N;
   double dt, delta;
   std::vector <double> uv_temp, u_approx, v_approx;
   std::vector <double> r_gather, r_gather2;
   std::vector <double> div, kernel, r_temp;

   double mml ( double Q1, double Q2, double Q3 );
   double hyperbolicSolveU ( std::vector <double> &x, double s1,
            double s2, int i, int j, bool b, bool fst_order );
   double hyperbolicSolveV ( std::vector <double> &x, double s1,
            double s2, int i, int j, bool fst_order );

   void gaussianSmooth ( bool b );
   void applyDrivingForce ( );
   void attenuateMomentum ( );
   void advectMomentum ( bool fst_order );
   void project ( );
   void advectSmoke ( bool fst_order );
   void gatherSmoke ( );

 public:
   TDSmokeSolver ( int n, double v_f,
         double v_d, double v_g, double sgm, double d_t,
         std::vector <double> &r1, std::vector <double> &r2 );
   ~TDSmokeSolver ( );

   void MakeStep ( bool fst_order );
   std::vector <double> GetSmoke ( ) { return r; };
   void GetVelocity ( std::vector <double> &ux, std::vector <double> &uy );
};

Metoda MakeStep izračunava stanje fluida u sljedećem vremenskom trenutku. To čini u koracima opisanim u odjeljku 4.4. Svaki korak predstavlja po jedna od sljedećih metoda sa zaštićenim pravom pristupa čija je implementacija opisana u PDF verziji diplomskog rada:

 void applyDrivingForce ( );
 void attenuateMomentum ( );
 void advectMomentum ( bool fst_order );
 void project ( );
 void advectSmoke ( bool fst_order );
 void gatherSmoke ( );

Grafičko korisničko sučelje

Za izradu grafičkog korisničkog sučelja korišten je MFC (Microsoft Foundation Classes). Njime se omogućuje relativno jednostavna izrada prozora s uobičajenim Windows kontrolama poput polja za unos teksta, dijaloga za učitavanje i spremanje datoteka itd. Grafičko korisničko sučelje aplikacije izrađene u okviru ovog rada sastoji se od jednog prozora koji izgleda ovako:

Slika 10. Grafičko korisničko sučelje
Slika 10. Grafičko korisničko sučelje

Prozor je podijeljen na četiri logičke cjeline. To su konfiguracijska cjelina, cjelina za učitavanje slika, cjelina za određivanje iznosa parametara te upravljačka cjelina. Sve cjeline osim upravljačke uokvirene su uz odgovarajući natpis (eng. Configurations, Images, Parameters). Detaljniji opis svake od njih nalazi se u PDF verziji diplomskog rada.