[ADOL-C] gcc or g++

Kharche, Sanjay S.R.Kharche at exeter.ac.uk
Fri Dec 13 13:07:24 EST 2013


Hi

Many thanks for the rapid reply. I worked through the odexam.cpp example. accode sets the values of 2 3D arrays (code pasted below) and 1 2D array, none of which are the Jacobian of the ODE that is defined in tracerhs. How do I get the Jacobian?

Also, if you have a simple example of how to calculate a Jacobian from ADOL-C and then feed that into CVODES, that will help in the local sensitivity analysis that I would like to do.

thanks
Sanjay

Code:

//
#include "adolc/adolc.h"
//

#include <iostream>
#include<math.h>
#include<stdio.h>

/****************************************************************************/
/*                                                          ADOUBLE ROUTINE */
void tracerhs(short int tag, double* py, double* pyprime) {
    adouble y[3];                // we left the parameters passive
    adouble yprime[3];           

    trace_on(tag);
    y[0] <<= py[0]; y[1] <<= py[1];   y[2] <<= py[2];                              // initialize and mark independents
    yprime[0] = -sin(y[2]) + 1.0e8*y[2]*(1.0-1.0/y[0]);
    yprime[1] = -10.0*y[0] + 3.0e7*y[2]*(1-y[1]);
    yprime[2] = -yprime[0] - yprime[1];
    yprime[0] >>= pyprime[0]; yprime[1] >>= pyprime[1];  yprime[2] >>= pyprime[2]; // mark and pass dependents
    trace_off(1);                // write tape array onto a file
} // end tracerhs

/****************************************************************************/
/*                                                             MAIN PROGRAM */
int main() {
    int i,j,deg,k;
    int n = 3;
    double py[3];
    double pyp[3];

    deg = 5; // this is an input.

    short** nz = new short*[n];
    double  **X;
    double ***Z; // what are Z and B?
    double ***B;

    X = myalloc2(n,deg+1); // these are ADOL-C functions
    Z = myalloc3(n,n,deg);
    B = myalloc3(n,n,deg);

    for(i=0; i<n; i++) {
        py[i]   = (i==0) ? 1.0 : 0.0;       // Initialize the base point
        X[i][0] = py[i];                    // and the Taylor coefficient;
        nz[i]   = new short[n];             // set up sparsity array. So this array is sparsity, 
    } // end for

    tracerhs(1,py,pyp);                   // trace RHS with tag = 1
// what does forode do? 
    forode(1,n,deg,X);                    // compute deg coefficients
// what does reverse do?
    reverse(1,n,n,deg-1,Z,nz);            // U defaults to the identity
    accode(n,deg-1,Z,B,nz);

    printf("nonzero pattern:\n");
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++)
            printf("%d \t",nz[i][j]);
        printf("\n");
    } // end for

// see what is in B and Z for all degrees of the Taylor polynomial.

for(k = 0; k<deg; k++){

    printf("B (at k = %d):\n",k);
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++)
            printf("%f \t",B[i][j][k]);
        printf("\n");
    } // end for
printf("\n\n");

    printf("Z (at k = %d):\n",k);
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++)
            printf("%f \t",Z[i][j][k]);
        printf("\n");
    } // end for

printf("\n\n");
}

return 1;
} // end main



More information about the ADOL-C mailing list