Particle_Sphere class
Contents
Description
This is a sub-class of the Particle class for the implementation of Sphere particles.
A sphere particle behaves as a disk in a 2D model, but its properties are computed assuming that it is a 3D body.
classdef Particle_Sphere < Particle
Public properties
properties (SetAccess = public, GetAccess = public)
% Geometric properties
radius double = double.empty; % radius
end
Constructor method
methods
function this = Particle_Sphere()
this = this@Particle(Particle.SPHERE);
this.setDefaultProps();
end
end
Public methods: implementation of super-class declarations
methods
%------------------------------------------------------------------
function setDefaultProps(this)
% Neighbours Interactions
this.por_freq = NaN; % never compute
% Behavior flags
this.free_trl = true;
this.free_rot = true;
this.free_therm = true;
% Forcing terms
this.force = [0;0];
this.torque = 0;
this.heat_rate = 0;
% Mechanical state variables
this.veloc_trl = [0;0];
this.veloc_rot = 0;
this.accel_trl = [0;0];
this.accel_rot = 0;
% Thermal state variables
this.temperature = 0;
this.temp_change = 0;
end
%------------------------------------------------------------------
function setCharLen(this)
this.char_len = 2 * this.radius;
end
%------------------------------------------------------------------
function setSurface(this)
this.surface = 4 * pi * this.radius^2;
end
%------------------------------------------------------------------
function setCrossSec(this)
this.cross = pi * this.radius^2;
end
%------------------------------------------------------------------
function setVolume(this)
this.volume = 4 * pi * this.radius^3/3;
end
%------------------------------------------------------------------
function setMInertia(this)
this.minertia = 2 * this.mass * this.radius^2/5;
end
%------------------------------------------------------------------
function setLocalPorosity(this,por)
% Set prescribed value
if (~isempty(por))
this.porosity = por;
return;
end
% Vector of interacting particles
% Assumption: porosity computed only with interacting neighbours
P = [this,this.neigh_p(isvalid(this.neigh_p))];
% Total volume of alpha-shape polygon with interacting particles centroids
% Assumption: in-plane projection area (unity depth)
vt = area(alphaShape([P.coord]',inf));
% Avoid null volume (single particle or aligned particles)
if (vt ~= 0)
% Total volume of particles
% Assumption:
% 1. In-plane cross-sectional area (unity depth).
% 2. Average particles radius and polygon interior angle.
ravg = mean([P.radius]);
vp = (length(P)-2) * pi * ravg^2 / 2;
% Local porosity
this.porosity = 1 - vp/vt;
else
% Assumption: negleting particles volume
this.porosity = 1;
end
end
%------------------------------------------------------------------
function [x1,y1,x2,y2] = getBBoxLimits(this)
x1 = this.coord(1) - this.radius;
y1 = this.coord(2) - this.radius;
x2 = this.coord(1) + this.radius;
y2 = this.coord(2) + this.radius;
end
end
end