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

Stephane Popinet popinet at users.sourceforge.net
Fri May 15 02:51:24 UTC 2009


The following commit has been merged in the upstream branch:
commit f24a0deafd327388e8695b1b34025109d430dcfd
Author: Stephane Popinet <popinet at users.sourceforge.net>
Date:   Thu Nov 4 16:47:41 2004 +1100

    New class GfsRefineHeight (gerris--mainline--0.7--patch-29)
    
    gerris--mainline--0.7--patch-29
    Keywords:
    
    For height/depth dependent refinement in ocean model.
    
    darcs-hash:20041104054741-aabb8-735e3f922b205abbb2f4195628639adf23f87fe6.gz

diff --git a/src/init.c b/src/init.c
index 3765d7e..2ce49c3 100644
--- a/src/init.c
+++ b/src/init.c
@@ -239,6 +239,7 @@ void gfs_init (int * argc, char *** argv)
     gfs_refine_solid_class ();
     gfs_refine_surface_class ();
       gfs_refine_distance_class ();
+      gfs_refine_height_class ();
 
   gfs_event_class ();
     gfs_init_class ();
diff --git a/src/refine.c b/src/refine.c
index 7f014e2..91cd135 100644
--- a/src/refine.c
+++ b/src/refine.c
@@ -384,3 +384,77 @@ GfsRefineClass * gfs_refine_distance_class (void)
 
   return klass;
 }
+
+/* GfsRefineHeight: Object */
+
+static void refine_height_read (GtsObject ** o, GtsFile * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_refine_distance_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+  
+  if (gts_surface_volume (GFS_REFINE_SURFACE (*o)->surface) < 0.)
+    gts_surface_foreach_face (GFS_REFINE_SURFACE (*o)->surface, 
+			      (GtsFunc) gts_triangle_revert, NULL);
+}
+
+static gboolean refine_height_maxlevel (FttCell * cell, gpointer * data)
+{
+  GfsRefine * refine = data[0];
+  GtsFace * f, ** guess = data[1];
+  FttVector pos;
+  GtsPoint p;
+
+  ftt_cell_pos (cell, &pos);
+  p.x = pos.x; p.y = pos.y;
+  if ((f = gts_point_locate (&p, GFS_REFINE_SURFACE (refine)->surface, NULL))) {
+    *guess = f;
+    gts_triangle_interpolate_height (GTS_TRIANGLE (f), &p);
+    return (ftt_cell_level (cell) < gfs_function_value (refine->maxlevel, &pos, p.z));
+  }
+  return FALSE;
+}
+
+static void refine_height (GfsBox * box, gpointer data)
+{
+  gpointer datum[2];
+  GtsFace * guess = NULL;
+
+  datum[0] = data;
+  datum[1] = &guess;
+  ftt_cell_refine (box->root, 
+		   (FttCellRefineFunc) refine_height_maxlevel, datum,
+		   (FttCellInitFunc) gfs_cell_init, gfs_box_domain (box));
+}
+
+static void refine_height_refine (GfsRefine * refine, GfsSimulation * sim)
+{
+  gts_container_foreach (GTS_CONTAINER (sim), (GtsFunc) refine_height, refine);
+}
+
+static void gfs_refine_height_class_init (GfsRefineClass * klass)
+{
+  klass->refine = refine_height_refine;
+  GTS_OBJECT_CLASS (klass)->read = refine_height_read;
+}
+
+GfsRefineClass * gfs_refine_height_class (void)
+{
+  static GfsRefineClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_refine_height_info = {
+      "GfsRefineHeight",
+      sizeof (GfsRefineSurface),
+      sizeof (GfsRefineClass),
+      (GtsObjectClassInitFunc) gfs_refine_height_class_init,
+      (GtsObjectInitFunc) NULL,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_refine_surface_class ()),
+				  &gfs_refine_height_info);
+  }
+
+  return klass;
+}
diff --git a/src/refine.h b/src/refine.h
index a2f2fd8..eb36d05 100644
--- a/src/refine.h
+++ b/src/refine.h
@@ -98,6 +98,13 @@ struct _GfsRefineDistance {
      
 GfsRefineClass * gfs_refine_distance_class  (void);
 
+/* GfsRefineHeight: Header */
+
+#define GFS_IS_REFINE_HEIGHT(obj)         (gts_object_is_from_class (obj,\
+						  gfs_refine_height_class ()))
+     
+GfsRefineClass * gfs_refine_height_class  (void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list