Applying Varying Distributed Load on a Surface in FLAC3D

Hello @everyone, @itascaYang @dafo407_itasca @itasca @itascan

I need to apply a varying distributed load on a surface in FLAC3D. The loading needs to increase and decrease along the surface height/direction instead of remaining constant.

I would like to know what would be the best approach for this type of loading. Should I use gradient, vary, FISH function, or another method?

It would be very helpful if anyone could provide a simple example or guidance for:

  • linearly increasing load,

  • linearly decreasing load,

  • or a pressure distribution that changes with depth/height.

I am trying to understand the proper way to define this type of distributed loading in FLAC3D.

Thanks in advance.

See here: Boundary Conditions — Itasca Software 9.6 documentation

Always use “zone face apply”:

From there you should pick the right option:

If you variation is linear with height/direction then you gradient it is by far the simplest.

If it is not linear or need to vary according to another dimension -for example time - you need to use a fish function. The important part is that the fish function value return a multiplying factor of the initial value you define. Therefore, the best way is to use a normalized value so that the fish function only has to return a value between 0 an 1.

Hi @stephaneBeaussier

For my model, I need to apply the load instantly, not gradually step by step. Currently, I am using commands similar to the following:

zone face skin

zone face group 'FacingB' range group 'PanelB' position-x 12.9002 22.0322 position-y -0.02 0.02 position-z 24.3074 29.7938

; ramp from 0% to 100% load
table 'ramp' add (0,0) (1000,1.0) (2000,1.0)

; apply pressure in vertical bands
zone face apply stress-normal -24446.22 table 'ramp' range group 'GodaFacingB' position-z 24.3074 24.3836
zone face apply stress-normal -24505.60 table 'ramp' range group 'GodaFacingB' position-z 24.3836 24.4598
zone face apply stress-normal -24563.53 table 'ramp' range group 'GodaFacingB' position-z 24.4598 24.5360

Based on my understanding, using the ramp table with values such as (0,0), (1000,1.0), and (2000,1.0) means that the load is increased gradually from 0% to 100% over the first 1000 steps, and then kept constant. However, in my case, I want the full load to be applied instantly at the beginning of the loading stage.

So I am confused whether I should use the ramp table at all, or whether I should directly apply the pressure without the table, like this:

zone face apply stress-normal -24446.22 range group 'FacingB' position-z 24.3074 24.3836

Could anyone please confirm the correct approach for applying the full pressure instantly in FLAC3D? Should I remove the ramp table if I want the load to be applied immediately?

Thanks in advance.

Hi @jwang

For my model, I need to apply a surface pressure instantly, not gradually step by step. Currently, I am using commands similar to the following:

zone face skin

zone face group 'LoadedFace' range group 'PanelGroup' position-x ... position-y ... position-z ...

table 'load_ramp' add (0,0) (1000,1.0) (2000,1.0)

zone face apply stress-normal -X table 'load_ramp' range group 'LoadedFace' position-z z1 z2

Based on my understanding, using the ramp table means the load increases gradually from 0% to 100% over the first 1000 steps and then remains constant. However, in my case, I want the full load to be applied instantly at the beginning of the loading stage.

So I am confused whether I should remove the ramp table and directly apply the pressure like this:

zone face apply stress-normal -X range group 'LoadedFace' position-z z1 z2

Could anyone please confirm the correct approach for applying the full pressure instantly in FLAC3D?

Thanks in advance.

Hi @everyone, @itascaYang @isaac @itsmoho_sen @ITE @Inwoo @Inu @itasca @dafo407_itasca

For my model, I need to apply a surface pressure instantly, not gradually step by step. Currently, I am using commands similar to the following:

zone face skin

zone face group 'LoadedFace' range group 'PanelGroup' position-x ... position-y ... position-z ...

table 'load_ramp' add (0,0) (1000,1.0) (2000,1.0)

zone face apply stress-normal -X table 'load_ramp' range group 'LoadedFace' position-z z1 z2

Based on my understanding, using the ramp table means the load increases gradually from 0% to 100% over the first 1000 steps and then remains constant. However, in my case, I want the full load to be applied instantly at the beginning of the loading stage.

So I am confused whether I should remove the ramp table and directly apply the pressure like this:

zone face apply stress-normal -X range group 'LoadedFace' position-z z1 z2

