Changed: Use createFEMmodel instead of preprocess when testing FE topology.

Added: Some static helper functions for doing identical tasks in the test.
This commit is contained in:
Knut Morten Okstad 2016-12-08 11:17:19 +01:00
parent e0bfbe7247
commit 161aceaac2
3 changed files with 54 additions and 93 deletions

View File

@ -11,13 +11,13 @@
//============================================================================== //==============================================================================
#include "ASMu2D.h" #include "ASMu2D.h"
#include "IFEM.h"
#include "SIM2D.h" #include "SIM2D.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
struct EdgeTest { struct EdgeTest
{
int edge; int edge;
int edgeIdx; int edgeIdx;
std::array<int,2> c1; std::array<int,2> c1;
@ -31,16 +31,29 @@ class TestASMu2D : public testing::Test,
}; };
TEST(TestASMu2D, BoundaryNodesE1) static void getBoundaryNodes (const char* edgeName, std::vector<int>& nodes)
{ {
SIM2D sim(1); SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline; sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp")); ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp"));
sim.preprocess(); ASSERT_TRUE(sim.createFEMmodel());
sim.getBoundaryNodes(sim.getUniquePropertyCode(edgeName,0),nodes);
}
int bcode = sim.getUniquePropertyCode("Edge1",0);
static ASMu2D* getPatch (SIMinput& sim)
{
sim.opt.discretization = ASM::LRSpline;
EXPECT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp"));
EXPECT_TRUE(sim.createFEMmodel());
return static_cast<ASMu2D*>(sim.getPatch(1));
}
TEST(TestASMu2D, BoundaryNodesE1)
{
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Edge1",vec);
ASSERT_EQ(vec.size(), 4U); ASSERT_EQ(vec.size(), 4U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
ASSERT_EQ(vec[i], 4*i+1); ASSERT_EQ(vec[i], 4*i+1);
@ -49,14 +62,8 @@ TEST(TestASMu2D, BoundaryNodesE1)
TEST(TestASMu2D, BoundaryNodesE2) TEST(TestASMu2D, BoundaryNodesE2)
{ {
SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Edge2",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Edge2",vec);
ASSERT_EQ(vec.size(), 4U); ASSERT_EQ(vec.size(), 4U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
ASSERT_EQ(vec[i], 2+4*i); ASSERT_EQ(vec[i], 2+4*i);
@ -65,14 +72,8 @@ TEST(TestASMu2D, BoundaryNodesE2)
TEST(TestASMu2D, BoundaryNodesE3) TEST(TestASMu2D, BoundaryNodesE3)
{ {
SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Edge3",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Edge3",vec);
ASSERT_EQ(vec.size(), 4U); ASSERT_EQ(vec.size(), 4U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
ASSERT_EQ(vec[i], i+1); ASSERT_EQ(vec[i], i+1);
@ -81,14 +82,8 @@ TEST(TestASMu2D, BoundaryNodesE3)
TEST(TestASMu2D, BoundaryNodesE4) TEST(TestASMu2D, BoundaryNodesE4)
{ {
SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Edge4",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Edge4",vec);
ASSERT_EQ(vec.size(), 4U); ASSERT_EQ(vec.size(), 4U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
ASSERT_EQ(vec[i], 5+i); ASSERT_EQ(vec[i], 5+i);
@ -98,14 +93,12 @@ TEST(TestASMu2D, BoundaryNodesE4)
TEST_P(TestASMu2D, ConstrainEdge) TEST_P(TestASMu2D, ConstrainEdge)
{ {
SIM2D sim(1); SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline; ASMu2D* pch = getPatch(sim);
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp")); ASSERT_TRUE(pch != nullptr);
sim.preprocess();
ASMu2D* pch = static_cast<ASMu2D*>(sim.getPatch(1));
pch->constrainEdge(GetParam().edgeIdx, false, 1, 1, 1); pch->constrainEdge(GetParam().edgeIdx, false, 1, 1, 1);
std::vector<int> glbNodes; std::vector<int> glbNodes;
pch->getBoundaryNodes(GetParam().edge, glbNodes, 1); pch->getBoundaryNodes(GetParam().edge, glbNodes, 1);
for (auto& it : glbNodes) for (int& it : glbNodes)
ASSERT_TRUE(pch->findMPC(it, 1) != nullptr); ASSERT_TRUE(pch->findMPC(it, 1) != nullptr);
} }
@ -113,10 +106,8 @@ TEST_P(TestASMu2D, ConstrainEdge)
TEST_P(TestASMu2D, ConstrainEdgeOpen) TEST_P(TestASMu2D, ConstrainEdgeOpen)
{ {
SIM2D sim(1); SIM2D sim(1);
sim.opt.discretization = ASM::LRSpline; ASMu2D* pch = getPatch(sim);
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes.xinp")); ASSERT_TRUE(pch != nullptr);
sim.preprocess();
ASMu2D* pch = static_cast<ASMu2D*>(sim.getPatch(1));
pch->constrainEdge(GetParam().edgeIdx, true, 1, 1, 1); pch->constrainEdge(GetParam().edgeIdx, true, 1, 1, 1);
std::vector<int> glbNodes; std::vector<int> glbNodes;
pch->getBoundaryNodes(GetParam().edge, glbNodes, 1); pch->getBoundaryNodes(GetParam().edge, glbNodes, 1);
@ -126,7 +117,7 @@ TEST_P(TestASMu2D, ConstrainEdgeOpen)
crn = pch->getCorner(GetParam().c2[0], GetParam().c2[1], 1); crn = pch->getCorner(GetParam().c2[0], GetParam().c2[1], 1);
ASSERT_TRUE(pch->findMPC(crn, 1) == nullptr); ASSERT_TRUE(pch->findMPC(crn, 1) == nullptr);
glbNodes.erase(std::find(glbNodes.begin(), glbNodes.end(), crn)); glbNodes.erase(std::find(glbNodes.begin(), glbNodes.end(), crn));
for (auto& it : glbNodes) for (int& it : glbNodes)
ASSERT_TRUE(pch->findMPC(it, 1) != nullptr); ASSERT_TRUE(pch->findMPC(it, 1) != nullptr);
} }
@ -138,6 +129,5 @@ static const std::vector<EdgeTest> edgeTestData =
{4, 2, {-1, 1}, { 1, 1}}}; {4, 2, {-1, 1}, { 1, 1}}};
INSTANTIATE_TEST_CASE_P(TestASMu2D, TestASMu2D, INSTANTIATE_TEST_CASE_P(TestASMu2D, TestASMu2D,
testing::ValuesIn(edgeTestData)); testing::ValuesIn(edgeTestData));

View File

@ -11,22 +11,25 @@
//============================================================================== //==============================================================================
#include "ASMu3D.h" #include "ASMu3D.h"
#include "IFEM.h"
#include "SIM3D.h" #include "SIM3D.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
TEST(TestASMu3D, BoundaryNodesF1)
static void getBoundaryNodes (const char* faceName, std::vector<int>& nodes)
{ {
SIM3D sim(1); SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline; sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp")); ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess(); ASSERT_TRUE(sim.createFEMmodel());
sim.getBoundaryNodes(sim.getUniquePropertyCode(faceName,0),nodes);
}
int bcode = sim.getUniquePropertyCode("Face1",0);
TEST(TestASMu3D, BoundaryNodesF1)
{
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face1",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
ASSERT_EQ(vec[i], 1+4*i); ASSERT_EQ(vec[i], 1+4*i);
@ -35,14 +38,8 @@ TEST(TestASMu3D, BoundaryNodesF1)
TEST(TestASMu3D, BoundaryNodesF2) TEST(TestASMu3D, BoundaryNodesF2)
{ {
SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Face2",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face2",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
ASSERT_EQ(vec[i], 2+4*i); ASSERT_EQ(vec[i], 2+4*i);
@ -51,49 +48,30 @@ TEST(TestASMu3D, BoundaryNodesF2)
TEST(TestASMu3D, BoundaryNodesF3) TEST(TestASMu3D, BoundaryNodesF3)
{ {
SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Face3",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face3",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
ASSERT_EQ(vec[4*i+j], 16*i+j+1); ASSERT_EQ(vec[4*i+j], 16*i+j+1);
} }
TEST(TestASMu3D, BoundaryNodesF4) TEST(TestASMu3D, BoundaryNodesF4)
{ {
SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Face4",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face4",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
ASSERT_EQ(vec[4*i+j], 5+16*i+j); ASSERT_EQ(vec[4*i+j], 5+16*i+j);
} }
TEST(TestASMu3D, BoundaryNodesF5) TEST(TestASMu3D, BoundaryNodesF5)
{ {
SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Face5",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face5",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
ASSERT_EQ(vec[i], i+1); ASSERT_EQ(vec[i], i+1);
@ -102,14 +80,8 @@ TEST(TestASMu3D, BoundaryNodesF5)
TEST(TestASMu3D, BoundaryNodesF6) TEST(TestASMu3D, BoundaryNodesF6)
{ {
SIM3D sim(1);
sim.opt.discretization = ASM::LRSpline;
ASSERT_TRUE(sim.read("src/ASM/LR/Test/refdata/boundary_nodes_3d.xinp"));
sim.preprocess();
int bcode = sim.getUniquePropertyCode("Face6",0);
std::vector<int> vec; std::vector<int> vec;
sim.getBoundaryNodes(bcode, vec); getBoundaryNodes("Face6",vec);
ASSERT_EQ(vec.size(), 16U); ASSERT_EQ(vec.size(), 16U);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
ASSERT_EQ(vec[i], 17+i); ASSERT_EQ(vec[i], 17+i);

View File

@ -13,6 +13,7 @@
#include "DomainDecomposition.h" #include "DomainDecomposition.h"
#include "SAM.h" #include "SAM.h"
#include "SIM2D.h" #include "SIM2D.h"
#include "IntegrandBase.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include <fstream> #include <fstream>
@ -21,8 +22,7 @@ typedef std::vector< std::vector<int> > IntMat;
static IntMat readIntMatrix(size_t r, const std::string& file) static IntMat readIntMatrix(size_t r, const std::string& file)
{ {
std::vector< std::vector<int> > result; IntMat result(r);
result.resize(r);
std::ifstream f(file); std::ifstream f(file);
for (size_t i=0;i<r;++i) { for (size_t i=0;i<r;++i) {
size_t size; size_t size;
@ -36,15 +36,13 @@ static IntMat readIntMatrix(size_t r, const std::string& file)
} }
auto&& check_intmatrices_equal = [](const std::vector<std::vector<int>>& subdomains, auto&& check_intmatrices_equal = [](const IntMat& subdomains,
const std::string& path) const std::string& path)
{ {
IntMat B = readIntMatrix(subdomains.size(), path); IntMat B = readIntMatrix(subdomains.size(), path);
for (size_t i = 0; i < subdomains.size(); ++i) { for (size_t i = 0; i < subdomains.size(); i++)
size_t j = 0; for (size_t j = 0; j < subdomains[i].size(); j++)
for (const auto& it2 : subdomains[i]) ASSERT_EQ(subdomains[i][j], B[i][j]);
ASSERT_EQ(it2, B[i][j++]);
}
}; };
@ -92,9 +90,10 @@ TEST(TestDomainDecomposition, LocalGroups3DO2)
TEST(TestDomainDecomposition, Setup) TEST(TestDomainDecomposition, Setup)
{ {
SIM2D sim(1); class Dummy : public IntegrandBase {};
sim.read("src/ASM/Test/refdata/DomainDecomposition_2D_1P.xinp"); SIM2D sim(new Dummy());
sim.preprocess(); ASSERT_TRUE(sim.read("src/ASM/Test/refdata/DomainDecomposition_2D_1P.xinp"));
ASSERT_TRUE(sim.preprocess());
DomainDecomposition dd; DomainDecomposition dd;
// TODO: Remove after integration // TODO: Remove after integration