From d20af80b853040af540e351af63883dd08bef10f Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 16 Oct 2023 11:25:26 +0200 Subject: [PATCH] #10678 Fault Reactivation Model: export more materials. --- .../RifFaultReactivationModelExporter.cpp | 71 ++++++++++++++++--- .../RifFaultReactivationModelExporter.h | 7 +- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.cpp b/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.cpp index ca15e65075..6f93af3a72 100644 --- a/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.cpp @@ -23,6 +23,7 @@ #include "RiaApplication.h" #include "RiaBaseDefs.h" +#include "RiaEclipseUnitTools.h" #include "RiaVersionInfo.h" #include "RifInpExportTools.h" @@ -63,6 +64,13 @@ std::pair RifFaultReactivationModelExporter::exportToStream( { RimFaultReactivation::Boundary::FarSide, "FARSIDE" }, }; + std::map materialNames = { + { RimFaultReactivation::ElementSets::OverBurden, "OVERBURDEN" }, + { RimFaultReactivation::ElementSets::IntraReservoir, "INTRA_RESERVOIR" }, + { RimFaultReactivation::ElementSets::Reservoir, "RESERVOIR" }, + { RimFaultReactivation::ElementSets::UnderBurden, "UNDERBURDEN" }, + }; + double faultFriction = 0.0; auto model = rimModel.model(); @@ -70,9 +78,9 @@ std::pair RifFaultReactivationModelExporter::exportToStream( std::vector()>> methods = { [&]() { return printHeading( stream, applicationNameAndVersion ); }, - [&]() { return printParts( stream, *model, partNames, borders, faces, boundaries ); }, + [&]() { return printParts( stream, *model, partNames, borders, faces, boundaries, materialNames ); }, [&]() { return printAssembly( stream, *model, partNames, rimModel.localCoordSysNormalsXY() ); }, - [&]() { return printMaterials( stream ); }, + [&]() { return printMaterials( stream, rimModel, materialNames ); }, [&]() { return printInteractionProperties( stream, faultFriction ); }, [&]() { return printBoundaryConditions( stream, *model, partNames, boundaries ); }, [&]() { return printPredefinedFields( stream, partNames ); }, @@ -126,7 +134,8 @@ std::pair RifFaultReactivationModelExporter::printParts( const std::map& partNames, const std::vector>& borders, const std::map, int>& faces, - const std::map& boundaries ) + const std::map& boundaries, + const std::map& materialNames ) { RifInpExportTools::printSectionComment( stream, "PARTS" ); @@ -183,8 +192,25 @@ std::pair RifFaultReactivationModelExporter::printParts( } } - RifInpExportTools::printComment( stream, "Section: sand" ); - RifInpExportTools::printHeading( stream, "Solid Section, elset=" + partName + ", material=sand" ); + std::map> elementSets = grid->elementSets(); + + for ( auto [setType, elements] : elementSets ) + { + auto materialNameIt = materialNames.find( setType ); + CAF_ASSERT( materialNameIt != materialNames.end() ); + std::string materialName = materialNameIt->second; + std::string materialSetName = materialName; + if ( elements.empty() ) + { + RifInpExportTools::printComment( stream, "Section: " + materialName + " (skipped: no elements)" ); + } + else + { + RifInpExportTools::printComment( stream, "Section: " + materialName ); + RifInpExportTools::printElementSet( stream, materialSetName, true, elements ); + RifInpExportTools::printHeading( stream, "Solid Section, elset=" + materialSetName + ", material=" + materialName ); + } + } RifInpExportTools::printLine( stream, "," ); RifInpExportTools::printHeading( stream, "End Part" ); @@ -240,30 +266,53 @@ std::pair //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::pair RifFaultReactivationModelExporter::printMaterials( std::ostream& stream ) +std::pair + RifFaultReactivationModelExporter::printMaterials( std::ostream& stream, + const RimFaultReactivationModel& rimModel, + const std::map& materialNames ) { // MATERIALS PART struct Material { std::string name; double density; - double elastic1; - double elastic2; + double youngsModulus; + double poissonNumber; double permeability1; double permeability2; }; RifInpExportTools::printSectionComment( stream, "MATERIALS" ); + std::vector materials; + + for ( auto [element, materialName] : materialNames ) + { + std::array parameters = rimModel.materialParameters( element ); + + // Incoming unit for Young's Modulus is GPa: convert to Pa. + double youngsModulus = RiaEclipseUnitTools::gigaPascalToPascal( parameters[0] ); + + // Poisson Number has no unit. + double poissonNumber = parameters[1]; + + // Unit is already kg/m^3 + double density = parameters[2]; + + materials.push_back( Material{ .name = materialName, + .density = density, + .youngsModulus = youngsModulus, + .poissonNumber = poissonNumber, + .permeability1 = 1e-09, + .permeability2 = 0.3 } ); + } - std::vector materials = { - Material{ .name = "sand", .density = 2000.0, .elastic1 = 5e+09, .elastic2 = 0.2, .permeability1 = 1e-09, .permeability2 = 0.3 } }; for ( Material mat : materials ) { RifInpExportTools::printHeading( stream, "Material, name=" + mat.name ); RifInpExportTools::printHeading( stream, "Density" ); RifInpExportTools::printNumber( stream, mat.density ); RifInpExportTools::printHeading( stream, "Elastic" ); - RifInpExportTools::printNumbers( stream, { mat.elastic1, mat.elastic2 } ); + RifInpExportTools::printNumbers( stream, { mat.youngsModulus, mat.poissonNumber } ); RifInpExportTools::printHeading( stream, "Permeability, specific=1." ); RifInpExportTools::printNumbers( stream, { mat.permeability1, mat.permeability2 } ); diff --git a/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.h b/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.h index 719be7a469..8c56fe58e9 100644 --- a/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.h +++ b/ApplicationLibCode/FileInterface/RifFaultReactivationModelExporter.h @@ -46,14 +46,17 @@ private: const std::map& partNames, const std::vector>& borders, const std::map, int>& faces, - const std::map& boundaries ); + const std::map& boundaries, + const std::map& materialNames ); static std::pair printAssembly( std::ostream& stream, const RigFaultReactivationModel& model, const std::map& partNames, const std::pair& transform ); - static std::pair printMaterials( std::ostream& stream ); + static std::pair printMaterials( std::ostream& stream, + const RimFaultReactivationModel& rimModel, + const std::map& materialNames ); static std::pair printInteractionProperties( std::ostream& stream, double faultFriction ); static std::pair printBoundaryConditions( std::ostream& stream,