SimpleDB boundary condition for varied displacement rate

Dear Pylith developer,

I would like to create 3D modeling of inter-seismic fault deformation with boundary condition of displacement rate like in this figure below. The displacement rate (mm/ year) is applied and varied laterally (nodes with the same longitude latitude but different depth have the same displacement rate value).

I would like to use Pylith v2.2.1 or v2.2.2. I checked on the example we can used the SimpleDB for different boundary condition value at different points. However, I could not find example of SimpleDB for displacement rate value (mm/ yr) (kindly correct If I’m wrong).

I would like to ask, can I use displacement rate value (mm/ yr) that varied laterally (as shown in the figure) for the boundary condition in the SimpleDB file? How shall I modify the example code? Kindly suggest.

Thank you in advance

Dian

(Huang et al., 2023)

We may not have an example with a SimpleDB with a displacement rate for PyLith v2.2, but the concepts are very similar to the cases of a UniformDB with a displacement rate (refer to examples/3d/hex8/step04.cfg) and a SimpleDB for spatially varying values (refer to examples/3d/hex8/step18.cfg).

Thank you @baagaard

I will check these examples

Dian

Dear @baagaard

I have tried SimpleDB file for spatially varying values, for the boundary condition at +x face, -x face, +y face, and -y face. However I found a problem related to degree of freedom.

Below is the illustration for boundary condition that I apply (black arrow):

I created two files for the SimpleDB files: …_xface.spatialdb and …_yface.spatialdb.
In the .cfg file I defined 5 boundary conditions for x_pos, x_neg, y_pos, y_neg, and z_neg.

But I found error:

I attached the .cfg and .spatialdb files in the ZIP folder.
files.zip (5.3 KB)

Please advice what should I do. Thank you.

Dian

Along the edges and corners where the boundaries overlap, you cannot constrain the displacement at points using two different boundary conditions. For example, you cannot constrain the x and y degrees of freedom of a point from the BC on the +x boundary and from the BC on the +y boundary.

In cases where the displacements are zero (not your case), we usually constrain the degree of freedom normal to the boundary. This prevents overlapping boundary conditions.

In cases where the multiple degrees of freedom are constrained and will overlap at edges and corners, the correct procedure is to remove the overlap by not including the overlappling points in one of the groups specifying the boundary. For example, in creating the group of point on the +x boundary, you can remove the points that are on the -y and +y boundaries (assuming you are constraining the horizontal components of displacement). In CUBIT this is done using the the boolean options on groups.

Thank you so much for the reply and advice @baagaard
I will try it!

Regards

Dian

Dear @baagaard,

I want to apply varied displacement rates for the boundary condition: laterally varied (x, y), but has the same value within depths of the same points, similar to the above figure example. I used Pylith 2.2.1 (I am interested in applying the friction parameter).

Due to the displacement rate that can not yet be applied in SimpleDB files, I tried to make a workaround by creating many SimpleDB files for each observation years, e.g., for year 0, year 50, .. etc, and ran it for each year.

I tried to test this workaround in the uniform BC model (left vs right below figures). But when I compared the results, e.g., displacement at the domain and fault slip, the results are a bit different. Especially the fault slip.

I would like to ask, is the workaround conceptual can be acceptable/ applied in the Pylith coding? Maybe is there any suggestion? I attached the cfg and spatial db files.

Please take a look. Kindly advise.

Thank you

Pylithfiles.zip (240 KB)

I do not understand what variation in boundary condition values you are trying to impose. Can you describe what you want to do in mathematical terms, similar to the equation for the time dependent boundary conditions in the PyLith manual Time-Dependent Boundary Conditions β€” PyLith 5.0.0dev documentation (this is the same equation used in PyLith v2.2.2)?

Kindly apologize.

I have not yet calculated the equation for the boundary condition values. Because I interpolated the velocity (or the displacement rate: Ve mm/ yr and Vn mm/ yr) at the boundary condition from sparse GPS data inside the study area, similar to Figure 4 above (red arrow). The variation of the displacement rate at the BC is 2D (laterally), varied in the easting (x) and northing (y), but not varied between depths (z).

I still used SimpleDB with spatialDB files in the Pylith command. To accomodate the β€˜rate’ in the boundary condition, I created the spatialDB files for each time step, e.g. at year 0, year 50, year 100, year 150 etc., by multiplying the rate at the boundaries with time step. I ran the cfg each at those time step.

