// Copyright (C) Stichting Deltares 2018. All rights reserved.
//
// This file is part of the Dam Engine.
//
// The Dam Engine is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Io.XmlOutput;
namespace Deltares.DamEngine.Interface
{
///
/// Class to fill the output xml based on the results in DamProjectData
///
public class FillXmlOutputFromDam
{
///
/// Creates the output.
///
/// The dam project data.
///
public static Output CreateOutput(DamProjectData damProjectData)
{
// Echo of the input
Output output = new Output();
// Validation will be done using a static logmanager and passing logmessages. But this has still to be implemented.
// Validation using Attributes must be removed, using explicit validation methods (ValidatioResult) replaced. Still to be done.
output.ValidationResults = new Message[0];
// var mestel = 0;
// foreach (var res in valres)
// {
// var mes = new Message();
// mes.Message1 = res.Text;
// mes.MessageType = res.MessageType;
// output.ValidationResults[mestel] = mes;
// mestel++;
// }
// Results
output.Results = new OutputResults();
// Calculation messages
output.Results.CalculationMessages = new Message[0]; // Were do these come from?
// Actual results
output.Results.CalculationResults = new CalculationResults();
CreateDesignResultsOutput(damProjectData, output);
CreateLocationResultsOutput(damProjectData, output);
return output;
}
private static void CreateDesignResultsOutput(DamProjectData damProjectData, Output output)
{
// Design results
var designResults = damProjectData.DesignCalculations;
if (designResults.Count > 0)
{
output.Results.CalculationResults.DesignResults = new DesignResult[designResults.Count];
var designResultCount = 0;
foreach (var designResult in designResults)
{
var desResult = new DesignResult
{
BaseFileName = designResult.BaseFileName,
CalculationSubDir = designResult.CalculationSubDir,
LocationName = designResult.LocationName,
ScenarioName = designResult.ScenarioName,
ProfileName = designResult.ProfileName,
};
desResult.CalculationResult = ConversionHelper.ConvertToOutputCalculationResult(designResult.CalculationResult);
if (designResult.PipingDesignResults != null)
{
CreateDesignResultsPipingOutput(desResult, designResult);
}
if (designResult.StabilityDesignResults != null)
{
CreateDesignResultsStabilityOutput(desResult, designResult);
}
output.Results.CalculationResults.DesignResults[designResultCount] = desResult;
designResultCount++;
}
}
var calculationMessages = damProjectData.CalculationMessages;
if (calculationMessages != null)
{
output.Results.CalculationMessages = new Message[calculationMessages.Count];
for (int i = 0; i < calculationMessages.Count; i++)
{
var message = new Message();
message.MessageType = ConversionHelper.ConvertToInputMessageType(calculationMessages[i].MessageType);
message.Message1 = calculationMessages[i].Message;
output.Results.CalculationMessages[i] = message;
}
}
}
private static void CreateDesignResultsPipingOutput(DesignResult desResult, Data.General.Results.DesignResult designResult)
{
desResult.PipingDesignResults = new DesignResultPipingDesignResults
{
ResultMessage = designResult.PipingDesignResults.ResultMessage
};
if (designResult.PipingDesignResults.RedesignedSurfaceLine != null)
{
desResult.PipingDesignResults.RedesignedSurfaceLine = new SurfaceLine();
desResult.PipingDesignResults.RedesignedSurfaceLine.Name = designResult.PipingDesignResults.RedesignedSurfaceLine.Name;
desResult.PipingDesignResults.RedesignedSurfaceLine.Points =
new SurfaceLinePoint[designResult.PipingDesignResults.RedesignedSurfaceLine.CharacteristicPoints.Count];
for (int j = 0; j < designResult.PipingDesignResults.RedesignedSurfaceLine.CharacteristicPoints.Count; j++)
{
var characteristicPoint = designResult.PipingDesignResults.RedesignedSurfaceLine.CharacteristicPoints[j];
var inputPoint = new SurfaceLinePoint()
{
PointType = ConversionHelper.ConvertToInputPointType(characteristicPoint.CharacteristicPointType),
X = characteristicPoint.X,
Z = characteristicPoint.Z
};
desResult.PipingDesignResults.RedesignedSurfaceLine.Points[j] = inputPoint;
}
}
desResult.PipingDesignResults.UpliftFactorSpecified = designResult.PipingDesignResults.UpliftFactor.HasValue;
if (designResult.PipingDesignResults.UpliftFactor.HasValue) desResult.PipingDesignResults.UpliftFactor = designResult.PipingDesignResults.UpliftFactor.Value;
desResult.PipingDesignResults.HeaveFactorSpecified = designResult.PipingDesignResults.HeaveFactor.HasValue;
if (designResult.PipingDesignResults.HeaveFactor.HasValue) desResult.PipingDesignResults.HeaveFactor = designResult.PipingDesignResults.HeaveFactor.Value;
desResult.PipingDesignResults.BlighFactorSpecified = designResult.PipingDesignResults.BlighFactor.HasValue;
if (designResult.PipingDesignResults.BlighFactor.HasValue) desResult.PipingDesignResults.BlighFactor = designResult.PipingDesignResults.BlighFactor.Value;
desResult.PipingDesignResults.BlighHcriticalSpecified = designResult.PipingDesignResults.BlighHcritical.HasValue;
if (designResult.PipingDesignResults.BlighHcritical.HasValue) desResult.PipingDesignResults.BlighHcritical = designResult.PipingDesignResults.BlighHcritical.Value;
desResult.PipingDesignResults.Sellmeijer4ForcesFactorSpecified = designResult.PipingDesignResults.Sellmeijer4ForcesFactor.HasValue;
if (designResult.PipingDesignResults.Sellmeijer4ForcesFactor.HasValue) desResult.PipingDesignResults.Sellmeijer4ForcesFactor = designResult.PipingDesignResults.Sellmeijer4ForcesFactor.Value;
desResult.PipingDesignResults.Sellmeijer4ForcesHcriticalSpecified = designResult.PipingDesignResults.Sellmeijer4ForcesHcritical.HasValue;
if (designResult.PipingDesignResults.Sellmeijer4ForcesHcritical.HasValue) desResult.PipingDesignResults.Sellmeijer4ForcesHcritical = designResult.PipingDesignResults.Sellmeijer4ForcesHcritical.Value;
desResult.PipingDesignResults.SellmeijerVnkFactorSpecified = designResult.PipingDesignResults.SellmeijerVnkFactor.HasValue;
if (designResult.PipingDesignResults.SellmeijerVnkFactor.HasValue) desResult.PipingDesignResults.SellmeijerVnkFactor = designResult.PipingDesignResults.SellmeijerVnkFactor.Value;
desResult.PipingDesignResults.SellmeijerVnkHcriticalSpecified = designResult.PipingDesignResults.SellmeijerVnkHcritical.HasValue;
if (designResult.PipingDesignResults.SellmeijerVnkHcritical.HasValue) desResult.PipingDesignResults.SellmeijerVnkHcritical = designResult.PipingDesignResults.SellmeijerVnkHcritical.Value;
desResult.PipingDesignResults.Wbi2017FactorSpecified = designResult.PipingDesignResults.Wti2017Factor.HasValue;
if (designResult.PipingDesignResults.Wti2017Factor.HasValue) desResult.PipingDesignResults.Wbi2017Factor = designResult.PipingDesignResults.Wti2017Factor.Value;
desResult.PipingDesignResults.Wbi2017HcriticalSpecified = designResult.PipingDesignResults.Wti2017Hcritical.HasValue;
if (designResult.PipingDesignResults.Wti2017Hcritical.HasValue) desResult.PipingDesignResults.Wbi2017Hcritical = designResult.PipingDesignResults.Wti2017Hcritical.Value;
desResult.PipingDesignResults.ExitPointXSpecified = designResult.PipingDesignResults.LocalExitPointX.HasValue;
if (designResult.PipingDesignResults.LocalExitPointX.HasValue) desResult.PipingDesignResults.ExitPointX = designResult.PipingDesignResults.LocalExitPointX.Value;
if (designResult.PipingDesignResults.UpliftSituation.HasValue)
{
var uplift = designResult.PipingDesignResults.UpliftSituation.Value;
desResult.PipingDesignResults.UpliftSituation = new Io.XmlOutput.UpliftSituation
{
IsUplift = uplift.IsUplift,
Pl3MinUplift = uplift.Pl3MinUplift,
Pl3HeadAdjusted = uplift.Pl3HeadAdjusted,
Pl3LocationXMinUplift = uplift.Pl3LocationXMinUplift,
Pl4MinUplift = uplift.Pl4MinUplift,
Pl4HeadAdjusted = uplift.Pl4HeadAdjusted,
Pl4LocationXMinUplift = uplift.Pl4LocationXMinUplift
};
}
}
private static void CreateDesignResultsStabilityOutput(DesignResult desResult, Data.General.Results.DesignResult designResult)
{
desResult.StabilityDesignResults = new DesignResultStabilityDesignResults()
{
ResultMessage = designResult.StabilityDesignResults.ResultMessage
};
if (designResult.StabilityDesignResults.UpliftSituation.HasValue)
{
var uplift = designResult.StabilityDesignResults.UpliftSituation.Value;
desResult.StabilityDesignResults.UpliftSituation = new Io.XmlOutput.UpliftSituation
{
IsUplift = uplift.IsUplift,
Pl3MinUplift = uplift.Pl3MinUplift,
Pl3HeadAdjusted = uplift.Pl3HeadAdjusted,
Pl3LocationXMinUplift = uplift.Pl3LocationXMinUplift,
Pl4MinUplift = uplift.Pl4MinUplift,
Pl4HeadAdjusted = uplift.Pl4HeadAdjusted,
Pl4LocationXMinUplift = uplift.Pl4LocationXMinUplift
};
}
if (designResult.StabilityDesignResults.RedesignedSurfaceLine != null)
{
desResult.StabilityDesignResults.RedesignedSurfaceLine = new SurfaceLine
{
Name = designResult.StabilityDesignResults.RedesignedSurfaceLine.Name,
Points = new SurfaceLinePoint[designResult.StabilityDesignResults.RedesignedSurfaceLine.CharacteristicPoints.Count]
};
for (int j = 0; j < designResult.StabilityDesignResults.RedesignedSurfaceLine.CharacteristicPoints.Count; j++)
{
var characteristicPoint = designResult.StabilityDesignResults.RedesignedSurfaceLine.CharacteristicPoints[j];
var inputPoint = new SurfaceLinePoint()
{
PointType = ConversionHelper.ConvertToInputPointType(characteristicPoint.CharacteristicPointType),
X = characteristicPoint.X,
Z = characteristicPoint.Z
};
desResult.StabilityDesignResults.RedesignedSurfaceLine.Points[j] = inputPoint;
}
}
desResult.StabilityDesignResults.SafetyFactorSpecified = designResult.StabilityDesignResults.SafetyFactor.HasValue;
if (designResult.StabilityDesignResults.SafetyFactor.HasValue) desResult.StabilityDesignResults.SafetyFactor = designResult.StabilityDesignResults.SafetyFactor.Value;
desResult.StabilityDesignResults.Zone1SafetyFactorSpecified = designResult.StabilityDesignResults.Zone1SafetyFactor.HasValue;
if (designResult.StabilityDesignResults.Zone1SafetyFactor.HasValue) desResult.StabilityDesignResults.Zone1SafetyFactor = designResult.StabilityDesignResults.Zone1SafetyFactor.Value;
desResult.StabilityDesignResults.Zone1EntryPointXSpecified = designResult.StabilityDesignResults.LocalZone1EntryPointX.HasValue;
if (designResult.StabilityDesignResults.LocalZone1EntryPointX.HasValue) desResult.StabilityDesignResults.Zone1EntryPointX = designResult.StabilityDesignResults.LocalZone1EntryPointX.Value;
desResult.StabilityDesignResults.Zone1ExitPointXSpecified = designResult.StabilityDesignResults.LocalZone1ExitPointX.HasValue;
if (designResult.StabilityDesignResults.LocalZone1ExitPointX.HasValue) desResult.StabilityDesignResults.Zone1ExitPointX = designResult.StabilityDesignResults.LocalZone1ExitPointX.Value;
desResult.StabilityDesignResults.Zone2SafetyFactorSpecified = designResult.StabilityDesignResults.Zone2SafetyFactor.HasValue;
if (designResult.StabilityDesignResults.Zone2SafetyFactor.HasValue) desResult.StabilityDesignResults.Zone2SafetyFactor = designResult.StabilityDesignResults.Zone2SafetyFactor.Value;
desResult.StabilityDesignResults.Zone2EntryPointXSpecified = designResult.StabilityDesignResults.LocalZone2EntryPointX.HasValue;
if (designResult.StabilityDesignResults.LocalZone2EntryPointX.HasValue) desResult.StabilityDesignResults.Zone2EntryPointX = designResult.StabilityDesignResults.LocalZone2EntryPointX.Value;
desResult.StabilityDesignResults.Zone2ExitPointXSpecified = designResult.StabilityDesignResults.LocalZone2ExitPointX.HasValue;
if (designResult.StabilityDesignResults.LocalZone2ExitPointX.HasValue) desResult.StabilityDesignResults.Zone2ExitPointX = designResult.StabilityDesignResults.LocalZone2ExitPointX.Value;
desResult.StabilityDesignResults.NumberOfIterationsSpecified = designResult.StabilityDesignResults.NumberOfIterations.HasValue;
if (designResult.StabilityDesignResults.NumberOfIterations.HasValue) desResult.StabilityDesignResults.NumberOfIterations = designResult.StabilityDesignResults.NumberOfIterations.Value;
}
private static void CreateLocationResultsOutput(DamProjectData damProjectData, Output output)
{
// Calculation results (per location)
output.Results.CalculationResults.LocationResults = new CalculationResultsLocationResult[damProjectData.LocationJobs.Count];
var jobtel = 0;
foreach (var locationJob in damProjectData.LocationJobs)
{
var outputLocationResult = new CalculationResultsLocationResult();
// Stability TimeSerie (later)
// Piping TimeSerie (later)
// RegionalScenarios results
outputLocationResult.RegionalScenariosResult = new CalculationResultsLocationResultRegionalScenariosResult();
outputLocationResult.RegionalScenariosResult.SafetyFactor = locationJob.LocationResult.RegionalScenariosResult.SafetyFactor;
outputLocationResult.RegionalScenariosResult.CalculationResult = ConversionHelper.ConvertToOutputCalculationResult(locationJob.LocationResult.RegionalScenariosResult.CalculationResult);
outputLocationResult.RegionalScenariosResult.RegionalScenarioResult = new RegionalScenarioResult[locationJob.LocationResult.RegionalScenariosResult.RegionalScenarioResults.Count];
var scentel = 0;
foreach (var rwScenarioResult in locationJob.LocationResult.RegionalScenariosResult.RegionalScenarioResults)
{
var outputRwScenarioResult = new RegionalScenarioResult();
outputRwScenarioResult.LoadSituation = ConversionHelper.ConvertToOutputLoadSituation(rwScenarioResult.LoadSituation);
outputRwScenarioResult.DikeDrySensitivity = ConversionHelper.ConvertToOutputDikeDrySensitivity(rwScenarioResult.DikeDrySensitivity);
outputRwScenarioResult.HydraulicShortcutType = ConversionHelper.ConvertToOutputHydraulicShortcutType(rwScenarioResult.HydraulicShortcutType);
outputRwScenarioResult.UpliftType = ConversionHelper.ConvertToOutputUpliftType(rwScenarioResult.UpliftType);
outputRwScenarioResult.ModelOption = ConversionHelper.ConvertToOutputMStabModelType(rwScenarioResult.ModelOption);
outputRwScenarioResult.ScenarioType = ConversionHelper.ConvertToOutputScenarioType(rwScenarioResult.ScenarioType);
outputRwScenarioResult.CalculationResult = ConversionHelper.ConvertToOutputCalculationResult(rwScenarioResult.CalculationResult);
outputRwScenarioResult.SafetyFactor = rwScenarioResult.SafetyFactor;
outputRwScenarioResult.RegionalScenarioProfileResults = new RegionalScenarioResultRegionalScenarioProfileResult[rwScenarioResult.RegionalScenarioProfileResults.Count];
var proftel = 0;
foreach (var profileResult in rwScenarioResult.RegionalScenarioProfileResults)
{
var outputProfileResult = new RegionalScenarioResultRegionalScenarioProfileResult();
outputProfileResult.LocationName = profileResult.LocationName;
outputProfileResult.LoadSituation = ConversionHelper.ConvertToOutputLoadSituation(profileResult.LoadSituation);
outputProfileResult.DikeDrySensitivity = ConversionHelper.ConvertToOutputDikeDrySensitivity(profileResult.DikeDrySensitivity);
outputProfileResult.HydraulicShortcutType = ConversionHelper.ConvertToOutputHydraulicShortcutType(profileResult.HydraulicShortcutType);
outputProfileResult.UpliftType = ConversionHelper.ConvertToOutputUpliftType(profileResult.UpliftType);
outputProfileResult.MStabModelOption = ConversionHelper.ConvertToOutputMStabModelType(profileResult.MstabModelOption);
outputProfileResult.PipingModelOption = ConversionHelper.ConvertToOutputPipingModelType(profileResult.PipingModelOption);
outputProfileResult.ScenarioType = ConversionHelper.ConvertToOutputScenarioType(profileResult.ScenarioType);
outputProfileResult.SoilProfileName = profileResult.SoilProfileName;
outputProfileResult.SoilProfileProbability = profileResult.SoilProfileProbability;
outputProfileResult.FailureMechanismType = ConversionHelper.ConvertToInputFailureMechanismSystemType(profileResult.FailureMechanismType);
outputProfileResult.BaseFileName = profileResult.BaseFileName;
outputProfileResult.RegionalResult = new RegionalResult();
outputProfileResult.RegionalResult.RegionalResultType = ConversionHelper.ConvertToOutputRegionalResultType(profileResult.RegionalResultType);
outputProfileResult.RegionalResult.SafetyFactor = profileResult.SafetyFactor;
outputProfileResult.RegionalResult.ProbabilityOfFailure = profileResult.ProbabilityOfFailure;
outputProfileResult.RegionalResult.CalculationResult = ConversionHelper.ConvertToOutputCalculationResult(profileResult.CalculationResult);
outputLocationResult.RegionalScenariosResult.RegionalScenarioResult[scentel].RegionalScenarioProfileResults[proftel] = outputProfileResult;
proftel++;
}
outputLocationResult.RegionalScenariosResult.RegionalScenarioResult[scentel] = outputRwScenarioResult;
scentel++;
// RWSchematizationFactors Result later
// Note that xsd should be adapted first: the types should be stored as int, not as string! This to be able to reuse the converters
// outputLocationResult.RegionalSchematizationFactorsResult = new CalculationResultsLocationResultRegionalSchematizationFactorsResult();
// outputLocationResult.RegionalSchematizationFactorsResult.RegionalSchematizationFactorResult = new CalculationResultsLocationResultRegionalSchematizationFactorsResultRegionalSchematizationFactorResult[damProjectData.SchematizationFactors.Count];
// var factortel = 0;
// foreach (var rwSchematizationFactorResult in damProjectData.SchematizationFactors)
// {
// var factorResult = new CalculationResultsLocationResultRegionalSchematizationFactorsResultRegionalSchematizationFactorResult();
// factorResult.LocationName = rwSchematizationFactorResult.LocationName;
// factorResult.SchematizationType = rwSchematizationFactorResult.SchematizationType;
// factorResult.SoilProfileName = rwSchematizationFactorResult.SoilProfileName;
// factorResult.OriginalDecisiveSoilProfileName = rwSchematizationFactorResult.OriginalDecisiveSoilProfileName;
// factorResult.SchematizationFactor = rwSchematizationFactorResult.SchematizationFactor;
// factorResult.SummedProfileProbability = rwSchematizationFactorResult.SummedProfileProbability;
// factorResult.DecisiveRegionalScenarioName = rwSchematizationFactorResult.DecisiveScenarioName;
// factorResult.DetrimentFactor = rwSchematizationFactorResult.DetrimentFactor;
// factorResult.SafetyFactor = rwSchematizationFactorResult.SafetyFactor;
// factorResult.CalculationResult = ConversionHelper.ConvertToOutputCalculationResult(rwSchematizationFactorResult.CalculationResult);
// outputLocationResult.RegionalSchematizationFactorsResult.RegionalSchematizationFactorResult[factortel] = factorResult;
// factortel++;
// }
}
output.Results.CalculationResults.LocationResults[jobtel] = outputLocationResult;
jobtel++;
}
}
}
}