MEER  0.1
 Vše Třídy Prostory jmen Soubory Funkce Proměnné Výčty Hodnoty výčtu Definice maker
meer.h
Zobrazit dokumentaci tohoto souboru.
1 #ifndef MEER_H
2 #define MEER_H
3 
4 #ifdef DEVEL
5 #include "arrays.h"
6 #include "gpa.h"
7 #else
8 #include "arrays.h"
9 #include "gpa.h"
10 #endif
11 
12 
13 namespace meerspace {
14 
15 // SCIA
16 // - enorm = MEER_EN_strain_stress; energeticka norma (L2 je malo vypovidajici), nez posilat matici D, tak je asi jednodussi posilat stain + stress
17 // - MEER_EDI_2d_4n_bilinear_2 - tento provek je prozatim defaultne predpokladany
18 //
19 // v teto funkci by mel byt cely proces adaptivniho vypoctu
20 // zatim funguje takto: vypocet chyby
21 //
22 // domena - cely reseny problem, je rozdelena na regiony dle zvolene veliciny
23 // region - mnozina elementu, na kterych je zvolena velicina konzistentni
24 // kazdy element je prave v jednom regionu, regid == ident. cislo regionu; cislovano od 0
25 // velicina - zvolena velicina, pomoci ktere se pocita chyba reseni
26 // - strain - meni se se zmenou prurezu a materialu
27 // - stress - meni se se zmenou prurezu
28 // - sily - nemeni se, je to integralni velicina
29 //
30 // momentalne pouzivam ???
31 // stress => region se meni se zmenou prurezu
32 // !!! ale na prutu misto stressu ukladam sily, co s tim?
33 //
34 // dva integracni sety
35 // 1. integracni set = sada integracnich bodu pro matici tuhosti, v kterych je vypocitano napeti vracene na vystupu
36 // 2. integracni set = sada integracnich bodu potrebnych pro vypocet rozdilu napeti
37 //
38 //
39 
40 // *****************************************************************************************
41 // *****************************************************************************************
42 // ************************* ENUM ************************
43 // *****************************************************************************************
44 // *****************************************************************************************
45 
53 };
54 
60 };
61 
66 };
67 
85 };
86 
87 
96 
101 
112 
123 };
124 
125 class MEER;
126 
127 //*
128 //* structures
129 //*
130 
132 struct REGION
133 {
134  long id; // identification number
135 
136  //* DATA INICIALIZOVANA VE FUNKCI INITIALIZE()
137  long nvals; // počet složek průměrované veličiny (napětí) v integračních bodech. (pro napětí ve 2d je to 3)
138  long sprtype; // typ spr patche, viz enum MEER_SPRpatchType
139 
140  // constructor
141  REGION() { nvals = sprtype = 0; }
142  // destructor
143  virtual ~REGION() { }
144 };
145 
147 struct NODE
148 {
149  long id;
150 
151  //* DATA INICIALIZOVANA VE FUNKCI INITIALIZE()
153 
154  //* DATA VYPOCTENA PRI BEHU ADAPTIVNI ANALYZY
159 
163 
165  int boundary;
166 
168  int bp_appli; // viz fce MEER_SPR_nodal_recovery
169  Lvctr bp_elems; // viz fce MEER_SPR_nodal_recovery
170 
171 
172  // constructor
173  NODE() { id = -1; normal = NULL; boundary = 0; bp_appli = 0; rotmat.resize_ignore_vals(3,3); }
174  // destructor
175  virtual ~NODE() { delete [] normal; }
176 };
177 
179 struct ELEMENT
180 {
181  long id;
182 
183  //* DATA INICIALIZOVANA VE FUNKCI INITIALIZE()
184  long regid;
185  long nnodes;
186  long *nodes;
187 
188  long nIPs1;
190 
191  //* DATA VYPOCTENA PRI BEHU ADAPTIVNI ANALYZY
193 
194 
195  // constructor
196  ELEMENT() { regid = nnodes = 0; nodes = NULL; nIPs1 = 0; IPs1_coords = NULL; normal = NULL; }
197  // destructor
198  virtual ~ELEMENT() { delete [] nodes; delete [] IPs1_coords; delete normal; }
199 };
200 
201 
202 // *****************************************************************************************
203 // ************************* MMM EEE EEE RRR ************************
204 // *****************************************************************************************
209 class MEER
210 {
211  // *****************************************************************************************
212  // ************************* VEŘEJNÉ METODY ************************
213  // *****************************************************************************************
219  // @{
220  public:
222  MEER (void);
224  virtual ~MEER (void);
225 
233  double solve (double req_error);
234 
241  const double* give_error_at_elements_local (void) const { return errori_loc.give_ptr2val(); }
253  const double* give_error_at_elements_global (void) const { return errori_glob.give_ptr2val(); }
254 
262  const double* give_abs_error_at_elements (void) const { return ei_aver.give_ptr2val(); }
263 
268  const double* give_h_old_at_elems (void) const { return h_old.give_ptr2val(); }
274  const double* give_h_new_at_elems (void) const { return h_new.give_ptr2val(); }
275 
276  // Funkce vrací konstantní ukazatel na pole délky [počet uzlů].
277  // V poli jsou uloženy vypočtené hodnoty charakteristické velikosti elementů sítě konečných prvků v místě příslušných uzlů.
278  // Tyto hodnoty slouží pro generování nové sítě požadované hustoty.
279  // const double* give_h_new_at_nodes (void) const { return hnewi_node.give_ptr2val(); }
280 
281  // @}
282 
283 
284 
285  // *****************************************************************************************
286  // ************************* SOUKROMÉ METODY A ATRIBUTY ************************
287  // *****************************************************************************************
300  // @{
301  private:
311 
317  //Dvctr hnewi_node;
318 
320  void MEER_SPR_nodal_recovery (void);
322  void MEER_SPR_basic_patch_detection (long regid);
323  void MEER_SPR_bp_recovered_nodes_detection (const NODE *node, GPA<const NODE> &bp_recovered_nodes);
324  void MEER_SPR_patch_recovered_nodes_compute (long regid, GPA<const NODE> &bp_recovered_nodes, MEER_IPValues valtype, Dvctr **values, Lvctr &cavalues);
325  int MEER_SPR_give_number_coefficients(long sprtype);
326  void MEER_SPR_give_polynom (long sprtype, const PoinT *coords, Dvctr &pol);
327 
329  void set_boundary_nodes (void);
330 
332  void MEER_error_estimatior (void);
334  double MEER_mesh_refinement (double rerror);
335 
337  double give_element_characteristic_size (long elementID);
339  double eval_interpol_fces_at_IPs2 (long elementID, int ipid, double *answer) const;
340 
341  // @}
342 
343 
344 
345  // *****************************************************************************************
346  // ************************* CHRÁNĚNÉ METODY A ATRIBUTY ************************
347  // *****************************************************************************************
357  // @{
358  protected:
359 
360  //* *** Chráněné atributy ***
361 
362  //* GLOBAL VARIABLES
364  double h_max_ratio;
365  double h_min_ratio;
367 
369 
370  //* REGIONS
371  long nREGIONs;
373 
374  //* NODES
375  long nNODEs;
377 
378  //* ELEMENTS
379  long nELEMs;
381 
383  void set_alloc_REGIONs (long n);
384  void set_alloc_NODEs (long n);
385  void set_alloc_ELEMs (long n);
386 
387 
390  virtual void initialize (void) = 0;
393 
397 
400  virtual void give_superelems_to_node (long nodeID, long &nsuperelems, long *superelems) const = 0;
401 
402 
406 
408  virtual MEER_ElemDisplInterpol give_element_EDI (long elementID) const = 0;
410  virtual double give_element_area (long elementID) const = 0;
412  virtual double give_element_thickness (long elementID) const = 0;
414  virtual double give_element_thickness_reduced (long elementID) const = 0;
415 
417  //virtual long give_number_of_IPs1 (long elementID) const = 0;
419  virtual long give_number_of_IPs2 (long elementID) const = 0;
421  //virtual double give_coords_of_IPs2 (long elementID, long ipid, double *coo) = 0;
422 
425  //virtual void give_IPs1_coords_global (long elementID, int ipID, double *gcoords) const = 0;
428  virtual double give_IPs2_coords_natural (long elementID, int ipID, double *ncoords) const = 0;
429 
436  virtual const double* give_IPs1_values (long elementID, int ipID, MEER_IPValues valtype) const = 0;
437 
440  virtual const double* give_IPs2_values (long elementID, int ipID, MEER_IPValues valtype) const = 0;
441 
442  // @}
443 
444 
445 
446  // *****************************************************************************************
447  // ************************* DEBUG METODY ************************
448  // *****************************************************************************************
454  // @{
455  public:
456 
461 
463  const double* give_e2i (void) const { return e2i.give_ptr2val(); }
464  //const double* give_eia (void) const { return ei_aver.give_ptr2val(); }
466  //const double* give_h_new_at_nodes (void) const { return hnewi_node.give_ptr2val(); }
467  const VectoR* give_normal_at_elem (long id) const { return ELEMs[id].normal; }
468  const VectoR* give_normal_at_node_and_region (long id, long regid) const { return NODEs[id].normal[regid]; }
469  const Dmtrx* give_rotmat_at_node (long id) const { return &NODEs[id].rotmat; }
470 
471  // @}
472 
473 };
474 
475 } // namespace meerspace
476 
477 #endif // MEER_H
478 
479 
480 
481 
482 // /*
483 // Vytah z pdf, naladuj to do popisu trid.
484 //
485 // void give_superelems_to_node (long nodeID, long &nsuperelems, long *superelems)
486 // Funkce vrací identifikační čísla elementů přilehlých k danému uzlu, tj. elementů,na kterých uzel leží.
487 // Vstupní parametry:
488 // long nodeID – ID uzlu.
489 // Výtupní parametry:
490 // long &nsuperelems – počet přilehlých elementů.
491 // long *superelems – pole identifikačních čísel přilehlých elementů délky nsuperelems, pole je předem alokováno na délku 64.
492 // void give_node_coords (long nodeID, double *coords)
493 // Funkce vrací globální souřadnice daného uzlu.
494 // Vstupní parametry:
495 // long nodeID – ID uzlu.
496 // Výtupní parametry:
497 // double *coords – pole se souřadnicemi (předem alokované na délku 3).
498 // double give_element_volume (long elementID)
499 // Funkce jako návratovou hodnotu vrací objem elementu s ID elementID. U plošných/prutových prvků je objem počítán jako plocha/délka přenásobená tlouštkou/plochou průřezu.
500 // long give_number_of_IPs1 (long elementID)
501 // Funkce jako návratovou hodnotu vrací počet integračních bodů sady IPs1 elementu s ID elementID.
502 // long give_number_of_IPs2 (long elementID)
503 // Funkce jako návratovou hodnotu vrací počet integračních bodů sady IPs2 elementu s ID elementID.
504 // void give_EDI_natcoords_weight_IPs1 (long elementID, int ipID, MEER_ElemDisplInterpol &edi, double *ncoords, double &w)
505 // Funkce zaprvé vrací typ interpolace posunů po prvku s ID elementID pomocí výčtového typu
506 // enum MEER_ElemDisplInterpol { MEER_EDI_Void, MEER_EDI_2d_3n_linear, MEER_EDI_2d_4n_bilinear },
507 // kde 2d značí dimenzi elementu, 3n značí počet uzlů na elementu a linear popisuje stupeň aproximace.
508 // Dále funkce vrací přirozené souřadnice a váhu integračního bodu s ID ipID na elementu s ID elementID pro integrační sadu IPs1.
509 // Vstupní parametry:
510 // long elementID – ID elementu.
511 // long nodeID – ID uzlu.
512 // Výtupní parametry:
513 // MEER_ElemDisplInterpol &edi – typ interpolace posunů po prvku.
514 // double *ncoords – pole s přirozenými souřadnicemi integračního bodu (předem alokované na délku 3).
515 // double &w – váha integračního bodu.
516 // void give_EDI_natcoords_weight_IPs2 (long elementID, int ipID, MEER_ElemDisplInterpol &edi, double *ncoords, double &w)
517 // Viz předchozí funkce. Hodnoty odpovídají integrační sadě IPs2.
518 // const double* give_IP1_values (long elementID, int ipID)
519 // Funkce jako návratovou hodnotu vrací konstantní ukazatel na pole typu double, v kterém jsou uloženy hodnoty napětí pro integrační bod s ID ipID na elementu s ID elementID pro integrační sadu IPs1.
520 // const double* give_IP2_values (long elementID, int ipID)
521 // Funkce jako návratovou hodnotu vrací konstantní ukazatel na pole typu double, v kterém jsou uloženy hodnoty napětí pro integrační bod s ID ipID na elementu s ID elementID pro integrační sadu IPs2.
522 // */
Dvctr errori_loc
Definition: meer.h:313
2 dimensions; 4 nodes; bilinear interpolation // takto to ma nastavene OOFEM pro ctyruhelniky cisla u...
Definition: meer.h:111
long nIPs1
number of integration points for integration set 1, i.e. integration of stiffness matrix ...
Definition: meer.h:188
virtual ~REGION()
Definition: meer.h:143
int boundary
node at boundary
Definition: meer.h:165
Plošné elementy.
Definition: meer.h:65
MEER_SPRboundaryPatchType
Strategie vytváření patchí na okraji regionu.
Definition: meer.h:77
MEER_SPRboundaryPatchType SPR_boundary
Použitá strategie vytváření patchí na okraji regionu.
Definition: meer.h:366
long regid
identifikační číslo (ID) regionu (číslováno od nuly) do kterého příslušný element patří...
Definition: meer.h:184
VectoR ** normal
normala k plose v bode; 2d pole [nREGIONs, 1] predpoklad - v ramci jednoho regionu muze byt jen jedna...
Definition: meer.h:158
2 dimensions; 3 nodes; linear interpolation // l1,l2,l3 (0;1) ...
Definition: meer.h:100
long * nodes
pole délky nnodes s identifikačními čísly (číslováno od nuly) uzlů
Definition: meer.h:186
const VectoR * give_normal_at_node_and_region(long id, long regid) const
Definition: meer.h:468
Dvctr *** refined_node_values_1
Pole hodnot.
Definition: meer.h:309
virtual void give_superelems_to_node(long nodeID, long &nsuperelems, long *superelems) const =0
NODES.
GPA - Generic Pointer Array, template class manages 1d array of pointers to objects of type T...
Definition: gpa.h:23
MEER_IPValues valtype_2
Definition: meer.h:304
long nELEMs
počet konečných prvků (elementů) sítě.
Definition: meer.h:379
double MEER_mesh_refinement(double rerror)
rerror == required error
Definition: meer.cpp:204
Dvctr h_old
Definition: meer.h:315
MEER(void)
CONSTRUCTOR.
Definition: meer.cpp:19
Class GPA.
Dvctr ei_aver
Definition: meer.h:313
virtual ~ELEMENT()
Definition: meer.h:198
long nREGIONs
počet regionů v konstrukci
Definition: meer.h:371
double eval_interpol_fces_at_IPs2(long elementID, int ipid, double *answer) const
evaluate interpolation functions at element at IP with coordinates
Definition: meer.cpp:792
void MEER_SPR_bp_recovered_nodes_detection(const NODE *node, GPA< const NODE > &bp_recovered_nodes)
vytvori seznam uzlu "bp_recovered_nodes", ktere se budou pocitat z dane patche == patche kolem uzlu "...
Definition: meer.cpp:602
const double * give_h_new_at_elems(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:274
const double * give_e2i(void) const
Definition: meer.h:463
double give_element_characteristic_size(long elementID)
compute characteristic size of element = length of equidistant edge
Definition: meer.cpp:831
energy norm - error^2 = strain_T * stress
Definition: meer.h:50
PoinT coords
souradnice uzlu == global coordinates
Definition: meer.h:152
void resize_ignore_vals(long r, long c)
print yourself
Definition: arrays.cpp:711
long id
identification number
Definition: meer.h:181
void MEER_SPR_compute_normals_at_elements(void)
Funkce spocita normaly na elementech, pokud jsou neinicializovane, tj. pokud nejsou predem spocteny e...
Definition: meer.cpp:369
2 dimensions; 4 nodes; bilinear interpolation // takto to ma nastavene brnensky FEM pro prvek MITC4 c...
Definition: meer.h:122
energy norm - error^2 = strain_T * D * strain
Definition: meer.h:49
data spojena s regionem
Definition: meer.h:132
double h_min_ratio
minimalni povolene zmenseni elementu; je vhodne zadat asi 0.5 a mene
Definition: meer.h:365
void set_alloc_REGIONs(long n)
allocate arrays
Definition: meer.cpp:78
Dvctr *** give_refined_node_values_1(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:459
void MEER_SPR_patch_recovered_nodes_compute(long regid, GPA< const NODE > &bp_recovered_nodes, MEER_IPValues valtype, Dvctr **values, Lvctr &cavalues)
Definition: meer.cpp:658
energy norm - error^2 = stress_T * D^-1 * stress
Definition: meer.h:51
void set_alloc_ELEMs(long n)
Definition: meer.cpp:80
double solve(double req_error)
Funkce solve je hlavní, a jediná, výkonná funkce knihovny MEER.
Definition: meer.cpp:84
Structs Elem3D, PoinT and VectoR; classes Array, Array1d, Xscal, Dscal, Xvctr, Lvctr, Dvctr, Xmtrx, Lmtrx and Dmtrx.
Dvctr *** give_refined_node_values_2(void) const
Definition: meer.h:460
void MEER_error_estimatior(void)
Definition: meer.cpp:113
virtual long give_number_of_IPs2(long elementID) const =0
give number of integration points for integration set 1, i.e. integration of stiffness matrix ...
void MEER_SPR_basic_patch_detection(long regid)
Definition: meer.cpp:402
Patch se dělá v každém P1 bodě a interpoluje se navíc do všech P2 bodů na patchi. ...
Definition: meer.h:81
void set_boundary_nodes(void)
Definition: meer.cpp:107
PoinT * IPs1_coords
global coordinates of integration points for integration set 1
Definition: meer.h:189
MEER_IPValues
Hodnoty v integracnich bodech, ktere budou vylepsovany a bude se z nich pocitat chyba.
Definition: meer.h:56
virtual const double * give_IPs2_values(long elementID, int ipID, MEER_IPValues valtype) const =0
give values at integration points of IP set 2 spocte napeti z FEM v IP s coordinatama ...
long nNODEs
počet uzlů sítě konečných prvků v konstrukci
Definition: meer.h:375
const Dmtrx * give_rotmat_at_node(long id) const
Definition: meer.h:469
data spojena s elementem
Definition: meer.h:179
empty enum
Definition: meer.h:48
Dvctr *** refined_node_values_2
Definition: meer.h:310
Dmtrx rotmat
rotation matrix, bude jen jedna, pri pocitani dalsiho regionu se prepise u normaly to tak nemuze byt...
Definition: meer.h:162
MEER_ErrorNorm enorm
Typ použitého integrálního meřítka chyby.
Definition: meer.h:363
MEER_ErrorNorm
Typ integrálního meřítka chyby.
Definition: meer.h:47
bool normal_at_nodes
normaly v uzlech jsou zname/spoctene
Definition: meer.h:368
virtual const double * give_IPs1_values(long elementID, int ipID, MEER_IPValues valtype) const =0
aby se ty cisla nemusely kopirovat sem tam, tak to mam zatim udelany tak, ze se posila const ukazatel...
void MEER_SPR_give_polynom(long sprtype, const PoinT *coords, Dvctr &pol)
Definition: meer.cpp:777
virtual double give_element_area(long elementID) const =0
give element area => u 1d prvku to ale asi bude delka, tak pak to budu muset predelat ...
virtual ~NODE()
Definition: meer.h:175
virtual MEER_ElemDisplInterpol give_element_EDI(long elementID) const =0
ELEMENTS.
double h_max_ratio
maximalni povolene zvetseni elementu; je vhodne zadat asi 2.0 a vice
Definition: meer.h:364
virtual double give_IPs2_coords_natural(long elementID, int ipID, double *ncoords) const =0
give weight as return value, and natural coordinates of node-th IP
const double * give_abs_error_at_elements(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:262
virtual ~MEER(void)
DESTRUCTOR.
Definition: meer.cpp:39
Dvctr e2i
Definition: meer.h:313
Dvctr h_new
Definition: meer.h:316
virtual double give_element_thickness(long elementID) const =0
give element thickness
Lvctr bp_elems
Definition: meer.h:169
void set_alloc_NODEs(long n)
Definition: meer.cpp:79
L2 norm - error^2 = stress_T * stress.
Definition: meer.h:52
Dvctr errori_glob
Definition: meer.h:313
Hlavní, a jedíná, třída knihovny MEER.
Definition: meer.h:209
long nnodes
počet uzlů na elementu
Definition: meer.h:185
a) Patch se dělá v každém P1 bodě který není PB a interpoluje se navíc do všech PB a P2 bodů na patch...
Definition: meer.h:84
long id
identification number
Definition: meer.h:149
long sprtype
Definition: meer.h:138
double * give_ptr2val(long i=0)
return pointer to
Definition: arrays.h:618
ELEMENT * ELEMs
pole delky 'nELEMs' struktur ELEMENT, v kterych jsou uchovany informace o prvcich ...
Definition: meer.h:380
void MEER_SPR_nodal_recovery(void)
SPR nodal recovery.
Definition: meer.cpp:302
VectoR * normal
normala (vektor kolmy k plose prvku) delky 2*A (2 x plocha prvku), pro (zborceny) 4uhelnik staci spoc...
Definition: meer.h:192
Dvctr u2i
Definition: meer.h:313
MEER_ElemDisplInterpol
pomoci tohoto enumu se predava nekolik informaci:
Definition: meer.h:91
int bp_appli
Definition: meer.h:168
virtual double give_element_thickness_reduced(long elementID) const =0
give element thickness, !!! reduced, pro shelly to bude vzdy 1, protoze tam jsou integralni veliciny ...
int MEER_SPR_give_number_coefficients(long sprtype)
Definition: meer.cpp:768
MEER_SPRpatchType
Typ spr patche, závisí na typu/geometrii elementů.
Definition: meer.h:63
const double * give_error_at_elements_local(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:241
const double * give_error_at_elements_global(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:253
data spojena s uzlem
Definition: meer.h:147
NODE * NODEs
pole delky 'nNODEs' struktur NODE, v kterych jsou uchovany informace o uzlu
Definition: meer.h:376
MEER_IPValues valtype_1
Hodnoty interpolovane do uzlu.
Definition: meer.h:304
const VectoR * give_normal_at_elem(long id) const
Definition: meer.h:467
const double * give_h_old_at_elems(void) const
Funkce vrací konstantní ukazatel na pole délky [počet elementů].
Definition: meer.h:268
REGION * REGIONs
pole delky 'nREGIONs' struktur REGION, v kterych jsou uchovany informace o regionu ...
Definition: meer.h:372
virtual void initialize(void)=0
Chráněné metody s návodem na implementaci v zděděné třídě: