[cig-commits] r11731 - cs/benchmark/cigma/trunk/src

luis at geodynamics.org luis at geodynamics.org
Wed Apr 2 11:01:57 PDT 2008


Author: luis
Date: 2008-04-02 11:01:56 -0700 (Wed, 02 Apr 2008)
New Revision: 11731

Modified:
   cs/benchmark/cigma/trunk/src/FieldReader.cpp
   cs/benchmark/cigma/trunk/src/FieldReader.h
Log:
Improvements to FieldReader


Modified: cs/benchmark/cigma/trunk/src/FieldReader.cpp
===================================================================
--- cs/benchmark/cigma/trunk/src/FieldReader.cpp	2008-04-02 18:01:54 UTC (rev 11730)
+++ cs/benchmark/cigma/trunk/src/FieldReader.cpp	2008-04-02 18:01:56 UTC (rev 11731)
@@ -2,11 +2,10 @@
 #include <cstdlib>
 #include <cassert>
 #include "FieldReader.h"
-
 #include "FE_Field.h"
 #include "PointField.h"
+#include "NullField.h"
 #include "AnnLocator.h"
-
 #include "StringUtils.h"
 
 
@@ -19,6 +18,7 @@
 FieldReader::FieldReader()
 {
     field = 0;
+    fieldSet = 0;
     verbose = false;
 }
 
@@ -26,10 +26,16 @@
 {
     if (field != 0)
     {
-        // XXX:
+        // XXX
     }
 }
 
+void FieldReader::setFieldSet(FieldSet *fs)
+{
+    this->fieldSet = fs;
+}
+
+
 // ---------------------------------------------------------------------------
 
 void FieldReader::load_args(AnyOption *opt, const char *opt_prefix)
@@ -133,14 +139,49 @@
 
 }
 
