1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
! ---
! Copyright (C) 1996-2016 The SIESTA group
! This file is distributed under the terms of the
! GNU General Public License: see COPYING in the top directory
! or http://www.gnu.org/copyleft/gpl.txt .
! See Docs/Contributors.txt for a list of contributors.
! ---
MODULE m_siesta_end
private
public :: siesta_end
CONTAINS
subroutine siesta_end( )
use alloc, only : alloc_report
use siesta_cml, only : cml_p, mainXML, cmlEndModule
use siesta_cmlsubs, only : siesta_cml_exit
use siesta_master, only : siesta_subroutine ! Is siesta a subroutine?
#ifdef DEBUG_XC
USE siestaXC, only : closeDebugOutputFile
#endif /* DEBUG_XC */
use m_timestamp, only : timestamp
use m_wallclock, only : wallclock
use parallel, only : IOnode, SIESTA_worker
#ifdef MPI
use mpi_siesta
#endif
use moreMeshSubs, only : resetMeshDistr
use densematrix, only : resetDenseMatrix
use sparse_matrices, only : resetSparseMatrices
use m_fixed, only : resetFixedPointers
use band, only : reset_bands
use meshphi, only : resetMeshPhi
use meshdscf, only : resetDscfPointers
use m_dscfcomm, only : resetdscfComm
use m_rhog, only : resetRhog
! NP, new mixing
use m_mixing_scf, only : mixers_scf_reset
USE siesta_options, only : isolve, SOLVE_CHESS
#ifdef SIESTA__CHESS
use m_chess, only: CheSS_finalize
#endif
#ifdef SIESTA__FLOOK
use flook_siesta, only : slua_close
use siesta_options, only : LUA
#endif
use m_diag, only: diag_exit
#ifdef TRACING
use extrae_eventllist, only : writeList, deleteList, eventlist
#endif
use m_io, only : io_assign, io_close
implicit none
integer :: iu
#ifdef MPI
integer MPIerror
#endif
!------------------------------------------------------------------------- BEGIN
if (SIESTA_worker) then
#ifdef SIESTA__FLOOK
! Clean up the lua environment
call slua_close(LUA)
#endif
! Free allocated memory
call resetSparseMatrices( )
call resetMeshDistr( )
call resetdscfComm( )
call resetDenseMatrix( )
call resetFixedPointers( )
call reset_bands( )
call resetMeshPhi( )
call resetDscfPointers( )
call resetRhog()
call mixers_scf_reset()
! Clean diagonalization
call diag_exit()
#ifdef SIESTA__CHESS
if (isolve == SOLVE_CHESS) then
call CheSS_finalize()
end if
#endif
! Output memory use up to the end of the program
!! call printmemory( 6, 1 )
! Print allocation report
call alloc_report( printNow=.true. )
#ifdef DEBUG_XC
! Close debug outup file
call closeDebugOutputFile()
#endif /* DEBUG_XC */
! Stop time counter
call timer( 'siesta', 2 )
call timer( 'all', 3 )
#ifdef TRACING
! Write extrae user function list
if (IOnode) then
call writeList(eventlist)
end if
call deleteList(eventlist)
#endif /* TRACING */
! Print final date and time
if (IOnode) then
call timestamp('End of run')
call wallclock('End of run')
endif
if (cml_p) then
call cmlEndModule(mainXML)
call siesta_cml_exit()
endif
endif ! SIESTA_worker
! Finalize MPI, unless siesta is running as a subroutine
!
! Add stamp to MESSAGES file
call message('INFO','Job completed')
#ifdef MPI
MPIerror = MPI_SUCCESS
if (.not.siesta_subroutine) call MPI_Finalize( MPIerror )
#endif
if (IOnode) then
call io_assign(iu)
open(iu, file='0_NORMAL_EXIT', form='FORMATTED')
#ifdef MPI
write(iu,'(a,i0)') 'SIESTA completed, MPI exit: ',
& MPIerror
#else
write(iu,'(a)') 'SIESTA completed successfully'
#endif
call io_close(iu)
endif
!--------------------------------------------------------------------------- END
END subroutine siesta_end
END MODULE m_siesta_end
|