Coverage for src / sdynpy / fileio / sdynpy_uff_datasets / sdynpy_uff_dataset_151.py: 15%

81 statements  

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

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

2""" 

3Header 

4 

5This dataset defines the header for a universal file 

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 

26import datetime 

27from ..sdynpy_uff import UFFReadError, parse_uff_line, write_uff_line 

28 

29 

30class Sdynpy_UFF_Dataset_151: 

31 def __init__(self, model_file_name='', model_file_description='', 

32 db_program='sdynpy', db_date_created=None, db_version=0, 

33 db_subversion=0, file_type=0, date_db_last_saved=None, 

34 writing_program='sdynpy.fileio.sdynpy_uff.py', 

35 date_written=None, release=0, version_number=0, 

36 host_id=0, test_id=0, release_counter_per_host=0): 

37 now = datetime.datetime.now() 

38 self.model_file_name = model_file_name 

39 self.model_file_description = model_file_description 

40 self.db_program = db_program 

41 if db_date_created is None: 

42 self.db_date_created = now 

43 else: 

44 if not isinstance(db_date_created, datetime.datetime): 

45 raise ValueError('db_date_created should be a datetime.datetime object or None') 

46 self.db_date_created = db_date_created 

47 self.db_version = db_version 

48 self.db_subversion = db_subversion 

49 self.file_type = file_type 

50 if date_db_last_saved is None: 

51 self.date_db_last_saved = now 

52 else: 

53 if not isinstance(date_db_last_saved, datetime.datetime): 

54 raise ValueError('date_db_last_saved should be a datetime.datetime object or None') 

55 self.date_db_last_saved = date_db_last_saved 

56 self.writing_program = writing_program 

57 if date_written is None: 

58 self.date_written = now 

59 else: 

60 if not isinstance(date_written, datetime.datetime): 

61 raise ValueError('date_written should be a datetime.datetime object or None') 

62 self.date_written = date_written 

63 self.release = release 

64 self.version_number = version_number 

65 self.host_id = host_id 

66 self.test_id = test_id 

67 self.release_counter_per_host = release_counter_per_host 

68 

69 @property 

70 def dataset_number(self): 

71 return 151 

72 

73 @classmethod 

74 def from_uff_data_array(cls, data): 

75 # Transform from binary to ascii 

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

77 ds_151 = cls() 

78 # Record 1: FORMAT(80A1) 

79 # Field 1 -- model file name 

80 ds_151.model_file_name, = parse_uff_line(data[0], ['A80']) 

81 # Record 2: FORMAT(80A1) 

82 # Field 1 -- model file description 

83 ds_151.model_file_description, = parse_uff_line(data[1], ['A80']) 

84 # Record 3: FORMAT(80A1) 

85 # Field 1 -- program which created DB 

86 ds_151.db_program, = parse_uff_line(data[2], ['A80']) 

87 # Record 4: FORMAT(10A1,10A1,3I10) 

88 # Field 1 -- date database created (DD-MMM-YY) 

89 # Field 2 -- time database created (HH:MM:SS) 

90 # Field 3 -- Version from database 

91 # Field 4 -- Subversion from database 

92 # Field 5 -- File type 

93 # =0 Universal 

94 # =1 Archive 

95 # =2 Other 

96 # Note that this script reads the date and time together as one field 

97 (date_time, ds_151.db_version, ds_151.db_subversion, ds_151.file_type) = ( 

98 parse_uff_line(data[3], ['A20'] + 3 * ['I10'])) 

99 try: 

100 ds_151.db_date_created = datetime.datetime.strptime( 

101 ''.join(date_time.split()), '%d-%b-%y%H:%M:%S') 

102 except ValueError: 

103 ds_151.db_date_created = date_time 

104 # Record 5: FORMAT(10A1,10A1) 

105 # Field 1 -- date database last saved (DD-MMM-YY) 

106 # Field 2 -- time database last saved (HH:MM:SS) 

107 # Note that this script reads the date and time together as one field 

108 date_time, = parse_uff_line(data[4], ['A20']) 

109 try: 

110 ds_151.date_db_last_saved = datetime.datetime.strptime( 

111 ''.join(date_time.split()), '%d-%b-%y%H:%M:%S') 

112 except ValueError: 

113 ds_151.date_db_last_saved = date_time 

114 # Record 6: FORMAT(80A1) 

115 # Field 1 -- program which created universal file 

116 ds_151.writing_program, = parse_uff_line(data[5], ['A80']) 

117 # Record 7: FORMAT(10A1,10A1,4I5) <-- Is the 4I5 wrong? There are 5 fields of integers? 

118 # Field 1 -- date universal file written (DD-MMM-YY) 

119 # Field 2 -- time universal file written (HH:MM:SS) 

120 # Field 3 -- Release which wrote universal file 

121 # Field 4 -- Version number 

122 # Field 5 -- Host ID 

123 # MS1. 1-Vax/VMS 2-SGI 3-HP7xx,HP-UX 

124 # 4-RS/6000 5-Alp/VMS 6-Sun 7-Sony 

125 # 8-NEC 9-Alp/OSF 

126 # Field 6 -- Test ID 

127 # Field 7 -- Release counter per host 

128 (date_time, ds_151.release, ds_151.version_number, 

129 ds_151.host_id, ds_151.test_id, ds_151.release_counter_per_host) = ( 

130 parse_uff_line(data[6], ['A20'] + 5 * ['I5'])) 

131 try: 

132 ds_151.date_written = datetime.datetime.strptime( 

133 ''.join(date_time.split()), '%d-%b-%y%H:%M:%S') 

134 except ValueError: 

135 ds_151.date_written = date_time 

136 return ds_151 

137 

138 def __repr__(self): 

139 return 'Sdynpy_UFF_Dataset_151<{}>'.format(self.model_file_name) 

140 

141 def write_string(self): 

142 try: 

143 date_db_created = ('{:<10}'.format(self.db_date_created.strftime('%d-%b-%y')) + 

144 '{:>10}'.format(self.db_date_created.strftime('%H:%M:%S'))) 

145 except AttributeError: 

146 date_db_created = self.db_date_created 

147 try: 

148 date_db_last_saved = ('{:<10}'.format(self.date_db_last_saved.strftime('%d-%b-%y')) + 

149 '{:<10}'.format(self.date_db_last_saved.strftime('%H:%M:%S'))) 

150 except AttributeError: 

151 date_db_last_saved = self.date_db_last_saved 

152 try: 

153 date_written = ('{:<10}'.format(self.date_written.strftime('%d-%b-%y')) + 

154 '{:<10}'.format(self.date_written.strftime('%H:%M:%S'))) 

155 except AttributeError: 

156 date_written = self.date_written 

157 

158 return (write_uff_line([self.model_file_name], ['A80']) + 

159 write_uff_line([self.model_file_description], ['A80']) + 

160 write_uff_line([self.db_program], ['A80']) + 

161 write_uff_line([date_db_created, 

162 self.db_version, 

163 self.db_subversion, 

164 self.file_type], ['A20'] + 3 * ['I10']) + 

165 write_uff_line([date_db_last_saved], ['A20']) + 

166 write_uff_line([self.writing_program], ['A80']) + 

167 write_uff_line([date_written, 

168 self.release, 

169 self.version_number, 

170 self.host_id, 

171 self.test_id, 

172 self.release_counter_per_host], ['A20'] + 5 * ['I5'])) 

173 

174 def __str__(self): 

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

176 if len(lines) > 8: 

177 return 'Dataset 151: Header\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 

178 else: 

179 return 'Dataset 151: Header\n ' + '\n '.join(lines) 

180 

181 

182def read(data): 

183 return Sdynpy_UFF_Dataset_151.from_uff_data_array(data)