zum Inhalt springen

Numerical Algorithms Group - NAG

Bei dem Programm handelt es sich um eine Sammlung von numerischen Algorithmen, beispielsweise zur Berechnung von Nullstellen eines Polynoms, dem Lösen linearer Gleichungssysteme und dem Berechnen interpolierender Splines.

Die zur Verfügung stehenden Algorithmen können in FORTRAN und in C genutzt werden. Auf der NAG-Herstellerseite können Sie der ausführlichen Numerical Algorithmus Group- Documentation Informationen zur genauen Umsetzung entnehmen. Sowohl der Einsatz unter C als auch der Einsatz unter FORTRAN wird sehr gut beschrieben.

Das RRZK bietet NAG auf Cheops an. Zur Verwendung wird das Modul nag geladen:

Für Verwendung in C: module load nag/c_09
Für Verwendung in FORTRAN: module load nag

Es werden anschließend die entsprechenden Umgebungsvariablen gesetzt; zugleich werden die benötigten Compiler-Flags angegeben (für FORTRAN: -lnag_nag, für C: -lnagc_nag). Für das NAG-Modul ist das Modul intel erforderlich und wird über die obigen Aufrufe automatisch geladen. Zusätzlich zu den oben genannten NAG-Modulen können Sie mittels module avail auch weitere anzeigen lassen.

Weitere Informationen zur Verwendung von NAG auf Cheops entnehmen Sie bitte der Dokumentation zur Nutzung des Cheops-Clusters (PDF, 540 KB).

Paralleles Rechnen mit NAG

Mit NAG ist auch parallele Programmierung möglich, sodass die Ressourcen auf Cheops optimal genutzt werden können. Weitere Informationen können Sie der Dokumentation der NAG Parallel Library entnehmen.

Beispiel zur Verwendung

Als kleines Beispiel wollen wir einmal die Nullstellen des Polynoms 3.5 x3 - 4.0 x2 + 2.7 x + 1.0 berechnen lassen. Der folgende Quelltext in C würde dieses Problem lösen:

// Finde die Nullstellen eines Polynoms
#include <nag.h>
#include <nagx04.h>
#include <stdio.h>
#include <math.h>
#include <nag_stdlib.h>
#include <nagc02.h>
 
int main()
{
  Integer n, i;
  int exit_status = 0;
  double *a;
  Complex *z = 0;
  NagError fail;
  Nag_Boolean scale;
  scale = Nag_TRUE;
   
  printf("========================================================\n");
  printf("Programm, um Nullstellen eines Polynoms zu finden\n");
  printf("========================================================\n\n");
 
  INIT_FAIL(fail);
 
  printf("Grad des Polynoms: n = ");
  scanf("%ld", &n);
  if (!(0 < n && n <= 5))
  {
    printf("Bitte waehlen Sie einen Grad 0 < n <= 5!\n");
    exit_status = 1;
    goto END;
  }
   
  if (!(a = NAG_ALLOC(n+1, double)) || !(z = NAG_ALLOC(n, Complex)))
  {
    printf("Allocation-Fehler\n");
    exit_status = 1;
    goto END;
  }
   
  printf("Form des Polynoms: ");
  for (i=n; i > 0; i--)
  {
    printf("a[%d] * x^%d + ", n-i, i);
  }
  printf("a[%d], \ta[i] reell", n);
   
  printf("\n\nDateneingabe:\n");
  for (i=0; i <= n; i++)
  {
    printf("a[%d] = ", i);
    scanf("%lf", &a[i]);
  }
   
  nag_zeros_real_poly(n, a, scale, z, &fail);
  if (fail.code != NE_NOERROR)
  {
    printf("Fehler: %s\n", fail.message);
    exit_status = 1;
    goto END;
  }
 
  for (i=0;i<n;i++)
    {
      printf("Nullstelle %2d: %3.3lf + i %3.3lf\n", i+1, z[i].re, z[i].im);
    }
 
  END:
    if (a) NAG_FREE(a);
    if (z) NAG_FREE(z);
    printf("Programm wird beendet mit Status %d.\n", exit_status);
    return exit_status;
}

Lassen Sie nun diesen Quellcode kompilieren, laden Sie dazu  Modul nag/c_09 :

module load nag/c_09

Das Kompilieren geschieht nun wie folgt:

cc quelldatei.c -lnagc_nag

Wobei quelldatei.c  für den Speicherort des Quelltextes steht und natürlich weitere Compiler-Optionen übergeben werden können. Zum Ausführen der Datei muss ebenfalls das Modul nag/c_09 geladen sein. Das Programm fragt nach dem Aufruf

./a.out

nach dem Grad des Polynoms (in unserem Falle also 3) und den Koeffizienten. Nach der Eingabe werden die Nullstellen ermittelt und anschließend ausgegeben.

========================================================
Programm, um Nullstellen eines Polynoms zu finden
========================================================
 
Grad des Polynoms: n = 3
Form des Polynoms: a[0] * x^3 + a[1] * x^2 + a[2] * x^1 + a[3],    a[i] reell
 
Dateneingabe:
a[0] = 3.5
a[1] = -4.0
a[2] = 2.7
a[3] = 1.0
Nullstelle  1: 0.698 + i 0.799
Nullstelle  2: 0.698 + i -0.799
Nullstelle  3: -0.254 + i 0.000
Programm wird beendet mit Status 0.

Kontakt
Bei Fragen und für eine individuelle Beratung wenden Sie sich bitte an:
RRZK-Helpdesk
Telefon: (0221) 470-89555