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

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)))