53 SUBROUTINE nl_solv(NDDL ,IDDL ,NDOF ,IKC ,D ,
54 1 DR ,NNZ ,IADK ,JDIK ,DIAG_K,
55 2 LT_K ,F ,NDDLI ,IADI ,JDII ,
56 3 DIAG_I,LT_I ,ITOK ,IADM ,JDIM ,
57 4 DIAG_M,LT_M ,R02 ,DD ,DDR ,
58 5 ITASK0,IT ,ITC ,RU0 ,ROLD ,
59 6 IDIV ,INPRINT,ICPREC,ISTOP ,E02 ,
60 7 DE0 ,EIMP ,INLOC ,NDDL0 ,LS ,
61 8 U02 ,GAP ,ITAB ,FR_ELEM,IAD_ELEM,
62 9 W_DDL,A ,AR ,V ,MS ,
63 A X ,IPARI ,INTBUF_TAB ,NUM_IMP,
64 B NS_IMP,NE_IMP,NSREM ,NSL ,ICONT ,
65 C GRAPHE,FAC_K, IPIV_K, NK ,NMONV ,
66 D IMONV ,MONVOL,IGRSURF,FR_MV ,
67 E VOLMON,IBFV ,SKEW ,XFRAME,MUMPS_PAR,
68 F CDDLP ,IND_IMP,NBINTC,INTLIST,NEWFRONT,
69 G ISENDTO,IRECVFROM,IRBE3 ,LRBE3,NDIV ,
70 H ICONT0 ,ISIGN ,FEXT ,DG ,DGR ,
71 I DG0 ,DGR0 ,RFEXT ,LS1 ,NODFT ,
72 J NODLT ,IRBE2 ,LRBE2 ,IDIV0,
83#include "implicit_f.inc"
88#include "dmumps_struc.h"
101 INTEGER NDDL ,NNZ ,IADK(*),JDIK(*),IADM(*),JDIM(*),ITASK0,
102 . NDDLI ,IADI(*),JDII(*),ITOK(*),ICPREC,INLOC(*),
103 . NDOF(*),IDDL(*),IKC(*),IDIV ,INPRINT,ISTOP,
105INTEGER NE_IMP(*),NSREM ,NSL,ICONT,ISIGN,IMP1,
106 . IPARI(*) ,NUM_IMP(*),NS_IMP(*), IPIV_K(*), NK
107 INTEGER NMONV,IMONV(*),MONVOL(*),FR_MV(*),
108 . IBFV(*),IND_IMP(*),IRBE3(*) ,LRBE3(*),NDIV ,ICONT0,
110 INTEGER NEWFRONT(*),NBINTC,INTLIST(*),ISENDTO(*),IRECVFROM(*),
114 . DIAG_K(*),LT_K(*),F(*),R02,DIAG_M(*),LT_M(*),
115 . DIAG_I(*),LT_I(*),D(3,*),DR(3,*),DD(3,*),DDR(3,*),
116 . RU0,ROLD,E02 ,EIMP,LSTOL,DE0,(*),U02,GAP,RBID
118 . A(3,*),AR(3,*),V(3,*),X(3,*),(*),FAC_K(*),
119 . VOLMON(*),SKEW(*),XFRAME(*),FEXT(*),DG(3,*),DGR(3,*),
120 . DG0(3,*),DGR0(3,*),LS1(*) ,RFEXT, RELRES(*)
124 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
125 TYPE (SURF_) ,
DIMENSION(NSURF) :: IGRSURF
128 TYPE(dmumps_struc) MUMPS_PAR
134 character*1 anew_stif
140 INTEGER I ,J ,ND,IP,ITMP,ICOV,ICALU,IER,ISETK0,IRIKS,
144 . r2,u2,du2,tol,rr,ru,temp,fr,re,de,r1,nl_tol,r01,rr1,
145 . gapn,lamda,fa,uc2,um1,um2,pmax
167 IF (nitol==3.OR.nitol==13.OR.nitol==23
168 . .OR.nitol==123)
THEN
174 IF (ncycle>1.AND.idtc==3)
THEN
175 IF (ilast==0) iriks=1
181 IF (icont>0) gapn=gap*zep9
182 IF (imconv>=0) icont0=icont
190 IF (r01*nl_tol<=em12.AND.nl_tol>em10.AND.idiv/=10)
THEN
191 IF (irefi/=5.OR.icont==0)
THEN
195 WRITE(iout,1108)it,anew_stif,re,r01,re
200 WRITE(istdo,1108)it,anew_stif,re,r01,re
215 IF (insolv==4) icov = imconv
220 IF (insolv==2.OR.insolv==3)
CALL bfgs_0
222 IF (ncycle==1) isign = 1
224 CALL lin_solv(nddl ,iddl ,ndof ,ikc ,dg ,
225 1 dgr ,tol ,nnz ,iadk
226 2 diag_k,lt_k ,nddli ,iadi ,jdii ,
227 3 diag_i,lt_i ,itok ,iadm ,jdim ,
228 4 diag_m,lt_m ,fext ,de ,inloc ,
229 5 fr_elem,iad_elem,w_ddl,itask0,icprec,
231 7 ms ,x ,ipari ,intbuf_tab ,
232 8 num_imp,ns_imp,ne_imp,nsrem ,nsl ,
233 9 itc ,graphe, itab, fac_k, ipiv_k,
234 a nk ,nmonv,imonv ,monvol,igrsurf,
235 b fr_mv ,volmon,ibfv ,skew ,
236 c xframe ,mumps_par,cddlp,ind_imp,rbid,
237 e irbe3 ,lrbe3 ,irbe2 ,lrbe2 )
240 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
241 . dg ,dgr ,u2 ,w_ddl )
246 IF (iroddl/=0)
CALL cp_real(nd,ddr,dgr0)
252 . dg ,dgr ,dg0 ,dgr0 ,uc2 ,
258 CALL get_max(numnod,dg0,temp,i)
260 CALL get_max(numnod,dgr0,temp,i)
261 um1=
max(um1,temp,em20)
264 CALL get_max(numnod,dgr,temp,i)
265 um2=
max(um2,temp,em20)
268 IF ((uc2+dla_riks/rfext)<zero)
THEN
275 IF (ncycle>=ndeb0.AND.ncycle<=ndeb1)
276 .
WRITE(iout,1025)uc2,dla_riks,isign
279 dla_riks = 2*isign*dt2
290 IF (idiv/=-2.AND.icont==0)
THEN
292 . dd ,ddr ,f ,de ,w_ddl )
295 CALL frac_dd_hp(iddl,ndof,ikc,d,dr,dg,dgr,lamda)
297 . d ,dr ,f ,de ,w_ddl )
301 IF ((n_lim /= 1.OR.isprb /= 0).AND.
302 . (ncycle>1.AND.idiv/=-2.AND.icont==0.AND.ikt==0
303 . .OR.(ncycle==1.AND.idiv==10)))
THEN
304 IF (idtc==3.AND.ilast==1)
THEN
307 CALL frac_d_hp(iddl,ndof,ikc,dd,ddr,lamda)
310 . dd ,ddr ,f ,de ,w_ddl )
312 IF (insolv==4.AND.icov>=0) imconv=-1
314 CALL lin_solv(nddl ,iddl ,ndof ,ikc ,dd ,
315 1 ddr ,tol ,nnz ,iadk ,jdik ,
316 2 diag_k,lt_k ,nddli ,iadi ,jdii ,
317 3 diag_i,lt_i ,itok ,iadm ,jdim ,
318 4 diag_m,lt_m ,f ,de ,inloc ,
319 5 fr_elem,iad_elem,w_ddl,itask0,icprec,
321 7 ms ,x ,ipari ,intbuf_tab ,
322 8 num_imp,ns_imp,ne_imp,nsrem ,nsl ,
323 9 itc ,graphe, itab, fac_k, ipiv_k,
324 a nk ,nmonv,imonv ,monvol,igrsurf,
325 b fr_mv ,volmon,ibfv ,skew ,
326 c xframe ,mumps_par,cddlp,ind_imp,rbid,
327 e irbe3 ,lrbe3 ,irbe2 ,lrbe2 )
328 IF (de<zero.AND.irefi>1.AND.irefi<5) imconv=-2
329 IF (icont>0.AND.idsgap>0)
THEN
349 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
352 IF (de>ep10.AND.iline==0.AND.idyna==0
353 . .AND.ncycle==1)
THEN
356 WRITE(istdo,1030)eimp
367 WRITE(iout,1003)it,anew_stif,ru,r01,eimp
372 WRITE(istdo,1003)it,anew_stif,ru,r01,eimp
392 IF (iriks>0.AND.dla_riks/=zero)
THEN
393 CALL vaxpy_hp(nddl, f ,fext,dla_riks)
399 IF (r2>=zero.AND.r2<ep30)
THEN
401 IF (it==1.AND.isprb==1.AND.idiv/=-2)
THEN
404 IF (icont>0.AND.rr<one) rr1=rr
411 ELSEIF (icalu>0)
THEN
412 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
414 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
415 . dd ,ddr ,du2 ,w_ddl )
419 ru=ls(3)*sqrt(du2/u2)
420 IF (insolv==5) ru=sqrt(du2/u2)
422 CALL crit_ite(it,ru,rr1,re,ndiv,nl_tol)
431 IF (ncycle==1.OR.idiv==-2) imconv=-2
451 IF (it>1.AND.icalu==0)
THEN
452 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
454 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
455 . dd ,ddr ,du2 ,w_ddl )
459 ru=ls(3)*sqrt(du2/u2)
461 ELSEIF (idtc>=2)
THEN
462 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
463 . d ,dr ,u02 ,w_ddl )
472 WRITE(iout,1108)it,anew_stif,ru,rr,re
477 WRITE(istdo,1108)it,anew_stif,ru,rr,re
484 ELSEIF(imconv<=-2)
THEN
491 ELSEIF(it>nl_dtn)
THEN
501 ELSEIF(it>nl_dtn)
THEN
510 IF(inprint<0)
WRITE(istdo,1012)
519 IF (iline_s>0.AND.isign>=0.AND.irwall==0)
THEN
521 IF (nitol/=2.AND.nitol/=4.OR.iline_s==1)
THEN
523 IF (ls1(3)/=zero )
THEN
527 . dd ,ddr ,f ,de ,w_ddl )
536 IF (rr>one.AND.irefi>=2) r1=ls(1)
548 CALL line_s(ls(1),ls(2),r1,fr,lstol,idiv,icont,temp)
549 ELSEIF (iline_s==1)
THEN
550 CALL line_s1(r1,fr,ls(1),ls(2),ls1(1),ls1(2),idiv,lstol,
551 . icont,icont0,iriks)
552 ELSEIF (iline_s==2)
THEN
553 CALL line_s(ls(1),ls(2),r1,fr,lstol,idiv,icont,temp)
555 IF (impdeb>0.AND.ispmd==0)
THEN
556 IF (ncycle>=ndeb0.AND.ncycle<=ndeb1)
then
557 WRITE(iout,*)
'R1,FR,IDIV=',r1,fr,idiv
567 IF ((insolv==2.OR.insolv==3).AND.fr>one.AND.ikt==0)
577 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
579 CALL produt_uhp(nddl0 ,nddl ,iddl ,ndof ,ikc ,
580 . dd ,ddr ,du2 ,w_ddl )
584 ru=ls(3)*sqrt(du2/u2)
589 IF (insolv==2.OR.insolv==3)
CALL bfgs_ls(ls(3))
596 IF(mod(it,ip)==0)
THEN
598 WRITE(iout,1003)it,anew_stif,ru,rr,re
601 WRITE(istdo,1003)it,anew_stif,ru,rr,re
608 IF(itc>=n_lim.AND.ismdisp==0)
THEN
626 CALL lin_solv(nddl ,iddl ,ndof ,ikc ,dg ,
627 1 dgr ,tol ,nnz ,iadk ,jdik ,
628 2 diag_k,lt_k ,nddli ,iadi ,jdii ,
629 3 diag_i,lt_i ,itok ,iadm ,jdim ,
630 4 diag_m,lt_m ,fext ,de ,inloc ,
631 5 fr_elem,iad_elem,w_ddl,itask0,icprec,
633 7 ms ,x ,ipari ,intbuf_tab ,
634 8 num_imp,ns_imp,ne_imp,nsrem ,nsl ,
635 9 itc ,graphe, itab, fac_k, ipiv_k,
636 a nk ,nmonv,imonv ,monvol,igrsurf,
637 b fr_mv ,volmon,ibfv ,skew ,
638 c xframe ,mumps_par,cddlp,ind_imp,rbid,
639 e irbe3 ,lrbe3 ,irbe2 ,lrbe2 )
644 . dg ,dgr ,f ,um1 ,w_ddl )
647 CALL lin_solv(nddl ,iddl ,ndof ,ikc ,dd
648 1 ddr ,tol ,nnz ,iadk ,jdik ,
649 2 diag_k,lt_k ,nddli ,iadi ,jdii ,
650 3 diag_i,lt_i ,itok ,iadm ,jdim ,
651 4 diag_m,lt_m ,f ,de ,inloc ,
652 5 fr_elem,iad_elem,w_ddl,itask0,icprec,
654 7 ms ,x ,ipari ,intbuf_tab ,
655 8 num_imp,ns_imp,ne_imp,nsrem ,nsl ,
656 9 itc ,graphe, itab, fac_k, ipiv_k,
657 a nk ,nmonv,imonv ,monvol,igrsurf,
658 b fr_mv ,volmon,ibfv ,skew ,
659 c xframe ,mumps_par,cddlp,ind_imp,rbid,
660 d irbe3 ,lrbe3 ,irbe2 ,lrbe2 )
661 IF (icont>0.AND.idsgap>0)
THEN
668 CALL frac_d_hp(iddl,ndof,ikc,dd,ddr,temp)
680 . dd ,ddr ,dg ,dgr ,d ,
681 . dr ,w_ddl ,alen ,lamda ,scal_riks,
699 ELSEIF (ial_m==2)
THEN
701 . dd ,ddr ,dg ,dgr ,d ,
702 . dr ,w_ddl ,alen ,lamda ,scal_riks)
708 CALL frac_dd_hp(iddl,ndof,ikc,d ,dr ,dg,dgr,lamda)
710 dla_riks = dla_riks + lamda
711 eimp=eimp+dla_riks*um1
723 ELSEIF(imconv==-1)
THEN
726 CALL frac_dd_hp(iddl,ndof,ikc,d,dr,dd,ddr,temp)
739 IF (abs(de0)<em20) de0=em20
744 IF (itc>=n_lim.AND.imconv>=0)
THEN
748 IF (itc==0.AND.imconv>=0)
THEN
749 IF (ncycle==1.OR.n_lim==1) isetk=1
750 IF (isolv==5.OR.isolv==6) isetk=1
752 IF (irwall >0 .AND.imconv == 1) isetk=1
753 IF ((itc==0.OR.imconv==1).AND.ikt>0) isetk=1
756 IF (itc==0.OR.imconv==1) isetk=1
758 IF ((idtc==3.OR.ikt>0).AND.imconv<=-2) isetk=1
760 IF (imconv<=-2.AND.rr1>ep20.AND.idiv0>=0) isetk=1
761 IF ((istop==1.OR.istop==2).AND.(isolv==5.OR.isolv==6))
THEN
766 IF (imconv<=-2.AND.isprb>0.AND.rr1>ep04) isetk=1
768 IF(imconv<= -2.AND.n_lim == 1 .AND. isprb == 0) isetk = 1
775 1102
FORMAT(3x,78(
'-')/
777 . 6x,
'Iter',2x,
' reformed ',5x,
'|du|/|u|',3x,
'|r|/|r0|',3x,
'|dE|/|E|',1x,
'Conv.stat.'/
780 1003
FORMAT(5x,i5,6x,a1,5x,3(1x,1pe10.3))
781 1005
FORMAT(3x,
'TOLERANCE FOR LINEAR ITERATIVE SOLVER :',2x,e11.4)
782 1006
FORMAT(3x,
'--STIFFNESS MATRIX IS RESET AFTER ',i4,
784 1007
FORMAT(3x,
'--ITERATION DIVERGE with R=',e11.4,2x,
785 .
'STIFFNESS MATRIX WILL BE RESET')
788 1108
FORMAT(5x,i5,6x,a1,5x,3(1x,1pe10.3),5x,
'C')
789 1009
FORMAT(3x,
'--ITERATION DIVERGE with RELATIVE R=',e11.4/,
790 . 3x,
'RESET ITERATION WITH STABILIZATION BY SCALING= ',e11.4)
791 1010
FORMAT(3x,
'--ITERATION DIVERGE with MAX_ITER REACHED--')
792 1011
FORMAT(3x,
'ITERATION DIVERGE with RELATIVE R=',e11.4)
793 1012
FORMAT(3x,
'--RESET ITERATION WITH NEW TIMESTEP--')
794 1013
FORMAT(3x,
'ITERATION DIVERGE with NEGATIVE ENERGY DE=',e11.4)
795 1020
FORMAT(3x,
'--ITERATION DIVERGE with RIKS Method--')
796 1025
FORMAT(3x,
'UC2,DLA_RIKS,ISIGN=',2e11.4,i4)
797 1030
FORMAT(3x,
'CHECK CONSTRAINT CONDITIONS, TOO LARGE ENERGY VALUE=',