[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203

Stephane Popinet popinet at users.sf.net
Fri May 15 02:53:53 UTC 2009


The following commit has been merged in the upstream branch:
commit 47052d5d74a226a5b469a77ce51cb7263151a5e8
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Sun Jan 28 18:52:57 2007 +1100

    Initialisation of simulation is done using gfs_simulation_init()
    
    darcs-hash:20070128075257-d4795-9b3980786c0bf30d6830b2719aae57d48f350df3.gz

diff --git a/src/adaptive.c b/src/adaptive.c
index bebef75..7696961 100644
--- a/src/adaptive.c
+++ b/src/adaptive.c
@@ -712,12 +712,6 @@ static FttCell * remove_top_fine (GtsEHeap * h, gdouble * cost, GfsVariable * hf
   return cell;
 }
 
-static void cell_coarse_init (FttCell * cell, AdaptParams * p)
-{
-  CELL_COST (cell) = 0.;
-  gfs_cell_coarse_init (cell, GFS_DOMAIN (p->sim));
-}
-
 static gdouble refine_cost (FttCell * cell, GfsSimulation * sim)
 {
   GSList * i = sim->adapts->items;
@@ -887,7 +881,7 @@ static void adapt_global (GfsSimulation * simulation,
   
   gfs_domain_cell_traverse (domain, 
 			    FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-			    (FttCellTraverseFunc) cell_coarse_init, &apar);
+			    (FttCellTraverseFunc) gfs_cell_reset, apar.costv);
   for (l = *depth; l >= 0; l--)
     gfs_domain_cell_traverse (domain, 
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEVEL, l,
@@ -1036,10 +1030,6 @@ static void refine_cell_mark (FttCell * cell, AdaptLocalParams * p)
 static void adapt_local (GfsSimulation * sim, guint * depth, GfsAdaptStats * s)
 {
   GfsDomain * domain = GFS_DOMAIN (sim);
-
-  gfs_domain_cell_traverse (domain, FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-			   (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
-
   AdaptLocalParams p;
   p.sim = sim;
   p.depth = *depth;
@@ -1114,8 +1104,7 @@ void gfs_simulation_adapt (GfsSimulation * simulation)
     for (l = depth - 2; l >= 0; l--)
       gfs_domain_cell_traverse (domain, 
 				FTT_PRE_ORDER, FTT_TRAVERSE_LEVEL, l,
-				(FttCellTraverseFunc) refine_cell_corner, 
-				domain);
+				(FttCellTraverseFunc) refine_cell_corner, domain);
     gfs_domain_match (domain);
     gfs_set_merged (domain);
     i = domain->variables;
diff --git a/src/ocean.c b/src/ocean.c
index 637bcab..8008674 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -264,14 +264,10 @@ static void ocean_run (GfsSimulation * sim)
   domain = GFS_DOMAIN (sim);
 
   gfs_simulation_refine (sim);
+  gfs_simulation_init (sim);
 
-  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_init, sim);
-
-  gfs_set_merged (domain);
   i = domain->variables;
   while (i) {
-    gfs_event_init (i->data, sim);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
     if (GFS_IS_VARIABLE_RESIDUAL (i->data))
       res = i->data;
     i = i->next;
@@ -290,9 +286,6 @@ static void ocean_run (GfsSimulation * sim)
     GfsVariable * g[2];
     gdouble tstart = gfs_clock_elapsed (domain->timer);
 
-    gfs_domain_cell_traverse (domain,
-			      FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-			      (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
     gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_do, sim);
 
     gfs_simulation_set_timestep (sim);
@@ -338,7 +331,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);
+    gfs_simulation_adapt (sim, NULL);
 
     gts_range_add_value (&domain->timestep, gfs_clock_elapsed (domain->timer) - tstart);
     gts_range_update (&domain->timestep);
diff --git a/src/simulation.c b/src/simulation.c
index ce71360..9205278 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -478,14 +478,10 @@ static void simulation_run (GfsSimulation * sim)
   g_assert (pmac);
 
   gfs_simulation_refine (sim);
+  gfs_simulation_init (sim);
 
-  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_init, sim);
-
-  gfs_set_merged (domain);
   i = domain->variables;
   while (i) {
-    gfs_event_init (GFS_EVENT (i->data), sim);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
     if (GFS_IS_VARIABLE_RESIDUAL (i->data))
       res = i->data;
     i = i->next;
@@ -503,9 +499,6 @@ static void simulation_run (GfsSimulation * sim)
     GfsVariable * g[FTT_DIMENSION];
     gdouble tstart = gfs_clock_elapsed (domain->timer);
 
-    gfs_domain_cell_traverse (domain,
-			      FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-			      (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
     gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_do, sim);
 
     gfs_simulation_set_timestep (sim);
@@ -519,7 +512,7 @@ static void simulation_run (GfsSimulation * sim)
 			p, sim->physical_params.alpha, g);
     gfs_variables_swap (p, pmac);
 
-    gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_half_do, sim);    
+    gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_half_do, sim);
 
     gfs_centered_velocity_advection_diffusion (domain,
 					       FTT_DIMENSION,
@@ -536,7 +529,7 @@ static void simulation_run (GfsSimulation * sim)
       gfs_correct_centered_velocities (domain, 2, g, -sim->advection_params.dt);
     }
 
-    gfs_simulation_adapt (sim);
+    gfs_simulation_adapt (sim, NULL);
     gfs_approximate_projection (domain,
    				&sim->approx_projection_params, 
     				&sim->advection_params, p, sim->physical_params.alpha, res);
@@ -724,7 +717,7 @@ static gdouble cell_2nd_principal_invariant (FttCell * cell, FttCellFace * face,
   return gfs_2nd_principal_invariant (cell, gfs_domain_velocity (domain))/ftt_cell_size (cell);
 }
 
-static void gfs_simulation_init (GfsSimulation * object)
+static void simulation_init (GfsSimulation * object)
 {
   GfsDomain * domain = GFS_DOMAIN (object);
   static GfsDerivedVariableInfo derived_variable[] = {
@@ -806,7 +799,7 @@ GfsSimulationClass * gfs_simulation_class (void)
       sizeof (GfsSimulation),
       sizeof (GfsSimulationClass),
       (GtsObjectClassInitFunc) gfs_simulation_class_init,
-      (GtsObjectInitFunc) gfs_simulation_init,
+      (GtsObjectInitFunc) simulation_init,
       (GtsArgSetFunc) NULL,
       (GtsArgGetFunc) NULL
     };
@@ -828,6 +821,39 @@ GfsSimulation * gfs_simulation_new (GfsSimulationClass * klass)
   return object;
 }
 
+static void init_non_variable (GfsEvent * event, GfsSimulation * sim)
+{
+  if (!GFS_IS_VARIABLE (event))
+    gfs_event_init (event, sim);
+}
+
+/**
+ * gfs_simulation_init:
+ * @sim: a #GfsSimulation.
+ *
+ * Initialises @sim: matches boundary conditions, applies boundary
+ * conditions and initialises all variables, etc...
+ */
+void gfs_simulation_init (GfsSimulation * sim)
+{
+  g_return_if_fail (sim != NULL);
+
+  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) init_non_variable, sim);
+
+  GfsDomain * domain = GFS_DOMAIN (sim);
+  gfs_domain_match (domain);
+  gfs_set_merged (domain);
+  GSList * i = domain->variables;
+  while (i) {
+    gfs_event_init (GFS_EVENT (i->data), sim);
+    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
+    i = i->next;
+  }
+  gfs_domain_cell_traverse (domain,
+			    FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
+			    (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
+}
+
 static void refine_cell_corner (FttCell * cell, GfsDomain * domain)
 {
   if (ftt_refine_corner (cell))
@@ -1305,30 +1331,15 @@ void gfs_simulation_run (GfsSimulation * sim)
 
 static void advection_run (GfsSimulation * sim)
 {
-  GfsDomain * domain;
-  GSList * i;
-
-  domain = GFS_DOMAIN (sim);
+  GfsDomain * domain = GFS_DOMAIN (sim);
 
   gfs_simulation_refine (sim);
-
-  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_init, sim);
-
-  gfs_set_merged (domain);
-  i = domain->variables;
-  while (i) {
-    gfs_event_init (GFS_EVENT (i->data), sim);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
-    i = i->next;
-  }
+  gfs_simulation_init (sim);
 
   while (sim->time.t < sim->time.end &&
 	 sim->time.i < sim->time.iend) {
     gdouble tstart = gfs_clock_elapsed (domain->timer);
 
-    gfs_domain_cell_traverse (domain,
-			      FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-			      (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
     gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_do, sim);
 
     gfs_simulation_set_timestep (sim);
@@ -1341,30 +1352,11 @@ static void advection_run (GfsSimulation * sim)
 			      (FttFaceTraverseFunc) gfs_face_interpolated_normal_velocity,
 			      gfs_domain_velocity (domain));
 
-    i = domain->variables;
-    while (i) {
-      if (GFS_IS_VARIABLE_TRACER (i->data)) {
-	GfsVariableTracer * t = GFS_VARIABLE_TRACER (i->data);
-
-	t->advection.dt = sim->advection_params.dt;
-	switch (t->advection.scheme) {
-	case GFS_GODUNOV:
-	  gfs_tracer_advection_diffusion (domain, &t->advection);
-	  break;
-	case GFS_VOF:
-	  gfs_tracer_vof_advection (domain, &t->advection);
-	  gfs_domain_variable_centered_sources (domain, i->data, i->data, t->advection.dt);
-	  break;
-	case GFS_NONE:
-	  break;
-	}
-      }
-      i = i->next;
-    }
+    advance_tracers (domain, sim->advection_params.dt);
 
     gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_half_do, sim);
 
-    gfs_simulation_adapt (sim);
+    gfs_simulation_adapt (sim, NULL);
 
     sim->time.t = sim->tnext;
     sim->time.i++;
@@ -1375,8 +1367,7 @@ static void advection_run (GfsSimulation * sim)
     gts_range_update (&domain->size);
   }
   gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_do, sim);  
-  gts_container_foreach (GTS_CONTAINER (sim->events),
-			 (GtsFunc) gts_object_destroy, NULL);
+  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gts_object_destroy, NULL);
 }
 
 static void gfs_advection_class_init (GfsSimulationClass * klass)
