[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203

Stephane Popinet popinet at users.sf.net
Fri May 15 02:53:10 UTC 2009


The following commit has been merged in the upstream branch:
commit 3ec68200e8b075a4dc793c0bdee7d8d80f291d68
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Tue Mar 14 14:17:14 2006 +1100

    RefineSolid defines a new derived variable "SolidCurvature"
    
    darcs-hash:20060314031714-d4795-af04168cc93981f194dd8b01dcfe4187ddd7afa4.gz

diff --git a/src/refine.c b/src/refine.c
index 9d48329..f95fbc2 100644
--- a/src/refine.c
+++ b/src/refine.c
@@ -136,13 +136,72 @@ GfsRefine * gfs_refine_new (GfsRefineClass * klass)
 
 /* GfsRefineSolid: Object */
 
+typedef struct _GfsRefineSolid           GfsRefineSolid;
+
+struct _GfsRefineSolid {
+  GfsRefine parent;
+
+  GfsDerivedVariable * v;
+};
+  
+#define GFS_REFINE_SOLID(obj)            GTS_OBJECT_CAST (obj,\
+					           GfsRefineSolid,\
+					           gfs_refine_solid_class ())
+
+static void refine_solid_destroy (GtsObject * object)
+{
+  gfs_domain_remove_derived_variable (GFS_DOMAIN (gfs_object_simulation (object)), 
+				      "SolidCurvature");
+
+  (* GTS_OBJECT_CLASS (gfs_refine_solid_class ())->parent_class->destroy) (object);
+}
+
+static void max_kappa (GtsVertex * v, gpointer * data)
+{
+  GtsSurface * s = data[0];
+  gdouble * max = data[1];
+  GtsVector Kh;
+
+  if (gts_vertex_mean_curvature_normal (v, s, Kh)) {
+    gdouble kappa = gts_vector_norm (Kh)/(FTT_DIMENSION - 1);
+    if (kappa > *max)
+      *max = kappa;
+  }
+}
+
+static gdouble solid_curvature (FttCell * cell, FttCellFace * face, 
+				GfsDomain * domain, GtsSurface * s)
+{
+  gdouble kappa = gfs_solid_is_thin (cell, s) ? 1./ftt_cell_size (cell) : 0.;
+  gpointer data[] = {GTS_OBJECT (s)->reserved, &kappa};
+  gts_surface_foreach_vertex (s, (GtsFunc) max_kappa, data);
+  return kappa;
+}
+
+static void refine_solid_read (GtsObject ** o, GtsFile * fp)
+{
+  GfsDerivedVariable v = { "SolidCurvature", solid_curvature };
+  GfsRefineSolid * refine = GFS_REFINE_SOLID (*o);
+
+  refine->v = gfs_domain_add_derived_variable (GFS_DOMAIN (gfs_object_simulation (*o)), v);
+  if (!refine->v) {
+    gts_file_error (fp, "derived variable `SolidCurvature' already defined");
+    return;
+  }
+
+  (* GTS_OBJECT_CLASS (gfs_refine_solid_class ())->parent_class->read) (o, fp);
+}
+
 static void refine_cut_cell (FttCell * cell, GtsSurface * s, gpointer * data)
 {
   GfsRefine * refine = data[0];
   GfsDomain * domain = data[1];
 
+  GTS_OBJECT (s)->reserved = GFS_SIMULATION (domain)->surface;
+  GFS_REFINE_SOLID (refine)->v->data = s;
   if (ftt_cell_level (cell) < gfs_function_value (refine->maxlevel, cell))
     ftt_cell_refine_single (cell, (FttCellInitFunc) gfs_cell_fine_init, domain);
+  GFS_REFINE_SOLID (refine)->v->data = NULL;
 }
 
 static void gfs_refine_solid_refine (GfsRefine * refine, GfsSimulation * sim)
@@ -151,7 +210,7 @@ static void gfs_refine_solid_refine (GfsRefine * refine, GfsSimulation * sim)
     gpointer data[2];
 
     data[0] = refine;
-    data[1] = sim;    
+    data[1] = sim;
     gfs_domain_traverse_cut (GFS_DOMAIN (sim), sim->surface, 
 			     FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS,
 			     (FttCellTraverseCutFunc) refine_cut_cell, data);
@@ -161,6 +220,8 @@ static void gfs_refine_solid_refine (GfsRefine * refine, GfsSimulation * sim)
 static void gfs_refine_solid_class_init (GfsRefineClass * klass)
 {
   klass->refine = gfs_refine_solid_refine;
+  GTS_OBJECT_CLASS (klass)->destroy = refine_solid_destroy;
+  GTS_OBJECT_CLASS (klass)->read = refine_solid_read;
 }
 
 GfsRefineClass * gfs_refine_solid_class (void)
@@ -170,7 +231,7 @@ GfsRefineClass * gfs_refine_solid_class (void)
   if (klass == NULL) {
     GtsObjectClassInfo gfs_refine_solid_info = {
       "GfsRefineSolid",
-      sizeof (GfsRefine),
+      sizeof (GfsRefineSolid),
       sizeof (GfsRefineClass),
       (GtsObjectClassInitFunc) gfs_refine_solid_class_init,
       (GtsObjectInitFunc) NULL,
@@ -423,7 +484,7 @@ static void refine_height_read (GtsObject ** o, GtsFile * fp)
     return;
   }
 
-  (* GTS_OBJECT_CLASS (gfs_refine_distance_class ())->parent_class->read) (o, fp);
+  (* GTS_OBJECT_CLASS (gfs_refine_height_class ())->parent_class->read) (o, fp);
 }
 
 static void gfs_refine_height_class_init (GfsRefineClass * klass)

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list