Stabilizing the Turek/Hron FSI3 Benchmark with IQN-IMVJ

I recently ran into difficulties while trying to stabilize the Turek/Hron FSI3 benchmark using an implicit parallel coupling scheme with the IQN-IMVJ acceleration method in preCICE. Interestingly, the setup works flawlessly when using either constant relaxation or IQN-ILS, so the issue seems to be specific to the IMVJ method.

Here’s the relevant section of my precice-config.xml for the coupling scheme:

<coupling-scheme:parallel-implicit>
  <participants first="FASTEST" second="Calculix"/>
  <time-window-size value="0.001" />
  <max-time-windows value="4000"/>
  <exchange data="Forces"        mesh="Structure_Nodes" from="FASTEST" to="Calculix" initialize="yes"/>
  <exchange data="Displacements" mesh="Structure_Nodes" from="Calculix" to="FASTEST" initialize="yes"/>
  <acceleration:IQN-IMVJ>
    <initial-relaxation value="0.1"/>
    <imvj-restart-mode type="RS-SVD" chunk-size="16" truncation-threshold="1e-2"/>
    <max-used-iterations value="100"/>
    <time-windows-reused value="20"/>
    <data name="Displacements" mesh="Structure_Nodes"/>
    <data name="Forces" mesh="Structure_Nodes"/>
    <filter type="QR2" limit="1e-3"/>
    <preconditioner type="residual-sum"/>
  </acceleration:IQN-IMVJ>
  <relative-convergence-measure limit="1e-5" data="Displacements" mesh="Structure_Nodes" suffices="1"/>
  <max-iterations value="200"/>
</coupling-scheme:parallel-implicit>

According to the documentation, the default parameters for the RS-SVD restart mode are:

<imvj-restart-mode type="RS-SVD" chunk-size="8" truncation-threshold="0.0001"/>

Note that the option reused-time-windows-at-restart is not recognized by preCICE when I try to use it.

Since the configuration outside the acceleration method works with both constant relaxation and IQN-ILS, I suspect that the IMVJ-specific restart parameters are the key issue. So far, I have experimented with:

  • Increasing the number of chunks
  • Relaxing the truncation threshold

I picked values in the same order of magnitude as those recommended in Klaudius Scheufele’s PhD thesis for other test cases, but I haven’t found yet those specifically used for the FSI3 benchmark as he uses it in his thesis.

For reference, my setup uses Calculix for the structural solver and an in-house CFD code with implicit time discretization.

The Error

The simulation runs smoothly for about 17 time windows and then crashes with a segmentation fault in the Calculix adapter. The backtrace clearly points to the acceleration method itself:

[node06:38771:0:38771] Caught signal 11 (Segmentation fault: address not mapped to object at address (nil))
==== backtrace (tid:  38771) ====
 0 0x00000000000aa017 Eigen::JacobiSVD<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::compute()  IQNIMVJAcceleration.cpp:0
 1 0x00000000000abcf2 precice::acceleration::impl::SVDFactorization::update<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Transpose<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >()  :0
 2 0x000000000009591a precice::acceleration::IQNIMVJAcceleration::restartIMVJ()  :0
 3 0x000000000009702e precice::acceleration::IQNIMVJAcceleration::specializedIterationsConverged()  :0
 4 0x0000000000080b59 precice::acceleration::BaseQNAcceleration::iterationsConverged()  :0
 5 0x00000000000ffb5d precice::cplscheme::BaseCouplingScheme::doImplicitStep()  :0
 6 0x000000000010fafb precice::cplscheme::ParallelCouplingScheme::exchangeSecondData()  :0
 7 0x000000000010301f precice::cplscheme::BaseCouplingScheme::secondExchange()  :0
 8 0x00000000002c8941 precice::impl::ParticipantImpl::advanceCouplingScheme()  :0
 9 0x00000000002ce7a4 precice::impl::ParticipantImpl::advance()  :0
10 0x000000000068948b nonlingeo_precice()  ???:0
11 0x000000000041f394 main()  ???:0
12 0x0000000000022555 __libc_start_main()  ???:0
13 0x0000000000417042 _start()  ???:0
=================================

After this, the Calculix adapter aborts with a segmentation fault.

Next Steps

My current plan is to:

  1. Experiment with different restart modes besides RS-SVD.
  2. Try smaller chunk sizes and stricter truncation thresholds.

I’d be very interested in getting directions on which parameters I should modify in the configuration of the acceleration methods, especially the restart method when such issue arise. Note that I was able to converge to a solution with IQN-IMVJ for the lid-driven cavity with flexible bottom benchmark using the default parameter for the restart method. I believe the Turek benchmark has been used in several studies from the preCICE team, if you have insights, I’d love to hear them!

Hi,

Which versions of preCICE and CalculiX are you using?

CCX/CGX V2.20 et preCICE 3.1.2. I assume this option is available in preCICE 3.2 ?

Hi,
this looks like a possible untested defect in the implementation in RS-SVD method. Maybe the input matrix for this SVD operation is improper without being detected and warned etc.

Have you tried this? Would be interesting to know.

If you are still having the issue, could you please also provide the convegence.log, iterations.log and the full output with the error message? Thank you.

This might be late, but I think I had a very similar problem some times. If you use the residual-sum preconditioning and you use the singular value decomposition based restart RS-SVD, you must freeze the preconditioner using freeze-after after the first iteration:

          <preconditioner type="residual-sum" freeze-after="1"/>

I think it is a property of the RS-SVD approach that it needs a preconditioner value that does not change after the first iteration. The reasoning is somewhere in Klaudius’ PhD thesis, but I did not find it myself either. I had to ask Klaudius to learn about this. :slight_smile:

Please feel free to correct me if this has changed. It has been a while since I have used preCICE the last time.

Hi,

I believe the issue was related to the point that @ajaust explains in his reply. Since I have finished writing the master’s thesis for which I had to work with preCICE (since September 2025), I am no longer able to provide additional information on this particular issue, as I no longer have access to the cases in which it occurred. Sorry for the inconvenience.

1 Like