40 USE python_funct_mod
41
42
43
44#include "implicit_f.inc"
45#include "comlock.inc"
46
47
48
49#include "mvsiz_p.inc"
50
51
52
53#include "units_c.inc"
54#include "scr17_c.inc"
55#include "scr14_c.inc"
56#include "param_c.inc"
57#include "com08_c.inc"
58
59
60
61 type(python_), intent(inout) :: PYTHON
62 INTEGER, INTENT(IN) :: NEL
63 INTEGER, INTENT(IN) :: NFT
64 INTEGER NPF(*),IGEO(NPROPGI,*),NGL(*),MGN(*)
65
67 . geo(npropg,*),f(*),al0(*),e(*),dl(*),tf(*),off(*),
68 . anim(*),ipos(*),v(3,*),
69 . al0_err(*),ex(mvsiz),ey(mvsiz),ez(mvsiz),xk(mvsiz),
70 . xm(mvsiz),xc(mvsiz),fscale(mvsiz)
71 DOUBLE PRECISION X1DP(3,*),X2DP(3,*)
72 my_real,
DIMENSION(NEL),
INTENT(INOUT) ::
73 . crit
74
75
76
77 INTEGER I,J,NINDX,PID
78 INTEGER NC1(MVSIZ), NC2(),INDX(MVSIZ),IFUNC(MVSIZ),
79 . IFUNC2(MVSIZ),IFAIL(MVSIZ),ILENG(MVSIZ),ITENS(MVSIZ),
80 . FSMOOTH(MVSIZ)
81
83 . dlold(mvsiz),dmn(mvsiz),dmx(mvsiz),xl0(mvsiz),df1,df2,
84 . dvl(mvsiz),fk(mvsiz),fd(mvsiz),ddl(mvsiz),gap(mvsiz),
85 . fscale2(mvsiz),ascale(mvsiz),ascale2(mvsiz),fold(mvsiz),
86 . nexp(mvsiz),fcut(mvsiz),
alpha(mvsiz),fkold(mvsiz)
88 . bid,sum,dt11,damp,damm
89 DOUBLE PRECISION EXDP(MVSIZ),EYDP(MVSIZ),EZDP(MVSIZ),ALDP(MVSIZ),
90 . AL0DP(MVSIZ)
91 LOGICAL :: ANY_PYTHON_FUNCTION
92 INTEGER :: NFUNCT,PYID
93
94
95
97 . finter
98 EXTERNAL finter
99
100
101
102
103
104 any_python_function = .false.
105 nfunct = python%FUNCT_OFFSET + python%nb_functs - python%nb_sensors
106
107 DO i=1,nel
108 pid = mgn(i)
109 xm(i) = geo(1,pid)
110 xk(i) = geo(2,pid)
111 xc(i) = geo(3,pid)
112 fscale(i) = geo(10,pid)
113 dmn(i) = geo(15,pid)
114 dmx(i) = geo(16,pid)
115 ascale2(i) = geo(18,pid)
116 gap(i) = geo(19,pid)
117 ascale(i) = geo(39,pid)
118 ifail(i) = nint(geo(43,pid))
119 ileng(i) = nint(geo(93,pid))
120 fscale2(i) = geo(132,pid)
121 itens(i) = nint(geo(133,pid))
122 nexp(i) = geo(134,pid)
123 fsmooth(i) = nint(geo(135,pid))
124 fcut(i) = geo(136,pid)
125 ifunc(i) = igeo(101,pid)
126 ifunc2(i) = igeo(102,pid)
127 IF (ifunc2(i) /= 0) xc(i) = geo(141,pid)
128 pyid = python_funct_id(nfunct, ifunc(i),npf)
129 IF(pyid > 0) THEN
130 any_python_function = .true.
131 ifunc(i) = -pyid
132 ENDIF
133 pyid = python_funct_id(nfunct, ifunc2(i),npf)
134 IF(pyid > 0) THEN
135 any_python_function = .true.
136 ifunc2(i) = -pyid
137 ENDIF
138 ENDDO
139
140
141
142
143
144 DO i=1,nel
145 exdp(i) = x2dp(1,i)-x1dp(1,i)
146 eydp(i) = x2dp(2,i)-x1dp(2,i)
147 ezdp(i) = x2dp(3,i)-x1dp(3,i)
148 dlold(i) = dl(i)
149 aldp(i) = sqrt(exdp(i)*exdp(i)+eydp(i)*eydp(i)+ezdp(i)*ezdp(i))
150 ENDDO
151
152
153 IF (tt == zero) THEN
154 DO i=1,nel
155 al0(i) = aldp(i)
156 al0_err(i) = aldp(i)-al0(i)
157 ENDDO
158 ENDIF
159
160 DO i=1,nel
161 al0dp(i) = al0(i)
162 al0dp(i) = al0dp(i) + al0_err(i)
163 ENDDO
164
165 DO i=1,nel
166 sum =
max(aldp(i),em15)
167 exdp(i) = exdp(i)/sum
168 eydp(i) = eydp(i)/sum
169 ezdp(i) = ezdp(i)/sum
170 ex(i) = exdp(i)
171 ey(i) = eydp(i)
172 ez(i) = ezdp(i)
173 ENDDO
174
175
176 DO i=1,nel
177 dl(i) = aldp(i) - al0dp(i)
178 ENDDO
179
180
181 DO i=1,nel
182
183 IF (ileng(i) /= 0) THEN
184 xl0(i) = al0dp(i)
185
186 ELSE
187 xl0(i) = one
188 ENDIF
189 ENDDO
190
191
192
193
194
195
196 dt11 = dt1
197 IF (dt11 == zero) dt11 = ep30
198
199
200 DO i = 1,nel
201
202 dl(i) = dl(i)/xl0(i)
203
204 dlold(i) = dlold(i)/xl0(i)
205
206 ddl(i) = (dl(i)-dlold(i))
207
208 dvl(i) = ddl(i)/dt11
209
210 e(i) = e(i)/xl0(i)
211
212 fold(i) = f(i)
213 ENDDO
214
215
216
217
218 DO i=1,nel
219
220
221 IF ((off(i) == one).AND.(dl(i) < gap(i) .OR. itens(i) > 0)) THEN
222
223
224 IF (ifunc(i) > 0) THEN
225 fk(i) = fscale(i)*finter(ifunc(i),(dl(i)-gap(i))/ascale(i),npf,tf,df1)
226 ELSEIF(ifunc(i) < 0) THEN
227 CALL python_call_funct1d(python, -ifunc(i),(dl(i)-gap(i))/ascale(i), fk(i))
228 ELSE
229 IF (abs(dl(i)-gap(i)) > zero) THEN
230 fk(i) = sign(one,(dl(i)-gap(i)))*xk(i)*exp(nexp(i)*log(abs(dl(i)-gap(i))))
231 ELSE
232 fk(i) = zero
233 ENDIF
234
235 IF (nexp(i) > one) THEN
236
237 IF (abs(dlold(i)-gap(i)) > zero) THEN
238 fkold(i) = sign(one,(dlold(i)-gap(i)))*xk(i)*exp(nexp(i)*log(abs(dlold(i)-gap(i))))
239 ELSE
240 fkold(i) = zero
241 ENDIF
242
243 xk(i) =
max(abs((fk(i)-fkold(i))/sign(
max(abs(ddl(i)),em20),ddl(i))),xk(i))
244 ENDIF
245 ENDIF
246
247
248
249 IF (ifunc2(i) > 0) THEN
250 fd(i) = fscale2(i)*finter(ifunc2(i),dvl(i)/ascale2(i),npf,tf,df2)
251
252 ELSEIF(ifunc2(i) < 0) THEN
253 CALL python_call_funct1d(python, -ifunc2(i),dvl(i)/ascale2(i), fd(i))
254 ELSE
255 fd(i) = xc(i)*dvl(i)
256 ENDIF
257
258
259 IF (abs(fk(i)) > abs(fd(i))) THEN
260 f(i) = fk(i) + fd(i)
261 ELSE
262 f(i) = two*fk(i)
263 xk(i) = two*xk(i)
264 xc(i) = zero
265 ENDIF
266 ELSE
267 f(i) = zero
268 xc(i) = zero
269 ENDIF
270
271
272 IF (fsmooth(i) > 0) THEN
273 alpha(i) = (two*pi*dt11*fcut(i))/(two*pi*dt11*fcut(i) + one)
274 f(i) =
alpha(i)*f(i) + (one -
alpha(i))*fold(i)
275 ENDIF
276
277 ENDDO
278
279
280 IF (anim_fe(11) /= 0) THEN
281 DO i=1,nel
282 j = i+nft
283 IF (ifail(i) == 1) THEN
284 IF (itens(i) > 0) THEN
285 damp = dl(i)/
max(dmx(i),em15)
286 ELSE
287 damp = zero
288 ENDIF
289 damm = dl(i)/
min(dmn(i),-em15)
290 ELSEIF (ifail(i) == 2) THEN
291 IF (itens(i) > 0) THEN
292 damp = f(i)/
max(dmx(i),em15)
293 ELSE
294 damp = zero
295 ENDIF
296 damm = f(i)/
min(dmn(i),-em15)
297 ELSE
298 damp = zero
299 damm = zero
300 ENDIF
301 anim(j) =
max(anim(j),damp,damm)
302 anim(j) =
min(anim(j),one)
303 ENDDO
304 ENDIF
305
306
307 DO i=1,nel
308 e(i) = e(i) + (dl(i)-dlold(i))*(f(i)+fold(i)) * half
309 e(i) = e(i)*xl0(i)
310 dl(i) = dl(i)*xl0(i)
311 dlold(i) = dlold(i)*xl0(i)
312 xm(i) = xm(i)*xl0(i)
313 xk(i) = xk(i)/xl0(i)
314 xc(i) = xc(i)/xl0(i)
315 ENDDO
316
317
318
319
320
321 nindx = 0
322 DO i=1,nel
323 IF (off(i) == one .AND. ifail(i) /= 0) THEN
324 IF (ifail(i) == 1) THEN
325 IF (itens(i) > 0) THEN
326 crit(i) =
max(dl(i)/(dmx(i)*xl0(i)),dl(i)/(dmn(i)*xl0(i)))
327 crit(i) =
min(crit(i),one)
328 crit(i) =
max(crit(i),zero)
329 IF (dl(i) > dmx(i)*xl0(i) .OR. dl(i) < dmn(i)*xl0(i)) THEN
330 crit(i) = one
331 off(i) = zero
332 nindx = nindx + 1
333 indx(nindx) = i
334 idel7nok = 1
335 ENDIF
336 ELSE
337 crit(i) = dl(i)/(dmn(i)*xl0(i))
338 crit(i) =
min(crit(i),one)
339 crit(i) =
max(crit(i),zero)
340 IF (dl(i) < dmn(i)*xl0(i)) THEN
341 crit(i) = one
342 off(i) = zero
343 nindx = nindx + 1
344 indx(nindx) = i
345 idel7nok = 1
346 ENDIF
347 ENDIF
348 ELSEIF (ifail(i) == 2) THEN
349 IF (itens(i) > 0) THEN
350 crit(i) =
max(f(i)/dmx(i),f(i)/dmn(i))
351 crit(i) =
min(crit(i),one)
352 crit(i) =
max(crit(i),zero)
353 IF (f(i) > dmx(i) .OR. f(i) < dmn(i)) THEN
354 crit(i) = one
355 off(i) = zero
356 nindx = nindx + 1
357 indx(nindx) = i
358 idel7nok = 1
359 ENDIF
360 ELSE
361 crit(i) = f(i)/dmn(i)
362 crit(i) =
min(crit(i),one)
363 crit(i) =
max(crit(i),zero)
364 IF (f(i) < dmn(i)) THEN
365 crit(i) = one
366 off(i) = zero
367 nindx = nindx + 1
368 indx(nindx) = i
369 idel7nok = 1
370 ENDIF
371 ENDIF
372 ENDIF
373 ENDIF
374 ENDDO
375 DO j=1,nindx
376 i = indx(j)
377#include "lockon.inc"
378 WRITE(iout, 1000) ngl(i)
379 WRITE(istdo,1100) ngl(i),tt
380#include "lockoff.inc"
381 ENDDO
382
383 1000 FORMAT(1x,'-- RUPTURE OF SPRING ELEMENT NUMBER ',i10)
384 1100 FORMAT(1x,'-- RUPTURE OF SPRING ELEMENT :',i10,' AT TIME :',g11.4)
385