In [2]:
from salib import extend, NBImporter
from Tables import Table, DataSource
In [3]:
from Frame2D_Base import Frame2D
import Frame2D_Input
In [4]:
##test:
f = Frame2D('frame-1')
f.input_all()
Define a general method to write all tables. By default, a table of a given name
will be used from the 'self.rawdata
' object. If table 'xxx
' does not exist
there, it will be created by calling method '.list_xxx()
' to generate the data,
and formed by using the list of columns in class attribute '.COLUMNS_xxx
'.
.list_xxx()
must return a list of tuples or dictionaries, each of these being one
row of the table. If a tuple, that data is obviously given in the same order as the columns.
If a dictionary, the keys are the column names (see 'Member Loads', below).
In [5]:
@extend
class Frame2D:
def write_table(self,tablename,dsname=None,prefix=None,record=True,precision=None,args=(),makedir=False):
t = getattr(self.rawdata,tablename,None)
if t is None:
methodname = 'list_'+tablename
method = getattr(self,methodname,None)
if method and callable(method):
data = method(*args)
t = Table(data=data,tablename=tablename,columns=getattr(self,'COLUMNS_'+tablename))
if t is None:
raise ValueError("Unable to find table '{}'".format(tablename))
DataSource.write_table(t,dsname=dsname,prefix=prefix,tablename=tablename,precision=precision,makedir=makedir)
if record:
setattr(self.rawdata,tablename,t)
return t
In [7]:
##test:
try:
f.write_table('foobarzx3')
except Exception as e:
print('**** Error:',e)
In [8]:
@extend
class Frame2D:
def list_nodes(self):
return [(n.id,n.x,n.y) for n in self.nodes.values()]
In [9]:
##test:
t = f.write_table('nodes',dsname='test',makedir=True)
t.filename
Out[9]:
In [10]:
##test:
%cat data/test.d/nodes.csv
Delete the nodes
table from .rawdata
so that we can test that .list_nodes()
is properly called
to regenerated the table.
In [11]:
##test:
if hasattr(f.rawdata,'nodes'):
delattr(f.rawdata,'nodes')
%rm data/test.d/nodes.csv
t = f.write_table('nodes',dsname='test')
t.filename
Out[11]:
In [12]:
##test:
%cat data/test.d/nodes.csv
In [13]:
@extend
class Frame2D:
def list_supports(self):
ans = []
for node in self.nodes.values():
if node.constraints:
cl = tuple(node.constraints)
if len(cl) < 3:
cl = cl + ('',)*(3-len(cl))
ans.append((node.id,)+cl)
return ans
In [14]:
##test:
f.list_supports()
Out[14]:
In [15]:
##test:
t = f.write_table('supports','test')
t.filename
Out[15]:
In [16]:
##test:
%cat data/test.d/supports.csv
In [17]:
##test:
x = 'supports'
if hasattr(f.rawdata,x):
delattr(f.rawdata,x)
%rm data/test.d/supports.csv
t = f.write_table(x,'test')
t.filename
Out[17]:
In [18]:
##test:
%cat data/test.d/supports.csv
In [19]:
@extend
class Frame2D:
def list_members(self):
return [(m.id,m.nodej.id,m.nodek.id) for m in self.members.values()]
In [20]:
##test:
f.list_members()
Out[20]:
In [21]:
##test:
f.write_table('members','test')
%cat data/test.d/members.csv
In [22]:
@extend
class Frame2D:
def list_releases(self):
return [(m.id,)+tuple(m.releases) for m in self.members.values() if m.releases]
In [23]:
##test:
f.list_releases()
Out[23]:
In [24]:
##test:
f.write_table('releases','test')
%cat data/test.d/releases.csv
In [25]:
@extend
class Frame2D:
def list_properties(self):
return [(m.id,m.size,m.Ix,m.A) for m in self.members.values()]
In [26]:
##test:
f.list_properties()
Out[26]:
In [27]:
##test:
f.write_table('properties','test')
%cat data/test.d/properties.csv
In [28]:
@extend
class Frame2D:
def list_node_loads(self):
ans = []
dirns = ['FX','FY','FZ']
for loadid,node,nload in self.nodeloads:
for i in [0,1,2]:
if nload[i]:
ans.append((loadid,node.id,dirns[i],nload[i]))
return ans
In [29]:
##test:
f.list_node_loads()
Out[29]:
In [30]:
##test:
f.write_table('node_loads','test')
%cat data/test.d/node_loads.csv
In [31]:
@extend
class Frame2D:
def list_support_displacements(self):
ans = []
dirns = ['DX','DY','RZ']
for loadid,node,nload in self.nodedeltas:
for i in [0,1,2]:
if nload[i]:
ans.append((loadid,node.id,dirns[i],nload[i]))
return ans
In [32]:
##test:
f.list_support_displacements()
Out[32]:
In [33]:
##test:
f.write_table('support_displacements','test')
%cat data/test.d/support_displacements.csv
In [34]:
from MemberLoads import unmakeMemberLoad
@extend
class Frame2D:
def list_member_loads(self):
ans = []
for loadid,memb,mload in self.memberloads:
ml = unmakeMemberLoad(mload)
ml['MEMBERID'] = memb.id
ml['LOAD'] = loadid
ans.append(ml)
return ans
In [35]:
##test:
f.list_member_loads()
Out[35]:
In [36]:
##test:
f.write_table('member_loads','test')
%cat data/test.d/member_loads.csv
In [37]:
##test:
if hasattr(f.rawdata,'member_loads'):
delattr(f.rawdata,'member_loads')
%rm data/test.d/member_loads.csv
f.write_table('member_loads','test')
%cat data/test.d/member_loads.csv
In [38]:
@extend
class Frame2D:
def list_load_combinations(self):
return [(case,load,factor) for case,load,factor in self.loadcombinations]
In [39]:
##test:
f.list_load_combinations()
Out[39]:
In [40]:
##test:
f.write_table('load_combinations','test')
%cat data/test.d/load_combinations.csv
In [41]:
##test:
vars(f.rawdata).keys()
Out[41]:
In [42]:
@extend
class Frame2D:
COLUMNS_signatures = ['NAME','PATH','SIGNATURE']
def list_signatures(self):
return [t.signature() for tn,t in vars(self.rawdata).items() if type(t) is Table]
In [43]:
##test:
f.list_signatures()
Out[43]:
In [44]:
##test:
f.write_table('signatures','test',record=False)
%cat data/test.d/signatures.csv
In [45]:
import os, os.path
@extend
class Frame2D:
def write_all(self,dsname,makedir=False):
self.write_table('nodes',dsname=dsname,makedir=makedir)
self.write_table('supports',dsname=dsname)
self.write_table('members',dsname=dsname)
self.write_table('releases',dsname=dsname)
self.write_table('properties',dsname=dsname)
self.write_table('node_loads',dsname=dsname)
self.write_table('support_displacements',dsname=dsname)
self.write_table('member_loads',dsname=dsname)
self.write_table('load_combinations',dsname=dsname)
self.write_table('signatures',dsname=dsname,record=False)
In [46]:
##test:
%rm -rf data/test.d
%ls -l data/test.d
f.reset()
f.input_all()
f.write_all('test',makedir=True)
%ls -l data/test.d
In [47]:
##test:
%cat data/test.d/signatures.csv
In [48]:
##test:
import Frame2D_SolveFirstOrder
f.reset()
f.input_all()
rs = f.solve('all')
In [49]:
@extend
class Frame2D:
COLUMNS_node_displacements = ['NODEID','DX','DY','RZ']
def list_node_displacements(self,rs):
if not hasattr(rs,'node_displacements'):
return []
ans = []
D = rs.node_displacements
for node in self.nodes.values():
d = D[node.dofnums]
ans.append((node.id,d[0,0],d[1,0],d[2,0]))
return ans
In [50]:
##test:
f.list_node_displacements(rs)
Out[50]:
In [51]:
##test:
f.write_table('node_displacements',dsname='test',prefix=rs.loadcase,record=False,precision=15,args=(rs,),makedir=True)
%cat data/test.d/all/node_displacements.csv
In [52]:
@extend
class Frame2D:
COLUMNS_reaction_forces = ['NODEID','FX','FY','MZ']
def list_reaction_forces(self,rs):
if not hasattr(rs,'reaction_forces'):
return []
R = rs.reaction_forces
ans = []
for node in self.nodes.values():
if node.constraints:
l = [node.id,None,None,None]
for dirn in node.constraints:
i = node.DIRECTIONS[dirn]
j = node.dofnums[i]
val = R[j-self.nfree,0]
l[i+1] = val
ans.append(l)
return ans
In [53]:
##test:
f.list_reaction_forces(rs)
Out[53]:
In [54]:
##test:
f.write_table('reaction_forces',dsname='test',prefix=rs.loadcase,record=False,precision=15,args=(rs,))
%cat data/test.d/all/reaction_forces.csv
In [55]:
@extend
class Frame2D:
COLUMNS_member_end_forces = 'MEMBERID,FXJ,FYJ,MZJ,FXK,FYK,MZK'.split(',')
def list_member_end_forces(self,rs):
if not hasattr(rs,'member_efs'):
return []
mefs = rs.member_efs
ans = []
for memb in self.members.values():
efs = mefs[memb].fefs
ans.append((memb.id,efs[0,0],efs[1,0],efs[2,0],efs[3,0],efs[4,0],efs[5,0]))
return ans
In [56]:
##test:
f.list_member_end_forces(rs)
Out[56]:
In [57]:
##test:
f.write_table('member_end_forces',dsname='test',prefix=rs.loadcase,record=False,precision=15,args=(rs,))
%cat data/test.d/all/member_end_forces.csv
In [58]:
@extend
class Frame2D:
def write_results(self,dsname,rs):
self.write_table('node_displacements',dsname=dsname,prefix=rs.loadcase,record=False,
precision=15,args=(rs,),makedir=True)
self.write_table('reaction_forces',dsname=dsname,prefix=rs.loadcase,record=False,
precision=15,args=(rs,))
self.write_table('member_end_forces',dsname=dsname,prefix=rs.loadcase,record=False,
precision=15,args=(rs,))
if rs.pdelta:
self.write_table('pdelta_forces',dsname=dsname,prefix=rs.loadcase,record=False,
precision=15,args=(rs,))
In [59]:
##test:
f.reset()
f.input_all()
rs = f.solve('One')
f.write_results('test',rs)
%ls -l data/test.d/One
%cat data/test.d/One/node_displacements.csv
%cat data/test.d/One/reaction_forces.csv
%cat data/test.d/One/member_end_forces.csv
In [60]:
##test:
%rm -rf data/test.d
In [ ]: