import xarray as xr
import openseespy.opensees as ops
[docs]
def get_node_coord() -> xr.DataArray:
"""Get nodal data from the OpenSees model.
Returns:
---------
node_data : xarray.DataArray
Nodal data array with coordinates and tags.
Examples:
---------
>>> node_coord = get_node_coord()
>>> print(node_coord.coords)
{'nodeTags': array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 'coords': ['Xloc', 'Yloc', 'Zloc']}
"""
node_ndims, node_ndofs, node_coords = [], [], []
node_tags = ops.getNodeTags()
for i, tag in enumerate(node_tags):
coord = ops.nodeCoord(tag)
ndim = ops.getNDM(tag)[0]
ndof = ops.getNDF(tag)[0]
if ndim == 1:
coord.extend([0, 0])
elif ndim == 2:
coord.extend([0])
node_ndims.append(ndim)
node_ndofs.append(ndof)
node_coords.append(coord)
if len(node_coords) > 0:
node_data = xr.DataArray(
node_coords,
coords={
"nodeTags": node_tags,
"coords": ["Xloc", "Yloc", "Zloc"],
},
dims=["nodeTags", "coords"],
attrs={
"numNodes": len(node_tags),
"ndofs": tuple(node_ndofs),
"ndims": tuple(node_ndims),
}
)
else:
node_data = xr.DataArray(node_coords)
node_data.name = "NodalData"
return node_data
[docs]
def get_node_mass() -> xr.DataArray:
"""Get nodal mass data from the OpenSees model.
Returns:
---------
node_mass : xarray.DataArray
Nodal mass data array with mass values and tags.
Examples:
---------
>>> node_mass = get_node_mass()
>>> print(node_mass.coords)
{'nodeTags': array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 'mass': ['UX', 'UY', 'UZ', 'RX', 'RY', 'RZ']}
"""
node_mass = []
node_tags = ops.getNodeTags()
for i, tag in enumerate(node_tags):
mass = ops.nodeMass(tag)
ndm = ops.getNDM(tag)[0]
ndf = ops.getNDF(tag)[0]
if ndm == 1:
mass.extend([0., 0., 0., 0., 0.])
elif ndm == 2 and ndf == 3:
mass = [mass[0], mass[1], 0.0, 0.0, 0.0, mass[2]]
elif ndm == 2 and ndf == 2:
mass = [mass[0], mass[1], 0.0, 0.0, 0.0, 0.0]
elif ndm == 3 and ndf == 3:
mass = [mass[0], mass[1], mass[2], 0.0, 0.0, 0.0]
elif ndm == 3 and ndf == 4:
mass = [mass[0], mass[1], mass[2], 0.0, 0.0, mass[3]]
elif ndm == 3 and ndf == 6:
mass = [mass[0], mass[1], mass[2], mass[3], mass[4], mass[5]]
node_mass.append(mass)
if len(node_mass) > 0:
node_mass = xr.DataArray(
node_mass,
coords={
"nodeTags": node_tags,
"mass": ["UX", "UY", "UZ", "RX", "RY", "RZ"],
},
dims=["nodeTags", "mass"],
)
else:
node_mass = xr.DataArray([])
node_mass.name = "NodalMass"
return node_mass