[cig-commits] r4572 - in mc/3D/CitcomS/trunk: lib module

tan2 at geodynamics.org tan2 at geodynamics.org
Wed Sep 20 12:54:04 PDT 2006


Author: tan2
Date: 2006-09-20 12:54:04 -0700 (Wed, 20 Sep 2006)
New Revision: 4572

Modified:
   mc/3D/CitcomS/trunk/lib/Citcom_init.c
   mc/3D/CitcomS/trunk/lib/Instructions.c
   mc/3D/CitcomS/trunk/module/mesher.cc
   mc/3D/CitcomS/trunk/module/setProperties.cc
Log:
Saving the input parameters to a unique file 'pidXXXXX.cfg' for archives.


Modified: mc/3D/CitcomS/trunk/lib/Citcom_init.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Citcom_init.c	2006-09-20 03:54:07 UTC (rev 4571)
+++ mc/3D/CitcomS/trunk/lib/Citcom_init.c	2006-09-20 19:54:04 UTC (rev 4572)
@@ -31,6 +31,8 @@
 
 struct All_variables* citcom_init(MPI_Comm *world)
 {
+  int get_process_identifier();
+
   struct All_variables *E;
   int rank, nproc;
 
@@ -39,6 +41,7 @@
   MPI_Comm_rank(*world, &rank);
   MPI_Comm_size(*world, &nproc);
 
+  E->control.PID = get_process_identifier();
   E->parallel.world = *world;
   E->parallel.nproc = nproc;
   E->parallel.me = rank;

Modified: mc/3D/CitcomS/trunk/lib/Instructions.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Instructions.c	2006-09-20 03:54:07 UTC (rev 4571)
+++ mc/3D/CitcomS/trunk/lib/Instructions.c	2006-09-20 19:54:04 UTC (rev 4572)
@@ -48,8 +48,6 @@
 
 void read_instructions(struct All_variables *E, char *filename)
 {
-    int get_process_identifier();
-
     void allocate_common_vars();
     void common_initial_fields();
     void read_initial_settings();
@@ -97,8 +95,6 @@
 
     set_signal();
 
-    E->control.PID=get_process_identifier();
-
     /* ==================================================
        Initialize from the command line
        from startup files. (See Parsing.c).

Modified: mc/3D/CitcomS/trunk/module/mesher.cc
===================================================================
--- mc/3D/CitcomS/trunk/module/mesher.cc	2006-09-20 03:54:07 UTC (rev 4571)
+++ mc/3D/CitcomS/trunk/module/mesher.cc	2006-09-20 19:54:04 UTC (rev 4572)
@@ -51,7 +51,6 @@
     void construct_bdry_det (struct All_variables*);
     void construct_surface (struct All_variables*);
     void get_initial_elapsed_time(struct All_variables*);
-    int get_process_identifier();
     void lith_age_init(struct All_variables *E);
     void mass_matrix(struct All_variables*);
     void output_init(struct All_variables*);
@@ -74,8 +73,6 @@
     E->monitor.cpu_time_at_last_cycle =
         E->monitor.cpu_time_at_start = CPU_time0();
 
-    E->control.PID = get_process_identifier();
-
     output_init(E);
     (E->problem_derived_values)(E);   /* call this before global_derived_  */
     (E->solver.global_derived_values)(E);

Modified: mc/3D/CitcomS/trunk/module/setProperties.cc
===================================================================
--- mc/3D/CitcomS/trunk/module/setProperties.cc	2006-09-20 03:54:07 UTC (rev 4571)
+++ mc/3D/CitcomS/trunk/module/setProperties.cc	2006-09-20 19:54:04 UTC (rev 4572)
@@ -38,16 +38,18 @@
 #include "setProperties.h"
 
 
+std::ofstream* get_output_stream(int mute, int pid);
+
 void getStringProperty(PyObject* properties, char* attribute,
-		       char* value, int mute);
+		       char* value, std::ostream* out);
 
 template <class T>
 void getScalarProperty(PyObject* properties, char* attribute,
-		       T& value, int mute);
+		       T& value, std::ostream* out);
 
 template <class T>
 void getVectorProperty(PyObject* properties, char* attribute,
-		       T* vector, int len, int mute);
+		       T* vector, int len, std::ostream* out);
 
 //
 //
