17 #include <gsUnstructuredSplines/src/gsC1SurfGluingData.h>
18 #include <gsUnstructuredSplines/src/gsC1SurfVisitorBasisVertex.h>
24 template<
class T,
class bhVisitor = gsG1ASVisitorBasisVertex<T>>
33 std::vector<bool> isBoundary,
36 : m_mp(mp), m_basis(basis), m_isBoundary(isBoundary), m_Phi(Phi), m_gD(gluingD)
39 for (
index_t dir = 0; dir < m_mp.parDim(); dir++)
46 basis_plus.elevateContinuity(1);
47 m_basis_plus.push_back(basis_plus);
50 basis_minus.degreeReduce(1);
51 m_basis_minus.push_back(basis_minus);
55 m_basis_g1 = m_basis.basis(0);
63 inline void apply(bhVisitor & visitor,
index_t patchIndex);
75 constructSolution(result);
81 void constructSolution(
const gsMatrix<T>& solVector,
85 void constructSolution(
const gsMatrix<T>& solVector,
95 std::vector<bool> m_isBoundary;
102 std::vector<gsBSplineBasis<T>> m_basis_plus;
103 std::vector<gsBSplineBasis<T>> m_basis_minus;
112 std::vector<gsSparseSystem<T> > m_f;
117 std::vector<gsMatrix<T>> solVec;
122 template <
class T,
class bhVisitor>
123 void gsC1SurfBasisVertex<T,bhVisitor>::constructSolution(
gsMultiPatch<T> & result)
129 const index_t dim = ( 0!=solVec.at(0).cols() ? solVec.at(0).cols() : m_ddof[0].cols() );
132 for (
index_t p = 0; p < 6; ++p)
134 const gsDofMapper & mapper = m_f.at(p).colMapper(0);
138 sz = m_basis.basis(0).size();
140 coeffs.resize(sz, dim);
142 for (
index_t i = 0; i < sz; ++i)
146 coeffs.row(i) = solVec.
at(p).row(mapper.
index(i, 0));
151 coeffs.row(i) = m_ddof[0].row( mapper.
bindex(i, 0) ).head(dim);
154 result.
addPatch(m_basis_g1.basis(0).makeGeometry(
give(coeffs)));
158 template <
class T,
class bhVisitor>
159 void gsC1SurfBasisVertex<T,bhVisitor>::refresh()
171 for (
index_t i = 0; i < 6; i++)
172 m_f.push_back(m_system);
176 template <
class T,
class bhVisitor>
177 void gsC1SurfBasisVertex<T,bhVisitor>::assemble()
180 const index_t nz = gsAssemblerOptions::numColNz(m_basis[0],2,1,0.333333);
181 for (
size_t i = 0; i < m_f.size(); i++)
182 m_f.at(i).reserve(nz, 1);
196 for (
size_t i = 0; i < m_f.size(); i++)
197 m_f.at(i).matrix().makeCompressed();
201 template <
class T,
class bhVisitor>
202 void gsC1SurfBasisVertex<T,bhVisitor>::apply(bhVisitor & visitor,
index_t patchIndex)
215 const int tid = omp_get_thread_num();
216 const int nt = omp_get_num_threads();
227 visitor_.initialize(basis_g1, quRule);
232 typename gsBasis<T>::domainIter domIt = m_geo.basis(0).makeDomainIterator(boundary::none);
235 for ( domIt->next(tid); domIt->good(); domIt->next(nt) )
237 for (; domIt->good(); domIt->next() )
241 quRule.
mapTo( domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights );
242 #pragma omp critical(evaluate)
244 visitor_.evaluate(basis_g1, basis_geo, m_basis_plus, m_basis_minus, patch, quNodes, m_gD, m_isBoundary, m_Phi);
247 visitor_.assemble(*domIt, quWeights);
250 #pragma omp critical(localToGlobal)
251 visitor_.localToGlobal(patchIndex, m_ddof, m_f);
256 template <
class T,
class bhVisitor>
257 void gsC1SurfBasisVertex<T,bhVisitor>::solve()
259 typename gsSparseSolver<T>::SimplicialLDLT solver;
265 for (
index_t i = 0; i < 6; i++)
267 solver.compute(m_f.at(i).matrix());
268 solVec.push_back(solver.solve(m_f.at(i).rhs()));
index_t addPatch(typename gsGeometry< T >::uPtr g)
Add a patch from a gsGeometry<T>::uPtr.
Definition: gsMultiPatch.hpp:210
Abstract base class representing a geometry map.
Definition: gsGeometry.h:92
Class representing a reference quadrature rule.
Definition: gsQuadRule.h:28
void clear()
Clear (delete) all patches.
Definition: gsMultiPatch.h:319
index_t boundarySize() const
Returns the number of eliminated dofs.
Definition: gsDofMapper.h:457
#define GISMO_NO_IMPLEMENTATION
Definition: gsDebug.h:129
#define short_t
Definition: gsConfig.h:35
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
S give(S &x)
Definition: gsMemory.h:266
#define index_t
Definition: gsConfig.h:32
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition: gsDofMapper.h:68
A univariate B-spline basis.
Definition: gsBSplineBasis.h:694
void finalize()
Must be called after all boundaries and interfaces have been marked to set up the dof numbering...
Definition: gsDofMapper.cpp:240
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
T at(index_t i) const
Returns the i-th element of the vectorization of the matrix.
Definition: gsMatrix.h:211
Holds a set of patch-wise bases and their topology information.
Definition: gsMultiBasis.h:36
const gsBasis< T > & basis(const index_t k) const
Helper which casts and returns the k-th piece of this function set as a gsBasis.
Definition: gsFunctionSet.hpp:33
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition: gsMultiPatch.h:33
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
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
virtual void assemble(const gsMultiPatch< T > &curSolution)
Main non-linear assemble routine with input from current solution.
Definition: gsAssembler.hpp:55
std::vector< gsMatrix< T > > m_ddof
Definition: gsAssembler.h:295
The assembler class provides generic routines for volume and boundary integrals that are used for for...
Definition: gsAssembler.h:265
A basis represents a family of scalar basis functions defined over a common parameter domain...
Definition: gsBasis.h:78
void apply(ElementVisitor &visitor, size_t patchIndex=0, boxSide side=boundary::none)
Generic assembly routine for volume or boundary integrals.
Definition: gsAssembler.h:668