Branch data Line data Source code
1 : :
2 : : #if defined HAVE_CONFIG_H
3 : : #include "config.h"
4 : : #endif
5 : :
6 : : #include "abi_common.h"
7 : :
8 : : module m_tdep_sym
9 : :
10 : : use defs_basis
11 : : use m_abicore
12 : : use m_errors
13 : : use m_xmpi
14 : : use m_matrix, only : mati3inv
15 : : use m_symtk, only : symatm
16 : : use m_symfind, only : symfind, symanal, symlatt
17 : : use m_tdep_dataset, only : atdep_dataset_type, MPI_enreg_type
18 : : use m_tdep_latt, only : Lattice_type, tdep_make_inbox
19 : :
20 : : implicit none
21 : :
22 : : type,public :: Symmetries_type
23 : :
24 : : integer :: msym
25 : : integer :: nptsym
26 : : integer :: nsym
27 : : integer :: spgroup
28 : : integer, allocatable :: ptsymrel(:,:,:)
29 : : integer, allocatable :: symrec(:,:,:)
30 : : integer, allocatable :: symrel(:,:,:)
31 : : integer, allocatable :: symafm(:)
32 : : integer, allocatable :: indsym(:,:,:)
33 : : double precision, allocatable :: S_ref(:,:,:,:)
34 : : double precision, allocatable :: S_inv(:,:,:,:)
35 : : double precision, allocatable :: tnons(:,:)
36 : : double precision, allocatable :: xred_zero(:,:)
37 : :
38 : : end type Symmetries_type
39 : :
40 : : public :: tdep_make_sym
41 : : public :: tdep_SearchS_1at
42 : : public :: tdep_SearchS_2at
43 : : public :: tdep_SearchS_3at
44 : : public :: tdep_SearchS_4at
45 : : public :: tdep_destroy_sym
46 : : public :: tdep_calc_indsym2
47 : :
48 : : contains
49 : :
50 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
51 [ - + - + : 44 : subroutine tdep_make_sym(Invar,Lattice,MPIdata,Sym)
- + - + -
+ - + - +
- + ]
52 : :
53 : : type(Symmetries_type),intent(out) :: Sym
54 : : type(atdep_dataset_type),intent(inout) :: Invar
55 : : type(Lattice_type),intent(in) :: Lattice
56 : : type(MPI_enreg_type), intent(in) :: MPIdata
57 : :
58 : : integer :: nspden,use_inversion,chkprim
59 : : integer :: ptgroupma,isym,ii,jj,iatom_unitcell
60 : : integer :: bravais(11)
61 : 44 : integer, allocatable :: symrel(:,:,:),symafm(:)
62 : : double precision :: genafm(3)
63 : : double precision :: temp1(3,1), temp2(3,1)
64 : 44 : double precision, allocatable :: spinat(:,:)
65 : 44 : double precision, allocatable :: tnons(:,:)
66 [ - + ]: 44 : double precision, allocatable :: tmp1(:,:)
67 : :
68 : :
69 : : ! Compute all the symetries coming from the bravais lattice
70 : : ! The routine used is symlatt (from Abinit code)
71 : : ! GA: FIXME msym needs to be an input variable
72 : 44 : Sym%msym=1000 !msym needs to be very large due to non-primitive cell calculations
73 [ - + + + : 572044 : ABI_MALLOC(Sym%ptsymrel,(3,3,Sym%msym)) ; Sym%ptsymrel(:,:,:)=0
+ + + + ]
74 : 44 : call symlatt(Invar%bravais,std_out,Sym%msym,Sym%nptsym,Sym%ptsymrel,Lattice%rprimdt,tol8)
75 : 44 : write(Invar%stdout,'(a,1x,11(i4,1x))')' bravais=',Invar%bravais(:)
76 : 44 : Sym%nsym=Sym%nptsym
77 : :
78 : : ! Initialize all the symetries using the first atom at (0.0;0.0;0.0)
79 [ - + + - : 556 : ABI_MALLOC(Sym%xred_zero,(3,Invar%natom_unitcell)) ; Sym%xred_zero(:,:)=0.d0
+ - + - -
+ - + - +
+ + + + ]
80 [ + + ]: 150 : do iatom_unitcell=1,Invar%natom_unitcell
81 [ + + ]: 424 : temp1(:,1)=Invar%xred_unitcell(:,iatom_unitcell)-Invar%xred_unitcell(:,1)
82 [ + + ]: 424 : do ii=1,3
83 [ + + ]: 318 : if (temp1(ii,1).lt.0.d0) then
84 : 66 : jj=int(temp1(ii,1)+1.0)
85 [ + - ]: 252 : else if (temp1(ii,1).ge.0.d0) then
86 : 252 : jj=int(temp1(ii,1)+0.0)
87 : : end if
88 : 424 : temp2(ii,1)=temp1(ii,1)-real(jj)
89 : : end do
90 [ + + ]: 468 : Sym%xred_zero(:,iatom_unitcell)=temp2(:,1)
91 : : end do
92 : :
93 : : ! Calculation of the (non-symmorphic) translations
94 : 44 : nspden=1
95 [ - + + - : 512 : ABI_MALLOC(spinat,(3,Invar%natom_unitcell)); spinat(:,:)=0.d0
- + - + +
+ + + ]
96 : 44 : use_inversion=1
97 [ - + + - : 572132 : ABI_MALLOC(symrel ,(3,3,Sym%msym)) ; symrel (:,:,:)=0
+ - + - -
+ - + + +
+ + + + ]
98 [ - + + - : 176132 : ABI_MALLOC(tnons ,(3,Sym%msym)) ; tnons (:,:)=0.d0
+ - + - -
+ - + + +
+ + ]
99 [ - + + - : 44132 : ABI_MALLOC(symafm ,(Sym%msym)) ; symafm (:)=1
+ - + - -
+ - + +
+ ]
100 : : call symfind(Lattice%gprimd,Sym%msym,Invar%natom_unitcell,Sym%nptsym,nspden,Sym%nsym,&
101 : 44 : & 0,Sym%ptsymrel,spinat,symafm,symrel,tnons,tol8,Invar%typat_unitcell,use_inversion,Sym%xred_zero)
102 [ - + ]: 44 : ABI_FREE(spinat)
103 [ - + + - : 21218 : ABI_MALLOC(Sym%symrel,(3,3,Sym%nsym)) ; Sym%symrel(:,:,:)=0
+ - + - -
+ - + - +
+ + + + +
+ ]
104 [ - + + - : 6620 : ABI_MALLOC(Sym%tnons ,(3,Sym%nsym)) ; Sym%tnons (:,:)=0.d0
+ - + - -
+ - + - +
+ + + + ]
105 [ - + + - : 1754 : ABI_MALLOC(Sym%symafm ,(Sym%nsym)) ; Sym%symafm (:)=1
+ - + - -
+ - + - +
+ + ]
106 [ + + + + : 21130 : Sym%symrel(:,:,:)=symrel(:,:,1:Sym%nsym)
+ + ]
107 [ + + + + ]: 6532 : Sym%tnons (:,:)=tnons (:,1:Sym%nsym)
108 [ + + ]: 1666 : Sym%symafm (:)=symafm (1:Sym%nsym)
109 [ - + ]: 44 : ABI_FREE(symrel)
110 [ - + ]: 44 : ABI_FREE(tnons)
111 [ - + ]: 44 : ABI_FREE(symafm)
112 [ + + ]: 44 : if (Sym%nptsym.ne.Sym%nsym) then
113 : 3 : write(Invar%stdlog,'(a,i4,a,i4)') 'WARNING: nsym=',Sym%nsym,' is not equal to nptsym=',Sym%nptsym
114 : 3 : write(Invar%stdlog,'(a)') ' Symrel='
115 [ + + ]: 293 : do isym=1,Sym%nsym
116 : 290 : write(Invar%stdlog,*) ' For sym=',isym
117 : 290 : write(Invar%stdlog,*) Sym%symrel(1,:,isym)
118 : 290 : write(Invar%stdlog,*) Sym%symrel(2,:,isym)
119 : 293 : write(Invar%stdlog,*) Sym%symrel(3,:,isym)
120 : : end do
121 : 3 : write(Invar%stdlog,'(a)') ' Ptsymrel='
122 [ + + ]: 111 : do isym=1,Sym%nptsym
123 : 108 : write(Invar%stdlog,*) ' For sym=',isym
124 : 108 : write(Invar%stdlog,*) Sym%ptsymrel(1,:,isym)
125 : 108 : write(Invar%stdlog,*) Sym%ptsymrel(2,:,isym)
126 : 111 : write(Invar%stdlog,*) Sym%ptsymrel(3,:,isym)
127 : : end do
128 : : end if
129 : :
130 : : ! Calculation of symrec
131 [ - + + - : 21218 : ABI_MALLOC(Sym%symrec,(3,3,Sym%nsym)); Sym%symrec(:,:,:)=0
+ - + - -
+ - + - +
+ + + + +
+ ]
132 [ + + ]: 1666 : do isym=1,Sym%nsym
133 : 1666 : call mati3inv(Sym%symrel(:,:,isym),Sym%symrec(:,:,isym))
134 : : end do
135 : : ! Calculation of spgroup
136 : 44 : chkprim=0
137 : 44 : genafm(:)=0.d0
138 : : ptgroupma=0
139 : 44 : Sym%spgroup=0
140 : 44 : call symanal(bravais,chkprim,genafm,Sym%msym,Sym%nsym,ptgroupma,Lattice%rprimdt,Sym%spgroup,Sym%symafm,Sym%symrel,Sym%tnons,tol8)
141 : :
142 : : ! Transform S_ref in cartesian coordinates
143 [ - + + - : 21262 : ABI_MALLOC(Sym%S_ref,(3,3,Sym%nsym,2)) ; Sym%S_ref(:,:,:,1)=real(Sym%symrel(:,:,1:Sym%nsym))
+ - + - +
- - + - +
- + + + +
+ + + ]
144 [ - + + - : 21174 : ABI_MALLOC(Sym%S_inv,(3,3,Sym%nsym,2)) ; Sym%S_inv(:,:,:,1)=zero
- + - + -
+ + + + +
+ + ]
145 [ - + + + : 572 : ABI_MALLOC(tmp1,(3,3)); tmp1(:,:)=0.d0
+ + ]
146 [ + - ]: 44 : if (MPIdata%iam_master) open(unit=75,file=trim(Invar%output_prefix)//'_sym.dat')
147 [ + + ]: 1666 : do isym=1,Sym%nsym
148 [ + - ]: 1622 : if (MPIdata%iam_master) then
149 : 1622 : write(75,*) ' '
150 : 1622 : write(75,*) 'For isym=',isym
151 : 1622 : write(75,*) 'In reduced coordinates:'
152 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(1,1,isym,1),Sym%S_ref(1,2,isym,1),Sym%S_ref(1,3,isym,1)
153 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(2,1,isym,1),Sym%S_ref(2,2,isym,1),Sym%S_ref(2,3,isym,1)
154 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(3,1,isym,1),Sym%S_ref(3,2,isym,1),Sym%S_ref(3,3,isym,1)
155 : : end if
156 : 1622 : call DGEMM('N','N',3,3,3,1.d0,Lattice%rprimdt,3,Sym%S_ref(:,:,isym,1),3,0.d0,tmp1,3)
157 : 1622 : call DGEMM('N','N',3,3,3,1.d0,tmp1,3,Lattice%rprimdtm1,3,0.d0,Sym%S_ref(:,:,isym,1),3)
158 [ + + ]: 6488 : do ii=1,3
159 [ + + ]: 21086 : do jj=1,3
160 [ + + ]: 19464 : if (abs(Sym%S_ref(ii,jj,isym,1)).lt.tol8) Sym%S_ref(ii,jj,isym,1)=zero
161 : : end do
162 : : end do
163 : : ! Inversion of S_ref (which is equivalent to the transposition)
164 [ + + ]: 6488 : do ii=1,3
165 [ + + ]: 21086 : do jj=1,3
166 : 19464 : Sym%S_inv(ii,jj,isym,1)=Sym%S_ref(jj,ii,isym,1)
167 : : end do
168 : : end do
169 [ + - ]: 1666 : if (MPIdata%iam_master) then
170 : 1622 : write(75,*) 'In cartesian coordinates:'
171 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(1,1,isym,1),Sym%S_ref(1,2,isym,1),Sym%S_ref(1,3,isym,1)
172 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(2,1,isym,1),Sym%S_ref(2,2,isym,1),Sym%S_ref(2,3,isym,1)
173 : 1622 : write(75,'(3(f5.2,1x))') Sym%S_ref(3,1,isym,1),Sym%S_ref(3,2,isym,1),Sym%S_ref(3,3,isym,1)
174 : : end if
175 : : end do
176 [ + - ]: 44 : if (MPIdata%iam_master) close(75)
177 : 44 : write(Invar%stdout,'(a)') ' See the sym.dat file'
178 : :
179 : : ! We verify that S.S^T = Id
180 [ + + + + ]: 572 : tmp1(:,:)=zero
181 [ + + ]: 1666 : do isym=1,Sym%nsym
182 : 1622 : call DGEMM('T','N',3,3,3,1.d0,Sym%S_ref(:,:,isym,1),3,Sym%S_ref(:,:,isym,1),3,0.d0,tmp1,3)
183 [ + + ]: 6532 : do ii=1,3
184 [ + + ]: 21086 : do jj=1,3
185 [ + + + - : 19464 : if ((ii/=jj.and.abs(tmp1(ii,jj)).gt.tol8).or.(ii==jj.and.abs(tmp1(ii,jj)-1.d0).gt.tol8)) then
+ + - + ]
186 : 0 : write(Invar%stdout,'(a)') ' STOP : the matrix is not orthogonal : '
187 : 0 : write(Invar%stdout,'(a,1x,i3,1x,i3,1x,f15.10)') ' ii, jj, sym(ii,jj)=',ii,jj,tmp1(ii,jj)
188 : 0 : ABI_ERROR('The matrix is not orthogonal')
189 : : end if
190 : : end do
191 : : end do
192 : : end do
193 : :
194 [ - + ]: 44 : ABI_FREE(tmp1)
195 : :
196 : 44 : end subroutine tdep_make_sym
197 : :
198 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
199 : :
200 : 44 : subroutine tdep_SearchS_1at(Invar,MPIdata,Sym,xred_ideal)
201 : :
202 : : type(atdep_dataset_type), intent(in) :: Invar
203 : : type(Symmetries_type), intent(inout) :: Sym
204 : : type(MPI_enreg_type), intent(in) :: MPIdata
205 : : double precision, intent(in) :: xred_ideal(3,Invar%natom)
206 : :
207 : : integer :: isym,jatom,mu
208 : : integer :: iatom_unitcell,jatom_unitcell,iatom
209 : 88 : integer :: vecti(3),vectj(3),vectsym(4,Sym%nsym)
210 : 44 : integer, allocatable :: indsym2(:,:,:,:)
211 : : double precision :: temp3(3,1)
212 : 88 : double precision :: tmpi(3,Invar%natom),tmpj(3,Invar%natom),tmp_store(3,Invar%natom_unitcell)
213 : :
214 : 44 : write(Invar%stdout,*) ' '
215 : 44 : write(Invar%stdout,*) '#############################################################################'
216 : 44 : write(Invar%stdout,*) '###################### Find the symetry operations ##########################'
217 : 44 : write(Invar%stdout,*) '#################### (connecting the atoms together) ########################'
218 : 44 : write(Invar%stdout,*) '#############################################################################'
219 : :
220 : : ! write(Invar%stdout,'(a)') 'Begining SearchS'
221 : : ! TODO: Initialize the local variables at 0
222 : :
223 : : ! Compute the indsym fundamental quantity
224 : : ! === Obtain a list of rotated atoms ===
225 : : ! $ R^{-1} (xred(:,iat)-\tau) = xred(:,iat_sym) + R_0 $
226 : : ! * indsym(4, isym,iat) gives iat_sym in the original unit cell.
227 : : ! * indsym(1:3,isym,iat) gives the lattice vector $R_0$.
228 : 44 : write(Invar%stdout,'(a)') ' Search the matrix transformation going from (k) to (i)...'
229 [ - + + - : 1207538 : ABI_MALLOC(Sym%indsym,(4,Sym%nsym,Invar%natom)); Sym%indsym(:,:,:)=zero
- + + - +
- + - - +
- + - + +
+ + + +
+ ]
230 : : call symatm(Sym%indsym(:,:,1:Invar%natom_unitcell),Invar%natom_unitcell,Sym%nsym,&
231 : 44 : & Sym%symrec,Sym%tnons,tol8,Invar%typat_unitcell,Sym%xred_zero)
232 : :
233 : : ! Store the positions of the atoms in the motif
234 [ + + ]: 150 : do iatom=1,Invar%natom_unitcell
235 : 150 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmp_store(:,iatom),1)
236 : : end do
237 : : ! Write the Indsym of the atoms included in the (reference) unitcell (i.e.: the motif)
238 [ + + + - ]: 44 : if (Invar%debug.and.MPIdata%iam_master) then
239 : 2 : open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-unitcell.dat')
240 [ + + ]: 12 : do iatom=1,Invar%natom_unitcell
241 : 10 : write(40,*) '=========================================='
242 : 10 : write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
243 [ + + ]: 172 : do isym=1,Sym%nsym
244 : 160 : write(40,'(a,i2,a,i4,a,3(i4,1x),a,i2,a,3(f10.5,1x))') ' indsym(isym=',isym,',',iatom,')=',&
245 : 330 : & Sym%indsym(1:3,isym,iatom),'|iat=',Sym%indsym(4,isym,iatom),'| with tnons=',Sym%tnons(:,isym)
246 : : end do
247 : : end do
248 : 2 : close(40)
249 : : end if
250 : :
251 : : ! Search the matrix transformation going from (k,l) to (i,j)
252 : 44 : write(Invar%stdout,'(a)') ' Search the matrix transformation going from (k,l) to (i,j)...'
253 [ - + + - : 404752562 : ABI_MALLOC(indsym2,(8,Sym%nsym,Invar%natom,Invar%natom)); indsym2(:,:,:,:)=0
- + + - -
+ + - + -
+ - - + -
+ + + + +
+ + + + ]
254 [ + + + + ]: 27572 : tmpi(:,:)=0.d0
255 [ + + + + ]: 27572 : tmpj(:,:)=0.d0
256 [ + + ]: 6926 : do iatom=1,Invar%natom
257 : : ! For a single iatom
258 : 6882 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmpi(:,iatom),1)
259 : 6882 : iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
260 [ + + ]: 27528 : vecti(:)=nint(tmpi(:,iatom)-tmp_store(:,iatom_unitcell))
261 [ + + ]: 247022 : do isym=1,Sym%nsym
262 [ + + + + ]: 69595616 : vectsym(:,:)=0
263 [ + + ]: 960384 : do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
264 : 960384 : vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vecti(1)+Sym%symrec(2,mu,isym)*vecti(2)+Sym%symrec(3,mu,isym)*vecti(3)
265 : : end do
266 [ + + ]: 1200480 : Sym%indsym(1:4,isym,iatom)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
267 [ + + ]: 45055106 : do jatom=1,Invar%natom
268 [ + + ]: 224280736 : indsym2(1:4,isym,iatom,jatom)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
269 : : end do
270 : : end do
271 : : end do
272 [ + + + - ]: 44 : if (Invar%debug.and.MPIdata%iam_master) then
273 : 2 : open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-supercell.dat')
274 [ + + ]: 226 : do iatom=1,Invar%natom
275 : 224 : write(40,*) '=========================================='
276 : 224 : write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
277 [ + + ]: 7136 : do isym=1,Sym%nsym
278 : 6912 : write(40,'(a,i2,a,i4,a,3(i4,1x),a,i2,a,3(f10.5,1x))') ' indsym(isym=',isym,',',iatom,')=',&
279 : 14048 : & Sym%indsym(1:3,isym,iatom),'|iat=',Sym%indsym(4,isym,iatom),'| with tnons=',Sym%tnons(:,isym)
280 : : end do
281 : 226 : write(40,'(a,i4)') ' '
282 : : end do
283 : 2 : close(40)
284 : : end if
285 : :
286 : : ! For a couple of (iatom,jatom). The (iatom,jatom) vector depends on the position of iatom (due to PBC)
287 [ + + ]: 6926 : do iatom=1,Invar%natom
288 [ + + ]: 1479234 : do jatom=1,Invar%natom
289 [ + + ]: 5889232 : temp3(:,1)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
290 : 1472308 : call tdep_make_inbox(temp3(:,1),1,1d-3,temp3(:,1))
291 [ + + ]: 5889232 : temp3(:,1)=xred_ideal(:,iatom)+temp3(:,1)
292 : 1472308 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp3(:,1),1,0.d0,tmpj(:,jatom),1)
293 : 1472308 : jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
294 [ + + ]: 5889232 : vectj(:)=nint(tmpj(:,jatom)-tmp_store(:,jatom_unitcell))
295 [ + + ]: 46287318 : do isym=1,Sym%nsym
296 [ + + + + ]: 11296166848 : vectsym(:,:)=0
297 [ + + ]: 179232512 : do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
298 : 179232512 : vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vectj(1)+Sym%symrec(2,mu,isym)*vectj(2)+Sym%symrec(3,mu,isym)*vectj(3)
299 : : end do
300 [ + + ]: 225512948 : indsym2(5:8,isym,iatom,jatom)=Sym%indsym(1:4,isym,jatom_unitcell)+vectsym(1:4,isym)
301 : : end do
302 : : end do
303 : : end do
304 [ + + + - ]: 44 : if (Invar%debug.and.MPIdata%iam_master) then
305 : 2 : open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-2atoms.dat')
306 [ + + ]: 226 : do iatom=1,Invar%natom
307 : 224 : write(40,*) '=========================================='
308 : 224 : write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
309 [ + + ]: 25824 : do jatom=1,Invar%natom
310 : 25600 : write(40,*) ' =========================================='
311 : 25600 : write(40,'(a,i4,a,3(f10.5,1x))') ' For jatom=',jatom,' with xred (supercell)=',xred_ideal(:,jatom)
312 [ + + ]: 885984 : do isym=1,Sym%nsym
313 : 860160 : write(40,'(a,i2,a,i4,a,i4,a,3(i4,1x),a,i2,a,3(i4,1x),a,i2,a)') ' indsym2(isym=',isym,',',iatom,',',jatom,')=',&
314 : 860160 : & indsym2(1:3,isym,iatom,jatom),&
315 : 1745920 : & '|iat=',indsym2(4,isym,iatom,jatom),'|',indsym2(5:7,isym,iatom,jatom),'|iat=',indsym2(8,isym,iatom,jatom),'|'
316 : : end do
317 : : end do
318 : 226 : write(40,'(a,i4)') ' '
319 : : end do
320 : 2 : close(40)
321 : : end if
322 [ - + ]: 44 : ABI_FREE(indsym2)
323 : 44 : write(Invar%stdout,'(a)') ' See the Indsym*.dat files (if debug)'
324 : :
325 : 44 : end subroutine tdep_SearchS_1at
326 : :
327 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
328 : 306801 : subroutine tdep_SearchS_2at(Invar,iatom,jatom,eatom,fatom,Isym2at,Sym,xred_ideal)
329 : :
330 : : integer, intent(in) :: iatom,jatom,eatom,fatom
331 : : type(atdep_dataset_type),intent(in) :: Invar
332 : : type(Symmetries_type),intent(in) :: Sym
333 : : integer, intent(inout) :: Isym2at(Invar%natom,Invar%natom,2)
334 : : double precision, intent(in) :: xred_ideal(3,Invar%natom)
335 : :
336 : : integer :: isym,ee,ff,ii
337 : : integer :: iatom_unitcell,jatom_unitcell
338 : : integer :: vecti(3),vectj(3),latte(3),lattf(3),indsym2(8)
339 : 613602 : double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
340 : 613602 : double precision :: tmp(3,Invar%natom)
341 : : logical :: ok
342 : :
343 : : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
344 : : ! starting from (i,j)
345 : : ! In that case, note that two cases are possible:
346 : : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
347 : : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
348 : :
349 : : ! Store the positions of the atoms in the motif
350 [ + + ]: 931887 : do ii=1,Invar%natom_unitcell
351 : 931887 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
352 : : end do
353 : :
354 : : ! Search the atom equivalent to iatom in the (reference) unitcell
355 [ + + ]: 77606881 : do ii=1,Invar%natom
356 : 77606881 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
357 : : end do
358 : : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
359 : 306801 : iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
360 [ + + ]: 1227204 : vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
361 : :
362 : : ! Search the atom equivalent to jatom in the (reference) unitcell.
363 : : ! jatom can be outside the box (according to the value of iatom)
364 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
365 [ + + ]: 1227204 : temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
366 : 306801 : call tdep_make_inbox(temp,1,1d-3,temp)
367 [ + + ]: 1227204 : temp(:)=xred_ideal(:,iatom)+temp(:)
368 : 306801 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
369 : 306801 : jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
370 [ + + ]: 1227204 : vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
371 : :
372 : : ! To understand the meaning of "latt", see SearchS_1at
373 : 306801 : ok=.false.
374 [ + + ]: 5232538 : do isym=1,Sym%nsym
375 : 5178841 : indsym2(:)=0
376 : 5178841 : call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
377 : 5178841 : ee=indsym2(4)
378 : 5178841 : ff=indsym2(8)
379 [ + + ]: 20715364 : latte(:)=indsym2(1:3)
380 [ + + ]: 20715364 : lattf(:)=indsym2(5:7)
381 [ + + ]: 5178841 : if (ee==iatom_unitcell.and.ff==jatom_unitcell) then
382 : : !FB if (Invar%debug) then
383 : : !FB write(Invar%stdout,*) 'For ee=iatom and ff=jatom, isym=',isym
384 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',latte(1),' + ',lattf(1)
385 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',latte(2),' + ',lattf(2)
386 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',latte(3),' + ',lattf(3)
387 : : !FB end if
388 [ + + + + ]: 10628184 : if (sum(abs((vecti(:)-latte(:))-(vectj(:)-lattf(:)))).lt.tol8) then
389 : 253104 : Isym2at(eatom,fatom,1)=isym
390 : 253104 : Isym2at(eatom,fatom,2)=1
391 : : ok=.true.
392 : : end if
393 : : end if
394 : 53697 : if (ok) exit
395 : : end do
396 : :
397 : 306801 : end subroutine tdep_SearchS_2at
398 : :
399 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
400 : 36986 : subroutine tdep_SearchS_3at(Invar,iatom,jatom,katom,eatom,fatom,gatom,Isym3at,Sym,xred_ideal)
401 : :
402 : : integer, intent(in) :: iatom,jatom,katom,eatom,fatom,gatom
403 : : type(atdep_dataset_type),intent(in) :: Invar
404 : : type(Symmetries_type),intent(in) :: Sym
405 : : integer, intent(inout) :: Isym3at(2)
406 : : double precision, intent(in) :: xred_ideal(3,Invar%natom)
407 : :
408 : : integer :: isym,ee,ff,gg,ii
409 : : integer :: iatom_unitcell,jatom_unitcell,katom_unitcell
410 : : integer :: vecti(3),vectj(3),vectk(3),indsym2(8)
411 : : integer :: lattef(3),lattfg(3),lattge(3),lattfe(3),lattgf(3),latteg(3)
412 : 73972 : double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
413 : 73972 : double precision :: tmp(3,Invar%natom)
414 : : logical :: ok
415 : :
416 : : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
417 : : ! starting from (i,j)
418 : : ! In that case, note that two cases are possible:
419 : : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
420 : : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
421 : :
422 : : ! Store the positions of the atoms in the motif
423 [ + + ]: 124446 : do ii=1,Invar%natom_unitcell
424 : 124446 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
425 : : end do
426 : :
427 : : ! Search the atom equivalent to iatom in the (reference) unitcell
428 [ + + ]: 6147570 : do ii=1,Invar%natom
429 : 6147570 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
430 : : end do
431 : : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
432 : 36986 : iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
433 [ + + ]: 147944 : vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
434 : :
435 : : ! Search the atom equivalent to jatom in the (reference) unitcell.
436 : : ! jatom can be outside the box (according to the value of iatom)
437 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
438 [ + + ]: 147944 : temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
439 : 36986 : call tdep_make_inbox(temp,1,1d-3,temp)
440 [ + + ]: 147944 : temp(:)=xred_ideal(:,iatom)+temp(:)
441 : 36986 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
442 : 36986 : jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
443 [ + + ]: 147944 : vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
444 : :
445 : : ! Search the atom equivalent to katom in the (reference) unitcell.
446 : : ! katom can be outside the box (according to the value of iatom)
447 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
448 [ + + ]: 147944 : temp(:)=xred_ideal(:,katom)-xred_ideal(:,iatom)
449 : 36986 : call tdep_make_inbox(temp,1,1d-3,temp)
450 [ + + ]: 147944 : temp(:)=xred_ideal(:,iatom)+temp(:)
451 : 36986 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,katom),1)
452 : 36986 : katom_unitcell=mod(katom-1,Invar%natom_unitcell)+1
453 [ + + ]: 147944 : vectk(:)=nint(tmp(:,katom)-tmp_store(:,katom_unitcell))
454 : :
455 : : ! To understand the meaning of "latt", see SearchS_1at
456 : 36986 : ok=.false.
457 [ + + ]: 907139 : do isym=1,Sym%nsym
458 : : ! TODO : A CHECKER!!!!!!!!!!!!!!!!!
459 : 892539 : indsym2(:)=zero
460 : 892539 : call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
461 : 892539 : ee=indsym2(4)
462 [ + + ]: 3570156 : lattef(:)=indsym2(1:3)
463 [ + + ]: 3570156 : lattfe(:)=indsym2(5:7)
464 : :
465 : 892539 : indsym2(:)=zero
466 : 892539 : call tdep_calc_indsym2(Invar,fatom,gatom,indsym2,isym,Sym,xred_ideal)
467 : 892539 : ff=indsym2(4)
468 [ + + ]: 3570156 : lattfg(:)=indsym2(1:3)
469 [ + + ]: 3570156 : lattgf(:)=indsym2(5:7)
470 : :
471 : 892539 : indsym2(:)=zero
472 : 892539 : call tdep_calc_indsym2(Invar,gatom,eatom,indsym2,isym,Sym,xred_ideal)
473 : 892539 : gg=indsym2(4)
474 [ + + ]: 3570156 : lattge(:)=indsym2(1:3)
475 [ + + ]: 3570156 : latteg(:)=indsym2(5:7)
476 [ + + + + ]: 892539 : if (ee==iatom_unitcell.and.ff==jatom_unitcell.and.gg==katom_unitcell) then
477 : : !FB if (Invar%debug) then
478 : : !FB write(Invar%stdout,*) 'For ee=iatom, ff=jatom and gg=katom, isym=',isym
479 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',lattef(1),' + ',lattfe(1)
480 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',lattef(2),' + ',lattfe(2)
481 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',lattef(3),' + ',lattfe(3)
482 : : !FB write(Invar%stdout,*) ' '
483 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(1),' - ',vectk(1),' - ',lattfg(1),' + ',lattgf(1)
484 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(2),' - ',vectk(2),' - ',lattfg(2),' + ',lattgf(2)
485 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(3),' - ',vectk(3),' - ',lattfg(3),' + ',lattgf(3)
486 : : !FB write(Invar%stdout,*) ' '
487 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(1),' - ',vecti(1),' - ',lattge(1),' + ',latteg(1)
488 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(2),' - ',vecti(2),' - ',lattge(2),' + ',latteg(2)
489 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(3),' - ',vecti(3),' - ',lattge(3),' + ',latteg(3)
490 : : !FB write(Invar%stdout,*) ' '
491 : : !FB end if
492 : : if ((sum(abs((vecti(:)-lattef(:))-(vectj(:)-lattfe(:)))).lt.tol8).and.&
493 [ + + + + : 1812760 : & (sum(abs((vectj(:)-lattfg(:))-(vectk(:)-lattgf(:)))).lt.tol8).and.&
+ + + + +
- ]
494 : : & (sum(abs((vectk(:)-lattge(:))-(vecti(:)-latteg(:)))).lt.tol8)) then
495 : 22386 : Isym3at(1)=isym
496 : 22386 : Isym3at(2)=1
497 : : ok=.true.
498 : : end if
499 : : end if
500 : 14600 : if (ok) exit
501 : : end do
502 : :
503 : 36986 : end subroutine tdep_SearchS_3at
504 : :
505 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
506 : 66824 : subroutine tdep_SearchS_4at(Invar,iatom,jatom,katom,latom,eatom,fatom,gatom,hatom,Isym4at,Sym,xred_ideal)
507 : :
508 : : integer, intent(in) :: iatom,jatom,katom,latom,eatom,fatom,gatom,hatom
509 : : type(atdep_dataset_type),intent(in) :: Invar
510 : : type(Symmetries_type),intent(in) :: Sym
511 : : integer, intent(inout) :: Isym4at(2)
512 : : double precision, intent(in) :: xred_ideal(3,Invar%natom)
513 : :
514 : : integer :: isym,ee,ff,gg,hh,ii
515 : : integer :: iatom_unitcell,jatom_unitcell,katom_unitcell,latom_unitcell
516 : : integer :: vecti(3),vectj(3),vectk(3),vectl(3),indsym2(8)
517 : : integer :: lattef(3),lattfe(3)
518 : : integer :: latteg(3),lattge(3)
519 : : integer :: latteh(3),latthe(3)
520 : : integer :: lattfg(3),lattgf(3)
521 : : integer :: lattfh(3),latthf(3)
522 : : integer :: lattgh(3),latthg(3)
523 : 133648 : double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
524 : 133648 : double precision :: tmp(3,Invar%natom)
525 : : logical :: ok
526 : :
527 : : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
528 : : ! starting from (i,j)
529 : : ! In that case, note that two cases are possible:
530 : : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
531 : : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
532 : :
533 : : ! Store the positions of the atoms in the motif
534 [ + + ]: 226052 : do ii=1,Invar%natom_unitcell
535 : 226052 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
536 : : end do
537 : :
538 : : ! Search the atom equivalent to iatom in the (reference) unitcell
539 [ + + ]: 10948880 : do ii=1,Invar%natom
540 : 10948880 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
541 : : end do
542 : : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
543 : 66824 : iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
544 [ + + ]: 267296 : vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
545 : :
546 : : ! Search the atom equivalent to jatom in the (reference) unitcell.
547 : : ! jatom can be outside the box (according to the value of iatom)
548 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
549 [ + + ]: 267296 : temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
550 : 66824 : call tdep_make_inbox(temp,1,1d-3,temp)
551 [ + + ]: 267296 : temp(:)=xred_ideal(:,iatom)+temp(:)
552 : 66824 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
553 : 66824 : jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
554 [ + + ]: 267296 : vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
555 : :
556 : : ! Search the atom equivalent to katom in the (reference) unitcell.
557 : : ! katom can be outside the box (according to the value of iatom)
558 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
559 [ + + ]: 267296 : temp(:)=xred_ideal(:,katom)-xred_ideal(:,iatom)
560 : 66824 : call tdep_make_inbox(temp,1,1d-3,temp)
561 [ + + ]: 267296 : temp(:)=xred_ideal(:,iatom)+temp(:)
562 : 66824 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,katom),1)
563 : 66824 : katom_unitcell=mod(katom-1,Invar%natom_unitcell)+1
564 [ + + ]: 267296 : vectk(:)=nint(tmp(:,katom)-tmp_store(:,katom_unitcell))
565 : :
566 : : ! Search the atom equivalent to latom in the (reference) unitcell.
567 : : ! latom can be outside the box (according to the value of iatom)
568 : : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
569 [ + + ]: 267296 : temp(:)=xred_ideal(:,latom)-xred_ideal(:,iatom)
570 : 66824 : call tdep_make_inbox(temp,1,1d-3,temp)
571 [ + + ]: 267296 : temp(:)=xred_ideal(:,iatom)+temp(:)
572 : 66824 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,latom),1)
573 : 66824 : latom_unitcell=mod(latom-1,Invar%natom_unitcell)+1
574 [ + + ]: 267296 : vectl(:)=nint(tmp(:,latom)-tmp_store(:,latom_unitcell))
575 : :
576 : : ! To understand the meaning of "latt", see SearchS_1at
577 : 66824 : ok=.false.
578 [ + + ]: 2069687 : do isym=1,Sym%nsym
579 : : ! TODO : A CHECKER!!!!!!!!!!!!!!!!!
580 : 2033675 : indsym2(:)=zero
581 : 2033675 : call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
582 : 2033675 : ee=indsym2(4)
583 : 2033675 : ff=indsym2(8)
584 [ + + ]: 8134700 : lattef(:)=indsym2(1:3)
585 [ + + ]: 8134700 : lattfe(:)=indsym2(5:7)
586 : :
587 : 2033675 : indsym2(:)=zero
588 : 2033675 : call tdep_calc_indsym2(Invar,eatom,gatom,indsym2,isym,Sym,xred_ideal)
589 : 2033675 : gg=indsym2(8)
590 [ + + ]: 8134700 : latteg(:)=indsym2(1:3)
591 [ + + ]: 8134700 : lattge(:)=indsym2(5:7)
592 : :
593 : 2033675 : indsym2(:)=zero
594 : 2033675 : call tdep_calc_indsym2(Invar,eatom,hatom,indsym2,isym,Sym,xred_ideal)
595 : 2033675 : hh=indsym2(8)
596 [ + + ]: 8134700 : latteh(:)=indsym2(1:3)
597 [ + + ]: 8134700 : latthe(:)=indsym2(5:7)
598 : :
599 : 2033675 : indsym2(:)=zero
600 : 2033675 : call tdep_calc_indsym2(Invar,fatom,gatom,indsym2,isym,Sym,xred_ideal)
601 [ + + ]: 8134700 : lattfg(:)=indsym2(1:3)
602 [ + + ]: 8134700 : lattgf(:)=indsym2(5:7)
603 : :
604 : 2033675 : indsym2(:)=zero
605 : 2033675 : call tdep_calc_indsym2(Invar,fatom,hatom,indsym2,isym,Sym,xred_ideal)
606 [ + + ]: 8134700 : lattfh(:)=indsym2(1:3)
607 [ + + ]: 8134700 : latthf(:)=indsym2(5:7)
608 : :
609 : 2033675 : indsym2(:)=zero
610 : 2033675 : call tdep_calc_indsym2(Invar,gatom,hatom,indsym2,isym,Sym,xred_ideal)
611 [ + + ]: 8134700 : lattgh(:)=indsym2(1:3)
612 [ + + ]: 8134700 : latthg(:)=indsym2(5:7)
613 : :
614 [ + + + + ]: 2033675 : if (ee==iatom_unitcell.and.ff==jatom_unitcell.and.gg==katom_unitcell.and.hh==latom_unitcell) then
615 : : !FB if (Invar%debug) then
616 : : !FB write(Invar%stdout,*) 'For indef=iatom, indfg=jatom and indge=katom, isym=',isym
617 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',lattef(1),' + ',lattfe(1)
618 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',lattef(2),' + ',lattfe(2)
619 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',lattef(3),' + ',lattfe(3)
620 : : !FB write(Invar%stdout,*) ' '
621 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(1),' - ',vectk(1),' - ',lattfg(1),' + ',lattgf(1)
622 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(2),' - ',vectk(2),' - ',lattfg(2),' + ',lattgf(2)
623 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectj(3),' - ',vectk(3),' - ',lattfg(3),' + ',lattgf(3)
624 : : !FB write(Invar%stdout,*) ' '
625 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(1),' - ',vecti(1),' - ',lattge(1),' + ',latteg(1)
626 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(2),' - ',vecti(2),' - ',lattge(2),' + ',latteg(2)
627 : : !FB write(Invar%stdout,'(4(a,i4))') ' + ',vectk(3),' - ',vecti(3),' - ',lattge(3),' + ',latteg(3)
628 : : !FB write(Invar%stdout,*) ' '
629 : : !FB end if
630 : : if ((sum(abs((vecti(:)-lattef(:))-(vectj(:)-lattfe(:)))).lt.tol8).and.&
631 : : & (sum(abs((vecti(:)-latteg(:))-(vectk(:)-lattge(:)))).lt.tol8).and.&
632 : : & (sum(abs((vecti(:)-latteh(:))-(vectl(:)-latthe(:)))).lt.tol8).and.&
633 : : & (sum(abs((vectj(:)-lattfg(:))-(vectk(:)-lattgf(:)))).lt.tol8).and.&
634 [ + + + + : 5712882 : & (sum(abs((vectj(:)-lattfh(:))-(vectl(:)-latthf(:)))).lt.tol8).and.&
+ + + + +
+ + + + +
+ + + - ]
635 : : & (sum(abs((vectk(:)-lattgh(:))-(vectl(:)-latthg(:)))).lt.tol8)) then
636 : 30812 : Isym4at(1)=isym
637 : 30812 : Isym4at(2)=1
638 : : ok=.true.
639 : : end if
640 : : end if
641 : 36012 : if (ok) exit
642 : : end do
643 : :
644 : 66824 : end subroutine tdep_SearchS_4at
645 : :
646 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
647 : 20058508 : subroutine tdep_calc_indsym2(Invar,iatom,jatom,indsym2,isym,Sym,xred_ideal)
648 : :
649 : : integer, intent(in) :: iatom,jatom
650 : : type(atdep_dataset_type),intent(in) :: Invar
651 : : type(Symmetries_type),intent(in) :: Sym
652 : : integer, intent(out) :: indsym2(8)
653 : : double precision, intent(in) :: xred_ideal(3,Invar%natom)
654 : :
655 : : integer :: isym,mu,ii
656 : : integer :: iatom_unitcell,jatom_unitcell
657 : 40117016 : integer :: vecti(3),vectj(3),vectsym(4,Sym%nsym)
658 : 40117016 : double precision :: tmpi(3,Invar%natom),tmpj(3,Invar%natom),temp3(3,1),tmp_store(3,Invar%natom_unitcell)
659 : :
660 : : ! Store the positions of the atoms in the motif
661 [ + + ]: 66414480 : do ii=1,Invar%natom_unitcell
662 : 66414480 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
663 : : end do
664 : :
665 : : ! Search the matrix transformation going from (k,l) to (i,j)
666 [ + + + + ]: 14104154820 : tmpi(:,:)=0.d0
667 [ + + + + ]: 14104154820 : tmpj(:,:)=0.d0
668 : : ! For a single iatom
669 : 20058508 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmpi(:,iatom),1)
670 : 20058508 : iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
671 [ + + ]: 80234032 : vecti(:)=nint(tmpi(:,iatom)-tmp_store(:,iatom_unitcell))
672 [ + + + + ]: 4720379728 : vectsym(:,:)=0
673 [ + + ]: 80234032 : do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
674 : 80234032 : vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vecti(1)+Sym%symrec(2,mu,isym)*vecti(2)+Sym%symrec(3,mu,isym)*vecti(3)
675 : : end do
676 [ + + ]: 100292540 : indsym2(1:4)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
677 : :
678 : : ! For a couple of (iatom,jatom). The (iatom,jatom) vector depends on the position of iatom (due to PBC)
679 : : !FB if (Invar%debug) write(Invar%stdout,*) '=========================================='
680 : : !FB if (Invar%debug) write(Invar%stdout,'(a,i4,a,3(f10.5,x))') 'For iatom=',iatom,' with xred=',xred_ideal(:,iatom)
681 : : !FB if (Invar%debug) write(Invar%stdout,*) ' =========================================='
682 : : !FB if (Invar%debug) write(Invar%stdout,'(a,i4,a,3(f10.5,x))') ' For jatom=',jatom,' with xred=',xred_ideal(:,jatom)
683 [ + + ]: 80234032 : temp3(:,1)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
684 : 20058508 : call tdep_make_inbox(temp3(:,1),1,1d-3,temp3(:,1))
685 [ + + ]: 80234032 : temp3(:,1)=xred_ideal(:,iatom)+temp3(:,1)
686 : 20058508 : call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp3(:,1),1,0.d0,tmpj(:,jatom),1)
687 : 20058508 : jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
688 [ + + ]: 80234032 : vectj(:)=nint(tmpj(:,jatom)-tmp_store(:,jatom_unitcell))
689 [ + + + + ]: 4720379728 : vectsym(:,:)=0
690 [ + + ]: 80234032 : do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
691 : 80234032 : vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vectj(1)+Sym%symrec(2,mu,isym)*vectj(2)+Sym%symrec(3,mu,isym)*vectj(3)
692 : : end do
693 [ + + ]: 100292540 : indsym2(5:8)=Sym%indsym(1:4,isym,jatom_unitcell)+vectsym(1:4,isym)
694 : : !FB if (Invar%debug) then
695 : : !FB write(Invar%stdout,'(a,i2,a,i4,a,i4,a,3(i4,x),a,i2,a,3(i4,x),a,i2,a)') ' indsym2(isym=',isym,',',iatom,',',jatom,')=',indsym2(1:3),&
696 : : !FB& '|iat=',indsym2(4),'|',indsym2(5:7),'|iat=',indsym2(8),'|'
697 : : !FB end if
698 : :
699 : 20058508 : end subroutine tdep_calc_indsym2
700 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
701 : :
702 : 44 : subroutine tdep_destroy_sym(Sym)
703 : :
704 : : type(Symmetries_type),intent(inout) :: Sym
705 : :
706 [ - + ]: 44 : ABI_FREE(Sym%ptsymrel)
707 [ - + ]: 44 : ABI_FREE(Sym%S_ref)
708 [ - + ]: 44 : ABI_FREE(Sym%S_inv)
709 [ - + ]: 44 : ABI_FREE(Sym%xred_zero)
710 [ - + ]: 44 : ABI_FREE(Sym%tnons)
711 [ - + ]: 44 : ABI_FREE(Sym%symafm)
712 [ - + ]: 44 : ABI_FREE(Sym%symrec)
713 [ - + ]: 44 : ABI_FREE(Sym%symrel)
714 [ - + ]: 44 : ABI_FREE(Sym%indsym)
715 : :
716 : 44 : end subroutine tdep_destroy_sym
717 : :
718 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
719 [ # # # # : 0 : end module m_tdep_sym
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
|