Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Labeling of coordinates in cylindrical (and spherical) meshes #15

Closed
mhvwerts opened this issue Aug 27, 2023 · 9 comments · Fixed by #34
Closed

Labeling of coordinates in cylindrical (and spherical) meshes #15

mhvwerts opened this issue Aug 27, 2023 · 9 comments · Fixed by #34

Comments

@mhvwerts
Copy link
Member

mhvwerts commented Aug 27, 2023

PyFVTool systematically uses the labels x, y and z to represent the first, second resp. third coordinate, irrespective of the mesh geometry (Cartesian, cylindrical, spherical). This is important especially for internal code consistency and keeping the code base simple and free from Pythonic wizardry which may generate head-aches. Once used to it, this is OK, and one writes, e.g.,

import pyfvtool as pf
msh = pf.createMeshCylindrical2D(Nr, Nz, Lr, Lz)
rr = msh.cellcenters.x
zz = msh.facecenters.y

However, it would still be nice, one day, to consider the possibilities for adapting the programming interface to cellcenters and facecenters (and createMeshCylindrical etc.) such that the user would only see and use r, z (and theta, phi) when working with cylindrical or spherical meshes. This would improve the readability of the user's code and even avoid some errors. Internally, PyFVTool would continue to use labels x, y and z, but this would be invisible to the user, and translated by the functions and methods for creating and accessing meshes.

I have some vague ideas how this could be achieved in a relatively simple manner, but already wondering if @simulkade thinks if this is somewhere remotely feasible and desirable, and what others would think of such a new feature.

@simulkade
Copy link
Member

Funny you mentioned it @mhvwerts. I was working on a software that switches between Cartesian and Cylindrical coordinates, with some strange BCs changing with time. I found myself looking at the source code a couple of times because I was not sure about what x and y means, mostly for xvalue and yvalue of FaceVariables. I think it is a good idea to find a simple solution for it. I had a vague idea for defining subclasses, but cannot test them before the mid-September. All in all, I must admit it is a very desirable feature to have.

@mhvwerts
Copy link
Member Author

Oh yeah, xvalue and yvalue of FaceVariables, I forgot to mention those... I am experimenting with convection-diffusion in 2D cylindrical (typical Taylor dispersion experiment) as this is a relevant test case and it took some trial-and-error to set up the convective term (velocity component in z direction, magnitude dependent on r).

Let's give it time. IMO, implementing this feature should be done in one run, and probably best that I make sure that we have a decently working pytest (#12) before such an undertaking as it may break stuff.

@simulkade
Copy link
Member

Absolutely agree. Let's keep it as an open issue. I usually do some python-therapy when I get to busy with writing tasks. If I come up with a good idea, I will write it here.

@simulkade
Copy link
Member

simulkade commented Aug 28, 2023

I just tried Co-pilot and it suggests using property decorators:

class MyClass:
    def __init__(self, xvalue, yvalue):
        self.xvalue = xvalue
        self.yvalue = yvalue
    
    @property
    def rvalue(self):
        return self.xvalue
    
    @rvalue.setter
    def rvalue(self, value):
        self.xvalue = value
    
    @property
    def zvalue(self):
        return self.yvalue
    
    @zvalue.setter
    def zvalue(self, value):
        self.yvalue = value

The same thing can be done with a subclass. We also need to define subclasses of FaceVariable for different coordinates and then use the decorators.

@mhvwerts
Copy link
Member Author

mhvwerts commented Aug 29, 2023

That's an interesting suggestion. It may be wise, perhaps necessary, to combine this with renaming the 'internal' x, y, z to _x, _y, _z (or x_ ...). I see two reasons to do so:

  1. Avoiding a conflict for 2D cylindrical, where the name z becomes ambiguous: 'exterior/user' z refers to 'internal' y, but what happens with the 'internal' z? (I am not sure if the internal z exists in 2D cylindrical, I know it is of no use. The conflict will surely exist for 3D cylindrical.)
  2. Readability of the PyFVTool code: clear identification whether a coordinate label refers to the 'user' labeling or to the 'internal' labeling (this may save headaches later on)

@simulkade
Copy link
Member

I agree. They cannot be hidden from the user but the underscore can help. This z being y in cylindrical coordinate is one of those stupid thing I realized later like all other stupid things I have done in my life :-))

@mhvwerts
Copy link
Member Author

The re-labeling strategy might consist of a well-targeted and supervised find-and-replace of .x .y .z by ._x ._y ._z followed by fixing any errors that occur through adapting/providing subclasses or changing the user code. Do you think that that might work?

@simulkade
Copy link
Member

It will work but needs some work. I wish Python would let us define private attributes but it is not the case.

@mhvwerts
Copy link
Member Author

The underscore at the beginning of the attribute name should be enough a deterrent for the casual user not to touch these attributes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants