// standard input output library
# include <iostream>
// f2cad set up for adouble
# define F2CAD_USE_ADOLC
// prototype for dscal
# include <f2cad/dscal.hpp>
int main(void)
{
// turn on recording of adouble operations
int tag = 1;
int keep = 1;
trace_on(tag, keep);
// independent variables
int n = 1; // number of independent variables
adouble a[1]; // vector of independent variables
a[0] <<= 5.; // first independent variables
// create data structure expected by dscal
integer m = 2;
adouble f[2];
f[0] = 1.;
f[1] = 2.;
integer incf = 1;
// set f = a * f
f2cad::dscal_(&m, a, f, &incf );
// dependent variables
double fi;
f[0] >>= fi; // first dependent variable value
f[1] >>= fi; // second dependent variable value
// turn off recording of adouble operations
trace_off();
// set differential for a
int d = 1; // order of the differential
double *daMemory = new double [2 * n];
double **da = new double * [n];
int i, j;
for(j = 0; j < n; j++)
da[j] = daMemory + 2 * j;
da[0][0] = .5; // value of a
da[0][1] = 1.; // differential for a
// compute differential for f
double *dfMemory = new double [2 * m];
double **df = new double * [m];
for(i = 0; i < m; i++)
df[i] = dfMemory + 2 * i;
forward(tag, int(m), n, d, keep, da, df);
// print results
std::cout << "f(a) = a * (1, 2)^T" << std::endl;
std::cout << "f'(a) = ("
<< df[0][1]
<< ", "
<< df[1][1]
<< ")^T"
<< std::endl;
bool ok = df[0][1] == 1. && df[1][1] == 2.;
// free allocated memory
delete [] daMemory;
delete [] dfMemory;
delete [] da;
delete [] df;
if( ok )
return 0; // no error
return 1; // error
}