Ok. Now I'm absolutely sure that the problem is with ChLink.... but have no clue on how to fix it. I've tried both AddInternalLink(my_root) and AddLink(my_root) with the same result: "SymShiftInvert: factorization failed with the given shift"
If anyone knows where the problem lies It'd be very helpful On Tuesday, December 5, 2023 at 10:42:27 AM UTC+3 Vic M wrote: > 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/d475d3cc-9566-4a50-a612-b8af174e2e00n%40googlegroups.com.
