C C $Id: rdcomb.F,v 1.3 1998/07/16 16:40:28 jjv5 Exp arjan $ C C------------------------------------------------------------------------ SUBROUTINE RDCOMB(IERROR) C C READS IN PARAMETERS FOR COMBINATION SUBSETTING: C C COMBSUB C cluster 1-10 C resgrid 11-20 31-33 35 36 C END_COMBSUB C C etc. (any combination of cluster with resgrid, mixgrid or atgrid C can be specified) C C THE ERROR FLAG IS SET TO ONE IF ANY ERRORS ARE ENCOUNTERED WHILE C READING THIS INFORMATION. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) #include "divcon.dim" #include "divcon.h" C C LOCAL: C CHARACTER LINE*80 logical range, min, int, rdnumo, rdg C CC-------------------------------------------------------------------CC clust = .false. atgr = .false. mixgr = .false. resgr = .false. gridsub = .false. rdnumo = .false. range = .false. rdg = .false. C-RDC write(iout,'(/" COMBINATION SUBSETTING PARAMETERS:", C-RDC & /" ---------------------------------")') C C C RETURN WITH AN ERROR IF THE USER HAS NOT DEFINED RESIDUES. C IF(NRES.EQ.0)THEN IERROR = 1 C-RDC WRITE(IOUT, C-RDC . '(/" CANNOT DO COMBINATION SUBSETTING UNLESS RESIDUES", C-RDC . " ARE DEFINED")') RETURN ENDIF C 100 READ(INPT,FMT='(A80)',END=1000) LINE CALL UPCASE1(LINE,80) IF(INDEX(LINE,'END_COMBSUB').NE.0)THEN IF(nread.ne.2)THEN C-RDC WRITE(IOUT, C-RDC . '(/" SPECIFICATION OF COMBINATION SUBSETTING", C-RDC . " PARAMETERS IS INCOMPLETE:", C-RDC . /" SPECIFY TWO KINDS OF SUBSETTING")') ierror = 1 return ENDIF c . report subsetting data + consistency checking gridsub = atgr.or.mixgr.or.resgr if (.not.(gridsub.and.clust)) then C-RDC write(iout,'(/" ERROR IN COMBINATION SUBSETTING ", C-RDC & "PARAMETERS: ", C-RDC & /" SPECIFY CLUSTSUB WITH EITHER ATGRID, ", C-RDC & "RESGRID OR MIXGRID")') ierror = 1 return endif C . sort the arrays call busort1(nigridlr, igridlr) call busort1(niclust, iclustl) if (nigridlr+niclust.ne.nres) then C-RDC write(iout,'(/" ERROR: EXACTLY ALL RESIDUES SHOULD ", C-RDC & "BE SPECIFIED IN THE COMBSUB PARAMETERS")') ierror = 1 return else ig = 1 ic = 1 goto 103 101 ig = ig + 1 goto 103 102 ic = ic + 1 103 if ((ic.gt.niclust).or.(ig.gt.nigridlr)) goto 104 if (igridlr(ig).eq.iclustl(ic)) then C-RDC write(iout,'(/" ERROR: RESIDUE ",I5," IS ", C-RDC & " SPECIFIED BOTH FOR GRID AND CLUSTER ", C-RDC & /" SUBSETTING IN THE COMBSUB PARAMETERS")') C-RDC & igridlr(ig) ierror = 1 return elseif (igridlr(ig).gt.iclustl(ic)) then goto 102 else goto 101 endif endif 104 continue C-RDC 104 write(iout,'(/" A COMBINATION OF THE FOLLOWING SUBSETTING", C-RDC & " METHODS WILL BE USED: ", C-RDC & /" CLUSTER FOR RESIDUES ",/,14(1X,I5))') C-RDC & (iclustl(i), i=1,niclust) if (resgr) then C-RDC write(iout,'(" RESGRID FOR RESIDUES ",/,14(1X,I5))') C-RDC & (igridlr(i), i=1,nigridlr) elseif (atgr) then C-RDC write(iout,'(" ATGRID FOR RESIDUES ",/,14(1X,I5))') C-RDC & (igridlr(i), i=1,nigridlr) elseif (mixgr) then C-RDC write(iout,'(" MIXGRID FOR RESIDUES ",/,14(1X,I5))') C-RDC & (igridlr(i), i=1,nigridlr) endif C . now expand the residues into the corresponding atoms C . igridl will contain the atoms that of the residues that C . are NOT listed in igridlr, in other words all the atoms C . of the residues in iclustl nat = 0 do i=1,niclust k = iclustl(i) j1 = irpnt(k) j2 = irpnt(k+1)-1 do j=j1,j2 nat = nat + 1 igridl(nat) = j enddo enddo nigrid = nat RETURN ELSE C C . LOOK FOR PARAMETERS. C CALL WDJOIN(LINE,80,'=',IERROR) IF(IERROR.NE.0)THEN C-RDC WRITE(IOUT, C-RDC . '(/" IMPROPER USE OF EQUALS SIGN IN COMBINATION", C-RDC . " SUBSETTING PARAMETERS")') RETURN ENDIF C ISTART = 1 200 CALL RDWORD(LINE,ISTART,ISTOP) C C . IF THERE ARE NO MORE WORDS LEFT ON THIS LINE, GO BACK AND C . READ ANOTHER LINE. C IF(ISTART.EQ.0) GO TO 100 C IF(INDEX(LINE(ISTART:ISTOP),'ATGRID').NE.0)THEN atgr = .true. rdg = .true. rdnumo = .false. NREAD = NREAD + 1 ELSEIF(INDEX(LINE(ISTART:ISTOP),'MIXGRID').NE.0)THEN mixgr = .true. rdg = .true. rdnumo = .false. NREAD = NREAD + 1 ELSEIF(INDEX(LINE(ISTART:ISTOP),'RESGRID').NE.0)THEN resgr = .true. rdg = .true. rdnumo = .false. nread = nread + 1 elseif (index(line(istart:istop),'CLUSTER').ne.0) then clust = .true. rdg = .false. nread = nread + 1 rdnumo = .false. ELSEIF (rdnumo) then istop = 0 goto 220 else IERROR = 1 C-RDC WRITE(IOUT, C-RDC . '(/" UNRECOGNIZED PARAMETER SPECIFICATION: ", C-RDC . 80A1)') (LINE(I:I),I=ISTART,ISTOP) RETURN ENDIF 220 if (rdg) then rdnumo = .true. i = istop+1 222 if (i.lt.80) then call whatis2(line(i:i), int, min) if (int) then if (range) then call iatoi(line,i,lstr,inum,ierror) if (ierror.ne.0) return i = lstr + 1 if (inum.gt.nres) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATON: RESIDUE ",I5, C-RDC & " DOES NOT EXIST")') inum ierror = 1 return endif do j=ibeg+1,inum nigridlr = nigridlr + 1 igridlr(nigridlr) = j enddo range = .false. goto 222 else call iatoi(line, i, lstr, ibeg,ierror) if (ierror.ne.0) return if (ibeg.gt.nres) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATON: RESIDUE ",I5, C-RDC & " DOES NOT EXIST")') ibeg ierror = 1 return endif nigridlr = nigridlr + 1 igridlr(nigridlr) = ibeg i = lstr + 1 goto 222 endif elseif (min) then if (range) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATION: UNEXPECTED -")') ierror = 1 return else i = i + 1 range = .true. goto 222 endif else i = i + 1 goto 222 endif endif gridsub = .false. else rdnumo = .true. i = istop+1 233 if (i.lt.80) then call whatis2(line(i:i), int, min) if (int) then if (range) then call iatoi(line,i,lstr,inum,ierror) if (ierror.ne.0) return i = lstr + 1 if (inum.gt.nres) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATON: RESIDUE ",I5, C-RDC & " DOES NOT EXIST")') inum ierror = 1 return endif do j=ibeg+1,inum niclust = niclust + 1 iclustl(niclust) = j enddo range = .false. goto 233 else call iatoi(line, i, lstr, ibeg,ierror) if (ierror.ne.0) return if (ibeg.gt.nres) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATON: RESIDUE ",I5, C-RDC & " DOES NOT EXIST")') ibeg ierror = 1 return endif niclust = niclust + 1 iclustl(niclust) = ibeg i = lstr + 1 goto 233 endif elseif (min) then if (range) then C-RDC write(iout,'(/" ERROR IN COMBSUB ", C-RDC & "SPECIFICATION: UNEXPECTED -")') ierror = 1 return else i = i + 1 range = .true. goto 233 endif else i = i + 1 goto 233 endif endif endif C C . read a new line goto 100 ENDIF 1000 IERROR = 1 C-RDC WRITE(IOUT, C-RDC . '(/" END-OF-FILE ENCOUNTERED WHILE READING COMBINATION ", C-RDC . " SUBSETTING PARAMETERS")') RETURN 2000 IERROR = 1 C-RDC WRITE(IOUT, C-RDC . '(/" ERROR READING COMBINATION SUBSETTING PARAMETERS")') RETURN END