Index: src/Common/DelftTools.Shell.Core/Workflow/IActivity.cs =================================================================== diff -u -r5fc71a385897af92ccb092f2f969b5709afab85a -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Common/DelftTools.Shell.Core/Workflow/IActivity.cs (.../IActivity.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) +++ src/Common/DelftTools.Shell.Core/Workflow/IActivity.cs (.../IActivity.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -6,6 +6,11 @@ /// /// Defines basic activity which can be executed as part of the workflow. /// + /// + /// Regular workflow for an activity is: Initialize -> Execute -> Finish -> Cleanup. + /// Regular workflow for an activity with an error occurring: [Initialize/Execute/Finish] -> ! Exception / Error ! -> Cleanup. + /// Regular workflow for an activity being cancelled: [Initialize/Execute/Finish] -> ! Cancel ! -> Cleanup. + /// public interface IActivity : IProjectItem /* TODO: wrap it with the ProjectItem instead */ { /// @@ -34,7 +39,8 @@ string ProgressText { get; } /// - /// Initializes activity. If initialization step is successful, will change to . + /// Initializes activity. If initialization step is successful, + /// will change to . /// void Initialize(); @@ -58,6 +64,8 @@ /// /// Cleans all resources required during execution. /// + /// This method will always be called, even when an exception occurs. Take + /// this into account when implementing this method. void Cleanup(); } } \ No newline at end of file Index: src/DeltaShell/DeltaShell.Gui/Forms/MessageWindow/MessageWindow.cs =================================================================== diff -u -rf35260d1876528f1ea61908a8d5fc3cdb5deb238 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/DeltaShell/DeltaShell.Gui/Forms/MessageWindow/MessageWindow.cs (.../MessageWindow.cs) (revision f35260d1876528f1ea61908a8d5fc3cdb5deb238) +++ src/DeltaShell/DeltaShell.Gui/Forms/MessageWindow/MessageWindow.cs (.../MessageWindow.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -1,10 +1,10 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using DelftTools.Controls; -using DelftTools.Shell.Core; using DelftTools.Shell.Gui.Forms; using DeltaShell.Gui.Properties; using log4net.Core; @@ -15,7 +15,7 @@ { public event EventHandler OnError; private readonly Dictionary levelImageName; - private readonly ObservableList newMessages = new ObservableList(); + private readonly ConcurrentQueue newMessages = new ConcurrentQueue(); private bool filtering; public MessageWindow() @@ -62,7 +62,7 @@ private void PopulateMessages() { - if (newMessages.Count == 0) + if (newMessages.IsEmpty) { return; } @@ -71,15 +71,15 @@ messageWindowData.Messages.BeginLoadData(); try { - foreach (var msg in newMessages) + MessageData msg; + while (newMessages.TryDequeue(out msg)) { messageWindowData.Messages.AddMessagesRow(msg.ImageName, msg.Time, msg.Message); hasError = hasError || (msg.ImageName == "ERROR" && OnError != null); } } finally { - newMessages.Clear(); messageWindowData.Messages.EndLoadData(); } @@ -298,11 +298,10 @@ /// /// /// - /// /// public void AddMessage(Level level, DateTime time, string message) { - newMessages.Add(new MessageData + newMessages.Enqueue(new MessageData { ImageName = level.ToString(), Time = time, Message = message }); Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationInputsNodePresenter.cs =================================================================== diff -u -r308703c02f5602704483e204ad9a475d90eece69 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationInputsNodePresenter.cs (.../PipingCalculationInputsNodePresenter.cs) (revision 308703c02f5602704483e204ad9a475d90eece69) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationInputsNodePresenter.cs (.../PipingCalculationInputsNodePresenter.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Windows.Forms; using DelftTools.Controls; +using DelftTools.Shell.Core.Workflow; using DelftTools.Utils.Collections; using Ringtoets.Piping.Data; @@ -29,6 +30,11 @@ } } + /// + /// Injection points for a method to cause an to be scheduled for execution. + /// + public Action RunActivityAction { get; set; } + public void UpdateNode(ITreeNode parentNode, ITreeNode node, object nodeData) { node.Text = ((PipingCalculationInputs)nodeData).PipingData.Name; @@ -113,8 +119,7 @@ private void PerformPipingCalculation(PipingData pipingData) { - PipingCalculationService.PerfromValidatedCalculation(pipingData); - pipingData.NotifyObservers(); + RunActivityAction(new PipingCalculationActivity(pipingData)); } } } \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Plugin/WtiGuiPlugin.cs =================================================================== diff -u -rccc7c8935c7d43414fa0aa2393598bd0752fc8d2 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Plugin/WtiGuiPlugin.cs (.../WtiGuiPlugin.cs) (revision ccc7c8935c7d43414fa0aa2393598bd0752fc8d2) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Plugin/WtiGuiPlugin.cs (.../WtiGuiPlugin.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -70,7 +70,10 @@ public override IEnumerable GetProjectTreeViewNodePresenters() { yield return new WtiProjectNodePresenter(); - yield return new PipingCalculationInputsNodePresenter(); + yield return new PipingCalculationInputsNodePresenter + { + RunActivityAction = Gui.Application.ActivityRunner.Enqueue + }; yield return new PipingFailureMechanismNodePresenter(); yield return new PipingSurfaceLineCollectionNodePresenter { Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationActivity.cs =================================================================== diff -u --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationActivity.cs (revision 0) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationActivity.cs (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -0,0 +1,59 @@ +using DelftTools.Shell.Core.Workflow; + +using Ringtoets.Piping.Data; + +namespace Ringtoets.Piping.Service +{ + /// + /// for running a piping calculation. + /// + public class PipingCalculationActivity : Activity + { + private readonly PipingData pipingData; + + public PipingCalculationActivity(PipingData pipingData) + { + this.pipingData = pipingData; + } + + public override string Name + { + get + { + return pipingData.Name; + } + } + + protected override void OnInitialize() + { + if (!PipingCalculationService.Validate(pipingData)) + { + Status = ActivityStatus.Failed; + } + else + { + pipingData.Output = null; + } + } + + protected override void OnExecute() + { + PipingCalculationService.Calculate(pipingData); + } + + protected override void OnCancel() + { + // Unable to cancel a running kernel, so nothing can be done. + } + + protected override void OnCleanUp() + { + // Nothing to clean up. + } + + protected override void OnFinish() + { + pipingData.NotifyObservers(); + } + } +} \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -r097c1305f34e1bc192ff10fca8332089bd1cfee0 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 097c1305f34e1bc192ff10fca8332089bd1cfee0) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -68,7 +68,7 @@ pipingData.Output = null; } - private static void Calculate(PipingData pipingData) + public static void Calculate(PipingData pipingData) { PipingDataLogger.Info(String.Format(Resources.Calculation_Subject_0_Started_Time_1_, pipingData.Name, DateTimeService.CurrentTimeAsString)); Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/Ringtoets.Piping.Service.csproj =================================================================== diff -u -r097c1305f34e1bc192ff10fca8332089bd1cfee0 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/Ringtoets.Piping.Service.csproj (.../Ringtoets.Piping.Service.csproj) (revision 097c1305f34e1bc192ff10fca8332089bd1cfee0) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Service/Ringtoets.Piping.Service.csproj (.../Ringtoets.Piping.Service.csproj) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -57,6 +57,7 @@ Properties\GlobalAssembly.cs + @@ -79,6 +80,10 @@ {82b61d20-fd4b-49be-9252-5bf6e3ee4666} DelftTools.Shell.Core + + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} + DelftTools.Utils + {c90b77da-e421-43cc-b82e-529651bc21ac} Wti.Base Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationActivityTest.cs =================================================================== diff -u --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationActivityTest.cs (revision 0) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationActivityTest.cs (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -0,0 +1,142 @@ +using System; +using System.Linq; + +using DelftTools.Shell.Core; +using DelftTools.Shell.Core.Workflow; +using DelftTools.TestUtils; + +using NUnit.Framework; + +using Rhino.Mocks; + +using Ringtoets.Piping.Calculation.Test.Piping.Stub; +using Ringtoets.Piping.Data; +using Ringtoets.Piping.Service.Test.TestHelpers; + +namespace Ringtoets.Piping.Service.Test +{ + [TestFixture] + public class PipingCalculationActivityTest + { + [Test] + public void ParameteredConstructor_ExpectedValues() + { + // Setup + var pipingData = new PipingData(); + + // Call + var activity = new PipingCalculationActivity(pipingData); + + // Assert + Assert.IsInstanceOf(activity); + Assert.AreEqual(pipingData.Name, activity.Name); + CollectionAssert.IsEmpty(activity.DependsOn); + Assert.IsNull(activity.ProgressText); + Assert.AreEqual(ActivityStatus.None, activity.Status); + } + + [Test] + public void Initialize_ValidPipingDataWithOutput_LogValidationStartAndEndedAndClearOutput() + { + // Setup + var validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); + validPipingData.Output = new TestPipingOutput(); + + var activity = new PipingCalculationActivity(validPipingData); + + // Call + Action call = () => activity.Initialize(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(2, msgs.Length); + StringAssert.StartsWith(String.Format("Validatie van '{0}' gestart om: ", validPipingData.Name), msgs.First()); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", validPipingData.Name), msgs.Last()); + }); + Assert.AreEqual(ActivityStatus.Initialized, activity.Status); + Assert.IsNull(validPipingData.Output); + } + + [Test] + public void Initialize_InvalidPipingDataWithOutput_LogValidationStartAndEndWithErrors() + { + // Setup + var originalOutput = new TestPipingOutput(); + + var invalidPipingData = PipingDataFactory.CreateCalculationWithInvalidData(); + invalidPipingData.Output = originalOutput; + + var activity = new PipingCalculationActivity(invalidPipingData); + + // Call + Action call = () => activity.Initialize(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.Greater(msgs.Length, 2, "Expecting more than 2 messages"); + + StringAssert.StartsWith(String.Format("Validatie van '{0}' gestart om: ", invalidPipingData.Name), msgs.First()); + foreach (var expectedValidationErrorMessage in msgs.Skip(1).Take(msgs.Length-2)) + { + StringAssert.StartsWith("Validatie mislukt: ", expectedValidationErrorMessage); + } + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", invalidPipingData.Name), msgs.Last()); + }); + Assert.AreEqual(ActivityStatus.Failed, activity.Status); + Assert.AreEqual(originalOutput, invalidPipingData.Output); + } + + [Test] + public void Execute_ValidPipingDataAndInitialized_PerformPipingCalculationAndLogStartAndEnd() + { + // Setup + var validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); + validPipingData.Output = null; + + var activity = new PipingCalculationActivity(validPipingData); + activity.Initialize(); + + // Call + Action call = () => activity.Execute(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(2, msgs.Length); + StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", validPipingData.Name), msgs.First()); + StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", validPipingData.Name), msgs.Last()); + }); + Assert.AreEqual(ActivityStatus.Executed, activity.Status); + Assert.IsNotNull(validPipingData.Output); + } + + [Test] + public void OnFinish_ValidPipingDataAndExecuted_NotifyObserversOfPipingData() + { + // Setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); + validPipingData.Output = null; + validPipingData.Attach(observerMock); + + var activity = new PipingCalculationActivity(validPipingData); + activity.Initialize(); + activity.Execute(); + + // Call + activity.Finish(); + + // Assert + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs =================================================================== diff -u -r097c1305f34e1bc192ff10fca8332089bd1cfee0 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 097c1305f34e1bc192ff10fca8332089bd1cfee0) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -8,6 +8,7 @@ using Ringtoets.Piping.Data; using Ringtoets.Piping.Calculation.Test.Piping.Stub; +using Ringtoets.Piping.Service.Test.TestHelpers; namespace Ringtoets.Piping.Service.Test { @@ -19,7 +20,7 @@ // Setup const string name = ""; - var pipingData = CreateCalculationWithValidInput(); + var pipingData = PipingDataFactory.CreateCalculationWithValidInput(); pipingData.Name = name; // Call @@ -40,7 +41,7 @@ // Setup const string name = ""; - var pipingData = CreateCalculationWithValidInput(); + var pipingData = PipingDataFactory.CreateCalculationWithValidInput(); pipingData.Name = name; // Call @@ -62,7 +63,7 @@ public void PerformValidatedCalculation_ValidPipingDataNoOutput_ShouldSetOutput() { // Setup - PipingData validPipingData = CreateCalculationWithValidInput(); + PipingData validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); // Precondition Assert.IsNull(validPipingData.Output); @@ -80,7 +81,7 @@ // Setup var output = new TestPipingOutput(); - PipingData validPipingData = CreateCalculationWithValidInput(); + PipingData validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); validPipingData.Output = output; // Call @@ -95,7 +96,7 @@ { // Setup var output = new TestPipingOutput(); - var invalidPipingData = CreateCalculationWithInvalidData(); + var invalidPipingData = PipingDataFactory.CreateCalculationWithInvalidData(); invalidPipingData.Output = output; // Call @@ -109,7 +110,7 @@ public void PerformValidatedCalculation_Diameter70AndAquiferPermeabilityZero_CalculationErrorOutputNull() { // Setup - PipingData validPipingData = CreateCalculationWithValidInput(); + PipingData validPipingData = PipingDataFactory.CreateCalculationWithValidInput(); validPipingData.Diameter70 = 0; validPipingData.DarcyPermeability = 0; @@ -126,9 +127,9 @@ // Setup var failureMechanism = new PipingFailureMechanism(); failureMechanism.Calculations.Clear(); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); // Call PipingCalculationService.PerfromValidatedCalculation(failureMechanism); @@ -146,9 +147,9 @@ // Setup var failureMechanism = new PipingFailureMechanism(); failureMechanism.Calculations.Clear(); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); foreach (var calculation in failureMechanism.Calculations) { @@ -174,9 +175,9 @@ // Setup var failureMechanism = new PipingFailureMechanism(); failureMechanism.Calculations.Clear(); - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); - failureMechanism.Calculations.Add(CreateCalculationWithInvalidData()); // Unable to calculate - failureMechanism.Calculations.Add(CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithInvalidData()); // Unable to calculate + failureMechanism.Calculations.Add(PipingDataFactory.CreateCalculationWithValidInput()); // Call PipingCalculationService.PerfromValidatedCalculation(failureMechanism); @@ -196,40 +197,5 @@ } } } - - private PipingData CreateCalculationWithInvalidData() - { - return new PipingData(); - } - - private PipingData CreateCalculationWithValidInput() - { - return new PipingData - { - AssessmentLevel = 1.0, - BeddingAngle = 1.0, - CriticalHeaveGradient = 1.0, - DampingFactorExit = 1.0, - DarcyPermeability = 1.0, - Diameter70 = 1.0, - ExitPointXCoordinate = 1.0, - Gravity = 1.0, - MeanDiameter70 = 1.0, - PiezometricHeadExit = 1.0, - PiezometricHeadPolder = 1.0, - PhreaticLevelExit = 2.0, - SandParticlesVolumicWeight = 1.0, - SeepageLength = 1.0, - SellmeijerModelFactor = 1.0, - SellmeijerReductionFactor = 1.0, - ThicknessAquiferLayer = 1.0, - ThicknessCoverageLayer = 1.0, - UpliftModelFactor = 1.0, - WaterKinematicViscosity = 1.0, - WaterVolumetricWeight = 1.0, - WhitesDragCoefficient = 1.0, - SurfaceLine = new RingtoetsPipingSurfaceLine() - }; - } } } \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj =================================================================== diff -u -r097c1305f34e1bc192ff10fca8332089bd1cfee0 -r7b2fb7be49ba189d624e933485f14a7b94039bbb --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj (.../Ringtoets.Piping.Service.Test.csproj) (revision 097c1305f34e1bc192ff10fca8332089bd1cfee0) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj (.../Ringtoets.Piping.Service.Test.csproj) (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -49,8 +49,10 @@ + + @@ -69,6 +71,10 @@ {82b61d20-fd4b-49be-9252-5bf6e3ee4666} DelftTools.Shell.Core + + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} + DelftTools.Utils + {D64E4F0E-E341-496F-82B2-941AD202B4E3} Ringtoets.Piping.Calculation Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/TestHelpers/PipingDataFactory.cs =================================================================== diff -u --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/TestHelpers/PipingDataFactory.cs (revision 0) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/TestHelpers/PipingDataFactory.cs (revision 7b2fb7be49ba189d624e933485f14a7b94039bbb) @@ -0,0 +1,42 @@ +using Ringtoets.Piping.Data; + +namespace Ringtoets.Piping.Service.Test.TestHelpers +{ + public static class PipingDataFactory + { + public static PipingData CreateCalculationWithInvalidData() + { + return new PipingData(); + } + + public static PipingData CreateCalculationWithValidInput() + { + return new PipingData + { + AssessmentLevel = 1.0, + BeddingAngle = 1.0, + CriticalHeaveGradient = 1.0, + DampingFactorExit = 1.0, + DarcyPermeability = 1.0, + Diameter70 = 1.0, + ExitPointXCoordinate = 1.0, + Gravity = 1.0, + MeanDiameter70 = 1.0, + PiezometricHeadExit = 1.0, + PiezometricHeadPolder = 1.0, + PhreaticLevelExit = 2.0, + SandParticlesVolumicWeight = 1.0, + SeepageLength = 1.0, + SellmeijerModelFactor = 1.0, + SellmeijerReductionFactor = 1.0, + ThicknessAquiferLayer = 1.0, + ThicknessCoverageLayer = 1.0, + UpliftModelFactor = 1.0, + WaterKinematicViscosity = 1.0, + WaterVolumetricWeight = 1.0, + WhitesDragCoefficient = 1.0, + SurfaceLine = new RingtoetsPipingSurfaceLine() + }; + } + } +} \ No newline at end of file