00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <fstream>
00024 #include <cmath>
00025
00026 #include <ConnectivityBuilder.hpp>
00027
00028 #include <CartesianHexahedron.hpp>
00029 #include <SpectralMesh.hpp>
00030 #include <Scene.hpp>
00031
00032 #include <FacesBuilder.hpp>
00033 #include <EdgesBuilder.hpp>
00034
00035 #include <GaussLobattoManager.hpp>
00036
00037 #include <SpectralConformTransformation.hpp>
00038
00039 void SpectralMesh::
00040 buildEdges()
00041 {
00042 EdgesBuilder<SpectralMesh> edgesBuilder(*this);
00043 __edgesSet = edgesBuilder.edgesSet();
00044 }
00045
00046 void SpectralMesh::
00047 buildFaces()
00048 {
00049 FacesBuilder<SpectralMesh> facesBuilder(*this);
00050 __facesSet = facesBuilder.facesSet();
00051 }
00052
00059 SpectralMesh::
00060 SpectralMesh(const Structured3DMeshShape& degrees,
00061 ReferenceCounting<VerticesCorrespondance> correspondances)
00062 : Mesh(Mesh::spectralMesh,
00063 Mesh::volume,
00064 new VerticesSet((degrees.shape().nx()+2)*(degrees.shape().ny()+2)*(degrees.shape().nz()+2)),
00065 correspondances),
00066 __degrees(TinyVector<3,size_t>(degrees.shape().nx(),degrees.shape().ny(),degrees.shape().nz())),
00067 __verticesShape(TinyVector<3,size_t>(degrees.shape().nx()+2,degrees.shape().ny()+2,degrees.shape().nz()+2), degrees.a(), degrees.b()),
00068 __cellShape(TinyVector<3,size_t>(degrees.shape().nx()+1,degrees.shape().ny()+1,degrees.shape().nz()+1)),
00069 __cells((degrees.shape().nx()+1)*(degrees.shape().ny()+1)*(degrees.shape().nz()+1)),
00070 __facesSet(0),
00071 __connectivity(*this)
00072 {
00073
00074
00075
00076
00077
00078
00079
00080
00081 const size_t degreeX = degrees.nx();
00082 const size_t degreeY = degrees.ny();
00083 const size_t degreeZ = degrees.nz();
00084
00085 const size_t nx_1 = __cellShape.nx();
00086 const size_t ny_1 = __cellShape.ny();
00087 const size_t nz_1 = __cellShape.nz();
00088 Interval intervalX(__verticesShape.a()[0],__verticesShape.b()[0]) ;
00089 Interval intervalY(__verticesShape.a()[1],__verticesShape.b()[1]) ;
00090 Interval intervalZ(__verticesShape.a()[2],__verticesShape.b()[2]) ;
00091 const GaussLobatto& gaussLobattoX = GaussLobattoManager::instance().get(degreeX+1);
00092 const GaussLobatto& gaussLobattoY = GaussLobattoManager::instance().get(degreeY+1);
00093 const GaussLobatto& gaussLobattoZ = GaussLobattoManager::instance().get(degreeZ+1);
00094
00095 SpectralConformTransformation transformationX(intervalX);
00096 SpectralConformTransformation transformationY(intervalY);
00097 SpectralConformTransformation transformationZ(intervalZ);
00098 for (size_t i=0; i<__verticesShape.nx(); i++) {
00099 for (size_t j=0; j<__verticesShape.ny(); j++) {
00100 for (size_t k=0; k<__verticesShape.nz(); k++) {
00101 Vertex& v = vertex(i,j,k);
00102
00103 v.x() = transformationX(gaussLobattoX(i));
00104 v.y() = transformationY(gaussLobattoY(j));
00105 v.z() = transformationZ(gaussLobattoZ(k));
00106 }
00107 }
00108 }
00109
00110
00111
00112
00113
00114 size_t n=0;
00115 for (size_t i=0; i<nx_1; i++) {
00116 for (size_t j=0; j<ny_1; j++) {
00117 for (size_t k=0; k<nz_1; k++) {
00118 __cells[n] = CartesianHexahedron(vertex( i, j, k),
00119 vertex(i+1, j, k),
00120 vertex(i+1,j+1, k),
00121 vertex( i,j+1, k),
00122 vertex( i, j,k+1),
00123 vertex(i+1, j,k+1),
00124 vertex(i+1,j+1,k+1),
00125 vertex( i,j+1,k+1));
00126 n++;
00127 }
00128 }
00129 }
00130
00135 Vector<Quadrangle>* pQuadrangles
00136 = new Vector<Quadrangle>(2*ny_1*nz_1+2*nx_1*nz_1+2*nx_1*ny_1);
00137 Vector<Quadrangle>& quadrangles = *pQuadrangles;
00138
00139 size_t currentCell = 0;
00141 for (size_t j=0; j<ny_1; j++) {
00142 for (size_t k=0; k<nz_1; k++) {
00143 const Vertex& V0 = vertex(0, j, k);
00144 const Vertex& V1 = vertex(0, j,k+1);
00145 const Vertex& V2 = vertex(0,j+1,k+1);
00146 const Vertex& V3 = vertex(0,j+1, k);
00147 Quadrangle& Q = quadrangles[currentCell];
00148
00149 Q = Quadrangle(V0, V1, V2, V3, 0);
00150 Q.setMother(&(cell(0,j,k)),4);
00151
00152 currentCell++;
00153 }
00154 }
00155
00157 for (size_t j=0; j<ny_1; j++) {
00158 for (size_t k=0; k<nz_1; k++) {
00159 const Vertex& V0 = vertex(nx_1, j, k);
00160 const Vertex& V1 = vertex(nx_1,j+1, k);
00161 const Vertex& V2 = vertex(nx_1,j+1,k+1);
00162 const Vertex& V3 = vertex(nx_1, j,k+1);
00163 Quadrangle& Q = quadrangles[currentCell];
00164
00165 Q = Quadrangle(V0, V1, V2, V3, 1);
00166 Q.setMother(&(cell(nx_1-1,j,k)),2);
00167
00168 currentCell++;
00169 }
00170 }
00171
00173 for (size_t i=0; i<nx_1; i++) {
00174 for (size_t k=0; k<nz_1; k++) {
00175 const Vertex& V0 = vertex( i,0, k);
00176 const Vertex& V1 = vertex(i+1,0, k);
00177 const Vertex& V2 = vertex(i+1,0,k+1);
00178 const Vertex& V3 = vertex( i,0,k+1);
00179 Quadrangle& Q = quadrangles[currentCell];
00180
00181 Q = Quadrangle(V0, V1, V2, V3, 2);
00182 Q.setMother(&(cell(i,0,k)),1);
00183
00184 currentCell++;
00185 }
00186 }
00187
00189 for (size_t i=0; i<nx_1; i++) {
00190 for (size_t k=0; k<nz_1; k++) {
00191 const Vertex& V0 = vertex( i,ny_1, k);
00192 const Vertex& V1 = vertex( i,ny_1,k+1);
00193 const Vertex& V2 = vertex(i+1,ny_1,k+1);
00194 const Vertex& V3 = vertex(i+1,ny_1, k);
00195 Quadrangle& Q = quadrangles[currentCell];
00196
00197 Q = Quadrangle(V0, V1, V2, V3, 3);
00198 Q.setMother(&(cell(i,ny_1-1,k)),3);
00199
00200 currentCell++;
00201 }
00202 }
00203
00205 for (size_t i=0; i<nx_1; i++) {
00206 for (size_t j=0; j<ny_1; j++) {
00207 const Vertex& V0 = vertex( i, j,0);
00208 const Vertex& V1 = vertex( i,j+1,0);
00209 const Vertex& V2 = vertex(i+1,j+1,0);
00210 const Vertex& V3 = vertex(i+1, j,0);
00211 Quadrangle& Q = quadrangles[currentCell];
00212
00213 Q = Quadrangle(V0, V1, V2, V3, 4);
00214 Q.setMother(&(cell(i,j,0)),0);
00215
00216 currentCell++;
00217 }
00218 }
00219
00220
00222 for (size_t i=0; i<nx_1; i++) {
00223 for (size_t j=0; j<ny_1; j++) {
00224 const Vertex& V0 = vertex( i, j,nz_1);
00225 const Vertex& V1 = vertex(i+1, j,nz_1);
00226 const Vertex& V2 = vertex(i+1,j+1,nz_1);
00227 const Vertex& V3 = vertex( i,j+1,nz_1);
00228 Quadrangle& Q = quadrangles[currentCell];
00229
00230 Q = Quadrangle(V0, V1, V2, V3, 5);
00231 Q.setMother(&(cell(i,j,nz_1-1)),5);
00232 currentCell++;
00233 }
00234 }
00235 __borderMesh = new SurfaceMeshOfQuadrangles(__verticesSet,
00236 __verticesCorrespondance,
00237 pQuadrangles);
00238 __borderMesh->setBackgroundMesh(this);
00239 }