Basic version of Curl using Rules

Armed with information from the previous sections:

  • where the function belongs: “Mathematical Operations”, and

  • information from WMA and SymPy on what should be implemented and how it hooks into an existing library function, and

  • an implementation of Curl written in Mathics3 to guide us

we are now ready to being with a skeletal version from which we can fill out later.

“Mathematical Operations” is located in file mathics/builtin/vectors/math_ops.py.

# TODO: Curl, Div

so we have noted the need for that here already. Good. Let’s remove Curl from that list.

Basic Curl version

At the time of writing, Curl comes after Cross, and before Norm.

class Curl(SympyFunction):
    """
    <url>:Curl: https://en.wikipedia.org/wiki/Curl_(mathematics)</url> (<url>:SymPy: https://docs.sympy.org/latest/modules/vector/api/vectorfunctions.html#sympy.vector.curl</url>, <url>:WMA: https://reference.wolfram.com/language/ref/Curl.html</url>)

    <dl>
      <dt>'Curl[{$f1$, $f2$}, {$x1$, $x2$}]'
      <dd>returns the curl $df2$/$dx1$ - $df1$/$dx2$

      <dt>'Curl[{$f1$, $f2$, $f3} {$x1$, $x2$, $x3}]'
      <dd>returns the curl ($df3$/$dx2$ - $df2$/$dx3$, $dx3$/$df$3 - $df3$/$dx1$, $df2$/$df1$ - $df1$/$dx2$)
    </dl>

    Two-dimensional 'Curl':

    >> Curl[{y, -x}, {x, y}]
     = -2

    >> v[x_, y_] := {Cos[x] Sin[y], Cos[y] Sin[x]}
    >> Curl[v[x, y], {x, y}]
     = 0

    Three-dimensional 'Curl':
    >> Curl[{y, -x, 2 z}, {x, y, z}]
     = {0, 0, -2}

    #> Clear[v];
    """

    attributes = A_PROTECTED
    rules = {
      "Curl[{f1_, f2_}, {x1_, x2_}]": " D[f2, x1] - D[f1, x2]",
      "Curl[{f1_, f2_, f3_}, {x1_, x2_, x3_}]": "{
         D[f3, x2] - D[f2, x3],
         D[f1, x3] - D[f3, x1],
         D[f2, x1] - D[f1, x2]
       }",
    }
    summary_text = "curl vector operator"
    sympy_name = "curl"

We implement this function entirely via rules, so we aren’t making use of the fact that this is a SympyFunction and also don’t need to set class variable sympy_name.

However we expect that in a more complete implementation, we would need this to handle the form of curl that makes use of coordinates.

Next: