moab
ElementTest.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines