IgANet
IgANets - Isogeometric Analysis Networks
Loading...
Searching...
No Matches
GismoSurfaceReparameterization.hpp
Go to the documentation of this file.
1
15#pragma once
16
17#include <iganet.h>
18
19namespace iganet {
20
22template <typename T>
23inline void mobiusTransform(const gismo::gsAsConstVector<T> &c,
24 const gismo::gsVector<T, 2> &uv, gismo::gsVector<T, 2> &xieta,
25 gismo::gsMatrix<T, 2, 2> &jac) {
26 T s = uv(0), t = uv(1);
27 T alpha_1 = c(0), alpha_2 = c(1), beta_1 = c(2), beta_2 = c(3);
28
29 T alpha = alpha_1 * t + alpha_2 * (1 - t);
30 T beta = beta_1 * s + beta_2 * (1 - s);
31
32 T xi_denominator = 2 * alpha * s - s - alpha;
33 xieta(0) = (alpha - 1) * s / xi_denominator;
34 T eta_denominator = 2 * beta * t - t - beta;
35 xieta(1) = (beta - 1) * t / eta_denominator;
36
37 // jac = [dxids, dxidt; detads, detadt]
38 jac(0, 0) = (alpha - 1) * (xi_denominator - (2 * alpha - 1) * s) /
40 jac(0, 1) = (alpha_1 - alpha_2) * s *
41 (xi_denominator - (alpha - 1) * (2 * s - 1)) /
43 jac(1, 0) = (beta_1 - beta_2) * t *
44 (eta_denominator - (beta - 1) * (2 * t - 1)) /
46 jac(1, 1) = (beta - 1) * (eta_denominator - (2 * beta - 1) * t) /
48}
49
51 template <typename T> class gsObjFuncSurface : public gismo::gsOptProblem<T> {
52
53private:
54 typedef typename gismo::gsExprAssembler<T>::geometryMap geometryMap;
55 typedef typename gismo::gsExprAssembler<T>::space space;
56 typedef typename gismo::gsExprAssembler<T>::solution solution;
57
58public:
60 explicit gsObjFuncSurface(const gismo::gsMultiPatch<T> &patches,
61 const gismo::gsMobiusDomain<2, T> &mobiusDomain)
62 : m_mp(patches), m_MobiusDomain(mobiusDomain) {
64
65 gismo::gsMatrix<T> bbox;
66 m_mp.boundingBox(bbox);
67 m_mp.patch(0).translate(-bbox.col(0));
68 gismo::gsVector<T> scaleFactor = bbox.col(1) - bbox.col(0);
69 for (int i = 0; i != scaleFactor.size(); ++i) {
70 if (abs(scaleFactor(i)) < 1e-5)
71 scaleFactor(i) = (T)(1.0);
72 }
73 m_mp.patch(0).scale(1 / scaleFactor.array());
74
75 // const gismo::gsBasis<T> & tbasis = m_mp.basis(0); // basis(u,v) -> deriv will
76 // give dphi/du ,dphi/dv const gismo::gsGeometry<T> & tgeom = m_mp.patch(0);
77 // //G(u,v) -> deriv will give dG/du, dG/dv
78 // // The basis is composed by the square domain
79 // gismo::gsComposedBasis<T> cbasis(mobiusDomain, tbasis); // basis(u,v) =
80 // basis(sigma(xi,eta)) -> deriv will give dphi/dxi, dphi/deta
81 //
82 // gismo::gsMultiBasis<T> mbasis(cbasis);
83
84 gismo::gsComposedGeometry<T> cgeom(m_MobiusDomain, m_mp.patch(0));
85
86 gismo::gsMultiBasis<T> dbasis(cgeom.basis());
87 // m_assembler.setIntegrationElements(dbasis);
88 m_evaluator.setIntegrationElements(dbasis);
89
90 // Set the geometry map
91 geometryMap G = m_evaluator.getMap(cgeom);
92 m_area = m_evaluator.integral(meas(G));
93
94 // m_evaluator.setIntegrationElements( mbasis );
95 // geometryMap G = m_evaluator.getMap( );
96 // gismo::gsDebugVar( m_evaluator.integral(meas(G)) );
97 }
98
100 T evalObj(const gismo::gsAsConstVector<T> &coefsM) const override {
101
102 m_MobiusDomain.updateGeom(coefsM);
103
104 // gismo::gsComposedGeometry<real_t> cgeom(mobiusDomain, tgeom); // G(u,v) =
105 // G(sigma(xi,eta)) -> deriv will give dG/dxi, dG/deta
106 gismo::gsComposedGeometry<> cgeom(m_MobiusDomain, m_mp.patch(0));
107
108 gismo::gsMultiBasis<> dbasis(cgeom.basis());
109 // m_assembler.setIntegrationElements(dbasis);
110 m_evaluator.setIntegrationElements(dbasis);
111
112 // Set the geometry map
113 geometryMap G = m_evaluator.getMap(cgeom);
114 auto FFF = gismo::expr::jac(G).tr() * gismo::expr::jac(G);
115
116 gismo::gsVector<> pt(2);
117 pt.setConstant(0.5);
118
119 auto m_integration = (FFF.trace() / gismo::expr::meas(G)).val() +
120 pow(FFF.det().val(), 2) / pow(m_area, 2);
121 // auto m_integration = (FFF.trace() / meas(G)).val() + 1e-4 *
122 // FFF.det().val(); auto m_integration = pow(FFF.det().val(), 2); T val =
123 // m_evaluator.integral(m_integration);
124
125 // gismo::gsMatrix<T> uv;
126 // getSamplingPts(51, m_mp, uv);
130 // T val1 = 0;
131 // for (int i = 0; i < uv.cols(); ++i) {
132 // val1 += m_evaluator.eval(m_integration, uv.col(i)).value();
133 // }
135 // // T val = val1.sum()/51;
136 // T val = val1/51/51;
137
138 // gismo::gsDebugVar(val);
139
140 // m_evaluator.integral(meas(G));
141 // T val = 0;
142 //
143 // gismo::gsMatrix<T> uv;
144 // getSamplingPts(51, m_mp, uv);
145 //
146 // gismo::gsVector<T,2> tempUV, xieta;
147 // gismo::gsMatrix<T,2,2> jacUV, jac2;
148 // gismo::gsMatrix<T,2,3> jacXIETA, jac;
149 // for (auto ipt=0; ipt != uv.cols(); ++ipt) {
150 // // map sigma
151 // tempUV = uv.col(ipt);
152 // mobiusTransform(coefsM, tempUV, xieta, jacUV);
153 //
154 // // map surface
155 // auto basisDerivs =
156 // m_mp.basis(0).collocationMatrixWithDeriv(m_mp.basis(0), xieta);
157 //
158 // jacXIETA.row(0) = basisDerivs[1] * m_mp.patch(0).coefs();
159 // jacXIETA.row(1) = basisDerivs[2] * m_mp.patch(0).coefs();
160 //
161 // jac = jacUV.transpose() * jacXIETA;
162 // jac2 = jac * jac.transpose();
163 //
164 // // TODO: fix this balance parameter 1e-2
165 // T detJac = jac2.determinant();
166 // val += (jac2.trace())/(sqrt(jac2.determinant())+1e-8) + 1e-4*detJac;
167 // }
168 // val /= uv.cols();
169
170 return m_evaluator.integral(m_integration);
171 }
172
174 void gradObj_into(const gismo::gsAsConstVector<T> &u,
175 gismo::gsAsVector<T> &result) const override {
176
177 const std::size_t n = u.rows();
178 // GISMO_ASSERT((index_t)m_numDesignVars == n*m, "Wrong design.");
179
180 gismo::gsMatrix<T> uu = u; // copy
181 gismo::gsAsVector<T> tmp(uu.data(), n);
182 gismo::gsAsConstVector<T> ctmp(uu.data(), n);
183 std::size_t c = 0;
184
185 // const T e0 = this->evalObj(ctmp);
186 // for all partial derivatives (column-wise)
187 for (std::size_t i = 0; i != n; i++) {
188 tmp[i] += T(1e-6);
189 const T e1 = this->evalObj(ctmp);
190 tmp[i] = u[i] - T(1e-6);
191 const T e2 = this->evalObj(ctmp);
192 tmp[i] = u[i];
193 result[c++] = ((e1 - e2)) / T(2e-6);
194 }
195 }
196
198 void setEps(T tol) { m_eps = tol; }
199
201 gismo::gsOptionList &options() { return m_options; }
202
205 // @Ye, make this reasonable default options
206 m_options.addReal("qi_lambda1", "Sets the lambda 1 value", 1.0);
207 m_options.addReal("qi_lambda2", "Sets the lambda 2 value", 1.0);
208 }
209
211 void addOptions(const gismo::gsOptionList &options) {
212 m_options.update(options, gismo::gsOptionList::addIfUnknown);
213 }
214
216 void applyOptions(const gismo::gsOptionList &options) {
217 m_options.update(options, gismo::gsOptionList::addIfUnknown);
218 m_lambda1 = m_options.getReal("qi_lambda1");
219 m_lambda2 = m_options.getReal("qi_lambda2");
220 m_evaluator.options().update(m_options, gismo::gsOptionList::addIfUnknown);
221 }
222
223protected:
224 const gismo::gsMultiPatch<T> m_mp;
225 const gismo::gsDofMapper m_mapper;
226 const gismo::gsMultiBasis<T> m_mb;
227
228 mutable gismo::gsExprEvaluator<T> m_evaluator;
229 mutable gismo::gsExprAssembler<T> m_assembler;
230
231 gismo::gsOptionList m_options;
232
233 T m_lambda1 = 1.0, m_lambda2 = 1.0, m_eps = 1e-3;
234 T m_area = 1;
235
236 gismo::gsComposedGeometry<T> m_cgeom;
237 mutable gismo::gsMobiusDomain<2, T> m_MobiusDomain;
238};
239
241template <typename T>
242gismo::gsMultiPatch<T> convertIntoBSpline(const gismo::gsMultiPatch<T> &mp,
243 const gismo::gsMatrix<T> &coefsMobiusIn) {
244 gismo::gsMultiPatch<T> result;
245
246 for (int ipatch = 0; ipatch < mp.nPatches(); ++ipatch) {
247
248 gismo::gsMatrix<T> uv =
249 gismo::gsPointGrid(mp.parameterRange(0), mp.patch(ipatch).basis().size() * 4);
250
251 gismo::gsVector<T, 2> tempUV, xieta;
252 gismo::gsMatrix<T> eval_geo;
253 eval_geo.resize(3, uv.cols());
254 gismo::gsMatrix<T, 2, 2> jacUV;
255
256 gismo::gsAsConstVector<T> coefsMobius(coefsMobiusIn.data(), 4);
257
258 for (size_t ipt = 0; ipt != uv.cols(); ++ipt) {
259 // map sigma
260 tempUV = uv.col(ipt);
262
263 // map surface
264 eval_geo.col(ipt) = mp.patch(ipatch).eval(xieta);
265 }
266
267 gismo::gsTensorBSplineBasis<2, T> bbasis =
268 static_cast<gismo::gsTensorBSplineBasis<2, T> &>(mp.patch(ipatch).basis());
269 gismo::gsFitting<> fittingSurface(uv, eval_geo, bbasis);
270 fittingSurface.compute();
271 // fittingSurface.parameterCorrection();
272
273 result.addPatch(*fittingSurface.result());
274 }
275
276 result.computeTopology();
277
278 return result;
279}
280
281} // namespace iganet
Objective function for surface reparameterization.
Definition GismoSurfaceReparameterization.hpp:51
void defaultOptions()
Sets the default options.
Definition GismoSurfaceReparameterization.hpp:204
gismo::gsOptionList & options()
Returns a reference to the option list.
Definition GismoSurfaceReparameterization.hpp:201
gismo::gsOptionList m_options
Definition GismoSurfaceReparameterization.hpp:231
T m_eps
Definition GismoSurfaceReparameterization.hpp:233
const gismo::gsDofMapper m_mapper
Definition GismoSurfaceReparameterization.hpp:225
gismo::gsExprAssembler< T >::space space
Definition GismoSurfaceReparameterization.hpp:55
T m_lambda2
Definition GismoSurfaceReparameterization.hpp:233
void setEps(T tol)
Sets the tolerance.
Definition GismoSurfaceReparameterization.hpp:198
gsObjFuncSurface(const gismo::gsMultiPatch< T > &patches, const gismo::gsMobiusDomain< 2, T > &mobiusDomain)
Constructor.
Definition GismoSurfaceReparameterization.hpp:60
void applyOptions(const gismo::gsOptionList &options)
Applies an option list.
Definition GismoSurfaceReparameterization.hpp:216
T m_area
Definition GismoSurfaceReparameterization.hpp:234
T evalObj(const gismo::gsAsConstVector< T > &coefsM) const override
Evaluates the objective function.
Definition GismoSurfaceReparameterization.hpp:100
gismo::gsExprAssembler< T > m_assembler
Definition GismoSurfaceReparameterization.hpp:229
void gradObj_into(const gismo::gsAsConstVector< T > &u, gismo::gsAsVector< T > &result) const override
Evaluates the gradient of the objective function.
Definition GismoSurfaceReparameterization.hpp:174
gismo::gsExprAssembler< T >::solution solution
Definition GismoSurfaceReparameterization.hpp:56
gismo::gsMobiusDomain< 2, T > m_MobiusDomain
Definition GismoSurfaceReparameterization.hpp:237
T m_lambda1
Definition GismoSurfaceReparameterization.hpp:233
const gismo::gsMultiPatch< T > m_mp
Definition GismoSurfaceReparameterization.hpp:224
gismo::gsComposedGeometry< T > m_cgeom
Definition GismoSurfaceReparameterization.hpp:236
gismo::gsExprAssembler< T >::geometryMap geometryMap
Definition GismoSurfaceReparameterization.hpp:54
gismo::gsExprEvaluator< T > m_evaluator
Definition GismoSurfaceReparameterization.hpp:228
void addOptions(const gismo::gsOptionList &options)
Adds an option to the option list.
Definition GismoSurfaceReparameterization.hpp:211
const gismo::gsMultiBasis< T > m_mb
Definition GismoSurfaceReparameterization.hpp:226
Isogeometric analysis network main header file.
Definition boundary.hpp:22
gismo::gsMultiPatch< T > convertIntoBSpline(const gismo::gsMultiPatch< T > &mp, const gismo::gsMatrix< T > &coefsMobiusIn)
Converts a matrix of coefficients into a multi-patch B-spline object.
Definition GismoSurfaceReparameterization.hpp:242
constexpr bool is_SplineType_v
Alias to the value of is_SplineType.
Definition bspline.hpp:3243
void mobiusTransform(const gismo::gsAsConstVector< T > &c, const gismo::gsVector< T, 2 > &uv, gismo::gsVector< T, 2 > &xieta, gismo::gsMatrix< T, 2, 2 > &jac)
Computes the Mobius transformation.
Definition GismoSurfaceReparameterization.hpp:23