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

Refactoring indexing and interpolation #1816

Draft
wants to merge 20 commits into
base: master
Choose a base branch
from
Draft

Conversation

VeckoTheGecko
Copy link
Contributor

@VeckoTheGecko VeckoTheGecko commented Jan 8, 2025

This PR refactors many of the indexing methods and interpolation methods out of field.py to make things more manageable and reduce the coupling with the Field class.

This also makes the interpolation functions more easily testable by providing only the required data.

Draft PR for early feedback

Copy link
Contributor Author

@VeckoTheGecko VeckoTheGecko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thoughts on the below @erikvansebille ? Let me know if you want me to break this into separate PRs

Comment on lines 227 to 259
"""
elif self.interp_method in ["linear", "bgrid_velocity", "bgrid_w_velocity", "partialslip", "freeslip"]:
if self.interp_method == "bgrid_velocity":
if self.gridindexingtype == "mom5":
zeta = 1.0
else:
zeta = 0.0
elif self.interp_method == "bgrid_w_velocity":
eta = 1.0
xsi = 1.0
data = self.data[ti, zi, :, :]
f0 = (
(1 - xsi) * (1 - eta) * data[yi, xi]
+ xsi * (1 - eta) * data[yi, xi + 1]
+ xsi * eta * data[yi + 1, xi + 1]
+ (1 - xsi) * eta * data[yi + 1, xi]
)
if self.gridindexingtype == "pop" and zi >= self.grid.zdim - 2:
# Since POP is indexed at cell top, allow linear interpolation of W to zero in lowest cell
return (1 - zeta) * f0
data = self.data[ti, zi + 1, :, :]
f1 = (
(1 - xsi) * (1 - eta) * data[yi, xi]
+ xsi * (1 - eta) * data[yi, xi + 1]
+ xsi * eta * data[yi + 1, xi + 1]
+ (1 - xsi) * eta * data[yi + 1, xi]
)
if self.interp_method == "bgrid_w_velocity" and self.gridindexingtype == "mom5" and zi == -1:
# Since MOM5 is indexed at cell bottom, allow linear interpolation of W to zero in uppermost cell
return zeta * f1
else:
return (1 - zeta) * f0 + zeta * f1
"""
Copy link
Contributor Author

@VeckoTheGecko VeckoTheGecko Jan 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This refactoring isn't as simple as "moving the code" like the other ones, as this needs to be separated into a couple interpolation functions. I'll add some tests to help with the refactor and make sure nothing changes

Also failing CI since I was midway through refactoring. 1c26ee4 has passing CI

Copy link
Contributor Author

@VeckoTheGecko VeckoTheGecko Jan 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of the changes here are about removing the custom inits. This was initially done to enable an approach to add_note (I opted for a different implementation of add_note anyway which didn't rely on this though).

Having custom init's for exception classes isn't used much in Python (and imo needlessly limits the exception class), but I wouldn't say its an important change. The only place I'd see its necessary is if its important that the user can programmatically access the exact x,y,z of the interpolation failure (as this was previously saved as state on the exception) - but I don't see that as an important feature.

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

Successfully merging this pull request may close these issues.

1 participant