From 8d2b00fd2325c46f98942c432405df9b1a211e48 Mon Sep 17 00:00:00 2001
From: "Dmitry Yu. Naumov" <github@naumov.de>
Date: Tue, 4 Sep 2018 16:09:57 +0200
Subject: [PATCH] [PL] RM; Interpolated pressure output.

This is copy from LIE/HM and needs to be generalized.
---
 .../RichardsMechanicsFEM-impl.h               | 42 +++++++++++++++++++
 .../RichardsMechanicsProcess.cpp              |  5 +++
 .../RichardsMechanicsProcessData.h            |  1 +
 3 files changed, 48 insertions(+)

diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
index c7d2fb5f04e..6d09a5688bd 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
@@ -15,6 +15,7 @@
 
 #include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
 #include "MathLib/KelvinVector.h"
+#include "NumLib/Fem/CoordinatesMapping/NaturalNodeCoordinates.h"
 #include "NumLib/Function/Interpolation.h"
 #include "ProcessLib/CoupledSolutionsForStaggeredScheme.h"
 
@@ -832,6 +833,47 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
     saturation_avg /= n_integration_points;
 
     (*_process_data.element_saturation)[_element.getID()] = saturation_avg;
+
+    // For each higher order node evaluate the shape matrices for the lower
+    // order element (the base nodes)
+    // TODO (naumov) Extract this method to be useful for other processes.
+    auto interpolate_p = [&]() {
+        using FemType =
+            NumLib::TemplateIsoparametric<ShapeFunctionPressure,
+                                          ShapeMatricesTypePressure>;
+
+        FemType fe(
+            *static_cast<const typename ShapeFunctionPressure::MeshElement*>(
+                &_element));
+        int const number_base_nodes = _element.getNumberOfBaseNodes();
+        int const number_all_nodes = _element.getNumberOfNodes();
+
+        for (int n = 0; n < number_base_nodes; ++n)
+        {
+            std::size_t const global_index = _element.getNodeIndex(n);
+            (*_process_data.pressure_interpolated)[global_index] = p_L[n];
+        }
+
+        for (int n = number_base_nodes; n < number_all_nodes; ++n)
+        {
+            // Evaluated at higher order nodes' coordinates.
+            typename ShapeMatricesTypePressure::ShapeMatrices shape_matrices_p{
+                ShapeFunctionPressure::DIM, DisplacementDim,
+                ShapeFunctionPressure::NPOINTS};
+
+            fe.computeShapeFunctions(
+                NumLib::NaturalCoordinates<typename ShapeFunctionDisplacement::
+                                               MeshElement>::coordinates[n]
+                    .data(),
+                shape_matrices_p, DisplacementDim, _is_axially_symmetric);
+
+            auto const& N_p = shape_matrices_p.N;
+
+            std::size_t const global_index = _element.getNodeIndex(n);
+            (*_process_data.pressure_interpolated)[global_index] = N_p * p_L;
+        }
+    };
+    interpolate_p();
 }
 
 }  // namespace RichardsMechanics
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
index d1ef1a3cd66..2765c51b04d 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
@@ -195,6 +195,11 @@ void RichardsMechanicsProcess<DisplacementDim>::initializeConcreteProcess(
     _process_data.element_saturation = MeshLib::getOrCreateMeshProperty<double>(
         const_cast<MeshLib::Mesh&>(mesh), "saturation_avg",
         MeshLib::MeshItemType::Cell, 1);
+
+    _process_data.pressure_interpolated =
+        MeshLib::getOrCreateMeshProperty<double>(
+            const_cast<MeshLib::Mesh&>(mesh), "pressure_interpolated",
+            MeshLib::MeshItemType::Node, 1);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
index f737f7ce28a..c788c645b81 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
@@ -104,6 +104,7 @@ struct RichardsMechanicsProcessData
     double t = 0.0;
 
     MeshLib::PropertyVector<double>* element_saturation = nullptr;
+    MeshLib::PropertyVector<double>* pressure_interpolated = nullptr;
 
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
 };
-- 
GitLab