1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
/*----------------------------------------------------------------------------
ADOL-C -- Automatic Differentiation by Overloading in C++
File: vfunc_robertson.cpp
Revision: $Id$
Contents: example for function module containing the Robertson test problem
(based on odexam.C of version 1.7)
Each << function module >> contains:
(1) const char* const controlFileName
(2) int indepDim;
(3) int depDim;
(4) void initProblemParameters( void )
(5) void initIndependents( double* indEPS_ )
(6) void originalVectorFunction( double* indEPS_, double* dEPS_ )
(7) void tapingVectorFunction( int tag, double* indEPS_, double* dEPS_ )
Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
This file is part of ADOL-C. This software is provided as open source.
Any use, reproduction, or distribution of the software constitutes
recipient's acceptance of the terms of the accompanying license file.
---------------------------------------------------------------------------*/
#define _VFUNC_ROBERTSON_C_
/****************************************************************************/
/* INCLUDES */
#include <adolc/adolc.h>
#include <math.h>
/****************************************************************************/
/* GLOBAL VARIABLES */
/*--------------------------------------------------------------------------*/
/* Control file name */
const char* controlFileName = "robertsonexam.ctrl";
/*--------------------------------------------------------------------------*/
/* Dimensions */
int indepDim;
int depDim;
/*--------------------------------------------------------------------------*/
/* Other problem dependent parameters */
/****************************************************************************/
/* INIT PROBLEM PARAMETERS */
void initProblemParameters( void ) {
fprintf(stdout,"ROBERTSONEXAM (ADOL-C Example)\n\n");
/* number of indeps & deps */
indepDim = 3;
depDim = 3;
}
/****************************************************************************/
/* INITIALIZE INDEPs */
void initIndependents( double* indeps ) {
indeps[0] = 1.0;
indeps[1] = 0.01; /* originally 0.0 */
indeps[2] = 0.02; /* originally 0.0 */
}
/****************************************************************************/
/* ORIGINAL SCALAR FUNCTION */
/*--------------------------------------------------------------------------*/
/* The Robertson test problem */
void robertson( double* indeps, double* deps ) {
deps[0] = -sin(indeps[2]) + 1.0e8*indeps[2]*(1.0-1.0/indeps[0]);
deps[1] = -10.0*indeps[0]
+ 3.0e7*indeps[2]*(1.0-indeps[1]);
deps[2] = -deps[0] - deps[1];
}
/*--------------------------------------------------------------------------*/
/* The interface function */
void originalVectorFunction( double* indeps, double* deps ) {
robertson(indeps,deps);
}
/****************************************************************************/
/* TAPING SCALAR FUNCTION */
/*--------------------------------------------------------------------------*/
/* The active Robertson test problem */
void activeRobertson( adouble* indeps, adouble* deps ) {
deps[0] = -sin(indeps[2]) + 1.0e8*indeps[2]*(1.0-1.0/indeps[0]);
deps[1] = -10.0*indeps[0]
+ 3.0e7*indeps[2]*(1.0-indeps[1]);
deps[2] = -deps[0] - deps[1];
}
/*--------------------------------------------------------------------------*/
/* The interface function */
void tapingVectorFunction( int tag, double* indeps, double* deps ) {
int i;
trace_on(tag);
adouble* activeIndeps = new adouble[indepDim];
adouble* activeDeps = new adouble[depDim];
adouble* aIP = activeIndeps;
double* iP = indeps;
for (i=0; i<indepDim; i++)
*aIP++ <<= *iP++;
activeRobertson(activeIndeps,activeDeps);
aIP = activeDeps;
iP = deps;
for (i=0; i<depDim; i++)
*aIP++ >>= *iP++;
trace_off();
}
#undef _VFUNC_ROBERTSON_C_
|