Write Output to CSV

This submodule implements the writing of all input data (and eventually results, but not yet) to CSV files.


In [2]:
from salib import extend, NBImporter
from Tables import Table, DataSource

In [3]:
from Frame2D_Base import Frame2D
import Frame2D_Input


Compiling notebook file 'Frame2D_Base.ipynb' to python.

In [4]:
##test:
f = Frame2D('frame-1')
f.input_all()

General Table Writing

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)


**** Error: Unable to find table 'foobarzx3'

Nodes


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]:
'data/test.d/nodes.csv'

In [10]:
##test:
%cat data/test.d/nodes.csv


NODEID,X,Y
A,0.0,0.0
B,0.0,4000.0
C,8000.0,4000.0
D,8000.0,0.0

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]:
'data/test.d/nodes.csv'

In [12]:
##test:
%cat data/test.d/nodes.csv


NODEID,X,Y
A,0.0,0.0
B,0.0,4000.0
C,8000.0,4000.0
D,8000.0,0.0

Supports


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]:
[('A', 'FY', 'MZ', 'FX'), ('D', 'FY', 'FX', '')]

In [15]:
##test:
t = f.write_table('supports','test')
t.filename


Out[15]:
'data/test.d/supports.csv'

In [16]:
##test:
%cat data/test.d/supports.csv


NODEID,C0,C1,C2
A,FX,FY,MZ
D,FX,FY,

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]:
'data/test.d/supports.csv'

In [18]:
##test:
%cat data/test.d/supports.csv


NODEID,C0,C1,C2
A,FY,MZ,FX
D,FY,FX,

Members


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]:
[('AB', 'A', 'B'), ('BC', 'B', 'C'), ('CD', 'C', 'D')]

In [21]:
##test:
f.write_table('members','test')
%cat data/test.d/members.csv


MEMBERID,NODEJ,NODEK
AB,A,B
BC,B,C
CD,C,D

Releases


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]:
[('AB', 'MZK'), ('CD', 'MZJ')]

In [24]:
##test:
f.write_table('releases','test')
%cat data/test.d/releases.csv


MEMBERID,RELEASE
AB,MZK
CD,MZJ

Properties


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]:
[('AB', 'W310x97', 222000000.0, 12300.0),
 ('BC', 'W460x106', 488000000.0, 13500.0),
 ('CD', '', 222000000.0, 12300.0)]

In [27]:
##test:
f.write_table('properties','test')
%cat data/test.d/properties.csv


MEMBERID,SIZE,IX,A
BC,W460x106,488000000.0,13500.0
AB,W310x97,222000000.0,12300.0
CD,,222000000.0,12300.0

Node Loads


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]:
[('wind', 'B', 'FX', -200000.0)]

In [30]:
##test:
f.write_table('node_loads','test')
%cat data/test.d/node_loads.csv


LOAD,NODEID,DIRN,F
Wind,B,FX,-200000.0

Support Displacements


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]:
[('other', 'A', 'DY', -10.0)]

In [33]:
##test:
f.write_table('support_displacements','test')
%cat data/test.d/support_displacements.csv


LOAD,NODEID,DIRN,DELTA
Other,A,DY,-10

Member Loads


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]:
[{'LOAD': 'live', 'MEMBERID': 'BC', 'TYPE': 'UDL', 'W1': -50},
 {'A': 5000.0, 'LOAD': 'live', 'MEMBERID': 'BC', 'TYPE': 'PL', 'W1': -200000}]

In [36]:
##test:
f.write_table('member_loads','test')
%cat data/test.d/member_loads.csv


LOAD,MEMBERID,TYPE,W1,W2,A,B,C
Live,BC,UDL,-50,,,,
Live,BC,PL,-200000,,5000.0,,

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


LOAD,MEMBERID,TYPE,W1,W2,A,B,C
live,BC,UDL,-50,,,,
live,BC,PL,-200000,,5000.0,,

Load Combinations


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]:
[('one', 'live', 1.5),
 ('one', 'wind', 1.75),
 ('all', 'other', 1.0),
 ('all', 'live', 1.0),
 ('all', 'wind', 1.0)]

In [40]:
##test:
f.write_table('load_combinations','test')
%cat data/test.d/load_combinations.csv


CASE,LOAD,FACTOR
One,Live,1.5
One,Wind,1.75

File Signatures


In [41]:
##test:
vars(f.rawdata).keys()


