GEOS
SolutionCheckKernel.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 GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP
22 
23 #include "common/DataTypes.hpp"
24 #include "common/GEOS_RAJA_Interface.hpp"
26 
27 namespace geos
28 {
29 
30 namespace singlePhaseBaseKernels
31 {
32 
33 /******************************** SolutionCheckKernel ********************************/
34 
36 {
37 
38  struct KernelStats
39  {
40  real64 minNegPres;
41  };
42 
43  template< typename POLICY >
44  static KernelStats launch( arrayView1d< real64 const > const & localSolution,
45  globalIndex const rankOffset,
46  arrayView1d< globalIndex const > const & dofNumber,
47  arrayView1d< integer const > const & ghostRank,
48  arrayView1d< real64 const > const & pres,
49  real64 const scalingFactor,
50  ElementsReporterCollector const & negPressureIds )
51  {
52  using reducePolicy = ReducePolicy< POLICY >;
53  using atomicPolicy = AtomicPolicy< POLICY >;
54  RAJA::ReduceMin< reducePolicy, real64 > minNegPres( 0.0 );
55 
56  forAll< POLICY >( dofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei )
57  {
58  if( ghostRank[ei] < 0 && dofNumber[ei] >= 0 )
59  {
60  localIndex const lid = dofNumber[ei] - rankOffset;
61  real64 const newPres = pres[ei] + scalingFactor * localSolution[lid];
62 
63  if( newPres <= 0.0 )
64  {
65  minNegPres.min( newPres );
66  negPressureIds.collectElement( atomicPolicy{}, { ei, newPres } );
67  }
68  }
69 
70  } );
71 
72  return KernelStats{ minNegPres.get() };
73  }
74 
75 };
76 
77 } // namespace singlePhaseBaseKernels
78 
79 } // namespace geos
80 
81 #endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP
#define GEOS_HOST_DEVICE
Marks a host-device function.
Definition: GeosxMacros.hpp:49
Collects and reports elements ids and data using an atomic counter. This class provides functionality...
GEOS_HOST_DEVICE void collectElement(CollectorAtomicPolicy, ElementReport const &report) const
Collects a single element report and adds its ID to the output buffer if not disabled and there are a...
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:179
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:87
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:84