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

luis at geodynamics.org luis at geodynamics.org
Mon Mar 24 09:27:30 PDT 2008


Author: luis
Date: 2008-03-24 09:27:29 -0700 (Mon, 24 Mar 2008)
New Revision: 11534

Added:
   cs/benchmark/cigma/trunk/src/EvalCmd.cpp
   cs/benchmark/cigma/trunk/src/EvalCmd.h
Log:
Moving EvalCmd class from hold directory


Added: cs/benchmark/cigma/trunk/src/EvalCmd.cpp
===================================================================
--- cs/benchmark/cigma/trunk/src/EvalCmd.cpp	                        (rev 0)
+++ cs/benchmark/cigma/trunk/src/EvalCmd.cpp	2008-03-24 16:27:29 UTC (rev 11534)
@@ -0,0 +1,198 @@
+#include <iostream>
+#include <cassert>
+
+#include "EvalCmd.h"
+#include "StringUtils.h"
+
+using namespace std;
+using namespace cigma;
+
+// ---------------------------------------------------------------------------
+
+EvalCmd::EvalCmd()
+{
+    name = "eval";
+
+    field = 0;
+    points = 0;
+    values = 0;
+}
+
+EvalCmd::~EvalCmd()
+{
+    // XXX:
+}
+
+
+// ---------------------------------------------------------------------------
+
+
+void EvalCmd::setupOptions(AnyOption *opt)
+{
+    assert(opt != 0);
+
+    /* setup usage */
+    opt->addUsage("Usage:");
+    opt->addUsage("   cigma eval [options]");
+    opt->addUsage("     --field     Input field");
+    opt->addUsage("     --points    Input points");
+    opt->addUsage("     --output    Output values");
+
+    /* setup flags and options */
+    opt->setFlag("help",'h');
+    opt->setFlag("verbose",'v');
+
+    opt->setOption("field"); // XXX: -f short option?
+    opt->setOption("field-mesh");
+    opt->setOption("field-mesh-coordinates");
+    opt->setOption("field-mesh-connectivity");
+    opt->setOption("field-function");
+
+    opt->setOption("points"); // XXX: -p short option?
+    opt->setOption("output");
+}
+
+void EvalCmd::configure(AnyOption *opt)
+{
+    assert(opt != 0);
+
+    string inputstr;
+    char *in;
+
+
+    // read verbose flag
+    verbose = opt->getFlag("verbose");
+
+
+    /* determine the output values path */
+    in = opt->getValue("output");
+    if (in == 0)
+    {
+        cerr << "eval: Please specify an output path for "
+             << "the values dataset (missing --output option)"
+             << endl;
+        exit(1);
+    }
+    inputstr = in;
+
+    string valuesExt;
+    parse_dataset_path(inputstr, valuesLoc, valuesFile, valuesExt);
+    valuesWriter = NewWriter(valuesExt.c_str());
+    if (valuesWriter->getType() == Writer::NULL_WRITER)
+    {
+        cerr << "eval: Could not make writer for output file. "
+             << "Unsupported extension (" << valuesExt << ")."
+             << endl;
+        exit(1);
+    }
+    if ((valuesLoc == "") && (valuesWriter->getType() == Writer::HDF_WRITER))
+    {
+        valuesLoc = "/values";
+    }
+
+
+    /* determine the input points path */
+    in = opt->getValue("points");
+    if (in == 0)
+    {
+        cerr << "eval: Please specify an input path for "
+             << "the points dataset (missing --points option)"
+             << endl;
+        exit(1);
+    }
+
+    pointsReader.load_args(opt, "points");
+    pointsReader.validate_args("eval");
+    pointsReader.load_points();
+    if (pointsReader.points == 0)
+    {
+        cerr << "eval: Could not load points dataset!" << endl;
+        exit(1);
+    }
+
+    /* determine the input field */
+    fieldReader.load_args(opt, "field");
+    fieldReader.validate_args("eval");
+    fieldReader.load_field();
+    if (fieldReader.field == 0)
+    {
+        cerr << "eval: Could not load field from path "
+             << fieldReader.fieldPath
+             << endl;
+        exit(1);
+    }
+
+
+    if (field->n_dim() != points->n_dim())
+    {
+        cerr << "eval: Domain dimensions do not match: "
+             << "field->dim = " << field->n_dim() << ", "
+             << "points->dim = " << points->n_dim()
+             << endl;
+        exit(1);
+    }
+
+}
+
+int EvalCmd::run()
+{
+    assert(field != 0);
+    assert(points != 0);
+    assert(values != 0);
+
+    // indices
+    int i;
+    int e;
+
+    // dimensions
+    const int npts = points->n_points();
+    const int valdim = field->n_rank();
+
+    // data
+    double *phi = new double[npts * valdim];
+
+    for (i = 0; i < npts; i++)
+    {
+        double *globalPoint = (*points)[i];
+        field->eval(globalPoint, &phi[valdim*i]);
+    }
+
+    
+    //
+    // output values dataset
+    //
+
+    int ierr;
+    
+    cout << "Creating file " << valuesFile << endl;
+
+    ierr = valuesWriter->open(valuesFile.c_str());
+    if (ierr < 0)
+    {
+        cerr << "eval: Could not open (or create) output file " << valuesFile << endl;
+        exit(1);
+    }
+
+    ierr = valuesWriter->write_dataset(valuesLoc.c_str(), phi, npts, valdim);
+    if (ierr < 0)
+    {
+        cerr << "eval: Could not create values dataset " << valuesLoc << endl;
+        exit(1);
+    }
+
+    ierr = valuesWriter->close();
+    if (ierr < 0)
+    {
+        cerr << "eval: Error while closing output file?" << endl;
+    }
+
+    //
+    // clean up
+    //
+
+    delete [] phi; // XXX: auto_ptr?
+
+    return 0;
+}
+
+// ---------------------------------------------------------------------------

Added: cs/benchmark/cigma/trunk/src/EvalCmd.h
===================================================================
--- cs/benchmark/cigma/trunk/src/EvalCmd.h	                        (rev 0)
+++ cs/benchmark/cigma/trunk/src/EvalCmd.h	2008-03-24 16:27:29 UTC (rev 11534)
@@ -0,0 +1,45 @@
+#ifndef __EVAL_CMD_H__
+#define __EVAL_CMD_H__
+
+#include <string>
+#include "Command.h"
+#include "Field.h"
+#include "Points.h"
+#include "FieldReader.h"
+#include "PointsReader.h"
+#include "Writer.h"
+
+namespace cigma
+{
+    class EvalCmd;
+}
+
+/**
+ * @brief Callback object for `cigma eval [options]'
+ */
+class cigma::EvalCmd : public Command
+{
+public:
+    EvalCmd();
+    ~EvalCmd();
+
+public:
+    void setupOptions(AnyOption *opt);
+    void configure(AnyOption *opt);
+    int run();
+
+public:
+    FieldReader fieldReader;
+    PointsReader pointsReader;
+    Writer *valuesWriter;
+    std::string valuesLoc;
+    std::string valuesFile;
+    bool verbose;
+
+public:
+    Field *field;
+    Points *points;
+    Points *values;
+};
+
+#endif



More information about the cig-commits mailing list