In MARS, when a node-node contact is created, a variable called Distance At Contact (dac) is calculated as:
- Code: Select all
// tk1, tk2 are the contact thickness set via input for node list 1 and node list 2, respectively
dac = max(n1->getRad(), tk1) + max(n2->getRad(), tk2);
dst = n1->calcDist(n2); // distance between two nodes (center to center)
if (!adc) // adc is false by default
dac = min(dac, dst);
So, if the two nodes overlap at time zero, dac is set to the current distance (dac == dst holds).
When MARS evaluates the forces within the contact object, it first checks if nodes are close enough:
- Code: Select all
// dst: distance between two nodes (center to center)
real gap = dst - dac;
if (gap > cdd) { // cdd: contact detection distance via input
remove();
return;
} else if (gap >= 0.) {
csv[0] = 0.;
return;
}
From the second code segment, the contact gap is checked against dac. Therefore, if the two nodes overlap at time zero, in the first step, dst == dac holds, and the contact is inactive.
This logic is implemented to prevent a model from exploding at time zero.