[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