Out[41]:
dict_keys(['members', 'releases', 'properties', 'node_loads', 'support_displacements', 'load_combinations', 'nodes', 'supports', 'member_loads'])

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]:
[('members',
  'data/test.d/members.csv',
  '783cee2e924a1f1fc738638af431671f02e25f1b97430d834a226eecd3dd09e3'),
 ('releases',
  'data/test.d/releases.csv',
  'ae3d4681f60b6c5665cfd07a4894a01dd386cc7a51e98eb08248fc202e41e09f'),
 ('properties',
  'data/test.d/properties.csv',
  '4ebc2477cadb207459034659d0bf1da9b9dbb02bb06af2c060894ecb595effca'),
 ('node_loads',
  'data/test.d/node_loads.csv',
  'c6283d540ec54fe3f9a92ac7f0ec98e74f3e8351dc77387e3d113bc5e618ced4'),
 ('support_displacements',
  'data/test.d/support_displacements.csv',
  'b475cca77a5ddcf815425514c484fcb3506195db840a9bf3006a187c9e457617'),
 ('load_combinations',
  'data/test.d/load_combinations.csv',
  'efe64703cadacf5f169f913b9d49dcf4c6523dd62e474cfff90782787c830310'),
 ('nodes',
  'data/test.d/nodes.csv',
  'a1c6202ec4a3f745cbde4e96c7b07ce173d14ebaeaa6956b40260053ffb34e6c'),
 ('supports',
  'data/test.d/supports.csv',
  '385d78806b6d14f7a668d9744f25884044542a54a4ddb4cde18f518a1daa4157'),
 ('member_loads',
  'data/test.d/member_loads.csv',
  'a9fcdf2e2ae939fe6506ad063f92540bb9816856b51481df6be0cc2657467aa0')]

In [44]:
##test:
f.write_table('signatures','test',record=False)
%cat data/test.d/signatures.csv


NAME,PATH,SIGNATURE
members,data/test.d/members.csv,783cee2e924a1f1fc738638af431671f02e25f1b97430d834a226eecd3dd09e3
releases,data/test.d/releases.csv,ae3d4681f60b6c5665cfd07a4894a01dd386cc7a51e98eb08248fc202e41e09f
properties,data/test.d/properties.csv,4ebc2477cadb207459034659d0bf1da9b9dbb02bb06af2c060894ecb595effca
node_loads,data/test.d/node_loads.csv,c6283d540ec54fe3f9a92ac7f0ec98e74f3e8351dc77387e3d113bc5e618ced4
support_displacements,data/test.d/support_displacements.csv,b475cca77a5ddcf815425514c484fcb3506195db840a9bf3006a187c9e457617
load_combinations,data/test.d/load_combinations.csv,efe64703cadacf5f169f913b9d49dcf4c6523dd62e474cfff90782787c830310
nodes,data/test.d/nodes.csv,a1c6202ec4a3f745cbde4e96c7b07ce173d14ebaeaa6956b40260053ffb34e6c
supports,data/test.d/supports.csv,385d78806b6d14f7a668d9744f25884044542a54a4ddb4cde18f518a1daa4157
member_loads,data/test.d/member_loads.csv,a9fcdf2e2ae939fe6506ad063f92540bb9816856b51481df6be0cc2657467aa0

Write everything


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


ls: cannot access 'data/test.d': No such file or directory
total 40
-rw-rw-r-- 1 nholtz nholtz  44 Dec 10 13:04 load_combinations.csv
-rw-rw-r-- 1 nholtz nholtz  80 Dec 10 13:04 member_loads.csv
-rw-rw-r-- 1 nholtz nholtz  42 Dec 10 13:04 members.csv
-rw-rw-r-- 1 nholtz nholtz  39 Dec 10 13:04 node_loads.csv
-rw-rw-r-- 1 nholtz nholtz  63 Dec 10 13:04 nodes.csv
-rw-rw-r-- 1 nholtz nholtz 106 Dec 10 13:04 properties.csv
-rw-rw-r-- 1 nholtz nholtz  31 Dec 10 13:04 releases.csv
-rw-rw-r-- 1 nholtz nholtz 963 Dec 10 13:04 signatures.csv
-rw-rw-r-- 1 nholtz nholtz  38 Dec 10 13:04 support_displacements.csv
-rw-rw-r-- 1 nholtz nholtz  36 Dec 10 13:04 supports.csv

In [47]:
##test:
%cat data/test.d/signatures.csv


