[MOAB-dev] r2620 - in MOAB/trunk: . tools/dagmc
janehu at mcs.anl.gov
janehu at mcs.anl.gov
Mon Feb 2 14:05:32 CST 2009
Author: janehu
Date: 2009-02-02 14:05:32 -0600 (Mon, 02 Feb 2009)
New Revision: 2620
Modified:
MOAB/trunk/ReadNCDF.cpp
MOAB/trunk/ReadNCDF.hpp
MOAB/trunk/tools/dagmc/main.cc
Log:
Added an update function for existing DB to update coordinates forthe deformed mesh.
Modified: MOAB/trunk/ReadNCDF.cpp
===================================================================
--- MOAB/trunk/ReadNCDF.cpp 2009-01-31 01:29:18 UTC (rev 2619)
+++ MOAB/trunk/ReadNCDF.cpp 2009-02-02 20:05:32 UTC (rev 2620)
@@ -24,6 +24,7 @@
#include <time.h>
#include <string>
#include <assert.h>
+#include <list>
#include <stdio.h>
#include "MBCN.hpp"
@@ -34,6 +35,7 @@
#include "MBInternals.hpp"
#include "MBReadUtilIface.hpp"
#include "exodus_order.h"
+#include "FileOptions.hpp"
#define INS_ID(stringvar, prefix, id) \
sprintf(stringvar, prefix, id)
@@ -1012,14 +1014,13 @@
readMeshIface->report_error("ReadNCDF:: Problem getting node number map data.");
delete [] ptr;
return MB_FAILURE;
-
- MBRange range(MB_START_ID+vertexOffset,
- MB_START_ID+vertexOffset+numberNodes_loading-1);
- MBErrorCode error = mdbImpl->tag_set_data(mGlobalIdTag,
- range, &ptr[0]);
- if (MB_SUCCESS != error)
- readMeshIface->report_error("ReadNCDF:: Problem setting node global ids.");
- }
+ }
+ MBRange range(MB_START_ID+vertexOffset,
+ MB_START_ID+vertexOffset+numberNodes_loading-1);
+ MBErrorCode error = mdbImpl->tag_set_data(mGlobalIdTag,
+ range, &ptr[0]);
+ if (MB_SUCCESS != error)
+ readMeshIface->report_error("ReadNCDF:: Problem setting node global ids.");
}
delete [] ptr;
@@ -1889,8 +1890,8 @@
}
MBErrorCode ReadNCDF::read_qa_string(char *temp_string,
- int record_number,
- int record_position)
+ int record_number,
+ int record_position)
{
NcVar *temp_var = ncFile->get_var("qa_records");
if (NULL == temp_var || !temp_var->is_valid()) {
@@ -1912,3 +1913,194 @@
return MB_SUCCESS;
}
+
+MBErrorCode ReadNCDF::update(const char *exodus_file_name, FileOptions& opts)
+{
+ //Function : updating current database from new exodus_file.
+ //Creator: Jane Hu
+ //opts is currently designed as following
+ //tdata = <var_name>[, time][,op][,destination]
+ //where var_name show the tag name to be updated, this version just take
+ //coord.
+ //time is the optional, and it gives time step of the each of the mesh
+ //info in exodus file.
+ //op is the operation that is going to be performed on the var_name info.
+ //currently support 'copy' and 'sum'
+ //destination shows where to store the updated info, currently assume it is
+ //stored in the same database by replacing the old info.
+ MBErrorCode rval;
+ std::string s;
+ rval = opts.get_str_option("tdata", s );
+ if(MB_SUCCESS != rval)
+ {
+ readMeshIface->report_error("MBCN:: Problem reading file options.");
+ return MB_FAILURE;
+ }
+ std::vector< std::string > tokens;
+ tokenize(s, tokens,",");
+
+ std::string filename( exodus_file_name );
+
+ // 0. Check for previously read file.
+ reset();
+ bool previously_loaded = false;
+ rval = check_file_status(filename, previously_loaded);
+ if (MB_SUCCESS != rval)
+ return rval;
+
+ read_exodus_header(exodus_file_name);
+
+ if (! strcmp (tokens[0].c_str(), "coord") || ! strcmp (tokens[0].c_str() ,"COORD"))
+ {
+ //1. check for time step to find the match time
+ int time_step = 1;
+ if(!tokens[1].empty())
+ {
+ const char* time_s = tokens[1].c_str();
+ char* endptr;
+ long int pval = strtol( time_s, &endptr, 0 );
+ std::string end = endptr;
+ if (!end.empty()) // syntax error
+ return MB_TYPE_OUT_OF_RANGE;
+
+ // check for overflow (parsing long int, returning int)
+ time_step = pval;
+ if (pval != (long int)time_step)
+ return MB_TYPE_OUT_OF_RANGE;
+ }
+
+ //2. check for the operations, they can be copy or sum.
+ const char *op;
+ if(!tokens[2].empty())
+ op = tokens[2].c_str();
+
+ if(!(!strcmp(op, "copy") || !strcmp( op ,"sum")))
+ return MB_TYPE_OUT_OF_RANGE;
+
+ //3. match the node_num_map.
+ int* ptr1 = new int [numberNodes_loading];
+ int* ptr2 ;
+
+ int varid = -1;
+ int cstatus = nc_inq_varid (ncFile->id(), "node_num_map", &varid);
+ if (cstatus == NC_NOERR && varid != -1) {
+ NcVar *temp_var = ncFile->get_var("node_num_map");
+ NcBool status = temp_var->get(ptr1, numberNodes_loading);
+ if (0 == status) {
+ readMeshIface->report_error("ReadNCDF:: Problem getting node number map data.");
+ delete [] ptr1;
+ return MB_FAILURE;
+ }
+ MBRange range(MB_START_ID+vertexOffset,
+ MB_START_ID+vertexOffset+numberNodes_loading-1);
+ //get the existing db's node map
+ MBErrorCode error = mdbImpl->tag_get_data(mGlobalIdTag,
+ range, ptr2);
+ if (MB_SUCCESS != error)
+ readMeshIface->report_error("ReadNCDF:: Problem getting node global ids.");
+ }
+
+ //read in the coordinates from the database.
+ MBEntityHandle node_handle = 0;
+ std::vector<double*> arrays, arrays_DB;
+ readMeshIface->get_node_arrays(3, numberNodes_loading,
+ MB_START_ID, node_handle, arrays);
+
+ // read in the coordinates from the exodus file
+ NcVar *coords = ncFile->get_var("coord");
+ if (NULL == coords || !coords->is_valid()) {
+ readMeshIface->report_error("MBCN:: Problem getting coords variable.");
+ return MB_FAILURE;
+ }
+
+ if(!strcmp(op ,"sum"))
+ {
+ //record the DB coords.
+ readMeshIface->get_node_arrays(3, numberNodes_loading,
+ MB_START_ID, node_handle, arrays_DB);
+ }
+
+ //do operations on all coordinates.
+ for(int node_num = 0; node_num < numberNodes_loading; )
+ {
+ NcBool found = 0;
+ int node_index2, num_of_nodes;
+ for(int i = 0; i < numberNodes_loading; i++)
+ {
+ if(ptr2[i] == ptr1[node_num])
+ //i is the index on the exodus file which matches the (node_num+1)th
+ //node in the node map of existing DB.
+ {
+ found = 1;
+ node_index2 = i;
+ break;
+ }
+ }
+ if(!found)
+ {
+ readMeshIface->report_error("MBCN:: node maps do not match.");
+ return MB_FAILURE;
+ }
+
+ for(int j = 1; ; j++)//j is the number of nodes to be sequentially matched
+ if(ptr2[node_index2+j] != ptr1[node_num +j])
+ {
+ num_of_nodes = j;
+ break;
+ }
+ NcBool status = coords->get(arrays[0], node_index2+1, num_of_nodes);
+ if (0 == status) {
+ readMeshIface->report_error("MBCN:: Problem getting x coord array.");
+ return MB_FAILURE;
+ }
+ status = coords->set_cur(1, 0);
+ if (0 == status) {
+ readMeshIface->report_error("MBCN:: Problem getting y coord array.");
+ return MB_FAILURE;
+ }
+ status = coords->get(arrays[1], node_index2+1, num_of_nodes);
+ if (0 == status) {
+ readMeshIface->report_error("MBCN:: Problem getting y coord array.");
+ return MB_FAILURE;
+ }
+ if (numberDimensions_loading == 3 )
+ {
+ status = coords->set_cur(2, 0);
+ if (0 == status) {
+ readMeshIface->report_error("MBCN:: Problem getting z coord array.");
+ return MB_FAILURE;
+ }
+ status = coords->get(arrays[2], node_index2+1, num_of_nodes);
+ if (0 == status) {
+ readMeshIface->report_error("MBCN:: Problem getting z coord array.");
+ return MB_FAILURE;
+ }
+ }
+ node_num += num_of_nodes;
+ }
+
+ delete [] ptr1;
+ if(!strcmp(op ,"sum"))
+ {
+ for(int i = 0 ; i < numberNodes_loading; i++)
+ {
+ arrays[0][i] += arrays_DB[0][i];
+ arrays[1][i] += arrays_DB[1][i];
+ arrays[2][i] += arrays_DB[2][i];
+ }
+ }
+ } //if token[0] == "coord"
+}
+
+void ReadNCDF::tokenize( const std::string& str,
+ std::vector<std::string>& tokens,
+ char* delimiters )
+{
+ std::string::size_type last = str.find_first_not_of( delimiters, 0 );
+ std::string::size_type pos = str.find_first_of( delimiters, last );
+ while (std::string::npos != pos && std::string::npos != last) {
+ tokens.push_back( str.substr( last, pos - last ) );
+ last = str.find_first_not_of( delimiters, pos );
+ pos = str.find_first_of( delimiters, last );
+ }
+}
Modified: MOAB/trunk/ReadNCDF.hpp
===================================================================
--- MOAB/trunk/ReadNCDF.hpp 2009-01-31 01:29:18 UTC (rev 2619)
+++ MOAB/trunk/ReadNCDF.hpp 2009-02-02 20:05:32 UTC (rev 2620)
@@ -64,6 +64,10 @@
static MBReaderIface* factory( MBInterface* );
+ static void tokenize( const std::string& str,
+ std::vector<std::string>& tokens,
+ char* delimiters );
+
//! load an ExoII file
MBErrorCode load_file(const char *exodus_file_name,
MBEntityHandle& file_set,
@@ -77,6 +81,9 @@
//! Destructor
virtual ~ReadNCDF();
+ //update the coords for deformed mesh according to FileOptions
+ MBErrorCode update(const char *exodus_file_name, FileOptions& opts);
+
private:
MBReadUtilIface* readMeshIface;
Modified: MOAB/trunk/tools/dagmc/main.cc
===================================================================
--- MOAB/trunk/tools/dagmc/main.cc 2009-01-31 01:29:18 UTC (rev 2619)
+++ MOAB/trunk/tools/dagmc/main.cc 2009-02-02 20:05:32 UTC (rev 2620)
@@ -4,6 +4,8 @@
#include "MBCore.hpp"
#include "cgm2moab.hpp"
#include "cubfile.h"
+#include "Tqdcfr.hpp"
+#include "FileOptions.hpp"
#define GF_CUBIT_FILE_TYPE "CUBIT"
#define GF_STEP_FILE_TYPE "STEP"
@@ -158,10 +160,17 @@
exit(2);
}
- int rval = cub_file_type( cub_file, tmp_file, CUB_FILE_ACIS );
+ MBCore *my_impl = new MBCore();
+ Tqdcfr *my_tqd = new Tqdcfr(my_impl);
+ MBEntityHandle file_set;
+ FileOptions opts(NULL);
+
+ MBErrorCode result = my_tqd->load_file(input_name, file_set, opts, 0, 0);
+
+ int rvalue = cub_file_type( cub_file, tmp_file, CUB_FILE_ACIS );
fclose( cub_file );
fclose( tmp_file );
- if (rval) {
+ if (rvalue) {
remove( temp_name );
free( temp_name );
exit(2);
More information about the moab-dev
mailing list