mirror of
https://rs-loy-gitlab.concordia.ca/PMAU/DynamicBuildingSimulation.git
synced 2024-11-14 23:10:28 -05:00
setup structure
This commit is contained in:
parent
a23cb89522
commit
d1b8657d36
72
data/us_archetypes.xml
Normal file
72
data/us_archetypes.xml
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<archetypes reference_library_name="us_library" >
|
||||
<archetype id="1" name="archetype 1" year_of_construction_reference="2004" building_type="1" climate_zone="10">
|
||||
<constructions>
|
||||
<construction id="1" type="exterior wall" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
<construction id="3" type="exterior slab" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
<construction id="5" type="roof" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
</constructions>
|
||||
<average_store_height units="m">1</average_store_height>
|
||||
<number_of_storeys units="-">2</number_of_storeys>
|
||||
<thermal_capacity units="kJ/K m2">3</thermal_capacity>
|
||||
<extra_loses_due_to_thermal_bridges units="W/K m2">4</extra_loses_due_to_thermal_bridges>
|
||||
<indirect_heated_ratio units="-">5</indirect_heated_ratio>
|
||||
<infiltration_rate_for_ventilation_system_off units="ACH">6</infiltration_rate_for_ventilation_system_off>
|
||||
<infiltration_rate_for_ventilation_system_on units="ACH">7</infiltration_rate_for_ventilation_system_on>
|
||||
</archetype>
|
||||
<archetype id="2" name="archetype 2" year_of_construction_reference="2009" building_type="2" climate_zone="10">
|
||||
<constructions>
|
||||
<construction id="2" type="exterior wall" >
|
||||
<window_ratio units="-">0.3</window_ratio>
|
||||
<window>3</window>
|
||||
</construction>
|
||||
<construction id="3" type="exterior slab">
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
<construction id="4" type="roof" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
</constructions>
|
||||
<average_store_height units="m">3.6</average_store_height>
|
||||
<number_of_storeys units="-">3</number_of_storeys>
|
||||
<thermal_capacity units="kJ/K m2">3.6</thermal_capacity>
|
||||
<extra_loses_due_to_thermal_bridges units="W/K m2">0.3</extra_loses_due_to_thermal_bridges>
|
||||
<indirect_heated_ratio units="-">0.2</indirect_heated_ratio>
|
||||
<infiltration_rate_for_ventilation_system_off units="ACH">1</infiltration_rate_for_ventilation_system_off>
|
||||
<infiltration_rate_for_ventilation_system_on units="ACH">0.2</infiltration_rate_for_ventilation_system_on>
|
||||
</archetype>
|
||||
<archetype id="3" name="archetype 3" year_of_construction_reference="2009" building_type="1" climate_zone="10">
|
||||
<constructions>
|
||||
<construction id="2" type="exterior wall" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
<construction id="3" type="exterior slab" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
<construction id="4" type="roof" >
|
||||
<window_ratio units="-">0</window_ratio>
|
||||
<window/>
|
||||
</construction>
|
||||
</constructions>
|
||||
<average_store_height units="m">3.6</average_store_height>
|
||||
<number_of_storeys units="-">3</number_of_storeys>
|
||||
<thermal_capacity units="kJ/K m2">3.6</thermal_capacity>
|
||||
<extra_loses_due_to_thermal_bridges units="W/K m2">0.3</extra_loses_due_to_thermal_bridges>
|
||||
<indirect_heated_ratio units="-">0.2</indirect_heated_ratio>
|
||||
<infiltration_rate_for_ventilation_system_off units="ACH">1</infiltration_rate_for_ventilation_system_off>
|
||||
<infiltration_rate_for_ventilation_system_on units="ACH">0.2</infiltration_rate_for_ventilation_system_on>
|
||||
</archetype>
|
||||
</archetypes>
|
551
data/us_library.xml
Normal file
551
data/us_library.xml
Normal file
|
@ -0,0 +1,551 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<library name="us_library">
|
||||
<windows>
|
||||
<window type="skylight" id="1" name="189.1-2009 Nonres 4B Skylight without Curb">
|
||||
<shgc>0.32</shgc>
|
||||
<frame_ratio units="-">0</frame_ratio>
|
||||
<thickness units="m">0.003</thickness>
|
||||
<solar_transmittance_at_normal_incidence units="-">0.301483</solar_transmittance_at_normal_incidence>
|
||||
<front_side_solar_transmittance_at_normal_incidence units="-">0.648517</front_side_solar_transmittance_at_normal_incidence>
|
||||
<back_side_solar_transmittance_at_normal_incidence units="-">0.648517</back_side_solar_transmittance_at_normal_incidence>
|
||||
<conductivity units="W/m K">0.0133144</conductivity>
|
||||
</window>
|
||||
<window type="skylight" id="2" name="90.1-2004 Nonres 4B Skylight without Curb">
|
||||
<shgc>0.49</shgc>
|
||||
<frame_ratio units="-">0</frame_ratio>
|
||||
<thickness units="m">0.003</thickness>
|
||||
<solar_transmittance_at_normal_incidence units="-">0.481761</solar_transmittance_at_normal_incidence>
|
||||
<front_side_solar_transmittance_at_normal_incidence units="-">0.468239</front_side_solar_transmittance_at_normal_incidence>
|
||||
<back_side_solar_transmittance_at_normal_incidence units="-">0.468239</back_side_solar_transmittance_at_normal_incidence>
|
||||
<conductivity units="W/m K">0.03026</conductivity>
|
||||
</window>
|
||||
<window type="window" id="3" name="189.1-2009 Nonres 4B Window Nonmetal framing">
|
||||
<shgc>0.35</shgc>
|
||||
<frame_ratio units="-">0</frame_ratio>
|
||||
<thickness units="m">0.003</thickness>
|
||||
<solar_transmittance_at_normal_incidence units="-">0.328881</solar_transmittance_at_normal_incidence>
|
||||
<front_side_solar_transmittance_at_normal_incidence units="-">0.621119</front_side_solar_transmittance_at_normal_incidence>
|
||||
<back_side_solar_transmittance_at_normal_incidence units="-">0.621119</back_side_solar_transmittance_at_normal_incidence>
|
||||
<conductivity units="W/m K">0.0071399</conductivity>
|
||||
</window>
|
||||
<window type="window" id="4" name="90.1-2004 Nonres 4B Window Fixed">
|
||||
<shgc>0.36</shgc>
|
||||
<frame_ratio units="-">0</frame_ratio>
|
||||
<thickness units="m">0.003</thickness>
|
||||
<solar_transmittance_at_normal_incidence units="-">0.354957</solar_transmittance_at_normal_incidence>
|
||||
<front_side_solar_transmittance_at_normal_incidence units="-">0.595043</front_side_solar_transmittance_at_normal_incidence>
|
||||
<back_side_solar_transmittance_at_normal_incidence units="-">0.595043</back_side_solar_transmittance_at_normal_incidence>
|
||||
<conductivity units="W/m K">0.0134755</conductivity>
|
||||
</window>
|
||||
</windows>
|
||||
<materials>
|
||||
<material id="1" name="MAT-CC05 8 HW CONCRETE">
|
||||
<conductivity units="W/m K">1.311</conductivity>
|
||||
<density units="kg/m3">2240</density>
|
||||
<specific_heat units="J/kg K">836.8</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="2" name="CP02 CARPET PAD">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.21648</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.8</visible_absorptance>
|
||||
</material>
|
||||
<material id="3" name="Floor Insulation [4]">
|
||||
<conductivity units="W/m K">0.045</conductivity>
|
||||
<density units="kg/m3">265</density>
|
||||
<specific_heat units="J/kg K">836.8</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="4" name="1IN Stucco">
|
||||
<conductivity units="W/m K">0.6918</conductivity>
|
||||
<density units="kg/m3">1858</density>
|
||||
<specific_heat units="J/kg K">837</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.92</solar_absorptance>
|
||||
<visible_absorptance units="-">0.92</visible_absorptance>
|
||||
</material>
|
||||
<material id="5" name="8IN Concrete HW">
|
||||
<conductivity units="W/m K">1.7296</conductivity>
|
||||
<density units="kg/m3">2243</density>
|
||||
<specific_heat units="J/kg K">837</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.65</solar_absorptance>
|
||||
<visible_absorptance units="-">0.65</visible_absorptance>
|
||||
</material>
|
||||
<material id="6" name="Wall Insulation [37]">
|
||||
<conductivity units="W/m K">0.0432</conductivity>
|
||||
<density units="kg/m3">91</density>
|
||||
<specific_heat units="J/kg K">837</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.5</solar_absorptance>
|
||||
<visible_absorptance units="-">0.5</visible_absorptance>
|
||||
</material>
|
||||
<material id="7" name="1/2IN Gypsum">
|
||||
<conductivity units="W/m K">0.16</conductivity>
|
||||
<density units="kg/m3">784.9</density>
|
||||
<specific_heat units="J/kg K">830</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.92</solar_absorptance>
|
||||
<visible_absorptance units="-">0.92</visible_absorptance>
|
||||
</material>
|
||||
<material id="8" name="Wood Siding">
|
||||
<conductivity units="W/m K">0.11</conductivity>
|
||||
<density units="kg/m3">544.62</density>
|
||||
<specific_heat units="J/kg K">1210</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.78</solar_absorptance>
|
||||
<visible_absorptance units="-">0.78</visible_absorptance>
|
||||
</material>
|
||||
<material id="9" name="Wood Shingles">
|
||||
<conductivity units="W/m K">0.115</conductivity>
|
||||
<density units="kg/m3">513</density>
|
||||
<specific_heat units="J/kg K">1255</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.78</solar_absorptance>
|
||||
<visible_absorptance units="-">0.78</visible_absorptance>
|
||||
</material>
|
||||
<material id="10" name="1IN Wood Decking">
|
||||
<conductivity units="W/m K">0.1211</conductivity>
|
||||
<density units="kg/m3">593</density>
|
||||
<specific_heat units="J/kg K">2510</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.78</solar_absorptance>
|
||||
<visible_absorptance units="-">0.78</visible_absorptance>
|
||||
</material>
|
||||
<material id="11" name="Roof Insulation [23]">
|
||||
<conductivity units="W/m K">0.049</conductivity>
|
||||
<density units="kg/m3">265</density>
|
||||
<specific_heat units="J/kg K">836.8</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="12" name="MAT-SHEATH">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.36256</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="13" name="MAT-SHEATH">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.36256</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="14" name="Metal Decking">
|
||||
<conductivity units="W/m K">45.006</conductivity>
|
||||
<density units="kg/m3">7680</density>
|
||||
<specific_heat units="J/kg K">418.4</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.3</visible_absorptance>
|
||||
</material>
|
||||
<material id="15" name="Roof Membrane">
|
||||
<conductivity units="W/m K">0.16</conductivity>
|
||||
<density units="kg/m3">1121.29</density>
|
||||
<specific_heat units="J/kg K">1460</specific_heat>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="16" name="CP02 CARPET PAD">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.21648</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.8</visible_absorptance>
|
||||
</material>
|
||||
<material id="17" name="MAT-SHEATH">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.36256</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="18" name="CP02 CARPET PAD">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.21648</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.8</visible_absorptance>
|
||||
</material>
|
||||
<material id="19" name="MAT-SHEATH">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.36256</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.7</visible_absorptance>
|
||||
</material>
|
||||
<material id="20" name="CP02 CARPET PAD">
|
||||
<no_mass>true</no_mass>
|
||||
<thermal_resistance units="m2 K/W">0.21648</thermal_resistance>
|
||||
<thermal_absorptance units="-">0.9</thermal_absorptance>
|
||||
<solar_absorptance units="-">0.7</solar_absorptance>
|
||||
<visible_absorptance units="-">0.8</visible_absorptance>
|
||||
</material>
|
||||
</materials>
|
||||
<constructions>
|
||||
<construction type="interior slab" id="1" name="189.1-2009 Nonres 4B Exposed Floor Mass">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.0795397</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.20321</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>2</material>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="2" name="189.1-2009 Nonres 4B Ext Wall Mass">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>4</material>
|
||||
<thickness units="m">0.0253</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>5</material>
|
||||
<thickness units="m">0.2033</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>6</material>
|
||||
<thickness units="m">0.0680962</thickness>
|
||||
</layer>
|
||||
<layer id="4" name="Layer 4">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="3" name="90.1-2004 Nonres 4B Ext Wall Wood-Framed and Other">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>8</material>
|
||||
<thickness units="m">0.01</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.0746874</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="4" name="189.1-2009 Nonres 4B Roof Attic and Other">
|
||||
<outside_solar_absorptance units="-">0.78</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.78</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>9</material>
|
||||
<thickness units="m">0.0178</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>10</material>
|
||||
<thickness units="m">0.0254</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.375211</thickness>
|
||||
</layer>
|
||||
<layer id="4" name="Layer 4">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="5" name="90.1-2004 Nonres 4B Roof Attic and Other">
|
||||
<outside_solar_absorptance units="-">0.78</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.78</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>9</material>
|
||||
<thickness units="m">0.0178</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>10</material>
|
||||
<thickness units="m">0.0254</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.221604</thickness>
|
||||
</layer>
|
||||
<layer id="4" name="Layer 4">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="6" name="189.1-2009 Nonres 4B Ext Wall Steel-Framed">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>12</material>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.118387</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="7" name="189.1-2009 Nonres 4B Ext Slab Unheated - 8in Slab without Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.20321</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="8" name="90.1-2004 Nonres 4B Ext Wall Steel-Framed">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>13</material>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.0373223</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="9" name="189.1-2009 Nonres 4B Roof IEAD">
|
||||
<outside_solar_absorptance units="-">0.7</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.7</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>15</material>
|
||||
<thickness units="m">0.0095</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.210538</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>14</material>
|
||||
<thickness units="m">0.001524</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="10" name="189.1-2009 Nonres 4B Ext Slab Unheated - 4in Slab without Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.1016</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="11" name="189.1-2009 Nonres 4B Roof Metal Building">
|
||||
<outside_solar_absorptance units="-">0.7</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.3</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>14</material>
|
||||
<thickness units="m">0.001524</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.23578</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="12" name="189.1-2009 Nonres 4B Ext Slab Unheated - 4in Slab with Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.1016</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>16</material>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="13" name="90.1-2004 Nonres 4B Ext Wall Mass">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>4</material>
|
||||
<thickness units="m">0.0253</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>5</material>
|
||||
<thickness units="m">0.2033</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>6</material>
|
||||
<thickness units="m">0.0338606</thickness>
|
||||
</layer>
|
||||
<layer id="4" name="Layer 4">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="14" name="90.1-2004 Nonres 4B Roof Metal Building">
|
||||
<outside_solar_absorptance units="-">0.7</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.3</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>14</material>
|
||||
<thickness units="m">0.001524</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.123533</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="15" name="189.1-2009 Res 4B Ext Wall Steel-Framed">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>17</material>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.118387</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="16" name="189.1-2009 Nonres 4B Ext Wall Wood-Framed and Other">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>8</material>
|
||||
<thickness units="m">0.01</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.110422</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="roof" id="17" name="90.1-2004 Nonres 4B Roof IEAD">
|
||||
<outside_solar_absorptance units="-">0.7</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.7</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>15</material>
|
||||
<thickness units="m">0.0095</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>11</material>
|
||||
<thickness units="m">0.124958</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>14</material>
|
||||
<thickness units="m">0.001524</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="interior slab" id="18" name="90.1-2004 Nonres 4B Exposed Floor Mass">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.0463846</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.20321</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>18</material>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior wall" id="19" name="90.1-2004 Res 4B Ext Wall Steel-Framed">
|
||||
<outside_solar_absorptance units="-">0.92</outside_solar_absorptance>
|
||||
<outside_thermal_absorptance units="-">0.9</outside_thermal_absorptance>
|
||||
<outside_visible_absorptance units="-">0.92</outside_visible_absorptance>
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>19</material>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>3</material>
|
||||
<thickness units="m">0.0971136</thickness>
|
||||
</layer>
|
||||
<layer id="3" name="Layer 3">
|
||||
<material>7</material>
|
||||
<thickness units="m">0.01271</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="20" name="90.1-2004 Nonres 4B Ext Slab Unheated - 8in Slab without Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.20321</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="21" name="90.1-2004 Nonres 4B Ext Slab Unheated - 4in Slab without Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.1016</thickness>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
<construction type="exterior slab" id="22" name="90.1-2004 Nonres 4B Ext Slab Unheated - 4in Slab with Carpet">
|
||||
<layers>
|
||||
<layer id="1" name="Layer 1">
|
||||
<material>1</material>
|
||||
<thickness units="m">0.1016</thickness>
|
||||
</layer>
|
||||
<layer id="2" name="Layer 2">
|
||||
<material>20</material>
|
||||
</layer>
|
||||
</layers>
|
||||
</construction>
|
||||
</constructions>
|
||||
</library>
|
116
examples/KIT_LoD1/FZK-Haus-LoD1-KIT-IAI-KHH-B36-V1.gml
Normal file
116
examples/KIT_LoD1/FZK-Haus-LoD1-KIT-IAI-KHH-B36-V1.gml
Normal file
|
@ -0,0 +1,116 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Generated by: --><!-- IFC -> cityGML Converter --><!-- (C) - Institute for Applied Computer Science --><!-- Forschungszentrum Karlsruhe --><!-- Not for commercial use --><!-- Generated by: IfcExplorer--><!-- cityGML Schema: 1.0.0 --><!-- Level of Detail 1--><!-- Creation Date: Tuesday, 23 November 2010 - 10:37:59--><!-- Edited Manually in Oxygen 8.2 --><!-- Modified by GMLOffset.xslt at Mon Dec 6 2010 --><!-- Version 2 Building located in the area of KIT Campus North)--><!-- Modified by GMLOffset.xslt at Wed Dec 8 2010 --><!-- Modified by GMLOffset.xslt at Wed Mar 29 2017 --><core:CityModel xsi:schemaLocation="http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns="http://www.opengis.net/citygml/profiles/base/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<!-- Manually edited by KHH 23.01.2017, CityGML 2.0, Address added, roof edge added -->
|
||||
<gml:name>AC14-FZK-Haus</gml:name>
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsDimension="3" srsName="urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH">
|
||||
<gml:lowerCorner srsDimension="3">457842 5439083 111.8 </gml:lowerCorner>
|
||||
<gml:upperCorner srsDimension="3">457854 5439093 118.317669 </gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<core:cityObjectMember>
|
||||
<bldg:Building gml:id="UUID_d281adfc-4901-0f52-540b-4cc1a9325f82">
|
||||
<gml:description>FZK-Haus (Forschungszentrum Karlsruhe, now KIT), created by Karl-Heinz
|
||||
Haefele </gml:description>
|
||||
<gml:name>AC14-FZK-Haus</gml:name>
|
||||
<core:creationDate>2017-01-23</core:creationDate>
|
||||
<core:relativeToTerrain>entirelyAboveTerrain</core:relativeToTerrain>
|
||||
<gen:measureAttribute name="GrossPlannedArea">
|
||||
<gen:value uom="m2">120.00</gen:value>
|
||||
</gen:measureAttribute>
|
||||
<gen:stringAttribute name="ConstructionMethod">
|
||||
<gen:value>New Building</gen:value>
|
||||
</gen:stringAttribute>
|
||||
<gen:stringAttribute name="IsLandmarked">
|
||||
<gen:value>NO</gen:value>
|
||||
</gen:stringAttribute>
|
||||
<bldg:class codeSpace="http://www.sig3d.org/codelists/citygml/2.0/building/2.0/_AbstractBuilding_class.xml">1000</bldg:class>
|
||||
<bldg:function codeSpace="http://www.sig3d.org/codelists/citygml/2.0/building/2.0/_AbstractBuilding_function.xml">1000</bldg:function>
|
||||
<bldg:usage codeSpace="http://www.sig3d.org/codelists/citygml/2.0/building/2.0/_AbstractBuilding_usage.xml">1000</bldg:usage>
|
||||
<bldg:yearOfConstruction>2020</bldg:yearOfConstruction>
|
||||
<bldg:roofType codeSpace="http://www.sig3d.org/codelists/citygml/2.0/building/2.0/_AbstractBuilding_roofType.xml">1030</bldg:roofType>
|
||||
<bldg:measuredHeight uom="m">6.52</bldg:measuredHeight>
|
||||
<bldg:storeysAboveGround>2</bldg:storeysAboveGround>
|
||||
<bldg:storeysBelowGround>0</bldg:storeysBelowGround>
|
||||
<bldg:lod1Solid>
|
||||
<gml:Solid>
|
||||
<gml:exterior>
|
||||
<gml:CompositeSurface>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457842 5439083 111.8 457842 5439093 111.8 457854 5439093 111.8 457854 5439083 111.8 457842 5439083 111.8 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457842 5439083 118.31769 457854 5439083 118.31769 457854 5439093 118.31769 457842 5439093 118.31769 457842 5439083 118.31769 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457842 5439083 111.8 457842 5439083 118.31769 457842 5439093 118.31769 457842 5439093 111.8 457842 5439083 111.8 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457842 5439093 111.8 457842 5439093 118.31769 457854 5439093 118.31769 457854 5439093 111.8 457842 5439093 111.8 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457854 5439093 111.8 457854 5439093 118.31769 457854 5439083 118.31769 457854 5439083 111.8 457854 5439093 111.8 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="3">457854 5439083 111.8 457854 5439083 118.31769 457842 5439083 118.31769 457842 5439083 111.8 457854 5439083 111.8 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:CompositeSurface>
|
||||
</gml:exterior>
|
||||
</gml:Solid>
|
||||
</bldg:lod1Solid>
|
||||
<bldg:address>
|
||||
<core:Address>
|
||||
<core:xalAddress>
|
||||
<xAL:AddressDetails>
|
||||
<xAL:Locality Type="Town">
|
||||
<xAL:LocalityName>Eggenstein-Leopoldshafen</xAL:LocalityName>
|
||||
<xAL:Thoroughfare Type="Street">
|
||||
<xAL:ThoroughfareNumber>4711</xAL:ThoroughfareNumber>
|
||||
<xAL:ThoroughfareName>Spöcker Straße</xAL:ThoroughfareName>
|
||||
</xAL:Thoroughfare>
|
||||
<xAL:PostalCode>
|
||||
<xAL:PostalCodeNumber>76344</xAL:PostalCodeNumber>
|
||||
</xAL:PostalCode>
|
||||
</xAL:Locality>
|
||||
</xAL:AddressDetails>
|
||||
</core:xalAddress>
|
||||
</core:Address>
|
||||
</bldg:address>
|
||||
</bldg:Building>
|
||||
</core:cityObjectMember>
|
||||
</core:CityModel>
|
8764
examples/KIT_LoD1/inseldb_Mannheim.cli
Normal file
8764
examples/KIT_LoD1/inseldb_Mannheim.cli
Normal file
File diff suppressed because it is too large
Load Diff
0
examples/KIT_LoD1/missingOneFile.txt
Normal file
0
examples/KIT_LoD1/missingOneFile.txt
Normal file
19508
examples/NYC_20buildings/2050 bp_20buildings.gml
Normal file
19508
examples/NYC_20buildings/2050 bp_20buildings.gml
Normal file
File diff suppressed because it is too large
Load Diff
10658
examples/NYC_20buildings/2050 bp_20buildings_New_York_City_SRA.xml
Normal file
10658
examples/NYC_20buildings/2050 bp_20buildings_New_York_City_SRA.xml
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
8764
examples/NYC_20buildings/inseldb_New_York_City.cli
Normal file
8764
examples/NYC_20buildings/inseldb_New_York_City.cli
Normal file
File diff suppressed because it is too large
Load Diff
8760
examples/NYC_20buildings/inseldb_New_York_City.dat
Normal file
8760
examples/NYC_20buildings/inseldb_New_York_City.dat
Normal file
File diff suppressed because it is too large
Load Diff
23
geometry/geometry_factory.py
Normal file
23
geometry/geometry_factory.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
from geometry.geometry_feeders.city_gml import CityGml
|
||||
|
||||
|
||||
class GeometryFactory:
|
||||
def __init__(self, file_type, path):
|
||||
self._file_type = file_type.lower()
|
||||
self._path = path
|
||||
|
||||
@property
|
||||
def citygml(self):
|
||||
return CityGml(self._path).city
|
||||
|
||||
@property
|
||||
def geojson(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
@property
|
||||
def bim(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
@property
|
||||
def city(self):
|
||||
return getattr(self, self._file_type, lambda: None)
|
106
geometry/geometry_feeders/city_gml.py
Normal file
106
geometry/geometry_feeders/city_gml.py
Normal file
|
@ -0,0 +1,106 @@
|
|||
import xmltodict
|
||||
import numpy as np
|
||||
from city_model_structure.city import City
|
||||
from city_model_structure.city_object import CityObject
|
||||
from city_model_structure.surface import Surface
|
||||
from helpers.geometry import Geometry
|
||||
|
||||
|
||||
class CityGml:
|
||||
def __init__(self, path):
|
||||
self._city = None
|
||||
with open(path) as gml:
|
||||
# Clean the namespaces is an important task to prevent wrong ns:field due poor citygml implementations
|
||||
self._gml = xmltodict.parse(gml.read(), process_namespaces=True, xml_attribs=True, namespaces={
|
||||
'http://www.opengis.net/gml': None,
|
||||
'http://www.w3.org/2001/XMLSchema-instance': None,
|
||||
'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0': None,
|
||||
'http://www.w3.org/1999/xlink': None,
|
||||
'http://www.opengis.net/citygml/relief/2.0': None,
|
||||
'http://www.opengis.net/citygml/building/2.0': None,
|
||||
'http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd '
|
||||
'http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd" '
|
||||
'xmlns="http://www.opengis.net/citygml/2.0': None,
|
||||
'http://www.opengis.net/citygml/2.0': None
|
||||
}, force_list=('cityObjectMember', 'curveMember'))
|
||||
self._cityObjects = None
|
||||
self._geometry = Geometry()
|
||||
envelope = self._gml['CityModel']['boundedBy']['Envelope']
|
||||
if '#text' in envelope['lowerCorner']:
|
||||
self._lower_corner = np.fromstring(envelope['lowerCorner']['#text'], dtype=float, sep=' ')
|
||||
self._upper_corner = np.fromstring(envelope['upperCorner']['#text'], dtype=float, sep=' ')
|
||||
else:
|
||||
self._lower_corner = np.fromstring(envelope['lowerCorner'], dtype=float, sep=' ')
|
||||
self._upper_corner = np.fromstring(envelope['upperCorner'], dtype=float, sep=' ')
|
||||
|
||||
self._srs_name = envelope['@srsName']
|
||||
|
||||
@property
|
||||
def content(self):
|
||||
return self._gml
|
||||
|
||||
@property
|
||||
def city(self):
|
||||
if self._city is None:
|
||||
city_objects = []
|
||||
for o in self._gml['CityModel']['cityObjectMember']:
|
||||
lod = 0
|
||||
if 'lod1Solid' in o['Building']:
|
||||
lod += 1
|
||||
if 'lod2Solid' in o['Building']:
|
||||
lod += 2
|
||||
if 'lod3Solid' in o['Building']:
|
||||
lod += 4
|
||||
if 'lod4Solid' in o['Building']:
|
||||
lod += 8
|
||||
# ToDo: this is specific for Lod1 need to be modeled for higher lod's and lod combinations
|
||||
name = o['Building']['@id']
|
||||
lod_str = 'lod' + str(lod) + 'Solid'
|
||||
lod_terrain_str = 'lod' + str(lod) + 'TerrainIntersection'
|
||||
try:
|
||||
surfaces = [Surface(s['Polygon']['exterior']['LinearRing']['posList']['#text'])
|
||||
for s in o['Building'][lod_str]['Solid']['exterior']['CompositeSurface']['surfaceMember']]
|
||||
except TypeError:
|
||||
surfaces = [Surface(s['Polygon']['exterior']['LinearRing']['posList'])
|
||||
for s in o['Building'][lod_str]['Solid']['exterior']['CompositeSurface']['surfaceMember']]
|
||||
|
||||
if lod_terrain_str in o['Building']:
|
||||
try:
|
||||
curves = [c['LineString']['posList']['#text']
|
||||
for c in o['Building'][lod_terrain_str]['MultiCurve']['curveMember']]
|
||||
except TypeError:
|
||||
curves = [c['LineString']['posList']
|
||||
for c in o['Building'][lod_terrain_str]['MultiCurve']['curveMember']]
|
||||
|
||||
terrains = []
|
||||
for curve in curves:
|
||||
curve_points = np.fromstring(curve, dtype=float, sep=' ')
|
||||
curve_points = self._geometry.to_points_matrix(curve_points, True)
|
||||
terrains.append(curve_points)
|
||||
else:
|
||||
|
||||
terrains = []
|
||||
for s in surfaces:
|
||||
ground = True
|
||||
ground_points = []
|
||||
for row in s.points:
|
||||
# all surface vertex are in the lower z
|
||||
ground_point = [row[0], row[1], self._lower_corner[2]]
|
||||
ground_points = np.concatenate((ground_points, ground_point), axis=None)
|
||||
ground = ground and self._geometry.almost_equal(row, ground_point)
|
||||
if ground:
|
||||
ground_points = self._geometry.to_points_matrix(ground_points)
|
||||
# Do i need to remove the duplicated?
|
||||
terrains.append(ground_points)
|
||||
year_of_construction = None
|
||||
function = None
|
||||
if 'yearOfConstruction' in o['Building']:
|
||||
year_of_construction = o['Building']['yearOfConstruction']
|
||||
if 'function' in o['Building']:
|
||||
function = o['Building']['function']
|
||||
|
||||
city_objects.append(CityObject(name, lod, surfaces, terrains, year_of_construction, function))
|
||||
self._city = City(self._lower_corner, self._upper_corner, city_objects, self._srs_name)
|
||||
return self._city
|
||||
|
||||
|
5
helpers/assumptions.py
Normal file
5
helpers/assumptions.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
# These values are intended as configurable assumptions
|
||||
# ToDo: these values need to be changed into configurable parameters
|
||||
|
||||
h_i = 10 # W/m2K
|
||||
h_e = 25 # W/m2K
|
2
helpers/constants.py
Normal file
2
helpers/constants.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
celsius2kelvin = 273.15
|
||||
days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
32
helpers/geometry.py
Normal file
32
helpers/geometry.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
import math
|
||||
import numpy as np
|
||||
|
||||
|
||||
class Geometry:
|
||||
def __init__(self, delta=0.5):
|
||||
self._delta = delta
|
||||
|
||||
def almost_equal(self, v1, v2):
|
||||
delta = math.sqrt(pow((v1[0]-v2[0]), 2) + pow((v1[1]-v2[1]), 2) + pow((v1[2]-v2[2]), 2))
|
||||
return delta <= self._delta
|
||||
|
||||
@staticmethod
|
||||
def to_points_matrix(points, remove_last=False):
|
||||
rows = points.size//3
|
||||
points = points.reshape(rows, 3)
|
||||
if remove_last:
|
||||
points = np.delete(points, rows-1, 0)
|
||||
return points
|
||||
|
||||
@staticmethod
|
||||
def _director_vector(p1, p2):
|
||||
return p1 - p2
|
||||
|
||||
@staticmethod
|
||||
def _linearly_dependent(d1, d2):
|
||||
coe_x = d1[0] / d2[0]
|
||||
coe_y = d1[1] / d2[1]
|
||||
coe_z = d1[2] / d2[2]
|
||||
if coe_x == coe_y == coe_z:
|
||||
return True
|
||||
return False
|
32
helpers/monthlyvalues.py
Normal file
32
helpers/monthlyvalues.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
import pandas as pd
|
||||
import numpy as np
|
||||
import helpers.constants as cte
|
||||
|
||||
|
||||
class MonthlyValues:
|
||||
def __init__(self):
|
||||
self._month_hour = None
|
||||
|
||||
@staticmethod
|
||||
def get_mean_values(values):
|
||||
out = None
|
||||
if values is not None:
|
||||
out = pd.DataFrame(values).groupby('month', as_index=False).mean()
|
||||
return out
|
||||
|
||||
@staticmethod
|
||||
def get_total_month(values):
|
||||
out = None
|
||||
if values is not None:
|
||||
out = pd.DataFrame(values).groupby('month', as_index=False).sum()
|
||||
return out
|
||||
|
||||
@property
|
||||
def month_hour(self):
|
||||
if self._month_hour is None:
|
||||
array = []
|
||||
for i in range(0, 12):
|
||||
total_hours = cte.days_of_month[i] * 24
|
||||
array = np.concatenate((array, np.full(total_hours, i + 1)))
|
||||
self._month_hour = pd.DataFrame(array, columns=['month'])
|
||||
return self._month_hour
|
40
main.py
40
main.py
|
@ -0,0 +1,40 @@
|
|||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
|
||||
name_gml = '2050 bp_20buildings.gml'
|
||||
name_sra = '2050 bp_20buildings_New_York_City_SRA'
|
||||
name_cli = 'inseldb_New_York_City.cli'
|
||||
name_insel = 'inselFile.insel'
|
||||
name_weather = 'inseldb_New_York_City.dat'
|
||||
path = (Path(__file__).parent / 'examples/NYC_20buildings').resolve()
|
||||
full_path_cli = os.path.join(path, name_cli)
|
||||
full_path_weather = os.path.join(path, name_weather)
|
||||
full_path_gml = os.path.join(path, name_gml)
|
||||
|
||||
# Initialize the city model
|
||||
# todo: add several steps:
|
||||
# - simplification of the data model (for all work-flows)
|
||||
# - internal zoning of buildings (for dynamic simulation only)
|
||||
# city = Init(full_path_gml).city
|
||||
|
||||
# Write and run SRA, and get results (one model for the complete city)
|
||||
name = name_sra + '.xml'
|
||||
# todo: define full_path_cli and any other weather related parameter according to the city_name in city
|
||||
# sra = sra.SRA(name_sra + '.xml', full_path_cli, city.city_objects, lower_corner=city.lower_corner)
|
||||
# sra.save(path)
|
||||
|
||||
# SRA = SRAProcesses(path, name_sra, full_path_weather)
|
||||
# SRA.call_sra()
|
||||
# SRA.results()
|
||||
# temperatures = mv.MonthlyValues.get_mean_values(SRA.get_weather_temperatures)
|
||||
# SRA.set_irradiance_surfaces(city)
|
||||
|
||||
# Write insel model (one model per building)
|
||||
#for city_object in city.city_objects:
|
||||
# content = templates.generate_dem(city_object, usageParameters, temperatures)
|
||||
# inselFile = InsF(path, name_insel, content)
|
||||
# inselFile.save()
|
||||
# Run INSEL
|
||||
# runInsel(inselFile.full_path)
|
24
physics/physics_factory.py
Normal file
24
physics/physics_factory.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
from physics.physics_feeders.us_physics_parameters import UsPhysicsParameters
|
||||
|
||||
|
||||
class PhysicsFactory:
|
||||
def __init__(self, country_code, city_name, city_objects):
|
||||
self._country_code = country_code.lower()
|
||||
self._city_name = city_name.lower()
|
||||
self._city_objects = city_objects
|
||||
self.factory()
|
||||
|
||||
def us(self):
|
||||
UsPhysicsParameters(self._city_name, self._city_objects)
|
||||
|
||||
def ca(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
def de(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
def es(self):
|
||||
raise Exception('Not implemented')
|
||||
|
||||
def factory(self):
|
||||
getattr(self, self._country_code, lambda: None)()
|
106
physics/physics_feeders/helpers/pluto_converter.py
Normal file
106
physics/physics_feeders/helpers/pluto_converter.py
Normal file
|
@ -0,0 +1,106 @@
|
|||
class PlutoConverter:
|
||||
|
||||
@staticmethod
|
||||
def building_type_to_nrel(pluto_type):
|
||||
# todo: add all types to the dictionary nrel_type
|
||||
# 'A0 ONE FAMILY DWELLINGS: Cape Cod'
|
||||
# 'B1 TWO FAMILY DWELLINGS: Brick'
|
||||
# 'C0 WALK UP APARTMENTS: Three Families'
|
||||
# 'D0 ELEVATOR APARTMENTS: Co-op Conversion From Loft/Warehouse'
|
||||
# 'E1 WAREHOUSES: Fireproof'
|
||||
# 'F1 FACTORY AND INDUSTRIAL BUILDINGS: Heavy Manufacturing (Fireproof)'
|
||||
# 'G0 GARAGES & GASOLINE STATIONS: Residential Tax Class 1 Garage'
|
||||
# 'H1 HOTELS: Luxury Type: Built Prior to 1960'
|
||||
# 'I1 HOSPITALS AND HEALTH: Hospitals, Sanitariums, Mental Institutions'
|
||||
# 'J1 THEATRES: Art Type (Seating Capacity Under 400 Seats)'
|
||||
# 'K1 STORE BUILDINGS: One Story Store Building'
|
||||
# 'L1 LOFT BUILDINGS: Over Eight Stores (Mid-Manhattan Type With or Without Stores)'
|
||||
# 'M1 CHURCHES, SYNAGOGUES, ETC.: Church, Synagogue, Chapel'
|
||||
# 'N1 ASYLUMS AND HOMES: Asylums'
|
||||
# 'O1 OFFICE BUILDINGS: Fireproof: Up to Nine Stories'
|
||||
# 'P1 PLACES OF PUBLIC ASSEMBLY: Concert Halls'
|
||||
# 'P2 PLACES OF PUBLIC ASSEMBLY: Lodge Rooms'
|
||||
# 'P3 PLACES OF PUBLIC ASSEMBLY: YWCA,YMCA,YWHA,YMHA,PAL'
|
||||
# 'P4 PLACES OF PUBLIC ASSEMBLY: Beach Club'
|
||||
# 'P5 PLACES OF PUBLIC ASSEMBLY: Community Center'
|
||||
# 'P6 PLACES OF PUBLIC ASSEMBLY: Amusement Places, Bathhouses, Boat'
|
||||
# 'P7 PLACES OF PUBLIC ASSEMBLY: Museum'
|
||||
# 'P8 PLACES OF PUBLIC ASSEMBLY: Library'
|
||||
# 'P9 PLACES OF PUBLIC ASSEMBLY: Miscellaneous Including Riding Academies and Stables'
|
||||
# 'Q0 OUTDOOR RECREATION: Open Space'
|
||||
# 'R0 CONDOMINIUMS: Condo Billing Lot'
|
||||
# 'S0 RESIDENCE MULTIPLE USE: Primarily One Family with Two Stores or Offices'
|
||||
# 'S1 RESIDENCE MULTIPLE USE: Primarily One Family With Store or Office'
|
||||
# 'S2 RESIDENCE MULTIPLE USE: Primarily Two Family With Store or Office'
|
||||
# 'S3 RESIDENCE MULTIPLE USE: Primarily Three Family With Store or Office'
|
||||
# 'S4 RESIDENCE MULTIPLE USE: Primarily Four Family With Store or Office'
|
||||
# 'S5 RESIDENCE MULTIPLE USE: Primarily Five to Six Family With Store or Office'
|
||||
# 'S9 RESIDENCE MULTIPLE USE: Primarily One to Six Families with Stores or Offices'
|
||||
# 'T1 TRANSPORTATION FACILITIES: Airports, Air Fields, Terminals'
|
||||
# 'U0 UTILITY: Utility Company Land and Buildings'
|
||||
# 'V0 VACANT LAND: Zoned Residential, Except Not Manhattan Below 110 St'
|
||||
# 'W1 EDUCATIONAL STRUCTURES: Public Elementary Junior and Senior High Schools'
|
||||
# 'Y1 GOVERNMENT: Fire Department'
|
||||
# 'Y8 GOVERNMENT: Department of Public Works'
|
||||
# 'Z0 MISCELLANEOUS: Tennis Court, Pool, Shed, etc. Used in Conjunction with Tax Class 1'
|
||||
# 'Z1 MISCELLANEOUS: Court House'
|
||||
# 'Z3 MISCELLANEOUS: Post Office'
|
||||
# 'Z4 MISCELLANEOUS: Foreign Governments'
|
||||
# 'Z5 MISCELLANEOUS: United Nations'
|
||||
# 'Z8 MISCELLANEOUS: Cemeteries'
|
||||
# 'Z9 MISCELLANEOUS: Other'
|
||||
nrel_type = {'A0': 'residential',
|
||||
'C0': 'midrise apartment',
|
||||
'D3': 'full service restaurant', # ToDo: remove this, is fake!!!!!
|
||||
'RI': 'residential',
|
||||
'B1': 'residential',
|
||||
'D0': 'residential',
|
||||
'E1': 'residential',
|
||||
'F1': 'residential',
|
||||
'G0': 'residential',
|
||||
'H1': 'residential',
|
||||
'I1': 'residential',
|
||||
'J1': 'residential',
|
||||
'K1': 'residential',
|
||||
'L1': 'residential',
|
||||
'M1': 'residential',
|
||||
'N1': 'residential',
|
||||
'O1': 'residential',
|
||||
'P1': 'residential',
|
||||
'P2': 'residential',
|
||||
'P3': 'residential',
|
||||
'P4': 'residential',
|
||||
'P5': 'residential',
|
||||
'P6': 'residential',
|
||||
'P7': 'residential',
|
||||
'P8': 'residential',
|
||||
'P9': 'residential',
|
||||
'Q0': 'residential',
|
||||
'R0': 'residential',
|
||||
'S0': 'residential',
|
||||
'S1': 'residential',
|
||||
'S2': 'residential',
|
||||
'S3': 'residential',
|
||||
'S4': 'residential',
|
||||
'S5': 'residential',
|
||||
'S9': 'residential',
|
||||
'T1': 'residential',
|
||||
'U0': 'residential',
|
||||
'V0': 'residential',
|
||||
'W1': 'residential',
|
||||
'Y1': 'residential',
|
||||
'Y8': 'residential',
|
||||
'Z0': 'residential',
|
||||
'Z1': 'residential',
|
||||
'Z3': 'residential',
|
||||
'Z4': 'residential',
|
||||
'Z5': 'residential',
|
||||
'Z8': 'residential',
|
||||
'Z9': 'residential',
|
||||
'RM': 'residential',
|
||||
'D6': 'residential',
|
||||
'W4': 'residential',
|
||||
}
|
||||
return nrel_type[pluto_type]
|
||||
|
||||
|
98
physics/physics_feeders/helpers/us_to_library_types.py
Normal file
98
physics/physics_feeders/helpers/us_to_library_types.py
Normal file
|
@ -0,0 +1,98 @@
|
|||
class UsToLibraryTypes(object):
|
||||
standards = {
|
||||
'ASHRAE Std189': 1,
|
||||
'ASHRAE 90.1-2004': 2
|
||||
}
|
||||
|
||||
reference_city_climate_zone = {
|
||||
'Miami': '1A',
|
||||
'Houston': '2A',
|
||||
'Phoenix': '2B',
|
||||
'Atlanta': '3A',
|
||||
'Los Angeles': '3B',
|
||||
'Las Vegas': '3B',
|
||||
'San Francisco': '3C',
|
||||
'Baltimore': '4A',
|
||||
'Albuquerque': '4B',
|
||||
'Seattle': '4C',
|
||||
'Chicago': '5A',
|
||||
'Boulder': '5B',
|
||||
'Minneapolis': '6A',
|
||||
'Helena': '6B',
|
||||
'Duluth': '7A',
|
||||
'Fairbanks': '8A'
|
||||
}
|
||||
|
||||
climate_zones = {
|
||||
'8A': 1,
|
||||
'8B': 2,
|
||||
'1A': 3,
|
||||
'1B': 4,
|
||||
'2A': 5,
|
||||
'2B': 6,
|
||||
'3A': 7,
|
||||
'3B': 8,
|
||||
'4A': 9,
|
||||
'4B': 10,
|
||||
'4C': 11,
|
||||
'5A': 12,
|
||||
'5B': 13,
|
||||
'5C': 14,
|
||||
'6A': 15,
|
||||
'6B': 16,
|
||||
'7A': 17,
|
||||
'7B': 18
|
||||
}
|
||||
|
||||
building_types = {
|
||||
'full service restaurant': 1,
|
||||
'residential': 2,
|
||||
'highrise apartment': 3,
|
||||
'hospital': 4,
|
||||
'large hotel': 5,
|
||||
'large office': 6,
|
||||
'medium office': 7,
|
||||
'midrise apartment': 8,
|
||||
'outpatient health care': 9,
|
||||
'primary school': 10,
|
||||
'quick service restaurant': 11,
|
||||
'secondary school': 12,
|
||||
'small hotel': 13,
|
||||
'small office': 14,
|
||||
'stand-alone retail': 15,
|
||||
'strip mall': 16,
|
||||
'supermarket': 17,
|
||||
'warehouse': 18
|
||||
}
|
||||
|
||||
window_types = ['window', 'door', 'skylight']
|
||||
|
||||
construction_types = {
|
||||
'Wall': 'exterior wall',
|
||||
'interior wall': 'interior wall',
|
||||
'ground wall': 'ground wall',
|
||||
'Ground': 'exterior slab',
|
||||
'attic floor': 'attic floor',
|
||||
'interior slab': 'interior slab',
|
||||
'Roof': 'roof'
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def yoc_to_year_of_standard(year_of_construction):
|
||||
if int(year_of_construction) < 2009:
|
||||
year_of_standard = 2004
|
||||
else:
|
||||
year_of_standard = 2009
|
||||
return year_of_standard
|
||||
|
||||
@staticmethod
|
||||
def city_to_reference_city(city):
|
||||
# ToDo: Dummy function that need to be implemented
|
||||
reference_city = 'Albuquerque'
|
||||
if city is not None:
|
||||
reference_city = 'Albuquerque'
|
||||
return reference_city
|
||||
|
||||
def city_to_climate_zone(self, city):
|
||||
reference_city = UsToLibraryTypes.city_to_reference_city(city)
|
||||
return self.reference_city_climate_zone[reference_city]
|
112
physics/physics_feeders/us_physics_parameters.py
Normal file
112
physics/physics_feeders/us_physics_parameters.py
Normal file
|
@ -0,0 +1,112 @@
|
|||
import xmltodict
|
||||
from city_model_structure.layer import Layer
|
||||
from city_model_structure.material import Material
|
||||
from pathlib import Path
|
||||
from physics.physics_feeders.helpers.us_to_library_types import UsToLibraryTypes
|
||||
from physics.physics_feeders.helpers.pluto_converter import PlutoConverter as Pc
|
||||
|
||||
|
||||
class UsPhysicsParameters:
|
||||
def __init__(self, city_name, city_objects):
|
||||
us_to_library_types = UsToLibraryTypes()
|
||||
climate_zone = us_to_library_types.city_to_climate_zone(city_name)
|
||||
self._climate_zone = UsToLibraryTypes.climate_zones[climate_zone]
|
||||
self._city_objects = city_objects
|
||||
|
||||
# load US Library
|
||||
path = str(Path.cwd() / 'data/us_library.xml')
|
||||
with open(path) as xml:
|
||||
self._library = xmltodict.parse(xml.read())
|
||||
|
||||
# load US Archetypes
|
||||
path = str(Path.cwd() / 'data/us_archetypes.xml')
|
||||
with open(path) as xml:
|
||||
self._archetypes = xmltodict.parse(xml.read())
|
||||
for city_object in self._city_objects:
|
||||
nrel_type = Pc.building_type_to_nrel(city_object.function)
|
||||
if nrel_type is None:
|
||||
return
|
||||
building_type = UsToLibraryTypes.building_types[nrel_type]
|
||||
archetype = self.search_archetype(building_type,
|
||||
UsToLibraryTypes.yoc_to_year_of_standard(city_object.year_of_construction))
|
||||
# ToDo:remove this in the future
|
||||
# ToDo: Raise WrongArchetype if not all the surface types are defined for the given city_object
|
||||
if archetype is None:
|
||||
print(building_type, UsToLibraryTypes.yoc_to_year_of_standard(city_object.year_of_construction),
|
||||
self._climate_zone)
|
||||
raise Exception('Archetype not found for building')
|
||||
|
||||
city_object.average_storey_height = archetype['average_store_height']['#text']
|
||||
city_object.storeys_above_ground = archetype['number_of_storeys']['#text']
|
||||
|
||||
for thermal_zone in city_object.thermal_zones:
|
||||
thermal_zone.effective_thermal_capacity = archetype['thermal_capacity']['#text']
|
||||
thermal_zone.additional_thermal_bridge_u_value = archetype['extra_loses_due_to_thermal_bridges']['#text']
|
||||
thermal_zone.indirectly_heated_area_ratio = archetype['indirect_heated_ratio']['#text']
|
||||
thermal_zone.infiltration_rate_system_off = archetype['infiltration_rate_for_ventilation_system_off']['#text']
|
||||
thermal_zone.infiltration_rate_system_on = archetype['infiltration_rate_for_ventilation_system_on']['#text']
|
||||
for thermal_boundary in thermal_zone.bounded:
|
||||
construction_type = UsToLibraryTypes.construction_types[thermal_boundary.type]
|
||||
construction = UsPhysicsParameters.search_construction_in_archetype(archetype, construction_type)
|
||||
construction_id = construction['@id']
|
||||
c_lib = self.search_construction_type('construction', construction_id)
|
||||
if 'outside_solar_absorptance' in c_lib:
|
||||
thermal_boundary.outside_solar_absorptance = c_lib['outside_solar_absorptance']['#text']
|
||||
thermal_boundary.outside_thermal_absorptance = c_lib['outside_thermal_absorptance']['#text']
|
||||
thermal_boundary.outside_visible_absorptance = c_lib['outside_visible_absorptance']['#text']
|
||||
thermal_boundary.window_ratio = construction['window_ratio']['#text']
|
||||
thermal_boundary.layers = []
|
||||
for current_layer in c_lib['layers']['layer']:
|
||||
layer = Layer()
|
||||
if 'thickness' in current_layer:
|
||||
layer.thickness_m = current_layer['thickness']['#text']
|
||||
material_lib = self.search_construction_type('material', current_layer['material'])
|
||||
material = Material()
|
||||
if 'conductivity' in material_lib:
|
||||
material.conductivity_wm_k = material_lib['conductivity']['#text']
|
||||
material.specific_heat_jkg_k = material_lib['specific_heat']['#text']
|
||||
material.density_kg_m3 = material_lib['density']['#text']
|
||||
material.solar_absorptance = material_lib['solar_absorptance']['#text']
|
||||
material.thermal_absorptance = material_lib['thermal_absorptance']['#text']
|
||||
material.visible_absorptance = material_lib['visible_absorptance']['#text']
|
||||
material.no_mass = 'no_mass' in material_lib
|
||||
if 'thermal_resistance' in material_lib:
|
||||
material.thermal_resistance_m2k_w = material_lib['thermal_resistance']['#text']
|
||||
else:
|
||||
material.thermal_resistance_m2k_w = None
|
||||
layer.material = material
|
||||
thermal_boundary.layers.append(layer)
|
||||
for opening in thermal_boundary.thermal_openings:
|
||||
if construction['window'] is None:
|
||||
continue
|
||||
w_lib = self.search_construction_type('window', construction['window'])
|
||||
opening.area = '0.0'
|
||||
opening.conductivity_w_mk = w_lib['conductivity']['#text']
|
||||
opening.frame_ratio = w_lib['frame_ratio']['#text']
|
||||
opening.g_value = w_lib['solar_transmittance_at_normal_incidence']['#text']
|
||||
opening.thickness_m = w_lib['thickness']['#text']
|
||||
opening.inside_reflectance = 1.0-float(w_lib['back_side_solar_transmittance_at_normal_incidence']['#text'])
|
||||
opening.outside_reflectance = \
|
||||
1.0-float(w_lib['front_side_solar_transmittance_at_normal_incidence']['#text'])
|
||||
|
||||
def search_archetype(self, building_type, year_of_construction):
|
||||
for archetype in self._archetypes['archetypes']['archetype']:
|
||||
a_yc = str(archetype['@year_of_construction_reference'])
|
||||
a_bt = str(archetype['@building_type'])
|
||||
a_cz = str(archetype['@climate_zone'])
|
||||
if (a_yc == str(year_of_construction)) and (a_bt == str(building_type)) and (a_cz == str(self._climate_zone)):
|
||||
return archetype
|
||||
return None
|
||||
|
||||
def search_construction_type(self, construction_type, construction_id):
|
||||
for c_lib in self._library['library'][construction_type + 's'][construction_type]:
|
||||
if construction_id == c_lib['@id']:
|
||||
return c_lib
|
||||
raise Exception('Archetype definition contains elements that doesn\'t exist in the library')
|
||||
|
||||
@staticmethod
|
||||
def search_construction_in_archetype(archetype, construction_type):
|
||||
for construction in archetype['constructions']['construction']:
|
||||
if construction['@type'] == construction_type:
|
||||
return construction
|
||||
raise Exception('Construction type not found')
|
149
simplified_radiosity_algorithm/simplified_radiosity_algorithm.py
Normal file
149
simplified_radiosity_algorithm/simplified_radiosity_algorithm.py
Normal file
|
@ -0,0 +1,149 @@
|
|||
import pandas as pd
|
||||
from helpers import monthlyvalues as mv
|
||||
import subprocess
|
||||
import xmltodict
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
class SimplifiedRadiosityAlgorithm:
|
||||
def __init__(self, sra_working_path, sra_file_name, full_path_cli, city_objects=None,
|
||||
begin_month=1, begin_day=1, end_month=12, end_day=31, lower_corner=None):
|
||||
self._full_path_cli = full_path_cli
|
||||
self._begin_month = begin_month
|
||||
self._begin_day = begin_day
|
||||
self._end_month = end_month
|
||||
self._end_day = end_day
|
||||
if lower_corner is None:
|
||||
lower_corner = [0, 0, 0]
|
||||
self._lower_corner = lower_corner
|
||||
self._full_path_in_sra = (sra_working_path / (sra_file_name + '.xml')).resolve()
|
||||
self._full_path_out_sra = (sra_working_path / (sra_file_name + '_SW.out')).resolve()
|
||||
self._out_values = None
|
||||
self._radiation = None
|
||||
self._content = OrderedDict()
|
||||
climate = OrderedDict()
|
||||
climate['@location'] = self._full_path_cli
|
||||
climate['@city'] = self.city
|
||||
simulation = OrderedDict()
|
||||
simulation['@beginMonth'] = begin_month
|
||||
simulation['@beginDay'] = begin_day
|
||||
simulation['@endMonth'] = end_month
|
||||
simulation['@endDay'] = end_day
|
||||
city_sim = OrderedDict()
|
||||
city_sim['@name'] = sra_file_name + '.xml'
|
||||
city_sim['Simulation'] = simulation
|
||||
city_sim['Climate'] = climate
|
||||
self._content['CitySim'] = city_sim
|
||||
if city_objects is not None:
|
||||
self.add_city_objects(city_objects)
|
||||
self.save()
|
||||
|
||||
def call_sra(self):
|
||||
completed = subprocess.run(['shortwave_integer.exe', self._full_path_in_sra])
|
||||
# TODO: catch error if file does not exist
|
||||
self._out_values = self.results()
|
||||
return completed
|
||||
|
||||
def results(self):
|
||||
if self._out_values is None:
|
||||
self._out_values = pd.read_csv(self._full_path_out_sra, sep='\s+', header=0)
|
||||
return self._out_values
|
||||
|
||||
@property
|
||||
def radiation(self):
|
||||
if self._radiation is None:
|
||||
self._radiation = []
|
||||
id_building = ''
|
||||
header_building = []
|
||||
for column in self._out_values.columns.values:
|
||||
if id_building != column.split(':')[1]:
|
||||
id_building = column.split(':')[1]
|
||||
if len(header_building) > 0:
|
||||
self._radiation.append(pd.concat([mv.MonthlyValues().month_hour, self._out_values[header_building]], axis=1))
|
||||
header_building = [column]
|
||||
else:
|
||||
header_building.append(column)
|
||||
self._radiation.append(pd.concat([mv.MonthlyValues().month_hour, self._out_values[header_building]], axis=1))
|
||||
return self._radiation
|
||||
|
||||
# mode = 0, set only monthly values
|
||||
# mode = 1, set only hourly values
|
||||
# mode = 2, set both
|
||||
def set_irradiance_surfaces(self, city, mode=0):
|
||||
for radiation in self.radiation:
|
||||
building_name = radiation.columns.values.tolist()[1].split(':')[1]
|
||||
city_object = city.city_object(building_name)
|
||||
for column in radiation.columns.values:
|
||||
if column == 'month':
|
||||
continue
|
||||
header_name = column
|
||||
surface_name = header_name.split(':')[2]
|
||||
surface = city_object.surface(surface_name)
|
||||
if mode == 0 or mode == 2:
|
||||
df = mv.MonthlyValues.get_total_month(radiation[['month', header_name]])
|
||||
surface.global_irradiance_month = [gim[0] for gim in df[[header_name]].to_numpy()]
|
||||
if mode == 1 or mode == 2:
|
||||
df = radiation[[header_name]]
|
||||
surface.global_irradiance_hour = df[[header_name]].to_numpy()
|
||||
return
|
||||
|
||||
@property
|
||||
def content(self):
|
||||
return xmltodict.unparse(self._content, pretty=True, short_empty_elements=True)
|
||||
|
||||
def save(self):
|
||||
with open(self._full_path_in_sra, "w") as sra_file:
|
||||
sra_file.write(self.content)
|
||||
return
|
||||
|
||||
def _correct_points(self, points):
|
||||
# correct the x, y, z values into the reference frame set by lower_corner parameter
|
||||
# [0, 0, 0] by default means no correction.
|
||||
points[0] = points[0] - self._lower_corner[0]
|
||||
points[1] = points[1] - self._lower_corner[1]
|
||||
points[2] = points[2] - self._lower_corner[2]
|
||||
return points
|
||||
|
||||
def add_city_objects(self, city_objects):
|
||||
buildings = []
|
||||
for i in range(len(city_objects)):
|
||||
city_object = city_objects[i]
|
||||
building = OrderedDict()
|
||||
building['@Name'] = city_object.name
|
||||
building['@id'] = i
|
||||
building['@key'] = city_object.name
|
||||
building['@Simulate'] = 'True'
|
||||
walls, roofs, floors = [], [], []
|
||||
for s in city_object.surfaces:
|
||||
surface = OrderedDict()
|
||||
surface['@id'] = s.name
|
||||
surface['@ShortWaveReflectance'] = s.swr
|
||||
for j in range(len(s.points - 1)):
|
||||
points = self._correct_points(s.points[j])
|
||||
vertex = OrderedDict()
|
||||
vertex['@x'] = points[0]
|
||||
vertex['@y'] = points[1]
|
||||
vertex['@z'] = points[2]
|
||||
surface['V' + str(j)] = vertex
|
||||
if s.type == 'Wall':
|
||||
walls.append(surface)
|
||||
elif s.type == 'Roof':
|
||||
roofs.append(surface)
|
||||
else:
|
||||
floors.append(surface)
|
||||
|
||||
building['Wall'] = walls
|
||||
building['Roof'] = roofs
|
||||
building['Floor'] = floors
|
||||
buildings.append(building)
|
||||
|
||||
district = OrderedDict()
|
||||
district['FarFieldObstructions'] = None
|
||||
district['Building'] = buildings
|
||||
self._content['CitySim']['District'] = district
|
||||
return
|
||||
|
||||
@property
|
||||
def city(self):
|
||||
with open(self._full_path_cli, 'r') as file:
|
||||
return file.readline().replace('\n', '')
|
34
weather/weather.py
Normal file
34
weather/weather.py
Normal file
|
@ -0,0 +1,34 @@
|
|||
import math
|
||||
import pandas as pd
|
||||
import helpers.constants as cte
|
||||
from helpers import monthlyvalues as mv
|
||||
|
||||
|
||||
class Weather(object):
|
||||
def __init__(self, full_path_weather):
|
||||
self._full_path_weather = full_path_weather
|
||||
if self._full_path_weather is not None:
|
||||
# TODO: catch error if file does not exist
|
||||
self._weather_values = pd.read_csv(self._full_path_weather, sep='\s+', header=None,
|
||||
names=['hour', 'global_horiz', 'temperature', 'diffuse', 'beam', 'empty'])
|
||||
self._weather_values = pd.concat([mv.MonthlyValues().month_hour, self._weather_values], axis=1)
|
||||
|
||||
@property
|
||||
def get_weather_temperatures(self):
|
||||
temperatures_hourly = self._weather_values[['month', 'temperature']]
|
||||
sky_temperature = self.calculate_sky_temperature(temperatures_hourly)
|
||||
_temperatures_hourly = pd.concat([temperatures_hourly, sky_temperature], axis=1)
|
||||
return temperatures_hourly
|
||||
|
||||
@staticmethod
|
||||
def calculate_sky_temperature(ambient_temperature):
|
||||
# Swinbank - Fuentes sky model approximation(1963) based on cloudiness statistics(32 %) in United States
|
||||
# ambient temperatures( in °C)
|
||||
# sky temperatures( in °C)
|
||||
_ambient_temperature = ambient_temperature[['temperature']].to_numpy()
|
||||
_values = []
|
||||
for i in range(0, len(_ambient_temperature)):
|
||||
_value = 0.037536 * math.pow((_ambient_temperature[i] + cte.celsius2kelvin), 1.5) \
|
||||
+ 0.32 * (_ambient_temperature[i] + cte.celsius2kelvin) - cte.celsius2kelvin
|
||||
_values.append(_value)
|
||||
return pd.DataFrame(_values, columns=['sky temperature'])
|
Loading…
Reference in New Issue
Block a user