Branch data Line data Source code
1 : : !{\src2tex{textfont=tt}}
2 : : !!****f* m_abi_linalg/abi_xorthonormalize
3 : : !! NAME
4 : : !! abi_xorthonormalize
5 : : !!
6 : : !! FUNCTION
7 : : !! abi_xorthonormalize is the generic function for computing the
8 : : !! overlap of two complex wavefunctions (for a given number of bands)
9 : : !! and orthonormalizes it:
10 : : !!
11 : : !! COPYRIGHT
12 : : !! Copyright (C) 2001-2026 ABINIT group (LNguyen,FDahm (CS), FBottin, GZ, AR, MT)
13 : : !! This file is distributed under the terms of the
14 : : !! GNU General Public License, see ~abinit/COPYING
15 : : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : : !!
17 : : !! SOURCE
18 : :
19 : : !!***
20 : :
21 : : !!****f* m_abi_linalg/xorthonormalize
22 : : !! NAME
23 : : !! xorthonormalize
24 : : !!
25 : : !! FUNCTION
26 : : !! This routine computes the overlap of two complex wavefunctions (for a given number of bands)
27 : : !! and orthonormalizes it:
28 : : !! - Computes the products of two rectangular matrices
29 : : !! containing the wavefunctions psi and S.psi (where S is the
30 : : !! overlap (with the PAW terms if necessary)).
31 : : !! - Does a Cholesky decomposition of this overlap
32 : : !! - rotates the initial matrix blockvectorx by the triangular matrix to
33 : : !! have an orthonormal set of wavefunctions
34 : : !!
35 : : !! INPUTS
36 : : !! blockvectorbx = matrix of dimension (blocksize,vectsize)
37 : : !! (e.g. block of overlap*wavefunction)
38 : : !! blocksize = dimension of matrices (e.g number of bands)
39 : : !! spaceComm = communicator used for MPI parallelization
40 : : !! vectsize = dimension of matrices (e.g number of G vector)
41 : : !!
42 : : !! OUTPUT
43 : : !! sqgram = Choleski decomposition of transpose(blockvector)*blockvectorx
44 : : !!
45 : : !! SIDE EFFECTS
46 : : !! blockvectorx = on input, matrix of dimension (vectsize,blocksize)
47 : : !! (e.g block of wavefunction)
48 : : !! blockvectorx = on output, orthonormalized wavefunction.
49 : : !!
50 : : !!
51 : : !! SOURCE
52 : :
53 : 115668 : subroutine xorthonormalize(blockvectorx,blockvectorbx,blocksize,spaceComm,sqgram,vectsize,&
54 : : & x_cplx,timopt,tim_xortho) ! optional arguments
55 : :
56 : : !Arguments ------------------------------------
57 : : !scalars
58 : : integer,intent(in) :: blocksize,vectsize,spaceComm,x_cplx
59 : : integer, intent(in), optional :: timopt,tim_xortho
60 : : !arrays
61 : : real(dp),intent(in) :: blockvectorbx(vectsize,blocksize)
62 : : real(dp),intent(inout) :: blockvectorx(vectsize,blocksize)
63 : : real(dp),intent(out) :: sqgram(x_cplx*blocksize,blocksize)
64 : :
65 : : !Local variables-------------------------------
66 : : real(dp) :: tsec(2)
67 : : integer :: ierr,info
68 : : character(len=500) :: message
69 : : character, dimension(2) :: cparam
70 : :
71 : : ! *********************************************************************
72 : :
73 [ + - ]: 57834 : if (present(tim_xortho).and.present(timopt)) then
74 [ - + ]: 57834 : if(abs(timopt)==3) then
75 : 0 : call timab(tim_xortho,1,tsec)
76 : : end if
77 : : end if
78 : :
79 : 57834 : cparam(1)='t'
80 : 57834 : cparam(2)='c'
81 : :
82 : : call abi_xgemm(cparam(x_cplx),'n',blocksize,blocksize,vectsize,cone,blockvectorx,&
83 : 57834 : & vectsize,blockvectorbx,vectsize,czero,sqgram,blocksize,x_cplx=x_cplx)
84 : :
85 : 57834 : call xmpi_sum(sqgram,spaceComm,ierr)
86 : :
87 : : !Cholesky factorization of sqgram (ouside upper Triangular of sqgram)
88 : 57834 : call abi_xpotrf('u',blocksize,sqgram,blocksize,info,x_cplx=x_cplx)
89 : :
90 [ - + ]: 57834 : if (info /= 0 ) then
91 : 0 : write(message,'(a,i0)')'abi_xpotrf, info=',info
92 : 0 : ABI_ERROR(message)
93 : : end if
94 : :
95 : : !Find X X*sqgram=blockvectorx
96 : : call abi_xtrsm('r','u','n','n',vectsize,blocksize,cone,sqgram,blocksize,&
97 : 57834 : & blockvectorx,vectsize,x_cplx=x_cplx)
98 : :
99 [ + - ]: 57834 : if (present(tim_xortho).and.present(timopt)) then
100 [ - + ]: 57834 : if(abs(timopt)==3) then
101 : 0 : call timab(tim_xortho,2,tsec)
102 : : end if
103 : : end if
104 : :
105 : 57834 : end subroutine xorthonormalize
106 : : !!***
107 : :
108 : : !!****f* ABINIT/ortho_reim
109 : : !! NAME
110 : : !! ortho_reim
111 : : !!
112 : : !! FUNCTION
113 : : !! This routine computes the overlap of two wavefunctions (for a given number of bands)
114 : : !! and orthonormalizes it:
115 : : !! - Computes the products of two rectangular matrices
116 : : !! containing the wavefunctions psi and S.psi (where S is the
117 : : !! overlap (with the PAW terms if necessary)).
118 : : !! - Does a Cholesky decomposition of this overlap
119 : : !! - rotates the initial matrix blockvectorx by the triangular matrix to
120 : : !! have an orthonormal set of wavefunctions
121 : : !!
122 : : !! This version operates on arrays in which the real and the imaginary part
123 : : !! are packed together (real parts first, them imaginary parts), used when istwfk=2
124 : : !!
125 : : !! INPUTS
126 : : !! blockvectorbx = matrix of dimension (blocksize,vectsize)
127 : : !! (e.g. block of overlap*wavefunction)
128 : : !! blocksize = dimension of matrices (e.g number of bands)
129 : : !! spaceComm = communicator used for MPI parallelization
130 : : !! vectsize = dimension of matrices (e.g number of G vector)
131 : : !!
132 : : !! OUTPUT
133 : : !! sqgram = Choleski decomposition of transpose(blockvector)*blockvectorx
134 : : !!
135 : : !! SIDE EFFECTS
136 : : !! blockvectorx = on input, matrix of dimension (vectsize,blocksize)
137 : : !! (e.g block of wavefunction)
138 : : !! blockvectorx = on output, orthonormalized wavefunction.
139 : : !!
140 : : !! SOURCE
141 : :
142 : 0 : subroutine ortho_reim(blockvectorx,blockvectorbx,blocksize,spaceComm,sqgram,vectsize)
143 : :
144 : : !Arguments ------------------------------------
145 : : !scalars
146 : : integer,intent(in) :: blocksize,vectsize,spaceComm
147 : : !arrays
148 : : real(dp),intent(in) :: blockvectorbx(vectsize,blocksize)
149 : : real(dp),intent(inout) :: blockvectorx(vectsize,blocksize)
150 : : real(dp),intent(out) :: sqgram(blocksize,blocksize)
151 : :
152 : : !Local variables-------------------------------
153 : : !scalars
154 : : integer :: ierr,info
155 : : character(len=500) :: message
156 : :
157 : : ! *********************************************************************
158 : :
159 : : call abi_xgemm('t','n',blocksize,blocksize,vectsize,cone,blockvectorx,&
160 : 0 : & vectsize,blockvectorbx,vectsize,czero,sqgram,blocksize)
161 : :
162 : 0 : call xmpi_sum(sqgram,spaceComm,ierr)
163 : :
164 : : !Cholesky factorization of sqgram (ouside upper Triangular of sqgram)
165 : 0 : call abi_d2zpotrf('u',blocksize,sqgram,blocksize,info) !vz_d
166 : :
167 [ # # ]: 0 : if (info /= 0 ) then
168 : 0 : write(message,'(a,i0)')'dpotrf, info=',info
169 : 0 : ABI_ERROR(message)
170 : : end if
171 : :
172 : : !Find X X*sqgram=blockvectorx
173 : 0 : call abi_xtrsm('r','u','n','n',vectsize,blocksize,one,sqgram,blocksize,blockvectorx,vectsize)
174 : :
175 : 0 : end subroutine ortho_reim
176 : : !!***
177 : :
178 : :
179 : : !!****f* ABINIT/zorthonormalize
180 : : !! NAME
181 : : !! zorthonormalize
182 : : !!
183 : : !! FUNCTION
184 : : !! This routine computes the overlap of two complex wavefunctions (for a given number of bands)
185 : : !! and orthonormalizes it:
186 : : !! - Computes the products of two rectangular matrices
187 : : !! containing the wavefunctions psi and S.psi (where S is the
188 : : !! overlap (with the PAW terms if necessary)).
189 : : !! - Does a Cholesky decomposition of this overlap
190 : : !! - rotates the initial matrix blockvectorx by the triangular matrix to
191 : : !! have an orthonormal set of wavefunctions
192 : : !!
193 : : !! INPUTS
194 : : !! blockvectorbx = matrix of dimension (blocksize,vectsize)
195 : : !! (e.g. block of overlap*wavefunction)
196 : : !! blocksize = dimension of matrices (e.g number of bands)
197 : : !! spaceComm = communicator used for MPI parallelization
198 : : !! vectsize = dimension of matrices (e.g number of G vector)
199 : : !!
200 : : !! OUTPUT
201 : : !! sqgram = Choleski decomposition of transpose(blockvector)*blockvectorx
202 : : !!
203 : : !! SIDE EFFECTS
204 : : !! blockvectorx = on input, matrix of dimension (vectsize,blocksize)
205 : : !! (e.g block of wavefunction)
206 : : !! blockvectorx = on output, orthonormalized wavefunction.
207 : : !!
208 : : !!
209 : : !! SOURCE
210 : :
211 : 32 : subroutine zorthonormalize(blockvectorx,blockvectorbx,blocksize,spaceComm,sqgram,vectsize)
212 : :
213 : : !Arguments ------------------------------------
214 : : !scalars
215 : : integer,intent(in) :: blocksize,spaceComm,vectsize
216 : : !arrays
217 : : complex(dp),intent(in) :: blockvectorbx(vectsize,blocksize)
218 : : complex(dp),intent(inout) :: blockvectorx(vectsize,blocksize)
219 : : complex(dp),intent(out) :: sqgram(blocksize,blocksize)
220 : :
221 : : !Local variables-------------------------------
222 : : !scalars
223 : : integer :: ierr,info
224 : : character(len=500) :: message
225 : :
226 : : ! *********************************************************************
227 : :
228 : : call abi_xgemm('c','n',blocksize,blocksize,vectsize,cone,blockvectorx,&
229 : 32 : & vectsize,blockvectorbx,vectsize,czero,sqgram,blocksize)
230 : :
231 : 32 : call xmpi_sum(sqgram,spaceComm,ierr)
232 : :
233 : 32 : call abi_xpotrf('u',blocksize,sqgram,blocksize,info)
234 : :
235 [ - + ]: 32 : if (info /= 0 ) then
236 : 0 : write(message,'(a,i0)')'zpotrf, info=',info
237 : 0 : ABI_ERROR(message)
238 : : end if
239 : :
240 : 32 : call abi_xtrsm('r','u','n','n',vectsize,blocksize,cone,sqgram,blocksize,blockvectorx,vectsize)
241 : :
242 : 32 : end subroutine zorthonormalize
243 : : !!***
244 : :
|