20 #include <gsUnstructuredSplines/src/gsApproxC1GluingData.h>
24 template<
short_t d,
class T>
25 void gsApproxC1Edge<d,T>::compute(std::vector<patchSide> & sidesContainer) {
28 gsApproxC1GluingData<d, T> approxGluingData(m_auxPatches, m_optionList, sidesContainer);
32 if (sidesContainer.size() == 2) {
33 if (m_auxPatches[0].getBasisRotated().piece(0).component(1).numElements() >
34 m_auxPatches[1].getBasisRotated().piece(0).component(0).numElements()) {
52 basisEdgeResult.clear();
53 for (
size_t patchID = 0; patchID < sidesContainer.size(); patchID++)
57 index_t dir = patchID == 0 ? 1 : 0;
61 gsMultiBasis<T> initSpace(m_auxPatches[patchID].getBasisRotated().piece(0));
62 createPlusSpace(m_auxPatches[patch].getPatchRotated(), basis, dir_pm, basis_plus);
63 createMinusSpace(m_auxPatches[patch].getPatchRotated(), basis, dir_pm, basis_minus);
69 if (sidesContainer.size() == 2)
72 beta = approxGluingData.betaS(dir);
73 alpha = approxGluingData.alphaS(dir);
77 typename gsSparseSolver<T>::SimplicialLDLT solver;
82 m_auxPatches[patchID].getBasisRotated().piece(sidesContainer[patchID]));
84 A.setIntegrationElements(edgeSpace);
88 auto u = A.getSpace(edgeSpace);
92 if (!m_optionList.getSwitch(
"interpolation"))
95 for (
index_t i = 2; i < edgeSpace[0].component(1 - dir).size();
98 act = edgeSpace[0].boundaryOffset(dir == 0 ? 3 : 1, i);
99 map.markBoundary(0, act);
106 fixedDofs.setZero(u.mapper().boundarySize(), 1);
109 A.assemble(u * u.tr());
110 solver.compute(A.matrix());
118 for (
index_t bfID = bfID_init; bfID < n_plus - bfID_init; bfID++)
120 gsTraceBasis<T> traceBasis(geo, beta, basis_plus, initSpace.
basis(0), bdy, bfID, dir);
122 if (m_optionList.getSwitch(
"interpolation"))
126 gsMatrix<T> anchors = edgeSpace.basis(0).anchors();
128 result.
addPatch(edgeSpace.basis(0).interpolateAtAnchors(
give(values)));
134 auto aa = A.getCoeff(traceBasis);
140 auto u_sol = A.getSolution(u, solVector);
144 result.
addPatch(edgeSpace.basis(0).makeGeometry(
give(sol)));
149 for (
index_t bfID = bfID_init; bfID < n_minus - bfID_init; bfID++)
151 gsNormalDerivBasis<T> normalDerivBasis(geo, alpha, basis_minus, initSpace.
basis(0), bdy, bfID,
153 if (m_optionList.getSwitch(
"interpolation"))
157 gsMatrix<T> anchors = edgeSpace.basis(0).anchors();
158 gsMatrix<T> values = normalDerivBasis.eval(anchors);
159 result.
addPatch(edgeSpace.basis(0).interpolateAtAnchors(
give(values)));
165 auto aa = A.getCoeff(normalDerivBasis);
171 auto u_sol = A.getSolution(u, solVector);
175 result.
addPatch(edgeSpace.basis(0).makeGeometry(
give(sol)));
180 m_auxPatches[patchID].parametrizeBasisBack(result);
182 basisEdgeResult.push_back(result);
187 template<
short_t d,
class T>
188 void gsApproxC1Edge<d,T>::computeAuxTopology()
190 for(
size_t i = 0; i < m_auxPatches.size(); i++)
192 if(m_auxPatches[i].getPatchRotated().orientation() == -1)
193 m_auxPatches[i].swapAxis();
198 template<
short_t d,
class T>
199 void gsApproxC1Edge<d,T>::reparametrizeInterfacePatches(std::vector<patchSide> & sidesContainer)
201 computeAuxTopology();
210 switch (sidesContainer[0].side().index())
214 case 4: m_auxPatches[0].rotateParamClock();
216 case 3: m_auxPatches[0].rotateParamAntiClock();
218 case 2: m_auxPatches[0].rotateParamAntiClockTwice();
225 switch (sidesContainer[1].side().index())
229 case 4: m_auxPatches[1].rotateParamAntiClockTwice();
231 case 2: m_auxPatches[1].rotateParamAntiClock();
233 case 1: m_auxPatches[1].rotateParamClock();
241 template<
short_t d,
class T>
242 void gsApproxC1Edge<d,T>::reparametrizeSinglePatch(
index_t side)
244 computeAuxTopology();
246 if(m_auxPatches[0].getOrient())
253 m_auxPatches[0].rotateParamClock();
256 m_auxPatches[0].rotateParamAntiClockTwice();
259 m_auxPatches[0].rotateParamAntiClock();
270 m_auxPatches[0].rotateParamClock();
273 m_auxPatches[0].rotateParamAntiClockTwice();
276 m_auxPatches[0].rotateParamAntiClock();
index_t size() const
size
Definition: gsBSplineBasis.h:165
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
Definition: gsExprAssembler.h:30
S give(S &x)
Definition: gsMemory.h:266
#define index_t
Definition: gsConfig.h:32
A tensor product B-spline basis.
Definition: gsTensorBSplineBasis.h:36
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition: gsDofMapper.h:68
A B-spline function of one argument, with arbitrary target dimension.
Definition: gsBSpline.h:50
A univariate B-spline basis.
Definition: gsBSplineBasis.h:694
Holds a set of patch-wise bases and their topology information.
Definition: gsMultiBasis.h:36
Creates the (approx) C1 Edge space.
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
Definition: gsDirichletValues.h:23
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition: gsMultiPatch.h:33
Generic evaluator of isogeometric expressions.
Definition: gsExprEvaluator.h:38