sgio 0.2.14__py3-none-any.whl → 0.2.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sgio/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.14"
1
+ __version__ = "0.2.15"
sgio/iofunc/_meshio.py CHANGED
@@ -281,35 +281,35 @@ def _sg_to_meshio_order(cell_type: str, idx: ArrayLike) -> np.ndarray:
281
281
 
282
282
 
283
283
 
284
- def _meshio_to_sg_order(cell_type:str, idx:ArrayLike):
285
- idx_sg = np.asarray(idx) + 1
284
+ # def _meshio_to_sg_order(cell_type:str, idx:ArrayLike):
285
+ # idx_sg = np.asarray(idx) + 1
286
286
 
287
- idx_to_insert = None
288
- if cell_type == 'triangle6':
289
- idx_to_insert = 3
290
- elif cell_type == 'tetra10':
291
- idx_to_insert = 4
292
- elif cell_type == 'wedge15':
293
- idx_to_insert = 6
287
+ # idx_to_insert = None
288
+ # if cell_type == 'triangle6':
289
+ # idx_to_insert = 3
290
+ # elif cell_type == 'tetra10':
291
+ # idx_to_insert = 4
292
+ # elif cell_type == 'wedge15':
293
+ # idx_to_insert = 6
294
294
 
295
- max_nodes = idx_sg.shape[1]
296
- if cell_type.startswith('line'):
297
- max_nodes = 5
298
- elif cell_type.startswith('triangle') or cell_type.startswith('quad'):
299
- max_nodes = 9
300
- elif cell_type.startswith('tetra') or cell_type.startswith('wedge') or cell_type.startswith('hexahedron'):
301
- max_nodes = 20
295
+ # max_nodes = idx_sg.shape[1]
296
+ # if cell_type.startswith('line'):
297
+ # max_nodes = 5
298
+ # elif cell_type.startswith('triangle') or cell_type.startswith('quad'):
299
+ # max_nodes = 9
300
+ # elif cell_type.startswith('tetra') or cell_type.startswith('wedge') or cell_type.startswith('hexahedron'):
301
+ # max_nodes = 20
302
302
 
303
- # Insert 0 for some types of cells
304
- if idx_to_insert:
305
- idx_sg = np.insert(idx_sg, idx_to_insert, 0, axis=1)
303
+ # # Insert 0 for some types of cells
304
+ # if idx_to_insert:
305
+ # idx_sg = np.insert(idx_sg, idx_to_insert, 0, axis=1)
306
306
 
307
- # Fill the remaining location with 0s
308
- pad_width = max_nodes - idx_sg.shape[1]
309
- # logger.debug('pad width = {}'.format(pad_width))
310
- idx_sg = np.pad(idx_sg, ((0, 0), (0, pad_width)), 'constant', constant_values=0)
307
+ # # Fill the remaining location with 0s
308
+ # pad_width = max_nodes - idx_sg.shape[1]
309
+ # # logger.debug('pad width = {}'.format(pad_width))
310
+ # idx_sg = np.pad(idx_sg, ((0, 0), (0, pad_width)), 'constant', constant_values=0)
311
311
 
312
- return idx_sg
312
+ # return idx_sg
313
313
 
314
314
 
315
315
 
