Coverage for src / sdynpy / fileio / sdynpy_uff_datasets / sdynpy_uff_dataset_2412.py: 20%

69 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-11 16:22 +0000

1# -*- coding: utf-8 -*- 

2""" 

3Elements 

4 

5This dataset defines the elements in a test geometry 

6""" 

7""" 

8Copyright 2022 National Technology & Engineering Solutions of Sandia, 

9LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 

10Government retains certain rights in this software. 

11 

12This program is free software: you can redistribute it and/or modify 

13it under the terms of the GNU General Public License as published by 

14the Free Software Foundation, either version 3 of the License, or 

15(at your option) any later version. 

16 

17This program is distributed in the hope that it will be useful, 

18but WITHOUT ANY WARRANTY; without even the implied warranty of 

19MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

20GNU General Public License for more details. 

21 

22You should have received a copy of the GNU General Public License 

23along with this program. If not, see <https://www.gnu.org/licenses/>. 

24""" 

25 

26from ..sdynpy_uff import UFFReadError, parse_uff_line, parse_uff_lines, write_uff_line 

27from ...core.sdynpy_geometry import _beam_elem_types 

28from ...core import sdynpy_colors 

29import numpy as np 

30 

31 

32class Sdynpy_UFF_Dataset_2412: 

33 def __init__(self, element_labels=[1], 

34 fe_descriptor_ids=[161], 

35 physical_property_table_numbers=None, # [1], 

36 material_property_table_numbers=None, # [1], 

37 colors=[1], 

38 connectivities=[[1]], 

39 beam_orientations=None, # [None], 

40 beam_fore_cross_section_numbers=None, #[None], 

41 beam_aft_cross_section_numbers=None): #[None]): 

42 self.element_labels = element_labels 

43 self.fe_descriptor_ids = fe_descriptor_ids 

44 self.physical_property_table_numbers = physical_property_table_numbers if physical_property_table_numbers is not None else [1 for conn in connectivities] 

45 self.material_property_table_numbers = material_property_table_numbers if material_property_table_numbers is not None else [1 for conn in connectivities] 

46 self.colors = colors 

47 self.connectivities = connectivities 

48 self.beam_orientations = beam_orientations if beam_orientations is not None else [None for conn in connectivities] 

49 self.beam_fore_cross_section_numbers = beam_fore_cross_section_numbers if beam_fore_cross_section_numbers is not None else [None for conn in connectivities] 

50 self.beam_aft_cross_section_numbers = beam_aft_cross_section_numbers if beam_aft_cross_section_numbers is not None else [None for conn in connectivities] 

51 

52 @property 

53 def dataset_number(self): 

54 return 2412 

55 

56 @classmethod 

57 def from_uff_data_array(cls, data): 

58 # Transform from binary to ascii 

59 data = [line.decode() for line in data] 

60 element_labels = [] 

61 fe_descriptor_ids = [] 

62 physical_property_table_numbers = [] 

63 material_property_table_numbers = [] 

64 colors = [] 

65 connectivities = [] 

66 beam_orientations = [] 

67 beam_fore_cross_section_numbers = [] 

68 beam_aft_cross_section_numbers = [] 

69 index = 0 

70 while index < len(data): 

71 # Record 1: FORMAT(6I10) 

72 # Field 1 -- element label 

73 # Field 2 -- fe descriptor id 

74 # Field 3 -- physical property table number 

75 # Field 4 -- material property table number 

76 # Field 5 -- color 

77 # Field 6 -- number of nodes on element 

78 element_label, fe_descriptor_id, physical_property_table_number, material_property_table_number, color, number_nodes = ( 

79 parse_uff_line(data[index], 6 * ['I10'])) 

80 if fe_descriptor_id in _beam_elem_types: 

81 # Record 2: *** FOR BEAM ELEMENTS ONLY *** 

82 # FORMAT(3I10) 

83 # Field 1 -- beam orientation node number 

84 # Field 2 -- beam fore-end cross section number 

85 # Field 3 -- beam aft-end cross section number 

86 beam_orientation, beam_fore_cross_section_number, beam_aft_cross_section_number = parse_uff_line( 

87 data[index + 1], 3 * ['I10']) 

88# Record 3: *** FOR BEAM ELEMENTS ONLY *** 

89# FORMAT(8I10) 

90# Fields 1-n -- node labels defining element 

91 connectivity, read_lines = parse_uff_lines( 

92 data[index + 2:], 8 * ['I10'], number_nodes) 

93 index += read_lines + 2 

94 else: 

95 # Record 2: *** FOR NON-BEAM ELEMENTS *** 

96 # FORMAT(8I10) 

97 # Fields 1-n -- node labels defining element 

98 beam_orientation = 0 

99 beam_fore_cross_section_number = 0 

100 beam_aft_cross_section_number = 0 

101 connectivity, read_lines = parse_uff_lines( 

102 data[index + 1:], 8 * ['I10'], number_nodes) 

103 index += read_lines + 1 

104 element_labels.append(element_label) 

105 fe_descriptor_ids.append(fe_descriptor_id) 

106 physical_property_table_numbers.append(physical_property_table_number) 

107 material_property_table_numbers.append(material_property_table_number) 

108 colors.append(color) 

109 connectivities.append(connectivity) 

110 beam_orientations.append(beam_orientation) 

111 beam_fore_cross_section_numbers.append(beam_fore_cross_section_number) 

112 beam_aft_cross_section_numbers.append(beam_aft_cross_section_number) 

113 # Make sure beam_props and connectivity don't end up being 2D 

114 ds_2412 = cls(element_labels, 

115 fe_descriptor_ids, 

116 physical_property_table_numbers, 

117 material_property_table_numbers, 

118 colors, 

119 connectivities, 

120 beam_orientations, 

121 beam_fore_cross_section_numbers, 

122 beam_aft_cross_section_numbers) 

123 return ds_2412 

124 

125 def __repr__(self): 

126 return 'Sdynpy_UFF_Dataset_2414<{} element(s)>'.format(len(self.element_labels)) 

127 

128 def write_string(self): 

129 return_string = '' 

130 for (element_label, fe_descriptor_id, physical_property_table_number, 

131 material_property_table_number, color, connectivity, beam_orientation, 

132 beam_fore_cross_section_number, beam_aft_cross_section_number) in zip( 

133 self.element_labels, 

134 self.fe_descriptor_ids, 

135 self.physical_property_table_numbers, 

136 self.material_property_table_numbers, 

137 self.colors, 

138 self.connectivities, 

139 self.beam_orientations, 

140 self.beam_fore_cross_section_numbers, 

141 self.beam_aft_cross_section_numbers): 

142 return_string += write_uff_line([element_label, fe_descriptor_id, 

143 physical_property_table_number, 

144 material_property_table_number, 

145 color, len(connectivity)], 

146 6 * ['I10']) 

147 if fe_descriptor_id in _beam_elem_types: 

148 return_string += write_uff_line( 

149 [beam_orientation, beam_fore_cross_section_number, beam_aft_cross_section_number], 3 * ['I10']) 

150 return_string += write_uff_line(connectivity, 8 * ['I10']) 

151 return return_string 

152 

153 def __str__(self): 

154 lines = self.write_string().split('\n') 

155 if len(lines) > 8: 

156 return 'Dataset 2412: Elements\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 

157 else: 

158 return 'Dataset 2412: Elements\n ' + '\n '.join(lines) 

159 

160 

161def read(data): 

162 return Sdynpy_UFF_Dataset_2412.from_uff_data_array(data)