GEOS
CompositionalMultiphaseUtilities.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_COMPOSITIONALMULTIPHASEUTILITIES_H_
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEUTILITIES_H_
22 
23 #include "common/DataTypes.hpp"
24 
25 namespace geos
26 {
27 
28 namespace compositionalMultiphaseUtilities
29 {
30 
34 enum class ScalingType : integer
35 {
36  Global,
37  Local
38 };
39 
40 ENUM_STRINGS( ScalingType,
41  "Global",
42  "Local" );
43 
74 template< typename VEC >
77  integer const numRowsInBlock,
78  integer const numBlocks,
79  VEC && v )
80 {
81  for( integer i = 0; i < numBlocks; ++i )
82  {
83  integer const ind = i * numRowsInBlock + numRowsToShift - 1;
84  real64 tmp = v[ind];
85  for( int j = ind - 1; j >= i * numRowsInBlock; --j )
86  {
87  v[j+1] = v[j];
88  tmp += v[j];
89  }
90  v[i*numRowsInBlock] = tmp;
91  }
92 }
93 
102 template< typename VEC >
105  VEC && v )
106 {
108 }
109 
147 template< typename MATRIX, typename VEC >
150  integer const numRowsInBlock,
151  integer const numColsInBlock,
152  integer const numBlocks,
153  MATRIX && mat,
154  VEC && work )
155 {
156  for( integer k = 0; k < numBlocks; ++k )
157  {
158  integer const ind = k * numRowsInBlock + numRowsToShift - 1;
159  for( integer j = 0; j < numColsInBlock; ++j )
160  {
161  work[j] = mat[ind][j];
162  }
163  for( integer i = ind - 1; i >= k * numRowsInBlock; --i )
164  {
165  for( integer j = 0; j < numColsInBlock; ++j )
166  {
167  mat[i+1][j] = mat[i][j];
168  work[j] += mat[i][j];
169  }
170  }
171  for( integer j = 0; j < numColsInBlock; ++j )
172  {
173  mat[k*numRowsInBlock][j] = work[j];
174  }
175  }
176 }
177 
190 template< typename MATRIX, typename VEC >
193  integer const numColsInBlock,
194  MATRIX && mat,
195  VEC && work )
196 {
197  shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numRowsInBlock, numRowsInBlock, numColsInBlock, 1, mat, work );
198 }
199 
200 } // namespace compositionalMultiphaseUtilities
201 
202 } // namespace geos
203 
204 #endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEUTILITIES_HPP_
GEOS_HOST_DEVICE void shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum(integer const numRowsInBlock, integer const numColsInBlock, MATRIX &&mat, VEC &&work)
Shifts all rows one position ahead and replaces the first row with the sum of all rows in the input b...
GEOS_HOST_DEVICE void shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum(integer const numRowsToShift, integer const numRowsInBlock, integer const numColsInBlock, integer const numBlocks, MATRIX &&mat, VEC &&work)
In each block, shift the elements from 0 to numRowsToShift-1, shifts all rows one position ahead and ...
GEOS_HOST_DEVICE void shiftElementsAheadByOneAndReplaceFirstElementWithSum(integer const numRows, VEC &&v)
Shifts all elements one position ahead and replaces the first element with the sum of all elements in...
GEOS_HOST_DEVICE void shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum(integer const numRowsToShift, integer const numRowsInBlock, integer const numBlocks, VEC &&v)
In each block, shift the elements from 0 to numRowsToShift-1 one position ahead and replaces the firs...
ScalingType
Solution scaling type, used in CompositionalMultiphaseFVM.
@ Global
Scale the Newton update with a unique scaling factor.
@ Local
Scale the Newton update locally (modifies the Newton direction)
#define GEOS_HOST_DEVICE
Marks a host-device function.
Definition: GeosxMacros.hpp:49
ENUM_STRINGS(LinearSolverParameters::SolverType, "direct", "cg", "gmres", "fgmres", "bicgstab", "preconditioner")
Declare strings associated with enumeration values.
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82