migflow.scontact¶
Model for Immersed Granular Flow: Fluid user interface
Contact: jonathan.lambrechts@uclouvain.be Webpage: www.migflow.be
MigFlow computes immersed granular flows using an unresolved FEM-DEM model. The continuous phase (mixture) is computed by solving averaged Navier-Stokes equations on unstructured meshes with the continuous finite element method.
-
class
migflow.scontact.ParticleProblem(dim)¶ Bases:
objectCreates the numerical structure containing all the physical particles that appear in the problem
Builds the particle problem structure.
Parameters: dim (
int) – Dimension of the problemRaises: ValueError– If the dimension differs from 2 or 3NameError– If C builder cannot be found
-
__del__()¶ Deletes the particle solver structure.
-
add_body(x, invertM, invertI)¶ Adds a body in the particle problem. — Only in 2D
Parameters: - x (
ndarray) – array of the position of the body - InvertM – inverse mass of the body
- InvertI – inverse inertia of the body
Returns: body id
Return type: int
- x (
-
add_boundary_periodic_entity(dim, transform)¶ Adds a periodic entity .
Parameters: - dim (
int) – dimension of the entity - transform (
ndarray) – array of the transformation to applied to the periodic entity
- dim (
-
add_boundary_periodic_point(x, tag)¶ Adds a boundary periodic point.
Parameters: - x (
ndarray) – array of the coordinates of the point - tag (
int) – entity tag
- x (
-
add_boundary_periodic_segment(x0, x1, tag)¶ Adds a boundary periodic segment.
Parameters: - x0 (
ndarray) – array of the coordinates of the first endpoint - x1 (
ndarray) – array of the coordinates of the second endpoint - tag (
int) – entity tag
- x0 (
-
add_boundary_periodic_triangle(x0, x1, x2, tag)¶ Adds a boundary periodic triangle.
Parameters: - x0 (
ndarray) – array of the coordinates of the first summit - x1 (
ndarray) – array of the coordinates of the second summit - x2 (
ndarray) – array of the coordinates of the third summit - tag (
int) – tag of the periodic entity
- x0 (
-
add_boundary_segment(x0, x1, tag, material='default', r=0)¶ Adds a boundary segment.
Parameters: - x0 (
ndarray) – array of the coordinates of the first endpoint - x1 (
ndarray) – array of the coordinates of the second endpoint - tag (
str) – segment tag - r – if != 0, the segment is a cylinder
- material (
str) – segment material
- x0 (
-
add_boundary_triangle(x0, x1, x2, tag, material='default')¶ Adds a boundary triangle.
Parameters: - x0 (
ndarray) – array of the coordinates of the first summit - x1 (
ndarray) – array of the coordinates of the second summit - x2 (
ndarray) – array of the coordinates of the third summit - tag (
str) – triangle tag - material (
str) – triangle material
- x0 (
-
add_boundary_triangle_framed(x0, x1, x2, tag, material='default')¶ Adds a boundary triangle with segments framing it.
Parameters: - x0 (
ndarray) – array of the coordinates of the first summit - x1 (
ndarray) – array of the coordinates of the second summit - x2 (
ndarray) – array of the coordinates of the third summit - tag (
str) – triangle tag - material (
str) – triangle material
- x0 (
-
add_entities(xbody, invertM=0.0, invertI=0.0, particles_coordinates=None, particles_radius=None, particles_materials='default', segments_coordinates=None, segments_tags=None, segments_materials='default', triangles_coordinates=None, triangles_tags=None, triangles_materials='default', is_relative_position=True)¶ Adds entities (either particles, segments or triangles) to a body described by its position, inverse of mass and inverse of inertia.
Parameters: - xbody (np.ndarray) – position of the body
- invertM (float, optional) – inverse mass of the body. Defaults to 0.
- invertI (float, optional) – inverse inertia of the body. Defaults to 0.
- particles_coordinates (np.ndarray, optional) – position of the particles. Defaults to None.
- particles_radius (Union[np.ndarray, float], optional) – array of the particles radii. Defaults to None.
- particles_materials (Union[str, List[str]], optional) – array of the particles material. Defaults to “default”.
- segments_coordinates (np.ndarray, optional) – array of the segments coordinates as n_segments x 2 x dimension. Defaults to None.
- segments_tags (Union[str, List[str]], optional) – array of the segments tags. Defaults to None.
- segments_materials (Union[str, List[str]], optional) – array of the segments materials. Defaults to “default”.
- triangles_coordinates (np.ndarray, optional) – array of the segments coordinates as n_segments x 3 x dimension. Defaults to None.
- triangles_tags (str, optional) – array of the triangles tags. Defaults to None.
- triangles_materials (Union[str, List[str]], optional) – array of the triangles materials. Defaults to “default”.
- is_relative_position (bool, optional) – flag if the given position is the relative position towards the body or the absolute position. Defaults to True.
Returns: body id
Return type: int
-
add_particle(x, r, m, material='default', forced=False, inverse_inertia=None)¶ Adds a particle in the particle container.
Parameters: - x (
ndarray) – array of the particle position - r (
float) – particle radius - m (
float) – particle mass - material (
str) – particle material
Returns: body id
Return type: int
- x (
-
add_particle_body(positions, radii, masses, material='default', forced=False)¶ Adds a body in the particle problem with a list of constituting particles — Only in 2D
Parameters: - positions (
ndarray) – positions of the particles constituting the body - radii (
ndarray) – radii of the particles - masses (
ndarray) – masses of the particles - material (
str) – material of the particles - forced (
bool) – Flag indicating whether the body is forced or not
Returns: body id
Return type: int
- positions (
-
add_particle_to_body(x, r, body, material='default')¶ Adds a particle to a body.
Parameters: - x (
ndarray) – array of the particle positon with respect to the body’s centre of mass - r (
float) – Particle radius - body (
int) – number of the body to which the particle will be added - material (
str) – Particle material
- x (
-
add_particles(x, r, m, material='default', forced=False, inverse_inertia=None)¶ Adds particles in the particle container.
Parameters: - x (
ndarray) – array of tuple to set the centre particle position - r (
ndarray) – array of particle radius - m (
ndarray) – array of particle mass - material (
str) – particle material
Returns: id of the added bodies
Return type: np.ndarray
- x (
-
add_segment_to_body(x0, x1, body, tag, material='default', radius=0)¶ Adds a segment to a body.
Parameters: - x0 (np.ndarray) – array of the coordinates of the first endpoint
- x1 (np.ndarray) – array of the coordinates of the second endpoint
- body (int) – body id
- tag (str) – boundary id associated to the segment
- radius (float) – if not 0, the segment is a cylinder
- material (str) – Segment material
-
add_triangle_to_body(x0, x1, x2, body, tag, material='default')¶ Adds a segment to a body.
Parameters: - x0 (np.ndarray) – array of the coordinates of the first endpoint
- x1 (np.ndarray) – array of the coordinates of the second endpoint
- body (int) – body id
- tag (str) – boundary id associated to the segment
- material (str) – Segment material
-
body_constraint()¶ Returns the invert mases of the bodies. :returns: Array of the body invert masses :rtype: np.ndarray
-
body_invert_inertia()¶ Returns the invert inertias of the bodies. :returns: Array of the body invert inertias :rtype: np.ndarray
-
body_invert_mass()¶ Returns the invert mases of the bodies. :returns: Array of the body invert masses :rtype: np.ndarray
-
body_omega()¶ Returns the angular velocities of the bodies. :returns: Array of the body angular velocities :rtype: np.ndarray
-
body_position()¶ Returns the positions of the bodies. :returns: Array of the body positions :rtype: np.ndarray
-
body_theta()¶ Returns the array of the body angles. :returns: Array of the body angles :rtype: np.ndarray
-
body_velocity()¶ Returns the velocities of the bodies. :returns: Array of the body velocities :rtype: np.ndarray
-
bounding_box(padding_ratio=0.0)¶ Returns the bounding box of the particle problem. :returns: position of the lower left corner, position of the upper right corner :rtype: Tuple[np.ndarray, np.ndarray]
-
compute_relative_position(mass_center, particles_position, theta)¶
-
compute_stress_tensor(nodes, radius)¶ Computes the stress tensor of the granular material :type nodes:
ndarray:param nodes: Array of nodes at which to compute the stress tensor :param r: Radius within which the contact forces will be averagedReturns: Array of stresses on the nodes of the grid Return type: np.ndarray
-
contact_forces()¶ Returns the contact forces on each particle. :returns: Array of the particle contact forces :rtype: np.ndarray
-
contact_heat(ks, young_modulus, poisson_ratio, temperature, isolated_bodies=None)¶ Compute the thermal heat producted by the contact
Parameters: - ks (np.ndarray) – conductibility
- young_modulus (np.ndarray) – Bodies Young modulus
- poisson_ratio (np.ndarray) – Bodies Poisson ratio
- temperature (np.ndarray) – Bodies temperature
- isolated_bodies (np.ndarray, optional) – Bodies which does not produce any heat. Defaults to None.
Raises: ValueError– Wrong shapeReturns: heat producted by the contact for each body.
Return type: np.ndarray
-
contacts()¶ Gives the contacts between the bodies. :returns: Array of contact forces between the particles :rtype: np.ndarray
-
delassus()¶ Returns the delassus operators of the particles. :returns: Array of the particle delassus operators :rtype: np.ndarray
-
dim()¶ Returns the dimension of the particle problem. :returns: Dimension of the problem :rtype: int
-
filter_new_particles(x, r)¶ Return type: ndarray
-
get_boundary_forces(tag='default')¶ Returns the forces acting on a boundary because of the contacts in the global basis. :type tag:
str:param tag: Name of the boundaryReturns: Array of forces on boundary named tag Return type: np.ndarray
-
get_current_quality(tol)¶ - Returns worst current contact quality(min c.space)
- Performs new init of contacts list (copy)
Return type: float
-
get_iters_contacts_solve()¶ Returns the number of iterations in the contacts solver during the iteration :returns: numbers of iterations in the contacts solver during the iteration :rtype: int
-
get_material_id(material)¶ Returns the number associated to a string material. :type material:
str:param material: string material.Returns: number associated to the string material Return type: int
-
get_overall_quality()¶ returns and tracks the worst interpenetration (min c.space) contacts of the entire simulation
Return type: float
-
get_separation_threshold()¶ Get the separation threshold for oriented faces.
Returns: Separation threshold value. Return type: float
-
get_tag_id(tag='default')¶ Returns the number associated to a string tag. :type tag:
str:param tag: string tag.Returns: number associated to the string tag Return type: int
-
get_time_contacts_solve()¶ Returns time spent in the contacts solver during the iteration :returns: time spent in the contacts solver during the iteration :rtype: float
-
get_time_detection()¶ Returns time spent in the detection during the iteration :returns: time spent in the detection during the iteration :rtype: float
-
id()¶ Returns the ids of the particles. :returns: Array of the particle ids :rtype: np.ndarray
-
init_body(reference_position, relative_position, particle_masses, particle_radii, material='default')¶ Return type: int
-
iterate(dt, forces, body_forces=None, tol=1e-08, force_motion=0)¶ - Computes iteratively the set of velocities that respect the non-interpenetration constrain.
- Returns 1 if the computation converged, 0 otherwise.
Parameters: - dt (
float) – Numerical time step - forces (
ndarray) – List of vectors containing the forces applied on the particles - body_forces (
Optional[ndarray]) – List of forces applied to the bodies - tol (
float) – Optional argument defining the interpenetration tolerance to stop the NLGS iterations of the NSCD - force_motion (
int) – Optional argument allowing to move the grains if convergence has not been reached when set to 1
-
load_mesh_to_body(bodyid, filename, tags=None, shift=None, material='default', moving=False)¶ Not here : periodic entities
-
load_msh_boundaries(filename, tags=None, shift=None, material='default')¶ Loads the numerical domain and set the physical boundaries the particles cannot go through.
Parameters: - filename (
str) – name of the msh file. If None the current gmsh model is loaded without the need to a msh file. - tags (
Optional[str]) – tags of physical boundary defined in the msh file - shift (
Optional[ndarray]) – optional argument to shift the numerical domain - material (
str) – material of the boundary
- filename (
-
material()¶ Returns the materials of the particles. :returns: Array of the particle materials :rtype: np.ndarray
-
mu()¶ Returns the array of the friction coefficients between materials. :returns: Array of the friction coefficients between materials. :rtype: np.ndarray
-
n_bodies()¶ Returns the number of bodies. :returns: number of bodies :rtype: int
-
n_particles()¶ Returns the number of particles. :returns: number of particles :rtype: int
-
omega()¶ Returns the omega of the particles. :returns: Array of the particle omega :rtype: np.ndarray
-
parse_type(tname)¶
-
particle_body()¶ Returns the bodies associated to each particle
Returns: body id Return type: np.ndarray
-
particle_body_uid()¶ Returns the unique body ids associated to each particle
Returns: unique body id Return type: np.ndarray
-
particle_relative_position()¶ Returns the relative positions of the particles
Returns: Array of the relative positions Return type: np.ndarray
-
particles()¶ Returns the array of particles. :returns: Array of particles :rtype: np.ndarray
-
periodic_entity()¶ Returns the array of periodic entities. :returns: Array of periodic entities :rtype: np.ndarray
-
periodic_points()¶ Returns the array of periodic points. :returns: Array of periodic points :rtype: np.ndarray
-
periodic_segments()¶ Returns the array of periodic segments.
Return type: ndarray
-
periodic_triangles()¶ Returns the array of periodic triangles. :returns: Array of periodic segments :rtype: np.ndarray
-
position()¶ Returns the positions of the particles. :returns: Array of the particle positions :rtype: np.ndarray
-
r()¶ Returns the raddi of the particles. :returns: Array of the particle radii :rtype: np.ndarray
-
read_mig(odir, t=None, iteration=None)¶ Reads output files. :type odir:
str:param odir: Directory in which to read the file :type t:Optional[float] :param t: Time at which to read the file :param iteration; iteration to read, -1 for last iteration:
-
remove_bodies_flag(flag)¶ Removes particles based on given flag. :type flag:
ndarray:param flag: flag with the same size as the number of bodies, with 0 for bodies to be removed and 1 for bodies to be kept
-
restore_state()¶ Restores the saved state of the particle problem.
-
save_state()¶ Saves the current state of the particle problem.
-
segments()¶ Returns the array of boundary segments. :returns: Array of boundary segments :rtype: np.ndarray
-
segments_position()¶ Returns the position of all segments.
Returns: edges coordinates of all segments Return type: np.ndarray
-
set_boundary_velocity(tag, v)¶ Sets the velocity of a boundary to a given value. :type tag:
str:param tag: Name of the boundary :type v:ndarray:param v: Velocity vector to be given to the boundary
-
set_cohesion_coefficient(c, mat0='default', mat1='default')¶ Sets the cohesion coefficient between two materials.
Parameters: - c (
ndarray) – Value of the cohesion coefficients - mat0 (
str) – First material - mat1 (
str) – Second material
- c (
-
set_compute_contact_forces(compute_contact_forces=1)¶ Enables the computation of the contact forces on each particle if 1 and disables it if 0.
-
set_detection_per_iteration(n)¶ Sets the number of iterations between two contact detection.
Parameters: n ( int) – Number of iterations between two contact detection.
-
set_fixed_contact_geometry(flag)¶ Sets the management of the contact geometry, either fixed (default) or changing each time the contact is solved.
Parameters: flag ( bool) – True for fixed False for changing.
-
set_friction_coefficient(mu, mat0='default', mat1='default')¶ Sets the friction coefficient between two materials.
Parameters: - mu (
float) – Value of the friction coefficient - mat0 (
str) – First material - mat1 (
str) – Second material
- mu (
-
set_initial(initial=1)¶ Sets the initial state of the particle problem.
-
set_jacobi_max_iters(maxit=10000)¶
-
set_jacobi_mode(jacobi_mode=0)¶
-
set_jacobi_relaxation(relax=0.5)¶
-
set_oriented_faces(flag)¶ Set whether the faces (triangles in 3d, or edges in 2d) are oriented. By default, set to false.
Parameters: flag (bool) – _description_
-
set_predict_basis(flag)¶ Set the management of the contact geometry, if true, a contact basis estimation is used in the contact resolution
Parameters: flag (bool) – True for the estimation
-
set_redblack_mode(redblack_mode=0)¶
-
set_separation_threshold(threshold)¶ Set the separation threshold for oriented faces.
Parameters: threshold (float) – Separation threshold value.
-
set_use_queue(use_queue=1)¶ Enables the use of the queue if 1 and disables it if 0.
-
triangles()¶ Returns the array of boundary triangles. :returns: Array of boundary triangles :rtype: np.ndarray
-
velocity()¶ Returns the velocities of the particles. :returns: Array of the particle velocities :rtype: np.ndarray
-
volume()¶ Returns the volumes of the particles. :returns: Array of the particle volumes :rtype: np.ndarray
-
write_mig(output_dir, t, extra_fields={}, write_contacts=True)¶ Writes output files for post-visualization. :type output_dir:
str:param output_dir: Directory in which to write the file (expected to end in “.mig”) :type t:float:param t: Time at which the simulation is :type extra_fields:Dict[str,ndarray] :param extra_fields: extra field as a dictionnary {name : values}
-
write_residues_to_CSV(filename)¶ Writes the residues of the particle problem to a CSV file.
Parameters: filename (str) – Name of the output CSV file.
-
migflow.scontact.absolute_coord(position_bodies, theta_bodies, bodies, relative_position)¶
-
migflow.scontact.fastdeposit_2d(boundary, r, svgfilename=None)¶ Fast 2d deposit of particles in a simple domain. :type boundary:
ndarray:param boundary: points describing the boundary (single loop counter-clockwise oriented, no holes). :type boundary: np.ndarray [n,2] :type r:ndarray:param r: radius of the particles. :type r: np.ndarray [m] :type svgfilename:Optional[str] :param svgfilename: if not None, a svg file is generated illustrating the algorithmReturns: positions of the particles. np.ndarray [m,2]: radius of the particles. Return type: np.ndarray [m,2]
-
migflow.scontact.get_particle_range(outputdir, field)¶ Returns the range associated to a particle field. :type field:
str:param field: name of the field :type field: strReturns: minimum and maximum values of the field Return type: Tuple[np.ndarray, np.ndarray]
-
migflow.scontact.read_particle_field(outputdir, field, t)¶ Returns a particle field at a given time. :type outputdir:
str:param outputdir: output directory of the simulation :type outputdir: str :type field:str:param field: name of the field :type field: str :type t:float:param t: time :type t: floatReturns: values of the field at time t Return type: np.ndarray