PROGRAM MXDINP C****************************************************************** C*** PROGRAM : MXDINPUT *** C*** [ CREATE FILE07, FILE05.DAT, AND FILE10 ] *** C*** VERSION 1984Sep23-2 BY KATS *** C*** PC-VERSION 1988Jan15-0 BY KATS *** C*** REVICED FOR JCPE 1990Apr14 BY KATS *** C*** Reviced for low symmetry structure *** C*** Prepare for large unit cell 1991Mar14 by Kats *** C*** Integrated version (MD and XD) 1991Jul18 by Kats *** C*** 1991Oct23 by Kats *** C*** Multi-componets 1992Mar24 by Kats *** C*** New file05.dat format 1993Jan04 by Kats *** C*** Diatomic molecule 1997Oct14 by Kats *** C*** Water film 1998Mar19 by Kats *** C*** sheet 1999Oct23 by Kats *** C*** Formats and LEL=10 2001Jun20 by Kats *** C*** Formats 2002Nov30 by Kats *** C*** Rod and drop (cube) 2004Aug16 by Kats *** C*** inside or outside 2009Oct04 by Kats *** C*** Index column for molecule 2010Nov21 by Kats *** C*** at each atom *** C****************************************************************** C PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) C C LNI : Maximum number of atoms in a MD basic cell C LEL : Maximum number of atom species C LNA : Maximum number of atoms in a crystal asymmetric unit C LAT : Maximum number of atoms in a cristal unit cell C LSY : Maximum number of symmetry operations C COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT),NION(LEL) REAL *8 P COMMON /MDDATA/NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q COMMON /SYMMT/ NS,NL, RS(3,3,LSY),TS(3,LSY), TL(3,4) COMMON /TRAJEC/NPT,NPTP,P0C(3,LAT),JON(LAT),XYZ(3,LNA),XYZH(3,LNA) COMMON /MUDANA/ IXD(LNI), JXD(LNI) COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME C COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C INTEGER *4 IONI(LEL) CHARACTER *4 HEX, ANS, RANS, DUM, MXD CHARACTER *12 XNAME(300),YNAME, STRUCT C FLNAME( 1) = 'MXDINPUT.F ' FLNAME( 2) = '2004-08-16-00 ' C flname( 3) = 'WinPC ' C FLNAME( 3) = 'UNIX ' C FLNAME( 5) = 'file05.dat ' FLNAME( 6) = 'file06.dat ' FLNAME( 7) = 'file07.dat ' FLNAME( 8) = 'file08.dat ' FLNAME( 9) = 'file09p.dat ' FLNAME(11) = 'file09v.dat ' FLNAME(10) = 'file10.dat ' FLNAME(12) = ' ' C FLNAME(18) = 'c:\mxd\xtaldata.dat ' FLNAME(19) = '/usr/MXD/xtaldata.dat ' C C CALL ATMDAT CALL RNDMIZ C IF (FLNAME(3).EQ.'UNIX ') THEN FLNAME(18) = FLNAME(19) END IF C C OPEN ( 4, FILE='CON', STATUS='NEW') OPEN (16, FILE=FLNAME(6), STATUS='UNKNOWN', * ACCESS='SEQUENTIAL',FORM='FORMATTED') C 11 OPEN ( 8,FILE=FLNAME(18), STATUS='OLD', * ACCESS='SEQUENTIAL',FORM='FORMATTED') C C ------------------------------------------- Search for a structure MXD = 'XD' 111 WRITE (6,2022) 2022 FORMAT('Structure type (A12)? (see XTALDATA.DAT, or ', * 'type "LIST")' / * '............',12X,'"CHAOS" for liquid or glass') c READ (5,1002) STRUCT 1002 FORMAT (A12) IF (STRUCT.EQ.' ') STOP 888 IF (STRUCT.EQ.'CANCEL'.OR.STRUCT.EQ.'cancel') STOP 999 C C -------------------------------------------------- LIQUID OR GLASS IF (STRUCT.EQ.'CHAOS '.OR.STRUCT.EQ.'chaos ' .OR. * STRUCT.EQ.'LIQUID'.OR.STRUCT.EQ.'liquid' .OR. * STRUCT.EQ.'GLASS '.OR.STRUCT.EQ.'glass ') THEN MXD = 'MD' CALL LIQUID write (6,*) 'Random structure ',adx GO TO 777 END IF C C ----------------------------------------------- List of structures IF (STRUCT.EQ.'LIST '.OR.STRUCT.EQ.'list ') THEN XNAME(1) = 'CHAOS ' NX = 1 400 READ (8,1004,END=490) YNAME 1004 FORMAT (A12) IF (YNAME.NE.'::::::::::::') THEN IF (YNAME.NE.'............') GO TO 400 NX = NX + 1 READ (8,1004) XNAME(NX) GO TO 400 END IF 490 WRITE (6,4888) (XNAME(N),N=1,NX) 4888 FORMAT (1X,6A13) REWIND 8 GO TO 111 END IF C C ------------------------------------------------- Search structure REWIND 8 222 READ (8,1002,END=999) YNAME IF (YNAME.EQ.'::::::::::::') GO TO 111 IF (YNAME.NE.STRUCT) GO TO 222 IF (YNAME.NE.STRUCT) GO TO 222 IF (YNAME.NE.STRUCT) GO TO 222 C C ------------------------------------------------ Xtal initial data C Input from database, and display READ (8,1001) TITLE 1001 FORMAT (18A4) WRITE (6,2003) TITLE 2003 FORMAT (1X,18A4) READ (8,1010) (BOX(I),I=1,6) 1010 FORMAT (6F10.5) WRITE (6,2010) BOX 2010 FORMAT (5X,' A=',F7.4,' B=',F7.4,' C=',F7.4,' (',3F9.4,')') IF (ABS(BOX(4)).GT.1.01) BOX(4) = COS(BOX(4)*3.1415926/180.) IF (ABS(BOX(5)).GT.1.01) BOX(5) = COS(BOX(5)*3.1415926/180.) IF (ABS(BOX(6)).GT.1.01) BOX(6) = COS(BOX(6)*3.1415926/180.) C CALL SPACEG (MA) CALL INATOM (HEX) C READ (8,1020) AOX 1020 FORMAT (10(A4,1X)) write (6,*) AOX CLOSE (8) C WRITE (6,2031) AOX 2031 FORMAT (10(A4,1X),': Atoms in the structure'/ * 'O Si Al Mg Ca Na Cs X Y Z : ', * '(Exampl) Type in please') C ----------------------------- Key in atom names in proper sequence READ (5,1020) ADX C 41 WRITE (6,4402) BOX 4402 FORMAT ('A=',F7.3,' B=',F7.3,' C=',F7.3,'(',3F7.3,')'/ * 'How many cells?' / ' A B C') C ------------------------------ Key in numbers of stacking cells READ (5,4103) NX,NY,NZ 4103 FORMAT (3I5, A4) WRITE (6,*) 'A=',BOX(1)*NX, 'B=',BOX(2)*NY, 'C=',BOX(3)*NZ, * ' Ok?' READ (5,9110) ANS IF (ANS.EQ.'n'.OR.ANS.EQ.'N') GO TO 41 C CALL GENPOS CALL STRCHK C C -------------------------------------------------------- MD and XD 777 WRITE (6,3752) READ (5,4750) TEMP 3752 FORMAT ( 'I',8('-'),'I Temperature(K) ?') 4750 FORMAT (F10.4) IF (TEMP.LT.0.001) TEMP = 300.0 DO 70 I = 1, NTION DO 60 J = 1, 3 CALL RANDOM Q(J,I)= (RD(J)-0.5)*0.05 + 5.0 60 CONTINUE 70 CONTINUE C C ---------------------------------------------- Write on file07.dat DELTAT = -1.0 DTIME = 2.0E-15 NCOMPO = 0 DO 703 IO = 1, LEL ioni(io) = 0 IF (NION(IO).GT.0) THEN NCOMPO = IO DO 701 J = 1, LAM IF (ADX(IO).EQ.ION(1,J)) IONI(IO) = J IF (ADX(IO).EQ.ION(2,J)) IONI(IO) = J IF (ADX(IO).EQ.ION(3,J)) IONI(IO) = J 701 CONTINUE if (ioni(io).gt.0 .and. ioni(io).le.lam) * ADX(IO)= ion(1,ioni(io)) IF (IONI(IO).LE.0) IONI(IO) = LAM END IF 703 CONTINUE C DENSTY = 0.0 DO 708 I = 1, LEL if (nion(i).gt.0) then DENSTY = DENSTY + NION(I) * WGT(IONI(I)) end if 708 CONTINUE DENSTY = DENSTY / (BOX(1)*BOX(2)*BOX(3)*(1.0E-24*6.02214E23)) PRESS = 0.0001 C OPEN ( 7, FILE=FLNAME(7), STATUS='UNKNOWN', * ACCESS='SEQUENTIAL',FORM='FORMATTED') REWIND 7 WRITE (7,7007) TITLE, 0, 0, * NTION, NCOMPO, 0,0,0,0,0,0,0,0,0 WRITE (7,7017) (ADX(I), I=1,LEL) WRITE (7,7018) (NION(I), I=1,LEL) WRITE (7,7018) (IONS(1,I),I=1,LEL) WRITE (7,7018) (IONS(2,I),I=1,LEL) WRITE (7,7070) TEMP,DELTAT,TEMP, PRESS,PRESS,PRESS, * DTIME, (BOX(I),I=1,6), * DENSTY, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 do 717 io=1, ncompo do 717 i=ions(1,io), ions(2,io) WRITE (7,7770) (P(J,I),J=1,3),(Q(J,I),J=1,3), * (P(J,I),J=1,3), io, 0 717 continue 7007 FORMAT (15A4,2I5 / I7,I3, 10I10) 7017 FORMAT ( 10(2X,A4) ) 7018 FORMAT ( 10I6 ) 7070 FORMAT (F10.2, F10.4, F10.2, 3F10.5 / * E10.2, 10X, 6F10.6 / * F10.6, 10X, 6F10.6 ) 7770 FORMAT (3F10.8,1X,3F9.7,1X,3F10.7,1x,i2,1x,I6) ENDFILE (7) REWIND 7 CLOSE (7) C IF (MXD.EQ.'XD ') THEN C --------------------------------------- Write on file10.dat OPEN (10, FILE=FLNAME(10), STATUS='UNKNOWN', * ACCESS='SEQUENTIAL',FORM='FORMATTED') REWIND 10 WRITE (10,8010) (BOX(I),I=1,6), * NX,NY,NZ,NPT,NPTP,NS,HEX,MA WRITE (10,8012) (ATM(J),J=1,MA) WRITE (10,8014) (NID(J),J=1,MA) WRITE (10,8020) (JON(N),(P0C(J,N),J=1,3),IXD(JON(N)), * N=1,NPTP) WRITE (10,8030) (((RS(J,I,N),J=1,3),I=1,3),N=1,NS) WRITE (10,8040) (NSYM(N),N=1,NTION) 8010 FORMAT (3F10.6,3F10.8 / 6I5,5X,A4,I6 ) 8012 FORMAT ( 18(A4) ) 8014 FORMAT ( 18I4 ) 8020 FORMAT (I5,3F10.7,I5) 8030 FORMAT (9F6.1) 8040 FORMAT (12I6) ENDFILE (10) REWIND 10 CLOSE (10) END IF C C ---------------------------------------------------- Confirmations WRITE (6,1201) (ADX(I), NION(I), I=1,LEL) 1201 FORMAT (2X,'*** NO. of ions : ',5(A2,':',I5,3X) / * 2X,' ',5(A2,':',I5,3X) ) IF (STRUCT.NE.'CHAOS '.AND.STRUCT.NE.'chaos ') THEN WRITE (6,5555) NX,NY,NZ, NPT,NPTP 5555 FORMAT (2X,'*** CELL IS ',3I4,6X,'NPT(NPTP) :',I4, * '(',I3,')') END IF WRITE (6,3333) (BOX(I),I=1,6) 3333 FORMAT (2X,'*** A=', F8.4,' B=', F8.4,' C=', F8.4, * ' CA=',F7.4,' CB=',F7.4,' CC=',F7.4) WRITE (6,4801) DENSTY 4801 FORMAT (2X,'*** Density is ',F8.4,' g/cm3') WRITE (6,5801) C C ------------------------------------------------------- File05.dat 5801 FORMAT (' Do you want a new file05.dat (y/n/r) ?') READ (5,9110) ANS 9110 FORMAT (A1) IF (ANS.EQ.'R'.OR. ANS.EQ.'r') GO TO 11 IF (ANS.NE.'Y'.AND.ANS.NE.'y') GO TO 909 C ANREC5 = 50. IF (MXD.EQ.'XD') ANREC5 = 5. DTIME = 2.0 DO 808 IO = 1, LEL IF (ADX(IO).EQ.'H ') DTIME = 0.4 808 CONTINUE C ---------------------------------------------- Write on file05.dat OPEN (15, FILE=FLNAME(5),STATUS='UNKNOWN', * ACCESS='SEQUENTIAL',FORM='FORMATTED') WRITE (15,5000) MXD 5000 FORMAT (A2,'.......I....:....I....:....I....:....I....:....I', * '....:....I....:....I:') WRITE (15,5001) (TITLE(I),I=1,15), ANREC5, DTIME, TEMP 5001 FORMAT ( * 'START ',15A4,':' / * 'ECONOMY 01000. 1000. 100. ',F8.0,2X, * ' 5. ',10X,':' / * 'NOACCUM ',F7.2,3X,' 1.0 0.0 ',30X,':'/ * 'T SCALING ',F9.2,1X,' -0.1 1. ',30X,':' / * 'P NO-CNTL 0.0001 0.0001 0.0001 ' ,30X,':' / * 'V CONST. ',60X,':' / * 'BUSING 4. 0.0 ',20X,':') DO 803 IO = 1, LEL IF (NION(IO).GT.0) THEN ACHG = 0.0 AWGT = 0.0 DO 801 J = 1, LAM IF (ADX(IO).EQ.ION(1,J).OR. * ADX(IO).EQ.ION(2,J).OR. * ADX(IO).EQ.ION(3,J) ) THEN ACHG = CHG(J) AWGT = WGT(J) AI = AOI(J) BI = BOI(J) CI = COI(J) END IF 801 CONTINUE WRITE (15,5007) IO,ADX(IO),REAL(NION(IO)),ACHG,AWGT, * AI, BI, CI 5007 FORMAT(I1,1X,A2,F6.0, 2X,F6.3,2X, 2X,F6.2,2X, F8.3,2X, * F8.3,2X, F8.3,2X, ' :') END IF 803 CONTINUE WRITE (15,5008) 5008 FORMAT (70X,':' / 70X,':') WRITE (15,5000) MXD WRITE (15,5009) 5009 FORMAT ('STOP ',60X,':' /) ENDFILE (15) REWIND 15 CLOSE (15) C 909 ENDFILE (16) CLOSE (16) 999 STOP END C C C ============ C============================================================= Atom data SUBROUTINE ATMDAT PARAMETER (LAM=42) COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C CHARACTER *4 AION(LAM), BION(LAM), CION(LAM) REAL *4 AWGT(LAM), ACHG(LAM), AAOI(LAM), ABOI(LAM), * ACOI(LAM), ARAD(LAM) C DATA AION / 'H ', * 'Li ', 'Be ', 'B ', 'C ', 'N ', 'O ', 'F ', * 'Na ', 'Mg ', 'Al ', 'Si ', 'P ', 'S ', 'Cl ', * 'K ', 'Ca ', 'Sc ', 'Ti ', 'Ga ', 'Ge ', 'As ', * 'Se ', 'Br ', * 'Rb ', 'Sr ', 'In ', 'Sn ', 'Sb ', 'Te ', 'I ', * 'Cs ', 'Ba ', 'Pb ', * 'Y ', 'Zr ', * 'He ', 'Ne ', 'Ar ', 'Kr ', 'Xe ', ' ' / C DATA BION / 'h ', * 'li ', 'be ', 'b ', 'c ', 'n ', 'o ', 'f ', * 'na ', 'mg ', 'al ', 'si ', 'p ', 's ', 'cl ', * 'k ', 'ca ', 'sc ', 'ti ', 'ga ', 'ge ', 'as ', * 'se ', 'br ', * 'rb ', 'sr ', 'in ', 'sn ', 'sb ', 'te ', 'i ', * 'cs ', 'ba ', 'pb ', * 'y ', 'zr ', * 'he ', 'ne ', 'ar ', 'kr ', 'xe ', ' ' / C DATA CION / 'H ', * 'LI ', 'BE ', 'B ', 'C ', 'N ', 'O ', 'F ', * 'NA ', 'MG ', 'AL ', 'SI ', 'P ', 'S ', 'CL ', * 'K ', 'CA ', 'SC ', 'TI ', * 'GA ', 'GE ', 'AS ', 'SE ', 'BR ', * 'RB ', 'SR ', 'IN ', 'SN ', 'SB ', 'TE ', 'I ', * 'CS ', 'BA ', 'PB ', * 'Y ', 'ZR ', * 'HE ', 'NE ', 'AR ', 'KR ', 'XE ', ' ' / C DATA AWGT / 1.008, * 6.941, 9.012, 10.81, 12.01, 14.01, 16.00, 19.00, * 22.99, 24.31, 26.98, 28.09, 30.97, 32.07, 35.45, * 39.10, 40.08, 44.96, 47.88, * 69.72, 72.61, 74.92, 78.96, 79.90, * 85.47, 87.62, 114.8, 118.7, 121.8, 127.6, 126.9, * 132.9, 137.3, 207.2, * 88.91, 91.22, * 4.002, 20.18, 39.95, 83.80, 131.29, 0.0 / C DATA ACHG / 1.00, * 1.00, 2.00, 3.00, 4.00, -3.00, -2.00, -1.00, * 1.00, 2.00, 3.00, 4.00, 5.00, 6.00, -1.00, * 1.00, 2.00, 3.00, 4.00, * 3.00, 4.00, 5.00, 6.00, -1.00, * 1.00, 2.00, 3.00, 4.00, 5.00, 6.00, -1.00, * 1.00, 2.00, 4.00, * 3.00, 4.00, * 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / C DATA AAOI / 0.0, * 0.0, 0.0, 0.720, 0.0, 1.713, 1.629, 1.565, * 1.260, 1.161, 1.064, 1.012, 0.0, 0.0, 1.950, * 1.595, 1.440, 0.0, 1.235, * 0.0, 0.0, 0.0, 0.0, 0.0, * 0.0, 1.632, 0.0, 0.0, 0.0, 0.0, 0.0, * 0.0, 1.820, 0.0, * 0.0, 0.0, * 1.156, 1.397, 1.860, 2.025, 2.246, 0.0 / C DATA ABOI / 0.0, * 0.0, 0.0, 0.080, 0.0, 0.080, 0.085, 0.085, * 0.080, 0.080, 0.080, 0.080, 0.0, 0.0, 0.090, * 0.080, 0.080, 0.0, 0.080, * 0.0, 0.0, 0.0, 0.0, 0.0, * 0.0, 0.080, 0.0, 0.0, 0.0, 0.0, 0.0, * 0.0, 0.080, 0.0, * 0.0, 0.0, * 0.115, 0.120, 0.145, 0.165, 0.180, 0.0 / C DATA ACOI / 0.0, * 0.0, 0.0, 0.0, 0.0, 0.0, 20.00, 20.0, * 10.0, 2.0, 0.0, 0.0, 0.0, 0.0, 30.0, * 15.0, 10.0, 0.0, 0.0, * 0.0, 0.0, 0.0, 0.0, 40.0, * 20.0, 15.0, 0.0, 0.0, 0.0, 0.0, 50.0, * 25.0, 20.0, 0.0, * 0.0, 0.0, * 4.76, 11.04, 38.54, 55.35, 85.57, 0.0 / C DATA ARAD / 0.10, * 0.60, 0.20, 0.10, 0.10, 1.40, 1.35, 1.30, * 1.00, 0.65, 0.25, 0.15, 0.15, 0.10, 1.40, * 1.05, 0.80, 0.50, 0.50, * 0.40, 0.20, 0.20, 0.15, 1.50, * 1.20, 0.95, 0.60, 0.60, 0.70, 0.75, 1.70, * 1.40, 1.10, 1.30, * 0.65, 0.60, * 1.20, 1.30, 1.80, 1.90, 2.00, 0.0 / C DO 100 I = 1, LAM ION(1,I) = AION(I) ION(2,I) = BION(I) ION(3,I) = CION(I) WGT(I) = AWGT(I) CHG(I) = ACHG(I) AOI(I) = AAOI(I) BOI(I) = ABOI(I) COI(I) = ACOI(I) RAD(I) = ARAD(I) 100 CONTINUE RETURN END C C C ========= C================================================================ RANDOM SUBROUTINE RANDOM COMMON /RANDM3/ R1, R2, R3, IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR C INTEGER *4 II,JJ,KK, LL,MM,NN C II = ((JR/3) * (KR/3) + LR) / 2 JJ = ((IR/3) * (KR/3) + MR) / 2 KK = ((IR/3) * (JR/3) + NR) / 2 IR = MOD(II,100000) JR = MOD(JJ,100000) KR = MOD(KK,100000) R1 = FLOAT(IR) * 0.00001 R2 = FLOAT(JR) * 0.00001 R3 = FLOAT(KR) * 0.00001 LL = ((MR/3) * (NR/3) + IR) / 2 MM = ((LR/3) * (NR/3) + JR) / 2 NN = ((LR/3) * (MR/3) + KR) / 2 LR = MOD(LL,100000) MR = MOD(MM,100000) NR = MOD(NN,100000) RETURN C ENTRY RNDMIZ IR = 32723 JR = 23557 KR = 47979 LR = 54893 MR = 16617 NR = 79423 RETURN END C C C ======== C================================================================= CHAOS SUBROUTINE LIQUID PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME C COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR C INTEGER *4 IONI(LEL) REAL *4 R(20), rpx(2,3) CHARACTER *1 ANSWER integer ians,inout C WRITE (6,3402) READ (5, *) KNK 3402 FORMAT ('KEY IN AN INTEGER FOR RANDOMIZE') DO 10 I = 1, KNK CALL RANDOM 10 CONTINUE C WRITE (6,3432) READ (5, 4430) TITLE 3432 FORMAT ( 'I',58('-'),'I TITLE ?') 4430 FORMAT (15A4) C WRITE (6,3442) (mod(I,10),I=1,LEL) READ (5, 4440) ADX 3442 FORMAT ( 10('ION',I1,' '),' : ATOM SPECIES ?') 4440 FORMAT (10(A4,1X)) DO 30 I = 1, LEL NION(I) = 0 IONI(I) = 0 DO 20 J = 1, LAM IF (ADX(I).EQ.ION(1,J)) IONI(I) = J IF (ADX(I).EQ.ION(2,J)) IONI(I) = J IF (ADX(I).EQ.ION(3,J)) IONI(I) = J 20 CONTINUE if (ioni(i).gt.0 .and. ioni(i).le.lam) adx(i)=ion(1,ioni(i)) IF (IONI(I).LE.0) IONI(I) = LAM 30 CONTINUE C WRITE (6,3462) (mod(I,10),I=1,LEL) READ (5, 4460) NION 3462 FORMAT ( 10('....',I1),' NO. OF IONS ?') 4460 FORMAT (10I5) JO = 0 DO 50 IO = 1, LEL IONS(1,IO) = JO + 1 IONS(2,IO) = IONS(1,IO) + NION(IO) -1 JO = IONS(2,IO) write (6,*) io,adx(io), nion(io),ions(1,io),ions(2,io) 50 continue C 77 WRITE (6,3452) READ (5,4450)(BOX(I),I=1,3) 3452 FORMAT ( 3('I',9('-')),'I BOX EDGE LENGTHS (1-3) ?') 4450 FORMAT (3F10.4) IF (BOX(2).LE.0.1) BOX(2) = BOX(1) IF (BOX(3).LE.0.1) BOX(3) = BOX(2) BOX(4) = 0.0 BOX(5) = 0.0 BOX(6) = 0.0 DENSTY = 0.0 DO 708 I = 1, LEL DENSTY = DENSTY + NION(I) * WGT(IONI(I)) 708 CONTINUE DENSTY = DENSTY / (BOX(1)*BOX(2)*BOX(3)*(1.0E-24*6.02214E23)) WRITE (6,7001) DENSTY 7001 FORMAT (' -----> The density is ', F7.4, 'g/cm3. OK ? (Y/N)') READ (5,7002) ANSWER 7002 FORMAT (A1) IF (ANSWER.NE.'Y' .AND. ANSWER.NE.'y') GO TO 77 C DT = 1.0E-15 C write (6,7201) 7201 format ('Molecule: 1:monoatomic, 2:diatomic, or 3:H2O/CO2 ', * '(1/2/3) ?') read (5,7203) imol 7203 format (i1) C do 5 i=1, 3 rpx(1,i)=0.0 rpx(2,i)=1.0 5 continue write (6,7301) 7301 format ('Structure: 1:bulk, 2:sheet, 3:sq.rod, 4:cube, ', * '5:sphere ?') read (5,7303) istr 7303 format (i1) c inout=0 if (istr.eq.2) then !----------------------------------- sheet write (6,7311) 7311 format (1x,'Sheet perpendicular to 1:x, 2:y, 3:z ?') read (5,7315) ipx 7315 format (i1) rpx(1,ipx) = 0.20 rpx(2,ipx) = 0.80 write (*,*) 'Range of sheet ',rpx(1,ipx),rpx(2,ipx), * ' OK (y/n)?' READ (5,7002) ANSWER IF (ANSWER.EQ.'N' .OR. ANSWER.EQ.'n') then write (6,*) 'Input range (2F, 0-1)' read (5,*) rpx(1,ipx), rpx(2,ipx) end if end if c if (istr.eq.3) then !---------------------------------- sq.rod write (6,7312) 7312 format (1x,'Rod along with 1:x, 2:y, 3:z ?') read (5,7315) ipx if (ipx.eq.1) then ipy=2 ipz=3 else if (ipx.eq.2) then ipy=1 ipz=3 else ipy=1 ipz=2 end if rpx(1,ipy) = 0.20 rpx(2,ipy) = 0.80 rpx(1,ipz) = 0.20 rpx(2,ipz) = 0.80 write (*,*) 'Range of axis ',ipy,rpx(1,ipy),rpx(2,ipy) write (*,*) ' axis ',ipz,rpx(1,ipz),rpx(2,ipz), * ' OK (y/n)?' READ (5,7002) ANSWER IF (ANSWER.EQ.'N' .OR. ANSWER.EQ.'n') then write (6,*) 'Input range (2F, 0-1)' read (5,*) rpx(1,ipy), rpx(2,ipy) rpx(1,ipz) = rpx(1,ipy) rpx(2,ipz) = rpx(2,ipy) end if write (*,*) 'Particles 1: inside 2: outside ?' read (5,*) ians c write (6,*) ians if (ians.eq.1) inout= 1 if (ians.eq.2) inout=-1 c write (6,*) ians,inout end if c if (istr.eq.4) then !------------------------------------ cube rpx(1,1) = 0.20 rpx(2,1) = 0.80 rpx(1,2) = 0.20 rpx(2,2) = 0.80 rpx(1,3) = 0.20 rpx(2,3) = 0.80 write (*,*) 'Range of axis x',rpx(1,1),rpx(2,1) write (*,*) 'Range of axis y',rpx(1,2),rpx(2,2) write (*,*) ' axis z',rpx(1,3),rpx(2,3), * ' OK (y/n)?' READ (5,7002) ANSWER IF (ANSWER.EQ.'N' .OR. ANSWER.EQ.'n') then write (6,*) 'Input range (2F, 0-1)' read (5,*) rpx(1,1), rpx(2,1) rpx(1,2) = rpx(1,1) rpx(2,2) = rpx(2,1) rpx(1,3) = rpx(1,1) rpx(2,3) = rpx(2,1) end if write (*,*) 'Particles 1: inside 2: outside ?' read (5,*) ians if (ians.eq.1) inout= 1 if (ians.eq.2) inout=-1 end if c if (istr.eq.5) then !---------------------------------- sphere write (*,*) 'Type radius of shpere in Angstrome ' read (5,*) rpx(1,1) write (*,*) 'Particles 1: inside 2: outside ?' read (5,*) ians if (ians.eq.1) inout= 1 if (ians.eq.2) inout=-1 end if c write (6,*) 'Atoms: ',adx if (imol.le.1) CALL CHAOS (IONI, IER, istr, ipx, inout, rpx) if (imol.eq.2) call chaos2 (ioni, ier, istr, ipx, inout, rpx) if (imol.eq.3) call chaos3 (ioni, ier, istr, ipx, inout, rpx) IF (IER.NE.0) then write (6,*) 'The volume is too small. Change cell lengths' GO TO 77 end if C DO 100 I = 1, NTION CALL RANDOM DO 100 J = 1, 3 P(J,I) = Q(J,I) / BOX(J) 100 CONTINUE C RETURN END C C C ======== C================================================================= CHAOS SUBROUTINE CHAOS (IONI, IER, istr, ipx, inout, rpx) c c mono-atomic systems c PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q C COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR C INTEGER *4 IONI(LEL) real *4 rpx(2,3) REAL *8 PX, PY, PZ C c write (6,*) istr,ipx,inout IER = 1 NTION = 0 DO 10 I = 1, LEL NTION = NTION + NION(I) 10 CONTINUE ALMIN = AMIN1(BOX(1),BOX(2),BOX(3)) RCUT = ALMIN / 2.0 DO 90 IO = 1, LEL DO 80 I = IONS(1,IO), IONS(2,IO) NTRIAL = 0 20 NTRIAL = NTRIAL + 1 IF (NTRIAL.GT.999) RETURN CALL RANDOM PX = RD(1) * BOX(1) PY = RD(2) * BOX(2) PZ = RD(3) * BOX(3) if (istr.eq.3.and.inout.lt.0) then if (ipx.eq.1) then if (rd(2).gt.rpx(1,2).and.rd(2).lt.rpx(2,2) .and. * rd(3).gt.rpx(1,3).and.rd(3).lt.rpx(2,3)) go to 20 go to 25 end if if (ipx.eq.2) then if (rd(1).gt.rpx(1,1).and.rd(1).lt.rpx(2,1) .and. * rd(3).gt.rpx(1,3).and.rd(3).lt.rpx(2,3)) go to 20 go to 25 end if if (ipx.eq.3) then if (rd(1).gt.rpx(1,1).and.rd(1).lt.rpx(2,1) .and. * rd(2).gt.rpx(1,2).and.rd(2).lt.rpx(2,2)) go to 20 go to 25 end if end if if (istr.eq.5) then r2=(px-box(1)/2)**2+(py-box(2)/2)**2+(pz-box(3)/2)**2 if (r2.le.rpx(1,1)**2) go to 25 go to 20 end if if (RD(1).lt.rpx(1,1).or.rd(1).gt.rpx(2,1)) go to 20 if (RD(2).lt.rpx(1,2).or.rd(2).gt.rpx(2,2)) go to 20 if (RD(3).lt.rpx(1,3).or.rd(3).gt.rpx(2,3)) go to 20 c 25 IF (I.LE.1) GO TO 70 RAS = RAD(IONI(IO)) ZAS = CHG(IONI(IO)) DO 40 JO = 1, IO RLIM = (RAS + RAD(IONI(JO))) * 0.7 IF (ZAS*CHG(IONI(JO)).GT.0.0) RLIM = 1.9 RLIM2 = RLIM * RLIM DO 30 J = IONS(1,JO), IONS(2,JO) IF (J.GE.I) GO TO 70 DX = ABS(PX - Q(1,J)) IF (DX.GT.RCUT) DX = BOX(1) - DX DY = ABS(PY - Q(2,J)) IF (DY.GT.RCUT) DY = BOX(2) - DY DZ = ABS(PZ - Q(3,J)) IF (DZ.GT.RCUT) DZ = BOX(3) - DZ IF (DX*DX+DY*DY+DZ*DZ.LT.RLIM2) GO TO 20 30 CONTINUE 40 CONTINUE C 70 Q(1,I) = PX Q(2,I) = PY Q(3,I) = PZ C WRITE (4,*) I,PX,PY,PZ IF (MOD(I, 100).EQ.0) WRITE (6,1001) I if (mod(i,1000).eq.0) write (6,1003) 80 CONTINUE 90 CONTINUE C WRITE (6,1002) IER = 0 RETURN 1001 FORMAT (1X,I5,$) 1002 FORMAT (/) 1003 format (1x) END C C C ========= C================================================================ CHAOS2 SUBROUTINE CHAOS2 (IONI, IER, istr, ipx, inout, rpx) c C Diatomic molecules : H2, N2, O2, ... c PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q C COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR C INTEGER *4 IONI(LEL) real *4 rpx(2,3) REAL *8 PX, PY, PZ C write (6,2001) 2001 format (1x,'Input intramolecular atomic distance ', * '(O:1.191, N:1.095)') read (5,2002) Dintra 2002 format (f10.5) c IER = 1 NTION = 0 DO 10 I = 1, LEL NTION = NTION + NION(I) 10 CONTINUE ALMIN = AMIN1(BOX(1),BOX(2),BOX(3)) RCUT = ALMIN / 2.0 DO 90 IO = 1, LEL if (mod(nion(io),2).eq.1) then write (*,*) 'Odd number!',io,nion(io) stop end if DO 80 I = IONS(1,IO), IONS(2,IO), 2 NTRIAL = 0 20 NTRIAL = NTRIAL + 1 IF (NTRIAL.GT.999) RETURN CALL RANDOM if (RD(1).lt.rpx(1,1).or.rd(1).gt.rpx(2,1)) go to 20 if (RD(2).lt.rpx(1,2).or.rd(2).gt.rpx(2,2)) go to 20 if (RD(3).lt.rpx(1,3).or.rd(3).gt.rpx(2,3)) go to 20 PX1 = RD(1) * BOX(1) ! First atom PY1 = RD(2) * BOX(2) PZ1 = RD(3) * BOX(3) CALL RANDOM ! second atom srd = sqrt((rd(1)*box(1))**2 + (rd(2)*box(2))**2 + * (rd(3)*box(3))**2) PX2 = px1 + RD(1) * box(1) * dintra / srd PY2 = py1 + RD(2) * box(2) * dintra / srd PZ2 = pz1 + RD(3) * box(3) * dintra / srd c IF (I.LE.1) GO TO 70 RAS = RAD(IONI(IO)) ZAS = CHG(IONI(IO)) DO 40 JO = 1, IO RLIM = (RAS + RAD(IONI(JO))) * 0.7 IF (ZAS*CHG(IONI(JO)).GT.0.0) RLIM = 1.9 RLIM2 = RLIM * RLIM DO 30 J = IONS(1,JO), IONS(2,JO) IF (J.GE.I) GO TO 25 DX = ABS(PX1 - Q(1,J)) IF (DX.GT.RCUT) DX = BOX(1) - DX DY = ABS(PY1 - Q(2,J)) IF (DY.GT.RCUT) DY = BOX(2) - DY DZ = ABS(PZ1 - Q(3,J)) IF (DZ.GT.RCUT) DZ = BOX(3) - DZ IF (DX*DX+DY*DY+DZ*DZ.LT.RLIM2) GO TO 20 30 CONTINUE 40 CONTINUE c 25 RAS = RAD(IONI(IO)) ZAS = CHG(IONI(IO)) DO 45 JO = 1, IO RLIM = (RAS + RAD(IONI(JO))) * 0.7 IF (ZAS*CHG(IONI(JO)).GT.0.0) RLIM = 1.9 RLIM2 = RLIM * RLIM DO 35 J = IONS(1,JO), IONS(2,JO) IF (J.GE.I) GO TO 70 DX = ABS(PX2 - Q(1,J)) IF (DX.GT.RCUT) DX = BOX(1) - DX DY = ABS(PY2 - Q(2,J)) IF (DY.GT.RCUT) DY = BOX(2) - DY DZ = ABS(PZ2 - Q(3,J)) IF (DZ.GT.RCUT) DZ = BOX(3) - DZ IF (DX*DX+DY*DY+DZ*DZ.LT.RLIM2) GO TO 20 35 CONTINUE 45 CONTINUE C 70 Q(1,I) = PX1 Q(2,I) = PY1 Q(3,I) = PZ1 Q(1,I+1) = PX2 Q(2,I+1) = PY2 Q(3,I+1) = PZ2 C WRITE (4,*) I,PX,PY,PZ IF (MOD(I, 100).EQ.0) WRITE (6,1001) I if (mod(i,1000).eq.0) write (6,1003) 80 CONTINUE 90 CONTINUE C WRITE (6,1002) IER = 0 RETURN 1001 FORMAT (1X,I5,$) 1002 FORMAT (/) 1003 format (1x) END C C C ========= C================================================================ CHAOS3 SUBROUTINE CHAOS3 (IONI, IER, istr, ipx, inout, rpx) c C triatomic molecules : H2O or CO2 c PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q C COMMON /ATOMSC/ ION(3,LAM) COMMON /ATOMSD/ WGT(LAM), CHG(LAM), AOI(LAM), BOI(LAM), COI(LAM), * RAD(LAM) CHARACTER *4 ION C COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME C COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR C INTEGER *4 IONI(LEL) REAL *8 PX, PY, PZ real *4 rpx(2,3) C c write (6,2001) c2001 format (1x,'Input intramolecular atomic distance ', c * '(O-H:0.95, C-O:1.13 A)'/) c read (5,2002) Dintra c2002 format (f10.5) c write (6,*) adx if (ADX(1).EQ.'O ') then io1 = 1 io2 = 2 rlim2 = 2.9**2 dintra = 0.95 end if if (ADX(2).eq.'C ') then io1 = 2 io2 = 1 rlim2 = 3.7**2 dintra = 1.13 end if write (6,*) 'rlim2=',rlim2,' dintra=',dintra c IER = 1 NTION = 0 DO 10 I = 1, LEL NTION = NTION + NION(I) 10 CONTINUE ALMIN = AMIN1(BOX(1),BOX(2),BOX(3)) RCUT = ALMIN / 2.0 C IO = io1 ! O of H2O or C of CO2 nio2 = ions(1,io2)-1 DO 80 I = IONS(1,IO), IONS(2,IO) NTRIAL = 0 20 NTRIAL = NTRIAL + 1 IF (NTRIAL.GT.2999) RETURN CALL RANDOM PX1 = RD(1) * BOX(1) ! First atom PY1 = RD(2) * BOX(2) PZ1 = RD(3) * BOX(3) if (istr.eq.5) then !-------------------------------- sphere r2=(px1-box(1)/2)**2+(py1-box(2)/2)**2+(pz1-box(3)/2)**2 if (r2.le.rpx(1,1)**2.and.inout.eq. 1) go to 25 if (r2.ge.rpx(1,1)**2.and.inout.eq.-1) go to 25 c write (6,*) I,ntrial,r2,rpx(1,1),inout go to 20 end if c if (inout.ge.0) then !---------------------------- sheet or cube if (RD(1).lt.rpx(1,1).or.rd(1).gt.rpx(2,1)) go to 20 if (RD(2).lt.rpx(1,2).or.rd(2).gt.rpx(2,2)) go to 20 if (RD(3).lt.rpx(1,3).or.rd(3).gt.rpx(2,3)) go to 20 else if (inout.eq.-1) then if (RD(1).gt.rpx(1,1).or.rd(1).gt.rpx(2,1)) go to 20 if (RD(2).gt.rpx(1,2).or.rd(2).gt.rpx(2,2)) go to 20 if (RD(3).gt.rpx(1,3).or.rd(3).gt.rpx(2,3)) go to 20 end if c c if (rd(2).lt.0.07 .or. rd(2).gt.0.93) go to 20 C 25 IF (I.LE.1) GO TO 40 DO 30 J = IONS(1,IO), IONS(1,IO)+I-1 DX = ABS(PX1 - Q(1,J)) IF (DX.GT.RCUT) DX = BOX(1) - DX DY = ABS(PY1 - Q(2,J)) IF (DY.GT.RCUT) DY = BOX(2) - DY DZ = ABS(PZ1 - Q(3,J)) IF (DZ.GT.RCUT) DZ = BOX(3) - DZ IF (DX*DX+DY*DY+DZ*DZ.LT.RLIM2) GO TO 20 30 CONTINUE C 40 CALL RANDOM ! second atom srd = sqrt(((2*rd(1)-1.0)*box(1))**2 + * ((2*rd(2)-1.0)*box(2))**2 + * ((2*rd(3)-1.0)*box(3))**2) PX2 = px1 + (2*RD(1)-1.0) * box(1) * dintra / srd PY2 = py1 + (2*RD(2)-1.0) * box(2) * dintra / srd PZ2 = pz1 + (2*RD(3)-1.0) * box(3) * dintra / srd 50 call random srd = sqrt(((2*rd(1)-1.0)*box(1))**2 + * ((2*rd(2)-1.0)*box(2))**2 + * ((2*rd(3)-1.0)*box(3))**2) PX3 = px1 + (2*RD(1)-1.0) * box(1) * dintra / srd !3rd atom PY3 = py1 + (2*RD(2)-1.0) * box(2) * dintra / srd PZ3 = pz1 + (2*RD(3)-1.0) * box(3) * dintra / srd vv = ( (px2-px1)*(px3-px1) + * (py2-py1)*(py3-py1) + * (pz2-pz1)*(pz3-pz1) ) / dintra**2 c write (6,*) vv if (io1.eq.1) then if (vv.ge.0.0 .or. vv.le.-0.5) go to 50 end if if (io1.eq.2 .and. vv.gt.-0.5) go to 50 c Q(1,I) = PX1 Q(2,I) = PY1 Q(3,I) = PZ1 nio2 = nio2 +1 Q(1,nio2) = PX2 Q(2,nio2) = PY2 Q(3,nio2) = PZ2 nio2 = nio2 + 1 Q(1,nio2) = PX3 Q(2,nio2) = PY3 Q(3,nio2) = PZ3 c WRITE (6,*) I,PX1,PY1,PZ1 IF (MOD(I, 100).EQ.0) WRITE (6,1001) I if (mod(i,1000).eq.0) write (6,1003) 80 CONTINUE C WRITE (6,1002) IER = 0 RETURN 1001 FORMAT (1X,I5,$) 1002 FORMAT (/) 1003 format (1X) END C C C ========= C================================================================ SPACEG SUBROUTINE SPACEG (MA) C Read reduced symmetry operations C Prepare full set of symmetry operations PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /SYMMT/ NS,NL, RS(3,3,LSY),TS(3,LSY), TL(3,4) DIMENSION TAL(3,5),ISQ(4),Q(6,7),MS(7),SG(7),PG(7),TR(2,3) CHARACTER *1 LTP CHARACTER *4 HMS, PG, SG DATA TAL/ .0,.0,.0, .0,.5,.5, .5,.0,.5, .5,.5,.0, .5,.5,.5 / DATA ISQ/ 1, 99, 3, 4/ DATA SG / '1', '2', '21', 'M', 'C', 'N', ' ' / DATA PG / '-1', '2/M', '21/C', '21/M', '21/C', '21/N', '2/C'/ DATA MS / 1, 2, 2, 2, 2, 2, 2 / DATA Q / 1., 1., 1., 0.0,0. ,0. , -1., 1.,-1., 0.0,0. ,0.0, * -1., 1.,-1., 0.0, .5,0. , 1.,-1., 1., 0.0,0. ,0.0, * 1.,-1., 1., 0.0, .5,0.5, 1.,-1., 1., 0.5, .5, .5, * -1., 1.,-1., 0.0,0.0,0.5/ DO 20 N = 1, LSY DO 20 I = 1, 3 TS(I,N) = 0.0 DO 10 J = 1, 3 10 RS(I,J,N) = 0.0 20 RS(I,I,N) = 1.0 READ (8,1010) LTP, HMS, NS, IC, MA1,MA2 MA = MA1 + MA2 C WRITE (6,2010) LTP, HMS C NL = 2 IF (LTP.EQ.'P') ISQ(2) = 0 IF (LTP.EQ.'A') ISQ(2) = 2 IF (LTP.EQ.'B') ISQ(2) = 3 IF (LTP.EQ.'C') ISQ(2) = 4 IF (LTP.EQ.'I') ISQ(2) = 5 IF (LTP.EQ.'R') THEN NL = 3 ISQ(2) = 2 TAL(1,2) = 1.0 / 3.0 TAL(2,2) = 2.0 / 3.0 TAL(3,2) = 2.0 / 3.0 TAL(1,3) = 2.0 / 3.0 TAL(2,3) = 1.0 / 3.0 TAL(3,3) = 1.0 / 3.0 END IF IF (ISQ(2).EQ.0) NL = 1 IF (ISQ(2).GE.0.AND.ISQ(2).LE.5) GO TO 100 IF (LTP.NE.'F ') STOP 111 ISQ(2) = 2 NL = 4 100 DO 110 J = 1, NL DO 110 I = 1, 3 ISQJ = ISQ(J) TL(I,J) = TAL(I,ISQJ) 110 CONTINUE DO 200 IG = 1, 7 JC = 0 IF (NS.EQ.0.AND.HMS.EQ.SG(IG)) GO TO 220 JC = 1 IF (NS.EQ.0.AND.HMS.EQ.PG(IG)) GO TO 220 200 CONTINUE NS = NS + 1 DO 30 I = 2, NS READ (8,3030) TR, ((RS(K,J,I),K=1,3),J=1,3) DO 30 J = 1,3 TS(J,I) = 0.0 IF (TR(2,J).GT.0.0) TS(J,I) = TR(1,J) / TR(2,J) 30 CONTINUE IF (IC.EQ.0) JC = 0 GO TO 400 C 220 NS = MS(IG) DO 300 I = 1, 3 RS(I,I,2) = Q(I,IG) TS(I,2) = Q(I+3,IG) 300 CONTINUE C 400 IF (JC.GE.1) THEN DO 320 N = 1, NS NSN = NS + N DO 320 J = 1, 3 TS(J,NSN) = -TS(J,N) DO 320 K = 1, 3 RS(K,J,NSN) = -RS(K,J,N) 320 CONTINUE NS = NS * 2 END IF WRITE (6,2020) LTP,HMS, NS, NL C WRITE (6,2030) (((RS(K,J,I),K=1,3),J=1,3),(TS(J,I),J=1,3),I=1,NS) C WRITE (6,2033) ((TL(J,I),J=1,3),I=1,NL) RETURN 1010 FORMAT (A1, A4, 5X, 4I5) C2010 FORMAT (/6X, A1, A4 /) 2020 FORMAT (5X,'Space group :',A1,A4 / * 5x,'No. of symmetry operations is',I3 / * 5x,'No. of lattice points is',I3) 2030 FORMAT (11X, 3F4.1,1X,3F4.1,1X,3F4.1, 2X, 3F6.3) 2033 FORMAT (11X, 3F4.1,1X,3F4.1,1X,3F4.1, 1X, 3F4.1) 3030 FORMAT (6F1.0,9F2.0) END C C C ========= C================================================================ INATOM SUBROUTINE INATOM (HEX) C Read atom data in an asymmetric unit C Expand atoms over a crystal unit cell PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME COMMON /SYMMT/ NS,NL, RS(3,3,LSY),TS(3,LSY), TL(3,4) COMMON /TRAJEC/ NPT,NPTP,P0C(3,LAT),JON(LAT),XYZ(3,LNA), * XYZH(3,LNA) COMMON /ATOMS/ MA,NA, P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P CHARACTER *4 HEX CHARACTER *1 ANS REAL *8 X(3) C ---------------------------- Read atom data in an asymmetric unit DO 110 M = 1, MA READ ( 8,1020) ATOM(M),ID(M),VA,(P(I,M),I=1,3) WRITE(16,2020) ATOM(M),ID(M),VA,(P(I,M),I=1,3) IDD(M) = M ISYM(M) = 1 DO 100 I = 1, 3 IF (P(I,M).LT.0.0) P(I,M) = P(I,M) + 1.0 IF (P(I,M).GE.1.0) P(I,M) = P(I,M) - 1.0 XYZ(I,M) = P(I,M) XYZH(I,M) = P(I,M) 100 CONTINUE write (6,2020) atom(m),id(m),va,(xyz(i,m),i=1,3) 110 CONTINUE NA = MA WRITE (6,2010) NA C ------------------------------ Expand atoms over crystal unit cell DO 700 N = 1, MA DO 700 M = 1, NS DO 700 L = 1, NL DO 200 J = 1,3 X(J) = P(1,N)*RS(1,J,M) + P(2,N)*RS(2,J,M) + * P(3,N)*RS(3,J,M) + TS(J,M) + TL(J,L) IF (X(J).LT.0.0) X(J) = X(J) - AINT(X(J)-1.0) IF (X(J).GE.1.0) X(J) = X(J) - AINT(X(J)) 200 CONTINUE DO 300 J = 1, NA IF (ID(N).EQ.ID(J)) THEN D = ABS(X(1)-P(1,J)) + ABS(X(2)-P(2,J)) + * ABS(X(3)-P(3,J)) IF (D.LT.0.001) GO TO 700 END IF 300 CONTINUE NA = NA + 1 ID(NA) = ID(N) IDD(NA) = IDD(N) ISYM(NA) = M + NS * (L - 1) DO 400 J = 1, 3 P(J,NA) = X(J) 400 CONTINUE 700 CONTINUE WRITE (6,2030) NA C C ------------------------------------ Hxagonal or Rhombohedral case HEX = ' ' IF (ABS(BOX(4))+ABS(BOX(5))+ABS(BOX(6)+0.5).GE.1.E-4) RETURN WRITE (6,*) ' The crystal system is hexagonal or trigonal.' WRITE (6,*) ' Transform to orthogonal system ?' READ (5,*) ANS IF (ANS.EQ.'n' .OR. ANS.EQ.'N') RETURN C HEX = 'HEX ' IF (NL.EQ.3) HEX = 'HEXR' BOX(6) = 0.0 BOX(2) = BOX(2) * SIN(2.0943951) * 2.0 N = NA DO 5 I = 1, NA P(1,I) = P(1,I) - P(2,I) * 0.5 P(2,I) = P(2,I) * 0.5 XYZH(1,I) = P(1,I) XYZH(2,I) = P(2,I) IF (P(1,I).LT.0.0) P(1,I) = P(1,I) + 1.0 N = N + 1 P(1,N) = P(1,I) - 0.5 IF (P(1,N).LT.0.0) P(1,N) = P(1,N) + 1.0 P(2,N) = P(2,I) + 0.5 P(3,N) = P(3,I) ID(N) = ID(I) IDD(N) = IDD(I) ISYM(N) = ISYM(I) + NS * NL 5 CONTINUE NA = N WRITE (6,3003) (I,ID(I),(P(J,I),J=1,3),I=1,N) WRITE (6,3333) (BOX(I),I=1,6) RETURN 1020 FORMAT (A4,1X, I5, F10.5,3F10.5, 3I5) 2010 FORMAT (5X,'The number of atoms in an asymmetric unit is ',I3) 2020 FORMAT (11X,A4, 3X, I5, F10.2,3F10.4, 3X, 3I7) 2030 FORMAT (5X,'The number of atoms in a cell is ',I3) 3003 FORMAT (3X,I3,I2,1X,3F6.3, I5,I2,1X,3F6.3, I5,I2,1X,3F6.3) 3333 FORMAT (1X, 'A=',F9.5,' B=',F9.5,' C=',F9.5,' ALPHA=',F6.2, * ' BETA=',F6.2,' GAMMA=',F6.2) END C C C ========= C================================================================ GENPOS SUBROUTINE GENPOS PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME COMMON /RANDM3/ RD(3), IR,JR,KR, LR,MR,NR INTEGER *4 IR,JR,KR, LR,MR,NR COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q COMMON /TRAJEC/ NPT,NPTP,P0C(3,LAT),JON(LAT),XYZ(3,LNA), * XYZH(3,LNA) COMMON /MUDANA/ IXD(LNI), JXD(LNI) REAL *4 CL(3) INTEGER *4 IH,IM,IS,IMM, IDV(LNI), NCL(3) CHARACTER *4 ATOMI REAL *8 QQ C DO 10 I = 1, LNA NID(I) = 0 ATM(I) = ' ' 10 CONTINUE C NNX = 2 NNY = 2 NNZ = 2 IF (NX.LE.1) NNX = 1 IF (NY.LE.1) NNY = 1 IF (NZ.LE.1) NNZ = 1 C NNS = 0 NTION = 0 JO = 0 DO 50 IO = 1, LEL NION(IO) = 0 IONS(1,IO) = JO + 1 IF (ADX(IO).EQ.' ') GO TO 45 DO 40 I = 1, NA IDI = ID(I) IF (ADX(IO).EQ.AOX(IDI)) THEN NS = 0 DO 20 IX = 0, NX-1 DO 20 IY = 0, NY-1 DO 20 IZ = 0, NZ-1 NS = NS + 1 NTION = NTION + 1 NION(IO) = NION(IO) + 1 IDV(NTION) = IDD(I) NSYM(NTION) = ISYM(I) + (NS-1) * 200 Q(1,NTION) = (P(1,I) + IX) * BOX(1) Q(2,NTION) = (P(2,I) + IY) * BOX(2) Q(3,NTION) = (P(3,I) + IZ) * BOX(3) IF (IX+1.EQ.NNX .AND. IY+1.EQ.NNY .AND. * IZ+1.EQ.NNZ ) NNS = NS 20 CONTINUE END IF 40 CONTINUE 45 IONS(2,IO) = IONS(1,IO) + NION(IO) - 1 JO = IONS(2,IO) 50 CONTINUE WRITE (6,*) 'The total number of atoms in a basic cell is',NTION C NU = 0 DO 530 IO = 1, LEL IF (NION(IO).LE.0) GO TO 530 N1 = IONS(1,IO) N2 = IONS(2,IO) NMAX = IDV(N1) NMIN = IDV(N1) N11 = N2 - 1 DO 520 I = N1, N11 N22 = I + 1 DO 515 J = N22, N2 IF (NMAX.LT.IDV(I)) NMAX = IDV(I) IF (NMIN.GT.IDV(I)) NMIN = IDV(I) IF (NMAX.LT.IDV(J)) NMAX = IDV(J) IF (NMIN.GT.IDV(J)) NMIN = IDV(J) IF (IDV(I).GT.IDV(J)) THEN IDI = IDV(I) IDV(I) = IDV(J) IDV(J) = IDI NSM = NSYM(I) NSYM(I) = NSYM(J) NSYM(J) = NSM DO 510 K = 1,3 QQ = Q(K,I) Q(K,I) = Q(K,J) Q(K,J) = QQ 510 CONTINUE END IF 515 CONTINUE 520 CONTINUE DO 540 I = N1, N2 IDVI = IDV(I) IDVJ = IDVI - (NMIN - NU) + 1 IDV(I) = IDVJ ATM(IDVJ) = ATOM(IDVI) IXD(I) = IDVJ JXD(I) = IDVI 540 CONTINUE NU = NU + (NMAX - NMIN) + 1 530 CONTINUE C CL(1) = BOX(1) CL(2) = BOX(2) CL(3) = BOX(3) NCL(1) = NX NCL(2) = NY NCL(3) = NZ BOX(1) = BOX(1) * NX BOX(2) = BOX(2) * NY BOX(3) = BOX(3) * NZ DO 70 I = 1, NTION Q(1,I) = Q(1,I) / BOX(1) Q(2,I) = Q(2,I) / BOX(2) Q(3,I) = Q(3,I) / BOX(3) 70 CONTINUE C 80 NPT = 0 DO 65 I = 1, NTION II = IDV(I) NID(II) = NID(II) + 1 CALL RANDOM DO 60 J = 1, 3 P(J,I) = Q(J,I) 60 CONTINUE IF (NSYM(I).GE.200) GO TO 65 NPT = NPT + 1 JON(NPT) = I DO 63 J = 1, 3 P0C(J,NPT) = P(J,I) * NCL(J) 63 CONTINUE 65 CONTINUE C WRITE (6,*) NPT,NID(1),NID(2),NID(3),NID(4) NPTP = NPT C IF (NX+NY+NZ.LE.3) RETURN IF (NPT.GT.64) GO TO 800 NNX = 2 NNY = 2 NNZ = 2 IF (NCL(1).LE.1) NNX = 1 IF (NCL(2).LE.1) NNY = 1 IF (NCL(3).LE.1) NNZ = 1 DO 95 I = 1, NTION MMS = NSYM(I) / 200 IF (MMS.LE.0) GO TO 95 IF (MMS.NE.(NNS-1)) GO TO 95 NPT = NPT + 1 JON(NPT) = I P0C(1,NPT) = P(1,I) * NCL(1) P0C(2,NPT) = P(2,I) * NCL(2) P0C(3,NPT) = P(3,I) * NCL(3) 95 CONTINUE C 800 NPTP = NPT DO 880 I = 1, NTION DO 810 J = 1, 3 IF (P(J,I)*NCL(J).GT.1.01) GO TO 880 810 CONTINUE DO 820 J = 1, 3 IF (P(J,I)*NCL(J).GT.0.99999) GO TO 830 820 CONTINUE GO TO 880 830 NPTP = NPTP + 1 JON(NPTP) = I DO 870 J = 1, 3 P0C(J,NPTP) = P(J,I) * NCL(J) 870 CONTINUE 880 CONTINUE C RETURN END C C C ========= C================================================================ STRCHK SUBROUTINE STRCHK PARAMETER (LNI=62783, LEL=10, LNA=682, LAT=LNA*8, LSY=192, * LAM=42 ) COMMON /ATOMS/ MA,NA,P(3,LNI),ID(LAT),IDD(LAT),ISYM(LAT), * NION(LEL) REAL *8 P COMMON /MDDATA/ NTION,BOX(6),NX,NY,NZ,IONS(2,LEL),Q(3,LNI), * NID(LNA),NSYM(LNI) REAL *8 Q COMMON /TRAJEC/ NPT,NPTP,P0C(3,LAT),JON(LAT),XYZ(3,LNA), * XYZH(3,LNA) COMMON /MUDANA/ IXD(LNI), JXD(LNI) COMMON /ANAME/ ATOM(LNA),ATM(LAT),TITLE(15),ADX(LEL),AOX(LEL), * FLNAME(19) CHARACTER *4 ATOM, ATM, TITLE, ADX, AOX CHARACTER *24 FLNAME REAL *4 PXYZ(3),DB(100) CHARACTER *4 AB(100),ABAB C ABCXY = BOX(1)*BOX(2)*box(6) ABCYZ = BOX(2)*BOX(3)*box(4) ABCZX = BOX(3)*BOX(1)*box(5) C DO 700 M = 1, MA PXYZ(1) = XYZH(1,M) / NX PXYZ(2) = XYZH(2,M) / NY PXYZ(3) = XYZH(3,M) / NZ NB = 0 DO 200 I = 1, 100 AB(I) = ' ' DB(I) = 0.0 200 CONTINUE DO 300 N = 1, NTION DX = PXYZ(1) - P(1,N) DY = PXYZ(2) - P(2,N) DZ = PXYZ(3) - P(3,N) IF (DX.GT. 0.5) DX = DX - 1.0 IF (DX.LT.-0.5) DX = DX + 1.0 IF (DY.GT. 0.5) DY = DY - 1.0 IF (DY.LT.-0.5) DY = DY + 1.0 IF (DZ.GT. 0.5) DZ = DZ - 1.0 IF (DZ.LT.-0.5) DZ = DZ + 1.0 DD = (DX*BOX(1))**2 + (DY*BOX(2))**2 + (DZ*BOX(3))**2 + * 2.0*DX*DY*ABCXY + 2.0*DY*DZ*ABCYZ + 2.0*DZ*DX*ABCZX IF (DD.GT.0.1.AND.DD.LE.16.00) THEN IF (NB.GE.99) GO TO 300 NB = NB + 1 DB(NB) = SQRT(DD) AB(NB) = ATOM(JXD(N)) END IF 300 CONTINUE DO 450 I1 = 1, NB-1 DO 400 I2 = I1+1, NB IF (DB(I1).GT.DB(I2)) THEN DDDDDD = DB(I1) DB(I1) = DB(I2) DB(I2) = DDDDDD ABAB = AB(I1) AB(I1) = AB(I2) AB(I2) = ABAB END IF 400 CONTINUE 450 CONTINUE WRITE (16,2223) M, ATOM(M), (DB(II),AB(II),II=1,NB) WRITE ( 6,2222) M, ATOM(M), (DB(II),AB(II),II=1,6) 700 CONTINUE WRITE (6,*) 'Structure check completed !' RETURN 2222 FORMAT (1X,I4, 1x,A4,2X,11(1X,F4.2,'(',A4,')') / * 12X, 11(1X,F4.2,'(',A4,')') / * 12X, 11(1X,F4.2,'(',A4,')') / * 12X, 11(1X,F4.2,'(',A4,')') ) 2223 FORMAT (1X,I4, 1x,A4,2X,11(1X,F5.3,'(',A4,')') / * 12X, 11(1X,F5.3,'(',A4,')') / * 12X, 11(1X,F5.3,'(',A4,')') / * 12X, 11(1X,F5.3,'(',A4,')') ) END