1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2! Copyright 2010.  Los Alamos National Security, LLC. This material was    !
3! produced under U.S. Government contract DE-AC52-06NA25396 for Los Alamos !
4! National Laboratory (LANL), which is operated by Los Alamos National     !
5! Security, LLC for the U.S. Department of Energy. The U.S. Government has !
6! rights to use, reproduce, and distribute this software.  NEITHER THE     !
7! GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY,     !
8! EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS         !
9! SOFTWARE.  If software is modified to produce derivative works, such     !
10! modified software should be clearly marked, so as not to confuse it      !
11! with the version available from LANL.                                    !
12!                                                                          !
13! Additionally, this program is free software; you can redistribute it     !
14! and/or modify it under the terms of the GNU General Public License as    !
15! published by the Free Software Foundation; version 2.0 of the License.   !
16! Accordingly, this program is distributed in the hope that it will be     !
17! useful, but WITHOUT ANY WARRANTY; without even the implied warranty of   !
18! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General !
19! Public License for more details.                                         !
20!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21
22SUBROUTINE READRESTART
23
24  USE CONSTANTS_MOD
25  USE SETUPARRAY
26  USE MDARRAY
27  USE RESTARTARRAY
28  USE KSPACEARRAY
29#ifdef MPI_ON
30  USE MPI
31#endif
32  USE MYPRECISION
33
34  IMPLICIT NONE
35
36  INTEGER :: I, J, MYINDEX
37  INTEGER :: MYID, IERR
38  REAL(LATTEPREC) :: LN(6), JUNK, TMP1, TMP2
39  CHARACTER(LEN=20) :: HEADER
40  CHARACTER(LEN=50) :: FLNM
41  IF (EXISTERROR) RETURN
42
43
44  IF (MDON .EQ. 1 .AND. PARREP .EQ. 1) THEN
45
46#ifdef MPI_ON
47     CALL MPI_COMM_RANK( MPI_COMM_WORLD, MYID, IERR )
48#endif
49
50
51     IF (MYID .LT. 10) THEN
52        WRITE(FLNM,'(I1,"/bl/restart.dat")') MYID
53     ELSEIF (MYID .GE. 10 .AND. MYID .LT. 100) THEN
54        WRITE(FLNM,'(I2,"/bl/restart.dat")') MYID
55     ELSEIF (MYID .GE. 100 .AND. MYID .LT. 1000) THEN
56        WRITE(FLNM,'(I3,"/bl/restart.dat")') MYID
57     ENDIF
58
59     PRINT*, MYID, FLNM
60
61     OPEN(UNIT=12, STATUS="OLD", FILE=FLNM)
62
63  ELSE
64
65     ! Regular restart
66
67     OPEN(UNIT=12, STATUS="OLD", FILE="bl/restart.dat")
68
69  ENDIF
70
71  IF (MDON .EQ. 1)  READ(12,*) HEADER, CONTITER
72  READ(12,*) NATS
73
74  ALLOCATE(CR(3,NATS), ATELE(NATS), F(3,NATS), FPP(3,NATS), FTOT(3,NATS))
75  ALLOCATE(DELTAQ(NATS), MYCHARGE(NATS))
76  ALLOCATE(ELEMPOINTER(NATS))
77
78  IF (ELECTRO .EQ. 0) THEN
79     ALLOCATE(LCNSHIFT(NATS))
80     LCNSHIFT = ZERO
81  ENDIF
82
83  IF (PLUSDON .EQ. 1) ALLOCATE(FPLUSD(3,NATS))
84
85  IF (BASISTYPE .EQ. "NONORTHO") THEN
86
87     IF (ELECTRO .EQ. 0) ALLOCATE(FSLCN(3,NATS))
88
89     IF (SPINON .EQ. 0) THEN
90        ALLOCATE(FPUL(3,NATS), FSCOUL(3,NATS))
91     ELSE
92        ALLOCATE(FPUL(3,NATS), FSCOUL(3,NATS), FSSPIN(3,NATS))
93     ENDIF
94  ENDIF
95
96  IF (KON .EQ. 1) ALLOCATE(KF(3,NATS))
97
98  IF (MDON .EQ. 1) ALLOCATE(V(3,NATS))
99
100  READ(12,*) BOX(1,1), BOX(1,2), BOX(1,3)
101  READ(12,*) BOX(2,1), BOX(2,2), BOX(2,3)
102  READ(12,*) BOX(3,1), BOX(3,2), BOX(3,3)
103
104
105  !  READ(12,*) (ATELE(I), CR(1,I), CR(2,I), CR(3,I), I = 1, NATS)
106
107  DO I = 1, NATS
108     READ(12,*) ATELE(I), CR(1,I), CR(2,I), CR(3,I)
109  ENDDO
110
111
112  ! Set up pointer to the data in TBparam/electrons.dat
113
114  DO I = 1, NATS
115     DO J = 1, NOELEM
116        IF (ATELE(I) .EQ. ELE(J)) ELEMPOINTER(I) = J
117     ENDDO
118  ENDDO
119
120  SUMMASS = ZERO
121  DO I = 1, NATS
122     SUMMASS = SUMMASS + MASS(ELEMPOINTER(I))
123  ENDDO
124
125  ! Let's check whether we have only sp elements. If so, we can
126  ! use a much faster verison of gradH
127
128  ! SPONLY = 0: use GRADHSP
129  ! SPONLY = 1: use Josh Coe's implementation of the automatic H build
130
131  SPONLY = 0
132  DO I = 1, NATS
133     IF (BASIS(ELEMPOINTER(I)) .NE. "s" .AND. &
134          BASIS(ELEMPOINTER(I)) .NE. "sp") SPONLY = 1
135  ENDDO
136
137  IF (SCLTYPE .EQ. "TABLE") SPONLY = 1
138
139  READ(12,*) CHEMPOT
140  !  PRINT*, CHEMPOT
141
142  IF (SPINON .EQ. 0) THEN
143
144     READ(12,*) TMPHDIM
145     ALLOCATE(TMPBODIAG(TMPHDIM))
146
147     DO I = 1, TMPHDIM
148        READ(12,*) TMP1, TMP2
149        TMPBODIAG(I) = TMP1 + TMP2
150     ENDDO
151
152  ELSEIF (SPINON .EQ. 1) THEN
153
154     READ(12,*) TMPHDIM
155     ALLOCATE(TMPRHOUP(TMPHDIM), TMPRHODOWN(TMPHDIM))
156     READ(12,*) (TMPRHOUP(I), TMPRHODOWN(I), I = 1, TMPHDIM)
157
158  ENDIF
159
160  IF (MDON .EQ. 1) THEN
161     DO I = 1, NATS
162        READ(12,*) V(1,I), V(2,I), V(3,I)
163     ENDDO
164  ENDIF
165
166  CLOSE(12)
167
168  !  CR = ALAT * CR
169
170  IF (PBCON .EQ. 0) THEN
171
172     IF (CONTITER .LT. 10) THEN
173        WRITE(FLNM,'("animate/myXYZfile_restart.",I1,".xyz")') CONTITER
174     ELSEIF (CONTITER .GE. 10 .AND. CONTITER .LT. 100) THEN
175        WRITE(FLNM,'("animate/myXYZfile_restart.",I2,".xyz")') CONTITER
176     ELSEIF (CONTITER .GE. 100 .AND. CONTITER .LT. 1000) THEN
177        WRITE(FLNM,'("animate/myXYZfile_restart.",I3,".xyz")') CONTITER
178     ELSEIF (CONTITER .GE. 1000 .AND. CONTITER .LT. 10000) THEN
179        WRITE(FLNM,'("animate/myXYZfile_restart.",I4,".xyz")') CONTITER
180     ELSEIF (CONTITER .GE. 10000 .AND. CONTITER .LT. 100000) THEN
181        WRITE(FLNM,'("animate/myXYZfile_restart.",I5,".xyz")') CONTITER
182     ELSEIF (CONTITER .GE. 100000 .AND. CONTITER .LT. 1000000) THEN
183        WRITE(FLNM,'("animate/myXYZfile_restart.",I6,".xyz")') CONTITER
184     ELSEIF (CONTITER .GE. 1000000 .AND. CONTITER .LT. 10000000) THEN
185        WRITE(FLNM,'("animate/myXYZfile_restart.",I7,".xyz")') CONTITER
186     ENDIF
187
188     OPEN(UNIT=23, STATUS="UNKNOWN", FILE=FLNM)
189
190  ENDIF
191
192
193  RETURN
194
195END SUBROUTINE READRESTART
196