GEOS
CoupledReservoirAndWellKernels.hpp
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University
7  * Copyright (c) 2018-2020 TotalEnergies
8  * Copyright (c) 2019- GEOSX Contributors
9  * All rights reserved
10  *
11  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
12  * ------------------------------------------------------------------------------------------------------------
13  */
14 
19 #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP
20 #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP
21 
22 
23 #include "common/DataTypes.hpp"
24 #include "common/GEOS_RAJA_Interface.hpp"
25 #include "constitutive/fluid/multifluid/Layouts.hpp"
30 namespace geos
31 {
32 
33 namespace coupledReservoirAndWellKernels
34 {
35 
36 using namespace constitutive;
37 
43 template< integer NC, integer IS_THERMAL >
45 {
46 public:
47 
49  static constexpr integer numComp = NC;
50  static constexpr integer resNumDOF = NC+1+IS_THERMAL;
51 
52  // Well jacobian column and row indicies
55 
58 
59  using CP_Deriv = multifluid::DerivativeOffsetC< NC, IS_THERMAL >;
60 
62 
63 
64 
66  static constexpr integer numDof = WJ_COFFSET::nDer;
67 
69  static constexpr integer numEqn = WJ_ROFFSET::nEqn - 2;
70 
86  globalIndex const rankOffset,
87  string const wellDofKey,
88  WellElementSubRegion const & subRegion,
90  PerforationData const * const perforationData,
91  MultiFluidBase const & fluid,
92 
93  arrayView1d< real64 > const & localRhs,
95  bool const & detectCrossflow,
96  integer & numCrossFlowPerforations,
97  BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags )
98  :
99  m_dt( dt ),
100  m_numPhases ( fluid.numFluidPhases()),
101  m_rankOffset( rankOffset ),
102  m_compPerfRate( perforationData->getField< fields::well::compPerforationRate >() ),
103  m_dCompPerfRate( perforationData->getField< fields::well::dCompPerforationRate >() ),
104  m_perfWellElemIndex( perforationData->getField< fields::perforation::wellElementIndex >() ),
105  m_wellElemDofNumber( subRegion.getReference< array1d< globalIndex > >( wellDofKey ) ),
106  m_resElemDofNumber( resDofNumber ),
107  m_resElementRegion( perforationData->getField< fields::perforation::reservoirElementRegion >() ),
108  m_resElementSubRegion( perforationData->getField< fields::perforation::reservoirElementSubRegion >() ),
109  m_resElementIndex( perforationData->getField< fields::perforation::reservoirElementIndex >() ),
110  m_localRhs( localRhs ),
111  m_localMatrix( localMatrix ),
112  m_detectCrossflow( detectCrossflow ),
113  m_numCrossFlowPerforations( numCrossFlowPerforations ),
114  m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ) )
115  { }
116 
117 
126  template< typename FUNC = NoOpFunc >
128  inline
129  void computeFlux( localIndex const iperf,
130  FUNC && compFluxKernelOp = NoOpFunc{} ) const
131  {
132 
133  using namespace compositionalMultiphaseUtilities;
134  // local working variables and arrays
135  stackArray1d< localIndex, 2* numComp > eqnRowIndices( 2 * numComp );
136  stackArray1d< globalIndex, 2*resNumDOF > dofColIndices( 2 * resNumDOF );
137 
138  stackArray1d< real64, 2 * numComp > localPerf( 2 * numComp );
139  stackArray2d< real64, 2 * resNumDOF * 2 * numComp > localPerfJacobian( 2 * numComp, 2 * resNumDOF );
140 
141  // get the reservoir (sub)region and element indices
142  localIndex const er = m_resElementRegion[iperf];
143  localIndex const esr = m_resElementSubRegion[iperf];
144  localIndex const ei = m_resElementIndex[iperf];
145 
146  // get the well element index for this perforation
147  localIndex const iwelem = m_perfWellElemIndex[iperf];
148  globalIndex const resOffset = m_resElemDofNumber[er][esr][ei];
149  globalIndex const wellElemOffset = m_wellElemDofNumber[iwelem];
150 
151  for( integer ic = 0; ic < numComp; ++ic )
152  {
153  eqnRowIndices[TAG::RES * numComp + ic] = LvArray::integerConversion< localIndex >( resOffset - m_rankOffset ) + ic;
154  eqnRowIndices[TAG::WELL * numComp + ic] = LvArray::integerConversion< localIndex >( wellElemOffset - m_rankOffset ) + WJ_ROFFSET::MASSBAL + ic;
155  }
156  // Note res and well have same col lineup for P and compdens
157  for( integer jdof = 0; jdof < NC+1; ++jdof )
158  {
159  dofColIndices[TAG::RES * resNumDOF + jdof] = resOffset + jdof;
160  dofColIndices[TAG::WELL * resNumDOF + jdof] = wellElemOffset + WJ_COFFSET::dP + jdof;
161  }
162  // For temp its different
163  if constexpr ( IS_THERMAL )
164  {
165  dofColIndices[TAG::RES * resNumDOF + NC+1 ] = resOffset + NC+1;
166  dofColIndices[TAG::WELL * resNumDOF + NC+1 ] = wellElemOffset + WJ_COFFSET::dT;
167  }
168  // populate local flux vector and derivatives
169  for( integer ic = 0; ic < numComp; ++ic )
170  {
171  localPerf[TAG::RES * numComp + ic] = m_dt * m_compPerfRate[iperf][ic];
172  localPerf[TAG::WELL * numComp + ic] = -m_dt * m_compPerfRate[iperf][ic];
173 
174  if( m_detectCrossflow )
175  {
176  if( m_compPerfRate[iperf][ic] > LvArray::NumericLimits< real64 >::epsilon )
177  {
178  m_numCrossFlowPerforations += 1;
179  }
180  }
181  for( integer ke = 0; ke < 2; ++ke )
182  {
183  localIndex localDofIndexPres = ke * resNumDOF;
184 
185  localPerfJacobian[TAG::RES * numComp + ic][localDofIndexPres] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dP];
186  localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexPres] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dP];
187  for( integer jc = 0; jc < numComp; ++jc )
188  {
189  localIndex const localDofIndexComp = localDofIndexPres + jc + 1;
190 
191  localPerfJacobian[TAG::RES * numComp + ic][localDofIndexComp] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dC+jc];
192  localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexComp] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dC+jc];
193  }
194  if constexpr ( IS_THERMAL )
195  {
196  localIndex localDofIndexTemp = localDofIndexPres + NC + 1;
197  localPerfJacobian[TAG::RES * numComp + ic][localDofIndexTemp] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dT];
198  localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexTemp] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dT];
199  }
200  }
201  }
202 
203  if( m_useTotalMassEquation )
204  {
205  // Apply equation/variable change transformation(s)
206  stackArray1d< real64, 2 * resNumDOF > work( 2 * resNumDOF );
207  shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numComp, resNumDOF * 2, 2, localPerfJacobian, work );
208  shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numComp, 2, localPerf );
209  }
210 
211  for( localIndex i = 0; i < localPerf.size(); ++i )
212  {
213  if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < m_localMatrix.numRows() )
214  {
215  m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i],
216  dofColIndices.data(),
217  localPerfJacobian[i].dataIfContiguous(),
218  2 * resNumDOF );
219  RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], localPerf[i] );
220  }
221  }
222  compFluxKernelOp( resOffset, wellElemOffset, dofColIndices, iwelem );
223 
224  }
225 
226 
235  template< typename POLICY, typename KERNEL_TYPE >
236  static void
237  launch( localIndex const numElements,
238  KERNEL_TYPE const & kernelComponent )
239  {
241  forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie )
242  {
243  kernelComponent.computeFlux( ie );
244 
245  } );
246  }
247 
248 protected:
249 
251  real64 const m_dt;
252 
255 
256  globalIndex const m_rankOffset;
257  // Perfoation variables
258  arrayView2d< real64 const > const m_compPerfRate;
259  arrayView4d< real64 const > const m_dCompPerfRate;
260  arrayView1d< localIndex const > const m_perfWellElemIndex;
261 
262  // Element region, subregion, index
263  arrayView1d< globalIndex const > const m_wellElemDofNumber;
265  arrayView1d< localIndex const > const m_resElementRegion;
266  arrayView1d< localIndex const > const m_resElementSubRegion;
267  arrayView1d< localIndex const > const m_resElementIndex;
268 
269  // RHS and Jacobian
270  arrayView1d< real64 > const m_localRhs;
272 
273  bool const m_detectCrossflow;
274  integer & m_numCrossFlowPerforations;
275  integer const m_useTotalMassEquation;
276 };
277 
282 {
283 public:
284 
298  template< typename POLICY >
299  static void
300  createAndLaunch( integer const numComps,
301  real64 const dt,
302  globalIndex const rankOffset,
303  string const wellDofKey,
304  WellElementSubRegion const & subRegion,
306  PerforationData const * const perforationData,
307  MultiFluidBase const & fluid,
308  integer const & useTotalMassEquation,
309  bool const & detectCrossflow,
310  integer & numCrossFlowPerforations,
311  arrayView1d< real64 > const & localRhs,
313  )
314  {
315  isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC )
316  {
317  integer constexpr NUM_COMP = NC();
318 
319 
320  BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags;
321  if( useTotalMassEquation )
322  kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation );
323 
324 
326 
327 
328  kernelType kernel( dt, rankOffset, wellDofKey, subRegion, resDofNumber, perforationData, fluid, localRhs, localMatrix, detectCrossflow, numCrossFlowPerforations, kernelFlags );
329  kernelType::template launch< POLICY >( perforationData->size(), kernel );
330  } );
331 
332  }
333 };
334 
335 
341 template< integer NC, integer IS_THERMAL >
343 {
344 public:
347  static constexpr integer numComp = NC;
348  static constexpr integer resNumDOF = NC+1+IS_THERMAL;
349 
350  // Well jacobian column and row indicies
353 
356 
357  using CP_Deriv = multifluid::DerivativeOffsetC< NC, IS_THERMAL >;
358 
360 
361  using Base::m_dt;
362  using Base::m_localRhs;
363  using Base::m_localMatrix;
364  using Base::m_rankOffset;
365 
366 
367 
369  static constexpr integer numDof = WJ_COFFSET::nDer;
370 
372  static constexpr integer numEqn = WJ_ROFFSET::nEqn - 2;
373 
389  integer const isProducer,
390  globalIndex const rankOffset,
391  string const wellDofKey,
392  WellElementSubRegion const & subRegion,
394  PerforationData const * const perforationData,
395  MultiFluidBase const & fluid,
396  arrayView1d< real64 > const & localRhs,
397  CRSMatrixView< real64, globalIndex const > const & localMatrix,
398  bool const & detectCrossflow,
399  integer & numCrossFlowPerforations,
400  BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags )
401  : Base( dt,
402  rankOffset,
403  wellDofKey,
404  subRegion,
405  resDofNumber,
406  perforationData,
407  fluid,
408  localRhs,
409  localMatrix,
410  detectCrossflow,
411  numCrossFlowPerforations,
412  kernelFlags ),
413  m_isProducer( isProducer ),
414  m_globalWellElementIndex( subRegion.getGlobalWellElementIndex() ),
415  m_energyPerfFlux( perforationData->getField< fields::well::energyPerforationFlux >()),
416  m_dEnergyPerfFlux( perforationData->getField< fields::well::dEnergyPerforationFlux >())
417 
418  { }
419 
420 
430  inline
431  void computeFlux( localIndex const iperf ) const
432  {
433  Base::computeFlux( iperf, [&] ( globalIndex const & resOffset,
434  globalIndex const & wellElemOffset,
436  localIndex const iwelem )
437  {
438  // No energy equation if top element and Injector
439  // Top element defined by global index == 0
440  // Assumption is global index == 0 is top segment with fixed temp BC
441  if( !m_isProducer )
442  {
443  if( m_globalWellElementIndex[iwelem] == 0 )
444  return;
445  }
446  // local working variables and arrays
447  stackArray1d< localIndex, 2* numComp > eqnRowIndices( 2 );
448 
450  stackArray2d< real64, 2 * resNumDOF * 2 * numComp > localPerfJacobian( 2, 2 * resNumDOF );
451 
452 
453  // equantion offsets - note res and well have different equation lineups
454  eqnRowIndices[TAG::RES ] = LvArray::integerConversion< localIndex >( resOffset - m_rankOffset ) + NC + 1;
455  eqnRowIndices[TAG::WELL ] = LvArray::integerConversion< localIndex >( wellElemOffset - m_rankOffset ) + WJ_ROFFSET::ENERGYBAL;
456 
457  // populate local flux vector and derivatives
458  localPerf[TAG::RES ] = m_dt * m_energyPerfFlux[iperf];
459  localPerf[TAG::WELL ] = -m_dt * m_energyPerfFlux[iperf];
460 
461  for( integer ke = 0; ke < 2; ++ke )
462  {
463  localIndex localDofIndexPres = ke * resNumDOF;
464  localPerfJacobian[TAG::RES ][localDofIndexPres] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dP];
465  localPerfJacobian[TAG::WELL ][localDofIndexPres] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dP];
466 
467  // populate local flux vector and derivatives
468  for( integer ic = 0; ic < numComp; ++ic )
469  {
470  localIndex const localDofIndexComp = localDofIndexPres + ic + 1;
471  localPerfJacobian[TAG::RES ][localDofIndexComp] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dC+ic];
472  localPerfJacobian[TAG::WELL][localDofIndexComp] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dC+ic];
473  }
474  localPerfJacobian[TAG::RES ][localDofIndexPres+NC+1] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dT];
475  localPerfJacobian[TAG::WELL][localDofIndexPres+NC+1] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dT];
476  }
477 
478 
479  for( localIndex i = 0; i < localPerf.size(); ++i )
480  {
481  if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < m_localMatrix.numRows() )
482  {
483  m_localMatrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i],
484  dofColIndices.data(),
485  localPerfJacobian[i].dataIfContiguous(),
486  2 * resNumDOF );
487  RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], localPerf[i] );
488  }
489  }
490  } );
491 
492 
493  }
494 
495 
504  template< typename POLICY, typename KERNEL_TYPE >
505  static void
506  launch( localIndex const numElements,
507  KERNEL_TYPE const & kernelComponent )
508  {
510  forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie )
511  {
512  kernelComponent.computeFlux( ie );
513 
514  } );
515  }
516 
517 protected:
518 
521 
524 
527  arrayView3d< real64 const > const m_dEnergyPerfFlux;
528 };
529 
534 {
535 public:
536 
550  template< typename POLICY >
551  static void
552  createAndLaunch( integer const numComps,
553  integer const isProducer,
554  real64 const dt,
555  globalIndex const rankOffset,
556  string const wellDofKey,
557  WellElementSubRegion const & subRegion,
559  PerforationData const * const perforationData,
560  MultiFluidBase const & fluid,
561  integer const & useTotalMassEquation,
562  bool const & detectCrossflow,
563  integer & numCrossFlowPerforations,
564  arrayView1d< real64 > const & localRhs,
566  )
567  {
568  isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC )
569  {
570  integer constexpr NUM_COMP = NC();
571 
572 
573  BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags;
574  if( useTotalMassEquation )
575  kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation );
576 
577 
579 
580 
581  kernelType kernel( dt, isProducer, rankOffset, wellDofKey, subRegion, resDofNumber, perforationData, fluid, localRhs, localMatrix, detectCrossflow, numCrossFlowPerforations, kernelFlags );
582  kernelType::template launch< POLICY >( perforationData->size(), kernel );
583  } );
584 
585  }
586 };
587 
588 } // end namespace coupledReservoirAndWellKernels
589 
590 } // end namespace geos
591 
592 #endif // GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP
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 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...
#define GEOS_HOST_DEVICE
Marks a host-device function.
Definition: GeosxMacros.hpp:49
#define GEOS_MARK_FUNCTION
Mark function with both Caliper and NVTX if enabled.
typename ElementViewAccessor< VIEWTYPE >::NestedViewTypeConst ElementViewConst
The ElementViewAccessor at the ElementRegionManager level is the type resulting from ElementViewAcces...
This class describes a collection of local well elements and perforations.
static void createAndLaunch(integer const numComps, real64 const dt, globalIndex const rankOffset, string const wellDofKey, WellElementSubRegion const &subRegion, ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, PerforationData const *const perforationData, MultiFluidBase const &fluid, integer const &useTotalMassEquation, bool const &detectCrossflow, integer &numCrossFlowPerforations, arrayView1d< real64 > const &localRhs, CRSMatrixView< real64, globalIndex const > const &localMatrix)
Create a new kernel and launch.
GEOS_HOST_DEVICE void computeFlux(localIndex const iperf, FUNC &&compFluxKernelOp=NoOpFunc{}) const
Compute the local flux contributions to the residual and Jacobian.
IsothermalCompositionalMultiPhaseFluxKernel(real64 const dt, globalIndex const rankOffset, string const wellDofKey, WellElementSubRegion const &subRegion, ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, PerforationData const *const perforationData, MultiFluidBase const &fluid, arrayView1d< real64 > const &localRhs, CRSMatrixView< real64, globalIndex const > const &localMatrix, bool const &detectCrossflow, integer &numCrossFlowPerforations, BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags)
Constructor for the kernel interface.
static void launch(localIndex const numElements, KERNEL_TYPE const &kernelComponent)
Performs the kernel launch.
static void createAndLaunch(integer const numComps, integer const isProducer, real64 const dt, globalIndex const rankOffset, string const wellDofKey, WellElementSubRegion const &subRegion, ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, PerforationData const *const perforationData, MultiFluidBase const &fluid, integer const &useTotalMassEquation, bool const &detectCrossflow, integer &numCrossFlowPerforations, arrayView1d< real64 > const &localRhs, CRSMatrixView< real64, globalIndex const > const &localMatrix)
Create a new kernel and launch.
GEOS_HOST_DEVICE void computeFlux(localIndex const iperf) const
Compute the local flux contributions to the residual and Jacobian.
ThermalCompositionalMultiPhaseFluxKernel(real64 const dt, integer const isProducer, globalIndex const rankOffset, string const wellDofKey, WellElementSubRegion const &subRegion, ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, PerforationData const *const perforationData, MultiFluidBase const &fluid, arrayView1d< real64 > const &localRhs, CRSMatrixView< real64, globalIndex const > const &localMatrix, bool const &detectCrossflow, integer &numCrossFlowPerforations, BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags)
Constructor for the kernel interface.
static void launch(localIndex const numElements, KERNEL_TYPE const &kernelComponent)
Performs the kernel launch.
arrayView1d< globalIndex const > m_globalWellElementIndex
Global index of local element.
localIndex size() const
Get the "size" of the group, which determines the number of elements in resizable wrappers.
Definition: Group.hpp:1315
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
StackArray< T, 2, MAXSIZE > stackArray2d
Alias for 2D stack array.
Definition: DataTypes.hpp:204
LvArray::CRSMatrixView< T, COL_INDEX, localIndex const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:310
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:88
StackArray< T, 1, MAXSIZE > stackArray1d
Alias for 1D stack array.
Definition: DataTypes.hpp:188
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:85
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
ArrayView< T, 4, USD > arrayView4d
Alias for 4D array view.
Definition: DataTypes.hpp:228
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.
Definition: DataTypes.hpp:196
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:176
ArrayView< T, 3, USD > arrayView3d
Alias for 3D array view.
Definition: DataTypes.hpp:212