View on GitHub
Download this project as a .zip file Download this project as a tar.gz file
redbKIT
a MATLAB library for reduced-order modeling of PDEs

Vascular FSI: tissue prestress

Blood vessel tissue prestress

In cardiovascular FSI simulations patient-specific geometries of blood vessels are usually reconstructed from in vivo medical imaging such as CT scans. When imaged, the blood vessels are in a state of mechanical stress that puts them in equilibrium with loading coming from the blood flow (i.e. blood pressure and viscous traction). As a result, when modeling blood vessel tissue, a patient specific geometry configuration coming from imaging data may not be used as a stress-free configuration. Taking the in vivo geometry as stress-free is especially not suitable for fluid-structure interaction simulations as this assumption will lead to non-physical large deformations under realistic loading.

To overcome these shortcomings in simulation on patient-specific geometries, techniques that allow for the evaluation of a stress-state that corresponds to a given spatial configuration under known external loads are necessary. Here, we follow the approach proposed by (Hsu and Bazilevs, 2011). To this end, let us recall the weak formulation of the nonlinear elastodynamics equations modeling the solid material in FSI simulations: find $\bd = \bd(t) \in V_D$ such that

where $\Omega^S$ is the solid domain in the reference configuration, $\SS$ is the second Piola–Kirchhoff stress tensor and $\PP = \FF \SS$ is the first Piola–Kirchhoff stress tensor. To account for the prestress state, the variational formulation \eqref{eq:CSM_DynamicWeak} is modified as follows: find $\bd = \bd(t) \in V_D$ such that

where $\SS_0$ is an a priori specified prestress tensor. This latter is designed such that in the absence of displacement the blood vessel is in equilibrium with the blood flow forces. This condition leads to the following variational problem, obtained by setting $\bd = \mathbf{0}$ in \eqref{eq:CSM_DynamicWeak2}: find $\SS_0$ such that

where $\Gamma$ is the fluid-structure interface in the reference configuration and $\widetilde{\mathbf{h}}$ is the fluid traction vector. This latter can be obtained, e.g., from a separate rigig-wall blood flow simulation on the reference domain with steady inflow and resistance outflow boundary conditions.

We obtain a particular solution for the state of prestress $\SS_0$ following the iterative procedure detailed in (Hsu and Bazilevs, 2011), which is implemented in the FSI_PrestressSolver function.

A the albegraic level, the prestress term in the structural equations yields the following additional contribute to the solid residual vector:

In particular, the residual vector and the Jacobian matrix become

where

Note that the vector $\RR_P$ and the matrix $\JJ_P$ do not depend on the unknown displacement. Therefore, they can be assembled once and for all at the beginning of the FSI simulation.

Workflow

The entire procedure for the simulation of an FSI problem with prestress consists of three main steps which are detailed below.

Warning: for the time being, the FSI_PrestressSolver only supports the NeoHookean material model.

Step 1: CFD simulation with steady inflow

Run a rigid-wall blood flow simulation on the reference domain with steady inflow until convergence to a steady solution

%% Load F mesh
[vertices, boundaries, elements] = msh_to_Mmesh('../mesh/FluidVeryCoarse', dim);

%% Solve Fluid
[U0_Fluid, MESH, DATA] = NSt_Solver(dim, elements, vertices, boundaries, {'P1','P1'}, 'datafile_CFD_Steady', [], 'Figures/PreStressFluid_');

save U0_Fluid U0_Fluid;

In the datafile datafile_CFD_Steady we use the following inflow profile (short ramp to a constant value equal to the flowrate at $t_0 = 0$)

Q_0 = Flow_Rate( 0 );
data.bcDir_t = @(t) Q_0 / 2 * (1 - cos(pi/0.1*t) ) .* (t<0.1) +  Q_0 .* (t>=0.1);

data.bcDir{1,5} = @(x, y, z, t, param)( data.bcDir_t(t)  * N1(1) * 1 + 0.*x.*y); 
data.bcDir{2,5} = @(x, y, z, t, param)( data.bcDir_t(t)  * N1(2) * 1 + 0.*x.*y); 
data.bcDir{3,5} = @(x, y, z, t, param)( data.bcDir_t(t)  * N1(3) * 1 + 0.*x.*y); 

Moreover, we set the ExportFinalLoad field in the datafile in order to compute the traction vector $\widetilde{\mathbf{h}}$ on the FS interface $\Gamma$

data.Output.ExportFinalLoad.computeLoad = true;
data.Output.ExportFinalLoad.flag        = 200;
data.Output.ExportFinalLoad.filename    = 'PrestressFluidLoad.mat';

Step 2: find the prestress tensor $\SS_0$

Launch the FSI_PrestressSolver to find the prestress tensor $\SS_0$ which equilabrates the fluid traction load

[mshS.vertices, mshS.boundaries, mshS.elements, mshS.rings] = msh_to_Mmesh('../mesh/SolidVeryCoarse', dim);
[mshF.vertices, mshF.boundaries, mshF.elements, mshF.rings] = msh_to_Mmesh('../mesh/FluidVeryCoarse', dim);

[R_P, J_P] = FSI_PrestressSolver(dim, mshF, mshS, {'P1','P1'}, 'P1', 'datafile_CFD', 'datafile_CSM_Prestress', [], 'Figures/PreStressSolid_');

Save the residual and Jacobian contributes given by the prestress term in the solid equations, namely $\RR_P$ and $\JJ_P$.

save R_P R_P;
save J_P J_P;

Step 3: run the FSI simulation

Run the FSI simulation with prestresss contribute in the structural equations

%% Solve FSI
FSIt_Solver(dim, mshF, mshS, {'P1','P1'}, 'P1', 'datafile_CFD', 'datafile_CSM', [], 'Figures/FSIsol_');

To this end, the Prestress flag should be set to true in the CSM datafile

data.Prestress = true;

Moreover, initial condition for the fluid velocity and pressure should be loaded from file. To this end, set in the CFD datafile

% initial condition
data.u0{1}    = @(x, y, z, t, param)(load_ICfluid(x, 1));
data.u0{2}    = @(x, y, z, t, param)(load_ICfluid(x, 2));
data.u0{3}    = @(x, y, z, t, param)(load_ICfluid(x, 3));
data.p0       = @(x, y, z, t, param)(load_ICfluid(x, 4));

where

function v = load_ICfluid(x, d)

load U0_Fluid U0_Fluid;
numNodes = length(x);

if d < 4
    v = U0_Fluid(1+(d-1)*numNodes:numNodes*d)';
else
    v = U0_Fluid(1+(d-1)*numNodes:end)';
end
end

References

  • M.C. Hsu, and Y. Bazilevs. Blood vessel tissue prestress modeling for vascular fluid–structure interaction simulation. Finite Elements in Analysis and Design, 47(6), 593-599, 2011.
  • Y. Bazilevs, K. Takizawa, and T. E. Tezduyar. Computational fluid-structure interaction: methods and applications. John Wiley & Sons, 2013.