[cig-commits] r6673 - in mc/3D/CitcomS/branches/compressible: CitcomS CitcomS/Components CitcomS/Solver bin lib module tests

tan2 at geodynamics.org tan2 at geodynamics.org
Tue Apr 24 15:16:52 PDT 2007


Author: tan2
Date: 2007-04-24 15:16:50 -0700 (Tue, 24 Apr 2007)
New Revision: 6673

Added:
   mc/3D/CitcomS/branches/compressible/lib/Checkpoints.c
   mc/3D/CitcomS/branches/compressible/lib/checkpoints.h
Modified:
   mc/3D/CitcomS/branches/compressible/CitcomS/Components/IC.py
   mc/3D/CitcomS/branches/compressible/CitcomS/Controller.py
   mc/3D/CitcomS/branches/compressible/CitcomS/Solver/Solver.py
   mc/3D/CitcomS/branches/compressible/bin/Citcom.c
   mc/3D/CitcomS/branches/compressible/lib/Advection_diffusion.c
   mc/3D/CitcomS/branches/compressible/lib/Composition_related.c
   mc/3D/CitcomS/branches/compressible/lib/Full_tracer_advection.c
   mc/3D/CitcomS/branches/compressible/lib/Initial_temperature.c
   mc/3D/CitcomS/branches/compressible/lib/Instructions.c
   mc/3D/CitcomS/branches/compressible/lib/Makefile.am
   mc/3D/CitcomS/branches/compressible/lib/Material_properties.c
   mc/3D/CitcomS/branches/compressible/lib/Output.c
   mc/3D/CitcomS/branches/compressible/lib/Pan_problem_misc_functions.c
   mc/3D/CitcomS/branches/compressible/lib/Problem_related.c
   mc/3D/CitcomS/branches/compressible/lib/Process_buoyancy.c
   mc/3D/CitcomS/branches/compressible/lib/Regional_tracer_advection.c
   mc/3D/CitcomS/branches/compressible/lib/Size_does_matter.c
   mc/3D/CitcomS/branches/compressible/lib/Tracer_setup.c
   mc/3D/CitcomS/branches/compressible/lib/Viscosity_structures.c
   mc/3D/CitcomS/branches/compressible/lib/global_defs.h
   mc/3D/CitcomS/branches/compressible/module/bindings.c
   mc/3D/CitcomS/branches/compressible/module/initial_conditions.c
   mc/3D/CitcomS/branches/compressible/module/initial_conditions.h
   mc/3D/CitcomS/branches/compressible/module/outputs.c
   mc/3D/CitcomS/branches/compressible/module/outputs.h
   mc/3D/CitcomS/branches/compressible/module/setProperties.c
   mc/3D/CitcomS/branches/compressible/tests/Makefile.am
Log:
Implemented writing and reading (binary) checkpoints.

The checkpoint file is called [datafile].chkpt.[rank] and is outputed with an 
interval of controller.checkpointFrequency. Before writing the checkpoint file,
the previous checkpoint file (if exists) is renamed to 
[datafile].chkpt.[rank].bak.

To read back the checkpoint file, set solver.ic.restart=on. The old checkpoint
file, [datafile_old].chkpt.[rank] will be read in. The timestep information is
stored in the checkpoint file. There is no need to specify solution_cycles_init,
as the old way of restarting.

The old way of restarting (read in temperature from the velo files) will still
be available through solver.ic.tic_method=-1. (To do.)

Several things to do: clean up the old way of restarting tracers/composition,
documentation, does mat_control need checkpoints?


Modified: mc/3D/CitcomS/branches/compressible/CitcomS/Components/IC.py
===================================================================
--- mc/3D/CitcomS/branches/compressible/CitcomS/Components/IC.py	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/CitcomS/Components/IC.py	2007-04-24 22:16:50 UTC (rev 6673)
@@ -54,6 +54,7 @@
 
 
     def launch(self):
+        self.initTracer()
         self.initTemperature()
         self.initPressure()
         self.initVelocity()
@@ -61,13 +62,15 @@
         return
 
 
+    def initTracer(self):
+        from CitcomSLib import init_tracer_composition
+        init_tracer_composition(self.all_variables)
+        return
 
+
     def initTemperature(self):
-        from CitcomSLib import constructTemperature, restartTemperature
-        if self.inventory.restart:
-            restartTemperature(self.all_variables)
-        else:
-            constructTemperature(self.all_variables)
+        from CitcomSLib import constructTemperature
+        constructTemperature(self.all_variables)
         return
 
 

Modified: mc/3D/CitcomS/branches/compressible/CitcomS/Controller.py
===================================================================
--- mc/3D/CitcomS/branches/compressible/CitcomS/Controller.py	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/CitcomS/Controller.py	2007-04-24 22:16:50 UTC (rev 6673)
@@ -65,6 +65,8 @@
 
         # do io for 0th step
         self.save()
+
+        ### XXX: if stokes: advection tracers and terminate
         return
 
 
@@ -142,6 +144,7 @@
 
     def save(self):
         self.solver.save(self.inventory.monitoringFrequency)
+        self.solver.checkpoint(self.inventory.checkpointFrequency)
         return
 
 
@@ -151,3 +154,4 @@
         import pyre.inventory
 
         monitoringFrequency = pyre.inventory.int("monitoringFrequency", default=100)
+        checkpointFrequency = pyre.inventory.int("checkpointFrequency", default=100)

Modified: mc/3D/CitcomS/branches/compressible/CitcomS/Solver/Solver.py
===================================================================
--- mc/3D/CitcomS/branches/compressible/CitcomS/Solver/Solver.py	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/CitcomS/Solver/Solver.py	2007-04-24 22:16:50 UTC (rev 6673)
@@ -26,7 +26,7 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #
 
-from CitcomSLib import CPU_time, output, output_time, return_dt, return_t, return_step
+from CitcomSLib import CPU_time, output, output_time, output_checkpoint, return_dt, return_t, return_step
 from pyre.components.Component import Component
 import journal
 
@@ -110,6 +110,8 @@
             print >> stream, "[CitcomS.controller]"
             print >> stream, ("monitoringFrequency=%d" %
                 application.controller.inventory.monitoringFrequency)
+            print >> stream, ("checkpointFrequency=%d" %
+                application.controller.inventory.checkpointFrequency)
             print >> stream
 
         self.setProperties(stream)
@@ -117,17 +119,25 @@
         self.restart = self.inventory.ic.inventory.restart
 
         self.ic_initTemperature = self.inventory.ic.initTemperature
