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``.
.. code-block:: python
# 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``.
.. code-block::
class Curl(SympyFunction):
"""
:Curl: https://en.wikipedia.org/wiki/Curl_(mathematics) (:SymPy: https://docs.sympy.org/latest/modules/vector/api/vectorfunctions.html#sympy.vector.curl, :WMA: https://reference.wolfram.com/language/ref/Curl.html)
- 'Curl[{$f1$, $f2$}, {$x1$, $x2$}]'
- returns the curl $df2$/$dx1$ - $df1$/$dx2$
- 'Curl[{$f1$, $f2$, $f3} {$x1$, $x2$, $x3}]'
- returns the curl ($df3$/$dx2$ - $df2$/$dx3$, $dx3$/$df$3 - $df3$/$dx1$, $df2$/$df1$ - $df1$/$dx2$)
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:
.. toctree::
:maxdepth: 1
checking