Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stokhos: mask logic signature improvement (#12325) #12350

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/stokhos/doc/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ CLASS_DIAGRAMS = YES
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.

SOURCE_BROWSER = NO
SOURCE_BROWSER = YES

# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ template<typename scalar> class MaskedAssign
data = st_array[0];
else
data = st_array[1];

return *this;
}

Expand All @@ -116,7 +116,7 @@ template<typename scalar> class MaskedAssign
data = st_array[0]+st_array[1];
else
data = st_array[2];

return *this;
}

Expand All @@ -136,7 +136,7 @@ template<typename scalar> class MaskedAssign
data = st_array[0]-st_array[1];
else
data = st_array[2];

return *this;
}

Expand All @@ -156,7 +156,7 @@ template<typename scalar> class MaskedAssign
data = st_array[0]*st_array[1];
else
data = st_array[2];

return *this;
}

Expand All @@ -176,13 +176,30 @@ template<typename scalar> class MaskedAssign
data = st_array[0]/st_array[1];
else
data = st_array[2];

return *this;
}
};

template<typename scalar> class Mask;

namespace traits
{
template <typename>
struct is_mask : public std::false_type {};

template <typename scalar_t>
struct is_mask<Mask<scalar_t>> : public std::true_type {};

template <typename scalar_t>
struct is_mask<const Mask<scalar_t>> : public std::true_type {};

template <typename T>
inline constexpr bool is_mask_v = is_mask<T>::value;

#define CONCEPT_TRAITS_IS_MASK(M) std::enable_if_t<traits::is_mask_v<std::decay_t<M>>>
}

template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
{
typedef Sacado::MP::Vector<S> scalar;
Expand All @@ -208,7 +225,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
for(std::size_t i=0; i<size; ++i)
if(m.get(i))
data[i] = s[i];

return *this;
}

Expand All @@ -229,7 +246,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
data[i] = st_array[0][i];
else
data[i] = st_array[1][i];

return *this;
}

Expand All @@ -248,7 +265,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
for(std::size_t i=0; i<size; ++i)
if(m.get(i))
data[i] += s[i];

return *this;
}

Expand All @@ -269,7 +286,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
data[i] = st_array[0][i]+st_array[1][i];
else
data[i] = st_array[2][i];

return *this;
}

Expand All @@ -287,7 +304,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
for(std::size_t i=0; i<size; ++i)
if(m.get(i))
data[i] -= s[i];

return *this;
}

Expand All @@ -308,7 +325,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
data[i] = st_array[0][i]-st_array[1][i];
else
data[i] = st_array[2][i];

return *this;
}

Expand All @@ -326,7 +343,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
for(std::size_t i=0; i<size; ++i)
if(m.get(i))
data[i] *= s[i];

return *this;
}

Expand All @@ -347,7 +364,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
data[i] = st_array[0][i]*st_array[1][i];
else
data[i] = st_array[2][i];

return *this;
}

Expand All @@ -365,7 +382,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
for(std::size_t i=0; i<size; ++i)
if(m.get(i))
data[i] /= s[i];

return *this;
}

Expand All @@ -386,7 +403,7 @@ template<typename S> class MaskedAssign< Sacado::MP::Vector<S> >
data[i] = st_array[0][i]/st_array[1][i];
else
data[i] = st_array[2][i];

return *this;
}
};
Expand All @@ -406,19 +423,19 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
{
if(m.get(0))
data = s;

return *this;
}

KOKKOS_INLINE_FUNCTION MaskedAssign<scalar>& operator = (const std::initializer_list<scalar> & KOKKOS_RESTRICT st)
{
auto st_array = st.begin();

if(m.get(0))
data = st_array[0];
else
data = st_array[1];

return *this;
}

Expand All @@ -427,7 +444,7 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
{
if(m.get(0))
data += s;

return *this;
}

Expand All @@ -439,15 +456,15 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
data = st_array[0]+st_array[1];
else
data = st_array[2];

return *this;
}

KOKKOS_INLINE_FUNCTION MaskedAssign<scalar>& operator -= (const scalar & KOKKOS_RESTRICT s)
{
if(m.get(0))
data -= s;

return *this;
}

Expand All @@ -459,15 +476,15 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
data = st_array[0]-st_array[1];
else
data = st_array[2];

return *this;
}

KOKKOS_INLINE_FUNCTION MaskedAssign<scalar>& operator *= (const scalar & KOKKOS_RESTRICT s)
{
if(m.get(0))
data *= s;

return *this;
}