+
+        self._setup()
+
         return
 
 
     def launch(self, application):
-        self._setup()
+        if self.restart:
+            from CitcomSLib import readCheckpoint
+            readCheckpoint(self.all_variables)
 
-        # initial conditions
-        ic = self.inventory.ic
-        ic.launch()
+            # XXX: if post_processing
+            # calling post_processing() and terminate
+        else:
+            # initial conditions
+            ic = self.inventory.ic
+            ic.launch()
 
-        self.solveVelocities()
+            self.solveVelocities()
         return
 
 
@@ -224,6 +234,14 @@
         return
 
 
+    def checkpoint(self, checkpointFrequency):
+        step = self.step
+
+        if not (step % checkpointFrequency):
+            output_checkpoint(self.all_variables)
+        return
+
+
     def setProperties(self, stream):
 
         from CitcomSLib import Solver_set_properties

Modified: mc/3D/CitcomS/branches/compressible/bin/Citcom.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/bin/Citcom.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/bin/Citcom.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -35,6 +35,7 @@
 #include "citcom_init.h"
 #include "output.h"
 #include "parallel_related.h"
+#include "checkpoints.h"
 
 extern int Emergency_stop;
 
@@ -48,6 +49,8 @@
   void general_stokes_solver();
   void general_stokes_solver_pseudo_surf();
   void read_instructions();
+  void initial_setup();
+  void initial_conditions();
   void solve_constrained_flow();
   void solve_derived_velocities();
   void process_temp_field();
@@ -84,6 +87,7 @@
 
   start_time = time = CPU_time0();
   read_instructions(E, argv[1]);
+  initial_setup(E);
 
   cpu_time_on_vp_it = CPU_time0();
   initial_time = cpu_time_on_vp_it - time;
@@ -94,19 +98,27 @@
     fflush(E->fp);
   }
 
