Skip to main content

Summary

The orography solver is a combination of a map lookup (similar to what our GIS widget does) and a Python solver. Its goal is twofold:
  1. Locate any discrete elements of the topography around a site which can be defined as a ā€œfeatureā€ in wind loading standards
  2. Provide graph data showing the topography in each direction around a site

Methodology & Assumptions

The solver currently complies solely with the Eurocode wind loading standard (EN 1991-1-4:2005), but it was written with the intention that it could be expanded to work with other international wind standards in the future.
The general methodology is as follows:
  1. Sector Analysis: Looks in each of numSectors sectors around a given location. Each sector has a arc length of 360 deg / numSectors.
    • Within each sector, checks along a hard-coded number of ā€œraysā€ (currently set to 3), so as to minimise the chance that we miss any major orography features that aren’t exactly centred in the sector
  2. Initial Search: Search for orography out over a distance of max(10*z, 1 km) (per Appendix A.2 & Cl 4.3.3)
    • Based on these results - for final search radius purposes only - assume that height of ā€œisolated orographic featureā€ = H_test = max(all_elevations) - min(all_elevations)
  3. Final Search: Get the profile of the orography out over a distance of 10 * [max elevation change in any direction]
  4. Profile Cleanup: Clean up the profiles in each direction. We need to do this because wind standards are written as if the only thing that exists are perfectly-smooth, isolated hills and plateaus. That’s not reality - hills have little flat bits midway up, terrain undulates randomly, etc. So we need to clean up the profile as best we can so that we can algorithmically locate individual ā€œfeaturesā€:
    1. Take the derivative of the profile (i.e. the instantaneous slope)
    2. Merge insignificant flat sections of terrain into the surrounding slope if (1) the flat section does not change the feature’s mean slope by more than 50%, and (2) the resulting slope is still significant
    3. Merge insignificant undulations into the surrounding slope if [local maximum] - [local minimum] < H_test / 10. That criterion we’ve selected here is pretty arbitrary, but experimentally, it seemed to come up with good results.
    4. Repeat step (b), because removing those undulations may have now resulted in new insignificant flat sections.
    5. Assume that any adjacent slopes that are in the same direction (i.e. ā€˜uphill’ vs ā€˜flat’ vs ā€˜downhill’) are the same slope. Typically once all this merging is done, there will end up being maybe half a dozen slope segments in a given sector.
  5. Feature Identification: Identify the features in each direction
    1. Define a ā€œhillā€ as a feature with a positive / uphill slope followed immediately by a negative / downhill slope, and an ā€œescarpmentā€ as any positive or negative slope followed by a flat slope (or the end of the profile).
    2. Store the start, end, crest, and average slope of each feature (where ā€œfeatureā€ = ā€œhillā€ or ā€œescarpmentā€)
    3. Identify which, if any, feature the site is located upon and specifically store this ā€˜site feature’
  6. Return Data: Return all the data found for each sector

Inputs

ParameterData TypeUnitsDefaultDescription
znumberm0 mHeight of structure being analysed
longitudenumberdeg-Longitude, in decimals (same format as projectDefault("longitude"))
latitudenumberdeg-Latitude, in decimals (same format as projectDefault("latitude"))
numSectorsinteger-12Number of sectors to look in (each sector = 360deg / numSectors)
flatThresholdtuple-(0, 0)dy/dx slope thresholds between which a slope is considered ā€œflatā€

Outputs

sectors: LIST of the sectors that are checked (starting from 0 - north - and moving clockwise)
  • sector: (deg) angle of centre of measured sector
    • 0 degrees corresponds to North, 90 degrees corresponds to East (like a normal compass in the Northern hemisphere)
    • NB: the angles refer to the heading the wind is coming FROM
      • Distances are thus positive in the direction OPPOSITE the sector angle
      • Example: next to Meteor Crater, in Arizona
        • Looking at Sector 90deg:
          • The wind blows FROM the crater (from the East)
          • Positive distances are towards the west
  • govAngle: (deg) specific angle within the sector that governed in wind parameters
  • features: LIST of features along the sector
    • type: ā€œescarpmentā€ or ā€œhillā€ or ā€œnoneā€
    • startX: (m) horizontal location of start of the feature (relative to site)
    • startY: (m) vertical elevation of start of the feature
    • endX: (m) horizontal location of end of the feature (relative to site)
    • endY: (m) vertical elevation of end of the feature
    • crestX: (m) horizontal location of crest/summit of feature (relative to site)
    • crestY: (m) vertical elevation of crest/summit of feature
    • avgSlope: (dy/dx) average slope of feature (for hills, this is on the side of the hill closest to the site)
    • avgSlopePos / avgSlopeNeg: (dy/dx - HILLS ONLY) average slope on each side of hill
  • siteFeature: single feature that the site is on
    • type, startX, startY, endX, endY, crestX, crestY, avgSlope: same as above
  • profileX: Array of all x-coordinates of profile
  • profileY: Array of all y-coordinates of profile
siteY: (m) vertical ground elevation of site

Plotting Significant Orography Results

Output an xyPlot with the orography profile data:
{
    "type": "sheetTemplateWidgets",
    "attributes": {
        "type": "diagram",
        "diagram": [
            {
                "type": "xyPlot"
            }
        ],
        "equation": [
            {
                "result": "{
                    xData: remote.sectors[7].profileX, // ELEVATION PLOT DATA FROM SOLVER
                    yData: [remote.sectors[7].profileY], 
                    height:150,  
                    yColors: [\"#FF3520\", \"#3DB318\"], 
                    yLabels: [\"Terrain Profile Sector 180°     → Wind direction →\"], 
                    xAxisLabel: \"Distance\", 
                    xAxisUnit: \"m\", 
                    yAxisUnit: \"m\", 
                    customLines: [
                        {
                            points: [
                                [remote.sectors[7].siteFeature.crestX,  // SPECIAL FEATURES FROM SOLVER
                                 remote.sectors[7].siteFeature.crestY]
                            ], 
                            color: \"#66F\", 
                            lineWeight: \"4\", 
                            name: \"Crest\"
                        }
                    ]
                }",
                "condition": "@default"
            }
        ],
        "referenceId": "Sector 180°",
        "visibleIf": "annex != \"Manual\"",
        "showInSuperSummary": true
    }
}
See MAFIWindUK template for a complete implementation example of the orography solver with visualization.

Wind Direction Convention

The orography solver uses a specific wind direction convention:
  • 0 degrees: North
  • 90 degrees: East
  • Angles refer to: The direction the wind is coming FROM
  • Positive distances: In the direction OPPOSITE to the sector angle
This convention is important when interpreting the results and plotting the data.
⌘I