Coupling scheme for quasi-steady-state FSI

Hello,

I am trying to set up an FSI simulation. For the fluid part, I am using my own solver, which is steady-state (not time-dependent), and for the solid part, I’m using the deal.II adapter provided by preCICE which is time dependent.

The subject of my simulation is a foil (a kind of wing) submerged in water.
At first, I tried with an explicit coupling between the two solvers and observed some vibrations of the wing. Since the simulation is quasi-steady, I suspected this behavior might be due to numerical errors. So, I decided to switch to implicit coupling.

Because of an error raised by preCICE, I added the two checkpoint statements (read and write state) in my fluid solver, as well. However, I’m not actually doing anything inside these two if-statements, since in my case there’s no need to reset any old variables or go back to a previous state.

That said, this part is still not entirely clear to me. So, I would like to ask if this reasoning makes sense, or if I am missing something or doing it incorrectly.

I just posting the configuration file here:

<?xml version="1.0" encoding="UTF-8" ?>

<precice-configuration>
  <log>
    <sink
      filter="%Severity% >= debug and %Rank% = 0"
      format="---[precice] %ColorizedSeverity% %Message%"
      enabled="true" />
  </log>
  
    <data:vector name="Displacements"/>
    <data:scalar name="Pressure" />

    <mesh name="FluidMesh" dimensions="3">
      <use-data name="Displacements"/>
      <use-data name="Pressure" />
    </mesh>

    <mesh name="StructureMesh" dimensions="3">
      <use-data name="Displacements"/>
      <use-data name="Pressure" />
    </mesh>

    <participant name="FluidSolver">
      <provide-mesh name="FluidMesh" />
      <receive-mesh name="StructureMesh" geometric-filter="on-secondary-ranks" from="SolidSolver" safety-factor="5."/>
      <read-data  name="Displacements" mesh="FluidMesh"/>
      <write-data  name="Pressure" mesh="FluidMesh"/>
      <mapping:nearest-neighbor direction="read" from="StructureMesh"
                                to="FluidMesh" constraint="consistent"/>
    </participant>

    <participant name="SolidSolver">
      <provide-mesh name="StructureMesh" />
      <receive-mesh name="FluidMesh" geometric-filter="on-secondary-ranks" from="FluidSolver" safety-factor="5."/>
      <write-data name="Displacements" mesh="StructureMesh"/>
      <read-data  name="Pressure" mesh="StructureMesh"/>
      <mapping:nearest-neighbor direction="read" from="FluidMesh"
                                to="StructureMesh" constraint="consistent"/>
    </participant>

    <m2n:sockets acceptor="SolidSolver" connector="FluidSolver"/>

    <coupling-scheme:serial-implicit>
      <participants first="FluidSolver" second="SolidSolver"/>
      <max-time-windows value="100" />
      <time-window-size value="1.e-3" />
      <exchange data="Displacements" mesh="StructureMesh" from="SolidSolver" to="FluidSolver" initialize="yes"/>
      <exchange data="Pressure" mesh="FluidMesh" from="FluidSolver" to="SolidSolver" initialize="yes"/>
      <max-iterations value="50"/>
      <relative-convergence-measure limit="1.e-6" data="Displacements" mesh="StructureMesh"/>
      <relative-convergence-measure limit="1.e-6" data="Pressure" mesh="FluidMesh"/>
      <!--<acceleration:constant>
        <relaxation value="0.5"/>
      </acceleration:constant>-->
      <!--<acceleration:aitken>
        <data name="Displacements" mesh="StructureMesh"/>
        <initial-relaxation value="0.1"/>
      </acceleration:aitken>-->
      <acceleration:IQN-ILS>
        <data name="Displacements" mesh="StructureMesh"/>
        <!--<data name="Pressure" mesh="FluidMesh"/>-->
        <preconditioner type="residual-sum"/>
        <filter type="QR2" limit="1e-3"/>
        <initial-relaxation value="0.1"/>
        <max-used-iterations value="100"/>
        <time-windows-reused value="20"/>
      </acceleration:IQN-ILS>
    </coupling-scheme:serial-implicit>
</precice-configuration>

Also, I don’t fully understand the difference between parallel and serial coupling, as I’m seeing completely different convergence behavior in the two cases.