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:
- Experiment with different restart modes besides RS-SVD.
- 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!