Skip to content

Adjust the bdy_lyr local script, and housekeeping#231

Open
MetBenjaminWent wants to merge 15 commits intoMetOffice:mainfrom
MetBenjaminWent:update_part_bdy_psy
Open

Adjust the bdy_lyr local script, and housekeeping#231
MetBenjaminWent wants to merge 15 commits intoMetOffice:mainfrom
MetBenjaminWent:update_part_bdy_psy

Conversation

@MetBenjaminWent
Copy link
Contributor

@MetBenjaminWent MetBenjaminWent commented Feb 9, 2026

PR Summary

remove_unspanable_nodes seems too fragile when there are additional timers involved.
Grabbing the first and last sensible node directly seems safer.
This can be swapped out for the parallel transformation coming from STFC hopefully in the future, which may be moved into the global script.
Remove some other parts which are not involved currently in the other scripts.

Also moving bl_diags_mod to the global script, which functionally does the same thing causes crashes.
For saftey, I'm turning this off. The original source OMP is fine for now, we can look at this again later.

Sci/Tech Reviewer: @oakleybrunt
Code Reviewer: @EdHone

Issue: #255
Umbrella Issue: #106

Code Quality Checklist

  • I have performed a self-review of my own code
  • My code follows the project's style guidelines
  • Comments have been included that aid understanding and enhance the readability of the code
  • My changes generate no new warnings
  • All automated checks in the CI pipeline have completed successfully

Testing

  • I have tested this change locally, using the LFRic Apps rose-stem suite
  • If any tests fail (rose-stem or CI) the reason is understood and acceptable (e.g. kgo changes)
  • I have added tests to cover new functionality as appropriate (e.g. system tests, unit tests, etc.)
  • Any new tests have been assigned an appropriate amount of compute resource and have been allocated to an appropriate testing group (i.e. the developer tests are for jobs which use a small amount of compute resource and complete in a matter of minutes)

trac.log

Test Suite Results - lfric_apps - update_part_bdy_psy/run11

Suite Information

Item Value
Suite Name update_part_bdy_psy/run11
Suite User benjamin.went
Workflow Start 2026-03-05T09:58:35
Groups Run ex1a_omp_developer
Dependency Reference Main Like
casim MetOffice/casim@2025.12.1 True
jules MetOffice/jules@69aaf4d True
lfric_apps MetBenjaminWent/lfric_apps@update_part_bdy_psy False
lfric_core MetOffice/lfric_core@87dce3c True
moci MetOffice/moci@2025.12.1 True
SimSys_Scripts MetOffice/SimSys_Scripts@2025.12.1 True
socrates MetOffice/socrates@2025.12.1 True
socrates-spectral MetOffice/socrates-spectral@2025.12.1 True
ukca MetOffice/ukca@2025.12.1 True

Task Information

✅ succeeded tasks - 51

Test Suite Results - lfric_apps - update_part_bdy_psy/run12

Suite Information

Item Value
Suite Name update_part_bdy_psy/run12
Suite User benjamin.went
Workflow Start 2026-03-05T09:59:44
Groups Run developer
Dependency Reference Main Like
casim MetOffice/casim@2025.12.1 True
jules MetOffice/jules@69aaf4d True
lfric_apps MetBenjaminWent/lfric_apps@update_part_bdy_psy False
lfric_core MetOffice/lfric_core@87dce3c True
moci MetOffice/moci@2025.12.1 True
SimSys_Scripts MetOffice/SimSys_Scripts@2025.12.1 True
socrates MetOffice/socrates@2025.12.1 True
socrates-spectral MetOffice/socrates-spectral@2025.12.1 True
ukca MetOffice/ukca@2025.12.1 True

Task Information

❌ failed tasks - 1
Task State
run_adjoint_tests_nwp_gal9-C12_MG_azspice_gnu_production-32bit failed
See below rerun at HoT
✅ succeeded tasks - 1165

Test Suite Results - lfric_apps - update_part_bdy_psy/run13

Suite Information

