Skip to content

Commit

Permalink
Merge pull request #4681 from NREL/sql-fixes
Browse files Browse the repository at this point in the history
Fix glass U factor sql error
  • Loading branch information
jmarrec committed Sep 15, 2022
2 parents ec3644b + a092a80 commit b902c85
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 148 deletions.
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));
}

// 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());
}

0 comments on commit b902c85

Please sign in to comment.