[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:29 UTC 2009
The following commit has been merged in the upstream branch:
commit b15d86aee2b85204ec6df9dc03d7a87e3eb617f1
Author: Stephane Popinet <popinet at users.sf.net>
Date: Tue Feb 20 09:18:18 2007 +1100
GfsOutputAdaptStats works again
darcs-hash:20070219221818-d4795-ae12a006b2e7c6c022d37acf76c9b1a243916a4a.gz
diff --git a/src/adaptive.c b/src/adaptive.c
index 9606949..0761534 100644
--- a/src/adaptive.c
+++ b/src/adaptive.c
@@ -924,8 +924,7 @@ static void adapt_global (GfsSimulation * simulation,
fprintf (stderr, "coarsen: %d\n", apar.nc);
#endif /* DEBUG */
fine = remove_top_fine (apar.hfine, &cfine, apar.hfinev);
- if (s)
- gts_range_add_value (&s->removed, n - apar.nc);
+ s->removed += n - apar.nc;
changed = TRUE;
}
if (coarse && ((-ccoarse > cfine && apar.nc < mincells) ||
@@ -940,15 +939,12 @@ static void adapt_global (GfsSimulation * simulation,
fprintf (stderr, "refine: %d\n", apar.nc);
#endif /* DEBUG */
coarse = remove_top_coarse (apar.hcoarse, &ccoarse, apar.hcoarsev);
- if (s)
- gts_range_add_value (&s->created, apar.nc - n);
+ s->created += apar.nc - n;
changed = TRUE;
}
}
- if (s) {
- gts_range_add_value (&s->cmax, -ccoarse);
- gts_range_add_value (&s->ncells, apar.nc);
- }
+ gts_range_add_value (&s->cmax, -ccoarse);
+ gts_range_add_value (&s->ncells, apar.nc);
gts_eheap_destroy (apar.hcoarse);
gts_eheap_destroy (apar.hfine);
@@ -959,8 +955,9 @@ static void adapt_global (GfsSimulation * simulation,
typedef struct {
GfsSimulation * sim;
- guint depth;
+ guint depth, nc;
GfsVariable * r, * c;
+ GfsAdaptStats * s;
} AdaptLocalParams;
#define REFINABLE(cell, p) (GFS_VARIABLE (cell, (p)->r->i))
@@ -975,11 +972,27 @@ static gboolean coarsen_cell (FttCell * cell, AdaptLocalParams * p)
return COARSENABLE (cell, p);
}
+static void cell_cleanup (FttCell * cell, AdaptLocalParams * p)
+{
+ gfs_cell_cleanup (cell);
+ p->s->removed++;
+ p->nc--;
+}
+
static void coarsen_box (GfsBox * box, AdaptLocalParams * p)
{
ftt_cell_coarsen (box->root,
(FttCellCoarsenFunc) coarsen_cell, p,
- (FttCellCleanupFunc) gfs_cell_cleanup, NULL);
+ (FttCellCleanupFunc) cell_cleanup, p);
+}
+
+static void local_cell_fine_init (FttCell * parent, AdaptLocalParams * p)
+{
+ gfs_cell_fine_init (parent, GFS_DOMAIN (p->sim));
+ if (!GFS_CELL_IS_BOUNDARY (parent)) {
+ p->s->created += FTT_CELLS;
+ p->nc += FTT_CELLS;
+ }
}
static void refine_cell (FttCell * cell, AdaptLocalParams * p)
@@ -987,8 +1000,8 @@ static void refine_cell (FttCell * cell, AdaptLocalParams * p)
if (REFINABLE (cell, p)) {
guint level = ftt_cell_level (cell);
- ftt_cell_refine_corners (cell, (FttCellInitFunc) gfs_cell_fine_init, p->sim);
- ftt_cell_refine_single (cell, (FttCellInitFunc) gfs_cell_fine_init, p->sim);
+ ftt_cell_refine_corners (cell, (FttCellInitFunc) local_cell_fine_init, p);
+ ftt_cell_refine_single (cell, (FttCellInitFunc) local_cell_fine_init, p);
if (level + 1 > p->depth)
p->depth = level + 1;
}
@@ -996,6 +1009,7 @@ static void refine_cell (FttCell * cell, AdaptLocalParams * p)
static void refine_cell_mark (FttCell * cell, AdaptLocalParams * p)
{
+ p->nc++;
REFINABLE (cell, p) = FALSE;
COARSENABLE (cell, p) = TRUE;
if (!GFS_IS_MIXED (cell)) {
@@ -1019,7 +1033,7 @@ static void refine_cell_mark (FttCell * cell, AdaptLocalParams * p)
}
}
-static void adapt_local (GfsSimulation * sim, guint * depth)
+static void adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
{
GfsDomain * domain = GFS_DOMAIN (sim);
@@ -1031,6 +1045,8 @@ static void adapt_local (GfsSimulation * sim, guint * depth)
p.depth = *depth;
p.r = gfs_temporary_variable (domain);
p.c = gfs_temporary_variable (domain);
+ p.s = s;
+ p.nc = 0;
gfs_domain_cell_traverse (domain,
FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
(FttCellTraverseFunc) refine_cell_mark, &p);
@@ -1041,6 +1057,8 @@ static void adapt_local (GfsSimulation * sim, guint * depth)
gts_object_destroy (GTS_OBJECT (p.r));
gts_object_destroy (GTS_OBJECT (p.c));
*depth = p.depth;
+
+ gts_range_add_value (&s->ncells, p.nc);
}
/**
@@ -1056,8 +1074,7 @@ static void adapt_local (GfsSimulation * sim, guint * depth)
* the mesh will be refined only if all of this criteria AND any other
* regular criterion is verified.
*/
-void gfs_simulation_adapt (GfsSimulation * simulation,
- GfsAdaptStats * s)
+void gfs_simulation_adapt (GfsSimulation * simulation)
{
gboolean active = FALSE;
guint mincells = 0, maxcells = G_MAXINT;
@@ -1089,9 +1106,9 @@ void gfs_simulation_adapt (GfsSimulation * simulation,
guint depth = gfs_domain_depth (domain);
if (maxcells < G_MAXINT)
- adapt_global (simulation, &depth, s, mincells, maxcells, c, cmax);
+ adapt_global (simulation, &depth, &simulation->adapts_stats, mincells, maxcells, c, cmax);
else
- adapt_local (simulation, &depth);
+ adapt_local (simulation, &depth, &simulation->adapts_stats);
gint l;
for (l = depth - 2; l >= 0; l--)
@@ -1121,8 +1138,8 @@ void gfs_adapt_stats_init (GfsAdaptStats * s)
{
g_return_if_fail (s != NULL);
- gts_range_init (&s->removed);
- gts_range_init (&s->created);
+ s->removed = 0;
+ s->created = 0;
gts_range_init (&s->cmax);
gts_range_init (&s->ncells);
}
@@ -1137,8 +1154,6 @@ void gfs_adapt_stats_update (GfsAdaptStats * s)
{
g_return_if_fail (s != NULL);
- gts_range_update (&s->removed);
- gts_range_update (&s->created);
gts_range_update (&s->cmax);
gts_range_update (&s->ncells);
}
diff --git a/src/adaptive.h b/src/adaptive.h
index 5a2b730..b2ba02d 100644
--- a/src/adaptive.h
+++ b/src/adaptive.h
@@ -33,8 +33,7 @@ void gfs_cell_fine_init (FttCell * cell,
GfsDomain * domain);
void gfs_adapt_stats_init (GfsAdaptStats * s);
void gfs_adapt_stats_update (GfsAdaptStats * s);
-void gfs_simulation_adapt (GfsSimulation * simulation,
- GfsAdaptStats * s);
+void gfs_simulation_adapt (GfsSimulation * simulation);
/* GfsAdapt: Header */
diff --git a/src/ocean.c b/src/ocean.c
index f5d82e2..9439d7f 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -338,7 +338,7 @@ static void ocean_run (GfsSimulation * sim)
gfs_correct_centered_velocities (domain, 2, g, sim->advection_params.dt/2.);
gfs_domain_timer_stop (domain, "free_surface_pressure");
- gfs_simulation_adapt (sim, NULL);
+ gfs_simulation_adapt (sim);
gts_range_add_value (&domain->timestep, gfs_clock_elapsed (domain->timer) - tstart);
gts_range_update (&domain->timestep);
@@ -719,7 +719,7 @@ static void ocean_run (GfsSimulation * sim)
set_solid3D (sim, solid);
gfs_domain_timer_stop (domain, "free_surface_pressure");
- gfs_simulation_adapt (sim, NULL);
+ gfs_simulation_adapt (sim);
gts_range_add_value (&domain->timestep, gfs_clock_elapsed (domain->timer) - tstart);
gts_range_update (&domain->timestep);
diff --git a/src/output.c b/src/output.c
index 485fee7..14a018f 100644
--- a/src/output.c
+++ b/src/output.c
@@ -781,34 +781,26 @@ static gboolean gfs_output_adapt_stats_event (GfsEvent * event,
gfs_adapt_stats_update (&sim->adapts_stats);
fprintf (GFS_OUTPUT (event)->file->fp,
"Adaptive mesh refinement statistics\n"
- " Cells removed\n"
- " min: %10.0f avg: %10.3f | %10.3f max: %10.0f n: %10d\n"
- " Cells created\n"
- " min: %10.0f avg: %10.3f | %10.3f max: %10.0f n: %10d\n"
- " Maximum cost\n"
- " min: %10.3e avg: %10.3e | %10.3e max: %10.3e n: %10d\n"
+ " Cells removed: %10d\n"
+ " Cells created: %10d\n"
" Number of cells\n"
" min: %10.0f avg: %10.3f | %10.3f max: %10.0f n: %10d\n",
- sim->adapts_stats.removed.min,
- sim->adapts_stats.removed.mean,
- sim->adapts_stats.removed.stddev,
- sim->adapts_stats.removed.max,
- sim->adapts_stats.removed.n,
- sim->adapts_stats.created.min,
- sim->adapts_stats.created.mean,
- sim->adapts_stats.created.stddev,
- sim->adapts_stats.created.max,
- sim->adapts_stats.created.n,
- sim->adapts_stats.cmax.min,
- sim->adapts_stats.cmax.mean,
- sim->adapts_stats.cmax.stddev,
- sim->adapts_stats.cmax.max,
- sim->adapts_stats.cmax.n,
+ sim->adapts_stats.removed,
+ sim->adapts_stats.created,
sim->adapts_stats.ncells.min,
sim->adapts_stats.ncells.mean,
sim->adapts_stats.ncells.stddev,
sim->adapts_stats.ncells.max,
sim->adapts_stats.ncells.n);
+ if (sim->adapts_stats.cmax.n > 0)
+ fprintf (GFS_OUTPUT (event)->file->fp,
+ " Maximum cost\n"
+ " min: %10.3e avg: %10.3e | %10.3e max: %10.3e n: %10d\n",
+ sim->adapts_stats.cmax.min,
+ sim->adapts_stats.cmax.mean,
+ sim->adapts_stats.cmax.stddev,
+ sim->adapts_stats.cmax.max,
+ sim->adapts_stats.cmax.n);
gfs_adapt_stats_init (&sim->adapts_stats);
return TRUE;
}
diff --git a/src/simulation.c b/src/simulation.c
index da04ba2..f0faf3e 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -532,7 +532,7 @@ static void simulation_run (GfsSimulation * sim)
gfs_correct_centered_velocities (domain, 2, g, -sim->advection_params.dt);
}
- gfs_simulation_adapt (sim, NULL);
+ gfs_simulation_adapt (sim);
gfs_approximate_projection (domain,
&sim->approx_projection_params,
&sim->advection_params, p, sim->physical_params.alpha, res);
@@ -1338,7 +1338,7 @@ static void advection_run (GfsSimulation * sim)
gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_half_do, sim);
- gfs_simulation_adapt (sim, NULL);
+ gfs_simulation_adapt (sim);
sim->time.t = sim->tnext;
sim->time.i++;
@@ -1492,7 +1492,7 @@ static void poisson_run (GfsSimulation * sim)
par->residual = gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, 1., res1);
gfs_domain_timer_stop (domain, "poisson_cycle");
- gfs_simulation_adapt (sim, NULL);
+ gfs_simulation_adapt (sim);
par->niter++;
sim->time.t = sim->tnext;
diff --git a/src/simulation.h b/src/simulation.h
index 99fd68d..5b2e8c7 100644
--- a/src/simulation.h
+++ b/src/simulation.h
@@ -47,8 +47,7 @@ struct _GfsPhysicalParams {
};
struct _GfsAdaptStats {
- GtsRange removed;
- GtsRange created;
+ guint removed, created;
GtsRange cmax;
GtsRange ncells;
};
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list