Applying forces instead of set velocities on a 2D continental extension model

Hi all,

I’ve been playing around with the continental extension model in the manual and was interested if there’s a way of applying a force to the left and right boundaries of the model instead of a set velocity. Maybe I’m completely off the plot here but from looking at the manual it looks like in the Boundary traction model subsection you can specify a function to calculate the traction force for each vector component (x,y,z) for which you wish to have a force in that direction. However, I’m a little unsure how to implement this or if it’ll work like I presume it will.

If anybody has done anything like this before or even knows if you can implement this any help is much appreciated.

Thanks,

Luke

Hi Luke,

Yep, you are on the track. The Boundary traction model can be used to prescribe tractions on boundaries, rather than velocities.

In general, models with both a free surface and boundary tractions on one or more side walls tend to be less stable than equivalent models with kinematic boundaries, but with enough testing various configurations you probably can arrive with a stable suite of simulations.

As lithostatic pressure will dominant for a crustal- or lithospheric-scale model, what you likely need to prescribe on the traction boundaries is the lithostatic pressure plus a constant that defines either inward or outward flow (simple 2D example).

Previously, I believe this combination could only have been done via a carefully designed user-specified function, but now it should be possible to combine multiple tractions models with the following recently merged PR (yay hackathons :slight_smile: ) - Problem with update strain rheology - #13 by jbnaliboff

As a starting point, I suggest reading through that PR (particularly the new example test case) and:

  1. Going through the online documentation for the boundary traction model
  2. Reading through relevant tests cases, including box_lithostatic_pressure_2D.prm. I would search for keywords like lithostatic_pressure and boundary_traction.
  3. Go through the benchmark suite for nonlinear channel flow, which uses boundary tractions to drive deformation.

I hope this helps and it would be great to continue the discussion with any further questions about existing examples or new tests you conduct.

Cheers,
John

Hi John,

Thanks for the response and the links to all the useful information! It’s good to hear that the traction boundaries work similar to what I thought they would. I’ve also had a read through the links you suggested but there’s still a few things I’m a little unsure about.

Firstly, the closest example I found to what I want to achieve is the attached file and image below which I somehow found on Juliane Dannberg’s Github page. This example uses the box with lithosphere boundary indicators and applies a free surface on top, zero velocity boundary indicators on the bottom boundary, left lithosphere: function, right lithosphere:function, left:initial lithostatic pressure, right:initial lithostatic pressure. It also uses a function that can be summarised as: density * gravity * (height of model – y) + or – stress. I also noticed that the box_lithostatic_pressure_2D.prm has a similar function. My question here is basically why do these models prescribe traction functions in this way? Why not use a constant value across the boundaries?
image
traction_plate.prm (7.4 KB)

I’ve also had a go at applying boundary tractions on a 2D continental extension model, but I’ve been getting some funny results. To try and get my models working I’ve been using zero velocity boundary indicators on the bottom, free surface on the top and x function tractions on the left and right. However, when applying a constant traction on the sides I end up getting really high velocities dipping downwards (image below). I’ve tried playing around with this a bit but haven’t had any luck and I’m not sure what the best thing to try going forward is. Do you have any advice or insight as to what’s going on here?
image

Haha I guess I asked at a good time then. I also saw you released ASPECT 2.5.0 recently (looks like a lot of really cool changes btw), but I’m still on the past version (2.4.0) and it’ll take me a few weeks at least before I’ll be able to get the newer version going. Would you recommend I keep on trying to get the traction boundaries working on my current version or wait until I can use 2.5.0?

Big thanks again,

Luke

Hi Luke,

This is a very delayed reply to your last post, but hopefully it may be still be useful for you (or others).

I also noticed that the box_lithostatic_pressure_2D.prm has a similar function. My question here is basically why do these models prescribe traction functions in this way? Why not use a constant value across the boundaries?

Consider a model with no internal variations in density and free slip boundaries on all sides. The Stokes solution to this setup should have effectively zero velocities everywhere and a laterally uniform lithostatic pressure profile.

If one were to replace the side boundaries with traction boundaries, maintaining this state of equilibrium would require having a depth-dependent traction value that matches the lithostatic pressure.

If the traction value at a given depth did not match the lithostatic pressure inside the model, then material would flow in or out as a result of the pressure gradient. As depth increases, this pressure gradient across the boundary would increase and potentially produces extremely large velocities.

Coming back to the models you mentioned in your last post, what they are trying to achieve is adding a tectonic stress (i.e., extension or compression) to a lithostatic pressure profile on the traction boundaries.

This should produce a pressure gradient across the boundary that is equal to the tectonic stress, rather than an additional difference in the lithostatic pressure gradient across the boundary.

Hopefully this makes sense!

Would you recommend I keep on trying to get the traction boundaries working on my current version or wait until I can use 2.5.0?

If you have not already done so, I would switch to using the main branch!

Cheers,
John

Hi John,

Thanks a lot for the response! You summarised everything I wanted to know really well and after doing some extra reading and playing with the function traction boundaries I’ve realised I really didn’t understand how they worked.

Coming back to my original post, what I’m essentially trying to do is write a function that applies the lithostatic pressure profile as well as an additional force on the traction boundaries. My initial thought on this was to look if there’s any way to apply the initial lithostatic pressure traction condition as well as a function traction condition on the same boundary, but I don’t believe it’s possible to apply multiple boundary conditions like this?

I’m also a little unsure here as to what you mean here by being able “to combine multiple tractions models with the following recently merged PR”. Really sorry if I’m sounding naïve here but I’m not quite sure how something like this would be implemented. I’ve gone through the linked forum post and PR, but I still aren’t entirely sure what you mean. Would you be able to explain how something like this would be implemented or give another example?

