[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:31 UTC 2009
The following commit has been merged in the upstream branch:
commit 108cae4ef557d81692ca1ebe836ef2eb856f215f
Author: Stephane Popinet <popinet at users.sf.net>
Date: Sat Jan 28 22:32:11 2006 +1100
CSF surface tension implementation
This is the default. The old CSS implementation (2D only) is still available as
SourceTensionCSS.
darcs-hash:20060128113211-d4795-ac8282e20a9aaa4c590bae0648e8e35e9906f429.gz
diff --git a/src/init.c b/src/init.c
index 8a7f828..3836c90 100644
--- a/src/init.c
+++ b/src/init.c
@@ -255,7 +255,103 @@ void gfs_init (int * argc, char *** argv)
(GLogFunc) gfs_log, NULL);
/* Instantiates classes before reading any domain or simulation file */
- gfs_classes ();
+ gfs_global_class ();
+ gfs_simulation_class ();
+ gfs_ocean_class ();
+ gfs_advection_class ();
+ gfs_poisson_class ();
+
+ gfs_variable_class ();
+ gfs_variable_tracer_class ();
+ gfs_variable_residual_class ();
+ gfs_variable_filtered_class ();
+ gfs_variable_curvature_class ();
+
+ gfs_surface_bc_class ();
+
+ gfs_box_class ();
+ gfs_box_not_adapt_class ();
+ gfs_gedge_class ();
+
+ gfs_bc_dirichlet_class ();
+ gfs_bc_neumann_class ();
+ gfs_bc_flather_class ();
+
+ gfs_boundary_class ();
+ gfs_boundary_inflow_constant_class ();
+ gfs_boundary_outflow_class ();
+#ifdef HAVE_MPI
+ gfs_boundary_mpi_class ();
+#endif /* HAVE_MPI */
+
+ gfs_refine_class ();
+ gfs_refine_solid_class ();
+ gfs_refine_surface_class ();
+ gfs_refine_distance_class ();
+ gfs_refine_height_class ();
+
+ gfs_event_class ();
+ gfs_init_class ();
+ gfs_init_flow_constant_class ();
+ gfs_init_fraction_class ();
+#if FTT_2D
+ gfs_init_vorticity_class ();
+#endif /* FTT_2D */
+ gfs_adapt_class ();
+ gfs_adapt_vorticity_class ();
+ gfs_adapt_streamline_curvature_class ();
+ gfs_adapt_function_class ();
+ gfs_adapt_gradient_class ();
+ gfs_adapt_curvature_class ();
+ gfs_adapt_not_box_class ();
+ gfs_event_sum_class ();
+ gfs_event_harmonic_class ();
+ gfs_event_stop_class ();
+ gfs_event_script_class ();
+ gfs_source_generic_class ();
+ gfs_source_scalar_class ();
+ gfs_source_class ();
+ gfs_source_control_class ();
+ gfs_source_diffusion_class ();
+ gfs_source_diffusion_explicit_class ();
+ gfs_source_velocity_class ();
+ gfs_source_viscosity_class ();
+ gfs_source_friction_class ();
+ gfs_source_coriolis_class ();
+ gfs_source_tension_class ();
+#if !FTT_2D
+ gfs_source_hydrostatic_class ();
+#endif /* 2D3 or 3D */
+ gfs_remove_droplets_class ();
+ gfs_remove_ponds_class ();
+ gfs_event_filter_class ();
+
+ gfs_output_class ();
+ gfs_output_time_class ();
+ gfs_output_progress_class ();
+ gfs_output_projection_stats_class ();
+ gfs_output_diffusion_stats_class ();
+ gfs_output_solid_stats_class ();
+ gfs_output_adapt_stats_class ();
+ gfs_output_timing_class ();
+ gfs_output_balance_class ();
+ gfs_output_solid_force_class ();
+ gfs_output_location_class ();
+ gfs_output_simulation_class ();
+ gfs_output_boundaries_class ();
+ gfs_output_particle_class ();
+
+ gfs_output_scalar_class ();
+ gfs_output_scalar_norm_class ();
+ gfs_output_scalar_stats_class ();
+ gfs_output_scalar_sum_class ();
+ gfs_output_scalar_maxima_class ();
+ gfs_output_scalar_histogram_class ();
+ gfs_output_error_norm_class ();
+ gfs_output_correlation_class ();
+ gfs_output_squares_class ();
+ gfs_output_streamline_class ();
+ gfs_output_ppm_class ();
/* If modules are not supported, calls modules init functions */
#include "modules.c"
diff --git a/src/source.c b/src/source.c
index 3195e0f..9cb28f4 100644
--- a/src/source.c
+++ b/src/source.c
@@ -132,6 +132,33 @@ GfsSourceGenericClass * gfs_source_generic_class (void)
return klass;
}
+/**
+ * gfs_source_find:
+ * @v: a #GfsVariable.
+ * @klass: a #GfsSourceGenericClass.
+ *
+ * Returns: the first source of @v descendant of @klass, or %NULL if
+ * none was found.
+ */
+GfsSourceGeneric * gfs_source_find (GfsVariable * v, GfsSourceGenericClass * klass)
+{
+ g_return_val_if_fail (v != NULL, NULL);
+ g_return_val_if_fail (klass != NULL, NULL);
+
+ if (v->sources) {
+ GSList * i = GTS_SLIST_CONTAINER (v->sources)->items;
+
+ while (i) {
+ GtsObject * o = i->data;
+
+ if (gts_object_is_from_class (o, klass))
+ return GFS_SOURCE_GENERIC (o);
+ i = i->next;
+ }
+ }
+ return NULL;
+}
+
/* GfsSourceScalar: Object */
static void source_scalar_write (GtsObject * o, FILE * fp)
diff --git a/src/source.h b/src/source.h
index c967942..a2ecead 100644
--- a/src/source.h
+++ b/src/source.h
@@ -67,6 +67,8 @@ struct _GfsSourceGenericClass {
gfs_source_generic_class ()))
GfsSourceGenericClass * gfs_source_generic_class (void);
+GfsSourceGeneric * gfs_source_find (GfsVariable * v,
+ GfsSourceGenericClass * klass);
/* GfsSourceScalar: Header */
diff --git a/src/tension.c b/src/tension.c
index 38f0745..db4cf06 100644
--- a/src/tension.c
+++ b/src/tension.c
@@ -23,15 +23,15 @@
#include "tension.h"
#include "vof.h"
-/* GfsSourceTension: Object */
+/* GfsSourceTensionCSS: Object */
-static void gfs_source_tension_read (GtsObject ** o, GtsFile * fp)
+static void gfs_source_tension_css_read (GtsObject ** o, GtsFile * fp)
{
- GfsSourceTension * s = GFS_SOURCE_TENSION (*o);
+ GfsSourceTensionCSS * s = GFS_SOURCE_TENSION_CSS (*o);
GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
FttComponent c;
- (* GTS_OBJECT_CLASS (gfs_source_tension_class ())->parent_class->read) (o, fp);
+ (* GTS_OBJECT_CLASS (gfs_source_tension_css_class ())->parent_class->read) (o, fp);
if (fp->type == GTS_ERROR)
return;
@@ -60,13 +60,13 @@ static void gfs_source_tension_read (GtsObject ** o, GtsFile * fp)
gts_file_next_token (fp);
}
-static void gfs_source_tension_write (GtsObject * o, FILE * fp)
+static void gfs_source_tension_css_write (GtsObject * o, FILE * fp)
{
- (* GTS_OBJECT_CLASS (gfs_source_tension_class ())->parent_class->write) (o, fp);
- fprintf (fp, " %s %g", GFS_SOURCE_TENSION (o)->c->name, GFS_SOURCE_TENSION (o)->sigma);
+ (* GTS_OBJECT_CLASS (gfs_source_tension_css_class ())->parent_class->write) (o, fp);
+ fprintf (fp, " %s %g", GFS_SOURCE_TENSION_CSS (o)->c->name, GFS_SOURCE_TENSION_CSS (o)->sigma);
}
-static void foreach_cell_normal (FttCell * cell, GfsSourceTension * s)
+static void foreach_cell_normal (FttCell * cell, GfsSourceTensionCSS * s)
{
FttVector n;
gdouble nn = 0.;
@@ -82,7 +82,7 @@ static void foreach_cell_normal (FttCell * cell, GfsSourceTension * s)
GFS_VARIABLE (cell, s->g[2]->i) = sigh*n.x*n.y/nn;
}
-static void foreach_cell_tension (FttCell * cell, GfsSourceTension * s)
+static void foreach_cell_tension_css (FttCell * cell, GfsSourceTensionCSS * s)
{
gdouble h = ftt_cell_size (cell);
FttVector nx, ny, nxy;
@@ -98,10 +98,10 @@ static void foreach_cell_tension (FttCell * cell, GfsSourceTension * s)
GFS_VARIABLE (cell, s->t[1]->i) = alpha*(nx.y - nxy.x)/h;
}
-static void gfs_source_tension_event (GfsEvent * event,
+static void gfs_source_tension_css_event (GfsEvent * event,
GfsSimulation * sim)
{
- GfsSourceTension * s = GFS_SOURCE_TENSION (event);
+ GfsSourceTensionCSS * s = GFS_SOURCE_TENSION_CSS (event);
guint i;
#if (!FTT_2D)
@@ -117,24 +117,90 @@ static void gfs_source_tension_event (GfsEvent * event,
/* fixme: boundary conditions for normal */
gfs_domain_cell_traverse (GFS_DOMAIN (sim),
FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
- (FttCellTraverseFunc) foreach_cell_tension, event);
+ (FttCellTraverseFunc) foreach_cell_tension_css, event);
for (i = 0; i < 3; i++)
gts_object_destroy (GTS_OBJECT (s->g[i]));
}
-static gdouble gfs_source_tension_value (GfsSourceGeneric * s,
+static gdouble gfs_source_tension_css_value (GfsSourceGeneric * s,
FttCell * cell,
GfsVariable * v)
{
- return GFS_VARIABLE (cell, GFS_SOURCE_TENSION (s)->t[v->component]->i);
+ return GFS_VARIABLE (cell, GFS_SOURCE_TENSION_CSS (s)->t[v->component]->i);
+}
+
+static void gfs_source_tension_css_class_init (GfsSourceGenericClass * klass)
+{
+ GTS_OBJECT_CLASS (klass)->read = gfs_source_tension_css_read;
+ GTS_OBJECT_CLASS (klass)->write = gfs_source_tension_css_write;
+ GFS_EVENT_CLASS (klass)->event_half = gfs_source_tension_css_event;
+ klass->centered_value = gfs_source_tension_css_value;
+}
+
+GfsSourceGenericClass * gfs_source_tension_css_class (void)
+{
+ static GfsSourceGenericClass * klass = NULL;
+
+ if (klass == NULL) {
+ GtsObjectClassInfo gfs_source_tension_css_info = {
+ "GfsSourceTensionCSS",
+ sizeof (GfsSourceTensionCSS),
+ sizeof (GfsSourceGenericClass),
+ (GtsObjectClassInitFunc) gfs_source_tension_css_class_init,
+ (GtsObjectInitFunc) NULL,
+ (GtsArgSetFunc) NULL,
+ (GtsArgGetFunc) NULL
+ };
+ klass =
+ gts_object_class_new (GTS_OBJECT_CLASS (gfs_source_velocity_class ()),
+ &gfs_source_tension_css_info);
+ }
+
+ return klass;
+}
+
+/* GfsSourceTension: Object */
+
+static void gfs_source_tension_read (GtsObject ** o, GtsFile * fp)
+{
+ GfsSourceTension * s = GFS_SOURCE_TENSION (*o);
+ GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+
+ (* GTS_OBJECT_CLASS (gfs_source_tension_class ())->parent_class->read) (o, fp);
+ if (fp->type == GTS_ERROR)
+ return;
+
+ if (fp->type != GTS_STRING) {
+ gts_file_error (fp, "expecting a variable (C)");
+ return;
+ }
+ if ((s->c = gfs_variable_from_name (domain->variables, fp->token->str)) == NULL) {
+ gts_file_error (fp, "unknown variable `%s'", fp->token->str);
+ return;
+ }
+ gts_file_next_token (fp);
+
+ if (fp->type != GTS_STRING) {
+ gts_file_error (fp, "expecting a variable (Kappa)");
+ return;
+ }
+ if ((s->k = gfs_variable_from_name (domain->variables, fp->token->str)) == NULL) {
+ gts_file_error (fp, "unknown variable `%s'", fp->token->str);
+ return;
+ }
+ gts_file_next_token (fp);
+}
+
+static void gfs_source_tension_write (GtsObject * o, FILE * fp)
+{
+ (* GTS_OBJECT_CLASS (gfs_source_tension_class ())->parent_class->write) (o, fp);
+ fprintf (fp, " %s %s", GFS_SOURCE_TENSION (o)->c->name, GFS_SOURCE_TENSION (o)->k->name);
}
static void gfs_source_tension_class_init (GfsSourceGenericClass * klass)
{
GTS_OBJECT_CLASS (klass)->read = gfs_source_tension_read;
GTS_OBJECT_CLASS (klass)->write = gfs_source_tension_write;
- GFS_EVENT_CLASS (klass)->event_half = gfs_source_tension_event;
- klass->centered_value = gfs_source_tension_value;
}
GfsSourceGenericClass * gfs_source_tension_class (void)
@@ -158,4 +224,3 @@ GfsSourceGenericClass * gfs_source_tension_class (void)
return klass;
}
-
diff --git a/src/tension.h b/src/tension.h
index 6e1ef4e..fd2bf6d 100644
--- a/src/tension.h
+++ b/src/tension.h
@@ -26,11 +26,11 @@ extern "C" {
#include "source.h"
-/* GfsSourceTension: Header */
+/* GfsSourceTensionCSS: Header */
-typedef struct _GfsSourceTension GfsSourceTension;
+typedef struct _GfsSourceTensionCSS GfsSourceTensionCSS;
-struct _GfsSourceTension {
+struct _GfsSourceTensionCSS {
/*< private >*/
GfsSourceVelocity parent;
GfsVariable * g[3];
@@ -40,6 +40,26 @@ struct _GfsSourceTension {
gdouble sigma;
};
+#define GFS_SOURCE_TENSION_CSS(obj) GTS_OBJECT_CAST (obj,\
+ GfsSourceTensionCSS,\
+ gfs_source_tension_css_class ())
+#define GFS_IS_SOURCE_TENSION_CSS(obj) (gts_object_is_from_class (obj,\
+ gfs_source_tension_css_class ()))
+
+GfsSourceGenericClass * gfs_source_tension_css_class (void);
+
+/* GfsSourceTension: Header */
+
+typedef struct _GfsSourceTension GfsSourceTension;
+
+struct _GfsSourceTension {
+ /*< private >*/
+ GfsSourceVelocity parent;
+
+ /*< public >*/
+ GfsVariable * c, * k;
+};
+
#define GFS_SOURCE_TENSION(obj) GTS_OBJECT_CAST (obj,\
GfsSourceTension,\
gfs_source_tension_class ())
diff --git a/src/timestep.c b/src/timestep.c
index c462ff3..b86b003 100644
--- a/src/timestep.c
+++ b/src/timestep.c
@@ -23,6 +23,7 @@
#include "timestep.h"
#include "source.h"
#include "solid.h"
+#include "tension.h"
static void reset_gradients (FttCell * cell, gpointer * data)
{
@@ -196,6 +197,7 @@ void gfs_mac_projection (GfsDomain * domain,
gdouble dt;
gpointer data[2];
GfsVariable * div, * dia, * res;
+ GfsSourceGeneric * s;
g_return_if_fail (domain != NULL);
g_return_if_fail (par != NULL);
@@ -217,7 +219,12 @@ void gfs_mac_projection (GfsDomain * domain,
gfs_poisson_coefficients (domain, alpha);
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
(FttCellTraverseFunc) gfs_cell_reset, dia);
-
+ /* Add surface tension */
+ if ((s = gfs_source_find (apar->v, gfs_source_tension_class ())))
+ gfs_correct_normal_velocities (domain, FTT_DIMENSION,
+ GFS_SOURCE_TENSION (s)->c,
+ NULL, apar->dt,
+ GFS_SOURCE_TENSION (s)->k);
/* compute MAC divergence */
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) gfs_normal_divergence, div);
@@ -358,6 +365,7 @@ void gfs_approximate_projection (GfsDomain * domain,
{
gpointer data[2];
GfsVariable * dia, * div, * g[FTT_DIMENSION], * res1;
+ GfsSourceGeneric * s;
g_return_if_fail (domain != NULL);
g_return_if_fail (par != NULL);
@@ -366,14 +374,8 @@ void gfs_approximate_projection (GfsDomain * domain,
gfs_domain_timer_start (domain, "approximate_projection");
- div = gfs_temporary_variable (domain);
- dia = gfs_temporary_variable (domain);
- res1 = res ? res : gfs_temporary_variable (domain);
-
/* Initialize face coefficients */
gfs_poisson_coefficients (domain, alpha);
- gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
- (FttCellTraverseFunc) gfs_cell_reset, dia);
/* compute MAC velocities from centered velocities */
gfs_domain_face_traverse (domain, FTT_XYZ,
@@ -383,6 +385,22 @@ void gfs_approximate_projection (GfsDomain * domain,
FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttFaceTraverseFunc) gfs_face_interpolated_normal_velocity,
gfs_domain_velocity (domain));
+ /* Add surface tension */
+ if ((s = gfs_source_find (gfs_domain_velocity (domain)[0], gfs_source_tension_class ()))) {
+ gfs_correct_normal_velocities (domain, FTT_DIMENSION,
+ GFS_SOURCE_TENSION (s)->c,
+ g, apar->dt,
+ GFS_SOURCE_TENSION (s)->k);
+ gfs_correct_centered_velocities (domain, FTT_DIMENSION, g, apar->dt);
+ }
+
+ div = gfs_temporary_variable (domain);
+ dia = gfs_temporary_variable (domain);
+ res1 = res ? res : gfs_temporary_variable (domain);
+
+ /* Initialize diagonal coefficient */
+ gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
+ (FttCellTraverseFunc) gfs_cell_reset, dia);
/* compute MAC divergence */
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
diff --git a/test/capwave/capwave.gfs b/test/capwave/capwave.gfs
index de74fce..f04f65a 100644
--- a/test/capwave/capwave.gfs
+++ b/test/capwave/capwave.gfs
@@ -40,7 +40,6 @@
# Command: sh capwave.sh capwave.gfs
# Version: 0.6.4
# Required files: capwave.sh convergence.ref
-# Running time: 3 minutes
# Generated files: convergence.tex amplitude.eps
#
1 1 GfsSimulation GfsBox GfsGEdge {} {
@@ -52,7 +51,9 @@
ProjectionParams { tolerance = 1e-6 }
Refine LEVEL
VariableTracer {} T { scheme = vof }
- SourceTension {} T 1
+ VariableFiltered {} T1 T 0
+ VariableCurvature {} K T1
+ SourceTension {} T K
AdvectionParams { scheme = none }
SourceDiffusion {} U 0.0182571749236
SourceDiffusion {} V 0.0182571749236
diff --git a/test/spurious/spurious.gfs b/test/spurious/spurious.gfs
index 06bdec9..9fadb55 100644
--- a/test/spurious/spurious.gfs
+++ b/test/spurious/spurious.gfs
@@ -55,7 +55,6 @@
# Command: sh spurious.sh spurious.gfs
# Version: 0.6.4
# Required files: spurious.sh vectors.gfv convergence.ref
-# Running time: 3 minutes
# Generated files: laplace.eps convergence.eps vectors.eps
#
1 2 GfsSimulation GfsBox GfsGEdge {} {
@@ -67,7 +66,9 @@
AdvectionParams { scheme = none }
VariableTracer {} T { scheme = vof }
- SourceTension {} T 1
+ VariableFiltered {} T1 T 0
+ VariableCurvature {} K T1
+ SourceTension {} T K
SourceDiffusion {} U MU
SourceDiffusion {} V MU
diff --git a/test/spurious/vectors.gfv b/test/spurious/vectors.gfv
index 2a31e3a..2c1f6b3 100644
--- a/test/spurious/vectors.gfv
+++ b/test/spurious/vectors.gfv
@@ -20,7 +20,7 @@ Vectors {
amax = 1
cmap = Jet
} U V {
- scale = 0.2184
+ scale = 1.2
use_scalar = 0
}
Isoline {
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list