diff --git a/src/model/GroundHeatExchangerHorizontalTrench.cpp b/src/model/GroundHeatExchangerHorizontalTrench.cpp index 71285b92c5..7c21145de2 100644 --- a/src/model/GroundHeatExchangerHorizontalTrench.cpp +++ b/src/model/GroundHeatExchangerHorizontalTrench.cpp @@ -9,6 +9,8 @@ #include "PlantLoop_Impl.hpp" #include "Node.hpp" #include "Node_Impl.hpp" +#include "Model.hpp" +#include "Model_Impl.hpp" #include "SiteGroundTemperatureUndisturbedKusudaAchenbach.hpp" #include "SiteGroundTemperatureUndisturbedKusudaAchenbach_Impl.hpp" @@ -259,6 +261,22 @@ namespace model { return false; } + ModelObject GroundHeatExchangerHorizontalTrench_Impl::clone(Model model) const { + auto groundHeatExchangerClone = StraightComponent_Impl::clone(model).cast(); + + groundHeatExchangerClone.setUndisturbedGroundTemperatureModel(undisturbedGroundTemperatureModel().clone(model)); + + return std::move(groundHeatExchangerClone); + } + + std::vector GroundHeatExchangerHorizontalTrench_Impl::children() const { + std::vector result; + + result.push_back(undisturbedGroundTemperatureModel()); + + return result; + } + ComponentType GroundHeatExchangerHorizontalTrench_Impl::componentType() const { return ComponentType::Both; } diff --git a/src/model/GroundHeatExchangerHorizontalTrench_Impl.hpp b/src/model/GroundHeatExchangerHorizontalTrench_Impl.hpp index 01f17bf2d2..9e24987bcf 100644 --- a/src/model/GroundHeatExchangerHorizontalTrench_Impl.hpp +++ b/src/model/GroundHeatExchangerHorizontalTrench_Impl.hpp @@ -38,6 +38,10 @@ namespace model { virtual IddObjectType iddObjectType() const override; + virtual ModelObject clone(Model model) const override; + + virtual std::vector children() const override; + virtual unsigned inletPort() const override; virtual unsigned outletPort() const override; diff --git a/src/model/GroundHeatExchangerVertical.cpp b/src/model/GroundHeatExchangerVertical.cpp index 39a03cde3b..96330f600e 100644 --- a/src/model/GroundHeatExchangerVertical.cpp +++ b/src/model/GroundHeatExchangerVertical.cpp @@ -367,11 +367,20 @@ namespace model { return false; } - //clone object ModelObject GroundHeatExchangerVertical_Impl::clone(Model model) const { - auto newGroundHeatExchanger = StraightComponent_Impl::clone(model).cast(); + auto groundHeatExchangerClone = StraightComponent_Impl::clone(model).cast(); - return std::move(newGroundHeatExchanger); + groundHeatExchangerClone.setUndisturbedGroundTemperatureModel(undisturbedGroundTemperatureModel().clone(model)); + + return std::move(groundHeatExchangerClone); + } + + std::vector GroundHeatExchangerVertical_Impl::children() const { + std::vector result; + + result.push_back(undisturbedGroundTemperatureModel()); + + return result; } bool GroundHeatExchangerVertical_Impl::addGFunction(double gFunctionLN, double gFunctionGValue) { diff --git a/src/model/GroundHeatExchangerVertical_Impl.hpp b/src/model/GroundHeatExchangerVertical_Impl.hpp index 739598f0db..670a5bcfce 100644 --- a/src/model/GroundHeatExchangerVertical_Impl.hpp +++ b/src/model/GroundHeatExchangerVertical_Impl.hpp @@ -39,6 +39,8 @@ namespace model { virtual ModelObject clone(Model model) const override; + virtual std::vector children() const override; + virtual unsigned inletPort() const override; virtual unsigned outletPort() const override; diff --git a/src/model/test/GroundHeatExchangerHorizontalTrench_GTest.cpp b/src/model/test/GroundHeatExchangerHorizontalTrench_GTest.cpp index 84de5ebd55..5c60fe6401 100644 --- a/src/model/test/GroundHeatExchangerHorizontalTrench_GTest.cpp +++ b/src/model/test/GroundHeatExchangerHorizontalTrench_GTest.cpp @@ -189,7 +189,7 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) { auto ghClone = gh.clone(m).cast(); EXPECT_EQ(2u, m.getConcreteModelObjects().size()); - EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); ModelObject undisturbedGroundTemperatureModel = gh.undisturbedGroundTemperatureModel(); boost::optional uka = @@ -201,15 +201,23 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) { boost::optional ukaClone = undisturbedGroundTemperatureModelClone.optionalCast(); ASSERT_TRUE(ukaClone); - EXPECT_EQ(sgt, ukaClone.get()); + EXPECT_NE(sgt, ukaClone.get()); gh.remove(); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + GroundHeatExchangerHorizontalTrench gh2(m, ukaClone.get()); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); ghClone.remove(); - EXPECT_EQ(0u, m.getConcreteModelObjects().size()); + EXPECT_EQ(1u, m.getConcreteModelObjects().size()); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + + ModelObject undisturbedGroundTemperatureModel2 = gh2.undisturbedGroundTemperatureModel(); + boost::optional uka2 = + undisturbedGroundTemperatureModel2.optionalCast(); + ASSERT_TRUE(uka2); + EXPECT_EQ(ukaClone.get(), uka2.get()); } { @@ -222,7 +230,7 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) { auto ghClone = gh.clone(m).cast(); EXPECT_EQ(2u, m.getConcreteModelObjects().size()); - EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); ModelObject undisturbedGroundTemperatureModel = gh.undisturbedGroundTemperatureModel(); boost::optional ux = undisturbedGroundTemperatureModel.optionalCast(); @@ -231,16 +239,50 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) { ModelObject undisturbedGroundTemperatureModelClone = ghClone.undisturbedGroundTemperatureModel(); boost::optional uxClone = - undisturbedGroundTemperatureModel.optionalCast(); + undisturbedGroundTemperatureModelClone.optionalCast(); ASSERT_TRUE(uxClone); - EXPECT_EQ(sgt, uxClone.get()); + EXPECT_NE(sgt, uxClone.get()); gh.remove(); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + GroundHeatExchangerHorizontalTrench gh2(m, uxClone.get()); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); ghClone.remove(); - EXPECT_EQ(0u, m.getConcreteModelObjects().size()); + EXPECT_EQ(1u, m.getConcreteModelObjects().size()); EXPECT_EQ(1u, m.getConcreteModelObjects().size()); + + ModelObject undisturbedGroundTemperatureModel2 = gh2.undisturbedGroundTemperatureModel(); + boost::optional ux2 = + undisturbedGroundTemperatureModel2.optionalCast(); + ASSERT_TRUE(ux2); + EXPECT_EQ(uxClone.get(), ux2.get()); + } + + //clone into another model + { + Model m; + GroundHeatExchangerHorizontalTrench testObject(m); + + auto testObjectClone = testObject.clone(m).cast(); + + Model m2; + auto testObjectClone2 = testObject.clone(m2).cast(); + + EXPECT_NE(testObjectClone2, testObjectClone); + EXPECT_NE(testObjectClone2.handle(), testObjectClone.handle()); + + ModelObject undisturbedGroundTemperatureModelClone = testObjectClone.undisturbedGroundTemperatureModel(); + boost::optional sgtClone = + undisturbedGroundTemperatureModelClone.optionalCast(); + ASSERT_TRUE(sgtClone); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); + + ModelObject undisturbedGroundTemperatureModelClone2 = testObjectClone2.undisturbedGroundTemperatureModel(); + boost::optional sgtClone2 = + undisturbedGroundTemperatureModelClone2.optionalCast(); + ASSERT_TRUE(sgtClone2); + EXPECT_EQ(1u, m2.getConcreteModelObjects().size()); } } diff --git a/src/model/test/GroundHeatExchangerVertical_GTest.cpp b/src/model/test/GroundHeatExchangerVertical_GTest.cpp index 3e659eed41..7448c8e422 100644 --- a/src/model/test/GroundHeatExchangerVertical_GTest.cpp +++ b/src/model/test/GroundHeatExchangerVertical_GTest.cpp @@ -332,6 +332,18 @@ TEST_F(ModelFixture, GroundHeatExchangerVertical_Clone) { EXPECT_NE(testObjectClone2, testObjectClone); EXPECT_NE(testObjectClone2.handle(), testObjectClone.handle()); + + ModelObject undisturbedGroundTemperatureModelClone = testObjectClone.undisturbedGroundTemperatureModel(); + boost::optional sgtClone = + undisturbedGroundTemperatureModelClone.optionalCast(); + ASSERT_TRUE(sgtClone); + EXPECT_EQ(2u, m.getConcreteModelObjects().size()); + + ModelObject undisturbedGroundTemperatureModelClone2 = testObjectClone2.undisturbedGroundTemperatureModel(); + boost::optional sgtClone2 = + undisturbedGroundTemperatureModelClone2.optionalCast(); + ASSERT_TRUE(sgtClone2); + EXPECT_EQ(1u, m2.getConcreteModelObjects().size()); } TEST_F(ModelFixture, GroundHeatExchangerVertical_GFunctions) {