I’m a bit late to the party, but I recently got access to the newest version :grinning:. I’m currently reading through some the new changes that have been made so I’m really excited to play around with it.

Thanks a lot for all the help,

Luke

Hi Luke,

Happy New Year!

I’m also a little unsure here as to what you mean here by being able “to combine multiple tractions models with the following recently merged PR”. Really sorry if I’m sounding naïve here but I’m not quite sure how something like this would be implemented.

Apologies, I linked the wrong PR in the previous post, which should have linked to the following PR:

Take a look at the following PRM file added in that PR, which combines traction BC read from a file and prescribed in a function: aspect/tests/traction_multiple_model.prm at main · geodynamics/aspect · GitHub

You could use the same method to combine the initial lithostatic pressure traction option along with a function.

Let me know if this needs further clarification or if it would be helpful to write an example PRM snippet on how to do this!

Cheers,
John

Hi,

Thanks a lot for the help John! Bit of a late response but I’ve spent a lot of time working on and off on these sorts of models. Here, I’ll show a simple 2D force driven continental extension model and then what I want to do with my project.

2D Force Driven Continental Extension Model
Full .prms and ascii data files - 2d_traction_1.prm (14.2 KB),
2d_traction_2.prm (14.3 KB),
continentalextension_2d_left.0.txt (20.5 KB),
continentalextension_2d_right.0.txt (20.9 KB)

As John suggested I used the initial lithostatic pressure condition with an additional traction function on the left and right boundaries to create a force that initiates rifting, I also applied a velocity y = 0 function so the model is only pulled in the x orientation, however, this isn’t necessary if you apply the traction force over a smaller area. The full boundary conditions I used were:

subsection Boundary velocity model
  set Prescribed velocity boundary indicators = left y:function, right y:function
  set Zero velocity boundary indicators = bottom

  subsection Function
    set Variable names      = x,y
    set Function expression = 0; 0
  end
end

subsection Boundary traction model
  set Prescribed traction boundary indicators = left:initial lithostatic pressure, right:initial lithostatic pressure, left:function, right:function

  subsection Initial lithostatic pressure
    set Representative point         = 0e3, 0e3
  end

  subsection Function
    set Variable names      = x,y
    set Function constants  = stress= 2.7e8, point_1= 560e3, point_2= 520e3
    set Function expression = if (x<100e3, if (y>340e3 && y<390e3, -stress, 0), if (y>340e3 && y<390e3, stress, 0)); 0
  end
end

By applying a force like this the model produces high strain along the left and right boundaries (pictured below) where there are viscosity contrasts in the crust (i.e. across the upper-lower crust boundary). I’ve been avoiding this issue by only visualising the centre of the model, but if anyone has any advice on applying a force that won’t lead to these high strain effects let me know.

Furthermore, when the model starts necking, causing velocities to increase, I checkpoint the model and output the velocities along the left and right boundaries, then save them in an ascii data format. I then resume the model using this ascii data as set velocities (this is why there’s two .prm files).

I also spent a considerable amount of time working on getting the model to converge, the parameters I tweaked were:

set Nonlinear solver scheme                = single Advection, iterated Stokes
set Nonlinear solver tolerance             = 1e-4
set Max nonlinear iterations               = 200
set CFL number                             = 0.3
set Maximum time step                      = 20e3


set Material averaging = harmonic average only viscosity

set Minimum viscosity = 1e18
set Maximum viscosity = 1e24


subsection Solver parameters
  subsection Stokes solver parameters
    set Stokes solver type = block AMG
    set Number of cheap Stokes solver steps = 500
    set Use full A block as preconditioner  = true
    set GMRES solver restart length         = 100
  end
  subsection Newton solver parameters
    set Maximum linear Stokes solver tolerance   = 1e-2
    set Use Eisenstat Walker method for Picard iterations = true
  end
end

Early on the stokes solver converges in around 25 to 80 iterations, but after 100,000 years it only takes 4 to 10 iterations until necking where the number of iterations increase (full .log file:
log.txt). If anyone has any advice on how I could potentially improve the convergence of this model let me know.

My Project
For my project I want to use a 3D force driven model to determine how transform faults, velocities, and velocity vectors develop during changes in the traction orientation. To do this I start with a model that uses velocities on the left and right boundaries and extend the model at 1 cm/yr on each side until breakup (17 Myr). After breakup I then switch to using traction boundaries and change the traction vector to be oblique to the previous velocity angle. Additionally, the front and back boundaries are set to periodic.

Here, I tested applying tractions at various angles to see how the model’s velocities and velocity orientations would react after 17 Myr of extension using velocities:


A negative vector means pulling towards the top left, bottom right.

However, I’m a little confused by some of these results. Firstly, when I apply a traction vector at 0 degrees it produces a velocity vector of -32 degrees (which looks strange at first but is actually parallel to the transform) with a really low velocity of 0.1 cm/yr, but I’m a little unsure as to why the velocities are so low here and why they’re higher elsewhere, can anyone explain why the velocities are higher pulling obliquely at a negative angle? Additionally, there’s quite a large discrepancy between the traction and velocity vectors, with the velocity vectors being a lot larger, why is this? I presumed this is due to the free passage of material through the periodic boundaries and how the models already broken up, but the model’s quite sensitive to this effect and I wondered if anyone had any ideas to potentially reduce it? If you want any more information or have anything to add to my model setup let me know.

Thanks,

Luke