18template <
class T,
int MatOrder>
25 for (
size_t i = 0; i < m_terms.size(); i++)
26 m_terms[i]->updateEvalFlags(m_geoFlags, m_testFunFlags, m_shapeFunFlags);
30template <
class T,
int MatOrder>
45template<
class T,
int MatOrder>
52 bool multipleElem = (activesUnique.rows() > actives.rows());
53 std::unordered_map<int, int> activesUnique_val_to_ID;
57 for (
int i = 0; i < activesUnique.size(); ++i)
58 activesUnique_val_to_ID[activesUnique(i)] = i;
62 index_t numAct = activesUnique.rows();
67 basisPtr->
eval_into(m_quNodes, basisVals);
71 basisData[0].setZero(numAct, m_quNodes.cols());
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);
79 basisData[0] = basisVals;
90 basisData[1].setZero(dim*numAct, m_quNodes.cols());
92 for (
index_t i = 0; i < actives.rows(); i++)
94 for (
index_t j = 0; j < actives.cols(); j++)
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);
103 basisData[1] = basisDers;
136template<
class T,
int MatOrder>
139 defineTestShapeUnknowns();
140 m_params.createDofMappers(m_dofMappers);
145 m_mapData.flags = m_geoFlags;
149template<
class T,
int MatOrder>
153 m_mapData.patchId = m_patchID;
154 defineTestShapeBases();
157 m_testFunData.clear(); m_shapeFunData.clear();
158 m_testFunData.resize(2);
159 m_shapeFunData.resize(2);
163template<
class T,
int MatOrder>
166 for (
size_t i = 0; i < m_terms.size(); i++)
171 termPtr->setCurrentSolution(solutions);
176template<
class T,
int MatOrder>
179 for (
size_t i = 0; i < m_terms.size(); i++)
184 termPtr->setCurrentSolution(solution);
189template<
class T,
int MatOrder>
192 m_localMat.setZero(m_testFunActives.rows(), m_shapeFunActives.rows());
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);
200template <
class T,
int MatOrder>
201void gsFlowVisitorVectorValued<T, MatOrder>::assemble()
203 m_locMatVec.resize(m_params.getPde().dim());
205 for (
size_t i = 0; i < m_locMatVec.size(); i++)
206 m_locMatVec[i].setZero(m_testFunActives.rows(), m_shapeFunActives.rows());
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);
216template<
class T,
int MatOrder>
221 index_t maxDegTest = m_testBasisPtr->maxDegree();
222 index_t maxDegShape = m_shapeBasisPtr->maxDegree();
224 numQuadNodes.setConstant(math::min(maxDegTest, maxDegShape)+1);
229template<
class T,
int MatOrder>
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);
240 std::vector< gsMatrix<T> > quNodesOnElem;
241 std::vector< gsVector<T> > quWeightsOnElem;
246 bool inSupport =
true;
249 for (
index_t d = 0; d < dim; d++)
251 if ( (domIt->lowerCorner()[d] < support(d,0)) || (domIt->upperCorner()[d] > support(d,1)))
261 m_quRule.mapTo(domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights);
262 quNodesOnElem.push_back(quNodes);
263 quWeightsOnElem.push_back(quWeights);
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);
275 for (
size_t e = 0; e < numElemInSupport; e++)
277 m_quNodes.middleCols(e*numNodesInElem, numNodesInElem) = quNodesOnElem[e];
278 m_quWeights.middleRows(e*numNodesInElem, numNodesInElem) = quWeightsOnElem[e];
281 m_mapData.points = m_quNodes;
282 m_params.getPde().patches().patch(m_patchID).computeMap(m_mapData);
284 evalBasisData(m_shapeFunFlags, m_shapeBasisPtr, m_shapeFunActives, m_shapeFunData);
287 m_testFunActives.resize(1,1);
288 m_testFunActives << testFunID;
289 evalSingleFunData(m_testFunFlags, m_testBasisPtr, testFunID, m_testFunData);
293template<
class T,
int MatOrder>
297 m_mapData.points = m_quNodes;
298 m_params.getPde().patches().patch(m_patchID).computeMap(m_mapData);
300 evalBasisData(m_testFunFlags, m_testBasisPtr, m_testFunActives, m_testFunData);
302 if (m_shapeUnkID == m_testUnkID)
303 m_shapeFunActives = m_testFunActives;
305 m_shapeBasisPtr->active_into(m_quNodes.col(0), m_shapeFunActives);
307 if ( (m_shapeUnkID == m_testUnkID) && (m_testFunFlags == m_shapeFunFlags) )
308 m_shapeFunData = m_testFunData;
310 evalBasisData(m_shapeFunFlags, m_shapeBasisPtr, m_shapeFunActives, m_shapeFunData);
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