[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:56:25 UTC 2009
The following commit has been merged in the upstream branch:
commit d56877e18ffa46760d68c5145f9ddcbfaa320703
Author: Stephane Popinet <popinet at users.sf.net>
Date: Mon May 11 14:18:28 2009 +1000
Bug fix for violation of 'corner refinement criterion'
darcs-hash:20090511041828-d4795-0dfcadef024f6016ae07641f8850c4e5a1cabce6.gz
diff --git a/src/adaptive.c b/src/adaptive.c
index 47ba7e1..5c37f6e 100644
--- a/src/adaptive.c
+++ b/src/adaptive.c
@@ -893,18 +893,18 @@ static void cell_fine_init (FttCell * cell, AdaptParams * p)
p->nc += FTT_CELLS;
}
-static void adapt_global (GfsSimulation * simulation,
- guint * depth,
- GfsAdaptStats * s,
- guint mincells, guint maxcells,
- GfsVariable * c,
- gdouble cmax)
+static gboolean adapt_global (GfsSimulation * simulation,
+ guint * depth,
+ GfsAdaptStats * s,
+ guint mincells, guint maxcells,
+ GfsVariable * c,
+ gdouble cmax)
{
GfsDomain * domain = GFS_DOMAIN (simulation);
gint l;
gdouble ccoarse = 0., cfine = 0.;
FttCell * coarse, * fine;
- gboolean changed = TRUE;
+ gboolean changed = TRUE, global_changed = FALSE;
AdaptParams apar;
apar.sim = simulation;
@@ -956,7 +956,7 @@ static void adapt_global (GfsSimulation * simulation,
#endif /* DEBUG */
fine = remove_top_fine (apar.hfine, &cfine, apar.hfinev);
s->removed += n - apar.nc;
- changed = TRUE;
+ changed = global_changed = TRUE;
}
if (coarse && ((-ccoarse > cfine && apar.nc < mincells) ||
(-ccoarse > cmax && apar.nc <= maxcells))) {
@@ -971,7 +971,7 @@ static void adapt_global (GfsSimulation * simulation,
#endif /* DEBUG */
coarse = remove_top_coarse (apar.hcoarse, &ccoarse, apar.hcoarsev);
s->created += apar.nc - n;
- changed = TRUE;
+ changed = global_changed = TRUE;
}
}
gts_range_add_value (&s->cmax, -ccoarse);
@@ -982,6 +982,8 @@ static void adapt_global (GfsSimulation * simulation,
gts_object_destroy (GTS_OBJECT (apar.costv));
gts_object_destroy (GTS_OBJECT (apar.hcoarsev));
gts_object_destroy (GTS_OBJECT (apar.hfinev));
+
+ return global_changed;
}
typedef struct {
@@ -989,6 +991,7 @@ typedef struct {
guint depth, nc;
GfsVariable * r, * c;
GfsAdaptStats * s;
+ gboolean changed;
} AdaptLocalParams;
#define REFINABLE(cell, p) (GFS_VARIABLE (cell, (p)->r->i))
@@ -1006,6 +1009,7 @@ static void cell_cleanup (FttCell * cell, AdaptLocalParams * p)
gfs_cell_cleanup (cell, GFS_DOMAIN (p->sim));
p->s->removed++;
p->nc--;
+ p->changed = TRUE;
}
static void coarsen_box (GfsBox * box, AdaptLocalParams * p)
@@ -1062,7 +1066,7 @@ static void refine_cell_mark (FttCell * cell, AdaptLocalParams * p)
}
}
-static void adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
+static gboolean adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
{
GfsDomain * domain = GFS_DOMAIN (sim);
AdaptLocalParams p;
@@ -1072,6 +1076,7 @@ static void adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
p.c = gfs_temporary_variable (domain);
p.s = s;
p.nc = 0;
+ p.changed = FALSE;
gfs_domain_cell_traverse (domain,
FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
(FttCellTraverseFunc) refine_cell_mark, &p);
@@ -1084,6 +1089,7 @@ static void adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
*depth = p.depth;
gts_range_add_value (&s->ncells, p.nc);
+ return p.changed;
}
/**
@@ -1129,13 +1135,17 @@ void gfs_simulation_adapt (GfsSimulation * simulation)
}
if (active) {
guint depth = gfs_domain_depth (domain);
+ gboolean changed;
if (maxcells < G_MAXINT)
- adapt_global (simulation, &depth, &simulation->adapts_stats, mincells, maxcells, c, cmax);
+ changed = adapt_global (simulation, &depth, &simulation->adapts_stats,
+ mincells, maxcells, c, cmax);
else
- adapt_local (simulation, &depth, &simulation->adapts_stats);
+ changed = adapt_local (simulation, &depth, &simulation->adapts_stats);
- gfs_domain_reshape (domain, depth);
+ gfs_all_reduce (domain, changed, MPI_INT, MPI_MAX);
+ if (changed)
+ gfs_domain_reshape (domain, depth);
}
gfs_domain_timer_stop (domain, "adapt");
diff --git a/src/domain.c b/src/domain.c
index a5100ba..71931d9 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -676,6 +676,20 @@ static void box_changed (GfsBox * box, gboolean * changed)
*changed |= GFS_BOUNDARY (box->neighbor[d])->changed;
}
+static void refine_cell_corner (FttCell * cell, GfsDomain * domain)
+{
+ if (ftt_refine_corner (cell))
+ ftt_cell_refine_single (cell, domain->cell_init, domain->cell_init_data);
+}
+
+static void box_depth (GfsBox * box, guint * depth)
+{
+ guint d = ftt_cell_depth (box->root);
+
+ if (d > *depth)
+ *depth = d;
+}
+
static gboolean domain_match (GfsDomain * domain)
{
FttComponent c = FTT_XYZ;
@@ -692,6 +706,15 @@ static gboolean domain_match (GfsDomain * domain)
gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_receive_bc, datum);
gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_synchronize, &c);
gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_changed, &changed);
+ if (changed) {
+ gint l;
+ guint depth = 0;
+ gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_depth, &depth);
+ for (l = depth - 2; l >= 0; l--)
+ gfs_domain_cell_traverse (domain,
+ FTT_PRE_ORDER, FTT_TRAVERSE_LEVEL, l,
+ (FttCellTraverseFunc) refine_cell_corner, domain);
+ }
gfs_all_reduce (domain, changed, MPI_INT, MPI_MAX);
return changed;
}
@@ -1053,14 +1076,6 @@ void gfs_domain_traverse_cut_2D (GfsDomain * domain,
gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) traverse_cut_2D, &p);
}
-static void box_depth (GfsBox * box, guint * depth)
-{
- guint d = ftt_cell_depth (box->root);
-
- if (d > *depth)
- *depth = d;
-}
-
/**
* gfs_domain_depth:
* @domain: a #GfsDomain.
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list