52 #ifndef SACADO_CACHEFAD_GENERALFAD_HPP
53 #define SACADO_CACHEFAD_GENERALFAD_HPP
74 template <
typename T,
typename Storage>
109 Storage(sz, x, zero_out) {}
133 template <
typename S>
139 const int sz = x.size();
141 this->
val() = x.val();
144 if (x.hasFastAccess())
145 for(
int i=0;
i<sz; ++
i)
148 for(
int i=0;
i<sz; ++
i)
165 void diff(
const int ith,
const int n) {
166 if (this->size() != n)
186 template <
typename S>
190 if (x.size() != this->size())
return false;
191 bool eq = IE::eval(x.val(), this->
val());
192 for (
int i=0;
i<this->size();
i++)
193 eq = eq && IE::eval(x.dx(
i), this->
dx(
i));
222 if (is_const && this->size()!=0)
234 template <
typename S>
238 if (this->size()) this->resize(0);
247 Storage::operator=(x);
252 template <
typename S>
257 const int xsz = x.size();
259 if (xsz != this->size())
260 this->resizeAndZero(xsz);
262 const int sz = this->size();
270 if (x.hasFastAccess())
271 for(
int i=0;
i<sz; ++
i)
274 for(
int i=0;
i<sz; ++
i)
278 this->
val() = x.val();
291 template <
typename S>
299 template <
typename S>
307 template <
typename S>
310 const int sz = this->size();
312 for (
int i=0;
i<sz; ++
i)
318 template <
typename S>
321 const int sz = this->size();
323 for (
int i=0;
i<sz; ++
i)
331 const int xsz = x.size(), sz = this->size();
333 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
334 if ((xsz != sz) && (xsz != 0) && (sz != 0))
335 throw "Fad Error: Attempt to assign with incompatible sizes";
340 for (
int i=0;
i<sz; ++
i)
344 this->resizeAndZero(xsz);
345 for (
int i=0;
i<xsz; ++
i)
350 this->
val() += x.val();
358 const int xsz = x.size(), sz = this->size();
360 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
361 if ((xsz != sz) && (xsz != 0) && (sz != 0))
362 throw "Fad Error: Attempt to assign with incompatible sizes";
367 for(
int i=0;
i<sz; ++
i)
371 this->resizeAndZero(xsz);
372 for(
int i=0;
i<xsz; ++
i)
377 this->
val() -= x.val();
386 const int xsz = x.size(), sz = this->size();
390 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
391 if ((xsz != sz) && (xsz != 0) && (sz != 0))
392 throw "Fad Error: Attempt to assign with incompatible sizes";
397 for(
int i=0;
i<sz; ++
i)
401 this->resizeAndZero(xsz);
402 for(
int i=0;
i<xsz; ++
i)
408 for (
int i=0;
i<sz; ++
i)
421 const int xsz = x.size(), sz = this->size();
425 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
426 if ((xsz != sz) && (xsz != 0) && (sz != 0))
427 throw "Fad Error: Attempt to assign with incompatible sizes";
432 for(
int i=0;
i<sz; ++
i)
434 ( this->
fastAccessDx(
i)*xval - v*x.fastAccessDx(
i) )/ (xval*xval);
437 this->resizeAndZero(xsz);
438 for(
int i=0;
i<xsz; ++
i)
444 for (
int i=0;
i<sz; ++
i)
455 template <
typename S>
460 const int xsz = x.size(), sz = this->size();
462 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
463 if ((xsz != sz) && (xsz != 0) && (sz != 0))
464 throw "Fad Error: Attempt to assign with incompatible sizes";
469 if (x.hasFastAccess())
470 for (
int i=0;
i<sz; ++
i)
473 for (
int i=0;
i<sz; ++
i)
477 this->resizeAndZero(xsz);
478 if (x.hasFastAccess())
479 for (
int i=0;
i<xsz; ++
i)
482 for (
int i=0;
i<xsz; ++
i)
487 this->
val() += x.val();
493 template <
typename S>
498 const int xsz = x.size(), sz = this->size();
500 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
501 if ((xsz != sz) && (xsz != 0) && (sz != 0))
502 throw "Fad Error: Attempt to assign with incompatible sizes";
507 if (x.hasFastAccess())
508 for(
int i=0;
i<sz; ++
i)
511 for (
int i=0;
i<sz; ++
i)
515 this->resizeAndZero(xsz);
516 if (x.hasFastAccess())
517 for(
int i=0;
i<xsz; ++
i)
520 for (
int i=0;
i<xsz; ++
i)
525 this->
val() -= x.val();
532 template <
typename S>
537 const int xsz = x.size(), sz = this->size();
540 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
541 if ((xsz != sz) && (xsz != 0) && (sz != 0))
542 throw "Fad Error: Attempt to assign with incompatible sizes";
547 if (x.hasFastAccess())
548 for(
int i=0;
i<sz; ++
i)
551 for (
int i=0;
i<sz; ++
i)
555 this->resizeAndZero(xsz);
556 if (x.hasFastAccess())
557 for(
int i=0;
i<xsz; ++
i)
560 for (
int i=0;
i<xsz; ++
i)
566 for (
int i=0;
i<sz; ++
i)
577 template <
typename S>
582 const int xsz = x.size(), sz = this->size();
585 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
586 if ((xsz != sz) && (xsz != 0) && (sz != 0))
587 throw "Fad Error: Attempt to assign with incompatible sizes";
592 if (x.hasFastAccess())
593 for(
int i=0;
i<sz; ++
i)
596 for (
int i=0;
i<sz; ++
i)
600 this->resizeAndZero(xsz);
601 if (x.hasFastAccess())
602 for(
int i=0;
i<xsz; ++
i)
605 for (
int i=0;
i<xsz; ++
i)
611 for (
int i=0;
i<sz; ++
i)
629 #endif // SACADO_CACHEFAD_GENERALFAD_HPP
SACADO_INLINE_FUNCTION void cache() const
Cache values.
Forward-mode AD class templated on the storage for the derivative array.
SACADO_INLINE_FUNCTION void setUpdateValue(bool update_val)
Set whether this Fad object should update values.
#define SACADO_ENABLE_VALUE_CTOR_DECL
SACADO_INLINE_FUNCTION GeneralFad(const int sz, const int i, const T &x)
Constructor with size sz, index i, and value x.
RemoveConst< T >::type value_type
Typename of values.
SACADO_INLINE_FUNCTION GeneralFad(const int sz, const T &x, const DerivInit zero_out=InitDerivArray)
Constructor with size sz and value x.
SACADO_INLINE_FUNCTION void setIsConstant(bool is_const)
Set whether variable is constant.
SACADO_INLINE_FUNCTION GeneralFad()
Default constructor.
#define SACADO_ENABLE_EXPR_CTOR_DECL
#define SACADO_ENABLE_VALUE_FUNC(RETURN_TYPE)
SACADO_INLINE_FUNCTION bool updateValue() const
Return whether this Fad object has an updated value.
ScalarType< value_type >::type scalar_type
Typename of scalar's (which may be different from T)
Base template specification for testing equivalence.
SACADO_INLINE_FUNCTION int availableSize() const
Returns number of derivative components that can be stored without reallocation.
SACADO_INLINE_FUNCTION GeneralFad(const Storage &s)
Constructor with supplied storage s.
Do not initialize the derivative array.
SACADO_INLINE_FUNCTION GeneralFad(const GeneralFad &x)
Copy constructor.
SACADO_INLINE_FUNCTION ~GeneralFad()
Destructor.
DerivInit
Enum use to signal whether the derivative array should be initialized in AD object constructors...
SACADO_INLINE_FUNCTION GeneralFad(const Expr< S > &x, SACADO_ENABLE_EXPR_CTOR_DECL)
Copy constructor from any Expression object.
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
SACADO_INLINE_FUNCTION GeneralFad(const S &x, SACADO_ENABLE_VALUE_CTOR_DECL)
Constructor with supplied value x.
SACADO_INLINE_FUNCTION bool isPassive() const
Returns true if derivative array is empty.
Initialize the derivative array.
SACADO_INLINE_FUNCTION bool hasFastAccess() const
Returns true if derivative array is not empty.
#define SACADO_INLINE_FUNCTION
SACADO_INLINE_FUNCTION SACADO_ENABLE_EXPR_FUNC(bool) isEqualTo(const Expr< S > &x) const
Returns whether two Fad objects have the same values.
SACADO_INLINE_FUNCTION void diff(const int ith, const int n)
Set GeneralFad object as the ith independent variable.
Wrapper for a generic expression template.