[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