C C $Id: dograd.F,v 1.5 1998/07/16 16:39:40 jjv5 Exp arjan $ C C------------------------------------------------------------------------ SUBROUTINE DOGRAD(GRAD1,GNORM1,IERROR) C C RETURNS GRADIENT AND GRADIENT NORM IN EITHER INTERNAL OR C CARTESIAN COORDINATES. INTERNAL COORDINATES ARE SELECTED C IF THE KEYWORDS 'XYZSPACE' OR 'CARTESIAN' ARE NOT PRESENT. C ENERGY UNITS ARE KCAL. THE ERROR CODE CORRESPONDS TO THAT C OF SUBROUTINE G2INT AND GETXYZ. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) #include "divcon.dim" #include "divcon.h" DIMENSION GRAD1(*) C C LOCAL: C DIMENSION GINT(3,MAXATM),WXYZ(3,MAXATM) C C C CONVERT CARTESIAN GRADIENT TO INTERNAL COORDINATES UNLESS THE C USER HAS REQUESTED THAT EVERYTHING BE DONE IN XYZ COORDINATES. C IF(.NOT.XYZSPC)THEN CALL G2INT(GRAD1,WXYZ,GINT,IERROR) IF(IERROR.NE.0) RETURN GNORM1 = 0.0D0 C C FOR INTERNAL COORDINATE GRADIENT, STORE ONLY ENTRIES ASSOCIATED C WITH PARAMETERS THAT HAVE BEEN FLAGGED FOR OPTIMIZATION. C IJ = 0 DO 20 I=1,NATOMS DO 10 J=1,3 IF(IOPT(J,I).NE.0)THEN IJ = IJ + 1 GRAD1(IJ) = GINT(J,I) GNORM1 = GNORM1 + GRAD1(IJ)**2 ENDIF 10 CONTINUE 20 CONTINUE GNORM1 = DSQRT(GNORM1) ELSE GNORM1 = 0.0D0 IJ = 0 DO 40 I=1,NATOMS DO 30 J=1,3 IJ = IJ + 1 GNORM1 = GNORM1 + GRAD1(IJ)**2 30 CONTINUE 40 CONTINUE GNORM1 = DSQRT(GNORM1) ENDIF RETURN END