Listing 2: Managed C++ code used to create the assembly naglib, which contains the namespace NAGLIB and wraps the NAG C library functions in the class NAG_FUNCTIONS.
extern "C" {
#include <stdio.h>
#include <nag.h>
#include <nag_stdlib.h>
}
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
using namespace System;
namespace NAGLIB {
public __delegate double INTEGRAND_FUN_TYPE(Double x);
public __delegate void OBJ_FUN_TYPE (Int32 n, double *x,
double *objf, double *g, Int32 comm);
[DllImport("nagc")]
extern "C" void e04dgc(Int32 n, OBJ_FUN_TYPE *f, Double *x, Double *objf,
Double *g, Nag_E04_Opt *options, Int32 comm, NagError *flag);
[DllImport("nagc")]
extern "C" void e04xxc(Nag_E04_Opt *options);
[DllImport("nagc")]
extern "C" void d01ajc(INTEGRAND_FUN_TYPE *f, Double a, Double b,
Double epsabs, Double epsrel, Int32 max_num_subint, Double* result,
Double *abserr, Nag_QuadProgress *qp, NagError *flag);
[DllImport("nagc")]
extern "C" void f02aac(Int32 n, Double *a, Int32 tda,
Double *r, NagError *eflag);
[DllImport("nagc")]
extern "C" Double s15abc(Double x);
public __gc class NAG_FUNCTIONS
{
public:
Double QUADRATURE_epsabs;
Double QUADRATURE_epsrel;
Int32 QUADRATURE_max_subint;
NAG_FUNCTIONS()
{ // the constructor: set default values
QUADRATURE_epsabs = 0.0;
QUADRATURE_epsrel = 0.0001;
QUADRATURE_max_subint = 200;
}
void REAL_SYMM_EIGEN (Int32 n, Double *a, Int32 tda,
Double *r, Int32 *flag)
{
NagError eflag;
INIT_FAIL(eflag);
f02aac(n, a, tda, r, &eflag);
*flag = (Int32)eflag.code;
}
Double CUM_NORM (Double x) {
return s15abc(x);
}
void OPTIMIZE (Int32 n, Double *x, Double *g, Double *objf,
Int32 *flag, OBJ_FUN_TYPE *the_fun)
{
NagError eflag;
Nag_E04_Opt options;
INIT_FAIL(eflag);
e04xxc(&options);
options.print_level = Nag_NoPrint;
options.list = 0;
options.verify_grad = Nag_NoCheck;
e04dgc(n, the_fun, x, objf, g, &options, (Int32)0, &eflag);
*flag = (Int32)eflag.code;
}
void QUADRATURE (Double a, Double b, Double *result,
Double *abserr, Int32 *flag, INTEGRAND_FUN_TYPE *the_fun)
{
Nag_QuadProgress qp;
NagError eflag;
INIT_FAIL(eflag);
d01ajc(the_fun, a, b, QUADRATURE_epsabs, QUADRATURE_epsrel,
QUADRATURE_max_subint, result, abserr, &qp, &eflag);
*flag = (Int32)eflag.code;
}
};
}