-  if (E->control.post_p)   {
-    post_processing(E);
-    parallel_process_termination();
+  /* This if-block is replaced by CitcomS.Solver.launch()*/
+  if (E->control.restart || E->control.post_p) {
+      read_checkpoint(E);
+
+      if (E->control.post_p) {
+          post_processing(E);
+          parallel_process_termination();
+      }
   }
+  else {
+      initial_conditions(E);
 
-  if(E->control.pseudo_free_surf) {
-    if(E->mesh.topvbc == 2)
-	    general_stokes_solver_pseudo_surf(E);
-    else
-	    assert(0);
+      if(E->control.pseudo_free_surf) {
+          if(E->mesh.topvbc == 2)
+              general_stokes_solver_pseudo_surf(E);
+          else
+              assert(0);
+      }
+      else
+          general_stokes_solver(E);
   }
-  else
-    general_stokes_solver(E);
 
   (E->problem_output)(E, E->monitor.solution_cycles);
 
@@ -122,8 +134,6 @@
     parallel_process_termination();
   }
 
-  (E->next_buoyancy_field_init)(E);
-
   while ( E->control.keep_going   &&  (Emergency_stop == 0) )   {
 
     /* The next few lines of code were replaced by
@@ -167,6 +177,10 @@
     /* information about simulation time and wall clock time */
     output_time(E, E->monitor.solution_cycles);
 
+    if ((E->monitor.solution_cycles % E->control.checkpoint_frequency)==0) {
+	output_checkpoint(E);
+    }
+
     if(E->control.mat_control==1)
       read_mat_from_file(E);
     /*

Modified: mc/3D/CitcomS/branches/compressible/lib/Advection_diffusion.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Advection_diffusion.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Advection_diffusion.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -127,6 +127,7 @@
       predictor(E,E->T,E->Tdot);
 
       for(psc_pass=0;psc_pass<E->advection.temp_iterations;psc_pass++)   {
+        /* XXX: replace inputdiff with refstate.conductivity */
 	pg_solver(E,E->T,E->Tdot,DTdot,E->convection.heat_sources,E->control.inputdiff,1,E->node);
 	corrector(E,E->T,E->Tdot,DTdot);
 	temperatures_conform_bcs(E);
@@ -329,6 +330,7 @@
             get_global_shape_fn(E, el, &GN, &GNx, &dOmega, 0,
                                 sphere_key, rtf, E->mesh.levmax, m);
 
+            /* XXX: replace diff with refstate.conductivity */
             pg_shape_fn(E, el, &PG, &GNx, VV,
                         rtf, diff, m);
             element_residual(E, el, PG, GNx, dOmega, VV, T, Tdot,

Added: mc/3D/CitcomS/branches/compressible/lib/Checkpoints.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Checkpoints.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Checkpoints.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -0,0 +1,471 @@
+/*
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *<LicenseText>
+ *
+ * CitcomS by Louis Moresi, Shijie Zhong, Lijie Han, Eh Tan,
+ * Clint Conrad, Michael Gurnis, and Eun-seo Choi.
+ * Copyright (C) 1994-2005, California Institute of Technology.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *</LicenseText>
+ *
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+#include <sys/file.h>
+#include "element_definitions.h"
+#include "global_defs.h"
+
+/* Private function prototypes */
+static void backup_file(const char *output_file);
+static void write_sentinel(FILE *fp);
+static void read_sentinel(FILE *fp, int me);
+static void general_checkpoint(struct All_variables *E, FILE *fp);
+
+static void general_checkpoint(struct All_variables *E, FILE *fp);
+static void tracer_checkpoint(struct All_variables *E, FILE *fp);
+static void composition_checkpoint(struct All_variables *E, FILE *fp);
+static void energy_checkpoint(struct All_variables *E, FILE *fp);
+static void momentum_checkpoint(struct All_variables *E, FILE *fp);
+
+static void read_general_checkpoint(struct All_variables *E, FILE *fp);
+static void read_tracer_checkpoint(struct All_variables *E, FILE *fp);
+static void read_composition_checkpoint(struct All_variables *E, FILE *fp);
+static void read_energy_checkpoint(struct All_variables *E, FILE *fp);
+static void read_momentum_checkpoint(struct All_variables *E, FILE *fp);
+
+
+void output_checkpoint(struct All_variables *E)
+{
+    char output_file[255];
+    FILE *fp1;
+
+    sprintf(output_file, "%s.chkpt.%d", E->control.data_file, E->parallel.me);
+
+    backup_file(output_file);
+
+    fp1 = fopen(output_file, "wb");
+
+    /* checkpoint for general information */
+    /* this must be the first to be checkpointed */
+    general_checkpoint(E, fp1);
+
+    /* checkpoint for tracer/composition */
+    if(E->control.tracer) {
+        tracer_checkpoint(E, fp1);
+
+        if(E->composition.on)
+            composition_checkpoint(E, fp1);
+    }
+
+    /* checkpoint for energy equation */
+    energy_checkpoint(E, fp1);
+
+    /* checkpoint for momentum equation */
+    momentum_checkpoint(E, fp1);
+
+    fclose(fp1);
+    return;
+}
+
+
+void read_checkpoint(struct All_variables *E)
+{
+    char output_file[255];
+    FILE *fp;
+
+    /* open the checkpoint file */
+    snprintf(output_file, 254, "%s.chkpt.%d",
+             E->control.old_P_file, E->parallel.me);
+    fp = fopen(output_file, "rb");
+    if(fp == NULL) {
+        fprintf(stderr, "Cannot open file: %s\n", output_file);
+        exit(-1);
+    }
+
+    /* check mesh information in the checkpoint file */
+    read_general_checkpoint(E, fp);
+
+    /* read tracer/composition information in the checkpoint file */
+    if(E->control.tracer) {
+        read_tracer_checkpoint(E, fp);
+
+        if(E->composition.on)
+            read_composition_checkpoint(E, fp);
+    }
+
+    /* read energy information in the checkpoint file */
+    read_energy_checkpoint(E, fp);
+
+    /* read momentum information in the checkpoint file */
+    read_momentum_checkpoint(E, fp);
+
+    fclose(fp);
+    return;
+}
+
+
+static void backup_file(const char *output_file)
+{
+    char bak_file[255];
+    int ierr;
+
+    /* check the existence of output_file */
+    if(access(output_file, F_OK) == 0) {
+        /* if exist, renamed it to back up */
+        sprintf(bak_file, "%s.bak", output_file);
+        ierr = rename(output_file, bak_file);
+        if(ierr != 0) {
+            fprintf(stderr, "Warning, cannot backup checkpoint files\n");
+        }
+    }
+
+    return;
+}
+
+
+static void write_sentinel(FILE *fp)
+{
+    int a[4] = {0, 0, 0, 0};
+
+    fwrite(a, sizeof(int), 4, fp);
+}
+
+
+static void read_sentinel(FILE *fp, int me)
+{
+    int i, a[4];
+    char nonzero = 0;
+
+    fread(a, sizeof(int), 4, fp);
+
+    /* check whether a[i] are all zero */
+    for(i=0; i<4; i++)
+        nonzero |= a[i];
+
+    if(nonzero) {
+        fprintf(stderr, "Error in reading checkpoint file: wrong sentinel, "
+                "me=%d\n", me);
+        exit(-1);
+    }
+
+    return;
+}
+
+
+static void general_checkpoint(struct All_variables *E, FILE *fp)
+{
+    /* write mesh information */
+    fwrite(&(E->lmesh.nox), sizeof(int), 1, fp);
+    fwrite(&(E->lmesh.noy), sizeof(int), 1, fp);
+    fwrite(&(E->lmesh.noz), sizeof(int), 1, fp);
+    fwrite(&(E->parallel.nprocx), sizeof(int), 1, fp);
+    fwrite(&(E->parallel.nprocy), sizeof(int), 1, fp);
+    fwrite(&(E->parallel.nprocz), sizeof(int), 1, fp);
+    fwrite(&(E->sphere.caps_per_proc), sizeof(int), 1, fp);
+
+    /* write timing information */
+    fwrite(&(E->advection.timesteps), sizeof(int), 1, fp);
+    fwrite(&(E->advection.timestep), sizeof(float), 1, fp);
+
+    return;
+}
+
+
+static void read_general_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int tmp[7];
+    double dtmp;
+
+    /* read mesh information */
+    fread(tmp, sizeof(int), 7, fp);
+
+    if((tmp[0] != E->lmesh.nox) ||
+       (tmp[1] != E->lmesh.noy) ||
+       (tmp[2] != E->lmesh.noz) ||
+       (tmp[3] != E->parallel.nprocx) ||
+       (tmp[4] != E->parallel.nprocy) ||
+       (tmp[5] != E->parallel.nprocz) ||
+       (tmp[6] != E->sphere.caps_per_proc)) {
+
+        fprintf(stderr, "Error in reading checkpoint file: mesh, me=%d\n",
+                E->parallel.me);
+        fprintf(stderr, "%d %d %d %d %d %d %d\n",
+                tmp[0], tmp[1], tmp[2], tmp[3],
+                tmp[4], tmp[5], tmp[6]);
+        exit(-1);
+    }
+
+    /* read timing information */
+    fread(&(E->advection.timesteps), sizeof(int), 1, fp);
+    fread(&(E->advection.timestep), sizeof(float), 1, fp);
+
+    E->monitor.solution_cycles = E->advection.timesteps;
+    return;
+}
+
+
+static void tracer_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int m, i;
+
+    write_sentinel(fp);
+
+    fwrite(&(E->trace.number_of_basic_quantities), sizeof(int), 1, fp);
+    fwrite(&(E->trace.number_of_extra_quantities), sizeof(int), 1, fp);
+    fwrite(&(E->trace.nflavors), sizeof(int), 1, fp);
+    fwrite(&(E->trace.ilast_tracer_count), sizeof(int), 1, fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++)
+        fwrite(&(E->trace.ntracers[m]), sizeof(int), 1, fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        for(i=0; i<E->trace.number_of_basic_quantities; i++) {
+            fwrite(E->trace.basicq[m][i], sizeof(double),
+                   E->trace.ntracers[m]+1, fp);
+        }
+        for(i=0; i<E->trace.number_of_extra_quantities; i++) {
+            fwrite(E->trace.extraq[m][i], sizeof(double),
+                   E->trace.ntracers[m]+1, fp);
+        }
+        fwrite(E->trace.ielement[m], sizeof(int),
+               E->trace.ntracers[m]+1, fp);
+        for(i=0; i<E->trace.nflavors; i++) {
+            fwrite(E->trace.ntracer_flavor[m][i], sizeof(double),
+                   E->lmesh.nel+1, fp);
+        }
+    }
+
+    return;
+}
+
+
+static void read_tracer_checkpoint(struct All_variables *E, FILE *fp)
+{
+    void allocate_tracer_arrays();
+
+    int m, i, itmp;
+
+    read_sentinel(fp, E->parallel.me);
+
+    fread(&itmp, sizeof(int), 1, fp);
+    if (itmp != E->trace.number_of_basic_quantities) {
+        fprintf(stderr, "Error in reading checkpoint file: tracer basicq, me=%d\n",
+                E->parallel.me);
+        fprintf(stderr, "%d\n", itmp);
+        exit(-1);
+
+    }
+
+    fread(&itmp, sizeof(int), 1, fp);
+    if (itmp != E->trace.number_of_extra_quantities) {
+        fprintf(stderr, "Error in reading checkpoint file: tracer extraq, me=%d\n",
+                E->parallel.me);
+        fprintf(stderr, "%d\n", itmp);
+        exit(-1);
+
+    }
+
+    fread(&itmp, sizeof(int), 1, fp);
+    if (itmp != E->trace.nflavors) {
+        fprintf(stderr, "Error in reading checkpoint file: tracer nflavors, me=%d\n",
+                E->parallel.me);
+        fprintf(stderr, "%d\n", itmp);
+        exit(-1);
+
+    }
+
+    fread(&itmp, sizeof(int), 1, fp);
+    E->trace.ilast_tracer_count = itmp;
+
+    /* # of tracers, allocate memory */
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fread(&itmp, sizeof(int), 1, fp);
+        allocate_tracer_arrays(E, m, itmp);
+        E->trace.ntracers[m] = itmp;
+    }
+
+    /* read tracer data */
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        for(i=0; i<E->trace.number_of_basic_quantities; i++) {
+            fread(E->trace.basicq[m][i], sizeof(double),
+                  E->trace.ntracers[m]+1, fp);
+        }
+        for(i=0; i<E->trace.number_of_extra_quantities; i++) {
+            fread(E->trace.extraq[m][i], sizeof(double),
+                  E->trace.ntracers[m]+1, fp);
+        }
+        fread(E->trace.ielement[m], sizeof(int),
+              E->trace.ntracers[m]+1, fp);
+        for(i=0; i<E->trace.nflavors; i++) {
+            fread(E->trace.ntracer_flavor[m][i], sizeof(double),
+                  E->lmesh.nel+1, fp);
+        }
+    }
+
+    return;
+}
+
+
+static void composition_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int m;
+
+    write_sentinel(fp);
+
+    fwrite(&(E->composition.bulk_composition), sizeof(double), 1, fp);
+    fwrite(&(E->composition.initial_bulk_composition), sizeof(double), 1, fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fwrite(E->composition.comp_el[m], sizeof(double),
+               E->lmesh.nel+1, fp);
+    }
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fwrite(E->composition.comp_node[m], sizeof(double),
+               E->lmesh.nno+1, fp);
+    }
+
+    return;
+}
+
+
+static void read_composition_checkpoint(struct All_variables *E, FILE *fp)
+{
+    double tmp;
+    int m;
+
+    read_sentinel(fp, E->parallel.me);
+
+    fread(&tmp, sizeof(double), 1, fp);
+    E->composition.bulk_composition = tmp;
+
+    fread(&tmp, sizeof(double), 1, fp);
+    E->composition.initial_bulk_composition = tmp;
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fread(E->composition.comp_el[m], sizeof(double),
+              E->lmesh.nel+1, fp);
+    }
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fread(E->composition.comp_node[m], sizeof(double),
+              E->lmesh.nno+1, fp);
+    }
+
+    /* preventing uninitialized access */
+    E->trace.istat_iempty = 0;
+    E->composition.error_fraction = E->composition.bulk_composition
+        / E->composition.initial_bulk_composition - 1.0;
+
+    return;
+}
+
+
+static void energy_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int m;
+
+    write_sentinel(fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fwrite(E->T[m], sizeof(double), E->lmesh.nno+1, fp);
+        fwrite(E->Tdot[m], sizeof(double), E->lmesh.nno+1, fp);
+    }
+
+    return;
+}
+
+
+static void read_energy_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int m;
+
+    read_sentinel(fp, E->parallel.me);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        fread(E->T[m], sizeof(double), E->lmesh.nno+1, fp);
+        fread(E->Tdot[m], sizeof(double), E->lmesh.nno+1, fp);
+    }
+
+    return;
+}
+
+
+static void momentum_checkpoint(struct All_variables *E, FILE *fp)
+{
+    int m, i;
+    int lev = E->mesh.levmax;
+
+    write_sentinel(fp);
+
+    fwrite(&(E->monitor.vdotv), sizeof(float), 1, fp);
+    fwrite(&(E->monitor.incompressibility), sizeof(float), 1, fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        /* Pressure at equation points and nodes */
+        /* Writing E->NP instead of calling p_to_nodes() because p_to_nodes()
+         * contains parallel communication */
+        fwrite(E->P[m], sizeof(double), E->lmesh.npno+1, fp);
+        fwrite(E->NP[m], sizeof(float), E->lmesh.nno+1, fp);
+
+        /* velocity at equation points */
+        fwrite(E->U[m], sizeof(double), E->lmesh.neq+2, fp);
+
+        /* viscosity at quadrature points and node points */
+        fwrite(E->EVI[lev][m], sizeof(float),
+               (E->lmesh.nel+2)*vpoints[E->mesh.nsd], fp);
+        fwrite(E->VI[lev][m], sizeof(float), E->lmesh.nno+2, fp);
+    }
+
+    return;
+}
+
+
+static void read_momentum_checkpoint(struct All_variables *E, FILE *fp)
+{
+    void v_from_vector();
+
+    int m, i;
+    int lev = E->mesh.levmax;
+
+    read_sentinel(fp, E->parallel.me);
+
+    fread(&(E->monitor.vdotv), sizeof(float), 1, fp);
+    fread(&(E->monitor.incompressibility), sizeof(float), 1, fp);
+
+    for(m=1; m<=E->sphere.caps_per_proc; m++) {
+        /* Pressure at equation points and nodes */
+        fread(E->P[m], sizeof(double), E->lmesh.npno+1, fp);
+        fread(E->NP[m], sizeof(float), E->lmesh.nno+1, fp);
+
+        /* velocity at equation points */
+        fread(E->U[m], sizeof(double), E->lmesh.neq+2, fp);
+
+        /* viscosity at quadrature points and node points */
+        fread(E->EVI[lev][m], sizeof(float),
+              (E->lmesh.nel+2)*vpoints[E->mesh.nsd], fp);
+        fread(E->VI[lev][m], sizeof(float), E->lmesh.nno+2, fp);
+    }
+
+    /* update velocity array */
+    v_from_vector(E);
+
+    return;
+}
+
+
+