@@ -64,24 +66,23 @@
         return NULL;
 
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
-
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Advection_diffusion.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.tsolver]" << std::endl;
 
-    getScalarProperty(properties, "inputdiffusivity", E->control.inputdiff, m);
+    getScalarProperty(properties, "inputdiffusivity", E->control.inputdiff, out);
 
-    getScalarProperty(properties, "ADV", E->advection.ADVECTION, m);
-    getScalarProperty(properties, "fixed_timestep", E->advection.fixed_timestep, m);
-    getScalarProperty(properties, "finetunedt", E->advection.fine_tune_dt, m);
+    getScalarProperty(properties, "ADV", E->advection.ADVECTION, out);
+    getScalarProperty(properties, "fixed_timestep", E->advection.fixed_timestep, out);
+    getScalarProperty(properties, "finetunedt", E->advection.fine_tune_dt, out);
 
-    getScalarProperty(properties, "adv_sub_iterations", E->advection.temp_iterations, m);
-    getScalarProperty(properties, "maxadvtime", E->advection.max_dimensionless_time, m);
+    getScalarProperty(properties, "adv_sub_iterations", E->advection.temp_iterations, out);
+    getScalarProperty(properties, "maxadvtime", E->advection.max_dimensionless_time, out);
 
-    getScalarProperty(properties, "aug_lagr", E->control.augmented_Lagr, m);
-    getScalarProperty(properties, "aug_number", E->control.augmented, m);
+    getScalarProperty(properties, "aug_lagr", E->control.augmented_Lagr, out);
+    getScalarProperty(properties, "aug_number", E->control.augmented, out);
 
-    getScalarProperty(properties, "filter_temp", E->control.filter_temperature, m);
+    getScalarProperty(properties, "filter_temp", E->control.filter_temperature, out);
 
     E->advection.total_timesteps = 1;
     E->advection.sub_iterations = 1;
@@ -91,6 +92,10 @@
 
     E->monitor.T_maxvaried = 1.05;
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -115,32 +120,36 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#BC.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.bc]" << std::endl;
 
-    getScalarProperty(properties, "side_sbcs", E->control.side_sbcs, m);
+    getScalarProperty(properties, "side_sbcs", E->control.side_sbcs, out);
 
-    getScalarProperty(properties, "topvbc", E->mesh.topvbc, m);
-    getScalarProperty(properties, "topvbxval", E->control.VBXtopval, m);
-    getScalarProperty(properties, "topvbyval", E->control.VBYtopval, m);
+    getScalarProperty(properties, "topvbc", E->mesh.topvbc, out);
+    getScalarProperty(properties, "topvbxval", E->control.VBXtopval, out);
+    getScalarProperty(properties, "topvbyval", E->control.VBYtopval, out);
 
-    getScalarProperty(properties, "pseudo_free_surf", E->control.pseudo_free_surf, m);
+    getScalarProperty(properties, "pseudo_free_surf", E->control.pseudo_free_surf, out);
 
-    getScalarProperty(properties, "botvbc", E->mesh.botvbc, m);
-    getScalarProperty(properties, "botvbxval", E->control.VBXbotval, m);
-    getScalarProperty(properties, "botvbyval", E->control.VBYbotval, m);
+    getScalarProperty(properties, "botvbc", E->mesh.botvbc, out);
+    getScalarProperty(properties, "botvbxval", E->control.VBXbotval, out);
+    getScalarProperty(properties, "botvbyval", E->control.VBYbotval, out);
 
-    getScalarProperty(properties, "toptbc", E->mesh.toptbc, m);
-    getScalarProperty(properties, "toptbcval", E->control.TBCtopval, m);
+    getScalarProperty(properties, "toptbc", E->mesh.toptbc, out);
+    getScalarProperty(properties, "toptbcval", E->control.TBCtopval, out);
 
-    getScalarProperty(properties, "bottbc", E->mesh.bottbc, m);
-    getScalarProperty(properties, "bottbcval", E->control.TBCbotval, m);
+    getScalarProperty(properties, "bottbc", E->mesh.bottbc, out);
+    getScalarProperty(properties, "bottbcval", E->control.TBCbotval, out);
 
