00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00037 #include "Intrepid_CellTools.hpp"
00038 #include "Intrepid_FieldContainer.hpp"
00039 #include "Intrepid_DefaultCubatureFactory.hpp"
00040 #include "Teuchos_GlobalMPISession.hpp"
00041
00042 #include "Shards_CellTopology.hpp"
00043
00044 #include "Teuchos_RCP.hpp"
00045
00046 using namespace std;
00047 using namespace Intrepid;
00048 using namespace shards;
00049
00050 int main(int argc, char *argv[]) {
00051
00052 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
00053
00054 typedef CellTools<double> CellTools;
00055 typedef shards::CellTopology CellTopology;
00056
00057 cout \
00058 << "===============================================================================\n" \
00059 << "| |\n" \
00060 << "| Example use of the CellTools class |\n" \
00061 << "| |\n" \
00062 << "| 1) Reference edge parametrizations |\n" \
00063 << "| 2) Reference face parametrizations |\n" \
00064 << "| |\n" \
00065 << "| Questions? Contact Pavel Bochev (pbboche@sandia.gov) |\n" \
00066 << "| Denis Ridzal (dridzal@sandia.gov), or |\n" \
00067 << "| Kara Peterson (kjpeter@sandia.gov). |\n" \
00068 << "| |\n" \
00069 << "| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
00070 << "| Trilinos website: http://trilinos.sandia.gov |\n" \
00071 << "| |\n" \
00072 << "===============================================================================\n"\
00073 << "| Summary: |\n"\
00074 << "| Reference edge parametrizations map [-1,1] to the edges of reference cells. |\n"\
00075 << "| They are used to define, e.g., integration points on the edges of 2D and 3D |\n"\
00076 << "| reference cells. Edge parametrizations for special 2D cells such as Beam |\n"\
00077 << "| and ShellLine, are also supported. |\n"\
00078 << "===============================================================================\n";
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 DefaultCubatureFactory<double> cubFactory;
00104
00105
00106
00107 CellTopology edgeParam(shards::getCellTopologyData<shards::Line<2> >() );
00108
00109
00110
00111 Teuchos::RCP<Cubature<double> > edgeParamCubature = cubFactory.create(edgeParam, 6);
00112
00113
00114
00115 int cubDim = edgeParamCubature -> getDimension();
00116 int numCubPoints = edgeParamCubature -> getNumPoints();
00117
00118 FieldContainer<double> edgeParamCubPts(numCubPoints, cubDim);
00119 FieldContainer<double> edgeParamCubWts(numCubPoints);
00120 edgeParamCubature -> getCubature(edgeParamCubPts, edgeParamCubWts);
00121
00122
00123
00124 std::cout \
00125 << "===============================================================================\n"\
00126 << "| EXAMPLE 1.1 |\n"
00127 << "| Edge parametrizations for standard 2D cells: Triangle |\n"\
00128 << "===============================================================================\n";
00129
00130
00131 CellTopology triangle_3(getCellTopologyData<Triangle<3> >() );
00132
00133
00134
00135 FieldContainer<double> triEdgePoints(numCubPoints, triangle_3.getDimension() );
00136
00137
00138
00139 for(int edgeOrd = 0; edgeOrd < (int)triangle_3.getEdgeCount(); edgeOrd++){
00140
00141 CellTools::mapToReferenceSubcell(triEdgePoints,
00142 edgeParamCubPts,
00143 1,
00144 edgeOrd,
00145 triangle_3);
00146
00147
00148 CellTools::printSubcellVertices(1, edgeOrd, triangle_3);
00149
00150 for(int pt = 0; pt < numCubPoints; pt++){
00151 std::cout << "\t Parameter point "
00152 << std::setw(12) << std::right << edgeParamCubPts(pt, 0) << std::setw(10) << " --> " << "("
00153 << std::setw(10) << std::right << triEdgePoints(pt, 0) << " , "
00154 << std::setw(10) << std::right << triEdgePoints(pt, 1) << ")\n";
00155 }
00156 std::cout << "\n";
00157 }
00158
00159
00160
00161 std::cout \
00162 << "===============================================================================\n"\
00163 << "| EXAMPLE 1.2 |\n"
00164 << "| Edge parametrizations for standard 2D cells: Quadrilateral |\n"\
00165 << "===============================================================================\n";
00166
00167
00168 CellTopology quad_4(getCellTopologyData<Quadrilateral<4> >() );
00169
00170
00171
00172 FieldContainer<double> quadEdgePoints(numCubPoints, quad_4.getDimension() );
00173
00174
00175
00176 for(int edgeOrd = 0; edgeOrd < (int)quad_4.getEdgeCount(); edgeOrd++){
00177
00178 CellTools::mapToReferenceSubcell(quadEdgePoints,
00179 edgeParamCubPts,
00180 1,
00181 edgeOrd,
00182 quad_4);
00183
00184
00185 CellTools::printSubcellVertices(1, edgeOrd, quad_4);
00186
00187 for(int pt = 0; pt < numCubPoints; pt++){
00188 std::cout << "\t Parameter point "
00189 << std::setw(12) << std::right << edgeParamCubPts(pt, 0) << std::setw(10) << " --> " << "("
00190 << std::setw(10) << std::right << quadEdgePoints(pt, 0) << " , "
00191 << std::setw(10) << std::right << quadEdgePoints(pt, 1) << ")\n";
00192 }
00193 std::cout << "\n";
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 CellTopology triFaceParam(shards::getCellTopologyData<shards::Triangle<3> >() );
00226 CellTopology quadFaceParam(shards::getCellTopologyData<shards::Quadrilateral<4> >() );
00227
00228
00229
00230 Teuchos::RCP<Cubature<double> > triFaceParamCubature = cubFactory.create(triFaceParam, 3);
00231 Teuchos::RCP<Cubature<double> > quadFaceParamCubature = cubFactory.create(quadFaceParam, 3);
00232
00233
00234
00235 int triFaceCubDim = triFaceParamCubature -> getDimension();
00236 int triFaceNumCubPts = triFaceParamCubature -> getNumPoints();
00237
00238 FieldContainer<double> triFaceParamCubPts(triFaceNumCubPts, triFaceCubDim);
00239 FieldContainer<double> triFaceParamCubWts(triFaceNumCubPts);
00240 triFaceParamCubature -> getCubature(triFaceParamCubPts, triFaceParamCubWts);
00241
00242
00243
00244 int quadFaceCubDim = quadFaceParamCubature -> getDimension();
00245 int quadFaceNumCubPts = quadFaceParamCubature -> getNumPoints();
00246
00247 FieldContainer<double> quadFaceParamCubPts(quadFaceNumCubPts, quadFaceCubDim);
00248 FieldContainer<double> quadFaceParamCubWts(quadFaceNumCubPts);
00249 quadFaceParamCubature -> getCubature(quadFaceParamCubPts, quadFaceParamCubWts);
00250
00251
00252
00253 std::cout \
00254 << "===============================================================================\n"\
00255 << "| EXAMPLE 2.1 |\n"
00256 << "| Face parametrizations for standard 3D cells: Tetrahedron |\n"\
00257 << "===============================================================================\n";
00258
00259
00260 CellTopology tet_4(getCellTopologyData<Tetrahedron<4> >() );
00261
00262
00263
00264 FieldContainer<double> tetFacePoints(triFaceNumCubPts, tet_4.getDimension() );
00265
00266
00267
00268 for(int faceOrd = 0; faceOrd < (int)tet_4.getSideCount(); faceOrd++){
00269
00270 CellTools::mapToReferenceSubcell(tetFacePoints,
00271 triFaceParamCubPts,
00272 2,
00273 faceOrd,
00274 tet_4);
00275
00276
00277 CellTools::printSubcellVertices(2, faceOrd, tet_4);
00278
00279 for(int pt = 0; pt < triFaceNumCubPts; pt++){
00280 std::cout << "\t Parameter point ("
00281 << std::setw(10) << std::right << triFaceParamCubPts(pt, 0) << " , "
00282 << std::setw(10) << std::right << triFaceParamCubPts(pt, 1) << ") "
00283 << std::setw(10) << " --> " << "("
00284 << std::setw(10) << std::right << tetFacePoints(pt, 0) << " , "
00285 << std::setw(10) << std::right << tetFacePoints(pt, 1) << " , "
00286 << std::setw(10) << std::right << tetFacePoints(pt, 2) << ")\n";
00287 }
00288 std::cout << "\n";
00289 }
00290
00291
00292
00293 std::cout \
00294 << "===============================================================================\n"\
00295 << "| EXAMPLE 2.2 |\n"
00296 << "| Face parametrizations for standard 3D cells: Wedge |\n"\
00297 << "| Example of a reference cell that has two different kinds of faces |\n"\
00298 << "===============================================================================\n";
00299
00300
00301
00302 CellTopology wedge_6(getCellTopologyData<Wedge<6> >() );
00303
00304
00305
00306
00307
00308
00309
00310 FieldContainer<double> wedgeTriFacePoints(triFaceNumCubPts, wedge_6.getDimension() );
00311 FieldContainer<double> wedgeQuadFacePoints(quadFaceNumCubPts, wedge_6.getDimension() );
00312
00313
00314
00315 for(int faceOrd = 0; faceOrd < (int)wedge_6.getSideCount(); faceOrd++){
00316
00317
00318 CellTools::printSubcellVertices(2, faceOrd, wedge_6);
00319
00320 if( wedge_6.getKey(2, faceOrd) == shards::Triangle<3>::key ){
00321 CellTools::mapToReferenceSubcell(wedgeTriFacePoints,
00322 triFaceParamCubPts,
00323 2,
00324 faceOrd,
00325 wedge_6);
00326
00327 for(int pt = 0; pt < triFaceNumCubPts; pt++){
00328 std::cout << "\t Parameter point ("
00329 << std::setw(10) << std::right << triFaceParamCubPts(pt, 0) << " , "
00330 << std::setw(10) << std::right << triFaceParamCubPts(pt, 1) << ") "
00331 << std::setw(10) << " --> " << "("
00332 << std::setw(10) << std::right << wedgeTriFacePoints(pt, 0) << " , "
00333 << std::setw(10) << std::right << wedgeTriFacePoints(pt, 1) << " , "
00334 << std::setw(10) << std::right << wedgeTriFacePoints(pt, 2) << ")\n";
00335 }
00336 std::cout << "\n";
00337 }
00338 else if(wedge_6.getKey(2, faceOrd) == shards::Quadrilateral<4>::key) {
00339 CellTools::mapToReferenceSubcell(wedgeQuadFacePoints,
00340 quadFaceParamCubPts,
00341 2,
00342 faceOrd,
00343 wedge_6);
00344
00345 for(int pt = 0; pt < quadFaceNumCubPts; pt++){
00346 std::cout << "\t Parameter point ("
00347 << std::setw(10) << std::right << quadFaceParamCubPts(pt, 0) << " , "
00348 << std::setw(10) << std::right << quadFaceParamCubPts(pt, 1) << ") "
00349 << std::setw(10) << " --> " << "("
00350 << std::setw(10) << std::right << wedgeQuadFacePoints(pt, 0) << " , "
00351 << std::setw(10) << std::right << wedgeQuadFacePoints(pt, 1) << " , "
00352 << std::setw(10) << std::right << wedgeQuadFacePoints(pt, 2) << ")\n";
00353 }
00354 std::cout << "\n";
00355 }
00356 else {
00357 std::cout << " Invalid face encountered \n";
00358 }
00359 }
00360
00361 return 0;
00362 }