Modified: mc/3D/CitcomS/branches/compressible/lib/Composition_related.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Composition_related.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Composition_related.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -35,7 +35,6 @@
 
 static void allocate_composition_memory(struct All_variables *E);
 static void compute_elemental_composition_ratio_method(struct All_variables *E);
-static void init_composition(struct All_variables *E);
 static void init_bulk_composition(struct All_variables *E);
 static void check_initial_composition(struct All_variables *E);
 static void map_composition_to_nodes(struct All_variables *E);
@@ -92,12 +91,8 @@
 
 void composition_setup(struct All_variables *E)
 {
+    allocate_composition_memory(E);
 
-    if (E->composition.on) {
-        allocate_composition_memory(E);
-        init_composition(E);
-    }
-
     return;
 }
 
@@ -207,7 +202,7 @@
 }
 
 
-static void init_composition(struct All_variables *E)
+void init_composition(struct All_variables *E)
 {
     if (E->composition.ichemical_buoyancy==1 && E->composition.ibuoy_type==1) {
         fill_composition(E);
@@ -386,6 +381,7 @@
 
 
     /* If retarting tracers, the initital bulk composition is read from file */
+    // XXX: remove
     if (E->trace.ic_method == 2 &&
         !E->composition.ireset_initial_composition) {
 

Modified: mc/3D/CitcomS/branches/compressible/lib/Full_tracer_advection.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Full_tracer_advection.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Full_tracer_advection.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -126,7 +126,6 @@
 
     char output_file[200];
     void get_neighboring_caps();
-    void initialize_tracers();
     void analytical_test();
 
     /* Some error control */
@@ -216,17 +215,14 @@
     make_regular_grid(E);
 
 
-    initialize_tracers(E);
-
-
     if (E->trace.ianalytical_tracer_test==1) {
         //TODO: walk into this code...
         analytical_test(E);
         parallel_process_termination();
     }
 
-    composition_setup(E);
-    tracer_post_processing(E);
+    if (E->composition.on)
+        composition_setup(E);
 
     return;
 }

Modified: mc/3D/CitcomS/branches/compressible/lib/Initial_temperature.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Initial_temperature.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Initial_temperature.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -139,15 +139,14 @@
 
 
 
+/* This function is replaced by CitcomS.Components.IC.initTemperature()*/
 void convection_initial_temperature(struct All_variables *E)
 {
-  if (E->control.restart)
-    restart_tic(E);
-  else if (E->control.post_p)
-    restart_tic(E);
-  else
-    construct_tic(E);
+  void report();
 
+  report(E,"Initialize temperature field");
+  construct_tic(E);
+
   /* Note: it is the callee's responsibility to conform tbc. */
   /* like a call to temperatures_conform_bcs(E); */
 
@@ -161,14 +160,7 @@
 
 void restart_tic(struct All_variables *E)
 {
-  /*
-  if (E->control.lith_age)
-    lith_age_restart_tic(E);
-  else
-  */
-  restart_tic_from_file(E);
-
-  return;
+    return;
 }
 
 
@@ -219,7 +211,7 @@
   }
 
   if (E->parallel.me==0)
-    fprintf(E->fp,"Reading %s for restarted temperature\n",output_file);
+    fprintf(E->fp,"Reading %s for initial temperature\n",output_file);
 
   fgets(input_s,1000,fp);
   sscanf(input_s,"%d %d %f",&ll,&mm,&restart_elapsed_time);
@@ -231,15 +223,13 @@
       fgets(input_s,1000,fp);
       sscanf(input_s,"%g %g %g %f",&(v1),&(v2),&(v3),&(g));
 
-      /*  E->sphere.cap[m].V[1][i] = d;
-	  E->sphere.cap[m].V[1][i] = e;
-	  E->sphere.cap[m].V[1][i] = f;  */
+      /* Truncate the temperature to be within (0,1). */
+      /* This might not be desirable in some situations. */
       E->T[m][i] = max(0.0,min(g,1.0));
     }
   }
   fclose (fp);
 
