[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