@@ -42,9 +42,9 @@ Eigen::VectorXd SmoothCollision::dof(Eigen::ConstRef<Eigen::MatrixXd> X) const
4242
4343template <typename PrimitiveA, typename PrimitiveB>
4444auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::get_core_indices() const
45- -> Vector<int , N_CORE_DOFS>
45+ -> Eigen:: Vector<int , N_CORE_DOFS>
4646{
47- Vector<int , N_CORE_DOFS> core_indices;
47+ Eigen:: Vector<int , N_CORE_DOFS> core_indices;
4848 core_indices << Eigen::VectorXi::LinSpaced (
4949 N_CORE_DOFS_A, 0 , N_CORE_DOFS_A - 1 ),
5050 Eigen::VectorXi::LinSpaced (
@@ -61,7 +61,7 @@ SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::SmoothCollisionTemplate(
6161 const CollisionMesh& mesh,
6262 const SmoothContactParameters& params,
6363 const double _dhat,
64- const Eigen::MatrixXd& V)
64+ Eigen::ConstRef<Eigen:: MatrixXd> V)
6565 : SmoothCollision(_primitive0, _primitive1, _dhat, mesh)
6666{
6767 VectorMax3d d =
@@ -104,16 +104,16 @@ SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::SmoothCollisionTemplate(
104104
105105template <typename PrimitiveA, typename PrimitiveB>
106106double SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::operator ()(
107- Eigen::ConstRef<Vector <double , - 1 , ELEMENT_SIZE>> positions,
107+ Eigen::ConstRef<VectorMax <double , ELEMENT_SIZE>> positions,
108108 const SmoothContactParameters& params) const
109109{
110- Vector<double , N_CORE_POINTS * DIM> x;
110+ Eigen:: Vector<double , N_CORE_POINTS * DIM> x;
111111 x << positions.head (PrimitiveA::N_CORE_POINTS * DIM),
112112 positions.segment (
113113 primitive_a->n_dofs (), PrimitiveB::N_CORE_POINTS * DIM);
114114
115115 // grad of "d" wrt. points
116- const Vector<double , DIM> closest_direction =
116+ const Eigen:: Vector<double , DIM> closest_direction =
117117 PrimitiveDistanceTemplate<PrimitiveA, PrimitiveB, double >::
118118 compute_closest_direction (x, DTYPE::AUTO);
119119 const double dist = closest_direction.norm ();
@@ -143,19 +143,19 @@ double SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::operator()(
143143
144144template <typename PrimitiveA, typename PrimitiveB>
145145auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::gradient(
146- Eigen::ConstRef<Vector <double , - 1 , ELEMENT_SIZE>> positions,
146+ Eigen::ConstRef<VectorMax <double , ELEMENT_SIZE>> positions,
147147 const SmoothContactParameters& params) const
148- -> Vector <double , - 1 , ELEMENT_SIZE>
148+ -> VectorMax <double , ELEMENT_SIZE>
149149{
150150 const auto core_indices = get_core_indices ();
151151
152- Vector<double , N_CORE_DOFS> x;
152+ Eigen:: Vector<double , N_CORE_DOFS> x;
153153 x = positions (core_indices);
154154
155155 const auto dtype =
156156 PrimitiveDistance<PrimitiveA, PrimitiveB>::compute_distance_type (x);
157157
158- Vector<double , DIM> closest_direction;
158+ Eigen:: Vector<double , DIM> closest_direction;
159159 Eigen::Matrix<double , DIM, N_CORE_DOFS> closest_direction_grad;
160160 std::tie (closest_direction, closest_direction_grad) = PrimitiveDistance<
161161 PrimitiveA, PrimitiveB>::compute_closest_direction_gradient (x, dtype);
@@ -171,42 +171,45 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::gradient(
171171
172172 // gradient of barrier potential
173173 double barrier = 0 ;
174- Vector<double , N_CORE_DOFS> gBarrier = Vector<double , N_CORE_DOFS>::Zero ();
174+ Eigen::Vector<double , N_CORE_DOFS> gBarrier =
175+ Eigen::Vector<double , N_CORE_DOFS>::Zero ();
175176 {
176177 barrier = Math<double >::inv_barrier (dist / dhat (), params.r );
177178
178- const Vector<double , DIM> closest_direction_normalized =
179+ const Eigen:: Vector<double , DIM> closest_direction_normalized =
179180 closest_direction / dist;
180181 const double barrier_1st_deriv =
181182 Math<double >::inv_barrier_grad (dist / dhat (), params.r ) / dhat ();
182- const Vector<double , DIM> gBarrier_wrt_d =
183+ const Eigen:: Vector<double , DIM> gBarrier_wrt_d =
183184 barrier_1st_deriv * closest_direction_normalized;
184185 gBarrier = closest_direction_grad.transpose () * gBarrier_wrt_d ;
185186 }
186187
187188 // gradient of mollifier
188189 {
189190 double mollifier = 0 ;
190- Vector<double , N_CORE_DOFS> gMollifier =
191- Vector<double , N_CORE_DOFS>::Zero ();
191+ Eigen:: Vector<double , N_CORE_DOFS> gMollifier =
192+ Eigen:: Vector<double , N_CORE_DOFS>::Zero ();
192193#ifdef IPC_TOOLKIT_DEBUG_AUTODIFF
193194 ScalarBase::setVariableCount (N_CORE_DOFS);
194195 using T = ADGrad<N_CORE_DOFS>;
195- Vector<T, N_CORE_DOFS> xAD = slice_positions<T, N_CORE_DOFS, 1 >(x);
196- Vector<T, DIM> closest_direction_autodiff = PrimitiveDistanceTemplate<
197- PrimitiveA, PrimitiveB, T>::compute_closest_direction (xAD, dtype);
196+ Eigen::Vector<T, N_CORE_DOFS> xAD =
197+ slice_positions<T, N_CORE_DOFS, 1 >(x);
198+ Eigen::Vector<T, DIM> closest_direction_autodiff =
199+ PrimitiveDistanceTemplate<PrimitiveA, PrimitiveB, T>::
200+ compute_closest_direction (xAD, dtype);
198201 const auto dist_sqr_AD = closest_direction_autodiff.squaredNorm ();
199202 auto mollifier_autodiff =
200203 PrimitiveDistanceTemplate<PrimitiveA, PrimitiveB, T>::mollifier (
201204 xAD, dist_sqr_AD);
202205 mollifier = mollifier_autodiff.val ;
203206 gMollifier = mollifier_autodiff.grad ;
204207#else
205- Vector<double , N_CORE_DOFS + 1 > mollifier_grad;
208+ Eigen:: Vector<double , N_CORE_DOFS + 1 > mollifier_grad;
206209 std::tie (mollifier, mollifier_grad) = PrimitiveDistance<
207210 PrimitiveA, PrimitiveB>::compute_mollifier_gradient (x, dist * dist);
208211
209- const Vector<double , N_CORE_DOFS> dist_sqr_grad =
212+ const Eigen:: Vector<double , N_CORE_DOFS> dist_sqr_grad =
210213 2 * closest_direction_grad.transpose () * closest_direction;
211214 mollifier_grad.head (N_CORE_DOFS) +=
212215 mollifier_grad (N_CORE_DOFS) * dist_sqr_grad;
@@ -219,11 +222,11 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::gradient(
219222
220223 // grad of tangent/normal terms
221224 double orient = 0 ;
222- Vector <double , - 1 , ELEMENT_SIZE> gOrient ;
225+ VectorMax <double , ELEMENT_SIZE> gOrient ;
223226 {
224- Vector <double , - 1 , ELEMENT_SIZE>
225- gA = Vector <double , - 1 , ELEMENT_SIZE>::Zero (n_dofs ()),
226- gB = Vector <double , - 1 , ELEMENT_SIZE>::Zero (n_dofs ());
227+ VectorMax <double , ELEMENT_SIZE>
228+ gA = VectorMax <double , ELEMENT_SIZE>::Zero (n_dofs ()),
229+ gB = VectorMax <double , ELEMENT_SIZE>::Zero (n_dofs ());
227230 {
228231 gA (core_indices) =
229232 closest_direction_grad.transpose () * gA_reduced .head (DIM);
@@ -254,19 +257,19 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::gradient(
254257
255258template <typename PrimitiveA, typename PrimitiveB>
256259auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::hessian(
257- Eigen::ConstRef<Vector <double , - 1 , ELEMENT_SIZE>> positions,
260+ Eigen::ConstRef<VectorMax <double , ELEMENT_SIZE>> positions,
258261 const SmoothContactParameters& params) const
259262 -> MatrixMax<double , ELEMENT_SIZE, ELEMENT_SIZE>
260263{
261264 const auto core_indices = get_core_indices ();
262265
263- Vector<double , N_CORE_DOFS> x;
266+ Eigen:: Vector<double , N_CORE_DOFS> x;
264267 x = positions (core_indices);
265268
266269 const auto dtype =
267270 PrimitiveDistance<PrimitiveA, PrimitiveB>::compute_distance_type (x);
268271
269- Vector<double , DIM> closest_direction;
272+ Eigen:: Vector<double , DIM> closest_direction;
270273 Eigen::Matrix<double , DIM, N_CORE_DOFS> closest_direction_grad;
271274 std::array<Eigen::Matrix<double , N_CORE_DOFS, N_CORE_DOFS>, DIM>
272275 closest_direction_hess;
@@ -289,17 +292,18 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::hessian(
289292
290293 // hessian of barrier potential
291294 double barrier = 0 ;
292- Vector<double , N_CORE_DOFS> gBarrier = Vector<double , N_CORE_DOFS>::Zero ();
295+ Eigen::Vector<double , N_CORE_DOFS> gBarrier =
296+ Eigen::Vector<double , N_CORE_DOFS>::Zero ();
293297 Eigen::Matrix<double , N_CORE_DOFS, N_CORE_DOFS> hBarrier =
294298 Eigen::Matrix<double , N_CORE_DOFS, N_CORE_DOFS>::Zero ();
295299 {
296300 barrier = Math<double >::inv_barrier (dist / dhat (), params.r );
297301
298- const Vector<double , DIM> closest_direction_normalized =
302+ const Eigen:: Vector<double , DIM> closest_direction_normalized =
299303 closest_direction / dist;
300304 const double barrier_1st_deriv =
301305 Math<double >::inv_barrier_grad (dist / dhat (), params.r ) / dhat ();
302- const Vector<double , DIM> gBarrier_wrt_d =
306+ const Eigen:: Vector<double , DIM> gBarrier_wrt_d =
303307 barrier_1st_deriv * closest_direction_normalized;
304308 gBarrier = closest_direction_grad.transpose () * gBarrier_wrt_d ;
305309
@@ -322,16 +326,18 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::hessian(
322326 // hessian of mollifier
323327 {
324328 double mollifier = 0 ;
325- Vector<double , N_CORE_DOFS> gMollifier =
326- Vector<double , N_CORE_DOFS>::Zero ();
329+ Eigen:: Vector<double , N_CORE_DOFS> gMollifier =
330+ Eigen:: Vector<double , N_CORE_DOFS>::Zero ();
327331 Eigen::Matrix<double , N_CORE_DOFS, N_CORE_DOFS> hMollifier =
328332 Eigen::Matrix<double , N_CORE_DOFS, N_CORE_DOFS>::Zero ();
329333#ifdef IPC_TOOLKIT_DEBUG_AUTODIFF
330334 ScalarBase::setVariableCount (N_CORE_DOFS);
331335 using T = ADHessian<N_CORE_DOFS>;
332- Vector<T, N_CORE_DOFS> xAD = slice_positions<T, N_CORE_DOFS, 1 >(x);
333- Vector<T, DIM> closest_direction_autodiff = PrimitiveDistanceTemplate<
334- PrimitiveA, PrimitiveB, T>::compute_closest_direction (xAD, dtype);
336+ Eigen::Vector<T, N_CORE_DOFS> xAD =
337+ slice_positions<T, N_CORE_DOFS, 1 >(x);
338+ Eigen::Vector<T, DIM> closest_direction_autodiff =
339+ PrimitiveDistanceTemplate<PrimitiveA, PrimitiveB, T>::
340+ compute_closest_direction (xAD, dtype);
335341 const auto dist_sqr_AD = closest_direction_autodiff.squaredNorm ();
336342 auto mollifier_autodiff =
337343 PrimitiveDistanceTemplate<PrimitiveA, PrimitiveB, T>::mollifier (
@@ -341,12 +347,12 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::hessian(
341347 gMollifier = mollifier_autodiff.grad ;
342348 hMollifier = mollifier_autodiff.Hess ;
343349#else
344- Vector<double , N_CORE_DOFS + 1 > mollifier_grad;
350+ Eigen:: Vector<double , N_CORE_DOFS + 1 > mollifier_grad;
345351 Eigen::Matrix<double , N_CORE_DOFS + 1 , N_CORE_DOFS + 1 > mollifier_hess;
346352 std::tie (mollifier, mollifier_grad, mollifier_hess) = PrimitiveDistance<
347353 PrimitiveA, PrimitiveB>::compute_mollifier_hessian (x, dist * dist);
348354
349- const Vector<double , N_CORE_DOFS> dist_sqr_grad =
355+ const Eigen:: Vector<double , N_CORE_DOFS> dist_sqr_grad =
350356 2 * closest_direction_grad.transpose () * closest_direction;
351357 mollifier_grad.head (N_CORE_DOFS) +=
352358 mollifier_grad (N_CORE_DOFS) * dist_sqr_grad;
@@ -378,12 +384,12 @@ auto SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::hessian(
378384
379385 // grad of tangent/normal terms
380386 double orient = 0 ;
381- Vector <double , - 1 , ELEMENT_SIZE> gOrient ;
387+ VectorMax <double , ELEMENT_SIZE> gOrient ;
382388 MatrixMax<double , ELEMENT_SIZE, ELEMENT_SIZE> hOrient;
383389 {
384- Vector <double , - 1 , ELEMENT_SIZE>
385- gA = Vector <double , - 1 , ELEMENT_SIZE>::Zero (n_dofs ()),
386- gB = Vector <double , - 1 , ELEMENT_SIZE>::Zero (n_dofs ());
390+ VectorMax <double , ELEMENT_SIZE>
391+ gA = VectorMax <double , ELEMENT_SIZE>::Zero (n_dofs ()),
392+ gB = VectorMax <double , ELEMENT_SIZE>::Zero (n_dofs ());
387393 MatrixMax<double , ELEMENT_SIZE, ELEMENT_SIZE>
388394 hA = MatrixMax<double , ELEMENT_SIZE, ELEMENT_SIZE>::Zero (
389395 n_dofs (), n_dofs ()),
@@ -467,9 +473,9 @@ template <typename PrimitiveA, typename PrimitiveB>
467473double SmoothCollisionTemplate<PrimitiveA, PrimitiveB>::compute_distance(
468474 Eigen::ConstRef<Eigen::MatrixXd> vertices) const
469475{
470- Vector <double , - 1 , ELEMENT_SIZE> positions = dof (vertices);
476+ VectorMax <double , ELEMENT_SIZE> positions = dof (vertices);
471477
472- Vector<double , N_CORE_POINTS * DIM> x;
478+ Eigen:: Vector<double , N_CORE_POINTS * DIM> x;
473479 x << positions.head (PrimitiveA::N_CORE_POINTS * DIM),
474480 positions.segment (
475481 primitive_a->n_dofs (), PrimitiveB::N_CORE_POINTS * DIM);
0 commit comments