C C $Id: g2int.F,v 1.2 1998/07/16 16:39:50 jjv5 Exp arjan $ C C------------------------------------------------------------------------ SUBROUTINE G2INT(GXYZ,WXYZ,GINT,IERROR) C C CONVERTS CARTESIAN GRADIENT GXYZ TO GRADIENT IN INTERNAL C COORDINATES. GINT IS RETURNED IN UNITS OF ENERGY/ANGSTROM C OR ENERGY/RADIAN. GRADIENT IS TRANSFORMED BY MEANS OF A C FINITE-DIFFERENCE JACOBIAN B, C C C / \ C | dX(1) dX(2) dX(3N) | C | ----- ----- . . . ------- | C | dQ(1) dQ(1) dQ(1) | C | | C | | C | dX(1) dX(2) dX(3N) | C | ----- ----- . . . ------- | C B = | dQ(2) dQ(2) dQ(2) | C | | C | . . . | C | . . . | C | . . . | C | | C | dX(1) dX(2) dX(3N) | C | -------- -------- . . . -------- | C | dQ(3N-6) dQ(3N-6) dQ(3N-6) | C \ / C C C HERE X REPRESENTS CARTESIAN COORDINATES, AND Q REPRESENTS C INTERNAL COORDINATES. INTERNAL COORDINATES ARE GIVEN BY C THE MATRIX-VECTOR PRODUCT: GINT = B*GXYZ. THE ARRAY WXYZ C IS WORK SPACE TO STORE THE ORIGINAL CARTESIAN COORDINATES. C IERROR IS RETURNED WITH THE ERROR CODE OF SUBROUTINE GETXYZ. C C NOTE THAT GINT IS RETURNED WITH THE FULL INTERNAL COORDINATE C GRADIENT, WITHOUT REGARD FOR WHICH PARAMETERS HAVE BEEN FLAGGED C FOR OPTIMIZATION. THIS FACT SHOULD BE NOTED WHEN DOING A C GEOMETRY OPTIMIZATION. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) #include "divcon.dim" #include "divcon.h" DIMENSION GXYZ(3,*),GINT(3,*),WXYZ(3,*) C C LOCAL: C IERROR = 0 DCOORD1 = 1.0D-6 C C SAVE THE ORIGINAL CARTESIAN COORDINATES AND ZERO OUT INTERNAL C COORDINATE GRADIENT, JUST TO BE SAFE. C DO 20 I=1,NATOMS DO 10 J=1,3 WXYZ(J,I) = XYZ(J,I) GINT(J,I) = 0.0D0 10 CONTINUE 20 CONTINUE C C LOOP OVER THE ROWS OF B (INTERNAL COORDINATES). C DO 100 IATM=2,NATOMS DO 80 IZ=1,MIN(IATM-1,3) ZTMP = ZMAT(IZ,IATM) C C CHANGE THE CURRENT INTERNAL COORDINATE BY THE PRESCRIBED AMOUNT. C NOTE THAT ONLY CARTESIAN COORDINATES FOR ATOMS .GE. IATM WILL C BE AFFECTED. C ZMAT(IZ,IATM) = ZTMP + DCOORD1 C C GET THE CARTESIAN COORDINATES THAT CORRESPOND TO THE PERTURBED C INTERNAL COORDINATES. ONLY THE COORDINATES OF ATOMS .GE. IATM C WILL CHANGE. C IFIRST = IATM CALL GETXYZ1(NATOMS,ZMAT,IZMAT,IFIRST,XYZ,IERROR) IF(IERROR.NE.0) RETURN C C OPERATE ON THE CARTESIAN GRADIENT WITH THIS ROW OF THE C JACOBIAN. C GIZ = 0.0D0 DO 60 JATM=IATM,NATOMS DO 40 JXYZ=1,3 BIJ = XYZ(JXYZ,JATM) - WXYZ(JXYZ,JATM) GIZ = GIZ + BIJ*GXYZ(JXYZ,JATM) 40 CONTINUE 60 CONTINUE GINT(IZ,IATM) = GIZ C C RESTORE THE CURRENT INTERNAL COORDINATE TO ITS ORIGINAL VALUE. C ZMAT(IZ,IATM) = ZTMP 80 CONTINUE C C RESTORE CARTESIAN COORDINATES OF CURRENT ATOM BECAUSE THEY WILL C NOT BE RECOMPUTED AFTER IATM INCREASES. C DO 90 IXYZ=1,3 XYZ(IXYZ,IATM) = WXYZ(IXYZ,IATM) 90 CONTINUE 100 CONTINUE C C DIVIDE BY COORDINATE CHANGE TO GET DERIVATIVES. C DO 200 IATM=2,NATOMS DO 150 IZ=1,MIN(IATM-1,3) GINT(IZ,IATM) = GINT(IZ,IATM)/DCOORD1 150 CONTINUE 200 CONTINUE RETURN END