Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ struct Mass_test : public sofa::testing::BaseSimulationTest, public sofa::testin
bool m_debug; ///< Print debug messages. Default is false.
/// }

bool m_testAccFromF { true };
bool m_testSolveLinearSystem { true };
bool m_testAddMToMatrix { true };
bool m_testBuildMassMatrix { true };
bool m_testKineticEnergy { true };
Expand Down Expand Up @@ -238,11 +238,11 @@ struct Mass_test : public sofa::testing::BaseSimulationTest, public sofa::testin
checkKineticEnergy(v, n, mparams, Mv);
}

// 2. Test accFromF: a = M^-1 * f
// 2. Test solveLinearSystem: a = M^-1 * f
// a = M^-1 * (M * v) should be v
if (m_testAccFromF)
if (m_testSolveLinearSystem)
{
m_mass->accFromF(&mparams, sofa::core::vec_id::write_access::force);
m_mass->solveLinearSystem(&mparams, sofa::core::vec_id::write_access::force, sofa::core::vec_id::read_access::force);

VecDeriv a;
sofa::testing::copyFromData(a, m_dof->readForces());
Expand All @@ -251,7 +251,7 @@ struct Mass_test : public sofa::testing::BaseSimulationTest, public sofa::testin
* std::max((SReal)1, (SReal)this->vectorMaxAbs(v));

EXPECT_LT((SReal)this->vectorMaxDiff(a, v), tolerance)
<< "accFromF inconsistent with addMDx (M^-1 * M * v != v)";
<< "solveLinearSystem inconsistent with addMDx (M^-1 * M * v != v)";
}

sofa::SignedIndex matrixSize = (sofa::SignedIndex)(n * DataTypes::deriv_total_size);
Expand Down
2 changes: 1 addition & 1 deletion Sofa/Component/Mass/src/sofa/component/mass/DiagonalMass.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ class DiagonalMass : public core::behavior::Mass<DataTypes>, public virtual sofa
// -- Mass interface
void addMDx(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecDeriv& dx, SReal factor) override;

void accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;
void doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;