-    getScalarProperty(properties, "temperature_bound_adj", E->control.temperature_bound_adj, m);
-    getScalarProperty(properties, "depth_bound_adj", E->control.depth_bound_adj, m);
-    getScalarProperty(properties, "width_bound_adj", E->control.width_bound_adj, m);
+    getScalarProperty(properties, "temperature_bound_adj", E->control.temperature_bound_adj, out);
+    getScalarProperty(properties, "depth_bound_adj", E->control.depth_bound_adj, out);
+    getScalarProperty(properties, "width_bound_adj", E->control.width_bound_adj, out);
 
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -164,34 +173,38 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Const.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.const]" << std::endl;
 
     float radius;
-    getScalarProperty(properties, "layerd", radius, m);
-    getScalarProperty(properties, "density", E->data.density, m);
-    getScalarProperty(properties, "thermdiff", E->data.therm_diff, m);
-    getScalarProperty(properties, "gravacc", E->data.grav_acc, m);
-    getScalarProperty(properties, "thermexp", E->data.therm_exp, m);
-    getScalarProperty(properties, "refvisc", E->data.ref_viscosity, m);
-    getScalarProperty(properties, "cp", E->data.Cp, m);
-    getScalarProperty(properties, "wdensity", E->data.density_above, m);
-    getScalarProperty(properties, "surftemp", E->data.surf_temp, m);
+    getScalarProperty(properties, "layerd", radius, out);
+    getScalarProperty(properties, "density", E->data.density, out);
+    getScalarProperty(properties, "thermdiff", E->data.therm_diff, out);
+    getScalarProperty(properties, "gravacc", E->data.grav_acc, out);
+    getScalarProperty(properties, "thermexp", E->data.therm_exp, out);
+    getScalarProperty(properties, "refvisc", E->data.ref_viscosity, out);
+    getScalarProperty(properties, "cp", E->data.Cp, out);
+    getScalarProperty(properties, "wdensity", E->data.density_above, out);
+    getScalarProperty(properties, "surftemp", E->data.surf_temp, out);
 
     E->data.therm_cond = E->data.therm_diff * E->data.density * E->data.Cp;
     E->data.ref_temperature = E->control.Atemp * E->data.therm_diff
 	* E->data.ref_viscosity / (radius * radius * radius)
 	/ (E->data.density * E->data.grav_acc * E->data.therm_exp);
 
-    getScalarProperty(properties, "z_lith", E->viscosity.zlith, m);
-    getScalarProperty(properties, "z_410", E->viscosity.z410, m);
-    getScalarProperty(properties, "z_lmantle", E->viscosity.zlm, m);
-    getScalarProperty(properties, "z_cmb", E->viscosity.zcmb, m); //this is used as the D" phase change depth
+    getScalarProperty(properties, "z_lith", E->viscosity.zlith, out);
+    getScalarProperty(properties, "z_410", E->viscosity.z410, out);
+    getScalarProperty(properties, "z_lmantle", E->viscosity.zlm, out);
+    getScalarProperty(properties, "z_cmb", E->viscosity.zcmb, out); //this is used as the D" phase change depth
 
     // convert meter to kilometer
     E->data.layer_km = radius / 1e3;
     E->data.radius_km = E->data.layer_km;
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -216,20 +229,20 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#IC.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.ic]" << std::endl;
 
-    getScalarProperty(properties, "restart", E->control.restart, m);
-    getScalarProperty(properties, "post_p", E->control.post_p, m);
-    getScalarProperty(properties, "solution_cycles_init", E->monitor.solution_cycles_init, m);
-    getScalarProperty(properties, "zero_elapsed_time", E->control.zero_elapsed_time, m);
+    getScalarProperty(properties, "restart", E->control.restart, out);
+    getScalarProperty(properties, "post_p", E->control.post_p, out);
+    getScalarProperty(properties, "solution_cycles_init", E->monitor.solution_cycles_init, out);
+    getScalarProperty(properties, "zero_elapsed_time", E->control.zero_elapsed_time, out);
 
