GEOS
SourceFluxStatistics.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_
21 #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_
22 
23 #include "../FieldStatisticsBase.hpp"
24 #include "FlowSolverBase.hpp"
25 #include "mesh/DomainPartition.hpp"
29 #include <map>
30 
31 namespace geos
32 {
33 
39 class SourceFluxStatsAggregator final : public FieldStatisticsBase< FlowSolverBase >
40 {
41 public:
42 
46  struct StatData
47  {
56 
61  void allocate( integer phaseCount );
65  void reset();
70  { return m_producedMass.size(); }
75  void combine( StatData const & other );
80  void mpiReduce();
81  };
87  {
88 public:
94  void setTarget( string_view aggregatorName, string_view fluxName );
95 
104  void gatherTimeStepStats( real64 currentTime, real64 dt,
105  arrayView1d< real64 const > const & producedMass,
106  integer elementCount );
107 
114 
119  { return m_stats; }
120 
124  StatData const & stats() const
125  { return m_stats; }
126 
131  { return m_statsPeriodStart; }
132 
137  { return m_statsPeriodDT; }
138 
143  { return m_aggregatorName; }
144 
149  { return m_fluxName; }
150 private:
152  StatData m_stats;
154  real64 m_statsPeriodStart;
156  real64 m_statsPeriodDT;
157 
161  struct PeriodStats
162  {
164  array1d< real64 > m_timeStepMass;
166  array1d< real64 > m_periodPendingMass;
168  real64 m_timeStepStart = 0.0;
170  real64 m_timeStepDeltaTime = 0.0;
172  real64 m_periodStart = 0.0;
174  real64 m_periodPendingDeltaTime = 0.0;
176  integer m_elementCount = 0;
178  bool m_isGathering = false;
179 
184  void allocate( integer phaseCount );
188  void reset();
192  integer getPhaseCount() const
193  { return m_timeStepMass.size(); }
194  } m_periodStats;
195 
197  string m_aggregatorName;
199  string m_fluxName;
200  };
201 
202 
208  SourceFluxStatsAggregator( const string & name,
209  Group * const parent );
210 
214  static string catalogName() { return "SourceFluxStatistics"; }
215 
219  virtual bool execute( real64 const time_n,
220  real64 const dt,
221  integer const cycleNumber,
222  integer const eventCounter,
223  real64 const eventProgress,
224  DomainPartition & domain ) override;
225 
236  template< typename LAMBDA >
237  void forMeshLevelStatsWrapper( DomainPartition & domain, LAMBDA && lambda );
247  template< typename LAMBDA >
248  void forAllFluxStatsWrappers( MeshLevel & meshLevel, LAMBDA && lambda );
260  template< typename LAMBDA >
261  void forAllRegionStatsWrappers( MeshLevel & meshLevel, string_view fluxName, LAMBDA && lambda );
272  template< typename LAMBDA >
273  void forAllSubRegionStatsWrappers( ElementRegionBase & region, string_view fluxName, LAMBDA && lambda );
274 
287  template< typename LAMBDA >
288  static void forAllFluxStatWrappers( Group & container, string_view fluxName, LAMBDA && lambda );
289 
295  inline string getStatWrapperName( string_view fluxName ) const;
296 
297 
302  {
304  constexpr inline static string_view fluxNamesString() { return "fluxNames"; }
306  constexpr inline static string_view allRegionWrapperString() { return "all_regions"; }
308  constexpr inline static string_view fluxSetWrapperString() { return "flux_set"; }
309  };
310 
311 
312 private:
314 
316  string_array m_fluxNames;
318  TableLayout m_logLayout;
319  TableLayout m_csvLayout;
320 
321  string_array m_subRegionsfilename;
322  string_array m_regionsfilename;
323  string_array m_allRegionFluxsfilename;
324  string_array m_allRegionWrapperFluxFilename;
325 
326 
330  void registerDataOnMesh( Group & meshBodies ) override;
331 
335  void postInputInitialization() override;
336 
337  dataRepository::Wrapper< WrappedStats > & registerWrappedStats( Group & group,
338  string_view fluxName,
339  string_view elementSetName,
340  string_array & filenames );
341 
349  void gatherStatsForLog( bool logLevelActive,
350  string_view elementSetName,
351  TableData & tableData,
352  WrappedStats const & wrappedStats );
358  void gatherStatsForCSV( TableData & tableData, WrappedStats const & stats );
359 
366  void outputStatsToLog( bool logLevelActive, string_view elementSetName, TableData const & tableMeshData );
367 
373  void outputStatsToCSV( string_array const & filenames, TableData & csvData );
374 
375 };
376 
377 
378 template< typename LAMBDA >
380  string_view fluxName,
381  LAMBDA && lambda )
382 {
383  container.forWrappers< WrappedStats >( [&]( dataRepository::Wrapper< WrappedStats > & statsWrapper )
384  {
385  if( statsWrapper.referenceAsView().getFluxName() == fluxName )
386  {
387  lambda( statsWrapper.reference() );
388  }
389  } );
390 }
391 
392 template< typename LAMBDA >
394  LAMBDA && lambda )
395 {
397  [&] ( string const &,
398  MeshLevel & meshLevel,
399  string_array const & )
400  {
401  string const wrapperName = getStatWrapperName( viewKeyStruct::fluxSetWrapperString() );
402  WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference();
403 
404  lambda( meshLevel, stats );
405  } );
406 }
407 template< typename LAMBDA >
409  LAMBDA && lambda )
410 {
411  for( string const & fluxName : m_fluxNames )
412  {
413  string const wrapperName = getStatWrapperName( fluxName );
414  WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference();
415 
416  lambda( meshLevel, stats );
417  }
418 }
419 template< typename LAMBDA >
421  string_view fluxName,
422  LAMBDA && lambda )
423 {
424  string const wrapperName = getStatWrapperName( fluxName );
425  meshLevel.getElemManager().forElementRegions( [&]( ElementRegionBase & region )
426  {
427  WrappedStats & stats = region.getWrapper< WrappedStats >( wrapperName ).reference();
428 
429  lambda( region, stats );
430  } );
431 }
432 template< typename LAMBDA >
434  string_view fluxName,
435  LAMBDA && lambda )
436 {
437  string const wrapperName = getStatWrapperName( fluxName );
438  region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion )
439  {
440  WrappedStats & stats = subRegion.getWrapper< WrappedStats >( wrapperName ).reference();
441 
442  lambda( subRegion, stats );
443  } );
444 }
445 
447 { return GEOS_FMT( "{}_region_stats_for_{}", fluxName, getName() ); }
448 
449 
450 } /* namespace geos */
451 
452 #endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ */
Partition of the decomposed physical domain. It also manages the connexion information to its neighbo...
Group const & getMeshBodies() const
Get the mesh bodies, const version.
The ElementRegionBase is the base class to manage the data stored at the element level.
void forElementSubRegions(LAMBDA &&lambda) const
Apply a lambda to all subregions.
void forElementRegions(LAMBDA &&lambda)
This function is used to launch kernel function over all the element regions with region type = Eleme...
FlowSolverBase * m_solver
Pointer to the physics solver.
Class facilitating the representation of a multi-level discretization of a MeshBody.
Definition: MeshLevel.hpp:42
ElementRegionManager const & getElemManager() const
Get the element region manager.
Definition: MeshLevel.hpp:207
void forDiscretizationOnMeshTargets(Group const &meshBodies, LAMBDA &&lambda) const
Loop over the target discretization on all mesh targets and apply callback.
Class that aggregate statistics of a flux over multiple time-steps for a given SourceFluxStatsAggrega...
void gatherTimeStepStats(real64 currentTime, real64 dt, arrayView1d< real64 const > const &producedMass, integer elementCount)
Set the current time step stats. Accumulate the statistics only if the time is strictly after the pre...
void finalizePeriod()
Finalize the period statistics of each timestep gathering and render data over all mpi ranks....
void setTarget(string_view aggregatorName, string_view fluxName)
Set the subjects targeted by the stats.
string getStatWrapperName(string_view fluxName) const
virtual bool execute(real64 const time_n, real64 const dt, integer const cycleNumber, integer const eventCounter, real64 const eventProgress, DomainPartition &domain) override
Main extension point of executable targets.
void forAllSubRegionStatsWrappers(ElementRegionBase &region, string_view fluxName, LAMBDA &&lambda)
Apply a functor to all subregion WrappedStats (of the given region) that target a given flux.
void forAllFluxStatsWrappers(MeshLevel &meshLevel, LAMBDA &&lambda)
Apply a functor to each WrappedStats that combines the stats over all region for a flux.
static void forAllFluxStatWrappers(Group &container, string_view fluxName, LAMBDA &&lambda)
Apply a functor to all WrappedStats of the given group that target a given flux (and potentially mult...
void forAllRegionStatsWrappers(MeshLevel &meshLevel, string_view fluxName, LAMBDA &&lambda)
Apply a functor to all simulated region WrappedStats (of the given MeshLevel) that target a given flu...
SourceFluxStatsAggregator(const string &name, Group *const parent)
Constructor for the statistics class.
void forMeshLevelStatsWrapper(DomainPartition &domain, LAMBDA &&lambda)
Apply a functor to WrappedStats that combines all stats for each target solver discretization mesh le...
Class for managing table data.
Definition: TableData.hpp:35
Class for setup the table layout.
Definition: TableLayout.hpp:36
string const & getName() const
Get group name.
Definition: Group.hpp:1331
Wrapper< T > const & getWrapper(LOOKUP_TYPE const &index) const
Retrieve a Wrapper stored in this group.
Definition: Group.hpp:1216
void forWrappers(LAMBDA &&lambda)
Apply the given functor to wrappers.
Definition: Group.hpp:637
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
std::vector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:393
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:176
std::string_view string_view
String type.
Definition: DataTypes.hpp:94
void reset()
reset the stats to 0.0
void allocate(integer phaseCount)
resize the phase data arrays if needed
void mpiReduce()
Aggregate the statistics of the instance with those from all instances from other MPI ranks....
void combine(StatData const &other)
Aggregate the statistics of the instance with those of another one.
integer m_elementCount
Number of elements in which we are producing / injecting.