Skip to content

Commit

Permalink
[src] Fix scenario handling against normal algofracturepath (#32)
Browse files Browse the repository at this point in the history
  • Loading branch information
epernod authored Mar 18, 2024
1 parent bd71988 commit bc11e6a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
<BoxROI template="Vec3d" name="PulledSide" box="-0.1 0.1 0.1 10.1 -0.1 -0.1" drawBoxes="1"/>
<ConstantForceField name="CFF" indices="@PulledSide.indices" forces="0 -100 0" showArrowSize=".01" />

<TearingEngine name="TearingEngine" input_position="@Mo.position"
<TearingEngine name="TearingEngine" input_position="@Mo.position" showTearableTriangle="0" showFracturePath="0"
startVertexId="421" startDirection="1.0 0.0 0.0" startLength="5"/>

<TriangularFEMForceField name="FEM" youngModulus="60" poissonRatio="0.3" method="large" computePrincipalStress="true"/>
Expand Down
2 changes: 2 additions & 0 deletions src/Tearing/TearingEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ class TearingEngine : public core::DataEngine
/// </summary>
void algoFracturePath();

void performFractureScenario();

void computeFractureDirection(Coord principleStressDirection, Coord& fracture_direction);

/// <summary>
Expand Down
76 changes: 44 additions & 32 deletions src/Tearing/TearingEngine.inl
Original file line number Diff line number Diff line change
Expand Up @@ -340,15 +340,8 @@ template <class DataTypes>
void TearingEngine<DataTypes>::algoFracturePath()
{
helper::ReadAccessor< Data<vector<Index>> > candidate(d_triangleIdsOverThreshold);
int scenarioIdStart = -1;

//start with specific scenario
if (m_tearingAlgo->getFractureNumber() == 0) // first fracture of the scene
{
scenarioIdStart = d_startVertexId.getValue(); // -1 by default for no scenario
}

if (scenarioIdStart == -1 && candidate.empty())
if (candidate.empty())
return;

if (m_maxStressTriangleIndex == InvalidID) {
Expand All @@ -360,42 +353,50 @@ void TearingEngine<DataTypes>::algoFracturePath()
helper::ReadAccessor< Data<VecCoord> > x(d_input_positions);

//Calculate fracture starting point (Pa)
int indexA;
Coord Pa;
Coord principalStressDirection;
int indexA = m_maxStressVertexIndex;
Coord Pa = x[indexA];
Coord principalStressDirection = m_triangleInfoTearing[m_maxStressTriangleIndex].principalStressDirection;
//Calculate fracture end points (Pb and Pc)
Coord Pb;
Coord Pc;

if (scenarioIdStart == -1)
{
indexA = m_maxStressVertexIndex;
Pa = x[indexA];
principalStressDirection = m_triangleInfoTearing[m_maxStressTriangleIndex].principalStressDirection;
if (d_fractureMaxLength.getValue())
computeEndPoints(Pa, principalStressDirection, Pb, Pc);
else if (!(computeEndPointsNeighboringTriangles(Pa, principalStressDirection, Pb, Pc)))
return;
if (d_fractureMaxLength.getValue())
computeEndPoints(Pa, principalStressDirection, Pb, Pc);
else if (!(computeEndPointsNeighboringTriangles(Pa, principalStressDirection, Pb, Pc)))
return;

}
else
{
indexA = scenarioIdStart;

const Vec3& dir = d_startDirection.getValue();
const Real& alpha = d_startLength.getValue();
m_tearingAlgo->algoFracturePath(Pa, indexA, Pb, Pc, m_maxStressTriangleIndex, principalStressDirection, d_input_positions.getValue());
m_maxStressTriangleIndex = InvalidID;

if (d_stepModulo.getValue() == 0) // reset to 0
m_stepCounter = 0;
}


Pa = x[indexA];
Pb = Pa + alpha * dir;
Pc = Pa - alpha * dir;
template <class DataTypes>
void TearingEngine<DataTypes>::performFractureScenario()
{
if (m_maxStressTriangleIndex == InvalidID) {
msg_warning() << "m_maxStressTriangleIndex is invalid. Algo should not reach this point.";
return;
}

// perform scenario only once
d_nbFractureMax.setValue(1);

int indexA = d_startVertexId.getValue();
const Vec3& dir = d_startDirection.getValue();
const Real& alpha = d_startLength.getValue();

helper::ReadAccessor< Data<VecCoord> > x(d_input_positions);
Coord Pa = x[indexA];
Coord principalStressDirection = m_triangleInfoTearing[m_maxStressTriangleIndex].principalStressDirection;
Coord Pb = Pa + alpha * dir;
Coord Pc = Pa - alpha * dir;

m_tearingAlgo->algoFracturePath(Pa, indexA, Pb, Pc, m_maxStressTriangleIndex, principalStressDirection, d_input_positions.getValue());
m_maxStressTriangleIndex = InvalidID;

if (d_stepModulo.getValue() == 0) // reset to 0
m_stepCounter = 0;
}


Expand Down Expand Up @@ -854,6 +855,17 @@ void TearingEngine<DataTypes>::handleEvent(sofa::core::objectmodel::Event* event
}


// if benchmark scenario, only perform this fracture once
auto scenario = d_startVertexId.getValue();
if (scenario != -1)
{
if (m_stepCounter > 200 && (m_tearingAlgo->getFractureNumber() < d_nbFractureMax.getValue()))
performFractureScenario();

return;
}


// Compute the current fracture path
if (!d_fractureMaxLength.getValue() && m_maxStressTriangleIndex != InvalidID)
{
Expand Down

0 comments on commit bc11e6a

Please sign in to comment.