-    getScalarProperty(properties, "tic_method", E->convection.tic_method, m);
+    getScalarProperty(properties, "tic_method", E->convection.tic_method, out);
 
     if (E->convection.tic_method == 0) {
 	int num_perturb;
 
-	getScalarProperty(properties, "num_perturbations", num_perturb, m);
+	getScalarProperty(properties, "num_perturbations", num_perturb, out);
 	if(num_perturb > PERTURB_MAX_LAYERS) {
 	    std::cerr << "'num_perturb' greater than allowed value, set to "
 		      << PERTURB_MAX_LAYERS << std::endl;
@@ -238,28 +251,33 @@
 	E->convection.number_of_perturbations = num_perturb;
 
 	getVectorProperty(properties, "perturbl", E->convection.perturb_ll,
-			  num_perturb, m);
+			  num_perturb, out);
 	getVectorProperty(properties, "perturbm", E->convection.perturb_mm,
-			  num_perturb, m);
+			  num_perturb, out);
 	getVectorProperty(properties, "perturblayer", E->convection.load_depth,
-			  num_perturb, m);
+			  num_perturb, out);
 	getVectorProperty(properties, "perturbmag", E->convection.perturb_mag,
-			  num_perturb, m);
+			  num_perturb, out);
     }
     else if (E->convection.tic_method == 1) {
-	getScalarProperty(properties, "half_space_age", E->convection.half_space_age, m);
+	getScalarProperty(properties, "half_space_age", E->convection.half_space_age, out);
     }
     else if (E->convection.tic_method == 2) {
-        getScalarProperty(properties, "half_space_age", E->convection.half_space_age, m);
-        getVectorProperty(properties, "blob_center", E->convection.blob_center, 3, m);
+        getScalarProperty(properties, "half_space_age", E->convection.half_space_age, out);
+        getVectorProperty(properties, "blob_center", E->convection.blob_center, 3, out);
         if( E->convection.blob_center[0] == -999.0 && E->convection.blob_center[1] == -999.0 && E->convection.blob_center[2] == -999.0 ) {
             E->convection.blob_center[0] = 0.5*(E->control.theta_min+E->control.theta_max);
             E->convection.blob_center[1] = 0.5*(E->control.fi_min+E->control.fi_max);
             E->convection.blob_center[2] = 0.5*(E->sphere.ri+E->sphere.ro);
         }
-        getScalarProperty(properties, "blob_radius", E->convection.blob_radius, m);
-        getScalarProperty(properties, "blob_dT", E->convection.blob_dT, m);
+        getScalarProperty(properties, "blob_radius", E->convection.blob_radius, out);
+        getScalarProperty(properties, "blob_dT", E->convection.blob_dT, out);
     }
+
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
       return NULL;
 
@@ -283,24 +301,28 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Param.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.param]" << std::endl;
 
-    getScalarProperty(properties, "file_vbcs", E->control.vbcs_file, m);
-    getStringProperty(properties, "vel_bound_file", E->control.velocity_boundary_file, m);
+    getScalarProperty(properties, "file_vbcs", E->control.vbcs_file, out);
+    getStringProperty(properties, "vel_bound_file", E->control.velocity_boundary_file, out);
 
-    getScalarProperty(properties, "mat_control", E->control.mat_control, m);
-    getStringProperty(properties, "mat_file", E->control.mat_file, m);
+    getScalarProperty(properties, "mat_control", E->control.mat_control, out);
+    getStringProperty(properties, "mat_file", E->control.mat_file, out);
 
-    getScalarProperty(properties, "lith_age", E->control.lith_age, m);
-    getStringProperty(properties, "lith_age_file", E->control.lith_age_file, m);
-    getScalarProperty(properties, "lith_age_time", E->control.lith_age_time, m);
-    getScalarProperty(properties, "lith_age_depth", E->control.lith_age_depth, m);
-    getScalarProperty(properties, "mantle_temp", E->control.lith_age_mantle_temp, m);
+    getScalarProperty(properties, "lith_age", E->control.lith_age, out);
+    getStringProperty(properties, "lith_age_file", E->control.lith_age_file, out);
+    getScalarProperty(properties, "lith_age_time", E->control.lith_age_time, out);
+    getScalarProperty(properties, "lith_age_depth", E->control.lith_age_depth, out);
+    getScalarProperty(properties, "mantle_temp", E->control.lith_age_mantle_temp, out);
 
-    getScalarProperty(properties, "start_age", E->control.start_age, m);
-    getScalarProperty(properties, "reset_startage", E->control.reset_startage, m);
+    getScalarProperty(properties, "start_age", E->control.start_age, out);
+    getScalarProperty(properties, "reset_startage", E->control.reset_startage, out);
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -325,33 +347,37 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Phase.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.phase]" << std::endl;
 