But I was uncertain, perhaps is it ok to do this method? Because I obtained the slip at faults smaller than what is expected. Kindly advice.

Thank you

(I still use Pylith 2.2 for this because I need the fault friction parameter)

It sounds like you are breaking a time-dependent boundary value problem into multiple static boundary value problems. That is, you are solving for the displacements at each time in independent simulations. If the physics at each time step is decoupled, then this could work. However, if the physics at one time depends on the physics at previous times, then this approach will not yield equivalent results. In general, simulations with fault friction are nonlinear, and the physics depends on the current state, which is sensitive to the behaviour at previous times.

Dear @baagaard

Thank you very much for your reply.

If the case is time-dependent (coupled), may I ask if you might have any suggestions or possible workarounds that would allow us to apply spatially varied time-dependent boundary conditions (2D variation) while still making use of the friction parameter in PyLith 2.2?

Alternatively, if we would like to represent creeping faults (assuming zero friction) or locked faults (assuming significant friction) with spatially varying time-dependent boundary conditions (e.g. displacement rate), but without employing the friction parameter (i.e., without FaultCohesiveDyn), which version of PyLith is recommended? is there any example close to this case?

I apologize if these questions are rather basic, and I greatly appreciate your kind guidance.

Dian

It would help if you could describe the general mathematical form of the constraint you want to provide. If I understand your description, you want to specify the velocity on each boundary that is spatially variable. Is this correct? Does the velocity vary in time? If so, what is the general mathematical form that it has?

Dear @baagaard

Thank you for your reply.

Yes the velocity is spatially varied on each boundary. The velocity (mm/ year) is constant over time. The velocity or displacement rate is the same over time. But if converted to displacement, the displacement is increasing over time following the displacement rate.

Here is the mathematical form of my velocity (displacement rate) at the boundary condition. It depends on position easting and northing (2D varied). I tried to estimate the general equation for all boundaries (x-face and y-face).

U(x, y) = [-8.5983 + -0.0019x + -0.0151y + -0.000023x^2 + -0.000041xy + 0.000049y^2]
V(x, y) = [13.1281 + 0.0223x + 0.0149y + -0.000004x^2 + -0.000054xy + 0.000049y^2]
x easting in km
y northing in km
U displacement rate in x component (mm/year)
V displacement rate in y component (mm/year)

I attached the figure of the velocity (displacement rate) at the boundary condition (green arrows).

Thank you for your help.

Dian

The Dirichlet time-dependent boundary condition uses a simple expression for the spatial and temporal dependence (Time-Dependent Boundary Conditions β€” PyLith 5.0.0dev documentation; this same expression is used in PyLith v2),

f(x, t) = f_0(x) + fdot_1(x)*(t-t_1(x)  + f_2(x) * a(t-t_2(x))

Note: x refers to the spatial coordinates, such as (x,y) in 2D and (x, y, z) in 3D.

Your spatially varying velocities correspond to fdot_1(x). If they all start at the same time, then t_1(x) = 0 (uniform in space). So I think you can use a SimpleDB or SimpleGridDB for the db_rate. I would create a boundary condition (and spatial database) for each boundary, making sure that there is no overlap in the vertices in the boundary conditions.

For example, for a boundary condition on the +x boundary, you could have something like:

[pylithapp.problem.bc.bc_xpos]
label = boundary_xpos
bc_dof = [0, 1]
db_initial.label = Dirichlet BC on +x
db_rate = spatialdata.spatialdb.SimpleGridDB
db_rate.filename = velocity_xpos.spatialdb

The SimpleGridDB file velocity_xpos.spatialdb would provide values displacement-rate-x, displacement-rate-y, rate-start-time in which the displacement rate values vary in space and the start time is 0 at each point.

1 Like

Thank you so much @baagaard

I will try it!

Dian

Dear @baagaard

May I ask another question. I have faults intersecting with the x-face-pos (as shown in yellow circle in figure below). Shall I exclude them (the faults edges at the x-face-pos) from the boundary condition group of the x-face-pos?

Thank you

Yes, you should remove any overlap between faults and Dirichlet boundary conditions. Usually, we keep vertices on the edges of the domain as part of the fault and remove them from the Dirichlet boundary condition.

Ok. Thank you @baagaard

Dian