I tried to create a modal assembly from a very simple model consisting of only one hex8-element. The idea is to condense 4 nodes and keep 4 nodes as boundary. Unfortunately I get the following error:
LU factorization reported a problem, zero diagonal for instance
Solver SetupCurrent() failed
Assertion failed: m_factorizationIsOk && "The matrix should be factorized first", file Eigen\src/SparseLU/SparseLU.h, line 318<
I attached the code. I would be very thankful for advice on how to solve the problem
Christian
// Create System ---------------------------------------------------------------------------------------------------
ChSystemSMC sys;
// Create one hex8 element and nodes -------------------------------------------------------------------------------
auto n1 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(0., 0., 0.));
auto n2 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(1., 0., 0.));
auto n3 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(1., 1., 0.));
auto n4 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(0., 1., 0.));
auto n5 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(0., 0., 1.));
auto n6 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(1., 0., 1.));
auto n7 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(1., 1., 1.));
auto n8 = chrono_types::make_shared<ChNodeFEAxyz>(ChVector3d(0., 1., 1.));
auto mat = chrono_types::make_shared<ChContinuumElastic>();
mat->SetYoungModulus(2.1e11);
mat->SetPoissonRatio(0.3);
mat->SetDensity(9850);
auto hex8_corot = chrono_types::make_shared<ChElementHexaCorot_8>();
hex8_corot->SetNodes(n1, n2, n3, n4, n5, n6, n7, n8);
hex8_corot->SetMaterial(mat);
// Create meshes -----------------------------------------------------------------------------------------------
auto mesh_internal = chrono_types::make_shared<ChMesh>();
mesh_internal->AddNode(n1);
mesh_internal->AddNode(n2);
mesh_internal->AddNode(n3);
mesh_internal->AddNode(n4);
auto mesh_boundary = chrono_types::make_shared<ChMesh>();
mesh_boundary->AddNode(n5);
mesh_boundary->AddNode(n6);
mesh_boundary->AddNode(n7);
mesh_boundary->AddNode(n8);
// Create modal assembly -------------------------------------------------------------------------------------------
auto mod_assem = chrono_types::make_shared<ChModalAssembly>();
sys.Add(mod_assem);
mod_assem->AddInternalMesh(mesh_internal);
mod_assem->AddMesh(mesh_boundary);
mod_assem->SetReductionType(chrono::modal::ChModalAssembly::ReductionType::CRAIG_BAMPTON);
auto eigen_solver = chrono_types::make_shared<ChUnsymGenEigenvalueSolverKrylovSchur>();
ChModalSolverUndamped<ChUnsymGenEigenvalueSolverKrylovSchur> modal_solver(12, 1e-4, false, true, eigen_solver);
auto damping_model = ChModalDampingRayleigh(0.05, 0.05);
mod_assem->DoModalReduction(modal_solver, damping_model);
std::cout << "Modal reduction successful:\n";