moab
|
00001 #include "TestUtil.hpp" 00002 #include "ElemUtil.hpp" 00003 #include <iostream> 00004 00005 using namespace moab; 00006 00007 void test_tet(); 00008 void test_hex(); 00009 void test_spectral_hex(); 00010 void test_spectral_quad(); 00011 00012 int main() 00013 { 00014 int rval = 0; 00015 rval += RUN_TEST(test_tet); 00016 rval += RUN_TEST(test_hex); 00017 rval += RUN_TEST(test_spectral_hex); 00018 rval += RUN_TEST(test_spectral_quad); 00019 return rval; 00020 } 00021 00022 void test_tet() { 00023 moab::Element::LinearTet tet; 00024 }// test_tet() 00025 00026 void test_hex() { 00027 moab::Element::LinearHex hex; 00028 }// test_hex() 00029 #include "moab/Core.hpp" 00030 #include "moab/Range.hpp" 00031 00032 void test_spectral_hex() 00033 { 00034 // first load a model that has spectral elements 00035 moab::Core *mb = new moab::Core(); 00036 std::string meshFile = STRINGIFY(SRCDIR) "/spectral.h5m"; 00037 moab::ErrorCode rval = mb->load_mesh(meshFile.c_str()); 00038 if (moab::MB_SUCCESS != rval) return ; 00039 00040 // get the ent set with SEM_DIMS tag 00041 moab::Range spectral_sets; 00042 moab::Tag sem_tag; 00043 rval = mb->tag_get_handle("SEM_DIMS", 3, moab::MB_TYPE_INTEGER, sem_tag); 00044 if (moab::MB_SUCCESS != rval) 00045 { 00046 std::cout<< "can't find tag, no spectral set\n"; 00047 return ; 00048 } 00049 rval = mb->get_entities_by_type_and_tag(0, moab::MBENTITYSET, &sem_tag, NULL, 1, spectral_sets); 00050 if (moab::MB_SUCCESS != rval || spectral_sets.empty()) 00051 { 00052 std::cout<< "can't get sem set\n"; 00053 return ; 00054 } 00055 00056 moab::Range ents; 00057 00058 int sem_dims[3]; 00059 moab::EntityHandle firstSemSet=spectral_sets[0]; 00060 rval = mb->tag_get_data(sem_tag, &firstSemSet, 1, (void*)sem_dims); 00061 if (moab::MB_SUCCESS != rval) return ; 00062 00063 rval = mb->get_entities_by_dimension(firstSemSet, 3, ents); 00064 if (moab::MB_SUCCESS != rval) return ; 00065 std::cout << "Found " << ents.size() << " " << 3 << "-dimensional entities:" << std::endl; 00066 00067 if (sem_dims[0]!=sem_dims[1] || sem_dims[0] != sem_dims[2]) 00068 { 00069 std::cout << " dimensions are different. bail out\n"; 00070 return; 00071 } 00072 00073 // get the SEM_X ...tags 00074 moab::Tag xm1Tag, ym1Tag, zm1Tag; 00075 int ntot = sem_dims[0]*sem_dims[1]*sem_dims[2]; 00076 rval = mb->tag_get_handle("SEM_X", ntot, moab::MB_TYPE_DOUBLE, xm1Tag); 00077 if (moab::MB_SUCCESS != rval) 00078 { 00079 std::cout << "can't get xm1tag \n"; 00080 return; 00081 } 00082 rval = mb->tag_get_handle("SEM_Y", ntot, moab::MB_TYPE_DOUBLE, ym1Tag); 00083 if (moab::MB_SUCCESS != rval) 00084 { 00085 std::cout << "can't get ym1tag \n"; 00086 return; 00087 } 00088 rval = mb->tag_get_handle("SEM_Z", ntot, moab::MB_TYPE_DOUBLE, zm1Tag); 00089 if (moab::MB_SUCCESS != rval) 00090 { 00091 std::cout << "can't get zm1tag \n"; 00092 return; 00093 } 00094 moab::Tag velTag; 00095 00096 rval = mb->tag_get_handle("VX", ntot, moab::MB_TYPE_DOUBLE, velTag); 00097 if (moab::MB_SUCCESS != rval) 00098 { 00099 std::cout << "can't get veltag \n"; 00100 return; 00101 } 00102 moab::Element::SpectralHex specHex(sem_dims[0] ); 00103 00104 // compute the data for some elements 00105 for (moab::Range::iterator rit=ents.begin(); rit!=ents.end(); rit++) 00106 { 00107 // get the tag pointers to the internal storage for xm1, to not copy the values 00108 moab::EntityHandle eh= *rit; 00109 const double * xval; 00110 const double * yval; 00111 const double * zval; 00112 rval = mb-> tag_get_by_ptr(xm1Tag, &eh, 1,(const void **) &xval ); 00113 if (moab::MB_SUCCESS != rval) 00114 { 00115 std::cout << "can't get xm1 values \n"; 00116 return; 00117 } 00118 rval = mb-> tag_get_by_ptr(ym1Tag, &eh, 1, (const void **)&yval ); 00119 if (moab::MB_SUCCESS != rval) 00120 { 00121 std::cout << "can't get ym1 values \n"; 00122 return; 00123 } 00124 rval = mb-> tag_get_by_ptr(zm1Tag, &eh, 1, (const void **)&zval ); 00125 if (moab::MB_SUCCESS != rval) 00126 { 00127 std::cout << "can't get zm1 values \n"; 00128 return; 00129 } 00130 if (rit==ents.begin()) 00131 { 00132 std::cout << " xm1 for first element: \n"; 00133 for (int i=0; i< ntot; i++) 00134 std::cout << " " << xval[i] ; 00135 std::cout << "\n"; 00136 } 00137 specHex.set_gl_points((double*)xval, (double*)yval, (double*)zval); 00138 // first evaluate a point, then inverse it to see if we get the same thing 00139 moab::CartVect rst(0.1, -0.1, 0.5); 00140 moab::CartVect pos = specHex.evaluate(rst); 00141 moab::CartVect inverse = specHex.ievaluate(pos); 00142 std::cout << "difference" << rst-inverse << "\n"; 00143 Matrix3 jac=specHex.jacobian(rst); 00144 std::cout<< "jacobian: \n" << jac << " \n determinant: " << jac.determinant() << "\n"; 00145 // evaluate vx at some point 00146 const double * vx; 00147 rval = mb-> tag_get_by_ptr(velTag, &eh, 1, (const void **)&vx ); 00148 if (moab::MB_SUCCESS != rval) 00149 { 00150 std::cout << "can't get vel values \n"; 00151 return; 00152 } 00153 double vel1 = specHex.evaluate_scalar_field(rst, vx); 00154 std::cout << "velocity: " << vel1 << "\n"; 00155 // compute integral over vx: 00156 double integral = specHex.integrate_scalar_field(vx); 00157 std::cout << "integral over vx: " << integral << "\n"; 00158 00159 } 00160 std::cout << "success...\n"; 00161 00162 return; 00163 } 00164 void test_spectral_quad() 00165 { 00166 // first load a model that has spectral elements 00167 moab::Core *mb = new moab::Core(); 00168 // use the grid on Sphere from mbcslam folder 00169 std::string meshFile = STRINGIFY(SRCDIR) "/../mbcslam/eulerHomme.vtk"; 00170 moab::ErrorCode rval = mb->load_mesh(meshFile.c_str()); 00171 if (moab::MB_SUCCESS != rval) return ; 00172 00173 // for each element, compute the gl points and project them on sphere 00174 // the radius is the same as the one from intersection test on sphere 00175 //double R = 6. * sqrt(3.) / 2; // input 00176 00177 00178 00179 moab::Range ents; 00180 00181 00182 rval = mb->get_entities_by_type(0, moab::MBQUAD, ents);// get all quads 00183 if (moab::MB_SUCCESS != rval) return ; 00184 std::cout << "Found " << ents.size() << " " << 2 << "-dimensional entities:" << std::endl; 00185 00186 // 00187 int NP =4; // test this.... 00188 moab::Element::SpectralQuad specQuad(NP); 00189 00190 // compute the gl points for some elements 00191 for (moab::Range::iterator rit = ents.begin(); rit != ents.end(); rit++) 00192 { 00193 00194 const moab::EntityHandle * conn4 = NULL; 00195 int num_nodes = 0; 00196 rval = mb->get_connectivity(*rit, conn4, num_nodes); 00197 if (moab::MB_SUCCESS != rval) 00198 { 00199 std::cout << "can't get conectivity for quad \n"; 00200 return; 00201 } 00202 assert(num_nodes==4); 00203 00204 std::vector<CartVect> verts(4); 00205 rval = mb->get_coords(conn4, num_nodes, &(verts[0][0])); 00206 if (moab::MB_SUCCESS != rval) 00207 { 00208 std::cout << "can't get coords for quad \n"; 00209 return; 00210 } 00211 00212 00213 specQuad.set_vertices(verts); 00214 specQuad.compute_gl_positions(); 00215 // do something with the gl positions, project them on a sphere, and create another mesh? 00216 if (rit==ents.begin()) 00217 { 00218 std::cout << " gl points for first element: \n"; 00219 int size; 00220 double * xyz[3]; 00221 specQuad.get_gl_points(xyz[0], xyz[1], xyz[2], size); 00222 for (int i=0; i<size; i++) 00223 std::cout << xyz[0][i] << " " << xyz[1][i] << " " << xyz[2][i] << "\n"; 00224 } 00225 00226 // project them on a sphere, and create another mesh with it? 00227 } 00228 std::cout << "success...\n"; 00229 00230 return; 00231 }