-  temperatures_conform_bcs(E);
   return;
 }
 

Modified: mc/3D/CitcomS/branches/compressible/lib/Instructions.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Instructions.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Instructions.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -145,6 +145,7 @@
 	(E->problem_tracer_setup)(E);
     }
 
+    /* TODO: move to initial_conditions() */
     if(E->control.mat_control) {
       if(E->parallel.me ==0) fprintf(stderr,"IN Instructions.c\n");
       fflush(stderr);
@@ -158,12 +159,8 @@
 
 void read_instructions(struct All_variables *E, char *filename)
 {
-
-    void common_initial_fields();
     void read_initial_settings();
     void global_default_values();
-    void general_stokes_solver_setup();
-    void initial_mesh_solver_setup();
 
     void setup_parser();
     void shutdown_parser();
@@ -184,24 +181,53 @@
     global_default_values(E);
     read_initial_settings(E);
 
+    shutdown_parser(E);
+
+    return;
+}
+
+
+/* This function is replaced by CitcomS.Solver._setup() */
+void initial_setup(struct All_variables *E)
+{
+    void general_stokes_solver_setup();
+    void initial_mesh_solver_setup();
+
     initial_mesh_solver_setup(E);
 
     general_stokes_solver_setup(E);
 
+    (E->next_buoyancy_field_init)(E);
+
+
     if (E->parallel.me==0) fprintf(stderr,"time=%f\n",
                                    CPU_time0()-E->monitor.cpu_time_at_start);
 
+    return;
+}
+
+
+/* This function is replaced by CitcomS.Components.IC.launch()*/
+void initial_conditions(struct All_variables *E)
+{
+    void initialize_tracers();
+    void init_composition();
+    void common_initial_fields();
+
+    if (E->control.tracer==1) {
+        initialize_tracers(E);
+
+        if (E->composition.on)
+            init_composition(E);
+    }
+
     (E->problem_initial_fields)(E);   /* temperature/chemistry/melting etc */
     common_initial_fields(E);  /* velocity/pressure/viscosity (viscosity must be done LAST) */
 
-    shutdown_parser(E);
-
     return;
 }
 
 
-
-
 void read_initial_settings(struct All_variables *E)
 {
   void set_convection_defaults();
@@ -362,6 +388,7 @@
   input_float("tole_compressibility",&(E->control.tole_comp),"0.0",m);
 
   input_int("storage_spacing",&(E->control.record_every),"10",m);
+  input_int("checkpointFrequency",&(E->control.checkpoint_frequency),"100",m);
   input_int("cpu_limits_in_seconds",&(E->control.record_all_until),"5",m);
 
   input_boolean("precond",&(E->control.precondition),"off",m);
@@ -896,6 +923,7 @@
    ============================================================= */
 
 
+/* This function is replaced by CitcomS.Components.IC.launch()*/
 void common_initial_fields(E)
     struct All_variables *E;
 {
@@ -914,7 +942,8 @@
 
     return;
 
-   }
+}
+
 /* ========================================== */
 
 void initial_pressure(E)
@@ -939,9 +968,6 @@
         E->sphere.cap[m].V[1][i]=0.0;
         E->sphere.cap[m].V[2][i]=0.0;
         E->sphere.cap[m].V[3][i]=0.0;
-        E->sphere.cap[m].Vprev[1][i]=0.0;
-        E->sphere.cap[m].Vprev[2][i]=0.0;
-        E->sphere.cap[m].Vprev[3][i]=0.0;
         }
 
     return;

