added: multi-patch model generator for 2D and 3D
This commit is contained in:
parent
a410d4abb9
commit
66d33ff9e5
463
Apps/Common/MultiPatchModelGenerator.C
Normal file
463
Apps/Common/MultiPatchModelGenerator.C
Normal file
@ -0,0 +1,463 @@
|
|||||||
|
// $Id$
|
||||||
|
//==============================================================================
|
||||||
|
//!
|
||||||
|
//! \file MultiPatchModelGenerator.C
|
||||||
|
//!
|
||||||
|
//! \date Sep 2 2016
|
||||||
|
//!
|
||||||
|
//! \author Arne Morten Kvarving / SINTEF
|
||||||
|
//!
|
||||||
|
//! \brief Multi-patch model generators for NURBS-based FEM simulators.
|
||||||
|
//!
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "MultiPatchModelGenerator.h"
|
||||||
|
#include "ASMs2D.h"
|
||||||
|
#include "ASMs3D.h"
|
||||||
|
#include "IFEM.h"
|
||||||
|
#include "SIMbase.h"
|
||||||
|
#include "Utilities.h"
|
||||||
|
#include "Vec3.h"
|
||||||
|
#include "Vec3Oper.h"
|
||||||
|
#include "tinyxml.h"
|
||||||
|
|
||||||
|
|
||||||
|
MultiPatchModelGenerator2D::MultiPatchModelGenerator2D (const TiXmlElement* geo) :
|
||||||
|
ModelGenerator(geo)
|
||||||
|
{
|
||||||
|
nx = ny = 1;
|
||||||
|
periodic_x = periodic_y = 0;
|
||||||
|
utl::getAttribute(geo,"nx",nx);
|
||||||
|
utl::getAttribute(geo,"ny",ny);
|
||||||
|
utl::getAttribute(geo,"periodic_x", periodic_x);
|
||||||
|
utl::getAttribute(geo,"periodic_y", periodic_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string MultiPatchModelGenerator2D::createG2 (int nsd) const
|
||||||
|
{
|
||||||
|
bool rational=false;
|
||||||
|
utl::getAttribute(geo,"rational",rational);
|
||||||
|
if (rational)
|
||||||
|
IFEM::cout << "\t Rational basis\n";
|
||||||
|
double scale = 1.0;
|
||||||
|
if (utl::getAttribute(geo,"scale",scale))
|
||||||
|
IFEM::cout <<" Scale: "<< scale << std::endl;
|
||||||
|
|
||||||
|
double Lx = 1.0, Ly = 1.0;
|
||||||
|
if (utl::getAttribute(geo,"Lx",Lx))
|
||||||
|
IFEM::cout <<" Length in X: "<< Lx << std::endl;
|
||||||
|
Lx *= scale;
|
||||||
|
if (utl::getAttribute(geo,"Ly",Ly))
|
||||||
|
IFEM::cout <<" Length in Y: "<< Ly << std::endl;
|
||||||
|
Ly *= scale;
|
||||||
|
|
||||||
|
Vec3 X0;
|
||||||
|
std::string corner;
|
||||||
|
if (utl::getAttribute(geo,"X0",corner)) {
|
||||||
|
std::stringstream str(corner); str >> X0;
|
||||||
|
IFEM::cout <<" Corner: "<< X0 << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nx = 1;
|
||||||
|
int ny = 1;
|
||||||
|
if (utl::getAttribute(geo,"nx",nx))
|
||||||
|
IFEM::cout << " Split in X: " << nx << std::endl;
|
||||||
|
if (utl::getAttribute(geo,"ny",ny))
|
||||||
|
IFEM::cout << " Split in Y: " << ny << std::endl;
|
||||||
|
|
||||||
|
if (nx > 1)
|
||||||
|
Lx /= nx;
|
||||||
|
if (ny > 1)
|
||||||
|
Ly /= ny;
|
||||||
|
|
||||||
|
std::string g2;
|
||||||
|
for (int y = 0; y < ny; ++y) {
|
||||||
|
for (int x = 0; x < nx; ++x) {
|
||||||
|
g2.append("200 1 0 0\n");
|
||||||
|
g2.append(nsd > 2 ? "3" : "2");
|
||||||
|
g2.append(rational?" 1":" 0");
|
||||||
|
g2.append("\n2 2\n0 0 1 1\n2 2\n0 0 1 1");
|
||||||
|
|
||||||
|
std::stringstream str;
|
||||||
|
str <<"\n"<< X0.x+x*Lx <<" "<< X0.y+y*Ly;
|
||||||
|
if (nsd > 2) str <<" 0.0";
|
||||||
|
if (rational) str << " 1.0";
|
||||||
|
g2.append(str.str());
|
||||||
|
str.str("");
|
||||||
|
str <<"\n"<< X0.x+(x+1)*Lx <<" "<< X0.y+y*Ly;
|
||||||
|
if (nsd > 2) str <<" 0.0";
|
||||||
|
if (rational) str << " 1.0";
|
||||||
|
g2.append(str.str());
|
||||||
|
str.str("");
|
||||||
|
str <<"\n"<< X0.x+x*Lx <<" "<< X0.y+(y+1)*Ly;
|
||||||
|
if (nsd > 2) str <<" 0.0";
|
||||||
|
if (rational) str << " 1.0";
|
||||||
|
g2.append(str.str());
|
||||||
|
str.str("");
|
||||||
|
str <<"\n"<< X0.x+(x+1)*Lx <<" "<< X0.y+(y+1)*Ly;
|
||||||
|
if (nsd > 2) str <<" 0.0";
|
||||||
|
if (rational) str << " 1.0";
|
||||||
|
g2.append(str.str());
|
||||||
|
g2.append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return g2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SIMdependency::PatchVec
|
||||||
|
MultiPatchModelGenerator2D::createGeometry (const SIMbase& sim) const
|
||||||
|
{
|
||||||
|
std::istringstream rect(this->createG2(sim.getNoSpaceDim()));
|
||||||
|
SIMdependency::PatchVec result;
|
||||||
|
sim.readPatches(rect,result,"\t");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MultiPatchModelGenerator2D::createTopology (SIMbase& sim) const
|
||||||
|
{
|
||||||
|
auto&& IJ = [this](int i, int j) { return 1 + j*nx + i; };
|
||||||
|
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
for (int i = 0; i < nx-1; ++i)
|
||||||
|
if (!sim.addConnection(IJ(i,j), IJ(i+1,j), 2, 1, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int j = 0; j < ny-1; ++j)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (!sim.addConnection(IJ(i,j), IJ(i,j+1), 4, 3, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (periodic_x)
|
||||||
|
for (int i = 0; i < ny; ++i)
|
||||||
|
if (nx > 1) {
|
||||||
|
if (!sim.addConnection(IJ(0, i), IJ(nx-1, i), 1, 2, 0, false))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
IFEM::cout <<"\tPeriodic I-direction P"<< IJ(0,i) << std::endl;
|
||||||
|
ASMs2D* pch = dynamic_cast<ASMs2D*>(sim.getPatch(IJ(0,i), true));
|
||||||
|
if (pch)
|
||||||
|
pch->closeEdges(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (periodic_y)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (ny > 1)
|
||||||
|
if (!sim.addConnection(IJ(i,0), IJ(i,ny-1), 3, 4, 0, false))
|
||||||
|
return false;
|
||||||
|
else {
|
||||||
|
IFEM::cout <<"\tPeriodic J-direction P"<< IJ(i,0)<< std::endl;
|
||||||
|
ASMs2D* pch = dynamic_cast<ASMs2D*>(sim.getPatch(IJ(i,0), true));
|
||||||
|
if (pch)
|
||||||
|
pch->closeEdges(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TopologySet
|
||||||
|
MultiPatchModelGenerator2D::createTopologySets (const SIMbase& sim) const
|
||||||
|
{
|
||||||
|
if (!sets)
|
||||||
|
return TopologySet();
|
||||||
|
|
||||||
|
TopologySet result;
|
||||||
|
TopEntity& e1 = result["Edge1"];
|
||||||
|
TopEntity& e2 = result["Edge2"];
|
||||||
|
TopEntity& e3 = result["Edge3"];
|
||||||
|
TopEntity& e4 = result["Edge4"];
|
||||||
|
TopEntity& e5 = result["Boundary"];
|
||||||
|
|
||||||
|
auto&& insertion = [&sim, &e5](TopEntity& e, TopItem top)
|
||||||
|
{
|
||||||
|
if ((top.patch = sim.getLocalPatchIndex(top.patch)) > 0) {
|
||||||
|
e.insert(top);
|
||||||
|
e5.insert(top);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < ny; ++i) {
|
||||||
|
insertion(e1, TopItem(i*nx+1,1,1));
|
||||||
|
insertion(e2, TopItem((i+1)*nx,2,1));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < nx; ++i) {
|
||||||
|
insertion(e3, TopItem(i+1,3,1));
|
||||||
|
insertion(e4, TopItem(nx*(ny-1)+1+i,4,1));
|
||||||
|
}
|
||||||
|
|
||||||
|
TopEntity& c = result["Corners"];
|
||||||
|
auto&& insertionv = [&sim, &c](TopEntity& e, TopItem top)
|
||||||
|
{
|
||||||
|
if ((top.patch = sim.getLocalPatchIndex(top.patch)) > 0) {
|
||||||
|
e.insert(top);
|
||||||
|
c.insert(top);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
insertionv(result["Vertex1"], TopItem(1,1,0));
|
||||||
|
insertionv(result["Vertex2"], TopItem(nx,2,0));
|
||||||
|
insertionv(result["Vertex3"], TopItem(nx*(ny-1)+1,3,0));
|
||||||
|
insertionv(result["Vertex4"], TopItem(nx*ny,4,0));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MultiPatchModelGenerator3D::MultiPatchModelGenerator3D (const TiXmlElement* geo) :
|
||||||
|
ModelGenerator(geo)
|
||||||
|
{
|
||||||
|
nx = ny = nz = 1;
|
||||||
|
periodic_x = periodic_y = periodic_z = 0;
|
||||||
|
utl::getAttribute(geo,"nx",nx);
|
||||||
|
utl::getAttribute(geo,"ny",ny);
|
||||||
|
utl::getAttribute(geo,"nz",nz);
|
||||||
|
utl::getAttribute(geo,"periodic_x", periodic_x);
|
||||||
|
utl::getAttribute(geo,"periodic_y", periodic_y);
|
||||||
|
utl::getAttribute(geo,"periodic_z", periodic_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string MultiPatchModelGenerator3D::createG2 (int) const
|
||||||
|
{
|
||||||
|
bool rational = false;
|
||||||
|
utl::getAttribute(geo,"rational",rational);
|
||||||
|
if (rational)
|
||||||
|
IFEM::cout <<" Rational basis"<< std::endl;
|
||||||
|
|
||||||
|
double scale = 1.0;
|
||||||
|
if (utl::getAttribute(geo,"scale",scale))
|
||||||
|
IFEM::cout <<" Scale: "<< scale << std::endl;
|
||||||
|
|
||||||
|
double Lx = 1.0, Ly = 1.0, Lz = 1.0;
|
||||||
|
if (utl::getAttribute(geo,"Lx",Lx))
|
||||||
|
IFEM::cout <<" Length in X: "<< Lx << std::endl;
|
||||||
|
Lx *= scale;
|
||||||
|
if (utl::getAttribute(geo,"Ly",Ly))
|
||||||
|
IFEM::cout <<" Length in Y: "<< Ly << std::endl;
|
||||||
|
Ly *= scale;
|
||||||
|
if (utl::getAttribute(geo,"Lz",Lz))
|
||||||
|
IFEM::cout <<" Length in Z: "<< Lz << std::endl;
|
||||||
|
Lz *= scale;
|
||||||
|
|
||||||
|
int nx = 1;
|
||||||
|
int ny = 1;
|
||||||
|
int nz = 1;
|
||||||
|
if (utl::getAttribute(geo,"nx",nx))
|
||||||
|
IFEM::cout << " Split in X: " << nx << std::endl;
|
||||||
|
if (utl::getAttribute(geo,"ny",ny))
|
||||||
|
IFEM::cout << " Split in Y: " << ny << std::endl;
|
||||||
|
if (utl::getAttribute(geo,"nz",nz))
|
||||||
|
IFEM::cout << " Split in Z: " << nz << std::endl;
|
||||||
|
|
||||||
|
Lx /= nx;
|
||||||
|
Ly /= ny;
|
||||||
|
Lz /= nz;
|
||||||
|
|
||||||
|
std::string corner;
|
||||||
|
Vec3 X0;
|
||||||
|
if (utl::getAttribute(geo,"X0",corner)) {
|
||||||
|
std::stringstream str(corner);
|
||||||
|
str >> X0;
|
||||||
|
IFEM::cout <<" Corner: "<< X0 << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::array<double,24> nodes =
|
||||||
|
{{ 0.0, 0.0, 0.0,
|
||||||
|
1.0, 0.0, 0.0,
|
||||||
|
0.0, 1.0, 0.0,
|
||||||
|
1.0, 1.0, 0.0,
|
||||||
|
0.0, 0.0, 1.0,
|
||||||
|
1.0, 0.0, 1.0,
|
||||||
|
0.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0 }};
|
||||||
|
|
||||||
|
std::string g2;
|
||||||
|
for (int z = 0; z < nz; ++z) {
|
||||||
|
for (int y = 0; y < ny; ++y) {
|
||||||
|
for (int x = 0; x < nx; ++x) {
|
||||||
|
g2.append("700 1 0 0\n3 ");
|
||||||
|
g2.append(rational ? "1\n" : "0\n");
|
||||||
|
g2.append("2 2\n0 0 1 1\n"
|
||||||
|
"2 2\n0 0 1 1\n"
|
||||||
|
"2 2\n0 0 1 1\n");
|
||||||
|
|
||||||
|
for (size_t i = 0; i < nodes.size(); i += 3)
|
||||||
|
{
|
||||||
|
std::stringstream str;
|
||||||
|
std::array<int,3> N {x,y,z};
|
||||||
|
std::array<double,3> L {Lx,Ly,Lz};
|
||||||
|
for (size_t j = 0; j < 3; j++)
|
||||||
|
str << (j==0?"":" ") << X0[j]+N[j]*L[j]+nodes[i+j]*L[j];
|
||||||
|
g2.append(str.str());
|
||||||
|
g2.append(rational ? " 1.0\n" : "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return g2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SIMdependency::PatchVec
|
||||||
|
MultiPatchModelGenerator3D::createGeometry (const SIMbase& sim) const
|
||||||
|
{
|
||||||
|
std::istringstream hex(this->createG2(sim.getNoSpaceDim()));
|
||||||
|
SIMdependency::PatchVec result;
|
||||||
|
sim.readPatches(hex,result,"\t");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MultiPatchModelGenerator3D::createTopology (SIMbase& sim) const
|
||||||
|
{
|
||||||
|
auto&& IJK = [this](int i, int j, int k) { return 1 + (k*ny+j)*nx + i; };
|
||||||
|
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
for (int i = 0; i < nx-1; ++i)
|
||||||
|
if (!sim.addConnection(IJK(i,j,k), IJK(i+1,j,k), 2, 1, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int j = 0; j < ny-1; ++j)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (!sim.addConnection(IJK(i,j,k), IJK(i,j+1,k), 4, 3, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int k = 0; k < nz-1; ++k)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (!sim.addConnection(IJK(i,j,k), IJK(i,j,k+1), 6, 5, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (periodic_x)
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
if (nx > 1) {
|
||||||
|
if (!sim.addConnection(IJK(0,j,k), IJK(nx-1,j,k), 1, 2, 0, false))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
IFEM::cout <<"\tPeriodic I-direction P"<< IJK(0,j,k) << std::endl;
|
||||||
|
ASMs3D* pch = dynamic_cast<ASMs3D*>(sim.getPatch(IJK(0,j,k), true));
|
||||||
|
if (pch)
|
||||||
|
pch->closeFaces(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (periodic_y)
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (ny > 1) {
|
||||||
|
if (!sim.addConnection(IJK(i,0,k), IJK(i,ny-1,k), 3, 4, 0, false))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
IFEM::cout <<"\tPeriodic J-direction P"<< IJK(i,0,k) << std::endl;
|
||||||
|
ASMs3D* pch = dynamic_cast<ASMs3D*>(sim.getPatch(IJK(i,0,k), true));
|
||||||
|
if (pch)
|
||||||
|
pch->closeFaces(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (periodic_z)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
if (nz > 1) {
|
||||||
|
if (!sim.addConnection(IJK(i,j,0), IJK(i,j,nz-1), 5, 6, 0, false))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
IFEM::cout <<"\tPeriodic K-direction P"<< IJK(i,j,0) << std::endl;
|
||||||
|
ASMs3D* pch = dynamic_cast<ASMs3D*>(sim.getPatch(IJK(i,j,0), true));
|
||||||
|
if (pch)
|
||||||
|
pch->closeFaces(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TopologySet
|
||||||
|
MultiPatchModelGenerator3D::createTopologySets (const SIMbase& sim) const
|
||||||
|
{
|
||||||
|
if (!sets)
|
||||||
|
return TopologySet();
|
||||||
|
|
||||||
|
// 0-based -> 1-based IJK
|
||||||
|
auto&& IJK = [this](int i, int j, int k) { return 1 + (k*ny+j)*nx + i; };
|
||||||
|
|
||||||
|
// start/end IJK
|
||||||
|
auto&& IJK2 = [this,IJK](int i, int j, int k) { return IJK(i*(nx-1), j*(ny-1), k*(nz-1)); };
|
||||||
|
|
||||||
|
// start/end JK
|
||||||
|
auto&& IJKI = [this,IJK](int i, int j, int k) { return IJK(i, j*(ny-1), k*(nz-1)); };
|
||||||
|
// start/end IK
|
||||||
|
auto&& IJKJ = [this,IJK](int i, int j, int k) { return IJK(i*(nx-1), j, k*(nz-1)); };
|
||||||
|
// start/end IJ
|
||||||
|
auto&& IJKK = [this,IJK](int i, int j, int k) { return IJK(i*(nx-1), j*(ny-1), k); };
|
||||||
|
|
||||||
|
// start/end I
|
||||||
|
auto&& IJK2I = [this,IJK](int i, int j, int k) { return IJK(i*(nx-1), j, k); };
|
||||||
|
// start/end J
|
||||||
|
auto&& IJK2J = [this,IJK](int i, int j, int k) { return IJK(i, j*(ny-1), k); };
|
||||||
|
// start/end K
|
||||||
|
auto&& IJK2K = [this,IJK](int i, int j, int k) { return IJK(i, j, k*(nz-1)); };
|
||||||
|
|
||||||
|
TopologySet result;
|
||||||
|
|
||||||
|
// insertion lambda
|
||||||
|
auto&& insertion = [&sim,&result](TopItem top,
|
||||||
|
const std::string& glob,
|
||||||
|
const std::string& type)
|
||||||
|
{
|
||||||
|
std::stringstream str;
|
||||||
|
str << type << top.item;
|
||||||
|
TopEntity& topI = result[str.str()];
|
||||||
|
TopEntity& globI = result[glob];
|
||||||
|
if ((top.patch = sim.getLocalPatchIndex(top.patch)) > 0) {
|
||||||
|
topI.insert(top);
|
||||||
|
globI.insert(top);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t r = 1;
|
||||||
|
for (int i = 0; i < 2; ++i, ++r)
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
insertion(TopItem(IJK2I(i,j,k),r,2), "Boundary", "Face");
|
||||||
|
|
||||||
|
for (int j = 0; j < 2; ++j, ++r)
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
insertion(TopItem(IJK2J(i,j,k),r,2), "Boundary", "Face");
|
||||||
|
|
||||||
|
for (int k = 0; k < 2; ++k, ++r)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
insertion(TopItem(IJK2K(i,j,k),r,2), "Boundary", "Face");
|
||||||
|
|
||||||
|
r = 1;
|
||||||
|
for (int k = 0; k < 2; ++k)
|
||||||
|
for (int j = 0; j < 2; ++j)
|
||||||
|
for (int i = 0; i < 2; ++i, ++r)
|
||||||
|
insertion(TopItem(IJK2(i,j,k),r,0), "Corners", "Vertex");
|
||||||
|
|
||||||
|
r = 1;
|
||||||
|
for (int k = 0; k < 2; ++k)
|
||||||
|
for (int i = 0; i < 2; ++i, ++r)
|
||||||
|
for (int j = 0; j < ny; ++j)
|
||||||
|
insertion(TopItem(IJKJ(i,j,k),r,1), "Frame", "Edge");
|
||||||
|
|
||||||
|
for (int j = 0; j < 2; ++j)
|
||||||
|
for (int i = 0; i < 2; ++i, ++r)
|
||||||
|
for (int k = 0; k < nz; ++k)
|
||||||
|
insertion(TopItem(IJKK(i,j,k),r,1), "Frame", "Edge");
|
||||||
|
|
||||||
|
for (int k = 0; k < 2; ++k)
|
||||||
|
for (int j = 0; j < 2; ++j, ++r)
|
||||||
|
for (int i = 0; i < nx; ++i)
|
||||||
|
insertion(TopItem(IJKI(i,j,k),r,1), "Frame", "Edge");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
100
Apps/Common/MultiPatchModelGenerator.h
Normal file
100
Apps/Common/MultiPatchModelGenerator.h
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
// $Id$
|
||||||
|
//==============================================================================
|
||||||
|
//!
|
||||||
|
//! \file MultiPatchModelGenerator.h
|
||||||
|
//!
|
||||||
|
//! \date Sep 2 2016
|
||||||
|
//!
|
||||||
|
//! \author Arne Morten Kvarving / SINTEF
|
||||||
|
//!
|
||||||
|
//! \brief Multi-patch model generators for NURBS-based FEM simulators.
|
||||||
|
//!
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef _MULTIPATCH_MODEL_GENERATOR_H
|
||||||
|
#define _MULTIPATCH_MODEL_GENERATOR_H
|
||||||
|
|
||||||
|
#include "ModelGenerator.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief 2D multi-patch model generator for FEM simulators.
|
||||||
|
\details Generate a rectangle split in a given number of blocks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MultiPatchModelGenerator2D : public ModelGenerator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! \brief Constructor initializes common members.
|
||||||
|
//!\ param[in] elem XML element to parse
|
||||||
|
MultiPatchModelGenerator2D(const TiXmlElement* elem);
|
||||||
|
|
||||||
|
//! \brief Empty destructor.
|
||||||
|
virtual ~MultiPatchModelGenerator2D() {}
|
||||||
|
|
||||||
|
//! \brief Creates a geometry.
|
||||||
|
//! \param[in] sim SIM with patch read function to use
|
||||||
|
SIMdependency::PatchVec createGeometry(const SIMbase& sim) const override;
|
||||||
|
|
||||||
|
//! \brief Creates topology for geometry.
|
||||||
|
//! \param sim Simulator to apply topology to
|
||||||
|
bool createTopology(SIMbase& sim) const override;
|
||||||
|
|
||||||
|
//! \brief Creates topology sets for geometry.
|
||||||
|
TopologySet createTopologySets(const SIMbase& sim) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! \brief Generates the G2 description of the geometry.
|
||||||
|
//! \param nsd Number of spatial dimension
|
||||||
|
std::string createG2 (int nsd = 2) const;
|
||||||
|
|
||||||
|
int nx; //!< Number of blocks in x
|
||||||
|
int ny; //!< Number of blocks in y
|
||||||
|
int periodic_x; //!< If non-zero, make model periodic in x for given bases
|
||||||
|
int periodic_y; //!< If non-zero, make model periodic in y for given bases
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief 3D multi-patch model generator for FEM simulators.
|
||||||
|
\details Generates a hexahedra split in a given number of blocks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MultiPatchModelGenerator3D : public ModelGenerator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! \brief Constructor initializes common members.
|
||||||
|
//! \param[in] elem XML element to parse
|
||||||
|
MultiPatchModelGenerator3D(const TiXmlElement* geo);
|
||||||
|
|
||||||
|
//! \brief Empty destructor.
|
||||||
|
virtual ~MultiPatchModelGenerator3D() {}
|
||||||
|
|
||||||
|
//! \brief Creates a geometry.
|
||||||
|
//! \param[in] sim SIM with patch read function to use
|
||||||
|
SIMdependency::PatchVec createGeometry(const SIMbase& sim) const override;
|
||||||
|
|
||||||
|
//! \brief Creates topology for geometry.
|
||||||
|
//! \param[in] geo XML element containing geometry defintion
|
||||||
|
//! \param sim Simulator to apply topology to
|
||||||
|
bool createTopology(SIMbase& sim) const override;
|
||||||
|
|
||||||
|
//! \brief Creates topology sets for geometry.
|
||||||
|
//! \param[in] SIM Simulator with patch ownerships
|
||||||
|
virtual TopologySet createTopologySets(const SIMbase& sim) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! \brief Generates the G2 description of the geometry.
|
||||||
|
//! \param nsd Number of spatial dimension
|
||||||
|
std::string createG2 (int nsd = 3) const;
|
||||||
|
|
||||||
|
int nx; //!< Number of blocks in x
|
||||||
|
int ny; //!< Number of blocks in y
|
||||||
|
int nz; //!< Number of blocks in z
|
||||||
|
int periodic_x; //!< If non-zero, make model periodic in x for given bases
|
||||||
|
int periodic_y; //!< If non-zero, make model periodic in y for given bases
|
||||||
|
int periodic_z; //!< If non-zero, make model periodic in z for given bases
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
882
Apps/Common/Test/TestMultiPatchModelGenerator.C
Normal file
882
Apps/Common/Test/TestMultiPatchModelGenerator.C
Normal file
@ -0,0 +1,882 @@
|
|||||||
|
//==============================================================================
|
||||||
|
//!
|
||||||
|
//! \file TestMultiPatchModelGenerator.C
|
||||||
|
//!
|
||||||
|
//! \date Sep 2 2016
|
||||||
|
//!
|
||||||
|
//! \author Arne Morten Kvarving / SINTEF
|
||||||
|
//!
|
||||||
|
//! \brief Tests for multi-patch model generators.
|
||||||
|
//!
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "IFEM.h"
|
||||||
|
#include "MultiPatchModelGenerator.h"
|
||||||
|
#include "SIM2D.h"
|
||||||
|
#include "SIM3D.h"
|
||||||
|
#include "TopologySet.h"
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "tinyxml.h"
|
||||||
|
|
||||||
|
|
||||||
|
template<class Generator>
|
||||||
|
class TestModelGeneratorWrapper : public Generator {
|
||||||
|
public:
|
||||||
|
TestModelGeneratorWrapper(const TiXmlElement* geo) : Generator(geo) {}
|
||||||
|
std::string createG2(int nsd)
|
||||||
|
{
|
||||||
|
return Generator::createG2(nsd);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GeomTest {
|
||||||
|
std::string xml;
|
||||||
|
int dim;
|
||||||
|
std::string g2;
|
||||||
|
std::string sets;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TestMultiPatchModelGenerator1D :
|
||||||
|
public testing::Test,
|
||||||
|
public testing::WithParamInterface<GeomTest>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TestMultiPatchModelGenerator2D :
|
||||||
|
public testing::Test,
|
||||||
|
public testing::WithParamInterface<GeomTest>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TestMultiPatchModelGenerator3D :
|
||||||
|
public testing::Test,
|
||||||
|
public testing::WithParamInterface<GeomTest>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
auto&& DoTest = [](const GeomTest& ref, const std::string& gen,
|
||||||
|
const TopologySet& sets)
|
||||||
|
{
|
||||||
|
ASSERT_STREQ(gen.c_str(), ref.g2.c_str());
|
||||||
|
|
||||||
|
if (!ref.sets.empty()) {
|
||||||
|
std::string gsets;
|
||||||
|
for (auto& it : sets) {
|
||||||
|
gsets += it.first + ": ";
|
||||||
|
for (auto& it2 : it.second) {
|
||||||
|
std::stringstream str;
|
||||||
|
str << it2.patch << " " << it2.item << " " << it2.idim << " ";
|
||||||
|
gsets += str.str();
|
||||||
|
}
|
||||||
|
gsets += "\n";
|
||||||
|
}
|
||||||
|
ASSERT_STREQ(gsets.c_str(), ref.sets.c_str());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST_P(TestMultiPatchModelGenerator2D, Generate)
|
||||||
|
{
|
||||||
|
TiXmlDocument doc;
|
||||||
|
doc.Parse(GetParam().xml.c_str());
|
||||||
|
TestModelGeneratorWrapper<MultiPatchModelGenerator2D> gen(doc.RootElement());
|
||||||
|
std::string g2 = gen.createG2(GetParam().dim);
|
||||||
|
SIM2D sim;
|
||||||
|
TopologySet sets = gen.createTopologySets(sim);
|
||||||
|
DoTest(GetParam(), g2, sets);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_P(TestMultiPatchModelGenerator3D, Generate)
|
||||||
|
{
|
||||||
|
TiXmlDocument doc;
|
||||||
|
doc.Parse(GetParam().xml.c_str());
|
||||||
|
TestModelGeneratorWrapper<MultiPatchModelGenerator3D> gen(doc.RootElement());
|
||||||
|
std::string g2 = gen.createG2(GetParam().dim);
|
||||||
|
SIM3D sim;
|
||||||
|
TopologySet sets = gen.createTopologySets(sim);
|
||||||
|
DoTest(GetParam(), g2, sets);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::vector<GeomTest> geometry2D =
|
||||||
|
{{"<geometry sets=\"true\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"1 0\n"
|
||||||
|
"0 1\n"
|
||||||
|
"1 1\n",
|
||||||
|
"Boundary: 1 1 1 1 2 1 1 3 1 1 4 1 \n"
|
||||||
|
"Corners: 1 1 0 1 2 0 1 3 0 1 4 0 \n"
|
||||||
|
"Edge1: 1 1 1 \n"
|
||||||
|
"Edge2: 1 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 \n"
|
||||||
|
"Edge4: 1 4 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 1 2 0 \n"
|
||||||
|
"Vertex3: 1 3 0 \n"
|
||||||
|
"Vertex4: 1 4 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry rational=\"1\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 1.0\n"
|
||||||
|
"1 0 1.0\n"
|
||||||
|
"0 1 1.0\n"
|
||||||
|
"1 1 1.0\n", ""},
|
||||||
|
|
||||||
|
{"<geometry scale=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"0 2\n"
|
||||||
|
"2 2\n", ""},
|
||||||
|
|
||||||
|
{"<geometry X0=\"2 0\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 1\n"
|
||||||
|
"3 1\n"},
|
||||||
|
|
||||||
|
{"<geometry X0=\"0 2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 2\n"
|
||||||
|
"1 2\n"
|
||||||
|
"0 3\n"
|
||||||
|
"1 3\n", ""},
|
||||||
|
|
||||||
|
{"<geometry Lx=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"0 1\n"
|
||||||
|
"2 1\n", ""},
|
||||||
|
|
||||||
|
{"<geometry Ly=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"1 0\n"
|
||||||
|
"0 2\n"
|
||||||
|
"1 2\n", ""},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" nx=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"0.5 0\n"
|
||||||
|
"0 1\n"
|
||||||
|
"0.5 1\n"
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0\n"
|
||||||
|
"1 0\n"
|
||||||
|
"0.5 1\n"
|
||||||
|
"1 1\n",
|
||||||
|
"Boundary: 1 1 1 1 3 1 1 4 1 2 2 1 2 3 1 2 4 1 \n"
|
||||||
|
"Corners: 1 1 0 1 3 0 2 2 0 2 4 0 \n"
|
||||||
|
"Edge1: 1 1 1 \n"
|
||||||
|
"Edge2: 2 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 2 3 1 \n"
|
||||||
|
"Edge4: 1 4 1 2 4 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 2 2 0 \n"
|
||||||
|
"Vertex3: 1 3 0 \n"
|
||||||
|
"Vertex4: 2 4 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" ny=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"1 0\n"
|
||||||
|
"0 0.5\n"
|
||||||
|
"1 0.5\n"
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0.5\n"
|
||||||
|
"1 0.5\n"
|
||||||
|
"0 1\n"
|
||||||
|
"1 1\n",
|
||||||
|
"Boundary: 1 1 1 1 2 1 1 3 1 2 1 1 2 2 1 2 4 1 \n"
|
||||||
|
"Corners: 1 1 0 1 2 0 2 3 0 2 4 0 \n"
|
||||||
|
"Edge1: 1 1 1 2 1 1 \n"
|
||||||
|
"Edge2: 1 2 1 2 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 \n"
|
||||||
|
"Edge4: 2 4 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 1 2 0 \n"
|
||||||
|
"Vertex3: 2 3 0 \n"
|
||||||
|
"Vertex4: 2 4 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" nx=\"2\" ny=\"2\"/>", 2,
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0\n"
|
||||||
|
"0.5 0\n"
|
||||||
|
"0 0.5\n"
|
||||||
|
"0.5 0.5\n"
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0\n"
|
||||||
|
"1 0\n"
|
||||||
|
"0.5 0.5\n"
|
||||||
|
"1 0.5\n"
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0.5\n"
|
||||||
|
"0.5 0.5\n"
|
||||||
|
"0 1\n"
|
||||||
|
"0.5 1\n"
|
||||||
|
"200 1 0 0\n"
|
||||||
|
"2 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0.5\n"
|
||||||
|
"1 0.5\n"
|
||||||
|
"0.5 1\n"
|
||||||
|
"1 1\n",
|
||||||
|
"Boundary: 1 1 1 1 3 1 2 2 1 2 3 1 3 1 1 3 4 1 4 2 1 4 4 1 \n"
|
||||||
|
"Corners: 1 1 0 2 2 0 3 3 0 4 4 0 \n"
|
||||||
|
"Edge1: 1 1 1 3 1 1 \n"
|
||||||
|
"Edge2: 2 2 1 4 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 2 3 1 \n"
|
||||||
|
"Edge4: 3 4 1 4 4 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 2 2 0 \n"
|
||||||
|
"Vertex3: 3 3 0 \n"
|
||||||
|
"Vertex4: 4 4 0 \n"}};
|
||||||
|
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(TestMultiPatchModelGenerator2D,
|
||||||
|
TestMultiPatchModelGenerator2D,
|
||||||
|
testing::ValuesIn(geometry2D));
|
||||||
|
|
||||||
|
|
||||||
|
const std::vector<GeomTest> geometry3D =
|
||||||
|
{{"<geometry sets=\"true\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"1 1 1\n",
|
||||||
|
"Boundary: 1 1 2 1 2 2 1 3 2 1 4 2 1 5 2 1 6 2 \n"
|
||||||
|
"Corners: 1 1 0 1 2 0 1 3 0 1 4 0 1 5 0 1 6 0 1 7 0 1 8 0 \n"
|
||||||
|
"Edge1: 1 1 1 \n"
|
||||||
|
"Edge10: 1 10 1 \n"
|
||||||
|
"Edge11: 1 11 1 \n"
|
||||||
|
"Edge12: 1 12 1 \n"
|
||||||
|
"Edge2: 1 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 \n"
|
||||||
|
"Edge4: 1 4 1 \n"
|
||||||
|
"Edge5: 1 5 1 \n"
|
||||||
|
"Edge6: 1 6 1 \n"
|
||||||
|
"Edge7: 1 7 1 \n"
|
||||||
|
"Edge8: 1 8 1 \n"
|
||||||
|
"Edge9: 1 9 1 \n"
|
||||||
|
"Face1: 1 1 2 \n"
|
||||||
|
"Face2: 1 2 2 \n"
|
||||||
|
"Face3: 1 3 2 \n"
|
||||||
|
"Face4: 1 4 2 \n"
|
||||||
|
"Face5: 1 5 2 \n"
|
||||||
|
"Face6: 1 6 2 \n"
|
||||||
|
"Frame: 1 1 1 1 2 1 1 3 1 1 4 1 1 5 1 1 6 1 1 7 1 1 8 1 1 9 1 1 10 1 1 11 1 1 12 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 1 2 0 \n"
|
||||||
|
"Vertex3: 1 3 0 \n"
|
||||||
|
"Vertex4: 1 4 0 \n"
|
||||||
|
"Vertex5: 1 5 0 \n"
|
||||||
|
"Vertex6: 1 6 0 \n"
|
||||||
|
"Vertex7: 1 7 0 \n"
|
||||||
|
"Vertex8: 1 8 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry rational=\"1\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0 1.0\n"
|
||||||
|
"1 0 0 1.0\n"
|
||||||
|
"0 1 0 1.0\n"
|
||||||
|
"1 1 0 1.0\n"
|
||||||
|
"0 0 1 1.0\n"
|
||||||
|
"1 0 1 1.0\n"
|
||||||
|
"0 1 1 1.0\n"
|
||||||
|
"1 1 1 1.0\n", ""},
|
||||||
|
|
||||||
|
{"<geometry scale=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"2 0 0\n"
|
||||||
|
"0 2 0\n"
|
||||||
|
"2 2 0\n"
|
||||||
|
"0 0 2\n"
|
||||||
|
"2 0 2\n"
|
||||||
|
"0 2 2\n"
|
||||||
|
"2 2 2\n", ""},
|
||||||
|
|
||||||
|
{"<geometry X0=\"2 0 0\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 0 0\n"
|
||||||
|
"3 0 0\n"
|
||||||
|
"2 1 0\n"
|
||||||
|
"3 1 0\n"
|
||||||
|
"2 0 1\n"
|
||||||
|
"3 0 1\n"
|
||||||
|
"2 1 1\n"
|
||||||
|
"3 1 1\n", ""},
|
||||||
|
|
||||||
|
{"<geometry X0=\"0 2 0\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 2 0\n"
|
||||||
|
"1 2 0\n"
|
||||||
|
"0 3 0\n"
|
||||||
|
"1 3 0\n"
|
||||||
|
"0 2 1\n"
|
||||||
|
"1 2 1\n"
|
||||||
|
"0 3 1\n"
|
||||||
|
"1 3 1\n", ""},
|
||||||
|
|
||||||
|
{"<geometry X0=\"0 0 2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 2\n"
|
||||||
|
"1 0 2\n"
|
||||||
|
"0 1 2\n"
|
||||||
|
"1 1 2\n"
|
||||||
|
"0 0 3\n"
|
||||||
|
"1 0 3\n"
|
||||||
|
"0 1 3\n"
|
||||||
|
"1 1 3\n", ""},
|
||||||
|
|
||||||
|
{"<geometry Lx=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"2 0 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"2 1 0\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"2 0 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"2 1 1\n", ""},
|
||||||
|
|
||||||
|
{"<geometry Ly=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0 2 0\n"
|
||||||
|
"1 2 0\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0 2 1\n"
|
||||||
|
"1 2 1\n", ""},
|
||||||
|
|
||||||
|
{"<geometry Lz=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0 0 2\n"
|
||||||
|
"1 0 2\n"
|
||||||
|
"0 1 2\n"
|
||||||
|
"1 1 2\n", ""},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" nx=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"0.5 0 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"0.5 1 0\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"0.5 0 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"0.5 1 1\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0.5 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0.5 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0.5 1 1\n"
|
||||||
|
"1 1 1\n",
|
||||||
|
"Boundary: 1 1 2 1 3 2 1 4 2 1 5 2 1 6 2 2 2 2 2 3 2 2 4 2 2 5 2 2 6 2 \n"
|
||||||
|
"Corners: 1 1 0 1 3 0 1 5 0 1 7 0 2 2 0 2 4 0 2 6 0 2 8 0 \n"
|
||||||
|
"Edge1: 1 1 1 \n"
|
||||||
|
"Edge10: 1 10 1 2 10 1 \n"
|
||||||
|
"Edge11: 1 11 1 2 11 1 \n"
|
||||||
|
"Edge12: 1 12 1 2 12 1 \n"
|
||||||
|
"Edge2: 2 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 \n"
|
||||||
|
"Edge4: 2 4 1 \n"
|
||||||
|
"Edge5: 1 5 1 \n"
|
||||||
|
"Edge6: 2 6 1 \n"
|
||||||
|
"Edge7: 1 7 1 \n"
|
||||||
|
"Edge8: 2 8 1 \n"
|
||||||
|
"Edge9: 1 9 1 2 9 1 \n"
|
||||||
|
"Face1: 1 1 2 \n"
|
||||||
|
"Face2: 2 2 2 \n"
|
||||||
|
"Face3: 1 3 2 2 3 2 \n"
|
||||||
|
"Face4: 1 4 2 2 4 2 \n"
|
||||||
|
"Face5: 1 5 2 2 5 2 \n"
|
||||||
|
"Face6: 1 6 2 2 6 2 \n"
|
||||||
|
"Frame: 1 1 1 1 3 1 1 5 1 1 7 1 1 9 1 1 10 1 1 11 1 1 12 1 2 2 1 2 4 1 2 6 1 2 8 1 2 9 1 2 10 1 2 11 1 2 12 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 2 2 0 \n"
|
||||||
|
"Vertex3: 1 3 0 \n"
|
||||||
|
"Vertex4: 2 4 0 \n"
|
||||||
|
"Vertex5: 1 5 0 \n"
|
||||||
|
"Vertex6: 2 6 0 \n"
|
||||||
|
"Vertex7: 1 7 0 \n"
|
||||||
|
"Vertex8: 2 8 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" ny=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0 0.5 0\n"
|
||||||
|
"1 0.5 0\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0 0.5 1\n"
|
||||||
|
"1 0.5 1\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0.5 0\n"
|
||||||
|
"1 0.5 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0 0.5 1\n"
|
||||||
|
"1 0.5 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"1 1 1\n",
|
||||||
|
"Boundary: 1 1 2 1 2 2 1 3 2 1 5 2 1 6 2 2 1 2 2 2 2 2 4 2 2 5 2 2 6 2 \n"
|
||||||
|
"Corners: 1 1 0 1 2 0 1 5 0 1 6 0 2 3 0 2 4 0 2 7 0 2 8 0 \n"
|
||||||
|
"Edge1: 1 1 1 2 1 1 \n"
|
||||||
|
"Edge10: 2 10 1 \n"
|
||||||
|
"Edge11: 1 11 1 \n"
|
||||||
|
"Edge12: 2 12 1 \n"
|
||||||
|
"Edge2: 1 2 1 2 2 1 \n"
|
||||||
|
"Edge3: 1 3 1 2 3 1 \n"
|
||||||
|
"Edge4: 1 4 1 2 4 1 \n"
|
||||||
|
"Edge5: 1 5 1 \n"
|
||||||
|
"Edge6: 1 6 1 \n"
|
||||||
|
"Edge7: 2 7 1 \n"
|
||||||
|
"Edge8: 2 8 1 \n"
|
||||||
|
"Edge9: 1 9 1 \n"
|
||||||
|
"Face1: 1 1 2 2 1 2 \n"
|
||||||
|
"Face2: 1 2 2 2 2 2 \n"
|
||||||
|
"Face3: 1 3 2 \n"
|
||||||
|
"Face4: 2 4 2 \n"
|
||||||
|
"Face5: 1 5 2 2 5 2 \n"
|
||||||
|
"Face6: 1 6 2 2 6 2 \n"
|
||||||
|
"Frame: 1 1 1 1 2 1 1 3 1 1 4 1 1 5 1 1 6 1 1 9 1 1 11 1 2 1 1 2 2 1 2 3 1 2 4 1 2 7 1 2 8 1 2 10 1 2 12 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 1 2 0 \n"
|
||||||
|
"Vertex3: 2 3 0 \n"
|
||||||
|
"Vertex4: 2 4 0 \n"
|
||||||
|
"Vertex5: 1 5 0 \n"
|
||||||
|
"Vertex6: 1 6 0 \n"
|
||||||
|
"Vertex7: 2 7 0 \n"
|
||||||
|
"Vertex8: 2 8 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" nz=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0 0 0.5\n"
|
||||||
|
"1 0 0.5\n"
|
||||||
|
"0 1 0.5\n"
|
||||||
|
"1 1 0.5\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0.5\n"
|
||||||
|
"1 0 0.5\n"
|
||||||
|
"0 1 0.5\n"
|
||||||
|
"1 1 0.5\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"1 1 1\n",
|
||||||
|
"Boundary: 1 1 2 1 2 2 1 3 2 1 4 2 1 5 2 2 1 2 2 2 2 2 3 2 2 4 2 2 6 2 \n"
|
||||||
|
"Corners: 1 1 0 1 2 0 1 3 0 1 4 0 2 5 0 2 6 0 2 7 0 2 8 0 \n"
|
||||||
|
"Edge1: 1 1 1 \n"
|
||||||
|
"Edge10: 1 10 1 \n"
|
||||||
|
"Edge11: 2 11 1 \n"
|
||||||
|
"Edge12: 2 12 1 \n"
|
||||||
|
"Edge2: 1 2 1 \n"
|
||||||
|
"Edge3: 2 3 1 \n"
|
||||||
|
"Edge4: 2 4 1 \n"
|
||||||
|
"Edge5: 1 5 1 2 5 1 \n"
|
||||||
|
"Edge6: 1 6 1 2 6 1 \n"
|
||||||
|
"Edge7: 1 7 1 2 7 1 \n"
|
||||||
|
"Edge8: 1 8 1 2 8 1 \n"
|
||||||
|
"Edge9: 1 9 1 \n"
|
||||||
|
"Face1: 1 1 2 2 1 2 \n"
|
||||||
|
"Face2: 1 2 2 2 2 2 \n"
|
||||||
|
"Face3: 1 3 2 2 3 2 \n"
|
||||||
|
"Face4: 1 4 2 2 4 2 \n"
|
||||||
|
"Face5: 1 5 2 \n"
|
||||||
|
"Face6: 2 6 2 \n"
|
||||||
|
"Frame: 1 1 1 1 2 1 1 5 1 1 6 1 1 7 1 1 8 1 1 9 1 1 10 1 2 3 1 2 4 1 2 5 1 2 6 1 2 7 1 2 8 1 2 11 1 2 12 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 1 2 0 \n"
|
||||||
|
"Vertex3: 1 3 0 \n"
|
||||||
|
"Vertex4: 1 4 0 \n"
|
||||||
|
"Vertex5: 2 5 0 \n"
|
||||||
|
"Vertex6: 2 6 0 \n"
|
||||||
|
"Vertex7: 2 7 0 \n"
|
||||||
|
"Vertex8: 2 8 0 \n"},
|
||||||
|
|
||||||
|
{"<geometry sets=\"true\" nx=\"2\" ny=\"2\" nz=\"2\"/>", 3,
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0\n"
|
||||||
|
"0.5 0 0\n"
|
||||||
|
"0 0.5 0\n"
|
||||||
|
"0.5 0.5 0\n"
|
||||||
|
"0 0 0.5\n"
|
||||||
|
"0.5 0 0.5\n"
|
||||||
|
"0 0.5 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0 0\n"
|
||||||
|
"1 0 0\n"
|
||||||
|
"0.5 0.5 0\n"
|
||||||
|
"1 0.5 0\n"
|
||||||
|
"0.5 0 0.5\n"
|
||||||
|
"1 0 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"1 0.5 0.5\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0.5 0\n"
|
||||||
|
"0.5 0.5 0\n"
|
||||||
|
"0 1 0\n"
|
||||||
|
"0.5 1 0\n"
|
||||||
|
"0 0.5 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"0 1 0.5\n"
|
||||||
|
"0.5 1 0.5\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0.5 0\n"
|
||||||
|
"1 0.5 0\n"
|
||||||
|
"0.5 1 0\n"
|
||||||
|
"1 1 0\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"1 0.5 0.5\n"
|
||||||
|
"0.5 1 0.5\n"
|
||||||
|
"1 1 0.5\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0 0.5\n"
|
||||||
|
"0.5 0 0.5\n"
|
||||||
|
"0 0.5 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"0 0 1\n"
|
||||||
|
"0.5 0 1\n"
|
||||||
|
"0 0.5 1\n"
|
||||||
|
"0.5 0.5 1\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0 0.5\n"
|
||||||
|
"1 0 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"1 0.5 0.5\n"
|
||||||
|
"0.5 0 1\n"
|
||||||
|
"1 0 1\n"
|
||||||
|
"0.5 0.5 1\n"
|
||||||
|
"1 0.5 1\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0 0.5 0.5\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"0 1 0.5\n"
|
||||||
|
"0.5 1 0.5\n"
|
||||||
|
"0 0.5 1\n"
|
||||||
|
"0.5 0.5 1\n"
|
||||||
|
"0 1 1\n"
|
||||||
|
"0.5 1 1\n"
|
||||||
|
"700 1 0 0\n"
|
||||||
|
"3 0\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"2 2\n"
|
||||||
|
"0 0 1 1\n"
|
||||||
|
"0.5 0.5 0.5\n"
|
||||||
|
"1 0.5 0.5\n"
|
||||||
|
"0.5 1 0.5\n"
|
||||||
|
"1 1 0.5\n"
|
||||||
|
"0.5 0.5 1\n"
|
||||||
|
"1 0.5 1\n"
|
||||||
|
"0.5 1 1\n"
|
||||||
|
"1 1 1\n",
|
||||||
|
"Boundary: 1 1 2 1 3 2 1 5 2 "
|
||||||
|
"2 2 2 2 3 2 2 5 2 "
|
||||||
|
"3 1 2 3 4 2 3 5 2 "
|
||||||
|
"4 2 2 4 4 2 4 5 2 "
|
||||||
|
"5 1 2 5 3 2 5 6 2 "
|
||||||
|
"6 2 2 6 3 2 6 6 2 "
|
||||||
|
"7 1 2 7 4 2 7 6 2 "
|
||||||
|
"8 2 2 8 4 2 8 6 2 \n"
|
||||||
|
"Corners: 1 1 0 2 2 0 3 3 0 4 4 0 5 5 0 6 6 0 7 7 0 8 8 0 \n"
|
||||||
|
"Edge1: 1 1 1 3 1 1 \n"
|
||||||
|
"Edge10: 3 10 1 4 10 1 \n"
|
||||||
|
"Edge11: 5 11 1 6 11 1 \n"
|
||||||
|
"Edge12: 7 12 1 8 12 1 \n"
|
||||||
|
"Edge2: 2 2 1 4 2 1 \n"
|
||||||
|
"Edge3: 5 3 1 7 3 1 \n"
|
||||||
|
"Edge4: 6 4 1 8 4 1 \n"
|
||||||
|
"Edge5: 1 5 1 5 5 1 \n"
|
||||||
|
"Edge6: 2 6 1 6 6 1 \n"
|
||||||
|
"Edge7: 3 7 1 7 7 1 \n"
|
||||||
|
"Edge8: 4 8 1 8 8 1 \n"
|
||||||
|
"Edge9: 1 9 1 2 9 1 \n"
|
||||||
|
"Face1: 1 1 2 3 1 2 5 1 2 7 1 2 \n"
|
||||||
|
"Face2: 2 2 2 4 2 2 6 2 2 8 2 2 \n"
|
||||||
|
"Face3: 1 3 2 2 3 2 5 3 2 6 3 2 \n"
|
||||||
|
"Face4: 3 4 2 4 4 2 7 4 2 8 4 2 \n"
|
||||||
|
"Face5: 1 5 2 2 5 2 3 5 2 4 5 2 \n"
|
||||||
|
"Face6: 5 6 2 6 6 2 7 6 2 8 6 2 \n"
|
||||||
|
"Frame: 1 1 1 1 5 1 1 9 1 "
|
||||||
|
"2 2 1 2 6 1 2 9 1 "
|
||||||
|
"3 1 1 3 7 1 3 10 1 "
|
||||||
|
"4 2 1 4 8 1 4 10 1 "
|
||||||
|
"5 3 1 5 5 1 5 11 1 "
|
||||||
|
"6 4 1 6 6 1 6 11 1 "
|
||||||
|
"7 3 1 7 7 1 7 12 1 "
|
||||||
|
"8 4 1 8 8 1 8 12 1 \n"
|
||||||
|
"Vertex1: 1 1 0 \n"
|
||||||
|
"Vertex2: 2 2 0 \n"
|
||||||
|
"Vertex3: 3 3 0 \n"
|
||||||
|
"Vertex4: 4 4 0 \n"
|
||||||
|
"Vertex5: 5 5 0 \n"
|
||||||
|
"Vertex6: 6 6 0 \n"
|
||||||
|
"Vertex7: 7 7 0 \n"
|
||||||
|
"Vertex8: 8 8 0 \n"}};
|
||||||
|
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(TestMultiPatchModelGenerator3D,
|
||||||
|
TestMultiPatchModelGenerator3D,
|
||||||
|
testing::ValuesIn(geometry3D));
|
Loading…
Reference in New Issue
Block a user