2121******************************************************************************/
2222#pragma once
2323#include < sofa/component/solidmechanics/fem/elastic/ElementCorotationalFEMForceField.h>
24- #include < sofa/type/VecView.h>
2524#include < sofa/component/solidmechanics/fem/elastic/impl/VectorTools.h>
2625#include < sofa/core/behavior/BaseLocalForceFieldMatrix.h>
2726
@@ -84,6 +83,7 @@ void ElementCorotationalFEMForceField<DataTypes, ElementType>::computeElementsFo
8483 const sofa::simulation::Range<std::size_t >& range, const sofa::core::MechanicalParams* mparams,
8584 sofa::type::vector<ElementGradient>& elementForces, const sofa::VecCoord_t<DataTypes>& nodePositions)
8685{
86+ static constexpr auto DIM = trait::spatial_dimensions;
8787 const auto & elements = trait::FiniteElement::getElementSequence (*this ->l_topology );
8888 auto restPositionAccessor = this ->mstate ->readRestPositions ();
8989 auto elementStiffness = sofa::helper::getReadAccessor (this ->d_elementStiffness );
@@ -108,19 +108,20 @@ void ElementCorotationalFEMForceField<DataTypes, ElementType>::computeElementsFo
108108 typename trait::ElementDisplacement displacement (sofa::type::NOINIT );
109109 for (sofa::Size j = 0 ; j < trait::NumberOfNodesInElement; ++j)
110110 {
111- sofa::type::VecView<trait::spatial_dimensions, sofa::Real_t<DataTypes>> transformedDisplacement ( displacement, j * trait::spatial_dimensions);
112- transformedDisplacement = elementRotation.multTranspose (elementNodesCoordinates[j] - t) - (restElementNodesCoordinates[j] - t0);
111+ displacement. setsub ( j * DIM ,
112+ elementRotation.multTranspose (elementNodesCoordinates[j] - t) - (restElementNodesCoordinates[j] - t0) );
113113 }
114114
115115 const auto & stiffnessMatrix = elementStiffness[elementId];
116116
117117 auto & elementForce = elementForces[elementId];
118118 elementForce = stiffnessMatrix * displacement;
119119
120- for (sofa::Size i = 0 ; i < trait::NumberOfNodesInElement; ++i)
120+ sofa::type::Vec<DIM , sofa::Real_t<DataTypes>> nodeForce { sofa::type::NOINIT };
121+ for (sofa::Size n = 0 ; n < trait::NumberOfNodesInElement; ++n)
121122 {
122- sofa::type::VecView<trait::spatial_dimensions, sofa::Real_t<DataTypes>> nodeForce ( elementForce, i * trait::spatial_dimensions );
123- nodeForce = elementRotation * nodeForce;
123+ elementForce. getsub (n * DIM , nodeForce );
124+ elementForce. setsub (n * DIM , elementRotation * nodeForce) ;
124125 }
125126 }
126127}
@@ -146,19 +147,19 @@ void ElementCorotationalFEMForceField<DataTypes, ElementType>::computeElementsFo
146147
147148 for (sofa::Size n = 0 ; n < trait::NumberOfNodesInElement; ++n)
148149 {
149- sofa::type::VecView<trait::spatial_dimensions, sofa::Real_t<DataTypes>> rotated_dx (element_dx, n * trait::spatial_dimensions);
150- rotated_dx = elementRotation.multTranspose (nodeDx[element[n]]);
150+ element_dx.setsub (n * trait::spatial_dimensions, elementRotation.multTranspose (nodeDx[element[n]]));
151151 }
152152
153153 const auto & stiffnessMatrix = elementStiffness[elementId];
154154
155155 auto & df = elementForcesDeriv[elementId];
156156 df = stiffnessMatrix * element_dx;
157157
158+ sofa::type::Vec<trait::spatial_dimensions, sofa::Real_t<DataTypes>> nodedForce { sofa::type::NOINIT };
158159 for (sofa::Size n = 0 ; n < trait::NumberOfNodesInElement; ++n)
159160 {
160- sofa::type::VecView<trait::spatial_dimensions, sofa::Real_t<DataTypes>> nodedForce (df, n * trait::spatial_dimensions);
161- nodedForce = elementRotation * nodedForce;
161+ df. getsub ( n * trait::spatial_dimensions, nodedForce );
162+ df. setsub (n * trait::spatial_dimensions, elementRotation * nodedForce) ;
162163 }
163164 }
164165}
0 commit comments