Ask Your Question

div, grad and curl once again

asked 2018-01-26 22:24:04 +0200

quantum_leopard gravatar image

updated 2023-01-09 23:59:45 +0200

tmonteil gravatar image

HI, and sorry to badger people who are all working to give us a terrific maths tool for no cost, but there's a big need for div, grad and curl in many applications, such as electromagnetics, quantum theory, fluid flow, etc.

Specifically, my wish list would be, if s is a scalar field, and v a vector one,

grad (s) in cartesians, polars, cylindricals and sphericals

div (v) over the same coordinate systems

curl (v) over the same coordinate systems


grad(grad(s)) over these four systems, the spherical one being quite tricky anyway

Is there any cance of some kind person implementing (and documenting) these?

edit retag flag offensive close merge delete

3 Answers

Sort by ยป oldest newest most voted

answered 2018-01-27 14:19:40 +0200

eric_g gravatar image

updated 2018-08-14 21:03:26 +0200

As suggested in @tmonteil 's answer, all necessary material is in the manifolds part, but it needs to be made explicit for the end user. For instance, there should be a function EuclideanSpace so that

sage: E = EuclideanSpace(3)

creates the 3-dimensional Euclidean space as a smooth manifold endowed with a Riemannian flat metric. Then one could do things like

sage: v = E.vector_field([-x*z, x+z, y^2])
sage: c = v.curl()
sage: d = v.div()
sage: spher = E.spherical_frame()  # orthonormal frame associated with spherical coordinates
sage: c.display(spher)

This was on my todo list for a while... @quantum_leopard 's question acts as an efficient reminder: I'm on it ;-) I will report here (with a Trac ticket number) when the code is ready.

EDIT (18 March 2018): the code implementing vector calculus on Euclidean space is ready for review at Trac #24623.

EDIT (10 May 2018): the ticket #24623 has received a positive review and has been merged in SageMath 8.3.beta0. Alas, it was too late to be integrated in SageMath 8.2, which has been released 5 days ago. However, among the new features of SageMath 8.2, there are the grad, div, curl, etc. operators on a generic pseudo-Riemannian manifold (implemented through Trac #24622). So if you upgrade to SageMath 8.2, you can declare an Euclidean space as a Riemannian manifold with a flat metric. It suffices to initialize the metric to the identity matrix in Cartesian coordinates:

sage: E = Manifold(3, 'E', structure='Riemannian')
sage: cartesian.<x,y,z> = E.chart()
sage: E.metric()[:] = identity_matrix(3)

Then, you can compute the curl of a vector field as follows:

sage: v = E.vector_field(name='v')
sage: v[:] = [-x*z, x+z, y^2]
sage: cv = v.curl()
sage: cv.display()
curl(v) = (2*y - 1) d/dx - x d/dy + d/dz
sage: cv[:]
[2*y - 1, -x, 1]

the divergence:

sage: dv = v.div()
sage: dv.display()
div(v): E --> R
   (x, y, z) |--> -z
sage: dv.expr()

the gradient:

sage: gdv = dv.gradient()
sage: gdv.display()
grad(div(v)) = -d/dz
sage: gdv[:]
[0, 0, -1]

the Laplacian:

sage: lv = v.laplacian()
sage: lv.display()
Delta(v) = 2 d/dz
sage: lv[:]
[0, 0, 2]

Instead of writing v.div(), you may use the notation div(v):

sage: from sage.manifolds.operators import *
sage: div(v) == v.div()

Let us check a famous identity:

sage: curl(curl(v)) == grad(div(v)) - laplacian(v)

EDIT (14 August 2018): SageMath 8.3 is out and it contains all the tools for standard vector calculus, with various predefined coordinate systems (Cartesian, spherical, cylindrical). See these example notebooks. For instance, the first 3 lines of the "EDIT (10 May 2018)" block above can now be replaced by a single line:

sage: E.<x,y,z> = EuclideanSpace()
edit flag offensive delete link more


That would be awesome !

tmonteil gravatar imagetmonteil ( 2018-01-27 15:22:11 +0200 )edit

Let me add a confirmed_bug tag to add some motivation in fixing that :P

tmonteil gravatar imagetmonteil ( 2018-01-28 22:28:00 +0200 )edit

That would be great. Thank you!

quantum_leopard gravatar imagequantum_leopard ( 2018-01-30 22:18:02 +0200 )edit

This is now tickets #24622 and #24623. Things are split in two tickets for the ease of the reviewer(s). Note that the code is not ready yet (it should be within a few days).

eric_g gravatar imageeric_g ( 2018-01-31 11:28:25 +0200 )edit

Here is some update: the first ticket, #24622, is ready for review. It already implements the operators grad, div, curl, laplacian and dalembertian, as you can see on this demo Jupyter notebook.

eric_g gravatar imageeric_g ( 2018-02-11 18:15:02 +0200 )edit

answered 2018-01-27 11:51:03 +0200

tmonteil gravatar image

updated 2018-01-27 11:52:33 +0200

I think all the material for this is available in the manifolds module, in particular changes of coordinates, though the operators are not explicitely written. This is a very good idea to implement this, and include it in Sage. Do not hesitate to try that module and report how far you can go with that. If you want to turn a chance into a reality, to you might consider becoming the kind person implementing these ;)

edit flag offensive delete link more

answered 2018-02-22 13:55:48 +0200

kcrisman gravatar image

See also this ask.sagemath question and Trac 3021, where this was implemented to some degree. I don't know whether the current implementation (e.g. curl) is what you need or not.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools



Asked: 2018-01-26 22:24:04 +0200

Seen: 1,835 times

Last updated: Aug 14 '18