39#include "../../../expressions/activeType.hpp"
40#include "../../../traits/atomicTraits.hpp"
41#include "../../../traits/gradientTraits.hpp"
42#include "../../../traits/realTraits.hpp"
43#include "../../../traits/tapeTraits.hpp"
44#include "../reverseAtomicInterface.hpp"
61 template<
typename T_Type,
typename T_Sfinae =
void>
70#ifndef DOXYGEN_DISABLE
73 template<
typename T_Type>
76 T_Type, OpenMPReverseAtomicImpl<T_Type, typename std::enable_if<std::is_arithmetic<T_Type>::value>::type>> {
106 CODI_OMP_ATOMIC(update)
107 this->value += other;
117 template<
typename T_Type>
120 OpenMPReverseAtomicImpl<T_Type, GradientTraits::EnableIfDirection<T_Type>>>,
125 ReverseAtomicInterface<T_Type, OpenMPReverseAtomicImpl<T_Type, GradientTraits::EnableIfDirection<T_Type>>>;
126 using Real =
typename Type::Real;
140 Type::operator=(other);
149 AtomicReal* atomicVector =
reinterpret_cast<AtomicReal*
>(this->vector);
150 for (
size_t i = 0; i < Type::dim; ++i) {
151 atomicVector[i] += other[i];
156 return static_cast<Type>(*this);
161 template<
typename T_Type>
164 T_Type, OpenMPReverseAtomicImpl<T_Type, TapeTraits::EnableIfForwardTape<typename T_Type::Tape>>>,
167 using Type =
CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
168 using Base = ReverseAtomicInterface<
170 using Tape =
typename Type::Tape;
171 using Real =
typename Type::Real;
172 using Gradient =
typename Type::Gradient;
185 Type::operator=(other);
198 *atomicValue += other.value();
199 *atomicGradient += other.gradient();
203 return static_cast<Type>(*this);
211 template<
typename Type>
215 template<
typename T_Type>
218#ifndef DOXYGEN_DISABLE
220 template<
typename T_Type>
222 typename
GradientTraits::EnableIfDirection<T_Type>> : std::true_type {};
225 template<
typename T_Type>
235 return typename Type::Type() == v;
#define CODI_INLINE
See codi::Config::ForcedInlines.
Definition config.h:469
#define CODI_DD(Type, Default)
Abbreviation for CODI_DECLARE_DEFAULT.
Definition macros.hpp:97
#define CODI_T(...)
Abbreviation for CODI_TEMPLATE.
Definition macros.hpp:117
typename GradientImplementation< AdjointVector >::Gradient Gradient
Deduce the entry type from an adjoint vector type, usually identical to the gradient type of a tape.
Definition adjointVectorTraits.hpp:92
Definition gradientTraits.hpp:52
typename TraitsImplementation< Gradient >::Real Real
The base value used in the gradient entries.
Definition gradientTraits.hpp:92
typename std::enable_if< IsDirection< Gradient >::value >::type EnableIfDirection
Enable if wrapper for EnableIfDirection.
Definition gradientTraits.hpp:142
Definition tapeTraits.hpp:63
typename std::enable_if< IsForwardTape< Tape >::value >::type EnableIfForwardTape
Enable if wrapper for IsForwardTape.
Definition tapeTraits.hpp:91
CoDiPack - Code Differentiation Package.
Definition codi.hpp:97
OpenMPReverseAtomicImpl< Type > OpenMPReverseAtomic
Definition openMPReverseAtomic.hpp:212
Indicate whether a type is atomic.
Definition atomicTraits.hpp:51
If the expression inherits from Direction. Is either std::false_type or std::true_type.
Definition gradientTraits.hpp:127
Reverse atomic implementation for OpenMP.
Definition openMPReverseAtomic.hpp:62
T_Type Type
See OpenMPReverseAtomicImpl.
Definition openMPReverseAtomic.hpp:64
OpenMPReverseAtomicImpl()=delete
Function for checking if the value of the type is completely zero.
Definition realTraits.hpp:106
T_Type Type
See IsTotalZero.
Definition realTraits.hpp:109
static inlinebool isTotalZero(Type const &v)
Checks if the values are completely zero.
Definition realTraits.hpp:112
Provides a data type on which += update operations are performed atomically.
Definition reverseAtomicInterface.hpp:60
inlinevoid operator+=(Impl const &other)
inlineImpl & operator=(Impl const &other)