Skip to content
10 changes: 10 additions & 0 deletions src/model/GroundHeatExchangerHorizontalTrench.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -259,6 +261,14 @@ namespace model {
return false;
}

ModelObject GroundHeatExchangerHorizontalTrench_Impl::clone(Model model) const {
auto groundHeatExchangerClone = StraightComponent_Impl::clone(model).cast<GroundHeatExchangerHorizontalTrench>();

groundHeatExchangerClone.setUndisturbedGroundTemperatureModel(undisturbedGroundTemperatureModel().clone(model));

return std::move(groundHeatExchangerClone);
}

ComponentType GroundHeatExchangerHorizontalTrench_Impl::componentType() const {
return ComponentType::Both;
}
Expand Down
2 changes: 2 additions & 0 deletions src/model/GroundHeatExchangerHorizontalTrench_Impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ namespace model {

virtual IddObjectType iddObjectType() const override;

virtual ModelObject clone(Model model) const override;

virtual unsigned inletPort() const override;

virtual unsigned outletPort() const override;
Expand Down
7 changes: 4 additions & 3 deletions src/model/GroundHeatExchangerVertical.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,11 +367,12 @@ namespace model {
return false;
}

//clone object
ModelObject GroundHeatExchangerVertical_Impl::clone(Model model) const {
auto newGroundHeatExchanger = StraightComponent_Impl::clone(model).cast<GroundHeatExchangerVertical>();
auto groundHeatExchangerClone = StraightComponent_Impl::clone(model).cast<GroundHeatExchangerVertical>();

return std::move(newGroundHeatExchanger);
groundHeatExchangerClone.setUndisturbedGroundTemperatureModel(undisturbedGroundTemperatureModel().clone(model));

return std::move(groundHeatExchangerClone);
}

bool GroundHeatExchangerVertical_Impl::addGFunction(double gFunctionLN, double gFunctionGValue) {
Expand Down
30 changes: 28 additions & 2 deletions src/model/test/GroundHeatExchangerHorizontalTrench_GTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) {

auto ghClone = gh.clone(m).cast<GroundHeatExchangerHorizontalTrench>();
EXPECT_EQ(2u, m.getConcreteModelObjects<GroundHeatExchangerHorizontalTrench>().size());
EXPECT_EQ(1u, m.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());
EXPECT_EQ(2u, m.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should clone into the same model create a new SGT object here? If not, how can this be prevented?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see a precedent for determining whether to clone based on the model that the GHE is in. And I don't see an issue with just cloning into the same model.


ModelObject undisturbedGroundTemperatureModel = gh.undisturbedGroundTemperatureModel();
boost::optional<SiteGroundTemperatureUndisturbedKusudaAchenbach> uka =
Expand All @@ -201,7 +201,7 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) {
boost::optional<SiteGroundTemperatureUndisturbedKusudaAchenbach> ukaClone =
undisturbedGroundTemperatureModelClone.optionalCast<SiteGroundTemperatureUndisturbedKusudaAchenbach>();
ASSERT_TRUE(ukaClone);
EXPECT_EQ(sgt, ukaClone.get());
EXPECT_NE(sgt, ukaClone.get());

gh.remove();
EXPECT_EQ(1u, m.getConcreteModelObjects<GroundHeatExchangerHorizontalTrench>().size());
Expand Down Expand Up @@ -243,4 +243,30 @@ TEST_F(ModelFixture, GroundHeatExchangerHorizontalTrench_Clone) {
EXPECT_EQ(0u, m.getConcreteModelObjects<GroundHeatExchangerHorizontalTrench>().size());
EXPECT_EQ(1u, m.getConcreteModelObjects<SiteGroundTemperatureUndisturbedXing>().size());
}

//clone into another model
{
Model m;
GroundHeatExchangerHorizontalTrench testObject(m);

auto testObjectClone = testObject.clone(m).cast<GroundHeatExchangerHorizontalTrench>();

Model m2;
auto testObjectClone2 = testObject.clone(m2).cast<GroundHeatExchangerHorizontalTrench>();

EXPECT_NE(testObjectClone2, testObjectClone);
EXPECT_NE(testObjectClone2.handle(), testObjectClone.handle());

ModelObject undisturbedGroundTemperatureModelClone = testObjectClone.undisturbedGroundTemperatureModel();
boost::optional<SiteGroundTemperatureUndisturbedKusudaAchenbach> sgtClone =
undisturbedGroundTemperatureModelClone.optionalCast<SiteGroundTemperatureUndisturbedKusudaAchenbach>();
ASSERT_TRUE(sgtClone);
EXPECT_EQ(2u, m.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());

ModelObject undisturbedGroundTemperatureModelClone2 = testObjectClone2.undisturbedGroundTemperatureModel();
boost::optional<SiteGroundTemperatureUndisturbedKusudaAchenbach> sgtClone2 =
undisturbedGroundTemperatureModelClone2.optionalCast<SiteGroundTemperatureUndisturbedKusudaAchenbach>();
ASSERT_TRUE(sgtClone2);
EXPECT_EQ(1u, m2.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());
}
}
12 changes: 12 additions & 0 deletions src/model/test/GroundHeatExchangerVertical_GTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<SiteGroundTemperatureUndisturbedKusudaAchenbach> sgtClone =
undisturbedGroundTemperatureModelClone.optionalCast<SiteGroundTemperatureUndisturbedKusudaAchenbach>();
ASSERT_TRUE(sgtClone);
EXPECT_EQ(2u, m.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());

ModelObject undisturbedGroundTemperatureModelClone2 = testObjectClone2.undisturbedGroundTemperatureModel();
boost::optional<SiteGroundTemperatureUndisturbedKusudaAchenbach> sgtClone2 =
undisturbedGroundTemperatureModelClone2.optionalCast<SiteGroundTemperatureUndisturbedKusudaAchenbach>();
ASSERT_TRUE(sgtClone2);
EXPECT_EQ(1u, m2.getConcreteModelObjects<SiteGroundTemperatureUndisturbedKusudaAchenbach>().size());
}

TEST_F(ModelFixture, GroundHeatExchangerVertical_GFunctions) {
Expand Down
Loading