1515import re
1616from collections .abc import Hashable , Iterable
1717from dataclasses import dataclass
18+ from textwrap import indent
1819from typing import Any , Literal , Protocol , Self , cast , overload
1920
2021import xarray as xr
@@ -571,6 +572,69 @@ def _face_node_padding_to_text(obj: DimDimPadding) -> list[str]:
571572 ]
572573
573574
575+ TEXT_GRID2D_WITHOUT_Z = """
576+ Staggered grid layout (symbolic 3x3 nodes):
577+
578+ ↑ Y
579+ |
580+ n --u-- n --u-- n
581+ | | |
582+ v · v · v
583+ | | |
584+ n --u-- n --u-- n
585+ | | |
586+ v · v · v
587+ | | |
588+ n --u-- n --u-- n --→ X
589+
590+ n = node ({n1}, {n2})
591+ u = x-face ({u})
592+ v = y-face ({v})
593+ · = cell centre"""
594+
595+ TEXT_GRID2D_WITH_Z = """
596+ Staggered grid layout (symbolic 3x3 nodes):
597+
598+ ↑ Y ↑ Z
599+ | |
600+ n --u-- n --u-- n w
601+ | | | |
602+ v · v · v ·
603+ | | | |
604+ n --u-- n --u-- n w
605+ | | | |
606+ v · v · v ·
607+ | | | |
608+ n --u-- n --u-- n --→ X w
609+
610+ n = node ({n1}, {n2})
611+ u = x-face ({u})
612+ v = y-face ({v})
613+ w = z-node ({w})
614+ · = cell centre"""
615+
616+ TEXT_GRID3D = """
617+ Staggered grid layout (XY cross-section; Z-faces not shown):
618+
619+ ↑ Y
620+ |
621+ n --u-- n --u-- n
622+ | | |
623+ v · v · v
624+ | | |
625+ n --u-- n --u-- n
626+ | | |
627+ v · v · v
628+ | | |
629+ n --u-- n --u-- n --→ X
630+
631+ n = node ({n1}, {n2}, {n3})
632+ u = x-face ({u})
633+ v = y-face ({v})
634+ w = z-face ({w}) [not shown in cross-section]
635+ · = cell centre"""
636+
637+
574638def _grid2d_to_ascii (grid : Grid2DMetadata ) -> str :
575639 fd = grid .face_dimensions
576640 nd = grid .node_dimensions
@@ -584,56 +648,15 @@ def _grid2d_to_ascii(grid: Grid2DMetadata) -> str:
584648 lines .append (f" Z-axis: face={ vd .dim1 !r} node={ vd .dim2 !r} padding={ vd .padding .value } " )
585649 if grid .node_coordinates :
586650 lines .append (f" Coordinates: { grid .node_coordinates [0 ]} , { grid .node_coordinates [1 ]} " )
587- if grid .vertical_dimensions :
588- vd = grid .vertical_dimensions [0 ]
589651
590- def _z (base : str , sym : str ) -> str :
591- return base .ljust (28 ) + sym
592-
593- lines += [
594- "" ,
595- " Staggered grid layout (symbolic 3x3 nodes):" ,
596- "" ,
597- _z (" ↑ Y" , "↑ Z" ),
598- _z (" |" , "|" ),
599- _z (" n --u-- n --u-- n" , "w" ),
600- _z (" | | |" , "|" ),
601- _z (" v · v · v" , "·" ),
602- _z (" | | |" , "|" ),
603- _z (" n --u-- n --u-- n" , "w" ),
604- _z (" | | |" , "|" ),
605- _z (" v · v · v" , "·" ),
606- _z (" | | |" , "|" ),
607- " n --u-- n --u-- n --→ X w" ,
608- "" ,
609- f" n = node ({ nd [0 ]} , { nd [1 ]} )" ,
610- f" u = x-face ({ fd [0 ].dim1 } )" ,
611- f" v = y-face ({ fd [1 ].dim1 } )" ,
612- f" w = z-node ({ vd .dim2 } )" ,
613- " · = cell centre" ,
614- ]
652+ format_kwargs = dict (n1 = nd [0 ], n2 = nd [1 ], u = fd [0 ].dim1 , v = fd [1 ].dim1 )
653+
654+ if grid .vertical_dimensions :
655+ format_kwargs ["w" ] = grid .vertical_dimensions [0 ].dim2
656+ lines += indent (TEXT_GRID2D_WITH_Z , " " ).format (** format_kwargs ).split ("\n " )
615657 else :
616- lines += [
617- "" ,
618- " Staggered grid layout (symbolic 3x3 nodes):" ,
619- "" ,
620- " ↑ Y" ,
621- " |" ,
622- " n --u-- n --u-- n" ,
623- " | | |" ,
624- " v · v · v" ,
625- " | | |" ,
626- " n --u-- n --u-- n" ,
627- " | | |" ,
628- " v · v · v" ,
629- " | | |" ,
630- " n --u-- n --u-- n --→ X" ,
631- "" ,
632- f" n = node ({ nd [0 ]} , { nd [1 ]} )" ,
633- f" u = x-face ({ fd [0 ].dim1 } )" ,
634- f" v = y-face ({ fd [1 ].dim1 } )" ,
635- " · = cell centre" ,
636- ]
658+ lines += indent (TEXT_GRID2D_WITHOUT_Z , " " ).format (** format_kwargs ).split ("\n " )
659+
637660 lines += ["" , " Axis padding:" , "" ]
638661 lines += _indent_lines (_face_node_padding_to_text (fd [0 ]))
639662 lines += ["" ]
@@ -655,28 +678,13 @@ def _grid3d_to_ascii(grid: Grid3DMetadata) -> str:
655678 ]
656679 if grid .node_coordinates :
657680 lines .append (f" Coordinates: { ', ' .join (grid .node_coordinates )} " )
658- lines += [
659- "" ,
660- " Staggered grid layout (XY cross-section; Z-faces not shown):" ,
661- "" ,
662- " ↑ Y" ,
663- " |" ,
664- " n --u-- n --u-- n" ,
665- " | | |" ,
666- " v · v · v" ,
667- " | | |" ,
668- " n --u-- n --u-- n" ,
669- " | | |" ,
670- " v · v · v" ,
671- " | | |" ,
672- " n --u-- n --u-- n --→ X" ,
673- "" ,
674- f" n = node ({ nd [0 ]} , { nd [1 ]} , { nd [2 ]} )" ,
675- f" u = x-face ({ vd [0 ].dim1 } )" ,
676- f" v = y-face ({ vd [1 ].dim1 } )" ,
677- f" w = z-face ({ vd [2 ].dim1 } ) [not shown in cross-section]" ,
678- " · = cell centre" ,
679- ]
681+
682+ lines += (
683+ indent (TEXT_GRID3D , " " )
684+ .format (n1 = nd [0 ], n2 = nd [1 ], n3 = nd [2 ], u = vd [0 ].dim1 , v = vd [1 ].dim1 , w = vd [2 ].dim1 )
685+ .split ("\n " )
686+ )
687+
680688 lines += ["" , " Axis padding:" , "" ]
681689 lines += _indent_lines (_face_node_padding_to_text (vd [0 ]))
682690 lines += ["" ]
0 commit comments