Skip to content
Merged
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
37 changes: 19 additions & 18 deletions Sofa/framework/Core/src/sofa/core/Multi2Mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,43 +231,44 @@ class Multi2Mapping : public BaseMapping
}

protected:
void getVecIn1Coord (const MultiVecCoordId id, type::vector< DataVecCoord_t<In1>*> &v) const

SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecIn1Coord (const MultiVecCoordId id, type::vector< DataVecCoord_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].write()); }
void getConstVecIn1Coord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<In1>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecIn1Coord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].read()); }
void getVecIn1Deriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<In1>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecIn1Deriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].write()); }
void getConstVecIn1Deriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<In1>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecIn1Deriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].read()); }
void getMatIn1Deriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<In1>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getMatIn1Deriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].write()); }
void getConstMatIn1Deriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<In1>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstMatIn1Deriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<In1>*> &v) const
{ for (unsigned int i=0; i<fromModels1.size(); ++i) v.push_back(id[fromModels1[i]].read()); }

void getVecIn2Coord (const MultiVecCoordId id, type::vector< DataVecCoord_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecIn2Coord (const MultiVecCoordId id, type::vector< DataVecCoord_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].write()); }
void getConstVecIn2Coord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecIn2Coord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].read()); }
void getVecIn2Deriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecIn2Deriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].write()); }
void getConstVecIn2Deriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecIn2Deriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].read()); }
void getMatIn2Deriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getMatIn2Deriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].write()); }
void getConstMatIn2Deriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<In2>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstMatIn2Deriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<In2>*> &v) const
{ for (unsigned int i=0; i<fromModels2.size(); ++i) v.push_back(id[fromModels2[i]].read()); }

void getVecOutCoord (const MultiVecCoordId id, type::vector< DataVecCoord_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecOutCoord (const MultiVecCoordId id, type::vector< DataVecCoord_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].write()); }
void getConstVecOutCoord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecOutCoord(const ConstMultiVecCoordId id, type::vector<const DataVecCoord_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].read()); }
void getVecOutDeriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getVecOutDeriv (const MultiVecDerivId id, type::vector< DataVecDeriv_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].write()); }
void getConstVecOutDeriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstVecOutDeriv(const ConstMultiVecDerivId id, type::vector<const DataVecDeriv_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].read()); }
void getMatOutDeriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getMatOutDeriv (const MultiMatrixDerivId id, type::vector< DataMatrixDeriv_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].write()); }
void getConstMatOutDeriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<Out>*> &v) const
SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() void getConstMatOutDeriv(const ConstMultiMatrixDerivId id, type::vector<const DataMatrixDeriv_t<Out>*> &v) const
{ for (unsigned int i=0; i<toModels.size(); ++i) v.push_back(id[toModels[i]].read()); }

};
Expand Down
75 changes: 57 additions & 18 deletions Sofa/framework/Core/src/sofa/core/Multi2Mapping.inl
Original file line number Diff line number Diff line change
Expand Up @@ -138,15 +138,45 @@ type::vector<behavior::BaseMechanicalState*> Multi2Mapping<In1,In2,Out>::getMech
return mechToVec;
}

template<class DataTypes, VecType vtype, VecAccess vaccess>
auto* GetData(const StateVecAccessor<DataTypes, vtype, vaccess>& stateVecAccessor)
{
if constexpr (vaccess == VecAccess::V_READ)
{
return stateVecAccessor.read();
}
else
{
return stateVecAccessor.write();
}
}

template <VecType vtype, VecAccess vaccess>
void getDataVecFromMultiVecId(auto* self, const auto& links, const TMultiVecId<vtype, vaccess> &id, auto &v)
{
v.reserve(links.size());
for (unsigned int i = 0; i < links.size(); ++i)
{
auto* data = GetData(id[links[i]]);
if (data == nullptr)
{
msg_error(self) << "Cannot find a Data in '" << links[i]->getPathName() << "' associated to the id " << id;
}
v.push_back(data);
}
}

template < class In1, class In2,class Out>
void Multi2Mapping<In1,In2,Out>::apply (const MechanicalParams* mparams, MultiVecCoordId outPos, ConstMultiVecCoordId inPos )
{
type::vector<DataVecCoord_t<Out>*> vecOutPos;
getVecOutCoord(outPos, vecOutPos);
getDataVecFromMultiVecId(this, toModels, outPos, vecOutPos);

type::vector<const DataVecCoord_t<In1>*> vecIn1Pos;
getConstVecIn1Coord(inPos, vecIn1Pos);
getDataVecFromMultiVecId(this, fromModels1, inPos, vecIn1Pos);

type::vector<const DataVecCoord_t<In2>*> vecIn2Pos;
getConstVecIn2Coord(inPos, vecIn2Pos);
getDataVecFromMultiVecId(this, fromModels2, inPos, vecIn2Pos);

this->apply(mparams, vecOutPos, vecIn1Pos, vecIn2Pos);
}
Expand All @@ -155,55 +185,64 @@ template < class In1, class In2,class Out>
void Multi2Mapping<In1,In2,Out>::applyJ (const MechanicalParams* mparams, MultiVecDerivId outVel, ConstMultiVecDerivId inVel )
{
type::vector<DataVecDeriv_t<Out>*> vecOutVel;
getVecOutDeriv(outVel, vecOutVel);
getDataVecFromMultiVecId(this, toModels, outVel, vecOutVel);

type::vector<const DataVecDeriv_t<In1>*> vecIn1Vel;
getConstVecIn1Deriv(inVel, vecIn1Vel);
getDataVecFromMultiVecId(this, fromModels1, inVel, vecIn1Vel);

type::vector<const DataVecDeriv_t<In2>*> vecIn2Vel;
getConstVecIn2Deriv(inVel, vecIn2Vel);
getDataVecFromMultiVecId(this, fromModels2, inVel, vecIn2Vel);

this->applyJ(mparams, vecOutVel, vecIn1Vel, vecIn2Vel);
}

