Applying Multiple Block Relax/Block Gridpoint Reaction Boundary Conditions

yes - you are correct. You can only do one BLOCK RELAX at a time. This is kind of tricky to resolve. I’ll see if we can add multiple relax conditions to 3DEC.

In the short term, you would have to store existing applied forces and then re-apply them after giving the second BLOCK RELAX command. See example below:

model new
block create tunnel block-radial 5 length 0 5 block-axial 5

block join

block zone gen edge 1

block zone cmodel assign el
block zone prop dens 2000 bulk 1e9 shear 0.6e9

block insitu stress -10e6 -10e6 -10e6 0 0 0

block gridpoint apply vel-y 0 range pos-y 0
block gridpoint apply vel-y 0 range pos-y 5
block gridpoint apply vel 0 0 0 range pos-x -5
block gridpoint apply vel 0 0 0 range pos-x 5
block gridpoint apply vel 0 0 0 range pos-z -5
block gridpoint apply vel 0 0 0 range pos-z 5

model large-strain off
model solve

block group 'tunnel' range cyl end-1 0 0 0 end-2 0 5 0 rad 1

; take histories at top of tunnel
block hide range group 'tunnel'
block his disp pos 0,0.5,1
block his disp pos 0,1.5,1
block his disp pos 0,2.5,1
block his disp pos 0,3.5,1
block his disp pos 0,4.5,1
block hide off

; gradually excavate first stage
block relax min 0.2 linear 1000 range group 'tunnel' pos-y 0 2
model cyc 1500

model save 'exc-1'

; how do we do the second stage?

; store existing applied forces
; first find nodes on the surface
block gridpoint group 'surface1' range group 'relax'

fish def store_reaction
  loop foreach gp block.gp.list
    if block.gp.group(gp) = 'surface1'
       block.gp.extra(gp) = block.gp.force.app(gp)
    end_if
  end_loop
end
[store_reaction]

; now apply next stage relax condition
block relax min 0.2 linear 1000 range group 'tunnel' pos-y 2 4

; add back previous forces
fish def add_reaction
  loop foreach gp block.gp.list
    if block.gp.group(gp) = 'surface1'
      block.gp.force.app(gp) += block.gp.extra(gp)
    end_if
  end_loop
end
[add_reaction]

model cyc 1500