[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