c subroutine Det1Mvg(n, Evec, Detvec, iflag) c c*********************************************************************** c Det1mvg calculates the det(1-VG) c the argument list is designed around the routine sqsqe() c c n: should be always equal to 2 c Evec(1) real part of energy c Evec(2) imaginary part of energy c Detvec(1) real part of det(1-vg) c Detvec(2) imaginary part of det(1-vg) c iflag not changed in this routine. c*********************************************************************** c implicit none integer Nifty, n, iflag, info,num integer nch, cl, job integer npts, Indx(128), ichpt, jchpt, nchpt double precision P, W, zero, one, ten, pt1 double precision Evec(2), Detvec(2), zabs1, vc(64, 64) double precision mpion, Mass, mtotal double complex work(128) double complex Knew(2), Knew2(2), enew, eold, Dk2de(2) double complex Wgf(128), Fmtrx(128, 128), zdet(2), zdumy double complex Vsuper(128, 128, 6) logical first common /control/ Nifty(15) common /grid/ P(64), W(64), npts common /mass/ mpion, Mass(2) c parameter (zero = 0.0d0, one = 1.0d0, ten = 1.0d1, pt1 = 0.1d0) data first /.true./, num/0/ zabs1(zdumy) = abs(dble(zdumy)) + abs(imag(zdumy)) c c*********************************************************************** c write(8,*) 'iflag=', iflag if (iflag .eq. 0) then write(8, 900) c call PrtKin(enew, Knew) write(8, 905) Evec(1)+mtotal, Evec(2) 900 format('0', 10('-'), ' DET(1-VG) Print Mode ', 10('-')) 905 format(1x, 'Pole position:', e10.3, 1x, e10.3) 910 format(1x, 'Det(1-VG) =', e10.3, 1x, e10.3) return else c c cl denotes the particular channel for pole searching c cl = Nifty(6) mtotal = mpion + Mass(1) c if (first) then eold = dcmplx(Evec(1)+mtotal, Evec(2)) c D. Lu turn the coulomb off c if (Nifty(13) .ne. 0) c & call VCoul(1, -1, cl, npts, p, w, 64, vc) endif c nch = Nifty(2) nchpt = nch*(npts+1) c enew = dcmplx(Evec(1)+mtotal, Evec(2)) call OnShl(enew, eold, Knew, Knew2, Dk2de) call WtgFcn(npts, P, W, enew, Knew, Knew2, Dk2de, Wgf) call VBag(npts, P, enew, Knew, Vsuper) if (Nifty(13) .ne. 0) then do ichpt = 1, npts do jchpt = 1, npts Vsuper(jchpt, ichpt, cl) = & Vsuper(jchpt, ichpt, cl) + vc(jchpt, ichpt) enddo enddo endif c set up matrix 1/G-V do jchpt = 1, nchpt if (zabs1(Wgf(jchpt)) .ne. zero) then do ichpt = 1, nchpt Fmtrx(ichpt, jchpt) = -Vsuper(ichpt, jchpt, cl) enddo Fmtrx(jchpt, jchpt) = 1/Wgf(jchpt) & + Fmtrx(jchpt, jchpt) else do ichpt = 1, nchpt Fmtrx(ichpt, jchpt) = zero enddo Fmtrx(jchpt, jchpt) = one endif enddo c c computing det(1/G-V) call zsifa(Fmtrx, 128, nchpt, Indx, info) job = 10 call zsidi(Fmtrx, 128, nchpt, Indx, zdet, work, job) c c computing det(G)*det(1/G-V) do ichpt = 1, nchpt if (zabs1(Wgf(ichpt)) .ne. zero) then zdet(1) = zdet(1)*Wgf(ichpt) if ((zabs1(zdet(1)) .lt. one) .and. & (zabs1(zdet(1)) .ne. zero)) then c incress zdet(1) and decress zdet(2) 10000 zdet(1) = zdet(1)*ten zdet(2) = zdet(2) - one if (zabs1(zdet(1)) .lt. one) goto 10000 else if (zabs1(zdet(1)) .gt. ten) then 10010 zdet(1) = zdet(1)*pt1 zdet(2) = zdet(2) + one if (zabs1(zdet(1)) .gt. ten) goto 10010 endif endif enddo Detvec(1) = dble(zdet(1)*ten**zdet(2)) Detvec(2) = imag(zdet(1)*ten**zdet(2)) c endif (iflag .eq. 0) endif c num=num +1 write(*,999) num, Evec(1)+mtotal, Evec(2), detvec 999 format(i5,2x,'E:',2e14.5,2x,'DET:',2e14.5) c return end