TEST_F(EnergyPlusFixture,ReverseTranslator_ScheduleDayInterval) { // ScheduleDayInterval time entries contain the string 'Until: ' that must be // stripped off before constructing a Time object. We are also more lenient in // making this optional. Workspace ws(StrictnessLevel::Draft,IddFileType(IddFileType::EnergyPlus)); OptionalWorkspaceObject owo = ws.addObject(IdfObject(IddObjectType::Schedule_Day_Interval)); ASSERT_TRUE(owo); WorkspaceObject object = *owo; object.setName("Heating Setpoint Design Day"); StringVector groupValues(2u); groupValues[0] = std::string("Until: 12:00"); groupValues[1] = std::string("21.1"); object.pushExtensibleGroup(groupValues); groupValues[0] = std::string("24:00"); groupValues[1] = std::string("20.5"); object.pushExtensibleGroup(groupValues); ReverseTranslator translator; Model model = translator.translateWorkspace(ws); EXPECT_TRUE(translator.errors().empty()); // There are warnings related to ws being a partial model. EXPECT_TRUE(translator.untranslatedIdfObjects().empty()); ScheduleDayVector daySchedules = model.getModelObjects<ScheduleDay>(); ASSERT_EQ(1u,daySchedules.size()); ScheduleDay daySchedule = daySchedules[0]; DoubleVector values = daySchedule.values(); ASSERT_EQ(2u,values.size()); EXPECT_DOUBLE_EQ(21.1,values[0]); EXPECT_DOUBLE_EQ(20.5,values[1]); TimeVector times = daySchedule.times(); ASSERT_EQ(2u,times.size()); EXPECT_EQ(Time(0,12,0),times[0]); EXPECT_EQ(Time(0,24,0),times[1]); }
TEST_F(EnergyPlusFixture,ReverseTranslator_WindowConstruction) { StrictnessLevel level(StrictnessLevel::Draft); IddFileType iddFileType(IddFileType::EnergyPlus); Workspace workspace(level,iddFileType); IdfObject glazing(IddObjectType::WindowMaterial_Glazing); IdfObject gas(IddObjectType::WindowMaterial_Gas); glazing.setName("Glazing Material"); gas.setName("Gas Material"); IdfObject construction(IddObjectType::Construction); ASSERT_EQ(0u,construction.numExtensibleGroups()); EXPECT_FALSE(construction.pushExtensibleGroup(StringVector(1u,glazing.name().get())).empty()); EXPECT_FALSE(construction.pushExtensibleGroup(StringVector(1u,gas.name().get())).empty()); EXPECT_FALSE(construction.pushExtensibleGroup(StringVector(1u,glazing.name().get())).empty()); IdfObjectVector objects; objects.push_back(glazing); objects.push_back(gas); objects.push_back(construction); EXPECT_EQ(3u,workspace.addObjects(objects).size()); ReverseTranslator reverseTranslator; Model model = reverseTranslator.translateWorkspace(workspace); ASSERT_EQ(1u, model.getModelObjects<Construction>().size()); Construction mConstruction = model.getModelObjects<Construction>()[0]; EXPECT_EQ(3u,mConstruction.layers().size()); EXPECT_EQ(2u, model.getModelObjects<FenestrationMaterial>().size()); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_TranslateMasselessOpaqueMaterial) { // Initialize the workspace openstudio::Workspace ws(openstudio::StrictnessLevel::None, openstudio::IddFileType::EnergyPlus); // Create the Material:NoMaxx idfObject IdfObject idfObject( openstudio::IddObjectType::Material_NoMass ); idfObject.setString( 0, "Test Mat 1"); idfObject.setString( 1, "Rough" ); idfObject.setString( 2, "3.05" ); idfObject.setString( 3, "0.85" ); idfObject.setString( 4, "0.6" ); idfObject.setString( 5, "0.6" ); WorkspaceObject epMaterial = ws.addObject(idfObject).get(); ReverseTranslator trans; ASSERT_NO_THROW(trans.translateWorkspace(ws)); Model model = trans.translateWorkspace(ws); ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::MasslessOpaqueMaterial>().size()); openstudio::model::MasslessOpaqueMaterial mat = model.getModelObjects<openstudio::model::MasslessOpaqueMaterial>()[0]; EXPECT_EQ( "Rough", mat.roughness() ); EXPECT_EQ( 3.05, mat.thermalResistance() ); EXPECT_EQ( 0.85, mat.thermalAbsorptance() ); EXPECT_EQ( 0.6, mat.solarAbsorptance() ); EXPECT_EQ( 0.6, mat.visibleAbsorptance() ); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_TranslateSite) { openstudio::Workspace workspace(openstudio::StrictnessLevel::None,openstudio::IddFileType::EnergyPlus); openstudio::IdfObject idfObject( openstudio::IddObjectType::Site_Location ); idfObject.setString(Site_LocationFields::Name, "Test Site"); idfObject.setDouble(Site_LocationFields::Latitude, 39.6); idfObject.setDouble(Site_LocationFields::Longitude, 105.2); idfObject.setDouble(Site_LocationFields::TimeZone, -7.0); idfObject.setDouble(Site_LocationFields::Elevation, 1729.74); openstudio::WorkspaceObject epSite = workspace.addObject(idfObject).get(); ReverseTranslator trans; ASSERT_NO_THROW(trans.translateWorkspace(workspace)); Model model = trans.translateWorkspace(workspace); ASSERT_TRUE(model.getOptionalUniqueModelObject<openstudio::model::Site>()); openstudio::model::Site site = model.getUniqueModelObject<openstudio::model::Site>(); EXPECT_EQ( 7u, site.numFields()); // terrain moves from Building to Site in OS EXPECT_EQ( "Test Site", *(site.name()) ); EXPECT_EQ( 39.6, site.latitude() ); EXPECT_EQ( 105.2, site.longitude() ); EXPECT_EQ( -7.0, site.timeZone() ); EXPECT_EQ( 1729.74, site.elevation() ); EXPECT_EQ("Suburbs", site.terrain() ); // default value }
TEST_F(EnergyPlusFixture,ReverseTranslator_NewFileTemplate_LoadModel) { openstudio::path idfPath = resourcesPath() / openstudio::toPath("energyplus/NewFileTemplate.idf"); ReverseTranslator reverseTranslator; ASSERT_NO_THROW(reverseTranslator.loadModel(idfPath)); OptionalModel model = reverseTranslator.loadModel(idfPath); ASSERT_TRUE(model); }
TEST_F(EnergyPlusFixture,ReverseTranslator_Building) { Workspace inWorkspace(StrictnessLevel::None, IddFileType::EnergyPlus); inWorkspace.addObject(IdfObject(IddObjectType::Building)); ReverseTranslator reverseTranslator; Model model = reverseTranslator.translateWorkspace(inWorkspace); EXPECT_TRUE(model.getOptionalUniqueModelObject<openstudio::model::Building>()); }
TEST_F(EnergyPlusFixture,ReverseTranslator_NewFileTemplate) { openstudio::path idfPath = resourcesPath() / openstudio::toPath("energyplus/NewFileTemplate.idf"); OptionalIdfFile idfFile = IdfFile::load(idfPath, IddFileType::EnergyPlus); ASSERT_TRUE(idfFile); Workspace inWorkspace(*idfFile); ReverseTranslator reverseTranslator; ASSERT_NO_THROW(reverseTranslator.translateWorkspace(inWorkspace)); Model model = reverseTranslator.translateWorkspace(inWorkspace); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_SmallOffice) { openstudio::path p = resourcesPath() / toPath("resultsviewer/SmallOffice/SmallOffice.idf"); Workspace ws = Workspace::load(p).get(); ReverseTranslator rt; Model model = rt.translateWorkspace(ws); OptionalSubSurface osub = model.getModelObjectByName<SubSurface>("Perimeter_ZN_1_wall_south_door"); ASSERT_TRUE(osub); EXPECT_EQ("GlassDoor",osub->subSurfaceType()); }
boost::optional<openstudio::model::Model> loadAndTranslateIdf(const openstudio::path& path) { boost::optional<openstudio::model::Model> result; boost::optional<openstudio::Workspace> workspace = openstudio::Workspace::load(path); if (workspace){ ReverseTranslator rt; result = rt.translateWorkspace(*workspace); } return result; }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_LargeOffice) { openstudio::path inputPath = resourcesPath() / openstudio::toPath("energyplus/RefLargeOffice/RefBldgLargeOfficeNew2004_Chicago.idf"); Workspace ws = Workspace::load(inputPath).get(); ReverseTranslator rt; Model model = rt.translateWorkspace(ws); // surface named "Core_top_ZN_5_Floor" should have "Adiabatic" string for outsideBoundaryCondition OptionalSurface osurf = model.getModelObjectByName<Surface>("Core_top_ZN_5_Floor"); ASSERT_TRUE(osurf); EXPECT_EQ("Adiabatic",osurf->outsideBoundaryCondition()); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_TranslateScheduleCompact) { openstudio::Workspace workspace(openstudio::StrictnessLevel::None,openstudio::IddFileType::EnergyPlus); openstudio::IdfObject idfObject( openstudio::IddObjectType::Schedule_Compact ); idfObject.setString(1,"Fraction"); idfObject.setString(2,"Through: 12/31"); idfObject.setString(3,"For: Weekdays SummerDesignDay"); idfObject.setString(4,"Until: 08:00"); idfObject.setString(5,"0.0"); idfObject.setString(6,"Until: 18:00"); idfObject.setString(7,"1.0"); idfObject.setString(8,"Until: 24:00"); idfObject.setString(9,"0.0"); idfObject.setString(10,"For: Weekends WinterDesignDay"); idfObject.setString(11,"Until: 10:00"); idfObject.setString(12,"0.0"); idfObject.setString(13,"Until: 16:00"); idfObject.setString(14,"1.0"); idfObject.setString(15,"Until: 24:00"); idfObject.setString(16,"0.0"); idfObject.setString(17,"For: Holidays AllOtherDays"); idfObject.setString(18,"Until: 24:00"); idfObject.setString(19,"0.0"); WorkspaceObject epScheduleCompact = workspace.addObject(idfObject).get(); ReverseTranslator trans; ASSERT_NO_THROW(trans.translateWorkspace(workspace)); Model model = trans.translateWorkspace(workspace); ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::ScheduleCompact>().size()); openstudio::model::ScheduleCompact scheduleCompact = model.getModelObjects<openstudio::model::ScheduleCompact>()[0]; EXPECT_EQ(unsigned(20),epScheduleCompact.numFields()); EXPECT_EQ(unsigned(21),scheduleCompact.numFields()); // has handle field ASSERT_EQ(epScheduleCompact.numFields() + 1u,scheduleCompact.numFields()); ASSERT_TRUE(epScheduleCompact.name()); ASSERT_TRUE(scheduleCompact.name()); EXPECT_EQ(epScheduleCompact.name().get(),scheduleCompact.name().get()); for( unsigned i = 1; i < epScheduleCompact.numFields(); i++ ) { boost::optional<std::string> s1 = epScheduleCompact.getString(i); boost::optional<std::string> s2 = scheduleCompact.getString(i+1); ASSERT_TRUE(s1); ASSERT_TRUE(s2); EXPECT_EQ(s1.get(),s2.get()); } }
TEST_F(EnergyPlusFixture,ReverseTranslator_DaylightingOffice) { openstudio::path idfPath = resourcesPath() / toPath("energyplus/Daylighting_Office/in.idf"); OptionalIdfFile idfFile = IdfFile::load(idfPath, IddFileType::EnergyPlus); ASSERT_TRUE(idfFile); Workspace inWorkspace(*idfFile); ReverseTranslator reverseTranslator; Model model = reverseTranslator.translateWorkspace(inWorkspace); model.save( resourcesPath() / toPath("energyplus/Daylighting_Office/in.osm"), true); ForwardTranslator forwardTranslator; Workspace workspace = forwardTranslator.translateModel(model); workspace.save( resourcesPath() / toPath("energyplus/Daylighting_Office/in2.idf"), true); }
TEST_F(EnergyPlusFixture,ReverseTranslator_SimpleRelativeTest) { openstudio::path idfPath = resourcesPath() / toPath("energyplus/SimpleSurfaces/SimpleSurfaces_Relative.idf"); OptionalIdfFile idfFile = IdfFile::load(idfPath, IddFileType::EnergyPlus); ASSERT_TRUE(idfFile); Workspace inWorkspace(*idfFile); ReverseTranslator reverseTranslator; Model model = reverseTranslator.translateWorkspace(inWorkspace); model.save( resourcesPath() / toPath("energyplus/SimpleSurfaces/SimpleSurfaces_Relative.osm"), true); ForwardTranslator forwardTranslator; Workspace workspace = forwardTranslator.translateModel(model); workspace.save( resourcesPath() / toPath("energyplus/SimpleSurfaces/SimpleSurfaces_Relative2.idf"), true); }
TEST_F(EnergyPlusFixture,ReverseTranslator_EmptyIdfFile) { Workspace inWorkspace(StrictnessLevel::Draft,IddFileType::EnergyPlus); ReverseTranslator reverseTranslator; Model model = reverseTranslator.translateWorkspace(inWorkspace); OptionalWorkspaceObject w = inWorkspace.addObject(IdfObject(IddObjectType::Version)); ASSERT_TRUE(w); EXPECT_TRUE(w->setString(VersionFields::VersionIdentifier, "7.0")); model = reverseTranslator.translateWorkspace(inWorkspace); EXPECT_TRUE(w->setString(VersionFields::VersionIdentifier, "5.0")); model = reverseTranslator.translateWorkspace(inWorkspace); }
TEST_F(EnergyPlusFixture, ReverseTranslator_OtherEquipment) { Workspace ws(StrictnessLevel::Draft,IddFileType(IddFileType::EnergyPlus)); OptionalWorkspaceObject owo = ws.addObject(IdfObject(IddObjectType::OtherEquipment)); ASSERT_TRUE(owo); WorkspaceObject object = *owo; object.setName("Other Eq 1"); object.setString(OtherEquipmentFields::EndUseSubcategory, "Category A"); ReverseTranslator trans; Model model = trans.translateWorkspace(ws); OtherEquipmentVector otherEquipments = model.getModelObjects<OtherEquipment>(); ASSERT_EQ(1u, otherEquipments.size()); EXPECT_EQ(otherEquipments[0].name().get(), "Other Eq 1"); EXPECT_EQ(otherEquipments[0].endUseSubcategory(), "Category A"); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_ZoneBoundaryCondition) { openstudio::path inputPath = resourcesPath() / openstudio::toPath("energyplus/ZoneBoundaryCondition/Bug_486_zone_bdr_test.idf"); Workspace ws = Workspace::load(inputPath).get(); ReverseTranslator rt; Model model = rt.translateWorkspace(ws); // surface named "1AF737" should have "surface" string for OutsideBoundaryCondition OptionalSurface osurf_a = model.getModelObjectByName<Surface>("1AF737"); ASSERT_TRUE(osurf_a); EXPECT_EQ("Surface",osurf_a->outsideBoundaryCondition()); // and the parent of the "outsideBoundaryObject" should be space named "8B02A8" OptionalSurface osurf_b = osurf_a->adjacentSurface(); ASSERT_TRUE(osurf_b); OptionalSpace ospace_b = osurf_b->space(); ASSERT_TRUE(ospace_b); EXPECT_EQ("8B02A8",ospace_b->name().get()); // confirm that surf_b has surf_a as outside boundary object ASSERT_TRUE(osurf_b->adjacentSurface()); EXPECT_EQ(osurf_a->handle(),osurf_b->adjacentSurface()->handle()); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_TranslateConstruction) { // Initialize the workspace from a file containing a Construction and two Materials openstudio::path idfPath = resourcesPath() / openstudio::toPath("energyplus/TranslatorV2_Tests/Simple_Construction.idf"); OptionalIdfFile idfFile = IdfFile::load(idfPath, IddFileType::EnergyPlus); ASSERT_TRUE(idfFile); Workspace inWorkspace(*idfFile); ReverseTranslator trans; ASSERT_NO_THROW(trans.translateWorkspace(inWorkspace)); Model model = trans.translateWorkspace(inWorkspace); boost::optional<openstudio::model::Construction> construction = model.getModelObjectByName<openstudio::model::Construction>("Metal Building_NR_Roof"); ASSERT_TRUE( construction ); ASSERT_EQ( "Metal Roofing", *((construction->getLayer(0)).name()) ); ASSERT_EQ( "Roof Insulation [55]", *((construction->getLayer(1)).name()) ); }
TEST_F(gbXMLFixture, ForwardTranslator_exampleModel) { Model model = exampleModel(); path p = resourcesPath() / openstudio::toPath("gbxml/exampleModel.xml"); ForwardTranslator forwardTranslator; bool test = forwardTranslator.modelToGbXML(model, p); EXPECT_TRUE(test); ReverseTranslator reverseTranslator; boost::optional<Model> model2 = reverseTranslator.loadModel(p); ASSERT_TRUE(model2); path p1 = resourcesPath() / openstudio::toPath("gbxml/exampleModel.osm"); model.save(p1, true); path p2 = resourcesPath() / openstudio::toPath("gbxml/exampleModel2.osm"); model2->save(p2, true); }
TEST_F(EnergyPlusFixture,ReverseTranslatorTest_TranslateStandardOpaqueMaterial) { openstudio::Workspace workspace(openstudio::StrictnessLevel::None,openstudio::IddFileType::EnergyPlus); openstudio::IdfObject idfObject( openstudio::IddObjectType::Material ); idfObject.setString(0, "Test Material"); // Name idfObject.setString(1, "Smooth"); // Roughness idfObject.setString(2, "0.012"); // Thickness idfObject.setString(3, "3.2"); // Conductivity idfObject.setString(4, "2.5"); // Density idfObject.setString(5, "2.04"); // Specific Heat idfObject.setString(6, "0.8"); // Thermal Absorptance idfObject.setString(7, "0.6"); // Solar Absorptance idfObject.setString(8, "0.6"); // Visible Absorptance openstudio::WorkspaceObject epMaterial = workspace.addObject(idfObject).get(); ReverseTranslator trans; ASSERT_NO_THROW(trans.translateWorkspace(workspace)); Model model = trans.translateWorkspace(workspace); ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::StandardOpaqueMaterial>().size()); openstudio::model::StandardOpaqueMaterial mat = model.getModelObjects<openstudio::model::StandardOpaqueMaterial>()[0]; EXPECT_EQ( unsigned(10), mat.numFields()); EXPECT_EQ( "Test Material", *(mat.name()) ); EXPECT_EQ( "Smooth", mat.roughness()); EXPECT_EQ( 0.012, mat.thickness()); EXPECT_EQ( 3.2, mat.thermalConductivity()); EXPECT_EQ( 2.5, mat.density()); EXPECT_EQ( 2.04, mat.specificHeat()); EXPECT_EQ( 0.8, mat.thermalAbsorptance()); EXPECT_EQ( 0.6, mat.solarAbsorptance()); EXPECT_EQ( 0.6, mat.visibleAbsorptance()); }
TEST_F(EnergyPlusFixture,ReverseTranslator_Zone) { Workspace inWorkspace(StrictnessLevel::None, IddFileType::EnergyPlus); OptionalWorkspaceObject zoneObject = inWorkspace.addObject(IdfObject(IddObjectType::Zone)); ASSERT_TRUE(zoneObject); OptionalWorkspaceObject lightsObject = inWorkspace.addObject(IdfObject(IddObjectType::Lights)); ASSERT_TRUE(lightsObject); EXPECT_TRUE(lightsObject->setPointer(openstudio::LightsFields::ZoneorZoneListName, zoneObject->handle())); ReverseTranslator reverseTranslator; ASSERT_NO_THROW(reverseTranslator.translateWorkspace(inWorkspace)); Model model = reverseTranslator.translateWorkspace(inWorkspace); ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::ThermalZone>().size()); openstudio::model::ThermalZone zone = model.getModelObjects<openstudio::model::ThermalZone>()[0]; ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::Space>().size()); openstudio::model::Space space = model.getModelObjects<openstudio::model::Space>()[0]; ASSERT_EQ(static_cast<unsigned>(1), model.getModelObjects<openstudio::model::Lights>().size()); openstudio::model::Lights lights = model.getModelObjects<openstudio::model::Lights>()[0]; ASSERT_TRUE(lights.space()); EXPECT_TRUE(space.handle() == lights.space()->handle()); ASSERT_TRUE(lights.space()->thermalZone()); EXPECT_TRUE(zone.handle() == lights.space()->thermalZone()->handle()); }
TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) { Model model; ThermalZone thermalZone(model); Space space(model); std::vector<Point3d> vertices; vertices.push_back(Point3d(0, 0, 10)); vertices.push_back(Point3d(0, 0, 0)); vertices.push_back(Point3d(10, 0, 0)); vertices.push_back(Point3d(10, 0, 10)); Surface surface(vertices, model); vertices.clear(); vertices.push_back(Point3d(0, 0, 1)); vertices.push_back(Point3d(0, 0, 0)); vertices.push_back(Point3d(1, 0, 0)); vertices.push_back(Point3d(1, 0, 1)); SubSurface subSurface1(vertices, model); subSurface1.setName("No Offset"); SubSurface subSurface2(vertices, model); subSurface2.setName("Offset"); Vector3d normal = subSurface1.outwardNormal(); EXPECT_DOUBLE_EQ(0.0, normal.x()); EXPECT_DOUBLE_EQ(-1.0, normal.y()); EXPECT_DOUBLE_EQ(0.0, normal.z()); WindowPropertyFrameAndDivider frameAndDivider(model); frameAndDivider.setOutsideRevealDepth(1.0); subSurface2.setWindowPropertyFrameAndDivider(frameAndDivider); subSurface2.setName("Offset"); ForwardTranslator forwardTranslator; OptionalWorkspace outWorkspace = forwardTranslator.translateModel(model); ASSERT_TRUE(outWorkspace); ReverseTranslator reverseTranslator; OptionalModel outModel = reverseTranslator.translateWorkspace(*outWorkspace); ASSERT_TRUE(outModel); EXPECT_EQ(1u, outModel->getConcreteModelObjects<WindowPropertyFrameAndDivider>().size()); boost::optional<SubSurface> testSubSurface = outModel->getModelObjectByName<SubSurface>("Offset"); ASSERT_TRUE(testSubSurface); EXPECT_TRUE(testSubSurface->windowPropertyFrameAndDivider()); vertices = testSubSurface->vertices(); ASSERT_EQ(4u, vertices.size()); EXPECT_DOUBLE_EQ(0.0, vertices[0].x()); EXPECT_DOUBLE_EQ(1.0, vertices[0].y()); EXPECT_DOUBLE_EQ(1.0, vertices[0].z()); testSubSurface = outModel->getModelObjectByName<SubSurface>("No Offset"); ASSERT_TRUE(testSubSurface); EXPECT_FALSE(testSubSurface->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(1.0, vertices[0].z()); }