Ndm prestrain logic was changed

This commit is contained in:
Evgeny Redikultsev
2024-08-26 22:25:49 +05:00
parent c1b9f80a96
commit f5deffd237
16 changed files with 48 additions and 34 deletions

View File

@@ -60,7 +60,7 @@
<Compile Update="Windows\MainWindow\AboutView.xaml.cs"> <Compile Update="Windows\MainWindow\AboutView.xaml.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Update="Windows\MainWindow\AnalisesManagerView.xaml.cs"> <Compile Update="Windows\MainWindow\AnalysesManagerView.xaml.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Update="Windows\MainWindow\Materials\HeadMaterialView.xaml.cs"> <Compile Update="Windows\MainWindow\Materials\HeadMaterialView.xaml.cs">
@@ -155,7 +155,7 @@
<Page Update="Windows\MainWindow\AboutView.xaml"> <Page Update="Windows\MainWindow\AboutView.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Update="Windows\MainWindow\AnalisesManagerView.xaml"> <Page Update="Windows\MainWindow\AnalysesManagerView.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Update="Windows\MainWindow\Materials\HeadMaterialView.xaml"> <Page Update="Windows\MainWindow\Materials\HeadMaterialView.xaml">

View File

@@ -149,9 +149,10 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
CenterY = valuePoint.areaPoint.Point.Y, CenterY = valuePoint.areaPoint.Point.Y,
Material = material, Material = material,
}; };
ndm.Prestrain = (userPrestrain.Mx + autoPrestrain.Mx) * valuePoint.areaPoint.Point.Y var prestrain = (userPrestrain.Mx + autoPrestrain.Mx) * valuePoint.areaPoint.Point.Y
+ (userPrestrain.My + autoPrestrain.My) * valuePoint.areaPoint.Point.X + (userPrestrain.My + autoPrestrain.My) * valuePoint.areaPoint.Point.X
+ userPrestrain.Nz + autoPrestrain.Nz; + userPrestrain.Nz + autoPrestrain.Nz;
ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, prestrain);
return ndm; return ndm;
} }
private List<string> GetValueLabels(IEnumerable<ForceResultFunc> selectedDelegates) private List<string> GetValueLabels(IEnumerable<ForceResultFunc> selectedDelegates)

View File

@@ -1,12 +1,12 @@
<Window x:Class="StructureHelper.Windows.MainWindow.AnalisesManagerView" <Window x:Class="StructureHelper.Windows.MainWindow.AnalysesManagerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:StructureHelper.Windows.MainWindow" xmlns:local="clr-namespace:StructureHelper.Windows.MainWindow"
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance local:AnalisesManagerViewModel}" d:DataContext="{d:DesignInstance local:AnalysesManagerViewModel}"
Title="Analises Manager" Height="450" Width="800" MinHeight="400" MinWidth="600"> Title="Analyses Manager" Height="450" Width="800" MinHeight="400" MinWidth="600">
<Grid> <Grid>
<DockPanel> <DockPanel>
<ToolBarTray DockPanel.Dock="Top"> <ToolBarTray DockPanel.Dock="Top">

View File

