![]() | ![]() | ![]() | Gerris Flow Solver Reference Manual | ![]() |
---|
#include <gfs.h> #define GFS_DOMAIN_CLASS (klass) #define GFS_DOMAIN (obj) #define GFS_IS_DOMAIN (obj) struct GfsDomainClass; struct GfsDomain; GfsDomainClass* gfs_domain_class (void); GfsVariable* gfs_domain_add_variable (GfsDomain *domain, constgchar *name);void gfs_domain_add_new_variable (GfsDomain *domain, GfsVariable *v);void gfs_domain_replace_variable (GfsDomain *domain, GfsVariable *v, GfsVariable *with);void gfs_domain_cell_traverse (GfsDomain *domain, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);void gfs_domain_cell_traverse_boundary (GfsDomain *domain, FttDirection d, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);void gfs_domain_cell_traverse_box (GfsDomain *domain,GtsBBox *box, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);void gfs_domain_traverse_mixed (GfsDomain *domain, FttTraverseType order, FttTraverseFlags flags, FttCellTraverseFunc func,gpointer data);void gfs_domain_face_traverse (GfsDomain *domain, FttComponent c, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttFaceTraverseFunc func,gpointer data); FttCell* gfs_domain_locate (GfsDomain *domain, FttVector target,gint max_depth);void gfs_domain_bc (GfsDomain *domain, FttTraverseFlags flags,gint max_depth, GfsVariable *v);void gfs_domain_homogeneous_bc (GfsDomain *domain, FttTraverseFlags flags,gint max_depth, GfsVariable *ov, GfsVariable *v);void gfs_domain_face_bc (GfsDomain *domain, FttComponent c, GfsVariable *v);void gfs_domain_surface_bc (GfsDomain *domain, GfsVariable *v);void gfs_domain_match (GfsDomain *domain);guint gfs_domain_depth (GfsDomain *domain);GtsRange gfs_domain_stats_variable (GfsDomain *domain, GfsVariable *v, FttTraverseFlags flags,gint max_depth); GfsNorm gfs_domain_norm_variable (GfsDomain *domain, GfsVariable *v, FttTraverseFlags flags,gint max_depth); GfsNorm gfs_domain_norm_velocity (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);void gfs_domain_stats_balance (GfsDomain *domain,GtsRange *size,GtsRange *boundary,GtsRange *mpiwait);GtsRange gfs_domain_stats_solid (GfsDomain *domain);void gfs_domain_solid_force (GfsDomain *domain, FttVector *pf, FttVector *vf); GfsDomain* gfs_domain_read (GtsFile *fp);void gfs_domain_split (GfsDomain *domain,gboolean one_box_per_pe);void gfs_domain_remove_droplets (GfsDomain *domain, GfsVariable *c,gint min);void gfs_domain_remove_islands (GfsDomain *domain,gint min, FttCellCleanupFunc cleanup,gpointer data);void gfs_domain_advect_point (GfsDomain *domain,GtsPoint *p,gdouble dt);gdouble gfs_domain_cfl (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);guint gfs_domain_size (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);void gfs_domain_timer_start (GfsDomain *domain, constgchar *name);void gfs_domain_timer_stop (GfsDomain *domain, constgchar *name);
struct GfsDomainClass { GtsWGraphClass parent_class; void (* post_read) (GfsDomain *, GtsFile * fp); };
struct GfsDomain { GtsWGraph parent; int pid; GTimer * timer; GHashTable * timers; GtsRange timestep; GtsRange size; gboolean profile_bc; GtsRange mpi_messages; GtsRange mpi_wait; guint rootlevel; FttVector refpos; FttVector lambda; GfsVariable * variables; guint variables_size; GfsVariable * variables_io; gboolean binary; gint max_depth_write; };
GfsVariable* gfs_domain_add_variable (GfsDomain *domain, constgchar *name);
Adds a new variable name to domain.
domain : | a GfsDomain. |
name : | the name of the variable to add or NULL. |
Returns : | the new variable or NULL if a variable with the same name already exists. |
void gfs_domain_add_new_variable (GfsDomain *domain, GfsVariable *v);
Adds a new variable v to domain.
domain : | a GfsDomain. |
v : | the GfsVariable to add. |
void gfs_domain_replace_variable (GfsDomain *domain, GfsVariable *v, GfsVariable *with);
Replaces existing variable v with new variable with.
domain : | a GfsDomain. |
v : | the GfsVariable to replace. |
with : | the new GfsVariable. |
void gfs_domain_cell_traverse (GfsDomain *domain, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);
Traverses the cell trees of domain. Calls the given function for each cell visited.
domain : | a GfsDomain. |
order : | the order in which the cells are visited - FTT_PRE_ORDER, FTT_POST_ORDER. |
flags : | which types of children are to be visited. |
max_depth : | the maximum depth of the traversal. Cells below this depth will not be traversed. If max_depth is -1 all cells in the tree are visited. |
func : | the function to call for each visited FttCell. |
data : | user data to pass to func. |
void gfs_domain_cell_traverse_boundary (GfsDomain *domain, FttDirection d, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);
Traverses the boundary of a domain in direction d. Calls the given function for each cell visited.
domain : | a GfsDomain. |
d : | the direction of the boundary to traverse. |
order : | the order in which the cells are visited - FTT_PRE_ORDER, FTT_POST_ORDER. |
flags : | which types of children are to be visited. |
max_depth : | the maximum depth of the traversal. Cells below this depth will not be traversed. If max_depth is -1 all cells in the tree are visited. |
func : | the function to call for each visited FttCell. |
data : | user data to pass to func. |
void gfs_domain_cell_traverse_box (GfsDomain *domain,GtsBBox *box, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttCellTraverseFunc func,gpointer data);
Traverses the cell trees of domain. Calls the given function for each cell visited. Only the cells overlapping with box are visited.
domain : | a GfsDomain. |
box : | a |
order : | the order in which the cells are visited - FTT_PRE_ORDER, FTT_POST_ORDER. |
flags : | which types of children are to be visited. |
max_depth : | the maximum depth of the traversal. Cells below this depth will not be traversed. If max_depth is -1 all cells in the tree are visited. |
func : | the function to call for each visited FttCell. |
data : | user data to pass to func. |
void gfs_domain_traverse_mixed (GfsDomain *domain, FttTraverseType order, FttTraverseFlags flags, FttCellTraverseFunc func,gpointer data);
Calls func for each mixed cell of domain.
domain : | a GfsDomain. |
order : | the order in which the cells are visited - FTT_PRE_ORDER, FTT_POST_ORDER. |
flags : | which types of children are to be visited. |
func : | the function to call for each visited FttCell. |
data : | user data to pass to func. |
void gfs_domain_face_traverse (GfsDomain *domain, FttComponent c, FttTraverseType order, FttTraverseFlags flags,gint max_depth, FttFaceTraverseFunc func,gpointer data);
Traverses a domain. Calls the given function for each face of the cells of the domain.
If FTT_TRAVERSE_BOUNDARY_FACES is not set in flags, only "double-sided" faces are traversed i.e. the neighbor field of the face is never NULL.
domain : | a GfsDomain. |
c : | only the faces orthogonal to this component will be traversed - one of FTT_X, FTT_Y, (FTT_Z), FTT_XYZ. |
order : | the order in which the cells are visited - FTT_PRE_ORDER, FTT_POST_ORDER. |
flags : | which types of children and faces are to be visited. |
max_depth : | the maximum depth of the traversal. Cells below this depth will not be traversed. If max_depth is -1 all cells in the tree are visited. |
func : | the function to call for each visited FttCellFace. |
data : | user data to pass to func. |
FttCell* gfs_domain_locate (GfsDomain *domain, FttVector target,gint max_depth);
Locates the cell of domain containing target. This is done efficiently in log(n) operations by using the topology of the cell trees.
domain : | a GfsDomain. |
target : | position of the point to look for. |
max_depth : | maximum depth to consider (-1 means no restriction). |
Returns : | a FttCell of domain containing (boundary included) the point defined by target or NULL if target is not contained in any cell of domain. |
void gfs_domain_bc (GfsDomain *domain, FttTraverseFlags flags,gint max_depth, GfsVariable *v);
Apply the boundary conditions in domain for variable v.
domain : | a GfsDomain. |
flags : | the traversal flags. |
max_depth : | the maximum depth of the traversal. |
v : | a GfsVariable. |
void gfs_domain_homogeneous_bc (GfsDomain *domain, FttTraverseFlags flags,gint max_depth, GfsVariable *ov, GfsVariable *v);
Apply the boundary conditions in domain for variable ov using the homogeneous version of the boundary condititons for v.
domain : | a GfsDomain. |
flags : | the traversal flags. |
max_depth : | the maximum depth of the traversal. |
ov : | a GfsVariable. |
v : | a GfsVariable of which ov is an homogeneous version. |
void gfs_domain_face_bc (GfsDomain *domain, FttComponent c, GfsVariable *v);
Apply the boundary conditions on the faces of domain for variable v.
domain : | a GfsDomain. |
c : | a component. |
v : | a GfsVariable. |
void gfs_domain_surface_bc (GfsDomain *domain, GfsVariable *v);
Apply boundary conditions for variable v on embedded surfaces.
domain : | a GfsDomain. |
v : | a GfsVariable. |
void gfs_domain_match (GfsDomain *domain);
Match the boundaries of domain.
domain : | a GfsDomain. |
guint gfs_domain_depth (GfsDomain *domain);
domain : | a GfsDomain. |
Returns : | the maximum depth of the cell trees of domain. This function is global i.e. it returns the maximum depth over all the processes (for parallel execution). |
GtsRange gfs_domain_stats_variable (GfsDomain *domain, GfsVariable *v, FttTraverseFlags flags,gint max_depth);
Traverses the domain defined by domain using gfs_domain_cell_traverse()
and gathers statistics about variable v.
domain : | the domain to obtain statistics from. |
v : | a GfsVariable. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | a |
GfsNorm gfs_domain_norm_variable (GfsDomain *domain, GfsVariable *v, FttTraverseFlags flags,gint max_depth);
Traverses the domain defined by domain using gfs_domain_cell_traverse()
and gathers norm statistics about variable v.
The norm is weighted by the volume of each cell.
domain : | the domain to obtain norm from. |
v : | a GfsVariable. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | a GfsNorm containing the norm statistics about v. |
GfsNorm gfs_domain_norm_velocity (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);
Traverses the domain defined by domain using gfs_domain_cell_traverse()
and gathers norm statistics about velocity.
domain : | the domain to obtain the norm from. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | a GfsNorm containing the norm statistics about the velocity. |
void gfs_domain_stats_balance (GfsDomain *domain,GtsRange *size,GtsRange *boundary,GtsRange *mpiwait);
Gathers statistics about the sizes of the domains, their parallel boundaries and the execution time on each PE.
domain : | the domain to obtain statistics from. |
size : | |
boundary : | |
mpiwait : | |
GtsRange gfs_domain_stats_solid (GfsDomain *domain);
Traverses the domain defined by domain using gfs_domain_traverse_mixed()
and gathers statistics about the solid volume fraction in mixed cells.
domain : | the domain to obtain statistics from. |
Returns : | statistics about the solid volume fraction a in mixed cells. |
void gfs_domain_solid_force (GfsDomain *domain, FttVector *pf, FttVector *vf);
Fills pf and vf with the components of the net pressure and viscous forces applied by the fluid on the solid surface embbeded in domain.
domain : | a GfsDomain. |
pf : | a FttVector. |
vf : | a FttVector. |
GfsDomain* gfs_domain_read (GtsFile *fp);
Reads the graph nodes (GfsBox) and edges and the corresponding boundaries (GfsBoundaryMpi if necessary) defined in fp.
fp : | a |
Returns : | the GfsDomain or NULL if an error occured, in which case the corresponding fp fields (pos and error) are set. |
void gfs_domain_split (GfsDomain *domain,gboolean one_box_per_pe);
Splits each box of domain into its (4 in 2D, 8 in 3D) children. The corresponding newly created boxes are added to the graph and the parent boxes are destroyed.
domain : | a GfsDomain. |
one_box_per_pe : | if TRUE each new box created is assigned to a different process, otherwise the newly created box inherits the pid of its parent. |
void gfs_domain_remove_droplets (GfsDomain *domain, GfsVariable *c,gint min);
Removes all the droplets of domain smaller than min cells if min is positive, or all the droplets but the -$min largest ones if min is negative.
domain : | a GfsDomain. |
c : | a GfsVariable. |
min : | the minimum size (in cells) of the droplets. |
void gfs_domain_remove_islands (GfsDomain *domain,gint min, FttCellCleanupFunc cleanup,gpointer data);
Removes all the fluid "islands" of domain smaller than min cells if min is positive, or all the islands but the -min largest ones if min is negative.
domain : | a GfsDomain. |
min : | the minimum size (in cells) of the islands. |
cleanup : | a FttCellCleanupFunc or NULL. |
data : | user data to pass to cleanup. |
void gfs_domain_advect_point (GfsDomain *domain,GtsPoint *p,gdouble dt);
Updates the coordinates of point p at time t + dt using the velocity field defined by domain.
If p is not contained within domain, the coordinates are unchanged.
domain : | a GfsDomain. |
p : | a |
dt : | the time step. |
gdouble gfs_domain_cfl (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);
domain : | a GfsDomain. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | the minimum over the cells of domain (traversed using flags and max_depth) of the time scale defined by the size of the cell and the norm of either the local velocity or the local acceleration. |
guint gfs_domain_size (GfsDomain *domain, FttTraverseFlags flags,gint max_depth);
domain : | a GfsDomain. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | the number of cells of domain traversed using flags and max_depth. |
void gfs_domain_timer_start (GfsDomain *domain, constgchar *name);
Starts timer name of domain. If name does not exist it is created first.
domain : | a GfsDomain. |
name : | the name of the timer. |
<<< Non-adaptive fluid box node | Fluid box boundaries >>> |