tfixed compaction and init, added layering. Carpet mechanical property manipulation still needs to be tested. - granular-basin - tectonic deformation experiments with Granular.jl
 (HTM) git clone git://src.adamsgaard.dk/granular-basin
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit e2df704fb21f7b57fc8060bd864671ac806569e5
 (DIR) parent 7170f28747ab13c1bb5994097d53fce776f5a129
 (HTM) Author: esbenpalmstrom <esbenpalmstroem@gmail.com>
       Date:   Mon, 22 Nov 2021 10:15:25 +0100
       
       fixed compaction and init, added layering.
       Carpet mechanical property manipulation still needs to be tested.
       
       Diffstat:
         M compact_basin.jl                    |      23 ++++++++++++++---------
         M init_basin.jl                       |      31 +++++++++++++++----------------
         A layer_basin.jl                      |      89 +++++++++++++++++++++++++++++++
       
       3 files changed, 118 insertions(+), 25 deletions(-)
       ---
 (DIR) diff --git a/compact_basin.jl b/compact_basin.jl
       t@@ -8,19 +8,23 @@ t_start = Dates.now() # Save the start time, print the end time later.
        # lav en lille test? se om dit appendede carpet stadig er forbundet til hoved-
        # simulationsobjektet
        
       -
       -id = "simulation500"    # id of simulation to load
       +id = "simulation200"    # id of simulation to load
        N = 20e3                # amount of stress to be applied
       -t_comp = 0.2            #compaction max duration [s]
       +t_comp = 5.0            # compaction max duration [s]
        
        sim = Granular.readSimulation("$(id)/init.jld2")
        carpet = Granular.readSimulation("$(id)/carpet.jld2")
        SimSettings = SimSettings = JLD2.load("$(id)/SimSettings.jld2")
        
       +#mkpath("$(id)/compaction-N$(N)Pa")
        
       -sim.id = "compaction-N$(N)Pa_Grains$(SimSettings["ngrains"])"
       +cd("$id")
       +sim.id = "compaction-N$(N)Pa"
       +#sim.id = "$(id)/compaction-N$(N)Pa"
        SimSettings["N"] = N
        
       +
       +
        Granular.zeroKinematics!(sim)
        
        Granular.zeroKinematics!(carpet)
       t@@ -40,13 +44,13 @@ Granular.addWallLinearFrictionless!(sim, [0., 1.],y_top,
        
        Granular.fitGridToGrains!(sim,sim.ocean)
        
       -
        y_bot = Inf
        for grain in sim.grains
            if y_bot > grain.lin_pos[2] - grain.contact_radius
                global y_bot = grain.lin_pos[2] - grain.contact_radius
            end
        end
       +
        fixed_thickness = 2. * SimSettings["r_max"]
        for grain in sim.grains
            if grain.lin_pos[2] <= fixed_thickness
       t@@ -61,10 +65,9 @@ time = Float64[]
        compaction = Float64[]
        effective_normal_stress = Float64[]
        
       -
        while sim.time < sim.time_total
        
       -    for i = 1:100 #run for a while before measuring the state of the top wall
       +    for i = 1:100 # run for a while before measuring the state of the top wall
                Granular.run!(sim, single_step=true)
            end
        
       t@@ -74,8 +77,6 @@ while sim.time < sim.time_total
        
        end
        
       -
       -
        defined_normal_stress = (ones(size(effective_normal_stress,1)))
            *(Granular.getWallNormalStress(sim, stress_type="effective"))
        
       t@@ -93,4 +94,8 @@ PyPlot.ylabel("Normal stress [Pa]")
        PyPlot.savefig(sim.id * "-time_vs_compaction-stress.pdf")
        PyPlot.clf()
        
       +cd("..")
       +
       +JLD2.save("simulation$(ngrains)/SimSettings.jld2", SimSettings)
       +
        Granular.writeSimulation(sim,filename = "$(id)/comp.jld2")
 (DIR) diff --git a/init_basin.jl b/init_basin.jl
       t@@ -3,7 +3,7 @@ import JLD2
        import PyPlot
        import Dates
        
       -t_start = Dates.now() # Save the start time, print the end time later.
       +t_start = Dates.now()           # Save the start time, print the end time later.
        
        ############# Initialization Settings #############
        
       t@@ -12,13 +12,13 @@ t_stack = 0.5                   # duration for each stack to settle [s]
        
        g = [0.,-9.8]                   # vector for direction and magnitude of gravitational acceleration of grains
        
       -ngrains = 40000                  # total number of grains
       -aspect_ratio = 2              #should be x times as wide as it is tall
       +ngrains = 200                 # total number of grains
       +aspect_ratio = 2                # should be x times as wide as it is tall
        
        stacks = 2                      # number of duplicate stacks on top of the initial grains
        
        ny = sqrt((ngrains)/aspect_ratio)    # number of grain rows
       -nx = aspect_ratio*ny*(stacks+1)          # number of grain columns
       +nx = aspect_ratio*ny*(stacks+1)      # number of grain columns
        
        ny = Int(round(ny/(stacks+1)))
        nx = Int(round(nx/(stacks+1)))
       t@@ -54,11 +54,11 @@ SimSettings["r_max"] = r_max
        
        sim = Granular.createSimulation(id="simulation$(ngrains)")
        
       -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
       +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,
       t@@ -109,8 +109,8 @@ 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
       +        if y_top < grain.lin_pos[2]
       +            global y_top = grain.lin_pos[2]
                end
            end
        
       t@@ -118,9 +118,9 @@ for i = 1:stacks
            # add duplicate grains above the initialized grains
            for grain in temp.grains
        
       -        lin_pos_lifted = [0.0,0.0] # preallocation of position of a 'lifted' grain
       -        lin_pos_lifted[1] = grain.lin_pos[1] # x position of duplicate grain
       -        lin_pos_lifted[2] = grain.lin_pos[2] + y_top + r_max # y-position of duplicate grain
       +        lin_pos_lifted = [0.0,0.0]                              # preallocation of position of a 'lifted' grain
       +        lin_pos_lifted[1] = grain.lin_pos[1]                    # x position of duplicate grain
       +        lin_pos_lifted[2] = grain.lin_pos[2] + y_top + r_max    # y-position of duplicate grain
        
        
                Granular.addGrainCylindrical!(sim,
       t@@ -226,8 +226,7 @@ Granular.writeSimulation(carpet,
        
        JLD2.save("simulation$(ngrains)/SimSettings.jld2", SimSettings)
        
       -
       -#print time elapsed
       +# print time elapsed
        t_now = Dates.now()
        dur = Dates.canonicalize(t_now-t_start)
        print("Time elapsed: ",dur)
 (DIR) diff --git a/layer_basin.jl b/layer_basin.jl
       t@@ -0,0 +1,89 @@
       +import Granular
       +import JLD2
       +import PyPlot
       +import Dates
       +
       +id = "simulation200"    # id of simulation to load, just write the folder
       +                        # name here
       +
       +# Layer interface positions
       +# defined as decimals
       +# ex: [0.4,0.6,1] will give two boundaries at 0.4 from the bottom
       +# and 0.6 from the bottom. ie 3 layers
       +# include 1 in the end as roof.
       +interfaces = [0,0.4,0.6,1]
       +
       +# mechanical properties for each layer
       +youngs_modulus = [2e7,2e7,2e7]              # elastic modulus
       +poissons_ratio = [0.185,0.200,0.185]        # shear stiffness ratio
       +tensile_strength = [0.0,0.0,0.0]            # strength of bonds between grains
       +contact_dynamic_friction = [0.4,0.4,0.4]    # friction between grains
       +rotating = [true,true,true]                 # can grains rotate or not
       +
       +sim = Granular.readSimulation("$(id)/comp.jld2")
       +carpet = Granular.readSimulation("$(id)/carpet.jld2")
       +SimSettings = SimSettings = JLD2.load("$(id)/SimSettings.jld2")
       +
       +Granular.zeroKinematics!(sim)       # end any movement
       +Granular.zeroKinematics!(carpet)    # end any movement
       +
       +y_top = -Inf
       +for grain in sim.grains
       +    grain.contact_viscosity_normal = 0
       +    if y_top < grain.lin_pos[2] + grain.contact_radius
       +        global y_top = grain.lin_pos[2] + grain.contact_radius
       +    end
       +end
       +
       +y_bot = Inf
       +for grain in sim.grains
       +    if y_bot > grain.lin_pos[2] - grain.contact_radius
       +        global y_bot = grain.lin_pos[2] - grain.contact_radius
       +    end
       +end
       +
       +h = y_top-y_bot
       +
       +for grain in sim.grains
       +
       +    for i = 2:size(interfaces,1)
       +
       +        if grain.lin_pos[2] <= interfaces[i] && grain.lin_pos[2] > interfaces[i-1]
       +
       +            grain.youngs_modulus = youngs_modulus[i-1]
       +            grain.poissons_ratio = poissons_ratio[i-1]
       +            grain.tensile_strength = tensile_strength[i-1]
       +            grain.contact_dynamic_friction = contact_dynamic_friction[i-1]
       +            grain.rotating = rotating[i-1]
       +
       +        end
       +
       +    end
       +
       +end
       +
       +#set the mechanical settings for the carpet
       +for grain in carpet.grains
       +    grain.youngs_modulus = youngs_modulus[2]
       +    grain.poissons_ratio = poissons_ratio[2]
       +    grain.tensile_strength = tensile_strength[2]
       +    grain.contact_dynamic_friction = contact_dynamic_friction[2]
       +    grain.rotating = rotating[2]
       +end
       +
       +"""
       +cd("$id")
       +sim.id = "layered"
       +
       +Granular.resetTime!(sim)
       +Granular.setTotalTime!(sim,0.3)
       +Granular.run!(sim)
       +
       +cd("..")
       +"""
       +
       +Granular.writeSimulation(sim,
       +                        filename = "$(id)/layered.jld2")
       +
       +Granular.writeSimulation(carpet,
       +                        filename = "$(id)/carpet.jld2")