Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs =================================================================== diff -u -r4926 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs (.../CsvImporter.cs) (revision 4926) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs (.../CsvImporter.cs) (revision 5794) @@ -41,6 +41,7 @@ private const string scenariosFileNamePart = "scenarios"; private const string soilsFileNamePart = "soils"; private const string sigmaTauCurvesFileNamePart = "sigmataucurves"; + private const string suTablesFileNamePart = "sutables"; private string folderName; public List ErrorMessages { get; } = new(); @@ -63,6 +64,8 @@ public List SigmaTauCurvesRecords { get; private set; } = new(); + public List SuTablesRecords { get; private set; } = new(); + /// /// Imports the CSV data from directory. /// @@ -124,6 +127,12 @@ ImportSigmaTauCurves(SigmaTauCurvesFileName); } + if (File.Exists(SuTablesFileName)) + { + progress?.Invoke(0.29); + ImportSuTables(SuTablesFileName); + } + progress?.Invoke(0.30); } } @@ -153,6 +162,8 @@ private string SigmaTauCurvesFileName => string.Format(filePattern, ImportFolderLocation, sigmaTauCurvesFileNamePart); + private string SuTablesFileName => string.Format(filePattern, ImportFolderLocation,suTablesFileNamePart); + /// /// Imports the locations. /// @@ -371,4 +382,27 @@ ErrorMessages.Add(logMessage); } } + + /// + /// Import the Su Tables + /// + /// The filename of the file to read + private void ImportSuTables(string fileName) + { + try + { + var csvImporterSuTables = new CsvImporterSuTables(fileName); + SuTablesRecords = csvImporterSuTables.ImportedItems; + foreach (string errorMessage in csvImporterSuTables.ErrorMessages) + { + var logMessage = new LogMessage(LogMessageType.Error, this, errorMessage); + ErrorMessages.Add(logMessage); + } + } + catch (Exception e) + { + var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); + ErrorMessages.Add(logMessage); + } + } } \ No newline at end of file Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTests.cs =================================================================== diff -u -r5455 -r5794 --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTests.cs (.../CsvImporterTests.cs) (revision 5455) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTests.cs (.../CsvImporterTests.cs) (revision 5794) @@ -814,6 +814,7 @@ Assert.That(soilRecord.RatioSuPc, Is.Null); Assert.That(soilRecord.Pop, Is.Null); Assert.That(soilRecord.SigmaTauCurveName, Is.EqualTo("")); + Assert.That(soilRecord.SuTableName, Is.EqualTo("")); Assert.That(soilRecord.TrafficLoadDegreeOfConsolidation, Is.Null); soilRecord = soilRecords[1]; @@ -831,6 +832,7 @@ Assert.That(soilRecord.RatioSuPc, Is.Null); Assert.That(soilRecord.Pop, Is.Null); Assert.That(soilRecord.SigmaTauCurveName, Is.EqualTo("")); + Assert.That(soilRecord.SuTableName, Is.EqualTo("")); Assert.That(soilRecord.TrafficLoadDegreeOfConsolidation, Is.Null); } @@ -864,6 +866,7 @@ Assert.That(soilRecord.RatioSuPc, Is.EqualTo(0.220)); Assert.That(soilRecord.Pop, Is.EqualTo(10.000)); Assert.That(soilRecord.SigmaTauCurveName, Is.EqualTo("")); + Assert.That(soilRecord.SuTableName, Is.EqualTo("")); Assert.That(soilRecord.TrafficLoadDegreeOfConsolidation, Is.EqualTo(100.00)); soilRecord = soilRecords[1]; @@ -881,6 +884,7 @@ Assert.That(soilRecord.RatioSuPc, Is.EqualTo(0.220)); Assert.That(soilRecord.Pop, Is.EqualTo(10.000)); Assert.That(soilRecord.SigmaTauCurveName, Is.EqualTo("CurveKlei")); + Assert.That(soilRecord.SuTableName, Is.EqualTo("SuKlei")); Assert.That(soilRecord.TrafficLoadDegreeOfConsolidation, Is.EqualTo(30.00)); soilRecord = soilRecords[2]; @@ -898,6 +902,7 @@ Assert.That(soilRecord.RatioSuPc, Is.EqualTo(0.220)); Assert.That(soilRecord.Pop, Is.EqualTo(10.000)); Assert.That(soilRecord.SigmaTauCurveName, Is.EqualTo("")); + Assert.That(soilRecord.SuTableName, Is.EqualTo("")); Assert.That(soilRecord.TrafficLoadDegreeOfConsolidation, Is.EqualTo(100.00)); } @@ -982,9 +987,61 @@ CreateSigmaTauCurvesMissingColumnFile(testFilePath); Assert.That(() => new CsvImporterSigmaTauCurves(testFilePath), - Throws.InstanceOf().With.Message.Contains("The header misses the field: sigma")); + Throws.InstanceOf().With.Message.Contains("The header misses the field: tau")); } + [Test] + public void SuTablesCorrectFileTest() + { + const string importFile = "sutables.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + { + File.Delete(testFilePath); + } + + CreateSuTablesFile(testFilePath); + var csvImporterSuTables = new CsvImporterSuTables(testFilePath); + IList suTableRecords = csvImporterSuTables.ImportedItems; + + Assert.That(suTableRecords[0].SuTableName, Is.EqualTo("CurveKlei")); + Assert.That(suTableRecords[0].Sigma, Is.EqualTo(0.0)); + Assert.That(suTableRecords[0].Su, Is.EqualTo(2.05)); + Assert.That(suTableRecords[1].SuTableName, Is.EqualTo("CurveKlei")); + Assert.That(suTableRecords[1].Sigma, Is.EqualTo(13.0)); + Assert.That(suTableRecords[1].Su, Is.EqualTo(8.05)); + Assert.That(suTableRecords[2].SuTableName, Is.EqualTo("CurveKlei")); + Assert.That(suTableRecords[2].Sigma, Is.EqualTo(26.0)); + Assert.That(suTableRecords[2].Su, Is.EqualTo(13.79)); + Assert.That(suTableRecords[3].SuTableName, Is.EqualTo("CurveKlei")); + Assert.That(suTableRecords[3].Sigma, Is.EqualTo(65.0)); + Assert.That(suTableRecords[3].Su, Is.EqualTo(28.1)); + Assert.That(suTableRecords[4].SuTableName, Is.EqualTo("CurveKlei")); + Assert.That(suTableRecords[4].Sigma, Is.EqualTo(110.5)); + Assert.That(suTableRecords[4].Su, Is.EqualTo(44.6)); + Assert.That(suTableRecords[5].SuTableName, Is.EqualTo("CurveZand")); + Assert.That(suTableRecords[5].Sigma, Is.EqualTo(0.0)); + Assert.That(suTableRecords[5].Su, Is.EqualTo(0.0)); + Assert.That(suTableRecords[6].SuTableName, Is.EqualTo("CurveZand")); + Assert.That(suTableRecords[6].Sigma, Is.EqualTo(200.0)); + Assert.That(suTableRecords[6].Su, Is.EqualTo(129.88)); + } + + [Test] + public void SuTablesMissingColumnFileTest() + { + const string importFile = "sutables_missing_column.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + { + File.Delete(testFilePath); + } + + CreateSuTablesMissingColumnFile(testFilePath); + Assert.That(() => new CsvImporterSuTables(testFilePath), + Throws.InstanceOf().With.Message.Contains("The header misses the field: su")); + } + /// /// Create csv file with segments containing 1d soilprofiles /// @@ -1105,10 +1162,10 @@ private static void CreateFullSoilsFile(string filePath) { using StreamWriter writer = File.CreateText(filePath); - writer.WriteLine("soil_name;soil_color;soil_type;saturated_unit_weight;unsaturated_unit_weight;cohesion;friction_angle;diameter_d70;permeability_x;shear_strength_model;strength_increase_exponent;ratio_su_pc;use_pop;pop;sigma_tau_curve_name;traffic_load_degree_of_consolidation"); - writer.WriteLine("Zand;#A6EBFC;Sand;20.000;18.000;0.000;30.000;210.00;0.001;MohrCoulomb;0.700;0.220;False;10.000;;100.00"); - writer.WriteLine("Klei;#FFFFFF;Clay;17.500;17.500;3.500;18.500;210.00;0.001;SigmaTauTable;0.700;0.220;False;10.000;CurveKlei;30.00"); - writer.WriteLine("Veen;#A4FFA6;Peat;11.000;11.000;2.000;20.500;210.00;0.001;SHANSEP;0.700;0.220;False;10.000;;100.00"); + writer.WriteLine("soil_name;soil_color;soil_type;saturated_unit_weight;unsaturated_unit_weight;cohesion;friction_angle;diameter_d70;permeability_x;shear_strength_model;strength_increase_exponent;ratio_su_pc;use_pop;pop;sigma_tau_curve_name;su_table_name;traffic_load_degree_of_consolidation"); + writer.WriteLine("Zand;#A6EBFC;Sand;20.000;18.000;0.000;30.000;210.00;0.001;MohrCoulomb;0.700;0.220;False;10.000;;;100.00"); + writer.WriteLine("Klei;#FFFFFF;Clay;17.500;17.500;3.500;18.500;210.00;0.001;SigmaTauTable;0.700;0.220;False;10.000;CurveKlei;SuKlei;30.00"); + writer.WriteLine("Veen;#A4FFA6;Peat;11.000;11.000;2.000;20.500;210.00;0.001;SHANSEP;0.700;0.220;False;10.000;;;100.00"); } private static void CreateMinimalSoilsFile(string filePath) @@ -1151,14 +1208,34 @@ private static void CreateSigmaTauCurvesMissingColumnFile(string filePath) { using StreamWriter writer = File.CreateText(filePath); - writer.WriteLine("sigma_tau_curve_name;tau"); - writer.WriteLine("CurveKlei;2.05"); - writer.WriteLine("CurveKlei;8.05"); - writer.WriteLine("CurveKlei;13.79"); - writer.WriteLine("CurveKlei;28.10"); - writer.WriteLine("CurveKlei;44.60"); + writer.WriteLine("sigma_tau_curve_name;sigma"); + writer.WriteLine("CurveKlei;0.0"); + writer.WriteLine("CurveKlei;13.0"); + writer.WriteLine("CurveKlei;200.0"); } + private static void CreateSuTablesFile(string filePath) + { + using StreamWriter writer = File.CreateText(filePath); + writer.WriteLine("su_table_name;sigma;su"); + writer.WriteLine("CurveKlei;0.0;2.05"); + writer.WriteLine("CurveKlei;13.0;8.05"); + writer.WriteLine("CurveKlei;26.0;13.79"); + writer.WriteLine("CurveKlei;65.0;28.10"); + writer.WriteLine("CurveKlei;110.5;44.60"); + writer.WriteLine("CurveZand;0.0;0.0"); + writer.WriteLine("CurveZand;200.0;129.88"); + } + + private static void CreateSuTablesMissingColumnFile(string filePath) + { + using StreamWriter writer = File.CreateText(filePath); + writer.WriteLine("su_table_name;sigma"); + writer.WriteLine("CurveKlei;0.0"); + writer.WriteLine("CurveKlei;13.0"); + writer.WriteLine("CurveKlei;200.0"); + } + private static void CreateSoilProfilesFileWithIllegalHeader(string filePath) { using StreamWriter writer = File.CreateText(filePath); Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/ConversionHelper.cs =================================================================== diff -u -r5724 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/ConversionHelper.cs (.../ConversionHelper.cs) (revision 5724) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DamEngineIo/ConversionHelper.cs (.../ConversionHelper.cs) (revision 5794) @@ -1322,9 +1322,13 @@ }, { "SigmaTauTable", ShearStrengthModel.StressTable + }, + { + "SuTable", ShearStrengthModel.SuTable } }; - if ((shearStrengthModel != "MohrCoulomb") && (shearStrengthModel != "SHANSEP") && (shearStrengthModel != "SigmaTauTable")) + if ((shearStrengthModel != "MohrCoulomb") && (shearStrengthModel != "SHANSEP") && (shearStrengthModel != "SigmaTauTable") + && (shearStrengthModel != "SuTable")) { throw new NotImplementedException($"Unknown Shearstrength Model '{shearStrengthModel}' "); } Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs =================================================================== diff -u -r4931 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs (.../CsvImporterSigmaTauCurves.cs) (revision 4931) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs (.../CsvImporterSigmaTauCurves.cs) (revision 5794) @@ -31,12 +31,7 @@ namespace Deltares.Dam.Data.CsvImporters; -public class CsvImporterSigmaTauCurvesException : Exception -{ - public CsvImporterSigmaTauCurvesException(string message) : base(message) - { - } -} +public class CsvImporterSigmaTauCurvesException(string message) : Exception(message); public class CsvImporterSigmaTauCurves { @@ -61,7 +56,7 @@ } int colIndexSigmaTauCurveName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaTauCurveNameColumnName); - CheckColumn(colIndexSigmaTauCurveName, fileName, CsvColumnNames.SoilNameColumnName); + CheckColumn(colIndexSigmaTauCurveName, fileName, CsvColumnNames.SigmaTauCurveNameColumnName); int colIndexSigma = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaColumnName); CheckColumn(colIndexSigma, fileName, CsvColumnNames.SigmaColumnName); Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/MStabParameters.cs =================================================================== diff -u -r5779 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/MStabParameters.cs (.../MStabParameters.cs) (revision 5779) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/MStabParameters.cs (.../MStabParameters.cs) (revision 5794) @@ -681,8 +681,6 @@ [Label("Model")] public MStabModelType Model { get; set; } - [Label("Shear Strength")] public MStabShearStrength ShearStrength { get; set; } - public MStabSearchMethod SearchMethod { get; set; } public bool IsProbabilistic { get; set; } @@ -729,7 +727,6 @@ public void Assign(MStabParameters mstabParameters) { Model = mstabParameters.Model; - ShearStrength = mstabParameters.ShearStrength; SearchMethod = mstabParameters.SearchMethod; IsProbabilistic = mstabParameters.IsProbabilistic; GridPosition = mstabParameters.GridPosition; Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DAMEnumerations.cs =================================================================== diff -u -r4771 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DAMEnumerations.cs (.../DAMEnumerations.cs) (revision 4771) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/DAMEnumerations.cs (.../DAMEnumerations.cs) (revision 5794) @@ -102,16 +102,6 @@ SoilGeometryStiFile } -public enum MStabShearStrength -{ - CPhi, - StressTables, - CuCalculated, - CuMeasured, - CuGradient, - Default -} - public enum MStabSearchMethod { Grid, Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/soils.csv =================================================================== diff -u -r5465 -r5794 --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/soils.csv (.../soils.csv) (revision 5465) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/soils.csv (.../soils.csv) (revision 5794) @@ -1,52 +1,52 @@ -soil_name;soil_color;soil_type;saturated_unit_weight;unsaturated_unit_weight;cohesion;friction_angle;diameter_d70;permeability_x;shear_strength_model;pop;sigma_tau_curve_name;traffic_load_degree_of_consolidation -BAS;#FFFFFF;Clay;20.00;20.00;20.00;25.00;0.01;1e-05;MohrCoulomb;0.00;;100 -BFG;#FFFFFF;Clay;19.00;19.00;5.00;22.00;0.01;1e-05;SigmaTauTable;0.00;Missing;100 -BSS;#FFFFFF;Sand;20.00;20.00;0.00;30.00;170.00;0.17;MohrCoulomb;0.00;CurveZand;100 -CCC;#FFFFFF;Clay;17.00;17.00;5.00;22.00;0.01;1e-05;SigmaTauTable;0.00;CurveKlei;25 -EFG;#FFFFFF;Sand;21.00;21.00;0.00;35.00;400.00;0.4;MohrCoulomb;0.00;;100 -ETL;#FFFFFF;Clay;21.00;21.00;15.00;22.00;0.01;1e-05;MohrCoulomb;0.00;;100 -FCC;#FFFFFF;Sand;20.00;20.00;0.00;30.00;350.00;0.35;MohrCoulomb;0.00;;100 -FCF;#FFFFFF;Sand;19.00;19.00;0.00;27.00;170.00;0.17;MohrCoulomb;0.00;;100 -FCM;#FFFFFF;Sand;20.00;20.00;0.00;30.00;250.00;0.25;MohrCoulomb;0.00;;100 -FCO;#FFFFFF;Clay;17.00;17.00;2.00;20.00;0.01;1e-05;MohrCoulomb;0.00;;100 -FFG;#FFFFFF;Clay;19.00;19.00;8.00;27.50;0.01;1e-05;MohrCoulomb;0.00;;100 -FFO;#FFFFFF;Clay;15.00;15.00;2.00;20.00;0.01;1e-05;MohrCoulomb;0.00;;100 -FFS;#FFFFFF;Clay;19.00;19.00;5.00;30.00;0.01;1e-05;MohrCoulomb;0.00;;100 -FPR;#FFFFFF;Peat;13.00;13.00;2.00;20.00;0.01;1e-05;MohrCoulomb;0.00;;100 -kade;#FFFFFF;Clay;17.00;17.00;3.00;22.00;0.01;1e-05;MohrCoulomb;0.00;;100 -KCS;#FFFFFF;Sand;20.00;20.00;0.00;33.00;400.00;0.4;MohrCoulomb;0.00;;100 -KFG;#FFFFFF;Clay;19.00;19.00;10.00;22.00;0.01;1e-05;MohrCoulomb;0.00;;100 -KFS;#FFFFFF;Sand;19.00;19.00;0.00;27.00;150.00;0.15;MohrCoulomb;0.00;;100 -KMS;#FFFFFF;Sand;20.00;20.00;0.00;30.00;250.00;0.25;MohrCoulomb;0.00;;100 -PEC;#FFFFFF;Clay;15.00;15.00;3.00;22.00;0.01;1e-05;MohrCoulomb;0.00;;100 -PES;#FFFFFF;Sand;17.00;20.00;0.00;30.00;0.01;1e-05;MohrCoulomb;0.00;;100 -PLC;#FFFFFF;Clay;14.00;14.00;2.00;22.00;0.01;1e-05;MohrCoulomb;0.00;;100 -PLO;#FFFFFF;Peat;12.00;12.00;2.00;20.00;0.01;1e-05;MohrCoulomb;0.00;;100 -PPP;#FFFFFF;Peat;10.00;10.00;2.00;25.00;0.01;1e-05;MohrCoulomb;0.00;;100 -SSC;#FFFFFF;Sand;21.00;21.00;0.00;33.00;400.00;0.4;MohrCoulomb;0.00;;100 -SSF;#FFFFFF;Sand;19.00;19.00;0.00;30.00;200.00;0.2;MohrCoulomb;0.00;;100 -SSM;#FFFFFF;Sand;20.00;20.00;0.00;30.00;250.00;0.25;MohrCoulomb;0.00;;100 -TCC;#FFFFFF;Clay;18.00;18.00;1.00;25.00;0.01;1e-05;MohrCoulomb;0.00;;100 -TCS;#FFFFFF;Sand;20.00;20.00;0.00;30.00;200.00;0.2;MohrCoulomb;0.00;;100 -TFG;#FFFFFF;Clay;17.00;17.00;5.00;20.00;0.01;1e-05;MohrCoulomb;0.00;;100 -TOP;#FFFFFF;Clay;17.00;17.00;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_1;#FFFFFF;Clay;13.80;13.80;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_2;#FFFFFF;Clay;14.68;14.68;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_3;#FFFFFF;Clay;15.26;15.26;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_4;#FFFFFF;Clay;15.88;15.88;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_5;#FFFFFF;Clay;16.09;16.09;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_6;#FFFFFF;Clay;16.98;16.98;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_7;#FFFFFF;Clay;17.49;17.49;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -top_8;#FFFFFF;Clay;17.81;17.81;3.00;23.00;0.01;1e-05;MohrCoulomb;0.00;;100 -TSF;#FFFFFF;Clay;18.00;18.00;1.00;25.00;0.01;1e-05;MohrCoulomb;0.00;;100 -TSS;#FFFFFF;Sand;19.00;19.00;1.00;27.00;150.00;0.15;MohrCoulomb;0.00;;100 -zand_1;#FFFFFF;Sand;20.00;17.00;0.00;30.00;109.00;0.109;MohrCoulomb;0.00;;100 -zand_10;#FFFFFF;Sand;20.00;17.00;0.00;30.00;473.00;0.473;MohrCoulomb;0.00;;100 -zand_2;#FFFFFF;Sand;20.00;17.00;0.00;30.00;124.00;0.124;MohrCoulomb;0.00;;100 -zand_3;#FFFFFF;Sand;20.00;17.00;0.00;30.00;145.00;0.145;MohrCoulomb;0.00;;100 -zand_4;#FFFFFF;Sand;20.00;17.00;0.00;30.00;158.00;0.158;MohrCoulomb;0.00;;100 -zand_5;#FFFFFF;Sand;20.00;17.00;0.00;30.00;192.00;0.192;MohrCoulomb;0.00;;100 -zand_6;#FFFFFF;Sand;20.00;17.00;0.00;30.00;217.00;0.217;MohrCoulomb;0.00;;100 -zand_7;#FFFFFF;Sand;20.00;17.00;0.00;30.00;282.00;0.282;MohrCoulomb;0.00;;100 -zand_8;#FFFFFF;Sand;20.00;17.00;0.00;30.00;343.00;0.343;MohrCoulomb;0.00;;100 -zand_9;#FFFFFF;Sand;20.00;17.00;0.00;30.00;396.00;0.396;MohrCoulomb;0.00;;100 +soil_name;soil_color;soil_type;saturated_unit_weight;unsaturated_unit_weight;cohesion;friction_angle;diameter_d70;permeability_x;shear_strength_model;pop;sigma_tau_curve_name;su_table_name;traffic_load_degree_of_consolidation +BAS;#FFFFFF;Clay;20;20;20;25;0.01;1e-05;MohrCoulomb;0;;;100 +BFG;#FFFFFF;Clay;19;19;5;22;0.01;1e-05;SigmaTauTable;0;Missing;;100 +BSS;#FFFFFF;Sand;20;20;0;30;170;0.17;MohrCoulomb;0;CurveZand;;100 +CCC;#FFFFFF;Clay;17;17;5;22;0.01;1e-05;SigmaTauTable;0;CurveKlei;;25 +EFG;#FFFFFF;Sand;21;21;0;35;400;0.4;MohrCoulomb;0;;;100 +ETL;#FFFFFF;Clay;21;21;15;22;0.01;1e-05;SuTable;0;;Missing;100 +FCC;#FFFFFF;Sand;20;20;0;30;350;0.35;MohrCoulomb;0;;CurveZand;100 +FCF;#FFFFFF;Sand;19;19;0;27;170;0.17;MohrCoulomb;0;;;100 +FCM;#FFFFFF;Sand;20;20;0;30;250;0.25;MohrCoulomb;0;;;100 +FCO;#FFFFFF;Clay;17;17;2;20;0.01;1e-05;SuTable;0;;CurveKlei;100 +FFG;#FFFFFF;Clay;19;19;8;27.5;0.01;1e-05;MohrCoulomb;0;;;100 +FFO;#FFFFFF;Clay;15;15;2;20;0.01;1e-05;MohrCoulomb;0;;;100 +FFS;#FFFFFF;Clay;19;19;5;30;0.01;1e-05;MohrCoulomb;0;;;100 +FPR;#FFFFFF;Peat;13;13;2;20;0.01;1e-05;MohrCoulomb;0;;;100 +kade;#FFFFFF;Clay;17;17;3;22;0.01;1e-05;MohrCoulomb;0;;;100 +KCS;#FFFFFF;Sand;20;20;0;33;400;0.4;MohrCoulomb;0;;;100 +KFG;#FFFFFF;Clay;19;19;10;22;0.01;1e-05;MohrCoulomb;0;;;100 +KFS;#FFFFFF;Sand;19;19;0;27;150;0.15;MohrCoulomb;0;;;100 +KMS;#FFFFFF;Sand;20;20;0;30;250;0.25;MohrCoulomb;0;;;100 +PEC;#FFFFFF;Clay;15;15;3;22;0.01;1e-05;MohrCoulomb;0;;;100 +PES;#FFFFFF;Sand;17;20;0;30;0.01;1e-05;MohrCoulomb;0;;;100 +PLC;#FFFFFF;Clay;14;14;2;22;0.01;1e-05;MohrCoulomb;0;;;100 +PLO;#FFFFFF;Peat;12;12;2;20;0.01;1e-05;MohrCoulomb;0;;;100 +PPP;#FFFFFF;Peat;10;10;2;25;0.01;1e-05;MohrCoulomb;0;;;100 +SSC;#FFFFFF;Sand;21;21;0;33;400;0.4;MohrCoulomb;0;;;100 +SSF;#FFFFFF;Sand;19;19;0;30;200;0.2;MohrCoulomb;0;;;100 +SSM;#FFFFFF;Sand;20;20;0;30;250;0.25;MohrCoulomb;0;;;100 +TCC;#FFFFFF;Clay;18;18;1;25;0.01;1e-05;MohrCoulomb;0;;;100 +TCS;#FFFFFF;Sand;20;20;0;30;200;0.2;MohrCoulomb;0;;;100 +TFG;#FFFFFF;Clay;17;17;5;20;0.01;1e-05;MohrCoulomb;0;;;100 +TOP;#FFFFFF;Clay;17;17;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_1;#FFFFFF;Clay;13.8;13.8;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_2;#FFFFFF;Clay;14.68;14.68;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_3;#FFFFFF;Clay;15.26;15.26;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_4;#FFFFFF;Clay;15.88;15.88;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_5;#FFFFFF;Clay;16.09;16.09;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_6;#FFFFFF;Clay;16.98;16.98;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_7;#FFFFFF;Clay;17.49;17.49;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +top_8;#FFFFFF;Clay;17.81;17.81;3;23;0.01;1e-05;MohrCoulomb;0;;;100 +TSF;#FFFFFF;Clay;18;18;1;25;0.01;1e-05;MohrCoulomb;0;;;100 +TSS;#FFFFFF;Sand;19;19;1;27;150;0.15;MohrCoulomb;0;;;100 +zand_1;#FFFFFF;Sand;20;17;0;30;109;0.109;MohrCoulomb;0;;;100 +zand_10;#FFFFFF;Sand;20;17;0;30;473;0.473;MohrCoulomb;0;;;100 +zand_2;#FFFFFF;Sand;20;17;0;30;124;0.124;MohrCoulomb;0;;;100 +zand_3;#FFFFFF;Sand;20;17;0;30;145;0.145;MohrCoulomb;0;;;100 +zand_4;#FFFFFF;Sand;20;17;0;30;158;0.158;MohrCoulomb;0;;;100 +zand_5;#FFFFFF;Sand;20;17;0;30;192;0.192;MohrCoulomb;0;;;100 +zand_6;#FFFFFF;Sand;20;17;0;30;217;0.217;MohrCoulomb;0;;;100 +zand_7;#FFFFFF;Sand;20;17;0;30;282;0.282;MohrCoulomb;0;;;100 +zand_8;#FFFFFF;Sand;20;17;0;30;343;0.343;MohrCoulomb;0;;;100 +zand_9;#FFFFFF;Sand;20;17;0;30;396;0.396;MohrCoulomb;0;;;100 Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSoils.cs =================================================================== diff -u -r5455 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSoils.cs (.../CsvImporterSoils.cs) (revision 5455) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSoils.cs (.../CsvImporterSoils.cs) (revision 5794) @@ -83,6 +83,7 @@ int colIndexRatioSuPc = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RatioSuPcColumnName); int colIndexPop = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PopColumnName); int colIndexSigmaTauCurveName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaTauCurveNameColumnName); + int colIndexSuTableName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SuTableNameColumnName); int colIndexTrafficLoadDegreeOfConsolidation = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.TrafficLoadDegreeOfConsolidationColumnName); while (csv.ReadNextRecord()) @@ -123,6 +124,12 @@ soil.SigmaTauCurveName = csv[currentColIndex]; } + if (colIndexSuTableName > -1) + { + currentColIndex = colIndexSuTableName; + soil.SuTableName = csv[currentColIndex]; + } + soil.Pop = FetchOptionalColumn(colIndexPop, csv); soil.TrafficLoadDegreeOfConsolidation = FetchOptionalColumn(colIndexTrafficLoadDegreeOfConsolidation, csv); @@ -179,6 +186,7 @@ public double? PermeabilityX { get; set; } public ShearStrengthModel ShearStrengthModel { get; set; } public string SigmaTauCurveName { get; set; } = ""; + public string SuTableName { get; set; } = ""; public double? StrengthIncreaseExponent { get; set; } public double? RatioSuPc { get; set; } public double? Pop { get; set; } Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/sutables.csv =================================================================== diff -u --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/sutables.csv (revision 0) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/TestData/CSVData/Full1DProject/csvfiles/sutables.csv (revision 5794) @@ -0,0 +1,11 @@ +su_table_name;sigma;su +CurveKlei;0;2.15 +CurveKlei;14;8.15 +CurveKlei;27;13.89 +CurveKlei;66;28.2 +CurveKlei;111.5;44.7 +CurveZand;0;0 +CurveZand;201;129.98 +Invalid1;0;0 +Invalid1;101;200.1 +Invalid1;201;129.98 Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSuTables.cs =================================================================== diff -u --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSuTables.cs (revision 0) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSuTables.cs (revision 5794) @@ -0,0 +1,117 @@ +// Copyright (C) Stichting Deltares 2024. All rights reserved. +// +// This file is part of the application DAM - UI. +// +// DAM - UI is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. +// +// You should have received a copy of the GNU 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 System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using Deltares.Dam.Data.Importers; +using Deltares.DamEngine.Data.Standard.Language; +using Deltares.Standard.IO; +using LumenWorks.Framework.IO.Csv; + +namespace Deltares.Dam.Data.CsvImporters; + +public class CsvImporterSuTablesException(string message) : Exception(message); + +public class CsvImporterSuTables +{ + private readonly int currentColIndex = -1; // Keep track of column for error message + + public CsvImporterSuTables(string fileName) + { + ErrorMessages.Clear(); + ThrowHelper.ThrowIfStringArgumentNullOrEmpty(fileName, StringResourceNames.CsvFileNotValid); + ThrowHelper.ThrowIfFileNotExist(fileName, StringResourceNames.CsvFileNotFound); + CultureInfo oldCultureInfo = Thread.CurrentThread.CurrentCulture; + try + { + Thread.CurrentThread.CurrentCulture = CsvReaderUtilities.DetermineCultureForFile(fileName); + using (var csv = new CsvReader(new StreamReader(fileName), true, ';')) + { + string[] headers = CsvImporterHelper.GetFieldHeaders(this, csv); + if (headers.Length < 2) + { + string csvHeaderError = LocalizationManager.GetTranslatedText(GetType(), "csvHeaderError"); + throw new CsvImporterSoilsException($"{fileName} : {csvHeaderError}"); + } + + int colIndexSuTableName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SuTableNameColumnName); + CheckColumn(colIndexSuTableName, fileName, CsvColumnNames.SuTableNameColumnName); + + int colIndexSigma = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaColumnName); + CheckColumn(colIndexSigma, fileName, CsvColumnNames.SigmaColumnName); + + int colIndexSu = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SuColumnName); + CheckColumn(colIndexSu, fileName, CsvColumnNames.SuColumnName); + + while (csv.ReadNextRecord()) + { + var SuTableRecord = new SuTableRecord(); + try + { + // Required columns + currentColIndex = colIndexSuTableName; + SuTableRecord.SuTableName = csv[currentColIndex]; + + currentColIndex = colIndexSigma; + SuTableRecord.Sigma = Convert.ToDouble(csv[currentColIndex]); + + currentColIndex = colIndexSu; + SuTableRecord.Su = Convert.ToDouble(csv[currentColIndex]); + + ImportedItems.Add(SuTableRecord); + } + catch (Exception e) + { + string csvSuTableError = string.Format(LocalizationManager.GetTranslatedText(GetType(), "csvSuTableError"), + SuTableRecord.SuTableName, currentColIndex + 1); + ErrorMessages.Add(csvSuTableError + e.Message); + } + } + } + } + finally + { + Thread.CurrentThread.CurrentCulture = oldCultureInfo; + } + } + + public List ErrorMessages { get; } = new(); + public List ImportedItems { get; } = new(); + + private void CheckColumn(int index, string fileName, string fieldName) + { + if (index < 0) + { + string csvHeaderFieldError = LocalizationManager.GetTranslatedText(GetType(), "csvHeaderFieldError"); + throw new CsvImporterSuTablesException($"{fileName} : {csvHeaderFieldError} {fieldName}"); + } + } + + public class SuTableRecord + { + public string SuTableName { get; set; } + public double Sigma { get; set; } + public double Su { get; set; } + } +} \ No newline at end of file Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.TestHelper/FactoryForStabilityTests.cs =================================================================== diff -u -r4539 -r5794 --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.TestHelper/FactoryForStabilityTests.cs (.../FactoryForStabilityTests.cs) (revision 4539) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.TestHelper/FactoryForStabilityTests.cs (.../FactoryForStabilityTests.cs) (revision 5794) @@ -34,7 +34,6 @@ return new MStabParameters { Model = MStabModelType.Bishop, - ShearStrength = MStabShearStrength.CPhi, IsProbabilistic = false, SearchMethod = MStabSearchMethod.GeneticAlgorithm, GridPosition = MStabGridPosition.Right, Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml =================================================================== diff -u -r5738 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml (.../Translations.xml) (revision 5738) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml (.../Translations.xml) (revision 5794) @@ -383,6 +383,9 @@ + + /// The su table name + /// + public const string SuTableNameColumnName = "su_table_name"; + + /// /// Normal effective stress /// public const string SigmaColumnName = "sigma"; @@ -441,6 +446,11 @@ public const string TauColumnName = "tau"; /// + /// Undrained shear strength + /// + public const string SuColumnName = "su"; + + /// /// strength_increase_exponent /// public const string StrengthIncreaseExponentColumnName = "strength_increase_exponent"; Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Dike.cs =================================================================== diff -u -r5465 -r5794 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Dike.cs (.../Dike.cs) (revision 5465) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Dike.cs (.../Dike.cs) (revision 5794) @@ -82,8 +82,6 @@ public bool IsRemoveStiFiles { get; set; } - public MStabShearStrength ShearStrengthModel { get; set; } - public virtual string Name { get; set; } ///