![]() | ![]() | ![]() | Gerris Flow Solver Reference Manual | ![]() |
---|
#include <gfs.h> #define GFS_VARIABLE (cell, index) #define GFS_STATE (cell) #define GFS_FACE_NORMAL_VELOCITY_RIGHT (fa) #define GFS_FACE_NORMAL_VELOCITY_LEFT (fa) #define GFS_FACE_NORMAL_VELOCITY (fa) #define GFS_CELL_IS_BOUNDARY (cell) GfsStateVector; GfsFaceStateVector; GfsVariable; GfsVariableClass;void (*GfsVariableFineCoarseFunc) (FttCell *cell, GfsVariable *v); enum GfsFlags;void gfs_cell_init (FttCell *cell, GfsDomain *domain);void gfs_cell_reset (FttCell *cell, GfsVariable *v);void gfs_cell_cleanup (FttCell *cell);void gfs_cell_copy (const FttCell *from, FttCell *to, GfsDomain *domain);void gfs_cell_cm (const FttCell *cell, FttVector *cm);void gfs_face_ca (const FttCellFace *face, FttVector *ca); GfsVariable* gfs_variable_new (GfsVariableClass *klass, GfsDomain *domain, constgchar *name); GfsVariable* gfs_variable_from_name (GSList *i, constgchar *name);GSList * gfs_variables_from_list (GSList *i,gchar *list,gchar **error);GtsRange gfs_stats_variable (FttCell *root, GfsVariable *v, FttTraverseFlags flags,gint max_depth); GfsNorm gfs_norm_variable (FttCell *root, GfsVariable *v, FttTraverseFlags flags,gint max_depth);void gfs_get_from_below_intensive (FttCell *cell, const GfsVariable *v);void gfs_get_from_below_extensive (FttCell *cell, const GfsVariable *v);void gfs_cell_coarse_init (FttCell *cell, GfsDomain *domain);void gfs_cell_fine_init (FttCell *cell, GfsDomain *domain);gdouble gfs_vector_norm (FttCell *cell, GfsVariable **v);gdouble gfs_vector_norm2 (FttCell *cell, GfsVariable **v);gdouble gfs_divergence (FttCell *cell, GfsVariable **v);void gfs_normal_divergence (FttCell *cell, GfsVariable *v);gdouble gfs_vorticity (FttCell *cell, GfsVariable **v);gdouble gfs_face_interpolated_value (const FttCellFace *face,guint v);gdouble gfs_interpolate (FttCell *cell, FttVector p, GfsVariable *v); GfsGradient;void gfs_face_gradient (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);void gfs_face_weighted_gradient (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);void gfs_face_gradient_flux (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);void gfs_face_gradient_flux_centered (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);gdouble (*GfsCenterGradient) (FttCell *cell, FttComponent c,guint v);gdouble gfs_center_gradient (FttCell *cell, FttComponent c,guint v);gdouble gfs_center_van_leer_gradient (FttCell *cell, FttComponent c,guint v);void gfs_cell_dirichlet_gradient (FttCell *cell,guint v,gint max_level,gdouble v0, FttVector *grad);gdouble gfs_cell_dirichlet_gradient_flux (FttCell *cell,guint v,gint max_level,gdouble v0);gdouble gfs_cell_dirichlet_value (FttCell *cell, GfsVariable *v,gint max_level); GfsInterpolator;void gfs_cell_corner_interpolator (FttCell *cell, FttDirection d[FTT_DIMENSION],gint max_level,gboolean centered, GfsInterpolator *inter);gdouble gfs_cell_corner_value (FttCell *cell, FttDirection *d, GfsVariable *v,gint max_level);void gfs_cell_write (const FttCell *cell,FILE *fp,GSList *variables);void gfs_cell_write_binary (const FttCell *cell,FILE *fp,GSList *variables);void gfs_cell_read (FttCell *cell,GtsFile *fp, GfsDomain *domain);void gfs_cell_read_binary (FttCell *cell,GtsFile *fp, GfsDomain *domain);
#define GFS_VARIABLE(cell, index) ((&GFS_STATE (cell)->place_holder)[index])
Evaluates to the value of variable index
in cell
.
cell : | a FttCell. |
index : | a GfsVariable. |
#define GFS_CELL_IS_BOUNDARY(cell) (((cell)->flags & GFS_FLAG_BOUNDARY) != 0)
cell : |
|
typedef struct { /* temporary face variables */ GfsFaceStateVector f[FTT_NEIGHBORS]; /* solid boundaries */ GfsSolidVector * solid; gdouble place_holder; } GfsStateVector;
The fluid variables describing the state of the cell.
typedef struct { guint i; FttComponent component; gchar * name; gboolean centered; GfsVariableFineCoarseFunc fine_coarse, coarse_fine; GtsContainer * sources; GfsSurfaceGenericBc * surface_bc; GfsDomain * domain; } GfsVariable;
The fluid variables associated with a fluid cell.
void (*GfsVariableFineCoarseFunc) (FttCell *cell, GfsVariable *v);
cell : | |
v : |
|
typedef enum { GFS_FLAG_USED = 1 << FTT_FLAG_USER, GFS_FLAG_BOUNDARY = 1 << (FTT_FLAG_USER + 1), GFS_FLAG_DIRICHLET = 1 << (FTT_FLAG_USER + 2), GFS_FLAG_GRADIENT_BOUNDARY = 1 << (FTT_FLAG_USER + 3), GFS_FLAG_USER = FTT_FLAG_USER + 4 /* user flags start here */ } GfsFlags;
void gfs_cell_init (FttCell *cell, GfsDomain *domain);
Allocates the memory for fluid state data associated to cell
or its children.
cell : | a FttCell. |
domain : | a GfsDomain containing |
void gfs_cell_reset (FttCell *cell, GfsVariable *v);
Sets the value of the variable v
of cell
to zero.
cell : | a FttCell. |
v : | a GfsVariable to reset. |
void gfs_cell_cleanup (FttCell *cell);
Frees the memory allocated for extra data associated with cell
.
This function must be used as "cleanup function" when using
ftt_cell_destroy()
.
cell : | a FttCell. |
void gfs_cell_copy (const FttCell *from, FttCell *to, GfsDomain *domain);
Copies the attributes of the fluid cell from
to the fluid cell to
.
from : | a FttCell to copy attributes from. |
to : | a FttCell to copy attributes to. |
domain : | the GfsDomain containing |
void gfs_cell_cm (const FttCell *cell, FttVector *cm);
Fills cm
with the coordinates of the center of mass of cell
.
cell : | a FttCell. |
cm : | a FttVector. |
void gfs_face_ca (const FttCellFace *face, FttVector *ca);
Fills ca
with the coordinates of the center of area of face
.
face : | a FttCellFace. |
ca : | a FttVector. |
GfsVariable* gfs_variable_new (GfsVariableClass *klass, GfsDomain *domain, constgchar *name);
klass : | |
domain : | a GfsDomain. |
name : | the name of the variable or NULL. |
Returns : | a newly allocated GfsVariable or NULL if a variable
named |
GfsVariable* gfs_variable_from_name (GSList *i, constgchar *name);
i : | the list of available GfsVariable. |
name : | the name of the variable to find. |
Returns : | the GfsVariable |
GSList * gfs_variables_from_list (GSList *i,gchar *list,gchar **error);
i : | the list of available GfsVariable. |
list : | a malloc'ed string containing comma separated variable names. |
error : | where to return the variable name in case of error. |
Returns : | a list of variables or NULL in case of error, in which
case * |
GtsRange gfs_stats_variable (FttCell *root, GfsVariable *v, FttTraverseFlags flags,gint max_depth);
Traverses the cell tree defined by root
using ftt_cell_traverse()
and gathers statistics about variable v
.
root : | the root FttCell of the tree to obtain statistics from. |
v : | the variable to consider for statistics. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | a |
GfsNorm gfs_norm_variable (FttCell *root, GfsVariable *v, FttTraverseFlags flags,gint max_depth);
Traverses the cell tree defined by root
using ftt_cell_traverse()
and gathers norm statistics about variable v
.
root : | the root FttCell of the tree to obtain norm from. |
v : | the variable to consider for norm statistics. |
flags : | which types of cells are to be visited. |
max_depth : | maximum depth of the traversal. |
Returns : | a GfsNorm containing the norm statistics about |
void gfs_get_from_below_intensive (FttCell *cell, const GfsVariable *v);
Sets the value of the "intensive" variable v
of cell
by taking
the volume weighted average of the values of its children cells.
This functions fails if cell
is a leaf of the cell tree.
cell : | a FttCell. |
v : | a GfsVariable to "get from below". |
void gfs_get_from_below_extensive (FttCell *cell, const GfsVariable *v);
Sets the value of the "extensive" variable v
of cell
as (half in
3D) the sum of the values of its children cells.
This functions fails if cell
is a leaf of the cell tree.
cell : | a FttCell. |
v : | a GfsVariable to "get from below". |
void gfs_cell_coarse_init (FttCell *cell, GfsDomain *domain);
Initialises the variables of cell
using the values of its children
cells.
cell : | a FttCell. |
domain : | a GfsDomain containing |
void gfs_cell_fine_init (FttCell *cell, GfsDomain *domain);
Initialises the children of parent
.
cell : | |
domain : | a GfsDomain containing |
gdouble gfs_vector_norm (FttCell *cell, GfsVariable **v);
cell : | a FttCell. |
v : | the components of the vector. |
Returns : | the norm of the vector field |
gdouble gfs_vector_norm2 (FttCell *cell, GfsVariable **v);
cell : | a FttCell. |
v : | the components of the vector. |
Returns : | the squared norm of the vector field |
gdouble gfs_divergence (FttCell *cell, GfsVariable **v);
cell : | a FttCell. |
v : | the components of the vector. |
Returns : | the divergence of the (centered) vector field |
void gfs_normal_divergence (FttCell *cell, GfsVariable *v);
Fills variable v
of cell
with the integral of the divergence
of the (MAC) velocity field in this cell.
cell : | a FttCell. |
v : | a GfsVariable. |
gdouble gfs_vorticity (FttCell *cell, GfsVariable **v);
cell : | a FttCell. |
v : | the components of the vector. |
Returns : | the vorticity (norm of the vorticity vector in 3D) of the
vector field |
gdouble gfs_face_interpolated_value (const FttCellFace *face,guint v);
Computes the value of variable v
on the face
using second-order
interpolation from the cell-centered values.
face : | a |
v : | a GfsVariable index. |
Returns : | the value of variable |
gdouble gfs_interpolate (FttCell *cell, FttVector p, GfsVariable *v);
Interpolates the v
variable of cell
, at location p
. Linear
interpolation is used and the boundaries of the domain are treated
as planes of symmetry for all variables.
cell : | a FttCell containing location |
p : | the location at which to interpolate. |
v : | a GfsVariable. |
Returns : | the interpolated value of variable |
typedef struct { gdouble a, b; } GfsGradient;
Defines the (second-order accurate) gradient of a variable v
in a given direction as: a
*GFS_VARIABLE (cell, v
) + b
.
void gfs_face_gradient (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);
Set the value of g
as the gradient of variable v
on the
face
. The value returned is second order accurate in space and
conservative, in the sense that values at a coarse/fine cell
boundary are consistent.
face : | a FttCellFace. |
g : | the GfsGradient. |
v : | a GfsVariable index. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
void gfs_face_weighted_gradient (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);
Set the value of g
as the gradient of variable v
on the face
weighted by the value of the v
field of the face state vector of the
corresponding cell. The value returned is second order accurate in
space and conservative, in the sense that values at a coarse/fine
cell boundary are consistent.
face : | a FttCellFace. |
g : | the GfsGradient. |
v : | a GfsVariable index. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
void gfs_face_gradient_flux (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);
Set the value of g
as the gradient of variable v
on the face
weighted by the value of the v
field of the face state vector of
the corresponding cell. Variable v
is defined at the center of
mass of its cell. Linear interpolation is used to evaluate the
gradient in the vicinity of cut cells.
face : | a FttCellFace. |
g : | the GfsGradient. |
v : | a GfsVariable index. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
void gfs_face_gradient_flux_centered (const FttCellFace *face, GfsGradient *g,guint v,gint max_level);
face : | |
g : | |
v : | |
max_level : |
|
gdouble (*GfsCenterGradient) (FttCell *cell, FttComponent c,guint v);
cell : | |
c : | |
v : | |
Returns : |
|
gdouble gfs_center_gradient (FttCell *cell, FttComponent c,guint v);
The gradient is normalized by the size of the cell.
cell : | a FttCell. |
c : | a component. |
v : | a GfsVariable index. |
Returns : | the value of the |
gdouble gfs_center_van_leer_gradient (FttCell *cell, FttComponent c,guint v);
The gradient is normalized by the size of the cell and is limited using van Leer's limiter.
cell : | a FttCell. |
c : | a component. |
v : | a GfsVariable index. |
Returns : | the value of the |
void gfs_cell_dirichlet_gradient (FttCell *cell,guint v,gint max_level,gdouble v0, FttVector *grad);
Fills grad
with components of the gradient of variable v
interpolated at the center of area of the solid boundary contained
in cell
. The gradient is scaled by the size of the cell.
cell : | a FttCell. |
v : | a GfsVariable index. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
v0 : | the Dirichlet value on the boundary. |
grad : | a FttVector. |
gdouble gfs_cell_dirichlet_gradient_flux (FttCell *cell,guint v,gint max_level,gdouble v0);
cell : | a FttCell. |
v : | a GfsVariable index. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
v0 : | the Dirichlet value on the boundary. |
Returns : | the flux of the gradient of variable |
gdouble gfs_cell_dirichlet_value (FttCell *cell, GfsVariable *v,gint max_level);
cell : | a FttCell. |
v : | a GfsVariable. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
Returns : | the value of variable |
typedef struct { #if FTT_2D FttCell * c[7]; gdouble w[7]; #else /* 3D */ FttCell * c[29]; gdouble w[29]; #endif /* 3D */ guint n; } GfsInterpolator;
void gfs_cell_corner_interpolator (FttCell *cell, FttDirection d[FTT_DIMENSION],gint max_level,gboolean centered, GfsInterpolator *inter);
Fills inter
with the interpolator for the corner of cell
defined by d
.
cell : | a FttCell. |
d : | a set of perpendicular directions. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
centered : | TRUE if the interpolator is cell-centered. |
inter : |
gdouble gfs_cell_corner_value (FttCell *cell, FttDirection *d, GfsVariable *v,gint max_level);
cell : | a FttCell. |
d : | a set of perpendicular directions. |
v : | a GfsVariable. |
max_level : | the maximum cell level to consider (-1 means no restriction). |
Returns : | the value of variable |
void gfs_cell_write (const FttCell *cell,FILE *fp,GSList *variables);
Writes in fp
the fluid data associated with cell
and described by
variables
. This function is generally used in association with
ftt_cell_write()
.
cell : | a FttCell. |
fp : | a file pointer. |
variables : | the list of GfsVariable to be written. |
void gfs_cell_write_binary (const FttCell *cell,FILE *fp,GSList *variables);
Writes in fp
the fluid data associated with cell
and described by
variables
. This function is generally used in association with
ftt_cell_write_binary()
.
cell : | a FttCell. |
fp : | a file pointer. |
variables : | the list of GfsVariable to be written. |
void gfs_cell_read (FttCell *cell,GtsFile *fp, GfsDomain *domain);
Reads from fp
the fluid data associated with cell
and described
by domain
->variables_io. This function is generally used in
association with ftt_cell_read()
.
cell : | a FttCell. |
fp : | a |
domain : | the GfsDomain containing |
void gfs_cell_read_binary (FttCell *cell,GtsFile *fp, GfsDomain *domain);
Reads from fp
the fluid data associated with cell
and described
by domain
->variables_io. This function is generally used in
association with ftt_cell_read_binary()
.
cell : | a FttCell. |
fp : | a |
domain : | the GfsDomain containing |
<<< Flow solver | Solid boundaries >>> |