AdiC - Quelltransformationstool für C (und etwas C++)
Homepage: Argonne Nat. Lab. Chicago IL USA
installiert
- im Unix-Pool unter /homes/guest/slawig/ADIC/adic-1.2.0
- im Forschungsnetz (Linux-Rechner) unter /usr/site-local/AutoDiff/AdiC/adic-1.2.0
Vorbereitung:
- in .cshrc:
- setenv ADIC /homes/lva/lva-001/ADIC/adic-1.2.0 (bzw. /usr/site-local/AutoDiff/AdiC/adic-1.2.0)
- setenv ADIC_ARCH linux
- setenv PATH "$ADIC"/bin/"$ADIC_ARCH":"$PATH"
- bzw. .bashrc:
- ADIC=/homes/lva/lva-001/ADIC/adic-1.2.0 (bzw. /usr/site-local/AutoDiff/AdiC/adic-1.2.0)
- ADIC_ARCH=linux
- PATH=$ADIC/bin/$ADIC_ARCH:$PATH
- export PATH ADIC ADIC_ARCH
Differenzieren (nur Vorwärtsmodus):
- Zu differenzierenden Code in eine Funktion double f(double x) schreiben, z.B. in Datei f.cpp
- Aufruf :
- generierte Datei f.ad.cpp enthält Funktion void ad_f(DERIV_TYPE *ad_var_ret, DERIV_TYPE x)
- Datentyp DERIV_TYPE besteht aus Wert und Ableitung (ähnlich zum Operatorüberladen)
- Im Hauptprogramm (z.B. main.cpp):
- ad_deriv.h einbinden
- unabh. (Beispiel: x[n]) und abh. Variable (Beispiel: y) mit Typ DERIV_TYPE deklarieren
- Werte von x setzen:
- Initialisierung:
- ad_AD_Init(n);
- ad_AD_SetIndepArray(x,n);
- ad_AD_SetIndepDone();
- generierte Funktion ad_f aufrufen (s.o.)
- Gradient extrahieren:
- double grad[n];
- ad_AD_ExtractGrad(grad,y);
- am Ende des Programms:
- Kompilieren mit:
- g++ -I$(ADIC)/include -c f.ad.cpp main.cpp
- Linken mit den Bibliotheken
- g++ f.ad.o main.o -L$(ADIC)/lib/$(ADIC_ARCH) -lADIntrinsics-C -laif_grad
Details s. Manual