next up previous contents
Next: Inicializace datovych poli Up: Datova struktura programu Previous: Rozdeleni na typy hranice   Contents

Ulozeni triangulace

Pro datove ulozeni site budeme nejprve potrebovat pocty jednotlivych soucasti triangulace: elementu, stran, vrcholu a hranicnich stran.

long   NElements=0;        /**< Number of Elements */ 
long   NSides=0;           /**< Number of Sides */
long   NPoints=0;          /**< Number of Points/Vertices */
long   NBSides=0;          /**< Number of Boundary Sides */

Dale uchovani souradnic vrcholu triangulace $(x_i,y_i)$ a originalni konfiguraci souradnic vrcholu triangulace $(x^h_i,y^h_i)$ (originalni konfiguraci je minena triangulace vypoctove oblasti na zacatku vypoctu, poloha jejich vrcholu je ulozena z duvodu moznosti vypoctu na pohyblive siti). U kazdeho vrcholu si take zapamatujeme zda lezi na hranici ( PointMark${}_i$= TRUE/FALSE ).

double *x =NULL,*y =NULL;     /**< points location at time level N */
short  *PointMark;            /**<  boundary marks etc. */              
double *xT1 =NULL,*yT1 =NULL; /**< points location at time level N-1 */
double *xT2 =NULL,*yT2 =NULL; /**< points location at time level N-2 */
double *xh=NULL,*yh=NULL,
       *rh=NULL;              /**< initial/original configuration(ALE) */
long FixPressureIdx;          /**< fix pressure? (for NS+Dirichlet BC) */

Jiz byla zminena moznost vypoctu na pohyblive siti, t.j. na siti, ktera s casem muze menit polohu jednotlivych vrcholu triangulace ($x_i,y_i$). Jak jiz bylo naznaceno body $x_i,y_i$ budou oznacovat vrcholy triangulace v case $t_{n+1}$ (pri prechodu z casove vrstvy $t_n$ na $t_{n+1}$). Dale uchovame souradnice vrcholu v case $t_n$ jako $x^{T_1}_i,y^{T_2}_i$ a v case $t_{n-1}$ jako $x^{T_2}_i,y^{T_2}_i$. Pro vypocet na pohyblive siti je pouzita Arbitrary Lagrangian-Eulerian (ALE) formulace, ktera nahrazuje casovou derivaci jako

$\displaystyle \frac{\partial}{\partial t} \equiv \frac{D^{{\cal A}_{t}}}{D t} + (\mathbf{w}_g
\cdot \nabla),
$

kde $\frac{D^{{\cal A}_t}}{D t}$ je ALE derivace vuci pevne zvolenemu bodu originalni konfigurace (t.j. napriklad vrcholu site) a $\mathbf{w}_g$ pak je rychlost site. Program pro vypocet rychlosti site pouziva dvoukrokovou zpetnou diferenci. Ulozena rychlost site je v poli GVel1,GVel2. Pri reseni nelinearniho problemu pro fluid-structure interakci se ovsem rychlost site v prubehu vypoctu zpresnuje. Aby bylo mimo jine mozne zachovat okrajove podminky na pohyblive stene ( $\Gamma_{F}$) i v pripade, ze se rychlos site zmenila, udrzujeme i predchozi aproximaci rychlosti site jakozto pole RecentGVel1,RecentGVel2

Presna definice promennych nasleduje

/* DOMAIN VELOCITY */ 
double *RecentGVel1=NULL,*RecentGVel2=NULL;                    
double *ALE_GridVelocityVector=NULL,*GVel1=NULL,*GVel2=NULL;   
double *GTension=NULL;

Dale triangulace je pak urcena jednotlivymi trojuhelniky. Kazdy trojuhelnik je urcen svymi vrcholy. Program tedy uchovava indexy jeho vrcholu v promenne ELEMENT[index trojuhelniku ( 0 - (NElements-1)) ][index vrcholu 0-2], obsah pak v ELEMENT_VOL. Pro rychlejsi praci jsou ulozeny indexy stran trojuhelniku v ELEMENT_BOUNDARY_SIDES. Promenna ELEMENT_MARK je nepouzita promenna, puvodne urcena pro odlisenni podoblasti.

long   **ELEMENT=NULL;     /* seznam bodu */
double *ELEMENT_VOL=NULL;  /* obsah elementu */
short  *ELEMENT_MARK=NULL; /* oznaceni elementu    */
long   **ELEMENT_BOUNDARY_SIDES=NULL; /* seznam stran */

Pro rychlejsi zpracovani je take vytvoren seznam stran v triangulaci a pro kazdou pak indexy jejiho pocatecniho a koncoveho vrcholu (SIDE[index][0-1]), dale jejich delka(SIDE_S). Kazda strana muze mit maximalne dva sousedni elementy, jejichz indexy pak jsou ulozeny v poli (BELE[index][0-1]). Pokud strana lezi na hranici je index BELE[index][1] nastaven na hodnotu -1 a hodnota SIDE_MARK nastavena na nenulove cislo, puvodni oznaceni (napr. MARK_DIRICHLET) teto casti hranice je pak pristupne pres BndrId[SIDE_MARK[index]-1] (Poznamka autora: Oznaceni timto zpusobem je pomerne komplikovane a vzniklo v podstate jednak z historickych duvodu jednak z duvodu aby byl vytvoren seznam hranicnich stran stejneho typu - viz. dale. Mozna v dalsich verzich programu bude zmeneno.).
long   **SIDE       =NULL;        
double  *SIDE_S     =NULL;        
short   *SIDE_MARK  =NULL;        
long    *BELE[2];

Dale je ulozen pocet pouzitych typu hranice BndrTypes, seznam techto typu(BndrId) vcetne poctu vsech stran ktery dany typ pouzivaji (BndrEdges). Seznam vsech hranicnich stran je ulozen v promenne BSIDE_INDEX [0-(NBSides-1)]. Tento seznam je setriden podle typu hranice, t.j. nejprve vsechny hrany ktere jsou oznaceny BndrId[0], pak vsechny strany oznacene BndrId[1], atd.

/* Boundary sides */
long    *BSIDE_INDEX=NULL;        
/* Boundary types and lists */
int    BndrTypes=0;
int    BndrId[MAX_BOUNDARIES];          
long   BndrEdges[MAX_BOUNDARIES];


next up previous contents
Next: Inicializace datovych poli Up: Datova struktura programu Previous: Rozdeleni na typy hranice   Contents
Petr Svacek 2007-06-02