must use dynamic cast due to virtual inheritance

This commit is contained in:
Axel Kohlmeyer
2022-12-12 20:37:53 -05:00
parent 3b2376d0bb
commit d7742412b3
2 changed files with 26 additions and 26 deletions

View File

@ -256,7 +256,7 @@ void PairYLZ::coeff(int narg, char **arg)
void PairYLZ::init_style() void PairYLZ::init_style()
{ {
avec = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); avec = dynamic_cast<AtomVecEllipsoid *>(atom->style_match("ellipsoid"));
if (!avec) error->all(FLERR, "Pair style ylz requires atom style ellipsoid"); if (!avec) error->all(FLERR, "Pair style ylz requires atom style ellipsoid");
neighbor->request(this, instance_me); neighbor->request(this, instance_me);

View File

@ -1147,7 +1147,7 @@ TEST_F(AtomStyleTest, ellipsoid)
auto type = lmp->atom->type; auto type = lmp->atom->type;
auto ellipsoid = lmp->atom->ellipsoid; auto ellipsoid = lmp->atom->ellipsoid;
auto rmass = lmp->atom->rmass; auto rmass = lmp->atom->rmass;
auto avec = (AtomVecEllipsoid *)lmp->atom->avec; auto avec = dynamic_cast<AtomVecEllipsoid *>(lmp->atom->avec);
auto bonus = avec->bonus; auto bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON);
EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON);
@ -1258,7 +1258,7 @@ TEST_F(AtomStyleTest, ellipsoid)
type = lmp->atom->type; type = lmp->atom->type;
ellipsoid = lmp->atom->ellipsoid; ellipsoid = lmp->atom->ellipsoid;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecEllipsoid *)lmp->atom->avec; avec = dynamic_cast<AtomVecEllipsoid *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(3)], 2); ASSERT_EQ(type[GETIDX(3)], 2);
@ -1323,7 +1323,7 @@ TEST_F(AtomStyleTest, ellipsoid)
ellipsoid = lmp->atom->ellipsoid; ellipsoid = lmp->atom->ellipsoid;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecEllipsoid *)lmp->atom->avec; avec = dynamic_cast<AtomVecEllipsoid *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(2)], 3); ASSERT_EQ(type[GETIDX(2)], 3);
@ -1476,7 +1476,7 @@ TEST_F(AtomStyleTest, line)
auto type = lmp->atom->type; auto type = lmp->atom->type;
auto line = lmp->atom->line; auto line = lmp->atom->line;
auto rmass = lmp->atom->rmass; auto rmass = lmp->atom->rmass;
auto avec = (AtomVecLine *)lmp->atom->avec; auto avec = dynamic_cast<AtomVecLine *>(lmp->atom->avec);
auto bonus = avec->bonus; auto bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON);
EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON);
@ -1569,7 +1569,7 @@ TEST_F(AtomStyleTest, line)
type = lmp->atom->type; type = lmp->atom->type;
line = lmp->atom->line; line = lmp->atom->line;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecLine *)lmp->atom->avec; avec = dynamic_cast<AtomVecLine *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(3)], 2); ASSERT_EQ(type[GETIDX(3)], 2);
@ -1614,7 +1614,7 @@ TEST_F(AtomStyleTest, line)
line = lmp->atom->line; line = lmp->atom->line;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecLine *)lmp->atom->avec; avec = dynamic_cast<AtomVecLine *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(2)], 3); ASSERT_EQ(type[GETIDX(2)], 3);
@ -1760,7 +1760,7 @@ TEST_F(AtomStyleTest, tri)
auto tri = lmp->atom->tri; auto tri = lmp->atom->tri;
auto rmass = lmp->atom->rmass; auto rmass = lmp->atom->rmass;
auto radius = lmp->atom->radius; auto radius = lmp->atom->radius;
auto avec = (AtomVecTri *)lmp->atom->avec; auto avec = dynamic_cast<AtomVecTri *>(lmp->atom->avec);
auto bonus = avec->bonus; auto bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON);
EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON);
@ -1914,7 +1914,7 @@ TEST_F(AtomStyleTest, tri)
tri = lmp->atom->tri; tri = lmp->atom->tri;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
radius = lmp->atom->radius; radius = lmp->atom->radius;
avec = (AtomVecTri *)lmp->atom->avec; avec = dynamic_cast<AtomVecTri *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(3)], 2); ASSERT_EQ(type[GETIDX(3)], 2);
@ -2023,7 +2023,7 @@ TEST_F(AtomStyleTest, tri)
tri = lmp->atom->tri; tri = lmp->atom->tri;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecTri *)lmp->atom->avec; avec = dynamic_cast<AtomVecTri *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(2)], 3); ASSERT_EQ(type[GETIDX(2)], 3);
@ -2081,7 +2081,7 @@ TEST_F(AtomStyleTest, body_nparticle)
ASSERT_ATOM_STATE_EQ(lmp->atom, expected); ASSERT_ATOM_STATE_EQ(lmp->atom, expected);
auto avec = (AtomVecBody *)lmp->atom->avec; auto avec = dynamic_cast<AtomVecBody *>(lmp->atom->avec);
ASSERT_NE(lmp->atom->avec, nullptr); ASSERT_NE(lmp->atom->avec, nullptr);
ASSERT_NE(avec->bptr, nullptr); ASSERT_NE(avec->bptr, nullptr);
ASSERT_THAT(std::string(avec->bptr->style), Eq("nparticle")); ASSERT_THAT(std::string(avec->bptr->style), Eq("nparticle"));
@ -2344,7 +2344,7 @@ TEST_F(AtomStyleTest, body_nparticle)
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
radius = lmp->atom->radius; radius = lmp->atom->radius;
angmom = lmp->atom->angmom; angmom = lmp->atom->angmom;
avec = (AtomVecBody *)lmp->atom->avec; avec = dynamic_cast<AtomVecBody *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON);
EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON);
@ -2484,7 +2484,7 @@ TEST_F(AtomStyleTest, body_nparticle)
command("replicate 1 1 2"); command("replicate 1 1 2");
END_HIDE_OUTPUT(); END_HIDE_OUTPUT();
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("body")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("body"));
avec = (AtomVecBody *)lmp->atom->avec; avec = dynamic_cast<AtomVecBody *>(lmp->atom->avec);
ASSERT_THAT(std::string(avec->bptr->style), Eq("nparticle")); ASSERT_THAT(std::string(avec->bptr->style), Eq("nparticle"));
ASSERT_NE(lmp->atom->avec, nullptr); ASSERT_NE(lmp->atom->avec, nullptr);
ASSERT_EQ(lmp->atom->natoms, 8); ASSERT_EQ(lmp->atom->natoms, 8);
@ -2599,7 +2599,7 @@ TEST_F(AtomStyleTest, body_nparticle)
body = lmp->atom->body; body = lmp->atom->body;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
radius = lmp->atom->radius; radius = lmp->atom->radius;
avec = (AtomVecBody *)lmp->atom->avec; avec = dynamic_cast<AtomVecBody *>(lmp->atom->avec);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(2)], 3); ASSERT_EQ(type[GETIDX(2)], 3);
@ -3048,7 +3048,7 @@ TEST_F(AtomStyleTest, template_charge)
ASSERT_ATOM_STATE_EQ(lmp->atom, expected); ASSERT_ATOM_STATE_EQ(lmp->atom, expected);
auto hybrid = (AtomVecHybrid *)lmp->atom->avec; auto hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_EQ(hybrid->nstyles, 2); ASSERT_EQ(hybrid->nstyles, 2);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("template")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("template"));
@ -3079,7 +3079,7 @@ TEST_F(AtomStyleTest, template_charge)
command("pair_coeff * *"); command("pair_coeff * *");
END_HIDE_OUTPUT(); END_HIDE_OUTPUT();
ASSERT_NE(lmp->atom->avec, nullptr); ASSERT_NE(lmp->atom->avec, nullptr);
hybrid = (AtomVecHybrid *)lmp->atom->avec; hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_EQ(hybrid->nstyles, 2); ASSERT_EQ(hybrid->nstyles, 2);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("template")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("template"));
@ -4189,7 +4189,7 @@ TEST_F(AtomStyleTest, full_ellipsoid)
ASSERT_ATOM_STATE_EQ(lmp->atom, expected); ASSERT_ATOM_STATE_EQ(lmp->atom, expected);
auto hybrid = (AtomVecHybrid *)lmp->atom->avec; auto hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_EQ(hybrid->nstyles, 2); ASSERT_EQ(hybrid->nstyles, 2);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full"));
@ -4276,7 +4276,7 @@ TEST_F(AtomStyleTest, full_ellipsoid)
END_HIDE_OUTPUT(); END_HIDE_OUTPUT();
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_NE(lmp->atom->avec, nullptr); ASSERT_NE(lmp->atom->avec, nullptr);
hybrid = (AtomVecHybrid *)lmp->atom->avec; hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_EQ(hybrid->nstyles, 2); ASSERT_EQ(hybrid->nstyles, 2);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full"));
ASSERT_THAT(std::string(hybrid->keywords[1]), Eq("ellipsoid")); ASSERT_THAT(std::string(hybrid->keywords[1]), Eq("ellipsoid"));
@ -4306,7 +4306,7 @@ TEST_F(AtomStyleTest, full_ellipsoid)
auto ellipsoid = lmp->atom->ellipsoid; auto ellipsoid = lmp->atom->ellipsoid;
auto rmass = lmp->atom->rmass; auto rmass = lmp->atom->rmass;
auto avec = (AtomVecEllipsoid *)hybrid->styles[1]; auto avec = dynamic_cast<AtomVecEllipsoid *>(hybrid->styles[1]);
auto bonus = avec->bonus; auto bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -2.0, EPSILON);
EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON); EXPECT_NEAR(x[GETIDX(1)][1], 2.0, EPSILON);
@ -4408,7 +4408,7 @@ TEST_F(AtomStyleTest, full_ellipsoid)
command("replicate 1 1 2 bbox"); command("replicate 1 1 2 bbox");
END_HIDE_OUTPUT(); END_HIDE_OUTPUT();
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
hybrid = (AtomVecHybrid *)lmp->atom->avec; hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_EQ(hybrid->nstyles, 2); ASSERT_EQ(hybrid->nstyles, 2);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("full"));
ASSERT_THAT(std::string(hybrid->keywords[1]), Eq("ellipsoid")); ASSERT_THAT(std::string(hybrid->keywords[1]), Eq("ellipsoid"));
@ -4429,7 +4429,7 @@ TEST_F(AtomStyleTest, full_ellipsoid)
type = lmp->atom->type; type = lmp->atom->type;
ellipsoid = lmp->atom->ellipsoid; ellipsoid = lmp->atom->ellipsoid;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
avec = (AtomVecEllipsoid *)hybrid->styles[1]; avec = dynamic_cast<AtomVecEllipsoid *>(hybrid->styles[1]);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(3)], 2); ASSERT_EQ(type[GETIDX(3)], 2);
@ -4494,8 +4494,8 @@ TEST_F(AtomStyleTest, full_ellipsoid)
ellipsoid = lmp->atom->ellipsoid; ellipsoid = lmp->atom->ellipsoid;
rmass = lmp->atom->rmass; rmass = lmp->atom->rmass;
hybrid = (AtomVecHybrid *)lmp->atom->avec; hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
avec = (AtomVecEllipsoid *)hybrid->styles[1]; avec = dynamic_cast<AtomVecEllipsoid *>(hybrid->styles[1]);
bonus = avec->bonus; bonus = avec->bonus;
ASSERT_EQ(type[GETIDX(1)], 1); ASSERT_EQ(type[GETIDX(1)], 1);
ASSERT_EQ(type[GETIDX(2)], 3); ASSERT_EQ(type[GETIDX(2)], 3);
@ -4839,7 +4839,7 @@ TEST_F(AtomStyleTest, oxdna)
ASSERT_ATOM_STATE_EQ(lmp->atom, expected); ASSERT_ATOM_STATE_EQ(lmp->atom, expected);
auto hybrid = (AtomVecHybrid *)lmp->atom->avec; auto hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_EQ(hybrid->nstyles, 3); ASSERT_EQ(hybrid->nstyles, 3);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("bond")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("bond"));
@ -5014,7 +5014,7 @@ TEST_F(AtomStyleTest, oxdna)
ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid")); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("hybrid"));
ASSERT_NE(lmp->atom->avec, nullptr); ASSERT_NE(lmp->atom->avec, nullptr);
hybrid = (AtomVecHybrid *)lmp->atom->avec; hybrid = dynamic_cast<AtomVecHybrid *>(lmp->atom->avec);
ASSERT_EQ(hybrid->nstyles, 3); ASSERT_EQ(hybrid->nstyles, 3);
ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("bond")); ASSERT_THAT(std::string(hybrid->keywords[0]), Eq("bond"));
@ -5058,7 +5058,7 @@ TEST_F(AtomStyleTest, oxdna)
auto ellipsoid = lmp->atom->ellipsoid; auto ellipsoid = lmp->atom->ellipsoid;
auto rmass = lmp->atom->rmass; auto rmass = lmp->atom->rmass;
auto avec = (AtomVecEllipsoid *)hybrid->styles[1]; auto avec = dynamic_cast<AtomVecEllipsoid *>(hybrid->styles[1]);
auto bonus = avec->bonus; auto bonus = avec->bonus;
EXPECT_NEAR(x[GETIDX(1)][0], -0.33741452300167507, EPSILON); EXPECT_NEAR(x[GETIDX(1)][0], -0.33741452300167507, EPSILON);