MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 /* ***************************************************************** 00002 MESQUITE -- The Mesh Quality Improvement Toolkit 00003 00004 Copyright 2004 Sandia Corporation and Argonne National 00005 Laboratory. Under the terms of Contract DE-AC04-94AL85000 00006 with Sandia Corporation, the U.S. Government retains certain 00007 rights in this software. 00008 00009 This library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Lesser General Public 00011 License as published by the Free Software Foundation; either 00012 version 2.1 of the License, or (at your option) any later version. 00013 00014 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 (lgpl.txt) along with this library; if not, write to the Free Software 00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 00023 [email protected], [email protected], [email protected], 00024 [email protected], [email protected], [email protected] 00025 00026 ***************************************************************** */ 00027 // 00028 // AUTHOR: Thomas Leurent <[email protected]> 00029 // ORG: Argonne National Laboratory 00030 // E-MAIL: [email protected] 00031 // 00032 // ORIG-DATE: 12-Nov-02 at 18:05:56 00033 // LAST-MOD: 9-Jun-04 at 14:43:39 by Thomas Leurent 00034 // 00035 // DESCRIPTION: 00036 // ============ 00037 /*! \file PatchDataInstances.hpp 00038 00039 This header file contains some functions to instantiates particular PatchData Objects. 00040 Those objects can be used in unit tests. 00041 Patches must be allocated and dealocated by the caller. 00042 00043 \author Thomas Leurent 00044 \author Michael Brewer 00045 00046 */ 00047 // DESCRIP-END. 00048 // 00049 00050 #ifndef PatchDataInstances_hpp 00051 #define PatchDataInstances_hpp 00052 00053 #include "MsqVertex.hpp" 00054 #include "PatchData.hpp" 00055 #include "PlanarDomain.hpp" 00056 #include "IdealElements.hpp" 00057 #include "TopologyInfo.hpp" 00058 00059 #include <cmath> 00060 #include <iostream> 00061 00062 #include "cppunit/extensions/HelperMacros.h" 00063 00064 namespace MBMesquite 00065 { 00066 //! must be called in sync with create_...._patch_with_domain 00067 inline void destroy_patch_with_domain( PatchData& pd ) 00068 { 00069 MeshDomain* domain = pd.get_domain(); 00070 pd.set_domain( 0 ); 00071 delete domain; 00072 00073 // Mesh* mesh = pd.get_mesh(); 00074 // pd.set_mesh( 0 ); 00075 // delete mesh; 00076 } 00077 00078 inline void move_vertex( PatchData& pd, const Vector3D& position, const Vector3D& delta, MsqError& err ) 00079 { 00080 const MsqVertex* array = pd.get_vertex_array( err ); 00081 if( err ) return; 00082 00083 int idx = 0, cnt = 0; 00084 for( size_t i = 0; i < pd.num_nodes(); ++i ) 00085 if( ( array[i] - position ).length_squared() < DBL_EPSILON ) 00086 { 00087 idx = i; 00088 ++cnt; 00089 } 00090 00091 CPPUNIT_ASSERT_EQUAL( cnt, 1 ); 00092 00093 pd.move_vertex( delta, idx, err ); 00094 } 00095 00096 /*! creates a patch containing one ideal hexahedra 00097 */ 00098 inline void create_one_hex_patch( PatchData& one_hex_patch, MsqError& err ) 00099 { 00100 double coords[] = { 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 00101 1.0, 1.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0 }; 00102 00103 size_t indices[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; 00104 00105 one_hex_patch.fill( 8, coords, 1, HEXAHEDRON, indices, 0, err ); 00106 } 00107 00108 //! creates a Patch containing an ideal tetrahedra 00109 inline void create_one_tet_patch( PatchData& one_tet_patch, MsqError& err ) 00110 { 00111 double coords[] = { 1.0, 00112 1.0, 00113 1.0, 00114 2.0, 00115 1.0, 00116 1.0, 00117 1.5, 00118 1 + sqrt( 3.0 ) / 2.0, 00119 1.0, 00120 1.5, 00121 1 + sqrt( 3.0 ) / 6.0, 00122 1 + sqrt( 2.0 ) / sqrt( 3.0 ) }; 00123 00124 size_t indices[4] = { 0, 1, 2, 3 }; 00125 00126 one_tet_patch.fill( 4, coords, 1, TETRAHEDRON, indices, 0, err ); 00127 } 00128 00129 //! create patch containing one ideal pyramid 00130 inline void create_one_pyr_patch( PatchData& one_pyr_patch, MsqError& err ) 00131 { 00132 /* Equilateral triangles 00133 double coords[] = { 1, -1, 0, 00134 1, 1, 0, 00135 -1, 1, 0, 00136 -1, -1, 0, 00137 0, 0, sqrt(2) }; 00138 */ 00139 /* Unit height */ 00140 double coords[] = { 1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 0, 0, 2 }; 00141 00142 size_t indices[5] = { 0, 1, 2, 3, 4 }; 00143 00144 one_pyr_patch.fill( 5, coords, 1, PYRAMID, indices, 0, err ); 00145 } 00146 00147 //! create patch containing one ideal wedge 00148 inline void create_one_wdg_patch( PatchData& one_wdg_patch, MsqError& err ) 00149 { 00150 double hgt = 0.5 * MSQ_SQRT_THREE; 00151 double coords[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, hgt, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5, hgt, 1.0 }; 00152 00153 size_t indices[6] = { 0, 1, 2, 3, 4, 5 }; 00154 00155 one_wdg_patch.fill( 6, coords, 1, PRISM, indices, 0, err ); 00156 } 00157 00158 //! creates a Patch containing an ideal tetrahedra, inverted 00159 inline void create_one_inverted_tet_patch( PatchData& one_tet_patch, MsqError& err ) 00160 { 00161 double coords[] = { 00162 1, 1, 1, 2, 1, 1, 1.5, 1 + sqrt( 3.0 ) / 2.0, 1, 1.5, 1 + sqrt( 3.0 ) / 6.0, 1 - sqrt( 2.0 ) / sqrt( 3.0 ), 00163 }; 00164 00165 size_t indices[4] = { 0, 1, 2, 3 }; 00166 00167 one_tet_patch.fill( 4, coords, 1, TETRAHEDRON, indices, 0, err ); 00168 } 00169 00170 //! creates a Patch containing an ideal quadrilateral 00171 inline void create_one_quad_patch( PatchData& one_qua_patch, MsqError& err ) 00172 { 00173 double coords[] = { 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1 }; 00174 00175 size_t indices[4] = { 0, 1, 2, 3 }; 00176 00177 one_qua_patch.fill( 4, coords, 1, QUADRILATERAL, indices, 0, err ); 00178 } 00179 00180 /*! \fn create_one_tri_patch(PatchData &one_tri_patch, MsqError &err) 00181 2 00182 / \ creates a Patch containing an ideal triangle 00183 / \ 00184 0-----1 00185 This Patch also has the normal information. 00186 */ 00187 inline void create_one_tri_patch( PatchData& one_tri_patch, MsqError& err ) 00188 { 00189 /* ************** Creates normal info ******************* */ 00190 Vector3D pnt( 0, 0, 0 ); 00191 Vector3D s_norm( 0, 0, 3 ); 00192 one_tri_patch.set_domain( new PlanarDomain( s_norm, pnt ) ); 00193 00194 /* *********************FILL tri************************* */ 00195 double coords[] = { 1, 1, 1, 2, 1, 1, 1.5, 1 + sqrt( 3.0 ) / 2.0, 1 }; 00196 00197 size_t indices[3] = { 0, 1, 2 }; 00198 one_tri_patch.fill( 3, coords, 1, TRIANGLE, indices, 0, err ); 00199 } 00200 00201 /*! \fn create_two_tri_patch(PatchData &one_tri_patch, MsqError &err) 00202 2 00203 / \ creates a Patch containing two ideal triangles 00204 / 0 \ 00205 0-----1 00206 \ 1 / 00207 \ / 00208 3 00209 This Patch also has the normal information. 00210 */ 00211 inline void create_two_tri_patch( PatchData& pd, MsqError& err ) 00212 { 00213 /* ************** Creates normal info ******************* */ 00214 Vector3D pnt( 0, 0, 1 ); 00215 Vector3D s_norm( 0, 0, 3 ); 00216 pd.set_domain( new PlanarDomain( s_norm, pnt ) ); 00217 00218 // **********************FILL tri************************* 00219 00220 double coords[] = { 1, 1, 1, 2, 1, 1, 1.5, 1 + sqrt( 3.0 ) / 2.0, 1, 1.5, 1 - sqrt( 3.0 ) / 2.0, 1 }; 00221 00222 size_t indices[] = { 0, 1, 2, 0, 3, 1 }; 00223 00224 pd.fill( 4, coords, 2, TRIANGLE, indices, 0, err ); 00225 } 00226 00227 /*! \fn create_four_quads_patch(PatchData &four_quads, MsqError &err) 00228 our 2D set up: 4 quads, center vertex outcentered by (0,-0.5) 00229 7____6____5 00230 | | | 00231 | 2 | 3 | 00232 8-_ | _-4 vertex 1 is at (0,0) 00233 | -_0_- | vertex 5 is at (2,2) 00234 | 0 | 1 | 00235 1----2----3 00236 */ 00237 inline void create_four_quads_patch( PatchData& four_quads, MsqError& err ) 00238 { 00239 double coords[] = { 1, .5, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 1, 2, 0, 0, 2, 0, 0, 1, 0 }; 00240 00241 size_t indices[] = { 1, 2, 0, 8, 2, 3, 4, 0, 8, 0, 6, 7, 0, 4, 5, 6 }; 00242 00243 four_quads.fill( 9, coords, 4, QUADRILATERAL, indices, 0, err ); 00244 } 00245 00246 /*! \fn create_six_quads_patch(PatchData &four_quads, MsqError &err) 00247 our 2D set up: 6 quads, 1 center vertex outcentered by (0,-0.5), the other centered 00248 7____6____5___11 00249 | | | | 00250 | 2 | 3 | 5 | 00251 8-_ | _-4---10 vertex 1 is at (0,0) 00252 | -_0_- | | vertex 11 is at (3,2) 00253 | 0 | 1 | 4 | 00254 1----2----3----9 00255 00256 use destroy_patch_with_domain() in sync. 00257 */ 00258 inline void create_six_quads_patch_with_domain( PatchData& pd, MsqError& err ) 00259 { 00260 // associates domain 00261 Vector3D pnt( 0, 0, 0 ); 00262 Vector3D s_norm( 0, 0, 3 ); 00263 pd.set_domain( new PlanarDomain( s_norm, pnt ) ); 00264 00265 double coords[] = { 1, .5, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 00266 1, 2, 0, 0, 2, 0, 0, 1, 0, 3, 0, 0, 3, 1, 0, 3, 2, 0 }; 00267 00268 size_t indices[] = { 1, 2, 0, 8, 2, 3, 4, 0, 8, 0, 6, 7, 0, 4, 5, 6, 3, 9, 10, 4, 4, 10, 11, 5 }; 00269 00270 bool fixed[] = { false, true, true, true, false, true, true, true, true, true, true, true }; 00271 00272 pd.fill( 12, coords, 6, QUADRILATERAL, indices, fixed, err ); 00273 } 00274 00275 /*! \fn create_six_quads_patch_inverted_with_domain(PatchData &four_quads, MsqError &err) 00276 our 2D set up: 6 quads, 1 center vertex outcentered by (0,-0.5), the other centered 00277 7____6____5___11 00278 | | | | 00279 | 2 | 3 | 5 | 00280 8 | 4---10 vertex 1 is at (0,0) 00281 |\ /| | vertex 11 is at (3,2) 00282 | | | 4 | 00283 1----2----3----9 00284 \ / 00285 0 00286 use destroy_patch_with_domain() in sync. 00287 */ 00288 inline void create_six_quads_patch_inverted_with_domain( PatchData& pd, MsqError& err ) 00289 { 00290 create_six_quads_patch_with_domain( pd, err );MSQ_CHKERR( err ); 00291 00292 Vector3D displacement( 0, -1.5, 0 ); 00293 00294 pd.move_vertex( displacement, 0, err ); 00295 } 00296 00297 /*! \fn create_twelve_hex_patch(PatchData &pd, MsqError &err) 00298 3D set up: 12 quads, one center vertex outcentered by (0,-0.5), 00299 the other centered. Vertex 1 is at (0,0,-1). Vertex 35 is at (3,2,1). 00300 00301 7____6____5___11 19___18____17__23 31___30___29___35 00302 | | | | | | | | | | | | 00303 | 2 | 3 | 5 | | | | | | 8 | 9 | 11 | 00304 8----0----4---10 20-_ | _16---22 32---24---28---34 00305 | | | | | -12_- | | | | | | 00306 | 0 | 1 | 4 | | | | | | 6 | 7 | 10 | 00307 1----2----3----9 13---14---15---21 25---26---27---33 00308 */ 00309 inline void create_twelve_hex_patch( PatchData& pd, MsqError& err ) 00310 { 00311 double coords[] = { 1, 1, -1, 0, 0, -1, 1, 0, -1, 2, 0, -1, 2, 1, -1, 2, 2, -1, 00312 1, 2, -1, 0, 2, -1, 0, 1, -1, 3, 0, -1, 3, 1, -1, 3, 2, -1, 00313 00314 1, .5, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 00315 1, 2, 0, 0, 2, 0, 0, 1, 0, 3, 0, 0, 3, 1, 0, 3, 2, 0, 00316 00317 1, 1, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 2, 1, 1, 2, 2, 1, 00318 1, 2, 1, 0, 2, 1, 0, 1, 1, 3, 0, 1, 3, 1, 1, 3, 2, 1 }; 00319 00320 size_t connectivity[] = { 1, 2, 0, 8, 13, 14, 12, 20, // 0 00321 2, 3, 4, 0, 14, 15, 16, 12, // 1 00322 8, 0, 6, 7, 20, 12, 18, 19, // 2 00323 0, 4, 5, 6, 12, 16, 17, 18, // 3 00324 3, 9, 10, 4, 15, 21, 22, 16, // 4 00325 4, 10, 11, 5, 16, 22, 23, 17, // 5 00326 13, 14, 12, 20, 25, 26, 24, 32, // 6 00327 14, 15, 16, 12, 26, 27, 28, 24, // 7 00328 20, 12, 18, 19, 32, 24, 30, 31, // 8 00329 12, 16, 17, 18, 24, 28, 29, 30, // 9 00330 15, 21, 22, 16, 27, 33, 34, 28, // 10 00331 16, 22, 23, 17, 28, 34, 35, 29 }; // 11 00332 00333 bool fixed[] = { true, true, true, true, true, true, true, true, true, true, true, true, 00334 false, true, true, true, false, true, true, true, true, true, true, true, 00335 true, true, true, true, true, true, true, true, true, true, true, true }; 00336 00337 pd.fill( 36, coords, 12, HEXAHEDRON, connectivity, fixed, err ); 00338 } 00339 00340 inline void create_twelve_hex_patch_inverted( PatchData& pd, MsqError& err ) 00341 { 00342 create_twelve_hex_patch( pd, err );MSQ_CHKERR( err ); 00343 move_vertex( pd, Vector3D( 2, 1, 0 ), Vector3D( 0, 0, 1.5 ), err );MSQ_CHKERR( err ); 00344 } 00345 00346 /* Patch used in several quality metric tests. 00347 Our triangular patch is made of two tris. tri_1 is a perfect 00348 equilateral (the ideal for most metrics). tri_2 is an arbitrary 00349 triangle. 00350 Memory allocated in this function must be deallocated with 00351 destroy_patch_with_domain(). 00352 */ 00353 inline void create_qm_two_tri_patch_with_domain( PatchData& triPatch, MsqError& err ) 00354 { 00355 Vector3D pnt( 0, 0, 0 ); 00356 Vector3D s_norm( 0, 0, 3 ); 00357 triPatch.set_domain( new PlanarDomain( s_norm, pnt ) ); 00358 00359 double coords[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, sqrt( 3.0 ) / 2.0, 0.0, 2.0, -4.0, 2.0 }; 00360 00361 const size_t conn[] = { 0, 1, 2, 0, 3, 1 }; 00362 00363 triPatch.fill( 4, coords, 2, TRIANGLE, conn, 0, err ); 00364 } 00365 00366 /* Patch used in several quality metric tests. 00367 Our quad patch is made of two quads. quad_1 is a perfect 00368 square (the ideal for most metrics). quad_2 is an arbitrary 00369 quad. 00370 Memory allocated in this function must be deallocated with 00371 destroy_patch_with_domain(). 00372 */ 00373 inline void create_qm_two_quad_patch_with_domain( PatchData& quadPatch, MsqError& err ) 00374 { 00375 Vector3D pnt( 0, 0, 0 ); 00376 Vector3D s_norm( 0, 0, 3 ); 00377 quadPatch.set_domain( new PlanarDomain( s_norm, pnt ) ); 00378 00379 double coords[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 2.0, -1.0, .5, 1.5, 1.0, 1.0 }; 00380 00381 const size_t conn[] = { 0, 1, 2, 3, 1, 4, 5, 2 }; 00382 00383 quadPatch.fill( 6, coords, 2, QUADRILATERAL, conn, 0, err ); 00384 } 00385 00386 /* Patch used in several quality metric tests. 00387 Our tet patch is made of two tets. tet_1 is a perfect 00388 equilateral (the ideal for most metrics). tet_2 is an arbitrary 00389 tet. 00390 */ 00391 inline void create_qm_two_tet_patch( PatchData& tetPatch, MsqError& err ) 00392 { 00393 double coords[] = { 00394 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, sqrt( 3.0 ) / 2.0, 0.0, 0.5, sqrt( 3.0 ) / 6.0, sqrt( 2.0 ) / sqrt( 3.0 ), 00395 2.0, 3.0, -.5 }; 00396 00397 const size_t conn[] = { 0, 1, 2, 3, 1, 4, 2, 3 }; 00398 00399 tetPatch.fill( 5, coords, 2, TETRAHEDRON, conn, 0, err ); 00400 } 00401 00402 /* Patch used in several quality metric tests. 00403 Our pyr patch is made of two pyramids. The first is a perfect 00404 pyramid (the ideal for most metrics). The second is an arbitrary 00405 pyramid. 00406 */ 00407 inline void create_qm_two_pyr_patch( PatchData& pyrPatch, MsqError& err ) 00408 { 00409 /* Equilateral triangles 00410 double coords[] = { 1, -1, 0, 00411 1, 1, 0, 00412 -1, 1, 0, 00413 -1, -1, 0, 00414 0, 0, sqrt(2) }; 00415 */ 00416 /* Unit height */ 00417 double coords[] = { /* Equilateral triangles */ 00418 /* 1, -1, 0, 00419 1, 1, 0, 00420 -1, 1, 0, 00421 -1, -1, 0, 00422 0, 0, sqrt(2) */ 00423 /* Unit height */ 00424 1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 0, 0, 2, 00425 /* Apex for a squashed pyramid */ 00426 0, 0, -1 }; 00427 00428 const size_t conn[] = { 0, 1, 2, 3, 4, 3, 2, 1, 0, 5 }; 00429 00430 pyrPatch.fill( 6, coords, 2, PYRAMID, conn, 0, err ); 00431 } 00432 00433 /* Patch used in several quality metric tests. 00434 Our prism patch is made of two prisms. The first is a perfect 00435 prism (the ideal for most metrics). The second is an arbitrary 00436 wedge. 00437 */ 00438 inline void create_qm_two_wdg_patch( PatchData& wdgPatch, MsqError& err ) 00439 { 00440 double hgt = 0.5 * MSQ_SQRT_THREE; 00441 double coords[] = { // ideal prism vertices 00442 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, hgt, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5, hgt, 1.0, 00443 // top vertices for stretched wedge 00444 0.5, -3.0, 0.0, 0.5, -4.0, 1.0 }; 00445 00446 const size_t conn[] = { 0, 1, 2, 3, 4, 5, 1, 0, 6, 4, 3, 7 }; 00447 00448 wdgPatch.fill( 8, coords, 2, PRISM, conn, 0, err ); 00449 } 00450 00451 /* Patch used in seveal quality metric tests. 00452 Our hex patch is made of two hexes. hex_1 is a perfect 00453 unit cube (the ideal for most metrics). hex_2 is an arbitrary 00454 hex. 00455 */ 00456 inline void create_qm_two_hex_patch( PatchData& hexPatch, MsqError& err ) 00457 { 00458 double coords[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 00459 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 2.0, 0.0, 0.0, 2.0, 1.0, 0.0, 2.0, -1.0, 1.0, 3.0, 2.0, 1.0 }; 00460 00461 const size_t conn[] = { 0, 1, 2, 3, 4, 5, 6, 7, 1, 8, 9, 2, 5, 10, 11, 6 }; 00462 00463 hexPatch.fill( 12, coords, 2, HEXAHEDRON, conn, 0, err ); 00464 } 00465 00466 // Create patch containing one ideal element, optionally higher-order. 00467 // For 2D elements, will attach appropriate planar domain. 00468 inline void create_ideal_element_patch( PatchData& pd, EntityTopology type, size_t num_nodes, MsqError& err ) 00469 { 00470 static PlanarDomain zplane( PlanarDomain::XY ); 00471 static Settings settings; 00472 settings.set_slaved_ho_node_mode( Settings::SLAVE_NONE ); 00473 pd.attach_settings( &settings ); 00474 00475 // build list of vertex coordinates 00476 const Vector3D* corners = unit_edge_element( type ); 00477 std::vector< Vector3D > coords( corners, corners + TopologyInfo::corners( type ) ); 00478 bool mids[4] = { false }; 00479 TopologyInfo::higher_order( type, num_nodes, mids[1], mids[2], mids[3], err );MSQ_ERRRTN( err ); 00480 std::vector< size_t > conn( coords.size() ); 00481 for( unsigned i = 0; i < coords.size(); ++i ) 00482 conn[i] = i; 00483 00484 for( unsigned dim = 1; dim <= TopologyInfo::dimension( type ); ++dim ) 00485 { 00486 if( !mids[dim] ) continue; 00487 00488 int num_side; 00489 if( dim == TopologyInfo::dimension( type ) ) 00490 num_side = 1; 00491 else 00492 num_side = TopologyInfo::adjacent( type, dim ); 00493 00494 for( int s = 0; s < num_side; ++s ) 00495 { 00496 unsigned idx = TopologyInfo::higher_order_from_side( type, num_nodes, dim, s, err );MSQ_ERRRTN( err ); 00497 conn.push_back( idx ); 00498 00499 unsigned n; 00500 const unsigned* side = TopologyInfo::side_vertices( type, dim, s, n, err );MSQ_ERRRTN( err ); 00501 Vector3D avg = coords[side[0]]; 00502 for( unsigned v = 1; v < n; ++v ) 00503 avg += coords[side[v]]; 00504 avg *= 1.0 / n; 00505 coords.push_back( avg ); 00506 } 00507 } 00508 00509 bool* fixed = new bool[coords.size()]; 00510 std::fill( fixed, fixed + coords.size(), false ); 00511 pd.fill( coords.size(), coords[0].to_array(), 1, &type, &num_nodes, &conn[0], fixed, err ); 00512 delete[] fixed;MSQ_ERRRTN( err ); 00513 00514 if( TopologyInfo::dimension( type ) == 2 ) pd.set_domain( &zplane ); 00515 } 00516 00517 } // namespace MBMesquite 00518 00519 #endif // PatchDataInstances_hpp