Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix glass U factor sql error #4681

Merged
merged 12 commits into from
Sep 15, 2022
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Do not enable compiler specific extensions, for eg on GCC use -std=c++1z (=c++17) and not -std=gnu++17
set(CMAKE_CXX_EXTENSIONS OFF)

# Use ccache if available, has to be before "project()"
# Use ccache is available, has to be before "project()"
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
# Support Unix Makefiles and Ninja
Expand Down
109 changes: 36 additions & 73 deletions src/model/SubSurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,48 +338,30 @@ namespace model {
OptionalSqlFile sqlFile = model().sqlFile();
OptionalString constructionName = oConstruction->name();
OptionalDouble outputResult;
OptionalString subSurfaceName = name();

// opaque exterior
if (sqlFile && constructionName && oConstruction->isOpaque()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor with Film'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor with Film'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*subSurfaceName));
Comment on lines +345 to +352
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍 smart!

}

// fenestration
if (sqlFile && constructionName && oConstruction->isFenestration()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*subSurfaceName));
}

if (inputResult) {
Expand Down Expand Up @@ -408,51 +390,32 @@ namespace model {
OptionalSqlFile sqlFile = model().sqlFile();
OptionalString constructionName = oConstruction->name();
OptionalDouble outputResult;
OptionalString subSurfaceName = name();

// opaque exterior
if (sqlFile && constructionName && oConstruction->isOpaque()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor no Film'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor no Film'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*subSurfaceName));
}

// fenestration
if (sqlFile && constructionName && oConstruction->isFenestration()) {

// get u-factor, then subtract film coefficients

std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*subSurfaceName));

if (outputResult) {
outputResult = 1.0 / (1.0 / (*outputResult) - oSurface->filmResistance());
Expand Down
110 changes: 36 additions & 74 deletions src/model/Surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -620,48 +620,30 @@ namespace model {
OptionalSqlFile sqlFile = model().sqlFile();
OptionalString constructionName = oConstruction->name();
OptionalDouble outputResult;
OptionalString surfaceName = name();

// opaque exterior
if (sqlFile && constructionName && oConstruction->isOpaque()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor with Film'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor with Film'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*surfaceName));
}

// fenestration
if (sqlFile && constructionName && oConstruction->isFenestration()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*surfaceName));
}

if (inputResult) {
Expand Down Expand Up @@ -689,52 +671,32 @@ namespace model {
OptionalSqlFile sqlFile = model().sqlFile();
OptionalString constructionName = oConstruction->name();
OptionalDouble outputResult;
OptionalString surfaceName = name();

// opaque exterior
if (sqlFile && constructionName && oConstruction->isOpaque()) {
std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor no Film'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Opaque Exterior'
AND ColumnName = 'U-Factor no Film'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*surfaceName));
}

// fenestration
if (sqlFile && constructionName && oConstruction->isFenestration()) {

// get u-factor, then subtract film coefficients

std::string query = R"(SELECT RowId from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Construction'
AND Value = ?;)";
OptionalInt rowId = sqlFile->execAndReturnFirstInt(query, to_upper_copy(*constructionName));

if (rowId) {
// TODO: this is exactly the same as the uFactor one
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowId = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, *rowId);
}
std::string query = R"(SELECT Value from TabularDataWithStrings
WHERE ReportName = 'EnvelopeSummary'
AND ReportForString = 'Entire Facility'
AND TableName = 'Exterior Fenestration'
AND ColumnName = 'Glass U-Factor'
AND Units='W/m2-K'
AND RowName = ?;)";
outputResult = sqlFile->execAndReturnFirstDouble(query, to_upper_copy(*surfaceName));

if (outputResult) {
outputResult = 1.0 / (1.0 / (*outputResult) - filmResistance());
Expand Down
41 changes: 41 additions & 0 deletions src/model/test/SubSurface_GTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#include "../ShadingControl.hpp"
#include "../Model_Impl.hpp"
#include "../ThermalZone.hpp"
#include "../PlanarSurface.hpp"

#include "../../energyplus/ReverseTranslator.hpp"
#include "../../utilities/sql/SqlFile.hpp"
Expand Down Expand Up @@ -1565,3 +1566,43 @@ TEST_F(ModelFixture, 4403_FenestrationAssembly) {
ASSERT_TRUE(subSurface->assemblyVisibleTransmittance());
EXPECT_EQ(0.440, subSurface->assemblyVisibleTransmittance().get());
}

TEST_F(ModelFixture, 4678_SubSurfaceGlassUFactorSqlError) {
// Test for #4678 - Glass U Factor sql error

// This one has fenestration that includes WindowProperty:FrameAndDivider
openstudio::path idfPath = resourcesPath() / toPath("energyplus/FrameAndDivider/in.idf");
energyplus::ReverseTranslator reverseTranslator;
ASSERT_NO_THROW(reverseTranslator.loadModel(idfPath));
OptionalModel _model = reverseTranslator.loadModel(idfPath);
ASSERT_TRUE(_model);
Model model = _model.get();

openstudio::path sqlPath = resourcesPath() / toPath("energyplus/FrameAndDivider/eplusout.sql");
openstudio::SqlFile sqlFile = openstudio::SqlFile(sqlPath);
ASSERT_TRUE(sqlFile.connectionOpen());

model.setSqlFile(sqlFile);
ASSERT_TRUE(model.sqlFile());

OptionalSubSurface subSurface = model.getModelObjectByName<SubSurface>("Story 1 Core Space Exterior Wall Window");
ASSERT_TRUE(subSurface);

OptionalConstructionBase oConstruction = subSurface->construction();
OptionalSurface oSurface = subSurface->surface();

ASSERT_TRUE(oConstruction);
ASSERT_TRUE(oSurface);

EXPECT_FALSE(oConstruction->isOpaque());
EXPECT_TRUE(oConstruction->isFenestration());

ASSERT_TRUE(subSurface->uFactor());
double uFactor = subSurface->uFactor().get();
EXPECT_DOUBLE_EQ(2.559, uFactor);

double filmResistance = oSurface->filmResistance();
double thermalConductance = 1.0 / (1.0 / (uFactor)-filmResistance);
ASSERT_TRUE(subSurface->thermalConductance());
EXPECT_DOUBLE_EQ(thermalConductance, subSurface->thermalConductance().get());
}