forked from cedrict/flaps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompute_strain_rate3.py
107 lines (88 loc) · 3.75 KB
/
compute_strain_rate3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
###############################################################################
from basis_functions import *
import numpy as np
from scipy.sparse import lil_matrix
import scipy.sparse as sps
###############################################################################
def compute_strain_rate3(nel,mV,NV,nqel,iconV,mapping,xmapping,zmapping,u,v,\
qcoords_r,qcoords_s,qweights):
exx3=np.zeros(NV,dtype=np.float64)
eyy3=np.zeros(NV,dtype=np.float64)
exy3=np.zeros(NV,dtype=np.float64)
M_mat=lil_matrix((NV,NV),dtype=np.float64)
rhsLxx=np.zeros(NV,dtype=np.float64)
rhsLyy=np.zeros(NV,dtype=np.float64)
rhsLxy=np.zeros(NV,dtype=np.float64)
rhsLyx=np.zeros(NV,dtype=np.float64)
jcb=np.zeros((2,2),dtype=np.float64)
dNNNVdx=np.zeros(mV,dtype=np.float64)
dNNNVdy=np.zeros(mV,dtype=np.float64)
for iel in range(0,nel):
M_el =np.zeros((mV,mV),dtype=np.float64)
fLxx_el=np.zeros(mV,dtype=np.float64)
fLyy_el=np.zeros(mV,dtype=np.float64)
fLxy_el=np.zeros(mV,dtype=np.float64)
fLyx_el=np.zeros(mV,dtype=np.float64)
NNNV1 =np.zeros((mV,1),dtype=np.float64)
for kq in range(0,nqel):
rq=qcoords_r[kq]
sq=qcoords_s[kq]
weightq=qweights[kq]
#compute coords of quadrature points
NNNV=NNN(rq,sq,mapping)
xq=np.dot(NNNV[:],xmapping[:,iel])
yq=np.dot(NNNV[:],zmapping[:,iel])
#compute jacobian matrix
dNNNVdr=dNNNdr(rq,sq,mapping)
dNNNVds=dNNNds(rq,sq,mapping)
jcb[0,0]=np.dot(dNNNVdr[:],xmapping[:,iel])
jcb[0,1]=np.dot(dNNNVdr[:],zmapping[:,iel])
jcb[1,0]=np.dot(dNNNVds[:],xmapping[:,iel])
jcb[1,1]=np.dot(dNNNVds[:],zmapping[:,iel])
jcob=np.linalg.det(jcb)
jcbi=np.linalg.inv(jcb)
#basis functions
NNNV1[:,0]=NNN(rq,sq,'Q2')
dNNNVdr=dNNNdr(rq,sq,'Q2')
dNNNVds=dNNNds(rq,sq,'Q2')
# compute dNdx & dNdy
Lxxq=0.
Lyyq=0.
Lxyq=0.
Lyxq=0.
for k in range(0,mV):
dNNNVdx[k]=jcbi[0,0]*dNNNVdr[k]+jcbi[0,1]*dNNNVds[k]
dNNNVdy[k]=jcbi[1,0]*dNNNVdr[k]+jcbi[1,1]*dNNNVds[k]
Lxxq+=dNNNVdx[k]*u[iconV[k,iel]]
Lyyq+=dNNNVdy[k]*v[iconV[k,iel]]
Lxyq+=dNNNVdx[k]*v[iconV[k,iel]]
Lyxq+=dNNNVdy[k]*u[iconV[k,iel]]
#end for
M_el +=NNNV1.dot(NNNV1.T)*weightq*jcob
fLxx_el[:]+=NNNV1[:,0]*Lxxq*jcob*weightq
fLyy_el[:]+=NNNV1[:,0]*Lyyq*jcob*weightq
fLxy_el[:]+=NNNV1[:,0]*Lxyq*jcob*weightq
fLyx_el[:]+=NNNV1[:,0]*Lyxq*jcob*weightq
#end for kq
for k1 in range(0,mV):
m1=iconV[k1,iel]
for k2 in range(0,mV):
m2=iconV[k2,iel]
M_mat[m1,m2]+=M_el[k1,k2]
#end for
rhsLxx[m1]+=fLxx_el[k1]
rhsLyy[m1]+=fLyy_el[k1]
rhsLxy[m1]+=fLxy_el[k1]
rhsLyx[m1]+=fLyx_el[k1]
#end for
#end for
#sparse_matrix=A_sparse.tocsr()
Lxx3 = sps.linalg.spsolve(sps.csr_matrix(M_mat),rhsLxx)
Lyy3 = sps.linalg.spsolve(sps.csr_matrix(M_mat),rhsLyy)
Lxy3 = sps.linalg.spsolve(sps.csr_matrix(M_mat),rhsLxy)
Lyx3 = sps.linalg.spsolve(sps.csr_matrix(M_mat),rhsLyx)
exx3[:]=Lxx3[:]
eyy3[:]=Lyy3[:]
exy3[:]=0.5*(Lxy3[:]+Lyx3[:])
return exx3,eyy3,exy3
###############################################################################