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

Remove self.gauss_weights and self.area_weights from GFSDynamicalCore? #53

Open
mcgibbon opened this issue Jul 6, 2018 · 14 comments
Open

Comments

@mcgibbon
Copy link
Member

mcgibbon commented Jul 6, 2018

The Python attributes self.gauss_weights and self.area_weights on GFSDynamicalCore appear to never be used in CliMT. Can I remove them?

@JoyMonteiro
Copy link
Member

These were kept for future use. These weights are needed to perform area averaged mean. So, if the user wants to calculate such a quantity, he/she will need these weights. They could also be provided by sympl, but until such a time, these attributes are useful.

@mcgibbon
Copy link
Member Author

mcgibbon commented Jul 9, 2018

I'm unsure why there are both gauss_weights and area_weights - don't they both reflect the same thing? Instead of doing this, can I include latitude bounds in the grid output so that bounds[1:] - bounds[:-1] gives you the area weighting? It seems having this in the state and not on the GFS object is more appropriate, and that's the most appropriate way to store it in the state.

@JoyMonteiro
Copy link
Member

yes, just area_weights should suffice. I just exposed both to give the user a choice if necessary.

I suspect this quantity would be used fairly regularly, and therefore should be available by itself. I have no issues with it being available in state. With the new API to obtain the grid, it is probably easier to put this into state. There was no obvious way to do it earlier.

@mcgibbon
Copy link
Member Author

mcgibbon commented Jul 9, 2018

OK, in that case we should use some sort of standard name that implies surface area at that grid coordinate. area_weights isn't self-descriptive enough for my liking.

@mcgibbon
Copy link
Member Author

mcgibbon commented Jul 9, 2018

On the other hand, we should only put this in CliMT if you mean it would be "used fairly regularly" by CliMT itself. If the user is going to use area weights regularly, they are free to compute those from the latitude bounds and store them in the state themselves, and then use that as regularly as they like. We probably shouldn't include it because of the programming design principle that you only want to include the features necessary to meet your specs. We don't need to include this extra feature if our code never actually uses it and it's easy for users to do themselves when they need to. Having an extra state variable output by get_grid isn't without cost, and has cognitive overhead when new users are learning about and trying to understand the model.

@mcgibbon
Copy link
Member Author

mcgibbon commented Jul 9, 2018

Especially because we need to consider the fact that a user might, for example, manually specify an irregular longitude grid. If we put in area_weights to the state, those weights would be incorrect when they modify the longitude grid.

@JoyMonteiro
Copy link
Member

I'm still a little hazy on how grids are going to be handled in sympl 0.4, so I'm not sure what you mean that the user specifies the grid manually. My understanding was that there was some standard way to allowing the user to add grids and additional information (like area weights) to sympl, and this would get propagated to the model code that follows.

If that is not the case, then for the moment, I would suggest leaving the area_weights attribute (maybe use underscores to warn the user not to use it) and add a helper function that returns the area weights given a dynamical core. We could worry about this at a later time.

@mcgibbon
Copy link
Member Author

If you really think it's necessary, we should include a get_area_weights(state) helper function (actually a Diagnostic). I think for now we should remove it entirely and then worry about it at a later time if it seems necessary.

@JoyMonteiro
Copy link
Member

on the contrary, if someone runs the dycore and wants to analyse the output, it does not make sense that this information is not available easily. It has to be available easily, but I'm open about how it is made available.

@mcgibbon
Copy link
Member Author

mcgibbon commented Jul 10, 2018

It will be available easily, since the latitude and longitude bounds will be present in state. We can write a general purpose DiagnosticComponent that computes area weights from latitude and longitude bounds, if it's too much boilerplate for users to write weights = latitude_bounds[1:] - latitude_bounds[:-1].

@JoyMonteiro
Copy link
Member

guess I'm confused -- this code https://gist.github.com/ajdawson/b64d24dfac618b91974f seems to suggest calculating weights from latitudes is not as straightforward...

@mcgibbon
Copy link
Member Author

Actually that code suggests it's quite straightforward. The latitude bounds are the cumulative sum of the weights, which is to say the weights are the distances between consecutive latitude bounds.

@mcgibbon
Copy link
Member Author

Ah, no, you're right, it's not quite straightforward. Still, we should implement this using a Diagnostic. I'll include it in the set of initialization diagnostics, so that if you get_default_state using a component that needs area weighting it will include surface_area or area_weight or whatever in the state.

@JoyMonteiro
Copy link
Member

yes, was just writing back saying the same! sounds good.

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

No branches or pull requests

2 participants