template < class In1, class In2,class Out>
void Multi2Mapping<In1,In2,Out>::applyJT (const MechanicalParams* mparams, MultiVecDerivId inForce, ConstMultiVecDerivId outForce )
{
type::vector<DataVecDeriv_t<In1>*> vecOut1Force;
getVecIn1Deriv(inForce, vecOut1Force);
getDataVecFromMultiVecId(this, fromModels1, inForce, vecOut1Force);

type::vector<DataVecDeriv_t<In2>*> vecOut2Force;
getVecIn2Deriv(inForce, vecOut2Force);
getDataVecFromMultiVecId(this, fromModels2, inForce, vecOut2Force);

type::vector<const DataVecDeriv_t<Out>*> vecInForce;
getConstVecOutDeriv(outForce, vecInForce);
getDataVecFromMultiVecId(this, toModels, outForce, vecInForce);

this->applyJT(mparams, vecOut1Force, vecOut2Force, vecInForce);
}

template < class In1, class In2,class Out>
void Multi2Mapping<In1,In2,Out>::applyJT(const ConstraintParams* cparams, MultiMatrixDerivId inConst, ConstMultiMatrixDerivId outConst )
{
type::vector<DataMatrixDeriv_t<In1>*> matOut1Const;
getMatIn1Deriv(inConst, matOut1Const);
getDataVecFromMultiVecId(this, fromModels1, inConst, matOut1Const);

type::vector<DataMatrixDeriv_t<In2>*> matOut2Const;
getMatIn2Deriv(inConst, matOut2Const);
getDataVecFromMultiVecId(this, fromModels2, inConst, matOut2Const);

type::vector<const DataMatrixDeriv_t<Out>*> matInConst;
getConstMatOutDeriv(outConst, matInConst);
getDataVecFromMultiVecId(this, toModels, outConst, matInConst);

this->applyJT(cparams, matOut1Const, matOut2Const, matInConst);
}

template < class In1, class In2,class Out>
void Multi2Mapping<In1,In2,Out>::computeAccFromMapping(const MechanicalParams* mparams, MultiVecDerivId outAcc, ConstMultiVecDerivId inVel, ConstMultiVecDerivId inAcc )
{
type::vector<DataVecDeriv_t<Out>*> vecOutAcc;
getVecOutDeriv(outAcc, vecOutAcc);
getDataVecFromMultiVecId(this, toModels, outAcc, vecOutAcc);

type::vector<const DataVecDeriv_t<In1>*> vecIn1Vel;
getConstVecIn1Deriv(inVel, vecIn1Vel);
getDataVecFromMultiVecId(this, fromModels1, inVel, vecIn1Vel);

type::vector<const DataVecDeriv_t<In1>*> vecIn1Acc;
getConstVecIn1Deriv(inAcc, vecIn1Acc);
getDataVecFromMultiVecId(this, fromModels1, inAcc, vecIn1Acc);

type::vector<const DataVecDeriv_t<In2>*> vecIn2Vel;
getDataVecFromMultiVecId(this, fromModels2, inVel, vecIn2Vel);

type::vector<const DataVecDeriv_t<In2>*> vecIn2Vel;
getConstVecIn2Deriv(inVel, vecIn2Vel);
type::vector<const DataVecDeriv_t<In2>*> vecIn2Acc;
getConstVecIn2Deriv(inAcc, vecIn2Acc);
getDataVecFromMultiVecId(this, fromModels2, inAcc, vecIn2Acc);

this->computeAccFromMapping(mparams, vecOutAcc, vecIn1Vel, vecIn2Vel,vecIn1Acc, vecIn2Acc);
}
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 @@ -181,3 +181,10 @@ SOFA_ATTRIBUTE_DEPRECATED("v26.12", "v27.12", "Use BaseContext instead of Contex
#define SOFA_CORE_DEPRECATED_ACCFROMF() \
SOFA_ATTRIBUTE_DISABLED("v26.12", "v27.06", "Use solveLinearSystem instead of accFromF.")
#endif

#ifdef SOFA_BUILD_SOFA_CORE
#define SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID()
#else
#define SOFA_CORE_DEPRECATED_GETDATAVECFROMMULTIVECID() \
SOFA_ATTRIBUTE_DEPRECATED("v26.12", "v27.12", "")
#endif
Loading