16 #include <gsUnstructuredSplines/src/gsC1SurfGluingData.h>
17 #include <gsUnstructuredSplines/src/gsC1SurfVisitorBasisEdge.h>
21 template<
class T,
class bhVisitor = gsC1SurfVisitorBasisEdge<T>>
32 gsC1SurfGluingData<T> gluingD)
33 : m_mp(mp), m_basis(basis), m_uv(uv), m_isBoundary(isBoundary), m_gD(gluingD)
40 basis_plus.elevateContinuity(1);
41 m_basis_plus = basis_plus;
46 basis_minus.degreeReduce(1);
47 m_basis_minus = basis_minus;
51 m_basis_g1 = m_basis.basis(0);
62 void assemble(
index_t i, std::string typeBf);
63 inline void apply(bhVisitor & visitor,
index_t i, std::string typeBf);
86 gsC1SurfGluingData<T> m_gD;
105 template <
class T,
class bhVisitor>
106 void gsC1SurfBasisEdge<T,bhVisitor>::setG1BasisEdge(
gsMultiPatch<T> & result)
110 index_t n_plus = m_basis_plus.size();
111 index_t n_minus = m_basis_minus.size();
116 for (
index_t bfID = bfID_init; bfID < n_plus - bfID_init; bfID++)
122 assemble(bfID,
"plus");
124 typename gsSparseSolver<T>::SimplicialLDLT solver;
127 solver.compute(m_system.matrix());
128 sol = solver.solve(m_system.rhs());
130 constructSolution(sol,g1EdgeBasis);
133 for (
index_t bfID = bfID_init; bfID < n_minus-bfID_init; bfID++)
141 assemble(bfID,
"minus");
143 typename gsSparseSolver<T>::SimplicialLDLT solver;
146 solver.compute(m_system.matrix());
147 sol = solver.solve(m_system.rhs());
149 constructSolution(sol,g1EdgeBasis);
152 result = g1EdgeBasis;
155 template <
class T,
class bhVisitor>
161 const index_t dim = ( 0!=solVector.cols() ? solVector.cols() : m_ddof[0].cols() );
164 const gsDofMapper & mapper = m_system.colMapper(0);
168 sz = m_basis.basis(0).size();
170 coeffs.resize(sz, dim);
172 for (
index_t i = 0; i < sz; ++i)
176 coeffs.row(i) = solVector.row(mapper.
index(i, 0));
181 coeffs.row(i) = m_ddof[0].row( mapper.
bindex(i, 0) ).head(dim);
184 result.
addPatch(m_basis_g1.basis(0).makeGeometry(
give(coeffs)));
188 template <
class T,
class bhVisitor>
189 void gsC1SurfBasisEdge<T,bhVisitor>::refresh()
196 for (
index_t i = 2; i < m_basis.basis(0).component(1-m_uv).size(); i++)
198 act = m_basis.basis(0).boundaryOffset(m_uv == 0 ? 3 : 1, i);
199 map.markBoundary(0, act);
209 template <
class T,
class bhVisitor>
210 void gsC1SurfBasisEdge<T,bhVisitor>::assemble(
index_t bfID, std::string typeBf)
213 const index_t nz = gsAssemblerOptions::numColNz(m_basis[0],2,1,0.333333);
214 m_system.reserve(nz, 1);
225 apply(visitor, bfID, typeBf);
227 m_system.matrix().makeCompressed();
231 template <
class T,
class bhVisitor>
232 void gsC1SurfBasisEdge<T,bhVisitor>::apply(bhVisitor & visitor,
index_t bf_index, std::string typeBf)
245 const int tid = omp_get_thread_num();
246 const int nt = omp_get_num_threads();
259 visitor_.initialize(basis_g1, quRule);
264 typename gsBasis<T>::domainIter domIt = m_geo.basis(0).makeDomainIterator(boundary::none);
267 for ( domIt->next(tid); domIt->good(); domIt->next(nt) )
269 for (; domIt->good(); domIt->next() )
273 quRule.
mapTo( domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights );
276 visitor_.evaluate(bf_index, typeBf, basis_g1, basis_geo, basis_plus, basis_minus, patch, quNodes, m_uv, m_gD, m_isBoundary);
279 visitor_.assemble(*domIt, quWeights);
282 #pragma omp critical(localToGlobal)
283 visitor_.localToGlobal(0, m_ddof, m_system);
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
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
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
gsSparseSystem< T > m_system
Global sparse linear system.
Definition: gsAssembler.h:290
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
std::vector< gsMatrix< T > > m_ddof
Definition: gsAssembler.h:295
#define GISMO_UNUSED(x)
Definition: gsDebug.h:112
The assembler class provides generic routines for volume and boundary integrals that are used for for...
Definition: gsAssembler.h:265
virtual void constructSolution(const gsMatrix< T > &solVector, gsMultiPatch< T > &result, const gsVector< index_t > &unknowns) const
Construct solution from computed solution vector for a set of unknowns. The result is a vectorfield...
Definition: gsAssembler.hpp:584
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