[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:54:14 UTC 2009
The following commit has been merged in the upstream branch:
commit e793c2dc809b3da2d3a44c3460cb5243ec5cec9c
Author: Stephane Popinet <popinet at users.sf.net>
Date: Fri Apr 13 15:56:32 2007 +1000
GfsSurface allows transformations of the input GTS surface
darcs-hash:20070413055632-d4795-0194c1d73290170df24996697bba3ba223ef4bc8.gz
diff --git a/src/solid.c b/src/solid.c
index 1a99ddd..2e637fa 100644
--- a/src/solid.c
+++ b/src/solid.c
@@ -1486,17 +1486,17 @@ static void gfs_surface_read (GtsObject ** o, GtsFile * fp)
if (fp->type == GTS_ERROR)
return;
- GtsSurface * s = GFS_SURFACE (*o)->s;
+ GtsSurface * surface = GFS_SURFACE (*o)->s;
if (fp->type == '{') {
fp->scope_max++;
gts_file_next_token (fp);
- if (gts_surface_read (s, fp))
+ if (gts_surface_read (surface, fp))
return;
if (fp->type != '}') {
gts_file_error (fp, "expecting a closing brace");
return;
}
- check_solid_surface (s, NULL, fp);
+ check_solid_surface (surface, NULL, fp);
if (fp->type == GTS_ERROR)
return;
fp->scope_max--;
@@ -1512,7 +1512,7 @@ static void gfs_surface_read (GtsObject ** o, GtsFile * fp)
return;
}
GtsFile * fp1 = gts_file_new (fptr);
- if (gts_surface_read (s, fp1)) {
+ if (gts_surface_read (surface, fp1)) {
gts_file_error (fp,
"file `%s' is not a valid GTS file\n"
"%s:%d:%d: %s",
@@ -1525,11 +1525,80 @@ static void gfs_surface_read (GtsObject ** o, GtsFile * fp)
gts_file_destroy (fp1);
fclose (fptr);
- check_solid_surface (s, fp->token->str, fp);
+ check_solid_surface (surface, fp->token->str, fp);
if (fp->type == GTS_ERROR)
return;
}
gts_file_next_token (fp);
+
+ if (fp->type == '{') {
+ GtsVector r = {0.,0.,0.}, s = {1.,1.,1.}, t = {0.,0.,0.};
+ gdouble angle = 0., scale = 1.;
+ gboolean flip = FALSE;
+ GtsFileVariable var[] = {
+ {GTS_DOUBLE, "rx", TRUE},
+ {GTS_DOUBLE, "ry", TRUE},
+ {GTS_DOUBLE, "rz", TRUE},
+ {GTS_DOUBLE, "sx", TRUE},
+ {GTS_DOUBLE, "sy", TRUE},
+ {GTS_DOUBLE, "sz", TRUE},
+ {GTS_DOUBLE, "tx", TRUE},
+ {GTS_DOUBLE, "ty", TRUE},
+ {GTS_DOUBLE, "tz", TRUE},
+ {GTS_DOUBLE, "scale", TRUE},
+ {GTS_DOUBLE, "angle", TRUE},
+ {GTS_INT, "flip", TRUE},
+ {GTS_NONE}
+ };
+ GtsFileVariable * v = var;
+
+ (v++)->data = &r[0];
+ (v++)->data = &r[1];
+ (v++)->data = &r[2];
+
+ (v++)->data = &s[0];
+ (v++)->data = &s[1];
+ (v++)->data = &s[2];
+
+ (v++)->data = &t[0];
+ (v++)->data = &t[1];
+ (v++)->data = &t[2];
+
+ (v++)->data = &scale;
+ (v++)->data = ∠
+
+ (v++)->data = &flip;
+
+ gts_file_assign_variables (fp, var);
+ if (fp->type == GTS_ERROR)
+ return;
+
+ if (var[9].set)
+ s[0] = s[1] = s[2] = scale;
+ if (var[10].set && gts_vector_norm (r) == 0.) {
+ gts_file_variable_error (fp, var, "angle",
+ "a non-zero rotation vector must be specified");
+ return;
+ }
+
+ GtsMatrix * m = gts_matrix_translate (NULL, t);
+ if (angle != 0.) {
+ GtsMatrix * mr = gts_matrix_rotate (NULL, r, angle*M_PI/180.);
+ GtsMatrix * m1 = gts_matrix_product (m, mr);
+ gts_matrix_destroy (m);
+ gts_matrix_destroy (mr);
+ m = m1;
+ }
+ GtsMatrix * ms = gts_matrix_scale (NULL, s);
+ GtsMatrix * M = gts_matrix_product (m, ms);
+ gts_matrix_destroy (m);
+ gts_matrix_destroy (ms);
+ gts_surface_foreach_vertex (surface, (GtsFunc) gts_point_transform, M);
+ gts_matrix_destroy (M);
+
+ if (flip)
+ gts_surface_foreach_face (surface, (GtsFunc) gts_triangle_revert, NULL);
+ }
}
static void gfs_surface_write (GtsObject * o, FILE * fp)
diff --git a/test/couette/couette.gfs b/test/couette/couette.gfs
index 1f313d8..ef45735 100644
--- a/test/couette/couette.gfs
+++ b/test/couette/couette.gfs
@@ -40,7 +40,7 @@
1 0 GfsSimulation GfsBox GfsGEdge {} {
Time { iend = 100 dtmax = 1e-2 }
Refine 6
- Surface outer.gts
+ Surface inner.gts { flip = 1 scale = 1.9999 }
Surface inner.gts
ApproxProjectionParams { tolerance = 1e-6 }
AdvectionParams { scheme = none }
diff --git a/test/couette/couette.sh b/test/couette/couette.sh
index c11f04b..5fe9230 100644
--- a/test/couette/couette.sh
+++ b/test/couette/couette.sh
@@ -1,5 +1,4 @@
if ! $donotrun; then
- shapes ellipse | transform -i --scale 1.9999 > outer.gts
shapes ellipse | transform > inner.gts
for model in 0 1 2 3; do
if sed "s/MODEL/$model/g" < $1 | gerris2D -; then :
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list