Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl # fast
git clone https://src.adamsgaard.dk/Granular.jl.git # slow
Log | Files | Refs | README | LICENSE Back to index

temporal.jl (5690B)


      1 export setTotalTime!
      2 """
      3     setTotalTime!(simulation::Simulation, t::Float64)
      4 
      5 Sets the total simulation time of the `simulation` object to `t`, with parameter 
      6 value checks.
      7 """
      8 function setTotalTime!(simulation::Simulation, t::Float64)
      9     if t <= 0.0
     10         error("Total time should be a positive value (t = $t s)")
     11     end
     12     simulation.time_total = t
     13     nothing
     14 end
     15 
     16 export setCurrentTime!
     17 """
     18     setCurrentTime!(simulation::Simulation, t::Float64)
     19 
     20 Sets the current simulation time of the `simulation` object to `t`, with 
     21 parameter value checks.
     22 """
     23 function setCurrentTime!(simulation::Simulation, t::Float64)
     24     if t <= 0.0
     25         error("Current time should be a positive value (t = $t s)")
     26     end
     27     simulation.time = t
     28     nothing
     29 end
     30 
     31 export incrementCurrentTime!
     32 """
     33     incrementCurrentTime!(simulation::Simulation, t::Float64)
     34 
     35 Sets the current simulation time of the `simulation` object to `t`, with 
     36 parameter value checks.
     37 """
     38 function incrementCurrentTime!(simulation::Simulation, t::Float64)
     39     if t <= 0.0
     40         error("Current time increment should be a positive value (t = $t s)")
     41     end
     42     simulation.time += t
     43     simulation.file_time_since_output_file += t
     44     nothing
     45 end
     46 
     47 export setOutputFileInterval!
     48 """
     49    setOutputFileInterval!(simulation::Simulation, t::Float64)
     50 
     51 Sets the simulation-time interval between output files are written to disk.  If 
     52 this value is zero or negative, no output files will be written.
     53 """
     54 function setOutputFileInterval!(simulation::Simulation, t::Float64; 
     55     verbose=true)
     56     if t <= 0.0 && verbose
     57         @info "No output files will be written"
     58     end
     59     simulation.file_time_step = t
     60     nothing
     61 end
     62 
     63 export disableOutputFiles!
     64 "Disables the write of output files to disk during a simulation."
     65 function disableOutputFiles!(simulation::Simulation)
     66     simulation.file_time_step = 0.0
     67     nothing
     68 end
     69 
     70 export checkTimeParameters
     71 "Checks if simulation temporal parameters are of reasonable values."
     72 function checkTimeParameters(simulation::Simulation; single_step::Bool=false)
     73     if !single_step && (simulation.time_total <= 0.0 || simulation.time_total <= 
     74                         simulation.time)
     75         error("Total time should be positive and larger than current " *
     76             "time.\n  t_total = $(simulation.time_total) s, " *
     77             "t = $(simulation.time) s")
     78     end
     79     if simulation.time_step <= 0.0
     80         error("Time step should be positive (t = $(simulation.time_step))")
     81     end
     82     nothing
     83 end
     84 
     85 export findSmallestGrainMass
     86 "Finds the smallest mass of all grains in a simulation.  Used to determine 
     87 the optimal time step length."
     88 function findSmallestGrainMass(simulation::Simulation)
     89     m_min = 1e20
     90     i_min = -1
     91     for i=1:length(simulation.grains)
     92         @inbounds grain = simulation.grains[i]
     93         if grain.mass < m_min
     94             m_min = grain.mass
     95             i_min = i
     96         end
     97     end
     98     return m_min, i_min
     99 end
    100 
    101 export findLargestGrainStiffness
    102 "Finds the largest elastic stiffness of all grains in a simulation.  Used to 
    103 determine the optimal time step length."
    104 function findLargestGrainStiffness(simulation::Simulation)
    105     k_n_max = 0.
    106     k_t_max = 0.
    107     i_n_max = -1
    108     i_t_max = -1
    109     for i=1:length(simulation.grains)
    110 
    111         @inbounds grain = simulation.grains[i]
    112 
    113         if grain.youngs_modulus > 0.
    114             k_n = grain.youngs_modulus*grain.thickness  # A = h*r
    115             k_t = k_n * 2. * (1. - grain.poissons_ratio^2.)/
    116                 ((2. - grain.poissons_ratio) * (1. + grain.poissons_ratio))
    117         else
    118             k_n = grain.contact_stiffness_normal
    119             k_t = grain.contact_stiffness_tangential
    120         end
    121 
    122         if k_n > k_n_max
    123             k_n_max = k_n
    124             i_n_max = i
    125         end
    126         if k_t > k_t_max
    127             k_t_max = k_t
    128             i_t_max = i
    129         end
    130     end
    131     return k_n_max, k_t_max, i_n_max, i_t_max
    132 end
    133 
    134 export setTimeStep!
    135 """
    136     setTimeStep!(simulation[, epsilon, verbose])
    137 
    138 Find the computational time step length suitable given the grain radii, contact
    139 stiffnesses, and grain density. Uses the scheme by Radjaii et al. 2011.
    140 
    141 # Arguments
    142 * `simulation::Simulation`: the simulation object to modify.
    143 * `epsilon::Float64=0.07`: safety factor in the time step scheme. Larger values
    144     are more likely to cause unstable behavior than smaller values.
    145 * `verbose::Bool=true`: display the resultant time step in the console.
    146 """
    147 function setTimeStep!(simulation::Simulation;
    148                       epsilon::Float64=0.07, verbose::Bool=true)
    149 
    150     if length(simulation.grains) < 1
    151         error("At least 1 grain is needed to find the computational time step.")
    152     end
    153 
    154     k_n_max, k_t_max, _, _ = findLargestGrainStiffness(simulation)
    155     m_min, _ = findSmallestGrainMass(simulation)
    156 
    157     simulation.time_step = epsilon/(sqrt(maximum([k_n_max, k_t_max])/m_min))
    158 
    159     if simulation.time_step <= 1.0e-20
    160         error("Time step too small or negative ($(simulation.time_step) s)")
    161     end
    162 
    163     if verbose
    164         @info "Time step length t=$(simulation.time_step) s"
    165     end
    166     nothing
    167 end
    168 
    169 export resetTime!
    170 """
    171     resetTime!(simulation)
    172 
    173 Reset the current time to zero, and reset output file counters in order to
    174 restart a simulation.  This function does not overwrite the time step
    175 (`Simulation.time_step`), the output
    176 file interval (`Simulation.file_time_step`), or the total simulation time
    177 (`Simulation.time_total`).
    178 
    179 # Arguments
    180 * `simulation::Simulation`: the simulation object for which to reset the
    181     temporal parameters.
    182 """
    183 function resetTime!(sim::Simulation)
    184     sim.time_iteration = 0
    185     sim.time = 0.0
    186     sim.file_number = 0
    187     sim.file_time_since_output_file = 0.
    188 end
    189