Methods to treat the particle phase as immersed boundaries in particle-resolved direct numerical simulations (PR-DNS)
The derived type ResPart_obj defines and stores information about a fully resolved particle, notably, - the size and material density of the particle - the particle centroid (position, linear, and angular velocity) - the hydrodynamic force and torque applied on the particle (computed by direct integration of fluid stresses on the particle surface) - the collision force applied on the particle (given by a collisin model)
The derived type ResPart_set defines a collection of fully resolved particles and methods to work on them. Notably, this object contains: - methods to add/remove fully resolved particles - information about these particles through the ResPart_obj object - Immersed Boundary that gives the morphology of these particles. - methods to integrate the particle equations of motion - methods to perform I/O.
Note that the immersed boundary object contains the tessellations of ALL particles. This means that we need to be able to match tesselation elements with the resolved particles they belong to. This is done by setting the marker_obj tag to equal the resolved particle ID when generating the tessellation elements. A lookup table then allows us to match the tessellation elements to their respective Resolved Particles.
An extended Lagrangian object that represents fully resolved particles
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=wp), | public | :: | Fc(3) |
Collision force applied on particle |
|||
| real(kind=wp), | public | :: | Fcold(3) |
Old collision force |
|||
| real(kind=wp), | public | :: | Fh(3) |
Hydrodynamic force applied on particle |
|||
| real(kind=wp), | public | :: | Fhold(3) |
Old hydrodynamic force |
|||
| real(kind=wp), | public | :: | Tc(3) |
Collision torque applied on particle |
|||
| real(kind=wp), | public | :: | Tcold(3) |
Old collision torque |
|||
| real(kind=wp), | public | :: | Th(3) |
Hydrodynamic torque applied on particle |
|||
| real(kind=wp), | public | :: | Thold(3) |
Old hydrodynamic torque |
|||
| integer, | public | :: | c(3) |
nearest cell |
|||
| real(kind=wp), | public | :: | d |
Diameter of the particle |
|||
| integer(kind=leapI8), | public | :: | id |
Identifying number (inactive if <0) |
|||
| real(kind=wp), | public | :: | p(3) |
position |
|||
| real(kind=wp), | public | :: | pold(3) |
Old particle position |
|||
| real(kind=wp), | public | :: | rho |
Particle density |
|||
| integer, | public | :: | s |
A tag |
|||
| real(kind=wp), | public | :: | v(3) |
Particle velocity |
|||
| real(kind=wp), | public | :: | vold(3) |
Old particle velocity |
|||
| real(kind=wp), | public | :: | w(3) |
Particle angular velocity |
|||
| real(kind=wp), | public | :: | wold(3) |
Old particle angular velocity |
| procedure, public :: Extrapolate => lagrangian_obj_Extrapolate | |
| procedure, public :: Interpolate => lagrangian_obj_Interpolate | |
| procedure, public :: Locate => lagrangian_obj_Locate | |
| procedure, public :: assign => ResPart_obj_assign | |
| generic, public :: assignment(=) => assign |
An extended Lagrgian set representing resolved particles
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=wp), | public | :: | CPG(3) | = | 0.0_wp |
Constant Pressure Gradient forcing |
|
| type(bc_set), | public, | pointer | :: | bcs | => | null() |
boundary conditions object |
| type(block_obj), | public, | pointer | :: | block | => | null() |
Associated block structure |
| integer, | public | :: | count | = | 0 |
Total count across all MPI ranks |
|
| integer, | public | :: | count_ | = | 0 |
Local count for this rank |
|
| integer, | public, | allocatable | :: | count_proc(:) |
Nbr of lagrangian objects per proc |
||
| procedure(kernel_1D), | public, | pointer, nopass | :: | g1ex | => | int_g1_triangle |
1D kernel used in extrapolations |
| procedure(kernel_1D), | public, | pointer, nopass | :: | g1in | => | g1_triangle |
1D kernel used in interpolations |
| real(kind=wp), | public | :: | gravity(3) | = | 0.0_wp |
Gravity |
|
| type(marker_set), | public | :: | ib |
Immersed boundary |
|||
| logical, | public | :: | is_initialized | = | .false. |
Flag to determine whether this has been initialized |
|
| real(kind=wp), | public | :: | l_filter |
Half filter width |
|||
| integer, | public, | allocatable | :: | lookup(:) |
Lookup array |
||
| type(monitor_set), | public, | pointer | :: | monitors | => | null() |
Monitors to print to stdout and files |
| character(len=:), | public, | allocatable | :: | name |
Name of the Lagrangian set |
||
| type(op_obj), | public, | pointer | :: | op | => | null() |
operators object |
| logical, | public | :: | overwrite | = | .true. |
Switch to overwrite IO files |
|
| class(lagrangian_obj), | public, | allocatable | :: | p(:) |
Array of Lagrangian_obj or any extended type |
||
| type(parallel_obj), | public, | pointer | :: | parallel | => | null() |
Associated parallel structure |
| type(parser_obj), | public, | pointer | :: | parser | => | null() |
Parser for input file |
| integer, | public, | allocatable | :: | ranks(:) |
MPI ranks of the lagrangian objects |
||
| character(len=str64), | public | :: | read_file |
File to read |
|||
| real(kind=wp), | public | :: | rhof | = | 1.0_wp |
Fluid density |
|
| class(lagrangian_obj), | public, | allocatable | :: | sample |
Sample used in allocation of polymorphic data |
||
| integer, | public | :: | stib | = | 3 |
Stencil size for filtering |
|
| type(timer_obj), | public, | pointer | :: | timer | => | null() |
Timer utility |
| character(len=str64), | public | :: | write_file |
File to write |
Computes average solid volume fraction at particle centroids
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(in) | :: | ibVF |
Solid volume fraction |
Mean solid volume fraction at particle centroids
Returns the MPI rank of the lagrangian centroid owning this marker.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(lagrangian_set), | intent(in) | :: | this |
Set of resolved particles |
||
| class(lagrangian_obj), | intent(in) | :: | marker |
A surface marker |
Result
Returns the cross product of two vectors.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | u(3) |
Input vector |
||
| real(kind=wp), | intent(in) | :: | v(3) |
Input vector |
Result
Assignment
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_obj), | intent(inout) | :: | this | |||
| class(lagrangian_obj), | intent(in) | :: | val |
Advances centers to next timestep
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| real(kind=wp), | intent(in) | :: | dt |
Timestep |
Advances markers to next timestep
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| real(kind=wp), | intent(in) | :: | dt |
Timestep |
Creates monitor file for Resolved Particles
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
Filters a quantity to the Eulerian grid
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| character(len=*), | intent(in) | :: | var |
Variable to compute |
||
| type(eulerian_obj_r), | intent(inout) | :: | field |
Filtered quantity |
Finalizes the ResPart_set type. This subourtine replaces the inheritted lagrangian_final.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved partilces |
Computes hydrodynamic force on particle.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(in) | :: | P |
Fluid pressure field |
||
| type(eulerian_obj_r), | intent(in) | :: | U |
Fluid velocity field in 1-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | V |
Fluid velocity field in 2-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | W |
Fluid velocity field in 3-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | ibVF |
Solid volume fraction |
||
| real(kind=wp), | intent(in) | :: | visc |
Fluid viscosity |
Computes the IB forcing
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(in) | :: | Um |
Velocity in 1-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | Vm |
Velocity in 2-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | Wm |
Velocity in 3-dir |
||
| real(kind=wp), | intent(in) | :: | rhof |
Fluid density |
||
| type(eulerian_obj_r), | intent(in) | :: | SA |
Surface area |
||
| type(eulerian_obj_r), | intent(inout) | :: | ibF(3) |
IB forcing |
||
| real(kind=wp), | intent(in) | :: | dt |
Timestep |
Computes hydrodynamic stresses on markers
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(in) | :: | P |
Fluid pressure field |
||
| type(eulerian_obj_r), | intent(in) | :: | U |
Fluid velocity field in 1-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | V |
Fluid velocity field in 2-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | W |
Fluid velocity field in 3-dir |
||
| type(eulerian_obj_r), | intent(in) | :: | ibVF |
Solid volume fraction |
||
| real(kind=wp), | intent(in) | :: | visc |
Fluid viscosity |
Initializes the ResPart_set type. This subourtine replaces the inheritted lagrangian_init.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved partilces |
||
| character(len=*), | intent(in) | :: | name |
Name of instance |
||
| type(block_obj), | intent(in), | target | :: | block |
A block object |
|
| type(parallel_obj), | intent(in), | target | :: | parallel |
Parallel structure to link with |
Prepares ResPart_set for use with solvers.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(timer_obj), | intent(in), | target | :: | timer |
Timer utility |
|
| type(parser_obj), | intent(in), | target | :: | parser |
Parser for input file |
|
| type(op_obj), | intent(in), | target | :: | operators |
Operators object |
|
| type(bc_set), | intent(in), | target | :: | bcs |
Boundary conditions object |
|
| type(monitor_set), | intent(in), | target | :: | monitors |
Monitors to print to stdout and files |
|
| logical, | intent(in), | optional | :: | update_time |
Update time and iteration based on read file |
Reads ResPart data from file using H5HUT.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(out) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(out) | :: | time |
Time at write |
||
| integer, | intent(in), | optional | :: | step |
User supplied step to open |
Reads ResPart data from file with HDF5.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(out) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(out) | :: | time |
Time at write |
Regroup markers with their respective centroids on the same MPI block
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
Filters a quantity to the Eulerian grid
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| real(kind=wp), | intent(in) | :: | l_filter |
Filter size |
Sets up parameters used when creating the MPI derived type.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| type(MPI_Datatype), | intent(out), | allocatable | :: | types(:) |
Array of types |
|
| integer, | intent(out), | allocatable | :: | lengths(:) |
Array of lengths |
|
| integer(kind=MPI_ADDRESS_KIND), | intent(out), | allocatable | :: | displacement(:) |
Array of displacements |
Sets the sample type used in allocation of polymorphic variables.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
Sets the base name of file to read.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| character(len=*), | intent(in) | :: | name |
Name of file |
Sets the base name of file to write.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| character(len=*), | intent(in) | :: | name |
Name of file |
Stores values from previous timestep
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
Update lookup array -- The lookup array returns the local (MPI rank) index of a centroid when given the global ID of that centroid
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
Updates the Normals field
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(inout) | :: | ibN(3) |
Normals field |
Updates the Surface Density Function
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Collection of Resolved Particles |
||
| type(eulerian_obj_r), | intent(inout) | :: | SDF |
Surface density function |
Writes ResPart data to file using H5HUT.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(in) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(in) | :: | time |
Time at write |
Writes ResPart data to file using HDF5.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(in) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(in) | :: | time |
Time at write |
Writes data to disk in Silo format.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(ResPart_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(in) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(in) | :: | time |
Time at write |
||
| character(len=str8), | intent(in), | optional | :: | list(:) |
Names of components to write |