void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ void DiagonalMass<DataTypes, GeometricalTypes>::addMDx(const core::MechanicalPar


template <class DataTypes, class GeometricalTypes>
void DiagonalMass<DataTypes, GeometricalTypes>::accFromF(const core::MechanicalParams* /*mparams*/, DataVecDeriv& a, const DataVecDeriv& f)
void DiagonalMass<DataTypes, GeometricalTypes>::doSolveLinearSystem(const core::MechanicalParams* /*mparams*/, DataVecDeriv& a, const DataVecDeriv& f)
{

const MassVector &masses= d_vertexMass.getValue();
Expand Down
3 changes: 1 addition & 2 deletions Sofa/Component/Mass/src/sofa/component/mass/FEMMass.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,14 @@ class FEMMass :
*/
void addMDx(const core::MechanicalParams* mparams, DataVecDeriv_t<DataTypes>& f, const DataVecDeriv_t<DataTypes>& dx, SReal factor) override;

using Inherit1::accFromF;
/**
* @brief Compute $ a = M^{-1} f $ if the mass matrix is lumped. Triggers an error otherwise.
*
* @param mparams Mechanical parameters for the computation.
* @param a The result vector of $M^{-1} f$.
* @param f The vector to be multiplied by the inverse mass matrix.
*/
void accFromF(const core::MechanicalParams* mparams, DataVecDeriv_t<DataTypes>& a, const DataVecDeriv_t<DataTypes>& f) override;
void doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv_t<DataTypes>& a, const DataVecDeriv_t<DataTypes>& f) override;


using Inherit1::getKineticEnergy;
Expand Down
4 changes: 2 additions & 2 deletions Sofa/Component/Mass/src/sofa/component/mass/FEMMass.inl
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ void FEMMass<TDataTypes, TElementType>::addMDx(const core::MechanicalParams* mpa
}

template <class TDataTypes, class TElementType>
void FEMMass<TDataTypes, TElementType>::accFromF(const core::MechanicalParams* mparams,
void FEMMass<TDataTypes, TElementType>::doSolveLinearSystem(const core::MechanicalParams* mparams,
DataVecDeriv_t<DataTypes>& a,
const DataVecDeriv_t<DataTypes>& f)
{
Expand All @@ -310,7 +310,7 @@ void FEMMass<TDataTypes, TElementType>::accFromF(const core::MechanicalParams* m

if (!d_lumping.getValue())
{
msg_error() << "the method 'accFromF' can't be used with this component as this "
msg_error() << "the method 'solveLinearSystem' can't be used with this component as this "
"SPARSE mass matrix can't be inversed easily. Enable 'lumping' instead.";
return;
}
Expand Down
3 changes: 1 addition & 2 deletions Sofa/Component/Mass/src/sofa/component/mass/MeshMatrixMass.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,7 @@ class MeshMatrixMass : public core::behavior::Mass<DataTypes>, public virtual co
using Inherited::addMDx;
void addMDx(const core::MechanicalParams*, DataVecDeriv& f, const DataVecDeriv& dx, SReal factor) override;

using Inherited::accFromF;
void accFromF(const core::MechanicalParams*, DataVecDeriv& a, const DataVecDeriv& f) override; // This function can't be used as it use M^-1
void doSolveLinearSystem(const core::MechanicalParams*, DataVecDeriv& a, const DataVecDeriv& f) override; // This function can't be used as it use M^-1

void addForce(const core::MechanicalParams*, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2048,12 +2048,12 @@ void MeshMatrixMass<DataTypes, GeometricalTypes>::addMDx(const core::MechanicalP


template <class DataTypes, class GeometricalTypes>
void MeshMatrixMass<DataTypes, GeometricalTypes>::accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f)
void MeshMatrixMass<DataTypes, GeometricalTypes>::doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f)
{
SOFA_UNUSED(mparams);
if( !isLumped() )
{
msg_error() << "the method 'accFromF' can't be used with MeshMatrixMass as this SPARSE mass matrix can't be inversed easily. "
msg_error() << "the method 'solveLinearSystem' can't be used with MeshMatrixMass as this SPARSE mass matrix can't be inversed easily. "
<< "Please proceed to mass lumping or use a DiagonalMass (both are equivalent).";
return;
}
Expand Down
3 changes: 1 addition & 2 deletions Sofa/Component/Mass/src/sofa/component/mass/UniformMass.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,7 @@ class UniformMass : public core::behavior::Mass<DataTypes>, public virtual core:

using Inherited::addMDx;
void addMDx(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecDeriv& dx, SReal factor) override;
using Inherited::accFromF;
void accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;
void doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;
void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override;

using Inherited::getKineticEnergy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ void UniformMass<DataTypes>::addMDx ( const core::MechanicalParams*, DataVecDeri


template <class DataTypes>
void UniformMass<DataTypes>::accFromF ( const core::MechanicalParams*, DataVecDeriv& va, const DataVecDeriv& vf )
void UniformMass<DataTypes>::doSolveLinearSystem ( const core::MechanicalParams*, DataVecDeriv& va, const DataVecDeriv& vf )
{
if (!this->isComponentStateValid())
return;
Expand Down
2 changes: 1 addition & 1 deletion Sofa/Component/Mass/tests/MassTestCreation[FEMMass].cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ struct ElementMass_template_test : public Mass_test<FEMMass<typename MassParam::

ElementMass_template_test()
{
this->m_testAccFromF = false;
this->m_testSolveLinearSystem = false;
this->m_testAddMToMatrix = false;
this->m_errorMax = 1e2_sreal;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ struct MeshMatrixMass_template_test : public Mass_test<MeshMatrixMass<DataTypes>

m_topology->computeCrossElementBuffers();

this->m_testAccFromF = lumped;
this->m_testSolveLinearSystem = lumped;
this->m_mass->d_lumping.setValue(lumped);

this->run_test(x, v);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class HexahedralFEMForceFieldAndMass : virtual public sofa::core::behavior::Mass
///// WARNING this method only add diagonal elements in the given matrix !
void addMBKToMatrix(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix) override;

void accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;
void doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;

void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,9 +385,9 @@ void HexahedralFEMForceFieldAndMass<DataTypes>::addMBKToMatrix (const core::Mech


template<class DataTypes>
void HexahedralFEMForceFieldAndMass<DataTypes>::accFromF(const core::MechanicalParams*, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
void HexahedralFEMForceFieldAndMass<DataTypes>::doSolveLinearSystem(const core::MechanicalParams*, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
{
msg_error() << "HexahedralFEMForceFieldAndMass<DataTypes>::accFromF not yet implemented";
msg_error() << "HexahedralFEMForceFieldAndMass<DataTypes>::solveLinearSystem not yet implemented";
// need to built the big global mass matrix and to inverse it...
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class HexahedronFEMForceFieldAndMass : virtual public core::behavior::Mass<DataT
void buildStiffnessMatrix(core::behavior::StiffnessMatrix*) override;
void buildMassMatrix(sofa::core::behavior::MassMatrixAccumulator* matrices) override;

void accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;
void doSolveLinearSystem(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override;

void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,9 @@ void HexahedronFEMForceFieldAndMass<DataTypes>::buildMassMatrix(sofa::core::beha
}

template<class DataTypes>
void HexahedronFEMForceFieldAndMass<DataTypes>::accFromF(const core::MechanicalParams* /*mparams*/, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
void HexahedronFEMForceFieldAndMass<DataTypes>::doSolveLinearSystem(const core::MechanicalParams* /*mparams*/, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
{
msg_warning()<<"HexahedronFEMForceFieldAndMass<DataTypes>::accFromF not yet implemented"<<msgendl;
msg_warning()<<"HexahedronFEMForceFieldAndMass<DataTypes>::solveLinearSystem not yet implemented"<<msgendl;
// need to built the big global mass matrix and to inverse it...
}

Expand Down
5 changes: 5 additions & 0 deletions Sofa/framework/Core/src/sofa/core/behavior/BaseMass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ SReal BaseMass::getPotentialEnergy(const MechanicalParams* mparams) const
return this->getPotentialEnergy(mparams, mparams->x());
}

void BaseMass::accFromF(const MechanicalParams* mparams, MultiVecDerivId aid)
{
solveLinearSystem(mparams, aid, mparams->f());
}

void BaseMass::buildMassMatrix(sofa::core::behavior::MassMatrixAccumulator* matrices)
{
static std::set<BaseMass*> hasEmittedWarning;
Expand Down
10 changes: 9 additions & 1 deletion Sofa/framework/Core/src/sofa/core/behavior/BaseMass.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,15 @@ class SOFA_CORE_API BaseMass : public virtual StateAccessor
virtual void addMDx(const MechanicalParams* mparams, MultiVecDerivId fid, SReal factor) =0;

/// dx = M^-1 f
virtual void accFromF(const MechanicalParams* mparams, MultiVecDerivId aid) = 0;
SOFA_CORE_DEPRECATED_ACCFROMF()
virtual void accFromF(const MechanicalParams* mparams, MultiVecDerivId aid) final;

/// Solve M x = b, or x = M^-1 b, where M is the mass matrix
///
/// Warning: this method is only implemented in derived classes when the mass matrix is trivial
/// (for example, diagonal mass matrices), allowing for efficient linear system solving. In the
/// other cases, it may be necessary to use a more general linear solver.
virtual void solveLinearSystem(const MechanicalParams* mparams, MultiVecDerivId xId, ConstMultiVecDerivId bId) = 0;

/// \brief Perform v += dt*g operation. Used if mass wants to added G separately from the other forces to v.
///
Expand Down
9 changes: 3 additions & 6 deletions Sofa/framework/Core/src/sofa/core/behavior/Mass.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,11 @@ class Mass : virtual public ForceField<DataTypes>, public BaseMass

virtual void addMDx(const MechanicalParams* mparams, DataVecDeriv& f, const DataVecDeriv& dx, SReal factor);

/// $ dx = M^-1 f $
///
/// This method retrieves the force and dx vector and call the internal
/// accFromF(VecDeriv&,const VecDeriv&) method implemented by the component.
void accFromF(const MechanicalParams* mparams, MultiVecDerivId aid) override;

SOFA_CORE_DEPRECATED_ACCFROMF()
virtual void accFromF(const MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f);

void solveLinearSystem(const MechanicalParams* mparams, MultiVecDerivId xId, ConstMultiVecDerivId bId) override;
virtual void doSolveLinearSystem(const MechanicalParams* mparams, DataVecDeriv& x, const DataVecDeriv& b);

/// Mass forces (gravity) often have null derivative
void addDForce(const MechanicalParams* /*mparams*/, DataVecDeriv & /*df*/, const DataVecDeriv & /*dx*/ ) override;
Expand Down
32 changes: 23 additions & 9 deletions Sofa/framework/Core/src/sofa/core/behavior/Mass.inl
Original file line number Diff line number Diff line change
Expand Up @@ -64,26 +64,40 @@ void Mass<DataTypes>::addMDx(const MechanicalParams* /*mparams*/, DataVecDeriv&
msg_warning() << "Method addMDx(const MechanicalParams* , DataVecDeriv& , const DataVecDeriv& , SReal ) not implemented.";
}


template<class DataTypes>
void Mass<DataTypes>::accFromF(const MechanicalParams* mparams, MultiVecDerivId aid)
void Mass<DataTypes>::accFromF(const MechanicalParams* /*mparams*/, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
{
msg_warning() << "Method accFromF(const MechanicalParams* , DataVecDeriv& , const DataVecDeriv& ) not implemented.";
}

template <class DataTypes>
void Mass<DataTypes>::solveLinearSystem(const MechanicalParams* mparams,
MultiVecDerivId xId, ConstMultiVecDerivId bId)
{
if(mparams)
{
auto mstate = this->mstate.get();
accFromF(mparams, *aid[mstate].write(), *mparams->readF(mstate));

DataVecDeriv* x = xId[mstate].write(); assert(x);
const DataVecDeriv* b = bId[mstate].read(); assert(b);

doSolveLinearSystem(mparams, *x, *b);
}
else msg_error() <<"Mass<DataTypes>::accFromF(const MechanicalParams* mparams, MultiVecDerivId aid) receives no mparam";
}

template<class DataTypes>
void Mass<DataTypes>::accFromF(const MechanicalParams* /*mparams*/, DataVecDeriv& /*a*/, const DataVecDeriv& /*f*/)
template <class DataTypes>
void Mass<DataTypes>::doSolveLinearSystem(const MechanicalParams* mparams,
DataVecDeriv& x, const DataVecDeriv& b)
{
msg_warning() << "Method accFromF(const MechanicalParams* , DataVecDeriv& , const DataVecDeriv& ) not implemented.";
}
SOFA_UNUSED(mparams);
SOFA_UNUSED(x);
SOFA_UNUSED(b);

msg_warning() << "Method 'solveLinearSystem' was called but it is not implemented for '" <<
this->getClassName() << "'. Behavior is undefined. Try using a linear solver.";
}

template<class DataTypes>
template <class DataTypes>
void Mass<DataTypes>::addDForce(const MechanicalParams* mparams,
DataVecDeriv & /*df*/, const DataVecDeriv & /*dx*/)
{
Expand Down
7 changes: 7 additions & 0 deletions Sofa/framework/Core/src/sofa/core/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,10 @@ SOFA_ATTRIBUTE_DEPRECATED("v26.12", "v27.12", "Use BaseContext instead of Contex
#define SOFA_CORE_DEPRECATED_RESETVEC() \
SOFA_ATTRIBUTE_DEPRECATED("v26.12", "v27.12", "Use resetVec instead.")
#endif

#ifdef SOFA_BUILD_SOFA_CORE
#define SOFA_CORE_DEPRECATED_ACCFROMF()
#else
#define SOFA_CORE_DEPRECATED_ACCFROMF() \
SOFA_ATTRIBUTE_DISABLED("v26.12", "v27.06", "Use solveLinearSystem instead of accFromF.")
#endif
6 changes: 4 additions & 2 deletions Sofa/framework/Simulation/Core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ set(HEADER_FILES
${SRC_ROOT}/mappinggraph/VisitorApplication.h
${SRC_ROOT}/mappinggraph/MappingGraphUser.h

${SRC_ROOT}/mechanicalvisitor/MechanicalAccFromFVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.h
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.h
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateMatrixDeriv.h
Expand All @@ -118,6 +117,7 @@ set(HEADER_FILES
${SRC_ROOT}/mechanicalvisitor/MechanicalIdentityBlocksInJacobianVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalIntegrateConstraintVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalIntegrationVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalMassLinearSolveVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorFromBaseVectorVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorPeqBaseVectorVisitor.h
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorToBaseVectorVisitor.h
Expand Down Expand Up @@ -246,7 +246,6 @@ set(SOURCE_FILES
${SRC_ROOT}/mappinggraph/MappingGraphVisitor.cpp
${SRC_ROOT}/mappinggraph/MappingGraphUser.cpp

${SRC_ROOT}/mechanicalvisitor/MechanicalAccFromFVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateMatrixDeriv.cpp
Expand All @@ -272,6 +271,7 @@ set(SOURCE_FILES
${SRC_ROOT}/mechanicalvisitor/MechanicalIdentityBlocksInJacobianVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalIntegrateConstraintVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalIntegrationVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalMassLinearSolveVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorFromBaseVectorVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorPeqBaseVectorVisitor.cpp
${SRC_ROOT}/mechanicalvisitor/MechanicalMultiVectorToBaseVectorVisitor.cpp
Expand Down Expand Up @@ -345,6 +345,8 @@ set(DEPRECATED_HEADER_FILES
${DEPRECATED_DIR}/TaskSchedulerRegistry.h
${DEPRECATED_DIR}/UpdateMappingEndEvent.h
${DEPRECATED_DIR}/WorkerThread.h

${DEPRECATED_DIR}/mechanicalvisitor/MechanicalAccFromFVisitor.h
)

sofa_find_package(Sofa.Core REQUIRED)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/******************************************************************************
* SOFA, Simulation Open-Framework Architecture *
* (c) 2006 INRIA, USTL, UJF, CNRS, MGH *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Authors: The SOFA Team and external contributors (see Authors.txt) *
* *
* Contact information: contact@sofa-framework.org *
******************************************************************************/
#pragma once
#include <sofa/simulation/mechanicalvisitor/MechanicalMassLinearSolveVisitor.h>
SOFA_HEADER_DEPRECATED("v26.12", "v27.06", "sofa/simulation/mechanicalvisitor/MechanicalMassLinearSolveVisitor.h")
Loading
Loading