OSDN Git Service

MOPAC 6.06 is included in the binary
[molby/Molby.git] / mopac606_nbo / src / dofs.f
1       SUBROUTINE DOFS(EREF,MONO3,N,DD,M,BOTTOM,TOP)
2       IMPLICIT DOUBLE PRECISION(A-H,O-Z)
3       DIMENSION EREF(MONO3,N), DD(M)
4 ************************************************************************
5 *                                                                      *
6 * DOFS FORMS A NORMALISED, SLIGHTLY SMOOTHED DENSITY OF STATES FOR A   *
7 *      1-D DENSITY OF STATES                                           *
8 *  ON INPUT EREF = REFERENCE ENERGY LEVELS                             *
9 *           P    = POPULATION OF ENERGY LEVELS (=1 FOR ENERGY D.O.S.   *
10 *                  OR ATOMIC ORBITAL POPULATION FOR PARTIAL D.O.S.)    *
11 *           N    = NUMBER OF ENERGY LEVELS SUPPLIED                    *
12 *           M    = SIZE OF D.O.S. VECTOR                               *
13 *           D    = ARRAY TO HOLD D.O.S.                                *
14 *           BOTTOM = BOTTOM OF D.O.S. VECTOR                           *
15 *           TOP    = TOP OF D.O.S. VECTOR                              *
16 *                                                                      *
17 *   ON OUTPUT D = DENSITY OF STATES.  THIS ANALYSES IS INDEPENDENT OF N*
18 *                 ROUGHNESS WILL OCCUR IF N < CA. 30.                  *
19 *                                                                      *
20 ************************************************************************
21 C
22 C  FIRST, EMPTY THE DENSITY-OF-STATES (DOS) BINS
23 C
24       DO 10 I=1,500
25    10 DD(I)=0.D0
26 C
27 C   SPREAD OUT THE ENERGIES OVER THE ENERGY SPECTRUM, TOP TO BOTTOM
28 C
29       RANGE=(M+1)/(TOP-BOTTOM)
30       DO 20 J=1,MONO3
31          DO 20 I=1,N
32             X=EREF(J,I)
33             IF(X.LT.BOTTOM.OR.X.GT.TOP) X=-1.D7
34    20 EREF(J,I)=(X-BOTTOM)*RANGE
35       DO 40 II=1,MONO3
36          DO 40 I=2,N
37             B=EREF(II,I-1)
38             IF(B.LT.1) GOTO 40
39             A=EREF(II,I)
40             IF(A.LT.1) GOTO 40
41             IF(B .GT. A) THEN
42                X=B
43                B=A
44                A=X
45             ENDIF
46             J=B
47             K=A
48 C
49 C IF J EQUALS K THE INTERVAL FALLS WITHIN ONE BIN
50 C
51             IF(J.EQ.K) THEN
52                DD(K)=DD(K)+1.D0
53             ELSE
54                SPREAD=1.D0/(A-B+1.D-12)
55                PARTJ=(J+1-B)*SPREAD
56                PARTK=(A-K)*SPREAD
57                DD(J)=DD(J)+PARTJ
58                DD(K)=DD(K)+PARTK
59 C
60 C IF K EQUALS J+1 THE INTERVAL STRADDLES TWO BINS
61 C
62                IF(K .NE. J+1) THEN
63 C
64 C IF K IS GREATER THAN J+1 THE INTERVAL COVERS MORE THAN TWO BINS
65 C
66                   J=J+1
67                   K=K-1
68                   DO 30 L=J,K
69    30             DD(L)=DD(L)+SPREAD
70                ENDIF
71             ENDIF
72    40 CONTINUE
73       X=M/((N-1)*(TOP-BOTTOM))
74       DO 50  I=1,M
75    50 DD(I)=DD(I)*X
76       WRITE(6,'(A)')' NORMALIZED DENSITY OF STATES'
77 C
78 C  THE FIRST 'BIN' HAS LOWER BOUND AT BOTTOM AND UPPER BOUND
79 C  AT BOTTOM+RANGE, THEREFORE THE FIRST 'BIN' IS FOR BOTTOM+0.5*RANGE
80 C  THE LAST 'BIN' HAS BOUNDS TOP-RANGE AND TOP,
81 C  THEREFOR THE LAST 'BIN' IS FOR TOP-0.5*RANGE
82       RANGE=M/(TOP-BOTTOM)
83       DO 60 I=1,M
84    60 WRITE(6,'(F9.2,F12.6)')BOTTOM+(I-0.5D0)/RANGE,DD(I)
85       RETURN
86       END