[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