Item Value
Suite Name update_part_bdy_psy/run13
Suite User benjamin.went
Workflow Start 2026-03-05T13:42:14
Groups Run adjoint_tests_nwp_gal9-C12_MG_azspice_gnu_production-32bit
Dependency Reference Main Like
casim MetOffice/casim@2026.03.1 True
jules MetOffice/jules@2026.03.1 True
lfric_apps MetBenjaminWent/lfric_apps@update_part_bdy_psy False
lfric_core MetOffice/lfric_core@2026.03.1 True
moci MetOffice/moci@2026.03.1 True
SimSys_Scripts MetOffice/SimSys_Scripts@2026.03.1 True
socrates MetOffice/socrates@2026.03.1 True
socrates-spectral MetOffice/socrates-spectral@2026.03.1 True
ukca MetOffice/ukca@2026.03.1 True

Task Information

✅ succeeded tasks - 7

Security Considerations

  • I have reviewed my changes for potential security issues
  • Sensitive data is properly handled (if applicable)
  • Authentication and authorisation are properly implemented (if applicable)

Performance Impact

  • Performance of the code has been considered and, if applicable, suitable performance measurements have been conducted

AI Assistance and Attribution

  • Some of the content of this change has been produced with the assistance of Generative AI tool name (e.g., Met Office Github Copilot Enterprise, Github Copilot Personal, ChatGPT GPT-4, etc) and I have followed the Simulation Systems AI policy (including attribution labels)

Documentation

  • Where appropriate I have updated documentation related to this change and confirmed that it builds correctly

PSyclone Approval

  • If you have edited any PSyclone-related code (e.g. PSyKAl-lite, Kernel interface, optimisation scripts, LFRic data structure code) then please contact the TCD Team

Sci/Tech Review

  • I understand this area of code and the changes being added
  • The proposed changes correspond to the pull request description
  • Documentation is sufficient (do documentation papers need updating)
  • Sufficient testing has been completed

(Please alert the code reviewer via a tag when you have approved the SR)

Code Review

  • All dependencies have been resolved
  • Related Issues have been properly linked and addressed
  • CLA compliance has been confirmed
  • Code quality standards have been met
  • Tests are adequate and have passed
  • Documentation is complete and accurate
  • Security considerations have been addressed
  • Performance impact is acceptable

@MetBenjaminWent MetBenjaminWent changed the title Adjust how the bdy_lyr local script, and housekeeping Adjust the bdy_lyr local script, and housekeeping Feb 11, 2026
@MetBenjaminWent MetBenjaminWent marked this pull request as ready for review February 11, 2026 11:41
Copy link
Contributor

@oakleybrunt oakleybrunt left a comment

Choose a reason for hiding this comment

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

Thanks Ben, this looks like a good change with some nice flexibility. Can you have a look over my suggested changes, I think they are slightly clearer than what was proposed.

Comment on lines +146 to +158
found_valid_if = True
# Often timing handles are placed inside if blocks,
# check if it is not a known timing call, which should be
# ignored for spanning a parallel section.
for routine_grandchild in routine_child.walk(Reference):
try:
if str(routine_grandchild.name) in timer_routine_names:
found_valid_if = False
except ValueError: # noqa: E722
continue
if found_valid_if:
start_node = index
break
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
found_valid_if = True
# Often timing handles are placed inside if blocks,
# check if it is not a known timing call, which should be
# ignored for spanning a parallel section.
for routine_grandchild in routine_child.walk(Reference):
try:
if str(routine_grandchild.name) in timer_routine_names:
found_valid_if = False
except ValueError: # noqa: E722
continue
if found_valid_if:
start_node = index
break
# Often timing handles are placed inside if blocks,
# check if it is not a known timing call, which should be
# ignored for spanning a parallel section.
for routine_grandchild in routine_child.walk(Reference):
if str(routine_grandchild.name) in timer_routine_names:
# Start node remains None.
start_node = None
break
else:
# Set the start node to the index and keep checking
# grandchildren for calls that invalidate.
# If all are valid, start_node still equals index.
start_node = index
# Now check if we have a satisfactory start node.
if start_node is not None:
break

You can break out of this for loop much quicker by using this setup. I have tested this on bl_diags_mod.F90 and the PSyclone generated output is the same.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

My only concern with this, and why I opted for a try / except, is when PSyclone runs into an occurrence where a grandchild node doesn't have a name property, it will just crash.

