Listing 3: C# code that uses the assembly naglib in a C# console application.
using System; using System.Runtime.InteropServices; using NAGLIB; namespace USE_NAGLIBS { class DCLASS : NAG_FUNCTIONS { public unsafe void objfun (Int32 n, Double *x, Double *objf, Double *g, Int32 comm) { Double ex1, x1, x2; ex1 = Math.Exp(x[0]); x1 = x[0]; x2 = x[1]; *objf = ex1*(4.0*x1*x1 + 2.0*x2*x2 + 4.0*x1*x2 + 2.0*x2 + 1.0); g[0] = 4.0*ex1*(2.0*x1 + x2) + *objf; g[1] = 2.0*ex1*(2.0*x2+2.0*x1 + 1.0); } public Double the_integrand_c(Double x) { Double pi = Math.PI; Double val; val = (x*Math.Sin(x*30.0)/1.0-x*x/(pi*pi*4.0)); return val; } } class RUNIT { static unsafe void Main(string[] args) { Int32 tda = 4, n = 4, n2 = 2, j, flag = 0; Double [] r = new Double [30]; Double [] x2 = new Double [2]; Double [] g = new Double [2]; Double a1, b1, objf = 0.0, abserr = 0.0, the_answer, x; Double [,] a = new Double[n,n]; DCLASS tt = new DCLASS(); x = -1.0; the_answer = tt.CUM_NORM(x); Console.WriteLine ("The value of the cumulative normal = {0,8:F4}", the_answer); INTEGRAND_FUN_TYPE myfun_c=new INTEGRAND_FUN_TYPE (tt.the_integrand_c); OBJ_FUN_TYPE myobjfun = new OBJ_FUN_TYPE (tt.objfun); a1 = 0.0; b1 = Math.PI*2.0; flag = 0; the_answer = 0.0; tt.QUADRATURE(a1, b1, ref the_answer, ref abserr, ref flag, myfun_c); Console.WriteLine("The integral (default maximum number of subintervals) = {0,8:F6} ",the_answer); flag = 0; tt.QUADRATURE_max_subint = 3; tt.QUADRATURE(a1, b1, ref the_answer, ref abserr, ref flag, myfun_c); Console.WriteLine("The integral (maximum number of subintervals set to 3) = {0,8:F6} ",the_answer); x2[0] = -1.0; x2[1] = 1.0; n2 = 2; flag = 0; tt.OPTIMIZE(n2, ref x2[0], ref g[0], ref objf, ref flag, myobjfun); Console.Write("The optimization solution vector is :"); for (j = 0; j < 2; ++j) { Console.Write("{0,8:F4}",x2[j]); } Console.WriteLine(); Console.WriteLine("The value of the objective function is: {0,8:E4}",objf); flag = 0; // first row a[0,0] = 0.5; a[0,1] = 0.0; a[0,2] = 2.3; a[0,3] = -2.6; // second row a[1,0] = 0.0; a[1,1] = 0.5; a[1,2] = -1.4; a[1,3] = -0.7; // third row a[2,0] = 2.3; a[2,1] = -1.4; a[2,2] = 0.5; a[2,3] = 0.0; // fourth row a[3,0] = -2.6; a[3,1] = -0.7; a[3,2] = 0.0; a[3,3] = 0.5; tt.REAL_SYMM_EIGEN(n, ref a[0,0], tda, ref r[0], ref flag); Console.Write("The Eigenvalues are:"); for (j = 0; j <= 3; ++j) { Console.Write("{0,8:F4}", r[j]); } Console.WriteLine(); } } }