00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <MeshTransformer.hpp>
00021
00022 #include <FieldOfScalarFunction.hpp>
00023
00024 #include <Structured3DMesh.hpp>
00025 #include <MeshOfTetrahedra.hpp>
00026 #include <MeshOfHexahedra.hpp>
00027
00028 #include <SpectralMesh.hpp>
00029
00030 #include <SurfaceMeshOfTriangles.hpp>
00031 #include <SurfaceMeshOfQuadrangles.hpp>
00032
00033 template <typename CellType,
00034 typename OriginalCellType>
00035 CellType MeshTransformer::
00036 __getCell(VerticesSet& V,
00037 const OriginalCellType& originalCell)
00038 {
00039 throw ErrorHandler(__FILE__,__LINE__,
00040 "non-supported cell type",
00041 ErrorHandler::unexpected);
00042 }
00043
00044 template <>
00045 Hexahedron MeshTransformer::
00046 __getCell<Hexahedron,
00047 CartesianHexahedron>(VerticesSet& V,
00048 const CartesianHexahedron& H)
00049 {
00050 const size_t i0 = __input->vertexNumber(H(0));
00051 const size_t i1 = __input->vertexNumber(H(1));
00052 const size_t i2 = __input->vertexNumber(H(2));
00053 const size_t i3 = __input->vertexNumber(H(3));
00054 const size_t i4 = __input->vertexNumber(H(4));
00055 const size_t i5 = __input->vertexNumber(H(5));
00056 const size_t i6 = __input->vertexNumber(H(6));
00057 const size_t i7 = __input->vertexNumber(H(7));
00058
00059 return Hexahedron(V[i0],V[i1],V[i2],V[i3],
00060 V[i4],V[i5],V[i6],V[i7],
00061 H.reference());
00062 }
00063
00064 template <>
00065 Tetrahedron MeshTransformer::
00066 __getCell<Tetrahedron,
00067 Tetrahedron>(VerticesSet& V,
00068 const Tetrahedron& T)
00069 {
00070 const size_t i0 = __input->vertexNumber(T(0));
00071 const size_t i1 = __input->vertexNumber(T(1));
00072 const size_t i2 = __input->vertexNumber(T(2));
00073 const size_t i3 = __input->vertexNumber(T(3));
00074
00075 return Tetrahedron(V[i0],V[i1],V[i2],V[i3],
00076 T.reference());
00077 }
00078
00079 template <>
00080 Triangle MeshTransformer::
00081 __getCell<Triangle,
00082 Triangle>(VerticesSet& V,
00083 const Triangle& T)
00084 {
00085 const size_t i0 = __input->vertexNumber(T(0));
00086 const size_t i1 = __input->vertexNumber(T(1));
00087 const size_t i2 = __input->vertexNumber(T(2));
00088
00089 return Triangle(V[i0],V[i1],V[i2],
00090 T.reference());
00091 }
00092
00093 template <>
00094 Quadrangle MeshTransformer::
00095 __getCell<Quadrangle,
00096 Quadrangle>(VerticesSet& V,
00097 const Quadrangle& Q)
00098 {
00099 const size_t i0 = __input->vertexNumber(Q(0));
00100 const size_t i1 = __input->vertexNumber(Q(1));
00101 const size_t i2 = __input->vertexNumber(Q(2));
00102 const size_t i3 = __input->vertexNumber(Q(3));
00103
00104 return Quadrangle(V[i0],V[i1],V[i2],V[i3],
00105 Q.reference());
00106 }
00107
00108 template <typename MeshType>
00109 void MeshTransformer::
00110 __transformSurface()
00111 {
00112 const MeshType& m
00113 = static_cast<const MeshType&>(*__input);
00114
00115 typedef typename MeshType::CellType OldCellType;
00116
00117 typedef typename MeshType::Transformed NewMeshType;
00118 typedef typename NewMeshType::CellType NewCellType;
00119
00120 ReferenceCounting<VerticesSet> v = new VerticesSet(m.numberOfVertices());
00121
00122 VerticesSet& vertices = *v;
00123
00124 if (__field->numberOfComponents() != 3) {
00125 throw ErrorHandler(__FILE__,__LINE__,
00126 "Transformation field require 3 components, you provided:"
00127 +stringify(*__field),
00128 ErrorHandler::normal);
00129 }
00130
00131 const ScalarFunctionBase& f1 = *__field->function(0);
00132 const ScalarFunctionBase& f2 = *__field->function(1);
00133 const ScalarFunctionBase& f3 = *__field->function(2);
00134
00135 for (size_t i=0; i<m.numberOfVertices(); ++i) {
00136 const Vertex& X = m.vertex(i);
00137
00138 vertices[i][0] = f1(X);
00139 vertices[i][1] = f2(X);
00140 vertices[i][2] = f3(X);
00141
00142 vertices[i].reference() = X.reference();
00143 }
00144
00145 ReferenceCounting<Vector<NewCellType> > elements
00146 = new Vector<NewCellType>(m.numberOfCells());
00147
00148
00149 for (size_t i=0; i<m.numberOfCells(); ++i) {
00150 (*elements)[i]
00151 = __getCell<NewCellType,
00152 OldCellType>(vertices, m.cell(i));
00153 }
00154
00155 ReferenceCounting<VerticesCorrespondance> correspondances
00156 = new VerticesCorrespondance(m.numberOfVertices());
00157 __mesh = new NewMeshType(v, correspondances, elements);
00158 }
00159
00160 template <typename MeshType>
00161 void MeshTransformer::
00162 __transformVolume()
00163 {
00164 const MeshType& m
00165 = static_cast<const MeshType&>(*__input);
00166
00167 typedef typename MeshType::CellType OldCellType;
00168
00169 typedef typename MeshType::Transformed NewMeshType;
00170 typedef typename NewMeshType::CellType NewCellType;
00171
00172 ReferenceCounting<VerticesSet> v = new VerticesSet(m.numberOfVertices());
00173
00174 VerticesSet& vertices = *v;
00175
00176 if (__field->numberOfComponents() != 3) {
00177 throw ErrorHandler(__FILE__,__LINE__,
00178 "Transformation field require 3 components, you provided:"
00179 +stringify(*__field),
00180 ErrorHandler::normal);
00181 }
00182
00183 const ScalarFunctionBase& f1 = *__field->function(0);
00184 const ScalarFunctionBase& f2 = *__field->function(1);
00185 const ScalarFunctionBase& f3 = *__field->function(2);
00186
00187 for (size_t i=0; i<m.numberOfVertices(); ++i) {
00188 const Vertex& X = m.vertex(i);
00189
00190 vertices[i][0] = f1(X);
00191 vertices[i][1] = f2(X);
00192 vertices[i][2] = f3(X);
00193
00194 vertices[i].reference() = X.reference();
00195 }
00196
00197 ReferenceCounting<Vector<NewCellType> > elements
00198 = new Vector<NewCellType>(m.numberOfCells());
00199
00200
00201 for (size_t i=0; i<m.numberOfCells(); ++i) {
00202 (*elements)[i]
00203 = __getCell<NewCellType,
00204 OldCellType>(vertices, m.cell(i));
00205 }
00206
00207 ReferenceCounting<VerticesCorrespondance> correspondances
00208 = new VerticesCorrespondance(m.numberOfVertices());
00209
00210 typedef
00211 typename NewMeshType::BorderMeshType
00212 NewBorderMeshType;
00213
00214 ReferenceCounting<NewBorderMeshType> borderMesh=0;
00215
00216 if (m.hasBorderMesh()) {
00217 typedef
00218 typename NewBorderMeshType::CellType
00219 NewFaceType;
00220
00221 typedef
00222 typename MeshType::BorderMeshType
00223 OldBorderMeshType;
00224
00225 typedef
00226 typename OldBorderMeshType::CellType
00227 OldFaceType;
00228
00229 const OldBorderMeshType& s = *m.borderMesh();
00230
00231 ReferenceCounting<Vector<NewFaceType> > boundaryElements
00232 = new Vector<NewFaceType>(s.numberOfCells());
00233
00234 for (size_t i=0; i<s.numberOfCells(); ++i) {
00235 (*boundaryElements)[i]
00236 = __getCell<NewFaceType,
00237 OldFaceType>(vertices,s.cell(i));
00238 }
00239
00240 borderMesh = new NewBorderMeshType(v,correspondances,
00241 boundaryElements);
00242 }
00243
00244 __mesh = new NewMeshType(v, correspondances,
00245 elements, borderMesh);
00246 }
00247
00248 void MeshTransformer::
00249 transform()
00250 {
00251 switch (__input->type()) {
00252 case Mesh::cartesianHexahedraMesh: {
00253 this->__transformVolume<Structured3DMesh>();
00254 break;
00255 }
00256 case Mesh::hexahedraMesh: {
00257 this->__transformVolume<MeshOfHexahedra>();
00258 break;
00259 }
00260 case Mesh::tetrahedraMesh: {
00261 this->__transformVolume<MeshOfTetrahedra>();
00262 break;
00263 }
00264 case Mesh::spectralMesh: {
00265 this->__transformVolume<SpectralMesh>();
00266 break;
00267 }
00268 case Mesh::surfaceMeshTriangles: {
00269 this->__transformSurface<SurfaceMeshOfTriangles>();
00270 break;
00271 }
00272 case Mesh::surfaceMeshQuadrangles: {
00273 this->__transformSurface<SurfaceMeshOfQuadrangles>();
00274 break;
00275 }
00276 default: {
00277 throw ErrorHandler(__FILE__,__LINE__,
00278 "not implemented",
00279 ErrorHandler::unexpected);
00280 }
00281 }
00282 }