[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:55:15 UTC 2009
The following commit has been merged in the upstream branch:
commit 2a7bb332f5a46d6e8f4a452379e7fffde1d9cbd5
Author: Stephane Popinet <popinet at users.sf.net>
Date: Thu Apr 24 15:02:20 2008 +1000
New GfsTerrain class
darcs-hash:20080424050220-d4795-b9643210d2a7428dbb88ae9852eb1101a6cd0b6e.gz
diff --git a/modules/terrain.mod b/modules/terrain.mod
index d2b49be..1a5cf2f 100644
--- a/modules/terrain.mod
+++ b/modules/terrain.mod
@@ -739,6 +739,204 @@ GfsRefineClass * gfs_refine_terrain_class (void)
return klass;
}
+/* GfsSurfaceTerrain: Header */
+
+typedef struct _GfsSurfaceTerrain GfsSurfaceTerrain;
+
+struct _GfsSurfaceTerrain {
+ /*< private >*/
+ GfsGenericSurface parent;
+ GfsVariable * h[NM];
+
+ /*< public >*/
+ gchar * name;
+};
+
+#define GFS_SURFACE_TERRAIN(obj) GTS_OBJECT_CAST (obj,\
+ GfsSurfaceTerrain,\
+ gfs_surface_terrain_class ())
+#define GFS_IS_SURFACE_TERRAIN(obj) (gts_object_is_from_class (obj,\
+ gfs_surface_terrain_class ()))
+
+GfsGenericSurfaceClass * gfs_surface_terrain_class (void);
+
+/* GfsSurfaceTerrain: Object */
+
+static void gfs_surface_terrain_read (GtsObject ** o, GtsFile * fp)
+{
+ if (fp->type != GTS_STRING) {
+ gts_file_error (fp, "expecting a variable name");
+ return;
+ }
+ GfsSurfaceTerrain * t = GFS_SURFACE_TERRAIN (*o);
+ t->name = g_strdup (fp->token->str);
+ GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+ guint i;
+ for (i = 0; i < NM; i++) {
+ gchar * name = g_strdup_printf ("%s%d", t->name, i);
+ t->h[i] = gfs_variable_from_name (domain->variables, name);
+ if (!t->h[i]) {
+ gts_file_error (fp, "%s is not a valid variable name", name);
+ g_free (name);
+ return;
+ }
+ t->h[i]->coarse_fine = terrain_coarse_fine;
+ g_free (name);
+ }
+ gts_file_next_token (fp);
+}
+
+static void gfs_surface_terrain_write (GtsObject * o, FILE * fp)
+{
+ fprintf (fp, " %s", GFS_SURFACE_TERRAIN (o)->name);
+}
+
+static void gfs_surface_terrain_destroy (GtsObject * object)
+{
+ g_free (GFS_SURFACE_TERRAIN (object)->name);
+ (* GTS_OBJECT_CLASS (gfs_surface_terrain_class ())->parent_class->destroy)
+ (object);
+}
+
+static GfsGenericSurface * cell_is_cut (FttCell * cell, GfsGenericSurface * s1,
+ gboolean flatten, gint maxlevel)
+{
+ g_assert (!flatten); /* not implemented */
+ if (!FTT_CELL_IS_LEAF (cell))
+ return s1;
+ return GFS_VALUE (cell, GFS_SURFACE_TERRAIN (s1)->h[0]) != G_MAXDOUBLE ? s1 : NULL;
+}
+
+static guint surface_segment_intersection (GfsGenericSurface * s1,
+ FttCell * cell,
+ GfsSegment * I)
+{
+ I->n = 0;
+ I->x = 0.;
+ I->inside = 0;
+
+ FttVector pE, pD;
+ pE.x = I->E->x; pE.y = I->E->y;
+ pD.x = I->D->x; pD.y = I->D->y;
+ gdouble vE = I->E->z - cell_value (cell, GFS_SURFACE_TERRAIN (s1)->h, pE)/4000.;
+ gdouble vD = I->D->z - cell_value (cell, GFS_SURFACE_TERRAIN (s1)->h, pD)/4000.;
+
+ if ((vE > 0. && vD <= 0.) || (vE <= 0. && vD > 0.)) {
+ I->n = 1;
+ I->inside = vE > 0. ? -1 : 1;
+ I->x = vE/(vE - vD);
+#if DEBUG
+ gdouble size = ftt_cell_size (cell)/2.;
+ FttVector q;
+ ftt_cell_pos (cell, &q);
+ pE.x = (pE.x - q.x)/size;
+ pE.y = (pE.y - q.y)/size;
+ pD.x = (pD.x - q.x)/size;
+ pD.y = (pD.y - q.y)/size;
+ fprintf (stderr, "p %g %g %g %g %g %g %g %d %g %g %g %g\n",
+ I->D->x, I->D->y, I->D->z,
+ I->E->x, I->E->y, I->E->z,
+ I->x,
+ ftt_cell_level (cell),
+ pE.x, pE.y, pD.x, pD.y);
+ fprintf (stderr, "q %g %g %g\nq %g %g %g\nq\nq\n",
+ I->D->x, I->D->y, I->D->z,
+ I->E->x, I->E->y, I->E->z);
+ fprintf (stderr, "i %g %g %g\n",
+ I->E->x + I->x*(I->D->x - I->E->x),
+ I->E->y + I->x*(I->D->y - I->E->y),
+ I->E->z + I->x*(I->D->z - I->E->z));
+#endif
+ }
+ return I->n;
+}
+
+static void surface_segment_normal (GfsGenericSurface * s1,
+ FttCell * cell,
+ GfsSegment * I,
+ GtsVector n)
+{
+ GfsVariable ** h = GFS_SURFACE_TERRAIN (s1)->h;
+ gdouble size = ftt_cell_size (cell)/2.;
+ FttVector p, q;
+ ftt_cell_pos (cell, &q);
+ p.x = I->E->x + I->x*(I->D->x - I->E->x);
+ p.y = I->E->y + I->x*(I->D->y - I->E->y);
+ p.x = (p.x - q.x)/size;
+ p.y = (p.y - q.y)/size;
+ n[0] = - (GFS_VALUE (cell, h[1]) + GFS_VALUE (cell, h[3])*p.y)/4000./size;
+ n[1] = - (GFS_VALUE (cell, h[2]) + GFS_VALUE (cell, h[3])*p.x)/4000./size;
+ n[2] = 1.;
+}
+
+static void gfs_surface_terrain_class_init (GfsGenericSurfaceClass * klass)
+{
+ GTS_OBJECT_CLASS (klass)->read = gfs_surface_terrain_read;
+ GTS_OBJECT_CLASS (klass)->write = gfs_surface_terrain_write;
+ GTS_OBJECT_CLASS (klass)->destroy = gfs_surface_terrain_destroy;
+
+ klass->cell_is_cut = cell_is_cut;
+ klass->segment_intersection = surface_segment_intersection;
+ klass->segment_normal = surface_segment_normal;
+}
+
+GfsGenericSurfaceClass * gfs_surface_terrain_class (void)
+{
+ static GfsGenericSurfaceClass * klass = NULL;
+
+ if (klass == NULL) {
+ GtsObjectClassInfo gfs_surface_terrain_info = {
+ "GfsSurfaceTerrain",
+ sizeof (GfsSurfaceTerrain),
+ sizeof (GfsGenericSurfaceClass),
+ (GtsObjectClassInitFunc) gfs_surface_terrain_class_init,
+ (GtsObjectInitFunc) NULL,
+ (GtsArgSetFunc) NULL,
+ (GtsArgGetFunc) NULL
+ };
+ klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_generic_surface_class ()),
+ &gfs_surface_terrain_info);
+ }
+
+ return klass;
+}
+
+/* GfsTerrain: Header */
+
+#define GFS_IS_TERRAIN(obj) (gts_object_is_from_class (obj,\
+ gfs_terrain_class ()))
+
+GfsEventClass * gfs_terrain_class (void);
+
+/* GfsTerrain: Object */
+
+static void terrain_init (GfsSolid * s)
+{
+ gts_object_destroy (GTS_OBJECT (s->s));
+ s->s = GFS_GENERIC_SURFACE (gts_object_new (GTS_OBJECT_CLASS (gfs_surface_terrain_class ())));
+}
+
+GfsEventClass * gfs_terrain_class (void)
+{
+ static GfsEventClass * klass = NULL;
+
+ if (klass == NULL) {
+ GtsObjectClassInfo gfs_terrain_info = {
+ "GfsTerrain",
+ sizeof (GfsSolid),
+ sizeof (GfsEventClass),
+ (GtsObjectClassInitFunc) NULL,
+ (GtsObjectInitFunc) terrain_init,
+ (GtsArgSetFunc) NULL,
+ (GtsArgGetFunc) NULL
+ };
+ klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_solid_class ()),
+ &gfs_terrain_info);
+ }
+
+ return klass;
+}
+
/* Initialize module */
const gchar * g_module_check_init (void);
@@ -751,6 +949,7 @@ const gchar * g_module_check_init (void)
if (dir)
default_dir = dir;
gfs_refine_terrain_class ();
+ gfs_terrain_class ();
return NULL;
}
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list