-    getScalarProperty(properties, "Ra_410", E->control.Ra_410, m);
-    getScalarProperty(properties, "clapeyron410", E->control.clapeyron410, m);
-    getScalarProperty(properties, "transT410", E->control.transT410, m);
-    getScalarProperty(properties, "width410", E->control.width410, m);
+    getScalarProperty(properties, "Ra_410", E->control.Ra_410, out);
+    getScalarProperty(properties, "clapeyron410", E->control.clapeyron410, out);
+    getScalarProperty(properties, "transT410", E->control.transT410, out);
+    getScalarProperty(properties, "width410", E->control.width410, out);
 
     if (E->control.width410!=0.0)
 	E->control.width410 = 1.0/E->control.width410;
 
-    getScalarProperty(properties, "Ra_670", E->control.Ra_670 , m);
-    getScalarProperty(properties, "clapeyron670", E->control.clapeyron670, m);
-    getScalarProperty(properties, "transT670", E->control.transT670, m);
-    getScalarProperty(properties, "width670", E->control.width670, m);
+    getScalarProperty(properties, "Ra_670", E->control.Ra_670 , out);
+    getScalarProperty(properties, "clapeyron670", E->control.clapeyron670, out);
+    getScalarProperty(properties, "transT670", E->control.transT670, out);
+    getScalarProperty(properties, "width670", E->control.width670, out);
 
     if (E->control.width670!=0.0)
 	E->control.width670 = 1.0/E->control.width670;
 
-    getScalarProperty(properties, "Ra_cmb", E->control.Ra_cmb, m);
-    getScalarProperty(properties, "clapeyroncmb", E->control.clapeyroncmb, m);
-    getScalarProperty(properties, "transTcmb", E->control.transTcmb, m);
-    getScalarProperty(properties, "widthcmb", E->control.widthcmb, m);
+    getScalarProperty(properties, "Ra_cmb", E->control.Ra_cmb, out);
+    getScalarProperty(properties, "clapeyroncmb", E->control.clapeyroncmb, out);
+    getScalarProperty(properties, "transTcmb", E->control.transTcmb, out);
+    getScalarProperty(properties, "widthcmb", E->control.widthcmb, out);
 
     if (E->control.widthcmb!=0.0)
 	E->control.widthcmb = 1.0/E->control.widthcmb;
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -376,23 +402,23 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Solver.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver]" << std::endl;
 
-    getStringProperty(properties, "datadir", E->control.data_dir, m);
-    getStringProperty(properties, "datafile", E->control.data_file, m);
-    getStringProperty(properties, "datafile_old", E->control.old_P_file, m);
+    getStringProperty(properties, "datadir", E->control.data_dir, out);
+    getStringProperty(properties, "datafile", E->control.data_file, out);
+    getStringProperty(properties, "datafile_old", E->control.old_P_file, out);
 
-    getScalarProperty(properties, "rayleigh", E->control.Atemp, m);
-    getScalarProperty(properties, "Q0", E->control.Q0, m);
+    getScalarProperty(properties, "rayleigh", E->control.Atemp, out);
+    getScalarProperty(properties, "Q0", E->control.Q0, out);
 
-    getScalarProperty(properties, "stokes_flow_only", E->control.stokes, m);
+    getScalarProperty(properties, "stokes_flow_only", E->control.stokes, out);
 
-    getStringProperty(properties, "output_format", E->output.format, m);
-    getStringProperty(properties, "output_optional", E->output.optional, m);
+    getStringProperty(properties, "output_format", E->output.format, out);
+    getStringProperty(properties, "output_optional", E->output.optional, out);
 
-    getScalarProperty(properties, "verbose", E->control.verbose, m);
-    getScalarProperty(properties, "see_convergence", E->control.print_convergence, m);
+    getScalarProperty(properties, "verbose", E->control.verbose, out);
+    getScalarProperty(properties, "see_convergence", E->control.print_convergence, out);
 
     // parameters not used in pyre version,
     // assigned value here to prevent uninitialized access
