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

luis at geodynamics.org luis at geodynamics.org
Mon Jan 14 21:28:05 PST 2008


Author: luis
Date: 2008-01-14 21:28:04 -0800 (Mon, 14 Jan 2008)
New Revision: 9037

Modified:
   cs/benchmark/cigma/trunk/src/EvalCmd.cpp
   cs/benchmark/cigma/trunk/src/EvalCmd.h
Log:
Implementation of cigma::EvalCmd

Modified: cs/benchmark/cigma/trunk/src/EvalCmd.cpp
===================================================================
--- cs/benchmark/cigma/trunk/src/EvalCmd.cpp	2008-01-15 05:28:03 UTC (rev 9036)
+++ cs/benchmark/cigma/trunk/src/EvalCmd.cpp	2008-01-15 05:28:04 UTC (rev 9037)
@@ -1,12 +1,20 @@
 #include <iostream>
 #include <cassert>
 #include "EvalCmd.h"
+#include "StringUtils.h"
+#include "VtkUgReader.h"
+#include "VtkUgSimpleWriter.h"
+#include "VtkUgMeshPart.h"
+#include "Tet.h"
+#include "Hex.h"
 
 // ---------------------------------------------------------------------------
 
 cigma::EvalCmd::EvalCmd()
 {
     name = "eval";
+    points = 0;
+    field = 0;
 }
 
 cigma::EvalCmd::~EvalCmd()
@@ -24,25 +32,142 @@
     opt->addUsage("Usage:");
     opt->addUsage("");
     opt->addUsage("   cigma eval [args ...]");
-    opt->addUsage("");
-    opt->addUsage("");
-    opt->addUsage("");
-    opt->addUsage("");
+    opt->addUsage("       --field       Field path");
+    opt->addUsage("       --points      List of points");
+    opt->addUsage("       --output      Output file");
 
     /* setup flags and options */
     opt->setFlag("help", 'h');
 
+    opt->setOption("field");
+    opt->setOption("points");
+    opt->setOption("output");
     return;
 }
 
 void cigma::EvalCmd::configure(AnyOption *opt)
 {
+    using namespace cigma;
+
     std::cout << "Calling cigma::EvalCmd::configure()" << std::endl;
+
+    std::string input, location, inputfile, ext;
+    std::string pointsfile;
+    char *in;
+
+    in = opt->getValue("field");
+    if (in == 0)
+    {
+        std::cerr << "eval: Please specify the option --field" << std::endl;
+        exit(1);
+    }
+    input = in;
+    parse_dataset_path(input, location, inputfile, ext);
+    std::cout << "field location = " << location << std::endl;
+    std::cout << "field inputfile = " << inputfile << std::endl;
+    std::cout << "field extension = " << ext << std::endl;
+
+    in = opt->getValue("points");
+    if (in == 0)
+    {
+        std::cerr << "eval: Please specify the option --points" << std::endl;
+        exit(1);
+    }
+    pointsfile = in;
+
+    in = opt->getValue("output");
+    if (in == 0)
+    {
+        std::cerr << "eval: Please specify the option --output" << std::endl;
+        exit(1);
+    }
+    output_filename = in;
+
+    int nno, nsd;
+    int nel, ndofs;
+    double *coords;
+    int *connect;
+    int dofs_nno, dofs_valdim;
+    double *dofs;
+
+    VtkUgReader *reader = new VtkUgReader();
+    reader->open(inputfile);
+    reader->get_coordinates(&coords, &nno, &nsd);
+    reader->get_connectivity(&connect, &nel, &ndofs);
+    reader->get_scalar_point_data(location.c_str(), &dofs, &dofs_nno, &dofs_valdim);
+
+    field = new FE_Field();
+    field->dim = nsd;
+    field->rank = dofs_valdim;
+    field->meshPart = new cigma::VtkUgMeshPart();
+    field->meshPart->set_coordinates(coords, nno, nsd);
+    field->meshPart->set_connectivity(connect, nel, ndofs);
+
+    switch (ndofs)
+    {
+    case 4:
+        field->fe = new FE();
+        field->fe->cell = new Tet();
+        break;
+
+    case 8:
+        field->fe = new FE();
+        field->fe->cell = new Hex();
+        break;
+    }
+    assert(field->fe != 0);
+    assert(field->fe->cell != 0);
+    field->meshPart->cell = field->fe->cell;
+
+    field->dofHandler = new DofHandler();
+    field->dofHandler->meshPart = field->meshPart;
+    field->dofHandler->set_data(dofs, dofs_nno, dofs_valdim);
+
+
+    int pts_nno, pts_nsd;
+    double *pts_coords;
+
+    VtkUgReader *pointsreader = new VtkUgReader();
+    pointsreader->open(pointsfile);
+    pointsreader->get_coordinates(&pts_coords, &pts_nno, &pts_nsd);
+    points = new Points();
+    points->set_data(pts_coords, pts_nno, pts_nsd);
+
     return;
 }
 
 int cigma::EvalCmd::run()
 {
     std::cout << "Calling cigma::EvalCmd::run()" << std::endl;
+    assert(field != 0);
+    assert(points != 0);
+    assert(field->n_dim() == points->n_dim());
+
+    // indices
+    int e,i;
+
+    // dimensions
+    int npts = points->n_points();
+    int valdim = field->n_rank();
+
+    // data
+    double *phi = new double[npts * valdim];
+
+    for (i = 0; i < npts; i++)
+    {
+        double *globalPoint = (*points)[i];
+        field->meshPart->find_cell(globalPoint, &e);
+        field->meshPart->get_cell_coords(e, field->fe->cell->globverts);
+        field->eval(globalPoint, &phi[valdim*i]);
+    }
+
+    std::cout << "Creating file " << output_filename << std::endl;
+    VtkUgSimpleWriter *writer = new VtkUgSimpleWriter();
+    writer->open(output_filename);
+    writer->write_header();
+    writer->write_point_data("values", phi, npts, valdim);
+    writer->close();
+    //delete writer;
+
     return 0;
 }

Modified: cs/benchmark/cigma/trunk/src/EvalCmd.h
===================================================================
--- cs/benchmark/cigma/trunk/src/EvalCmd.h	2008-01-15 05:28:03 UTC (rev 9036)
+++ cs/benchmark/cigma/trunk/src/EvalCmd.h	2008-01-15 05:28:04 UTC (rev 9037)
@@ -2,6 +2,8 @@
 #define __EVAL_CMD_H__
 
 #include "Command.h"
+#include "FE_Field.h"
+#include "Points.h"
 
 namespace cigma
 {
@@ -23,6 +25,11 @@
     void setupOptions(AnyOption *opt);
     void configure(AnyOption *opt);
     int run();
+
+public:
+    FE_Field *field;
+    Points *points;
+    std::string output_filename;
 };
 
 #endif



More information about the cig-commits mailing list