Hi Dario, Thank you for fast response! I'm sorry that I did give any details on the problem. I thought that it was some stupid mistake of a newbie and a common solution is ready ) Since my first post I've done some experiments and got more understanding of the problem. First of all you are right "Panel" object has mistakes in its implementation which I still do not know how to fix yet.
I followed these three tutorials: https://github.com/projectchrono/chrono/blob/main/src/demos/modal/demo_MOD_assembly.cpp https://github.com/projectchrono/chrono/blob/main/src/demos/fea/demo_FEA_modal_assembly.cpp https://github.com/projectchrono/chrono/blob/main/src/demos/fea/demo_FEA_contacts_NSC.cpp >From the last I've taken the loading of Tetgen mesh from my CAD model. The other two - for assembly and modal reduction. Now to the core of my situation... I need to put several "Panels" together to model their vibration. A single panel contains up to 15k DoFs that is already too much for Spectra and requires significant memory usage (that I've grasped experimentally but not yet sure about it). In order to put the panels together interface points (boundary points) are needed. As described in the first link above the two types of mesh are needed in the ChModalAssembly, so I did like this: mesh_internal = chrono_types::make_shared<ChMesh>(); AddInternal( mesh_internal); // NOTE: MESH FOR INTERNAL NODES: USE assembly->AddInternal() mesh_boundary = chrono_types::make_shared<ChMesh>(); Add(mesh_boundary); // NOTE: MESH FOR BOUNDARY NODES: USE assembly->Add() But then I loaded the positions and indices of vertices into the model and found out that I can't easily connect ChNodeFEAxyz to ... anything else (like bodies). After removing all interface points the reduction goes smooth but my panel is useless( So I guess that the problem is in the constrains equations that are set by ChLinkXXXXXXs. And I don't know yet how to add ChLinks correctly I put my code for adding interface points below, may be you could give me a hint where I'm wrong? ``` if(!interfaceNodesIds.empty()) { for(int i=0;i<interfaceNodesIds.size();++i) { if(interfaceNodesIds[i]<0) // the point is being created not selected from the mesh { std::vector<std::shared_ptr<ChNodeFEAxyz>> aggregatedNodes(aggregatedNodesIds[i].size()); ChVector<double> newNodePos(0,0,0); // set it to the average of the aggregatedNodes for(int j=0;j<aggregatedNodesIds[i].size();++j) { aggregatedNodes[i] = (std::dynamic_pointer_cast<ChNodeFEAxyz>(mesh_internal->GetNode(aggregatedNodesIds[i][j]))); newNodePos += std::dynamic_pointer_cast<ChNodeFEAxyz>(mesh_internal->GetNode(aggregatedNodesIds[i][j]))->GetX0(); } newNodePos /= aggregatedNodesIds[i].size(); // // std::shared_ptr<ChNodeFEAxyz> interfNode = chrono_types::make_shared<ChNodeFEAxyz>(newNodePos); std::shared_ptr<ChBody> interfNodeBody = chrono_types::make_shared<ChBody>(); interfNodeBody->SetMass(0.0001); interfNodeBody->SetInertia(ChMatrix33<double>::Identity()*0.00000001); interfNodeBody->SetPos(newNodePos); interfNodeBody->SetName(interfaceNames[i].c_str()); Add(interfNodeBody); //add body to the list of interface points for external links attachment interfacePoints.push_back(interfNodeBody); //attach all the aggregated nodes to the interface body (point) for(int j=0;j<aggregatedNodes.size();++j) { mesh_boundary->AddNode(aggregatedNodes[i]); auto my_root = chrono_types::make_shared<ChLinkPointFrame>(); my_root->Initialize(aggregatedNodes[i], interfNodeBody); // AddInternalLink(my_root); AddLink(my_root); } } else if(interfaceNodesIds[i]>=0){ std::shared_ptr<ChNodeFEAxyz> interfNode = std::dynamic_pointer_cast<ChNodeFEAxyz>(mesh_internal->GetNode(interfaceNodesIds[i])); std::shared_ptr<ChBody> interfNodeBody = chrono_types::make_shared<ChBody>(); interfNodeBody->SetMass(0.001); interfNodeBody->SetInertia(ChMatrix33<double>::Identity()*0.001); interfNodeBody->SetPos(interfNode->GetX0()); interfNodeBody->SetName(interfaceNames[i].c_str()); Add(interfNodeBody); //add body to the list of interface points for external links attachment interfacePoints.push_back(interfNodeBody); std::vector<std::shared_ptr<ChNodeFEAxyz>> aggregatedNodes(aggregatedNodesIds[i].size()); for(int j=0;j<aggregatedNodesIds[i].size();++j) { aggregatedNodes[i] = (std::dynamic_pointer_cast<ChNodeFEAxyz>(mesh_internal->GetNode(aggregatedNodesIds[i][j]))); } // new interface point to be added to the system //attach the interface node to the interface body (point) // mesh_boundary->AddNode(interfNode); { auto my_root = chrono_types::make_shared<ChLinkPointFrame>(); my_root->Initialize(interfNode, interfNodeBody); // AddLink(my_root); AddInternalLink(my_root); } //attach all the aggregated nodes to the interface body (point) for(int j=0;j<aggregatedNodes.size();++j) { // mesh_boundary->AddNode(aggregatedNodes[i]); auto my_root = chrono_types::make_shared<ChLinkPointFrame>(); my_root->Initialize(aggregatedNodes[i], interfNodeBody); AddInternalLink(my_root); // AddLink(my_root); } } } } ``` On Monday, December 4, 2023 at 7:48:03 PM UTC+3 [email protected] wrote: > Hi Victor, > I'm not an expert on modal reduction, but in the meantime can you be more > precise about the problem? > For example: > > 1. you say "some of the input matrices are wrong". What "wrong" means > to you? Are there missing coefficients? Is the size wrong? Does the > stiffness matrix have different values to the one expected? Wa > 2. are you sure that your "Pannel" object is correctly implemented? > Does a normal dynamic simulation work? > 3. is there any exception triggered and, if so, in which line? you say > that you hit "some kind of problems". We are not really able to fix *"some > kind"* of problems, but we may try to fix some *specific *problem. Is > there any missing attachment in your post? How can we expect to give > advices if we don't have neither your full code nor even a precise error > output? > 4. Did you split internal nodes from those at the boundaries? like > this? > auto mesh_internal = chrono_types::make_shared<ChMesh>(); > assembly->AddInternal(mesh_internal); // NOTE: MESH FOR INTERNAL > NODES: USE assembly->AddInternal() > > auto mesh_boundary = chrono_types::make_shared<ChMesh>(); > assembly->Add(mesh_boundary); // NOTE: MESH FOR BOUNDARY NODES: > USE assembly->Add() > 5. which tutorial did you follow? > 6. Did you try to give a look at this demo? > > > https://github.com/projectchrono/chrono/blob/main/src/demos/modal/demo_MOD_assembly.cpp > > We are currently working in better modal reduction methods on a separate > branch, but in the meanwhile it would be great if you provide better info > about your problem. > > Dario > Il giorno lunedì 4 dicembre 2023 alle 11:07:32 UTC+1 [email protected] ha > scritto: > >> Debuging shows the problem in ConvertToMatrixForm() function. Seems >> some of the input matrices are wrong... but which one and how to fix it ???? >> >> On Monday, December 4, 2023 at 12:55:56 PM UTC+3 Vic M wrote: >> >>> Hello everyone, >>> I'm experiencing some kind of problem working with model reduction >>> functionality in chrono. >>> I'm using the ChModalAssembly for modeling and reduction (as >>> repented in the tutorial) >>> First I create the system >>> ``` >>> ChSystemNSC sys; auto qr_solver = chrono_types::make_shared< >>> ChSolverSparseQR>(); sys.SetSolver(qr_solver); >>> .... >>> ``` >>> Then creating my model object >>> ``` >>> auto sp = chrono_types::make_shared<Pannel>(); >>> sys.Add(sp); >>> ``` >>> >>> The mesh is loaded from external TetGen file >>> ``` >>> ChMeshFileLoader::FromTetGenFile(mesh_internal, ///< destination mesh >>> pathToNodesFile.c_str(), ///< name of the .node file pathToEleFile.c_str >>> (), ///< name of the .ele file mmaterial, ///< material for the created >>> tetahedrons VNULL, ///< optional displacement of imported mesh >>> ChMatrix33<>(1) ///< optional rotation/scaling of imported mesh ); >>> ``` >>> Then I do the reduction >>> ``` >>> SetModalMode(true); SwitchModalReductionON( nModes, // The number of >>> modes to retain from modal reduction, or a ChModalSolveUndamped with >>> more settings ChModalDampingRayleigh(0.001, 0.005) // The damping model >>> - Optional parameter: default is ChModalDampingNone(). ); >>> ``` >>> >>> After the reduction the program crashes with SEGV at either >>> ``` >>> ComputeModesDamped(10); >>> ``` >>> or (if the above is commented out) at >>> >>> ``` >>> sys.DoStepDynamics(step_size); >>> ``` >>> The model has 1302 nodes and 3441 elements >>> It's very frustrating since I don't know where my mistake may be >>> >>> Thanks in advance for your help >>> >>> Regards, >>> Victor >>> >>> -- You received this message because you are subscribed to the Google Groups "ProjectChrono" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/projectchrono/9b969c54-e8a1-40e8-acbb-26fc8a358275n%40googlegroups.com.
