[cig-commits] r13752 - cs/cigma/trunk/src

luis at geodynamics.org luis at geodynamics.org
Wed Dec 17 02:33:08 PST 2008


Author: luis
Date: 2008-12-17 02:33:08 -0800 (Wed, 17 Dec 2008)
New Revision: 13752

Modified:
   cs/cigma/trunk/src/Field.cpp
Log:
Improved factory method Field::NewField()

We avoid opening the file multiple times when given a VTK file.

Modified: cs/cigma/trunk/src/Field.cpp
===================================================================
--- cs/cigma/trunk/src/Field.cpp	2008-12-17 10:33:06 UTC (rev 13751)
+++ cs/cigma/trunk/src/Field.cpp	2008-12-17 10:33:08 UTC (rev 13752)
@@ -4,6 +4,10 @@
 #include <cassert>
 #include <string>
 #include <sstream>
+
+#include "io_file_reader.h"
+#include "io_vtk_reader.h"
+
 using namespace std;
 using namespace cigma;
 using boost::shared_ptr;
@@ -14,15 +18,36 @@
 shared_ptr<Field> Field::NewField(const FieldInfo& field_info)
 {
     TRI_LOG_STR("Field::NewField()");
-
     shared_ptr<Field> field;
     
     if (field_info)
     {
+        TRI_LOG(field_info);
+
         field = shared_ptr<Field>(new Field);
-        field->dofs = DofHandler::New(field_info.p_field);
-        field->mesh = MeshPart::New(field_info.mesh_info);
-        field->fe = FE::New(field_info.fe_info);
+
+        if (field_info.p_field.is_vtk_file())
+        {
+            string filename = field_info.p_field.filename();
+            string location = field_info.p_field.location();
+
+            // XXX: move these methods up the hierarchy to FileReader
+            shared_ptr<FileReader> reader = FileReader::New(filename, "r");
+            VtkReader* vtk = static_cast<VtkReader*>(&(*reader));
+
+            field->mesh = vtk->getMesh();
+            field->fe   = vtk->getFE();
+            if (location != "")
+            {
+                field->dofs = vtk->getDofs(location.c_str());
+            }
+        }
+        else
+        {
+            field->mesh = MeshPart::New(field_info.mesh_info);
+            field->fe   = FE::New(field_info.fe_info);
+            field->dofs = DofHandler::New(field_info.p_field);
+        }
     }
     
     return field;
@@ -32,8 +57,6 @@
 
 Field::Field()
 {
-    //mesh = shared_ptr<MeshPart>(new MeshPart);
-    //dofs = shared_ptr<DofHandler>(new DofHandler);
 }
 
 Field::~Field()



More information about the CIG-COMMITS mailing list