@@ -1461,21 +1452,16 @@ static void copy_res (FttCell * cell, gpointer * data)
 
 static void poisson_run (GfsSimulation * sim)
 {
-  GfsDomain * domain;
+  GfsDomain * domain = GFS_DOMAIN (sim);
   GfsVariable * dia, * div, * res = NULL, * res1, * p;
   GfsMultilevelParams * par = &sim->approx_projection_params;
   GSList * i;
 
-  domain = GFS_DOMAIN (sim);
-
   gfs_simulation_refine (sim);
-
-  gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_init, sim);
+  gfs_simulation_init (sim);
 
   i = domain->variables;
   while (i) {
-    gfs_event_init (GFS_EVENT (i->data), sim);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
     if (GFS_IS_VARIABLE_RESIDUAL (i->data))
       res = i->data;
     i = i->next;
@@ -1508,9 +1494,6 @@ static void poisson_run (GfsSimulation * sim)
 				(FttCellTraverseFunc) copy_res, data);
     }
 
-    gfs_domain_cell_traverse (domain,
-    			      FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-    			      (FttCellTraverseFunc) gfs_cell_coarse_init, domain);
     gts_container_foreach (GTS_CONTAINER (sim->events), (GtsFunc) gfs_event_do, sim);
 
     gfs_domain_timer_start (domain, "poisson_cycle");
