using System; namespace Science.Physics.GeneralPhysics { /// /// VectorCalculus contains many static methods: /// Gradient, Divergence, Curl, LineIntegral, SurfaceIntegral, VolumeIntegral. /// We consider only three-dimensional vectors. /// public class VectorCalculus { public VectorCalculus() { } private static Vector.Field f; private static Vector.FunctionOfTime ft; private static Vector.FunctionOfPosition fp; private static Scalar.Field g; private static Scalar.FunctionOfTime gt; private static Scalar.FunctionOfPosition gp; private static Line.Parameterization ptp; private static Surface.Parameterization p2tp; private static Volume.Parameterization p3tp; private static Position p = new Position(); private static Time tm = new Time(); /// /// Divergence for a vector defined by a function of position. /// public static Scalar Divergence(Vector v, Position x) { fp = v.VectorFunctionOfPosition; double[] pp = { x.X, x.Y, x.Z }; Scalar res = new Scalar(); double sum = 0.0; sum += Calculus.PartialDifferentiation(new Calculus.Function(fpx), pp, 0); sum += Calculus.PartialDifferentiation(new Calculus.Function(fpy), pp, 1); sum += Calculus.PartialDifferentiation(new Calculus.Function(fpz), pp, 2); res.Magnitude = sum; return res; } private static double fpx(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return fp(p).X; } private static double fpy(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return fp(p).Y; } private static double fpz(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return fp(p).Z; } /// /// Divergence for a vector defined by a field. /// public static Scalar Divergence(Vector v, Position x, Time t) { f = v.VectorField; tm.s = t.s; double[] pp = { x.X, x.Y, x.Z }; Scalar res = new Scalar(); double sum = 0.0; sum += Calculus.PartialDifferentiation(new Calculus.Function(fx), pp, 0); sum += Calculus.PartialDifferentiation(new Calculus.Function(fy), pp, 1); sum += Calculus.PartialDifferentiation(new Calculus.Function(fz), pp, 2); res.Magnitude = sum; return res; } private static double fx(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return f(p, tm).X; } private static double fy(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return f(p, tm).Y; } private static double fz(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return f(p, tm).Z; } /// /// Curl for a vector defined by a function of position. /// public static Vector Curl(Vector v, Position x) { fp = v.VectorFunctionOfPosition; double[] pp = { x.X, x.Y, x.Z }; double[,] res = new Double[3, 3]; res[1, 0] = Calculus.PartialDifferentiation(new Calculus.Function(fpx), pp, 1); res[2, 0] = Calculus.PartialDifferentiation(new Calculus.Function(fpx), pp, 2); res[0, 1] = Calculus.PartialDifferentiation(new Calculus.Function(fpy), pp, 0); res[2, 1] = Calculus.PartialDifferentiation(new Calculus.Function(fpy), pp, 2); res[0, 2] = Calculus.PartialDifferentiation(new Calculus.Function(fpz), pp, 0); res[1, 2] = Calculus.PartialDifferentiation(new Calculus.Function(fpz), pp, 1); Vector w = new Vector(); w.X = res[1, 2] - res[2, 1]; w.Y = res[2, 0] - res[0, 2]; w.Z = res[0, 1] - res[1, 0]; return w; } /// /// Curl for a vector defined by a field. /// public static Vector Curl(Vector v, Position x, Time t) { f = v.VectorField; tm.s = t.s; double[] pp = { x.X, x.Y, x.Z }; double[,] res = new Double[3,3]; res[1, 0] = Calculus.PartialDifferentiation(new Calculus.Function(fx), pp, 1); res[2, 0] = Calculus.PartialDifferentiation(new Calculus.Function(fx), pp, 2); res[0, 1] = Calculus.PartialDifferentiation(new Calculus.Function(fy), pp, 0); res[2, 1] = Calculus.PartialDifferentiation(new Calculus.Function(fy), pp, 2); res[0, 2] = Calculus.PartialDifferentiation(new Calculus.Function(fz), pp, 0); res[1, 2] = Calculus.PartialDifferentiation(new Calculus.Function(fz), pp, 1); Vector w = new Vector(); w.X = res[1,2]-res[2,1]; w.Y = res[2,0]-res[0,2]; w.Z = res[0,1]-res[1,0]; return w; } /// /// Gradient for a scalar defined by a function of position. /// public static Vector Gradient(Scalar s, Position x) { gp = s.ScalarFunctionOfPosition; Vector res = new Vector(); double[] pp = { x.X, x.Y, x.Z }; res.X = Calculus.PartialDifferentiation(new Calculus.Function(gps), pp, 0); res.Y = Calculus.PartialDifferentiation(new Calculus.Function(gps), pp, 1); res.Z = Calculus.PartialDifferentiation(new Calculus.Function(gps), pp, 2); return res; } private static double gps(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return gp(p).Magnitude; } /// /// Gradient for a scalar defined by a field. /// public static Vector Gradient(Scalar s, Position x, Time t) { g = s.ScalarField; tm.s = t.s; Vector res = new Vector(); double[] pp = { x.X, x.Y, x.Z }; res.X = Calculus.PartialDifferentiation(new Calculus.Function(gs), pp, 0); res.Y = Calculus.PartialDifferentiation(new Calculus.Function(gs), pp, 1); res.Z = Calculus.PartialDifferentiation(new Calculus.Function(gs), pp, 2); return res; } private static double gs(double[] x) { p.X = x[0]; p.Y = x[1]; p.Z = x[2]; return g(p, tm).Magnitude; } /// /// Time Partial Derivative for a vector defined by a field. /// public static Vector TimePartialDerivative(Vector v, Position x, Time t) { f = v.VectorField; p.X = x.X; p.Y = x.Y; p.Z = x.Z; Vector res = new Vector(); res.X = Calculus.Differentiation(new Calculus.Function(fx1), t.s); res.Y = Calculus.Differentiation(new Calculus.Function(fy1), t.s); res.Z = Calculus.Differentiation(new Calculus.Function(fz1), t.s); return res; } private static double fx1(double t) { tm.s = t; return f(p, tm).X; } private static double fy1(double t) { tm.s = t; return f(p, tm).Y; } private static double fz1(double t) { tm.s = t; return f(p, tm).Z; } /// /// Time Derivative for a vector defined by a function of time. /// public static Vector TimeDerivative(Vector v, Time t) { ft = v.VectorFunctionOfTime; Vector res = new Vector(); res.X = Calculus.Differentiation(new Calculus.Function(ftx), t.s); res.Y = Calculus.Differentiation(new Calculus.Function(fty), t.s); res.Z = Calculus.Differentiation(new Calculus.Function(ftz), t.s); return res; } private static double ftx(double t) { tm.s = t; return ft(tm).X; } private static double fty(double t) { tm.s = t; return ft(tm).Y; } private static double ftz(double t) { tm.s = t; return ft(tm).Z; } /// /// Time Partial Derivative for a scalar defined by a field. /// public static Scalar TimePartialDerivative(Scalar s, Position x, Time t) { g = s.ScalarField; p.X = x.X; p.Y = x.Y; p.Z = x.Z; Scalar res = new Scalar(); res.Magnitude = Calculus.Differentiation(new Calculus.Function(gs1), t.s); return res; } private static double gs1(double t) { tm.s = t; return g(p, tm).Magnitude; } /// /// Time Derivative for a scalar defined by a function of time. /// public static Scalar TimeDerivative(Scalar s, Time t) { gt = s.ScalarFunctionOfTime; Scalar res = new Scalar(); res.Magnitude = Calculus.Differentiation(new Calculus.Function(gts), t.s); return res; } private static double gts(double t) { tm.s = t; return gt(tm).Magnitude; } /// /// Time Integral for a vector defined by a function of time. /// public static Vector TimeIntegral(Vector v, Time ti, Time tf) { ft = v.VectorFunctionOfTime; Vector res = new Vector(); res.X = Calculus.Integration1D(new Calculus.Function(ftx), ti.s, tf.s); res.Y = Calculus.Integration1D(new Calculus.Function(fty), ti.s, tf.s); res.Z = Calculus.Integration1D(new Calculus.Function(ftz), ti.s, tf.s); return res; } /// /// Time Integral for a vector defined by a field. /// public static Vector TimeIntegral(Vector v, Position x, Time ti, Time tf) { f = v.VectorField; p.X = x.X; p.Y = x.Y; p.Z = x.Z; Vector res = new Vector(); res.X = Calculus.Integration1D(new Calculus.Function(fx1), ti.s, tf.s); res.Y = Calculus.Integration1D(new Calculus.Function(fy1), ti.s, tf.s); res.Z = Calculus.Integration1D(new Calculus.Function(fz1), ti.s, tf.s); return res; } /// /// Time Integral for a scalar defined by a function of time. /// public static Scalar TimeIntegral(Scalar s, Time ti, Time tf) { gt = s.ScalarFunctionOfTime; Scalar res = new Scalar(); res.Magnitude = Calculus.Integration1D(new Calculus.Function(gts), ti.s, tf.s); return res; } /// /// Time Integral for a scalar defined by a function of time. /// public static Scalar TimeIntegral(Scalar s, Position x, Time ti, Time tf) { g = s.ScalarField; p.X = x.X; p.Y = x.Y; p.Z = x.Z; Scalar res = new Scalar(); res.Magnitude = Calculus.Integration1D(new Calculus.Function(gs1), ti.s, tf.s); return res; } /// /// Line Integral for a scalar defined by a function of position. /// public static Vector LineIntegral(Scalar s, Line l) { gp = s.ScalarFunctionOfPosition; ptp = l.ParameterToPosition; Vector res = new Vector(); res.X = Calculus.Integration1D(new Calculus.Function(gpvx), l.ParameterStartValue, l.ParameterEndValue); res.Y = Calculus.Integration1D(new Calculus.Function(gpvy), l.ParameterStartValue, l.ParameterEndValue); res.Z = Calculus.Integration1D(new Calculus.Function(gpvz), l.ParameterStartValue, l.ParameterEndValue); return res; } private static double gpvx(double para) { Scalar ff = gp(ptp(para)); return ff.Magnitude * Calculus.Differentiation(new Calculus.Function(givex), para); } private static double gpvy(double para) { Scalar ff = gp(ptp(para)); return ff.Magnitude * Calculus.Differentiation(new Calculus.Function(givey), para); } private static double gpvz(double para) { Scalar ff = gp(ptp(para)); return ff.Magnitude * Calculus.Differentiation(new Calculus.Function(givez), para); } private static double givex(double para) { Position x = ptp(para); return x.X; } private static double givey(double para) { Position x = ptp(para); return x.Y; } private static double givez(double para) { Position x = ptp(para); return x.Z; } /// /// Line Integral for a scalar defined by a field. /// public static Vector LineIntegral(Scalar s, Line l, Time t) { g = s.ScalarField; ptp = l.ParameterToPosition; tm.s = t.s; Vector res = new Vector(); Calculus.Function gvx1 = new Calculus.Function(gvx); res.X = Calculus.Integration1D(gvx1, l.ParameterStartValue, l.ParameterEndValue); Calculus.Function gvy1 = new Calculus.Function(gvy); res.Y = Calculus.Integration1D(gvy1, l.ParameterStartValue, l.ParameterEndValue); Calculus.Function gvz1 = new Calculus.Function(gvz); res.Z = Calculus.Integration1D(gvz1, l.ParameterStartValue, l.ParameterEndValue); return res; } private static double gvx(double para) { Scalar ff = g(ptp(para), tm); Calculus.Function givex1 = new Calculus.Function(givex); return ff.Magnitude * Calculus.Differentiation(givex1, para); } private static double gvy(double para) { Scalar ff = g(ptp(para), tm); Calculus.Function givey1 = new Calculus.Function(givey); return ff.Magnitude * Calculus.Differentiation(givey1, para); } private static double gvz(double para) { Scalar ff = g(ptp(para), tm); Calculus.Function givez1 = new Calculus.Function(givez); return ff.Magnitude * Calculus.Differentiation(givez1, para); } /// /// Dot Line Integral for a vector defined by a function of position. /// public static Scalar LineIntegralDot(Vector v, Line l) { fp = v.VectorFunctionOfPosition; ptp = l.ParameterToPosition; Scalar res = new Scalar(); Calculus.Function fpdotv1 = new Calculus.Function(fpdotv); res.Magnitude = Calculus.IntegrationMidpoint(fpdotv1,l.ParameterStartValue,l.ParameterEndValue); return res; } private static double fpdotv(double para) { Scalar ff = givev(para) * fp(ptp(para)); return ff.Magnitude; } private static Vector givev(double para) { Vector v = new Vector(); Calculus.Function givex1 = new Calculus.Function(givex); v.X = Calculus.Differentiation(givex1, para); Calculus.Function givey1 = new Calculus.Function(givey); v.Y = Calculus.Differentiation(givey1, para); Calculus.Function givez1 = new Calculus.Function(givez); v.Z = Calculus.Differentiation(givez1, para); return v; } /// /// Dot Line Integral for a vector defined by a field. /// public static Scalar LineIntegralDot(Vector v, Line l, Time t) { f = v.VectorField; ptp = l.ParameterToPosition; tm.s = t.s; Scalar res = new Scalar(); Calculus.Function fdotv1 = new Calculus.Function(fdotv); res.Magnitude = Calculus.IntegrationMidpoint(fdotv1, l.ParameterStartValue, l.ParameterEndValue); return res; } private static double fdotv(double para) { Scalar ff = givev(para) * f(ptp(para),tm); return ff.Magnitude; } /// /// Cross Line Integral for a vector defined by a function of position. ( \int \vec a \times d \vec l ) /// public static Vector LineIntegralCross(Vector v, Line l) { fp = v.VectorFunctionOfPosition; ptp = l.ParameterToPosition; Vector res = new Vector(); res.X = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfpx), l.ParameterStartValue, l.ParameterEndValue); res.Y = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfpy), l.ParameterStartValue, l.ParameterEndValue); res.Z = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfpz), l.ParameterStartValue, l.ParameterEndValue); return res; } private static double vcrossfpx(double para) { Vector ff = fp(ptp(para)) % givev(para); return ff.X; } private static double vcrossfpy(double para) { Vector ff = fp(ptp(para)) % givev(para); return ff.Y; } private static double vcrossfpz(double para) { Vector ff = fp(ptp(para)) % givev(para); return ff.Z; } /// /// Cross Line Integral for a vector defined by a field. /// public static Vector LineIntegralCross(Vector v, Line l, Time t) { f = v.VectorField; ptp = l.ParameterToPosition; tm = t; Vector res = new Vector(); res.X = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfx), l.ParameterStartValue, l.ParameterEndValue); res.Y = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfy), l.ParameterStartValue, l.ParameterEndValue); res.Z = Calculus.IntegrationMidpoint(new Calculus.Function(vcrossfz), l.ParameterStartValue, l.ParameterEndValue); return res; } private static double vcrossfx(double para) { Vector ff = f(ptp(para), tm) % givev(para); return ff.X; } private static double vcrossfy(double para) { Vector ff = f(ptp(para), tm) % givev(para); return ff.Y; } private static double vcrossfz(double para) { Vector ff = f(ptp(para), tm) % givev(para); return ff.Z; } /// /// Surface Integral for a scalar defined by a function of position. /// public static Vector SurfaceIntegral(Scalar s, Surface sf) { gp = s.ScalarFunctionOfPosition; p2tp = sf.ParameterToPosition; Vector res = new Vector(); double[] from = new double[2] { sf.Parameter1StartValue, sf.Parameter2StartValue }; double[] to = new double[2] { sf.Parameter1EndValue, sf.Parameter2EndValue }; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(gpjx), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(gpjy), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(gpjz), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double gx(double[] para) { Position x = p2tp(para[0], para[1]); return x.X; } private static double gy(double[] para) { Position x = p2tp(para[0], para[1]); return x.Y; } private static double gz(double[] para) { Position x = p2tp(para[0], para[1]); return x.Z; } private static double rd(double[] para, int xyz, int uv) // xyz=0,1,2 uv = 0,1 { Calculus.Function xyzofp2 = new Calculus.Function(gx); if (xyz == 1) xyzofp2 = new Calculus.Function(gy); if (xyz == 2) xyzofp2 = new Calculus.Function(gz); return Calculus.PartialDifferentiation(xyzofp2, para, uv); } private static double gpjx(double[] para) { return gp(p2tp(para[0], para[1])).Magnitude * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)); } private static double gpjy(double[] para) { return gp(p2tp(para[0], para[1])).Magnitude * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)); } private static double gpjz(double[] para) { return gp(p2tp(para[0], para[1])).Magnitude * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } /// /// Surface Integral for a scalar defined by a field. /// public static Vector SurfaceIntegral(Scalar s, Surface sf, Time t) { g = s.ScalarField; p2tp = sf.ParameterToPosition; tm.s = t.s; Vector res = new Vector(); double[] from = new double[2]{sf.Parameter1StartValue, sf.Parameter2StartValue}; double[] to = new double[2]{sf.Parameter1EndValue, sf.Parameter2EndValue}; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(gjx), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(gjy), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(gjz), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double gjx(double[] para) { return g(p2tp(para[0], para[1]), tm).Magnitude * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)); } private static double gjy(double[] para) { return g(p2tp(para[0], para[1]), tm).Magnitude * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)); } private static double gjz(double[] para) { return g(p2tp(para[0], para[1]), tm).Magnitude * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } /// /// Dot Surface Integral for a vector defined by a function of position. /// public static Scalar SurfaceIntegralDot(Vector v, Surface sf) { fp = v.VectorFunctionOfPosition; p2tp = sf.ParameterToPosition; Scalar res = new Scalar(); double[] from = new double[2] { sf.Parameter1StartValue, sf.Parameter2StartValue }; double[] to = new double[2] { sf.Parameter1EndValue, sf.Parameter2EndValue }; double[] ins = Calculus.IntegrationMultiD(new Calculus.Function(fpdotsf), from, to); res.Magnitude = ins[0]; res.StandardDeviation = ins[1]; return res; } private static double fpdotsf(double[] para) { return fp(p2tp(para[0], para[1])).X * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)) + fp(p2tp(para[0], para[1])).Y * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)) + fp(p2tp(para[0], para[1])).Z * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } /// /// Dot Surface Integral for a vector defined by a field. /// public static Scalar SurfaceIntegralDot(Vector v, Surface sf, Time t) { f = v.VectorField; p2tp = sf.ParameterToPosition; tm.s = t.s; Scalar res = new Scalar(); double[] from = new double[2] { sf.Parameter1StartValue, sf.Parameter2StartValue }; double[] to = new double[2] { sf.Parameter1EndValue, sf.Parameter2EndValue }; double[] ins = Calculus.IntegrationMultiD(new Calculus.Function(fdotsf), from, to); res.Magnitude = ins[0]; res.StandardDeviation = ins[1]; return res; } private static double fdotsf(double[] para) { return f(p2tp(para[0], para[1]),tm).X * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)) + f(p2tp(para[0], para[1]),tm).Y * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)) + f(p2tp(para[0], para[1]),tm).Z * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } /// /// Cross Surface Integral for a vector defined by a function of position. /// public static Vector SurfaceIntegralCross(Vector v, Surface sf) { fp = v.VectorFunctionOfPosition; p2tp = sf.ParameterToPosition; Vector res = new Vector(); double[] from = new double[2] { sf.Parameter1StartValue, sf.Parameter2StartValue }; double[] to = new double[2] { sf.Parameter1EndValue, sf.Parameter2EndValue }; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(fpcsx), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(fpcsy), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(fpcsz), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double fpcsx(double[] para) { return fp(p2tp(para[0], para[1])).Y * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)) - fp(p2tp(para[0], para[1])).Z * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)); } private static double fpcsy(double[] para) { return fp(p2tp(para[0], para[1])).Z * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)) - fp(p2tp(para[0], para[1])).X * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } private static double fpcsz(double[] para) { return fp(p2tp(para[0], para[1])).X * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)) - fp(p2tp(para[0], para[1])).Y * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)); } /// /// Cross Surface Integral for a vector defined by a field. /// public static Vector SurfaceIntegralCross(Vector v, Surface sf, Time t) { f = v.VectorField; p2tp = sf.ParameterToPosition; tm.s = t.s; Vector res = new Vector(); double[] from = new double[2] { sf.Parameter1StartValue, sf.Parameter2StartValue }; double[] to = new double[2] { sf.Parameter1EndValue, sf.Parameter2EndValue }; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(fcsx), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(fcsy), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(fcsz), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double fcsx(double[] para) { return f(p2tp(para[0], para[1]), tm).Y * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)) - f(p2tp(para[0], para[1]), tm).Z * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)); } private static double fcsy(double[] para) { return f(p2tp(para[0], para[1]), tm).Z * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)) - f(p2tp(para[0], para[1]), tm).X * (rd(para, 0, 0) * rd(para, 1, 1) - rd(para, 0, 1) * rd(para, 1, 0)); } private static double fcsz(double[] para) { return f(p2tp(para[0], para[1]), tm).X * (rd(para, 2, 0) * rd(para, 0, 1) - rd(para, 2, 1) * rd(para, 0, 0)) - f(p2tp(para[0], para[1]), tm).Y * (rd(para, 1, 0) * rd(para, 2, 1) - rd(para, 1, 1) * rd(para, 2, 0)); } /// /// Volume Integral for a scalar defined by a function of position. /// public static Scalar VolumeIntegral(Scalar s, Volume vol) { gp = s.ScalarFunctionOfPosition; p3tp = vol.ParameterToPosition; Scalar res = new Scalar(); double[] from = new double[3] { vol.Parameter1StartValue, vol.Parameter2StartValue, vol.Parameter3StartValue }; double[] to = new double[3] { vol.Parameter1EndValue, vol.Parameter2EndValue, vol.Parameter3EndValue }; double[] ins = Calculus.IntegrationMultiD(new Calculus.Function(gpvol), from, to); res.Magnitude = ins[0]; res.StandardDeviation = ins[1]; return res; } private static double hx(double[] para) { Position x = p3tp(para[0], para[1], para[2]); return x.X; } private static double hy(double[] para) { Position x = p3tp(para[0], para[1], para[2]); return x.Y; } private static double hz(double[] para) { Position x = p3tp(para[0], para[1], para[2]); return x.Z; } private static double rd3(double[] para, int xyz, int uvw) // xyz=0,1,2 uvw = 0,1,2 { Calculus.Function xyzofp3 = new Calculus.Function(hx); if (xyz == 1) xyzofp3 = new Calculus.Function(hy); if (xyz == 2) xyzofp3 = new Calculus.Function(hz); return Calculus.PartialDifferentiation(xyzofp3, para, uvw); } private static double ja3(double[] para) { return (rd3(para, 0, 0) * rd3(para, 1, 1) * rd3(para, 2, 2) + rd3(para, 0, 1) * rd3(para, 1, 2) * rd3(para, 2, 0) + rd3(para, 1, 0) * rd3(para, 2, 1) * rd3(para, 0, 2) - rd3(para, 0, 2) * rd3(para, 1, 1) * rd3(para, 2, 0) - rd3(para, 1, 2) * rd3(para, 2, 1) * rd3(para, 0, 0) - rd3(para, 0, 1) * rd3(para, 1, 0) * rd3(para, 2, 2)); } private static double gpvol(double[] para) { return gp(p3tp(para[0], para[1], para[2])).Magnitude * Math.Abs(ja3(para)); } /// /// Volume Integral for a scalar defined by a field. /// public static Scalar VolumeIntegral(Scalar s, Volume vol, Time t) { g = s.ScalarField; p3tp = vol.ParameterToPosition; tm.s = t.s; Scalar res = new Scalar(); double[] from = new double[3] { vol.Parameter1StartValue, vol.Parameter2StartValue, vol.Parameter3StartValue}; double[] to = new double[3] { vol.Parameter1EndValue, vol.Parameter2EndValue, vol.Parameter3EndValue}; double[] ins = Calculus.IntegrationMultiD(new Calculus.Function(gvol), from, to); res.Magnitude = ins[0]; res.StandardDeviation = ins[1]; return res; } private static double gvol(double[] para) { return g(p3tp(para[0], para[1], para[2]),tm).Magnitude * Math.Abs(ja3(para)); } /// /// Volume Integral for a vector defined by a function of position. /// public static Vector VolumeIntegral(Vector v, Volume vol) { fp = v.VectorFunctionOfPosition; p3tp = vol.ParameterToPosition; Vector res = new Vector(); double[] from = new double[3] { vol.Parameter1StartValue, vol.Parameter2StartValue, vol.Parameter3StartValue }; double[] to = new double[3] { vol.Parameter1EndValue, vol.Parameter2EndValue, vol.Parameter3EndValue }; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(fpxvol), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(fpyvol), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(fpzvol), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double fpxvol(double[] para) { return fp(p3tp(para[0], para[1], para[2])).X * Math.Abs(ja3(para)); } private static double fpyvol(double[] para) { return fp(p3tp(para[0], para[1], para[2])).Y * Math.Abs(ja3(para)); } private static double fpzvol(double[] para) { return fp(p3tp(para[0], para[1], para[2])).Z * Math.Abs(ja3(para)); } /// /// Volume Integral for a vector defined by a field. /// public static Vector VolumeIntegral(Vector v, Volume vol, Time t) { f = v.VectorField; p3tp = vol.ParameterToPosition; tm.s = t.s; Vector res = new Vector(); double[] from = new double[3] { vol.Parameter1StartValue, vol.Parameter2StartValue, vol.Parameter3StartValue }; double[] to = new double[3] { vol.Parameter1EndValue, vol.Parameter2EndValue, vol.Parameter3EndValue }; double[] inx = Calculus.IntegrationMultiD(new Calculus.Function(fxvol), from, to); res.X = inx[0]; res.StandardDeviationOfX = inx[1]; double[] iny = Calculus.IntegrationMultiD(new Calculus.Function(fyvol), from, to); res.Y = iny[0]; res.StandardDeviationOfY = iny[1]; double[] inz = Calculus.IntegrationMultiD(new Calculus.Function(fzvol), from, to); res.Z = inz[0]; res.StandardDeviationOfZ = inz[1]; return res; } private static double fxvol(double[] para) { return f(p3tp(para[0], para[1], para[2]), tm).X * Math.Abs(ja3(para)); } private static double fyvol(double[] para) { return f(p3tp(para[0], para[1], para[2]), tm).Y * Math.Abs(ja3(para)); } private static double fzvol(double[] para) { return f(p3tp(para[0], para[1], para[2]), tm).Z * Math.Abs(ja3(para)); } } }