Add flex elasticity stiffness matrix to mjModel.
PiperOrigin-RevId: 675101645 Change-Id: Ic169c108b9eece3657ea4ec211df357abe615b7e
This commit is contained in:
committed by
Copybara-Service
parent
c77babe046
commit
2da15cf137
@@ -148,6 +148,7 @@ TEST_F(PluginTest, ElasticEnergyMembrane) {
|
||||
|
||||
mj_kinematics(m, d);
|
||||
mj_flex(m, d);
|
||||
mjtNum* metric = m->flex_stiffness + 21 * m->flex_elemadr[0];
|
||||
|
||||
// check that if the entire geometry is rescaled by a factor "scale", then
|
||||
// trace(strain^2) = 2*scale^2
|
||||
@@ -156,15 +157,16 @@ TEST_F(PluginTest, ElasticEnergyMembrane) {
|
||||
for (int t = 0; t < membrane->nt; t++) {
|
||||
mjtNum energy = 0;
|
||||
mjtNum volume = 1./2.;
|
||||
int idx = 0;
|
||||
for (int e1 = 0; e1 < 3; e1++) {
|
||||
for (int e2 = 0; e2 < 3; e2++) {
|
||||
for (int e2 = e1; e2 < 3; e2++) {
|
||||
int idx1 = membrane->elements[t].edges[e1] + m->flex_edgeadr[0];
|
||||
int idx2 = membrane->elements[t].edges[e2] + m->flex_edgeadr[0];
|
||||
mjtNum elongation1 =
|
||||
mjtNum elong1 =
|
||||
scale * m->flexedge_length0[idx1] * m->flexedge_length0[idx1];
|
||||
mjtNum elongation2 =
|
||||
mjtNum elong2 =
|
||||
scale * m->flexedge_length0[idx2] * m->flexedge_length0[idx2];
|
||||
energy += membrane->metric[9*t+3*e2+e1] * elongation1 * elongation2;
|
||||
energy += metric[21*t+idx++] * elong1 * elong2 * (e1 == e2 ? 1. : 2.);
|
||||
}
|
||||
}
|
||||
EXPECT_NEAR(
|
||||
@@ -230,6 +232,7 @@ TEST_F(ElasticityTest, ElasticEnergySolid) {
|
||||
|
||||
mj_kinematics(m, d);
|
||||
mj_flex(m, d);
|
||||
mjtNum* metric = m->flex_stiffness + 21 * m->flex_elemadr[0];
|
||||
|
||||
// check that if the entire geometry is rescaled by a factor "scale", then
|
||||
// trace(strain^2) = 3*scale^2
|
||||
@@ -238,15 +241,16 @@ TEST_F(ElasticityTest, ElasticEnergySolid) {
|
||||
for (int t = 0; t < solid->nt; t++) {
|
||||
mjtNum energy = 0;
|
||||
mjtNum volume = 1./6.;
|
||||
int idx = 0;
|
||||
for (int e1 = 0; e1 < 6; e1++) {
|
||||
for (int e2 = 0; e2 < 6; e2++) {
|
||||
for (int e2 = e1; e2 < 6; e2++) {
|
||||
int idx1 = solid->elements[t].edges[e1] + m->flex_edgeadr[0];
|
||||
int idx2 = solid->elements[t].edges[e2] + m->flex_edgeadr[0];
|
||||
mjtNum elongation1 =
|
||||
mjtNum elong1 =
|
||||
scale * m->flexedge_length0[idx1] * m->flexedge_length0[idx1];
|
||||
mjtNum elongation2 =
|
||||
mjtNum elong2 =
|
||||
scale * m->flexedge_length0[idx2] * m->flexedge_length0[idx2];
|
||||
energy += solid->metric[36*t+6*e2+e1] * elongation1 * elongation2;
|
||||
energy += metric[21*t+idx++] * elong1 * elong2 * (e1 == e2 ? 1. : 2.);
|
||||
}
|
||||
}
|
||||
EXPECT_NEAR(
|
||||
|
||||
Reference in New Issue
Block a user