Modified: mc/3D/CitcomS/branches/compressible/lib/Makefile.am
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Makefile.am	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Makefile.am	2007-04-24 22:16:50 UTC (rev 6673)
@@ -60,6 +60,8 @@
 	advection_diffusion.h \
 	advection.h \
 	BC_util.c \
+	Checkpoints.c \
+	checkpoints.h \
 	Citcom_init.c \
 	citcom_init.h \
 	Composition_related.c \

Modified: mc/3D/CitcomS/branches/compressible/lib/Material_properties.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Material_properties.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Material_properties.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -48,6 +48,15 @@
     /* reference profile of coefficient of thermal expansion */
     E->refstate.expansivity = (double *) malloc((noz+1)*sizeof(double));
 
+    /* reference profile of heat capacity */
+    E->refstate.capacity = (double *) malloc((noz+1)*sizeof(double));
+
+    /* reference profile of thermal conductivity */
+    E->refstate.conductivity = (double *) malloc((noz+1)*sizeof(double));
+
+    /* reference profile of gravity */
+    E->refstate.gravity = (double *) malloc((noz+1)*sizeof(double));
+
     /* reference profile of temperature */
     E->refstate.Tadi = (double *) malloc((noz+1)*sizeof(double));
 
@@ -75,6 +84,9 @@
 	z = 1 - r;
 	E->refstate.rho[i] = exp(tmp*z);
 	E->refstate.expansivity[i] = 1;
+	E->refstate.capacity[i] = 1;
+	E->refstate.conductivity[i] = 1;
+	E->refstate.gravity[i] = 1;
 	E->refstate.Tadi[i] = T0 * (exp(E->control.disptn_number * z) - 1);
     }
 

Modified: mc/3D/CitcomS/branches/compressible/lib/Output.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Output.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Output.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -532,4 +532,3 @@
 
   return;
 }
-

Modified: mc/3D/CitcomS/branches/compressible/lib/Pan_problem_misc_functions.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Pan_problem_misc_functions.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Pan_problem_misc_functions.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -128,7 +128,7 @@
 
 void get_buoyancy(struct All_variables *E, double **buoy)
 {
-    int i,m;
+    int i,j,m;
     double temp,temp2;
     void remove_horiz_ave2(struct All_variables*, double**);
 
@@ -156,6 +156,14 @@
     phase_change_apply_670(E, buoy);
     phase_change_apply_cmb(E, buoy);
 
+    /* convert density to buoyancy */
+    for(m=1;m<=E->sphere.caps_per_proc;m++)
+	for(i=1;i<=E->lmesh.noz;i++)
+            for(j=0;j<E->lmesh.nox*E->lmesh.noy;j++) {
+                int n = j*E->lmesh.noz + i;
+                buoy[m][n] *= E->refstate.gravity[i];
+            }
+
     remove_horiz_ave2(E, buoy);
     return;
 }

Modified: mc/3D/CitcomS/branches/compressible/lib/Problem_related.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Problem_related.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Problem_related.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -1,6 +1,6 @@
 /*
  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * 
+ *
  *<LicenseText>
  *
  * CitcomS by Louis Moresi, Shijie Zhong, Lijie Han, Eh Tan,
@@ -22,7 +22,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *</LicenseText>
- * 
+ *
  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  */
 #include <math.h>
@@ -66,6 +66,8 @@
     char output_file[255],input_s[1000];
 
     E->monitor.elapsed_time = 0.0;
+
+#if 0
     if ((E->control.restart || E->control.post_p))    {
 	sprintf(output_file, "%s.velo.%d.%d",E->control.old_P_file,E->parallel.me,E->monitor.solution_cycles_init);
         fp=fopen(output_file,"r");
@@ -77,7 +79,7 @@
         sscanf(input_s,"%d %d %f",&ll,&mm,&E->monitor.elapsed_time);
      fclose(fp);
       } /* end control.restart */
-
+#endif
    return;
 }
 

Modified: mc/3D/CitcomS/branches/compressible/lib/Process_buoyancy.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Process_buoyancy.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Process_buoyancy.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -107,6 +107,7 @@
       uT = 0.0;
       area = 0.0;
       for(i=1;i<=vpts;i++)   {
+        /* XXX: missing unit conversion, heat capacity and conductivity */
         uT += u[i]*T[i]*dOmega.vpt[i] + dTdz[i]*dOmega.vpt[i];
         }
 

Modified: mc/3D/CitcomS/branches/compressible/lib/Regional_tracer_advection.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Regional_tracer_advection.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Regional_tracer_advection.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -56,7 +56,6 @@
 
 void regional_tracer_setup(struct All_variables *E)
 {
-    void initialize_tracers();
 
     char output_file[255];
 
@@ -138,12 +137,7 @@
 
     make_mesh_ijk(E);
 
-
-    initialize_tracers(E);
-
-
     composition_setup(E);
-    tracer_post_processing(E);
 
     return;
 }

