Algorithmische Optimale Steuerung - CO2-Aufnahme des Meeres

Adol-C

Adol-C ist ein Operatorüberladen-Tool für C++

Homepage

Adol-C kann dort heruntergeladen werden. Es wird normalerweise im Heimatverzeichnis ($HOME) in einem Unterverzeichnis 

adolc_base 

installiert.

Es kann mit oder ohne Tape gearbeitet werden:

  • Tapeless Mode (nur Vorwärtsmodus):
    • Programmcode vorbereiten:
      • Headerfile einbinden:
        #include "adolc/adtl.h"
      • Speziellen Namensbereich für "tapeless" benutzen: 
        using namespace adtl;
      • max. Anzahl der unabhangigen Variablen setzen (hier n): 
        setnumDir(n);
      • alle aktiven Variablen und Funktionen als Typ 
        adouble
        deklarieren
      • mit
        x[i].setADValue(i,1)
        initialisiert man die Seed Matrix (hier dx[i]/dx[i]=1)
      • mit
        y.getADValue(i)
        erhält man die i-te Komponente der Ableitung (hier für y=f(x))
    • Übersetzen: mit Option 
      
      		
      				-I/$HOME/adolc_base/include
      
    • Linken: mit Option
      
      				-L/home/numtools/adolc_base/lib64 -ladolc
    • Tape Mode (Vorwärts- und Rückwartsmodus):
      • Programmcode vorbereiten:
        • Headerfile einbinden: #include "adolc/adolc.h"
        • Tape initialisieren: Vor dem zu differenzierenden Programmteil:  trace_on(tag,keep); Dabei ist tag die Tapenummer (wenn man nur eins benötigt also tag=0) Parameter keep (optional) wird nur bei einem direkt folgenden (d.h. ohne zuerst einmal forward mode benutzt zu haben) reverse mode-Aufruf benötigt und wird dann auf die Ordnung der höchsten zu berechnenden Ableitung gesetzt (also bei 1. Ableitung mit reverse mode : trace_on(0,1))
        • Werte der unabhängigen Variaben in die adouble-Variablen "shiften", Beispiel: double x[n]; adouble ax[n];   for (i=0;i<n;i++) ax[i] <<= x[i];
        • danach alle aktiven Variablen als Typ adouble deklarieren und Programmcode sonst unverändert lassen, Beispiel: adouble f(adouble*); adouble ay; ay=f(ax);
        • Ergebnis zurück in adouble-Variable shiften: double y;  ay >>= y;
        • Tape abschalten:  trace_off();
      • Berechnen der Ableitung durch Auswerten des Tapes:
        • Direkt forward mode aufrufen (Manual S. 41):
          • Jacobi-Matrix für eine Funktion f:R^n-> R^m:  Seed Matrix definieren und initialisieren:  double **X=new double*[n];  ...   Jacobi-Matrix definieren: double**Y = new double*[m]; for(int i=0;i<m;i++) Y[i]=new double[n]; Aufruf Vorwärtsmodus: forward(tag,m,n,n,x,X,y,Y);     // y=Vektor der Funktionswerte
          • Gradient einer Funktion f:R^n-> R: Seed Matrix definieren und initialisieren:  double **X=new double*[n];  ... Gradientenvektor definieren: double*Y = new double[n]; Aufruf Vorwärtsmodus: forward(tag,m,n,n,x,X,&y,&Y);     // y= Funktionswert (skalare Größe, daher Referenz übergeben!)
        • Direkt reverse mode aufrufen (Manual S. 40):
          • Gradient einer Funktion f:R^n -> R:

            double w=1; double *Y = new double[n]; reverse(tag,1,n,0,&w,Y); Dabei muss bei trace_on() s.o.  keep=1 gewesen sein oder einmal ein forward mode-Lauf vorausgegangen sein!!!

    • oder Treiber für Gradient etc.:
      • Gradient in x auswerten und in Array grad speichern  double grad[n];  gradient(tag,n,x,grad);  // tag hat gelichen Wert wie bei trace_on
      • Hesse-Matrix (2. Ableitungen):  double H[n][n];  hessian(tag,n,x,H);
    • Übersetzen wie beim Tapeless Mode
    • Linken:  AdolC-Bibilotheken mit angeben:    -L/home/numtools/adolc_base/lib -ladolc -R/home/numtools/adolc_base/lib    ( - "klein L" adolc  in der Mitte!!!)