[pylithapp]
# ----------------------------------------------------------------------
# PROBLEM DESCRIPTION
# ----------------------------------------------------------------------
#
# This problem demonstrates the use of slip-weakening fault friction for a
# quasi-static problem.
#
# The problem is similar to example 12, except that a different friction
# model is used. The model is run for 200 years.
# ----------------------------------------------------------------------
# RUNNING THE SIMULATON
# ----------------------------------------------------------------------
# This is not a self-contained simulation configuration file. This
# file only specifies parameters specific to tutorial step13.
# The general parameters are specificed in the pylithapp.cfg
# file which PyLith reads by default.
#
# To run the simulation:
# pylith step13.cfg
#
# Output will be directed to the directory output.
# ----------------------------------------------------------------------
# problem
# ----------------------------------------------------------------------
[pylithapp.timedependent]
# Set bc to an array of 3 boundary conditions: 'x_pos', 'x_neg', and 'z_neg'.
bc = [x_pos,x_neg,z_neg]
# Set interfaces to an array of 1 fault: 'fault'.
interfaces = [fault]
[pylithapp.timedependent.implicit]
# Set the output to an array of 2 output managers.
# We will output the solution over the domain and the ground surface.
output = [domain,subdomain]
# Set subdomain component to OutputSolnSubset (boundary of the domain).
output.subdomain = pylith.meshio.OutputSolnSubset
# Fault friction is a nonlinear problem so we need to use the nonlinear
# solver.
solver = pylith.problems.SolverNonlinear
# Change the total simulation time to 1000 years, and use a constant time
# step size of 5 years.
[pylithapp.timedependent.implicit.time_step]
total_time = 1000.0*year
dt = 5.0*year
# ----------------------------------------------------------------------
# boundary conditions
# ----------------------------------------------------------------------
# Set the parameters for boundary conditions applied on the
# +x, -x, and -z faces of the box.
#
# On the -x and +x faces, we fix the x degrees of freedom and apply
# velocities in the y-direction. We fix the z degree of freedom on the
# bottom (-z) face.
#
# We use a UniformDB to apply the displacements and velocities, while
# retaining the default ZeroDispDB for zero x-displacements on the -x
# face and and zero z-displacements on -z.
#
# Note that since the fault cuts through the base of the model (z_neg),
# we can only constrain the portion of the bottom boundary that does not
# include the fault. A nodeset named 'face_zneg_nofault' has been defined
# in Cubit for this purpose.
#
# The label corresponds to the name of the nodeset in CUBIT.
# +x face -- Dirichlet
[pylithapp.timedependent.bc.x_pos]
bc_dof = [0,1]
label = face_xpos
db_initial = spatialdata.spatialdb.UniformDB
db_initial.label = Dirichlet BC on +x
db_initial.values = [displacement-x,displacement-y]
db_initial.data = [0.0*m,-1.0*m]
db_rate = spatialdata.spatialdb.UniformDB
db_rate.label = Dirichlet rate BC on +x
db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
# -x face
[pylithapp.timedependent.bc.x_neg]
bc_dof = [0, 1]
label = face_xneg
db_initial.label = Dirichlet BC on -x
db_rate = spatialdata.spatialdb.UniformDB
db_rate.label = Dirichlet rate BC on -x
db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
# -z face
[pylithapp.timedependent.bc.z_neg]
bc_dof = [2]
label = face_zneg
db_initial.label = Dirichlet BC on -z
# ----------------------------------------------------------------------
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
# Change fault to dynamic fault interface.
fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
# The label corresponds to the name of the nodeset in CUBIT.
label = fault
# Use the slip-weakening friction model.
friction = pylith.friction.SlipWeakening
friction.label = Slip weakening
# Force healing after each time step, so weakening is confined to each
# time step and does not carry over into subsequent time steps.
friction.force_healing = True
# We must define the quadrature information for fault cells.
# The fault cells are 2D (surface).
quadrature.cell = pylith.feassemble.FIATSimplex
quadrature.cell.dimension = 2
# Set slip-weakening friction model parameters using a uniform DB. Set the
# parameters as follows:
# static coefficient of friction: 0.6
# dynamic coefficient of friction: 0.5
# slip-weakening parameter: 0.2 m
# cohesion: 0 Pa
friction.db_properties = spatialdata.spatialdb.UniformDB
friction.db_properties.label = Slip weakening
friction.db_properties.values = [static-coefficient,dynamic-coefficient,slip-weakening-parameter,cohesion]
friction.db_properties.data = [0.6,0.2,0.2*m,0.0*Pa]
# ----------------------------------------------------------------------
# PETSc settings
# ----------------------------------------------------------------------
# NOTE: There are additional settings specific to fault friction.
[pylithapp.petsc]
# Friction sensitivity solve used to compute the increment in slip
# associated with changes in the Lagrange multiplier imposed by the
# fault constitutive model.
friction_pc_type = asm
friction_sub_pc_factor_shift_type = nonzero
friction_ksp_max_it = 25
friction_ksp_gmres_restart = 30
# Uncomment to view details of friction sensitivity solve.
#friction_ksp_monitor = true
#friction_ksp_view = true
friction_ksp_converged_reason = true
# ----------------------------------------------------------------------
# output
# ----------------------------------------------------------------------
# Give basename for VTK domain output of solution over domain.
[pylithapp.problem.formulation.output.domain]
# We specify that output occurs in terms of a given time frequency, and
# ask for output every 20 years. The time stamps of the output files are
# in years (rather than the default of seconds), and we give a format for
# the time stamp.
output_freq = time_step
time_step = 20.0*year
writer.filename = output/elastic-1cm.vtk
writer.time_format = %04.0f
writer.time_constant = 1.0*year
# Give basename for VTK domain output of solution over ground surface.
[pylithapp.problem.formulation.output.subdomain]
# Name of nodeset for ground surface.
label = face_zpos
# We keep the default output frequency behavior (skip every n steps), and
# ask to skip 0 steps between output, so that we get output every time step.
skip = 0
writer.filename = output/elastic-1cm-groundsurf.vtk
writer.time_format = %04.0f
writer.time_constant = 1.0*year
# Give basename for VTK fault output.
[pylithapp.problem.interfaces.fault.output]
# We keep the default output frequency behavior (skip every n steps), and
# ask to skip 0 steps between output, so that we get output every time step.
skip = 0
writer.filename = output/elastic-1cm-fault.vtk
writer.time_format = %04.0f
writer.time_constant = 1.0*year
# Give basename for VTK output of upper_crust state variables.
[pylithapp.timedependent.materials.upper_crust.output]
# Average values over quadrature points.
cell_filter = pylith.meshio.CellFilterAvg
output_freq = time_step
time_step = 20.0*year
writer.filename = output/elastic-1cm-upper_crust.vtk
writer.time_format = %04.0f
writer.time_constant = 1.0*year