33import copy
44from pathlib import Path
55
6+ import CGNS .PAT .cgnslib as CGL
67import CGNS .PAT .cgnskeywords as CGK
78import CGNS .PAT .cgnsutils as CGU
89import numpy as np
@@ -573,9 +574,7 @@ def test_del_zone_no_cgns_tree(self, sample: Sample):
573574
574575 def test_has_zone (self , sample , base_name , zone_name ):
575576 sample .init_base (3 , 3 , base_name )
576- sample .init_zone (
577- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
578- )
577+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
579578 sample .show_tree ()
580579 assert sample .features .has_zone (zone_name , base_name )
581580 assert not sample .features .has_zone ("not_present_zone_name" , base_name )
@@ -617,18 +616,14 @@ def test_get_zone_type(self, sample: Sample, zone_name, base_name):
617616 sample .init_base (3 , 3 , base_name )
618617 with pytest .raises (KeyError ):
619618 sample .features .get_zone_type (zone_name , base_name )
620- sample .init_zone (
621- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
622- )
619+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
623620 assert sample .features .get_zone_type (zone_name , base_name ) == CGK .Unstructured_s
624621
625622 def test_get_zone (self , sample : Sample , zone_name , base_name ):
626623 assert sample .features .get_zone (zone_name , base_name ) is None
627624 sample .init_base (3 , 3 , base_name )
628625 assert sample .features .get_zone (zone_name , base_name ) is None
629- sample .init_zone (
630- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
631- )
626+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
632627 assert sample .features .get_zone () is not None
633628 assert sample .features .get_zone (zone_name , base_name ) is not None
634629 sample .init_zone (
@@ -651,6 +646,21 @@ def test_get_global_names_at_specific_time(self, sample: Sample):
651646 assert sample .get_global_names (time = 0.0 ) == ["g_t0" ]
652647 assert sample .get_global_names (time = 1.0 ) == ["g_t1" ]
653648
649+ def test_add_global_string_and_update_existing (self , sample : Sample ):
650+ sample .add_global ("g_str" , "abc" )
651+ value = sample .get_global ("g_str" )
652+ assert isinstance (value , np .ndarray )
653+ assert value .tobytes ().decode ("ascii" ) == "abc"
654+
655+ sample .add_global ("g_str" , np .array ([7.0 ]))
656+ assert sample .get_global ("g_str" ) == 7.0
657+
658+ def test_get_global_names_excludes_time_arrays (self , sample : Sample ):
659+ sample .init_base (2 , 2 , "Base_2_2" , time = 0.0 )
660+ sample .add_global ("kept_name" , np .array ([1.0 ]), time = 0.0 )
661+ names = sample .get_global_names (time = 0.0 )
662+ assert names == ["kept_name" ]
663+
654664 def test_get_scalar_empty (self , sample ):
655665 assert sample .get_global ("missing_scalar_name" ) is None
656666
@@ -709,7 +719,9 @@ def test_add_feature(self, sample_with_tree3d):
709719 def test_del_feature (self , sample_with_scalar : Sample , sample_with_tree3d : Sample ):
710720 sample_with_scalar .del_feature_by_path (path = "Global/test_scalar_1" )
711721 assert sample_with_scalar .get_all_features_identifiers_by_type ("scalar" ) == []
712- sample_with_tree3d .del_feature_by_path ("Base_2_3/Zone/VertexFields/test_node_field_1" )
722+ sample_with_tree3d .del_feature_by_path (
723+ "Base_2_3/Zone/VertexFields/test_node_field_1"
724+ )
713725
714726 # -------------------------------------------------------------------------#
715727 def test_get_nodal_tags_empty (self , sample ):
@@ -737,15 +749,38 @@ def test_get_nodes_unknown_coordinate_name(self, sample_with_tree):
737749 with pytest .raises (ValueError ):
738750 sample_with_tree .get_nodes (name = "UnknownCoordinate" )
739751
752+ # def test_get_nodes_returns_none_without_gridcoordinates(
753+ # self, sample: Sample, base_name: str, zone_name: str
754+ # ):
755+ # sample.init_base(2, 2, base_name)
756+ # sample.init_zone(np.array([3, 0, 0]), zone=zone_name, base=base_name)
757+ # zone_node = sample.features.get_zone(zone=zone_name, base=base_name)
758+ # gc_node = CGU.getNodeByPath(zone_node, "GridCoordinates")
759+ # assert gc_node is not None
760+ # CGU.nodeDelete(zone_node, gc_node)
761+ # assert sample.get_nodes(zone=zone_name, base=base_name) is None
762+
740763 def test_set_nodes (self , sample , nodes , zone_name , base_name ):
741764 sample .init_base (3 , 3 , base_name )
742765 with pytest .raises (KeyError ):
743766 sample .set_nodes (nodes , zone_name , base_name )
744- sample .init_zone (
745- np .array ([len (nodes ), 0 , 0 ]), zone = zone_name , base = base_name
746- )
767+ sample .init_zone (np .array ([len (nodes ), 0 , 0 ]), zone = zone_name , base = base_name )
747768 sample .set_nodes (nodes , zone_name , base_name )
748769
770+ def test_set_nodes_replaces_existing_coordinates (
771+ self , sample : Sample , base_name : str , zone_name : str
772+ ):
773+ sample .init_base (3 , 3 , base_name )
774+ sample .init_zone (np .array ([3 , 0 , 0 ]), zone = zone_name , base = base_name )
775+
776+ nodes_a = np .array ([[0.0 , 0.0 ], [1.0 , 0.0 ], [1.0 , 1.0 ]])
777+ nodes_b = np .array ([[2.0 , 2.0 ], [3.0 , 2.0 ], [3.0 , 3.0 ]])
778+ sample .set_nodes (nodes_a , zone = zone_name , base = base_name )
779+ sample .set_nodes (nodes_b , zone = zone_name , base = base_name )
780+
781+ got = sample .get_nodes (zone = zone_name , base = base_name )
782+ assert np .allclose (got , nodes_b )
783+
749784 # -------------------------------------------------------------------------#
750785 def test_get_elements_empty (self , sample : Sample ):
751786 assert sample .features .get_elements () == {}
@@ -768,18 +803,10 @@ def test_get_field_names_several_bases(self):
768803 sample = Sample ()
769804 sample .init_tree (time = - 0.1 )
770805 sample .init_tree (time = 1.0 )
771- sample .init_base (
772- topological_dim = 1 , physical_dim = 2 , base = "Base_1_2" , time = - 0.1
773- )
774- sample .init_base (
775- topological_dim = 2 , physical_dim = 2 , base = "Base_2_2" , time = - 0.1
776- )
777- sample .init_base (
778- topological_dim = 1 , physical_dim = 3 , base = "Base_1_3" , time = 1.0
779- )
780- sample .init_base (
781- topological_dim = 3 , physical_dim = 3 , base = "Base_3_3" , time = 1.0
782- )
806+ sample .init_base (topological_dim = 1 , physical_dim = 2 , base = "Base_1_2" , time = - 0.1 )
807+ sample .init_base (topological_dim = 2 , physical_dim = 2 , base = "Base_2_2" , time = - 0.1 )
808+ sample .init_base (topological_dim = 1 , physical_dim = 3 , base = "Base_1_3" , time = 1.0 )
809+ sample .init_base (topological_dim = 3 , physical_dim = 3 , base = "Base_3_3" , time = 1.0 )
783810 sample .init_zone (
784811 zone_shape = np .array ([[5 , 3 , 0 ]]),
785812 zone = "Zone_1" ,
@@ -998,6 +1025,28 @@ def test_get_field(self, sample_with_tree):
9981025 "test_elem_field_1" , location = "CellCenter"
9991026 ).shape == (3 ,)
10001027
1028+ def test_get_field_from_user_defined_data_lowercase_gridlocation (
1029+ self , sample : Sample , base_name : str , zone_name : str
1030+ ):
1031+ sample .init_base (2 , 2 , base_name )
1032+ sample .init_zone (np .array ([3 , 0 , 0 ]), zone = zone_name , base = base_name )
1033+
1034+ zone_node = sample .features .get_zone (zone = zone_name , base = base_name )
1035+ udd = CGL .newUserDefinedData (zone_node , "ItgPointData" )
1036+ CGL .newDataArray (
1037+ udd ,
1038+ "gridlocation" ,
1039+ value = np .frombuffer ("Vertex" .encode ("ascii" ), dtype = "S1" ),
1040+ )
1041+ CGL .newDataArray (udd , "my_udd_field" , value = np .array ([1.0 , 2.0 , 3.0 ]))
1042+
1043+ assert (
1044+ sample .get_field ("my_udd_field" , zone = zone_name , base = base_name ) is not None
1045+ )
1046+ assert "my_udd_field" in sample .get_field_names (
1047+ zone = zone_name , base = base_name , location = "Vertex"
1048+ )
1049+
10011050 def test_add_field_vertex (self , sample : Sample , vertex_field , zone_name , base_name ):
10021051 sample .init_base (3 , 3 , base_name )
10031052 with pytest .raises (KeyError ):
@@ -1014,9 +1063,7 @@ def test_add_field_vertex(self, sample: Sample, vertex_field, zone_name, base_na
10141063 zone = zone_name ,
10151064 base = base_name ,
10161065 )
1017- sample .init_zone (
1018- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
1019- )
1066+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
10201067 sample .add_field (
10211068 name = "test_node_field_2" ,
10221069 field = vertex_field ,
@@ -1043,9 +1090,7 @@ def test_add_field_cell_center(
10431090 zone = zone_name ,
10441091 base = base_name ,
10451092 )
1046- sample .init_zone (
1047- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
1048- )
1093+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
10491094 sample .add_field (
10501095 name = "test_elem_field_2" ,
10511096 location = "CellCenter" ,
@@ -1117,9 +1162,7 @@ def test_del_field_nonexistent(self, base_name):
11171162 def test_del_field_in_zone (self , zone_name , base_name , cell_center_field ):
11181163 sample = Sample ()
11191164 sample .init_base (3 , 3 , base_name )
1120- sample .init_zone (
1121- np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name
1122- )
1165+ sample .init_zone (np .array ([[5 , 3 , 0 ]]), zone = zone_name , base = base_name )
11231166 sample .add_field (
11241167 name = "test_elem_field_1" ,
11251168 field = cell_center_field ,
0 commit comments