@@ -1518,7 +1501,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);
+    gfs_simulation_adapt (sim, NULL);
 
     par->niter++;
     sim->time.t = sim->tnext;
diff --git a/src/simulation.h b/src/simulation.h
index 5b2e8c7..60096ac 100644
--- a/src/simulation.h
+++ b/src/simulation.h
@@ -95,6 +95,7 @@ struct _GfsSimulationClass {
 
 GfsSimulationClass * gfs_simulation_class        (void);
 GfsSimulation *      gfs_simulation_new          (GfsSimulationClass * klass);
+void                 gfs_simulation_init         (GfsSimulation * sim);
 void                 gfs_simulation_write        (GfsSimulation * sim,
 						  gint max_depth,  
 						  FILE * fp);
diff --git a/src/tension.c b/src/tension.c
index 2c892b6..7eda62e 100644
--- a/src/tension.c
+++ b/src/tension.c
@@ -430,7 +430,6 @@ static void variable_curvature_class_init (GtsObjectClass * klass)
   klass->read = variable_curvature_read;
   klass->write = variable_curvature_write;
   GFS_EVENT_CLASS (klass)->event = variable_curvature_event;
-  GFS_EVENT_CLASS (klass)->event_half = variable_curvature_event_half;
 }
 
 static void curvature_coarse_fine (FttCell * parent, GfsVariable * v)