Could anyone please confirm the correct approach for applying the full pressure instantly in FLAC3D?

Thanks in advance.

Hi Sudipta,

If you want to apply pressure in vertical bands instantaneously rather than a continuous gradient then indeed you can use a table like you do.

If you are doing only one instantaneous change then a simpler method is to define a boundary condition, run you solve until the moment you want to change then change them and run the rest of the solve.

Here is an example based on the code you shared

zone face apply stress-normal [P0] range group “GodaFacingB”

model solve step [1000]

zone face apply-remove stress-normal range group “GodaFacingB”

zone face apply stress-normal [P1] range group “GodaFacingB”

model solve step [2000]

Whether this is actually what you should be doing that I cannot tell from the information you are sharing. Defining instantaneous changes in boundary conditions can create some numerical issues in certain cases.

Hi @stephaneBeaussier

Thank you for the previous suggestions. I want to clarify my loading condition a little more.

In my model, I am not using a ramp table. My goal is to directly apply a non-uniform distributed pressure on a surface instantaneously, solve the model for a certain number of steps, and then replace that pressure distribution with a new non-uniform pressure distribution.

For example, assume the loaded surface height is 10 m. Along this height, I have calculated different pressure values at 2 m intervals. So, for one loading instant, the pressure distribution may be:

z = 0–2 m      pressure = P1
z = 2–4 m      pressure = P2
z = 4–6 m      pressure = P3
z = 6–8 m      pressure = P4
z = 8–10 m     pressure = P5

My current understanding is that I can apply this non-uniform pressure distribution using separate vertical bands, like this:

zone face skin

zone face group 'LoadedFace' range group 'PanelGroup' position-x ... position-y ... position-z 0 10

zone face apply stress-normal -P1 range group 'LoadedFace' position-z 0 2
zone face apply stress-normal -P2 range group 'LoadedFace' position-z 2 4
zone face apply stress-normal -P3 range group 'LoadedFace' position-z 4 6
zone face apply stress-normal -P4 range group 'LoadedFace' position-z 6 8
zone face apply stress-normal -P5 range group 'LoadedFace' position-z 8 10

model step 5000
model solve ratio 1e-4
model save 'pressure_state_1'

Then, if I want to apply a new non-uniform pressure distribution, I would remove the previous pressure and apply the new values:

zone face apply-remove stress-normal range group 'LoadedFace'

zone face apply stress-normal -Q1 range group 'LoadedFace' position-z 0 2
zone face apply stress-normal -Q2 range group 'LoadedFace' position-z 2 4
zone face apply stress-normal -Q3 range group 'LoadedFace' position-z 4 6
zone face apply stress-normal -Q4 range group 'LoadedFace' position-z 6 8
zone face apply stress-normal -Q5 range group 'LoadedFace' position-z 8 10

model step 5000
model solve ratio 1e-4
model save 'pressure_state_2'

So my first question is: is this a correct way to apply an instantaneous non-uniform distributed pressure over a surface using vertical bands?

My second question is related to time-domain loading. I am trying to represent a time-varying pressure distribution. For example, suppose I have non-uniform pressure distributions for 100 seconds. By this, I mean that for each second, I have a different set of pressure values along the height. For example, each second has 5 pressure values:

t = 1 sec:   P1, P2, P3, P4, P5
t = 2 sec:   P1, P2, P3, P4, P5
t = 3 sec:   P1, P2, P3, P4, P5
...
t = 100 sec: P1, P2, P3, P4, P5

Each time step would therefore have a different non-uniform pressure distribution along the surface height.

Writing separate zone face apply commands manually for 100 different pressure distributions would be very tedious. Is there a recommended way to handle this in FLAC3D? For example, should I import the pressure values from a text file or table and use FISH to update the pressure distribution with time?

Thanks in advance.

Hi @jwang

I want to clarify my loading condition a little more.

In my model, I am not using a ramp table. My goal is to directly apply a non-uniform distributed pressure on a surface instantaneously, solve the model for a certain number of steps, and then replace that pressure distribution with a new non-uniform pressure distribution.

For example, assume the loaded surface height is 10 m. Along this height, I have calculated different pressure values at 2 m intervals. So, for one loading instant, the pressure distribution may be:

z = 0–2 m      pressure = P1
z = 2–4 m      pressure = P2
z = 4–6 m      pressure = P3
z = 6–8 m      pressure = P4
z = 8–10 m     pressure = P5

