43
44 USE python_funct_mod
45 USE vinter_mixed_mod
46
47
48
49#include "implicit_f.inc"
50
51
52
53#include "mvsiz_p.inc"
54
55
56
57#include "com08_c.inc"
58#include "scr05_c.inc"
59#include "impl1_c.inc"
60#include "com04_c.inc"
61#include "tabsiz_c.inc"
62
63
64
65 type(python_), intent(inout) :: PYTHON
66 INTEGER, INTENT(IN) :: NPF(SNPC),IANI,NEL, NFT
67 INTEGER, DIMENSION(MVSIZ),INTENT(INOUT) :: IECROU,IFUNC,IFV,
68 . IFUNC2,IFUNC3,IFUNC4
69
70 my_real,
DIMENSION(MVSIZ),
INTENT(IN):: ak,b,xl0,xk,ff,lscale,dmn,
71 . dmx,off,xc,ee,d
72 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: epla,dxold
73 my_real,
DIMENSION(MVSIZ),
INTENT(OUT) :: dvx
74 my_real,
DIMENSION(NEL) ,
INTENT(INOUT) :: fx,dx,dpx,fxep,
75 . e,dpx2, yield,xx_old
76 my_real,
INTENT(INOUT) :: pos(6,nel), anim(numelr*iani)
78
79
80
81 INTEGER, DIMENSION(MVSIZ) :: JPOS , JLEN,JAD,JPOS2,
82 . JLEN2,JPOS3, JLEN3,JAD2,
83 . IC1, JLEN4,IC2,IC0,
84 . J2POS,J2LEN,
85 . J2AD,JPOS4, J3POS, J3LEN,J3AD
86
87 INTEGER
88 . JFUNC,JFUNC2,JDMP,JECROU(-1:11),J2DMP,K1,NP1,NP2,
89 . I, , II, INTERP, K, FUNC,FUND,J1,J2FUNC,J3FUNC,J2K
90
91 my_real,
DIMENSION(MVSIZ) :: ddx,fold, gx, dxela, dyd,
92 . xx, xx2, xx3, yy, yy2, yy3,dydx,
93 . dydx2, dydx3, dydxv, dperm,fmax,
94 . dvxs,gf3,dydxv2,fmin,gx2,fy0,
95 . xfy0,ycut,xcut,xn3fy0,
96 . ul,fyield,dpl,yy22,xfyn1,an3y0,ddpx,
97 . xfyn33,xfyn11,dpx3,dpx22,xx22,
98 . edecal2,edecal3,ecrou,kx2,dkdx2,
99 . tmp1, tmp2
101 . dvv, dfac, dt11, damp, damm,b1,xi1,xi2,yi1,yi2 ,
102 . s1,s2,t1c,t2c,x1,x2,y1,y2
103 INTEGER :: PYID
104 LOGICAL :: ANY_PYTHON_FUNCTION
105
106 any_python_function = .false.
107 dt11 = dt1
108 IF(dt11==zero)dt11 = ep30
109 DO i=1,nel
110 dx(i)=dx(i)/xl0(i)
111 dxold(i)=dxold(i)/xl0(i)
112 dpx(i)=dpx(i)/xl0(i)
113 dpx2(i)=dpx2(i)/xl0(i)
114 e(i)=e(i)/xl0(i)
115 ENDDO
116
117 DO 80 i=1,nel
118 fold(i)=fx(i)
119 ddx(i)= (dx(i)-dxold(i))
120 dvx(i)= ddx(i)/ dt11
121 dvxs(i)= dvx(i)*ff(i)
122 80 CONTINUE
123
124
125 IF(iani/=0)THEN
126 DO i=1,nel
127 ii=i + nft
128 damp=dx(i)/
max(dmx(i),em15)
129 damm=dx(i)/
min(dmn(i),-em15)
130 anim(ii)=
max(anim(ii),damp,damm)
131 anim(ii)=
min(anim(ii),one)
132 ENDDO
133 ENDIF
134
135
136
137 jecrou(-1) = 0
138 jecrou(0) = 0
139 jecrou(1) = 0
140 jecrou(2) = 0
141 jecrou(3) = 0
142 jecrou(4) = 0
143 jecrou(5) = 0
144 jecrou(6) = 0
145 jecrou(7) = 0
146 jecrou(8) = 0
147 jecrou(9) = 0
148 jecrou(10) = 0
149 jecrou(11) = 0
151 jdmp = 0
152 j2dmp = 0
153 j2k = 0
154
155 DO i=1,nel
156 IF(ifunc(i)==0)THEN
157 jecrou(-1) = jecrou(-1) + 1
158
159 ELSEIF(iecrou(i)==0)THEN
160 jecrou(0) = jecrou(0) + 1
162 ELSEIF(iecrou(i)==1)THEN
163 jecrou(1) = jecrou(1) + 1
165 ELSEIF(iecrou(i)==2)THEN
166 jecrou(2) = jecrou(2) + 1
168 ELSEIF(iecrou(i)==3)THEN
169 jecrou(3) = jecrou(3) + 1
171 ELSEIF(iecrou(i)==4)THEN
172 jecrou(4) = jecrou(4) + 1
174 ELSEIF(iecrou(i)==5)THEN
175 jecrou(5) = jecrou(5) + 1
177 ELSEIF(iecrou(i)==6)THEN
178 jecrou(6) = jecrou(6) + 1
180 ELSEIF(iecrou(i)==7)THEN
181 jecrou(7) = jecrou(7) + 1
183 ENDIF
184 IF(ifv(i)/=0) jdmp = jdmp + 1
185 IF(ifunc3(i)/=0) j2dmp = j2dmp + 1
186 IF(ifunc4(i)/=0) j2k = j2k + 1
187 ENDDO
188
190 DO i=1,nel
191 jpos(i) = nint(pos(1,i))
192 jpos2(i) = nint(pos(2,i))
193 jpos3(i) = nint(pos(3,i))
194 jfunc =
max(1,ifunc(i))
195 pyid = python_funct_id(nfunct,jfunc,npf)
196 IF(pyid <=0) THEN
197 jfunc =
max(1,ifunc(i))
198 jad(i) = npf(jfunc) / 2 + 1
199 jlen(i) = npf(jfunc+1) / 2 - jad(i) - jpos(i)
200 jlen3(i) = npf(jfunc+1) / 2 - jad(i) - jpos3(i)
201 ELSE
202 any_python_function = .true.
203 jad(i) = -pyid
204 jlen(i) = -pyid
205 jlen3(i) = -pyid
206 ENDIF
207 jfunc2=
max(1,ifunc2(i))
208 pyid = python_funct_id(nfunct, jfunc2,npf)
209 IF(pyid <=0) THEN
210 jfunc2=
max(1,ifunc2(i))
211 jad2(i) = npf(jfunc2) / 2 + 1
212 jlen2(i) = npf(jfunc2+1) / 2 - jad2(i) - jpos2(i)
213 ELSE
214 jad2(i) = -pyid
215 jlen2(i) = -pyid
216 any_python_function = .true.
217 ENDIF
218 xx(i) =zero
219 xx2(i)=zero
220 xx3(i)=zero
221 ENDDO
222 ENDIF
223
224
225
226
227 IF(jecrou(0)+jecrou(2)== nel)THEN
228 DO i=1,nel
229 xx(i)=dx(i)
230 ENDDO
231 ELSEIF(jecrou(0)+jecrou(2)>0)THEN
232 DO i=1,nel
233 IF(ifunc(i)/=0.AND.(iecrou(i)==0.OR.iecrou(i)==2))THEN
234 xx(i)=dx(i)
235 ENDIF
236 ENDDO
237 ENDIF
238
239
240
241
242 IF(jecrou(1)+jecrou(3)== nel )THEN
243 DO i=1,nel
244 fx(i)=fxep(i)+xk(i)*ddx(i)
245 IF(fx(i)>=0.)THEN
246 xx(i)=dpx(i)+fx(i)/xk(i)
247 ELSE
248 xx(i)=-dpx(i)+fx(i)/xk(i)
249 ENDIF
250 ENDDO
251 ELSEIF(jecrou(1)+jecrou(3)>0)THEN
252 DO i=1,nel
253 IF(ifunc(i)/=0.AND.(iecrou(i)==1.OR.iecrou(i)==3THEN
254 fx(i)=fxep(i)+xk(i)*ddx(i)
255 IF(fx(i)>=zero)THEN
256 xx(i)=dpx(i)+fx(i)/xk(i)
257 ELSE
258 xx(i)=-dpx(i)+fx(i)/xk(i)
259 ENDIF
260 ENDIF
261 ENDDO
262 ENDIF
263
264
265
266 IF(jecrou(4)== nel )THEN
267 DO i=1,nel
269 xx(i) =dx(i)
270 xx2(i)=dx(i)
271 ENDDO
272 ELSEIF(jecrou(4)>0)THEN
273 DO i=1,nel
274 IF(ifunc(i)/=0.AND.iecrou(i)==4)THEN
276 xx(i) =dx(i)
277 xx2(i)=dx(i)
278 ENDIF
279 ENDDO
280 ENDIF
281
282
283
284
285
286 IF(jecrou(5)== nel )THEN
287 DO i=1,nel
288 xx(i)=dx(i)
289 IF(dx(i)>zero)THEN
291 xx2(i)=dpx(i)
292 xx3(i)=dpx(i)
293 ELSEIF(dx(i)<zero)THEN
295 xx2(i)=dpx2(i)
296 xx3(i)=dpx2(i)
297 ELSE
299 ENDIF
300 ENDDO
301 ELSEIF(jecrou(5)>0)THEN
302 DO i=1,nel
303 IF(ifunc(i)/=0.AND.iecrou(i)==5)THEN
304 xx(i)=dx(i)
305 IF(dx(i)>zero)THEN
307 xx2(i)=dpx(i)
308 xx3(i)=dpx(i)
309 ELSEIF(dx(i)<zero)THEN
311 xx2(i)=dpx2(i)
312 xx3(i)=dpx2(i)
313 ELSE
315 ENDIF
316 ENDIF
317 ENDDO
318 ENDIF
319
320
321
322 IF(any_python_function .AND. jecrou(6) > 0) THEN
323 DO i=1,nel
324 IF(ifunc2(i) < 0 ) THEN
325 fund = -jlen2(i)
326
327 CALL python_deriv_funct1d(python, fund, fxep(i), an3y0(i))
328
329 fx(i) = fxep(i) + an3y0(i) * ddx(i)
330 xx(i) = sign(abs(xx_old(i)), fx(i))
331 xx(i) = xx(i) + ddx(i)
333 ENDIF
334 ENDDO
335 ENDIF
336
337 IF(jecrou(6)== nel)THEN
338 DO i=1,nel
339 fund = ifunc2(i)
340 IF(jlen2(i) < 0) cycle
341 np2 = (npf(fund+1)-npf(fund))/2
342 an3y0(i)= zero
343 DO k=2,np2
344 k1=2*(k-2)
345 x1=tf(npf(fund)+k1)
346 x2=tf(npf(fund)+k1+2)
347 y1=tf(npf(fund)+k1+1)
348 y2=tf(npf(fund)+k1+3)
349 IF((fxep(i)< y2.AND.fxep(i)>=y1))THEN
350 an3y0(i)=(y2-y1)/ (x2-x1)
351 xn3fy0(i)=(fxep(i)-y1)/an3y0(i) + x1
352 EXIT
353 ENDIF
354 ENDDO
355 IF (an3y0(i)== zero)THEN
356 x1=tf(npf(fund)+(np2-2)*2)
357 x2=tf(npf(fund)+(np2-2)*2+2)
358 y1=tf(npf(fund)+(np2-2)*2+1)
359 y2=tf(npf(fund)+(np2-2)*2+3)
360
361 xi1=tf(npf(fund))
362 xi2=tf(npf(fund)+2)
363 yi1=tf(npf(fund)+1)
364 yi2=tf(npf(fund)+3)
365 IF(fxep(i)>y2)an3y0(i)=(y2-y1)/ (x2-x1)
366 IF(fxep(i)<yi1)an3y0(i)=(yi2-yi1)/ (xi2-xi1)
367 ENDIF
368 fx(i)=fxep(i)+an3y0(i)*ddx(i)
369 xx(i)=sign(abs(xx_old(i)),fx(i))
370 xx(i)=xx(i)+ddx(i)
372 ENDDO
373 ELSEIF(jecrou(6)>0)THEN
374 DO i=1,nel
375 IF(jlen(i) < 0) cycle
376 IF(ifunc(i) /= 0.AND.iecrou(i)== 6)THEN
377 fund = ifunc2(i)
378 np2 = (npf(fund+1)-npf(fund))/2
379 an3y0(i)= zero
380 DO k=2,np2
381 k1=2*(k-2)
382 x1=tf(npf(fund)+k1)
383 x2=tf(npf(fund)+k1+2)
384 y1=tf(npf(fund)+k1+1)
385 y2=tf(npf(fund)+k1+3)
386 IF((fxep(i)< y2.AND.fxep(i)>=y1))THEN
387 an3y0(i)=(y2-y1)/ (x2-x1)
388 xn3fy0(i)=(fxep(i)-y1)/an3y0(i) + x1
389 EXIT
390 ENDIF
391 ENDDO
392 IF (an3y0(i)== zero)THEN
393 x1=tf(npf(fund)+(np2-2)*2)
394 x2=tf(npf(fund)+(np2-2)*2+2)
395 y1=tf(npf(fund)+(np2-2)*2+1)
396 y2=tf(npf(fund)+(np2-2)*2+3)
397
398 xi1=tf(npf(fund))
399 xi2=tf(npf(fund)+2)
400 yi1=tf(npf(fund)+1)
401 yi2=tf(npf(fund)+3)
402 IF(fxep(i)>y2)an3y0(i)=(y2-y1)/ (x2-x1)
403 IF(fxep(i)<yi1)an3y0(i)=(yi2-yi1)/ (xi2-xi1)
404 ENDIF
405 fx(i)=fxep(i)+an3y0(i)*ddx(i)
406 xx(i)=sign(abs(xx_old(i)),fx(i))
407 xx(i)=xx(i)+ddx(i)
408 ENDIF
409 ENDDO
410 ENDIF
411
412
413
414 IF(jecrou(7)== nel)THEN
415 DO i=1,nel
417 xx(i) =dx(i)
418 xx2(i)=dx(i)
419 ENDDO
420 ELSEIF(jecrou(7)>0)THEN
421 DO i=1,nel
422 IF(ifunc(i)/=0.AND.iecrou(i)==7)THEN
424 xx(i) =dx(i)
425 xx2(i)=dx(i)
426 ENDIF
427 ENDDO
428 ENDIF
429
430
431
432 DO i=1,nel
433 xx(i) = xx(i) *lscale(i)
434 xx2(i) = xx2(i)*lscale(i)
435 xx3(i) = xx3(i)*lscale(i)
436 ENDDO
437
438 IF(any_python_function) THEN
439 IF(
interp>=1)
CALL vinter_mixed(python, tf,jad,jpos,jlen,nel,xx,dydx,yy)
440 IF(
interp>=2)
CALL vinter_mixed(python, tf,jad2,jpos2,jlen2,nel,xx2,dydx2,yy2)
441 IF(
interp>=3)
CALL vinter_mixed(python, tf,jad ,jpos3,jlen3
442 ELSEIF (iresp==1) THEN
444 .
CALL vinter2dp(tf,jad ,jpos ,jlen ,nel,xx ,dydx ,yy)
446 .
CALL vinter2dp(tf,jad2,jpos2,jlen2,nel,xx2,dydx2,yy2)
448 .
CALL vinter2dp(tf,jad ,jpos3,jlen3,nel,xx3,dydx3,yy3)
449 ELSE
451 .
CALL vinter2(tf,jad ,jpos ,jlen ,nel,xx ,dydx ,yy )
453 .
CALL vinter2(tf,jad2,jpos2,jlen2,nel,xx2,dydx2,yy2)
455 .
CALL vinter2(tf,jad ,jpos3,jlen3,nel,xx3,dydx3,yy3)
456 ENDIF
458 DO i=1,nel
459 pos(1,i) = jpos(i)
460 pos(2,i) = jpos2(i)
461 pos(3,i) = jpos3(i)
462 ENDDO
463 ENDIF
464
465
466
467 IF(jecrou(-1) == nel)THEN
468 DO i=1,nel
469 fx(i)=xk(i)*dx(i)
470 ENDDO
471 ELSEIF(jecrou(-1)>0)THEN
472 DO i=1,nel
473 IF(ifunc(i)==0)THEN
474 fx(i)=xk(i)*dx(i)
475 ENDIF
476 ENDDO
477 ENDIF
478
479
480
481 IF (jecrou(8) == nel )THEN
482 DO i=1,nel
483 fx(i)=yy(i)
484 ENDDO
485 ELSEIF (jecrou(8) > 0)THEN
486 DO i=1,nel
487 IF (iecrou(i) == 8) fx(i)=yy(i)
488 ENDDO
489 ENDIF
490
491
492
493 IF(jecrou(0)== nel)THEN
494 DO i=1,nel
495 fx(i)=yy(i)
496 ENDDO
497 ELSEIF(jecrou(0)>0)THEN
498 DO i=1,nel
499 IF(ifunc(i)/=0.AND.iecrou(i)==0) fx(i)=yy(i)
500 ENDDO
501 ENDIF
502
503
504
505 IF(jecrou(1)== nel )THEN
506 DO i=1,nel
507 IF(fx(i)>=zero.AND.fx(i)>yy(i))THEN
508 dpx(i)=dpx(i)+(fx(i)-yy(i))/xk(i)
509 fx(i)=yy(i)
510 ELSEIF(fx(i)<zero.AND.fx(i)<yy(i))THEN
511 dpx(i)=dpx(i)+(yy(i)-fx(i))/xk(i)
512 fx(i)=yy(i)
513 ENDIF
514 fxep(i)=fx(i)
515 ENDDO
516 ELSEIF(jecrou(1)>0)THEN
517 DO i=1,nel
518 IF(ifunc(i)/=0.AND.iecrou(i)==1)THEN
519 IF(fx(i)>=zero.AND.fx(i)>yy(i))THEN
520 dpx(i)=dpx(i)+(fx(i)-yy(i))/xk(i)
521 fx(i)=yy(i)
522 ELSEIF(fx(i)<zero.AND.fx(i)<yy(i))THEN
523 dpx(i)=dpx(i)+(yy(i)-fx(i))/xk(i)
524 fx(i)=yy(i)
525 ENDIF
526 fxep(i)=fx(i)
527 ENDIF
528 ENDDO
529 ENDIF
530
531
532
533 IF(jecrou(2)== nel )THEN
534 DO i=1,nel
535 IF(dx(i)>dpx(i))THEN
536 fx(i) = xk(i) * (dx(i)-dpx(i))
537 fxep(i)= yy(i)
538 fx(i) =
min(fx(i),fxep(i))
539 dpx(i) = dx(i) - fx(i) / xk(i)
540 ELSEIF(dx(i)<dpx2(i))THEN
541 fx(i) = xk(i) * (dx(i)-dpx2(i))
542 fxep(i) = yy(i)
543 fx(i) =
max(fx(i),fxep(i))
544 dpx2(i) = dx(i) - fx(i) / xk(i)
545 ELSE
546 fx(i) = zero
547 ENDIF
548 ENDDO
549 ELSEIF(jecrou(2)>0)THEN
550 DO i=1,nel
551 IF(ifunc(i)/=0.AND.iecrou(i)==2)THEN
552 IF(dx(i)>dpx(i))THEN
553 fx(i) = xk(i) * (dx(i)-dpx(i))
554 fxep(i)= yy(i)
555 fx(i) =
min(fx(i),fxep(i))
556 dpx(i) = dx(i) - fx(i) / xk(i)
557 ELSEIF(dx(i)<dpx2(i))THEN
558 fx(i) = xk(i) * (dx(i)-dpx2(i))
559 fxep(i) = yy(i)
560 fx(i) =
max(fx(i),fxep(i))
561 dpx2(i) = dx(i) - fx(i) / xk(i)
562 ELSE
563 fx(i) = zero
564 ENDIF
565 ENDIF
566 ENDDO
567 ENDIF
568
569
570
571 IF(jecrou(3)== nel )THEN
572 DO i=1,nel
573 IF(fx(i)>=zero.AND.fx(i)>yy(i))THEN
574 epla(i)=epla(i)+abs(yy(i)*(fx(i)-yy(i))/xk(i))
575 fx(i)=yy(i)
576 ELSEIF(fx(i)<zero.AND.fx(i)<yy(i))THEN
577 epla(i)=epla(i)+abs(yy(i)*(yy(i)-fx(i))/xk(i))
578 fx(i)=yy(i)
579 ENDIF
580 fxep(i)=fx(i)
581 ENDDO
582 ELSEIF(jecrou(3)>0)THEN
583 DO i=1,nel
584 IF(ifunc(i)/=0.AND.iecrou(i)==3)THEN
585 IF(fx(i)>=zero.AND.fx(i)>yy(i))THEN
586 epla(i)=epla(i)+abs(yy(i)*(fx(i)-yy(i))/xk(i))
587 fx(i)=yy(i)
588 ELSEIF(fx(i)<zero.AND.fx(i)<yy(i))THEN
589 epla(i)=epla(i)+abs(yy(i)*(yy(i)-fx(i))/xk(i))
590 fx(i)=yy(i)
591 ENDIF
592 fxep(i)=fx(i)
593 ENDIF
594 ENDDO
595 ENDIF
596
597
598
599 IF(jecrou(4)== nel )THEN
600 DO i=1,nel
601 fx(i) = fxep(i) + xk(i)*ddx(i)
602 ic2(i)= 0
603 IF(fx(i)>yy(i))THEN
604 ic2(i)=1
605 fx(i) = yy(i)
606 ENDIF
607 IF(fx(i)<yy2(i))THEN
608 ic2(i)=2
609 fx(i) = yy2(i)
610 ENDIF
611 ENDDO
612 DO i=1,nel
613 fxep(i)=fx(i)
614 dpx(i) = dx(i) - fx(i) / xk(i)
615 ENDDO
616 ELSEIF(jecrou(4)>0)THEN
617 DO i=1,nel
618 IF(ifunc(i)/=0.AND.iecrou(i)==4)THEN
619 fx(i) = fxep(i) + xk(i)*ddx(i)
620 ic2(i)= 0
621 IF(fx(i)>yy(i))THEN
622 ic2(i)=1
623 fx(i) = yy(i)
624 ENDIF
625 IF(fx(i)<yy2(i))THEN
626 ic2(i)=2
627 fx(i) = yy2(i)
628 ENDIF
629 ENDIF
630 ENDDO
631 DO i=1,nel
632 IF(ifunc(i)/=0.AND.iecrou(i)==4)THEN
633 fxep(i)=fx(i)
634 dpx(i) = dx(i) - fx(i) / xk(i)
635 ENDIF
636 ENDDO
637 ENDIF
638
639
640
641
642
643 IF(jecrou(5)== nel )THEN
644 DO i=1,nel
645 IF(dx(i)>dpx(i))THEN
646 fx(i)=yy(i)
647 dpx(i) = dx(i)
648 ELSEIF(dx(i)>zero)THEN
649 dperm(i)=
max(yy2(i),zero)
650 tmp1(i) = dperm(i)
651 IF(dx(i)>dperm(i).AND.yy3(i)/=zero)THEN
652 fmax(i)=yy3(i)/lscale(i)
653 tmp2(i) = fmax(i)
654 dperm(i)=
min(dperm(i),dpx(i)- fmax(i) / xk(i))
655 b1 = (dpx(i)-dperm(i))*xk(i)/fmax(i)
656 fmin(i)=fmax(i)*
657 . ( (dx(i)-dperm(i))/(dpx(i)-dperm(i)) )**b1
658 fmax(i) = fmax(i)*(dx(i)-dperm(i))/(dpx(i)-dperm(i))
659 fx(i)=fxep(i)+xk(i)*ddx(i)
660 fx(i)=
max(fx(i),fmin(i),zero)
661 fx(i)=
min(fx(i),fmax(i),yy(i))
662 ELSE
663 fx(i) = zero
664 ENDIF
665 ELSEIF(dx(i)<dpx2(i))THEN
666 fx(i)=yy(i)
667 dpx2(i) = dx(i)
668 ELSEIF(dx(i)<zero)THEN
669 dperm(i)=
min(yy2(i),zero)
670 tmp1(i) = dperm(i)
671 IF(dx(i)<dperm(i).AND.yy3(i)/=zero)THEN
672 fmax(i)=yy3(i)/lscale(i)
673 tmp2(i) = fmax(i)
674 dperm(i)=
max(dperm(i),dpx2(i)- fmax(i) / xk(i))
675 b1 = (dpx2(i)-dperm(i))*xk(i)/fmax(i)
676 fmin(i)= fmax(i)*
677 . ( (-dx(i)+dperm(i)) / (-dpx2(i)+dperm(i)) )**b1
678 fmax(i) = fmax(i)*(dx(i)-dperm(i))/(dpx2(i)-dperm(i))
679 fx(i)=fxep(i)+xk(i)*ddx(i)
680 fx(i)=
min(fx(i),fmin(i),zero)
681 fx(i)=
max(fx(i),fmax(i),yy(i))
682 ELSE
683 fx(i) = zero
684 ENDIF
685 ENDIF
686 fxep(i)=fx(i)
687 ENDDO
688 ELSEIF(jecrou(5)>0)THEN
689 DO i=1,nel
690 IF(ifunc(i)/=0.AND.iecrou(i)==5)THEN
691 IF(dx(i)>dpx(i))THEN
692 fx(i)=yy(i)
693 dpx(i) = dx(i)
694 ELSEIF(dx(i)>zero)THEN
695 dperm(i)=
max(yy2(i),zero)
696 IF(dx(i)>dperm(i).AND.yy3(i)/=zero)THEN
697 fmax(i)=yy3(i)/lscale(i)
698 dperm(i)=
min(dperm(i),dpx(i)- fmax(i) / xk(i))
699
700 b1 = (dpx(i)-dperm(i))*xk(i)/fmax(i)
701 fmin(i) = fmax(i) *
702 . ( (dx(i)-dperm(i))/(dpx(i)-dperm(i)) )**b1
703 fmax(i) = fmax(i)*(dx(i)-dperm(i))/(dpx(i)-dperm(i))
704 fx(i)=fxep(i)+xk(i)*ddx(i)
705 fx(i)=
max(fx(i),fmin(i),zero)
706 fx(i)=
min(fx(i),fmax(i),yy(i))
707 ELSE
708 fx(i) = zero
709 ENDIF
710 ELSEIF(dx(i)<dpx2(i))THEN
711 fx(i)=yy(i)
712 dpx2(i) = dx(i)
713 ELSEIF(dx(i)<zero)THEN
714 dperm(i)=yy2(i)
715 dperm(i)=
min(dperm(i),zero)
716 IF(dx(i)<dperm(i).AND.yy3(i)/=zero)THEN
717 fmax(i)=yy3(i)/lscale(i)
718 dperm(i)=
max(dperm(i),dpx2(i)- fmax(i) / xk(i))
719
720 b1 = (dpx2(i)-dperm(i))*xk(i)/fmax(i)
721 fmin(i) = fmax(i)*
722 . ( (-dx(i)+dperm(i))/(-dpx2(i)+dperm(i)) )**b1
723 fmax(i) = fmax(i)*(dx(i)-dperm(i))/(dpx2(i)-dperm(i))
724 fx(i)=fxep(i)+xk(i)*ddx(i)
725 fx(i)=
min(fx(i),fmin(i),zero)
726 fx(i)=
max(fx(i),fmax(i),yy(i))
727 ELSE
728 fx(i) = zero
729 ENDIF
730 ENDIF
731 fxep(i)=fx(i)
732 ENDIF
733 ENDDO
734 ENDIF
735
736
737
738 IF(jecrou(6) == nel )THEN
739 if(any_python_function) then
740 CALL vinter_mixed(python, tf,jad,jpos,jlen,nel,xx,dydx,yy)
741 ELSE
742 CALL vinter2(tf,jad ,jpos ,jlen ,nel ,xx ,dydx ,yy )
743 ENDIF
744 DO i=1,nel
745 IF(fx(i)>= zero.AND.fx(i)>yield(i))THEN
746 pos(1,i) = jpos(i)
747
748 dpx(i)=dpx(i)+(fx(i)-yy(i))/an3y0(i)
749 dxela(i)=dx(i)-dpx(i)
750 fx(i)=yy(i)
751 yield(i)=fx(i)
752
753 xx_old(i) = xx_old(i) + abs(ddx(i))
754
755 ELSEIF(fx(i)< zero.AND.fx(i)< -yield(i))THEN
756 pos(1,i) = jpos(i)
757
758 dpx(i)=dpx(i)+(yy(i)-fx(i))/an3y0(i)
759 dxela(i)=dx(i)-dpx(i)
760 fx(i)=yy(i)
761 yield(i)=-fx(i)
762
763 xx_old(i) = xx_old(i) + abs(ddx(i))
764 ENDIF
765 fxep(i)=fx(i)
766 ENDDO
767 ELSEIF(jecrou(6)>0)THEN
768 if(any_python_function) then
769 CALL vinter_mixed(python, tf,jad,jpos,jlen,nel,xx,dydx,yy)
770 ELSE
771 CALL vinter2(tf,jad ,jpos ,jlen ,nel ,xx ,dydx ,yy )
772 ENDIF
773 DO i=1,nel
774 IF(ifunc(i)/= 0.AND.iecrou(i)== 6)THEN
775 IF(fx(i)>= zero.AND.fx(i)>yield(i))THEN
776 pos(1,i) = jpos(i)
777
778 dpx(i)=dpx(i)+(fx(i)-yy(i))/an3y0(i)
779 dxela(i)=dx(i)-dpx(i)
780 fx(i)=yy(i)
781 yield(i)=fx(i)
782
783 xx_old(i) = xx_old(i) + abs(ddx(i))
784
785 ELSEIF(fx(i)< zero.AND.fx(i)< -yield(i))THEN
786 pos(1,i) = jpos(i)
787
788 dpx(i)=dpx(i)+(yy(i)-fx(i))/an3y0(i)
789 dxela(i)=dx(i)-dpx(i)
790 fx(i)=yy(i)
791 yield(i)=-fx(i)
792
793 xx_old(i) = xx_old(i) + abs(ddx(i))
794 ENDIF
795 fxep(i)=fx(i)
796 ENDIF
797 ENDDO
798 ENDIF
799
800
801
802
803 IF (jecrou(7)== nel ) THEN
804 DO i=1,nel
805 fx(i) = fxep(i) + xk(i)*ddx(i)
806 IF (dx(i)>= dxold(i).AND.dx(i)>=0)THEN
807 IF (fx(i)>yy(i)) fx(i) = yy(i)
808 ELSEIF(dx(i)< dxold(i).AND.dx(i)>=0)THEN
809 IF (fx(i)<yy2(i))fx(i) = yy2(i)
810 ELSEIF(dx(i)>= dxold(i).AND.dx(i)<0)THEN
811 IF(fx(i)> yy2(i))fx(i) = yy2(i)
812 ELSEIF(dx(i)< dxold(i).AND.dx(i)<0)THEN
813 IF(fx(i)< yy(i))fx(i) = yy(i)
814 ENDIF
815 ENDDO
816 DO i=1,nel
817 fxep(i)= fx(i)
818 dpx(i) = dx(i) - fx(i) / xk(i)
819 ENDDO
820 ELSEIF (jecrou(7) > 0) THEN
821 DO i=1,nel
822 IF (ifunc(i)/=0 .AND. iecrou(i)==7) THEN
823 fx(i) = fxep(i) + xk(i)*ddx(i)
824 IF (dx(i)>= dxold(i) .AND. dx(i)>=0) THEN
825 IF (fx(i)>yy(i)) fx(i) = yy(i)
826 ELSEIF (dx(i)< dxold(i) .AND. dx(i)>= 0) THEN
827 IF (fx(i) < yy2(i)) fx(i) = yy2(i)
828 ELSEIF (dx(i)>= dxold(i) .AND. dx(i)<0) THEN
829 IF (fx(i)> yy2(i)) fx(i) = yy2(i)
830 ELSEIF (dx(i)< dxold(i) .AND. dx(i)<0) THEN
831 IF (fx(i)< yy(i)) fx(i) = yy(i)
832 ENDIF
833 fxep(i) = fx(i)
834 dpx(i) = dx(i) - fx(i) / xk(i)
835 ENDIF
836 ENDDO
837 ENDIF
838
839
840
841 IF(impl_s==0.OR.idyna>0) THEN
842 IF(jdmp>0)THEN
843 DO i=1,nel
845 pyid = python_funct_id(nfunct,jfunc,npf)
846 IF(pyid > 0) THEN
847 jpos(i) = -pyid
848 jad(i) = -pyid
849 any_python_function = .true.
850 ELSE
851 jpos(i) = nint(pos(4,i))
853 jad(i) = npf(jfunc) / 2 + 1
854 jlen(i) = npf(jfunc+1) / 2 - jad(i) - jpos(i)
855 ENDIF
856 ENDDO
857
858 IF(any_python_function) THEN
859 CALL vinter_mixed(python, tf,jad,jpos,jlen,nel,dvxs,dydxv,gx)
860 ELSE
861 CALL vinter2(tf,jad,jpos,jlen,nel ,dvxs,dydxv,gx)
862 ENDIF
863
864 DO i=1,nel
865 pos(4,i) = jpos(i)
866 ENDDO
867 ENDIF
868
869 IF(j2dmp>0)THEN
870 DO i=1,nel
871 j2func=
max(ifunc3(i),1)
872 pyid = python_funct_id(nfunct,j2func,npf)
873 IF(pyid > 0) then
874 j2pos(i) = -pyid
875 j3ad(i) = -pyid
876 any_python_function = .true.
877 ELSE
878 j2pos(i) = nint(pos(5,i))
879 j2func=
max(ifunc3(i),1)
880 j2ad(i) = npf(j2func) / 2 + 1
881 j2len(i) = npf(j2func+1) / 2 - j2ad(i) - j2pos(i)
882 ENDIF
883 ENDDO
884 IF(any_python_function) THEN
885 CALL vinter_mixed(python, tf,j2ad,j2pos,j2len,nel,dvxs,dydxv2,gx2)
886 ELSE
887 CALL vinter2(tf,j2ad,j2pos,j2len,nel,dvxs,dydxv2,gx2)
888 ENDIF
889 DO i=1,nel
890 pos(5,i) = j2pos(i)
891 ENDDO
892 ENDIF
893
894 IF(j2k > 0)THEN
895 DO i=1,nel
896 j3func =
max(ifunc4(i),1)
897 pyid = python_funct_id(nfunct,j3func,npf)
898 IF(pyid > 0) then
899 j3pos(i) = -pyid
900 j3ad(i) = -pyid
901 any_python_function = .true.
902 ELSE
903 j3pos(i) = nint(pos(6,i))
904 j3func =
max(ifunc4(i),1)
905 j3ad(i) = npf(j3func) / 2 + 1
906 j3len(i) = npf(j3func+1) / 2 - j3ad(i) - j3pos(i)
907 ENDIF
908 ENDDO
909 IF(any_python_function) THEN
910 CALL vinter_mixed(python, tf,j3ad,j3pos,j3len,nel,dvxs,dkdx2,kx2)
911 ELSE
912 CALL vinter2(tf,j3ad,j3pos,j3len,nel,xx,dkdx2,kx2)
913 ENDIF
914 DO i=1,nel
915 pos(6,i) = j3pos(i)
916 ENDDO
917 ENDIF
918
919 IF(j2k /= nel)THEN
920 DO i=1,nel
921 IF(ifunc4(i) == 0) kx2(i) = one
922 ENDDO
923 ENDIF
924 IF(jdmp/= nel)THEN
925 DO i=1,nel
926 IF(ifv(i)==0) gx(i)=zero
927 ENDDO
928 ENDIF
929 IF(j2dmp/= nel)THEN
930 DO i=1,nel
931 IF(ifunc3(i)==0) gx2(i)=zero
932 gx2(i)=gx2(i)*kx2(i)
933 ENDDO
934 ELSE
935 DO i=1,nel
936 gx2(i)=gx2(i)*kx2(i)
937 ENDDO
938 ENDIF
939
940 DO i=1,nel
941 dvv =
max(one,abs(dvx(i)/d(i)))
942 dfac = ak(i) + b(i) * log(dvv) + ee(i)*gx(i)
943 fx(i)= ( dfac*fx(i) + xc(i)*dvx(i) + gf3(i)*gx2(i)
944 e(i) = e(i) + (dx(i)-dxold(i)) * (fx(i)+fold(i)) * half
945 ENDDO
946 ELSE
947 DO i=1,nel
948 fx(i)= fx(i) *ak(i)* off(i)
949 e(i) = e(i) + (dx(i)-dxold(i)) * (fx(i)+fold(i)) * half
950 ENDDO
951 ENDIF
952 DO i=1,nel
953 dx(i)=dx(i)*xl0(i)
954 dxold(i)=dxold(i)*xl0(i)
955 dpx(i)=dpx(i)*xl0(i)
956 dpx2(i)=dpx2(i)*xl0(i)
957 e(i)=e(i)*xl0(i)
958 ENDDO
959
960
961 RETURN
subroutine interp(tf, tt, npoint, f, tg)
subroutine vinter2(tf, iad, ipos, ilen, nel0, x, dydx, y)
subroutine vinter2dp(tf, iad, ipos, ilen, nel0, x, dydx, y)