20 #ifndef GEOS_DATAREPOSITORY_WRAPPERHELPERS_HPP_
21 #define GEOS_DATAREPOSITORY_WRAPPERHELPERS_HPP_
25 #define RESTART_TYPE_LOGGING 0
28 #include "BufferOps.hpp"
29 #include "BufferOpsDevice.hpp"
35 #include "codingUtilities/traits.hpp"
36 #include "LvArray/src/system.hpp"
38 #if defined(GEOS_USE_PYGEOSX)
39 #include "LvArray/src/python/python.hpp"
43 #include <conduit.hpp>
48 #if RESTART_TYPE_LOGGING
49 #include <unordered_set>
54 namespace dataRepository
56 namespace wrapperHelpers
61 inline void logOutputType(
string const & typeString,
string const & msg )
63 #if RESTART_TYPE_LOGGING
64 static std::unordered_set< string > m_types;
66 if( !m_types.count( typeString ) )
68 m_types.insert( typeString );
77 template<
typename T,
typename ... INDICES >
78 string getIndicesToComponent( T
const &,
int const component, INDICES
const ... existingIndices )
81 return LvArray::indexing::getIndexString( existingIndices ... );
84 template<
typename ... INDICES >
85 string getIndicesToComponent(
R1Tensor const &,
int const component, INDICES
const ... existingIndices )
86 {
return LvArray::indexing::getIndexString( existingIndices ..., component ); }
88 template<
typename T >
89 T
const * getPointerToComponent( T
const & var,
int const component )
96 real64 const * getPointerToComponent(
R1Tensor const & var,
int const component )
99 return &var[ component ];
104 template<
typename T >
109 void set(
integer const, Span< string const > )
111 GEOS_ERROR(
"Dimension labels are only available in Array wrappers" );
114 Span< string const > get(
integer const )
const
116 GEOS_ERROR(
"Dimension labels are only available in Array wrappers" );
121 template<
typename T,
int NDIM,
typename PERM >
122 class ArrayDimLabels<
Array< T, NDIM, PERM > >
126 void set(
integer const dim, Span< string const > labels )
130 m_values[dim].resize( labels.size() );
131 std::copy( labels.begin(), labels.end(), m_values[dim].begin() );
134 Span< string const > get(
integer const dim )
const
138 return { m_values[dim].begin(), m_values[dim].end() };
146 template<
typename T >
147 inline std::enable_if_t< traits::HasMemberFunction_size< T >,
size_t >
148 size( T
const & value )
149 {
return value.size(); }
151 template<
typename T >
152 inline std::enable_if_t< !traits::HasMemberFunction_size< T >,
size_t >
158 dataPtr(
string & var )
159 {
return const_cast< char *
>( var.data() ); }
162 dataPtr( Path & var )
163 {
return const_cast< char *
>( var.data() ); }
165 template<
typename T >
166 inline std::enable_if_t< traits::HasMemberFunction_data< T >,
typename traits::Pointer< T > >
168 {
return value.data(); }
170 template<
typename T >
171 inline std::enable_if_t< !traits::HasMemberFunction_data< T >,
typename traits::Pointer< T > >
176 inline typename traits::ConstPointer< T >
177 dataPtr( T
const & value )
178 {
return dataPtr(
const_cast< T &
>( value ) ); }
181 template<
typename T >
182 inline std::enable_if_t< traits::HasMemberFunction_resize< T > >
184 { value.resize( newSize ); }
186 template<
typename T >
187 inline std::enable_if_t< !traits::HasMemberFunction_resize< T > >
192 template<
typename T >
194 resizeDefault( T & value,
196 DefaultValue< T >
const & defaultValue,
198 { value.resizeDefault( newSize, defaultValue.value ); }
202 template<
typename T,
int NDIM,
typename PERMUTATION >
204 resizeDimensions( Array< T, NDIM, PERMUTATION > & value,
int num_dims,
localIndex const *
const dims )
205 { value.resize( num_dims, dims ); }
207 template<
typename T >
209 resizeDimensions( T & value,
int num_dims,
localIndex const *
const dims )
216 resize( value, dims[ 0 ] );
220 template<
typename T >
223 {
return sizeof( *dataPtr( std::declval< T >() ) ); }
226 template<
typename T >
228 byteSize( T
const & value )
229 {
return wrapperHelpers::size( value ) * byteSizeOfElement< T >(); }
232 template<
typename T >
234 numElementsFromByteSize(
localIndex const byteSize )
237 return byteSize / byteSizeOfElement< T >();
241 template<
typename T >
242 std::enable_if_t< traits::HasMemberFunction_reserve< T > >
243 reserve( T & value,
localIndex const newCapacity )
245 value.reserve( newCapacity );
246 if constexpr ( traits::HasMemberFunction_reserveValues< T const > )
249 double const oldValueCapacity = value.valueCapacity();
250 localIndex const newValueCapacity = oldValueCapacity * newCapacity / oldCapacity;
251 value.reserveValues( newValueCapacity );
255 template<
typename T,
257 typename PERMUTATION >
258 void reserve( Array< T, NDIM, PERMUTATION > & value,
localIndex newCapacity )
261 for(
int i=1; i<NDIM; ++i )
263 newCapacity *= dims[ i ];
265 value.reserve( newCapacity );
268 template<
typename T >
269 std::enable_if_t< !traits::HasMemberFunction_reserve< T > >
274 template<
typename T >
275 std::enable_if_t< traits::HasMemberFunction_capacity< T const >,
localIndex >
276 capacity( T
const & value )
277 {
return value.capacity(); }
279 template<
typename T >
280 std::enable_if_t< !traits::HasMemberFunction_capacity< T const >,
localIndex >
281 capacity( T
const & value )
282 {
return wrapperHelpers::size( value ); }
286 template<
typename T >
287 std::enable_if_t< traits::HasMemberFunction_setName< T > >
288 setName( T & value,
string const & name )
289 { value.setName( name ); }
291 template<
typename T >
292 std::enable_if_t< !traits::HasMemberFunction_setName< T > >
296 template<
typename T >
297 std::enable_if_t< traits::HasMemberFunction_move< T > >
298 move( T & value, LvArray::MemorySpace
const space,
bool const touch )
299 { value.move( space, touch ); }
301 template<
typename T >
302 std::enable_if_t< !traits::HasMemberFunction_move< T > >
309 template<
typename T >
310 std::enable_if_t< !bufferOps::can_memcpy< typename traits::Pointer< T > > >
311 pushDataToConduitNode( T
const & var, conduit::Node & node )
313 internal::logOutputType( LvArray::system::demangleType( var ),
"Packing for output: " );
316 localIndex const byteSize = bufferOps::PackSize( var );
319 conduit::DataType
const dtype( conduitTypeInfo< buffer_unit_type >::id, byteSize );
322 conduit::Node & valuesNode = node[
"__values__" ];
323 valuesNode.set( dtype );
327 bufferOps::Pack< true >( buffer, var );
331 template<
typename T >
332 std::enable_if_t< !bufferOps::can_memcpy< typename traits::Pointer< T > > >
333 pullDataFromConduitNode( T & var, conduit::Node
const & node )
335 conduit::Node
const & valuesNode = node.fetch_existing(
"__values__" );
338 localIndex const byteSize = valuesNode.dtype().number_of_elements();
342 localIndex const bytesRead = bufferOps::Unpack( buffer, var );
349 pushDataToConduitNode(
string const & var, conduit::Node & node )
351 internal::logOutputType( LvArray::system::demangleType( var ),
"Output via external pointer: " );
353 constexpr
int conduitTypeID = conduitTypeInfo< signed char >::id;
354 conduit::DataType
const dtype( conduitTypeID, var.size() );
356 signed char *
const ptr =
const_cast< signed char *
>(
reinterpret_cast< signed char const *
>( var.data() ) );
357 node[
"__values__" ].set_external( dtype, ptr );
363 pushDataToConduitNode( Path
const & var, conduit::Node & node )
365 pushDataToConduitNode(
static_cast< string const &
>(var), node );
369 template<
typename T >
370 std::enable_if_t< bufferOps::can_memcpy< typename traits::Pointer< T > > >
371 pushDataToConduitNode( T
const & var, conduit::Node & node )
373 internal::logOutputType( LvArray::system::demangleType( var ),
"Output via external pointer: " );
375 constexpr
int conduitTypeID = conduitTypeInfo< typename traits::Pointer< T > >::id;
376 constexpr
int sizeofConduitType = conduitTypeInfo< typename traits::Pointer< T > >::sizeOfConduitType;
378 conduit::DataType
const dtype( conduitTypeID, numBytes / sizeofConduitType );
380 void *
const ptr =
const_cast< void *
>(
static_cast< void const *
>( dataPtr( var ) ) );
381 node[
"__values__" ].set_external( dtype, ptr );
385 template<
typename T >
386 std::enable_if_t< bufferOps::can_memcpy< typename traits::Pointer< T > > >
387 pullDataFromConduitNode( T & var, conduit::Node
const & node )
389 conduit::Node
const & valuesNode = node.fetch_existing(
"__values__" );
391 localIndex const byteSize = LvArray::integerConversion< localIndex >( valuesNode.dtype().strided_bytes() );
392 localIndex const numElements = numElementsFromByteSize< T >( byteSize );
394 resize( var, numElements );
396 std::memcpy( dataPtr( var ), valuesNode.data_ptr(), byteSize );
400 template<
typename T >
401 std::enable_if_t< bufferOps::can_memcpy< T > >
402 pullDataFromConduitNode( SortedArray< T > & var, conduit::Node
const & node )
404 conduit::Node
const & valuesNode = node.fetch_existing(
"__values__" );
406 localIndex const byteSize = LvArray::integerConversion< localIndex >( valuesNode.dtype().strided_bytes() );
407 localIndex const numElements = numElementsFromByteSize< T >( byteSize );
409 T
const *
const values =
reinterpret_cast< T
const *
>( valuesNode.data_ptr() );
410 var.insert( values, values + numElements );
415 template<
typename T,
int NDIM,
typename PERMUTATION >
416 std::enable_if_t< bufferOps::can_memcpy< T > >
417 pushDataToConduitNode( Array< T, NDIM, PERMUTATION >
const & var,
418 conduit::Node & node )
420 internal::logOutputType( LvArray::system::demangleType( var ),
"Output array via external pointer: " );
423 constexpr
int conduitTypeID = conduitTypeInfo< T >::id;
424 constexpr
int sizeofConduitType = conduitTypeInfo< T >::sizeOfConduitType;
425 conduit::DataType
const dtype( conduitTypeID, var.size() *
sizeof( T ) / sizeofConduitType );
426 void *
const ptr =
const_cast< void *
>(
static_cast< void const *
>( var.data() ) );
427 node[
"__values__" ].set_external( dtype, ptr );
430 camp::idx_t temp[ NDIM + 1 ];
431 for(
int i = 0; i < NDIM; ++i )
433 temp[ i ] = var.size( i );
437 constexpr
int const implicitDimensionLength = conduitTypeInfo< T >::numConduitValues;
438 constexpr
bool const hasImplicitDimension = implicitDimensionLength != 1;
439 constexpr
int totalNumDimensions = NDIM + hasImplicitDimension;
440 if( hasImplicitDimension )
442 temp[ NDIM ] = implicitDimensionLength;
446 conduit::DataType
const dimensionType( conduitTypeInfo< camp::idx_t >::id, totalNumDimensions );
447 node[
"__dimensions__" ].set( dimensionType, temp );
450 constexpr std::array< camp::idx_t, NDIM >
const perm =
to_stdArray( RAJA::as_array< PERMUTATION >::get());
451 for(
int i = 0; i < NDIM; ++i )
453 temp[ i ] = perm[ i ];
456 if( hasImplicitDimension )
461 node[
"__permutation__" ].set( dimensionType, temp );
465 template<
typename T,
int NDIM,
typename PERMUTATION >
466 std::enable_if_t< bufferOps::can_memcpy< T > >
467 pullDataFromConduitNode( Array< T, NDIM, PERMUTATION > & var,
468 conduit::Node
const & node )
471 constexpr
int const implicitDimensionLength = conduitTypeInfo< T >::numConduitValues;
472 constexpr
bool const hasImplicitDimension = implicitDimensionLength != 1;
473 constexpr
int totalNumDimensions = NDIM + hasImplicitDimension;
476 conduit::Node
const & permutationNode = node.fetch_existing(
"__permutation__" );
477 GEOS_ERROR_IF_NE( permutationNode.dtype().number_of_elements(), totalNumDimensions );
479 constexpr std::array< camp::idx_t, NDIM >
const perm =
to_stdArray( RAJA::as_array< PERMUTATION >::get());
480 camp::idx_t
const *
const permFromConduit = permutationNode.value();
481 for(
int i = 0; i < NDIM; ++i )
484 "The permutation of the data in conduit and the provided Array don't match." );
487 if( hasImplicitDimension )
490 "The permutation of the data in conduit and the provided Array don't match." );
494 conduit::Node
const & dimensionNode = node.fetch_existing(
"__dimensions__" );
495 GEOS_ERROR_IF_NE( dimensionNode.dtype().number_of_elements(), totalNumDimensions );
496 camp::idx_t
const *
const dims = dimensionNode.value();
498 if( hasImplicitDimension )
503 var.resize( NDIM, dims );
506 conduit::Node
const & valuesNode = node.fetch_existing(
"__values__" );
507 localIndex numBytesFromArray = var.size() *
sizeof( T );
509 std::memcpy( var.data(), valuesNode.data_ptr(), numBytesFromArray );
514 template<
typename T,
typename INDEX_TYPE >
515 std::enable_if_t< bufferOps::can_memcpy< T > >
516 pushDataToConduitNode( ArrayOfArrays< T, INDEX_TYPE >
const & var2,
517 conduit::Node & node )
519 ArrayOfArraysView< T const, INDEX_TYPE >
const & var = var2.toViewConst();
520 internal::logOutputType( LvArray::system::demangleType( var ),
"Output array via external pointer: " );
523 INDEX_TYPE
const numArrays = var.size();
524 conduit::DataType
const numArraysType( conduitTypeInfo< INDEX_TYPE >::id, 1 );
525 node[
"__numberOfArrays__" ].set( numArraysType,
const_cast< void *
>(
static_cast< void const *
>(&numArrays) ) );
528 INDEX_TYPE
const *
const offsets = var.getOffsets();
529 conduit::DataType
const offsetsType( conduitTypeInfo< INDEX_TYPE >::id, numArrays+1 );
530 node[
"__offsets__" ].set_external( offsetsType,
const_cast< void *
>(
static_cast< void const *
>( offsets ) ) );
533 INDEX_TYPE
const *
const sizes = var.getSizes();
534 conduit::DataType
const sizesType( conduitTypeInfo< INDEX_TYPE >::id, numArrays );
535 node[
"__sizes__" ].set_external( sizesType,
const_cast< void *
>(
static_cast< void const *
>( sizes ) ) );
538 T *
const values =
const_cast< T *
>(var.getValues());
539 for( INDEX_TYPE i = 0; i < numArrays; ++i )
541 INDEX_TYPE
const curOffset = offsets[ i ];
542 INDEX_TYPE
const nextOffset = offsets[ i + 1 ];
543 for( INDEX_TYPE j = curOffset + var.sizeOfArray( i ); j < nextOffset; ++j )
545 if constexpr ( std::is_arithmetic< T >::value )
556 constexpr
int conduitTypeID = conduitTypeInfo< T >::id;
557 constexpr
int sizeofConduitType = conduitTypeInfo< T >::sizeOfConduitType;
558 conduit::DataType
const dtype( conduitTypeID, offsets[numArrays] *
sizeof( T ) / sizeofConduitType );
561 node[
"__values__" ].set_external( dtype, values );
564 template<
typename T,
typename INDEX_TYPE >
565 std::enable_if_t< bufferOps::can_memcpy< T > >
566 pullDataFromConduitNode( ArrayOfArrays< T, INDEX_TYPE > & var,
567 conduit::Node
const & node )
571 conduit::Node
const & numArraysNode = node.fetch_existing(
"__numberOfArrays__" );
572 INDEX_TYPE
const *
const numArrays = numArraysNode.value();
575 conduit::Node
const & offsetsNode = node.fetch_existing(
"__offsets__" );
576 conduit::DataType
const & offsetsDataType = offsetsNode.dtype();
577 INDEX_TYPE
const *
const offsets = offsetsNode.value();
578 INDEX_TYPE
const sizeOffsets = offsetsDataType.number_of_elements();
581 conduit::Node
const & sizesNode = node.fetch_existing(
"__sizes__" );
582 conduit::DataType
const & sizesDataType = sizesNode.dtype();
583 INDEX_TYPE
const *
const sizes = sizesNode.value();
584 INDEX_TYPE
const sizeSizes = sizesDataType.number_of_elements();
591 conduit::Node
const & valuesNode = node.fetch_existing(
"__values__" );
592 conduit::DataType
const & valuesDataType = valuesNode.dtype();
593 const INDEX_TYPE valuesSize = valuesDataType.number_of_elements();
596 INDEX_TYPE
const arraySizeEstimate = (*numArrays)==0 ? 0 : valuesSize / (*numArrays);
597 var.resize( *numArrays, arraySizeEstimate );
598 var.reserveValues( valuesSize );
602 for( INDEX_TYPE i = 0; i < *numArrays; ++i )
604 INDEX_TYPE
const arrayAllocation = offsets[i+1] - offsets[i];
605 var.setCapacityOfArray( i, arrayAllocation );
606 var.resizeArray( i, sizes[ i ] );
607 allocatedSize += arrayAllocation;
617 ArrayOfArraysView< T const, INDEX_TYPE >
const & varView = var.toViewConst();
618 INDEX_TYPE
const *
const varOffsets = varView.getOffsets();
619 INDEX_TYPE
const *
const varSizes = varView.getSizes();
625 for( INDEX_TYPE i = 0; i<*numArrays; ++i )
632 localIndex numBytesFromArray = allocatedSize *
sizeof( T );
634 std::memcpy(
const_cast< T *
>(varView.getValues()), valuesNode.data_ptr(), numBytesFromArray );
639 template<
typename T >
640 void pushDataToConduitNode( InterObjectRelation< T >
const & var,
641 conduit::Node & node )
642 {
return pushDataToConduitNode( var.base(), node ); }
644 template<
typename T >
645 void pullDataFromConduitNode( InterObjectRelation< T > & var,
646 conduit::Node
const & node )
647 {
return pullDataFromConduitNode( var.base(), node ); }
651 template<
typename T,
int NDIM,
int USD >
652 std::enable_if_t< std::is_arithmetic< T >::value || traits::is_tensorT< T > >
653 addBlueprintField( ArrayView< T const, NDIM, USD >
const & var,
654 conduit::Node & fields,
655 string const & fieldName,
656 string const & topology,
657 stdVector< string >
const & componentNames )
661 using ConduitType =
typename conduitTypeInfo< T >::type;
662 constexpr
int conduitTypeID = conduitTypeInfo< T >::id;
663 constexpr
int numComponentsPerValue = conduitTypeInfo< T >::numConduitValues;
665 localIndex const totalNumberOfComponents = numComponentsPerValue * var.size() / var.size( 0 );
666 if( !componentNames.empty() )
671 var.move( hostMemorySpace,
false );
673 conduit::DataType dtype( conduitTypeID, var.size( 0 ) );
674 dtype.set_stride(
sizeof( ConduitType ) * numComponentsPerValue * var.strides()[ 0 ] );
677 LvArray::forValuesInSliceWithIndices( var[ 0 ], [&fields, &fieldName, &topology, &componentNames, totalNumberOfComponents, &dtype, &curComponent]
678 ( T
const & val,
auto const ... indices )
680 for(
int i = 0; i < numComponentsPerValue; ++i )
683 if( totalNumberOfComponents == 1 )
687 else if( componentNames.empty() )
689 string indexString = internal::getIndicesToComponent( val, i, indices ... );
690 indexString.erase( indexString.begin() );
691 indexString.pop_back();
692 indexString.pop_back();
693 name = fieldName + indexString;
697 name = componentNames[ curComponent++ ];
700 conduit::Node & field = fields[ name ];
701 field[
"association" ] =
"element";
702 field[
"volume_dependent" ] =
"false";
703 field[
"topology" ] = topology;
705 void const * pointer = internal::getPointerToComponent( val, i );
706 field[
"values" ].set_external( dtype,
const_cast< void *
>( pointer ) );
711 template<
typename T >
712 void addBlueprintField( T
const &,
713 conduit::Node & fields,
716 stdVector< string >
const & )
718 GEOS_ERROR(
"Cannot create a mcarray out of " << LvArray::system::demangleType< T >() <<
719 "\nWas trying to write it to " << fields.path() );
723 template<
typename T,
int NDIM,
int USD >
724 std::enable_if_t< std::is_arithmetic< T >::value || traits::is_tensorT< T > >
725 populateMCArray( ArrayView< T const, NDIM, USD >
const & var,
726 conduit::Node & node,
727 stdVector< string >
const & componentNames )
731 using ConduitType =
typename conduitTypeInfo< T >::type;
732 constexpr
int conduitTypeID = conduitTypeInfo< T >::id;
733 constexpr
int numComponentsPerValue = conduitTypeInfo< T >::numConduitValues;
735 if( !componentNames.empty() )
740 var.move( hostMemorySpace,
false );
742 conduit::DataType dtype( conduitTypeID, var.size( 0 ) );
743 dtype.set_stride(
sizeof( ConduitType ) * numComponentsPerValue * var.strides()[ 0 ] );
746 LvArray::forValuesInSliceWithIndices( var[ 0 ], [&componentNames, &node, &dtype, &curComponent]
747 ( T
const & val,
auto const ... indices )
749 for(
int i = 0; i < numComponentsPerValue; ++i )
751 string const name = componentNames.empty() ? internal::getIndicesToComponent( val, i, indices ... ) :
752 componentNames[ curComponent++ ];
754 void const * pointer = internal::getPointerToComponent( val, i );
755 node[ name ].set_external( dtype,
const_cast< void *
>( pointer ) );
760 template<
typename T >
761 void populateMCArray( T
const &,
762 conduit::Node & node,
763 stdVector< string >
const & )
765 GEOS_ERROR(
"Cannot create a mcarray out of " << LvArray::system::demangleType< T >() <<
766 "\nWas trying to write it to " << node.path() );
770 template<
typename T >
771 std::enable_if_t< std::is_arithmetic< T >::value, std::unique_ptr< Array< T, 1 > > >
772 averageOverSecondDim( ArrayView< T const, 1, 0 >
const & var )
774 std::unique_ptr< Array< T, 1 > > ret = std::make_unique< Array< T, 1 > >();
776 ret->resize( var.size() );
777 ret->template setValues< serialPolicy >( var );
782 template<
typename T,
int NDIM,
int USD >
783 std::enable_if_t< std::is_arithmetic< T >::value, std::unique_ptr<
Array< T, NDIM - 1 > > >
784 averageOverSecondDim( ArrayView< T const, NDIM, USD >
const & var )
786 std::unique_ptr<
Array< T, NDIM - 1 > > ret = std::make_unique<
Array< T, NDIM - 1 > >();
789 newDims[ 0 ] = var.size( 0 );
790 for(
int i = 2; i < NDIM; ++i )
792 newDims[ i - 1 ] = var.size( i );
795 ret->resize( NDIM - 1, newDims );
797 ArrayView< T, NDIM - 1 >
const & output = *ret;
800 forAll< serialPolicy >( var.size( 0 ), [var, numSamples, &output] (
localIndex const i )
802 LvArray::sumOverFirstDimension( var[ i ], output[ i ] );
804 LvArray::forValuesInSlice( output[ i ], [numSamples] ( T & val )
813 template<
typename T >
814 std::unique_ptr< int > averageOverSecondDim( T
const & )
816 GEOS_ERROR(
"Cannot average over the second dimension of " << LvArray::system::demangleType< T >() );
817 return std::unique_ptr< int >(
nullptr );
820 template<
typename T,
int NDIM,
int USD >
821 int numArrayDims( ArrayView< T const, NDIM, USD >
const &
GEOS_UNUSED_PARAM( var ) )
826 template<
typename T >
832 template<
typename T >
838 template<
typename T,
int NDIM,
int USD >
839 localIndex numArrayComp( ArrayView< T const, NDIM, USD >
const & var )
841 return LvArray::indexing::multiplyAll< NDIM - 1 >( var.dims() + 1 );
844 template<
typename T >
850 template<
typename T >
856 template<
bool DO_PACKING,
typename T,
typename IDX >
857 inline std::enable_if_t< bufferOps::is_packable_by_index< T >,
localIndex >
859 {
return bufferOps::PackByIndex< DO_PACKING >( buffer, var, idx ); }
861 template<
bool DO_PACKING,
typename T,
typename IDX >
862 inline std::enable_if_t< !bufferOps::is_packable_by_index< T >,
localIndex >
865 GEOS_ERROR(
"Trying to pack data type (" << LvArray::system::demangleType< T >() <<
") by index. Operation not supported." );
869 template<
typename T,
typename IDX >
870 inline std::enable_if_t< bufferOps::is_packable_by_index< T >,
localIndex >
872 {
return bufferOps::UnpackByIndex( buffer, var, idx ); }
874 template<
typename T,
typename IDX >
875 inline std::enable_if_t< !bufferOps::is_packable_by_index< T >,
localIndex >
878 GEOS_ERROR(
"Trying to unpack data type (" << LvArray::system::demangleType< T >() <<
") by index. Operation not supported." );
883 template<
bool DO_PACKING,
typename T >
884 inline std::enable_if_t< bufferOps::is_container< T > || bufferOps::can_memcpy< T >,
localIndex >
885 PackDevice(
buffer_unit_type * & buffer, T
const & var, parallelDeviceEvents & events )
886 {
return bufferOps::PackDevice< DO_PACKING >( buffer, var, events ); }
889 template<
bool DO_PACKING,
typename T >
890 inline std::enable_if_t< !bufferOps::is_container< T > && !bufferOps::can_memcpy< T >,
localIndex >
893 GEOS_ERROR(
"Trying to pack data type (" << LvArray::system::demangleType< T >() <<
") on device. Operation not supported." );
897 template<
bool DO_PACKING,
typename T,
typename IDX >
898 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
899 PackByIndexDevice(
buffer_unit_type * & buffer, T
const & var, IDX & idx, parallelDeviceEvents & events )
900 {
return bufferOps::PackByIndexDevice< DO_PACKING >( buffer, var, idx, events ); }
902 template<
bool DO_PACKING,
typename T,
typename IDX >
903 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
904 PackByIndexDevice(
buffer_unit_type * &, T
const &, IDX &, parallelDeviceEvents & )
906 GEOS_ERROR(
"Trying to pack data type (" << LvArray::system::demangleType< T >() <<
") by index on device. Operation not supported." );
910 template<
typename T >
911 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
912 UnpackDevice(
buffer_unit_type const * & buffer, T
const & var, parallelDeviceEvents & events )
913 {
return bufferOps::UnpackDevice( buffer, var, events ); }
915 template<
typename T >
916 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
917 UnpackDevice(
buffer_unit_type const * &, T
const &, parallelDeviceEvents & )
919 GEOS_ERROR(
"Trying to unpack data type (" << LvArray::system::demangleType< T >() <<
") on device. Operation not supported." );
923 template<
typename T,
typename IDX >
924 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
925 UnpackByIndexDevice(
buffer_unit_type const * & buffer, T
const & var, IDX & idx, parallelDeviceEvents & events, MPI_Op op=MPI_REPLACE )
926 {
return bufferOps::UnpackByIndexDevice( buffer, var, idx, events, op ); }
928 template<
typename T,
typename IDX >
929 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
930 UnpackByIndexDevice(
buffer_unit_type const * &, T &, IDX &, parallelDeviceEvents &, MPI_Op )
932 GEOS_ERROR(
"Trying to unpack data type (" << LvArray::system::demangleType< T >() <<
") by index on device. Operation not supported." );
937 template<
bool DO_PACKING,
typename T >
939 PackDataDevice(
buffer_unit_type * & buffer, T
const & var, parallelDeviceEvents & events )
940 {
return bufferOps::PackDataDevice< DO_PACKING >( buffer, var, events ); }
942 template<
bool DO_PACKING,
typename T,
typename IDX >
943 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
944 PackDataByIndexDevice(
buffer_unit_type * & buffer, T
const & var, IDX & idx, parallelDeviceEvents & events )
945 {
return bufferOps::PackDataByIndexDevice< DO_PACKING >( buffer, var, idx, events ); }
947 template<
bool DO_PACKING,
typename T,
typename IDX >
948 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
949 PackDataByIndexDevice(
buffer_unit_type * &, T
const &, IDX &, parallelDeviceEvents & )
951 GEOS_ERROR(
"Trying to pack data type (" << LvArray::system::demangleType< T >() <<
") by index on device. Operation not supported." );
955 template<
typename T >
956 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
957 UnpackDataDevice(
buffer_unit_type const * & buffer, T
const & var, parallelDeviceEvents & events )
958 {
return bufferOps::UnpackDataDevice( buffer, var, events ); }
960 template<
typename T >
961 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
962 UnpackDataDevice(
buffer_unit_type const * &, T
const &, parallelDeviceEvents & )
964 GEOS_ERROR(
"Trying to unpack data type (" << LvArray::system::demangleType< T >() <<
") on device. Operation not supported." );
968 template<
typename T,
typename IDX >
969 inline std::enable_if_t< bufferOps::is_container< T >,
localIndex >
970 UnpackDataByIndexDevice(
buffer_unit_type const * & buffer, T
const & var, IDX & idx, parallelDeviceEvents & events, MPI_Op op )
971 {
return bufferOps::UnpackDataByIndexDevice( buffer, var, idx, events, op ); }
973 template<
typename T,
typename IDX >
974 inline std::enable_if_t< !bufferOps::is_container< T >,
localIndex >
975 UnpackDataByIndexDevice(
buffer_unit_type const * &, T
const &, IDX &, parallelDeviceEvents &, MPI_Op )
977 GEOS_ERROR(
"Trying to unpack data type (" << LvArray::system::demangleType< T >() <<
") by index on device. Operation not supported." );
981 #if defined(GEOS_USE_PYGEOSX)
983 template<
typename T >
984 inline std::enable_if_t< LvArray::python::CanCreate< T >, PyObject * >
985 createPythonObject( T &
object )
986 {
return LvArray::python::create(
object ); }
988 template<
typename T >
989 inline std::enable_if_t< !LvArray::python::CanCreate< T >, PyObject * >
990 createPythonObject( T & )
999 #undef RESTART_TYPE_LOGGING
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
#define GEOS_DEBUG_VAR(...)
Mark a debug variable and silence compiler warnings.
#define GEOS_UNUSED_PARAM(X)
Mark an unused argument and silence compiler warnings.
#define GEOS_ERROR_IF_LE(lhs, rhs)
Raise a hard error if one value compares less than or equal to the other.
#define GEOS_ERROR(...)
Raise a hard error and terminate the program.
#define GEOS_ERROR_IF_LT(lhs, rhs)
Raise a hard error if one value compares less than the other.
#define GEOS_ERROR_IF_GE(lhs, rhs)
Raise a hard error if one value compares greater than or equal to the other.
#define GEOS_LOG(...)
Log a message on screen.
#define GEOS_ERROR_IF_NE_MSG(lhs, rhs,...)
Raise a hard error if two values are not equal.
#define GEOS_ERROR_IF_NE(lhs, rhs)
Raise a hard error if two values are not equal.
stdVector< string > string_array
A 1-dimensional array of geos::string types.
LvArray::Array< T, NDIM, PERMUTATION, localIndex, LvArray::ChaiBuffer > Array
Multidimensional array type. See LvArray:Array for details.
std::set< T > set
A set of local indices.
double real64
64-bit floating point type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
constexpr stdArray< T, N > to_stdArray(std::array< T, N > const &arr)
Convert an std::array to an stdArray.
Tensor< real64, 3 > R1Tensor
Alias for a local (stack-based) rank-1 tensor type.
signed char buffer_unit_type
Type stored in communication buffers.
int integer
Signed integer type.
LvArray::ArrayView< T, NDIM, USD, localIndex, LvArray::ChaiBuffer > ArrayView
Multidimensional array view type. See LvArray:ArrayView for details.