Modified: mc/3D/CitcomS/branches/compressible/lib/Size_does_matter.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Size_does_matter.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Size_does_matter.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -994,8 +994,8 @@
                 temp[node] = 0.0;
                 nz = ((E->ien[m][e].node[node]-1) % E->lmesh.noz) + 1;
                 for(nint=1;nint<=vpts;nint++) {
-                    /* XXX: missing heat capcity */
                     temp[node] += E->refstate.rho[nz]
+                        * E->refstate.capacity[nz]
                         * dOmega.vpt[nint]
                         * g_point[nint].weight[E->mesh.nsd-1]
                         * E->N.vpt[GNVINDEX(node,nint)]; /* int Na dV */

Modified: mc/3D/CitcomS/branches/compressible/lib/Tracer_setup.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Tracer_setup.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Tracer_setup.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -51,6 +51,8 @@
 void expand_later_array(struct All_variables *E, int j);
 void expand_tracer_arrays(struct All_variables *E, int j);
 void tracer_post_processing(struct All_variables *E);
+void allocate_tracer_arrays(struct All_variables *E,
+                            int j, int number_of_tracers);
 
 
 static void find_tracers(struct All_variables *E);
@@ -65,8 +67,6 @@
 static void check_sum(struct All_variables *E);
 static int isum_tracers(struct All_variables *E);
 static void init_tracer_flavors(struct All_variables *E);
-static void allocate_tracer_arrays(struct All_variables *E,
-                                   int j, int number_of_tracers);
 static void reduce_tracer_arrays(struct All_variables *E);
 static void put_away_later(struct All_variables *E, int j, int it);
 static void eject_tracer(struct All_variables *E, int j, int it);
@@ -1246,8 +1246,8 @@
 /*                                                                            */
 /* This function allocates memories to tracer arrays.                         */
 
-static void allocate_tracer_arrays(struct All_variables *E,
-                                   int j, int number_of_tracers)
+void allocate_tracer_arrays(struct All_variables *E,
+                            int j, int number_of_tracers)
 {
 
     int kk;

Modified: mc/3D/CitcomS/branches/compressible/lib/Viscosity_structures.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/Viscosity_structures.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/Viscosity_structures.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -178,21 +178,9 @@
       fflush(E->fp_out);
     }
 
+    /* interpolate from gauss quadrature points to node points for */
     visc_from_gint_to_nodes(E,evisc,visc,E->mesh.levmax);
 
-    visc_from_nodes_to_gint(E,visc,evisc,E->mesh.levmax);
-
-    /*
-        visc_to_node_interpolate(E,evisc,visc);
-     */
-
-    /*    for(m=1;m<=E->sphere.caps_per_proc;m++) {
-          for(i=1;i<=E->lmesh.nel;i++)
-          if (i%E->lmesh.elz==0) {
-          fprintf(E->fp_out,"%.4e %.4e %.4e %5d %2d\n",E->eco[m][i].centre[1],E->eco[m][i].centre[2],log10(evisc[m][(i-1)*vpts+1]),i,E->mat[m][i]);
-
-	  }
-          }  */
     return;
 }
 

Added: mc/3D/CitcomS/branches/compressible/lib/checkpoints.h
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/checkpoints.h	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/checkpoints.h	2007-04-24 22:16:50 UTC (rev 6673)
@@ -0,0 +1,31 @@
+/*
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *<LicenseText>
+ *
+ * CitcomS by Louis Moresi, Shijie Zhong, Lijie Han, Eh Tan,
+ * Clint Conrad, Michael Gurnis, and Eun-seo Choi.
+ * Copyright (C) 1994-2005, California Institute of Technology.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *</LicenseText>
+ *
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+
+void output_checkpoint(struct All_variables *E);
+void read_checkpoint(struct All_variables *E);

Modified: mc/3D/CitcomS/branches/compressible/lib/global_defs.h
===================================================================
--- mc/3D/CitcomS/branches/compressible/lib/global_defs.h	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/lib/global_defs.h	2007-04-24 22:16:50 UTC (rev 6673)
@@ -498,6 +498,7 @@
     int total_iteration_cycles;
     int total_v_solver_calls;
 
+    int checkpoint_frequency;
     int record_every;
     int record_all_until;
 
@@ -510,6 +511,9 @@
 struct REF_STATE {
     double *rho;
     double *expansivity;
+    double *capacity;
+    double *conductivity;
+    double *gravity;
     double *Tadi;
     double *dlnrhodr;
 };

Modified: mc/3D/CitcomS/branches/compressible/module/bindings.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/bindings.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/bindings.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -169,16 +169,16 @@
 
     /* from initial_conditions.h */
 
+    {pyCitcom_ic_init_tracer_composition__name__,
+     pyCitcom_ic_init_tracer_composition,
+     METH_VARARGS,
+     pyCitcom_ic_init_tracer_composition__doc__},
+
     {pyCitcom_ic_constructTemperature__name__,
      pyCitcom_ic_constructTemperature,
      METH_VARARGS,
      pyCitcom_ic_constructTemperature__doc__},
 
-    {pyCitcom_ic_restartTemperature__name__,
-     pyCitcom_ic_restartTemperature,
-     METH_VARARGS,
-     pyCitcom_ic_restartTemperature__doc__},
-
     {pyCitcom_ic_initPressure__name__,
      pyCitcom_ic_initPressure,
      METH_VARARGS,
@@ -194,6 +194,11 @@
      METH_VARARGS,
      pyCitcom_ic_initViscosity__doc__},
 
+    {pyCitcom_ic_readCheckpoint__name__,
+     pyCitcom_ic_readCheckpoint,
+     METH_VARARGS,
+     pyCitcom_ic_readCheckpoint__doc__},
+
     /* from mesher.h */
 
     {pyCitcom_full_sphere_launch__name__,
@@ -223,6 +228,11 @@
      METH_VARARGS,
      pyCitcom_output_time__doc__},
 