@@ -398,7 +398,7 @@ def _write_nodes(
398
398
 
399
399
  def _meshio_to_sg_order(
400
400
  cell_type:str, idx:ArrayLike,
401
- node_id=[], renumber_nodes:bool=False
401
+ node_id=[], renumber_nodes:bool=True
402
402
  ):
403
403
  """Convert meshio cell ordering to SG ordering.
404
404
 
@@ -418,11 +418,14 @@ def _meshio_to_sg_order(
418
418
  idx_sg: np.ndarray (n_cells, n_elem_nodes_sg)
419
419
  Array of cell connectivity in SG ordering.
420
420
  """
421
+ print(f'{renumber_nodes = }')
421
422
  idx_sg = np.asarray(idx)
422
423
  if renumber_nodes:
423
- idx_map = {v:i+1 for i, v in enumerate(node_id)}
424
- idx_sg = np.vectorize(idx_map.get)(idx_sg)
425
- # idx_sg = np.asarray(idx) + 1
424
+ if len(node_id) == 0:
425
+ idx_sg = np.asarray(idx) + 1
426
+ else:
427
+ idx_map = {v: i+1 for i, v in enumerate(node_id)}
428
+ idx_sg = np.vectorize(idx_map.get)(idx_sg)
426
429
 
427
430
  idx_to_insert = None
428
431
  if cell_type == 'triangle6':
sgio/iofunc/main.py CHANGED
@@ -133,7 +133,7 @@ def readOutputModel(
133
133
  with open(filename, "r") as file:
134
134
  if file_format.lower().startswith("s"):
135
135
  model = _swiftcomp.read_output_buffer(
136
- file, analysis="h", model_type=model_type, **kwargs
136
+ file, analysis="h", model_type=model_type, sg=sg, **kwargs
137
137
  )
138
138
  elif file_format.lower().startswith("v"):
139
139
  model = _vabs.read_output_buffer(
@@ -680,6 +680,8 @@ def write(
680
680
  analysis=analysis, model=model_type,
681
681
  macro_responses=macro_responses,
682
682
  model_space=model_space, prop_ref_y=prop_ref_y,
683
+ renumber_nodes=renumber_nodes,
684
+ renumber_elements=renumber_elements,
683
685
  load_type=load_type,
684
686
  sfi=sfi, sff=sff, version=format_version
685
687
  )
@@ -248,7 +248,9 @@ def _readThermalProperty(file, isotropy:int):
248
248
 
249
249
 
250
250
  def writeInputBuffer(
251
- sg, file, analysis, physics, model_space,
251
+ sg, file, analysis, physics,
252
+ model_space, prop_ref_y,
253
+ renumber_nodes=False, renumber_elements=False,
252
254
  sfi:str='8d', sff:str='20.12e', version=None):
253
255
  """
254
256
  """
@@ -271,6 +273,9 @@ def writeInputBuffer(
271
273
  file=file,
272
274
  sgdim=sg.sgdim,
273
275
  model_space=model_space,
276
+ prop_ref_y=prop_ref_y,
277
+ renumber_nodes=renumber_nodes,
278
+ renumber_elements=renumber_elements,
274
279
  int_fmt=sfi, float_fmt=sff
275
280
  )
276
281
 
@@ -359,13 +364,19 @@ def writeInputBufferGlobal(
359
364
 
360
365
 
361
366
 
362
- def _writeMesh(mesh, file, sgdim, model_space, int_fmt, float_fmt):
367
+ def _writeMesh(
368
+ mesh, file, sgdim, model_space, prop_ref_y='x',
369
+ renumber_nodes=False, renumber_elements=False,
370
+ int_fmt='8d', float_fmt='20.12e'
371
+ ):
363
372
  """
364
373
  """
365
374
  logger.debug('writing mesh...')
366
375
 
367
376
  write_buffer(
368
- file, mesh, sgdim=sgdim, model_space=model_space,
377
+ file, mesh, sgdim=sgdim,
378
+ model_space=model_space, prop_ref_y=prop_ref_y,
379
+ renumber_nodes=renumber_nodes, renumber_elements=renumber_elements,
369
380
  int_fmt=int_fmt, float_fmt=float_fmt)
370
381
 
371
382
  return
@@ -208,30 +208,52 @@ def _read_property_ref_csys(file, nelem, cells, cell_ids):
208
208
  # ====================================================================
209
209
 
210
210
  def write(
211
- filename, mesh:SGMesh, sgdim, model_space,
211
+ filename, mesh:SGMesh, sgdim, model_space, prop_ref_y='x',
212
+ renumber_nodes=False, renumber_elements=False,
212
213
  int_fmt='8d', float_fmt="20.9e"):
213
214
  """
214
215
  """
215
216
  if is_buffer(filename, 'w'):
216
- write_buffer(filename, mesh, sgdim, model_space, int_fmt, float_fmt)
217
+ write_buffer(
218
+ filename, mesh, sgdim, model_space,
219
+ renumber_nodes, renumber_elements,
220
+ int_fmt, float_fmt
221
+ )
217
222
  else:
218
223
  with open(filename, 'at') as file:
219
- write_buffer(file, mesh, sgdim, model_space, int_fmt, float_fmt)
224
+ write_buffer(
225
+ file, mesh, sgdim, model_space,
226
+ renumber_nodes, renumber_elements,
227
+ int_fmt, float_fmt
228
+ )
220
229
 
221
230
 
222
231
 
223
232
  def write_buffer(
224
- file, mesh:SGMesh, sgdim, model_space,
225
- int_fmt='8d', float_fmt="20.9e"):
233
+ file, mesh:SGMesh, sgdim, model_space, prop_ref_y='x',
234
+ renumber_nodes=False, renumber_elements=False,
235
+ int_fmt='8d', float_fmt="20.9e"
236
+ ):
226
237
  """
227
238
  """
228
239
 
240
+ _node_id = mesh.point_data.get('node_id', [])
241
+
229
242
  _write_nodes(
230
- file, mesh.points, sgdim, model_space=model_space,
243
+ file, mesh.points, sgdim, node_id=_node_id,
244
+ model_space=model_space,
245
+ renumber_nodes=renumber_nodes,
231
246
  int_fmt=int_fmt, float_fmt=float_fmt
232
247
  )
233
248
 
234
- cell_id_to_elem_id = _write_elements(file, mesh.cells, mesh.cell_data['property_id'], int_fmt)
249
+ if not 'element_id' in mesh.cell_data.keys():
250
+ mesh.cell_data['element_id'] = []
251
+ cell_id_to_elem_id = _write_elements(
252
+ file, mesh.cells, mesh.cell_data['property_id'],
253
+ mesh.cell_data['element_id'], _node_id,
254
+ renumber_nodes=renumber_nodes,
255
+ int_fmt=int_fmt
256
+ )
235
257
 
236
258
  if 'property_ref_csys' in mesh.cell_data.keys():
237
259
  _write_property_ref_csys(
@@ -244,9 +266,18 @@ def write_buffer(
244
266
 
245
267
 
246
268
 
247
- def _write_elements(f, cells, cell_prop_ids, int_fmt:str='8d'):
269
+ def _write_elements(
270
+ f, cells, cell_prop_ids, elem_id, node_id, renumber_nodes=False,
271
+ int_fmt:str='8d'
272
+ ):
248
273
  """
249
274
  """
275
+ if len(elem_id) == 0:
276
+ generate_eid = True
277
+ else:
278
+ generate_eid = False
279
+ # print(f'{generate_eid = }')
280
+
250
281
  cell_id_to_elem_id = []
251
282
 
252
283
  sfi = '{:' + int_fmt + '}'
@@ -254,12 +285,25 @@ def _write_elements(f, cells, cell_prop_ids, int_fmt:str='8d'):
254
285
  consecutive_index = 0
255
286
  for k, cell_block in enumerate(cells):
256
287
  cell_type = cell_block.type
257
- node_idcs = _meshio_to_sg_order(cell_type, cell_block.data)
288
+ # print(f'cell_block.data = {cell_block.data}')
289
+ node_idcs = _meshio_to_sg_order(
290
+ cell_type, cell_block.data,
291
+ node_id=node_id, renumber_nodes=renumber_nodes
292
+ )
293
+ print(f'{node_idcs = }')
258
294
 
259
295
  _cid_to_eid = []
296
+ if generate_eid:
297
+ elem_id.append([])
260
298
 
261
299
  for i, c in enumerate(node_idcs):
262
- _eid = consecutive_index + i + 1
300
+ if generate_eid:
301
+ _eid = consecutive_index + i + 1
302
+ elem_id[k].append(_eid)
303
+ else:
304
+ _eid = elem_id[k][i]
305
+ # print(f'{_eid = }')
306
+
263
307
  _pid = cell_prop_ids[k][i]
264
308
 
265
309
  _nums = [_eid, _pid] # Element id, property id
@@ -186,6 +186,7 @@ def read_output_buffer(
186
186
  def write_buffer(
187
187
  sg:StructureGene, file, analysis='h', model='sd1',
188
188
  model_space='xy', prop_ref_y='x',
189
+ renumber_nodes=False, renumber_elements=False,
189
190
  macro_responses:list[smdl.StateCase]=[],
190
191
  load_type=0,
191
192
  sfi:str='8d', sff:str='20.12e', version=None
@@ -211,7 +212,9 @@ def write_buffer(
211
212
 
212
213
  if analysis == 'h':
213
214
  writeInputBuffer(
214
- sg, file, analysis, sg.physics, model_space,
215
+ sg, file, analysis, sg.physics,
216
+ model_space, prop_ref_y,
217
+ renumber_nodes, renumber_elements,
215
218
  sfi, sff, version)
216
219
 
217
220
  elif (analysis == 'd') or (analysis == 'l') or (analysis.startswith('f')):
sgio/iofunc/vabs/_mesh.py CHANGED
@@ -236,7 +236,33 @@ def write_buffer(
236
236
  renumber_nodes=False, renumber_elements=False,
237
237
  int_fmt='8d', float_fmt="20.9e"
238
238
  ):
239
- """
239
+ """Write mesh data to VABS format buffer.
240
+
241
+ Parameters
242
+ ----------
243
+ file : file
244
+ The file buffer to write to.
245
+ mesh : SGMesh
246
+ The mesh object containing points, cells, and associated data.
247
+ sgdim : int
248
+ The spatial dimension of the structural gene (2 or 3).
249
+ model_space : str, optional
250
+ The model coordinate space ('xy', 'yz', 'zx'), by default ''.
251
+ prop_ref_y : str, optional
252
+ Reference axis for property coordinate system ('x', 'y', 'z'), by default 'x'.
253
+ renumber_nodes : bool, optional
254
+ Whether to renumber nodes, by default False.
255
+ renumber_elements : bool, optional
256
+ Whether to renumber elements, by default False.
257
+ int_fmt : str, optional
258
+ Format string for integer output, by default '8d'.
259
+ float_fmt : str, optional
260
+ Format string for float output, by default "20.9e".
261
+
262
+ Returns
263
+ -------
264
+ None
265
+ Writes mesh data directly to the file buffer.
240
266
  """
241
267
 
242
268
  # _node_id = []
@@ -290,7 +316,27 @@ def _write_elements(
290
316
  f, cells, elem_id, node_id, renumber_nodes=False,
291
317
  int_fmt:str='8d'
292
318
  ):
293
- """
319
+ """Write element connectivity data to VABS format file.
320
+
321
+ Parameters
322
+ ----------
323
+ f : file
324
+ The file object to write to.
325
+ cells : list
326
+ List of cell blocks containing element connectivity data.
327
+ elem_id : list
328
+ List of element IDs for each cell block. If empty, IDs are auto-generated.
329
+ node_id : list
330
+ List of node IDs for renumbering (currently unused).
331
+ renumber_nodes : bool, optional
332
+ Whether to renumber nodes (currently unused), by default False.
333
+ int_fmt : str, optional
334
+ Format string for integer output, by default '8d'.
335
+
336
+ Returns
337
+ -------
338
+ None
339
+ Modifies elem_id list in-place if auto-generating element IDs.
294
340
  """
295
341
  if len(elem_id) == 0:
296
342
  generate_eid = True