My current understanding is that I can apply this non-uniform pressure distribution using separate vertical bands, like this:

zone face skin

zone face group 'LoadedFace' range group 'PanelGroup' position-x ... position-y ... position-z 0 10

zone face apply stress-normal -P1 range group 'LoadedFace' position-z 0 2
zone face apply stress-normal -P2 range group 'LoadedFace' position-z 2 4
zone face apply stress-normal -P3 range group 'LoadedFace' position-z 4 6
zone face apply stress-normal -P4 range group 'LoadedFace' position-z 6 8
zone face apply stress-normal -P5 range group 'LoadedFace' position-z 8 10

model step 5000
model solve ratio 1e-4
model save 'pressure_state_1'

Then, if I want to apply a new non-uniform pressure distribution, I would remove the previous pressure and apply the new values:

zone face apply-remove stress-normal range group 'LoadedFace'

zone face apply stress-normal -Q1 range group 'LoadedFace' position-z 0 2
zone face apply stress-normal -Q2 range group 'LoadedFace' position-z 2 4
zone face apply stress-normal -Q3 range group 'LoadedFace' position-z 4 6
zone face apply stress-normal -Q4 range group 'LoadedFace' position-z 6 8
zone face apply stress-normal -Q5 range group 'LoadedFace' position-z 8 10

model step 5000
model solve ratio 1e-4
model save 'pressure_state_2'

So my first question is: is this a correct way to apply an instantaneous non-uniform distributed pressure over a surface using vertical bands?

My second question is related to time-domain loading. I am trying to represent a time-varying pressure distribution. For example, suppose I have non-uniform pressure distributions for 100 seconds. By this, I mean that for each second, I have a different set of pressure values along the height. For example, each second has 5 pressure values:

t = 1 sec:   P1, P2, P3, P4, P5
t = 2 sec:   P1, P2, P3, P4, P5
t = 3 sec:   P1, P2, P3, P4, P5
...
t = 100 sec: P1, P2, P3, P4, P5

Each time step would therefore have a different non-uniform pressure distribution along the surface height.

Writing separate zone face apply commands manually for 100 different pressure distributions would be very tedious. Is there a recommended way to handle this in FLAC3D? For example, should I import the pressure values from a text file or table and use FISH to update the pressure distribution with time?

Thanks in advance.

Hi,

Regarding the time dependent effect, in your case you should go for a fish function or table instead of using apply-remove. See example below:

zone face apply stress-normal [-P1] fish t_effect range group ‘LoadedFace’ position-z 0 2

with t_effect you fish function that as the documentation explain clearly should return a multiplication factor

Whether you use a table or fish function depend of the nature of the variations of the stress boundary conditions you apply: if it is data from the field then use a table, if I can be simplified to a continuous function then use a fish function. If you need to also have spatial dependency of the fish function you should use “fish-local” rather then fish.


Secondly, I want to make some comments you what you are trying to do:

model step 5000
model solve ratio 1e-4

What are you trying to do there? solve over a define number of steps (that cover to a time or something else) or until convergence? I don’t see how you could do both. Also a ratio 1e-4 is high, if it is just to test the code then it is fine but for the final run a lower value is strongly advised.

Thirdly,

I want to make a general common: you seem to want to put a lot of discontinuities both in time and space in your boundary conditions. This is a very risky strategy, as these discontinuities could create numerical problems or unphysical stress concentration. I advise to thing about you problem to see if you can simplify it to have more continuous description of the boundary conditions.

Hi @stephaneBeaussier

Thank you very much for the explanation. I think I understand the issue better now.

In my case, the pressure data are not generated from a simple analytical equation. The pressure distributions come from another external calculation, so my understanding is that using a continuous analytical FISH function may not be appropriate. Instead, I think I may need to use either a table or import an external file containing the pressure data.

What I am trying to do is the following:

  • I have pressure-distribution data for 100 seconds.

  • For each second, I have a different non-uniform pressure distribution along the wall height.

  • Since the pressure varies with both height and time, I think the pressure boundary condition is a function of both space and time, (P(z,t)).

  • For example, at each time instant I have 5 pressure values along the height:

t = 1 sec → P1, P2, P3, P4, P5
t = 2 sec → Q1, Q2, Q3, Q4, Q5
t = 3 sec → R1, R2, R3, R4, R5