diff --git a/tools/gfs2oogl.c b/tools/gfs2oogl.c
index 7e187f5..6d8eb7e 100644
--- a/tools/gfs2oogl.c
+++ b/tools/gfs2oogl.c
@@ -691,7 +691,6 @@ static void velocity_norm (FttCell * cell, gpointer * data)
 int main (int argc, char * argv[])
 {
   int c = 0;
-  GSList * i;
   GfsVariable * var = NULL;
   GtsFile * fp;
   GtsSurface * surface = NULL;
@@ -978,6 +977,7 @@ int main (int argc, char * argv[])
 	       fp->line, fp->pos, fp->error);
       return 1;
     }
+    gfs_simulation_init (simulation);
 
     domain = GFS_DOMAIN (simulation);
 
@@ -1011,21 +1011,12 @@ int main (int argc, char * argv[])
     if (verbose)
       fprintf (stderr, "gfs2oogl: processing t = %10e\n", simulation->time.t);
 
-    if (!reinit)
-      gfs_domain_match (domain);
-    else
+    if (reinit) {
       gfs_simulation_refine (simulation);
-
-    i = domain->variables;
-    while (i) {
-      gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, i->data);
-      i = i->next;
+      gfs_simulation_init (simulation);
     }
 
     if (var != NULL) {
-      gfs_domain_cell_traverse (domain,
-				FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
-				(FttCellTraverseFunc) var->fine_coarse, var);
       if (min == max) {
 	stats = gfs_domain_stats_variable (domain, var, FTT_TRAVERSE_ALL, -1);
 	if (verbose)
diff --git a/tools/gfscompare.c b/tools/gfscompare.c
index d9a2dc8..49bfc4d 100644
--- a/tools/gfscompare.c
+++ b/tools/gfscompare.c
@@ -523,6 +523,7 @@ int main (int argc, char * argv[])
   }
   gts_file_destroy (fp);
   fclose (f);
+  gfs_simulation_init (s1);
 
   f = fopen (fname2, "rt");
   if (f == NULL) {
@@ -539,6 +540,7 @@ int main (int argc, char * argv[])
   }
   gts_file_destroy (fp);
   fclose (f);
+  gfs_simulation_init (s2);
 
   var1 = gfs_variable_from_name (GFS_DOMAIN (s1)->variables, name);
   if (var1 == NULL) {

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list