NAME,PATH,SIGNATURE
nodes,data/test.d/nodes.csv,a1c6202ec4a3f745cbde4e96c7b07ce173d14ebaeaa6956b40260053ffb34e6c
supports,data/test.d/supports.csv,c9b14f3fb0868a679912d6d5d8f23e75f89cc8accd8e9f2b1613bc9710653815
members,data/test.d/members.csv,783cee2e924a1f1fc738638af431671f02e25f1b97430d834a226eecd3dd09e3
releases,data/test.d/releases.csv,ae3d4681f60b6c5665cfd07a4894a01dd386cc7a51e98eb08248fc202e41e09f
properties,data/test.d/properties.csv,4ebc2477cadb207459034659d0bf1da9b9dbb02bb06af2c060894ecb595effca
node_loads,data/test.d/node_loads.csv,c6283d540ec54fe3f9a92ac7f0ec98e74f3e8351dc77387e3d113bc5e618ced4
support_displacements,data/test.d/support_displacements.csv,b475cca77a5ddcf815425514c484fcb3506195db840a9bf3006a187c9e457617
member_loads,data/test.d/member_loads.csv,dd250084236a127fdd54f5003caba9d7cb980efae8bec6405ba84d899887e43f
load_combinations,data/test.d/load_combinations.csv,efe64703cadacf5f169f913b9d49dcf4c6523dd62e474cfff90782787c830310

Results Output


In [48]:
##test:
import Frame2D_SolveFirstOrder
f.reset()
f.input_all()
rs = f.solve('all')


Compiling notebook file 'Frame2D_SolveFirstOrder.ipynb' to python.

Node Displacements


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]:
[('A', 0.0, -10.0, 0.0),
 ('B', -96.09609609609663, -10.447154471544724, -0.016733181727309074),
 ('C', -96.09609609609663, -0.52845528455284552, 0.020493594228975075),
 ('D', 0.0, 0.0, 0.024024024024024156)]

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


NODEID,DX,DY,RZ
A,0,-10,0
B,-96.0960960960966,-10.4471544715447,-0.0167331817273091
C,-96.0960960960966,-0.528455284552846,0.0204935942289751
D,0,0,0.0240240240240242

Reaction Forces


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]:
[['A', 200000.00000000111, 275000.00000000559, -800000000.00000441],
 ['D', 0.0, 325000.0, None]]

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


NODEID,FX,FY,MZ
A,200000.000000001,275000.000000006,-800000000.000004
D,0,325000,

Member End Forces


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]:
[('AB',
  275000.00000000559,
  -200000.00000000111,
  -800000000.00000441,
  -275000.00000000559,
  200000.00000000111,
  0.0),
 ('BC', 0.0, 275000.0, 0.0, 0.0, 325000.0, -5.9604644775390625e-08),
 ('CD', 325000.0, 0.0, 0.0, -325000.0, 0.0, 0.0)]

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


MEMBERID,FXJ,FYJ,MZJ,FXK,FYK,MZK
AB,275000.000000006,-200000.000000001,-800000000.000004,-275000.000000006,200000.000000001,0
BC,0,275000,0,0,325000,-5.96046447753906e-08
CD,325000,0,0,-325000,0,0

$P-\Delta$ Forces

See module ..._Display

All Results


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


total 12
-rw-rw-r-- 1 nholtz nholtz 256 Dec 10 13:05 member_end_forces.csv
-rw-rw-r-- 1 nholtz nholtz 166 Dec 10 13:05 node_displacements.csv
-rw-rw-r-- 1 nholtz nholtz 102 Dec 10 13:05 reaction_forces.csv
NODEID,DX,DY,RZ
A,0,0,0
B,-168.168168168169,-0.670731707317113,-0.0269747725909636
C,-168.168168168169,-0.792682926829268,0.0288653913434626
D,0,0,0.0420420420420423
NODEID,FX,FY,MZ
A,350000.000000002,412500.000000024,-1400000000.00001
D,-5.82076609134674e-11,487500,
MEMBERID,FXJ,FYJ,MZJ,FXK,FYK,MZK
AB,412500.000000024,-350000.000000002,-1400000000.00001,-412500.000000024,350000.000000002,0
BC,0,412500,-1.19209289550781e-07,0,487500,-1.19209289550781e-07
CD,487500,5.82076609134674e-11,0,-487500,-5.82076609134674e-11,0

In [60]:
##test:
%rm -rf data/test.d

In [ ]: