C C $Id: wrtgrd.F,v 1.5 1998/07/16 16:40:53 jjv5 Exp arjan $ C C------------------------------------------------------------------------ SUBROUTINE WRTGRD(GRAD1) C C-RDC C WRITES GRADIENT TO UNIT IOUT. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) #include "divcon.dim" #include "divcon.h" DIMENSION GRAD1(*) C C LOCAL: C CHARACTER CRDTYP(3,2)*12,GUNITS(3,2)*13 DATA CRDTYP /' BOND ',' ANGLE ',' DIHEDRAL ', . 'X-COORDINATE','Y-COORDINATE','Z-COORDINATE'/ DATA GUNITS /'KCAL/ANGSTROM','KCAL/RADIAN ','KCAL/RADIAN ', . 'KCAL/ANGSTROM','KCAL/ANGSTROM','KCAL/ANGSTROM'/ DIMENSION SCALE(3) DATA SCALE /1.0D0,57.295779513082195D0,57.295779513082195D0/ SAVE CRDTYP,GUNITS,SCALE C IGTYP = 1 IF(XYZSPC) IGTYP = 2 IF(IGTYP.EQ.1)THEN C-RDC WRITE(IOUT,'(//" INTERNAL COORDINATE GRADIENT:")') ELSE C-RDC WRITE(IOUT,'(//" CARTESIAN COORDINATE GRADIENT:")') ENDIF C C-RDC WRITE(IOUT,'(/" PARAMETER ATOM ELEMENTAL PARAMETER",6X, C-RDC . "PARAMETER"/4X,"NO.",6X,"NO.",3X,"SYMBOL",6X, C-RDC . "TYPE",11X,"VALUE",13X,"GRADIENT"/)') DO 100 I=1,NPAR ITYP = IPAR(1,I) IATM = IPAR(2,I) IAI = IATNUM(IATM) IF(IGTYP.EQ.1)THEN CRD = ZMAT(ITYP,IATM)*SCALE(ITYP) ELSE CRD = XYZ(ITYP,IATM) ENDIF C-RDC WRITE(IOUT,'(1X,I5,4X,I5,6X,A2,4X,A12,2X,F11.5,1X,F12.5, C-RDC . 1X,A13)') I,IATM,SYMBOL(IAI),CRDTYP(ITYP,IGTYP), C-RDC . CRD,GRAD1(I),GUNITS(ITYP,IGTYP) 100 CONTINUE RETURN END CC-----------------------------------------------------------------CC SUBROUTINE WRTGRAD(GRAD1,IGTYP,GNORM1,IERROR) C C-RDC C WRITES GRADIENT TO UNIT IGRD. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) #include "divcon.dim" #include "divcon.h" DIMENSION GRAD1(*) C C LOCAL: C CHARACTER CRDTYP(3,2)*12,GUNITS(3,2)*13 DIMENSION GINT(3,MAXATM),WXYZ(3,MAXATM),SCALE(3) DATA CRDTYP /' BOND ',' ANGLE ',' DIHEDRAL ', . 'X-COORDINATE','Y-COORDINATE','Z-COORDINATE'/ DATA GUNITS /'KCAL/ANGSTROM','KCAL/RADIAN ','KCAL/RADIAN ', . 'KCAL/ANGSTROM','KCAL/ANGSTROM','KCAL/ANGSTROM'/ DATA SCALE /1.0D0,57.295779513082195D0,57.295779513082195D0/ SAVE CRDTYP,GUNITS,SCALE 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 DO 100 I=1,NPAR ITYP = IPAR(1,I) IATM = IPAR(2,I) IAI = IATNUM(IATM) IF(IGTYP.EQ.1)THEN CRD = ZMAT(ITYP,IATM)*SCALE(ITYP) ELSE CRD = XYZ(ITYP,IATM) ENDIF C-RDC WRITE(IGRD,'(1X,I5,4X,I5,6X,A2,4X,A12,2X,F11.5,1X,F12.5, C-RDC . 1X,A13)') I,IATM,SYMBOL(IAI),CRDTYP(ITYP,IGTYP), C-RDC . CRD,GRAD1(I),GUNITS(ITYP,IGTYP) 100 CONTINUE END