- subroutine distfit(debug,maxit)
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.CHAIN'
- include 'COMMON.VAR'
- include 'COMMON.IOUNITS'
- include 'COMMON.DISTFIT'
- DIMENSION X(MAXRES),DIAGH(MAXRES),phiold(maxres)
- logical debug,sing
-
-cinput------------------------------------
-c NX=NRES-3
-c NY=((NRES-4)*(NRES-5))/2
-cinput------------------------------------
-ctest MAXIT=20
- TOL=0.5
- MAXMAR=10
- RL=100.0
-
- CALL TRANSFER(NRES,phi,phiold)
-
- F0=RDIF()
-
-cd WRITE (IOUT,*) 'DISTFIT: F0=',F0
-
-
- DO IT=1,MAXIT
- CALL RDERIV
- CALL HEVAL
-
- DO I=1,NX
- DIAGH(I)=H(I,I)
- ENDDO
- RL=RL*0.1
-
- DO IMAR=1,MAXMAR
- DO I=1,NX
- H(I,I)=DIAGH(I)+RL
- ENDDO
- CALL TRANSFER(NX,XX,X)
- CALL BANACH(NX,MAXRES,H,X,sing)
- AIN=0.0
- DO I=1,NX
- AIN=AIN+DABS(X(I))
- ENDDO
- IF (AIN.LT.0.1*TOL .AND. RL.LT.1.0E-4) THEN
- if (debug) then
- WRITE (IOUT,*) 'DISTFIT: CONVERGENCE HAS BEEN ACHIEVED'
- WRITE (IOUT,*) 'IT=',it,'F=',F0
- endif
- RETURN
- ENDIF
- DO I=4,NRES
- phi(I)=phiold(I)+mask(i)*X(I-3)
-c print *,X(I-3)
- ENDDO
-
- F1=RDIF()
-cd WRITE (IOUT,*) 'IMAR=',IMAR,' RL=',RL,' F1=',F1
- IF (F1.LT.F0) THEN
- CALL TRANSFER(NRES,phi,phiold)
- F0=F1
- GOTO 1
- ELSE IF (DABS(F1-F0).LT.1.0E-5) THEN
- if (debug) then
- WRITE (IOUT,*) 'DISTFIT: CANNOT IMPROVE DISTANCE FIT'
- WRITE (IOUT,*) 'IT=',it,'F=',F1
- endif
- RETURN
- ENDIF
- RL=RL*10.0
- ENDDO
- WRITE (IOUT,*) 'DISTFIT: MARQUARDT PROCEDURE HAS FAILED'
- WRITE (IOUT,*) 'IT=',it,'F=',F0
- CALL TRANSFER(NRES,phiold,phi)
- RETURN
- 1 continue
-cd write (iout,*) "it",it," imar",imar," f0",f0
- enddo
- WRITE (IOUT,*) 'DISTFIT: FINAL F=',F0,'after MAXIT=',maxit
- return
- END
-
- double precision FUNCTION RDIF()
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.CHAIN'
- include 'COMMON.DISTFIT'
-
-c print *,'in rdif'
-
- suma=0.0
- ind=0
- call chainbuild
- do i=1,nres-3
- do j=i+3,nres
- ind=ind+1
- if (w(ind).ne.0.0) then
- DIJ=DIST(i,j)
- suma=suma+w(ind)*(DIJ-d0(ind))*(DIJ-d0(ind))
- DD(ind)=DIJ
-c print '(2i3,i4,4f12.2)',i,j,ind,dij,d0(ind),w(ind),suma
- endif
- enddo
- enddo
-
- RDIF=suma
- RETURN
- END
-
- SUBROUTINE RDERIV
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.CHAIN'
- include 'COMMON.DISTFIT'
- include 'COMMON.GEO'
- DIMENSION E12(3),R13(3),R24(3),PRODU(3)
-
- DO I=1,NY
- DO J=1,NX
- DRDG(I,J)=0.0
- ENDDO
- ENDDO
- DO I=1,NX
- I1=I+1
- I2=I+2
- CALL VEC(I1,I2,E12)
- DO J=1,I
- DO K=1,3
- R13(K)=C(K,J)-C(K,I1)
- ENDDO
- DO K=I2+1,NRES
- DO L=1,3
- R24(L)=C(L,K)-C(L,I2)
- ENDDO
- IND=((J-1)*(2*NRES-J-6))/2+K-3
- PRODU(1)=R13(2)*R24(3)-R13(3)*R24(2)
- PRODU(2)=R13(3)*R24(1)-R13(1)*R24(3)
- PRODU(3)=R13(1)*R24(2)-R13(2)*R24(1)
- DRDG(IND,I)=SCALAR(E12,PRODU)/DIST(J,K)
- ENDDO
- ENDDO
- ENDDO
- RETURN
- END
-
- SUBROUTINE HEVAL
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.CHAIN'
- include 'COMMON.DISTFIT'
-
- DO I=1,NX
- XI=0.0
- HII=0.0
- DO K=1,NY
- BKI=DRDG(K,I)
- BKIWK=w(K)*BKI
- XI=XI+BKIWK*(D0(K)-DD(K))
- HII=HII+BKI*BKIWK
- ENDDO
- H(I,I)=HII
- XX(I)=XI
- DO J=I+1,NX
- HIJ=0.0
- DO K=1,NY
- HIJ=HIJ+DRDG(K,I)*DRDG(K,J)*w(K)
- ENDDO
- H(I,J)=HIJ
- H(J,I)=HIJ
- ENDDO
- ENDDO
- RETURN
- END
-
-
- SUBROUTINE VEC(I,J,U)
-*
-* Find the unit vector from atom (I) to atom (J). Store in U.
-*
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.CHAIN'
- DIMENSION U(3)
-
- ANORM=0.0
- DO K=1,3
- UK=C(K,J)-C(K,I)
- ANORM=ANORM+UK*UK
- U(K)=UK
- ENDDO
- ANORM=SQRT(ANORM)
- DO K=1,3
- U(K)=U(K)/ANORM
- ENDDO
- RETURN
- END
-
- SUBROUTINE TRANSFER(N,X1,X2)
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- DIMENSION X1(N),X2(N)
- DO 1 I=1,N
- 1 X2(I)=X1(I)
- RETURN
- END
-