@@ -402,6 +428,10 @@
     E->control.record_every = 1;
     E->control.record_all_until = 1;
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -425,13 +455,13 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Sphere.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.mesher]" << std::endl;
 
-    getScalarProperty(properties, "nproc_surf", E->parallel.nprocxy, m);
-    getScalarProperty(properties, "nprocx", E->parallel.nprocx, m);
-    getScalarProperty(properties, "nprocy", E->parallel.nprocy, m);
-    getScalarProperty(properties, "nprocz", E->parallel.nprocz, m);
+    getScalarProperty(properties, "nproc_surf", E->parallel.nprocxy, out);
+    getScalarProperty(properties, "nprocx", E->parallel.nprocx, out);
+    getScalarProperty(properties, "nprocy", E->parallel.nprocy, out);
+    getScalarProperty(properties, "nprocz", E->parallel.nprocz, out);
 
     if (E->parallel.nprocxy == 12)
 	if (E->parallel.nprocx != E->parallel.nprocy) {
@@ -440,13 +470,13 @@
 	    return NULL;
     }
 
-    getScalarProperty(properties, "coor", E->control.coor, m);
-    getStringProperty(properties, "coor_file", E->control.coor_file, m);
+    getScalarProperty(properties, "coor", E->control.coor, out);
+    getStringProperty(properties, "coor_file", E->control.coor_file, out);
 
-    getScalarProperty(properties, "nodex", E->mesh.nox, m);
-    getScalarProperty(properties, "nodey", E->mesh.noy, m);
-    getScalarProperty(properties, "nodez", E->mesh.noz, m);
-    getScalarProperty(properties, "levels", E->mesh.levels, m);
+    getScalarProperty(properties, "nodex", E->mesh.nox, out);
+    getScalarProperty(properties, "nodey", E->mesh.noy, out);
+    getScalarProperty(properties, "nodez", E->mesh.noz, out);
+    getScalarProperty(properties, "levels", E->mesh.levels, out);
 
     E->mesh.mgunitx = (E->mesh.nox - 1) / E->parallel.nprocx /
 	(int) std::pow(2.0, E->mesh.levels - 1);
@@ -463,8 +493,8 @@
 	}
     }
 
-    getScalarProperty(properties, "radius_outer", E->sphere.ro, m);
-    getScalarProperty(properties, "radius_inner", E->sphere.ri, m);
+    getScalarProperty(properties, "radius_outer", E->sphere.ro, out);
+    getScalarProperty(properties, "radius_inner", E->sphere.ri, out);
 
     E->mesh.nsd = 3;
     E->mesh.dof = 3;
@@ -513,10 +543,10 @@
 
 	E->sphere.caps = 1;
 
-	getScalarProperty(properties, "theta_min", E->control.theta_min, m);
-	getScalarProperty(properties, "theta_max", E->control.theta_max, m);
-	getScalarProperty(properties, "fi_min", E->control.fi_min, m);
-	getScalarProperty(properties, "fi_max", E->control.fi_max, m);
+	getScalarProperty(properties, "theta_min", E->control.theta_min, out);
+	getScalarProperty(properties, "theta_max", E->control.theta_max, out);
+	getScalarProperty(properties, "fi_min", E->control.fi_min, out);
+	getScalarProperty(properties, "fi_max", E->control.fi_max, out);
 
 	E->sphere.cap[1].theta[1] = E->control.theta_min;
 	E->sphere.cap[1].theta[2] = E->control.theta_max;
@@ -528,15 +558,19 @@
 	E->sphere.cap[1].fi[4] = E->control.fi_max;
     }
 
-    getScalarProperty(properties, "ll_max", E->sphere.llmax, m);
-    getScalarProperty(properties, "nlong", E->sphere.noy, m);
-    getScalarProperty(properties, "nlati", E->sphere.nox, m);
-    getScalarProperty(properties, "output_ll_max", E->sphere.output_llmax, m);
+    getScalarProperty(properties, "ll_max", E->sphere.llmax, out);
+    getScalarProperty(properties, "nlong", E->sphere.noy, out);
+    getScalarProperty(properties, "nlati", E->sphere.nox, out);
+    getScalarProperty(properties, "output_ll_max", E->sphere.output_llmax, out);
 
     E->mesh.layer[1] = 1;
     E->mesh.layer[2] = 1;
     E->mesh.layer[3] = 1;
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -560,12 +594,16 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Tracer.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.tracer]" << std::endl;
 
