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