def solve(self):
# Solve LS
self.VU = [node[key] for node in self.U.values() for key in ("uy","ur")]
self.VF = [node[key] for node in self.F.values() for key in ("fy","m")]
knw = [pos for pos,value in enumerate(self.VU) if not value is np.nan]
unknw = [pos for pos,value in enumerate(self.VU) if value is np.nan]
self.K2S = np.delete(np.delete(self.KG,knw,0),knw,1)
self.F2S = np.delete(self.VF,knw,0)
# For displacements
self.solved_u = la.solve(self.K2S,self.F2S)
for k,ic in enumerate(unknw):
nd, var = self.index2key(ic)
self.U[nd][var] = self.solved_u[k]
# Updating nodes displacements
for nd in self.nodes.values():
if np.isnan(nd.uy):
nd.uy = self.U[nd.label]["uy"]
if np.isnan(nd.ur):
nd.ur = self.U[nd.label]["ur"]
# For nodal forces/reactions
self.NF = self.F.copy()
self.VU = [node[key] for node in self.U.values() for key in ("uy","ur")]
nf_calc = np.dot(self.KG, self.VU)
for k in range(2*self.get_number_of_nodes()):
nd, var = self.index2key(k, ("fy","m"))
self.NF[nd][var] = nf_calc[k]
cnlab = np.floor(k/float(self.dof))
if var=="fy":
self.nodes[cnlab].fy = nf_calc[k]
elif var=="m":
self.nodes[cnlab].m = nf_calc[k]
评论列表
文章目录