C C $Id: rdbox.F,v 1.3 1998/07/16 16:40:27 jjv5 Exp arjan $ C C------------------------------------------------------------------------ SUBROUTINE RDBOX(IERROR) C C READS IN BOX DIMENSIONS FOR PERIODIC BOUNDARY CONDITIONS. C C FOR A BOX THAT IS 15.0 BY 20.0 BY 25.0, THE FORMAT OF THE C INPUT WOULD BE: C C BOX C XBOX=15.0 YBOX=20.0 ZBOX=25.0 C END_BOX 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,BOXSTR(3)*4 DATA BOXSTR /'XBOX','YBOX','ZBOX'/ SAVE BOXSTR LOGICAL READIT(3) C IERROR = 0 C C-RDC WRITE(IOUT,'(//" PBC BOX DIMENSIONS:", C-RDC & /" ------------------"/)') C C RETURN WITH AN ERROR IF THE USER HAS NOT DEFINED RESIDUES. C IF(NRES.EQ.0)THEN IERROR = 1 WRITE(IOUT, . '(/" CANNOT USE PERIODIC BOUNDARY CONDITIONS", . " UNLESS RESIDUES ARE DEFINED")') RETURN ENDIF C C READIT(1) = .FALSE. C READIT(2) = .FALSE. C READIT(3) = .FALSE. C NREAD = 0 C 100 READ(INPT,FMT='(A80)',END=1000) LINE C CALL UPCASE1(LINE,80) C IF(INDEX(LINE,'END_BOX').NE.0)THEN C IF(NREAD.LT.3)THEN C IERROR = 1 C WRITE(IOUT, C . '(/" SPECIFICATION OF PBC BOX DIMENSIONS", C . " IS INCOMPLETE")') C ELSE ! WRITE(IOUT,'(" XBOX =",F8.4, ! . " YBOX =",F8.4, ! . " ZBOX =",F8.4)') (DBOX(I),I=1,3) DHALF(1) = 0.5D0*DBOX(1) DHALF(2) = 0.5D0*DBOX(2) DHALF(3) = 0.5D0*DBOX(3) bmin = min(dbox(1),dbox(2)) bmin = min(bmin,dbox(3)) if (drmc.ge.bmin) then write(iout, . '(/" DR FOR MONTE CARLO MOVE IS EQUAL OR GREATER", . " THAN MINIMUM BOXLENGTH")') ierror = 1 return endif C ENDIF C RETURN C ELSEIF(INDEX(LINE,'BOX').NE.0.AND. C . INDEX(LINE,'=').EQ.0)THEN C write(iout,'(/" ERROR IN BOX SPECIFICATION")') C ierror = 1 C return C ELSE C C LOOK FOR BOX DIMENSIONS. C C CALL WDJOIN(LINE,80,'=',IERROR) C IF(IERROR.NE.0)THEN C WRITE(IOUT, C . '(/" IMPROPER USE OF EQUALS SIGN IN PBC BOX", C . " DIMENSIONS")') C RETURN C ENDIF C C ISTART = 1 C 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 C IF(ISTART.EQ.0) GO TO 100 C C LOOK FOR 'XBOX=', 'YBOX=', 'ZBOX=' STRINGS IN CURRENT WORD. C C DO 300 IBOX=1,3 C IF(INDEX(LINE(ISTART:ISTOP),BOXSTR(IBOX)).NE.0)THEN C IF(READIT(IBOX)) GO TO 200 C CALL RDNUM(LINE,ISTART,DBOX(IBOX),IERROR) C IF(IERROR.NE.0) GO TO 2000 C NREAD = NREAD + 1 C READIT(IBOX) = .TRUE. C IF(NREAD.LT.3)THEN C ISTART = ISTOP + 1 C GO TO 200 C ELSE C GO TO 100 C ENDIF C ENDIF C 300 CONTINUE C C UNRECOGNIZED SPECIFICATION IF NONE OF THE CORRECT STRINGS C WAS FOUND. C C IERROR = 1 C WRITE(IOUT, C . '(/" UNRECOGNIZED PBC BOX SPECIFICATION: ", C . 80A1)') (LINE(I:I),I=ISTART,ISTOP) C RETURN C ENDIF C C 1000 IERROR = 1 C WRITE(IOUT, C . '(/" END-OF-FILE ENCOUNTERED WHILE READING PBC", C . " BOX DIMENSIONS")') C RETURN C 2000 IERROR = 1 C WRITE(IOUT, C . '(/" ERROR READING PBC BOX DIMENSIONS")') C RETURN END