Expand All @@ -479,15 +496,15 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
data = st_array[0]*st_array[1];
else
data = st_array[2];

return *this;
}

KOKKOS_INLINE_FUNCTION MaskedAssign<scalar>& operator /= (const scalar & KOKKOS_RESTRICT s)
{
if(m.get(0))
data /= s;

return *this;
}

Expand All @@ -499,7 +516,7 @@ template <typename ordinal_t, typename value_t, typename device_t> class MaskedA
data = st_array[0]/st_array[1];
else
data = st_array[2];

return *this;
}
};
Expand Down Expand Up @@ -603,15 +620,15 @@ template<typename scalar> class Mask
{
return !(this==m2);
}

KOKKOS_INLINE_FUNCTION Mask<scalar> operator&& (const Mask<scalar> &m2)
{
Mask<scalar> m3;
for(std::size_t i=0; i<size; ++i)
m3.set(i,(this->get(i) && m2.get(i)));
return m3;
}

KOKKOS_INLINE_FUNCTION Mask<scalar> operator|| (const Mask<scalar> &m2)
{
Mask<scalar> m3;
Expand Down Expand Up @@ -665,7 +682,7 @@ template<typename scalar> class Mask

return v2;
}

KOKKOS_INLINE_FUNCTION bool get (int i) const
{
return this->data[i];
Expand All @@ -675,15 +692,15 @@ template<typename scalar> class Mask
{
this->data[i] = b;
}

KOKKOS_INLINE_FUNCTION Mask<scalar> operator! ()
{
Mask<scalar> m2;
for(std::size_t i=0; i<size; ++i)
m2.set(i,!(this->get(i)));
return m2;
}

KOKKOS_INLINE_FUNCTION operator bool() const
{
return this->get(0);
Expand Down Expand Up @@ -794,9 +811,9 @@ namespace Sacado {
template <typename S> KOKKOS_INLINE_FUNCTION Vector<S> copysign(const Vector<S> &a1, const Vector<S> &a2)
{
typedef EnsembleTraits_m< Vector<S> > ET;

Vector<S> a_out;

using std::copysign;
#ifdef STOKHOS_HAVE_PRAGMA_IVDEP
#pragma ivdep
Expand All @@ -810,7 +827,7 @@ namespace Sacado {
for(std::size_t i=0; i<ET::size; ++i){
ET::coeff(a_out,i) = copysign(ET::coeff(a1,i),ET::coeff(a2,i));
}

return a_out;
}
}
Expand All @@ -821,7 +838,7 @@ template<typename S> KOKKOS_INLINE_FUNCTION Mask<Sacado::MP::Vector<S> > signbit
{
typedef EnsembleTraits_m<Sacado::MP::Vector<S> > ET;
using std::signbit;

Mask<Sacado::MP::Vector<S> > mask;
#ifdef STOKHOS_HAVE_PRAGMA_IVDEP
#pragma ivdep
Expand Down Expand Up @@ -935,32 +952,37 @@ template<typename S> KOKKOS_INLINE_FUNCTION Mask<Sacado::MP::Vector<S> > signbit

#endif

namespace MaskLogic{

template<typename T> KOKKOS_INLINE_FUNCTION bool OR(Mask<T> m){
return (((double) m)!=0.);
namespace MaskLogic
{
template <typename M, typename = CONCEPT_TRAITS_IS_MASK(M)>
KOKKOS_INLINE_FUNCTION
bool OR(M&& m) {
return m.operator double() != 0.;
}

KOKKOS_INLINE_FUNCTION bool OR(bool m){
return m;
}

template<typename T> KOKKOS_INLINE_FUNCTION bool XOR(Mask<T> m){
return (((double) m)==1./m.getSize());
template <typename M, typename = CONCEPT_TRAITS_IS_MASK(M)>
KOKKOS_INLINE_FUNCTION
bool XOR(M&& m) {
return m.operator double() == 1. / m.getSize();
}

KOKKOS_INLINE_FUNCTION bool XOR(bool m){
return m;
}

template<typename T> KOKKOS_INLINE_FUNCTION bool AND(Mask<T> m){
return (((double) m)==1.);
template <typename M, typename = CONCEPT_TRAITS_IS_MASK(M)>
KOKKOS_INLINE_FUNCTION
bool AND(M&& m) {
return m.operator double() == 1.;
}

KOKKOS_INLINE_FUNCTION bool AND(bool m){
return m;
}

}

#endif // STOKHOS_MP_VECTOR_MASKTRAITS_HPP
Loading