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
22!> To produce a matrix \f$Z\f$ which is needed to orthogonalize \f$H\f$.
23!!
24!! \f$ H_{orth} = Z^{\dagger}HZ \f$
25!! See Negre 2016 \cite Negre2016
26!!
27MODULE GENXPROGRESS
28
29#ifdef PROGRESSON
30
31  USE BML
32  USE PRG_GENZ_MOD
33
34  USE CONSTANTS_MOD
35  USE NONOARRAY
36  USE MYPRECISION
37
38  PRIVATE
39
40  PUBLIC :: GENXBML
41
42  TYPE(BML_MATRIX_T), PUBLIC                :: OVER_BML !FOR STORING S IN BML FORMAT
43  TYPE(BML_MATRIX_T), PUBLIC                :: ZK1_BML, ZK2_BML, ZK3_BML
44  TYPE(BML_MATRIX_T), PUBLIC                :: ZK4_BML, ZK5_BML, ZK6_BML, ZMAT_BML
45  INTEGER, PUBLIC                           :: IGENX = 0!COUTER TO KEEP TRACK OF THE TIMES ZMAT IS COMPUTED.
46  TYPE(GENZSPINP), PUBLIC                   :: ZSP
47
48CONTAINS
49
50  SUBROUTINE GENXBML
51
52    IMPLICIT NONE
53
54    !> Parsing Z sparse propagation and build.
55    IF(IGENX == 0)THEN
56       CALL PRG_PARSE_ZSP(ZSP,LATTEINNAME)
57       IF(ZSP%BML_TYPE == BML_MATRIX_DENSE .AND. SPARSEON == 1) STOP 'If CONTROL{ SPARSEON= 1 } then ZSP{ BMLType= Ellpack }'
58       IF(ZSP%BML_TYPE .EQ. BML_MATRIX_ELLPACK)THEN
59          IF(ZSP%ZSP .EQV. .FALSE.)STOP 'If ZSP{ ZSP= F } then ZSP{ BMLType= Dense }'
60          IF(SPARSEON == 0) STOP 'If CONTROL{ SPARSEON= 0 } then ZSP{ BMLType= Dense }'
61       ENDIF
62    ENDIF
63
64    IF(bml_allocated(OVER_BML)) CALL BML_DEALLOCATE(OVER_BML)
65
66    IF(ZSP%VERBOSE.GE.1)WRITE(*,*)"Inside genx ..."
67
68    IF(ZSP%MDIM < 0) ZSP%MDIM = HDIM
69
70
71    IGENX = IGENX + 1 !Counter to keep track of the iterations (md and optimization)
72
73    IF(VERBOSE >= 1) WRITE(*,*)"IGENX =",IGENX
74
75    CALL BML_ZERO_MATRIX(ZSP%BML_TYPE,BML_ELEMENT_REAL,LATTEPREC,HDIM,ZSP%MDIM,OVER_BML)
76
77    CALL BML_IMPORT_FROM_DENSE(ZSP%BML_TYPE, &
78         SMAT, OVER_BML, ZERO, ZSP%MDIM)
79
80    !    CALL BML_PRINT_MATRIX("OVER_BML",OVER_BML,1,10,1,10)
81
82    IF(ZSP%ZSP)THEN !Congruence transformation.
83
84       IF(IGENX == 0) THEN
85          CALL PRG_INIT_ZSPMAT(IGENX,ZK1_BML,ZK2_BML,ZK3_BML&
86               ,ZK4_BML,ZK5_BML,ZK6_BML,ZSP%MDIM,ZSP%BML_TYPE)
87       ENDIF
88
89       CALL PRG_BUILDZSPARSE(OVER_BML,ZMAT_BML,IGENX,ZSP%MDIM,&
90            ZSP%BML_TYPE, ZK1_BML,ZK2_BML,ZK3_BML&
91            ,ZK4_BML,ZK5_BML,ZK6_BML,ZSP%NFIRST,ZSP%NREFI,ZSP%NREFF,&
92            ZSP%NUMTHRESI,ZSP%NUMTHRESF,ZSP%INTEGRATION,ZSP%VERBOSE)
93
94    ELSE
95
96       !Build z matrix using diagonalization (usual method).
97       CALL PRG_BUILDZDIAG(OVER_BML,ZMAT_BML,ZSP%NUMTHRESF,ZSP%MDIM,ZSP%BML_TYPE)
98
99    ENDIF
100
101    CALL FLUSH(6)
102
103    CALL BML_EXPORT_TO_DENSE(ZMAT_BML, XMAT)
104
105    IF(ZSP%VERBOSE.GE.1)WRITE(*,*)"Out of genx ..."
106
107  END SUBROUTINE GENXBML
108
109#endif
110
111END MODULE GENXPROGRESS
112