-    getScalarProperty(properties, "tracer", E->control.tracer, m);
-    getStringProperty(properties, "tracer_file", E->control.tracer_file, m);
+    getScalarProperty(properties, "tracer", E->control.tracer, out);
+    getStringProperty(properties, "tracer_file", E->control.tracer_file, out);
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -589,22 +627,22 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Visc.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.visc]" << std::endl;
 
-    getStringProperty(properties, "Viscosity", E->viscosity.STRUCTURE, m);
+    getStringProperty(properties, "Viscosity", E->viscosity.STRUCTURE, out);
     if ( strcmp(E->viscosity.STRUCTURE,"system") == 0)
 	E->viscosity.FROM_SYSTEM = 1;
     else
 	E->viscosity.FROM_SYSTEM = 0;
 
-    getScalarProperty(properties, "visc_smooth_method", E->viscosity.smooth_cycles, m);
-    getScalarProperty(properties, "VISC_UPDATE", E->viscosity.update_allowed, m);
+    getScalarProperty(properties, "visc_smooth_method", E->viscosity.smooth_cycles, out);
+    getScalarProperty(properties, "VISC_UPDATE", E->viscosity.update_allowed, out);
 
     int num_mat;
     const int max_mat = 40;
 
-    getScalarProperty(properties, "num_mat", num_mat, m);
+    getScalarProperty(properties, "num_mat", num_mat, out);
     if(num_mat > max_mat) {
 	// max. allowed material types = 40
 	std::cerr << "'num_mat' greater than allowed value, set to "
@@ -614,28 +652,32 @@
     E->viscosity.num_mat = num_mat;
 
     getVectorProperty(properties, "visc0",
-			E->viscosity.N0, num_mat, m);
+			E->viscosity.N0, num_mat, out);
 
-    getScalarProperty(properties, "TDEPV", E->viscosity.TDEPV, m);
-    getScalarProperty(properties, "rheol", E->viscosity.RHEOL, m);
+    getScalarProperty(properties, "TDEPV", E->viscosity.TDEPV, out);
+    getScalarProperty(properties, "rheol", E->viscosity.RHEOL, out);
     getVectorProperty(properties, "viscE",
-			E->viscosity.E, num_mat, m);
+			E->viscosity.E, num_mat, out);
     getVectorProperty(properties, "viscT",
-			E->viscosity.T, num_mat, m);
+			E->viscosity.T, num_mat, out);
     getVectorProperty(properties, "viscZ",
-			E->viscosity.Z, num_mat, m);
+			E->viscosity.Z, num_mat, out);
 
-    getScalarProperty(properties, "SDEPV", E->viscosity.SDEPV, m);
-    getScalarProperty(properties, "sdepv_misfit", E->viscosity.sdepv_misfit, m);
+    getScalarProperty(properties, "SDEPV", E->viscosity.SDEPV, out);
+    getScalarProperty(properties, "sdepv_misfit", E->viscosity.sdepv_misfit, out);
     getVectorProperty(properties, "sdepv_expt",
-			E->viscosity.sdepv_expt, num_mat, m);
+			E->viscosity.sdepv_expt, num_mat, out);
 
-    getScalarProperty(properties, "VMIN", E->viscosity.MIN, m);
-    getScalarProperty(properties, "visc_min", E->viscosity.min_value, m);
+    getScalarProperty(properties, "VMIN", E->viscosity.MIN, out);
+    getScalarProperty(properties, "visc_min", E->viscosity.min_value, out);
 
-    getScalarProperty(properties, "VMAX", E->viscosity.MAX, m);
-    getScalarProperty(properties, "visc_max", E->viscosity.max_value, m);
+    getScalarProperty(properties, "VMAX", E->viscosity.MAX, out);
+    getScalarProperty(properties, "visc_max", E->viscosity.max_value, out);
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -658,23 +700,27 @@
     struct All_variables* E = static_cast<struct All_variables*>(PyCObject_AsVoidPtr(obj));
 
     int m = E->parallel.me;
-    if (not m)
-	std::cout << "#Incompressible.inventory:" << std::endl;
+    std::ofstream *out = get_output_stream(E->parallel.me, E->control.PID);
+    *out << "[CitcomS.solver.vsolver]" << std::endl;
 
