| tInitial commit - granular-basin - tectonic deformation experiments with Granul… | |
| git clone git://src.adamsgaard.dk/granular-basin | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 125e84ccadfa1ace469d3fe5e2b64e9969770e28 | |
| parent a3f32f2fadbc2f1d084ed8d1a9ffc65c4fbb1fa5 | |
| Author: esbenpalmstrom <[email protected]> | |
| Date: Mon, 22 Nov 2021 21:00:58 +0100 | |
| Initial commit | |
| Diffstat: | |
| A pipeline_test.jl | 277 +++++++++++++++++++++++++++++… | |
| 1 file changed, 277 insertions(+), 0 deletions(-) | |
| --- | |
| diff --git a/pipeline_test.jl b/pipeline_test.jl | |
| t@@ -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 … | |
| + | |
| +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_d… | |
| + verbose = false) | |
| + | |
| + end | |
| + | |
| + Granular.fitGridToGrains!(sim,sim.ocean,verbose=false) | |
| + Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "north south… | |
| + verbose=fa… | |
| + Granular.setGridBoundaryConditions!(sim.ocean, "impermeable", "east west", | |
| + verbose=fa… | |
| + 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+ve… | |
| + 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 … | |
| + 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) |