Refactor flex stiffness storage to support variable sizes.
This change introduces `nflexstiffness` and `flex_stiffnessadr` to allow flex stiffness matrices to have sizes other than the fixed 21 per element. Higher-order flexes can now store larger stiffness matrices based on their number of nodes. The `flex_stiffnessadr` array provides the starting index for each flex's stiffness data within the `flex_stiffness` array. PiperOrigin-RevId: 899632263 Change-Id: Ie49182c46c3777acf0c6b492345edfcf62fb5e44
This commit is contained in:
committed by
Copybara-Service
parent
08bb6e66f1
commit
5724158593
@@ -4271,12 +4271,8 @@ void mjCFlex::Compile(const mjVFS* vfs) {
|
||||
}
|
||||
|
||||
// linear elasticity
|
||||
stiffness.assign(21*nelem, 0);
|
||||
if (interpolated) {
|
||||
int min_size = ceil(nodexpos.size()*nodexpos.size() / 21);
|
||||
if (min_size > nelem) {
|
||||
throw mjCError(this, "Trilinear dofs are require at least %d elements", "", min_size);
|
||||
}
|
||||
if (!interpolated) {
|
||||
stiffness.assign(21 * nelem, 0);
|
||||
}
|
||||
|
||||
// geometrically nonlinear elasticity
|
||||
@@ -4333,6 +4329,11 @@ void mjCFlex::Compile(const mjVFS* vfs) {
|
||||
}
|
||||
|
||||
if (!stiffness_cached && young > 0 && interpolated) {
|
||||
int n = pow(order_ + 1, 3);
|
||||
int ndof = 3 * n;
|
||||
if (stiffness.size() < ndof * ndof) {
|
||||
stiffness.resize(ndof * ndof, 0);
|
||||
}
|
||||
ComputeLinearStiffness(stiffness, nodexpos.data(), young, poisson, order_);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user