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
88
89
90
91#include "implicit_f.inc"
92
93
94
95 INTEGER IDX, IDY, IDZ, NCTRL, PX, PY, PZ, ITEL, N, BOOLG,IDX2, IDY2, IDZ2
97 . gaussx, gaussy, gaussz, detjac,
98 . r(*),drdx(nctrl,3),xxi(*),yyi(*),zzi(*),
99 . wwi(*),kx(*), ky(*), kz(*), knotlocx(px+2,nctrl),
100 . knotlocy(py+2,nctrl),knotlocz(pz+2,nctrl),knotlocelx(2),
101 . knotlocely(2),knotlocelz(2)
102
103
104
105 INTEGER NUMLOC, I, J, K, NA, NB, NC
107 . drdxi(nctrl,3),sumtot, detdxdxi, fn(nctrl),
108 . dndxi(nctrl), fm(nctrl), dmdxi(nctrl), fl(nctrl),
109 . dldxi(nctrl), xi(3), sumxi(3), ajmat(3,3),
110 . dxidtildexi(3,3), dxidx(3,3), dxdxi(3,3)
111
112
113
114
115
116
117 dxdxi(:,:)=zero
118 dxidtildexi(:,:)=zero
119 ajmat(:,:)=zero
120 drdx(:,:)=zero
121
122 IF (boolg == 1) THEN
123
124 xi(1) = ((knotlocelx(2)-knotlocelx(1))*gaussx + (knotlocelx(2)+(knotlocelx(1))))/two
125 xi(2) = ((knotlocely(2)-knotlocely(1))*gaussy + (knotlocely(2)+(knotlocely(1))))/two
126 xi(3) = ((knotlocelz(2)-knotlocelz(1))*gaussz + (knotlocelz(2)+(knotlocelz(1))))/two
127
128
129
130 ELSE
131
132 xi(1) = gaussx
133 xi(2) = gaussy
134 xi(3) = gaussz
135 ENDIF
136
137
138
139 DO numloc=1,nctrl
140 CALL dersonebasisfun(1, px, xi(1), knotlocx(:,numloc), fn(numloc), dndxi(numloc))
141 CALL dersonebasisfun(1, py, xi(2), knotlocy(:,numloc), fm(numloc), dmdxi(numloc))
142 CALL dersonebasisfun(1, pz, xi(3), knotlocz(:,numloc), fl(numloc), dldxi(numloc))
143 ENDDO
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 sumtot=zero
160 sumxi(1)=zero
161 sumxi(2)=zero
162 sumxi(3)=zero
163
164 DO numloc=1,nctrl
165 r(numloc)=fn(numloc)*fm(numloc)*fl(numloc)*wwi(numloc)
166 sumtot=sumtot+r(numloc)
167
168 drdxi(numloc,1)=dndxi(numloc)*fm(numloc)*fl(numloc)*
169 . wwi(numloc)
170 sumxi(1)=sumxi(1)+drdxi(numloc,1)
171 drdxi(numloc,2)=fn(numloc)*dmdxi(numloc)*fl
172 . wwi(numloc)
173 sumxi(2)=sumxi(2)+drdxi(numloc,2)
174 drdxi(numloc,3)=fn(numloc)*fm(numloc)*dldxi(numloc)*
175 . wwi(numloc)
176 sumxi(3)=sumxi(3)+drdxi(numloc,3)
177 ENDDO
178
179
180
181 DO numloc=1,nctrl
182 r(numloc)=r(numloc)/sumtot
183 ENDDO
184
185 DO i=1,3
186 DO numloc=1,nctrl
187 drdxi(numloc,i)=(drdxi(numloc,i)-r(numloc)*sumxi(i))/sumtot
188 ENDDO
189 ENDDO
190
191
192
193 DO nb=1,3
194 DO numloc=1,nctrl
195 dxdxi(1,nb)=dxdxi(1,nb)+xxi(numloc)*drdxi(numloc,nb)
196 dxdxi(2,nb)=dxdxi(2,nb)+yyi(numloc)*drdxi(numloc,nb)
197 dxdxi(3,nb)=dxdxi(3,nb)+zzi(numloc)*drdxi(numloc,nb)
198 ENDDO
199 ENDDO
200
201
202
203 detdxdxi=dxdxi(1,2)*dxdxi(2,3)*dxdxi(3,1)
204 . -dxdxi(1,3)*dxdxi(2,2)*dxdxi(3,1)
205 . +dxdxi(1,3)*dxdxi(2,1)*dxdxi(3,2)
206 . -dxdxi(1,1)*dxdxi(2,3)*dxdxi(3,2)
207 . +dxdxi(1,1)*dxdxi(2,2)*dxdxi(3,3)
208 . -dxdxi(1,2)*dxdxi(2,1)*dxdxi(3,3)
209
210 IF(detdxdxi/=0) THEN
211 dxidx(1,1)=(dxdxi(2,2)*dxdxi(3,3)-dxdxi(2,3)*dxdxi(3,2))/detdxdxi
212 dxidx(1,2)=(dxdxi(1,3)*dxdxi(3,2)-dxdxi(1,2)*dxdxi(3,3))/detdxdxi
213 dxidx(1,3)=(dxdxi(1,2)*dxdxi(2,3)-dxdxi(1,3)*dxdxi(2,2))/detdxdxi
214 dxidx(2,1)=(dxdxi(2,3)*dxdxi(3,1)-dxdxi(2,1)*dxdxi(3,3))/detdxdxi
215 dxidx(2,2)=(dxdxi(1,1)*dxdxi(3,3)-dxdxi(1,3)*dxdxi(3,1))/detdxdxi
216 dxidx(2,3)=(dxdxi(1,3)*dxdxi(2,1)-dxdxi(1,1)*dxdxi(2,3))/detdxdxi
217 dxidx(3,1)=(dxdxi(2,1)*dxdxi(3,2)-dxdxi(2,2)*dxdxi(3,1))/detdxdxi
218 dxidx(3,2)=(dxdxi(1,2)*dxdxi(3,1)-dxdxi(1,1)*dxdxi(3,2))/detdxdxi
219 dxidx(3,3)=(dxdxi(1,1)*dxdxi(2,2)-dxdxi(1,2)*dxdxi(2,1))/detdxdxi
220 ENDIF
221
222
223
224
225 dxidtildexi(1,1)=(knotlocelx(2)-knotlocelx(1))/two
226 dxidtildexi(2,2)=(knotlocely(2)-knotlocely(1))/two
227 dxidtildexi(3,3)=(knotlocelz(2)-knotlocelz(1))/two
228
229
230
231
232
233
234
235
236
237 DO na=1,3
238 DO nb=1,3
239 DO numloc=1,nctrl
240 drdx(numloc,na)=drdx(numloc,na)+(drdxi(numloc,nb)*dxidx(nb,na))
241 ENDDO
242 DO nc=1,3
243 ajmat(na,nb)=ajmat(na,nb)+dxdxi(na,nc)*dxidtildexi(nc,nb)
244 ENDDO
245 ENDDO
246 ENDDO
247
248
249
250
251 detjac=(ajmat(1,1)*ajmat(2,2)*ajmat(3,3))
252 . +(ajmat(1,2)*ajmat(2,3)*ajmat(3,1))
253 . +(ajmat(2,1)*ajmat(3,2)*ajmat(1,3))
254 . -(ajmat(1,3)*ajmat(2,2)*ajmat(3,1))
255 . -(ajmat(1,2)*ajmat(2,1)*ajmat(3,3))
256 . -(ajmat(2,3)*ajmat(3,2)*ajmat(1,1))
257
258 RETURN
subroutine dersonebasisfun(idxi, pxi, xi, kxi, ders1, ders2)