+    {pyCitcom_output_checkpoint__name__,
+     pyCitcom_output_checkpoint,
+     METH_VARARGS,
+     pyCitcom_output_checkpoint__doc__},
+
     /* from setProperties.h */
 
     {pyCitcom_Advection_diffusion_set_properties__name__,

Modified: mc/3D/CitcomS/branches/compressible/module/initial_conditions.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/initial_conditions.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/initial_conditions.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -32,55 +32,55 @@
 #include "global_defs.h"
 
 
-void construct_tic(struct All_variables*);
-void debug_tic(struct All_variables*);
+void initialize_tracers(struct All_variables*);
+void init_composition(struct All_variables*);
 void initial_pressure(struct All_variables*);
 void initial_velocity(struct All_variables*);
 void initial_viscosity(struct All_variables*);
 void report(struct All_variables*, char* str);
-void restart_tic(struct All_variables*);
+void read_checkpoint(struct All_variables*);
 
 
-char pyCitcom_ic_constructTemperature__doc__[] = "";
-char pyCitcom_ic_constructTemperature__name__[] = "constructTemperature";
+char pyCitcom_ic_init_tracer_composition__doc__[] = "";
+char pyCitcom_ic_init_tracer_composition__name__[] = "init_tracer_composition";
 
-PyObject * pyCitcom_ic_constructTemperature(PyObject *self, PyObject *args)
+PyObject * pyCitcom_ic_init_tracer_composition(PyObject *self, PyObject *args)
 {
     PyObject *obj;
     struct All_variables* E;
 
-    if (!PyArg_ParseTuple(args, "O:constructTemperature", &obj))
+    if (!PyArg_ParseTuple(args, "O:init_tracer_composition", &obj))
         return NULL;
 
     E = (struct All_variables*)(PyCObject_AsVoidPtr(obj));
 
-    report(E,"Initialize temperature field");
-    construct_tic(E);
+    if (E->control.tracer==1) {
+        initialize_tracers(E);
 
-    if(E->control.verbose)
-        debug_tic(E);
-    
+        if (E->composition.on)
+            init_composition(E);
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 
 
-char pyCitcom_ic_restartTemperature__doc__[] = "";
-char pyCitcom_ic_restartTemperature__name__[] = "restartTemperature";
+char pyCitcom_ic_constructTemperature__doc__[] = "";
+char pyCitcom_ic_constructTemperature__name__[] = "constructTemperature";
 
-PyObject * pyCitcom_ic_restartTemperature(PyObject *self, PyObject *args)
+PyObject * pyCitcom_ic_constructTemperature(PyObject *self, PyObject *args)
 {
     PyObject *obj;
     struct All_variables* E;
 
-    if (!PyArg_ParseTuple(args, "O:restartTemperature", &obj))
+    if (!PyArg_ParseTuple(args, "O:constructTemperature", &obj))
         return NULL;
 
     E = (struct All_variables*)(PyCObject_AsVoidPtr(obj));
 
-    report(E,"Initialize temperature field");
-    restart_tic(E);
+    (E->problem_initial_fields)(E);
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -154,6 +154,27 @@
 
 
 
+char pyCitcom_ic_readCheckpoint__doc__[] = "";
+char pyCitcom_ic_readCheckpoint__name__[] = "readCheckpoint";
+
+PyObject * pyCitcom_ic_readCheckpoint(PyObject *self, PyObject *args)
+{
+    PyObject *obj;
+    struct All_variables* E;
+
+    if (!PyArg_ParseTuple(args, "O:readCheckpoint", &obj))
+        return NULL;
+
+    E = (struct All_variables*)(PyCObject_AsVoidPtr(obj));
+
+    read_checkpoint(E);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+
+
 /* $Id$ */
 
 /* End of file */

Modified: mc/3D/CitcomS/branches/compressible/module/initial_conditions.h
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/initial_conditions.h	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/initial_conditions.h	2007-04-24 22:16:50 UTC (rev 6673)
@@ -29,16 +29,16 @@
 #define pyCitcom_initial_conditions_h
 
 
+extern char pyCitcom_ic_init_tracer_composition__name__[];
+extern char pyCitcom_ic_init_tracer_composition__doc__[];
+PyObject * pyCitcom_ic_init_tracer_composition(PyObject *, PyObject *);
+
+
 extern char pyCitcom_ic_constructTemperature__name__[];
 extern char pyCitcom_ic_constructTemperature__doc__[];
 PyObject * pyCitcom_ic_constructTemperature(PyObject *, PyObject *);
 
 
-extern char pyCitcom_ic_restartTemperature__name__[];
-extern char pyCitcom_ic_restartTemperature__doc__[];
-PyObject * pyCitcom_ic_restartTemperature(PyObject *, PyObject *);
-
-
 extern char pyCitcom_ic_initPressure__name__[];
 extern char pyCitcom_ic_initPressure__doc__[];
 PyObject * pyCitcom_ic_initPressure(PyObject *, PyObject *);
@@ -53,6 +53,12 @@
 extern char pyCitcom_ic_initViscosity__doc__[];
 PyObject * pyCitcom_ic_initViscosity(PyObject *, PyObject *);
 
+
+extern char pyCitcom_ic_readCheckpoint__name__[];
+extern char pyCitcom_ic_readCheckpoint__doc__[];
+PyObject * pyCitcom_ic_readCheckpoint(PyObject *, PyObject *);
+
+
 #endif
 
 /* $Id$ */

Modified: mc/3D/CitcomS/branches/compressible/module/outputs.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/outputs.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/outputs.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -102,6 +102,28 @@
 }
 
 
+char pyCitcom_output_checkpoint__doc__[] = "";
+char pyCitcom_output_checkpoint__name__[] = "output_checkpoint";
+
+PyObject * pyCitcom_output_checkpoint(PyObject *self, PyObject *args)
+{
+    void read_checkpoint(struct All_variables*);
+    PyObject *obj;
+    struct All_variables* E;
+
+    if (!PyArg_ParseTuple(args, "O:output_checkpoint", &obj))
+        return NULL;
+
+    E = (struct All_variables*)(PyCObject_AsVoidPtr(obj));
+
+    output_checkpoint(E);
+
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+
 /* $Id$ */
 
 /* End of file */

Modified: mc/3D/CitcomS/branches/compressible/module/outputs.h
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/outputs.h	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/outputs.h	2007-04-24 22:16:50 UTC (rev 6673)
@@ -40,6 +40,10 @@
 extern char pyCitcom_output_time__doc__[];
 PyObject * pyCitcom_output_time(PyObject *, PyObject *);
 
+extern char pyCitcom_output_checkpoint__name__[];
+extern char pyCitcom_output_checkpoint__doc__[];
+PyObject * pyCitcom_output_checkpoint(PyObject *, PyObject *);
+
 #endif
 
 /* $Id$ */

Modified: mc/3D/CitcomS/branches/compressible/module/setProperties.c
===================================================================
--- mc/3D/CitcomS/branches/compressible/module/setProperties.c	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/module/setProperties.c	2007-04-24 22:16:50 UTC (rev 6673)
@@ -462,6 +462,7 @@
     E->advection.min_timesteps = 1;
     E->advection.max_timesteps = 1;
     E->advection.max_total_timesteps = 1;
+    E->control.checkpoint_frequency = 1;
     E->control.record_every = 1;
     E->control.record_all_until = 1;
 

Modified: mc/3D/CitcomS/branches/compressible/tests/Makefile.am
===================================================================
--- mc/3D/CitcomS/branches/compressible/tests/Makefile.am	2007-04-24 22:09:46 UTC (rev 6672)
+++ mc/3D/CitcomS/branches/compressible/tests/Makefile.am	2007-04-24 22:16:50 UTC (rev 6673)
@@ -25,9 +25,7 @@
 
 EXTRA_DIST = \
 	array2d.cc \
-	asap.py \
 	exchange.py \
-	hrothgar.py \
 	signon.py \
 	test1.sh \
 	test2.sh \



More information about the cig-commits mailing list