+bool FieldReader::fieldPathIsZero()
+{
+    return (fieldPath == "zero");
+}
 
 // ---------------------------------------------------------------------------
 
 void FieldReader::load_field()
 {
+    //
+    // First thing to do is look up fieldPath in the fieldSet.
+    //
+    if (fieldSet != 0)
+    {
+        field = fieldSet->getField(fieldPath);
+        if (field != 0)
+        {
+            if (verbose)
+            {
+                cout << endl;
+
+                cout << fieldOption << " field path = "
+                     << fieldPath
+                     << endl;
+
+                if ((field->n_dim() > 0) && (field->n_rank() > 0))
+                {
+                    cout << "rank " << field->n_rank()
+                         << " on a " << field->n_dim() << "-d domain"
+                         << endl;
+                }
+            }
+            return;
+        }
+    }
+    
+
+    // 
+    // XXX: for now, assume fieldPath is for setting an FE_Field()
+    // To specify points, use the --{first,second}-{points,values} options.
+    //
     //field = NewField(fieldPath.c_str());
-
-    if (fieldPath != "") // for now, assume fieldPath is for setting an FE_Field()
+    if (fieldPath != "")
     {
         //field = NewField(fieldPath.c_str());
         field = new FE_Field();
@@ -153,23 +194,36 @@
 
         FE_Field *fe_field = static_cast<FE_Field*>(field);
 
+
+        /* Read dofs from file */
         int ierr;
         dofsReader = NewReader(fieldExt.c_str());
         ierr = dofsReader->open(fieldFile.c_str());
         if (ierr < 0)
         {
-            cerr << "Could not open " << fieldOption << " file " << fieldFile << endl;
+            cerr << "Error: Could not open " << fieldOption
+                 << " field path '" << fieldFile << "'"
+                 << endl;
             exit(1);
         }
 
         ierr = dofsReader->get_dataset(fieldLoc.c_str(), &dofs, &dofs_nno, &dofs_valdim);
         if (ierr < 0)
         {
-            cerr << "Could not open " << fieldOption << " dataset from " << fieldPath << endl;
+            cerr << "Error: Could not open " << fieldOption
+                 << " dataset '" << fieldLoc
+                 << "' from " << fieldPath
+                 << endl;
             exit(1);
         }
         dofsReader->close();
 
+        /* Assign a dof handler */
+        fe_field->dofHandler = new DofHandler();
+        fe_field->dofHandler->set_data(dofs, dofs_nno, dofs_valdim);
+
+
+        /* Read mesh from appropriate path */
         if (meshPartReader.meshPath == "")
         {
             meshPartReader.meshPath = fieldFile;
@@ -178,28 +232,36 @@
         meshPartReader.load_mesh();
         assert(meshPartReader.meshPart != 0);
 
+
+        /* Assign shape */
         fe_field->dim = meshPartReader.meshPart->nsd;
         fe_field->rank = dofs_valdim;
 
-        fe_field->meshPart = meshPartReader.meshPart;
-        fe_field->meshPart->set_cell();
+        /* Assign a mesh */
+        fe_field->set_mesh(meshPartReader.meshPart);
         assert(fe_field->meshPart->cell != 0);
-
         
-        //*
-        if ((fieldOption == "first") && (fe_field->meshPart->nel > 1000))
+        /* Assign a locator */
+        if (fe_field->meshPart->nel > 1000)
         {
+            // Why was I testing for (fieldOption == "first")?
             AnnLocator *locator = new AnnLocator();
             fe_field->meshPart->set_locator(locator);
-        } // */
+        }
 
 
-        fe_field->dofHandler = new DofHandler();
-        fe_field->dofHandler->set_data(dofs, dofs_nno, dofs_valdim);
+        /* 
+         * Next item to set must be fe_field->fe, but this can be deferred.
+         * The caller is responsible for setting this field using the
+         * appropriate set_fe() method.
+         */
 
 
+        /* Verbose output */
         if (verbose)
         {
+            cout << endl;
+
             cout << fieldOption << " field path = "
                  << fieldPath
                  << endl;
@@ -227,19 +289,21 @@
         {
             field = new PointField();
 
-            PointField *f = static_cast<PointField*>(field);
-            f->set_points(points->data, points->n_points(), points->n_dim());
-            f->set_values(values->data, values->n_points(), values->n_dim());
+            PointField *pf = static_cast<PointField*>(field);
+            pf->set_points(points->data, points->n_points(), points->n_dim());
+            pf->set_values(values->data, values->n_points(), values->n_dim());
 
             if (points->n_points() > 1000)
             {
                 AnnLocator *locator = new AnnLocator();
                 locator->nnk = 20;
-                f->points->set_locator(locator);
+                pf->points->set_locator(locator);
             }
 
             if (verbose)
             {
+                cout << endl;
+
                 cout << fieldOption << " field points = "
                      << points->n_points() << " points, "
                      << points->n_dim() << " dim"
@@ -268,12 +332,11 @@
             exit(1);
         }
     }
-    /*
-    if (field->getType == Field::NULL_FIELD)
+    else
     {
-        cerr << "Error: Could not create a field dataset for " << fieldPath << endl;
-        exit(1);
-    }*/
+        // XXX: until we improve the factory method
+        field = new NullField();
+    }
 }
 
 // ---------------------------------------------------------------------------

Modified: cs/benchmark/cigma/trunk/src/FieldReader.h
===================================================================
--- cs/benchmark/cigma/trunk/src/FieldReader.h	2008-04-02 18:01:54 UTC (rev 11730)
+++ cs/benchmark/cigma/trunk/src/FieldReader.h	2008-04-02 18:01:56 UTC (rev 11731)
@@ -7,16 +7,19 @@
 #include "PointsReader.h"
 #include "Reader.h"
 #include "Field.h"
+#include "FieldSet.h"
 
 class FieldReader
 {
 public:
     FieldReader();
     ~FieldReader();
+    void setFieldSet(cigma::FieldSet *fs);
 
 public:
     void load_args(AnyOption *opt, const char *opt_prefix);
     void validate_args(const char *cmd_name);
+    bool fieldPathIsZero();
 
 public:
     void load_field();
@@ -34,7 +37,7 @@
 
 public:
     cigma::Field *field;
-
+    cigma::FieldSet *fieldSet;
 };
 
 #endif



More information about the cig-commits mailing list