datatypes.jl (12039B)
1 ## Particle composite types 2 mutable struct GrainCylindrical 3 4 # Material properties 5 density::Float64 6 7 # Geometrical parameters 8 thickness::Float64 9 contact_radius::Float64 10 areal_radius::Float64 11 circumreference::Float64 12 horizontal_surface_area::Float64 13 side_surface_area::Float64 14 volume::Float64 15 mass::Float64 16 moment_of_inertia::Float64 17 18 # Linear kinematic degrees of freedom along horizontal plane 19 lin_pos::Vector{Float64} 20 lin_vel::Vector{Float64} 21 lin_acc::Vector{Float64} 22 force::Vector{Float64} 23 external_body_force::Vector{Float64} 24 lin_disp::Vector{Float64} 25 26 # Angular kinematic degrees of freedom for vertical rotation around center 27 ang_pos::Vector{Float64} 28 ang_vel::Vector{Float64} 29 ang_acc::Vector{Float64} 30 torque::Vector{Float64} 31 32 # Kinematic constraint flags 33 fixed::Bool 34 allow_x_acc::Bool 35 allow_y_acc::Bool 36 allow_z_acc::Bool 37 rotating::Bool 38 enabled::Bool 39 40 # Rheological parameters 41 contact_stiffness_normal::Float64 42 contact_stiffness_tangential::Float64 43 contact_viscosity_normal::Float64 44 contact_viscosity_tangential::Float64 45 contact_static_friction::Float64 46 contact_dynamic_friction::Float64 47 48 youngs_modulus::Float64 49 poissons_ratio::Float64 50 tensile_strength::Float64 51 shear_strength::Float64 52 strength_heal_rate::Float64 53 fracture_toughness::Float64 54 55 # Ocean/atmosphere interaction parameters 56 ocean_drag_coeff_vert::Float64 57 ocean_drag_coeff_horiz::Float64 58 atmosphere_drag_coeff_vert::Float64 59 atmosphere_drag_coeff_horiz::Float64 60 61 # Interaction 62 pressure::Float64 63 n_contacts::Int 64 ocean_grid_pos::Vector{Int} 65 atmosphere_grid_pos::Vector{Int} 66 contacts::Vector{Int} 67 position_vector::Vector{Vector{Float64}} 68 contact_parallel_displacement::Vector{Vector{Float64}} 69 contact_rotation::Vector{Vector{Float64}} 70 contact_age::Vector{Float64} 71 contact_area::Vector{Float64} 72 compressive_failure::Vector{Bool} 73 74 granular_stress::Vector{Float64} 75 ocean_stress::Vector{Float64} 76 atmosphere_stress::Vector{Float64} 77 78 thermal_energy::Float64 79 80 # Visualization parameters 81 color::Int 82 end 83 84 # Type for linear (flat) and frictionless dynamic walls 85 mutable struct WallLinearFrictionless 86 normal::Vector{Float64} # Wall-face normal vector 87 pos::Float64 # Position along axis parallel to normal vector 88 bc::String # Boundary condition 89 mass::Float64 # Mass, used when bc != "fixed" 90 thickness::Float64 # Wall thickness 91 surface_area::Float64 # Wall surface area 92 normal_stress::Float64 # Normal stress when bc == "normal stress" 93 vel::Float64 # Velocity (constant when bc == "normal stress") 94 acc::Float64 # Acceleration (zero when bc == "velocity") 95 force::Float64 # Sum of normal forces on wall 96 contact_viscosity_normal::Float64 # Wall-normal contact viscosity 97 end 98 99 # Type for gathering data from grain objects into single arrays 100 mutable struct GrainArrays 101 102 # Material properties 103 density::Vector{Float64} 104 105 # Geometrical parameters 106 thickness::Vector{Float64} 107 contact_radius::Vector{Float64} 108 areal_radius::Vector{Float64} 109 circumreference::Vector{Float64} 110 horizontal_surface_area::Vector{Float64} 111 side_surface_area::Vector{Float64} 112 volume::Vector{Float64} 113 mass::Vector{Float64} 114 moment_of_inertia::Vector{Float64} 115 116 # Linear kinematic degrees of freedom along horizontal plane 117 lin_pos::Array{Float64, 2} 118 lin_vel::Array{Float64, 2} 119 lin_acc::Array{Float64, 2} 120 force::Array{Float64, 2} 121 external_body_force::Array{Float64, 2} 122 lin_disp::Array{Float64, 2} 123 124 # Angular kinematic degrees of freedom for vertical rotation around center 125 ang_pos::Array{Float64, 2} 126 ang_vel::Array{Float64, 2} 127 ang_acc::Array{Float64, 2} 128 torque::Array{Float64, 2} 129 130 # Kinematic constraint flags 131 fixed::Vector{Int} 132 allow_x_acc::Vector{Int} 133 allow_y_acc::Vector{Int} 134 allow_z_acc::Vector{Int} 135 rotating::Vector{Int} 136 enabled::Vector{Int} 137 138 # Rheological parameters 139 contact_stiffness_normal::Vector{Float64} 140 contact_stiffness_tangential::Vector{Float64} 141 contact_viscosity_normal::Vector{Float64} 142 contact_viscosity_tangential::Vector{Float64} 143 contact_static_friction::Vector{Float64} 144 contact_dynamic_friction::Vector{Float64} 145 146 youngs_modulus::Vector{Float64} 147 poissons_ratio::Vector{Float64} 148 tensile_strength::Vector{Float64} 149 shear_strength::Vector{Float64} 150 strength_heal_rate::Vector{Float64} 151 fracture_toughness::Vector{Float64} 152 153 ocean_drag_coeff_vert::Vector{Float64} 154 ocean_drag_coeff_horiz::Vector{Float64} 155 atmosphere_drag_coeff_vert::Vector{Float64} 156 atmosphere_drag_coeff_horiz::Vector{Float64} 157 158 pressure::Vector{Float64} 159 n_contacts::Vector{Int} 160 161 granular_stress::Array{Float64, 2} 162 ocean_stress::Array{Float64, 2} 163 atmosphere_stress::Array{Float64, 2} 164 165 thermal_energy::Vector{Float64} 166 167 color::Vector{Int} 168 end 169 170 #= 171 Type containing all relevant data from MOM6 NetCDF files. The ocean grid is a 172 staggered of Arakawa-B type, with south-west convention centered on the 173 h-points. During read, the velocities are interpolated to the cell corners 174 (q-points). 175 176 q( i,j+1) ------------------ q(i+1,j+1) 177 | | 178 | | 179 | | 180 | | 181 | h( i, j) | 182 | | 183 | | 184 | | 185 | | 186 q( i, j) ------------------ q(i+1, j) 187 188 # Fields 189 * `input_file::String`: path to input NetCDF file 190 * `time::Array{Float64, 1}`: time in days 191 * `xq::Array{Float64, 2}`: nominal longitude of q-points [degrees_E] 192 * `yq::Array{Float64, 2}`: nominal latitude of q-points [degrees_N] 193 * `xh::Array{Float64, 2}`: nominal longitude of h-points [degrees_E] 194 * `yh::Array{Float64, 2}`: nominal latitude of h-points [degrees_N] 195 * `zl::Array{Float64, 1}`: layer target potential density [kg m^-3] 196 * `zi::Array{Float64, 1}`: interface target potential density [kg m^-3] 197 * `u::Array{Float64, Int}`: zonal velocity (positive towards west) [m/s], 198 dimensions correspond to placement in `[xq, yq, zl, time]`. 199 * `v::Array{Float64, Int}`: meridional velocity (positive towards north) [m/s], 200 dimensions correspond to placement in `[xq, yq, zl, time]`. 201 * `h::Array{Float64, Int}`: layer thickness [m], dimensions correspond to 202 placement in `[xh, yh, zl, time]`. 203 * `e::Array{Float64, Int}`: interface height relative to mean sea level [m], 204 dimensions correspond to placement in `[xh, yh, zi, time]`. 205 * `grain_list::Array{Float64, Int}`: indexes of grains contained in the 206 ocean grid cells. 207 * `bc_west::Integer`: Boundary condition type for the west edge of the grid. 208 1: inactive, 209 2: periodic 210 * `bc_south::Integer`: Boundary condition type for the south edge of the grid. 211 1: inactive, 212 2: periodic 213 * `bc_east::Integer`: Boundary condition type for the east edge of the grid. 214 1: inactive, 215 2: periodic 216 * `bc_north::Integer`: Boundary condition type for the north edge of the grid. 217 1: inactive, 218 2: periodic 219 =# 220 mutable struct Ocean 221 input_file::Any 222 223 time::Vector{Float64} 224 225 # q-point (cell corner) positions 226 xq::Array{Float64, 2} 227 yq::Array{Float64, 2} 228 229 # h-point (cell center) positions 230 xh::Array{Float64, 2} 231 yh::Array{Float64, 2} 232 233 # Vertical positions 234 zl::Vector{Float64} 235 zi::Vector{Float64} 236 237 # Field values 238 u::Array{Float64, 4} 239 v::Array{Float64, 4} 240 h::Array{Float64, 4} 241 e::Array{Float64, 4} 242 243 # Grains in grid cells 244 grain_list::Array{Vector{Int}, 2} 245 porosity::Array{Float64, 2} 246 247 # Boundary conditions for grains 248 bc_west::Integer 249 bc_south::Integer 250 bc_east::Integer 251 bc_north::Integer 252 253 # If the grid is regular, allow for simpler particle sorting 254 regular_grid::Bool 255 256 # Grid size when regular_grid == true 257 origo::Vector{Float64} # Grid origo 258 L::Vector{Float64} # Grid length 259 n::Vector{Integer} # Cell count 260 dx::Vector{Float64} # Cell size 261 end 262 263 #= 264 The atmosphere grid is a staggered of Arakawa-B type, with south-west convention 265 centered on the h-points. During read, the velocities are interpolated to the 266 cell corners (q-points). 267 268 q( i,j+1) ------------------ q(i+1,j+1) 269 | | 270 | | 271 | | 272 | | 273 | h( i, j) | 274 | | 275 | | 276 | | 277 | | 278 q( i, j) ------------------ q(i+1, j) 279 280 # Fields 281 * `input_file::String`: path to input NetCDF file 282 * `time::Vector{Float64}`: time in days 283 * `xq::Array{Float64, 2}`: nominal longitude of q-points [degrees_E] 284 * `yq::Array{Float64, 2}`: nominal latitude of q-points [degrees_N] 285 * `xh::Array{Float64, 2}`: nominal longitude of h-points [degrees_E] 286 * `yh::Array{Float64, 2}`: nominal latitude of h-points [degrees_N] 287 * `zl::Vector{Float64}`: vertical position [m] 288 * `u::Array{Float64, Int}`: zonal velocity (positive towards west) [m/s], 289 dimensions correspond to placement in `[xq, yq, zl, time]`. 290 * `v::Array{Float64, Int}`: meridional velocity (positive towards north) [m/s], 291 dimensions correspond to placement in `[xq, yq, zl, time]`. 292 * `grain_list::Array{Float64, Int}`: interface height relative to mean sea 293 level [m], dimensions correspond to placement in `[xh, yh, zi, time]`. 294 * `bc_west::Integer`: Boundary condition type for the west edge of the grid. 295 1: inactive, 296 2: periodic 297 * `bc_south::Integer`: Boundary condition type for the south edge of the grid. 298 1: inactive, 299 2: periodic 300 * `bc_east::Integer`: Boundary condition type for the east edge of the grid. 301 1: inactive, 302 2: periodic 303 * `bc_north::Integer`: Boundary condition type for the north edge of the grid. 304 1: inactive, 305 2: periodic 306 =# 307 mutable struct Atmosphere 308 input_file::Any 309 310 time::Vector{Float64} 311 312 # q-point (cell corner) positions 313 xq::Array{Float64, 2} 314 yq::Array{Float64, 2} 315 316 # h-point (cell center) positions 317 xh::Array{Float64, 2} 318 yh::Array{Float64, 2} 319 320 # Vertical positions 321 zl::Vector{Float64} 322 323 # Field values 324 u::Array{Float64, 4} 325 v::Array{Float64, 4} 326 327 # Grains in grid cells 328 grain_list::Array{Vector{Int}, 2} 329 porosity::Array{Float64, 2} 330 331 # Boundary conditions for grains 332 bc_west::Integer 333 bc_south::Integer 334 bc_east::Integer 335 bc_north::Integer 336 337 # If true the grid positions are identical to the ocean grid 338 collocated_with_ocean_grid::Bool 339 340 # If the grid is regular, allow for simpler particle sorting 341 regular_grid::Bool 342 343 # Grid size when regular_grid == true 344 origo::Vector{Float64} # Grid origo 345 L::Vector{Float64} # Grid length 346 n::Vector{Integer} # Cell count 347 dx::Vector{Float64} # Cell size 348 end 349 350 # Top-level simulation type 351 mutable struct Simulation 352 id::String 353 354 time_iteration::Int 355 time::Float64 356 time_total::Float64 357 time_step::Float64 358 file_time_step::Float64 359 file_number::Int 360 file_time_since_output_file::Float64 361 362 grains::Vector{GrainCylindrical} 363 364 ocean::Ocean 365 atmosphere::Atmosphere 366 367 Nc_max::Int 368 369 walls::Vector{WallLinearFrictionless} 370 end 371 372 # Mappings between boundary condition keys (Integers) and strings 373 const grid_bc_strings = ["inactive", "periodic", "impermeable"] 374 const grid_bc_flags = Dict(zip(grid_bc_strings, 1:length(grid_bc_strings)))