18template<
class T,
int MatOrder>
23 m_viscosity = m_params.getPde().viscosity();
25 m_dofMappers.resize(2);
27 getBases().front().getMapper(getAssemblerOptions().dirStrategy, getAssemblerOptions().intStrategy, getBCs(), m_dofMappers.front(), 0);
28 getBases().back().getMapper(getAssemblerOptions().dirStrategy, getAssemblerOptions().intStrategy, getBCs(), m_dofMappers.back(), 1);
31 for (
short_t i = 0; i < m_tarDim; i++)
32 m_nnzPerRowU *= 2 * getBases().front().maxDegree(i) + 1;
35 for (
short_t i = 0; i < m_tarDim; i++)
36 m_nnzPerRowP *= 2 * getBases().back().maxDegree(i) + 1;
40 m_visitorUUlin = gsINSVisitorUUlin<T, MatOrder>(m_params);
41 m_visitorUUlin.initialize();
43 m_visitorUUnonlin = gsINSVisitorUUnonlin<T, MatOrder>(m_params);
44 m_visitorUUnonlin.initialize();
45 m_visitorUUnonlin.setCurrentSolution(m_currentVelField);
47 m_visitorUP = gsINSVisitorPU_withUPrhs<T, MatOrder>(m_params);
48 m_visitorUP.initialize();
50 m_visitorF = gsINSVisitorRhsU<T, MatOrder>(m_params);
51 m_visitorF.initialize();
53 m_visitorG = gsINSVisitorRhsP<T, MatOrder>(m_params);
54 m_visitorG.initialize();
56 m_isMassMatReady =
false;
57 m_massMatBlocks.resize(2);
61template<
class T,
int MatOrder>
64 m_udofs = m_dofMappers.front().freeSize();
65 m_pdofs = m_dofMappers.back().freeSize();
66 m_pshift = m_tarDim * m_udofs;
67 m_dofs = m_pshift + m_pdofs;
69 m_ddof[0].setZero(m_dofMappers.front().boundarySize(), m_tarDim);
70 m_ddof[1].setZero(m_dofMappers.back().boundarySize(), 1);
72 if (this->getAssemblerOptions().dirStrategy == dirichlet::elimination)
74 this->computeDirichletDofs(0, 0, m_ddof[0]);
75 this->computeDirichletDofs(1, 1, m_ddof[1]);
78 m_solution.setZero(m_dofs, 1);
80 m_currentVelField = constructSolution(m_solution, 0);
82 m_blockUUlin_comp.resize(m_udofs, m_udofs);
83 m_blockUUnonlin_comp.resize(m_udofs, m_udofs);
84 m_blockUUlin_whole.resize(m_pshift, m_pshift);
85 m_blockUUnonlin_whole.resize(m_pshift, m_pshift);
86 m_blockUP.resize(m_pshift, m_pdofs);
88 m_baseMatrix.resize(m_dofs, m_dofs);
89 m_matrix.resize(m_dofs, m_dofs);
91 m_rhsUlin.setZero(m_pshift, 1);
92 m_rhsUnonlin.setZero(m_pshift, 1);
93 m_rhsBtB.setZero(m_dofs, 1);
94 m_rhsFG.setZero(m_dofs, 1);
95 m_baseRhs.setZero(m_dofs, 1);
96 m_rhs.setZero(m_dofs, 1);
100template<
class T,
int MatOrder>
103 m_visitorUUlin.updateDofMappers(m_dofMappers);
104 m_visitorUUnonlin.updateDofMappers(m_dofMappers);
105 m_visitorUP.updateDofMappers(m_dofMappers);
106 m_visitorF.updateDofMappers(m_dofMappers);
107 m_visitorG.updateDofMappers(m_dofMappers);
111template<
class T,
int MatOrder>
115 m_solution = solVector;
117 m_currentVelField = constructSolution(solVector, 0);
118 m_visitorUUnonlin.setCurrentSolution(m_currentVelField);
122template<
class T,
int MatOrder>
126 m_blockUUlin_comp.resize(m_udofs, m_udofs);
127 m_blockUP.resize(m_pshift, m_pdofs);
132 int nnzPerOuterUP = 0;
134 if (MatOrder == RowMajor)
135 nnzPerOuterUP = m_nnzPerRowP;
137 nnzPerOuterUP = m_tarDim * m_nnzPerRowU;
143 this->assembleBlock(m_visitorUUlin, 0, m_blockUUlin_comp, m_rhsUlin);
144 this->assembleBlock(m_visitorUP, 0, m_blockUP, m_rhsBtB);
145 this->assembleRhs(m_visitorF, 0, m_rhsFG);
147 if(m_params.getPde().source())
148 this->assembleRhs(m_visitorG, 1, m_rhsFG);
151 if ( m_params.options().getString(
"lin.solver") ==
"iter" )
156 gsINSVisitorUUmass<T, MatOrder> visitorUUmass(m_params);
157 gsINSVisitorPPmass<T, MatOrder> visitorPPmass(m_params);
159 visitorUUmass.initialize();
160 visitorPPmass.initialize();
162 m_massMatBlocks[0].resize(m_udofs, m_udofs);
163 m_massMatBlocks[1].resize(m_pdofs, m_pdofs);
167 this->assembleBlock(visitorUUmass, 0, m_massMatBlocks[0], dummyRhsU);
168 this->assembleBlock(visitorPPmass, 0, m_massMatBlocks[1], dummyRhsP);
170 m_isMassMatReady =
true;
193template<
class T,
int MatOrder>
197 m_blockUUnonlin_comp.resize(m_udofs, m_udofs);
198 m_rhsUnonlin.setZero();
203 this->assembleBlock(m_visitorUUnonlin, 0, m_blockUUnonlin_comp, m_rhsUnonlin);
228template<
class T,
int MatOrder>
231 if (sourceMat.rows() == m_udofs)
233 for (
index_t outer = 0; outer < sourceMat.outerSize(); outer++)
235 for (
short_t d = 0; d < m_tarDim; d++)
236 globalMat.coeffRef(it.row() + d*m_udofs, it.col() + d*m_udofs) += it.value();
240 for (
index_t outer = 0; outer < sourceMat.outerSize(); outer++)
242 globalMat.coeffRef(it.row(), it.col()) += it.value();
247template<
class T,
int MatOrder>
250 for (
index_t outer = 0; outer < sourceMat.outerSize(); outer++)
252 globalMat.coeffRef(it.row(), it.col() + m_pshift) += it.value();
257template<
class T,
int MatOrder>
260 for (
index_t outer = 0; outer < sourceMat.outerSize(); outer++)
262 globalMat.coeffRef(it.row() + m_pshift, it.col()) += it.value();
266template<
class T,
int MatOrder>
269 for (
index_t outer = 0; outer < sourceMat.outerSize(); outer++)
271 globalMat.coeffRef(it.row() + m_pshift, it.col() + m_pshift) += it.value();
275template<
class T,
int MatOrder>
281 for (
short_t d = 0; d < m_tarDim; d++)
282 nonZerosVector.middleRows(d * m_udofs, m_udofs) = nonZerosVector_UUcomp;
288 if (MatOrder == ColMajor)
299 m_baseMatrix.resize(m_dofs, m_dofs);
300 m_baseMatrix.reserve(nonZerosVector);
302 fillGlobalMat_UU(m_baseMatrix, m_blockUUlin_comp);
303 fillGlobalMat_UU(m_baseMatrix, m_blockUUlin_whole);
304 fillGlobalMat_UP(m_baseMatrix, m_blockUP);
305 fillGlobalMat_PU(m_baseMatrix, blockPU);
307 m_baseRhs.noalias() = m_rhsFG + m_rhsBtB;
308 m_baseRhs.topRows(m_pshift) += m_rhsUlin;
310 m_isBaseReady =
true;
311 m_isSystemReady =
false;
315template<
class T,
int MatOrder>
318 m_matrix = m_baseMatrix;
320 fillGlobalMat_UU(m_matrix, m_blockUUnonlin_comp);
321 fillGlobalMat_UU(m_matrix, m_blockUUnonlin_whole);
323 if (!m_matrix.isCompressed())
324 m_matrix.makeCompressed();
327 m_rhs.topRows(m_pshift) += m_rhsUnonlin;
329 m_isSystemReady =
true;
333template<
class T,
int MatOrder>
338 if (m_params.options().getSwitch(
"fillGlobalSyst"))
343template<
class T,
int MatOrder>
346 Base::update(solVector, updateSol);
348 if (m_params.options().getSwitch(
"fillGlobalSyst"))
353template<
class T,
int MatOrder>
356 m_dofMappers[unk] =
gsDofMapper(getBases().at(unk), getBCs(), unk);
358 if (getAssemblerOptions().intStrategy == iFace::conforming)
359 for (gsBoxTopology::const_iiterator it = getPatches().iBegin(); it != getPatches().iEnd(); ++it)
361 getBases().at(unk).matchInterface(*it, m_dofMappers[unk]);
364 for (
size_t i = 0; i < boundaryDofs.size(); i++)
365 m_dofMappers[unk].markBoundary(i, boundaryDofs[i]);
367 m_dofMappers[unk].finalize();
369 this->updateDofMappers();
374template<
class T,
int MatOrder>
378 this->fillBaseSystem();
380 stokesMat = m_baseMatrix;
381 stokesRhs = m_baseRhs;
383 if (!stokesMat.isCompressed())
384 stokesMat.makeCompressed();
388template<
class T,
int MatOrder>
391 GISMO_ASSERT(m_dofs == solVector.rows(),
"Something went wrong, is solution vector valid?");
397 const index_t dim = (unk == 0 ? m_tarDim : 1);
407 for (
size_t p = 0; p < this->getPatches().nPatches(); ++p)
410 const index_t sz = this->getBases().at(unk).piece(p).size();
411 coeffs.resize(sz, dim);
413 for (
index_t i = 0; i < sz; ++i)
417 coeffs.row(i) = solV.row(mapper.
index(i, p));
421 coeffs.row(i) = m_ddof[unk].row(mapper.
bindex(i, p));
425 result->
addPatch(this->getBases().at(unk).piece(p).makeGeometry(coeffs));
432template<
class T,
int MatOrder>
437 gsField<T> solutionField = constructSolution(solution, 0);
440 const gsBasis<T>& basis = this->getBases().at(0).basis(patch);
443 const index_t dir = side.direction();
444 for (
short_t i = 0; i < m_tarDim; ++i)
445 numQuadNodes[i] = (2 * basis.degree(i) + 1);
446 numQuadNodes[dir] = 1;
458 typename gsBasis<T>::domainIter domIt = basis.makeDomainIterator(side);
459 for (; domIt->good(); domIt->next())
462 QuRule.
mapTo(domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights);
471 for (
index_t k = 0; k < quWeights.rows(); ++k)
475 outerNormal(mapData, k, side, normal);
478 flowRate += quWeights[k] * normal.dot(solUVals.col(k));
485template<
class T,
int MatOrder>
497template<
class T,
int MatOrder>
500 if (m_isSystemReady && !linPartOnly)
502 return m_matrix.topLeftCorner(m_pshift, m_pshift);
504 else if (m_isBaseReady && linPartOnly)
506 return m_baseMatrix.topLeftCorner(m_pshift, m_pshift);
513 blockUUcomp += m_blockUUnonlin_comp;
520 for (
short_t d = 0; d < m_tarDim; d++)
521 nonZerosVector.middleRows(d * m_udofs, m_udofs) = nonZerosVector_UUcomp;
523 blockUU.reserve(nonZerosVector);
524 fillGlobalMat_UU(blockUU, blockUUcomp);
526 blockUU += m_blockUUlin_whole;
529 blockUU += m_blockUUnonlin_whole;
531 blockUU.makeCompressed();
538template<
class T,
int MatOrder>
542 return m_rhs.topRows(m_pshift);
545 gsMatrix<T> rhsUpart = (m_rhsFG + m_rhsBtB).topRows(m_pshift);
546 return (rhsUpart + m_rhsUlin + m_rhsUnonlin);
551template<
class T,
int MatOrder>
555 return m_rhs.bottomRows(m_pdofs);
557 return (m_rhsFG + m_rhsBtB).bottomRows(m_pdofs);
591template<
class T,
int MatOrder>
597 m_visitorTimeDiscr = gsINSVisitorUUtimeDiscr<T, MatOrder>(m_params);
598 m_visitorTimeDiscr.initialize();
602template<
class T,
int MatOrder>
607 m_oldTimeVelField = m_currentVelField;
609 m_blockTimeDiscr.resize(m_pshift, m_pshift);
610 m_rhsTimeDiscr.setZero(m_pshift, 1);
614template<
class T,
int MatOrder>
617 Base::updateDofMappers();
619 m_visitorTimeDiscr.updateDofMappers(m_dofMappers);
623template<
class T,
int MatOrder>
626 Base::updateCurrentSolField(solVector, updateSol);
629 m_oldTimeVelField = this->constructSolution(solVector, 0);
633template<
class T,
int MatOrder>
636 Base::assembleLinearPart();
639 m_blockTimeDiscr.resize(m_pshift, m_pshift);
643 dummyRhs.setZero(m_pshift, 1);
645 this->assembleBlock(m_visitorTimeDiscr, 0, m_blockTimeDiscr, dummyRhs);
647 m_rhsTimeDiscr = m_blockTimeDiscr * m_solution.topRows(m_pshift);
651template<
class T,
int MatOrder>
656 this->fillGlobalMat_UU(m_matrix, m_blockTimeDiscr);
657 m_rhs.topRows(m_pshift) += m_rhsTimeDiscr;
661template<
class T,
int MatOrder>
667 m_rhsTimeDiscr = m_blockTimeDiscr * m_solution.topRows(m_pshift);
669 if (m_params.options().getSwitch(
"fillGlobalSyst"))
Struct which represents a certain side of a box.
Definition gsBoundary.h:85
Creates a mapped object or data pointer to a const matrix without copying data.
Definition gsAsMatrix.h:141
A basis represents a family of scalar basis functions defined over a common parameter domain.
Definition gsBasis.h:79
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition gsDofMapper.h:69
index_t bindex(index_t i, index_t k=0, index_t c=0) const
Returns the boundary index of local dof i of patch k.
Definition gsDofMapper.h:334
index_t index(index_t i, index_t k=0, index_t c=0) const
Returns the global dof index associated to local dof i of patch k.
Definition gsDofMapper.h:325
bool is_free(index_t i, index_t k=0, index_t c=0) const
Returns true if local dof i of patch k is not eliminated.
Definition gsDofMapper.h:382
A scalar of vector field defined on a m_parametric geometry.
Definition gsField.h:55
gsMatrix< T > value(const gsMatrix< T > &u, int i=0) const
Evaluation of the field at points u.
Definition gsField.h:122
virtual void update(const gsMatrix< T > &solVector, bool updateSol=true)
Update the assembler in new nonlinear iteration.
Definition gsFlowAssemblerBase.hpp:360
memory::shared_ptr< gsFunctionSet > Ptr
Shared pointer for gsFunctionSet.
Definition gsFunctionSet.h:223
virtual void computeMap(gsMapData< T > &InOut) const
Computes map function data.
Definition gsFunction.hpp:817
Class that represents the (tensor) Gauss-Legendre quadrature rule.
Definition gsGaussRule.h:28
Abstract base class representing a geometry map.
Definition gsGeometry.h:93
virtual void updateCurrentSolField(const gsMatrix< T > &solVector, bool updateSol)
Update the current solution field stored in the assembler (used as convection coefficient).
Definition gsINSAssembler.hpp:624
virtual void assembleLinearPart()
Assemble the linear part of the matrix.
Definition gsINSAssembler.hpp:634
virtual void updateDofMappers()
Update the DOF mappers in all visitors (e.g. after markDofsAsEliminatedZeros() ).
Definition gsINSAssembler.hpp:615
void initMembers()
Initialize all members.
Definition gsINSAssembler.hpp:592
virtual void update(const gsMatrix< T > &solVector, bool updateSol=true)
Definition gsINSAssembler.hpp:662
virtual void fillSystem()
Add the nonlinear part to the given matrix and right-hand side.
Definition gsINSAssembler.hpp:652
virtual void updateSizes()
Update sizes of members (when DOF numbers change, e.g. after markDofsAsEliminatedZeros()).
Definition gsINSAssembler.hpp:603
index_t numDofsUnk(index_t i)
Returns the number of DOFs for the i-th unknown.
Definition gsINSAssembler.hpp:486
virtual void fillBaseSystem()
Fill the linear part of the global matrix and right-hand side.
Definition gsINSAssembler.hpp:276
void fillGlobalMat_UU(gsSparseMatrix< T, MatOrder > &globalMat, const gsSparseMatrix< T, MatOrder > &sourceMat)
Fill the velocity-velocity block into the global saddle-point matrix.
Definition gsINSAssembler.hpp:229
virtual void initialize()
Initialize the assembler.
Definition gsINSAssembler.hpp:334
virtual void updateCurrentSolField(const gsMatrix< T > &solVector, bool updateSol)
Update the current solution field stored in the assembler (used as convection coefficient).
Definition gsINSAssembler.hpp:112
virtual void assembleLinearPart()
Assemble the linear part of the problem.
Definition gsINSAssembler.hpp:123
virtual void fillStokesSystem(gsSparseMatrix< T, MatOrder > &stokesMat, gsMatrix< T > &stokesRhs)
Fill the matrix and right-hand side for the Stokes problem.
Definition gsINSAssembler.hpp:375
virtual void markDofsAsEliminatedZeros(const std::vector< gsMatrix< index_t > > &boundaryDofs, const index_t unk)
Eliminate given DOFs as homogeneous Dirichlet boundary.
Definition gsINSAssembler.hpp:354
virtual gsSparseMatrix< T, MatOrder > getBlockUU(bool linPartOnly=false)
Returns the velocity-velocity block of the linear system.
Definition gsINSAssembler.hpp:498
virtual gsMatrix< T > getRhsU() const
///
Definition gsINSAssembler.hpp:539
void fillGlobalMat_PU(gsSparseMatrix< T, MatOrder > &globalMat, const gsSparseMatrix< T, MatOrder > &sourceMat)
Fill the pressure-velocity block into the global saddle-point matrix.
Definition gsINSAssembler.hpp:258
T computeFlowRate(index_t patch, boxSide side, gsMatrix< T > solution) const
Compute flow rate through a side of a given patch.
Definition gsINSAssembler.hpp:433
virtual void updateDofMappers()
Update the DOF mappers in all visitors (when DOF numbers change, e.g. after markDofsAsEliminatedZeros...
Definition gsINSAssembler.hpp:101
virtual gsField< T > constructSolution(const gsMatrix< T > &solVector, index_t unk) const
Construct solution from computed solution vector for unknown unk.
Definition gsINSAssembler.hpp:389
void fillGlobalMat_UP(gsSparseMatrix< T, MatOrder > &globalMat, const gsSparseMatrix< T, MatOrder > &sourceMat)
Fill the velocity-pressure block into the global saddle-point matrix.
Definition gsINSAssembler.hpp:248
void initMembers()
Initialize the class members.
Definition gsINSAssembler.hpp:19
virtual void update(const gsMatrix< T > &solVector, bool updateSol=true)
Definition gsINSAssembler.hpp:344
virtual void assembleNonlinearPart()
Assemble the linear part of the problem.
Definition gsINSAssembler.hpp:194
virtual void fillSystem()
Add the nonlinear part to the given matrix and right-hand side.
Definition gsINSAssembler.hpp:316
gsMatrix< T > getRhsP() const
Returns the pressure part of the right-hand side.
Definition gsINSAssembler.hpp:552
virtual void updateSizes()
Update sizes of members (when DOF numbers change, e.g. after markDofsAsEliminatedZeros()).
Definition gsINSAssembler.hpp:62
void fillGlobalMat_PP(gsSparseMatrix< T, MatOrder > &globalMat, const gsSparseMatrix< T, MatOrder > &sourceMat)
Fill the pressure-pressure block into the global saddle-point matrix.
Definition gsINSAssembler.hpp:267
the gsMapData is a cache of pre-computed function (map) values.
Definition gsFuncData.h:349
gsMatrix< T > points
input (parametric) points
Definition gsFuncData.h:372
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition gsMultiPatch.h:100
index_t addPatch(typename gsGeometry< T >::uPtr g)
Add a patch from a gsGeometry<T>::uPtr.
Definition gsMultiPatch.hpp:211
virtual void mapTo(const gsVector< T > &lower, const gsVector< T > &upper, gsMatrix< T > &nodes, gsVector< T > &weights) const
Maps quadrature rule (i.e., points and weights) from the reference domain to an element.
Definition gsQuadRule.h:177
Sparse matrix class, based on gsEigen::SparseMatrix.
Definition gsSparseMatrix.h:139
A vector with arbitrary coefficient type and fixed or dynamic size.
Definition gsVector.h:37
#define short_t
Definition gsConfig.h:35
#define index_t
Definition gsConfig.h:32
#define GISMO_ERROR(message)
Definition gsDebug.h:118
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
The G+Smo namespace, containing all definitions for the library.
@ NEED_VALUE
Value of the object.
Definition gsForwardDeclarations.h:72
@ NEED_OUTER_NORMAL
Outward normal on the boundary.
Definition gsForwardDeclarations.h:86
gsVector< index_t > getNnzVectorPerOuter(const gsSparseMatrix< T, MatOrder > &mat)
Get a vector of nonzero entries per outer index (row or column depending on the matrix storage order)...
Definition gsFlowUtils.h:116