# Contacts disappear during meshing phase

**URL:** <https://forum.itascainternational.com/t/contacts-disappear-during-meshing-phase/2295>\
**Category:** 3DEC\
**Created:** [November 27, 2025, 10:24am UTC](https://forum.itascainternational.com/t/contacts-disappear-during-meshing-phase/2295 "2025-11-27T10:24:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Theophile](https://yyz1.discourse-cdn.com/flex031/user_avatar/forum.itascainternational.com/theophile/32/299_2.png) [@Theophile](https://forum.itascainternational.com/u/Theophile)\
**Post date:** [November 27, 2025, 10:24am UTC](https://forum.itascainternational.com/t/contacts-disappear-during-meshing-phase/2295/1 "2025-11-27T10:24:35Z")

</div>

Hi again, everyone!

On another model, we have been facing difficulties getting a functional mesh: during meshing, some contacts “disappear”.  
We had to do some trial-and-error to get a mesh with the full contact set and a small step aside brings those “lost” contacts after meshing.

 ![image](https://canada1.discourse-cdn.com/flex031/uploads/itasca/original/2X/9/963f7a1b8c5675ee3e985618d9c3c0dbc288e891.png)  
 ![image](https://canada1.discourse-cdn.com/flex031/uploads/itasca/original/2X/c/c8b51c07a2fee11525ebe0caab9b6dc8a81e8e2f.png)

The model is quite simple: 1 main contact and 2 contacts stopping on the first one.  
Changing the mesh size or the tolerances (atol, btol, ctol…) did not affect this issue.  
However, those aspects did:

- moving one of the secondary faults a bit (option `shift_fz3=true` in script below)
- making one or both of the secondary faults persistent (options `persistent_fz2=true` and/or `persistent_fz2=true` in script below)

Would you have any advice to avoid this bias?

Thank you!

Cheers

Theophile

> **Test script**
>
> ```auto
> model new
> 
> def testing_options
> ; true -> meshing ok
> global shift_fz3 = false
> ; true -> meshing ok
> global persistent_fz2 = false
> ; true -> meshing ok
> global persistent_fz3 = false
> end
> [testing_options]
> 
> block create prism &
> face-1 &
> (7069.758733347873, 9148.399873964489, -4000.0) &
> (7069.758733347873, -6531.6001260355115, -4000.0) &
> (-9300.241266652127, -6531.6001260355115, -4000.0) &
> (-9300.241266652127, 9148.399873964489, -4000.0)) &
> face-2 &
> (7069.758733347873, 9148.399873964489, -150.0) &
> (7069.758733347873, -6531.6001260355115, -150.0) &
> (-9300.241266652127, -6531.6001260355115, -150.0) &
> (-9300.241266652127, 9148.399873964489, -150.0)
> 
> def set_fz_params
> local shift = vector(0,0,0)
> if shift_fz3
> shift = vector(1000,0,0)
> end_if
> global fz_params = map()
> fz_params('fz1') = map('origin', vector(0.0, 0.0, -1581.554472958834), 'dip', 80., 'dip-direction', 200.)
> fz_params('fz2') = map('origin', vector(1059.344431650592, 3186.130495247431, -2101.024712960352), 'dip', 31.242008374994324, 'dip-direction', 128.59707580316046)
> fz_params('fz3') = map('origin', vector(-1471.5217985903146, -1418.440081932582, -1450.0)+shift, 'dip', 29.906306040857892, 'dip-direction', 117.13464181198472)
> end
> [set_fz_params]
> 
> ; Main contact    
> block cut joint-set &
> origin [fz_params('fz1')('origin')->x],[fz_params('fz1')('origin')->y],[fz_params('fz1')('origin')->z] &
> dip [fz_params('fz1')('dip')] &
> dip-direction [fz_params('fz1')('dip-direction')]
> ; Tag sides
> block group "fz1=above" range plane &
> origin [fz_params('fz1')('origin')->x],[fz_params('fz1')('origin')->y],[fz_params('fz1')('origin')->z] &
> dip [fz_params('fz1')('dip')] &
> dip-direction [fz_params('fz1')('dip-direction')] &
> above
> block group "fz1=below" range group "fz1=above" not
> ; Secondary contacts
> def hide_fz1_above
> if persistent_fz2==false
> command
> block hide range group "fz1=above"
> end_command
> end_if
> end
> [hide_fz1_above]
> block cut joint-set &
> origin [fz_params('fz2')('origin')->x],[fz_params('fz2')('origin')->y],[fz_params('fz2')('origin')->z] &
> dip [fz_params('fz2')('dip')] &
> dip-direction [fz_params('fz2')('dip-direction')]
> block hide off
> def hide_fz1_below
> if persistent_fz3==false
> command
> block hide range group "fz1=below"
> end_command
> end_if
> end
> [hide_fz1_below]
> block cut joint-set &
> origin [fz_params('fz3')('origin')->x],[fz_params('fz3')('origin')->y],[fz_params('fz3')('origin')->z] &
> dip [fz_params('fz3')('dip')] &
> dip-direction [fz_params('fz3')('dip-direction')]
> block hide off
> 
> block zone generate edge 1000
> 
> ```

---

<div class="post-metadata">

**Author:** ![jhazzard](https://avatars.discourse-cdn.com/v4/letter/j/4af34b/32.png) [@jhazzard](https://forum.itascainternational.com/u/jhazzard)\
**Post date:** [November 28, 2025, 7:41pm UTC](https://forum.itascainternational.com/t/contacts-disappear-during-meshing-phase/2295/2 "2025-11-28T19:41:10Z")

</div>

This appears to be a plotting issue. You can plot contacts and see that the “missing” contact exists. It is initially mistyped as an edge-edge contact, so the joint plane is not plotted. If you give the command “block contact gen-sub” it will become a face-face contact (note that this same regeneration of subcontacts occurs before applying stresses, or cycling or anything else that needs them). The joint plane plot will eventually retriangulate itself if you are running in large strain and the missing joint will appear. You can force the retriangulation with the command BLOCK JOINT-PLANE DELETE. Then regenerate the plot. Note that this triangulation is only used for plotting. All of this should not affect the calculations.

---

<div class="post-metadata">

**Author:** ![Theophile](https://yyz1.discourse-cdn.com/flex031/user_avatar/forum.itascainternational.com/theophile/32/299_2.png) [@Theophile](https://forum.itascainternational.com/u/Theophile)\
**Post date:** [December 1, 2025, 2:40pm UTC](https://forum.itascainternational.com/t/contacts-disappear-during-meshing-phase/2295/3 "2025-12-01T14:40:32Z")

</div>

Hi.

Thank you, @jhazzard , it worked!

Cheers

Theophile
