![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "EdgeSizeSimpleImplicit.hpp"
00002
00003 namespace moab
00004 {
00005
00006 EdgeSizeSimpleImplicit::EdgeSizeSimpleImplicit()
00007 {
00008 int i;
00009 // Default to the plane: x = 0.
00010 this->coeffC = 0.;
00011 for( i = 0; i < 3; ++i )
00012 {
00013 this->coeffB[i] = this->coeffA[i] = this->coeffA[i + 3] = 0.;
00014 }
00015 this->coeffB[0] = 1.;
00016 // Default to a scaling ratio of 1.
00017 this->ratio = 1.;
00018 }
00019
00020 EdgeSizeSimpleImplicit::~EdgeSizeSimpleImplicit() {}
00021
00022 bool EdgeSizeSimpleImplicit::evaluate_edge( const double* p0,
00023 const void* t0,
00024 double* p1,
00025 void* t1,
00026 const double* p2,
00027 const void* t2 )
00028 {
00029 (void)t0;
00030 (void)t1;
00031 (void)t2;
00032 double L2 = 0.;
00033 double delta;
00034 int i;
00035 for( i = 0; i < 3; ++i )
00036 {
00037 delta = p2[i + 3] - p0[i + 3];
00038 L2 += delta * delta;
00039 }
00040 // parametric coords in p1[{0,1,2}]
00041 double x = p1[3];
00042 double y = p1[4];
00043 double z = p1[5];
00044 double F2 = this->coeffA[0] * x * x + 2. * this->coeffA[1] * x * y + 2. * this->coeffA[2] * x * z +
00045 this->coeffA[3] * y * y + 2. * this->coeffA[4] * y * z + this->coeffA[5] * z * z + this->coeffB[0] * x +
00046 this->coeffB[1] * y + this->coeffB[2] * z + this->coeffC;
00047 F2 = F2 * F2; // square it
00048 double r2 = this->ratio * this->ratio;
00049 if( 4. * F2 / L2 < r2 ) return true; // Midpoint is close to surface => split edge
00050
00051 return false; // Don't split edge
00052 }
00053
00054 void EdgeSizeSimpleImplicit::set_implicit_function( double* coeffs )
00055 {
00056 int i;
00057 // Default to the plane: x = 0.
00058 for( i = 0; i < 3; ++i )
00059 {
00060 this->coeffA[i] = coeffs[i];
00061 this->coeffA[i + 3] = coeffs[i + 3];
00062 this->coeffB[i] = coeffs[i + 6];
00063 }
00064 this->coeffC = coeffs[9];
00065 }
00066
00067 void EdgeSizeSimpleImplicit::get_implicit_function( double*& coeffs )
00068 {
00069 int i;
00070 // Default to the plane: x = 0.
00071 for( i = 0; i < 3; ++i )
00072 {
00073 coeffs[i] = this->coeffA[i];
00074 coeffs[i + 3] = this->coeffA[i + 3];
00075 coeffs[i + 6] = this->coeffB[i];
00076 }
00077 coeffs[9] = this->coeffC;
00078 }
00079
00080 } // namespace moab