Skip to content
Snippets Groups Projects
Commit b62b82d1 authored by Антон Кудряшов's avatar Антон Кудряшов
Browse files

- removed function type

- generic typed interpolation
- added 25 climate wind
parent aafb55c2
No related branches found
No related tags found
No related merge requests found
......@@ -175,6 +175,8 @@ namespace MES_Wind
double clim5 = clim5RasterLayer.DataSet.Value[i, j];
double clim10 = clim10RasterLayer.DataSet.Value[i, j] +1;
double clim15 = clim15RasterLayer.DataSet.Value[i, j];
// TODO: Add clim25 layer
double clim25 = 0;
if (Math.Abs(clim5 - RasterMissingValue) < eps)
{
clim5 = Double.NaN;
......@@ -187,7 +189,11 @@ namespace MES_Wind
{
clim15 = Double.NaN;
}
WindStressPRM.ClimateCell dummyClim = new WindStressPRM.ClimateCell(clim5, clim10, clim15);
if (Math.Abs(clim25 - RasterMissingValue) < eps)
{
clim25 = Double.NaN;
}
WindStressPRM.ClimateCell dummyClim = new WindStressPRM.ClimateCell(clim5, clim10, clim15, clim25);
climateMatrix.Cells[j, i] = dummyClim;
}
}
......@@ -200,7 +206,7 @@ namespace MES_Wind
dummyline.Identifier = feature.Fid;
dummyline.Year = int.Parse(featureData["Year"].ToString());
dummyline.Height = double.Parse(featureData["HeightOffs"].ToString());
dummyline.Power = int.Parse(featureData["Voltage"].ToString());
dummyline.Voltage = int.Parse(featureData["Voltage"].ToString());
dummyline.PointFromID = int.Parse(featureData["PointFrom"].ToString());
dummyline.PointToID = int.Parse(featureData["PointTo"].ToString());
LineString featureline = feature.BasicGeometry as LineString;
......
......@@ -27,17 +27,24 @@ namespace WindStressPRM
/// </summary>
public double Wind15 { get; private set; }
/// <summary>
/// once-in-25-years frequency wind, m/s
/// скорость ветра повторяемости один раз в 25 лет, м/с
/// для ЛЭП, построенных после 1987 года.
/// </summary>
public double Wind25 { get; private set; }
/// <summary>
/// designated constructor
/// </summary>
/// <param name="coord"></param>
/// <param name="w5"></param>
/// <param name="w10"></param>
/// <param name="w15"></param>
public ClimateCell(double w5, double w10, double w15)
public ClimateCell(double w5, double w10, double w15, double w25)
{
this.Wind5 = w5;
this.Wind10 = w10;
this.Wind15 = w15;
this.Wind25 = w25;
if (!(this.CheckValue()))
{
throw new System.ArgumentException("Climate wind value is not correct");
......@@ -52,6 +59,7 @@ namespace WindStressPRM
double w5 = Wind5;
double w10 = Wind10;
double w15 = Wind15;
double w25 = Wind25;
if (Double.IsNaN(w5)) // if is Nan - zerofied it.
{
w5 = 0;
......@@ -64,8 +72,12 @@ namespace WindStressPRM
{
w15 = 0;
}
if (Double.IsNaN(w25))
{
w25 = 0;
}
// ветер по модулю не должен превышать 70м/с
return Math.Abs(w5) < 70 && Math.Abs(w10) < 70 && Math.Abs(w15) < 70;
return Math.Abs(w5) < 70 && Math.Abs(w10) < 70 && Math.Abs(w15) < 70 && Math.Abs(w25) < 70;
}
}
}
......@@ -30,7 +30,7 @@ namespace WindStressPRM
/// power kV for switches
/// Напряжение ЛЭП, кВ
/// </summary>
public int Power { get; set; }
public int Voltage { get; set; }
/// <summary>
/// Line vertices coordinate list
/// список координат вершин ЛЭП как линейного объекта
......@@ -73,13 +73,13 @@ namespace WindStressPRM
/// <param name="ison"></param>
/// <param name="toID"></param>
/// <param name="fromID"></param>
public Powerline(IList<Coordinate> coordinates, int id, int year, double height, int power, int toID, int fromID)
public Powerline(IList<Coordinate> coordinates, int id, int year, double height, int voltage, int toID, int fromID)
{
this.Coordinates = coordinates;
this.Identifier = id;
this.Year = year;
this.Height = height;
this.Power = power;
this.Voltage = voltage;
this.IsBroken = false;
this.IsON = false;
this.PointFromID = fromID;
......@@ -97,7 +97,7 @@ namespace WindStressPRM
{
bool checker =
Identifier >= 0 && Math.Abs(Year - 1985) < 45 &&
Math.Abs(Height - 15) < 15 && Power > 0 && Power < 1000 &&
Math.Abs(Height - 15) < 15 && Voltage > 0 && Voltage < 1000 &&
PointFromID >= 0 && PointToID >= 0;
return checker;
}
......
......@@ -3,14 +3,6 @@ using System.Collections.Generic;
namespace WindStressPRM
{
enum FunctionType
{
FunctionVelocityX = 0,
FunctionVelocityY = 1,
FunctionClimate5 = 2,
FunctionClimate10 = 3,
FunctionClimate15 = 4
}
/// <summary>
/// main calculations class
/// </summary>
......@@ -153,7 +145,7 @@ namespace WindStressPRM
double y1 = points[i - 1].Y;
double x2 = points[i].X;
double y2 = points[i].Y;
bool result = linearLineIsBroken(points[i - 1], points[i], powerCurve.Height, powerCurve.Power);
bool result = linearLineIsBroken(points[i - 1], points[i], powerCurve.Height, powerCurve.Voltage);
checkList.Add(result);
}
foreach (bool chkpnt in checkList)
......@@ -207,32 +199,34 @@ namespace WindStressPRM
pointlist.Add(midpoint);
}
}
else
{
else {
midpoint = new Coordinate( (coord1.X + coord2.X) / 2, (coord1.Y + coord2.Y) / 2);
pointlist.Add(midpoint);
}
FunctionType climateType;
if (power > 5 && power < 330)
{
climateType = FunctionType.FunctionClimate10;
}
else
{
if (power <= 5) {
climateType = FunctionType.FunctionClimate5;
Func<ClimateCell, double> climateClosure = delegate(ClimateCell cell) {
// if year > 1987
// clim type = 25
//
if (power > 5 && power < 330)
{
return cell.Wind10;
}
else {
climateType = FunctionType.FunctionClimate15;
else if (power <= 5)
{
return cell.Wind5;
}
}
else
{
return cell.Wind15;
}
};
List<bool> checkbool = new List<bool>();
foreach (Coordinate coords in pointlist)
{
bool res = false;
double uwind = interpol(coords, FunctionType.FunctionVelocityX);
double vwind = interpol(coords, FunctionType.FunctionVelocityY);
double climwind = interpol(coords, climateType);
double uwind = interpol(coords, Input.PrognosticCells, delegate(PrognosticCell cell) { return cell.VelocityX; });
double vwind = interpol(coords, Input.PrognosticCells, delegate(PrognosticCell cell) { return cell.VelocityY; });
double climwind = interpol(coords, Input.ClimateCells, climateClosure);
if (Double.IsNaN(uwind) || Double.IsNaN(vwind) || Double.IsNaN(climwind))
{
// interpolation fail. we can't say everything about here
......@@ -278,133 +272,20 @@ namespace WindStressPRM
return result;
}
private Coordinate cellToProjection(Index index, FunctionType functionType)
{
switch (functionType)
{
case FunctionType.FunctionVelocityX:
case FunctionType.FunctionVelocityY:
{
return Input.PrognosticCells.CellToProjection(index);
}
case FunctionType.FunctionClimate5:
case FunctionType.FunctionClimate10:
case FunctionType.FunctionClimate15:
{
return Input.ClimateCells.CellToProjection(index);
}
default:
break;
}
return null;
}
int countInList(FunctionType functionType, bool forRows)
{
switch (functionType)
{
case FunctionType.FunctionVelocityX:
case FunctionType.FunctionVelocityY:
{
return forRows ? Input.PrognosticCells.RowsCount() : Input.PrognosticCells.ColumnCount();
}
case FunctionType.FunctionClimate5:
case FunctionType.FunctionClimate10:
case FunctionType.FunctionClimate15:
{
return forRows ? Input.ClimateCells.RowsCount() : Input.ClimateCells.ColumnCount();
}
default:
break;
}
return 0;
}
private double valueForFunction(FunctionType functionType, Index index)
{
switch (functionType)
{
case FunctionType.FunctionVelocityX:
{
return Input.PrognosticCells.Cells[index.Row, index.Col].VelocityX;
}
case FunctionType.FunctionVelocityY:
{
return Input.PrognosticCells.Cells[index.Row, index.Col].VelocityY;
}
case FunctionType.FunctionClimate5:
{
return Input.ClimateCells.Cells[index.Row, index.Col].Wind5;
}
case FunctionType.FunctionClimate10:
{
return Input.ClimateCells.Cells[index.Row, index.Col].Wind10;
}
case FunctionType.FunctionClimate15:
{
return Input.ClimateCells.Cells[index.Row, index.Col].Wind15;
}
default:
break;
}
return 0;
}
private CellSize cellSizeForFunction(FunctionType functionType)
{
switch (functionType)
{
case FunctionType.FunctionVelocityX:
case FunctionType.FunctionVelocityY:
{
return Input.PrognosticCells.Size;
}
case FunctionType.FunctionClimate5:
case FunctionType.FunctionClimate10:
case FunctionType.FunctionClimate15:
{
return Input.ClimateCells.Size;
}
default:
break;
}
throw new Exception("There is no cell size");
}
private Index projectionToCell(Coordinate coords, FunctionType functionType)
{
switch(functionType) {
case FunctionType.FunctionClimate5:
case FunctionType.FunctionClimate10:
case FunctionType.FunctionClimate15:
{
return Input.ClimateCells.ProjectionToCell(coords);
}
case FunctionType.FunctionVelocityX:
case FunctionType.FunctionVelocityY:
{
return Input.PrognosticCells.ProjectionToCell(coords);
}
default:
break;
}
throw new Exception("There is no associated matrix");
}
private double interpol(Coordinate coords, FunctionType functionType)
private double interpol<T>(Coordinate coords, Matrix<T> matrix, Func<T, double> valueGetter)
{
// select directions for projections
const bool normalX = true;// true - East, false West
const bool normalY = false;// true - North, false South
Index rc = projectionToCell(coords, functionType);
Coordinate center = cellToProjection(rc, functionType);
Index rc = matrix.ProjectionToCell(coords);
Coordinate center = matrix.CellToProjection(rc);
double xDiff = coords.X - center.X;
double yDiff = coords.Y - center.Y;
//calculate second index
int row2, col2;
if ((xDiff >= 0 && normalX) || (!normalX && xDiff < 0))
{
row2 = rc.Row >= countInList(functionType, true) - 1 ? rc.Row - 1 : rc.Row + 1;
row2 = rc.Row >= matrix.RowsCount() - 1 ? rc.Row - 1 : rc.Row + 1;
}
else
{
......@@ -412,7 +293,7 @@ namespace WindStressPRM
}
if ((yDiff >= 0 && normalY) || (!normalY && yDiff < 0))
{
col2 = rc.Col >= countInList(functionType, false) - 1 ? rc.Col - 1 : rc.Col + 1;
col2 = rc.Col >= matrix.ColumnCount() - 1 ? rc.Col - 1 : rc.Col + 1;
}
else
{
......@@ -423,11 +304,11 @@ namespace WindStressPRM
Index rcBotRight = new Index(Math.Max(row2, rc.Row), Math.Min(col2, rc.Col));
Index rcTopLeft = new Index(Math.Min(row2, rc.Row), Math.Max(col2, rc.Col));
Index rcTopRight = new Index(Math.Max(row2, rc.Row), Math.Max(col2, rc.Col));
double valBotLeft = valueForFunction(functionType, rcBotLeft);
double valBotRight = valueForFunction(functionType, rcBotRight);
double valTopLeft = valueForFunction(functionType, rcTopLeft);
double valTopRight = valueForFunction(functionType, rcTopRight);
Coordinate origin = cellToProjection(rcBotLeft, functionType);
double valBotLeft = valueGetter(matrix.Cells[rcBotLeft.Row, rcBotLeft.Col]);
double valBotRight = valueGetter(matrix.Cells[rcBotRight.Row, rcBotRight.Col]);
double valTopLeft = valueGetter(matrix.Cells[rcTopLeft.Row, rcTopLeft.Col]);
double valTopRight = valueGetter(matrix.Cells[rcTopRight.Row, rcTopRight.Col]);
Coordinate origin = matrix.CellToProjection(rcBotLeft);
bool testBotLeft = Double.IsNaN(valBotLeft);
bool testBotRight = Double.IsNaN(valBotRight);
......@@ -485,8 +366,8 @@ namespace WindStressPRM
}
}
// sizes for cell
double hx = cellSizeForFunction(functionType).Width;
double hy = cellSizeForFunction(functionType).Height;
double hx = matrix.Size.Width;
double hy = matrix.Size.Height;
// coefficients
double px = (coords.X - origin.X) / hx;
double py = (coords.Y - origin.Y) / hy;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment