![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include
00002 #include "moab/Core.hpp"
00003 #include
00004 #include
00005 #include
00006
00007 using namespace std;
00008
00009 namespace moab
00010 {
00011
00012 // make a nice picture. tweak here
00013 // 217: x,y -> [-8, 8] /// z -> [-65, 65]
00014 double physField( double x, double y, double z, double factor )
00015 {
00016
00017 // 1/r^2 decay from {0,0,0}
00018 // tjt - changing to 1/r
00019 /*
00020 double scale = 1.0/factor;
00021 out = fabs(x*scale) + fabs(y*scale) + fabs(z*scale);
00022 out += 1e-1; // clamp
00023 out = 1/out;
00024 */
00025 double out = factor * ( x * x + y + z );
00026
00027 return out;
00028 }
00029
00030 void putElementField( Interface* mbi, const char* tagname, double factor )
00031 {
00032 Range elems;
00033
00034 mbi->get_entities_by_dimension( 0, 2, elems );
00035
00036 const double defVal = 0.;
00037 Tag fieldTag;
00038 ErrorCode rval = mbi->tag_get_handle( tagname, 1, MB_TYPE_DOUBLE, fieldTag, MB_TAG_DENSE | MB_TAG_CREAT, &defVal );
00039 assert( MB_SUCCESS == rval );
00040 #ifdef NDEBUG
00041 if( MB_SUCCESS == rval )
00042 {
00043 }; // Line to avoid compiler warning about unused variable
00044 #endif
00045
00046 int numElems = elems.size();
00047
00048 for( int i = 0; i < numElems; i++ )
00049 {
00050 // cout << elems[i] << endl;
00051 EntityHandle elem = elems[i];
00052
00053 double xyz[3];
00054 mbi->get_coords( &elem, 1, xyz );
00055
00056 double fieldValue = physField( xyz[0], xyz[1], xyz[2], factor );
00057
00058 mbi->tag_set_data( fieldTag, &elem, 1, &fieldValue );
00059 }
00060 }
00061
00062 void putSpectralElementField( Interface* mbi, int dim, int np, const char* tagname, double factor )
00063 {
00064 Range elems;
00065
00066 mbi->get_entities_by_dimension( 0, dim, elems );
00067
00068 const int ndofperE = np * np;
00069 double* defDouble = new double[ndofperE];
00070 Tag fieldTag;
00071 ErrorCode rval =
00072 mbi->tag_get_handle( tagname, ndofperE, MB_TYPE_DOUBLE, fieldTag, MB_TAG_DENSE | MB_TAG_CREAT, &defDouble );
00073 std::cout << "rval = " << rval << std::endl;
00074 assert( MB_SUCCESS == rval || rval == MB_ALREADY_ALLOCATED );
00075 #ifdef NDEBUG
00076 if( MB_SUCCESS == rval || rval == MB_ALREADY_ALLOCATED )
00077 {
00078 }; // Line to avoid compiler warning about unused variable
00079 #endif
00080
00081 int numElems = elems.size();
00082 std::vector< double > tData( ndofperE, 0.0 );
00083
00084 for( int i = 0; i < numElems; i++ )
00085 {
00086 EntityHandle elem = elems[i];
00087
00088 double xyz[3];
00089 mbi->get_coords( &elem, 1, xyz );
00090
00091 double fieldValue = physField( xyz[0], xyz[1], xyz[2], factor );
00092 for( int j = 0; j < ndofperE; ++j )
00093 tData[j] = fieldValue; // same value evaluated at the center; could modify it to use
00094 // GLL points ?
00095
00096 mbi->tag_set_data( fieldTag, &elem, 1, &tData[0] );
00097 }
00098
00099 delete[] defDouble;
00100 tData.clear();
00101 }
00102
00103 void putVertexField( Interface* mbi, const char* tagname, double factor )
00104 {
00105 Range verts;
00106
00107 mbi->get_entities_by_type( 0, MBVERTEX, verts );
00108
00109 const double defVal = 0.;
00110 Tag fieldTag;
00111 mbi->tag_get_handle( tagname, 1, MB_TYPE_DOUBLE, fieldTag, MB_TAG_DENSE | MB_TAG_CREAT, &defVal );
00112
00113 int numVerts = verts.size();
00114 for( int i = 0; i < numVerts; i++ )
00115 {
00116 EntityHandle vert = verts[i]; //?
00117
00118 double vertPos[3];
00119 mbi->get_coords( &vert, 1, vertPos );
00120
00121 double fieldValue = physField( vertPos[0], vertPos[1], vertPos[2], factor );
00122
00123 mbi->tag_set_data( fieldTag, &vert, 1, &fieldValue );
00124 }
00125 }
00126
00127 } // namespace moab
00128
00129 // Using moab instead of imesh for dev speed
00130 int main( int argc, char** argv )
00131 {
00132
00133 using namespace moab;
00134
00135 Interface* mbi = new Core();
00136
00137 if( argc < 3 )
00138 {
00139 cout << "Usage: " << argv[0] << " [factor]\n"
00140 << "Writes both vertex and element fields.\n";
00141 return 0;
00142 }
00143
00144 mbi->load_mesh( argv[1] );
00145
00146 double factor = 1.0;
00147 if( argc == 4 ) factor = atof( argv[3] );
00148
00149 //putVertexField( mbi, "vertex_field", factor );
00150 putElementField( mbi, "T_proj", factor );
00151 putElementField( mbi, "u_proj", 2. );
00152 putElementField( mbi, "v_proj", 3. );
00153 // putSpectralElementField(mbi, 2, 4, "spectral_element_field", factor);
00154 //putSpectralElementField( mbi, 2, 4, "a2oTAG", factor );
00155
00156 ErrorCode result = mbi->write_mesh( argv[2] );
00157 if( MB_SUCCESS == result )
00158 cout << "wrote " << argv[2] << endl;
00159 else
00160 cout << "Failed to write " << argv[2] << endl;
00161
00162 // vector coords;
00163 // mbi->get_vertex_coordinates(coords);
00164 // double xavg = 0;
00165 // for (int i = 0; i < coords.size()/3; i++) xavg += coords[i];
00166 // cout << xavg << endl;
00167
00168 return 1;
00169 }