-    getScalarProperty(properties, "node_assemble", E->control.NASSEMBLE, m);
-    getScalarProperty(properties, "precond", E->control.precondition, m);
+    getScalarProperty(properties, "node_assemble", E->control.NASSEMBLE, out);
+    getScalarProperty(properties, "precond", E->control.precondition, out);
 
-    getScalarProperty(properties, "accuracy", E->control.accuracy, m);
-    getScalarProperty(properties, "tole_compressibility", E->control.tole_comp, m);
+    getScalarProperty(properties, "accuracy", E->control.accuracy, out);
+    getScalarProperty(properties, "tole_compressibility", E->control.tole_comp, out);
 
-    getScalarProperty(properties, "mg_cycle", E->control.mg_cycle, m);
-    getScalarProperty(properties, "down_heavy", E->control.down_heavy, m);
-    getScalarProperty(properties, "up_heavy", E->control.up_heavy, m);
+    getScalarProperty(properties, "mg_cycle", E->control.mg_cycle, out);
+    getScalarProperty(properties, "down_heavy", E->control.down_heavy, out);
+    getScalarProperty(properties, "up_heavy", E->control.up_heavy, out);
 
-    getScalarProperty(properties, "vlowstep", E->control.v_steps_low, m);
-    getScalarProperty(properties, "vhighstep", E->control.v_steps_high, m);
-    getScalarProperty(properties, "piterations", E->control.p_iterations, m);
+    getScalarProperty(properties, "vlowstep", E->control.v_steps_low, out);
+    getScalarProperty(properties, "vhighstep", E->control.v_steps_high, out);
+    getScalarProperty(properties, "piterations", E->control.p_iterations, out);
 
+    *out << std::endl;
+    out->close();
+    delete out;
+
     if (PyErr_Occurred())
 	return NULL;
 
@@ -688,19 +734,27 @@
 //==========================================================
 // helper functions
 
-
-void getStringProperty(PyObject* properties, char* attribute, char* value, int mute)
+std::ofstream* get_output_stream(int mute, int pid)
 {
-    std::ofstream outf("/dev/null");
-    std::ostream *out;
+    std::ofstream *out = new std::ofstream;
 
     if (mute)
-	out = &outf;
-    else
-	out = &std::cout;
+	out->open("/dev/null");
+    else {
+	char filename[255];
+	sprintf(filename, "pid%d.cfg", pid);
+	out->open(filename, std::ios::app);
+    }
 
-    *out << '\t' << attribute << "=";
+    return out;
+}
 
+
+void getStringProperty(PyObject* properties, char* attribute,
+		       char* value, std::ostream* out)
+{
+    *out << attribute << "=";
+
     if(!PyObject_HasAttrString(properties, attribute)) {
 	char errmsg[255];
 	sprintf(errmsg, "no such attribute: %s", attribute);
@@ -725,18 +779,11 @@
 
 
 template <class T>
-void getScalarProperty(PyObject* properties, char* attribute, T& value, int mute)
+void getScalarProperty(PyObject* properties, char* attribute,
+		       T& value, std::ostream* out)
 {
-    std::ofstream outf("/dev/null");
-    std::ostream *out;
+    *out << attribute << "=";
 
-    if (mute)
-	out = &outf;
-    else
-	out = &std::cout;
-
-    *out << '\t' << attribute << "=";
-
     if(!PyObject_HasAttrString(properties, attribute)) {
 	char errmsg[255];
 	sprintf(errmsg, "no such attribute: %s", attribute);
@@ -762,18 +809,10 @@
 
 template <class T>
 void getVectorProperty(PyObject* properties, char* attribute,
-		       T* vector, const int len, int mute)
+		       T* vector, const int len, std::ostream* out)
 {
-    std::ofstream outf("/dev/null");
-    std::ostream *out;
+    *out << attribute << "=";
 
-    if (mute)
-	out = &outf;
-    else
-	out = &std::cout;
-
-    *out << '\t' << attribute << "=";
-
     if(!PyObject_HasAttrString(properties, attribute)) {
 	char errmsg[255];
 	sprintf(errmsg, "no such attribute: %s", attribute);



More information about the cig-commits mailing list