Finite Element Domain Decomposition Library
FEDDLib
Loading...
Searching...
No Matches
LinElas_def.hpp
1#ifndef LINELAS_def_hpp
2#define LINELAS_def_hpp
3
4#include "feddlib/core/FE/Domain.hpp"
5#include "feddlib/core/FE/FE.hpp"
6
7
8namespace FEDD {
9// Funktion fuer den homogenen Dirichletrand
10// void ZeroDirichlet(double* x, double* result, double t, double* parameters)
11// {
12// result[0] = 0.;
13// return;
14// }
15
16// TODO: Fuer FSI auf 0 und 0 abaendern!!!!!!!!!!
17// Funktion fuer die rechte Seite der DGL in 2D
18void rhsFunc2D(double* x, double* result, double* parameters)
19{
20 // Wir setzen die rechte Seite g_vec als g_vec = (0, g), mit g = -2.
21 result[0] = 0.;
22 result[1] = 0.;
23// if (parameters[0]<0.1) {
24// result[1] = -.2;
25// }
26
27 return;
28}
29
30// Funktion fuer die rechte Seite der DGL in 3D
31void rhsFunc3D(double* x, double* result, double* parameters)
32{
33 // Wir setzen die rechte Seite g_vec als g_vec = (0, g, 0), mit g = -2.
34 result[0] = 0.;
35 // result[1] = -2.;
36 result[1] = 0.;
37 result[2] = 0.;
38 return;
39}
40
41
42template<class SC,class LO,class GO,class NO>
43LinElas<SC,LO,GO,NO>::LinElas(const DomainConstPtr_Type &domain, std::string FEType, ParameterListPtr_Type parameterList):
44Problem_Type(parameterList, domain->getComm() )
45{
46 // Bem.: Hier benutzen wir auch direkt den Konstruktor der Klasse Problem, wo z.B. parameterList auf parameterList_ gesetzt wird
47
48 // d_s steht displacement (d) der Struktur (_s). Im Allgemeinen vektorwertig, daher domainDisplacement->GetDimension().
49 // Andernfalls benutzen wir stattdessen 1
50
51 // Siehe Problem_def.hpp fuer die Funktion AddVariable()
52 this->addVariable( domain , FEType , "d_s" ,domain->getDimension() );
53 this->dim_ = this->getDomain(0)->getDimension();
54
55 d_rep_ = Teuchos::rcp( new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ) );
56
57}
58
59template<class SC,class LO,class GO,class NO>
60LinElas<SC,LO,GO,NO>::~LinElas()
61{
62
63}
64
65template<class SC,class LO,class GO,class NO>
66void LinElas<SC,LO,GO,NO>::info(){
67 this->infoProblem();
68}
69
70template<class SC,class LO,class GO,class NO>
71void LinElas<SC,LO,GO,NO>::assemble( std::string type ) const
72{
73 if(this->verbose_)
74 std::cout << "-- Assembly linear elasticity ... " << std::flush;
75
76 // Hole die Dichte \rho (density) und die Paramter \nu (Poisson-ratio) und \mu (zweite Lamé-Konstante)
77 double density = this->parameterList_->sublist("Parameter").get("Density",1000.);
78
79 double poissonRatio = this->parameterList_->sublist("Parameter").get("Poisson Ratio",0.4);
80 double mu = this->parameterList_->sublist("Parameter").get("Mu",2.0e+6);
81
82 // Berechne daraus nun E (Youngsches Modul) und die erste Lamé-Konstanten \lambda
83 double youngModulus = mu*2.*(1 + poissonRatio);
84
85 double lambda = (poissonRatio*youngModulus)/((1 + poissonRatio)*(1 - 2*poissonRatio));
86
87 // Initialisiere die Steifigkeitsmatrix. Das letzte Argument gibt die (ungefaehre) Anzahl an Eintraege pro Zeile an
88 MatrixPtr_Type K = Teuchos::rcp(new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getDimension() * this->getDomain(0)->getApproxEntriesPerRow() ) );
89 // MatrixPtr_Type K = Teuchos::rcp(new Matrix_Type( this->domainPtr_vec_.at(0)->getMapVecFieldUnique(), 10 ) );
90
91 // Assembliere die Steifigkeitsmatrix. Die 2 gibt degree an, d.h. die Ordnung der Quadraturformel, die benutzt werden soll.
92#ifdef FEDD_HAVE_ACEGENINTERFACE
93 bool useInterface = this->parameterList_->sublist("Parameter").get("Use AceGen Interface", true);
94 if(this->getFEType(0) =="P2" && useInterface && this->dim_==3){
95 MultiVectorConstPtr_Type d = this->solution_->getBlock(0);
96 d_rep_->importFromVector(d, true);
97
98 this->system_->addBlock( K, 0, 0 );
99 // Assembliere die Steifigkeitsmatrix. Die 2 gibt degree an, d.h. die Ordnung der Quadraturformel, die benutzt werden soll.
100 this->feFactory_->assemblyLinearElasticity(this->dim_, this->getDomain(0)->getFEType(),2, this->dim_, d_rep_, this->system_, this->rhs_, this->parameterList_,false, "Jacobian", true);
101 }
102 else
103 this->feFactory_->assemblyLinElasXDim( this->dim_, this->getDomain(0)->getFEType(), K, lambda, mu );
104#else
105 this->feFactory_->assemblyLinElasXDim( this->dim_, this->getDomain(0)->getFEType(), K, lambda, mu );
106#endif
107 // Setup fuer die linke Seite des zu loesdenen GLS. Beachte, dass system_ via system_() im Standardkonstruktor (von der Klasse Problem)
108 // initialisiert worden ist, hier wird dieser also erst richtig initialisiert.
109 // Ein Objekt der Klasse Bmat ist eine Blockmatrix; also ist system_ eine Blockmatrix (Objekt von BMat)
110
111 // Fuege die Steifikeitsmatrix als Blockeintrag an der Stelle (1,1) (in C dann (0,0)) in die Blockmatrix hinein.
112 this->system_->addBlock( K, 0, 0 );
113
114 this->assembleSourceTerm( 0. );
115 //this->sourceTerm_->scale(density);
116 this->addToRhs( this->sourceTerm_ );
117
118 if (this->verbose_)
119 std::cout << "done -- " << std::endl;
120}
121
122//template<class SC,class LO,class GO,class NO>
123//void LinElas<SC,LO,GO,NO>::assembleSourceTerm(double time)
124//{
125//
126// double force = this->parameterList_->sublist("Parameter").get("Volume force",0.);
127//
128// MultiVectorPtr_Type sourceTerm = Teuchos::rcp(new MultiVector_Type( this->domainPtr_vec_.at(0)->getMapVecFieldRepeated() ) );
129// vec_dbl_Type funcParameter(3,0.);
130//
131// funcParameter[0] = 0.; // degree of function
132// funcParameter[1] = time;
133// funcParameter[2] = force;
134//
135// this->feFactory_->assemblyRHS(this->dim_, this->domain_FEType_vec_.at(0), sourceTerm, "Vector", this->rhsFuncVec_[0], funcParameter);
136//
137// this->sourceTerm_->getBlockNonConst(0)->putScalar(0.);
138//
139// this->sourceTerm_->getBlockNonConst(0)->exportFromVector( sourceTerm, false, "Add" );
140//
141// double density = this->parameterList_->sublist("Parameter").get("Density",1.);
142//
143// this->sourceTerm_->getBlockNonConst(0)->scale(density);
144// // Noch mit \rho = density skalieren
145// // feRhs->scale(density);
146// // BlockMultiVectorPtr_Type blockMVSourceT = Teuchos::rcp( new BlockMultiVector_Type( 1 ) );
147// // blockMVSourceT->addBlock( feRhs, 0 );
148//
149// // Setze die rechte Seite auf das Attribut des SourceTerms aus dem Problem
150// // Dieses Attribut wird in der Zeitintegration benoetigt, vgl. DAESolverInTime
151// // this->sourceTerm_ = blockMVSourceT;
152//
161//}
162
163}
164#endif
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement_decl.hpp:36