The important point is that for each time instant, all pressure values should be applied together instantaneously over the surface, not gradually ramped.

So my main question is:

What would be the best way to implement this type of time-varying non-uniform pressure loading, (P(z,t)), in FLAC3D?

From your explanation, I think I may need:

  • either tables,

  • or importing a text/CSV file containing the pressure history data for all time steps.

However, I am still not fully understanding how this would actually be connected to the FLAC3D model.

For example:

  • Should I create one table for each vertical band?

  • Should the pressure history be imported from an external file?

  • Would this require a FISH loop that updates the boundary condition at each time step?

  • If so, how should the pressure data and time be linked to the model cycling process?

I am also slightly confused about the use of:

model step 5000

and

model solve ratio 1e-4

Previously, I thought that even after using a certain number of steps, the model still needed to be converged. Now I understand that model step simply advances the model for a specified number of cycles, while model solve ratio continues cycling until the convergence criterion is reached.

Now what I understand is that I can use a selected step number and obtain results, but I need to check the result accuracy by comparing different step numbers and identifying which step number gives the closest or most stable result compared with theoretical or field/reference results.

So for a time-dependent loading problem like this, should the loading process mainly be controlled by:

  • time/cycling (for example model step 500),

  • convergence (for example model solve ratio 1e-4),

  • or some combination of both (model solve and model solve ratio)?

I would really appreciate any guidance or example workflow for implementing this type of transient non-uniform pressure loading.

Thank you again for your help.

To reply to you first set of questions:

All the different options are a valid way of doing it. It dependent on the specificity of your problem, how confortable your with scripting and how much you plan to reuse the code in the future. I cannot make that decision for you. At the end of the day it just depend if it is easier for you to have zone face apply directly access the table of P(z, t) or if it is easier to wrap a fish function around it.

On the second set of questions:

If it is a creep problem then use this as an example to understand solving procedure

Valley Creep Deformation (FLAC3D) — Itasca Software 9.1 documentation

If it isn’t a creep problem then it will dependent how you define time in your problem. Below is such an example, I don’t know if it similat to your problem:

Simulation of Pull-Tests for Fully Bonded Rock Reinforcement (FLAC2D) — Itasca Software 9.1 documentation

Finally,

I have the impression you are trying to solve a complex coupled problem while you are still struggling with the basic functionalities of FLAC3D. This is unlikely to go well. I would advise to seek individual support either from a more senior colleague or from the consulting branch of Itasca.

Hi @stephaneBeaussier

Thank you again for your explanation and for the example references.

After reading your comments, I think the most practical approach for my case would be to use an external file (CSV or text file) containing the pressure history data and then apply the pressure through tables and/or a FISH function.

My loading data come from a separate external calculation, so I already have the pressure values available. For each time instant, I have a complete non-uniform pressure distribution along the wall height. In other words, the boundary condition can be described as:

P=P(z,t)

where the pressure varies both with elevation and with time.

For example, for each second I have a new set of pressure values along the wall height:

    1. t=1t=1t=1 s → P1,P2,P3,P4,P5P_1, P_2, P_3, P_4, P_5P1​,P2​,P3​,P4​,P5​
    2. t=2t=2t=2 s → Q1,Q2,Q3,Q4,Q5Q_1, Q_2, Q_3, Q_4, Q_5Q1​,Q2​,Q3​,Q4​,Q5​
    3. t=3t=3t=3 s → R1,R2,R3,R4,R5R_1, R_2, R_3, R_4, R_5R1​,R2​,R3​,R4​,R5​

and so on for the full duration of the loading record.

At this point, my main uncertainty is not whether to use tables or FISH, but rather the workflow for importing and connecting the external data to the FLAC3D model.

Specifically:

  1. Is it possible to import a CSV/text file containing the pressure history directly into FLAC3D?
  2. If so, what would be the typical workflow to connect the imported data to a boundary condition?
  3. Would you typically create one table for each vertical band and then update the boundary condition from those tables?
  4. Or would you generally read the file through FISH and update the applied stresses during cycling/solving?

I am mainly looking for the recommended implementation strategy for handling a large dataset of time-varying non-uniform pressure distributions.Also, if you know of any FLAC3D example problem or documentation section that demonstrates importing external time-history data and applying it as a time-dependent boundary condition, I would be grateful if you could suggest it.

Thank you again for your help.