Actual source code: ad_grad_daxpy.h

petsc-3.3-p7 2013-05-11
  1: /*
  2: ,
  3:   THIS PROGRAM DISCLOSES MATERIAL PROTECTABLE UNDER COPYRIGHT

  5:   LAWS OF THE UNITED STATES.  FOR LICENSING INFORMATION CONTACT:



  9:   Christian Bischof or Lucas Roh, Mathematics and Computer Science Division,

 11:   Argonne National Laboratory, 9700 S. Cass Avenue, Argonne IL 60439,

 13:   {bischof,roh}@mcs.anl.gov.

 15: */

 17: #if !defined(AD_GRAD_DYN_H)
 18: #define AD_GRAD_DYN_H

 20: #include "../adic/run-alloc.h"


 23: #if defined(__cplusplus)
 24: PETSC_EXTERN "C" {
 25: #endif

 27: #define VALIDATE(px) \
 28:     if (!*px) { \
 29:         *px = (double*)ad_adic_deriv_alloc(); \
 30:     } \

 32: #define INVALIDATE(ppx) \
 33:     if (*ppx) { \
 34:         ad_adic_deriv_free(*ppx); \
 35:         *ppx = (double*)0; \
 36:     } 

 38: #define IS_ZERO(px) \
 39:     !px

 41: #define SET_ZERO_FLAG(flag, px, pos)\
 42:     if (IS_ZERO(px)) {\
 43:         flag |= (1<<pos);\
 44:     }

 46: 
 47: #define DAXPY1(ppz, a, pa) \
 48: {\
 49:     int _i; double*pz;\
 50:     VALIDATE(ppz);\
 51:     pz = *ppz; \
 52:     for (_i = 0; _i < ad_grad_size; _i++) {\
 53:         pz[_i] = a*pa[_i];\
 54:     }\
 55: }

 57: #define DAXPY2(ppz, a, pa, b, pb) \
 58: {\
 59:     int _i; double*pz;\
 60:     VALIDATE(ppz);\
 61:     pz = *ppz;\
 62:     for (_i = 0; _i < ad_grad_size; _i++) {\
 63:         pz[_i] = a*pa[_i] + b*pb[_i];\
 64:     }\
 65: }

 67: #define DAXPY3(ppz, a, pa, b, pb, c, pc) \
 68: {\
 69:     int _i; double*pz;\
 70:     VALIDATE(ppz);\
 71:     pz = *ppz;\
 72:     for (_i = 0; _i < ad_grad_size; _i++) {\
 73:         pz[_i] = a*pa[_i] + b*pb[_i] + c*pc[_i];\
 74:     }\
 75: }
 76: void ad_grad_daxpy_init(void);
 77: void ad_grad_daxpy_final(void);
 78: #define ad_grad_daxpy_free(pz) ad_adic_deriv_free(pz)
 79: void ad_grad_daxpy_0(double** ppz);

 81: void ad_grad_daxpy_copy(double** ppz, double* pa);

 83: void ad_grad_daxpy_1(double** pz, double a, double* pa);

 85: void ad_grad_daxpy_2(double** ppz, double a, double* pa, 
 86:                      double b, double* pb);

 88: void ad_grad_daxpy_3(double** ppz, double a, double* pa, 
 89:                      double b, double* pb, double c, double* pc);

 91: void ad_grad_daxpy_n(int n, double** ppz, ...);
 92: void ad_grad_daxpy_4(double** ppz, double ca, double* pa, double cb, double* pb, double cc, double* pc, double cd, double* pd);
 93: void ad_grad_daxpy_5(double** ppz, double ca, double* pa, double cb, double* pb, double cc, double* pc, double cd, double* pd, double ce, double* pe);

 95: #if defined(__cplusplus)
 96: }
 97: #endif
 98: #endif /*AD_GRAD_DYN_H*/