Wrapping it in a try / except protects us from this.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

But the breaking early on a if not none test I'm pro

Copy link
Contributor

Choose a reason for hiding this comment

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

I wasn't aware of that. Perhaps adding this in a comment would be a good idea?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No worries, hopefully this covers it:
4ff21c4

Copy link
Contributor Author

Choose a reason for hiding this comment

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

And for above and below SR advice with try / except preserved:
86496e8

Comment on lines +169 to +179
found_valid_if = True
for routine_grandchild in \
routine_children[index].walk(Reference):
try:
if str(routine_grandchild.name) in timer_routine_names:
found_valid_if = False
except ValueError: # noqa: E722
continue
if found_valid_if:
end_node = index + 1
break
Copy link
Contributor

Choose a reason for hiding this comment

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

Again, this can be simplified and will be faster than the original. Also tested on bl_diags_mod.F90.

Suggested change
found_valid_if = True
for routine_grandchild in \
routine_children[index].walk(Reference):
try:
if str(routine_grandchild.name) in timer_routine_names:
found_valid_if = False
except ValueError: # noqa: E722
continue
if found_valid_if:
end_node = index + 1
break
for routine_grandchild in \
routine_children[index].walk(Reference):
if str(routine_grandchild.name) in timer_routine_names:
# end_node remains None.
end_node = None
break
else:
# Otherwise, set to correct position and continue
# checking for calls that invalidate this.
end_node = index + 1
# Now check to see if we have a satisfactory end_node
if end_node is not None:
break

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Same as above

@MetBenjaminWent MetBenjaminWent requested review from jennyhickson and oakleybrunt and removed request for a team March 2, 2026 11:18
@MetBenjaminWent
Copy link
Contributor Author

MetBenjaminWent commented Mar 4, 2026

Changes have been made in line with SR requests, back to SR @oakleybrunt

@oakleybrunt
Copy link
Contributor

Thanks Ben, would you mind re-running the developer test suite please?

@MetBenjaminWent
Copy link
Contributor Author

All latest testing are passing, I've done some local generation too just to visually confirm that nothing's changed, and they all were fine. Back to SR.

@github-actions github-actions bot requested a review from mo-lottieturner March 5, 2026 14:29
@jennyhickson jennyhickson removed the request for review from mo-lottieturner March 6, 2026 08:44
@github-actions github-actions bot requested a review from EdHone March 6, 2026 08:44
Copy link
Contributor

@EdHone EdHone left a comment

Choose a reason for hiding this comment

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

Some nitpicks and a question about the logic in the tree walk - otherwise looks solid!

elif isinstance(routine_child, IfBlock):
# Often timing handles are placed inside if blocks,
# check if it is not a known timing call, which should be
# ignored for spanning a parallel section.
Copy link
Contributor

Choose a reason for hiding this comment

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

Does this mean that if a timer call is present the is no parallel transformation?

Copy link
Contributor Author

@MetBenjaminWent MetBenjaminWent Mar 17, 2026

Choose a reason for hiding this comment

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

It means that that node (the if block around a timer) won't be placed inside a parallel region. For these specific files, where this script will be used, that's generally the method for protecting the timer/vernier calls.

To be fair a over a call node might be handy to filter out too, but this functionality is likely going to get replaced by the STFC one in the midish future. These changes are mainly to fix what isn't too solid on trunk.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

But also if there are if blocks at the start, which might wrap a loop, they can be considered

Copy link
Contributor Author

Choose a reason for hiding this comment

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

MetBenjaminWent and others added 2 commits March 17, 2026 10:53
Co-authored-by: Ed Hone <68642690+EdHone@users.noreply.github.com>
@MetBenjaminWent
Copy link
Contributor Author

@EdHone, thanks for the CR, your checks were good thanks!

Hopefully your remaining query (not adjusted by the commit) should be answered, and the branch otherwise updated and suitable for CR.

@MetBenjaminWent MetBenjaminWent requested a review from EdHone March 17, 2026 10:56
Copy link
Contributor

@EdHone EdHone left a comment

Choose a reason for hiding this comment

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

CR approved

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 this pull request may close these issues.

5 participants