32
33
34
35 USE elbufdef_mod
37
38
39
40#include "implicit_f.inc"
41
42
43
44#include "com04_c.inc"
45#include "scr05_c.inc"
46#include "param_c.inc"
47
48
49
50 my_real,
INTENT(INOUT) :: a(3,numnod),v(3,numnod),x(3,numnod)
51 DOUBLE PRECISION, INTENT(INOUT) :: XDP(3,NUMNOD)
52
53
54
55 INTEGER I,J,K,L,NODE1,NODE2,NODE3,ANCHOR_NODE,NODE2_N,ORIENTATION_NODE,SWIP,INDEX
57
58
59
60
61
62
63 DO i=1,nslipring
64
66
67 anchor_node =
slipring(i)%FRAM(j)%ANCHOR_NODE
68 orientation_node =
slipring(i)%FRAM(j)%ORIENTATION_NODE
72
73 IF (orientation_node > 0) THEN
74
75 nn(1) = x(1,orientation_node) - x(1,anchor_node)
76 nn(2) = x(2,orientation_node) - x(2,anchor_node)
77 nn(3) = x(3,orientation_node) - x(3,anchor_node)
78 norm = sqrt(
max(em30,nn(1)*nn(1)+nn(2)*nn(2)+nn(3)*nn(3)))
82
83 n1(1) = x(1,node1) - x(1,node2)
84 n1(2) = x(2,node1) - x(2,node2)
85 n1(3) = x(3,node1) - x(3,node2)
86 norm = sqrt(
max(em30,n1(1)*n1(1)+n1(2)*n1(2)+n1(3)*n1(3)))
90
91 n2(1) = x(1,node3) - x(1,node2)
92 n2(2) = x(2,node3) - x(2,node2)
93 n2(3) = x(3,node3) - x(3,node2)
94 norm = sqrt(
max(em30,n2(1)*n2(1)+n2(2)*n2(2)+n2(3)*n2(3)))
98
99 n3(1) = n1(2)*n2(3)-n1(3)*n2(2)
100 n3(2) = n1(3)*n2(1)-n1(1)*n2(3)
101 n3(3) = n1(1)*n2(2)-n1(2)*n2(1)
102 norm = sqrt(
max(em30,n3(1)*n3(1)+n3(2)*n3(2)+n3(3)*n3(3)))
106
107 scal = abs(n3(1)*nn(1)+n3(2)*nn(2)+n3(3)*nn(3))
108 slipring(i)%FRAM(j)%ORIENTATION_ANGLE = acos(scal)
109 ENDIF
110
111 IF(
slipring(i)%FRAM(j)%UPDATE < zero)
THEN
112
113 v(1,node2)=v(1,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(1)
114 v(2,node2)=v(2,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(2)
115 v(3,node2)=v(3,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(3)
116
117 v(1,node3)=v(1,anchor_node)
118 v(2,node3)=v(2,anchor_node)
119 v(3,node3)=v(3,anchor_node)
120
121 a(1,node3)=a(1,anchor_node)
122 a(2,node3)=a(2,anchor_node)
123 a(3,node3)=a(3,anchor_node)
124
125 x(1,node3)=x(1,anchor_node)
126 x(2,node3)=x(2,anchor_node)
127 x(3,node3)=x(3,anchor_node)
128
129 IF (iresp == 1) THEN
130 xdp(1,node3)=xdp(1,anchor_node)
131 xdp(2,node3)=xdp(2,anchor_node)
132 xdp(3,node3)=xdp(3,anchor_node)
133 ENDIF
134
135 ELSEIF(
slipring(i)%FRAM(j)%UPDATE > zero)
THEN
136
137 v(1,node2)=v(1,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(4)
138 v(2,node2)=v(2,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(5)
139 v(3,node2)=v(3,anchor_node)-
slipring(i)%FRAM(j)%MATERIAL_FLOW*
slipring(i)%FRAM(j)%VECTOR(6)
140
141 v(1,node1)=v(1,anchor_node)
142 v(2,node1)=v(2,anchor_node)
143 v(3,node1)=v(3,anchor_node)
144
145 a(1,node1)=a(1,anchor_node)
146 a(2,node1)=a(2,anchor_node)
147 a(3,node1)=a(3,anchor_node)
148
149 x(1,node1)=x(1,anchor_node)
150 x(2,node1)=x(2,anchor_node)
151 x(3,node1)=x(3,anchor_node)
152
153 IF (iresp == 1) THEN
154 xdp(1,node1)=xdp(1,anchor_node)
155 xdp(2,node1)=xdp(2,anchor_node)
156 xdp(3,node1)=xdp(3,anchor_node)
157 ENDIF
158
159 ELSE
160
161 v(1,node2)=v(1,anchor_node)
162 v(2,node2)=v(2,anchor_node)
163 v(3,node2)=v(3,anchor_node)
164
165 a(1,node2)=a(1,anchor_node)
166 a(2,node2)=a(2,anchor_node)
167 a(3,node2)=a(3,anchor_node)
168
169 ENDIF
170
171 ENDDO
172
173 ENDDO
174
175
176
177
178
179 DO i=1,nretractor
180
185
187
191
192 v(1,node2_n)=v(1,anchor_node)
193 v(2,node2_n)=v(2,anchor_node)
194 v(3,node2_n)=v(3,anchor_node)
195
196 a(1,node2_n)=a(1,anchor_node)
197 a(2,node2_n)=a(2,anchor_node)
198 a(3,node2_n)=a(3,anchor_node)
199
200 swip = 0
202 IF (
retractor(i)%INACTI_NODE(k)==node2) swip = 1
204 ENDDO
206
208
209 v(1,node2)=v(1,anchor_node)
210 v(2,node2)=v(2,anchor_node)
211 v(3,node2)=v(3,anchor_node)
212
213 v(1,node1)=v(1,anchor_node)
214 v(2,node1)=v(2,anchor_node)
215 v(3,node1)=v(3,anchor_node)
216
217 a(1,node1)=a(1,anchor_node)
218 a(2,node1)=a(2,anchor_node)
219 a(3,node1)=a(3,anchor_node)
220
221 x(1,node1)=x(1,anchor_node)
222 x(2,node1)=x(2,anchor_node)
223 x(3,node1)=x(3,anchor_node)
224
225 IF (iresp == 1) THEN
226 xdp(1,node1)=xdp(1,anchor_node)
227 xdp(2,node1)=xdp(2,anchor_node)
228 xdp(3,node1)=xdp(3,anchor_node)
229 ENDIF
230
232 retractor(i)%INACTI_NODE(index+1) = node2
234
235 ELSE
236
237 v(1,node2)=v(1,anchor_node)
238 v(2,node2)=v(2,anchor_node)
239 v(3,node2)=v(3,anchor_node)
240
241 a(1,node2)=a(1,anchor_node)
242 a(2,node2)=a(2,anchor_node)
243 a(3,node2)=a(3,anchor_node)
244
245 ENDIF
246
247
248
251 v(1,l)=v(1,anchor_node)
252 v(2,l)=v(2,anchor_node)
253 v(3,l)=v(3,anchor_node)
254
255 a(1,l)=a(1,anchor_node)
256 a(2,l)=a(2,anchor_node)
257 a(3,l)=a(3,anchor_node)
258 ENDDO
259
260 ENDDO
261
262
263
264
265
266
267 RETURN
268
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
type(retractor_struct), dimension(:), allocatable retractor
type(slipring_struct), dimension(:), allocatable slipring