C C $Id: rdgroup.F,v 1.4 1998/07/16 16:40:29 jjv5 Exp arjan $ C C------------------------------------------------------------------------ subroutine rdgroup(ierror) C C reads in parameters for groups C C GROUP C GROUP 1 C 1-32 34 C GROUP 2 C 33 C GROUP 3 C 35-73 C END_GROUP 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, int, min C range = .false. ngroup = 0 ingroupn(0) = 0 ir = 0 100 read(inpt,fmt='(A80)',end=1000) line call upcase1(line,80) if(index(line,'END_GROUP').ne.0)then goto 1000 elseif(index(line,'GROUP').ne.0)then if (range) then C-RDC write(iout,'(/" ERROR IN SPECIFICATION OF ", C-RDC & "GROUP ",i4)') ngroup ierror = 1 return endif ngroup = ngroup + 1 if (ngroup.gt.maxgroup) then C-RDC write(iout,'(/" ERROR: MAXIMUM NUMBER OF GROUPS REACHED.", C-RDC & /" INCREASE MAXGROUP IN divcon.dim AND RECOMPILE")') ierror = 1 return endif ingroupn(ngroup) = 0 goto 100 else i = 1 10 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 n = inum-ingroup(ir) if (ir+n.gt.maxres) then C-RDC write(iout,'(" ERROR: CERTAIN RESIDUES ARE", C-RDC & " IN MORE THAN ONE GROUP")') ierror = 1 return endif do j=1,n ingroup(ir+j) = ingroup(ir)+j enddo ingroupn(ngroup) = ingroupn(ngroup) + n ir = ir + n range = .false. goto 10 else ir = ir + 1 if (ir.gt.maxres) then C-RDC write(iout,'(" ERROR: CERTAIN RESIDUES ARE", C-RDC & " IN MORE THAN ONE GROUP")') ierror = 1 return endif ingroupn(ngroup) = ingroupn(ngroup) + 1 call iatoi(line, i, lstr, ingroup(ir),ierror) if (ierror.ne.0) return i = lstr + 1 goto 10 endif elseif (min) then if (range.or.(ingroupn(ngroup).eq.0)) then C-RDC write(iout,'(/" ERROR IN SPECIFICATION ", C-RDC & "OF GROUP ",i4)') ngroup ierror = 1 return else i = i + 1 range = .true. goto 10 endif else i = i + 1 goto 10 endif endif endif goto 100 C consistency checking: every residue should be in group C and every residue should only be in one single group 1000 if (range) then C-RDC write(iout,'(/" ERROR IN SPECIFICATION OF ", C-RDC & "GROUP ",i4)') ngroup ierror = 1 return elseif (ngroup.eq.0) then C-RDC write(iout,'(/" ERROR: NO GROUPS SPECIFIED")') ierror = 1 return endif C-RDC write(iout,'(/" GROUP DEFINITIONS:", C-RDC & /" -----------------"/)') n = 1 do i=1,ngroup it = ingroupn(i) call busort1(ingroupn(i),ingroup(n)) if (ingroupn(i).eq.0) then C-RDC write(iout,'(/" ERROR: GROUP ",i4," IS EMPTY")') i ierror = 1 return endif id = it-ingroupn(i) if (id.ne.0) then do ii=n+ingroupn(i),maxres ingroup(ii) = ingroup(ii+id) enddo endif C . check if every residue in a group contains the same number C . of atoms, assume that this is enough to test that every C . residue in a group is the same natold = irpnt(ingroup(n)+1)-irpnt(ingroup(n)) do j=1,ingroupn(i)-1 nat = irpnt(ingroup(n+j)+1)-irpnt(ingroup(n+j)) if (nat.ne.natold) then C-RDC write(iout,'(/" ERROR: RESIDUE ",I4," AND ",I4, C-RDC & " OF GROUP ",I4," ARE NOT THE SAME")') C-RDC & ingroup(n), ingroup(n+j), i ierror = 1 return endif enddo C-RDC write(iout,'(" GROUP ",I4," (RESIDUE ",i4,"): ")') C-RDC & i, ingroup(n) C-RDC write(iout,'(14(1x,i5))') (ingroup(n+j), j=0,ingroupn(i)-1) n = n + ingroupn(i) enddo n = n - 1 if (ingroup(1).lt.1) then C-RDC write(iout,'(/" ERROR: RESIDUE ",i4," DOES NOT EXIST")') C-RDC & ingroup(1) ierror = 1 return elseif (ingroup(n).gt.nres) then C-RDC write(iout,'(/" ERROR: RESIDUE ",i4," DOES NOT EXIST")') C-RDC & ingroup(n) ierror = 1 return endif if (n.lt.nres) then C-RDC write(iout,'(/" ERROR: SOME RESIDUES ARE NOT IN A GROUP")') ierror = 1 return elseif (n.gt.nres) then C-RDC write(iout,'(/" ERROR: SOME RESIDUES ARE IN MORE THAN ", C-RDC & "ONE GROUP")') ierror = 1 return endif do i=2,n if (ingroup(i).eq.ingroup(i-1)) then C-RDC write(iout,'(/" ERROR: RESIDUE ",i4," IS IN MORE THAN ", C-RDC & "ONE GROUP")') ingroup(i) ierror = 1 return endif enddo end CC------------------------------------------------------------CC