Self-contact when contact regions are unknown (Abaqus-like general contact)

I’m trying to run a self-contact simulation in CalculiX for a highly complex deforming shape. In the initial phase I cannot predict which regions will come into contact, so I’m trying the “single contact skin” approach.

Based on a YouTube comment and the related Discourse thread (“Is there an easy way to define self-contact?”), I created only one *SURFACE and used the same surface as both master and slave:

*CONTACT PAIR, INTERACTION=self, TYPE=NODE TO SURFACE, ADJUST=0.1
Sselfcontact, Sselfcontact

I also tried:

  • TYPE=SURFACE TO SURFACE with the same surface as master/slave

  • PRESSURE-OVERCLOSURE=LINEAR with a high stiffness (1e13)

  • PRESSURE-OVERCLOSURE=HARD

In all cases, self-contact is not working (either no contact is enforced or it fails to converge).

What is the recommended way to achieve robust self-contact in CalculiX when you can’t identify contact regions upfront? If “surface-to-itself” is not reliable, what workflow do you recommend (e.g., partitioning the skin into patches and auto-generating contact pairs)?

Did you try to run a model without contacts to see where the part will get in contact, and then re-run but now with contacts defined? Is a rubber part?

1 Like

Could you at least share a picture of this model ? Perhaps it could be simplified a bit and split into regions for potential contact. I’m not really surprised this approach doesn’t work well. Actually, it would require general contact algorithm, but only Abaqus has it.

1 Like

Actually, I need to create a large number of samples to train an ML model with random designs and apply general contact, similar to how it is applied in Abaqus. I need to apply contact on all outer surfaces. The samples will have random designs, as shown below.

The samples will have random designs, as shown below. I need to apply contact on all outer surfaces.

Is there an inp file with the mesh to do some testing?

And the cells are analyzed one by one ? How are they loaded ?

Yeah they are loaded one by one. I cannot split the surface properly to define the master and slave as I want to automate this process, and I cannot know which surfaces will be in contact initially so I want definite contact on all outer surfaces

Do you compress them from all sides ? How do you determine the regions to apply loading/BCs ? Unless you are using contact with rigid surfaces, for instance.

Can you share one cell as an example ?

It’s a compression with a rigid body at the top and bottom.

Here’s how Abaqus handles it with general contact (quick run using coarse mesh)

cell compression

Thank you so much for that.

How to do the same in CalculiX?

I am trying do the same as done in the below research paper.

https://arxiv.org/pdf/2504.01195

@kptarun403 can you share at least one geometry file for the public to do some testing?

If you need a free option, use openradioss, (it is for all practical purposes the same as LS dyna but the company open sourced it, presumably to get grad students to develop new materials etc) I am using PrePoMax to build my models and then convert the inp to k files with LS prepost (which is free) and then always some time with the text editor. could also use the student version of Ansys LS dyne, or the solver anyway as the pre-processor is just horrible. I have the license and am still using PrePoMax

hi, what’s element type do you use? can some screenshot of model and error message provided.

At first, I tried to verify whether self-contact actually works by running a simple simulation using a plate with a hole placed between rigid plates. I defined the surface using the hole nodes and assigned the same surface as both the master and slave. Initially, the simulation failed badly, but I was eventually able to get it working by tuning the pressure-overclosure linear stiffness and using very small step increments. However, there is a huge difference—on the order of 10^3—in the von Mises stress values when I compare the results with Abaqus.
plate with a hole: Plate_with_hole - Google Drive

I have also created the Gaussian distribution cell structure, but there is still a lot that needs to be fixed.
cell: cell - Google Drive

Thanks for the suggestion. I’m trying to move a contact-heavy case from CalculiX (plate with a hole compressed between two rigid tools, including self-contact) to OpenRadioss/LS-DYNA. Could you briefly share how you go from PrePoMax → LS-PrePost → .k, and which contact setup you use for unknown/self-contact regions?

Some questions/tips:

  1. Are the cells really made of steel and 1 m in size ?
  2. Linear elasticity is valid only for small strains - you should use hyperelasticity or at least add plasticity.
  3. I had to fix the surface definitions and switch to element-based surfaces - is there any reason why you defined them as node-based ?
  4. The mesh should be refined and not consist of CPS3 elements.
  5. Might be good to make the plates a little thicker for contact (or try with a 3D solid model first).
  6. You may have to use linear contact with non-default stiffness (watch out for penetrations).
  7. Try with adjustment enabled for plate-to-cell contact.
  8. Enable NLGEOM and use non-default incrementation, applying the load gradually (e.g. initial increment size of 0.01 s).
2 Likes