1

Topic: Rigid arms

I have found somehow strange behavior of rigid arm:
Fro example, if we assume following example of a beam connected to a solid part:

                                  o------------------------------
                                  |
--------beam-------O   o------------------------------   
                                  |
                                  o-------------------------------

I originally have started with this input:

#master node with 6 DOFs (beam)
node m coords 3 0 0 0  ndofs 6 dofidmask 6 1 2 3 4 5 6 
#slaves (only x displacement determined from master)
rigidarmnode s1 coords 3 0 0 0 ndofs 3 dofidmask 3 1 2 3 doftype 3 2 0 0 mastermask 3 1 0 0
...

I have ended with all slaves having the same displacement (in x direction) as master node. What I expected, is that slave displacement is affected by master displacement and rotation (us = um+ rot_y*z - rot_z*y), but it was not.
Then I have added rotational DOFs to slaves:

#master node with 6 DOFs (beam)
node m coords 3 0 0 0  ndofs 6 dofidmask 6 1 2 3 4 5 6 
#slaves (only x displacement determined from master)
rigidarmnode s1 coords 3 0 0 0 ndofs 6 dofidmask 6 1 2 3 4 5 6 doftype 3 2 0 0 2 2 2 mastermask 3 1 0 0 1 1 1
...

Now it works as expected. I am fine with the second solution, even though it does not follow from input description and in my opinion the first one is more "natural". Is this an intentinal behaviour after refactirization of rigidArms?
Borek

Re: Rigid arms

I agree. I think the first example should work with rotation.

This is my fault. I've tried to make RigidArmNode rely on the supplied dofidmask, in an attempt to remove the assumption that all dofs have the same dofidmask (replacing domainType with automatic detection of dofs) so that we can easily support things like XFEM and contact simulations where new dofs appear dynamically.
This means removing assumptions on the order of the dofs as well, which is why I thought it would be safer to use a map for the masterContribution.
---

I think the problem lies in these if-statements:

                if ( uvw.at(2) && masterMask.at( uvw.at(2) ) ) {
                    R_uvw.at(3) =  ( ( int ) R_v );
                }

uvw shouldn't check if R_u etc. exists in the dofidmask, they should check if it exists in the master node.
And the masterMask shouldn't apply at all here.  Instead, we should just remove "uvw" and have:

                if ( masterNode->hasDofID(R_v) ) {
                    R_uvw.at(3) =  ( ( int ) R_v );
                }

Unfortunately, I don't have time to check right now, but I could take a look this weekend.