G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
gsFlowVisitors.hpp
Go to the documentation of this file.
1
12#pragma once
14
15namespace gismo
16{
17
18template <class T, int MatOrder>
20{
21 m_geoFlags = 0;
22 m_testFunFlags = 0;
23 m_shapeFunFlags = 0;
24
25 for (size_t i = 0; i < m_terms.size(); i++)
26 m_terms[i]->updateEvalFlags(m_geoFlags, m_testFunFlags, m_shapeFunFlags);
27}
28
29
30template <class T, int MatOrder>
31void gsFlowVisitor<T, MatOrder>::evalSingleFunData(const unsigned& basisFlags, const gsBasis<T>* basisPtr, const index_t funID, std::vector< gsMatrix<T> >& basisData)
32{
33 if(basisFlags & NEED_VALUE)
34 basisPtr->evalSingle_into(funID, m_quNodes, basisData[0]);
35
36 if(basisFlags & NEED_DERIV)
37 basisPtr->derivSingle_into(funID, m_quNodes, basisData[1]);
38
39 // currently not needed
40 // if(basisFlags & NEED_DERIV2)
41 // basisPtr->deriv2Single_into(funID, m_quNodes, basisData[2]);
42}
43
44
45template<class T, int MatOrder>
46void gsFlowVisitor<T, MatOrder>::evalBasisData(const unsigned& basisFlags, const gsBasis<T>* basisPtr, gsMatrix<index_t>& activesUnique, std::vector< gsMatrix<T> >& basisData)
47{
48 gsMatrix<index_t> actives;
49 basisPtr->active_into(m_quNodes, actives);
50 activesUnique = createVectorOfUniqueIndices(actives);
51
52 bool multipleElem = (activesUnique.rows() > actives.rows());
53 std::unordered_map<int, int> activesUnique_val_to_ID;
54
55 if (multipleElem)
56 {
57 for (int i = 0; i < activesUnique.size(); ++i)
58 activesUnique_val_to_ID[activesUnique(i)] = i;
59 }
60
61 index_t dim = basisPtr->dim();
62 index_t numAct = activesUnique.rows();
63
64 if(basisFlags & NEED_VALUE)
65 {
66 gsMatrix<real_t> basisVals;
67 basisPtr->eval_into(m_quNodes, basisVals);
68
69 if (multipleElem)
70 {
71 basisData[0].setZero(numAct, m_quNodes.cols());
72
73 for (index_t i = 0; i < actives.rows(); i++)
74 for (index_t j = 0; j < actives.cols(); j++)
75 basisData[0](activesUnique_val_to_ID[actives(i, j)], j) = basisVals(i,j);
76 }
77 else
78 {
79 basisData[0] = basisVals;
80 }
81 }
82
83 if(basisFlags & NEED_DERIV)
84 {
85 gsMatrix<real_t> basisDers;
86 basisPtr->deriv_into(m_quNodes, basisDers);
87
88 if (multipleElem)
89 {
90 basisData[1].setZero(dim*numAct, m_quNodes.cols());
91
92 for (index_t i = 0; i < actives.rows(); i++)
93 {
94 for (index_t j = 0; j < actives.cols(); j++)
95 {
96 index_t ii = activesUnique_val_to_ID[actives(i, j)];
97 basisData[1].block(dim*ii, j, dim, 1) = basisDers.block(dim*i, j, dim, 1);
98 }
99 }
100 }
101 else
102 {
103 basisData[1] = basisDers;
104 }
105 }
106
107 // currently not needed
108 // if(basisFlags & NEED_DERIV2)
109 // {
110 // gsMatrix<real_t> basisDers2;
111 // basisPtr->deriv2_into(m_quNodes, basisDers2);
112
113 // if (multipleElem)
114 // {
115 // index_t dimSq = dim*dim;
116 // basisData[2].setZero(dimSq*numAct, m_quNodes.cols());
117
118 // for (index_t i = 0; i < actives.rows(); i++)
119 // {
120 // for (index_t j = 0; j < actives.cols(); j++)
121 // {
122 // index_t ii = activesUnique_val_to_ID[actives(i, j)];
123 // basisData[2].block(dimSq*ii, j, dimSq, 1) = basisDers2.block(dimSq*i, dimSq ,j, 1);
124 // }
125 // }
126 // }
127 // else
128 // {
129 // basisData[2] = basisDers2;
130 // }
131 // }
132
133}
134
135
136template<class T, int MatOrder>
138{
139 defineTestShapeUnknowns();
140 m_params.createDofMappers(m_dofMappers);
141
142 deleteTerms();
143 defineTerms();
144 gatherEvalFlags();
145 m_mapData.flags = m_geoFlags;
146}
147
148
149template<class T, int MatOrder>
151{
152 m_patchID = patchID;
153 m_mapData.patchId = m_patchID;
154 defineTestShapeBases();
155 setupQuadrature();
156
157 m_testFunData.clear(); m_shapeFunData.clear();
158 m_testFunData.resize(2); // 0 - value, 1 - deriv (2nd derivative not needed at the moment)
159 m_shapeFunData.resize(2); // 0 - value, 1 - deriv
160}
161
162
163template<class T, int MatOrder>
165{
166 for (size_t i = 0; i < m_terms.size(); i++)
167 {
168 gsFlowTermNonlin<T>* termPtr = dynamic_cast< gsFlowTermNonlin<T>* > (m_terms[i]);
169
170 if (termPtr)
171 termPtr->setCurrentSolution(solutions);
172 }
173}
174
175
176template<class T, int MatOrder>
178{
179 for (size_t i = 0; i < m_terms.size(); i++)
180 {
181 gsFlowTermNonlin<T>* termPtr = dynamic_cast< gsFlowTermNonlin<T>* > (m_terms[i]);
182
183 if (termPtr)
184 termPtr->setCurrentSolution(solution);
185 }
186}
187
188
189template<class T, int MatOrder>
191{
192 m_localMat.setZero(m_testFunActives.rows(), m_shapeFunActives.rows());
193
194 for (size_t i = 0; i < m_terms.size(); i++)
195 m_terms[i]->assemble(m_mapData, m_quWeights, m_testFunData, m_shapeFunData, m_localMat);
196}
197
198// ===================================================================================================================
199
200template <class T, int MatOrder>
201void gsFlowVisitorVectorValued<T, MatOrder>::assemble()
202{
203 m_locMatVec.resize(m_params.getPde().dim());
204
205 for (size_t i = 0; i < m_locMatVec.size(); i++)
206 m_locMatVec[i].setZero(m_testFunActives.rows(), m_shapeFunActives.rows());
207
208 for (size_t i = 0; i < m_terms.size(); i++)
209 m_terms[i]->assemble(m_mapData, m_quWeights, m_testFunData, m_shapeFunData, m_locMatVec);
210}
211
212// ===================================================================================================================
213// ===================================================================================================================
214// to be changed:
215
216template<class T, int MatOrder>
218{
219 gsVector<index_t> numQuadNodes(m_params.getPde().dim());
220
221 index_t maxDegTest = m_testBasisPtr->maxDegree();
222 index_t maxDegShape = m_shapeBasisPtr->maxDegree();
223
224 numQuadNodes.setConstant(math::min(maxDegTest, maxDegShape)+1);
225
226 m_quRule = gsGaussRule<T>(numQuadNodes);
227}
228
229template<class T, int MatOrder>
231{
232 // shape basis (on the whole support of testFunID)
233
234 index_t dim = m_testBasisPtr->domainDim();
235 gsMatrix<T> support = m_testBasisPtr->support(testFunID);
236 typename gsBasis<T>::domainIter domIt = m_testBasisPtr->makeDomainIterator(boundary::none);
237
238 gsMatrix<T> quNodes; // quad. nodes for the current element
239 gsVector<T> quWeights; // weights for the current element
240 std::vector< gsMatrix<T> > quNodesOnElem; // quad. nodes for all elements in support
241 std::vector< gsVector<T> > quWeightsOnElem; // weights for all elements in support
242
243 // loop over elements
244 while(domIt->good())
245 {
246 bool inSupport = true;
247
248 // check if the current element lies in support of test function with testFunID
249 for (index_t d = 0; d < dim; d++)
250 {
251 if ( (domIt->lowerCorner()[d] < support(d,0)) || (domIt->upperCorner()[d] > support(d,1)))
252 {
253 inSupport = false;
254 break;
255 }
256 }
257
258 // if so, compute and store the quadrature nodes and weights
259 if (inSupport)
260 {
261 m_quRule.mapTo(domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights);
262 quNodesOnElem.push_back(quNodes);
263 quWeightsOnElem.push_back(quWeights);
264 }
265
266 domIt->next();
267 }
268
269 size_t numElemInSupport = quNodesOnElem.size();
270 index_t numNodesInElem = quNodesOnElem[0].cols();
271 index_t numNodesInSupport = numElemInSupport * numNodesInElem;
272 m_quNodes.resize(dim, numNodesInSupport);
273 m_quWeights.resize(numNodesInSupport);
274
275 for (size_t e = 0; e < numElemInSupport; e++)
276 {
277 m_quNodes.middleCols(e*numNodesInElem, numNodesInElem) = quNodesOnElem[e];
278 m_quWeights.middleRows(e*numNodesInElem, numNodesInElem) = quWeightsOnElem[e];
279 }
280
281 m_mapData.points = m_quNodes;
282 m_params.getPde().patches().patch(m_patchID).computeMap(m_mapData);
283
284 evalBasisData(m_shapeFunFlags, m_shapeBasisPtr, m_shapeFunActives, m_shapeFunData);
285
286 // test basis
287 m_testFunActives.resize(1,1);
288 m_testFunActives << testFunID;
289 evalSingleFunData(m_testFunFlags, m_testBasisPtr, testFunID, m_testFunData);
290}
291
292
293template<class T, int MatOrder>
295{
296 m_quRule.mapTo(domIt->lowerCorner(), domIt->upperCorner(), m_quNodes, m_quWeights);
297 m_mapData.points = m_quNodes;
298 m_params.getPde().patches().patch(m_patchID).computeMap(m_mapData);
299
300 evalBasisData(m_testFunFlags, m_testBasisPtr, m_testFunActives, m_testFunData);
301
302 if (m_shapeUnkID == m_testUnkID)
303 m_shapeFunActives = m_testFunActives;
304 else
305 m_shapeBasisPtr->active_into(m_quNodes.col(0), m_shapeFunActives);
306
307 if ( (m_shapeUnkID == m_testUnkID) && (m_testFunFlags == m_shapeFunFlags) )
308 m_shapeFunData = m_testFunData;
309 else
310 evalBasisData(m_shapeFunFlags, m_shapeBasisPtr, m_shapeFunActives, m_shapeFunData);
311}
312
313} // namespace gismo
A basis represents a family of scalar basis functions defined over a common parameter domain.
Definition gsBasis.h:79
virtual void evalSingle_into(index_t i, const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluate the i-th basis function at points u into result.
Definition gsBasis.hpp:470
virtual void eval_into(const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates nonzero basis functions at point u into result.
Definition gsBasis.hpp:466
virtual void active_into(const gsMatrix< T > &u, gsMatrix< index_t > &result) const
Returns the indices of active basis functions at points u, as a list of indices, in result....
Definition gsBasis.hpp:316
virtual void deriv_into(const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates the first partial derivatives of the nonzero basis function.
Definition gsBasis.hpp:474
virtual void derivSingle_into(index_t i, const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates the (partial) derivatives of the i-th basis function at points u into result.
Definition gsBasis.hpp:478
Class which enables iteration over all elements of a parameter domain.
Definition gsDomainIterator.h:68
virtual const gsVector< T > & lowerCorner() const
Returns the lower corner of the current element.
Definition gsDomainIterator.h:140
virtual const gsVector< T > & upperCorner() const
Returns the upper corner of the current element.
Definition gsDomainIterator.h:151
A scalar of vector field defined on a m_parametric geometry.
Definition gsField.h:55
A class computing nonlinear terms of the weak formulation appearing in incompressible flow problems.
Definition gsFlowTerms.h:107
void setCurrentSolution(std::vector< gsField< T > > &solutions)
Set all needed current solution fields.
Definition gsFlowVisitors.hpp:164
void initialize()
Initialize the visitor.
Definition gsFlowVisitors.hpp:137
void evalBasisData(const unsigned &basisFlags, const gsBasis< T > *basisPtr, gsMatrix< index_t > &activesUnique, std::vector< gsMatrix< T > > &basisData)
Evaluate required data for the given basis.
Definition gsFlowVisitors.hpp:46
virtual void setupQuadrature()
Setup the quadrature rule.
Definition gsFlowVisitors.hpp:217
void evaluate(index_t testFunID)
Evaluate basis data on the support of a given test function (used for row-by-row assembly).
Definition gsFlowVisitors.hpp:230
void gatherEvalFlags()
Gather evaluation flags from all terms.
Definition gsFlowVisitors.hpp:19
void initOnPatch(index_t patchID)
Initialize the visitor on the given patch.
Definition gsFlowVisitors.hpp:150
virtual void assemble()
Assemble the local matrix.
Definition gsFlowVisitors.hpp:190
void evalSingleFunData(const unsigned &basisFlags, const gsBasis< T > *basisPtr, const index_t funID, std::vector< gsMatrix< T > > &basisData)
Evaluate required data for the given basis function.
Definition gsFlowVisitors.hpp:31
virtual index_t size() const
size
Definition gsFunctionSet.h:613
Class that represents the (tensor) Gauss-Legendre quadrature rule.
Definition gsGaussRule.h:28
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
A vector with arbitrary coefficient type and fixed or dynamic size.
Definition gsVector.h:37
#define index_t
Definition gsConfig.h:32
The G+Smo namespace, containing all definitions for the library.
@ NEED_VALUE
Value of the object.
Definition gsForwardDeclarations.h:72
@ NEED_DERIV
Gradient of the object.
Definition gsForwardDeclarations.h:73
gsMatrix< T > createVectorOfUniqueIndices(const gsMatrix< T > &mat)
Creates a one-column matrix (vector) of unique values from the input matrix (useful for creating a un...
Definition gsFlowUtils.h:85