From f21a55a254d829981d4a5fa682088a97f5a85cc6 Mon Sep 17 00:00:00 2001 From: Ester Date: Mon, 11 May 2020 16:31:45 -0400 Subject: [PATCH] Initial source code and documentation --- .gitignore | 9 +- Nonlinear_PoroViscoelasticity/CMakeLists.txt | 47 + Nonlinear_PoroViscoelasticity/doc/author.txt | 2 + .../doc/builds-on.txt | 1 + .../doc/dependencies.txt | 5 + .../doc/entry-name.txt | 1 + Nonlinear_PoroViscoelasticity/doc/tooltip.txt | 1 + .../PLOT-Franceschini.gp | 137 + .../parameters.prm | 197 + .../compression/PLOT-brain_g-mm-s-COMP.gp | 157 + .../compression/parameters.prm | 197 + .../shear/PLOT-brain_g-mm-s-SHEAR.gp | 154 + .../shear/parameters.prm | 197 + .../tension/PLOT-brain_g-mm-s-TENS.gp | 159 + .../tension/parameters.prm | 197 + .../compression/PLOT-brain_g-mm-s-COMP.gp | 133 + .../compression/parameters.prm | 197 + .../shear/PLOT-brain_g-mm-s-SHEAR.gp | 133 + .../shear/parameters.prm | 197 + .../tension/PLOT-brain_g-mm-s-TENS.gp | 133 + .../tension/parameters.prm | 197 + .../PLOT-consolidation.gp | 86 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../parameters.prm | 197 + .../PLOT-Verification-Ehlers-EPS.gp | 616 ++ .../PLOT-Verification-Ehlers.gp | 620 ++ .../5-Ehlers-verification/run-multi-calc.py | 213 + .../5-Ehlers-verification/runPoro.sh | 55 + .../nonlinear-poro-viscoelasticity.cc | 5110 +++++++++++++++++ Nonlinear_PoroViscoelasticity/parameters.prm | 197 + Nonlinear_PoroViscoelasticity/readme.md | 89 + 42 files changed, 11995 insertions(+), 3 deletions(-) create mode 100644 Nonlinear_PoroViscoelasticity/CMakeLists.txt create mode 100644 Nonlinear_PoroViscoelasticity/doc/author.txt create mode 100644 Nonlinear_PoroViscoelasticity/doc/builds-on.txt create mode 100644 Nonlinear_PoroViscoelasticity/doc/dependencies.txt create mode 100644 Nonlinear_PoroViscoelasticity/doc/entry-name.txt create mode 100644 Nonlinear_PoroViscoelasticity/doc/tooltip.txt create mode 100755 Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/PLOT-Franceschini.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/PLOT-brain_g-mm-s-COMP.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/PLOT-brain_g-mm-s-TENS.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/PLOT-brain_g-mm-s-COMP.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/PLOT-brain_g-mm-s-TENS.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/PLOT-consolidation.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/base_nos0.8_k40_Kos8.0e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.7_k40_Kos8.0e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k1_Kos8.0e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos1.6e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos4.0e-10_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-1/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-5/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu1.78e-4/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu4.45e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-13_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-9_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k80_Kos8.0e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.9_k40_Kos8.0e-11_mu0.89e-3/parameters.prm create mode 100755 Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers-EPS.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers.gp create mode 100755 Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/run-multi-calc.py create mode 100755 Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/runPoro.sh create mode 100644 Nonlinear_PoroViscoelasticity/nonlinear-poro-viscoelasticity.cc create mode 100755 Nonlinear_PoroViscoelasticity/parameters.prm create mode 100644 Nonlinear_PoroViscoelasticity/readme.md diff --git a/.gitignore b/.gitignore index 51c4338..a0ef372 100644 --- a/.gitignore +++ b/.gitignore @@ -27,10 +27,13 @@ *.out *.app -# Build folders -**/build/* +* macOS hidden files +*.DS_Store # IDE related files .project .cproject -.vscode \ No newline at end of file +.vscode + +# Build folders +**/build/* \ No newline at end of file diff --git a/Nonlinear_PoroViscoelasticity/CMakeLists.txt b/Nonlinear_PoroViscoelasticity/CMakeLists.txt new file mode 100644 index 0000000..a0a416d --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/CMakeLists.txt @@ -0,0 +1,47 @@ +## +# CMake script for the nonlinear-poro-viscoelasticity problem +## + +# Set the name of the project and target: +SET(TARGET "nonlinear-poro-viscoelasticity") + +# Declare all source files the target consists of: +SET(TARGET_SRC + ${TARGET}.cc + ) + +#Search for required deal.II version +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8) + +FIND_PACKAGE(deal.II 9.1 QUIET + HINTS ${deal.II_DIR} ${DEAL_II_DIR} ../ ../../ $ENV{DEAL_II_DIR} + ) +IF(NOT ${deal.II_FOUND}) + MESSAGE(FATAL_ERROR "\n" + "*** Could not locate a (sufficiently recent) version of deal.II. ***\n\n" + "You may want to either pass a flag -DDEAL_II_DIR=/path/to/deal.II to cmake\n" + "or set an environment variable \"DEAL_II_DIR\" that contains this path." + ) +ENDIF() + + +# Are all dependencies fullfilled? +IF(NOT DEAL_II_WITH_CXX11 OR + NOT DEAL_II_WITH_MPI OR + NOT DEAL_II_WITH_METIS OR + NOT DEAL_II_WITH_TRILINOS OR + NOT DEAL_II_TRILINOS_WITH_SACADO) + MESSAGE(FATAL_ERROR " +Error! The deal.II library found at ${DEAL_II_PATH} was not configured with + DEAL_II_WITH_CXX11 = ON + DEAL_II_WITH_MPI = ON + DEAL_II_WITH_METIS = ON + DEAL_II_WITH_TRILINOS = ON + DEAL_II_TRILINOS_WITH_SACADO = ON +One or all of these are OFF in your installation but are required for this code gallery example." + ) +ENDIF() + +DEAL_II_INITIALIZE_CACHED_VARIABLES() +PROJECT(${TARGET}) +DEAL_II_INVOKE_AUTOPILOT() diff --git a/Nonlinear_PoroViscoelasticity/doc/author.txt b/Nonlinear_PoroViscoelasticity/doc/author.txt new file mode 100644 index 0000000..30c8edd --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/doc/author.txt @@ -0,0 +1,2 @@ +Ester Comellas , +Jean-Paul Pelteret \ No newline at end of file diff --git a/Nonlinear_PoroViscoelasticity/doc/builds-on.txt b/Nonlinear_PoroViscoelasticity/doc/builds-on.txt new file mode 100644 index 0000000..0198e1f --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/doc/builds-on.txt @@ -0,0 +1 @@ +Step-44 gallery-Quasi-Static Finite-Strain Compressible Elasticity gallery-Quasi-Static Finite-Strain Quasi-incompressible Visco-elasticity \ No newline at end of file diff --git a/Nonlinear_PoroViscoelasticity/doc/dependencies.txt b/Nonlinear_PoroViscoelasticity/doc/dependencies.txt new file mode 100644 index 0000000..ccadfb5 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/doc/dependencies.txt @@ -0,0 +1,5 @@ +DEAL_II_WITH_CXX11 +DEAL_II_WITH_MPI +DEAL_II_WITH_METIS +DEAL_II_WITH_TRILINOS +DEAL_II_TRILINOS_WITH_SACADO \ No newline at end of file diff --git a/Nonlinear_PoroViscoelasticity/doc/entry-name.txt b/Nonlinear_PoroViscoelasticity/doc/entry-name.txt new file mode 100644 index 0000000..34bfcb1 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/doc/entry-name.txt @@ -0,0 +1 @@ +Nonlinear poro-viscoelasticity \ No newline at end of file diff --git a/Nonlinear_PoroViscoelasticity/doc/tooltip.txt b/Nonlinear_PoroViscoelasticity/doc/tooltip.txt new file mode 100644 index 0000000..2865e8f --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/doc/tooltip.txt @@ -0,0 +1 @@ +A parallelized biphasic nonlinear poro-viscoelastic formulation based on Ogden hyperelasticity, using automatic differentiation and MPI from the Trilinos package. diff --git a/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/PLOT-Franceschini.gp b/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/PLOT-Franceschini.gp new file mode 100755 index 0000000..b6882f3 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/PLOT-Franceschini.gp @@ -0,0 +1,137 @@ + +# GNUPLOT file to plot consolidation curve Francheschini (2006) + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test +clear +reset +set datafile separator "," + +# ------------------------------------------------------------------------------- +# DATA EXTRACTED WITH ENGAUGE FROM FRANCESCHINI PAPER COPIED HERE +# ------------------------------------------------------------------------------- +$dataFranceschiniFig2Ce << EOD +#minutes, consolidation ratio +0.083718,0.0738636 +0.167816,0.127841 +0.251772,0.15625 +0.336392,0.193182 +0.424147,0.21875 +0.504685,0.238636 +0.589026,0.252841 +0.674309,0.269886 +0.757172,0.284091 +0.833952,0.301136 +0.918517,0.318182 +1.01166,0.323864 +1.11424,0.335227 +1.18072,0.34375 +1.27557,0.349432 +1.37804,0.355114 +1.51778,0.360795 +1.6397,0.366477 +1.77142,0.375 +1.87711,0.383523 +2.19081,0.403409 +2.55693,0.426136 +2.87114,0.448864 +3.22396,0.471591 +3.48294,0.488636 +3.91095,0.505682 +4.56453,0.536932 +5.32734,0.559659 +5.98199,0.585227 +6.58858,0.605114 +7.25668,0.625 +7.83963,0.644886 +8.63459,0.659091 +9.14975,0.676136 +10.0776,0.6875 +11.9911,0.71875 +13.995,0.744318 +16.0213,0.761364 +18.341,0.784091 +19.8144,0.798295 +22.2493,0.815341 +24.0366,0.838068 +26.474,0.857955 +28.0535,0.872159 +30.8982,0.886364 +36.0618,0.897727 +40.4932,0.909091 +46.3562,0.917614 +51.0568,0.931818 +56.2341,0.940341 +61.9364,0.948864 +66.9119,0.954545 +72.287,0.960227 +78.094,0.965909 +84.3674,0.971591 +114.922,0.985795 +144.902,0.988636 +175.779,0.994318 +209.156,0.994318 +239.439,0.994318 +268.862,0.994318 +296.126,0.994318 +326.154,0.994318 +352.355,1.00284 +380.66,0.997159 +411.239,0.994318 +EOD + +fileNH = "data-for-gnuplot.sol" +# ------------------------------------------------------------------------------- +set term epslatex size 9cm,6cm color colortext standalone +set output "Franceschini-consolidation.tex" + +unset colorbox +unset grid + +set style line 1 lt 7 lw 2 lc rgb "black" ps 0.7 dt 1 +set style line 2 lt 2 lw 2 lc rgb "gray25" ps 0.7 dt 2 +set style line 3 lt 6 lw 2 lc rgb "gray50" ps 0.7 dt 3 +set style line 4 lt 10 lw 2 lc rgb "gray75" ps 0.7 + +set style line 5 lt 2 lw 5 lc rgb "dark-blue" + +# --------- CONSOLIDATION CURVE ------------------------------------------- +#Final specimen shortening ****CHANGE IF NEEDED*** +Umax = 8.1e-2 + +unset key + +# --------- EPSLATEX ------------------------------------------- +set key box out vert right above box width -6.0 height 1.0 + +set logscale x +set xrange [0.01:1000] +set yrange [1.1:-0.1] reverse + +set xlabel 'time [min]' +set ylabel 'consolidation ratio' + +plot '$dataFranceschiniFig2Ce' with points ls 3 title 'experimental data', \ + fileNH using (($1)/60):(-($7)/Umax) with lines ls 5 title 'nonlinear poroelasticity' + + + +# --------- PNG ------------------------------------------- + +set term png size 450,300 enhanced font 'Verdana,12' +set key box out vert right above box font 'Verdana,12' width -4.0 + +set logscale x +set xrange [0.01:1000] +set yrange [1.1:-0.1] reverse + +set xlabel 'time [min]' font 'Verdana,14' +set ylabel 'consolidation ratio' font 'Verdana,14' + +set output "Franceschini-consolidation.png" +plot '$dataFranceschiniFig2Ce' with points ls 1 title 'experimental data', \ + fileNH using (($1)/60):(-($7)/Umax) with lines ls 5 title 'nonlinear poroelasticity' diff --git a/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/parameters.prm new file mode 100755 index 0000000..4e64a6c --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/1-Franceschini_consolidation/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 2 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -4.24e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 6.825e3 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 10 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = true + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-6 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-6 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-6 + +end + + +subsection Time + # End time [s] + set End time = 18000 + + # Time step size [s] + set Time step size = 2.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 3 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/PLOT-brain_g-mm-s-COMP.gp b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/PLOT-brain_g-mm-s-COMP.gp new file mode 100755 index 0000000..e7010c4 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/PLOT-brain_g-mm-s-COMP.gp @@ -0,0 +1,157 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-red" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to compute reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = -y / (area*1000) #compression [10⁻⁶ N / mm² = Pa] +#nominal(y) = y / (area) #tension + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set xrange [1.0:0.89] reverse #compression +set yrange [0.0:5.5] + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 1.0 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_stress-stretch-poro-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($15)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($15)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($15)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Extra stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = -y / (area*1000) #compression [10⁻⁶ N / mm² = Pa] +#nominal(y) = y / (area) #tension + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'solid nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set xrange [1.0:0.89] reverse #compression +set yrange [0.0:5.5] + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 1.0 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_solid-stress-stretch-poro-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($21)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($21)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($21)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 0.5 +set autoscale xy +set format x "%3.0f" +set format y "%3.1f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set autoscale xy +set ytics 0.5 +set xtics 10 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.1 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-COMP.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($7) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/parameters.prm new file mode 100755 index 0000000..d326394 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/compression/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_tension_compression_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -0.5 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 6.825e3 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 10 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 90.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp new file mode 100755 index 0000000..0aab1be --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp @@ -0,0 +1,154 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-salmon" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to computre reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #[10⁻⁶ N / mm² = Pa] + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +#set xrange [] reverse #compression +set xrange [] noreverse #tension +set autoscale xy + +unset y2tics +set xtics autofreq rotate by 45 right +set ytics autofreq + +set output "brain_cube_stress-stretch-poro-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($5)):(nominal($13)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($5)):(nominal($13)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($5)):(nominal($13)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- solid Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #[10⁻⁶ N / mm² = Pa] + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'solid nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +#set xrange [] reverse #compression +set xrange [] noreverse #tension +set autoscale xy + +unset y2tics +set xtics autofreq rotate by 45 right +set ytics autofreq + +set output "brain_cube_solid-stress-stretch-poro-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($5)):(nominal($19)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($5)):(nominal($19)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($5)):(nominal($19)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 1.5 +set autoscale xy +set format x "%3.0f" +set format y "%3.1f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set autoscale xy +set format x "%3.1f" +set ytics 1.5 +set xtics 1 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using ($18/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($18/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($18/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.5 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-SHEAR.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($5) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/parameters.prm new file mode 100755 index 0000000..02a3662 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/shear/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_shear_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = 1.0 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 6.825e3 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 10 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 180.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/PLOT-brain_g-mm-s-TENS.gp b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/PLOT-brain_g-mm-s-TENS.gp new file mode 100755 index 0000000..2a44d96 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/PLOT-brain_g-mm-s-TENS.gp @@ -0,0 +1,159 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-blue" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to computre reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #[10⁻⁶ N / mm² = Pa] + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside bottom right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +#set xrange [] reverse #compression +set xrange [1.0:1.11] noreverse #tension +set yrange [0.0:5.0] +#set autoscale y + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 1.0 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_stress-stretch-poro-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($15)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($15)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($15)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- solid Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #[10⁻⁶ N / mm² = Pa] + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'solid nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside bottom right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +#set xrange [] reverse #compression +set xrange [1.0:1.11] noreverse #tension +set yrange [0.0:5.0] +#set autoscale y + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 1.0 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_solid-stress-stretch-poro-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($21)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($21)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($21)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 2 +set autoscale xy +set format x "%3.0f" +set format y "%3.0f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set autoscale xy +set ytics 2 +set xtics 10 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using ($18/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($18/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($18/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.1 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-TENS.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($7) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/parameters.prm new file mode 100755 index 0000000..518a08c --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/2-Graz-loading_poroelasticity/tension/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_tension_compression_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = 0.5 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 6.825e3 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 10 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 90.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/PLOT-brain_g-mm-s-COMP.gp b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/PLOT-brain_g-mm-s-COMP.gp new file mode 100755 index 0000000..e2b14f6 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/PLOT-brain_g-mm-s-COMP.gp @@ -0,0 +1,133 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-red" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to computre reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = -y / (area*1000) #compression [10⁻⁶ N / mm² = Pa] +#nominal(y) = y / (area) #tension + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set xrange [1.0:0.89] reverse #compression +set yrange [-0.5:1.5] + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 0.5 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_stress-stretch-poro-visco-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($15)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($15)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($15)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 10 +set autoscale xy +set format x "%3.0f" +set format y "%3.0f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-visco-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set autoscale xy +set ytics 10 +set xtics 2 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-visco-COMP.png" +plot 'data-for-gnuplot.sol' index 0 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (-($18)/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.1 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-visco-COMP.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($7) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/parameters.prm new file mode 100755 index 0000000..9fdce22 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/compression/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_tension_compression_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -0.5 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = visco-Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 24502 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 660.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = -83.9 + + # Shear modulus mu2 [Pa] + set mu2 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = -11.92 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = -2100 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = -2.2 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 14000 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.75 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 50 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 1.0e-8 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 90.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp new file mode 100755 index 0000000..9ca94f2 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/PLOT-brain_g-mm-s-SHEAR.gp @@ -0,0 +1,133 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-salmon" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to computre reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #compression [10⁻⁶ N / mm² = Pa] +#nominal(y) = y / (area) #tension + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside top left font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +#set xrange [] reverse #compression +set xrange [] noreverse #tension +set autoscale xy + +unset y2tics +set xtics autofreq rotate by 45 right +set ytics autofreq + +set output "brain_cube_stress-stretch-poro-visco-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($5)):(nominal($13)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($5)):(nominal($13)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($5)):(nominal($13)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 100 +set autoscale xy +set format x "%3.0f" +set format y "%3.0f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-visco-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set format x "%3.1f" +set autoscale xy +set ytics 100 +set xtics 0.5 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-visco-SHEAR.png" +plot 'data-for-gnuplot.sol' index 0 using ($18/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($18/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($18/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.5 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-visco-SHEAR.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($5) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/parameters.prm new file mode 100755 index 0000000..27f271d --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/shear/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_shear_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = 1.0 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = visco-Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 12250 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 250.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = -16.88 + + # Shear modulus mu2 [Pa] + set mu2 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = -29.62 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = -72.48 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = -25.11 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 38700 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.75 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 50 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 1.0e-8 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 180.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/PLOT-brain_g-mm-s-TENS.gp b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/PLOT-brain_g-mm-s-TENS.gp new file mode 100755 index 0000000..31789bb --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/PLOT-brain_g-mm-s-TENS.gp @@ -0,0 +1,133 @@ + +#GNUPLOT file to plot graphs of biomechanical brain tests in Budday et al 2017 +# **** cycles must be separated in the .sol file by two blank lines **** +# UNITS CONSIDERED: g - mm - s + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test + +clear +set datafile separator "," +set term png size 400,300 enhanced font 'Verdana,12' + + +unset colorbox +set style line 1 lw 1.5 lc rgb "black" dt 1 +set style line 2 lw 1.5 lc rgb "blue" dt 1 +set style line 3 lw 1.5 lc rgb "red" dt 1 +set style line 4 lw 1.5 lc rgb "dark-turquoise" dt 1 +set style line 5 lw 1.5 lc rgb "dark-blue" dt 1 + +set style line 100 lt 1 lw 1 lc rgb "gray" dt 3 +set style line 101 lt 1 lw 1 lc rgb "red" + +set notitle +set grid xtics ytics ls 100 + +# -------------------- PROBLEM DATA -------------------------------------------------------------------------------------- +#length of specimen along loading direction to compute stretch [mm] +length = 5.0 + +#area of loading surface to computre reaction force [mm²] +area = length * length #cube +#area = 3.1416 * (length/2) * (length/2) #cylinder + +#length to compute pressure gradient [mm] +radius = length/2 + +#pressure at drained boundary to compute pressure gradient [Pa] +atm_pressure = 0.0 + + +#dynamic (shear) fluid viscosity [Pa·s] +mu = 0.89e-3 +#effective fluid density [g/mm³] +rho = 0.997e-3 +#kinematic fluid viscosity [mm²/s] +nu = mu/rho + +#time step to compute numerical dissipation [s] +timestep = 1.0 + + +# -------------------- Stress vs stretch --------------------------------------------------------------------------------- +stretch(x) = (length + x) / length +nominal(y) = y / (area*1000) #compression [10⁻⁶ N / mm² = Pa] +#nominal(y) = y / (area) #tension + +set xlabel 'stretch [-]' font 'Verdana,14' +set ylabel 'nominal stress [kPa]' font 'Verdana,14' +unset y2label +set key on box inside bottom right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set xrange [1:1.11] noreverse #tension +set yrange [-0.6:0.9] + +unset y2tics +set xtics 0.02 rotate by 45 right +set ytics 0.3 +set format x "%3.2f" +set format y "%3.1f" + +set output "brain_cube_stress-stretch-poro-visco-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using (stretch($7)):(nominal($15)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using (stretch($7)):(nominal($15)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using (stretch($7)):(nominal($15)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs time -------------------------------------------------------------------------- +set xrange [] noreverse +set yrange [] noreverse +set xtics 30 norotate nooffset +set ytics 10 +set autoscale xy +set format x "%3.0f" +set format y "%3.0f" + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' + +unset key +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-time-poro-visco-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using ($1):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($1):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($1):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Accumulated exiting fluid vs reaction pressure --------------------------------------------------------------- +set xlabel 'fluid reaction pressure [kPa]' font 'Verdana,14' +set ylabel sprintf("accumulated fluid\n outside the sample [mm^3]") font 'Verdana,14' +set key on box outside above right font 'Verdana,12' spacing 1.0 maxcols 1 width -0.2 + +set autoscale xy +set ytics 10 +set xtics 2 +a=0 +y_axis(y) = (a=a+y*timestep,a) + +set output "brain_cube_fluid-reac_p-poro-visco-TENS.png" +plot 'data-for-gnuplot.sol' index 0 using ($18/1000):(y_axis($22)) every 1 with lines ls 1 title '1^{st} cycle', \ + 'data-for-gnuplot.sol' index 1 using ($18/1000):(y_axis($22)) every 1 with lines ls 2 title '2^{nd} cycle', \ + 'data-for-gnuplot.sol' index 2 using ($18/1000):(y_axis($22)) every 1 with lines ls 3 title '3^{rd} cycle' + +# -------------------- Pressure and displ. vs time ------------------------------------------------------------------------- +set term png size 600,380 enhanced font 'Verdana,12' + +set format x "%3.0f" +set format y "%3.1f" +set xtics 30 norotate nooffset + +set xlabel 'time [s]' font 'Verdana,14' +set ylabel 'displacement [mm]' font 'Verdana,14' +set y2label 'pressure [kPa]' font 'Verdana,14' +set ytics 0.1 nomirror +set y2tics autofreq +set key width -5 +set output "brain_cube_pres-displ-vs-time-poro-visco-TENS.png" +plot 'data-for-gnuplot.sol' using ($1):($8)/1000 every 1 with lines ls 5 axes x1y2 title 'pressure at central column', \ + 'data-for-gnuplot.sol' using ($1):($7) every 1 with lines ls 4 axes x1y1 title 'vertical displacement of top surface' diff --git a/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/parameters.prm new file mode 100755 index 0000000..44f6ed2 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/3-Graz-loading_poro-viscoelasticity/tension/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_tension_compression_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = 0.5 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = visco-Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 24502 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 660.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = -83.9 + + # Shear modulus mu2 [Pa] + set mu2 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = -11.92 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = -2100 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = -2.2 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 14000 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.75 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 50 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 1.0e-8 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 90.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/PLOT-consolidation.gp b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/PLOT-consolidation.gp new file mode 100755 index 0000000..b3a6b3b --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/PLOT-consolidation.gp @@ -0,0 +1,86 @@ + +# GNUPLOT file to plot consolidation curves + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test +clear +reset + +file_base = "base_nos0.8_k40_Kos8.0e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_base = 1.958069e-02 + +file_nos1 = "nos0.7_k40_Kos8.0e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_nos1 = 1.967018e-02 +file_nos2 = "nos0.9_k40_Kos8.0e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_nos2 = 1.931683e-02 + +file_k1 = "nos0.8_k1_Kos8.0e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_k1 = 1.958069e-02 +file_k2 = "nos0.8_k80_Kos8.0e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_k2 = 1.958069e-02 + + + +file_mu1 = "nos0.8_k40_Kos8.0e-11_mu1.78e-4/data-for-gnuplot.sol" +Umax_mu1 = 1.958069e-02 +file_mu2 = "nos0.8_k40_Kos8.0e-11_mu4.45e-3/data-for-gnuplot.sol" +Umax_mu2 = 1.953904e-02 + +file_Kos1 = "nos0.8_k40_Kos1.6e-11_mu0.89e-3/data-for-gnuplot.sol" +Umax_Kos1 = 1.953904e-02 +file_Kos2 = "nos0.8_k40_Kos4.0e-10_mu0.89e-3/data-for-gnuplot.sol" +Umax_Kos2 = 1.958069e-02 + + + +# ------------------------------------------------------------------------------- +unset colorbox +unset grid + +set style line 1 lt 1 lw 2 lc rgb "black" ps 0.7 dt 1 +set style line 2 lt 2 lw 2 lc rgb "gray25" ps 0.7 dt 2 +set style line 3 lt 4 lw 2 lc rgb "gray50" ps 0.7 dt 3 +set style line 4 lt 10 lw 2 lc rgb "gray75" ps 0.7 + +set style line 5 lt 2 lw 2 lc rgb "gray70" +set style line 6 lt 2 lw 2 lc rgb "gray40" +set style line 7 lt 2 lw 2 lc rgb "gray10" + + +# --------- CONSOLIDATION CURVE ------------------------------------------- +#Final specimen shortening + +set term png size 450,300 enhanced font 'Verdana,12' +unset key +set key box inside top right font 'Verdana,12' width 1.0 + +set logscale x +set xrange [0.1:100] +set yrange [1.1:0.0] reverse + +set xlabel 'time [min]' font 'Verdana,14' +set ylabel 'consolidation ratio' font 'Verdana,14' + +set output "consolidation-effect-nos.png" +plot file_nos1 using (($1)/60):(-($7)/Umax_nos1) with lines ls 5 title "n_{0s}=0.7",\ + file_base using (($1)/60):(-($7)/Umax_base) with lines ls 6 title "n_{0s}=0.8",\ + file_nos2 using (($1)/60):(-($7)/Umax_nos2) with lines ls 7 title "n_{0s}=0.9" + +set output "consolidation-effect-k.png" +plot file_k1 using (($1)/60):(-($7)/Umax_k1) with lines ls 5 title "{/Symbol k}=1",\ + file_base using (($1)/60):(-($7)/Umax_base) with lines ls 6 title "{/Symbol k}=40",\ + file_k2 using (($1)/60):(-($7)/Umax_k2) with lines ls 7 title "{/Symbol k}=80" + +set output "consolidation-effect-Kos.png" +plot file_Kos1 using (($1)/60):(-($7)/Umax_Kos1) with lines ls 5 title "K_{0s}= 16 nm^2",\ + file_base using (($1)/60):(-($7)/Umax_base) with lines ls 6 title "K_{0s}= 80 nm^2",\ + file_Kos2 using (($1)/60):(-($7)/Umax_Kos2) with lines ls 7 title "K_{0s}=400 nm^2" + +set output "consolidation-effect-mu.png" +plot file_mu1 using (($1)/60):(-($7)/Umax_mu1) with lines ls 5 title "{/Symbol m}^{FR}=0.178 mmPa·s",\ + file_base using (($1)/60):(-($7)/Umax_base) with lines ls 6 title "{/Symbol m}^{FR}=0.890 mmPa·s",\ + file_mu2 using (($1)/60):(-($7)/Umax_mu2) with lines ls 7 title "{/Symbol m}^{FR}=4.450 mmPa·s" diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/base_nos0.8_k40_Kos8.0e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/base_nos0.8_k40_Kos8.0e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..286019c --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/base_nos0.8_k40_Kos8.0e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.7_k40_Kos8.0e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.7_k40_Kos8.0e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..4f882d0 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.7_k40_Kos8.0e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.70 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k1_Kos8.0e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k1_Kos8.0e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..69475b8 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k1_Kos8.0e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 1 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos1.6e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos1.6e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..edf1afb --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos1.6e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 1.6e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos4.0e-10_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos4.0e-10_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..5e07595 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos4.0e-10_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 4.0e-10 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-1/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-1/parameters.prm new file mode 100755 index 0000000..a2e32c2 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-1/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-1 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-5/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-5/parameters.prm new file mode 100755 index 0000000..53ab13b --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu0.89e-5/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-5 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu1.78e-4/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu1.78e-4/parameters.prm new file mode 100755 index 0000000..819d615 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu1.78e-4/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 1.78e-4 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu4.45e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu4.45e-3/parameters.prm new file mode 100755 index 0000000..6ca248b --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-11_mu4.45e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 4.45e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-13_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-13_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..215ceab --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-13_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-13 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-9_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-9_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..4177f0b --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k40_Kos8.0e-9_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-9 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k80_Kos8.0e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k80_Kos8.0e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..f6500e8 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.8_k80_Kos8.0e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.80 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 80 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.9_k40_Kos8.0e-11_mu0.89e-3/parameters.prm b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.9_k40_Kos8.0e-11_mu0.89e-3/parameters.prm new file mode 100755 index 0000000..5cf5d13 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/4-consolidation_parameters/nos0.9_k40_Kos8.0e-11_mu0.89e-3/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Franceschini_consolidation + + # Global refinement level (higher value means finer mesh) + set Global refinement = 1 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 30.0 + + # Type of loading: pressure | displacement | none + set Load type = pressure + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -1.0e3 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 3.34e5 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 0.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = 1044 + + # Shear modulus mu2 [Pa] + set mu2 = 1183 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = 4.309 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 7.736 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = 0.0 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = 1.0 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 1.0 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.90 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 40 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 8.0e-11 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 6000 + + # Time step size [s] + set Time step size = 6.0 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers-EPS.gp b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers-EPS.gp new file mode 100755 index 0000000..e2c9991 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers-EPS.gp @@ -0,0 +1,616 @@ + +# GNUPLOT file to plot verification examples (Fig 2) of Ehlers and Eippers (1999) + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test +clear +reset +set datafile separator "," + +# ------------------------------------------------------------------------------- +# DATA EXTRACTED WITH ENGAUGE FROM EHLERS & EIPPERS PAPER COPIED HERE +# ------------------------------------------------------------------------------- +$dataEhlers1 << EOD +#x,step load,load increase,theor bound +0.0,0.0,0.0,-0.33 +0.0114476,-0.023822,-0.023822,-0.33 +0.0332767,-0.0366492,-0.0393381,-0.33 +0.0333608,-0.0366742,-0.0393979,-0.33 +0.0765419,-0.0494764,-0.0549133,-0.33 +0.0767103,-0.049521,-0.0549738,-0.33 +0.119765,-0.0609293,-0.0670155,-0.33 +0.130764,-0.0632646,-0.0700916,-0.33 +0.162918,-0.0700916,-0.0813088,-0.33 +0.174099,-0.0717567,-0.0852094,-0.33 +0.205987,-0.0765052,-0.0941279,-0.33 +0.228153,-0.0799625,-0.100327,-0.33 +0.238296,-0.0815445,-0.103164,-0.33 +0.270576,-0.0856675,-0.112192,-0.33 +0.282206,-0.0873173,-0.115445,-0.33 +0.302871,-0.0902487,-0.121051,-0.33 +0.336246,-0.095925,-0.130105,-0.33 +0.356742,-0.099411,-0.136826,-0.33 +0.379553,-0.102325,-0.144306,-0.33 +0.389023,-0.103534,-0.146516,-0.33 +0.432035,-0.108115,-0.156556,-0.33 +0.444325,-0.109685,-0.159424,-0.33 +0.464316,-0.112238,-0.16409,-0.33 +0.496597,-0.116361,-0.171624,-0.33 +0.509096,-0.117693,-0.174542,-0.33 +0.539609,-0.120942,-0.183076,-0.33 +0.561172,-0.125065,-0.189106,-0.33 +0.56315,-0.125255,-0.18966,-0.33 +0.604171,-0.129188,-0.200788,-0.33 +0.617189,-0.130575,-0.204319,-0.33 +0.647183,-0.13377,-0.211109,-0.33 +0.668704,-0.136518,-0.215981,-0.33 +0.681947,-0.137788,-0.218979,-0.33 +0.711702,-0.140641,-0.225924,-0.33 +0.746719,-0.143999,-0.234097,-0.33 +0.754701,-0.144764,-0.235848,-0.33 +0.808404,-0.148429,-0.247628,-0.33 +0.811462,-0.148709,-0.248298,-0.33 +0.883641,-0.155301,-0.262318,-0.33 +0.886938,-0.155554,-0.262958,-0.33 +0.937358,-0.159424,-0.269612,-0.33 +0.980357,-0.163547,-0.275286,-0.33 +0.994554,-0.164355,-0.27716,-0.33 +1.03757,-0.166802,-0.281741,-0.33 +1.04478,-0.167212,-0.282068,-0.33 +1.09848,-0.170877,-0.284503,-0.33 +1.1629,-0.174542,-0.287425,-0.33 +1.2093,-0.177181,-0.289529,-0.33 +1.22732,-0.178207,-0.290189,-0.33 +1.28441,-0.181454,-0.292277,-0.33 +1.29174,-0.181872,-0.292427,-0.33 +1.36687,-0.185079,-0.293955,-0.33 +1.44201,-0.188743,-0.295483,-0.33 +1.50963,-0.191218,-0.296859,-0.33 +1.51712,-0.191492,-0.296965,-0.33 +1.60296,-0.194699,-0.298188,-0.33 +1.68878,-0.19699,-0.29941,-0.33 +1.77459,-0.19928,-0.300632,-0.33 +1.86348,-0.200968,-0.301898,-0.33 +1.87111,-0.201113,-0.301979,-0.33 +1.96763,-0.202945,-0.30301,-0.33 +2.07485,-0.204319,-0.304156,-0.33 +2.17136,-0.205694,-0.305187,-0.33 +2.20657,-0.206028,-0.305563,-0.33 +2.26785,-0.20661,-0.30607,-0.33 +2.37504,-0.207068,-0.306956,-0.33 +2.47154,-0.207984,-0.307754,-0.33 +2.53892,-0.208272,-0.308312,-0.33 +2.57873,-0.208442,-0.308612,-0.33 +2.68593,-0.208901,-0.30942,-0.33 +2.79312,-0.209359,-0.310228,-0.33 +2.88958,-0.209359,-0.310956,-0.33 +2.90342,-0.209359,-0.31106,-0.33 +2.99676,-0.209359,-0.311544,-0.33 +3.10396,-0.209817,-0.312099,-0.33 +3.21116,-0.210275,-0.312654,-0.33 +3.25717,-0.210275,-0.312893,-0.33 +3.31834,-0.210275,-0.313138,-0.33 +3.42552,-0.210275,-0.313567,-0.33 +3.5327,-0.210275,-0.313997,-0.33 +3.60019,-0.210275,-0.314267,-0.33 +3.63988,-0.210275,-0.314417,-0.33 +3.74706,-0.210275,-0.314821,-0.33 +3.85424,-0.210275,-0.315225,-0.33 +3.96142,-0.210275,-0.315629,-0.33 +3.96465,-0.210275,-0.315641,-0.33 +4.0686,-0.210275,-0.315911,-0.33 +4.17579,-0.210275,-0.316188,-0.33 +4.28297,-0.210275,-0.316466,-0.33 +4.31838,-0.210275,-0.316558,-0.33 +4.39015,-0.210275,-0.316738,-0.33 +4.49733,-0.210275,-0.317007,-0.33 +4.60451,-0.210275,-0.317277,-0.33 +4.68282,-0.210275,-0.317474,-0.33 +4.71169,-0.210275,-0.317586,-0.33 +4.81887,-0.210275,-0.318002,-0.33 +4.92605,-0.210275,-0.318419,-0.33 +5.03323,-0.210275,-0.318835,-0.33 +5.03656,-0.210275,-0.318848,-0.33 +5.14042,-0.210275,-0.318983,-0.33 +5.2476,-0.210275,-0.319121,-0.33 +5.35478,-0.210275,-0.31926,-0.33 +5.39027,-0.210275,-0.319306,-0.33 +5.46196,-0.210275,-0.319396,-0.33 +5.56914,-0.210275,-0.319531,-0.33 +5.67632,-0.210275,-0.319666,-0.33 +5.7547,-0.210275,-0.319764,-0.33 +5.7835,-0.210275,-0.319803,-0.33 +5.89068,-0.210275,-0.319946,-0.33 +5.99786,-0.210275,-0.320089,-0.33 +6.09769,-0.210275,-0.320223,-0.33 +6.10505,-0.210275,-0.320232,-0.33 +6.21223,-0.210275,-0.320366,-0.33 +6.31941,-0.210275,-0.320501,-0.33 +6.42659,-0.210275,-0.320636,-0.33 +6.46212,-0.210275,-0.320681,-0.33 +6.53377,-0.210275,-0.320866,-0.33 +6.64095,-0.210275,-0.321144,-0.33 +6.74813,-0.210275,-0.321421,-0.33 +6.81585,-0.210275,-0.321597,-0.33 +6.85531,-0.210275,-0.321648,-0.33 +6.9625,-0.210275,-0.321787,-0.33 +7.06968,-0.210275,-0.321926,-0.33 +7.16956,-0.210275,-0.322055,-0.33 +7.17686,-0.210275,-0.322055,-0.33 +7.28404,-0.210275,-0.322055,-0.33 +7.39122,-0.210275,-0.322055,-0.33 +7.4984,-0.210275,-0.322055,-0.33 +7.52326,-0.210275,-0.322055,-0.33 +7.60558,-0.210275,-0.322158,-0.33 +7.71276,-0.210275,-0.322293,-0.33 +7.81994,-0.210275,-0.322428,-0.33 +7.88769,-0.210275,-0.322513,-0.33 +7.92713,-0.210275,-0.322563,-0.33 +8.03431,-0.210275,-0.322697,-0.33 +8.14149,-0.210275,-0.322832,-0.33 +8.24867,-0.210275,-0.322967,-0.33 +8.25212,-0.210275,-0.322971,-0.33 +8.35585,-0.210275,-0.323106,-0.33 +8.46303,-0.210275,-0.323244,-0.33 +8.57021,-0.210275,-0.323383,-0.33 +8.60583,-0.210275,-0.323429,-0.33 +8.67739,-0.210275,-0.323429,-0.33 +8.78457,-0.210275,-0.323429,-0.33 +8.89176,-0.210275,-0.323429,-0.33 +8.95953,-0.210275,-0.323429,-0.33 +8.99894,-0.210275,-0.32348,-0.33 +9.10612,-0.210275,-0.323619,-0.33 +9.2133,-0.210275,-0.323758,-0.33 +9.31324,-0.210275,-0.323887,-0.33 +9.32048,-0.210275,-0.323887,-0.33 +9.42766,-0.210275,-0.323887,-0.33 +9.53484,-0.210275,-0.323887,-0.33 +9.64202,-0.210275,-0.323887,-0.33 +9.67766,-0.210275,-0.323887,-0.33 +9.7492,-0.210275,-0.323986,-0.33 +9.85639,-0.210275,-0.324134,-0.33 +9.96357,-0.210275,-0.324282,-0.33 +10.0099,-0.210275,-0.324346,-0.33 +EOD + +$dataEhlers2 << EOD +#x,kappa_0,kappa_1,kappa_2,kappa_5 +0 , 0 , 0 , 0 , 0 +0.0104603 , -0.00766284 , -0.00063857 , -0.00510856 , -0.008066 +0.0313808 , -0.0223499 , -0.00766284 , -0.0146871 , -0.01062069 +0.041841 , -0.0269796 , -0.011175 , -0.0194764 , -0.01541 +0.0523013 , -0.0316092 , -0.0136494 , -0.0221371 , -0.0167935 +0.0732218 , -0.0427842 , -0.0185983 , -0.0274585 , -0.0195607 +0.083682 , -0.0456577 , -0.0210728 , -0.0322478 , -0.0203908 +0.104603 , -0.0514049 , -0.0280971 , -0.0343231 , -0.0220511 +0.115063 , -0.0541188 , -0.0316092 , -0.0353608 , -0.0228812 +0.125523 , -0.0568327 , -0.0363186 , -0.0363985 , -0.0237114 +0.146444 , -0.0600255 , -0.0457375 , -0.0402299 , -0.0254674 +0.156904 , -0.0632184 , -0.050447 , -0.0415868 , -0.0263455 +0.167364 , -0.0673691 , -0.0434227 , -0.0429438 , -0.0272235 +0.177824 , -0.0687527 , -0.0539591 , -0.0443008 , -0.0280536 +0.188285 , -0.0701362 , -0.0556354 , -0.0456577 , -0.0288838 +0.198745 , -0.0715198 , -0.0573116 , -0.0474138 , -0.0297139 +0.209205 , -0.0747126 , -0.0589879 , -0.0491699 , -0.0305441 +0.219665 , -0.0761494 , -0.0606641 , -0.0498883 , -0.0313742 +0.230126 , -0.0775862 , -0.0619413 , -0.0506066 , -0.031917 +0.251046 , -0.0807791 , -0.0644955 , -0.0520434 , -0.0330026 +0.261506 , -0.0839719 , -0.066092 , -0.0530013 , -0.0335453 +0.282427 , -0.0865262 , -0.0692848 , -0.054917 , -0.0346309 +0.292887 , -0.0878033 , -0.0708812 , -0.0559547 , -0.0351737 +0.303347 , -0.0909962 , -0.0723712 , -0.0569923 , -0.0357165 +0.324268 , -0.0929119 , -0.0753512 , -0.0590677 , -0.036802 +0.334728 , -0.0938697 , -0.0762559 , -0.0603448 , -0.0373129 +0.345188 , -0.0954662 , -0.0771605 , -0.061622 , -0.0378238 +0.355649 , -0.0970626 , -0.0780651 , -0.0627927 , -0.0383346 +0.376569 , -0.100255 , -0.0798744 , -0.0651341 , -0.0393563 +0.387029 , -0.101852 , -0.0807791 , -0.0657727 , -0.0399239 +0.39749 , -0.103448 , -0.0818966 , -0.0664112 , -0.0404916 +0.41841 , -0.106322 , -0.0841315 , -0.0676884 , -0.0416268 +0.42887 , -0.107918 , -0.085249 , -0.0684068 , -0.0421944 +0.439331 , -0.109515 , -0.0863133 , -0.0691252 , -0.042762 +0.460251 , -0.11143 , -0.0884419 , -0.0705619 , -0.0438973 +0.470711 , -0.112388 , -0.0895062 , -0.0719455 , -0.0444649 +0.491632 , -0.115581 , -0.0916347 , -0.0747126 , -0.0453163 +0.523013 , -0.118774 , -0.0945083 , -0.0763889 , -0.0465934 +0.533473 , -0.119732 , -0.0954662 , -0.0769476 , -0.0470192 +0.554393 , -0.121648 , -0.0975947 , -0.0785441 , -0.047977 +0.575314 , -0.12484 , -0.0997233 , -0.0801405 , -0.0489349 +0.596234 , -0.127182 , -0.101852 , -0.0814176 , -0.0498927 +0.606695 , -0.128352 , -0.102682 , -0.0820562 , -0.050212 +0.617155 , -0.12947 , -0.103512 , -0.0826948 , -0.0505313 +0.648536 , -0.132822 , -0.106003 , -0.0842273 , -0.0514891 +0.658996 , -0.13394 , -0.106778 , -0.0847382 , -0.0518084 +0.669456 , -0.135057 , -0.107553 , -0.085249 , -0.0523193 +0.690377 , -0.137292 , -0.109104 , -0.0873244 , -0.053341 +0.711297 , -0.139421 , -0.110655 , -0.0893997 , -0.0543627 +0.721757 , -0.140485 , -0.11143 , -0.0900383 , -0.0547529 +0.753138 , -0.142401 , -0.113825 , -0.091954 , -0.0559237 +0.763598 , -0.14304 , -0.114623 , -0.0925926 , -0.0563139 +0.784519 , -0.145168 , -0.11622 , -0.0938697 , -0.0570944 +0.794979 , -0.146232 , -0.116858 , -0.0945083 , -0.0574846 +0.805439 , -0.147669 , -0.117497 , -0.0951469 , -0.0578748 +0.8159 , -0.149106 , -0.118135 , -0.0955726 , -0.0582296 +0.857741 , -0.15198 , -0.12069 , -0.0972754 , -0.0596486 +0.868201 , -0.152778 , -0.121328 , -0.0977011 , -0.0600034 +0.899582 , -0.155172 , -0.123819 , -0.0998563 , -0.0610677 +0.910042 , -0.15613 , -0.124649 , -0.100575 , -0.061387 +0.920502 , -0.157088 , -0.125479 , -0.101277 , -0.0617063 +0.930962 , -0.158046 , -0.126153 , -0.10198 , -0.0620255 +0.962343 , -0.160201 , -0.128175 , -0.104087 , -0.0629834 +0.972803 , -0.16092 , -0.128849 , -0.104534 , -0.063183 +1.00418 , -0.164112 , -0.130871 , -0.105875 , -0.0637816 +1.01464 , -0.164687 , -0.131545 , -0.106322 , -0.0639812 +1.04603 , -0.166411 , -0.133653 , -0.107759 , -0.0645798 +1.05649 , -0.166986 , -0.134355 , -0.108238 , -0.0652184 +1.06695 , -0.167704 , -0.135057 , -0.108716 , -0.065857 +1.07741 , -0.168423 , -0.1356 , -0.109195 , -0.0661762 +1.09833 , -0.16986 , -0.136686 , -0.110217 , -0.0668148 +1.12971 , -0.172015 , -0.138314 , -0.11175 , -0.0677727 +1.14017 , -0.172733 , -0.138857 , -0.112324 , -0.0680565 +1.17155 , -0.174457 , -0.140485 , -0.114049 , -0.0689079 +1.18201 , -0.175032 , -0.141078 , -0.114623 , -0.0691917 +1.19247 , -0.175607 , -0.141671 , -0.115182 , -0.0694755 +1.22385 , -0.177762 , -0.14345 , -0.116858 , -0.0703269 +1.23431 , -0.17848 , -0.144043 , -0.117417 , -0.0706143 +1.24477 , -0.178991 , -0.144636 , -0.117976 , -0.0709017 +1.26569 , -0.180013 , -0.145849 , -0.119093 , -0.0714764 +1.28661 , -0.181034 , -0.147063 , -0.120016 , -0.0720511 +1.32845 , -0.18295 , -0.149489 , -0.12186 , -0.0732005 +1.34937 , -0.183908 , -0.150702 , -0.122783 , -0.0736566 +1.35983 , -0.184355 , -0.151181 , -0.123244 , -0.0738847 +1.40167 , -0.186143 , -0.153097 , -0.124521 , -0.0747969 +1.41213 , -0.186622 , -0.153576 , -0.12484 , -0.0750706 +1.43305 , -0.18758 , -0.154563 , -0.125479 , -0.075618 +1.46444 , -0.189017 , -0.156043 , -0.126756 , -0.076439 +1.4749 , -0.189389 , -0.156537 , -0.127182 , -0.0767126 +1.49582 , -0.190134 , -0.157524 , -0.128033 , -0.07726 +1.5272 , -0.191252 , -0.159004 , -0.129523 , -0.078081 +1.54812 , -0.191981 , -0.159962 , -0.130517 , -0.0786284 +1.58996 , -0.193441 , -0.161877 , -0.132503 , -0.079723 +1.60042 , -0.193806 , -0.162356 , -0.132886 , -0.0799967 +1.61088 , -0.19408 , -0.162835 , -0.133269 , -0.0802704 +1.62134 , -0.194353 , -0.163204 , -0.133653 , -0.0805441 +1.67364 , -0.195722 , -0.165046 , -0.135568 , -0.0819124 +1.69456 , -0.196269 , -0.165782 , -0.136335 , -0.0824598 +1.74686 , -0.197637 , -0.167625 , -0.137931 , -0.0840562 +1.76778 , -0.198185 , -0.168405 , -0.13857 , -0.0843755 +1.82008 , -0.199553 , -0.170356 , -0.140166 , -0.0851737 +1.83054 , -0.199753 , -0.170746 , -0.140485 , -0.0853333 +1.841 , -0.199952 , -0.171137 , -0.140805 , -0.085493 +1.90377 , -0.201149 , -0.173326 , -0.143069 , -0.0864508 +1.91423 , -0.201327 , -0.173691 , -0.143446 , -0.0866105 +1.95607 , -0.202036 , -0.175151 , -0.144955 , -0.0877052 +1.98745 , -0.202568 , -0.176245 , -0.146009 , -0.0885262 +1.99791 , -0.202746 , -0.176564 , -0.14636 , -0.0887542 +2.06067 , -0.203597 , -0.17848 , -0.148467 , -0.0901226 +2.08159 , -0.203881 , -0.179119 , -0.148946 , -0.0905217 +2.09205 , -0.204023 , -0.179395 , -0.149186 , -0.0907213 +2.14435 , -0.204555 , -0.180779 , -0.150383 , -0.091719 +2.18619 , -0.204981 , -0.181886 , -0.15166 , -0.0925705 +2.20711 , -0.205194 , -0.182439 , -0.152299 , -0.0929962 +2.21757 , -0.2053 , -0.182716 , -0.152618 , -0.0932356 +2.23849 , -0.205513 , -0.183269 , -0.153328 , -0.0937146 +2.28033 , -0.205939 , -0.184334 , -0.154747 , -0.0946724 +2.29079 , -0.206003 , -0.1846 , -0.155101 , -0.0949119 +2.31172 , -0.20613 , -0.185132 , -0.155811 , -0.0951513 +2.36402 , -0.20645 , -0.186462 , -0.156951 , -0.09575 +2.37448 , -0.206513 , -0.186682 , -0.157179 , -0.0958697 +2.38494 , -0.206577 , -0.186901 , -0.157407 , -0.0960978 +2.4477 , -0.207003 , -0.188218 , -0.159049 , -0.0974662 +2.45816 , -0.207074 , -0.188438 , -0.159323 , -0.0976657 +2.47908 , -0.207216 , -0.188877 , -0.159802 , -0.0980648 +2.53138 , -0.207535 , -0.189974 , -0.160999 , -0.0990626 +2.54184 , -0.207599 , -0.190166 , -0.161239 , -0.0992621 +2.58368 , -0.207854 , -0.190932 , -0.162197 , -0.1000603 +2.61506 , -0.207961 , -0.191507 , -0.162915 , -0.100659 +2.62552 , -0.207996 , -0.191699 , -0.163155 , -0.1007787 +2.63598 , -0.208032 , -0.19189 , -0.163442 , -0.1008985 +2.67782 , -0.208174 , -0.192562 , -0.164591 , -0.1013774 +2.69874 , -0.208245 , -0.192898 , -0.165166 , -0.1016169 +2.73013 , -0.208351 , -0.193403 , -0.166028 , -0.102301 +2.77197 , -0.208493 , -0.194075 , -0.166596 , -0.103213 +2.82427 , -0.208653 , -0.194915 , -0.167305 , -0.104011 +2.83473 , -0.208685 , -0.195083 , -0.167625 , -0.104171 +2.85565 , -0.208748 , -0.195427 , -0.168263 , -0.10449 +2.87657 , -0.208812 , -0.195771 , -0.168902 , -0.104874 +2.89749 , -0.208812 , -0.196115 , -0.16954 , -0.105257 +2.90795 , -0.208812 , -0.196286 , -0.1697 , -0.105448 +2.97071 , -0.208812 , -0.197318 , -0.170658 , -0.106167 +2.98117 , -0.208812 , -0.197436 , -0.170817 , -0.106286 +2.99163 , -0.208844 , -0.197553 , -0.17103 , -0.106406 +3.07531 , -0.2091 , -0.198494 , -0.172733 , -0.107758 +3.08577 , -0.209132 , -0.198612 , -0.172903 , -0.107927 +3.16946 , -0.209132 , -0.199553 , -0.174266 , -0.10928 +3.19038 , -0.209132 , -0.199727 , -0.174606 , -0.109564 +3.23222 , -0.209259 , -0.200075 , -0.175287 , -0.110131 +3.2636 , -0.209355 , -0.200337 , -0.175803 , -0.110557 +3.28452 , -0.209419 , -0.200511 , -0.176147 , -0.110912 +3.29498 , -0.209451 , -0.200602 , -0.176319 , -0.111089 +3.35774 , -0.209451 , -0.201149 , -0.17735 , -0.112153 +3.3682 , -0.209451 , -0.201241 , -0.177522 , -0.112295 +3.38912 , -0.209451 , -0.201423 , -0.177877 , -0.112579 +3.45188 , -0.209451 , -0.20197 , -0.178941 , -0.11343 +3.46234 , -0.209451 , -0.202062 , -0.179119 , -0.113537 +3.49372 , -0.209451 , -0.202335 , -0.179544 , -0.113856 +3.50418 , -0.209451 , -0.202427 , -0.179686 , -0.113963 +3.54603 , -0.209451 , -0.2027 , -0.180254 , -0.114388 +3.55649 , -0.209451 , -0.202769 , -0.180396 , -0.114548 +3.59833 , -0.209451 , -0.203042 , -0.181034 , -0.115186 +3.62971 , -0.209451 , -0.203248 , -0.181513 , -0.115665 +3.65063 , -0.209451 , -0.203384 , -0.181833 , -0.115956 +3.70293 , -0.209451 , -0.203704 , -0.182631 , -0.116681 +3.72385 , -0.209451 , -0.203831 , -0.18295 , -0.116972 +3.74477 , -0.209451 , -0.203959 , -0.183224 , -0.117262 +3.80753 , -0.209451 , -0.204342 , -0.184045 , -0.1179 +3.83891 , -0.209451 , -0.204534 , -0.184455 , -0.11822 +3.85983 , -0.209451 , -0.204662 , -0.184729 , -0.118539 +3.87029 , -0.209451 , -0.204715 , -0.184866 , -0.118699 +3.88075 , -0.209451 , -0.204768 , -0.185008 , -0.118858 +3.91213 , -0.209451 , -0.204928 , -0.185434 , -0.119217 +3.96444 , -0.209451 , -0.205194 , -0.186143 , -0.119816 +3.98536 , -0.209451 , -0.2053 , -0.186271 , -0.120056 +4.01674 , -0.209451 , -0.205431 , -0.186462 , -0.120415 +4.04812 , -0.209642 , -0.205561 , -0.186654 , -0.120774 +4.06904 , -0.20977 , -0.205648 , -0.186782 , -0.121093 +4.12134 , -0.210089 , -0.205866 , -0.187527 , -0.121891 +4.1318 , -0.210089 , -0.20591 , -0.187676 , -0.122051 +4.21548 , -0.210089 , -0.206258 , -0.188868 , -0.122903 +4.22594 , -0.210089 , -0.206316 , -0.189017 , -0.123009 +4.32008 , -0.210089 , -0.206838 , -0.189974 , -0.124286 +4.33054 , -0.210089 , -0.206897 , -0.190081 , -0.124406 +4.38285 , -0.210089 , -0.207042 , -0.190613 , -0.125004 +4.40377 , -0.210089 , -0.2071 , -0.190741 , -0.125244 +4.43515 , -0.210089 , -0.207187 , -0.190932 , -0.125531 +4.48745 , -0.210089 , -0.207332 , -0.191252 , -0.12601 +4.50837 , -0.210089 , -0.20739 , -0.191464 , -0.126202 +4.53975 , -0.210089 , -0.207477 , -0.191784 , -0.126521 +4.56067 , -0.210089 , -0.207535 , -0.191997 , -0.126734 +4.58159 , -0.210089 , -0.207588 , -0.192209 , -0.126947 +4.63389 , -0.210089 , -0.207721 , -0.192701 , -0.127479 +4.64435 , -0.210089 , -0.207748 , -0.192799 , -0.127639 +4.67573 , -0.210089 , -0.207828 , -0.193094 , -0.128117 +4.68619 , -0.210089 , -0.207854 , -0.193192 , -0.128224 +4.71757 , -0.210089 , -0.207896 , -0.193487 , -0.128543 +4.74895 , -0.210089 , -0.207938 , -0.193712 , -0.128862 +4.76987 , -0.210089 , -0.207965 , -0.193862 , -0.129075 +4.85356 , -0.210089 , -0.208077 , -0.194463 , -0.130097 +4.87448 , -0.210089 , -0.208104 , -0.194613 , -0.130352 +4.8954 , -0.210089 , -0.208132 , -0.194764 , -0.130416 +4.92678 , -0.210089 , -0.208174 , -0.194977 , -0.130512 +4.95816 , -0.210089 , -0.208254 , -0.195189 , -0.130608 +4.97908 , -0.210089 , -0.208307 , -0.195331 , -0.130672 +4.98954 , -0.210089 , -0.208333 , -0.195402 , -0.130814 +5.0523 , -0.210089 , -0.208493 , -0.195785 , -0.131665 +5.07322 , -0.210089 , -0.208551 , -0.195913 , -0.131949 +5.09414 , -0.210089 , -0.208609 , -0.196041 , -0.132162 +5.12552 , -0.210089 , -0.208696 , -0.196315 , -0.132481 +5.16736 , -0.210089 , -0.208812 , -0.196679 , -0.132907 +5.23013 , -0.210089 , -0.208986 , -0.197227 , -0.133332 +5.24059 , -0.210089 , -0.209015 , -0.197318 , -0.133403 +5.26151 , -0.210089 , -0.209073 , -0.19746 , -0.133545 +5.28243 , -0.210089 , -0.209132 , -0.197602 , -0.133737 +5.32427 , -0.210089 , -0.209132 , -0.197886 , -0.13412 +5.33473 , -0.210089 , -0.209132 , -0.197957 , -0.134216 +5.36611 , -0.210089 , -0.209132 , -0.198063 , -0.134503 +5.40795 , -0.210089 , -0.209132 , -0.198205 , -0.134982 +5.42887 , -0.210089 , -0.209158 , -0.198276 , -0.135222 +5.44979 , -0.210089 , -0.209185 , -0.198404 , -0.135461 +5.51255 , -0.210089 , -0.209265 , -0.198787 , -0.13594 +5.53347 , -0.210089 , -0.209291 , -0.198914 , -0.1361 +5.61715 , -0.210089 , -0.209398 , -0.199482 , -0.136667 +5.62762 , -0.210089 , -0.209411 , -0.199553 , -0.136738 +5.659 , -0.210089 , -0.209451 , -0.199713 , -0.137057 +5.7113 , -0.210089 , -0.209584 , -0.199979 , -0.13759 +5.72176 , -0.210089 , -0.20961 , -0.200032 , -0.137696 +5.78452 , -0.210089 , -0.20977 , -0.200351 , -0.138175 +5.80544 , -0.210089 , -0.20977 , -0.200458 , -0.138335 +5.8159 , -0.210089 , -0.20977 , -0.200511 , -0.138441 +5.89958 , -0.210089 , -0.20977 , -0.200851 , -0.139292 +5.91004 , -0.210089 , -0.20977 , -0.200894 , -0.139399 +5.9728 , -0.210089 , -0.20977 , -0.201149 , -0.140037 +5.99372 , -0.210089 , -0.20977 , -0.201213 , -0.14025 +6.00418 , -0.210089 , -0.20977 , -0.201245 , -0.140321 +6.07741 , -0.210089 , -0.209834 , -0.201469 , -0.140818 +6.08787 , -0.210089 , -0.209843 , -0.201504 , -0.140889 +6.09833 , -0.210089 , -0.209852 , -0.20154 , -0.140953 +6.17155 , -0.210089 , -0.209916 , -0.201788 , -0.1414 +6.19247 , -0.210089 , -0.209934 , -0.201916 , -0.141527 +6.22385 , -0.210089 , -0.209962 , -0.202107 , -0.14174 +6.28661 , -0.210089 , -0.210016 , -0.20249 , -0.142166 +6.32845 , -0.210089 , -0.210053 , -0.202746 , -0.142485 +6.37029 , -0.210089 , -0.210089 , -0.202746 , -0.142805 +6.43305 , -0.210089 , -0.210089 , -0.202746 , -0.143379 +6.4749 , -0.210089 , -0.210089 , -0.202928 , -0.143762 +6.50628 , -0.210089 , -0.210089 , -0.203065 , -0.143937 +6.5272 , -0.210089 , -0.210089 , -0.203129 , -0.144053 +6.58996 , -0.210089 , -0.210089 , -0.203321 , -0.144401 +6.61088 , -0.210089 , -0.210089 , -0.203384 , -0.144543 +6.6318 , -0.210089 , -0.210089 , -0.203455 , -0.144685 +6.6841 , -0.210089 , -0.210089 , -0.203633 , -0.14504 +6.70502 , -0.210089 , -0.210089 , -0.203704 , -0.145181 +6.7364 , -0.210089 , -0.210089 , -0.203823 , -0.145394 +6.77824 , -0.210089 , -0.210089 , -0.203983 , -0.145678 +6.841 , -0.210089 , -0.210089 , -0.204223 , -0.146317 +6.87238 , -0.210089 , -0.210089 , -0.204342 , -0.146636 +6.94561 , -0.210089 , -0.210089 , -0.204342 , -0.146884 +6.96653 , -0.210089 , -0.210089 , -0.204342 , -0.146955 +6.97699 , -0.210089 , -0.210089 , -0.204342 , -0.147051 +7.05021 , -0.210089 , -0.210089 , -0.204622 , -0.147722 +7.06067 , -0.210089 , -0.210089 , -0.204662 , -0.147817 +7.07113 , -0.210089 , -0.210089 , -0.204693 , -0.147913 +7.15481 , -0.210089 , -0.210089 , -0.204949 , -0.148481 +7.16527 , -0.210089 , -0.210089 , -0.204981 , -0.148552 +7.25941 , -0.210089 , -0.210089 , -0.2053 , -0.149126 +7.26987 , -0.210089 , -0.210089 , -0.2053 , -0.14919 +7.31172 , -0.210089 , -0.210089 , -0.2053 , -0.149446 +7.36402 , -0.210089 , -0.210089 , -0.2053 , -0.149765 +7.42678 , -0.210089 , -0.210089 , -0.2053 , -0.150148 +7.43724 , -0.210089 , -0.210089 , -0.2053 , -0.150255 +7.46862 , -0.210089 , -0.210089 , -0.20542 , -0.150574 +7.52092 , -0.210089 , -0.210089 , -0.205619 , -0.151106 +7.56276 , -0.210089 , -0.210089 , -0.205779 , -0.151106 +7.6046 , -0.210089 , -0.210089 , -0.205939 , -0.151106 +7.61506 , -0.210089 , -0.210089 , -0.205939 , -0.151106 +7.66736 , -0.210089 , -0.210089 , -0.205939 , -0.151425 +7.70921 , -0.210089 , -0.210089 , -0.205939 , -0.151681 +7.71967 , -0.210089 , -0.210089 , -0.205971 , -0.151745 +7.78243 , -0.210089 , -0.210089 , -0.206162 , -0.152383 +7.81381 , -0.210089 , -0.210089 , -0.206258 , -0.152702 +7.87657 , -0.210089 , -0.210089 , -0.206405 , -0.153086 +7.91841 , -0.210089 , -0.210089 , -0.206504 , -0.153341 +7.94979 , -0.210089 , -0.210089 , -0.206577 , -0.153554 +7.97071 , -0.210089 , -0.210089 , -0.206577 , -0.153696 +8.00209 , -0.210089 , -0.210089 , -0.206577 , -0.153909 +8.01255 , -0.210089 , -0.210089 , -0.206577 , -0.15398 +8.05439 , -0.210089 , -0.210089 , -0.206577 , -0.154192 +8.08577 , -0.210089 , -0.210089 , -0.206673 , -0.154352 +8.159 , -0.210089 , -0.210089 , -0.206897 , -0.154725 +8.19038 , -0.210089 , -0.210089 , -0.206897 , -0.154884 +8.20084 , -0.210089 , -0.210089 , -0.206897 , -0.154937 +8.25314 , -0.210089 , -0.210089 , -0.206897 , -0.155292 +8.29498 , -0.210089 , -0.210089 , -0.207038 , -0.155576 +8.34728 , -0.210089 , -0.210089 , -0.207216 , -0.155576 +8.39958 , -0.210089 , -0.210089 , -0.207322 , -0.155576 +8.4728 , -0.210089 , -0.210089 , -0.207471 , -0.156135 +8.48326 , -0.210089 , -0.210089 , -0.207493 , -0.156215 +8.50418 , -0.210089 , -0.210089 , -0.207535 , -0.156356 +8.57741 , -0.210089 , -0.210089 , -0.207312 , -0.156853 +8.60879 , -0.210089 , -0.210089 , -0.207216 , -0.15696 +8.67155 , -0.210089 , -0.210089 , -0.207455 , -0.157172 +8.69247 , -0.210089 , -0.210089 , -0.207535 , -0.1573 +8.71339 , -0.210089 , -0.210089 , -0.207535 , -0.157428 +8.77615 , -0.210089 , -0.210089 , -0.207535 , -0.157811 +8.79707 , -0.210089 , -0.210089 , -0.207535 , -0.157917 +8.81799 , -0.210089 , -0.210089 , -0.207599 , -0.158024 +8.90167 , -0.210089 , -0.210089 , -0.207854 , -0.15845 +8.92259 , -0.210089 , -0.210089 , -0.207854 , -0.158513 +9.00628 , -0.210089 , -0.210089 , -0.207854 , -0.158769 +9.0272 , -0.210089 , -0.210089 , -0.207854 , -0.158911 +9.04812 , -0.210089 , -0.210089 , -0.207854 , -0.159053 +9.10042 , -0.210089 , -0.210089 , -0.207854 , -0.159407 +9.1318 , -0.210089 , -0.210089 , -0.207854 , -0.159647 +9.15272 , -0.210089 , -0.210089 , -0.207854 , -0.159807 +9.1841 , -0.210089 , -0.210089 , -0.207974 , -0.160046 +9.20502 , -0.210089 , -0.210089 , -0.208054 , -0.16011 +9.2364 , -0.210089 , -0.210089 , -0.208174 , -0.160206 +9.2887 , -0.210089 , -0.210089 , -0.208014 , -0.160365 +9.341 , -0.210089 , -0.210089 , -0.207854 , -0.160525 +9.39331 , -0.210089 , -0.210089 , -0.208209 , -0.160685 +9.43515 , -0.210089 , -0.210089 , -0.208493 , -0.161004 +9.44561 , -0.210089 , -0.210089 , -0.208493 , -0.161084 +9.47699 , -0.210089 , -0.210089 , -0.208493 , -0.161323 +9.52929 , -0.210089 , -0.210089 , -0.208493 , -0.161642 +9.55021 , -0.210089 , -0.210089 , -0.208493 , -0.161706 +9.63389 , -0.210089 , -0.210089 , -0.208493 , -0.161962 +9.71757 , -0.210089 , -0.210089 , -0.208963 , -0.162194 +9.74895 , -0.210089 , -0.210089 , -0.209019 , -0.162281 +9.81172 , -0.210089 , -0.210089 , -0.209132 , -0.162707 +9.8431 , -0.210089 , -0.210089 , -0.209132 , -0.16292 +9.8954 , -0.210089 , -0.210089 , -0.209132 , -0.163097 +9.91632 , -0.210089 , -0.210089 , -0.209132 , -0.163168 +9.93724 , -0.210089 , -0.210089 , -0.209132 , -0.163239 +10 , -0.210089 , -0.210089 , -0.209132 , -0.163452 +EOD + +# ------------------------------------------------------------------------------- +unset colorbox +unset grid +unset key + +set style line 1 lt 1 lw 3 lc rgb "black" ps 0.7 dt 1 +set style line 2 lt 2 lw 3 lc rgb "gray25" ps 0.7 dt 2 +set style line 3 lt 4 lw 3 lc rgb "gray50" ps 0.7 dt 3 +set style line 4 lt 10 lw 3 lc rgb "gray75" ps 0.7 + +set style line 11 lt 1 lw 1 lc rgb "dark-spring-green" ps 1.0 +set style line 12 lt 2 lw 1 lc rgb "dark-blue" ps 1.0 +set style line 13 lt 7 lw 1 lc rgb "dark-red" ps 1.0 +set style line 21 lt 6 lw 1 lc rgb "dark-yellow" ps 1.0 +set style line 22 lt 8 lw 1 lc rgb "dark-magenta" ps 1.0 +set style line 23 lt 4 lw 1 lc rgb "coral" ps 1.0 + +# ------------------------------------------------------------------------------- +# Read files for plotting ****CHANGE IF NEEDED*** +# ------------------------------------------------------------------------------- +fileStepK0 = "./Ehlers_step_load_kappa_0/data-for-gnuplot.sol" +fileStepK1 = "./Ehlers_step_load_kappa_1/data-for-gnuplot.sol" +fileStepK2 = "./Ehlers_step_load_kappa_2/data-for-gnuplot.sol" +fileStepK5 = "./Ehlers_step_load_kappa_5/data-for-gnuplot.sol" +fileIncrK0 = "./Ehlers_increase_load_kappa_0/data-for-gnuplot.sol" + +# --------- VERIFICATION EHLERS FIG 1 ------------------------------------------- +set term epslatex size 9cm,9cm color colortext standalone +set key box out vert right above box width -23.0 height 1.2 + +set xrange [0:10] +set yrange [-0.35:0] + +set xlabel 'time [s]' +set ylabel 'vertical displacement [m]' + +set output 'Ehlers-Fig1.tex' +plot '$dataEhlers1' using 1:2 with lines ls 1 title 'Ehlers \& Eipper (1999), step loading', \ + '$dataEhlers1' using 1:3 with lines ls 2 title 'load increasing', \ + '$dataEhlers1' using 1:4 with lines ls 3 title 'theoretical boundary', \ + fileStepK0 using 1:7 every 30 with points ls 23 title 'deal.II poroelasticity, step loading', \ + fileIncrK0 using 1:7 every 30 with points ls 12 title 'load increasing' + + +# --------- VERIFICATION EHLERS FIG 2 ------------------------------------------- +set term epslatex size 9.2cm,10cm color colortext standalone +set key width -9.0 + +set xrange [0:10] +set yrange [-0.25:0] + +set xlabel 'time [s]' +set ylabel 'vertical displacement [m]' + +set output 'Ehlers-Fig2-displ.tex' +plot '$dataEhlers2' using 1:2 with lines ls 1 title 'Ehlers \& Eipper (1999), $\kappa = 0$' , \ + '$dataEhlers2' using 1:3 with lines ls 2 title '$\kappa = 1$' , \ + '$dataEhlers2' using 1:4 with lines ls 3 title '$\kappa = 2$' , \ + '$dataEhlers2' using 1:5 with lines ls 4 title '$\kappa = 5$' , \ + fileStepK0 using 1:7 every 30 with points ls 23 title 'deal.II poroelasticity, $\kappa = 0$', \ + fileStepK1 using 1:7 every 30 with points ls 22 title '$\kappa = 1$', \ + fileStepK2 using 1:7 every 30 with points ls 11 title '$\kappa = 2$', \ + fileStepK5 using 1:7 every 30 with points ls 21 title '$\kappa = 5$' + + +set term epslatex size 8.1cm,8.4cm color colortext standalone + +set xrange [0:10] +set yrange [0:8] + +set ylabel 'pore pressure [MPa]' + +set output 'Ehlers-Fig2-pressure.tex' +plot fileStepK0 using 1:($12)/1000000 with lines ls 21 title 'deal.II poroelasticity, $\kappa = 0$', \ + fileStepK1 using 1:($12)/1000000 with lines ls 22 title '$\kappa = 1$', \ + fileStepK2 using 1:($12)/1000000 with lines ls 23 title '$\kappa = 2$', \ + fileStepK5 using 1:($12)/1000000 with lines ls 11 title '$\kappa = 5$' + + +# --------- VERIFICATION EHLERS CONSOLIDATION CURVES ------------------------------------------- +#Final specimen shortening ****CHANGE IF NEEDED*** +Umax = 2.087773e-01 + +set term epslatex size 8.6cm,8.4cm color colortext standalone + +set logscale x +set xrange [0.001:10] +set yrange [1:0] + +set xlabel 'Time [s]' +set ylabel 'consolidation ratio [-]' + +set output 'Ehlers-consolidation.tex' +plot fileStepK0 using ($1):(-($7)/Umax) with lines ls 21 title 'deal.II poroelasticity, $\kappa = 0$', \ + fileStepK1 using ($1):(-($7)/Umax) with lines ls 22 title '$\kappa = 1$', \ + fileStepK2 using ($1):(-($7)/Umax) with lines ls 23 title '$\kappa = 2$', \ + fileStepK5 using ($1):(-($7)/Umax) with lines ls 11 title '$\kappa = 5$' diff --git a/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers.gp b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers.gp new file mode 100755 index 0000000..4e01ff0 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/PLOT-Verification-Ehlers.gp @@ -0,0 +1,620 @@ + +# GNUPLOT file to plot verification examples (Figs 1 & 2) of Ehlers and Eippers (1999) + +#To see color names: +# >> show palette colornames + +#To see line style, line width, etc.: +# >> set terminal wxt enhanced dashed +# >> test +clear +reset +set datafile separator "," +set encoding utf8 + +# ------------------------------------------------------------------------------- +# DATA EXTRACTED WITH ENGAUGE FROM EHLERS & EIPPERS PAPER COPIED HERE +# ------------------------------------------------------------------------------- +$dataEhlers1 << EOD +#x,step load,load increase,theor bound +0.0,0.0,0.0,-0.33 +0.0114476,-0.023822,-0.023822,-0.33 +0.0332767,-0.0366492,-0.0393381,-0.33 +0.0333608,-0.0366742,-0.0393979,-0.33 +0.0765419,-0.0494764,-0.0549133,-0.33 +0.0767103,-0.049521,-0.0549738,-0.33 +0.119765,-0.0609293,-0.0670155,-0.33 +0.130764,-0.0632646,-0.0700916,-0.33 +0.162918,-0.0700916,-0.0813088,-0.33 +0.174099,-0.0717567,-0.0852094,-0.33 +0.205987,-0.0765052,-0.0941279,-0.33 +0.228153,-0.0799625,-0.100327,-0.33 +0.238296,-0.0815445,-0.103164,-0.33 +0.270576,-0.0856675,-0.112192,-0.33 +0.282206,-0.0873173,-0.115445,-0.33 +0.302871,-0.0902487,-0.121051,-0.33 +0.336246,-0.095925,-0.130105,-0.33 +0.356742,-0.099411,-0.136826,-0.33 +0.379553,-0.102325,-0.144306,-0.33 +0.389023,-0.103534,-0.146516,-0.33 +0.432035,-0.108115,-0.156556,-0.33 +0.444325,-0.109685,-0.159424,-0.33 +0.464316,-0.112238,-0.16409,-0.33 +0.496597,-0.116361,-0.171624,-0.33 +0.509096,-0.117693,-0.174542,-0.33 +0.539609,-0.120942,-0.183076,-0.33 +0.561172,-0.125065,-0.189106,-0.33 +0.56315,-0.125255,-0.18966,-0.33 +0.604171,-0.129188,-0.200788,-0.33 +0.617189,-0.130575,-0.204319,-0.33 +0.647183,-0.13377,-0.211109,-0.33 +0.668704,-0.136518,-0.215981,-0.33 +0.681947,-0.137788,-0.218979,-0.33 +0.711702,-0.140641,-0.225924,-0.33 +0.746719,-0.143999,-0.234097,-0.33 +0.754701,-0.144764,-0.235848,-0.33 +0.808404,-0.148429,-0.247628,-0.33 +0.811462,-0.148709,-0.248298,-0.33 +0.883641,-0.155301,-0.262318,-0.33 +0.886938,-0.155554,-0.262958,-0.33 +0.937358,-0.159424,-0.269612,-0.33 +0.980357,-0.163547,-0.275286,-0.33 +0.994554,-0.164355,-0.27716,-0.33 +1.03757,-0.166802,-0.281741,-0.33 +1.04478,-0.167212,-0.282068,-0.33 +1.09848,-0.170877,-0.284503,-0.33 +1.1629,-0.174542,-0.287425,-0.33 +1.2093,-0.177181,-0.289529,-0.33 +1.22732,-0.178207,-0.290189,-0.33 +1.28441,-0.181454,-0.292277,-0.33 +1.29174,-0.181872,-0.292427,-0.33 +1.36687,-0.185079,-0.293955,-0.33 +1.44201,-0.188743,-0.295483,-0.33 +1.50963,-0.191218,-0.296859,-0.33 +1.51712,-0.191492,-0.296965,-0.33 +1.60296,-0.194699,-0.298188,-0.33 +1.68878,-0.19699,-0.29941,-0.33 +1.77459,-0.19928,-0.300632,-0.33 +1.86348,-0.200968,-0.301898,-0.33 +1.87111,-0.201113,-0.301979,-0.33 +1.96763,-0.202945,-0.30301,-0.33 +2.07485,-0.204319,-0.304156,-0.33 +2.17136,-0.205694,-0.305187,-0.33 +2.20657,-0.206028,-0.305563,-0.33 +2.26785,-0.20661,-0.30607,-0.33 +2.37504,-0.207068,-0.306956,-0.33 +2.47154,-0.207984,-0.307754,-0.33 +2.53892,-0.208272,-0.308312,-0.33 +2.57873,-0.208442,-0.308612,-0.33 +2.68593,-0.208901,-0.30942,-0.33 +2.79312,-0.209359,-0.310228,-0.33 +2.88958,-0.209359,-0.310956,-0.33 +2.90342,-0.209359,-0.31106,-0.33 +2.99676,-0.209359,-0.311544,-0.33 +3.10396,-0.209817,-0.312099,-0.33 +3.21116,-0.210275,-0.312654,-0.33 +3.25717,-0.210275,-0.312893,-0.33 +3.31834,-0.210275,-0.313138,-0.33 +3.42552,-0.210275,-0.313567,-0.33 +3.5327,-0.210275,-0.313997,-0.33 +3.60019,-0.210275,-0.314267,-0.33 +3.63988,-0.210275,-0.314417,-0.33 +3.74706,-0.210275,-0.314821,-0.33 +3.85424,-0.210275,-0.315225,-0.33 +3.96142,-0.210275,-0.315629,-0.33 +3.96465,-0.210275,-0.315641,-0.33 +4.0686,-0.210275,-0.315911,-0.33 +4.17579,-0.210275,-0.316188,-0.33 +4.28297,-0.210275,-0.316466,-0.33 +4.31838,-0.210275,-0.316558,-0.33 +4.39015,-0.210275,-0.316738,-0.33 +4.49733,-0.210275,-0.317007,-0.33 +4.60451,-0.210275,-0.317277,-0.33 +4.68282,-0.210275,-0.317474,-0.33 +4.71169,-0.210275,-0.317586,-0.33 +4.81887,-0.210275,-0.318002,-0.33 +4.92605,-0.210275,-0.318419,-0.33 +5.03323,-0.210275,-0.318835,-0.33 +5.03656,-0.210275,-0.318848,-0.33 +5.14042,-0.210275,-0.318983,-0.33 +5.2476,-0.210275,-0.319121,-0.33 +5.35478,-0.210275,-0.31926,-0.33 +5.39027,-0.210275,-0.319306,-0.33 +5.46196,-0.210275,-0.319396,-0.33 +5.56914,-0.210275,-0.319531,-0.33 +5.67632,-0.210275,-0.319666,-0.33 +5.7547,-0.210275,-0.319764,-0.33 +5.7835,-0.210275,-0.319803,-0.33 +5.89068,-0.210275,-0.319946,-0.33 +5.99786,-0.210275,-0.320089,-0.33 +6.09769,-0.210275,-0.320223,-0.33 +6.10505,-0.210275,-0.320232,-0.33 +6.21223,-0.210275,-0.320366,-0.33 +6.31941,-0.210275,-0.320501,-0.33 +6.42659,-0.210275,-0.320636,-0.33 +6.46212,-0.210275,-0.320681,-0.33 +6.53377,-0.210275,-0.320866,-0.33 +6.64095,-0.210275,-0.321144,-0.33 +6.74813,-0.210275,-0.321421,-0.33 +6.81585,-0.210275,-0.321597,-0.33 +6.85531,-0.210275,-0.321648,-0.33 +6.9625,-0.210275,-0.321787,-0.33 +7.06968,-0.210275,-0.321926,-0.33 +7.16956,-0.210275,-0.322055,-0.33 +7.17686,-0.210275,-0.322055,-0.33 +7.28404,-0.210275,-0.322055,-0.33 +7.39122,-0.210275,-0.322055,-0.33 +7.4984,-0.210275,-0.322055,-0.33 +7.52326,-0.210275,-0.322055,-0.33 +7.60558,-0.210275,-0.322158,-0.33 +7.71276,-0.210275,-0.322293,-0.33 +7.81994,-0.210275,-0.322428,-0.33 +7.88769,-0.210275,-0.322513,-0.33 +7.92713,-0.210275,-0.322563,-0.33 +8.03431,-0.210275,-0.322697,-0.33 +8.14149,-0.210275,-0.322832,-0.33 +8.24867,-0.210275,-0.322967,-0.33 +8.25212,-0.210275,-0.322971,-0.33 +8.35585,-0.210275,-0.323106,-0.33 +8.46303,-0.210275,-0.323244,-0.33 +8.57021,-0.210275,-0.323383,-0.33 +8.60583,-0.210275,-0.323429,-0.33 +8.67739,-0.210275,-0.323429,-0.33 +8.78457,-0.210275,-0.323429,-0.33 +8.89176,-0.210275,-0.323429,-0.33 +8.95953,-0.210275,-0.323429,-0.33 +8.99894,-0.210275,-0.32348,-0.33 +9.10612,-0.210275,-0.323619,-0.33 +9.2133,-0.210275,-0.323758,-0.33 +9.31324,-0.210275,-0.323887,-0.33 +9.32048,-0.210275,-0.323887,-0.33 +9.42766,-0.210275,-0.323887,-0.33 +9.53484,-0.210275,-0.323887,-0.33 +9.64202,-0.210275,-0.323887,-0.33 +9.67766,-0.210275,-0.323887,-0.33 +9.7492,-0.210275,-0.323986,-0.33 +9.85639,-0.210275,-0.324134,-0.33 +9.96357,-0.210275,-0.324282,-0.33 +10.0099,-0.210275,-0.324346,-0.33 +EOD + +$dataEhlers2 << EOD +#x,kappa_0,kappa_1,kappa_2,kappa_5 +0 , 0 , 0 , 0 , 0 +0.0104603 , -0.00766284 , -0.00063857 , -0.00510856 , -0.008066 +0.0313808 , -0.0223499 , -0.00766284 , -0.0146871 , -0.01062069 +0.041841 , -0.0269796 , -0.011175 , -0.0194764 , -0.01541 +0.0523013 , -0.0316092 , -0.0136494 , -0.0221371 , -0.0167935 +0.0732218 , -0.0427842 , -0.0185983 , -0.0274585 , -0.0195607 +0.083682 , -0.0456577 , -0.0210728 , -0.0322478 , -0.0203908 +0.104603 , -0.0514049 , -0.0280971 , -0.0343231 , -0.0220511 +0.115063 , -0.0541188 , -0.0316092 , -0.0353608 , -0.0228812 +0.125523 , -0.0568327 , -0.0363186 , -0.0363985 , -0.0237114 +0.146444 , -0.0600255 , -0.0457375 , -0.0402299 , -0.0254674 +0.156904 , -0.0632184 , -0.050447 , -0.0415868 , -0.0263455 +0.167364 , -0.0673691 , -0.0434227 , -0.0429438 , -0.0272235 +0.177824 , -0.0687527 , -0.0539591 , -0.0443008 , -0.0280536 +0.188285 , -0.0701362 , -0.0556354 , -0.0456577 , -0.0288838 +0.198745 , -0.0715198 , -0.0573116 , -0.0474138 , -0.0297139 +0.209205 , -0.0747126 , -0.0589879 , -0.0491699 , -0.0305441 +0.219665 , -0.0761494 , -0.0606641 , -0.0498883 , -0.0313742 +0.230126 , -0.0775862 , -0.0619413 , -0.0506066 , -0.031917 +0.251046 , -0.0807791 , -0.0644955 , -0.0520434 , -0.0330026 +0.261506 , -0.0839719 , -0.066092 , -0.0530013 , -0.0335453 +0.282427 , -0.0865262 , -0.0692848 , -0.054917 , -0.0346309 +0.292887 , -0.0878033 , -0.0708812 , -0.0559547 , -0.0351737 +0.303347 , -0.0909962 , -0.0723712 , -0.0569923 , -0.0357165 +0.324268 , -0.0929119 , -0.0753512 , -0.0590677 , -0.036802 +0.334728 , -0.0938697 , -0.0762559 , -0.0603448 , -0.0373129 +0.345188 , -0.0954662 , -0.0771605 , -0.061622 , -0.0378238 +0.355649 , -0.0970626 , -0.0780651 , -0.0627927 , -0.0383346 +0.376569 , -0.100255 , -0.0798744 , -0.0651341 , -0.0393563 +0.387029 , -0.101852 , -0.0807791 , -0.0657727 , -0.0399239 +0.39749 , -0.103448 , -0.0818966 , -0.0664112 , -0.0404916 +0.41841 , -0.106322 , -0.0841315 , -0.0676884 , -0.0416268 +0.42887 , -0.107918 , -0.085249 , -0.0684068 , -0.0421944 +0.439331 , -0.109515 , -0.0863133 , -0.0691252 , -0.042762 +0.460251 , -0.11143 , -0.0884419 , -0.0705619 , -0.0438973 +0.470711 , -0.112388 , -0.0895062 , -0.0719455 , -0.0444649 +0.491632 , -0.115581 , -0.0916347 , -0.0747126 , -0.0453163 +0.523013 , -0.118774 , -0.0945083 , -0.0763889 , -0.0465934 +0.533473 , -0.119732 , -0.0954662 , -0.0769476 , -0.0470192 +0.554393 , -0.121648 , -0.0975947 , -0.0785441 , -0.047977 +0.575314 , -0.12484 , -0.0997233 , -0.0801405 , -0.0489349 +0.596234 , -0.127182 , -0.101852 , -0.0814176 , -0.0498927 +0.606695 , -0.128352 , -0.102682 , -0.0820562 , -0.050212 +0.617155 , -0.12947 , -0.103512 , -0.0826948 , -0.0505313 +0.648536 , -0.132822 , -0.106003 , -0.0842273 , -0.0514891 +0.658996 , -0.13394 , -0.106778 , -0.0847382 , -0.0518084 +0.669456 , -0.135057 , -0.107553 , -0.085249 , -0.0523193 +0.690377 , -0.137292 , -0.109104 , -0.0873244 , -0.053341 +0.711297 , -0.139421 , -0.110655 , -0.0893997 , -0.0543627 +0.721757 , -0.140485 , -0.11143 , -0.0900383 , -0.0547529 +0.753138 , -0.142401 , -0.113825 , -0.091954 , -0.0559237 +0.763598 , -0.14304 , -0.114623 , -0.0925926 , -0.0563139 +0.784519 , -0.145168 , -0.11622 , -0.0938697 , -0.0570944 +0.794979 , -0.146232 , -0.116858 , -0.0945083 , -0.0574846 +0.805439 , -0.147669 , -0.117497 , -0.0951469 , -0.0578748 +0.8159 , -0.149106 , -0.118135 , -0.0955726 , -0.0582296 +0.857741 , -0.15198 , -0.12069 , -0.0972754 , -0.0596486 +0.868201 , -0.152778 , -0.121328 , -0.0977011 , -0.0600034 +0.899582 , -0.155172 , -0.123819 , -0.0998563 , -0.0610677 +0.910042 , -0.15613 , -0.124649 , -0.100575 , -0.061387 +0.920502 , -0.157088 , -0.125479 , -0.101277 , -0.0617063 +0.930962 , -0.158046 , -0.126153 , -0.10198 , -0.0620255 +0.962343 , -0.160201 , -0.128175 , -0.104087 , -0.0629834 +0.972803 , -0.16092 , -0.128849 , -0.104534 , -0.063183 +1.00418 , -0.164112 , -0.130871 , -0.105875 , -0.0637816 +1.01464 , -0.164687 , -0.131545 , -0.106322 , -0.0639812 +1.04603 , -0.166411 , -0.133653 , -0.107759 , -0.0645798 +1.05649 , -0.166986 , -0.134355 , -0.108238 , -0.0652184 +1.06695 , -0.167704 , -0.135057 , -0.108716 , -0.065857 +1.07741 , -0.168423 , -0.1356 , -0.109195 , -0.0661762 +1.09833 , -0.16986 , -0.136686 , -0.110217 , -0.0668148 +1.12971 , -0.172015 , -0.138314 , -0.11175 , -0.0677727 +1.14017 , -0.172733 , -0.138857 , -0.112324 , -0.0680565 +1.17155 , -0.174457 , -0.140485 , -0.114049 , -0.0689079 +1.18201 , -0.175032 , -0.141078 , -0.114623 , -0.0691917 +1.19247 , -0.175607 , -0.141671 , -0.115182 , -0.0694755 +1.22385 , -0.177762 , -0.14345 , -0.116858 , -0.0703269 +1.23431 , -0.17848 , -0.144043 , -0.117417 , -0.0706143 +1.24477 , -0.178991 , -0.144636 , -0.117976 , -0.0709017 +1.26569 , -0.180013 , -0.145849 , -0.119093 , -0.0714764 +1.28661 , -0.181034 , -0.147063 , -0.120016 , -0.0720511 +1.32845 , -0.18295 , -0.149489 , -0.12186 , -0.0732005 +1.34937 , -0.183908 , -0.150702 , -0.122783 , -0.0736566 +1.35983 , -0.184355 , -0.151181 , -0.123244 , -0.0738847 +1.40167 , -0.186143 , -0.153097 , -0.124521 , -0.0747969 +1.41213 , -0.186622 , -0.153576 , -0.12484 , -0.0750706 +1.43305 , -0.18758 , -0.154563 , -0.125479 , -0.075618 +1.46444 , -0.189017 , -0.156043 , -0.126756 , -0.076439 +1.4749 , -0.189389 , -0.156537 , -0.127182 , -0.0767126 +1.49582 , -0.190134 , -0.157524 , -0.128033 , -0.07726 +1.5272 , -0.191252 , -0.159004 , -0.129523 , -0.078081 +1.54812 , -0.191981 , -0.159962 , -0.130517 , -0.0786284 +1.58996 , -0.193441 , -0.161877 , -0.132503 , -0.079723 +1.60042 , -0.193806 , -0.162356 , -0.132886 , -0.0799967 +1.61088 , -0.19408 , -0.162835 , -0.133269 , -0.0802704 +1.62134 , -0.194353 , -0.163204 , -0.133653 , -0.0805441 +1.67364 , -0.195722 , -0.165046 , -0.135568 , -0.0819124 +1.69456 , -0.196269 , -0.165782 , -0.136335 , -0.0824598 +1.74686 , -0.197637 , -0.167625 , -0.137931 , -0.0840562 +1.76778 , -0.198185 , -0.168405 , -0.13857 , -0.0843755 +1.82008 , -0.199553 , -0.170356 , -0.140166 , -0.0851737 +1.83054 , -0.199753 , -0.170746 , -0.140485 , -0.0853333 +1.841 , -0.199952 , -0.171137 , -0.140805 , -0.085493 +1.90377 , -0.201149 , -0.173326 , -0.143069 , -0.0864508 +1.91423 , -0.201327 , -0.173691 , -0.143446 , -0.0866105 +1.95607 , -0.202036 , -0.175151 , -0.144955 , -0.0877052 +1.98745 , -0.202568 , -0.176245 , -0.146009 , -0.0885262 +1.99791 , -0.202746 , -0.176564 , -0.14636 , -0.0887542 +2.06067 , -0.203597 , -0.17848 , -0.148467 , -0.0901226 +2.08159 , -0.203881 , -0.179119 , -0.148946 , -0.0905217 +2.09205 , -0.204023 , -0.179395 , -0.149186 , -0.0907213 +2.14435 , -0.204555 , -0.180779 , -0.150383 , -0.091719 +2.18619 , -0.204981 , -0.181886 , -0.15166 , -0.0925705 +2.20711 , -0.205194 , -0.182439 , -0.152299 , -0.0929962 +2.21757 , -0.2053 , -0.182716 , -0.152618 , -0.0932356 +2.23849 , -0.205513 , -0.183269 , -0.153328 , -0.0937146 +2.28033 , -0.205939 , -0.184334 , -0.154747 , -0.0946724 +2.29079 , -0.206003 , -0.1846 , -0.155101 , -0.0949119 +2.31172 , -0.20613 , -0.185132 , -0.155811 , -0.0951513 +2.36402 , -0.20645 , -0.186462 , -0.156951 , -0.09575 +2.37448 , -0.206513 , -0.186682 , -0.157179 , -0.0958697 +2.38494 , -0.206577 , -0.186901 , -0.157407 , -0.0960978 +2.4477 , -0.207003 , -0.188218 , -0.159049 , -0.0974662 +2.45816 , -0.207074 , -0.188438 , -0.159323 , -0.0976657 +2.47908 , -0.207216 , -0.188877 , -0.159802 , -0.0980648 +2.53138 , -0.207535 , -0.189974 , -0.160999 , -0.0990626 +2.54184 , -0.207599 , -0.190166 , -0.161239 , -0.0992621 +2.58368 , -0.207854 , -0.190932 , -0.162197 , -0.1000603 +2.61506 , -0.207961 , -0.191507 , -0.162915 , -0.100659 +2.62552 , -0.207996 , -0.191699 , -0.163155 , -0.1007787 +2.63598 , -0.208032 , -0.19189 , -0.163442 , -0.1008985 +2.67782 , -0.208174 , -0.192562 , -0.164591 , -0.1013774 +2.69874 , -0.208245 , -0.192898 , -0.165166 , -0.1016169 +2.73013 , -0.208351 , -0.193403 , -0.166028 , -0.102301 +2.77197 , -0.208493 , -0.194075 , -0.166596 , -0.103213 +2.82427 , -0.208653 , -0.194915 , -0.167305 , -0.104011 +2.83473 , -0.208685 , -0.195083 , -0.167625 , -0.104171 +2.85565 , -0.208748 , -0.195427 , -0.168263 , -0.10449 +2.87657 , -0.208812 , -0.195771 , -0.168902 , -0.104874 +2.89749 , -0.208812 , -0.196115 , -0.16954 , -0.105257 +2.90795 , -0.208812 , -0.196286 , -0.1697 , -0.105448 +2.97071 , -0.208812 , -0.197318 , -0.170658 , -0.106167 +2.98117 , -0.208812 , -0.197436 , -0.170817 , -0.106286 +2.99163 , -0.208844 , -0.197553 , -0.17103 , -0.106406 +3.07531 , -0.2091 , -0.198494 , -0.172733 , -0.107758 +3.08577 , -0.209132 , -0.198612 , -0.172903 , -0.107927 +3.16946 , -0.209132 , -0.199553 , -0.174266 , -0.10928 +3.19038 , -0.209132 , -0.199727 , -0.174606 , -0.109564 +3.23222 , -0.209259 , -0.200075 , -0.175287 , -0.110131 +3.2636 , -0.209355 , -0.200337 , -0.175803 , -0.110557 +3.28452 , -0.209419 , -0.200511 , -0.176147 , -0.110912 +3.29498 , -0.209451 , -0.200602 , -0.176319 , -0.111089 +3.35774 , -0.209451 , -0.201149 , -0.17735 , -0.112153 +3.3682 , -0.209451 , -0.201241 , -0.177522 , -0.112295 +3.38912 , -0.209451 , -0.201423 , -0.177877 , -0.112579 +3.45188 , -0.209451 , -0.20197 , -0.178941 , -0.11343 +3.46234 , -0.209451 , -0.202062 , -0.179119 , -0.113537 +3.49372 , -0.209451 , -0.202335 , -0.179544 , -0.113856 +3.50418 , -0.209451 , -0.202427 , -0.179686 , -0.113963 +3.54603 , -0.209451 , -0.2027 , -0.180254 , -0.114388 +3.55649 , -0.209451 , -0.202769 , -0.180396 , -0.114548 +3.59833 , -0.209451 , -0.203042 , -0.181034 , -0.115186 +3.62971 , -0.209451 , -0.203248 , -0.181513 , -0.115665 +3.65063 , -0.209451 , -0.203384 , -0.181833 , -0.115956 +3.70293 , -0.209451 , -0.203704 , -0.182631 , -0.116681 +3.72385 , -0.209451 , -0.203831 , -0.18295 , -0.116972 +3.74477 , -0.209451 , -0.203959 , -0.183224 , -0.117262 +3.80753 , -0.209451 , -0.204342 , -0.184045 , -0.1179 +3.83891 , -0.209451 , -0.204534 , -0.184455 , -0.11822 +3.85983 , -0.209451 , -0.204662 , -0.184729 , -0.118539 +3.87029 , -0.209451 , -0.204715 , -0.184866 , -0.118699 +3.88075 , -0.209451 , -0.204768 , -0.185008 , -0.118858 +3.91213 , -0.209451 , -0.204928 , -0.185434 , -0.119217 +3.96444 , -0.209451 , -0.205194 , -0.186143 , -0.119816 +3.98536 , -0.209451 , -0.2053 , -0.186271 , -0.120056 +4.01674 , -0.209451 , -0.205431 , -0.186462 , -0.120415 +4.04812 , -0.209642 , -0.205561 , -0.186654 , -0.120774 +4.06904 , -0.20977 , -0.205648 , -0.186782 , -0.121093 +4.12134 , -0.210089 , -0.205866 , -0.187527 , -0.121891 +4.1318 , -0.210089 , -0.20591 , -0.187676 , -0.122051 +4.21548 , -0.210089 , -0.206258 , -0.188868 , -0.122903 +4.22594 , -0.210089 , -0.206316 , -0.189017 , -0.123009 +4.32008 , -0.210089 , -0.206838 , -0.189974 , -0.124286 +4.33054 , -0.210089 , -0.206897 , -0.190081 , -0.124406 +4.38285 , -0.210089 , -0.207042 , -0.190613 , -0.125004 +4.40377 , -0.210089 , -0.2071 , -0.190741 , -0.125244 +4.43515 , -0.210089 , -0.207187 , -0.190932 , -0.125531 +4.48745 , -0.210089 , -0.207332 , -0.191252 , -0.12601 +4.50837 , -0.210089 , -0.20739 , -0.191464 , -0.126202 +4.53975 , -0.210089 , -0.207477 , -0.191784 , -0.126521 +4.56067 , -0.210089 , -0.207535 , -0.191997 , -0.126734 +4.58159 , -0.210089 , -0.207588 , -0.192209 , -0.126947 +4.63389 , -0.210089 , -0.207721 , -0.192701 , -0.127479 +4.64435 , -0.210089 , -0.207748 , -0.192799 , -0.127639 +4.67573 , -0.210089 , -0.207828 , -0.193094 , -0.128117 +4.68619 , -0.210089 , -0.207854 , -0.193192 , -0.128224 +4.71757 , -0.210089 , -0.207896 , -0.193487 , -0.128543 +4.74895 , -0.210089 , -0.207938 , -0.193712 , -0.128862 +4.76987 , -0.210089 , -0.207965 , -0.193862 , -0.129075 +4.85356 , -0.210089 , -0.208077 , -0.194463 , -0.130097 +4.87448 , -0.210089 , -0.208104 , -0.194613 , -0.130352 +4.8954 , -0.210089 , -0.208132 , -0.194764 , -0.130416 +4.92678 , -0.210089 , -0.208174 , -0.194977 , -0.130512 +4.95816 , -0.210089 , -0.208254 , -0.195189 , -0.130608 +4.97908 , -0.210089 , -0.208307 , -0.195331 , -0.130672 +4.98954 , -0.210089 , -0.208333 , -0.195402 , -0.130814 +5.0523 , -0.210089 , -0.208493 , -0.195785 , -0.131665 +5.07322 , -0.210089 , -0.208551 , -0.195913 , -0.131949 +5.09414 , -0.210089 , -0.208609 , -0.196041 , -0.132162 +5.12552 , -0.210089 , -0.208696 , -0.196315 , -0.132481 +5.16736 , -0.210089 , -0.208812 , -0.196679 , -0.132907 +5.23013 , -0.210089 , -0.208986 , -0.197227 , -0.133332 +5.24059 , -0.210089 , -0.209015 , -0.197318 , -0.133403 +5.26151 , -0.210089 , -0.209073 , -0.19746 , -0.133545 +5.28243 , -0.210089 , -0.209132 , -0.197602 , -0.133737 +5.32427 , -0.210089 , -0.209132 , -0.197886 , -0.13412 +5.33473 , -0.210089 , -0.209132 , -0.197957 , -0.134216 +5.36611 , -0.210089 , -0.209132 , -0.198063 , -0.134503 +5.40795 , -0.210089 , -0.209132 , -0.198205 , -0.134982 +5.42887 , -0.210089 , -0.209158 , -0.198276 , -0.135222 +5.44979 , -0.210089 , -0.209185 , -0.198404 , -0.135461 +5.51255 , -0.210089 , -0.209265 , -0.198787 , -0.13594 +5.53347 , -0.210089 , -0.209291 , -0.198914 , -0.1361 +5.61715 , -0.210089 , -0.209398 , -0.199482 , -0.136667 +5.62762 , -0.210089 , -0.209411 , -0.199553 , -0.136738 +5.659 , -0.210089 , -0.209451 , -0.199713 , -0.137057 +5.7113 , -0.210089 , -0.209584 , -0.199979 , -0.13759 +5.72176 , -0.210089 , -0.20961 , -0.200032 , -0.137696 +5.78452 , -0.210089 , -0.20977 , -0.200351 , -0.138175 +5.80544 , -0.210089 , -0.20977 , -0.200458 , -0.138335 +5.8159 , -0.210089 , -0.20977 , -0.200511 , -0.138441 +5.89958 , -0.210089 , -0.20977 , -0.200851 , -0.139292 +5.91004 , -0.210089 , -0.20977 , -0.200894 , -0.139399 +5.9728 , -0.210089 , -0.20977 , -0.201149 , -0.140037 +5.99372 , -0.210089 , -0.20977 , -0.201213 , -0.14025 +6.00418 , -0.210089 , -0.20977 , -0.201245 , -0.140321 +6.07741 , -0.210089 , -0.209834 , -0.201469 , -0.140818 +6.08787 , -0.210089 , -0.209843 , -0.201504 , -0.140889 +6.09833 , -0.210089 , -0.209852 , -0.20154 , -0.140953 +6.17155 , -0.210089 , -0.209916 , -0.201788 , -0.1414 +6.19247 , -0.210089 , -0.209934 , -0.201916 , -0.141527 +6.22385 , -0.210089 , -0.209962 , -0.202107 , -0.14174 +6.28661 , -0.210089 , -0.210016 , -0.20249 , -0.142166 +6.32845 , -0.210089 , -0.210053 , -0.202746 , -0.142485 +6.37029 , -0.210089 , -0.210089 , -0.202746 , -0.142805 +6.43305 , -0.210089 , -0.210089 , -0.202746 , -0.143379 +6.4749 , -0.210089 , -0.210089 , -0.202928 , -0.143762 +6.50628 , -0.210089 , -0.210089 , -0.203065 , -0.143937 +6.5272 , -0.210089 , -0.210089 , -0.203129 , -0.144053 +6.58996 , -0.210089 , -0.210089 , -0.203321 , -0.144401 +6.61088 , -0.210089 , -0.210089 , -0.203384 , -0.144543 +6.6318 , -0.210089 , -0.210089 , -0.203455 , -0.144685 +6.6841 , -0.210089 , -0.210089 , -0.203633 , -0.14504 +6.70502 , -0.210089 , -0.210089 , -0.203704 , -0.145181 +6.7364 , -0.210089 , -0.210089 , -0.203823 , -0.145394 +6.77824 , -0.210089 , -0.210089 , -0.203983 , -0.145678 +6.841 , -0.210089 , -0.210089 , -0.204223 , -0.146317 +6.87238 , -0.210089 , -0.210089 , -0.204342 , -0.146636 +6.94561 , -0.210089 , -0.210089 , -0.204342 , -0.146884 +6.96653 , -0.210089 , -0.210089 , -0.204342 , -0.146955 +6.97699 , -0.210089 , -0.210089 , -0.204342 , -0.147051 +7.05021 , -0.210089 , -0.210089 , -0.204622 , -0.147722 +7.06067 , -0.210089 , -0.210089 , -0.204662 , -0.147817 +7.07113 , -0.210089 , -0.210089 , -0.204693 , -0.147913 +7.15481 , -0.210089 , -0.210089 , -0.204949 , -0.148481 +7.16527 , -0.210089 , -0.210089 , -0.204981 , -0.148552 +7.25941 , -0.210089 , -0.210089 , -0.2053 , -0.149126 +7.26987 , -0.210089 , -0.210089 , -0.2053 , -0.14919 +7.31172 , -0.210089 , -0.210089 , -0.2053 , -0.149446 +7.36402 , -0.210089 , -0.210089 , -0.2053 , -0.149765 +7.42678 , -0.210089 , -0.210089 , -0.2053 , -0.150148 +7.43724 , -0.210089 , -0.210089 , -0.2053 , -0.150255 +7.46862 , -0.210089 , -0.210089 , -0.20542 , -0.150574 +7.52092 , -0.210089 , -0.210089 , -0.205619 , -0.151106 +7.56276 , -0.210089 , -0.210089 , -0.205779 , -0.151106 +7.6046 , -0.210089 , -0.210089 , -0.205939 , -0.151106 +7.61506 , -0.210089 , -0.210089 , -0.205939 , -0.151106 +7.66736 , -0.210089 , -0.210089 , -0.205939 , -0.151425 +7.70921 , -0.210089 , -0.210089 , -0.205939 , -0.151681 +7.71967 , -0.210089 , -0.210089 , -0.205971 , -0.151745 +7.78243 , -0.210089 , -0.210089 , -0.206162 , -0.152383 +7.81381 , -0.210089 , -0.210089 , -0.206258 , -0.152702 +7.87657 , -0.210089 , -0.210089 , -0.206405 , -0.153086 +7.91841 , -0.210089 , -0.210089 , -0.206504 , -0.153341 +7.94979 , -0.210089 , -0.210089 , -0.206577 , -0.153554 +7.97071 , -0.210089 , -0.210089 , -0.206577 , -0.153696 +8.00209 , -0.210089 , -0.210089 , -0.206577 , -0.153909 +8.01255 , -0.210089 , -0.210089 , -0.206577 , -0.15398 +8.05439 , -0.210089 , -0.210089 , -0.206577 , -0.154192 +8.08577 , -0.210089 , -0.210089 , -0.206673 , -0.154352 +8.159 , -0.210089 , -0.210089 , -0.206897 , -0.154725 +8.19038 , -0.210089 , -0.210089 , -0.206897 , -0.154884 +8.20084 , -0.210089 , -0.210089 , -0.206897 , -0.154937 +8.25314 , -0.210089 , -0.210089 , -0.206897 , -0.155292 +8.29498 , -0.210089 , -0.210089 , -0.207038 , -0.155576 +8.34728 , -0.210089 , -0.210089 , -0.207216 , -0.155576 +8.39958 , -0.210089 , -0.210089 , -0.207322 , -0.155576 +8.4728 , -0.210089 , -0.210089 , -0.207471 , -0.156135 +8.48326 , -0.210089 , -0.210089 , -0.207493 , -0.156215 +8.50418 , -0.210089 , -0.210089 , -0.207535 , -0.156356 +8.57741 , -0.210089 , -0.210089 , -0.207312 , -0.156853 +8.60879 , -0.210089 , -0.210089 , -0.207216 , -0.15696 +8.67155 , -0.210089 , -0.210089 , -0.207455 , -0.157172 +8.69247 , -0.210089 , -0.210089 , -0.207535 , -0.1573 +8.71339 , -0.210089 , -0.210089 , -0.207535 , -0.157428 +8.77615 , -0.210089 , -0.210089 , -0.207535 , -0.157811 +8.79707 , -0.210089 , -0.210089 , -0.207535 , -0.157917 +8.81799 , -0.210089 , -0.210089 , -0.207599 , -0.158024 +8.90167 , -0.210089 , -0.210089 , -0.207854 , -0.15845 +8.92259 , -0.210089 , -0.210089 , -0.207854 , -0.158513 +9.00628 , -0.210089 , -0.210089 , -0.207854 , -0.158769 +9.0272 , -0.210089 , -0.210089 , -0.207854 , -0.158911 +9.04812 , -0.210089 , -0.210089 , -0.207854 , -0.159053 +9.10042 , -0.210089 , -0.210089 , -0.207854 , -0.159407 +9.1318 , -0.210089 , -0.210089 , -0.207854 , -0.159647 +9.15272 , -0.210089 , -0.210089 , -0.207854 , -0.159807 +9.1841 , -0.210089 , -0.210089 , -0.207974 , -0.160046 +9.20502 , -0.210089 , -0.210089 , -0.208054 , -0.16011 +9.2364 , -0.210089 , -0.210089 , -0.208174 , -0.160206 +9.2887 , -0.210089 , -0.210089 , -0.208014 , -0.160365 +9.341 , -0.210089 , -0.210089 , -0.207854 , -0.160525 +9.39331 , -0.210089 , -0.210089 , -0.208209 , -0.160685 +9.43515 , -0.210089 , -0.210089 , -0.208493 , -0.161004 +9.44561 , -0.210089 , -0.210089 , -0.208493 , -0.161084 +9.47699 , -0.210089 , -0.210089 , -0.208493 , -0.161323 +9.52929 , -0.210089 , -0.210089 , -0.208493 , -0.161642 +9.55021 , -0.210089 , -0.210089 , -0.208493 , -0.161706 +9.63389 , -0.210089 , -0.210089 , -0.208493 , -0.161962 +9.71757 , -0.210089 , -0.210089 , -0.208963 , -0.162194 +9.74895 , -0.210089 , -0.210089 , -0.209019 , -0.162281 +9.81172 , -0.210089 , -0.210089 , -0.209132 , -0.162707 +9.8431 , -0.210089 , -0.210089 , -0.209132 , -0.16292 +9.8954 , -0.210089 , -0.210089 , -0.209132 , -0.163097 +9.91632 , -0.210089 , -0.210089 , -0.209132 , -0.163168 +9.93724 , -0.210089 , -0.210089 , -0.209132 , -0.163239 +10 , -0.210089 , -0.210089 , -0.209132 , -0.163452 +EOD + +# ------------------------------------------------------------------------------- + +unset colorbox +unset grid + +set style line 1 lt 1 lw 2 lc rgb "black" ps 0.7 dt 1 +set style line 2 lt 2 lw 2 lc rgb "gray25" ps 0.7 dt 2 +set style line 3 lt 4 lw 2 lc rgb "gray50" ps 0.7 dt 3 +set style line 4 lt 10 lw 2 lc rgb "gray75" ps 0.7 + +set style line 11 lt 1 lw 1 lc rgb "dark-spring-green" ps 0.7 +set style line 12 lt 2 lw 1 lc rgb "dark-blue" ps 0.7 +set style line 13 lt 7 lw 1 lc rgb "dark-red" ps 1.0 +set style line 21 lt 19 lw 1 lc rgb "dark-yellow" ps 1.0 +set style line 22 lt 8 lw 1 lc rgb "dark-magenta" ps 1.0 +set style line 23 lt 4 lw 1 lc rgb "coral" ps 1.0 + +# ------------------------------------------------------------------------------- +# Read files for plotting ****CHANGE IF NEEDED*** +# ------------------------------------------------------------------------------- +fileStepK0 = "./Ehlers_step_load_kappa_0/data-for-gnuplot.sol" +fileStepK1 = "./Ehlers_step_load_kappa_1/data-for-gnuplot.sol" +fileStepK2 = "./Ehlers_step_load_kappa_2/data-for-gnuplot.sol" +fileStepK5 = "./Ehlers_step_load_kappa_5/data-for-gnuplot.sol" +fileIncrK0 = "./Ehlers_increase_load_kappa_0/data-for-gnuplot.sol" + +# --------- VERIFICATION EHLERS FIG 1 ------------------------------------------- +set term png size 750,350 enhanced font 'Verdana,12' + +set xrange [0:10] +set yrange [-0.35:0] + +set xlabel 'Time [s]' font 'Verdana,14' +set ylabel 'vertical displacement [m]' font 'Verdana,14' + +set key box rmargin font 'Verdana,12' width -10.0 + +set output "Ehlers-Fig1.png" +plot '$dataEhlers1' using 1:2 with lines ls 1 title 'Ehlers 1999, step loading', \ + '$dataEhlers1' using 1:3 with lines ls 2 title 'load increasing', \ + '$dataEhlers1' using 1:4 with lines ls 3 title 'theoretical boundary', \ + fileStepK0 using 1:7 every 40 with points ls 23 title 'deal.II poroelasticity, step loading', \ + fileIncrK0 using 1:7 every 40 with points ls 12 title 'load increasing' + + +# --------- VERIFICATION EHLERS FIG 2 ------------------------------------------- +set term png size 450,500 enhanced font 'Verdana,12' + +set xrange [0:10] +set yrange [-0.25:0] + +set xlabel 'Time [s]' font 'Verdana,14' +set ylabel 'vertical displacement [m]' font 'Verdana,14' + +set key box out vert right above box font 'Verdana,12' width -5.0 + +set output "Ehlers-Fig2-displ.png" +plot '$dataEhlers2' using 1:2 with lines ls 1 title '(Ehlers 1999) κ = 0' , \ + '$dataEhlers2' using 1:3 with lines ls 2 title 'κ = 1' , \ + '$dataEhlers2' using 1:4 with lines ls 3 title 'κ = 2' , \ + '$dataEhlers2' using 1:5 with lines ls 4 title 'κ = 5' , \ + fileStepK0 using 1:7 every 50 with points ls 21 title 'deal.II poroelasticity, κ = 0', \ + fileStepK1 using 1:7 every 50 with points ls 22 title 'κ = 1', \ + fileStepK2 using 1:7 every 50 with points ls 23 title 'κ = 2', \ + fileStepK5 using 1:7 every 50 with points ls 11 title 'κ = 5' + +set term png size 450,420 enhanced font 'Verdana,12' + +set xrange [0:10] +set yrange [0:8] +set ylabel 'pore pressure [MPa]' font 'Verdana,14' + +set output "Ehlers-Fig2-pressure.png" +plot fileStepK0 using 1:($12)/1000000 with lines ls 21 title 'deal.II poroelasticity, κ = 0', \ + fileStepK1 using 1:($12)/1000000 with lines ls 22 title 'κ = 1', \ + fileStepK2 using 1:($12)/1000000 with lines ls 23 title 'κ = 2', \ + fileStepK5 using 1:($12)/1000000 with lines ls 11 title 'κ = 5' + + +# --------- VALIDATION EHLERS CONSOLIDATION CURVES ------------------------------------------- +#Final specimen shortening ****CHANGE IF NEEDED*** +Umax = 2.087773e-01 + +set key box out vert right above box font 'Verdana,12' width -5.0 + +set logscale x +set xrange [0.001:10] +set yrange [1:0] + +set xlabel 'Time [s]' font 'Verdana,14' +set ylabel 'consolidation ratio [-]' font 'Verdana,14' + +set output "Ehlers-consolidation.png" +plot fileStepK0 using ($1):(-($7)/Umax) with lines ls 21 title 'deal.II poroelasticity, κ = 0', \ + fileStepK1 using ($1):(-($7)/Umax) with lines ls 22 title 'κ = 1', \ + fileStepK2 using ($1):(-($7)/Umax) with lines ls 23 title 'κ = 2', \ + fileStepK5 using ($1):(-($7)/Umax) with lines ls 11 title 'κ = 5' + +unset logscale x +set yrange [0:1] diff --git a/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/run-multi-calc.py b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/run-multi-calc.py new file mode 100755 index 0000000..43cb737 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/run-multi-calc.py @@ -0,0 +1,213 @@ + +#----------------------------------------------------------------------------------------- +# +# This python script runs the deal.ii verification problems based on Ehlers & Eipper 1999 +# To execute, type in console >>"python ./run-multi-calc.py" +# +# *** remember to load deal.ii and mpi before executing the script*** +# +# NOTE: If changes are made to the file runPoro.sh, remember to define it as executable +# by typing in the console >>"chmod +x runPoro.sh" +# +#----------------------------------------------------------------------------------------- +import fileinput +import sys +import subprocess +import os +import shutil +import select +import time + +# Number of parallel processes, i.e. how many jobs are run in parallel. +# Since the deal.ii code is executed already in parallel (-np 6), it doesn't make sense +# to execute any jobs in parallel. So , parallelProcesses = 1 should be used. +parallelProcesses = 1 +processes = {} +jobnames = {} + + +# Generate new parameter file +x = open("parameters.prm", 'w') +x.write("subsection Finite element system\n") +x.write(" set Polynomial degree displ = 2\n") +x.write(" set Polynomial degree pore = 1\n") +x.write(" set Quadrature order = 3\n") +x.write("end\n\n") +x.write("subsection Geometry\n") +x.write(" set Geometry type = Ehlers_tube_step_load\n") +x.write(" set Global refinement = 1\n") +x.write(" set Grid scale = 1\n") +x.write(" set Load type = pressure\n") +x.write(" set Load value = -7.5e6\n") +x.write(" set Drained pressure = 0\n") +x.write("end\n\n") +x.write("subsection Material properties \n") +x.write(" set material = Neo-Hooke\n") +x.write(" set lambda = 8.375e6\n") +x.write(" set shear modulus = 5.583e6\n") +x.write(" set seepage definition = Ehlers\n") +x.write(" set initial solid volume fraction = 0.67\n") +x.write(" set kappa = 0\n") +x.write(" set initial Darcy coefficient = 1.0e-4\n") +x.write(" set fluid weight = 1.0e4\n") +x.write(" set gravity term = false\n") +x.write("end\n\n") +x.write("subsection Nonlinear solver\n") +x.write(" set Max iterations Newton-Raphson = 20\n") +x.write(" set Tolerance force = 1.0e-6\n") +x.write(" set Tolerance displacement = 1.0e-6\n") +x.write(" set Tolerance pore pressure = 1.0e-6\n") +x.write("end\n\n") +x.write("subsection Time\n") +x.write(" set End time = 10.0\n") +x.write(" set Time step size = 0.002\n") +x.write("end\n\n") +x.write("subsection Output parameters\n") +x.write(" set Time step number output = 5\n") +x.write("end\n") +x.close() + +#--------------------------------------------------------------------------------------- +# Step loading problem with different kappa values +#--------------------------------------------------------------------------------------- +kappas = ["0","1","2","5"] + +for kappa in kappas: + # Jobname + jobname = "Ehlers_step_load_kappa_"+kappa + # make changes in parameter file + x = fileinput.input("parameters.prm", inplace=1) + for line in x: + if "set kappa" in line: + line = " set kappa = "+kappa+"\n" + print (line), + x.close() + + # start cp fem code without output + #process = subprocess.Popen("./runPoro.sh " + jobname + "> /dev/null 2>&1", shell=True) + process = subprocess.Popen("./runPoro.sh " + jobname, shell=True) + + # check if Input folder is copied + # to make sure I look for the executable which is copied afterwards + executable = "RESULTS/calcDir_" + jobname + results = "RESULTS/resultDir_" + jobname + time.sleep(1) + while not os.path.exists(executable) and not os.path.exists(results): + time.sleep(1) + print ("waiting for executable to be copied") + + # store process to wait for it later + processes[process.pid] = process + jobnames[process.pid] = jobname + + # if more than parallelProcesses running, wait for the first to finish + while len(processes) >= parallelProcesses: + pid, status = os.wait() + if pid in processes: + if status == 0: + print ("Job %30s successful" % jobnames[pid]) + del processes[pid] + del jobnames[pid] + + +# wait for the other processes +while processes: + pid, status = os.wait() + if pid in processes: + if status == 0: + print ("Job %30s successful" % jobnames[pid]) + del processes[pid] + del jobnames[pid] + +#--------------------------------------------------------------------------------------- +# Load increasing problem with kappa = 0 +#--------------------------------------------------------------------------------------- +# Jobname +jobname = "Ehlers_increase_load_kappa_0" +# make changes in parameter file +x = fileinput.input("parameters.prm", inplace=1) +for line in x: + if "set Geometry type" in line: + line = " set Geometry type = Ehlers_tube_increase_load\n" + if "set kappa" in line: + line = " set kappa = 0\n" + print (line), +x.close() +# start cp fem code without output +#process = subprocess.Popen("./runPoro.sh " + jobname + "> /dev/null 2>&1", shell=True) +process = subprocess.Popen("./runPoro.sh " + jobname, shell=True) + +# check if Input folder is copied +# to make sure I look for the executable which is copied afterwards +executable = "RESULTS/calcDir_" + jobname +results = "RESULTS/resultDir_" + jobname +time.sleep(1) +while not os.path.exists(executable) and not os.path.exists(results): + time.sleep(1) + print ("waiting for executable to be copied") + +# store process to wait for it later +processes[process.pid] = process +jobnames[process.pid] = jobname + +# if more than parallelProcesses running, wait for the first to finish +while len(processes) >= parallelProcesses: + pid, status = os.wait() + if pid in processes: + if status == 0: + print ("Job %30s successful" % jobnames[pid]) + del processes[pid] + del jobnames[pid] + + +#--------------------------------------------------------------------------------------- +# Consolidation cube problem +#--------------------------------------------------------------------------------------- +# Jobname +jobname = "Ehlers_cube" +# make changes in parameter file +x = fileinput.input("parameters.prm", inplace=1) +for line in x: + if "set Geometry type" in line: + line = " set Geometry type = Ehlers_cube_consolidation\n" + if "set Global refinement" in line: + line = " set Global refinement = 2\n" + if "set Time step size" in line: + line = " set Time step size = 0.01\n" + if "set Time step number output" in line: + line = " set Time step number output = 1\n" + print (line), +x.close() + +# start cp fem code without output +#process = subprocess.Popen("./runPoro.sh " + jobname + "> /dev/null 2>&1", shell=True) +process = subprocess.Popen("./runPoro.sh " + jobname, shell=True) + +# check if Input folder is copied +# to make sure I look for the executable which is copied afterwards +executable = "RESULTS/calcDir_" + jobname +results = "RESULTS/resultDir_" + jobname +time.sleep(1) +while not os.path.exists(executable) and not os.path.exists(results): + time.sleep(1) + print ("waiting for executable to be copied") + +# store process to wait for it later +processes[process.pid] = process +jobnames[process.pid] = jobname + +# if more than parallelProcesses running, wait for the first to finish +while len(processes) >= parallelProcesses: + pid, status = os.wait() + if pid in processes: + if status == 0: + print ("Job %30s successful" % jobnames[pid]) + del processes[pid] + del jobnames[pid] + + +print (" _ _ _ _ _ _ _ _ _ ") +print (" /_\ | | | (_)___| |__ ___ __ ___ _ __ _ __| |___| |_ ___ __| | |") +print (" / _ \| | | | / _ \ '_ (_-< / _/ _ \ ' \| '_ \ / -_) _/ -_) _ |_|") +print ("/_/ \_\_|_| _/ \___/_.__/__/ \__\___/_|_|_| .__/_\___|\__\___\__,_(_)") +print (" |__/ |_| ") diff --git a/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/runPoro.sh b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/runPoro.sh new file mode 100755 index 0000000..fe36359 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/input-files/5-Ehlers-verification/runPoro.sh @@ -0,0 +1,55 @@ + #!/bin/bash + # first parameter is the name for directory where the calculation is made + +echo " _ _ _ _ _ " +echo " _ _ _ _ _ _ _ _ (_)_ _ __ _ __| |___ __ _| | (_|_) " +echo "| '_| || | ' \| ' \| | ' \/ _ | / _ / -_) _ | |_| | | _ _ _ " +echo "|_| \_,_|_||_|_||_|_|_||_\__, | \__,_\___\__,_|_(_)_|_| (_) (_) (_) " +echo " |___/ " + + +echo "DEAL_II_DIR: " $DEAL_II_DIR + +# Define and print tmpdir, where calculations are made and resultsdir where results will be stored +maindir=`pwd` +tmpdir=$maindir/RESULTS/calcDir_$1 +resultdir=$maindir/RESULTS/resultDir_$1 +echo "Main directory :" $maindir +echo "Directory for calculations:" $tmpdir +echo "Directory for results :" $resultdir + +# change to temporary job directory +mkdir -p $tmpdir +cd $tmpdir +# copy stuff from location where job was submitted to temporary directory +cp -r $maindir/parameters.prm . && echo "Copying input file succeeded" || echo "Copying input file failed" +cp -r $maindir/nonlinear-poro-viscoelasticity . && echo "Copying executable succeeded" || echo "Copying executable failed" + +# run code (change num of parallel processes if desired) +touch out.log +touch err.log +COUNTER=0 +while [ $COUNTER -lt 10 ]; do + COUNTER=$((COUNTER+1)) + echo "Start run " $COUNTER + mpirun -np 6 ./nonlinear-poro-viscoelasticity >>out.log 2>err.log + if [ $? -eq 0 ]; then + echo FEM Code OK + break + else + echo $? + echo FEM Code FAILED + fi +done + + +# create folder for output and copy parameter file and results into it +mkdir -p $resultdir +mkdir -p $resultdir/Paraview-files + +cp parameters.prm $resultdir/ +cp *.sol $resultdir/ +cp solution.* $resultdir/Paraview-files/ + +# get rid of the temporary job dir +rm -rf $tmpdir diff --git a/Nonlinear_PoroViscoelasticity/nonlinear-poro-viscoelasticity.cc b/Nonlinear_PoroViscoelasticity/nonlinear-poro-viscoelasticity.cc new file mode 100644 index 0000000..74a431f --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/nonlinear-poro-viscoelasticity.cc @@ -0,0 +1,5110 @@ +/* --------------------------------------------------------------------- + * + * Copyright (C) 2010 - 2020 by the deal.II authors and + * Ester Comellas and Jean-Paul Pelteret + * + * This file is part of the deal.II library. + * + * The deal.II library is free software; you can use it, redistribute + * it, and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * The full text of the license can be found in the file LICENSE at + * the top level of the deal.II distribution. + * + * --------------------------------------------------------------------- + */ + +/* Authors: Ester Comellas and Jean-Paul Pelteret, + * University of Erlangen-Nuremberg, 2018 + */ + +// We start by including all the necessary deal.II header files and some C++ +// related ones. They have been discussed in detail in previous tutorial +// programs, so you need only refer to past tutorials for details. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + + +// We create a namespace for everything that relates to +// the nonlinear poro-viscoelastic formulation, +// and import all the deal.II function and class names into it: +namespace NonLinearPoroViscoElasticity +{ + using namespace dealii; + +// @sect3{Run-time parameters} +// +// Set up a ParameterHandler object to read in the parameter choices at run-time +// introduced by the user through the file "parameters.prm" + namespace Parameters + { +// @sect4{Finite Element system} +// Here we specify the polynomial order used to approximate the solution, +// both for the displacements and pressure unknowns. +// The quadrature order should be adjusted accordingly. + struct FESystem + { + unsigned int poly_degree_displ; + unsigned int poly_degree_pore; + unsigned int quad_order; + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void FESystem::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Finite element system"); + { + prm.declare_entry("Polynomial degree displ", "2", + Patterns::Integer(0), + "Displacement system polynomial order"); + + prm.declare_entry("Polynomial degree pore", "1", + Patterns::Integer(0), + "Pore pressure system polynomial order"); + + prm.declare_entry("Quadrature order", "3", + Patterns::Integer(0), + "Gauss quadrature order"); + } + prm.leave_subsection(); + } + + void FESystem::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Finite element system"); + { + poly_degree_displ = prm.get_integer("Polynomial degree displ"); + poly_degree_pore = prm.get_integer("Polynomial degree pore"); + quad_order = prm.get_integer("Quadrature order"); + } + prm.leave_subsection(); + } + +// @sect4{Geometry} +// These parameters are related to the geometry definition and mesh generation. +// We select the type of problem to solve and introduce the desired load values. + struct Geometry + { + std::string geom_type; + unsigned int global_refinement; + double scale; + std::string load_type; + double load; + unsigned int num_cycle_sets; + double fluid_flow; + double drained_pressure; + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void Geometry::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Geometry"); + { + prm.declare_entry("Geometry type", "Ehlers_tube_step_load", + Patterns::Selection("Ehlers_tube_step_load" + "|Ehlers_tube_increase_load" + "|Ehlers_cube_consolidation" + "|Franceschini_consolidation" + "|Budday_cube_tension_compression" + "|Budday_cube_tension_compression_fully_fixed" + "|Budday_cube_shear_fully_fixed"), + "Type of geometry used. " + "For Ehlers verification examples see Ehlers and Eipper (1999). " + "For Franceschini brain consolidation see Franceschini et al. (2006)" + "For Budday brain examples see Budday et al. (2017)"); + + prm.declare_entry("Global refinement", "1", + Patterns::Integer(0), + "Global refinement level"); + + prm.declare_entry("Grid scale", "1.0", + Patterns::Double(0.0), + "Global grid scaling factor"); + + prm.declare_entry("Load type", "pressure", + Patterns::Selection("pressure|displacement|none"), + "Type of loading"); + + prm.declare_entry("Load value", "-7.5e+6", + Patterns::Double(), + "Loading value"); + + prm.declare_entry("Number of cycle sets", "1", + Patterns::Integer(1,2), + "Number of times each set of 3 cycles is repeated, only for " + "Budday_cube_tension_compression and Budday_cube_tension_compression_fully_fixed. " + "Load value is doubled in second set, load rate is kept constant." + "Final time indicates end of second cycle set."); + + prm.declare_entry("Fluid flow value", "0.0", + Patterns::Double(), + "Prescribed fluid flow. Not implemented in any example yet."); + + prm.declare_entry("Drained pressure", "0.0", + Patterns::Double(), + "Increase of pressure value at drained boundary w.r.t the atmospheric pressure."); + } + prm.leave_subsection(); + } + + void Geometry::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Geometry"); + { + geom_type = prm.get("Geometry type"); + global_refinement = prm.get_integer("Global refinement"); + scale = prm.get_double("Grid scale"); + load_type = prm.get("Load type"); + load = prm.get_double("Load value"); + num_cycle_sets = prm.get_integer("Number of cycle sets"); + fluid_flow = prm.get_double("Fluid flow value"); + drained_pressure = prm.get_double("Drained pressure"); + } + prm.leave_subsection(); + } + +// @sect4{Materials} + +// Here we select the type of material for the solid component +// and define the corresponding material parameters. +// Then we define he fluid data, including the type of +// seepage velocity definition to use. + struct Materials + { + std::string mat_type; + double lambda; + double mu; + double mu1_infty; + double mu2_infty; + double mu3_infty; + double alpha1_infty; + double alpha2_infty; + double alpha3_infty; + double mu1_mode_1; + double mu2_mode_1; + double mu3_mode_1; + double alpha1_mode_1; + double alpha2_mode_1; + double alpha3_mode_1; + double viscosity_mode_1; + std::string fluid_type; + double solid_vol_frac; + double kappa_darcy; + double init_intrinsic_perm; + double viscosity_FR; + double init_darcy_coef; + double weight_FR; + bool gravity_term; + int gravity_direction; + double gravity_value; + double density_FR; + double density_SR; + enum SymmetricTensorEigenvectorMethod eigen_solver; + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void Materials::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Material properties"); + { + prm.declare_entry("material", "Neo-Hooke", + Patterns::Selection("Neo-Hooke|Ogden|visco-Ogden"), + "Type of material used in the problem"); + + prm.declare_entry("lambda", "8.375e6", + Patterns::Double(0,1e100), + "First Lamé parameter for extension function related to compactation point in solid material [Pa]."); + + prm.declare_entry("shear modulus", "5.583e6", + Patterns::Double(0,1e100), + "shear modulus for Neo-Hooke materials [Pa]."); + + prm.declare_entry("eigen solver", "QL Implicit Shifts", + Patterns::Selection("QL Implicit Shifts|Jacobi"), + "The type of eigen solver to be used for Ogden and visco-Ogden models."); + + prm.declare_entry("mu1", "0.0", + Patterns::Double(), + "Shear material parameter 'mu1' for Ogden material [Pa]."); + + prm.declare_entry("mu2", "0.0", + Patterns::Double(), + "Shear material parameter 'mu2' for Ogden material [Pa]."); + + prm.declare_entry("mu3", "0.0", + Patterns::Double(), + "Shear material parameter 'mu1' for Ogden material [Pa]."); + + prm.declare_entry("alpha1", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha1' for Ogden material [-]."); + + prm.declare_entry("alpha2", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha2' for Ogden material [-]."); + + prm.declare_entry("alpha3", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha3' for Ogden material [-]."); + + prm.declare_entry("mu1_1", "0.0", + Patterns::Double(), + "Shear material parameter 'mu1' for first viscous mode in Ogden material [Pa]."); + + prm.declare_entry("mu2_1", "0.0", + Patterns::Double(), + "Shear material parameter 'mu2' for first viscous mode in Ogden material [Pa]."); + + prm.declare_entry("mu3_1", "0.0", + Patterns::Double(), + "Shear material parameter 'mu1' for first viscous mode in Ogden material [Pa]."); + + prm.declare_entry("alpha1_1", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha1' for first viscous mode in Ogden material [-]."); + + prm.declare_entry("alpha2_1", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha2' for first viscous mode in Ogden material [-]."); + + prm.declare_entry("alpha3_1", "1.0", + Patterns::Double(), + "Stiffness material parameter 'alpha3' for first viscous mode in Ogden material [-]."); + + prm.declare_entry("viscosity_1", "1e-10", + Patterns::Double(1e-10,1e100), + "Deformation-independent viscosity parameter 'eta_1' for first viscous mode in Ogden material [-]."); + + prm.declare_entry("seepage definition", "Ehlers", + Patterns::Selection("Markert|Ehlers"), + "Type of formulation used to define the seepage velocity in the problem. " + "Choose between Markert formulation of deformation-dependent intrinsic permeability " + "and Ehlers formulation of deformation-dependent Darcy flow coefficient."); + + prm.declare_entry("initial solid volume fraction", "0.67", + Patterns::Double(0.001,0.999), + "Initial porosity (solid volume fraction, 0 < n_0s < 1)"); + + prm.declare_entry("kappa", "0.0", + Patterns::Double(0,100), + "Deformation-dependency control parameter for specific permeability (kappa >= 0)"); + + prm.declare_entry("initial intrinsic permeability", "0.0", + Patterns::Double(0,1e100), + "Initial intrinsic permeability parameter [m^2] (isotropic permeability). To be used with Markert formulation."); + + prm.declare_entry("fluid viscosity", "0.0", + Patterns::Double(0, 1e100), + "Effective shear viscosity parameter of the fluid [Pa·s, (N·s)/m^2]. To be used with Markert formulation."); + + prm.declare_entry("initial Darcy coefficient", "1.0e-4", + Patterns::Double(0,1e100), + "Initial Darcy flow coefficient [m/s] (isotropic permeability). To be used with Ehlers formulation."); + + prm.declare_entry("fluid weight", "1.0e4", + Patterns::Double(0, 1e100), + "Effective weight of the fluid [N/m^3]. To be used with Ehlers formulation."); + + prm.declare_entry("gravity term", "false", + Patterns::Bool(), + "Gravity term considered (true) or neglected (false)"); + + prm.declare_entry("fluid density", "1.0", + Patterns::Double(0,1e100), + "Real (or effective) density of the fluid"); + + prm.declare_entry("solid density", "1.0", + Patterns::Double(0,1e100), + "Real (or effective) density of the solid"); + + prm.declare_entry("gravity direction", "2", + Patterns::Integer(0,2), + "Direction of gravity (unit vector 0 for x, 1 for y, 2 for z)"); + + prm.declare_entry("gravity value", "-9.81", + Patterns::Double(), + "Value of gravity (be careful to have consistent units!)"); + } + prm.leave_subsection(); + } + + void Materials::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Material properties"); + { + //Solid + mat_type = prm.get("material"); + lambda = prm.get_double("lambda"); + mu = prm.get_double("shear modulus"); + mu1_infty = prm.get_double("mu1"); + mu2_infty = prm.get_double("mu2"); + mu3_infty = prm.get_double("mu3"); + alpha1_infty = prm.get_double("alpha1"); + alpha2_infty = prm.get_double("alpha2"); + alpha3_infty = prm.get_double("alpha3"); + mu1_mode_1 = prm.get_double("mu1_1"); + mu2_mode_1 = prm.get_double("mu2_1"); + mu3_mode_1 = prm.get_double("mu3_1"); + alpha1_mode_1 = prm.get_double("alpha1_1"); + alpha2_mode_1 = prm.get_double("alpha2_1"); + alpha3_mode_1 = prm.get_double("alpha3_1"); + viscosity_mode_1 = prm.get_double("viscosity_1"); + //Fluid + fluid_type = prm.get("seepage definition"); + solid_vol_frac = prm.get_double("initial solid volume fraction"); + kappa_darcy = prm.get_double("kappa"); + init_intrinsic_perm = prm.get_double("initial intrinsic permeability"); + viscosity_FR = prm.get_double("fluid viscosity"); + init_darcy_coef = prm.get_double("initial Darcy coefficient"); + weight_FR = prm.get_double("fluid weight"); + //Gravity effects + gravity_term = prm.get_bool("gravity term"); + density_FR = prm.get_double("fluid density"); + density_SR = prm.get_double("solid density"); + gravity_direction = prm.get_integer("gravity direction"); + gravity_value = prm.get_double("gravity value"); + + if ( (fluid_type == "Markert") && ((init_intrinsic_perm == 0.0) || (viscosity_FR == 0.0)) ) + throw std::runtime_error ("Markert seepage velocity formulation requires the definition of " + "'initial intrinsic permeability' and 'fluid viscosity' greater than 0.0."); + + if ( (fluid_type == "Ehlers") && ((init_darcy_coef == 0.0) || (weight_FR == 0.0)) ) + throw std::runtime_error ("Ehler seepage velocity formulation requires the definition of " + "'initial Darcy coefficient' and 'fluid weight' greater than 0.0."); + + const std::string eigen_solver_type = prm.get("eigen solver"); + if (eigen_solver_type == "QL Implicit Shifts") + eigen_solver = SymmetricTensorEigenvectorMethod::ql_implicit_shifts; + else if (eigen_solver_type == "Jacobi") + eigen_solver = SymmetricTensorEigenvectorMethod::jacobi; + else + { + AssertThrow(false, ExcMessage("Unknown eigen solver selected.")); + } + } + prm.leave_subsection(); + } + +// @sect4{Nonlinear solver} + +// We now define the tolerances and the maximum number of iterations for the +// Newton-Raphson scheme used to solve the nonlinear system of governing equations. + struct NonlinearSolver + { + unsigned int max_iterations_NR; + double tol_f; + double tol_u; + double tol_p_fluid; + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void NonlinearSolver::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Nonlinear solver"); + { + prm.declare_entry("Max iterations Newton-Raphson", "15", + Patterns::Integer(0), + "Number of Newton-Raphson iterations allowed"); + + prm.declare_entry("Tolerance force", "1.0e-8", + Patterns::Double(0.0), + "Force residual tolerance"); + + prm.declare_entry("Tolerance displacement", "1.0e-6", + Patterns::Double(0.0), + "Displacement error tolerance"); + + prm.declare_entry("Tolerance pore pressure", "1.0e-6", + Patterns::Double(0.0), + "Pore pressure error tolerance"); + } + prm.leave_subsection(); + } + + void NonlinearSolver::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Nonlinear solver"); + { + max_iterations_NR = prm.get_integer("Max iterations Newton-Raphson"); + tol_f = prm.get_double("Tolerance force"); + tol_u = prm.get_double("Tolerance displacement"); + tol_p_fluid = prm.get_double("Tolerance pore pressure"); + } + prm.leave_subsection(); + } + +// @sect4{Time} +// Here we set the timestep size $ \varDelta t $ and the simulation end-time. + struct Time + { + double end_time; + double delta_t; + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void Time::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Time"); + { + prm.declare_entry("End time", "10.0", + Patterns::Double(), + "End time"); + + prm.declare_entry("Time step size", "0.002", + Patterns::Double(1.0e-6), + "Time step size. The value must be larger than the displacement error tolerance defined."); + } + prm.leave_subsection(); + } + + void Time::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Time"); + { + end_time = prm.get_double("End time"); + delta_t = prm.get_double("Time step size"); + } + prm.leave_subsection(); + } + + +// @sect4{Output} +// We can choose the frequency of the data for the output files. + struct OutputParam + { + + std::string outfiles_requested; + unsigned int timestep_output; + std::string outtype; + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + void OutputParam::declare_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Output parameters"); + { + prm.declare_entry("Output files", "true", + Patterns::Selection("true|false"), + "Paraview output files to generate."); + prm.declare_entry("Time step number output", "1", + Patterns::Integer(0), + "Output data for time steps multiple of the given " + "integer value."); + prm.declare_entry("Averaged results", "nodes", + Patterns::Selection("elements|nodes"), + "Output data associated with integration point values" + " averaged on elements or on nodes."); + } + prm.leave_subsection(); + } + + void OutputParam::parse_parameters(ParameterHandler &prm) + { + prm.enter_subsection("Output parameters"); + { + outfiles_requested = prm.get("Output files"); + timestep_output = prm.get_integer("Time step number output"); + outtype = prm.get("Averaged results"); + } + prm.leave_subsection(); + } + +// @sect4{All parameters} +// We finally consolidate all of the above structures into a single container that holds all the run-time selections. + struct AllParameters : public FESystem, + public Geometry, + public Materials, + public NonlinearSolver, + public Time, + public OutputParam + { + AllParameters(const std::string &input_file); + + static void + declare_parameters(ParameterHandler &prm); + + void + parse_parameters(ParameterHandler &prm); + }; + + AllParameters::AllParameters(const std::string &input_file) + { + ParameterHandler prm; + declare_parameters(prm); + prm.parse_input(input_file); + parse_parameters(prm); + } + + void AllParameters::declare_parameters(ParameterHandler &prm) + { + FESystem::declare_parameters(prm); + Geometry::declare_parameters(prm); + Materials::declare_parameters(prm); + NonlinearSolver::declare_parameters(prm); + Time::declare_parameters(prm); + OutputParam::declare_parameters(prm); + } + + void AllParameters::parse_parameters(ParameterHandler &prm) + { + FESystem::parse_parameters(prm); + Geometry::parse_parameters(prm); + Materials::parse_parameters(prm); + NonlinearSolver::parse_parameters(prm); + Time::parse_parameters(prm); + OutputParam::parse_parameters(prm); + } + } + +// @sect3{Time class} +// A simple class to store time data. +// For simplicity we assume a constant time step size. + class Time + { + public: + Time (const double time_end, + const double delta_t) + : + timestep(0), + time_current(0.0), + time_end(time_end), + delta_t(delta_t) + {} + + virtual ~Time() + {} + + double get_current() const + { + return time_current; + } + double get_end() const + { + return time_end; + } + double get_delta_t() const + { + return delta_t; + } + unsigned int get_timestep() const + { + return timestep; + } + void increment_time () + { + time_current += delta_t; + ++timestep; + } + + private: + unsigned int timestep; + double time_current; + double time_end; + const double delta_t; + }; + +// @sect3{Constitutive equation for the solid component of the biphasic material} + +//@sect4{Base class: generic hyperelastic material} +// The ``extra" Kirchhoff stress in the solid component is the sum of isochoric +// and a volumetric part. +// $\mathbf{\tau} = \mathbf{\tau}_E^{(\bullet)} + \mathbf{\tau}^{\textrm{vol}}$ +// The deviatoric part changes depending on the type of material model selected: +// Neo-Hooken hyperelasticity, Ogden hyperelasticiy, +// or a single-mode finite viscoelasticity based on the Ogden hyperelastic model. +// In this base class we declare it as a virtual function, +// and it will be defined for each model type in the corresponding derived class. +// We define here the volumetric component, which depends on the +// extension function $U(J_S)$ selected, and in this case is the same for all models. +// We use the function proposed by +// Ehlers & Eipper 1999 doi:10.1023/A:1006565509095 +// We also define some public functions to access and update the internal variables. + template > + class Material_Hyperelastic + { + public: + Material_Hyperelastic(const Parameters::AllParameters ¶meters, + const Time &time) + : + n_OS (parameters.solid_vol_frac), + lambda (parameters.lambda), + time(time), + det_F (1.0), + det_F_converged (1.0), + eigen_solver (parameters.eigen_solver) + {} + ~Material_Hyperelastic() + {} + + SymmetricTensor<2, dim, NumberType> + get_tau_E(const Tensor<2,dim, NumberType> &F) const + { + return ( get_tau_E_base(F) + get_tau_E_ext_func(F) ); + } + + SymmetricTensor<2, dim, NumberType> + get_Cauchy_E(const Tensor<2, dim, NumberType> &F) const + { + const NumberType det_F = determinant(F); + Assert(det_F > 0, ExcInternalError()); + return get_tau_E(F)*NumberType(1/det_F); + } + + double + get_converged_det_F() const + { + return det_F_converged; + } + + virtual void + update_end_timestep() + { + det_F_converged = det_F; + } + + virtual void + update_internal_equilibrium( const Tensor<2, dim, NumberType> &F ) + { + det_F = Tensor<0,dim,double>(determinant(F)); + } + + virtual double + get_viscous_dissipation( ) const = 0; + + const double n_OS; + const double lambda; + const Time &time; + double det_F; + double det_F_converged; + const enum SymmetricTensorEigenvectorMethod eigen_solver; + + protected: + SymmetricTensor<2, dim, NumberType> + get_tau_E_ext_func(const Tensor<2,dim, NumberType> &F) const + { + const NumberType det_F = determinant(F); + Assert(det_F > 0, ExcInternalError()); + + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + return ( NumberType(lambda * (1.0-n_OS)*(1.0-n_OS) + * (det_F/(1.0-n_OS) - det_F/(det_F-n_OS))) * I ); + } + + virtual SymmetricTensor<2, dim, NumberType> + get_tau_E_base(const Tensor<2,dim, NumberType> &F) const = 0; + }; + +//@sect4{Derived class: Neo-Hookean hyperelastic material} + template > + class NeoHooke : public Material_Hyperelastic < dim, NumberType > + { + public: + NeoHooke(const Parameters::AllParameters ¶meters, + const Time &time) + : + Material_Hyperelastic< dim, NumberType > (parameters,time), + mu(parameters.mu) + {} + virtual ~NeoHooke() + {} + + double + get_viscous_dissipation() const + { + return 0.0; + } + + protected: + const double mu; + + SymmetricTensor<2, dim, NumberType> + get_tau_E_base(const Tensor<2,dim, NumberType> &F) const + { + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + + const bool use_standard_model = true; + + if (use_standard_model) + { + // Standard Neo-Hooke + return ( mu * ( symmetrize(F * transpose(F)) - I ) ); + } + else + { + // Neo-Hooke in terms of principal stretches + const SymmetricTensor<2, dim, NumberType> + B = symmetrize(F * transpose(F)); + const std::array< std::pair< NumberType, Tensor< 1, dim, NumberType > >, dim > + eigen_B = eigenvectors(B, this->eigen_solver); + + SymmetricTensor<2, dim, NumberType> B_ev; + for (unsigned int d=0; d > + class Ogden : public Material_Hyperelastic < dim, NumberType > + { + public: + Ogden(const Parameters::AllParameters ¶meters, + const Time &time) + : + Material_Hyperelastic< dim, NumberType > (parameters,time), + mu({parameters.mu1_infty, + parameters.mu2_infty, + parameters.mu3_infty}), + alpha({parameters.alpha1_infty, + parameters.alpha2_infty, + parameters.alpha3_infty}) + {} + virtual ~Ogden() + {} + + double + get_viscous_dissipation() const + { + return 0.0; + } + + protected: + std::vector mu; + std::vector alpha; + + SymmetricTensor<2, dim, NumberType> + get_tau_E_base(const Tensor<2,dim, NumberType> &F) const + { + const SymmetricTensor<2, dim, NumberType> + B = symmetrize(F * transpose(F)); + + const std::array< std::pair< NumberType, Tensor< 1, dim, NumberType > >, dim > + eigen_B = eigenvectors(B, this->eigen_solver); + + SymmetricTensor<2, dim, NumberType> tau; + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + + for (unsigned int i = 0; i < 3; ++i) + { + for (unsigned int A = 0; A < dim; ++A) + { + SymmetricTensor<2, dim, NumberType> tau_aux1 = symmetrize( + outer_product(eigen_B[A].second,eigen_B[A].second)); + tau_aux1 *= mu[i]*std::pow(eigen_B[A].first, (alpha[i]/2.) ); + tau += tau_aux1; + } + SymmetricTensor<2, dim, NumberType> tau_aux2 (I); + tau_aux2 *= mu[i]; + tau -= tau_aux2; + } + return tau; + } + }; + +//@sect4{Derived class: Single-mode Ogden viscoelastic material} +// We use the finite viscoelastic model described in +// Reese & Govindjee (1998) doi:10.1016/S0020-7683(97)00217-5 +// The algorithm for the implicit exponential time integration is given in +// Budday et al. (2017) doi: 10.1016/j.actbio.2017.06.024 + template > + class visco_Ogden : public Material_Hyperelastic < dim, NumberType > + { + public: + visco_Ogden(const Parameters::AllParameters ¶meters, + const Time &time) + : + Material_Hyperelastic< dim, NumberType > (parameters,time), + mu_infty({parameters.mu1_infty, + parameters.mu2_infty, + parameters.mu3_infty}), + alpha_infty({parameters.alpha1_infty, + parameters.alpha2_infty, + parameters.alpha3_infty}), + mu_mode_1({parameters.mu1_mode_1, + parameters.mu2_mode_1, + parameters.mu3_mode_1}), + alpha_mode_1({parameters.alpha1_mode_1, + parameters.alpha2_mode_1, + parameters.alpha3_mode_1}), + viscosity_mode_1(parameters.viscosity_mode_1), + Cinv_v_1(Physics::Elasticity::StandardTensors::I), + Cinv_v_1_converged(Physics::Elasticity::StandardTensors::I) + {} + virtual ~visco_Ogden() + {} + + void + update_internal_equilibrium( const Tensor<2, dim, NumberType> &F ) + { + Material_Hyperelastic < dim, NumberType >::update_internal_equilibrium(F); + + this->Cinv_v_1 = this->Cinv_v_1_converged; + SymmetricTensor<2, dim, NumberType> B_e_1_tr = symmetrize(F * this->Cinv_v_1 * transpose(F)); + + const std::array< std::pair< NumberType, Tensor< 1, dim, NumberType > >, dim > + eigen_B_e_1_tr = eigenvectors(B_e_1_tr, this->eigen_solver); + + Tensor< 1, dim, NumberType > lambdas_e_1_tr; + Tensor< 1, dim, NumberType > epsilon_e_1_tr; + for (int a = 0; a < dim; ++a) + { + lambdas_e_1_tr[a] = std::sqrt(eigen_B_e_1_tr[a].first); + epsilon_e_1_tr[a] = std::log(lambdas_e_1_tr[a]); + } + + const double tolerance = 1e-8; + double residual_check = tolerance*10.0; + Tensor< 1, dim, NumberType > residual; + Tensor< 2, dim, NumberType > tangent; + static const SymmetricTensor< 2, dim, double> I(Physics::Elasticity::StandardTensors::I); + NumberType J_e_1 = std::sqrt(determinant(B_e_1_tr)); + + std::vector lambdas_e_1_iso(dim); + SymmetricTensor<2, dim, NumberType> B_e_1; + int iteration = 0; + + Tensor< 1, dim, NumberType > lambdas_e_1; + Tensor< 1, dim, NumberType > epsilon_e_1; + epsilon_e_1 = epsilon_e_1_tr; + + while(residual_check > tolerance) + { + NumberType aux_J_e_1 = 1.0; + for (unsigned int a = 0; a < dim; ++a) + { + lambdas_e_1[a] = std::exp(epsilon_e_1[a]); + aux_J_e_1 *= lambdas_e_1[a]; + } + + J_e_1 = aux_J_e_1; + + for (unsigned int a = 0; a < dim; ++a) + lambdas_e_1_iso[a] = lambdas_e_1[a]*std::pow(J_e_1,-1.0/dim); + + for (unsigned int a = 0; a < dim; ++a) + { + residual[a] = get_beta_mode_1(lambdas_e_1_iso, a); + residual[a] *= this->time.get_delta_t()/(2.0*viscosity_mode_1); + residual[a] += epsilon_e_1[a]; + residual[a] -= epsilon_e_1_tr[a]; + + for (unsigned int b = 0; b < dim; ++b) + { + tangent[a][b] = get_gamma_mode_1(lambdas_e_1_iso, a, b); + tangent[a][b] *= this->time.get_delta_t()/(2.0*viscosity_mode_1); + tangent[a][b] += I[a][b]; + } + + } + epsilon_e_1 -= invert(tangent)*residual; + + residual_check = 0.0; + for (unsigned int a = 0; a < dim; ++a) + { + if ( std::abs(residual[a]) > residual_check) + residual_check = std::abs(Tensor<0,dim,double>(residual[a])); + } + iteration += 1; + if (iteration > 15 ) + throw std::runtime_error ("No convergence in local Newton iteration for the " + "viscoelastic exponential time integration algorithm."); + } + + NumberType aux_J_e_1 = 1.0; + for (unsigned int a = 0; a < dim; ++a) + { + lambdas_e_1[a] = std::exp(epsilon_e_1[a]); + aux_J_e_1 *= lambdas_e_1[a]; + } + J_e_1 = aux_J_e_1; + + for (unsigned int a = 0; a < dim; ++a) + lambdas_e_1_iso[a] = lambdas_e_1[a]*std::pow(J_e_1,-1.0/dim); + + for (unsigned int a = 0; a < dim; ++a) + { + SymmetricTensor<2, dim, NumberType> + B_e_1_aux = symmetrize(outer_product(eigen_B_e_1_tr[a].second,eigen_B_e_1_tr[a].second)); + B_e_1_aux *= lambdas_e_1[a] * lambdas_e_1[a]; + B_e_1 += B_e_1_aux; + } + + Tensor<2, dim, NumberType>Cinv_v_1_AD = symmetrize(invert(F) * B_e_1 * invert(transpose(F))); + + this->tau_neq_1 = 0; + for (unsigned int a = 0; a < dim; ++a) + { + SymmetricTensor<2, dim, NumberType> + tau_neq_1_aux = symmetrize(outer_product(eigen_B_e_1_tr[a].second,eigen_B_e_1_tr[a].second)); + tau_neq_1_aux *= get_beta_mode_1(lambdas_e_1_iso, a); + this->tau_neq_1 += tau_neq_1_aux; + } + + // Store history + for (unsigned int a = 0; a < dim; ++a) + for (unsigned int b = 0; b < dim; ++b) + this->Cinv_v_1[a][b]= Tensor<0,dim,double>(Cinv_v_1_AD[a][b]); + } + + void update_end_timestep() + { + Material_Hyperelastic < dim, NumberType >::update_end_timestep(); + this->Cinv_v_1_converged = this->Cinv_v_1; + } + + double get_viscous_dissipation() const + { + NumberType dissipation_term = get_tau_E_neq() * get_tau_E_neq(); //Double contract the two SymmetricTensor + dissipation_term /= (2*viscosity_mode_1); + + return dissipation_term.val(); + } + + protected: + std::vector mu_infty; + std::vector alpha_infty; + std::vector mu_mode_1; + std::vector alpha_mode_1; + double viscosity_mode_1; + SymmetricTensor<2, dim, double> Cinv_v_1; + SymmetricTensor<2, dim, double> Cinv_v_1_converged; + SymmetricTensor<2, dim, NumberType> tau_neq_1; + + SymmetricTensor<2, dim, NumberType> + get_tau_E_base(const Tensor<2,dim, NumberType> &F) const + { + return ( get_tau_E_neq() + get_tau_E_eq(F) ); + } + + SymmetricTensor<2, dim, NumberType> + get_tau_E_eq(const Tensor<2,dim, NumberType> &F) const + { + const SymmetricTensor<2, dim, NumberType> B = symmetrize(F * transpose(F)); + + std::array< std::pair< NumberType, Tensor< 1, dim, NumberType > >, dim > eigen_B; + eigen_B = eigenvectors(B, this->eigen_solver); + + SymmetricTensor<2, dim, NumberType> tau; + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + + for (unsigned int i = 0; i < 3; ++i) + { + for (unsigned int A = 0; A < dim; ++A) + { + SymmetricTensor<2, dim, NumberType> tau_aux1 = symmetrize( + outer_product(eigen_B[A].second,eigen_B[A].second)); + tau_aux1 *= mu_infty[i]*std::pow(eigen_B[A].first, (alpha_infty[i]/2.) ); + tau += tau_aux1; + } + SymmetricTensor<2, dim, NumberType> tau_aux2 (I); + tau_aux2 *= mu_infty[i]; + tau -= tau_aux2; + } + return tau; + } + + SymmetricTensor<2, dim, NumberType> + get_tau_E_neq() const + { + return tau_neq_1; + } + + NumberType + get_beta_mode_1(std::vector< NumberType > &lambda, const int &A) const + { + NumberType beta = 0.0; + + for (unsigned int i = 0; i < 3; ++i) //3rd-order Ogden model + { + + NumberType aux = 0.0; + for (int p = 0; p < dim; ++p) + aux += std::pow(lambda[p],alpha_mode_1[i]); + + aux *= -1.0/dim; + aux += std::pow(lambda[A], alpha_mode_1[i]); + aux *= mu_mode_1[i]; + + beta += aux; + } + return beta; + } + + NumberType + get_gamma_mode_1(std::vector< NumberType > &lambda, + const int &A, + const int &B ) const + { + NumberType gamma = 0.0; + + if (A==B) + { + for (unsigned int i = 0; i < 3; ++i) + { + NumberType aux = 0.0; + for (int p = 0; p < dim; ++p) + aux += std::pow(lambda[p],alpha_mode_1[i]); + + aux *= 1.0/(dim*dim); + aux += 1.0/dim * std::pow(lambda[A], alpha_mode_1[i]); + aux *= mu_mode_1[i]*alpha_mode_1[i]; + + gamma += aux; + } + } + else + { + for (unsigned int i = 0; i < 3; ++i) + { + NumberType aux = 0.0; + for (int p = 0; p < dim; ++p) + aux += std::pow(lambda[p],alpha_mode_1[i]); + + aux *= 1.0/(dim*dim); + aux -= 1.0/dim * std::pow(lambda[A], alpha_mode_1[i]); + aux -= 1.0/dim * std::pow(lambda[B], alpha_mode_1[i]); + aux *= mu_mode_1[i]*alpha_mode_1[i]; + + gamma += aux; + } + } + + return gamma; + } + }; + + +// @sect3{Constitutive equation for the fluid component of the biphasic material} +// We consider two slightly different definitions to define the seepage velocity with a Darcy-like law. +// Ehlers & Eipper 1999, doi:10.1023/A:1006565509095 +// Markert 2007, doi:10.1007/s11242-007-9107-6 +// The selection of one or another is made by the user via the parameters file. + template > + class Material_Darcy_Fluid + { + public: + Material_Darcy_Fluid(const Parameters::AllParameters ¶meters) + : + fluid_type(parameters.fluid_type), + n_OS(parameters.solid_vol_frac), + initial_intrinsic_permeability(parameters.init_intrinsic_perm), + viscosity_FR(parameters.viscosity_FR), + initial_darcy_coefficient(parameters.init_darcy_coef), + weight_FR(parameters.weight_FR), + kappa_darcy(parameters.kappa_darcy), + gravity_term(parameters.gravity_term), + density_FR(parameters.density_FR), + gravity_direction(parameters.gravity_direction), + gravity_value(parameters.gravity_value) + { + Assert(kappa_darcy >= 0, ExcInternalError()); + } + ~Material_Darcy_Fluid() + {} + + Tensor<1, dim, NumberType> get_seepage_velocity_current + (const Tensor<2,dim, NumberType> &F, + const Tensor<1,dim, NumberType> &grad_p_fluid) const + { + const NumberType det_F = determinant(F); + Assert(det_F > 0.0, ExcInternalError()); + + Tensor<2, dim, NumberType> permeability_term; + + if (fluid_type == "Markert") + permeability_term = get_instrinsic_permeability_current(F) / viscosity_FR; + + else if (fluid_type == "Ehlers") + permeability_term = get_darcy_flow_current(F) / weight_FR; + + else + throw std::runtime_error ("Material_Darcy_Fluid --> Only Markert " + "and Ehlers formulations have been implemented."); + + return ( -1.0 * permeability_term * det_F + * (grad_p_fluid - get_body_force_FR_current()) ); + } + + double get_porous_dissipation(const Tensor<2,dim, NumberType> &F, + const Tensor<1,dim, NumberType> &grad_p_fluid) const + { + NumberType dissipation_term; + Tensor<1, dim, NumberType> seepage_velocity; + Tensor<2, dim, NumberType> permeability_term; + + const NumberType det_F = determinant(F); + Assert(det_F > 0.0, ExcInternalError()); + + if (fluid_type == "Markert") + { + permeability_term = get_instrinsic_permeability_current(F) / viscosity_FR; + seepage_velocity = get_seepage_velocity_current(F,grad_p_fluid); + } + else if (fluid_type == "Ehlers") + { + permeability_term = get_darcy_flow_current(F) / weight_FR; + seepage_velocity = get_seepage_velocity_current(F,grad_p_fluid); + } + else + throw std::runtime_error ("Material_Darcy_Fluid --> Only Markert and Ehlers formulations have been implemented."); + + dissipation_term = ( invert(permeability_term) * seepage_velocity ) * seepage_velocity; + dissipation_term *= 1.0/(det_F*det_F); + return Tensor<0,dim,double>(dissipation_term); + } + + protected: + const std::string fluid_type; + const double n_OS; + const double initial_intrinsic_permeability; + const double viscosity_FR; + const double initial_darcy_coefficient; + const double weight_FR; + const double kappa_darcy; + const bool gravity_term; + const double density_FR; + const int gravity_direction; + const double gravity_value; + + Tensor<2, dim, NumberType> + get_instrinsic_permeability_current(const Tensor<2,dim, NumberType> &F) const + { + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + const Tensor<2, dim, NumberType> initial_instrinsic_permeability_tensor + = Tensor<2, dim, double>(initial_intrinsic_permeability * I); + + const NumberType det_F = determinant(F); + Assert(det_F > 0.0, ExcInternalError()); + + const NumberType fraction = (det_F - n_OS)/(1 - n_OS); + return ( NumberType (std::pow(fraction, kappa_darcy)) + * initial_instrinsic_permeability_tensor ); + } + + Tensor<2, dim, NumberType> + get_darcy_flow_current(const Tensor<2,dim, NumberType> &F) const + { + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + const Tensor<2, dim, NumberType> initial_darcy_flow_tensor + = Tensor<2, dim, double>(initial_darcy_coefficient * I); + + const NumberType det_F = determinant(F); + Assert(det_F > 0.0, ExcInternalError()); + + const NumberType fraction = (1.0 - (n_OS / det_F) )/(1.0 - n_OS); + return ( NumberType (std::pow(fraction, kappa_darcy)) + * initial_darcy_flow_tensor); + } + + Tensor<1, dim, NumberType> + get_body_force_FR_current() const + { + Tensor<1, dim, NumberType> body_force_FR_current; + + if (gravity_term == true) + { + Tensor<1, dim, NumberType> gravity_vector; + gravity_vector[gravity_direction] = gravity_value; + body_force_FR_current = density_FR * gravity_vector; + } + return body_force_FR_current; + } + }; + +// @sect3{Quadrature point history} +// As seen in step-18, the PointHistory class offers a method +// for storing data at the quadrature points. Here each quadrature point +// holds a pointer to a material description. Thus, different material models +// can be used in different regions of the domain. Among other data, we +// choose to store the ``extra" Kirchhoff stress $\boldsymbol{\tau}_E$ and +// the dissipation values $\mathcal{D}_p$ and $\mathcal{D}_v$. + template > //double> + class PointHistory + { + public: + PointHistory() + {} + + virtual ~PointHistory() + {} + + void setup_lqp (const Parameters::AllParameters ¶meters, + const Time &time) + { + if (parameters.mat_type == "Neo-Hooke") + solid_material.reset(new NeoHooke(parameters,time)); + else if (parameters.mat_type == "Ogden") + solid_material.reset(new Ogden(parameters,time)); + else if (parameters.mat_type == "visco-Ogden") + solid_material.reset(new visco_Ogden(parameters,time)); + else + Assert (false, ExcMessage("Material type not implemented")); + + fluid_material.reset(new Material_Darcy_Fluid(parameters)); + } + + SymmetricTensor<2, dim, NumberType> + get_tau_E(const Tensor<2, dim, NumberType> &F) const + { + return solid_material->get_tau_E(F); + } + + SymmetricTensor<2, dim, NumberType> + get_Cauchy_E(const Tensor<2, dim, NumberType> &F) const + { + return solid_material->get_Cauchy_E(F); + } + + double + get_converged_det_F() const + { + return solid_material->get_converged_det_F(); + } + + void + update_end_timestep() + { + solid_material->update_end_timestep(); + } + + void + update_internal_equilibrium(const Tensor<2, dim, NumberType> &F ) + { + solid_material->update_internal_equilibrium(F); + } + + double + get_viscous_dissipation() const + { + return solid_material->get_viscous_dissipation(); + } + + Tensor<1,dim, NumberType> + get_seepage_velocity_current (const Tensor<2,dim, NumberType> &F, + const Tensor<1,dim, NumberType> &grad_p_fluid) const + { + return fluid_material->get_seepage_velocity_current(F, grad_p_fluid); + } + + double + get_porous_dissipation(const Tensor<2,dim, NumberType> &F, + const Tensor<1,dim, NumberType> &grad_p_fluid) const + { + return fluid_material->get_porous_dissipation(F, grad_p_fluid); + } + + Tensor<1, dim, NumberType> + get_overall_body_force (const Tensor<2,dim, NumberType> &F, + const Parameters::AllParameters ¶meters) const + { + Tensor<1, dim, NumberType> body_force; + + if (parameters.gravity_term == true) + { + const NumberType det_F_AD = determinant(F); + Assert(det_F_AD > 0.0, ExcInternalError()); + + const NumberType overall_density_ref + = parameters.density_SR * parameters.solid_vol_frac + + parameters.density_FR + * (det_F_AD - parameters.solid_vol_frac); + + Tensor<1, dim, NumberType> gravity_vector; + gravity_vector[parameters.gravity_direction] = parameters.gravity_value; + body_force = overall_density_ref * gravity_vector; + } + + return body_force; + } + private: + std_cxx11::shared_ptr< Material_Hyperelastic > solid_material; + std_cxx11::shared_ptr< Material_Darcy_Fluid > fluid_material; + }; + +// @sect3{Nonlinear poro-viscoelastic solid} +// The Solid class is the central class as it represents the problem at hand: +// the nonlinear poro-viscoelastic solid + template + class Solid + { + public: + Solid(const Parameters::AllParameters ¶meters); + virtual ~Solid(); + void run(); + + protected: + typedef Sacado::Fad::DFad ADNumberType; + + std::ofstream outfile; + std::ofstream pointfile; + + struct PerTaskData_ASM; + template struct ScratchData_ASM; + + //Generate mesh + virtual void make_grid() = 0; + + //Define points for post-processing + virtual void define_tracked_vertices(std::vector > &tracked_vertices) = 0; + + //Set up the finite element system to be solved: + void system_setup(TrilinosWrappers::MPI::BlockVector &solution_delta_OUT); + + //Extract sub-blocks from the global matrix + void determine_component_extractors(); + + // Several functions to assemble the system and right hand side matrices using multithreading. + void assemble_system + (const TrilinosWrappers::MPI::BlockVector &solution_delta_OUT ); + void assemble_system_one_cell + (const typename DoFHandler::active_cell_iterator &cell, + ScratchData_ASM &scratch, + PerTaskData_ASM &data) const; + void copy_local_to_global_system(const PerTaskData_ASM &data); + + // Define boundary conditions + virtual void make_constraints(const int &it_nr); + virtual void make_dirichlet_constraints(AffineConstraints &constraints) = 0; + virtual Tensor<1,dim> get_neumann_traction + (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const = 0; + virtual double get_prescribed_fluid_flow + (const types::boundary_id &boundary_id, + const Point &pt) const = 0; + virtual types::boundary_id + get_reaction_boundary_id_for_output () const = 0; + virtual std::pair + get_drained_boundary_id_for_output () const = 0; + virtual std::vector get_dirichlet_load + (const types::boundary_id &boundary_id, + const int &direction) const = 0; + + // Create and update the quadrature points. + void setup_qph(); + + //Solve non-linear system using a Newton-Raphson scheme + void solve_nonlinear_timestep(TrilinosWrappers::MPI::BlockVector &solution_delta_OUT); + + //Solve the linearized equations using a direct solver + void solve_linear_system ( TrilinosWrappers::MPI::BlockVector &newton_update_OUT); + + //Retrieve the solution + TrilinosWrappers::MPI::BlockVector + get_total_solution(const TrilinosWrappers::MPI::BlockVector &solution_delta_IN) const; + + // Store the converged values of the internal variables at the end of each timestep + void update_end_timestep(); + + //Post-processing and writing data to files + void output_results_to_vtu(const unsigned int timestep, + const double current_time, + TrilinosWrappers::MPI::BlockVector solution) const; + void output_results_to_plot(const unsigned int timestep, + const double current_time, + TrilinosWrappers::MPI::BlockVector solution, + std::vector > &tracked_vertices, + std::ofstream &pointfile) const; + + // Headers and footer for the output files + void print_console_file_header( std::ofstream &outfile) const; + void print_plot_file_header(std::vector > &tracked_vertices, + std::ofstream &pointfile) const; + void print_console_file_footer(std::ofstream &outfile) const; + void print_plot_file_footer( std::ofstream &pointfile) const; + + // For parallel communication + MPI_Comm mpi_communicator; + const unsigned int n_mpi_processes; + const unsigned int this_mpi_process; + mutable ConditionalOStream pcout; + + //A collection of the parameters used to describe the problem setup + const Parameters::AllParameters ¶meters; + + //Declare an instance of dealii Triangulation class (mesh) + Triangulation triangulation; + + // Keep track of the current time and the time spent evaluating certain functions + Time time; + TimerOutput timerconsole; + TimerOutput timerfile; + + // A storage object for quadrature point information. + CellDataStorage::cell_iterator, PointHistory > quadrature_point_history; + + //Integers to store polynomial degree (needed for output) + const unsigned int degree_displ; + const unsigned int degree_pore; + + //Declare an instance of dealii FESystem class (finite element definition) + const FESystem fe; + + //Declare an instance of dealii DoFHandler class (assign DoFs to mesh) + DoFHandler dof_handler_ref; + + //Integer to store DoFs per element (this value will be used often) + const unsigned int dofs_per_cell; + + //Declare an instance of dealii Extractor objects used to retrieve information from the solution vectors + //We will use "u_fe" and "p_fluid_fe"as subscript in operator [] expressions on FEValues and FEFaceValues + //objects to extract the components of the displacement vector and fluid pressure, respectively. + const FEValuesExtractors::Vector u_fe; + const FEValuesExtractors::Scalar p_fluid_fe; + + // Description of how the block-system is arranged. There are 3 blocks: + // 0 - vector DOF displacements u + // 1 - scalar DOF fluid pressure p_fluid + static const unsigned int n_blocks = 2; + static const unsigned int n_components = dim+1; + static const unsigned int first_u_component = 0; + static const unsigned int p_fluid_component = dim; + + enum + { + u_block = 0, + p_fluid_block = 1 + }; + + // Extractors + const FEValuesExtractors::Scalar x_displacement; + const FEValuesExtractors::Scalar y_displacement; + const FEValuesExtractors::Scalar z_displacement; + const FEValuesExtractors::Scalar pressure; + + // Block data + std::vector block_component; + + // DoF index data + std::vector all_locally_owned_dofs; + IndexSet locally_owned_dofs; + IndexSet locally_relevant_dofs; + std::vector locally_owned_partitioning; + std::vector locally_relevant_partitioning; + + std::vector dofs_per_block; + std::vector element_indices_u; + std::vector element_indices_p_fluid; + + //Declare an instance of dealii QGauss class (The Gauss-Legendre family of quadrature rules for numerical integration) + //Gauss Points in element, with n quadrature points (in each space direction ) + const QGauss qf_cell; + //Gauss Points on element faces (used for definition of BCs) + const QGauss qf_face; + //Integer to store num GPs per element (this value will be used often) + const unsigned int n_q_points; + //Integer to store num GPs per face (this value will be used often) + const unsigned int n_q_points_f; + + //Declare an instance of dealii AffineConstraints class (linear constraints on DoFs due to hanging nodes or BCs) + AffineConstraints constraints; + + //Declare an instance of dealii classes necessary for FE system set-up and assembly + //Store elements of tangent matrix (indicated by SparsityPattern class) as sparse matrix (more efficient) + TrilinosWrappers::BlockSparseMatrix tangent_matrix; + TrilinosWrappers::BlockSparseMatrix tangent_matrix_preconditioner; + //Right hand side vector of forces + TrilinosWrappers::MPI::BlockVector system_rhs; + //Total displacement values + pressure (accumulated solution to FE system) + TrilinosWrappers::MPI::BlockVector solution_n; + + // Non-block system for the direct solver. We will copy the block system into these to solve the linearized system of equations. + TrilinosWrappers::SparseMatrix tangent_matrix_nb; + TrilinosWrappers::MPI::Vector system_rhs_nb; + + //We define variables to store norms and update norms and normalisation factors. + struct Errors + { + Errors() + : + norm(1.0), u(1.0), p_fluid(1.0) + {} + + void reset() + { + norm = 1.0; + u = 1.0; + p_fluid = 1.0; + } + void normalise(const Errors &rhs) + { + if (rhs.norm != 0.0) + norm /= rhs.norm; + if (rhs.u != 0.0) + u /= rhs.u; + if (rhs.p_fluid != 0.0) + p_fluid /= rhs.p_fluid; + } + + double norm, u, p_fluid; + }; + + //Declare several instances of the "Error" structure + Errors error_residual, error_residual_0, error_residual_norm, error_update, + error_update_0, error_update_norm; + + // Methods to calculate error measures + void get_error_residual(Errors &error_residual_OUT); + void get_error_update + (const TrilinosWrappers::MPI::BlockVector &newton_update_IN, + Errors &error_update_OUT); + + // Print information to screen + void print_conv_header(); + void print_conv_footer(); + +//NOTE: In all functions, we pass by reference (&), so these functions work on the original copy (not a clone copy), +// modifying the input variables inside the functions will change them outside the function. + }; + +// @sect3{Implementation of the Solid class} +// @sect4{Public interface} +// We initialise the Solid class using data extracted from the parameter file. + template + Solid::Solid(const Parameters::AllParameters ¶meters) + : + mpi_communicator(MPI_COMM_WORLD), + n_mpi_processes (Utilities::MPI::n_mpi_processes(mpi_communicator)), + this_mpi_process (Utilities::MPI::this_mpi_process(mpi_communicator)), + pcout(std::cout, this_mpi_process == 0), + parameters(parameters), + triangulation(Triangulation::maximum_smoothing), + time(parameters.end_time, parameters.delta_t), + timerconsole( mpi_communicator, + pcout, + TimerOutput::summary, + TimerOutput::wall_times), + timerfile( mpi_communicator, + outfile, + TimerOutput::summary, + TimerOutput::wall_times), + degree_displ(parameters.poly_degree_displ), + degree_pore(parameters.poly_degree_pore), + fe( FE_Q(parameters.poly_degree_displ), dim, + FE_Q(parameters.poly_degree_pore), 1 ), + dof_handler_ref(triangulation), + dofs_per_cell (fe.dofs_per_cell), + u_fe(first_u_component), + p_fluid_fe(p_fluid_component), + x_displacement(first_u_component), + y_displacement(first_u_component+1), + z_displacement(first_u_component+2), + pressure(p_fluid_component), + dofs_per_block(n_blocks), + qf_cell(parameters.quad_order), + qf_face(parameters.quad_order), + n_q_points (qf_cell.size()), + n_q_points_f (qf_face.size()) + { + Assert(dim==3, ExcMessage("This problem only works in 3 space dimensions.")); + determine_component_extractors(); + } + + //The class destructor simply clears the data held by the DOFHandler + template + Solid::~Solid() + { + dof_handler_ref.clear(); + } + +//Runs the 3D solid problem + template + void Solid::run() + { + //The current solution increment is defined as a block vector to reflect the structure + //of the PDE system, with multiple solution components + TrilinosWrappers::MPI::BlockVector solution_delta; + + //Open file + if (this_mpi_process == 0) + { + outfile.open("console-output.sol"); + print_console_file_header(outfile); + } + + //Generate mesh + make_grid(); + + //Assign DOFs and create the stiffness and right-hand-side force vector + system_setup(solution_delta); + + //Define points for post-processing + std::vector > tracked_vertices (2); + define_tracked_vertices(tracked_vertices); + std::vector> reaction_force; + + if (this_mpi_process == 0) + { + pointfile.open("data-for-gnuplot.sol"); + print_plot_file_header(tracked_vertices, pointfile); + } + + //Print results to output file + if (parameters.outfiles_requested == "true") + { + output_results_to_vtu(time.get_timestep(), + time.get_current(), + solution_n ); + } + + output_results_to_plot(time.get_timestep(), + time.get_current(), + solution_n, + tracked_vertices, + pointfile); + + //Increment time step (=load step) + //NOTE: In solving the quasi-static problem, the time becomes a loading parameter, + //i.e. we increase the loading linearly with time, making the two concepts interchangeable. + time.increment_time(); + + //Print information on screen + pcout << "\nSolver:"; + pcout << "\n CST = make constraints"; + pcout << "\n ASM_SYS = assemble system"; + pcout << "\n SLV = linear solver \n"; + + //Print information on file + outfile << "\nSolver:"; + outfile << "\n CST = make constraints"; + outfile << "\n ASM_SYS = assemble system"; + outfile << "\n SLV = linear solver \n"; + + while ( (time.get_end() - time.get_current()) > -1.0*parameters.tol_u ) + { + //Initialize the current solution increment to zero + solution_delta = 0.0; + + //Solve the non-linear system using a Newton-Rapshon scheme + solve_nonlinear_timestep(solution_delta); + + //Add the computed solution increment to total solution + solution_n += solution_delta; + + //Store the converged values of the internal variables + update_end_timestep(); + + //Output results + if (( (time.get_timestep()%parameters.timestep_output) == 0 ) + && (parameters.outfiles_requested == "true") ) + { + output_results_to_vtu(time.get_timestep(), + time.get_current(), + solution_n ); + } + + output_results_to_plot(time.get_timestep(), + time.get_current(), + solution_n, + tracked_vertices, + pointfile); + + //Increment the time step (=load step) + time.increment_time(); + } + + //Print the footers and close files + if (this_mpi_process == 0) + { + print_plot_file_footer(pointfile); + pointfile.close (); + print_console_file_footer(outfile); + + //NOTE: ideally, we should close the outfile here [ >> outfile.close (); ] + //But if we do, then the timer output will not be printed. That is why we leave it open. + } + } + +// @sect4{Private interface} +// We define the structures needed for parallelization with Threading Building Blocks (TBB) +// Tangent matrix and right-hand side force vector assembly structures. +// PerTaskData_ASM stores local contributions + template + struct Solid::PerTaskData_ASM + { + FullMatrix cell_matrix; + Vector cell_rhs; + std::vector local_dof_indices; + + PerTaskData_ASM(const unsigned int dofs_per_cell) + : + cell_matrix(dofs_per_cell, dofs_per_cell), + cell_rhs(dofs_per_cell), + local_dof_indices(dofs_per_cell) + {} + + void reset() + { + cell_matrix = 0.0; + cell_rhs = 0.0; + } + }; + + // ScratchData_ASM stores larger objects used during the assembly + template + template + struct Solid::ScratchData_ASM + { + const TrilinosWrappers::MPI::BlockVector &solution_total; + + //Integration helper + FEValues fe_values_ref; + FEFaceValues fe_face_values_ref; + + // Quadrature point solution + std::vector local_dof_values; + std::vector > solution_grads_u_total; + std::vector solution_values_p_fluid_total; + std::vector > solution_grads_p_fluid_total; + std::vector > solution_grads_face_p_fluid_total; + + //shape function values + std::vector>> Nx; + std::vector> Nx_p_fluid; + //shape function gradients + std::vector>> grad_Nx; + std::vector>> symm_grad_Nx; + std::vector>> grad_Nx_p_fluid; + + ScratchData_ASM(const FiniteElement &fe_cell, + const QGauss &qf_cell, const UpdateFlags uf_cell, + const QGauss & qf_face, const UpdateFlags uf_face, + const TrilinosWrappers::MPI::BlockVector &solution_total ) + : + solution_total (solution_total), + fe_values_ref(fe_cell, qf_cell, uf_cell), + fe_face_values_ref(fe_cell, qf_face, uf_face), + local_dof_values(fe_cell.dofs_per_cell), + solution_grads_u_total(qf_cell.size()), + solution_values_p_fluid_total(qf_cell.size()), + solution_grads_p_fluid_total(qf_cell.size()), + solution_grads_face_p_fluid_total(qf_face.size()), + Nx(qf_cell.size(), std::vector>(fe_cell.dofs_per_cell)), + Nx_p_fluid(qf_cell.size(), std::vector(fe_cell.dofs_per_cell)), + grad_Nx(qf_cell.size(), std::vector>(fe_cell.dofs_per_cell)), + symm_grad_Nx(qf_cell.size(), std::vector> (fe_cell.dofs_per_cell)), + grad_Nx_p_fluid(qf_cell.size(), std::vector>(fe_cell.dofs_per_cell)) + {} + + ScratchData_ASM(const ScratchData_ASM &rhs) + : + solution_total (rhs.solution_total), + fe_values_ref(rhs.fe_values_ref.get_fe(), + rhs.fe_values_ref.get_quadrature(), + rhs.fe_values_ref.get_update_flags()), + fe_face_values_ref(rhs.fe_face_values_ref.get_fe(), + rhs.fe_face_values_ref.get_quadrature(), + rhs.fe_face_values_ref.get_update_flags()), + local_dof_values(rhs.local_dof_values), + solution_grads_u_total(rhs.solution_grads_u_total), + solution_values_p_fluid_total(rhs.solution_values_p_fluid_total), + solution_grads_p_fluid_total(rhs.solution_grads_p_fluid_total), + solution_grads_face_p_fluid_total(rhs.solution_grads_face_p_fluid_total), + Nx(rhs.Nx), + Nx_p_fluid(rhs.Nx_p_fluid), + grad_Nx(rhs.grad_Nx), + symm_grad_Nx(rhs.symm_grad_Nx), + grad_Nx_p_fluid(rhs.grad_Nx_p_fluid) + {} + + void reset() + { + const unsigned int n_q_points = Nx_p_fluid.size(); + const unsigned int n_dofs_per_cell = Nx_p_fluid[0].size(); + + Assert(local_dof_values.size() == n_dofs_per_cell, ExcInternalError()); + + for (unsigned int k = 0; k < n_dofs_per_cell; ++k) + { + local_dof_values[k] = 0.0; + } + + Assert(solution_grads_u_total.size() == n_q_points, ExcInternalError()); + Assert(solution_values_p_fluid_total.size() == n_q_points, ExcInternalError()); + Assert(solution_grads_p_fluid_total.size() == n_q_points, ExcInternalError()); + + Assert(Nx.size() == n_q_points, ExcInternalError()); + Assert(grad_Nx.size() == n_q_points, ExcInternalError()); + Assert(symm_grad_Nx.size() == n_q_points, ExcInternalError()); + + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + { + Assert( Nx[q_point].size() == n_dofs_per_cell, ExcInternalError()); + Assert( grad_Nx[q_point].size() == n_dofs_per_cell, ExcInternalError()); + Assert( symm_grad_Nx[q_point].size() == n_dofs_per_cell, ExcInternalError()); + + solution_grads_u_total[q_point] = 0.0; + solution_values_p_fluid_total[q_point] = 0.0; + solution_grads_p_fluid_total[q_point] = 0.0; + + for (unsigned int k = 0; k < n_dofs_per_cell; ++k) + { + Nx[q_point][k] = 0.0; + Nx_p_fluid[q_point][k] = 0.0; + grad_Nx[q_point][k] = 0.0; + symm_grad_Nx[q_point][k] = 0.0; + grad_Nx_p_fluid[q_point][k] = 0.0; + } + } + + const unsigned int n_f_q_points = solution_grads_face_p_fluid_total.size(); + Assert(solution_grads_face_p_fluid_total.size() == n_f_q_points, ExcInternalError()); + + for (unsigned int f_q_point = 0; f_q_point < n_f_q_points; ++f_q_point) + solution_grads_face_p_fluid_total[f_q_point] = 0.0; + } + }; + + //Define the boundary conditions on the mesh + template + void Solid::make_constraints(const int &it_nr_IN) + { + pcout << " CST " << std::flush; + outfile << " CST " << std::flush; + + if (it_nr_IN > 1) return; + + const bool apply_dirichlet_bc = (it_nr_IN == 0); + + if (apply_dirichlet_bc) + { + constraints.clear(); + make_dirichlet_constraints(constraints); + } + else + { + for (unsigned int i=0; i + void Solid::system_setup(TrilinosWrappers::MPI::BlockVector &solution_delta_OUT) + { + timerconsole.enter_subsection("Setup system"); + timerfile.enter_subsection("Setup system"); + + // Partition triangulation + GridTools::partition_triangulation (n_mpi_processes, triangulation); + + + //Determine number of components per block + std::vector block_component(n_components, u_block); + block_component[p_fluid_component] = p_fluid_block; + + // The DOF handler is initialised and we renumber the grid in an efficient manner. + dof_handler_ref.distribute_dofs(fe); + DoFRenumbering::Cuthill_McKee(dof_handler_ref); + DoFRenumbering::component_wise(dof_handler_ref, block_component); + + // Count the number of DoFs in each block + dofs_per_block.clear(); + dofs_per_block.resize(n_blocks); + DoFTools::count_dofs_per_block(dof_handler_ref, dofs_per_block, block_component); + + // Setup the sparsity pattern and tangent matrix + all_locally_owned_dofs = DoFTools::locally_owned_dofs_per_subdomain (dof_handler_ref); + std::vector all_locally_relevant_dofs + = DoFTools::locally_relevant_dofs_per_subdomain (dof_handler_ref); + + locally_owned_dofs.clear(); + locally_owned_partitioning.clear(); + Assert(all_locally_owned_dofs.size() > this_mpi_process, ExcInternalError()); + locally_owned_dofs = all_locally_owned_dofs[this_mpi_process]; + + locally_relevant_dofs.clear(); + locally_relevant_partitioning.clear(); + Assert(all_locally_relevant_dofs.size() > this_mpi_process, ExcInternalError()); + locally_relevant_dofs = all_locally_relevant_dofs[this_mpi_process]; + + locally_owned_partitioning.reserve(n_blocks); + locally_relevant_partitioning.reserve(n_blocks); + + for (unsigned int b=0; b coupling(n_components, n_components); + for (unsigned int ii = 0; ii < n_components; ++ii) + for (unsigned int jj = 0; jj < n_components; ++jj) + + //Identify "zero" matrix components of FE-system (The two components do not couple) + if (((ii == p_fluid_component) && (jj < p_fluid_component)) + || ((ii < p_fluid_component) && (jj == p_fluid_component)) ) + coupling[ii][jj] = DoFTools::none; + + //The rest of components always couple + else + coupling[ii][jj] = DoFTools::always; + + TrilinosWrappers::BlockSparsityPattern bsp (locally_owned_partitioning, + mpi_communicator); + + DoFTools::make_sparsity_pattern (dof_handler_ref, bsp, constraints, + false, this_mpi_process); + bsp.compress(); + + //Reinitialize the (sparse) tangent matrix with the given sparsity pattern. + tangent_matrix.reinit (bsp); + + //Initialize the right hand side and solution vectors with number of DoFs + system_rhs.reinit(locally_owned_partitioning, mpi_communicator); + solution_n.reinit(locally_owned_partitioning, mpi_communicator); + solution_delta_OUT.reinit(locally_owned_partitioning, mpi_communicator); + + // Non-block system + TrilinosWrappers::SparsityPattern sp (locally_owned_dofs, + mpi_communicator); + DoFTools::make_sparsity_pattern (dof_handler_ref, sp, constraints, + false, this_mpi_process); + sp.compress(); + tangent_matrix_nb.reinit (sp); + system_rhs_nb.reinit(locally_owned_dofs, mpi_communicator); + + //Set up the quadrature point history + setup_qph(); + + timerconsole.leave_subsection(); + timerfile.leave_subsection(); + } + + //Component extractors: used to extract sub-blocks from the global matrix + //Description of which local element DOFs are attached to which block component + template + void Solid::determine_component_extractors() + { + element_indices_u.clear(); + element_indices_p_fluid.clear(); + + for (unsigned int k = 0; k < fe.dofs_per_cell; ++k) + { + const unsigned int k_group = fe.system_to_base_index(k).first.first; + if (k_group == u_block) + element_indices_u.push_back(k); + else if (k_group == p_fluid_block) + element_indices_p_fluid.push_back(k); + else + { + Assert(k_group <= p_fluid_block, ExcInternalError()); + } + } + } + + //Set-up quadrature point history (QPH) data objects + template + void Solid::setup_qph() + { + pcout << "\nSetting up quadrature point data..." << std::endl; + outfile << "\nSetting up quadrature point data..." << std::endl; + + //Create QPH data objects. + quadrature_point_history.initialize(triangulation.begin_active(), + triangulation.end(), n_q_points); + + //Setup the initial quadrature point data using the info stored in parameters + FilteredIterator::active_cell_iterator> + cell (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.begin_active()), + endc (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.end()); + for (; cell!=endc; ++cell) + { + Assert(cell->subdomain_id()==this_mpi_process, ExcInternalError()); + const std::vector > > + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + lqph[q_point]->setup_lqp(parameters, time); + } + } + + //Solve the non-linear system using a Newton-Raphson scheme + template + void Solid::solve_nonlinear_timestep(TrilinosWrappers::MPI::BlockVector &solution_delta_OUT) + { + //Print the load step + pcout << std::endl + << "\nTimestep " + << time.get_timestep() + << " @ " + << time.get_current() + << "s" + << std::endl; + outfile << std::endl + << "\nTimestep " + << time.get_timestep() + << " @ " + << time.get_current() + << "s" + << std::endl; + + //Declare newton_update vector (solution of a Newton iteration), + //which must have as many positions as global DoFs. + TrilinosWrappers::MPI::BlockVector newton_update + (locally_owned_partitioning, mpi_communicator); + + //Reset the error storage objects + error_residual.reset(); + error_residual_0.reset(); + error_residual_norm.reset(); + error_update.reset(); + error_update_0.reset(); + error_update_norm.reset(); + + print_conv_header(); + + //Declare and initialize iterator for the Newton-Raphson algorithm steps + unsigned int newton_iteration = 0; + + //Iterate until error is below tolerance or max number iterations are reached + while(newton_iteration < parameters.max_iterations_NR) + { + pcout << " " << std::setw(2) << newton_iteration << " " << std::flush; + outfile << " " << std::setw(2) << newton_iteration << " " << std::flush; + + //Initialize global stiffness matrix and global force vector to zero + tangent_matrix = 0.0; + system_rhs = 0.0; + + tangent_matrix_nb = 0.0; + system_rhs_nb = 0.0; + + //Apply boundary conditions + make_constraints(newton_iteration); + assemble_system(solution_delta_OUT); + + //Compute the rhs residual (error between external and internal forces in FE system) + get_error_residual(error_residual); + + //error_residual in first iteration is stored to normalize posterior error measures + if (newton_iteration == 0) + error_residual_0 = error_residual; + + // Determine the normalised residual error + error_residual_norm = error_residual; + error_residual_norm.normalise(error_residual_0); + + //If both errors are below the tolerances, exit the loop. + // We need to check the residual vector directly for convergence + // in the load steps where no external forces or displacements are imposed. + if ( ((newton_iteration > 0) + && (error_update_norm.u <= parameters.tol_u) + && (error_update_norm.p_fluid <= parameters.tol_p_fluid) + && (error_residual_norm.u <= parameters.tol_f) + && (error_residual_norm.p_fluid <= parameters.tol_f)) + || ( (newton_iteration > 0) + && system_rhs.l2_norm() <= parameters.tol_f) ) + { + pcout << "\n ***** CONVERGED! ***** " + << system_rhs.l2_norm() << " " + << " " << error_residual_norm.norm + << " " << error_residual_norm.u + << " " << error_residual_norm.p_fluid + << " " << error_update_norm.norm + << " " << error_update_norm.u + << " " << error_update_norm.p_fluid + << " " << std::endl; + outfile << "\n ***** CONVERGED! ***** " + << system_rhs.l2_norm() << " " + << " " << error_residual_norm.norm + << " " << error_residual_norm.u + << " " << error_residual_norm.p_fluid + << " " << error_update_norm.norm + << " " << error_update_norm.u + << " " << error_update_norm.p_fluid + << " " << std::endl; + print_conv_footer(); + + break; + } + + //Solve the linearized system + solve_linear_system(newton_update); + constraints.distribute(newton_update); + + //Compute the displacement error + get_error_update(newton_update, error_update); + + //error_update in first iteration is stored to normalize posterior error measures + if (newton_iteration == 0) + error_update_0 = error_update; + + // Determine the normalised Newton update error + error_update_norm = error_update; + error_update_norm.normalise(error_update_0); + + // Determine the normalised residual error + error_residual_norm = error_residual; + error_residual_norm.normalise(error_residual_0); + + //Print error values + pcout << " | " << std::fixed << std::setprecision(3) + << std::setw(7) << std::scientific + << system_rhs.l2_norm() + << " " << error_residual_norm.norm + << " " << error_residual_norm.u + << " " << error_residual_norm.p_fluid + << " " << error_update_norm.norm + << " " << error_update_norm.u + << " " << error_update_norm.p_fluid + << " " << std::endl; + + outfile << " | " << std::fixed << std::setprecision(3) + << std::setw(7) << std::scientific + << system_rhs.l2_norm() + << " " << error_residual_norm.norm + << " " << error_residual_norm.u + << " " << error_residual_norm.p_fluid + << " " << error_update_norm.norm + << " " << error_update_norm.u + << " " << error_update_norm.p_fluid + << " " << std::endl; + + // Update + solution_delta_OUT += newton_update; + newton_update = 0.0; + newton_iteration++; + } + + //If maximum allowed number of iterations for Newton algorithm are reached, print non-convergence message and abort program + AssertThrow (newton_iteration < parameters.max_iterations_NR, ExcMessage("No convergence in nonlinear solver!")); + } + + //Prints the header for convergence info on console + template + void Solid::print_conv_header() + { + static const unsigned int l_width = 120; + + for (unsigned int i = 0; i < l_width; ++i) + { + pcout << "_"; + outfile << "_"; + } + + pcout << std::endl; + outfile << std::endl; + + pcout << "\n SOLVER STEP | SYS_RES " + << "RES_NORM RES_U RES_P " + << "NU_NORM NU_U NU_P " << std::endl; + outfile << "\n SOLVER STEP | SYS_RES " + << "RES_NORM RES_U RES_P " + << "NU_NORM NU_U NU_P " << std::endl; + + for (unsigned int i = 0; i < l_width; ++i) + { + pcout << "_"; + outfile << "_"; + } + pcout << std::endl << std::endl; + outfile << std::endl << std::endl; + } + + //Prints the footer for convergence info on console + template + void Solid::print_conv_footer() + { + static const unsigned int l_width = 120; + + for (unsigned int i = 0; i < l_width; ++i) + { + pcout << "_"; + outfile << "_"; + } + pcout << std::endl << std::endl; + outfile << std::endl << std::endl; + + pcout << "Relative errors:" << std::endl + << "Displacement: " + << error_update.u / error_update_0.u << std::endl + << "Force (displ): " + << error_residual.u / error_residual_0.u << std::endl + << "Pore pressure: " + << error_update.p_fluid / error_update_0.p_fluid << std::endl + << "Force (pore): " + << error_residual.p_fluid / error_residual_0.p_fluid << std::endl; + outfile << "Relative errors:" << std::endl + << "Displacement: " + << error_update.u / error_update_0.u << std::endl + << "Force (displ): " + << error_residual.u / error_residual_0.u << std::endl + << "Pore pressure: " + << error_update.p_fluid / error_update_0.p_fluid << std::endl + << "Force (pore): " + << error_residual.p_fluid / error_residual_0.p_fluid << std::endl; + } + + //Determine the true residual error for the problem + template + void Solid::get_error_residual(Errors &error_residual_OUT) + { + TrilinosWrappers::MPI::BlockVector error_res(system_rhs); + constraints.set_zero(error_res); + + error_residual_OUT.norm = error_res.l2_norm(); + error_residual_OUT.u = error_res.block(u_block).l2_norm(); + error_residual_OUT.p_fluid = error_res.block(p_fluid_block).l2_norm(); + } + + //Determine the true Newton update error for the problem + template + void Solid::get_error_update + (const TrilinosWrappers::MPI::BlockVector &newton_update_IN, + Errors &error_update_OUT) + { + TrilinosWrappers::MPI::BlockVector error_ud(newton_update_IN); + constraints.set_zero(error_ud); + + error_update_OUT.norm = error_ud.l2_norm(); + error_update_OUT.u = error_ud.block(u_block).l2_norm(); + error_update_OUT.p_fluid = error_ud.block(p_fluid_block).l2_norm(); + } + + //Compute the total solution, which is valid at any Newton step. This is required as, to reduce + //computational error, the total solution is only updated at the end of the timestep. + template + TrilinosWrappers::MPI::BlockVector + Solid::get_total_solution(const TrilinosWrappers::MPI::BlockVector &solution_delta_IN) const + { + // Cell interpolation -> Ghosted vector + TrilinosWrappers::MPI::BlockVector + solution_total (locally_owned_partitioning, + locally_relevant_partitioning, + mpi_communicator, + /*vector_writable = */ false); + TrilinosWrappers::MPI::BlockVector tmp (solution_total); + solution_total = solution_n; + tmp = solution_delta_IN; + solution_total += tmp; + return solution_total; + } + + //Compute elemental stiffness tensor and right-hand side force vector, and assemble into global ones + template + void Solid::assemble_system( const TrilinosWrappers::MPI::BlockVector &solution_delta ) + { + timerconsole.enter_subsection("Assemble system"); + timerfile.enter_subsection("Assemble system"); + pcout << " ASM_SYS " << std::flush; + outfile << " ASM_SYS " << std::flush; + + const TrilinosWrappers::MPI::BlockVector solution_total(get_total_solution(solution_delta)); + + //Info given to FEValues and FEFaceValues constructors, to indicate which data will be needed at each element. + const UpdateFlags uf_cell(update_values | + update_gradients | + update_JxW_values); + const UpdateFlags uf_face(update_values | + update_gradients | + update_normal_vectors | + update_quadrature_points | + update_JxW_values ); + + //Setup a copy of the data structures required for the process and pass them, along with the + //memory addresses of the assembly functions to the WorkStream object for processing + PerTaskData_ASM per_task_data(dofs_per_cell); + ScratchData_ASM scratch_data(fe, qf_cell, uf_cell, + qf_face, uf_face, + solution_total); + + FilteredIterator::active_cell_iterator> + cell (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.begin_active()), + endc (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.end()); + for (; cell != endc; ++cell) + { + Assert(cell->subdomain_id()==this_mpi_process, ExcInternalError()); + assemble_system_one_cell(cell, scratch_data, per_task_data); + copy_local_to_global_system(per_task_data); + } + tangent_matrix.compress(VectorOperation::add); + system_rhs.compress(VectorOperation::add); + + tangent_matrix_nb.compress(VectorOperation::add); + system_rhs_nb.compress(VectorOperation::add); + + timerconsole.leave_subsection(); + timerfile.leave_subsection(); + } + + //Add the local elemental contribution to the global stiffness tensor + // We do it twice, for the block and the non-block systems + template + void Solid::copy_local_to_global_system (const PerTaskData_ASM &data) + { + constraints.distribute_local_to_global(data.cell_matrix, + data.cell_rhs, + data.local_dof_indices, + tangent_matrix, + system_rhs); + + constraints.distribute_local_to_global(data.cell_matrix, + data.cell_rhs, + data.local_dof_indices, + tangent_matrix_nb, + system_rhs_nb); + } + + //Compute stiffness matrix and corresponding rhs for one element + template + void Solid::assemble_system_one_cell + (const typename DoFHandler::active_cell_iterator &cell, + ScratchData_ASM &scratch, + PerTaskData_ASM &data) const + { + Assert(cell->subdomain_id()==this_mpi_process, ExcInternalError()); + + data.reset(); + scratch.reset(); + scratch.fe_values_ref.reinit(cell); + cell->get_dof_indices(data.local_dof_indices); + + // Setup automatic differentiation + for (unsigned int k = 0; k < dofs_per_cell; ++k) + { + // Initialise the dofs for the cell using the current solution. + scratch.local_dof_values[k] = scratch.solution_total[data.local_dof_indices[k]]; + // Mark this cell DoF as an independent variable + scratch.local_dof_values[k].diff(k, dofs_per_cell); + } + + // Update the quadrature point solution + // Compute the values and gradients of the solution in terms of the AD variables + for (unsigned int q = 0; q < n_q_points; ++q) + { + for (unsigned int k = 0; k < dofs_per_cell; ++k) + { + const unsigned int k_group = fe.system_to_base_index(k).first.first; + if (k_group == u_block) + { + const Tensor<2, dim> Grad_Nx_u = + scratch.fe_values_ref[u_fe].gradient(k, q); + for (unsigned int dd = 0; dd < dim; dd++) + { + for (unsigned int ee = 0; ee < dim; ee++) + { + scratch.solution_grads_u_total[q][dd][ee] + += scratch.local_dof_values[k] * Grad_Nx_u[dd][ee]; + } + } + } + else if (k_group == p_fluid_block) + { + const double Nx_p = scratch.fe_values_ref[p_fluid_fe].value(k, q); + const Tensor<1, dim> Grad_Nx_p = + scratch.fe_values_ref[p_fluid_fe].gradient(k, q); + + scratch.solution_values_p_fluid_total[q] + += scratch.local_dof_values[k] * Nx_p; + for (unsigned int dd = 0; dd < dim; dd++) + { + scratch.solution_grads_p_fluid_total[q][dd] + += scratch.local_dof_values[k] * Grad_Nx_p[dd]; + } + } + else + Assert(k_group <= p_fluid_block, ExcInternalError()); + } + } + + //Set up pointer "lgph" to the PointHistory object of this element + const std::vector > > + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + + //Precalculate the element shape function values and gradients + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + { + Tensor<2, dim, ADNumberType> F_AD = scratch.solution_grads_u_total[q_point]; + F_AD += Tensor<2, dim, double>(Physics::Elasticity::StandardTensors::I); + Assert(determinant(F_AD) > 0, ExcMessage("Invalid deformation map")); + const Tensor<2, dim, ADNumberType> F_inv_AD = invert(F_AD); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + { + const unsigned int i_group = fe.system_to_base_index(i).first.first; + + if (i_group == u_block) + { + scratch.Nx[q_point][i] = + scratch.fe_values_ref[u_fe].value(i, q_point); + scratch.grad_Nx[q_point][i] = + scratch.fe_values_ref[u_fe].gradient(i, q_point)*F_inv_AD; + scratch.symm_grad_Nx[q_point][i] = + symmetrize(scratch.grad_Nx[q_point][i]); + } + else if (i_group == p_fluid_block) + { + scratch.Nx_p_fluid[q_point][i] = + scratch.fe_values_ref[p_fluid_fe].value(i, q_point); + scratch.grad_Nx_p_fluid[q_point][i] = + scratch.fe_values_ref[p_fluid_fe].gradient(i, q_point)*F_inv_AD; + } + else + Assert(i_group <= p_fluid_block, ExcInternalError()); + } + } + + //Assemble the stiffness matrix and rhs vector + std::vector residual_ad (dofs_per_cell, ADNumberType(0.0)); + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + { + Tensor<2, dim, ADNumberType> F_AD = scratch.solution_grads_u_total[q_point]; + F_AD += Tensor<2, dim,double>(Physics::Elasticity::StandardTensors::I); + const ADNumberType det_F_AD = determinant(F_AD); + + Assert(det_F_AD > 0, ExcInternalError()); + const Tensor<2, dim, ADNumberType> F_inv_AD = invert(F_AD); //inverse of def. gradient tensor + + const ADNumberType p_fluid = scratch.solution_values_p_fluid_total[q_point]; + + { + PointHistory *lqph_q_point_nc = + const_cast*>(lqph[q_point].get()); + lqph_q_point_nc->update_internal_equilibrium(F_AD); + } + + //Get some info from constitutive model of solid + static const SymmetricTensor< 2, dim, double> + I (Physics::Elasticity::StandardTensors::I); + const SymmetricTensor<2, dim, ADNumberType> + tau_E = lqph[q_point]->get_tau_E(F_AD); + SymmetricTensor<2, dim, ADNumberType> tau_fluid_vol (I); + tau_fluid_vol *= -1.0 * p_fluid * det_F_AD; + + //Get some info from constitutive model of fluid + const ADNumberType det_F_aux = lqph[q_point]->get_converged_det_F(); + const double det_F_converged = Tensor<0,dim,double>(det_F_aux); //Needs to be double, not AD number + const Tensor<1, dim, ADNumberType> overall_body_force + = lqph[q_point]->get_overall_body_force(F_AD, parameters); + + // Define some aliases to make the assembly process easier to follow + const std::vector> &Nu = scratch.Nx[q_point]; + const std::vector> + &symm_grad_Nu = scratch.symm_grad_Nx[q_point]; + const std::vector &Np = scratch.Nx_p_fluid[q_point]; + const std::vector > &grad_Np + = scratch.grad_Nx_p_fluid[q_point]; + const Tensor<1, dim, ADNumberType> grad_p + = scratch.solution_grads_p_fluid_total[q_point]*F_inv_AD; + const double JxW = scratch.fe_values_ref.JxW(q_point); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + { + const unsigned int i_group = fe.system_to_base_index(i).first.first; + + if (i_group == u_block) + { + residual_ad[i] += symm_grad_Nu[i] * ( tau_E + tau_fluid_vol ) * JxW; + residual_ad[i] -= Nu[i] * overall_body_force * JxW; + } + else if (i_group == p_fluid_block) + { + const Tensor<1, dim, ADNumberType> seepage_vel_current + = lqph[q_point]->get_seepage_velocity_current(F_AD, grad_p); + residual_ad[i] += Np[i] * (det_F_AD - det_F_converged) * JxW; + residual_ad[i] -= time.get_delta_t() * grad_Np[i] + * seepage_vel_current * JxW; + } + else + Assert(i_group <= p_fluid_block, ExcInternalError()); + } + } + + // Assemble the Neumann contribution (external force contribution). + for (unsigned int face = 0; face < GeometryInfo::faces_per_cell; ++face) //Loop over faces in element + { + if (cell->face(face)->at_boundary() == true) + { + scratch.fe_face_values_ref.reinit(cell, face); + + for (unsigned int f_q_point = 0; f_q_point < n_q_points_f; ++f_q_point) + { + const Tensor<1, dim> &N + = scratch.fe_face_values_ref.normal_vector(f_q_point); + const Point &pt + = scratch.fe_face_values_ref.quadrature_point(f_q_point); + const Tensor<1, dim> traction + = get_neumann_traction(cell->face(face)->boundary_id(), pt, N); + const double flow + = get_prescribed_fluid_flow(cell->face(face)->boundary_id(), pt); + + if ( (traction.norm() < 1e-12) && (std::abs(flow) < 1e-12) ) continue; + + const double JxW_f = scratch.fe_face_values_ref.JxW(f_q_point); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + { + const unsigned int i_group = fe.system_to_base_index(i).first.first; + + if ((i_group == u_block) && (traction.norm() > 1e-12)) + { + const unsigned int component_i + = fe.system_to_component_index(i).first; + const double Nu_f + = scratch.fe_face_values_ref.shape_value(i, f_q_point); + residual_ad[i] -= (Nu_f * traction[component_i]) * JxW_f; + } + if ((i_group == p_fluid_block) && (std::abs(flow) > 1e-12)) + { + const double Nu_p + = scratch.fe_face_values_ref.shape_value(i, f_q_point); + residual_ad[i] -= (Nu_p * flow) * JxW_f; + } + } + } + } + } + + // Linearise the residual + for (unsigned int i = 0; i < dofs_per_cell; ++i) + { + const ADNumberType &R_i = residual_ad[i]; + + data.cell_rhs(i) -= R_i.val(); + for (unsigned int j=0; j + void Solid::update_end_timestep() + { + FilteredIterator::active_cell_iterator> + cell (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.begin_active()), + endc (IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.end()); + for (; cell!=endc; ++cell) + { + Assert(cell->subdomain_id()==this_mpi_process, ExcInternalError()); + const std::vector > > + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + lqph[q_point]->update_end_timestep(); + } + } + + + //Solve the linearized equations + template + void Solid::solve_linear_system( TrilinosWrappers::MPI::BlockVector &newton_update_OUT) + { + + timerconsole.enter_subsection("Linear solver"); + timerfile.enter_subsection("Linear solver"); + pcout << " SLV " << std::flush; + outfile << " SLV " << std::flush; + + TrilinosWrappers::MPI::Vector newton_update_nb; + newton_update_nb.reinit(locally_owned_dofs, mpi_communicator); + + SolverControl solver_control (tangent_matrix_nb.m(), + 1.0e-6 * system_rhs_nb.l2_norm()); + TrilinosWrappers::SolverDirect solver (solver_control); + solver.solve(tangent_matrix_nb, newton_update_nb, system_rhs_nb); + + // Copy the non-block solution back to block system + for (unsigned int i=0; i > + class FilteredDataOut : public DataOut + { + public: + FilteredDataOut (const unsigned int subdomain_id) + : + subdomain_id (subdomain_id) + {} + + virtual ~FilteredDataOut() {} + + virtual typename DataOut::cell_iterator + first_cell () + { + typename DataOut::active_cell_iterator + cell = this->dofs->begin_active(); + while ((cell != this->dofs->end()) && + (cell->subdomain_id() != subdomain_id)) + ++cell; + return cell; + } + + virtual typename DataOut::cell_iterator + next_cell (const typename DataOut::cell_iterator &old_cell) + { + if (old_cell != this->dofs->end()) + { + const IteratorFilters::SubdomainEqualTo predicate(subdomain_id); + return + ++(FilteredIterator::active_cell_iterator> + (predicate,old_cell)); + } + else + return old_cell; + } + + private: + const unsigned int subdomain_id; + }; + + template > + class FilteredDataOutFaces : public DataOutFaces + { + public: + FilteredDataOutFaces (const unsigned int subdomain_id) + : + subdomain_id (subdomain_id) + {} + + virtual ~FilteredDataOutFaces() {} + + virtual typename DataOutFaces::cell_iterator + first_cell () + { + typename DataOutFaces::active_cell_iterator + cell = this->dofs->begin_active(); + while ((cell!=this->dofs->end()) && (cell->subdomain_id()!=subdomain_id)) + ++cell; + return cell; + } + + virtual typename DataOutFaces::cell_iterator + next_cell (const typename DataOutFaces::cell_iterator &old_cell) + { + if (old_cell!=this->dofs->end()) + { + const IteratorFilters::SubdomainEqualTo predicate(subdomain_id); + return + ++(FilteredIterator::active_cell_iterator> + (predicate,old_cell)); + } + else + return old_cell; + } + + private: + const unsigned int subdomain_id; + }; + + //Class to compute gradient of the pressure + template + class GradientPostprocessor : public DataPostprocessorVector + { + public: + GradientPostprocessor (const unsigned int p_fluid_component) + : + DataPostprocessorVector ("grad_p", + update_gradients), + p_fluid_component (p_fluid_component) + {} + + virtual ~GradientPostprocessor(){} + + virtual void + evaluate_vector_field + (const DataPostprocessorInputs::Vector &input_data, + std::vector > &computed_quantities) const + { + AssertDimension (input_data.solution_gradients.size(), + computed_quantities.size()); + for (unsigned int p=0; p void Solid::output_results_to_vtu + (const unsigned int timestep, + const double current_time, + TrilinosWrappers::MPI::BlockVector solution_IN) const + { + TrilinosWrappers::MPI::BlockVector solution_total(locally_owned_partitioning, + locally_relevant_partitioning, + mpi_communicator, + false); + solution_total = solution_IN; + Vector material_id; + material_id.reinit(triangulation.n_active_cells()); + std::vector partition_int(triangulation.n_active_cells()); + GradientPostprocessor gradient_postprocessor(p_fluid_component); + + //Declare local variables with number of stress components + //& assign value according to "dim" value + unsigned int num_comp_symm_tensor = 6; + + //Declare local vectors to store values + // OUTPUT AVERAGED ON ELEMENTS ------------------------------------------- + std::vector>cauchy_stresses_total_elements + (num_comp_symm_tensor, + Vector (triangulation.n_active_cells())); + std::vector>cauchy_stresses_E_elements + (num_comp_symm_tensor, + Vector (triangulation.n_active_cells())); + std::vector>stretches_elements + (dim, + Vector (triangulation.n_active_cells())); + std::vector>seepage_velocity_elements + (dim, + Vector (triangulation.n_active_cells())); + Vector porous_dissipation_elements + (triangulation.n_active_cells()); + Vector viscous_dissipation_elements + (triangulation.n_active_cells()); + Vector solid_vol_fraction_elements + (triangulation.n_active_cells()); + + // OUTPUT AVERAGED ON NODES ---------------------------------------------- + // We need to create a new FE space with a single dof per node to avoid + // duplication of the output on nodes for our problem with dim+1 dofs. + FE_Q fe_vertex(1); + DoFHandler vertex_handler_ref(triangulation); + vertex_handler_ref.distribute_dofs(fe_vertex); + AssertThrow(vertex_handler_ref.n_dofs() == triangulation.n_vertices(), + ExcDimensionMismatch(vertex_handler_ref.n_dofs(), + triangulation.n_vertices())); + + Vector counter_on_vertices_mpi + (vertex_handler_ref.n_dofs()); + Vector sum_counter_on_vertices + (vertex_handler_ref.n_dofs()); + + std::vector>cauchy_stresses_total_vertex_mpi + (num_comp_symm_tensor, + Vector(vertex_handler_ref.n_dofs())); + std::vector>sum_cauchy_stresses_total_vertex + (num_comp_symm_tensor, + Vector(vertex_handler_ref.n_dofs())); + std::vector>cauchy_stresses_E_vertex_mpi + (num_comp_symm_tensor, + Vector(vertex_handler_ref.n_dofs())); + std::vector>sum_cauchy_stresses_E_vertex + (num_comp_symm_tensor, + Vector(vertex_handler_ref.n_dofs())); + std::vector>stretches_vertex_mpi + (dim, + Vector(vertex_handler_ref.n_dofs())); + std::vector>sum_stretches_vertex + (dim, + Vector(vertex_handler_ref.n_dofs())); + Vector porous_dissipation_vertex_mpi(vertex_handler_ref.n_dofs()); + Vector sum_porous_dissipation_vertex(vertex_handler_ref.n_dofs()); + Vector viscous_dissipation_vertex_mpi(vertex_handler_ref.n_dofs()); + Vector sum_viscous_dissipation_vertex(vertex_handler_ref.n_dofs()); + Vector solid_vol_fraction_vertex_mpi(vertex_handler_ref.n_dofs()); + Vector sum_solid_vol_fraction_vertex(vertex_handler_ref.n_dofs()); + + // We need to create a new FE space with a dim dof per node to + // be able to ouput data on nodes in vector form + FESystem fe_vertex_vec(FE_Q(1),dim); + DoFHandler vertex_vec_handler_ref(triangulation); + vertex_vec_handler_ref.distribute_dofs(fe_vertex_vec); + AssertThrow(vertex_vec_handler_ref.n_dofs() == (dim*triangulation.n_vertices()), + ExcDimensionMismatch(vertex_vec_handler_ref.n_dofs(), + (dim*triangulation.n_vertices()))); + + Vector seepage_velocity_vertex_vec_mpi(vertex_vec_handler_ref.n_dofs()); + Vector sum_seepage_velocity_vertex_vec(vertex_vec_handler_ref.n_dofs()); + Vector counter_on_vertices_vec_mpi(vertex_vec_handler_ref.n_dofs()); + Vector sum_counter_on_vertices_vec(vertex_vec_handler_ref.n_dofs()); + // ----------------------------------------------------------------------- + + //Declare and initialize local unit vectors (to construct tensor basis) + std::vector> basis_vectors (dim, Tensor<1,dim>() ); + for (unsigned int i=0; i material(parameters,time); + else if (parameters.mat_type == "Ogden") + Ogden material(parameters,time); + else if (parameters.mat_type == "visco-Ogden") + visco_Ogden material(parameters,time); + else + Assert (false, ExcMessage("Material type not implemented")); + + //Define a local instance of FEValues to compute updated values required + //to calculate stresses + const UpdateFlags uf_cell(update_values | update_gradients | + update_JxW_values); + FEValues fe_values_ref (fe, qf_cell, uf_cell); + + //Iterate through elements (cells) and Gauss Points + FilteredIterator::active_cell_iterator> + cell(IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.begin_active()), + endc(IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.end()), + cell_v(IteratorFilters::SubdomainEqualTo(this_mpi_process), + vertex_handler_ref.begin_active()), + cell_v_vec(IteratorFilters::SubdomainEqualTo(this_mpi_process), + vertex_vec_handler_ref.begin_active()); + //start cell loop + for (; cell!=endc; ++cell, ++cell_v, ++cell_v_vec) + { + if (cell->subdomain_id() != this_mpi_process) continue; + material_id(cell->active_cell_index())= + static_cast(cell->material_id()); + + fe_values_ref.reinit(cell); + + std::vector> solution_grads_u(n_q_points); + fe_values_ref[u_fe].get_function_gradients(solution_total, + solution_grads_u); + + std::vector solution_values_p_fluid_total(n_q_points); + fe_values_ref[p_fluid_fe].get_function_values(solution_total, + solution_values_p_fluid_total); + + std::vector> solution_grads_p_fluid_AD (n_q_points); + fe_values_ref[p_fluid_fe].get_function_gradients(solution_total, + solution_grads_p_fluid_AD); + + //start gauss point loop + for (unsigned int q_point=0; q_point + F_AD = Physics::Elasticity::Kinematics::F(solution_grads_u[q_point]); + ADNumberType det_F_AD = determinant(F_AD); + const double det_F = Tensor<0,dim,double>(det_F_AD); + + const std::vector>> + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + const double p_fluid = solution_values_p_fluid_total[q_point]; + + //Cauchy stress + static const SymmetricTensor<2,dim,double> + I (Physics::Elasticity::StandardTensors::I); + SymmetricTensor<2,dim> sigma_E; + const SymmetricTensor<2,dim,ADNumberType> sigma_E_AD = + lqph[q_point]->get_Cauchy_E(F_AD); + + for (unsigned int i=0; i(sigma_E_AD[i][j]); + + SymmetricTensor<2,dim> sigma_fluid_vol (I); + sigma_fluid_vol *= -p_fluid; + const SymmetricTensor<2,dim> sigma = sigma_E + sigma_fluid_vol; + + //Volumes + const double solid_vol_fraction = (parameters.solid_vol_frac)/det_F; + + //Green-Lagrange strain + const Tensor<2,dim> E_strain = 0.5*(transpose(F_AD)*F_AD - I); + + //Seepage velocity + const Tensor<2,dim,ADNumberType> F_inv = invert(F_AD); + const Tensor<1,dim,ADNumberType> grad_p_fluid_AD = + solution_grads_p_fluid_AD[q_point]*F_inv; + const Tensor<1,dim,ADNumberType> seepage_vel_AD = + lqph[q_point]->get_seepage_velocity_current(F_AD, grad_p_fluid_AD); + + //Dissipations + const double porous_dissipation = + lqph[q_point]->get_porous_dissipation(F_AD, grad_p_fluid_AD); + const double viscous_dissipation = + lqph[q_point]->get_viscous_dissipation(); + + // OUTPUT AVERAGED ON ELEMENTS ------------------------------------------- + // Both average on elements and on nodes is NOT weighted with the + // integration point volume, i.e., we assume equal contribution of each + // integration point to the average. Ideally, it should be weighted, + // but I haven't invested time in getting it to work properly. + if (parameters.outtype == "elements") + { + for (unsigned int j=0; jactive_cell_index()) + += ((sigma*basis_vectors[j])*basis_vectors[j])/n_q_points; + cauchy_stresses_E_elements[j](cell->active_cell_index()) + += ((sigma_E*basis_vectors[j])*basis_vectors[j])/n_q_points; + stretches_elements[j](cell->active_cell_index()) + += std::sqrt(1.0+2.0*Tensor<0,dim,double>(E_strain[j][j])) + /n_q_points; + seepage_velocity_elements[j](cell->active_cell_index()) + += Tensor<0,dim,double>(seepage_vel_AD[j])/n_q_points; + } + + porous_dissipation_elements(cell->active_cell_index()) + += porous_dissipation/n_q_points; + viscous_dissipation_elements(cell->active_cell_index()) + += viscous_dissipation/n_q_points; + solid_vol_fraction_elements(cell->active_cell_index()) + += solid_vol_fraction/n_q_points; + + cauchy_stresses_total_elements[3](cell->active_cell_index()) + += ((sigma*basis_vectors[0])*basis_vectors[1])/n_q_points; //sig_xy + cauchy_stresses_total_elements[4](cell->active_cell_index()) + += ((sigma*basis_vectors[0])*basis_vectors[2])/n_q_points;//sig_xz + cauchy_stresses_total_elements[5](cell->active_cell_index()) + += ((sigma*basis_vectors[1])*basis_vectors[2])/n_q_points;//sig_yz + + cauchy_stresses_E_elements[3](cell->active_cell_index()) + += ((sigma_E*basis_vectors[0])* basis_vectors[1])/n_q_points; //sig_xy + cauchy_stresses_E_elements[4](cell->active_cell_index()) + += ((sigma_E*basis_vectors[0])* basis_vectors[2])/n_q_points;//sig_xz + cauchy_stresses_E_elements[5](cell->active_cell_index()) + += ((sigma_E*basis_vectors[1])* basis_vectors[2])/n_q_points;//sig_yz + + } + // OUTPUT AVERAGED ON NODES ------------------------------------------- + else if (parameters.outtype == "nodes") + { + for (unsigned int v=0; v<(GeometryInfo::vertices_per_cell); ++v) + { + types::global_dof_index local_vertex_indices = + cell_v->vertex_dof_index(v, 0); + counter_on_vertices_mpi(local_vertex_indices) += 1; + for (unsigned int k=0; k(E_strain[k][k])); + + types::global_dof_index local_vertex_vec_indices = + cell_v_vec->vertex_dof_index(v, k); + counter_on_vertices_vec_mpi(local_vertex_vec_indices) += 1; + seepage_velocity_vertex_vec_mpi(local_vertex_vec_indices) + += Tensor<0,dim,double>(seepage_vel_AD[k]); + } + + porous_dissipation_vertex_mpi(local_vertex_indices) + += porous_dissipation; + viscous_dissipation_vertex_mpi(local_vertex_indices) + += viscous_dissipation; + solid_vol_fraction_vertex_mpi(local_vertex_indices) + += solid_vol_fraction; + + cauchy_stresses_total_vertex_mpi[3](local_vertex_indices) + += (sigma*basis_vectors[0])*basis_vectors[1]; //sig_xy + cauchy_stresses_total_vertex_mpi[4](local_vertex_indices) + += (sigma*basis_vectors[0])*basis_vectors[2];//sig_xz + cauchy_stresses_total_vertex_mpi[5](local_vertex_indices) + += (sigma*basis_vectors[1])*basis_vectors[2]; //sig_yz + + cauchy_stresses_E_vertex_mpi[3](local_vertex_indices) + += (sigma_E*basis_vectors[0])*basis_vectors[1]; //sig_xy + cauchy_stresses_E_vertex_mpi[4](local_vertex_indices) + += (sigma_E*basis_vectors[0])*basis_vectors[2];//sig_xz + cauchy_stresses_E_vertex_mpi[5](local_vertex_indices) + += (sigma_E*basis_vectors[1])*basis_vectors[2]; //sig_yz + } + } + //--------------------------------------------------------------- + } //end gauss point loop + }//end cell loop + + // Different nodes might have different amount of contributions, e.g., + // corner nodes have less integration points contributing to the averaged. + // This is why we need a counter and divide at the end, outside the cell loop. + if (parameters.outtype == "nodes") + { + for (unsigned int d=0; d<(vertex_handler_ref.n_dofs()); ++d) + { + sum_counter_on_vertices[d] = + Utilities::MPI::sum(counter_on_vertices_mpi[d], + mpi_communicator); + sum_porous_dissipation_vertex[d] = + Utilities::MPI::sum(porous_dissipation_vertex_mpi[d], + mpi_communicator); + sum_viscous_dissipation_vertex[d] = + Utilities::MPI::sum(viscous_dissipation_vertex_mpi[d], + mpi_communicator); + sum_solid_vol_fraction_vertex[d] = + Utilities::MPI::sum(solid_vol_fraction_vertex_mpi[d], + mpi_communicator); + + for (unsigned int k=0; k0) + { + for (unsigned int i=0; i0) + { + sum_seepage_velocity_vertex_vec[d] /= sum_counter_on_vertices_vec[d]; + } + } + + } + + // Add the results to the solution to create the output file for Paraview + FilteredDataOut data_out(this_mpi_process); + std::vector + comp_type(dim, + DataComponentInterpretation::component_is_part_of_vector); + comp_type.push_back(DataComponentInterpretation::component_is_scalar); + + GridTools::get_subdomain_association(triangulation, partition_int); + + std::vector solution_name(dim, "displacement"); + solution_name.push_back("pore_pressure"); + + data_out.attach_dof_handler(dof_handler_ref); + data_out.add_data_vector(solution_total, + solution_name, + DataOut::type_dof_data, + comp_type); + + data_out.add_data_vector(solution_total, + gradient_postprocessor); + + const Vector partitioning(partition_int.begin(), + partition_int.end()); + + data_out.add_data_vector(partitioning, "partitioning"); + data_out.add_data_vector(material_id, "material_id"); + + // Integration point results ----------------------------------------------------------- + if (parameters.outtype == "elements") + { + data_out.add_data_vector(cauchy_stresses_total_elements[0], "cauchy_xx"); + data_out.add_data_vector(cauchy_stresses_total_elements[1], "cauchy_yy"); + data_out.add_data_vector(cauchy_stresses_total_elements[2], "cauchy_zz"); + data_out.add_data_vector(cauchy_stresses_total_elements[3], "cauchy_xy"); + data_out.add_data_vector(cauchy_stresses_total_elements[4], "cauchy_xz"); + data_out.add_data_vector(cauchy_stresses_total_elements[5], "cauchy_yz"); + + data_out.add_data_vector(cauchy_stresses_E_elements[0], "cauchy_E_xx"); + data_out.add_data_vector(cauchy_stresses_E_elements[1], "cauchy_E_yy"); + data_out.add_data_vector(cauchy_stresses_E_elements[2], "cauchy_E_zz"); + data_out.add_data_vector(cauchy_stresses_E_elements[3], "cauchy_E_xy"); + data_out.add_data_vector(cauchy_stresses_E_elements[4], "cauchy_E_xz"); + data_out.add_data_vector(cauchy_stresses_E_elements[5], "cauchy_E_yz"); + + data_out.add_data_vector(stretches_elements[0], "stretch_xx"); + data_out.add_data_vector(stretches_elements[1], "stretch_yy"); + data_out.add_data_vector(stretches_elements[2], "stretch_zz"); + + data_out.add_data_vector(seepage_velocity_elements[0], "seepage_vel_x"); + data_out.add_data_vector(seepage_velocity_elements[1], "seepage_vel_y"); + data_out.add_data_vector(seepage_velocity_elements[2], "seepage_vel_z"); + + data_out.add_data_vector(porous_dissipation_elements, "dissipation_porous"); + data_out.add_data_vector(viscous_dissipation_elements, "dissipation_viscous"); + data_out.add_data_vector(solid_vol_fraction_elements, "solid_vol_fraction"); + } + else if (parameters.outtype == "nodes") + { + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[0], + "cauchy_xx"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[1], + "cauchy_yy"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[2], + "cauchy_zz"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[3], + "cauchy_xy"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[4], + "cauchy_xz"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_total_vertex[5], + "cauchy_yz"); + + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[0], + "cauchy_E_xx"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[1], + "cauchy_E_yy"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[2], + "cauchy_E_zz"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[3], + "cauchy_E_xy"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[4], + "cauchy_E_xz"); + data_out.add_data_vector(vertex_handler_ref, + sum_cauchy_stresses_E_vertex[5], + "cauchy_E_yz"); + + data_out.add_data_vector(vertex_handler_ref, + sum_stretches_vertex[0], + "stretch_xx"); + data_out.add_data_vector(vertex_handler_ref, + sum_stretches_vertex[1], + "stretch_yy"); + data_out.add_data_vector(vertex_handler_ref, + sum_stretches_vertex[2], + "stretch_zz"); + + std::vector + comp_type_vec(dim, + DataComponentInterpretation::component_is_part_of_vector); + std::vector solution_name_vec(dim,"seepage_velocity"); + + data_out.add_data_vector(vertex_vec_handler_ref, + sum_seepage_velocity_vertex_vec, + solution_name_vec, + comp_type_vec); + + data_out.add_data_vector(vertex_handler_ref, + sum_porous_dissipation_vertex, + "dissipation_porous"); + data_out.add_data_vector(vertex_handler_ref, + sum_viscous_dissipation_vertex, + "dissipation_viscous"); + data_out.add_data_vector(vertex_handler_ref, + sum_solid_vol_fraction_vertex, + "solid_vol_fraction"); + } + //--------------------------------------------------------------------- + + data_out.build_patches(degree_displ); + + struct Filename + { + static std::string get_filename_vtu(unsigned int process, + unsigned int timestep, + const unsigned int n_digits = 5) + { + std::ostringstream filename_vtu; + filename_vtu + << "solution." + << Utilities::int_to_string(process, n_digits) + << "." + << Utilities::int_to_string(timestep, n_digits) + << ".vtu"; + return filename_vtu.str(); + } + + static std::string get_filename_pvtu(unsigned int timestep, + const unsigned int n_digits = 5) + { + std::ostringstream filename_vtu; + filename_vtu + << "solution." + << Utilities::int_to_string(timestep, n_digits) + << ".pvtu"; + return filename_vtu.str(); + } + + static std::string get_filename_pvd (void) + { + std::ostringstream filename_vtu; + filename_vtu + << "solution.pvd"; + return filename_vtu.str(); + } + }; + + const std::string filename_vtu = Filename::get_filename_vtu(this_mpi_process, + timestep); + std::ofstream output(filename_vtu.c_str()); + data_out.write_vtu(output); + + // We have a collection of files written in parallel + // This next set of steps should only be performed by master process + if (this_mpi_process == 0) + { + // List of all files written out at this timestep by all processors + std::vector parallel_filenames_vtu; + for (unsigned int p=0; p> time_and_name_history; + time_and_name_history.push_back(std::make_pair(current_time, + filename_pvtu)); + const std::string filename_pvd(Filename::get_filename_pvd()); + std::ofstream pvd_output(filename_pvd.c_str()); + DataOutBase::write_pvd_record(pvd_output, time_and_name_history); + } + } + + + //Print results to plotting file + template + void Solid::output_results_to_plot( + const unsigned int timestep, + const double current_time, + TrilinosWrappers::MPI::BlockVector solution_IN, + std::vector > &tracked_vertices_IN, + std::ofstream &plotpointfile) const + { + TrilinosWrappers::MPI::BlockVector solution_total(locally_owned_partitioning, + locally_relevant_partitioning, + mpi_communicator, + false); + + (void) timestep; + solution_total = solution_IN; + + //Variables needed to print the solution file for plotting + Point reaction_force; + Point reaction_force_pressure; + Point reaction_force_extra; + double total_fluid_flow = 0.0; + double total_porous_dissipation = 0.0; + double total_viscous_dissipation = 0.0; + double total_solid_vol = 0.0; + double total_vol_current = 0.0; + double total_vol_reference = 0.0; + std::vector> solution_vertices(tracked_vertices_IN.size()); + + //Auxiliar variables needed for mpi processing + Tensor<1,dim> sum_reaction_mpi; + Tensor<1,dim> sum_reaction_pressure_mpi; + Tensor<1,dim> sum_reaction_extra_mpi; + sum_reaction_mpi = 0.0; + sum_reaction_pressure_mpi = 0.0; + sum_reaction_extra_mpi = 0.0; + double sum_total_flow_mpi = 0.0; + double sum_porous_dissipation_mpi = 0.0; + double sum_viscous_dissipation_mpi = 0.0; + double sum_solid_vol_mpi = 0.0; + double sum_vol_current_mpi = 0.0; + double sum_vol_reference_mpi = 0.0; + + //Declare an instance of the material class object + if (parameters.mat_type == "Neo-Hooke") + NeoHooke material(parameters,time); + else if (parameters.mat_type == "Ogden") + Ogden material(parameters, time); + else if (parameters.mat_type == "visco-Ogden") + visco_Ogden material(parameters,time); + else + Assert (false, ExcMessage("Material type not implemented")); + + //Define a local instance of FEValues to compute updated values required + //to calculate stresses + const UpdateFlags uf_cell(update_values | update_gradients | + update_JxW_values); + FEValues fe_values_ref (fe, qf_cell, uf_cell); + + //Iterate through elements (cells) and Gauss Points + FilteredIterator::active_cell_iterator> + cell(IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.begin_active()), + endc(IteratorFilters::SubdomainEqualTo(this_mpi_process), + dof_handler_ref.end()); + //start cell loop + for (; cell!=endc; ++cell) + { + + if (cell->subdomain_id() != this_mpi_process) continue; + + fe_values_ref.reinit(cell); + + std::vector> solution_grads_u(n_q_points); + fe_values_ref[u_fe].get_function_gradients(solution_total, + solution_grads_u); + + std::vector solution_values_p_fluid_total(n_q_points); + fe_values_ref[p_fluid_fe].get_function_values(solution_total, + solution_values_p_fluid_total); + + std::vector> solution_grads_p_fluid_AD(n_q_points); + fe_values_ref[p_fluid_fe].get_function_gradients(solution_total, + solution_grads_p_fluid_AD); + + //start gauss point loop + for (unsigned int q_point=0; q_point + F_AD = Physics::Elasticity::Kinematics::F(solution_grads_u[q_point]); + ADNumberType det_F_AD = determinant(F_AD); + const double det_F = Tensor<0,dim,double>(det_F_AD); + + const std::vector>> + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + double JxW = fe_values_ref.JxW(q_point); + + //Volumes + sum_vol_current_mpi += det_F * JxW; + sum_vol_reference_mpi += JxW; + sum_solid_vol_mpi += parameters.solid_vol_frac * JxW * det_F; + + //Seepage velocity + const Tensor<2,dim,ADNumberType> F_inv = invert(F_AD); + const Tensor<1,dim,ADNumberType> + grad_p_fluid_AD = solution_grads_p_fluid_AD[q_point]*F_inv; + const Tensor<1,dim,ADNumberType> seepage_vel_AD + = lqph[q_point]->get_seepage_velocity_current(F_AD, grad_p_fluid_AD); + + //Dissipations + const double porous_dissipation = + lqph[q_point]->get_porous_dissipation(F_AD, grad_p_fluid_AD); + sum_porous_dissipation_mpi += porous_dissipation * det_F * JxW; + + const double viscous_dissipation = lqph[q_point]->get_viscous_dissipation(); + sum_viscous_dissipation_mpi += viscous_dissipation * det_F * JxW; + + //--------------------------------------------------------------- + } //end gauss point loop + + // Compute reaction force on load boundary & total fluid flow across + // drained boundary. + // Define a local instance of FEFaceValues to compute values required + // to calculate reaction force + const UpdateFlags uf_face( update_values | update_gradients | + update_normal_vectors | update_JxW_values ); + FEFaceValues fe_face_values_ref(fe, qf_face, uf_face); + + //start face loop + for (unsigned int face=0; face::faces_per_cell; ++face) + { + //Reaction force + if (cell->face(face)->at_boundary() == true && + cell->face(face)->boundary_id() == get_reaction_boundary_id_for_output() ) + { + fe_face_values_ref.reinit(cell, face); + + //Get displacement gradients for current face + std::vector > solution_grads_u_f(n_q_points_f); + fe_face_values_ref[u_fe].get_function_gradients + (solution_total, + solution_grads_u_f); + + //Get pressure for current element + std::vector< double > solution_values_p_fluid_total_f(n_q_points_f); + fe_face_values_ref[p_fluid_fe].get_function_values + (solution_total, + solution_values_p_fluid_total_f); + + //start gauss points on faces loop + for (unsigned int f_q_point=0; f_q_point &N = fe_face_values_ref.normal_vector(f_q_point); + const double JxW_f = fe_face_values_ref.JxW(f_q_point); + + //Compute deformation gradient from displacements gradient + //(present configuration) + const Tensor<2,dim,ADNumberType> F_AD = + Physics::Elasticity::Kinematics::F(solution_grads_u_f[f_q_point]); + + const std::vector>> + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + const double p_fluid = solution_values_p_fluid_total[f_q_point]; + + //Cauchy stress + static const SymmetricTensor<2,dim,double> + I (Physics::Elasticity::StandardTensors::I); + SymmetricTensor<2,dim> sigma_E; + const SymmetricTensor<2,dim,ADNumberType> sigma_E_AD = + lqph[f_q_point]->get_Cauchy_E(F_AD); + + for (unsigned int i=0; i(sigma_E_AD[i][j]); + + SymmetricTensor<2,dim> sigma_fluid_vol(I); + sigma_fluid_vol *= -1.0*p_fluid; + const SymmetricTensor<2,dim> sigma = sigma_E+sigma_fluid_vol; + sum_reaction_mpi += sigma * N * JxW_f; + sum_reaction_pressure_mpi += sigma_fluid_vol * N * JxW_f; + sum_reaction_extra_mpi += sigma_E * N * JxW_f; + }//end gauss points on faces loop + } + + //Fluid flow + if (cell->face(face)->at_boundary() == true && + (cell->face(face)->boundary_id() == + get_drained_boundary_id_for_output().first || + cell->face(face)->boundary_id() == + get_drained_boundary_id_for_output().second ) ) + { + fe_face_values_ref.reinit(cell, face); + + //Get displacement gradients for current face + std::vector> solution_grads_u_f(n_q_points_f); + fe_face_values_ref[u_fe].get_function_gradients + (solution_total, + solution_grads_u_f); + + //Get pressure gradients for current face + std::vector> solution_grads_p_f(n_q_points_f); + fe_face_values_ref[p_fluid_fe].get_function_gradients + (solution_total, + solution_grads_p_f); + + //start gauss points on faces loop + for (unsigned int f_q_point=0; f_q_point &N = + fe_face_values_ref.normal_vector(f_q_point); + const double JxW_f = fe_face_values_ref.JxW(f_q_point); + + //Deformation gradient and inverse from displacements gradient + //(present configuration) + const Tensor<2,dim,ADNumberType> F_AD + = Physics::Elasticity::Kinematics::F(solution_grads_u_f[f_q_point]); + + const Tensor<2,dim,ADNumberType> F_inv_AD = invert(F_AD); + ADNumberType det_F_AD = determinant(F_AD); + + const std::vector>> + lqph = quadrature_point_history.get_data(cell); + Assert(lqph.size() == n_q_points, ExcInternalError()); + + //Seepage velocity + Tensor<1,dim> seepage; + double det_F = Tensor<0,dim,double>(det_F_AD); + const Tensor<1,dim,ADNumberType> grad_p + = solution_grads_p_f[f_q_point]*F_inv_AD; + const Tensor<1,dim,ADNumberType> seepage_AD + = lqph[f_q_point]->get_seepage_velocity_current(F_AD, grad_p); + + for (unsigned int i=0; i(seepage_AD[i]); + + sum_total_flow_mpi += (seepage/det_F) * N * JxW_f; + }//end gauss points on faces loop + } + }//end face loop + }//end cell loop + + //Sum the results from different MPI process and then add to the reaction_force vector + //In theory, the solution on each surface (each cell) only exists in one MPI process + //so, we add all MPI process, one will have the solution and the others will be zero + for (unsigned int d=0; d solution_u_vector(solution_vector_u_MPI); + Vector solution_p_vector(solution_vector_p_MPI); + + if (this_mpi_process == 0) + { + //Append the pressure solution vector to the displacement solution vector, + //creating a single solution vector equivalent to the original BlockVector + //so FEFieldFunction will work with the dof_handler_ref. + Vector solution_vector(solution_p_vector.size() + +solution_u_vector.size()); + + for (unsigned int d=0; d<(solution_u_vector.size()); ++d) + solution_vector[d] = solution_u_vector[d]; + + for (unsigned int d=0; d<(solution_p_vector.size()); ++d) + solution_vector[solution_u_vector.size()+d] = solution_p_vector[d]; + + Functions::FEFieldFunction,Vector> + find_solution(dof_handler_ref, solution_vector); + + for (unsigned int p=0; p update(dim+1); + Point pt_ref; + + pt_ref[0]= tracked_vertices_IN[p][0]; + pt_ref[1]= tracked_vertices_IN[p][1]; + pt_ref[2]= tracked_vertices_IN[p][2]; + + find_solution.vector_value(pt_ref, update); + + for (unsigned int d=0; d<(dim+1); ++d) + { + //For values close to zero, set to 0.0 + if (abs(update[d])<1.5*parameters.tol_u) + update[d] = 0.0; + solution_vertices[p][d] = update[d]; + } + } + // Write the results to the plotting file. + // Add two blank lines between cycles in the cyclic loading examples so GNUPLOT can detect each cycle as a different block + if (( (parameters.geom_type == "Budday_cube_tension_compression_fully_fixed")|| + (parameters.geom_type == "Budday_cube_tension_compression")|| + (parameters.geom_type == "Budday_cube_shear_fully_fixed") ) && + ( (abs(current_time - parameters.end_time/3.) <0.9*parameters.delta_t)|| + (abs(current_time - 2.*parameters.end_time/3.)<0.9*parameters.delta_t) ) && + parameters.num_cycle_sets == 1 ) + { + plotpointfile << std::endl<< std::endl; + } + if (( (parameters.geom_type == "Budday_cube_tension_compression_fully_fixed")|| + (parameters.geom_type == "Budday_cube_tension_compression")|| + (parameters.geom_type == "Budday_cube_shear_fully_fixed") ) && + ( (abs(current_time - parameters.end_time/9.) <0.9*parameters.delta_t)|| + (abs(current_time - 2.*parameters.end_time/9.)<0.9*parameters.delta_t)|| + (abs(current_time - 3.*parameters.end_time/9.)<0.9*parameters.delta_t)|| + (abs(current_time - 5.*parameters.end_time/9.)<0.9*parameters.delta_t)|| + (abs(current_time - 7.*parameters.end_time/9.)<0.9*parameters.delta_t) ) && + parameters.num_cycle_sets == 2 ) + { + plotpointfile << std::endl<< std::endl; + } + + plotpointfile << std::setprecision(6) << std::scientific; + plotpointfile << std::setw(16) << current_time << "," + << std::setw(15) << total_vol_reference << "," + << std::setw(15) << total_vol_current << "," + << std::setw(15) << total_solid_vol << ","; + + if (current_time == 0.0) + { + for (unsigned int p=0; p + void Solid::print_console_file_header(std::ofstream &outputfile) const + { + outputfile << "/*-----------------------------------------------------------------------------------------"; + outputfile << "\n\n Poro-viscoelastic formulation to solve nonlinear solid mechanics problems using deal.ii"; + outputfile << "\n\n Problem setup by E Comellas and J-P Pelteret, University of Erlangen-Nuremberg, 2018"; + outputfile << "\n\n/*-----------------------------------------------------------------------------------------"; + outputfile << "\n\nCONSOLE OUTPUT: \n\n"; + } + + //Header for plotting output file + template + void Solid::print_plot_file_header(std::vector > &tracked_vertices, + std::ofstream &plotpointfile) const + { + plotpointfile << "#\n# *** Solution history for tracked vertices -- DOF: 0 = Ux, 1 = Uy, 2 = Uz, 3 = P ***" + << std::endl; + + for (unsigned int p=0; p + void Solid::print_console_file_footer(std::ofstream &outputfile) const + { + //Copy "parameters" file at end of output file. + std::ifstream infile("parameters.prm"); + std::string content = ""; + int i; + + for(i=0 ; infile.eof()!=true ; i++) + { + char aux = infile.get(); + content += aux; + if(aux=='\n') content += '#'; + } + + i--; + content.erase(content.end()-1); + infile.close(); + + outputfile << "\n\n\n\n PARAMETERS FILE USED IN THIS COMPUTATION: \n#" + << std::endl + << content; + } + + //Footer for plotting output file + template + void Solid::print_plot_file_footer(std::ofstream &plotpointfile) const + { + //Copy "parameters" file at end of output file. + std::ifstream infile("parameters.prm"); + std::string content = ""; + int i; + + for(i=0 ; infile.eof()!=true ; i++) + { + char aux = infile.get(); + content += aux; + if(aux=='\n') content += '#'; + } + + i--; + content.erase(content.end()-1); + infile.close(); + + plotpointfile << "#"<< std::endl + << "#"<< std::endl + << "# PARAMETERS FILE USED IN THIS COMPUTATION:" << std::endl + << "#"<< std::endl + << content; + } + + + // @sect3{Verification examples from Ehlers and Eipper 1999} + // We group the definition of the geometry, boundary and loading conditions specific to + // the verification examples from Ehlers and Eipper 1999 into specific classes. + + //@sect4{Base class: Tube geometry and boundary conditions} + template + class VerificationEhlers1999TubeBase + : public Solid + { + public: + VerificationEhlers1999TubeBase (const Parameters::AllParameters ¶meters) + : Solid (parameters) + {} + + virtual ~VerificationEhlers1999TubeBase () {} + + private: + virtual void make_grid() + { + GridGenerator::cylinder( this->triangulation, + 0.1, + 0.5); + + const double rot_angle = 3.0*numbers::PI/2.0; + GridTools::rotate( rot_angle, 1, this->triangulation); + + this->triangulation.reset_manifold(0); + static const CylindricalManifold manifold_description_3d(2); + this->triangulation.set_manifold (0, manifold_description_3d); + GridTools::scale(this->parameters.scale, this->triangulation); + this->triangulation.refine_global(std::max (1U, this->parameters.global_refinement)); + this->triangulation.reset_manifold(0); + } + + virtual void define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.0*this->parameters.scale; + tracked_vertices[0][1] = 0.0*this->parameters.scale; + tracked_vertices[0][2] = 0.5*this->parameters.scale; + + tracked_vertices[1][0] = 0.0*this->parameters.scale; + tracked_vertices[1][1] = 0.0*this->parameters.scale; + tracked_vertices[1][2] = -0.5*this->parameters.scale; + } + + virtual void make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 2, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 2, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 0, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement)| + this->fe.component_mask(this->y_displacement) ) ); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 1, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + } + + virtual double + get_prescribed_fluid_flow (const types::boundary_id &boundary_id, + const Point &pt) const + { + (void)pt; + (void)boundary_id; + return 0.0; + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 2; + } + + virtual std::pair + get_drained_boundary_id_for_output() const + { + return std::make_pair(2,2); + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr(dim, 0.0); + (void)boundary_id; + (void)direction; + throw std::runtime_error ("Displacement loading not implemented for Ehlers verification examples."); + + return displ_incr; + } + }; + + //@sect4{Derived class: Step load example} + template + class VerificationEhlers1999StepLoad + : public VerificationEhlers1999TubeBase + { + public: + VerificationEhlers1999StepLoad (const Parameters::AllParameters ¶meters) + : VerificationEhlers1999TubeBase (parameters) + {} + + virtual ~VerificationEhlers1999StepLoad () {} + + private: + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 2) + { + return this->parameters.load * N; + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + }; + + //@sect4{Derived class: Load increasing example} + template + class VerificationEhlers1999IncreaseLoad + : public VerificationEhlers1999TubeBase + { + public: + VerificationEhlers1999IncreaseLoad (const Parameters::AllParameters ¶meters) + : VerificationEhlers1999TubeBase (parameters) + {} + + virtual ~VerificationEhlers1999IncreaseLoad () {} + + private: + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 2) + { + const double initial_load = this->parameters.load; + const double final_load = 20.0*initial_load; + const double initial_time = this->time.get_delta_t(); + const double final_time = this->time.get_end(); + const double current_time = this->time.get_current(); + const double load = initial_load + (final_load-initial_load)*(current_time-initial_time)/(final_time-initial_time); + return load * N; + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + }; + + //@sect4{Class: Consolidation cube} + template + class VerificationEhlers1999CubeConsolidation + : public Solid + { + public: + VerificationEhlers1999CubeConsolidation (const Parameters::AllParameters ¶meters) + : Solid (parameters) + {} + + virtual ~VerificationEhlers1999CubeConsolidation () {} + + private: + virtual void + make_grid() + { + GridGenerator::hyper_rectangle(this->triangulation, + Point(0.0, 0.0, 0.0), + Point(1.0, 1.0, 1.0), + true); + + GridTools::scale(this->parameters.scale, this->triangulation); + this->triangulation.refine_global(std::max (1U, this->parameters.global_refinement)); + + typename Triangulation::active_cell_iterator cell = + this->triangulation.begin_active(), endc = this->triangulation.end(); + for (; cell != endc; ++cell) + { + for (unsigned int face = 0; face < GeometryInfo::faces_per_cell; ++face) + if (cell->face(face)->at_boundary() == true && + cell->face(face)->center()[2] == 1.0 * this->parameters.scale) + { + if (cell->face(face)->center()[0] < 0.5 * this->parameters.scale && + cell->face(face)->center()[1] < 0.5 * this->parameters.scale) + cell->face(face)->set_boundary_id(100); + else + cell->face(face)->set_boundary_id(101); + } + } + } + + virtual void + define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.0*this->parameters.scale; + tracked_vertices[0][1] = 0.0*this->parameters.scale; + tracked_vertices[0][2] = 1.0*this->parameters.scale; + + tracked_vertices[1][0] = 0.0*this->parameters.scale; + tracked_vertices[1][1] = 0.0*this->parameters.scale; + tracked_vertices[1][2] = 0.0*this->parameters.scale; + } + + virtual void + make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 101, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 101, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 0, + ZeroFunction(this->n_components), + constraints, + this->fe.component_mask(this->x_displacement)); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 1, + ZeroFunction(this->n_components), + constraints, + this->fe.component_mask(this->x_displacement)); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 2, + ZeroFunction(this->n_components), + constraints, + this->fe.component_mask(this->y_displacement)); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 3, + ZeroFunction(this->n_components), + constraints, + this->fe.component_mask(this->y_displacement)); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 4, + ZeroFunction(this->n_components), + constraints, + ( this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + } + + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 100) + { + return this->parameters.load * N; + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + + virtual double + get_prescribed_fluid_flow (const types::boundary_id &boundary_id, + const Point &pt) const + { + (void)pt; + (void)boundary_id; + return 0.0; + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 100; + } + + virtual std::pair + get_drained_boundary_id_for_output() const + { + return std::make_pair(101,101); + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr(dim, 0.0); + (void)boundary_id; + (void)direction; + throw std::runtime_error ("Displacement loading not implemented for Ehlers verification examples."); + + return displ_incr; + } + }; + + //@sect4{Franceschini experiments} + template + class Franceschini2006Consolidation + : public Solid + { + public: + Franceschini2006Consolidation (const Parameters::AllParameters ¶meters) + : Solid (parameters) + {} + + virtual ~Franceschini2006Consolidation () {} + + private: + virtual void make_grid() + { + const Point mesh_center(0.0, 0.0); + const double radius = 0.5; + //const double height = 0.27; //8.1 mm for 30 mm radius + const double height = 0.23; //6.9 mm for 30 mm radius + Triangulation triangulation_in; + GridGenerator::hyper_ball( triangulation_in, + mesh_center, + radius); + + GridGenerator::extrude_triangulation(triangulation_in, + 2, + height, + this->triangulation); + + const CylindricalManifold cylinder_3d(2); + const types::manifold_id cylinder_id = 0; + + + this->triangulation.set_manifold(cylinder_id, cylinder_3d); + + for (auto cell : this->triangulation.active_cell_iterators()) + { + for (unsigned int face = 0; face < GeometryInfo::faces_per_cell; ++face) + { + if (cell->face(face)->at_boundary() == true) + { + if (cell->face(face)->center()[2] == 0.0) + cell->face(face)->set_boundary_id(1); + + else if (cell->face(face)->center()[2] == height) + cell->face(face)->set_boundary_id(2); + + else + { + cell->face(face)->set_boundary_id(0); + cell->face(face)->set_all_manifold_ids(cylinder_id); + } + } + } + } + + GridTools::scale(this->parameters.scale, this->triangulation); + this->triangulation.refine_global(std::max (1U, this->parameters.global_refinement)); + } + + virtual void define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.0*this->parameters.scale; + tracked_vertices[0][1] = 0.0*this->parameters.scale; + // tracked_vertices[0][2] = 0.27*this->parameters.scale; + tracked_vertices[0][2] = 0.23*this->parameters.scale; + + tracked_vertices[1][0] = 0.0*this->parameters.scale; + tracked_vertices[1][1] = 0.0*this->parameters.scale; + tracked_vertices[1][2] = 0.0*this->parameters.scale; + } + + virtual void make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 1, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 2, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 1, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 2, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 0, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement)| + this->fe.component_mask(this->y_displacement) ) ); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 1, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 2, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) )); + } + + virtual double + get_prescribed_fluid_flow (const types::boundary_id &boundary_id, + const Point &pt) const + { + (void)pt; + (void)boundary_id; + return 0.0; + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 2; + } + + virtual std::pair + get_drained_boundary_id_for_output() const + { + return std::make_pair(1,2); + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr(dim, 0.0); + (void)boundary_id; + (void)direction; + throw std::runtime_error ("Displacement loading not implemented for Franceschini examples."); + + return displ_incr; + } + + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 2) + { + return (this->parameters.load * N); + /* + const double final_load = this->parameters.load; + const double final_load_time = 10 * this->time.get_delta_t(); + const double current_time = this->time.get_current(); + + + const double c = final_load_time / 2.0; + const double r = 200.0 * 0.03 / c; + + const double load = final_load * std::exp(r * current_time) + / ( std::exp(c * current_time) + std::exp(r * current_time)); + return load * N; + */ + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + }; + + // @sect3{Examples to reproduce experiments by Budday et al. 2017} + // We group the definition of the geometry, boundary and loading conditions specific to + // the examples to reproduce experiments by Budday et al. 2017 into specific classes. + + //@sect4{Base class: Cube geometry and loading pattern} + template + class BrainBudday2017BaseCube + : public Solid + { + public: + BrainBudday2017BaseCube (const Parameters::AllParameters ¶meters) + : Solid (parameters) + {} + + virtual ~BrainBudday2017BaseCube () {} + + private: + virtual void + make_grid() + { + GridGenerator::hyper_cube(this->triangulation, + 0.0, + 1.0, + true); + + typename Triangulation::active_cell_iterator cell = + this->triangulation.begin_active(), endc = this->triangulation.end(); + for (; cell != endc; ++cell) + { + for (unsigned int face = 0; face < GeometryInfo::faces_per_cell; ++face) + if (cell->face(face)->at_boundary() == true && + ( cell->face(face)->boundary_id() == 0 || + cell->face(face)->boundary_id() == 1 || + cell->face(face)->boundary_id() == 2 || + cell->face(face)->boundary_id() == 3 ) ) + + cell->face(face)->set_boundary_id(100); + + } + + GridTools::scale(this->parameters.scale, this->triangulation); + this->triangulation.refine_global(std::max (1U, this->parameters.global_refinement)); + } + + virtual double + get_prescribed_fluid_flow (const types::boundary_id &boundary_id, + const Point &pt) const + { + (void)pt; + (void)boundary_id; + return 0.0; + } + + virtual std::pair + get_drained_boundary_id_for_output() const + { + return std::make_pair(100,100); + } + }; + + //@sect4{Derived class: Uniaxial boundary conditions} + template + class BrainBudday2017CubeTensionCompression + : public BrainBudday2017BaseCube + { + public: + BrainBudday2017CubeTensionCompression (const Parameters::AllParameters ¶meters) + : BrainBudday2017BaseCube (parameters) + {} + + virtual ~BrainBudday2017CubeTensionCompression () {} + + private: + virtual void + define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.5*this->parameters.scale; + tracked_vertices[0][1] = 0.5*this->parameters.scale; + tracked_vertices[0][2] = 1.0*this->parameters.scale; + + tracked_vertices[1][0] = 0.5*this->parameters.scale; + tracked_vertices[1][1] = 0.5*this->parameters.scale; + tracked_vertices[1][2] = 0.5*this->parameters.scale; + } + + virtual void + make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 100, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 100, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 4, + ZeroFunction(this->n_components), + constraints, + this->fe.component_mask(this->z_displacement) ); + + Point fix_node(0.5*this->parameters.scale, 0.5*this->parameters.scale, 0.0); + typename DoFHandler::active_cell_iterator + cell = this->dof_handler_ref.begin_active(), endc = this->dof_handler_ref.end(); + for (; cell != endc; ++cell) + for (unsigned int node = 0; node < GeometryInfo::vertices_per_cell; ++node) + { + if ( (abs(cell->vertex(node)[2]-fix_node[2]) < (1e-6 * this->parameters.scale)) + && (abs(cell->vertex(node)[0]-fix_node[0]) < (1e-6 * this->parameters.scale))) + constraints.add_line(cell->vertex_dof_index(node, 0)); + + if ( (abs(cell->vertex(node)[2]-fix_node[2]) < (1e-6 * this->parameters.scale)) + && (abs(cell->vertex(node)[1]-fix_node[1]) < (1e-6 * this->parameters.scale))) + constraints.add_line(cell->vertex_dof_index(node, 1)); + } + + if (this->parameters.load_type == "displacement") + { + const std::vector value = get_dirichlet_load(5,2); + FEValuesExtractors::Scalar direction; + direction = this->z_displacement; + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 5, + ConstantFunction(value[2],this->n_components), + constraints, + this->fe.component_mask(direction)); + } + } + + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 5) + { + const double final_load = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double num_cycles = 3.0; + + return final_load/2.0 * (1.0 - std::sin(numbers::PI * (2.0*num_cycles*current_time/final_time + 0.5))) * N; + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 5; + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr(dim,0.0); + + if ( (boundary_id == 5) && (direction == 2) ) + { + const double final_displ = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double delta_time = this->time.get_delta_t(); + const double num_cycles = 3.0; + double current_displ = 0.0; + double previous_displ = 0.0; + + if (this->parameters.num_cycle_sets == 1) + { + current_displ = final_displ/2.0 * (1.0 + - std::sin(numbers::PI * (2.0*num_cycles*current_time/final_time + 0.5))); + previous_displ = final_displ/2.0 * (1.0 + - std::sin(numbers::PI * (2.0*num_cycles*(current_time-delta_time)/final_time + 0.5))); + } + else + { + if ( current_time <= (final_time*1.0/3.0) ) + { + current_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*current_time/(final_time*1.0/3.0) + 0.5))); + previous_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*(current_time-delta_time)/(final_time*1.0/3.0) + 0.5))); + } + else + { + current_displ = final_displ * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*current_time / (final_time*2.0/3.0) + - (num_cycles - 0.5) ))); + previous_displ = final_displ * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*(current_time-delta_time) / (final_time*2.0/3.0) + - (num_cycles - 0.5)))); + } + } + displ_incr[2] = current_displ - previous_displ; + } + return displ_incr; + } + }; + + //@sect4{Derived class: No lateral displacement in loading surfaces} + template + class BrainBudday2017CubeTensionCompressionFullyFixed + : public BrainBudday2017BaseCube + { + public: + BrainBudday2017CubeTensionCompressionFullyFixed (const Parameters::AllParameters ¶meters) + : BrainBudday2017BaseCube (parameters) + {} + + virtual ~BrainBudday2017CubeTensionCompressionFullyFixed () {} + + private: + virtual void + define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.5*this->parameters.scale; + tracked_vertices[0][1] = 0.5*this->parameters.scale; + tracked_vertices[0][2] = 1.0*this->parameters.scale; + + tracked_vertices[1][0] = 0.5*this->parameters.scale; + tracked_vertices[1][1] = 0.5*this->parameters.scale; + tracked_vertices[1][2] = 0.5*this->parameters.scale; + } + + virtual void + make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 100, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 100, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 4, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + + + if (this->parameters.load_type == "displacement") + { + const std::vector value = get_dirichlet_load(5,2); + FEValuesExtractors::Scalar direction; + direction = this->z_displacement; + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 5, + ConstantFunction(value[2],this->n_components), + constraints, + this->fe.component_mask(direction) ); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 5, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) )); + } + } + + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 5) + { + const double final_load = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double num_cycles = 3.0; + + return final_load/2.0 * (1.0 - std::sin(numbers::PI * (2.0*num_cycles*current_time/final_time + 0.5))) * N; + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 5; + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr(dim,0.0); + + if ( (boundary_id == 5) && (direction == 2) ) + { + const double final_displ = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double delta_time = this->time.get_delta_t(); + const double num_cycles = 3.0; + double current_displ = 0.0; + double previous_displ = 0.0; + + if (this->parameters.num_cycle_sets == 1) + { + current_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * (2.0*num_cycles*current_time/final_time + 0.5))); + previous_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * (2.0*num_cycles*(current_time-delta_time)/final_time + 0.5))); + } + else + { + if ( current_time <= (final_time*1.0/3.0) ) + { + current_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*current_time/(final_time*1.0/3.0) + 0.5))); + previous_displ = final_displ/2.0 * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*(current_time-delta_time)/(final_time*1.0/3.0) + 0.5))); + } + else + { + current_displ = final_displ * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*current_time / (final_time*2.0/3.0) + - (num_cycles - 0.5) ))); + previous_displ = final_displ * (1.0 - std::sin(numbers::PI * + (2.0*num_cycles*(current_time-delta_time) / (final_time*2.0/3.0) + - (num_cycles - 0.5)))); + } + } + displ_incr[2] = current_displ - previous_displ; + } + return displ_incr; + } + }; + + //@sect4{Derived class: No lateral or vertical displacement in loading surface} + template + class BrainBudday2017CubeShearFullyFixed + : public BrainBudday2017BaseCube + { + public: + BrainBudday2017CubeShearFullyFixed (const Parameters::AllParameters ¶meters) + : BrainBudday2017BaseCube (parameters) + {} + + virtual ~BrainBudday2017CubeShearFullyFixed () {} + + private: + virtual void + define_tracked_vertices(std::vector > &tracked_vertices) + { + tracked_vertices[0][0] = 0.75*this->parameters.scale; + tracked_vertices[0][1] = 0.5*this->parameters.scale; + tracked_vertices[0][2] = 0.0*this->parameters.scale; + + tracked_vertices[1][0] = 0.25*this->parameters.scale; + tracked_vertices[1][1] = 0.5*this->parameters.scale; + tracked_vertices[1][2] = 0.0*this->parameters.scale; + } + + virtual void + make_dirichlet_constraints(AffineConstraints &constraints) + { + if (this->time.get_timestep() < 2) + { + VectorTools::interpolate_boundary_values(this->dof_handler_ref, + 100, + ConstantFunction(this->parameters.drained_pressure,this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + else + { + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 100, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->pressure))); + } + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 5, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->x_displacement) | + this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + + + if (this->parameters.load_type == "displacement") + { + const std::vector value = get_dirichlet_load(4,0); + FEValuesExtractors::Scalar direction; + direction = this->x_displacement; + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 4, + ConstantFunction(value[0],this->n_components), + constraints, + this->fe.component_mask(direction)); + + VectorTools::interpolate_boundary_values( this->dof_handler_ref, + 4, + ZeroFunction(this->n_components), + constraints, + (this->fe.component_mask(this->y_displacement) | + this->fe.component_mask(this->z_displacement) )); + } + } + + virtual Tensor<1,dim> + get_neumann_traction (const types::boundary_id &boundary_id, + const Point &pt, + const Tensor<1,dim> &N) const + { + if (this->parameters.load_type == "pressure") + { + if (boundary_id == 4) + { + const double final_load = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double num_cycles = 3.0; + const Point< 3, double> axis (0.0,1.0,0.0); + const double angle = numbers::PI; + static const Tensor< 2, dim, double> R(Physics::Transformations::Rotations::rotation_matrix_3d(axis,angle)); + + return (final_load * (std::sin(2.0*(numbers::PI)*num_cycles*current_time/final_time)) * (R * N)); + } + } + + (void)pt; + + return Tensor<1,dim>(); + } + + virtual types::boundary_id + get_reaction_boundary_id_for_output() const + { + return 4; + } + + virtual std::vector + get_dirichlet_load(const types::boundary_id &boundary_id, + const int &direction) const + { + std::vector displ_incr (dim, 0.0); + + if ( (boundary_id == 4) && (direction == 0) ) + { + const double final_displ = this->parameters.load; + const double current_time = this->time.get_current(); + const double final_time = this->time.get_end(); + const double delta_time = this->time.get_delta_t(); + const double num_cycles = 3.0; + double current_displ = 0.0; + double previous_displ = 0.0; + + if (this->parameters.num_cycle_sets == 1) + { + current_displ = final_displ * (std::sin(2.0*(numbers::PI)*num_cycles*current_time/final_time)); + previous_displ = final_displ * (std::sin(2.0*(numbers::PI)*num_cycles*(current_time-delta_time)/final_time)); + } + else + { + AssertThrow(false, ExcMessage("Problem type not defined. Budday shear experiments implemented only for one set of cycles.")); + } + displ_incr[0] = current_displ - previous_displ; + } + return displ_incr; + } + }; + +} + +// @sect3{Main function} +// Lastly we provide the main driver function which is similar to the other tutorials. +int main (int argc, char *argv[]) +{ + using namespace dealii; + using namespace NonLinearPoroViscoElasticity; + + const unsigned int n_tbb_processes = 1; + Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, n_tbb_processes); + + try + { + Parameters::AllParameters parameters ("parameters.prm"); + if (parameters.geom_type == "Ehlers_tube_step_load") + { + VerificationEhlers1999StepLoad<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Ehlers_tube_increase_load") + { + VerificationEhlers1999IncreaseLoad<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Ehlers_cube_consolidation") + { + VerificationEhlers1999CubeConsolidation<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Franceschini_consolidation") + { + Franceschini2006Consolidation<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Budday_cube_tension_compression") + { + BrainBudday2017CubeTensionCompression<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Budday_cube_tension_compression_fully_fixed") + { + BrainBudday2017CubeTensionCompressionFullyFixed<3> solid_3d(parameters); + solid_3d.run(); + } + else if (parameters.geom_type == "Budday_cube_shear_fully_fixed") + { + BrainBudday2017CubeShearFullyFixed<3> solid_3d(parameters); + solid_3d.run(); + } + else + { + AssertThrow(false, ExcMessage("Problem type not defined. Current setting: " + parameters.geom_type)); + } + + } + catch (std::exception &exc) + { + if (Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Exception on processing: " << std::endl << exc.what() + << std::endl << "Aborting!" << std::endl + << "----------------------------------------------------" + << std::endl; + + return 1; + } + } + catch (...) + { + if (Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Unknown exception!" << std::endl << "Aborting!" + << std::endl + << "----------------------------------------------------" + << std::endl; + return 1; + } + } + return 0; +} diff --git a/Nonlinear_PoroViscoelasticity/parameters.prm b/Nonlinear_PoroViscoelasticity/parameters.prm new file mode 100755 index 0000000..9fdce22 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/parameters.prm @@ -0,0 +1,197 @@ +# +# Listing of Parameters +# --------------------- + + +subsection Finite element system + # Displacement system polynomial order + set Polynomial degree displ = 2 + + # Pore pressure system polynomial order + set Polynomial degree pore = 1 + + # Gauss quadrature order (should be at least an order higher than the polynomial order) + set Quadrature order = 3 +end + + +subsection Geometry + # Type of geometry: Ehlers_tube_step_load | Ehlers_tube_increase_load | Ehlers_cube_consolidation + # | Franceschini_consolidation + # | Budday_cube_tension_compression | Budday_cube_tension_compression_fully_fixed + # | Budday_cube_shear_fully_fixed + set Geometry type = Budday_cube_tension_compression_fully_fixed + + # Global refinement level (higher value means finer mesh) + set Global refinement = 3 + + # Global grid scaling factor (scales geometry size) + set Grid scale = 5.0 + + # Type of loading: pressure | displacement | none + set Load type = displacement + + # Value of loading [Pa] for pressure and [mm] for displacements + set Load value = -0.5 + + # Number of times each set of 3 cycles is repeated, only for "Budday_cube_tension_compression": 1 or 2 + # (Load value is doubled in second set, load rate is kept constant. Final time indicates end of second cycle set.) + set Number of cycle sets = 1 + + # Value of the prescribed fluid flow [mm/s], Q* = w*·N should include + or - sign. + set Fluid flow value = 0 + + # Increase of pressure at drained boundary [Pa] w.r.t. atmospheric pressure + set Drained pressure = 0 +end + + +subsection Material properties + + # ------------------------ SOLID ---------------------------------- + + # Type of material: Neo-Hooke, Ogden or visco-Ogden + set material = visco-Ogden + + # First Lame parameter [Pa] (for extension function related to compactation point) + set lambda = 24502 + + # ===== Neo-Hooke only ===== + + # Shear modulus [Pa] (Second Lame parameter) -- Neo-Hooke + set shear modulus = 660.0 + + # ===== Ogden + Visco-Ogden only ===== + + # Type of eigen solver for Ogden models: QL Implicit Shifts | Jacobi + set eigen solver = QL Implicit Shifts + + # Shear modulus mu1 [Pa] + set mu1 = -83.9 + + # Shear modulus mu2 [Pa] + set mu2 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1 = -11.92 + + # Stiffening parameter alpha 2 [-] + set alpha2 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3 = 1.0 + + # ===== Visco-Ogden only ===== + + # Shear modulus mu1 [Pa] + set mu1_1 = -2100 + + # Shear modulus mu2 [Pa] + set mu2_1 = 0.0 + + # Shear modulus mu3 [Pa] + set mu3_1 = 0.0 + + # Stiffening parameter alpha 1 [-] + set alpha1_1 = -2.2 + + # Stiffening parameter alpha 2 [-] + set alpha2_1 = 1.0 + + # Stiffening parameter alpha 3 [-] + set alpha3_1 = 1.0 + + # Deformation-independent viscosity parameter [Pa·s] + set viscosity_1 = 14000 + + # ------------------------ FLUID ---------------------------------- + + # Choose between Markert formulation of deformation-dependent intrinsic permeability (Markert) + # and Ehlers formulation of deformation-dependent Darcy flow coefficient (Ehlers) + # to define the seepage velocity + set seepage definition = Markert + + # Initial porosity (solid volume fraction) + set initial solid volume fraction = 0.75 + + # Deformation-dependency control parameter for specific permeability [kappa >= 0] + set kappa = 50 + + # ===== Markert only ===== + + # Initial intrinsic permeability parameter of the solid (isotropic permeability) [mm²] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set initial intrinsic permeability = 1.0e-8 + + # Effective shear viscosity parameter of the fluid [Pa·s = 1e-6·N·s/mm³] + # To be used with Markert formulation of deformation-dependent intrinsic permeability + set fluid viscosity = 0.89e-3 + + # ===== Ehlers only ===== + + # Initial Darcy flow coefficient [mm/s] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set initial Darcy coefficient = 2.42e-7 + + # Effective weight of fluid [1e-6·N/mm³] + # To be used with Ehlers formulation of deformation-dependent Darcy flow coefficient + set fluid weight = 9.777 + + # ------------------------ GRAVITY ---------------------------------- + + # Gravity term considered (true) or neglected (false) + set gravity term = false + + # ===== gravity true only ===== + + # If gravity term is considered, define the (real or effective) density of the fluid [g/mm³] + set fluid density = 0.997e-3 + + # If gravity term is considered, define the (real or effective) density of the solid [g/mm³] + set solid density = 0.997e-3 + + # If gravity term is considered, define the direction of gravity (unit vector 0 for x, 1 for y, 2 for z) + set gravity direction = 2 + + # If gravity term is considered, define the value of gravity ("minus" indicates negative sense of direction) [mm/s²] + set gravity value = -9810 +end + +subsection Nonlinear solver + # Number of Newton-Raphson iterations allowed + set Max iterations Newton-Raphson = 15 + + # Force residual tolerance + set Tolerance force = 1.0e-8 + + # Displacement error tolerance + set Tolerance displacement = 1.0e-8 + + # Pore pressure error tolerance + set Tolerance pore pressure = 1.0e-8 + +end + + +subsection Time + # End time [s] + set End time = 90.0 + + # Time step size [s] + set Time step size = 0.1 +end + + +subsection Output parameters + # Generate Paraview output files: true | false + set Output files = true + + # Output data every given time step number for Paraview output files + set Time step number output = 1 + + # For "solution" file output data associated with integration point values averaged on: elements | nodes + set Averaged results = nodes +end diff --git a/Nonlinear_PoroViscoelasticity/readme.md b/Nonlinear_PoroViscoelasticity/readme.md new file mode 100644 index 0000000..4981df8 --- /dev/null +++ b/Nonlinear_PoroViscoelasticity/readme.md @@ -0,0 +1,89 @@ +Readme file for nonlinear-poro-viscoelasticity +============================================== + +Overview +-------- + +We implemented a nonlinear poro-viscoelastic formulation with the aim of characterising brain tissue response to cyclic loading. Our model captures both experimentally observed fluid flow and conditioning aspects of brain tissue behavior in addition to its well-established nonlinear, preconditioning, hysteretic, and tension-compression asymmetric characteristics. + +The tissue is modelled as a biphasic material consisting in an immiscible aggregate of a nonlinear viscoelastic solid skeleton saturated with pore fluid. The governing equations are linearised using automatic differentiation and solved monolithically for the unknown solid displacements and fluid pore pressure values. + +A detailed description of the formulation, it's verification, and the results obtained can be found in: +* E. Comellas, S. Budday, J.-P. Pelteret, G. A. Holzapfel and P. Steinamnn (2020), Modeling the porous and viscous responses of human brain tissue behavior, Computer Methods in Applied Mechanics and Engineering (accepted for publication). + +In this paper we show that nonlinear poroelasticity alone can reproduce consolidation experiments, yet it is insufficient to capture stress conditioning due to cyclic loading. We also discuss how the poroelastic response exhibits preconditioning and hysteresis in the fluid flow space, with porous and viscous effects being highly interrelated. + + +Quick facts on the code +----------------------- + +* Biphasic material following the Theory of Porous Media +* Nonlinear finite viscoelasticity built on Ogden hyperelasticity +* Darcy-like fluid flow +* Spatial discretisation with continuous Q2P1 Lagrangian finite elements +* Temporal discretisation with a stable implicit one-step backward differentiation method +* Newton-Raphson scheme to solve the nonlinear system of governing equations +* Forward mode automatic differentiation with the number of derivative components chosen at run-time (Sacado library within Trilinos package) to linearise the equations +* Trilinos direct solver for the (non-symmetric) linear system of equations using a monolithic scheme +* Parallelization through Threading Building Blocks and across nodes via MPI (Trilinos package) +* Based on step-44 and code gallery contributions 'Quasi-Static Finite-Strain Compressible Elasticity' and 'Quasi-Static Finite-Strain Quasi-incompressible Visco-elasticity' +* Only works in 3D + + +Running the code +---------------- +### Requirements +* Version 9.1 or greater of deal.II +* C++11, MPI, Metis and Trilinos with Sacado must be enabled + +### Compiling and running +Similar to the example programs, run +``` +cmake -DDEAL_II_DIR=/path/to/deal.II . +``` +in this directory to configure the problem. +You can switch between debug and release mode by calling either +``` +make debug +``` +or +``` +make release +``` +The problem may then be run in serial mode with +``` +make run +``` +and in parallel (in this case, on `6` processors) with +``` +mpirun -np 6 ./nonlinear-poro-viscoelasticity +``` + +Alternatively, to keep it a bit more tidy, create a folder, e.g. run and copy the input file in there. Then type: +``` +mpirun -np 6 -wdir run ../nonlinear-poro-viscoelasticity +``` +All the input files used to produce the results shown in the paper are provided in in the input-files folder. Simply replace the parameters.prm file in the main directory. For the verification examples, run the python script 'run-multi-calc.py' instead: +``` +python run-multi-calc.py +``` +The 'run-multi-calc.py' and 'runPoro.sh' files provided must both be in the main directory. This will automatically generate the required input files and run them in sequence. + + +Reference for this work +----------------------- + +If you use this program as a basis for your own work, please consider citing the paper referenced in the introduction. The initial version of this work was contributed to the deal.II project by E. Comellas and J.-P. Pelteret. + + + +Recommended literature +---------------------- + +* W. Ehlers and G. Eipper (1999), Finite Elastic Deformations in Liquid-Saturated and Empty Porous Solids, Transport in Porous Media 34(1/3):179-191. DOI: [10.1023/A:1006565509095](https://doi.org/10.1023/A:1006565509095); +* S. Reese and S. Govindjee (2001), A theory of finite viscoelasticity and numerical aspects, International Journal of Solids and Structures 35(26-27):3455-3482. DOI: [10.1016/S0020-7683(97)00217-5](https://doi.org/10.1016/S0020-7683(97)00217-5); +* G. Franceschini, D. Bigoni, P. Regitnig and G. A. Holzapfel (2006), Brain tissue deforms similarly to filled elastomers and follows consolidation theory, Journal of the Mechanics and Physics of Solids 54(12):2592-2620. DOI: [10.1016/j.jmps.2006.05.004](https://doi.org/10.1016/j.jmps.2006.05.004); +* S. Budday, G. Sommer, J. Haybaeck, P. Steinmann, G. A. Holzapfel and E. Kuhl (2017), Rheological characterization of human brain tissue, Acta Biomaterialia 60:315-329. DOI: [10.1016/j.actbio.2017.06.024](https://doi.org/10.1016/j.actbio.2017.06.024); +* G.A. Holzapfel (2001), Nonlinear Solid Mechanics. A Continuum Approach for Engineering, John Wiley & Sons. ISBN: [978-0-471-82319-3](http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0471823198.html); + + -- 2.39.5