-
Notifications
You must be signed in to change notification settings - Fork 299
/
MassSpringSystemCreation.h
105 lines (91 loc) · 3.97 KB
/
MassSpringSystemCreation.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/******************************************************************************
* 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 General Public License as published by the Free *
* Software Foundation; either version 2 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 General Public License for *
* more details. *
* *
* You should have received a copy of the GNU 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/simpleapi/SimpleApi.h>
#include <sofa/testing/NumericTest.h>
#include <sofa/simulation/Node.h>
namespace sofa::component::odesolver::testing
{
/// Create a mass spring system
inline simulation::Node::SPtr createMassSpringSystem(
simulation::Node::SPtr root,
const std::string& stiffness,
const std::string& mass,
const std::string& restLength,
const std::string& xFixedPoint,
const std::string& vFixedPoint,
const std::string& xMass,
const std::string& vMass)
{
// Fixed point
const auto fixedPointNode = simpleapi::createChild(root, "FixedPointNode" );
simpleapi::createObject(fixedPointNode, "MechanicalObject", {
{ "name","fixedPoint"},
{ "template","Vec3"},
{ "position", xFixedPoint},
{ "velocity", vFixedPoint},
});
simpleapi::createObject(fixedPointNode, "FixedProjectiveConstraint", {
{ "name","fixed"},
{ "indices", "0"},
});
// Mass
const auto massNode = simpleapi::createChild(root, "MassNode");
simpleapi::createObject(massNode, "MechanicalObject", {
{ "name","massDof"},
{ "template","Vec3"},
{ "position", xMass},
{ "velocity", vMass}
});
simpleapi::createObject(massNode, "UniformMass", {
{ "name","mass"},
{ "totalMass", mass}
});
std::ostringstream oss;
oss << 0 << " " << 0 << " " << stiffness << " " << 0 << " " << restLength;
// attach a spring
simpleapi::createObject(root, "StiffSpringForceField", {
{ "name","ff"},
{ "spring", oss.str()},
{ "object1", "@FixedPointNode/fixedPoint"},
{ "object2", "@MassNode/massDof"},
});
return root;
}
template<typename DataTypes>
inline simulation::Node::SPtr createMassSpringSystem(
simulation::Node::SPtr root,
double stiffness,
double mass,
double restLength,
typename DataTypes::VecCoord xFixedPoint,
typename DataTypes::VecDeriv vFixedPoint,
typename DataTypes::VecCoord xMass,
typename DataTypes::VecDeriv vMass)
{
return createMassSpringSystem(root,
simpleapi::str(stiffness), simpleapi::str(mass), simpleapi::str(restLength),
simpleapi::str(xFixedPoint), simpleapi::str(vFixedPoint),
simpleapi::str(xMass), simpleapi::str(vMass)
);
}
} // namespace sofa::component::odesolver::testing