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.

Reply via email to