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
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-11 16:22 +0000
1# -*- coding: utf-8 -*-
2"""
3Elements
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.
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.
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.
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"""
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
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]
52 @property
53 def dataset_number(self):
54 return 2412
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
125 def __repr__(self):
126 return 'Sdynpy_UFF_Dataset_2414<{} element(s)>'.format(len(self.element_labels))
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
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)
161def read(data):
162 return Sdynpy_UFF_Dataset_2412.from_uff_data_array(data)