@@ -129,17 +129,14 @@ namespace eval
129129 return jac.determinant ();
130130 }
131131
132- Eigen::VectorXd paramToSpatialGradDeterminant ( const SplineSpaceEvaluator& geom_evals , const Eigen::MatrixXd& cpts )
132+ Eigen::VectorXd gradDeterminant ( const Eigen::MatrixXd& J , const Eigen::MatrixXd& H, const size_t param_dim, const size_t spatial_dim )
133133 {
134- const Eigen::MatrixXd J = geom_evals.evaluateParamToSpatialJacobian ( cpts );
135- const Eigen::MatrixXd H = geom_evals.evaluateParamToSpatialHessian ( cpts );
136-
137- if ( geom_evals.splineSpace ().basisComplex ().parametricAtlas ().cmap ().dim () == 2 and cpts.rows () == 2 )
134+ if ( param_dim == 2 and spatial_dim == 2 )
138135 {
139136 return Eigen::Vector2d ( H ( 0 , 0 ) * J ( 1 , 1 ) + J ( 0 , 0 ) * H ( 1 , 1 ) - H ( 1 , 0 ) * J ( 0 , 1 ) - J ( 1 , 0 ) * H ( 0 , 1 ),
140137 H ( 0 , 1 ) * J ( 1 , 1 ) + J ( 0 , 0 ) * H ( 1 , 2 ) - H ( 1 , 1 ) * J ( 0 , 1 ) - J ( 1 , 0 ) * H ( 0 , 2 ) );
141138 }
142- else if ( geom_evals. splineSpace (). basisComplex (). parametricAtlas (). cmap (). dim () == 3 )
139+ else if ( param_dim == 3 )
143140 {
144141 const double & x_s = J (0 ,0 ), x_t = J (0 ,1 ), x_u = J (0 ,2 );
145142 const double & y_s = J (1 ,0 ), y_t = J (1 ,1 ), y_u = J (1 ,2 );
@@ -179,6 +176,14 @@ namespace eval
179176 }
180177 }
181178
179+ Eigen::VectorXd parentToSpatialGradDeterminant ( const SplineSpaceEvaluator& geom_evals, const Eigen::MatrixXd& cpts )
180+ {
181+ return gradDeterminant ( geom_evals.evaluateJacobian ( cpts ),
182+ geom_evals.evaluateHessian ( cpts ),
183+ geom_evals.splineSpace ().basisComplex ().parametricAtlas ().cmap ().dim (),
184+ cpts.rows () );
185+ }
186+
182187 Eigen::MatrixXd piolaTransformedH1FirstDerivatives ( const SplineSpaceEvaluator& scalar_evals,
183188 const SplineSpaceEvaluator& geom_evals,
184189 const Eigen::MatrixXd& cpts )
@@ -192,7 +197,7 @@ namespace eval
192197 const SplineSpaceEvaluator& geom_evals,
193198 const Eigen::MatrixXd& cpts )
194199 {
195- const Eigen::MatrixXd jac_inverse = geom_evals.evaluateParamToSpatialJacobian ( cpts ).inverse ();
200+ const Eigen::MatrixXd jac_inverse = geom_evals.evaluateJacobian ( cpts ).inverse ();
196201 return vec_evals.evaluateBasis () * jac_inverse;
197202 }
198203
@@ -210,11 +215,11 @@ namespace eval
210215 const size_t param_dim = geom_evals.splineSpace ().basisComplex ().parametricAtlas ().cmap ().dim ();
211216 const size_t spatial_dim = cpts.rows ();
212217 const size_t n_funcs = vector_basis.cols ();
213- const Eigen::MatrixXd jac = geom_evals.evaluateParamToSpatialJacobian ( cpts );
218+ const Eigen::MatrixXd jac = geom_evals.evaluateJacobian ( cpts );
214219 const auto inverse_transpose_jacobian = jac.inverse ().transpose ();
215220
216221 const auto modified_hessian = [&geom_evals, &cpts, ¶m_dim, &spatial_dim]() {
217- const Eigen::MatrixXd hess = geom_evals.evaluateParamToSpatialHessian ( cpts );
222+ const Eigen::MatrixXd hess = geom_evals.evaluateHessian ( cpts );
218223 Eigen::MatrixXd out ( spatial_dim * param_dim, param_dim );
219224 if ( param_dim == 2 )
220225 // FIXME: Make this work for 3d spatial/2d manifold
@@ -249,8 +254,7 @@ namespace eval
249254 }();
250255
251256 return ( ( inverse_transpose_jacobian *
252- vec_evals.evaluateFirstDerivativesFromParamToSpatial ().transpose ().reshaped ( param_dim,
253- n_funcs * param_dim ) )
257+ vec_evals.evaluateFirstDerivatives ().transpose ().reshaped ( param_dim, n_funcs * param_dim ) )
254258 .reshaped ( spatial_dim * param_dim, n_funcs ) +
255259 second_term )
256260 .transpose () *
@@ -261,7 +265,7 @@ namespace eval
261265 const SplineSpaceEvaluator& geom_evals,
262266 const Eigen::MatrixXd& cpts )
263267 {
264- const auto jac = geom_evals.evaluateParamToSpatialJacobian ( cpts );
268+ const auto jac = geom_evals.evaluateJacobian ( cpts );
265269 const double det = determinant ( jac );
266270 return 1.0 / det * vec_evals.evaluateBasis () * jac.transpose ();
267271 }
@@ -270,7 +274,7 @@ namespace eval
270274 const SplineSpaceEvaluator& geom_evals,
271275 const Eigen::MatrixXd& cpts )
272276 {
273- const Eigen::MatrixXd jac = geom_evals.evaluateParamToSpatialJacobian ( cpts );
277+ const Eigen::MatrixXd jac = geom_evals.evaluateJacobian ( cpts );
274278 const double det_inverse = 1.0 / determinant ( jac );
275279 const Eigen::MatrixXd vector_basis = vec_evals.evaluateBasis ().transpose ();
276280 const size_t n_funcs = vector_basis.cols ();
@@ -282,11 +286,11 @@ namespace eval
282286
283287 const Eigen::MatrixXd first_term =
284288 -det_inverse * det_inverse *
285- ( ( jac * vector_basis ).reshaped () * paramToSpatialGradDeterminant ( geom_evals, cpts ).transpose () )
289+ ( ( jac * vector_basis ).reshaped () * parentToSpatialGradDeterminant ( geom_evals, cpts ).transpose () )
286290 .reshaped ( spatial_dim * param_dim, n_funcs );
287291
288292 const auto modified_hessian = [&geom_evals, &cpts, ¶m_dim, &spatial_dim]() {
289- const Eigen::MatrixXd hess = geom_evals.evaluateParamToSpatialHessian ( cpts );
293+ const Eigen::MatrixXd hess = geom_evals.evaluateHessian ( cpts );
290294 Eigen::MatrixXd out ( spatial_dim * param_dim, param_dim );
291295 if ( param_dim == 2 )
292296 // FIXME: Make this work for 3d spatial/2d manifold
@@ -312,7 +316,7 @@ namespace eval
312316 const Eigen::MatrixXd second_term = det_inverse * modified_hessian () * vector_basis;
313317
314318 const Eigen::MatrixXd third_term =
315- ( det_inverse * jac * vec_evals.evaluateFirstDerivativesFromParamToSpatial ().transpose ().reshaped ( param_dim, n_funcs * param_dim ) )
319+ ( det_inverse * jac * vec_evals.evaluateFirstDerivatives ().transpose ().reshaped ( param_dim, n_funcs * param_dim ) )
316320 .reshaped ( spatial_dim * param_dim, n_funcs );
317321
318322 return ( first_term + second_term + third_term ).transpose () *
@@ -323,17 +327,17 @@ namespace eval
323327 const SplineSpaceEvaluator& geom_evals,
324328 const Eigen::MatrixXd& cpts )
325329 {
326- return 1.0 / determinant ( geom_evals.evaluateParamToSpatialJacobian ( cpts ) ) * bivec_evals.evaluateBasis ();
330+ return 1.0 / determinant ( geom_evals.evaluateJacobian ( cpts ) ) * bivec_evals.evaluateBasis ();
327331 }
328332 Eigen::MatrixXd piolaTransformedL2FirstDerivatives ( const SplineSpaceEvaluator& bivec_evals,
329333 const SplineSpaceEvaluator& geom_evals,
330334 const Eigen::MatrixXd& cpts )
331335 {
332- const auto jac = geom_evals.evaluateParamToSpatialJacobian ( cpts );
336+ const auto jac = geom_evals.evaluateJacobian ( cpts );
333337 const double det_inverse = 1.0 / determinant ( jac );
334338 const auto jac_inverse_transpose = jac.inverse ().transpose ();
335- return ( det_inverse * jac_inverse_transpose * bivec_evals.evaluateFirstDerivativesFromParamToSpatial ().transpose () -
336- det_inverse * det_inverse * jac_inverse_transpose * paramToSpatialGradDeterminant ( geom_evals, cpts ) *
339+ return ( det_inverse * jac_inverse_transpose * bivec_evals.evaluateFirstDerivatives ().transpose () -
340+ det_inverse * det_inverse * jac_inverse_transpose * parentToSpatialGradDeterminant ( geom_evals, cpts ) *
337341 bivec_evals.evaluateBasis ().transpose () )
338342 .transpose () * jac.inverse (); // transform from ds denominator to dx
339343 }
@@ -470,4 +474,4 @@ namespace eval
470474 {
471475 throw std::runtime_error ( " evaluateFirstDerivativesFromParamToSpatial not implemented for NURBSSpaceEvaluator" );
472476 }
473- }
477+ }
0 commit comments