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 
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 m_csvFilename;
322 
323 
327  void registerDataOnMesh( Group & meshBodies ) override;
328 
332  void postInputInitialization() override;
333 
334  dataRepository::Wrapper< WrappedStats > & registerWrappedStats( Group & group,
335  string_view fluxName );
336 
345  void gatherStatsForLog( bool logLevelActive,
346  string_view fluxName,
347  string_view elementSetName,
348  TableData & tableData,
349  WrappedStats const & wrappedStats );
355  void gatherStatsForCSV( string_view fluxName,
356  string_view elementSetName,
357  TableData & tableData,
358  WrappedStats const & stats );
359 
366  void outputStatsToLog( bool logLevelActive, string_view fluxesStr, TableData const & tableMeshData );
367 
372  void outputStatsToCSV( TableData & csvData );
373 
374 };
375 
376 
377 template< typename LAMBDA >
379  string_view fluxName,
380  LAMBDA && lambda )
381 {
382  container.forWrappers< WrappedStats >( [&]( dataRepository::Wrapper< WrappedStats > & statsWrapper )
383  {
384  if( statsWrapper.referenceAsView().getFluxName() == fluxName )
385  {
386  lambda( statsWrapper.reference() );
387  }
388  } );
389 }
390 
391 template< typename LAMBDA >
393  LAMBDA && lambda )
394 {
396  [&] ( string const &,
397  MeshLevel & meshLevel,
398  string_array const & )
399  {
400  string const wrapperName = getStatWrapperName( viewKeyStruct::fluxSetWrapperString() );
401  WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference();
402 
403  lambda( meshLevel, stats );
404  } );
405 }
406 template< typename LAMBDA >
408  LAMBDA && lambda )
409 {
410  for( string const & fluxName : m_fluxNames )
411  {
412  string const wrapperName = getStatWrapperName( fluxName );
413  WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference();
414 
415  lambda( meshLevel, stats );
416  }
417 }
418 template< typename LAMBDA >
420  string_view fluxName,
421  LAMBDA && lambda )
422 {
423  string const wrapperName = getStatWrapperName( fluxName );
424  meshLevel.getElemManager().forElementRegions( [&]( ElementRegionBase & region )
425  {
426  WrappedStats & stats = region.getWrapper< WrappedStats >( wrapperName ).reference();
427 
428  lambda( region, stats );
429  } );
430 }
431 template< typename LAMBDA >
433  string_view fluxName,
434  LAMBDA && lambda )
435 {
436  string const wrapperName = getStatWrapperName( fluxName );
437  region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion )
438  {
439  WrappedStats & stats = subRegion.getWrapper< WrappedStats >( wrapperName ).reference();
440 
441  lambda( subRegion, stats );
442  } );
443 }
444 
446 { return GEOS_FMT( "{}_region_stats_for_{}", fluxName, getName() ); }
447 
448 
449 } /* namespace geos */
450 
451 #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:179
stdVector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:361
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
int integer
Signed integer type.
Definition: DataTypes.hpp:81
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:175
std::string_view string_view
String type.
Definition: DataTypes.hpp:93
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.