granular-basin

tectonic deformation experiments with Granular.jl
git clone git://src.adamsgaard.dk/granular-basin # fast
git clone https://src.adamsgaard.dk/granular-basin.git # slow
Log | Files | Refs | README Back to index

commit 125e84ccadfa1ace469d3fe5e2b64e9969770e28
parent a3f32f2fadbc2f1d084ed8d1a9ffc65c4fbb1fa5
Author: esbenpalmstrom <esbenpalmstroem@gmail.com>
Date:   Mon, 22 Nov 2021 21:00:58 +0100

Initial commit

Diffstat:
Apipeline_test.jl | 277+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 277 insertions(+), 0 deletions(-)

diff --git a/pipeline_test.jl b/pipeline_test.jl @@ -0,0 +1,277 @@ +import Granular +import JLD2 +import PyPlot +import Dates + +include("indent.jl") + +#call this script as "@elapsed include("initialization.jl")" in order to time it + +t_start = Dates.now() + +t_init = 0.5 # duration of initialization [s] +t_stack = 0.4 #duration for each stacking + +g = [0.,-9.8] + +nx = 25 #125 +ny = 8 #80 +stacks = 0 + +ngrains = nx*ny*(stacks+1) + +suffix = "_test" + +r_min = 0.05 +r_max = r_min*sqrt(2) #max grain size is double area of smallest grain size + +SimSettings = Dict() + +SimSettings["nx"] = nx +SimSettings["ny"] = ny +SimSettings["r_min"] = r_min +SimSettings["r_max"] = r_max + +#JLD2.save("SimSettings$(ngrains)$(suffix).jld2", SimSettings) + +gsd_type = "powerlaw" +gsd_powerlaw_exponent = -1.8 +gsd_seed = 3 + +# mechanical properties of grains +youngs_modulus = 2e7 #elastic modulus +poissons_ratio = 0.185 #shear stiffness ratio +tensile_strength = 0.0 #strength of bonds between grains +contact_dynamic_friction = 0.4 #friction between grains +rotating = true #can grains rotate or not + +sim = Granular.createSimulation(id="init") +sim.id = "init$(ngrains)$(suffix)" + +Granular.regularPacking!(sim, #simulation object + [nx, ny], #number of grains along x and y axis + r_min, #smallest grain size + r_max, #largest grain size + tiling="triangular", #how the grains are tiled + origo = [0.0,0.0], + size_distribution=gsd_type, + size_distribution_parameter=gsd_powerlaw_exponent, + seed=gsd_seed) + +for grain in sim.grains #go through all grains in sim + grain.youngs_modulus = youngs_modulus + grain.poissons_ratio = poissons_ratio + grain.tensile_strength = tensile_strength + grain.contact_dynamic_friction = contact_dynamic_friction + grain.rotating = rotating +end + +Granular.fitGridToGrains!(sim, sim.ocean) + +Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "north south", + verbose=false) +#Granular.setGridBoundaryConditions!(sim.ocean, "periodic", "east west") +Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "east west") + + +for grain in sim.grains + Granular.addBodyForce!(grain, grain.mass*g) + Granular.disableOceanDrag!(grain) + grain.contact_viscosity_normal = 1e4 # N/(m/s) +end + +Granular.setTimeStep!(sim) + +Granular.setTotalTime!(sim, t_init) + +Granular.setOutputFileInterval!(sim, .01) + +Granular.run!(sim) + +#Granular.writeSimulation(sim, +# filename = "init$(ngrains)$(suffix).jld2", +# folder = "init$(ngrains)$(suffix)") + +#Stack it on top of each other + +temp = deepcopy(sim) + +for i = 1:stacks + + global y_top = -Inf + for grain in sim.grains + if y_top < grain.lin_pos[2] #+ grain.contact_radius + global y_top = grain.lin_pos[2] #+ grain.contact_radius + end + end + + + for grain in temp.grains + + lin_pos_lifted = [0.0,0.0] + + lin_pos_lifted[1] = grain.lin_pos[1] + lin_pos_lifted[2] = grain.lin_pos[2] + y_top + r_max + + + Granular.addGrainCylindrical!(sim, + lin_pos_lifted, + grain.contact_radius, + grain.thickness, + youngs_modulus = grain.youngs_modulus, + poissons_ratio = grain.poissons_ratio, + tensile_strength = grain.tensile_strength, + contact_dynamic_friction = grain.contact_dynamic_friction, + verbose = false) + + end + + Granular.fitGridToGrains!(sim,sim.ocean,verbose=false) + Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "north south", + verbose=false) + Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "east west", + verbose=false) + Granular.setTotalTime!(sim,t_stack) + Granular.setTimeStep!(sim) + Granular.setOutputFileInterval!(sim, .01) + + for grain in sim.grains + Granular.addBodyForce!(grain, grain.mass*g) + Granular.disableOceanDrag!(grain) + end + + #Granular.resetTime!(sim) + sim.time_iteration = 0 + sim.time = 0.0 + sim.file_time_since_output_file = 0. + + Granular.setTotalTime!(sim, t_stack) + Granular.setTimeStep!(sim) + Granular.setOutputFileInterval!(sim, .01) + + Granular.run!(sim) + +end + +# add a lower boundary consisting of grains bound together +# do this by creating a new simulation where the grains are bonded using +# findContacts! after creating overlapping grains. Then set their contact +# strengths to an infinite amount, but do not allow new contacts + +carpet = Granular.createSimulation(id="init_carpet") + +bot_r = r_min #radius of bottom layer grains + +left_edge = round(sim.ocean.origo[1],digits=2) +length = round(sim.ocean.L[1],digits=2) +right_edge = left_edge+length + +for i = left_edge+(bot_r/2):bot_r*1.99:left_edge+length + + bot_pos = [i,round(sim.ocean.origo[2]-bot_r,digits=2)] + + Granular.addGrainCylindrical!(carpet, + bot_pos, + bot_r, + 0.1, + verbose = false, + tensile_strength = Inf, + shear_strength = Inf, + contact_stiffness_normal = Inf, + contact_stiffness_tangential = Inf) + +end + +Granular.findContactsAllToAll!(carpet) #find the grain contacts + +#carpet.grains[10].fixed = true +#carpet.grains[10].lin_vel[1:2] = [0.0,0.0] + + +#add the carpet to the main simulation object +append!(sim.grains,carpet.grains) + + +#fit the ocean to the added grains and run to let the basin settle + +Granular.fitGridToGrains!(sim,sim.ocean,verbose=false) + +Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "north south", + verbose=false) + +sim.time_iteration = 0 +sim.time = 0.0 +sim.file_time_since_output_file = 0. +Granular.setTotalTime!(sim, 0.2) +Granular.setTimeStep!(sim) +Granular.setOutputFileInterval!(sim, .01) + +Granular.run!(sim) + +Granular.writeSimulation(sim, + filename = "stacked$(ngrains)$(suffix).jld2") + +########## Add indenter ############# + +temp_indent = createSimulation("id=temp_indent") + + +left_edge = round(sim.ocean.origo[1],digits=2) +length = round(sim.ocean.L[1],digits=2) + +width = length/3 +hw_ratio = 0.2 +init_vertex_pos = [(length+left_edge)/2,-0.2] +grain_radius = 0.05 + + +vertex_x = init_vertex_pos[1] +vertex_y = width*hw_ratio*sin((pi/width)*vertex_x) + + +for i = 0:grain_radius*2:width#manipulate the ocean grid + + x_pos = i + + y_pos = width*hw_ratio*sin(pi/width*x_pos) + + Granular.addGrainCylindrical!(temp_indent, + [x_pos+init_vertex_pos[1]-width/2,y_pos+vertex_y+init_vertex_pos[2]], + grain_radius, + 0.1, + fixed = true, + lin_vel = [0.0,0.5]) +end + +append!(sim.grains,temp_indent.grains) + +Granular.fitGridToGrains!(sim, + sim.ocean, + north_padding = 3.0, + verbose=false) + + +sim.time_iteration = 0 +sim.time = 0.0 +sim.file_time_since_output_file = 0. +Granular.setTotalTime!(sim, 0.5) +Granular.setTimeStep!(sim) +Granular.setOutputFileInterval!(sim, .01) + +while sim.time < sim.time_total + for grain in carpet.grains + if grain.lin_vel[2] < 0 #&& grain.lin_pos[2] < r_min #find some lower boundary here? + grain.lin_vel[1:2] = [0.,0.] + end + end + Granular.run!(sim,single_step=true) +end + +Granular.writeSimulation(sim, + filename = "indented$(ngrains)_test.jld2") + + +#print time elapsed +t_now = Dates.now() +dur = Dates.canonicalize(t_now-t_start) +print("Time elapsed: ",dur)