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 a originalni
konfiguraci souradnic vrcholu triangulace
(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
= 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 (). Jak jiz
bylo naznaceno body
budou oznacovat vrcholy triangulace v case
(pri prechodu z casove vrstvy
na
). Dale uchovame
souradnice vrcholu v case
jako
a v case
jako
. Pro vypocet na pohyblive siti je pouzita Arbitrary
Lagrangian-Eulerian (ALE) formulace, ktera nahrazuje casovou derivaci jako
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]; |