Creating new finite element

74 views
Skip to first unread message

Vic M

unread,
Jan 16, 2024, 4:47:51 AM1/16/24
to ProjectChrono
Hello, everyone

I've been trying to solve my problem with modal reduction for some time now with no significant success. Despite my model has finally been reduced (the correct way to do it I'll describe later in the my conversation) the DoFs are still to many. The reason is the abundance of boundary nodes and links between them and the interface node.
The only way to solve this (as I see it, may be I'm wrong) is to attach these nodes not with links but with finite elements. The problem is that I need to attach ChNodeFEAxyz to ChNodeFEAxyzrot and there's no such an element (I couldn't find one at least).


So finally my question: Is there any guide how to create an element? I guess the
ChElementGeneric class should be somehow inherited and reimplemented with the new element math? 
Thanks in advance

________________________
Best regards,
Victor

Vic M

unread,
Jan 31, 2024, 5:41:04 AM1/31/24
to ProjectChrono
Good day!

I've been trying to figure out how to create my own element and studies ChElementBeamEuler to understand how to construct it correctly.
First, I was trying to determine all the coordinates systems for components of the equations (in particularly for ShapeFunction) and meet the following code

void ChElementBeamEuler_63::GetStateBlock(chrono::ChVectorDynamic<> &mD) { mD.resize(9);
ChVector<> delta_rot_dir; double delta_rot_angle;
// Node 0, displacement (in local element frame, corotated back)
// d = [Atw]' Xt - [A0w]'X0
ChVector<> displ = this->q_element_abs_rot.RotateBack(nodeA->Frame().GetPos())
                                  - this->q_element_ref_rot.RotateBack(nodeA->GetX0().GetPos());

mD.segment(0, 3) = displ.eigen();
...

If I understand everything correctly

[Atw]' Xt - is current position of nodeA rotated into the current element orientation
[A0w]'X0 - is the original position of nodeA rotated into the original element position
Since

Xt = nodeA->Frame().GetPos()
X0 = nodeA->GetX0().GetPos()

Xt and X0 are both in the same (world) frame (coordinate system)

But again the [
Atw] != [A0w] and we get that vector [Atw]' Xt  and [A0w]'X0 are in different coordinate systems!!!!
How comes?!!

Maybe I miss something... If anyone knows what's going on, please explain=)


Reply all
Reply to author
Forward
0 new messages