def solve(self):
self._check_nodes()
# Solve LS
self.VU = [node[key] for node in self.U.values() for key in ("ux","uy")]
self.VF = [node[key] for node in self.F.values() for key in ("fx","fy")]
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
try:
self.solved_u = la.solve(self.K2S,self.F2S)
except:
print("Solved using LSTSQ")
self.solved_u = la.lstsq(self.K2S, self.F2S)[0]
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.ux):
nd.ux = self.U[nd.label]["ux"]
if np.isnan(nd.uy):
nd.uy = self.U[nd.label]["uy"]
# For nodal forces/reactions
self.NF = self.F.copy()
self.VU = [node[key] for node in self.U.values() for key in ("ux","uy")]
nf_calc = np.dot(self.KG, self.VU)
for k in range(2*self.get_number_of_nodes()):
nd, var = self.index2key(k, ("fx","fy"))
self.NF[nd][var] = nf_calc[k]
cnlab = np.floor(k/float(self.dof))
if var=="fx":
self.nodes[cnlab].fx = nf_calc[k]
elif var=="fy":
self.nodes[cnlab].fy = nf_calc[k]
评论列表
文章目录