G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
gsINSAssembler.hpp
Go to the documentation of this file.
1
12#pragma once
14
15namespace gismo
16{
17
18template<class T, int MatOrder>
20{
21 Base::initMembers();
22
23 m_viscosity = m_params.getPde().viscosity();
24
25 m_dofMappers.resize(2);
26 m_ddof.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);
29
30 m_nnzPerRowU = 1;
31 for (short_t i = 0; i < m_tarDim; i++)
32 m_nnzPerRowU *= 2 * getBases().front().maxDegree(i) + 1;
33
34 m_nnzPerRowP = 1;
35 for (short_t i = 0; i < m_tarDim; i++)
36 m_nnzPerRowP *= 2 * getBases().back().maxDegree(i) + 1;
37
38 updateSizes();
39
40 m_visitorUUlin = gsINSVisitorUUlin<T, MatOrder>(m_params);
41 m_visitorUUlin.initialize();
42
43 m_visitorUUnonlin = gsINSVisitorUUnonlin<T, MatOrder>(m_params);
44 m_visitorUUnonlin.initialize();
45 m_visitorUUnonlin.setCurrentSolution(m_currentVelField);
46
47 m_visitorUP = gsINSVisitorPU_withUPrhs<T, MatOrder>(m_params);
48 m_visitorUP.initialize();
49
50 m_visitorF = gsINSVisitorRhsU<T, MatOrder>(m_params);
51 m_visitorF.initialize();
52
53 m_visitorG = gsINSVisitorRhsP<T, MatOrder>(m_params);
54 m_visitorG.initialize();
55
56 m_isMassMatReady = false;
57 m_massMatBlocks.resize(2); // [velocity, pressure]
58}
59
60
61template<class T, int MatOrder>
63{
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;
68
69 m_ddof[0].setZero(m_dofMappers.front().boundarySize(), m_tarDim);
70 m_ddof[1].setZero(m_dofMappers.back().boundarySize(), 1);
71
72 if (this->getAssemblerOptions().dirStrategy == dirichlet::elimination)
73 {
74 this->computeDirichletDofs(0, 0, m_ddof[0]);
75 this->computeDirichletDofs(1, 1, m_ddof[1]);
76 }
77
78 m_solution.setZero(m_dofs, 1);
79
80 m_currentVelField = constructSolution(m_solution, 0);
81
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);
87
88 m_baseMatrix.resize(m_dofs, m_dofs);
89 m_matrix.resize(m_dofs, m_dofs);
90
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);
97}
98
99
100template<class T, int MatOrder>
102{
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);
108}
109
110
111template<class T, int MatOrder>
113{
114 if (updateSol)
115 m_solution = solVector;
116
117 m_currentVelField = constructSolution(solVector, 0);
118 m_visitorUUnonlin.setCurrentSolution(m_currentVelField);
119}
120
121
122template<class T, int MatOrder>
124{
125 // matrix and rhs cleaning
126 m_blockUUlin_comp.resize(m_udofs, m_udofs);
127 m_blockUP.resize(m_pshift, m_pdofs);
128 m_rhsUlin.setZero();
129 m_rhsBtB.setZero();
130 m_rhsFG.setZero();
131
132 int nnzPerOuterUP = 0;
133
134 if (MatOrder == RowMajor)
135 nnzPerOuterUP = m_nnzPerRowP;
136 else
137 nnzPerOuterUP = m_tarDim * m_nnzPerRowU;
138
139 // memory allocation
140 m_blockUUlin_comp.reserve(gsVector<index_t>::Constant(m_blockUUlin_comp.outerSize(), m_nnzPerRowU));
141 m_blockUP.reserve(gsVector<index_t>::Constant(m_blockUP.outerSize(), nnzPerOuterUP));
142
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);
146
147 if(m_params.getPde().source()) // if the continuity eqn rhs is given
148 this->assembleRhs(m_visitorG, 1, m_rhsFG);
149
150 // mass matrices for velocity and pressure (needed for preconditioners)
151 if ( m_params.options().getString("lin.solver") == "iter" )
152 {
153 gsMatrix<T> dummyRhsU(m_pshift, 1);
154 gsMatrix<T> dummyRhsP(m_pdofs, 1);
155
156 gsINSVisitorUUmass<T, MatOrder> visitorUUmass(m_params);
157 gsINSVisitorPPmass<T, MatOrder> visitorPPmass(m_params);
158
159 visitorUUmass.initialize();
160 visitorPPmass.initialize();
161
162 m_massMatBlocks[0].resize(m_udofs, m_udofs);
163 m_massMatBlocks[1].resize(m_pdofs, m_pdofs);
164 m_massMatBlocks[0].reserve(gsVector<index_t>::Constant(m_udofs, m_nnzPerRowU));
165 m_massMatBlocks[1].reserve(gsVector<index_t>::Constant(m_pdofs, m_nnzPerRowP));
166
167 this->assembleBlock(visitorUUmass, 0, m_massMatBlocks[0], dummyRhsU);
168 this->assembleBlock(visitorPPmass, 0, m_massMatBlocks[1], dummyRhsP);
169
170 m_isMassMatReady = true;
171
172
173 // linear operators needed for PCD preconditioner
174 // if ( m_paramsRef.options().getString("lin.precType").substr(0, 3) == "PCD" )
175 // {
176 // // pressure Laplace operator
177
178 // gsINSVisitorPPlaplace<T, MatOrder> visitorPPlaplace(m_params);
179 // visitorPPlaplace.initialize();
180
181 // m_pcdBlocks[0].resize(m_pdofs, m_pdofs);
182 // m_pcdBlocks[0].reserve(gsVector<index_t>::Constant(m_pdofs, m_nnzPerRowP));
183
184 // this->assembleBlock(visitorPPlaplace, 0, m_pcdBlocks[0], dummyRhsP);
185
186 // // prepare for BCs
187 // findPressureBoundaryIDs();
188 // }
189 }
190}
191
192
193template<class T, int MatOrder>
195{
196 // matrix and rhs cleaning
197 m_blockUUnonlin_comp.resize(m_udofs, m_udofs);
198 m_rhsUnonlin.setZero();
199
200 // memory allocation
201 m_blockUUnonlin_comp.reserve(gsVector<index_t>::Constant(m_blockUUnonlin_comp.outerSize(), m_nnzPerRowU));
202
203 this->assembleBlock(m_visitorUUnonlin, 0, m_blockUUnonlin_comp, m_rhsUnonlin);
204
205 // linear operators needed for PCD preconditioner
206 // if ( m_params.options().getString("lin.solver") == "iter" && m_paramsRef.options().getString("lin.precType").substr(0, 3) == "PCD" )
207 // {
208 // gsMatrix<T> dummyRhsP(m_pdofs, 1);
209
210 // // Robin BC
211
212 // // TODO
213
214 // // pressure convection operator
215
216 // gsINSVisitorPPconvection<T, MatOrder> visitorPPconv(m_params);
217 // visitorPPconv.initialize();
218 // visitorPPconv.setCurrentSolution(m_currentVelField);
219
220 // m_pcdBlocks[2].resize(m_pdofs, m_pdofs);
221 // m_pcdBlocks[2].reserve(gsVector<index_t>::Constant(m_pdofs, m_nnzPerRowP));
222
223 // this->assembleBlock(visitorPPconv, 0, m_pcdBlocks[2], dummyRhsP);
224 // }
225}
226
227
228template<class T, int MatOrder>
230{
231 if (sourceMat.rows() == m_udofs) // sourceMat is a block for one velocity component
232 {
233 for (index_t outer = 0; outer < sourceMat.outerSize(); outer++)
234 for (typename gsSparseMatrix<T, MatOrder>::InnerIterator it(sourceMat, outer); it; ++it)
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();
237 }
238 else // sourceMat is the whole UU block
239 {
240 for (index_t outer = 0; outer < sourceMat.outerSize(); outer++)
241 for (typename gsSparseMatrix<T, MatOrder>::InnerIterator it(sourceMat, outer); it; ++it)
242 globalMat.coeffRef(it.row(), it.col()) += it.value();
243 }
244}
245
246
247template<class T, int MatOrder>
249{
250 for (index_t outer = 0; outer < sourceMat.outerSize(); outer++)
251 for (typename gsSparseMatrix<T, MatOrder>::InnerIterator it(sourceMat, outer); it; ++it)
252 globalMat.coeffRef(it.row(), it.col() + m_pshift) += it.value();
253
254}
255
256
257template<class T, int MatOrder>
259{
260 for (index_t outer = 0; outer < sourceMat.outerSize(); outer++)
261 for (typename gsSparseMatrix<T, MatOrder>::InnerIterator it(sourceMat, outer); it; ++it)
262 globalMat.coeffRef(it.row() + m_pshift, it.col()) += it.value();
263}
264
265
266template<class T, int MatOrder>
268{
269 for (index_t outer = 0; outer < sourceMat.outerSize(); outer++)
270 for (typename gsSparseMatrix<T, MatOrder>::InnerIterator it(sourceMat, outer); it; ++it)
271 globalMat.coeffRef(it.row() + m_pshift, it.col() + m_pshift) += it.value();
272}
273
274
275template<class T, int MatOrder>
277{
278 gsVector<index_t> nonZerosVector(m_dofs);
279 gsVector<index_t> nonZerosVector_UUcomp = getNnzVectorPerOuter(m_blockUUlin_comp);
280
281 for (short_t d = 0; d < m_tarDim; d++)
282 nonZerosVector.middleRows(d * m_udofs, m_udofs) = nonZerosVector_UUcomp;
283
284 nonZerosVector.topRows(m_pshift) += getNnzVectorPerOuter(m_blockUUlin_whole);
285
286 gsSparseMatrix<T, MatOrder> blockPU = gsSparseMatrix<T, MatOrder>(-m_blockUP.transpose());
287
288 if (MatOrder == ColMajor)
289 {
290 nonZerosVector.topRows(m_pshift) += getNnzVectorPerOuter(blockPU);
291 nonZerosVector.bottomRows(m_pdofs) = getNnzVectorPerOuter(m_blockUP);
292 }
293 else
294 {
295 nonZerosVector.topRows(m_pshift) += getNnzVectorPerOuter(m_blockUP);
296 nonZerosVector.bottomRows(m_pdofs) = getNnzVectorPerOuter(blockPU);
297 }
298
299 m_baseMatrix.resize(m_dofs, m_dofs);
300 m_baseMatrix.reserve(nonZerosVector);
301
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);
306
307 m_baseRhs.noalias() = m_rhsFG + m_rhsBtB;
308 m_baseRhs.topRows(m_pshift) += m_rhsUlin;
309
310 m_isBaseReady = true;
311 m_isSystemReady = false;
312}
313
314
315template<class T, int MatOrder>
317{
318 m_matrix = m_baseMatrix;
319
320 fillGlobalMat_UU(m_matrix, m_blockUUnonlin_comp);
321 fillGlobalMat_UU(m_matrix, m_blockUUnonlin_whole);
322
323 if (!m_matrix.isCompressed())
324 m_matrix.makeCompressed();
325
326 m_rhs = m_baseRhs;
327 m_rhs.topRows(m_pshift) += m_rhsUnonlin;
328
329 m_isSystemReady = true;
330}
331
332
333template<class T, int MatOrder>
335{
336 Base::initialize();
337
338 if (m_params.options().getSwitch("fillGlobalSyst"))
339 fillBaseSystem();
340}
341
342
343template<class T, int MatOrder>
344void gsINSAssembler<T, MatOrder>::update(const gsMatrix<T> & solVector, bool updateSol)
345{
346 Base::update(solVector, updateSol);
347
348 if (m_params.options().getSwitch("fillGlobalSyst"))
349 fillSystem();
350}
351
352
353template<class T, int MatOrder>
354void gsINSAssembler<T, MatOrder>::markDofsAsEliminatedZeros(const std::vector< gsMatrix< index_t > > & boundaryDofs, const index_t unk)
355{
356 m_dofMappers[unk] = gsDofMapper(getBases().at(unk), getBCs(), unk);
357
358 if (getAssemblerOptions().intStrategy == iFace::conforming)
359 for (gsBoxTopology::const_iiterator it = getPatches().iBegin(); it != getPatches().iEnd(); ++it)
360 {
361 getBases().at(unk).matchInterface(*it, m_dofMappers[unk]);
362 }
363
364 for (size_t i = 0; i < boundaryDofs.size(); i++)
365 m_dofMappers[unk].markBoundary(i, boundaryDofs[i]);
366
367 m_dofMappers[unk].finalize();
368
369 this->updateDofMappers();
370 this->updateSizes();
371}
372
373
374template<class T, int MatOrder>
376{
377 if (!m_isBaseReady)
378 this->fillBaseSystem();
379
380 stokesMat = m_baseMatrix;
381 stokesRhs = m_baseRhs;
382
383 if (!stokesMat.isCompressed())
384 stokesMat.makeCompressed();
385}
386
387
388template<class T, int MatOrder>
390{
391 GISMO_ASSERT(m_dofs == solVector.rows(), "Something went wrong, is solution vector valid?");
392
393 gsMultiPatch<T>* result = new gsMultiPatch<T>;
394
395 const gsDofMapper& mapper = m_dofMappers[unk];
396
397 const index_t dim = (unk == 0 ? m_tarDim : 1);
398 gsMatrix<T> coeffs;
399
400 // Point to the correct entries of the solution vector
401 gsAsConstMatrix<T> solV = (unk == 0 ?
402 gsAsConstMatrix<T>(solVector.data(), m_udofs, dim)
403 :
404 gsAsConstMatrix<T>(solVector.data() + m_pshift, m_pdofs, 1)
405 );
406
407 for (size_t p = 0; p < this->getPatches().nPatches(); ++p)
408 {
409 // Reconstruct solution coefficients on patch p
410 const index_t sz = this->getBases().at(unk).piece(p).size();
411 coeffs.resize(sz, dim);
412
413 for (index_t i = 0; i < sz; ++i)
414 {
415 if (mapper.is_free(i, p)) // DoF value is in the solVector
416 {
417 coeffs.row(i) = solV.row(mapper.index(i, p));
418 }
419 else // eliminated DoF: fill with Dirichlet data
420 {
421 coeffs.row(i) = m_ddof[unk].row(mapper.bindex(i, p));
422 }
423 }
424
425 result->addPatch(this->getBases().at(unk).piece(p).makeGeometry(coeffs));
426 }
427
428 return gsField<T>(this->getPatches(), typename gsFunctionSet<T>::Ptr(result), true);
429}
430
431
432template<class T, int MatOrder>
434{
435 T flowRate = 0;
436
437 gsField<T> solutionField = constructSolution(solution, 0); // velocity field
438
439 const gsGeometry<T>& geo = this->getPatches().patch(patch);
440 const gsBasis<T>& basis = this->getBases().at(0).basis(patch);
441
442 gsVector<index_t> numQuadNodes(m_tarDim);
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;
447
448 // Setup Quadrature
449 gsGaussRule<T> QuRule(numQuadNodes);
450
451 gsMatrix<T> quNodes; // Mapped nodes
452 gsVector<T> quWeights; // Mapped weights
453
454 // Initialize geometry evaluator
455 gsMapData<T> mapData;
456 mapData.flags = NEED_VALUE | NEED_OUTER_NORMAL;
457
458 typename gsBasis<T>::domainIter domIt = basis.makeDomainIterator(side);
459 for (; domIt->good(); domIt->next())
460 {
461 // Compute the quadrature rule on patch1
462 QuRule.mapTo(domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights);
463
464 // Compute image of Gauss nodes under geometry mapping as well as Jacobians
465 mapData.points = quNodes;
466 geo.computeMap(mapData);
467
468 // Evaluate solution on element nodes
469 gsMatrix<T> solUVals = solutionField.value(quNodes, patch);
470
471 for (index_t k = 0; k < quWeights.rows(); ++k) // loop over quadrature nodes
472 {
473 // Compute the outer normal vector from patch1
474 gsVector<T> normal;
475 outerNormal(mapData, k, side, normal);
476
477 // the normal norm is equal to integral measure
478 flowRate += quWeights[k] * normal.dot(solUVals.col(k));
479 }
480 }
481 return flowRate;
482}
483
484
485template<class T, int MatOrder>
487{
488 if (i == 0)
489 return m_udofs;
490 else if (i == 1)
491 return m_pdofs;
492 else
493 GISMO_ERROR("numDofsUnk(i): i must be 0 or 1.");
494}
495
496
497template<class T, int MatOrder>
499{
500 if (m_isSystemReady && !linPartOnly)
501 {
502 return m_matrix.topLeftCorner(m_pshift, m_pshift);
503 }
504 else if (m_isBaseReady && linPartOnly)
505 {
506 return m_baseMatrix.topLeftCorner(m_pshift, m_pshift);
507 }
508 else
509 {
510 gsSparseMatrix<T, MatOrder> blockUUcomp = m_blockUUlin_comp;
511
512 if(!linPartOnly)
513 blockUUcomp += m_blockUUnonlin_comp;
514
515 gsSparseMatrix<T, MatOrder> blockUU(m_pshift, m_pshift);
516
517 gsVector<index_t> nonZerosVector(m_pshift);
518 gsVector<index_t> nonZerosVector_UUcomp = getNnzVectorPerOuter(blockUUcomp);
519
520 for (short_t d = 0; d < m_tarDim; d++)
521 nonZerosVector.middleRows(d * m_udofs, m_udofs) = nonZerosVector_UUcomp;
522
523 blockUU.reserve(nonZerosVector);
524 fillGlobalMat_UU(blockUU, blockUUcomp);
525
526 blockUU += m_blockUUlin_whole;
527
528 if(!linPartOnly)
529 blockUU += m_blockUUnonlin_whole;
530
531 blockUU.makeCompressed();
532
533 return blockUU;
534 }
535}
536
537
538template<class T, int MatOrder>
540{
541 if (m_isSystemReady)
542 return m_rhs.topRows(m_pshift);
543 else
544 {
545 gsMatrix<T> rhsUpart = (m_rhsFG + m_rhsBtB).topRows(m_pshift);
546 return (rhsUpart + m_rhsUlin + m_rhsUnonlin);
547 }
548}
549
550
551template<class T, int MatOrder>
553{
554 if (m_isSystemReady)
555 return m_rhs.bottomRows(m_pdofs);
556 else
557 return (m_rhsFG + m_rhsBtB).bottomRows(m_pdofs);
558}
559
560
561// --- PCD functions ---
562
563// template<class T, int MatOrder>
564// void gsINSAssembler<T, MatOrder>::findPressureBoundaryIDs()
565// {
566// findPressureBoundaryPartIDs(m_params.getBndIn(), m_presInIDs);
567// findPressureBoundaryPartIDs(m_params.getBndOut(), m_presOutIDs);
568// findPressureBoundaryPartIDs(m_params.getBndWall(), m_presWallIDs);
569// }
570
571// template<class T, int MatOrder>
572// void gsINSAssembler<T, MatOrder>::findPressureBoundaryPartIDs(std::vector<std::pair<int, boxSide> > bndPart, std::vector<index_t>& idVector)
573// {
574// const gsMultiBasis<T>& pBasis = getBases()[1];
575
576// gsMatrix<index_t> bnd;
577// idVector.clear();
578
579// for (std::vector<std::pair<int, boxSide> >::iterator it = bndPart.begin(); it != bndPart.end(); it++)
580// {
581// bnd = pBasis.piece(it->first).boundary(it->second);
582
583// for (int i = 0; i < bnd.rows(); i++)
584// idVector.push_back(this->getMappers()[1].index(bnd(i, 0), it->first));
585// }
586// }
587
588// =============================================================================
589
590
591template<class T, int MatOrder>
593{
594 Base::initMembers();
595 updateSizes();
596
597 m_visitorTimeDiscr = gsINSVisitorUUtimeDiscr<T, MatOrder>(m_params);
598 m_visitorTimeDiscr.initialize();
599}
600
601
602template<class T, int MatOrder>
604{
605 Base::updateSizes();
606
607 m_oldTimeVelField = m_currentVelField;
608
609 m_blockTimeDiscr.resize(m_pshift, m_pshift);
610 m_rhsTimeDiscr.setZero(m_pshift, 1);
611}
612
613
614template<class T, int MatOrder>
616{
617 Base::updateDofMappers();
618
619 m_visitorTimeDiscr.updateDofMappers(m_dofMappers);
620}
621
622
623template<class T, int MatOrder>
625{
626 Base::updateCurrentSolField(solVector, updateSol);
627
628 if (updateSol)
629 m_oldTimeVelField = this->constructSolution(solVector, 0);
630}
631
632
633template<class T, int MatOrder>
635{
636 Base::assembleLinearPart();
637
638 // matrix cleaning
639 m_blockTimeDiscr.resize(m_pshift, m_pshift);
640 m_blockTimeDiscr.reserve(gsVector<index_t>::Constant(m_blockTimeDiscr.outerSize(), m_nnzPerRowU));
641
642 gsMatrix<T> dummyRhs;
643 dummyRhs.setZero(m_pshift, 1);
644
645 this->assembleBlock(m_visitorTimeDiscr, 0, m_blockTimeDiscr, dummyRhs);
646
647 m_rhsTimeDiscr = m_blockTimeDiscr * m_solution.topRows(m_pshift);
648}
649
650
651template<class T, int MatOrder>
653{
654 Base::fillSystem();
655
656 this->fillGlobalMat_UU(m_matrix, m_blockTimeDiscr);
657 m_rhs.topRows(m_pshift) += m_rhsTimeDiscr;
658}
659
660
661template<class T, int MatOrder>
662void gsINSAssemblerUnsteady<T, MatOrder>::update(const gsMatrix<T> & solVector, bool updateSol)
663{
664 gsFlowAssemblerBase<T, MatOrder>::update(solVector, updateSol);
665
666 if(updateSol)
667 m_rhsTimeDiscr = m_blockTimeDiscr * m_solution.topRows(m_pshift);
668
669 if (m_params.options().getSwitch("fillGlobalSyst"))
670 fillSystem();
671}
672
673
674} // namespace gismo
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