Skip to content

Commit

Permalink
Merge pull request #4959 from NREL/4926_WindowFramePropertyDivider_Ou…
Browse files Browse the repository at this point in the history
…tsideRevealDepth

Fix #4926 - WindowPropertyFrameAndDivider: "Outside Reveal Depth" not forward translated
  • Loading branch information
jmarrec authored Sep 11, 2023
2 parents 5dd736c + b2f7372 commit cc9652f
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 15 deletions.
21 changes: 11 additions & 10 deletions src/energyplus/ForwardTranslator/ForwardTranslateSubSurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,17 @@ namespace energyplus {

idfObject.setString(FenestrationSurface_DetailedFields::Name, modelObject.name().get());

openstudio::Vector3d offset(0, 0, 0);
idfObject.clearExtensibleGroups();

openstudio::Vector3d offset(0, 0, 0);
boost::optional<WindowPropertyFrameAndDivider> frameAndDivider = modelObject.windowPropertyFrameAndDivider();
if (frameAndDivider) {
if (!frameAndDivider->isOutsideRevealDepthDefaulted()) {
offset = -frameAndDivider->outsideRevealDepth() * modelObject.outwardNormal();
}
idfObject.setString(FenestrationSurface_DetailedFields::FrameandDividerName, frameAndDivider->name().get());
}

for (const Point3d& point : modelObject.vertices()) {
IdfExtensibleGroup group = idfObject.pushExtensibleGroup();
if (group.empty()) {
Expand All @@ -53,7 +62,7 @@ namespace energyplus {
return boost::none;
}

Point3d newPoint = point + offset;
const Point3d newPoint = point + offset;

group.setDouble(0, newPoint.x());
group.setDouble(1, newPoint.y());
Expand Down Expand Up @@ -137,14 +146,6 @@ namespace energyplus {
idfObject.setDouble(FenestrationSurface_DetailedFields::ViewFactortoGround, *viewFactortoGround);
}

boost::optional<WindowPropertyFrameAndDivider> frameAndDivider = modelObject.windowPropertyFrameAndDivider();
if (frameAndDivider) {
if (!frameAndDivider->isOutsideRevealDepthDefaulted()) {
offset = -frameAndDivider->outsideRevealDepth() * modelObject.outwardNormal();
}
idfObject.setString(FenestrationSurface_DetailedFields::FrameandDividerName, frameAndDivider->name().get());
}

if (!modelObject.isMultiplierDefaulted()) {
idfObject.setDouble(FenestrationSurface_DetailedFields::Multiplier, modelObject.multiplier());
}
Expand Down
49 changes: 44 additions & 5 deletions src/energyplus/Test/WindowPropertyFrameAndDivider_GTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "../ErrorFile.hpp"
#include "../ForwardTranslator.hpp"
#include "../ReverseTranslator.hpp"
#include "../GeometryTranslator.hpp"

#include "../../model/Model.hpp"
#include "../../model/Space.hpp"
Expand All @@ -30,6 +31,8 @@
#include "../../utilities/idf/IdfFile.hpp"

#include <resources.hxx>
#include <utilities/idd/IddEnums.hxx>
#include <utilities/idd/FenestrationSurface_Detailed_FieldEnums.hxx>

#include <sstream>

Expand Down Expand Up @@ -76,8 +79,9 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) {
EXPECT_DOUBLE_EQ(-1.0, normal.y());
EXPECT_DOUBLE_EQ(0.0, normal.z());

static constexpr double outsideRevealDepth = 1.75;
WindowPropertyFrameAndDivider frameAndDivider(model);
frameAndDivider.setOutsideRevealDepth(1.0);
frameAndDivider.setOutsideRevealDepth(outsideRevealDepth);

EXPECT_FALSE(subSurface2.allowWindowPropertyFrameAndDivider());
EXPECT_TRUE(subSurface2.setSubSurfaceType("GlassDoor"));
Expand All @@ -86,12 +90,47 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) {
EXPECT_TRUE(subSurface2.setWindowPropertyFrameAndDivider(frameAndDivider));
ASSERT_TRUE(subSurface2.windowPropertyFrameAndDivider());


ForwardTranslator forwardTranslator;
OptionalWorkspace outWorkspace = forwardTranslator.translateModel(model);
ASSERT_TRUE(outWorkspace);
auto workspace = forwardTranslator.translateModel(model);

EXPECT_EQ(2u, workspace.getObjectsByType(IddObjectType::FenestrationSurface_Detailed).size());
ASSERT_EQ(1u, workspace.getObjectsByType(IddObjectType::WindowProperty_FrameAndDivider).size());

auto pointEqual = [](const Point3d& a, const Point3d& b) {
static constexpr double tol = 1.0e-6;
EXPECT_NEAR(a.x(), b.x(), tol);
EXPECT_NEAR(a.y(), b.y(), tol);
EXPECT_NEAR(a.z(), b.z(), tol);
};

{
auto ss_ = workspace.getObjectByTypeAndName(IddObjectType::FenestrationSurface_Detailed, subSurface1.nameString());
ASSERT_TRUE(ss_);
EXPECT_TRUE(ss_->isEmpty(FenestrationSurface_DetailedFields::FrameandDividerName));
auto idf_vertices = getVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, *ss_);
ASSERT_EQ(vertices.size(), idf_vertices.size());
for (size_t i = 0; i < vertices.size(); ++i) {
pointEqual(vertices[i], idf_vertices[i]);
}
}

{
auto ss_ = workspace.getObjectByTypeAndName(IddObjectType::FenestrationSurface_Detailed, subSurface2.nameString());
ASSERT_TRUE(ss_);
auto frame_ = ss_->getTarget(FenestrationSurface_DetailedFields::FrameandDividerName);
ASSERT_TRUE(frame_);

auto idf_vertices = getVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, *ss_);
ASSERT_EQ(vertices.size(), idf_vertices.size());
for (size_t i = 0; i < vertices.size(); ++i) {
auto pt = vertices[i] + Vector3d(0.0, outsideRevealDepth, 0.0);
pointEqual(pt, idf_vertices[i]);
}
}

ReverseTranslator reverseTranslator;
OptionalModel outModel = reverseTranslator.translateWorkspace(*outWorkspace);
OptionalModel outModel = reverseTranslator.translateWorkspace(workspace);
ASSERT_TRUE(outModel);

EXPECT_EQ(1u, outModel->getConcreteModelObjects<WindowPropertyFrameAndDivider>().size());
Expand All @@ -102,7 +141,7 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) {
vertices = testSubSurface->vertices();
ASSERT_EQ(4u, vertices.size());
EXPECT_DOUBLE_EQ(0.0, vertices[0].x());
EXPECT_DOUBLE_EQ(0.0, vertices[0].y());
EXPECT_DOUBLE_EQ(outsideRevealDepth, vertices[0].y());
EXPECT_DOUBLE_EQ(1.0, vertices[0].z());

testSubSurface = outModel->getConcreteModelObjectByName<SubSurface>("No Offset");
Expand Down

0 comments on commit cc9652f

Please sign in to comment.