diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp index ff56013ff93d07e7d41e5466a9195679fb239165..e7c0af359707e9bdf39696ccd31c9796c8d78d3f 100644 --- a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp +++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp @@ -174,6 +174,35 @@ void ComponentTransportProcess:: _local_assemblers, pv.getActiveElementIDs(), _coupled_solutions); } +void ComponentTransportProcess::extrapolateIntegrationPointValuesToNodes( + const double t, + std::vector<GlobalVector*> const& integration_point_values_vectors, + std::vector<GlobalVector*>& nodal_values_vectors) +{ + auto& extrapolator = getExtrapolator(); + auto const extrapolatables = + NumLib::makeExtrapolatable(_local_assemblers, + &ComponentTransportLocalAssemblerInterface:: + getInterpolatedLocalSolution); + + for (unsigned transport_process_id = 0; + transport_process_id < integration_point_values_vectors.size(); + ++transport_process_id) + { + auto const& pv = _process_variables[transport_process_id + 1][0].get(); + auto const& int_pt_C = + integration_point_values_vectors[transport_process_id]; + + extrapolator.extrapolate(pv.getNumberOfComponents(), extrapolatables, t, + {int_pt_C}, + {_local_to_global_index_map.get()}); + + auto const& nodal_values = extrapolator.getNodalValues(); + MathLib::LinAlg::copy(nodal_values, + *nodal_values_vectors[transport_process_id + 1]); + } +} + void ComponentTransportProcess::preTimestepConcreteProcess( std::vector<GlobalVector*> const& x, const double /*t*/, const double /*delta_t*/, int const process_id) diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.h b/ProcessLib/ComponentTransport/ComponentTransportProcess.h index 8b5f300935f5723185844a75d33d80b34413e79d..374f771f5e707e6c4081df10e56fc146cdb3979b 100644 --- a/ProcessLib/ComponentTransport/ComponentTransportProcess.h +++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.h @@ -117,6 +117,11 @@ public: void setCoupledTermForTheStaggeredSchemeToLocalAssemblers( int const process_id) override; + void extrapolateIntegrationPointValuesToNodes( + const double t, + std::vector<GlobalVector*> const& integration_point_values_vectors, + std::vector<GlobalVector*>& nodal_values_vectors) override; + void preTimestepConcreteProcess(std::vector<GlobalVector*> const& x, const double /*t*/, const double /*delta_t*/, diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index 5d5d92e32758fc7ccb849c12f2c1b1081c9b8d08..5838c56e19ccc3c7575ca91667f8f33ce84b3045 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -100,6 +100,14 @@ public: int const /*process_id*/) { } + + virtual void extrapolateIntegrationPointValuesToNodes( + const double /*t*/, + std::vector<GlobalVector*> const& /*integration_point_values_vectors*/, + std::vector<GlobalVector*>& /*nodal_values_vectors*/) + { + } + void preAssemble(const double t, double const dt, GlobalVector const& x) final; void assemble(const double t, double const dt,