@@ -17,9 +17,9 @@ namespace StructureHelper.Windows.MainWindow
/// <summary> /// <summary>
/// Логика взаимодействия для AnalisesManagerView.xaml /// Логика взаимодействия для AnalisesManagerView.xaml
/// </summary> /// </summary>
public partial class AnalisesManagerView : Window public partial class AnalysesManagerView : Window
{ {
public AnalisesManagerView() public AnalysesManagerView()
{ {
InitializeComponent(); InitializeComponent();
} }

View File

@@ -7,13 +7,13 @@ using System.Threading.Tasks;
namespace StructureHelper.Windows.MainWindow namespace StructureHelper.Windows.MainWindow
{ {
public class AnalisesManagerViewModel : ViewModelBase public class AnalysesManagerViewModel : ViewModelBase
{ {
public FileLogic FileLogic { get; } public FileLogic FileLogic { get; }
public DiagramLogic DiagramLogic { get; } public DiagramLogic DiagramLogic { get; }
public AnalisesLogic AnalisesLogic { get; } public AnalisesLogic AnalisesLogic { get; }
public AnalisesManagerViewModel() public AnalysesManagerViewModel()
{ {
FileLogic = new(); FileLogic = new();
DiagramLogic = new(); DiagramLogic = new();

View File

@@ -339,7 +339,7 @@
<Expander.Header> <Expander.Header>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Image Style="{StaticResource ButtonImage16}" Source="/Windows/MainWindow/Analysis32.png" /> <Image Style="{StaticResource ButtonImage16}" Source="/Windows/MainWindow/Analysis32.png" />
<TextBlock Text="Analisis" Margin="5,0,0,0"/> <TextBlock Text="Analysis" Margin="5,0,0,0"/>
</StackPanel> </StackPanel>
</Expander.Header> </Expander.Header>
<Expander.ContextMenu> <Expander.ContextMenu>

View File

@@ -62,7 +62,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
var point = new RebarPrimitive() var point = new RebarPrimitive()
{ {
Area = area1, Area = area1,
Name = "Left bottom point", Name = "Left bottom rebar",
HeadMaterial = reinforcement, HeadMaterial = reinforcement,
HostPrimitive=concreteBlock HostPrimitive=concreteBlock
}; };
@@ -72,7 +72,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
point = new RebarPrimitive() point = new RebarPrimitive()
{ {
Area = area1, Area = area1,
Name = "Right bottom point", Name = "Right bottom rebar",
HeadMaterial = reinforcement, HeadMaterial = reinforcement,
HostPrimitive = concreteBlock HostPrimitive = concreteBlock
}; };
@@ -82,7 +82,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
point = new RebarPrimitive() point = new RebarPrimitive()
{ {
Area = area2, Area = area2,
Name = "Left top point", Name = "Left top rebar",
HeadMaterial = reinforcement, HeadMaterial = reinforcement,
HostPrimitive = concreteBlock HostPrimitive = concreteBlock
}; };
@@ -92,7 +92,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
point = new RebarPrimitive() point = new RebarPrimitive()
{ {
Area = area2, Area = area2,
Name = "Right top point", Name = "Right top rebar",
HeadMaterial = reinforcement, HeadMaterial = reinforcement,
HostPrimitive = concreteBlock HostPrimitive = concreteBlock
}; };
@@ -115,11 +115,11 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
double dist = (xs[1] - xs[0]) / count; double dist = (xs[1] - xs[0]) / count;
for (int i = 1; i < count; i++) for (int i = 1; i < count; i++)
{ {
point = new RebarPrimitive() { Area = area1, Name = $"Bottom point {i}", HeadMaterial = reinforcement, HostPrimitive = concreteBlock }; point = new RebarPrimitive() { Area = area1, Name = $"Bottom rebar {i}", HeadMaterial = reinforcement, HostPrimitive = concreteBlock };
point.Center.X = xs[0] + dist * i; point.Center.X = xs[0] + dist * i;
point.Center.Y = ys[0]; point.Center.Y = ys[0];
primitives.Add(point); primitives.Add(point);
point = new RebarPrimitive() {Area = area2, Name = $"Top point {i}", HeadMaterial = reinforcement, HostPrimitive = concreteBlock }; point = new RebarPrimitive() {Area = area2, Name = $"Top rebar {i}", HeadMaterial = reinforcement, HostPrimitive = concreteBlock };
point.Center.X = xs[0] + dist * i; point.Center.X = xs[0] + dist * i;
point.Center.Y = ys[1]; point.Center.Y = ys[1];
primitives.Add(point); primitives.Add(point);

View File

@@ -42,7 +42,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.RC
{ {
inputData.ReinforcementStress = inputData.ReinforcementStrength; inputData.ReinforcementStress = inputData.ReinforcementStrength;
} }
inputData.IsPrestressed = ndm.Prestrain > 0.0005d ? true : false; inputData.IsPrestressed = ndm.PrestrainLogic.GetByType(PrestrainTypes.Prestrain).Sum(x => x.PrestrainValue) > 0.0005d ? true : false;
inputData.LappedCountRate = lappedCountRate; inputData.LappedCountRate = lappedCountRate;
return inputData; return inputData;
} }

View File

@@ -32,7 +32,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
/// <summary> /// <summary>
/// Width of crack from long term loads with short term properties of concrete /// Width of crack from long term loads with short term properties of concrete
/// </summary> /// </summary>
private double longTermLoadShortConcreteWidth; private double longTermLoadShortConcreteCrackWidth;
private IRebarStressCalculator rebarStressCalculator; private IRebarStressCalculator rebarStressCalculator;
public IRebarCrackCalculatorInputData InputData { get; set; } public IRebarCrackCalculatorInputData InputData { get; set; }
@@ -54,6 +54,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
public void Run() public void Run()
{ {
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Debug);
PrepareNewResult(); PrepareNewResult();
ProcessCrackWidthCalculation(); ProcessCrackWidthCalculation();
} }
@@ -69,25 +70,31 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private void ProcessCrackWidthCalculation() private void ProcessCrackWidthCalculation()
{ {
crackWidthLogic.TraceLogger = TraceLogger;
CrackWidthRebarTupleResult longRebarResult = ProcessLongTermCalculations(); CrackWidthRebarTupleResult longRebarResult = ProcessLongTermCalculations();
CrackWidthRebarTupleResult shortRebarResult = ProcessShortTermCalculations(); CrackWidthRebarTupleResult shortRebarResult = ProcessShortTermCalculations();
result.LongTermResult = longRebarResult; result.LongTermResult = longRebarResult;
TraceLogger?.AddMessage("Long term result has been obtained succesfully", TraceLogStatuses.Debug);
result.ShortTermResult = shortRebarResult; result.ShortTermResult = shortRebarResult;
TraceLogger?.AddMessage("Short term result has been obtained succesfully", TraceLogStatuses.Debug);
} }
private CrackWidthRebarTupleResult ProcessShortTermCalculations() private CrackWidthRebarTupleResult ProcessShortTermCalculations()
{ {
TraceLogger?.AddMessage($"Short term softening factor calculation");
crackSofteningLogic = GetSofteningLogic(InputData.ShortRebarData); crackSofteningLogic = GetSofteningLogic(InputData.ShortRebarData);
rebarStressResult = GetRebarStressResult(InputData.ShortRebarData); rebarStressResult = GetRebarStressResult(InputData.ShortRebarData);
acrc2InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.ShortRebarData, CalcTerms.ShortTerm); acrc3InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.LongRebarData, CalcTerms.ShortTerm);
crackWidthLogic.InputData = acrc3InputData; crackWidthLogic.InputData = acrc3InputData;
longTermLoadShortConcreteWidth = crackWidthLogic.GetCrackWidth(); longTermLoadShortConcreteCrackWidth = crackWidthLogic.GetCrackWidth();
TraceLogger?.AddMessage($"Crack width from long term load with short term factor of concrete acrc,3 = {longTermLoadShortConcreteCrackWidth}(m)", TraceLogStatuses.Debug);
acrc2InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.ShortRebarData, CalcTerms.ShortTerm);
crackWidthLogic.InputData = acrc2InputData; crackWidthLogic.InputData = acrc2InputData;
fullLoadShortConcreteCrackWidth = crackWidthLogic.GetCrackWidth(); fullLoadShortConcreteCrackWidth = crackWidthLogic.GetCrackWidth();
TraceLogger?.AddMessage($"Crack width from full load with short term factor of concrete acrc,2 = {fullLoadShortConcreteCrackWidth}(m)", TraceLogStatuses.Debug);
double acrcShort = longTermLoadLongTermConcreteCrackWidth + fullLoadShortConcreteCrackWidth - longTermLoadShortConcreteWidth; double acrcShort = longTermLoadLongTermConcreteCrackWidth + fullLoadShortConcreteCrackWidth - longTermLoadShortConcreteCrackWidth;
TraceLogger?.AddMessage($"Short crack width acrc = acrc,1 + acrc,2 - acrc,3 = {longTermLoadLongTermConcreteCrackWidth} + {fullLoadShortConcreteCrackWidth} - {longTermLoadShortConcreteWidth} = {acrcShort}(m)"); TraceLogger?.AddMessage($"Short crack width acrc = acrc,1 + acrc,2 - acrc,3 = {longTermLoadLongTermConcreteCrackWidth} + {fullLoadShortConcreteCrackWidth} - {longTermLoadShortConcreteCrackWidth} = {acrcShort}(m)");
var shortRebarResult = new CrackWidthRebarTupleResult() var shortRebarResult = new CrackWidthRebarTupleResult()
{ {
CrackWidth = acrcShort, CrackWidth = acrcShort,
@@ -101,12 +108,13 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private CrackWidthRebarTupleResult ProcessLongTermCalculations() private CrackWidthRebarTupleResult ProcessLongTermCalculations()
{ {
TraceLogger?.AddMessage($"Long term softening factor calculation");
crackSofteningLogic = GetSofteningLogic(InputData.LongRebarData); crackSofteningLogic = GetSofteningLogic(InputData.LongRebarData);
rebarStressResult = GetRebarStressResult(InputData.LongRebarData); rebarStressResult = GetRebarStressResult(InputData.LongRebarData);
acrc1InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.LongRebarData, CalcTerms.LongTerm); acrc1InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.LongRebarData, CalcTerms.LongTerm);
acrc3InputData = GetCrackWidthInputData(crackSofteningLogic, InputData.LongRebarData, CalcTerms.ShortTerm);
crackWidthLogic.InputData = acrc1InputData; crackWidthLogic.InputData = acrc1InputData;
longTermLoadLongTermConcreteCrackWidth = crackWidthLogic.GetCrackWidth(); longTermLoadLongTermConcreteCrackWidth = crackWidthLogic.GetCrackWidth();
TraceLogger?.AddMessage($"Crack width from long term load with long term factor of concrete acrc,1 = {longTermLoadLongTermConcreteCrackWidth}(m)", TraceLogStatuses.Debug);
var longRebarResult = new CrackWidthRebarTupleResult() var longRebarResult = new CrackWidthRebarTupleResult()
{ {
CrackWidth = longTermLoadLongTermConcreteCrackWidth, CrackWidth = longTermLoadLongTermConcreteCrackWidth,
@@ -137,6 +145,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
ICrackSofteningLogic crackSofteningLogic; ICrackSofteningLogic crackSofteningLogic;
if (InputData.UserCrackInputData.SetSofteningFactor == true) if (InputData.UserCrackInputData.SetSofteningFactor == true)
{ {
TraceLogger?.AddMessage("User value of softening factor is assigned");
crackSofteningLogic = new StabSoftetingLogic(InputData.UserCrackInputData.SofteningFactor) crackSofteningLogic = new StabSoftetingLogic(InputData.UserCrackInputData.SofteningFactor)
{ {
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50) TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
@@ -144,6 +153,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
} }
else else
{ {
TraceLogger?.AddMessage("Exact value of softening factor is calculated");
crackSofteningLogic = new RebarStressSofteningLogic() crackSofteningLogic = new RebarStressSofteningLogic()
{ {
RebarPrimitive = InputData.RebarPrimitive, RebarPrimitive = InputData.RebarPrimitive,
@@ -156,7 +166,6 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private ICrackWidthLogicInputData GetCrackWidthInputData(ICrackSofteningLogic crackSofteningLogic, IRebarCrackInputData inputData, CalcTerms calcTerm) private ICrackWidthLogicInputData GetCrackWidthInputData(ICrackSofteningLogic crackSofteningLogic, IRebarCrackInputData inputData, CalcTerms calcTerm)
{ {
var factoryInputData = new CrackWidthLogicInputDataFactory(crackSofteningLogic) var factoryInputData = new CrackWidthLogicInputDataFactory(crackSofteningLogic)
{ {
CalcTerm = calcTerm, CalcTerm = calcTerm,

View File

@@ -52,7 +52,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
} }
else else
{ {
TraceLogger?.AddMessage($"Rebar elongation Epsilon = {inputData.RebarStrain} - {inputData.ConcreteStrain} = {rebarElongation}(dimensionless)"); TraceLogger?.AddMessage($"Rebar elongation Epsilon = {inputData.RebarStrain} - ({inputData.ConcreteStrain}) = {rebarElongation}(dimensionless)");
widthOfCrack = rebarElongation * inputData.LengthBetweenCracks; widthOfCrack = rebarElongation * inputData.LengthBetweenCracks;
widthOfCrack *= inputData.TermFactor * inputData.BondFactor * inputData.StressStateFactor * inputData.PsiSFactor; widthOfCrack *= inputData.TermFactor * inputData.BondFactor * inputData.StressStateFactor * inputData.PsiSFactor;
TraceLogger?.AddMessage($"Width of crack a,crc = {inputData.TermFactor} * {inputData.BondFactor} * {inputData.StressStateFactor} * {inputData.PsiSFactor} * {rebarElongation} * {inputData.LengthBetweenCracks}(m) = {widthOfCrack}(m)"); TraceLogger?.AddMessage($"Width of crack a,crc = {inputData.TermFactor} * {inputData.BondFactor} * {inputData.StressStateFactor} * {inputData.PsiSFactor} * {rebarElongation} * {inputData.LengthBetweenCracks}(m) = {widthOfCrack}(m)");

View File

@@ -63,7 +63,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
var strainMatrix = TupleConverter.ConvertToLoaderStrainMatrix(strainTuple); var strainMatrix = TupleConverter.ConvertToLoaderStrainMatrix(strainTuple);
result.RebarStrain = stressLogic.GetSectionStrain(strainMatrix, rebarNdm); result.RebarStrain = stressLogic.GetSectionStrain(strainMatrix, rebarNdm);
result.RebarStress = stressLogic.GetStress(strainMatrix, rebarNdm); result.RebarStress = stressLogic.GetStress(strainMatrix, rebarNdm);
result.ConcreteStrain = -concreteNdm.Prestrain; result.ConcreteStrain = -concreteNdm.PrestrainLogic.GetAll().Sum(x => x.PrestrainValue);
} }
private void PrepareNewResult() private void PrepareNewResult()

View File

@@ -1,5 +1,6 @@
using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models; using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Loggers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -64,7 +65,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
/// <inheritdoc/> /// <inheritdoc/>
public double GetSofteningFactor() public double GetSofteningFactor()
{ {
TraceLogger?.AddMessage($"Calculator type: {GetType()}", TraceLogStatuses.Service); TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Debug);
TraceLogger?.AddMessage($"Logic of calculation of psi_s factor based on exponential softening model"); TraceLogger?.AddMessage($"Logic of calculation of psi_s factor based on exponential softening model");
TraceLogger?.AddMessage($"psi_s = 1 - BettaFactor * ForceRatio ^ PowerFactor"); TraceLogger?.AddMessage($"psi_s = 1 - BettaFactor * ForceRatio ^ PowerFactor");
TraceLogger?.AddMessage($"But not less than psi_s_min = {PsiSMin}"); TraceLogger?.AddMessage($"But not less than psi_s_min = {PsiSMin}");

View File

@@ -69,6 +69,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
public double GetSofteningFactor() public double GetSofteningFactor()
{ {
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Debug);
if (IsResultActual == false) if (IsResultActual == false)
{ {
GetRebarAndConcreteNdms(); GetRebarAndConcreteNdms();
@@ -106,8 +107,10 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
rebarActualStrain = actualRebarResult.RebarStrain; rebarActualStrain = actualRebarResult.RebarStrain;
rebarActualStress = actualRebarResult.RebarStress; rebarActualStress = actualRebarResult.RebarStress;
TraceLogger?.AddMessage($"Actual strain of rebar EpsilonS = {rebarActualStrain}(dimensionless)"); TraceLogger?.AddMessage($"Actual strain of rebar EpsilonS = {rebarActualStrain}(dimensionless)");
concreteStrainActual = concreteNdm.Prestrain; concreteStrainActual = concreteNdm
//concreteStrainActual = stressLogic.GetTotalStrain(TupleConverter.ConvertToLoaderStrainMatrix(strainTupleActual), concreteNdm); .PrestrainLogic
.GetAll()
.Sum(x => x.PrestrainValue);
TraceLogger?.AddMessage($"Actual strain of concrete on the axis of rebar EpsilonC = {concreteStrainActual}(dimensionless)"); TraceLogger?.AddMessage($"Actual strain of concrete on the axis of rebar EpsilonC = {concreteStrainActual}(dimensionless)");
if (crackResult.IsSectionCracked == false) if (crackResult.IsSectionCracked == false)
{ {
@@ -126,7 +129,6 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
TraceLogger?.AddMessage($"Actual stress in rebar Sigma,s = {rebarActualStress}(Pa)"); TraceLogger?.AddMessage($"Actual stress in rebar Sigma,s = {rebarActualStress}(Pa)");
double psiS = GetExponentialSofteningFactor(stressInCracking); double psiS = GetExponentialSofteningFactor(stressInCracking);
TraceLogger?.AddMessage($"PsiS = {psiS}"); TraceLogger?.AddMessage($"PsiS = {psiS}");
//return 0.94d;
return psiS; return psiS;
} }

View File

@@ -38,10 +38,11 @@ namespace StructureHelperLogics.Services.NdmPrimitives
var material = ndm.Material; var material = ndm.Material;
var materialFunc = material.Diagram; var materialFunc = material.Diagram;
var newMaterialFunc = (IEnumerable<double> parameters, double strain) => strain * material.InitModulus; var newMaterialFunc = (IEnumerable<double> parameters, double strain) => strain * material.InitModulus;
var existingPrestrain = ndm.Prestrain; var existingPrestrain = ndm.PrestrainLogic.GetAll().Sum(x => x.PrestrainValue);
var newPrestrain = materialFunc(null, existingPrestrain) / material.InitModulus; var newPrestrain = materialFunc(null, existingPrestrain) / material.InitModulus;
ndm.Material.Diagram = newMaterialFunc; ndm.Material.Diagram = newMaterialFunc;
ndm.Prestrain = newPrestrain; ndm.PrestrainLogic.DeleteAll();
ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, newPrestrain);
} }
return ndms; return ndms;
} }