3 public static class FieldOperations
5 private const double h = 1e-5;
8 public static double[] ComputeGradient2D(Func<double, double, double> scalarField,
double x,
double y)
10 double dx = (scalarField(x + h, y) - scalarField(x - h, y)) / (2 * h);
11 double dy = (scalarField(x, y + h) - scalarField(x, y - h)) / (2 * h);
12 return new double[] { dx, dy };
16 public static double[] ComputeGradient3D(Func<double, double, double, double> scalarField,
double x,
double y,
double z)
18 double dx = (scalarField(x + h, y, z) - scalarField(x - h, y, z)) / (2 * h);
19 double dy = (scalarField(x, y + h, z) - scalarField(x, y - h, z)) / (2 * h);
20 double dz = (scalarField(x, y, z + h) - scalarField(x, y, z - h)) / (2 * h);
21 return new double[] { dx, dy, dz };
25 public static double ComputeDivergence2D(Func<
double,
double,
double[]> vectorField,
double x,
double y)
27 double dF1_dx = (vectorField(x + h, y)[0] - vectorField(x - h, y)[0]) / (2 * h);
28 double dF2_dy = (vectorField(x, y + h)[1] - vectorField(x, y - h)[1]) / (2 * h);
29 return dF1_dx + dF2_dy;
33 public static double ComputeDivergence3D(Func<
double,
double,
double,
double[]> vectorField,
double x,
double y,
double z)
35 double dF1_dx = (vectorField(x + h, y, z)[0] - vectorField(x - h, y, z)[0]) / (2 * h);
36 double dF2_dy = (vectorField(x, y + h, z)[1] - vectorField(x, y - h, z)[1]) / (2 * h);
37 double dF3_dz = (vectorField(x, y, z + h)[2] - vectorField(x, y, z - h)[2]) / (2 * h);
38 return dF1_dx + dF2_dy + dF3_dz;
42 public static double ComputeCurl2D(Func<
double,
double,
double[]> vectorField,
double x,
double y)
44 double dF2_dx = (vectorField(x + h, y)[1] - vectorField(x - h, y)[1]) / (2 * h);
45 double dF1_dy = (vectorField(x, y + h)[0] - vectorField(x, y - h)[0]) / (2 * h);
46 return dF2_dx - dF1_dy;
50 public static double[] ComputeCurl3D(Func<
double,
double,
double,
double[]> vectorField,
double x,
double y,
double z)
53 double dF3_dy = (vectorField(x, y + h, z)[2] - vectorField(x, y - h, z)[2]) / (2 * h);
54 double dF2_dz = (vectorField(x, y, z + h)[1] - vectorField(x, y, z - h)[1]) / (2 * h);
55 double curl_x = dF3_dy - dF2_dz;
58 double dF1_dz = (vectorField(x, y, z + h)[0] - vectorField(x, y, z - h)[0]) / (2 * h);
59 double dF3_dx = (vectorField(x + h, y, z)[2] - vectorField(x - h, y, z)[2]) / (2 * h);
60 double curl_y = dF1_dz - dF3_dx;
63 double dF2_dx = (vectorField(x + h, y, z)[1] - vectorField(x - h, y, z)[1]) / (2 * h);
64 double dF1_dy = (vectorField(x, y + h, z)[0] - vectorField(x, y - h, z)[0]) / (2 * h);
65 double curl_z = dF2_dx - dF1_dy;
67 return new double[] { curl_x, curl_y, curl_z };