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_latt
9 :
10 : use defs_basis
11 : use m_abicore
12 : use m_errors
13 : use m_xmpi
14 :
15 : use m_matrix, only : matr3inv, mat33det
16 : use m_geometry, only : metric
17 : use m_tdep_dataset, only : atdep_dataset_type, MPI_enreg_type
18 :
19 : implicit none
20 :
21 : type Lattice_type
22 :
23 : double precision :: acell_unitcell(3)
24 : double precision :: angle_alpha
25 : integer :: brav
26 : integer :: bravais(11)
27 : integer :: line
28 : double precision :: metmin (3,3)
29 : double precision :: minim (3,3)
30 : double precision :: multiplicity (3,3)
31 : double precision :: multiplicitym1(3,3)
32 : double precision :: gmet (3,3)
33 : double precision :: rmet (3,3)
34 : double precision :: gprimd (3,3)
35 : double precision :: gprim (3,3)
36 : double precision :: gprimt (3,3)
37 : double precision :: rprim (3,3)
38 : double precision :: rprimt (3,3)
39 : double precision :: rprimm1 (3,3)
40 : double precision :: rprimd (3,3)
41 : double precision :: rprimdm1 (3,3)
42 : double precision :: rprimdt (3,3)
43 : double precision :: rprimdtm1 (3,3)
44 : double precision :: rprimd_md (3,3)
45 : double precision :: Sij (6,6)
46 : double precision :: ucvol
47 : double precision :: BulkModulus_T
48 : double precision :: BulkModulus_S
49 : double precision :: HeatCapa_V
50 : double precision :: HeatCapa_P
51 : double precision :: Shear
52 : double precision :: Density
53 :
54 : end type Lattice_type
55 :
56 : public :: tdep_make_inbox
57 : public :: tdep_make_latt
58 :
59 : contains
60 :
61 : !=====================================================================================================
62 23774195 : subroutine tdep_make_inbox(tab,natom,tol,&
63 : & temp) !Optional
64 :
65 : integer :: natom,ii,jj,iatom
66 : double precision :: tol
67 : double precision :: tab(3,natom) !Input (and ouput if temp is not present)
68 : double precision,optional :: temp(3,natom) !Input/Output (if present)
69 :
70 : !GA: One could make use of function wrap2_pmhalf
71 :
72 47548390 : do iatom=1,natom
73 118870975 : do ii=1,3
74 71322585 : if (tab(ii,iatom).lt.0.d0) then
75 22489363 : jj=int(tab(ii,iatom)-0.5+tol)
76 48833222 : else if (tab(ii,iatom).ge.0.d0) then
77 48833222 : jj=int(tab(ii,iatom)+0.5+tol)
78 : end if
79 95096780 : if (present(temp)) then
80 66880881 : temp(ii,iatom)=temp(ii,iatom)-real(jj)
81 : else
82 4441704 : tab(ii,iatom)=tab(ii,iatom)-real(jj)
83 : end if
84 : end do
85 : end do
86 :
87 23774195 : end subroutine tdep_make_inbox
88 :
89 : !=====================================================================================================
90 44 : subroutine tdep_make_latt(Invar,Lattice,rotation_cart)
91 :
92 : type(Lattice_type),intent(out) :: Lattice
93 : type(atdep_dataset_type),intent(inout) :: Invar
94 : double precision, intent(out) :: rotation_cart(3,3)
95 :
96 : integer :: brav,ii,jj,line
97 : double precision :: acell_unitcell(3),multiplicity(3,3),multiplicitym1(3,3)
98 : double precision :: rprimd(3,3),rprimdt(3,3),rprimd_md(3,3),rprimdm1(3,3)
99 : double precision :: rprim(3,3),rprimm1(3,3),rprimt(3,3),rprimdtm1(3,3)
100 : double precision :: rprimd_unitcell(3,3)
101 : double precision :: rprimd_tmp(3,3), rprimdm1_tmp(3,3)
102 : double precision :: RAmat(3,3),Amat2(3,3),Rmat(3,3)
103 : double precision :: rotation(3,3)
104 : double precision :: xi,hh
105 : character(len=500) :: msg
106 :
107 : ! For bravais(1):
108 : ! The holohedral groups are numbered as follows
109 : ! (see international tables for crystallography (1983), p. 13)
110 : ! iholohedry=1 triclinic 1bar
111 : ! iholohedry=2 monoclinic 2/m
112 : ! iholohedry=3 orthorhombic mmm
113 : ! iholohedry=4 tetragonal 4/mmm
114 : ! iholohedry=5 trigonal 3bar m
115 : ! iholohedry=6 hexagonal 6/mmm
116 : ! iholohedry=7 cubic m3bar m
117 :
118 : ! For bravais(2):
119 : ! Centering
120 : ! center=0 no centering
121 : ! center=-1 body-centered
122 : ! center=-3 face-centered
123 : ! center=1 A-face centered
124 : ! center=2 B-face centered
125 : ! center=3 C-face centered
126 :
127 : ! Correspondency between brav and bravais: brav=1-S.C., 2-F.C., 3-B.C., 4-Hex.)
128 :
129 : ! Initialize some local variables
130 44 : acell_unitcell(:)=zero; multiplicity(:,:)=zero; multiplicitym1(:,:)=zero
131 44 : rprimd(:,:)=zero; rprimdm1(:,:)=zero; rprimdt(:,:)=zero; rprimd_md(:,:)=zero
132 44 : rprim(:,:)=zero; rprimm1(:,:)=zero; rprimt(:,:)=zero; rprimdtm1(:,:)=zero
133 44 : rprimd_unitcell(:,:)=zero; RAmat(:,:)=zero; Amat2(:,:)=zero; Rmat(:,:)=zero
134 :
135 :
136 : ! ---------------------------------------------------------------------------- !
137 : ! Here, rprim defines a Primitive Lattice and NOT a Conventional lattice
138 : ! The lattice parameters have to multiply rprim on:
139 : ! 0/ line or column --> line 0
140 : ! Cubic, Fcc, Bcc, Ortho, Tetra, Rhombo, Hexa
141 : ! 1/ line only --> line=1 (see rprim using acell in ABINIT) :
142 : ! Mono, Tri
143 : ! 2/ column only --> line=2 (see rprim using scalecart in ABINIT) :
144 : ! Bct, Face-centered-Ortho, Body-centered-Ortho, C-centered-Ortho
145 : ! 3/ neither line or column --> line=3 (rprim has to be directly dimensioned in ABINIT) :
146 : ! C-centered-Mono
147 : ! ---------------------------------------------------------------------------- !
148 44 : line=0
149 : ! For monoclinic: bravais(1)=2
150 44 : if (Invar%bravais(1).eq.2.and.Invar%bravais(2).eq.0) then !monoclinic
151 1 : brav=1
152 1 : line=1
153 1 : rprim(1,1)= 1.0d0 ; rprim(1,2)= 0.0d0 ; rprim(1,3)= 0.0d0
154 1 : rprim(2,1)= 0.0d0 ; rprim(2,2)= 1.0d0 ; rprim(2,3)= 0.0d0
155 1 : rprim(3,1)= dcos(Invar%angle_alpha*pi/180.d0) ; rprim(3,2)= 0.0d0 ; rprim(3,3)= dsin(Invar%angle_alpha*pi/180.d0)
156 : ! For orthorhombic: bravais(1)=3
157 43 : else if (Invar%bravais(1).eq.3.and.Invar%bravais(2).eq.0) then !orthorhombic
158 2 : brav=1
159 2 : line=0
160 2 : rprim(1,1)=1.0d0 ; rprim(1,2)=0.0d0 ; rprim(1,3)=0.0d0
161 2 : rprim(2,1)=0.0d0 ; rprim(2,2)=1.0d0 ; rprim(2,3)=0.0d0
162 2 : rprim(3,1)=0.0d0 ; rprim(3,2)=0.0d0 ; rprim(3,3)=1.0d0
163 41 : else if (Invar%bravais(1).eq.3.and.Invar%bravais(2).eq.-3) then !face centered orthorhombic
164 0 : brav=1
165 0 : line=2
166 0 : rprim(1,1)=0.0d0 ; rprim(1,2)=0.5d0 ; rprim(1,3)=0.5d0
167 0 : rprim(2,1)=0.5d0 ; rprim(2,2)=0.0d0 ; rprim(2,3)=0.5d0
168 0 : rprim(3,1)=0.5d0 ; rprim(3,2)=0.5d0 ; rprim(3,3)=0.0d0
169 41 : else if (Invar%bravais(1).eq.3.and.Invar%bravais(2).eq.-1) then !body centered orthorhombic
170 0 : brav=1
171 0 : line=2
172 0 : rprim(1,1)=-0.5d0 ; rprim(1,2)= 0.5d0 ; rprim(1,3)= 0.5d0
173 0 : rprim(2,1)= 0.5d0 ; rprim(2,2)=-0.5d0 ; rprim(2,3)= 0.5d0
174 0 : rprim(3,1)= 0.5d0 ; rprim(3,2)= 0.5d0 ; rprim(3,3)=-0.5d0
175 41 : else if (Invar%bravais(1).eq.3.and.Invar%bravais(2).eq.3) then !orthorombic C-face centered
176 7 : brav=1
177 7 : line=2
178 7 : rprim(1,1)= 0.5d0 ; rprim(1,2)=-0.5d0 ; rprim(1,3)=0.0d0
179 7 : rprim(2,1)= 0.5d0 ; rprim(2,2)= 0.5d0 ; rprim(2,3)=0.0d0
180 7 : rprim(3,1)= 0.0d0 ; rprim(3,2)= 0.0d0 ; rprim(3,3)=1.0d0
181 : ! For tetragonal: bravais(1)=4
182 34 : else if (Invar%bravais(1).eq.4.and.Invar%bravais(2).eq.0) then !tetragonal
183 0 : brav=1
184 0 : line=2
185 0 : rprim(1,1)=1.0d0 ; rprim(1,2)=0.0d0 ; rprim(1,3)=0.0d0
186 0 : rprim(2,1)=0.0d0 ; rprim(2,2)=1.0d0 ; rprim(2,3)=0.0d0
187 0 : rprim(3,1)=0.0d0 ; rprim(3,2)=0.0d0 ; rprim(3,3)=1.0d0
188 34 : else if (Invar%bravais(1).eq.4.and.Invar%bravais(2).eq.-1) then !body centered tetragonal
189 2 : brav=3
190 2 : line=2
191 2 : rprim(1,1)=-0.5d0 ; rprim(1,2)= 0.5d0 ; rprim(1,3)= 0.5d0
192 2 : rprim(2,1)= 0.5d0 ; rprim(2,2)=-0.5d0 ; rprim(2,3)= 0.5d0
193 2 : rprim(3,1)= 0.5d0 ; rprim(3,2)= 0.5d0 ; rprim(3,3)=-0.5d0
194 : ! For trigonal: bravais(1)=5
195 32 : else if (Invar%bravais(1).eq.5.and.Invar%bravais(2).eq.0) then !rhombo
196 3 : brav=1
197 3 : line=0
198 3 : xi=dsin(Invar%angle_alpha*pi/180.d0/2d0)
199 3 : hh=dsqrt(1d0-4d0/3d0*xi**2)
200 3 : rprim(1,1)=xi ; rprim(1,2)=-xi/dsqrt(3d0) ; rprim(1,3)= hh
201 3 : rprim(2,1)= 0.d0 ; rprim(2,2)=2d0*xi/dsqrt(3d0) ; rprim(2,3)= hh
202 3 : rprim(3,1)=-xi ; rprim(3,2)=-xi/dsqrt(3d0) ; rprim(3,3)= hh
203 : ! double precision :: AA,BB,CC,DD
204 : ! AA=dcos(Invar%angle_alpha*pi/180.d0/2d0)
205 : ! BB=dsin(Invar%angle_alpha*pi/180.d0/2d0)
206 : ! CC=dcos(Invar%angle_alpha*pi/180.d0)
207 : ! DD=dsqrt(1-CC**2/AA**2)
208 : ! rprim(1,1)= AA ; rprim(1,2)= AA ; rprim(1,3)= CC/AA
209 : ! rprim(2,1)=-BB ; rprim(2,2)= BB ; rprim(2,3)= 0.d0
210 : ! rprim(3,1)= 0.d0 ; rprim(3,2)= 0.d0; rprim(3,3)= DD
211 : ! rprim(1,1)= AA ; rprim(1,2)= -BB ; rprim(1,3)= 0.d0
212 : ! rprim(2,1)= AA ; rprim(2,2)= BB ; rprim(2,3)= 0.d0
213 : ! rprim(3,1)= CC/AA ; rprim(3,2)= 0.d0; rprim(3,3)= DD
214 : ! For hexagonal: bravais(1)=6
215 29 : else if (Invar%bravais(1).eq.6.and.Invar%bravais(2).eq.0) then !hexagonal
216 4 : brav=4
217 4 : line=0
218 : ! The following definition of the hcp is fixed in m_dynmat (chkrp9)
219 4 : rprim(1,1)= 1.0d0 ; rprim(1,2)= 0.0d0 ; rprim(1,3)= 0.0d0
220 4 : rprim(2,1)=-0.5d0 ; rprim(2,2)= dsqrt(3.d0)/2.d0 ; rprim(2,3)= 0.0d0
221 4 : rprim(3,1)= 0.0d0 ; rprim(3,2)= 0.0d0 ; rprim(3,3)= 1.0d0
222 : ! For cubic: bravais(1)=7
223 25 : else if (Invar%bravais(1).eq.7.and.Invar%bravais(2).eq.0) then !simple cubic
224 6 : brav=1
225 6 : line=0
226 6 : rprim(1,1)=1.0d0 ; rprim(1,2)=0.0d0 ; rprim(1,3)=0.0d0
227 6 : rprim(2,1)=0.0d0 ; rprim(2,2)=1.0d0 ; rprim(2,3)=0.0d0
228 6 : rprim(3,1)=0.0d0 ; rprim(3,2)=0.0d0 ; rprim(3,3)=1.0d0
229 19 : else if (Invar%bravais(1).eq.7.and.Invar%bravais(2).eq.-3) then !face centered cubic
230 15 : brav=2
231 15 : line=0
232 15 : rprim(1,1)=0.0d0 ; rprim(1,2)=0.5d0 ; rprim(1,3)=0.5d0
233 15 : rprim(2,1)=0.5d0 ; rprim(2,2)=0.0d0 ; rprim(2,3)=0.5d0
234 15 : rprim(3,1)=0.5d0 ; rprim(3,2)=0.5d0 ; rprim(3,3)=0.0d0
235 4 : else if (Invar%bravais(1).eq.7.and.Invar%bravais(2).eq.-1) then !body centered cubic
236 4 : brav=3
237 4 : line=0
238 4 : rprim(1,1)=-0.5d0 ; rprim(1,2)= 0.5d0 ; rprim(1,3)= 0.5d0
239 4 : rprim(2,1)= 0.5d0 ; rprim(2,2)=-0.5d0 ; rprim(2,3)= 0.5d0
240 4 : rprim(3,1)= 0.5d0 ; rprim(3,2)= 0.5d0 ; rprim(3,3)=-0.5d0
241 : else
242 0 : ABI_ERROR('THIS BRAVAIS IS NOT DEFINED')
243 : end if
244 :
245 : ! ---------------------------------------------------------------------------- !
246 :
247 : ! Define inverse of the multiplicity
248 572 : multiplicity = Invar%multiplicity
249 44 : call matr3inv(multiplicity,multiplicitym1)
250 1100 : multiplicitym1 = TRANSPOSE(multiplicitym1)
251 :
252 : ! Compute gprim and (transpose of gprim) gprimt
253 44 : call matr3inv(rprim, Lattice%gprimt)
254 1100 : Lattice%gprim = TRANSPOSE(Lattice%gprimt)
255 : ! GA: This is a weird convention, and is different from the rest of abinit.
256 : ! See for example how the DDB has to be initialized with Lattice.
257 :
258 : ! Define transpose and inverse of rprim
259 572 : rprimt = TRANSPOSE(rprim)
260 44 : call matr3inv(rprimt, rprimm1)
261 :
262 : ! Compute acell_unitcell and a rotation matrix, given that
263 : ! the supercell rprimd is related to the unitcell rprim according to
264 : ! rprimd = R * A * multiplicity * rprim
265 : ! where R is unitary and A is a diagonal matrix containing acell.
266 3476 : RAmat = MATMUL(MATMUL(Invar%rprimd_md, rprimm1), multiplicitym1)
267 :
268 : ! This matrix should be diagonal
269 1760 : Amat2 = MATMUL(TRANSPOSE(RAmat), RAmat)
270 176 : do ii=1,3
271 176 : acell_unitcell(ii) = sqrt(Amat2(ii,ii))
272 : end do
273 176 : do ii=1,3
274 572 : do jj=1,3
275 528 : Rmat(ii,jj) = RAmat(ii,jj) / acell_unitcell(jj)
276 : end do
277 : end do
278 572 : rotation = TRANSPOSE(Rmat)
279 :
280 : ! Compute rotation matrix in cartesian coordinates
281 44 : call matr3inv(Invar%rprimd_md, rprimdm1_tmp)
282 1100 : rprimdm1_tmp = TRANSPOSE(rprimdm1_tmp)
283 1760 : rotation_cart = MATMUL(rotation, Invar%rprimd_md)
284 1760 : rotation_cart = MATMUL(rprimdm1_tmp, rotation_cart)
285 1100 : rotation_cart = TRANSPOSE(rotation_cart)
286 :
287 : ! Perform some checks
288 44 : if ((mat33det(rotation) - 1) .gt. tol8) then
289 0 : rprimd_tmp = MATMUL(multiplicitym1, Invar%rprimd_md)
290 : write(msg, '(6a,3(3f16.10,1x,a),2a,3(3f16.10,1x,a))')&
291 0 : 'The input primitive vectors cannot be aligned',ch10,&
292 0 : 'with the expected primitive vectors through rotation.',ch10,&
293 0 : 'Input unitcell primitive vectors:',ch10,&
294 0 : (rprimd_tmp(1,jj),jj=1,3),ch10,&
295 0 : (rprimd_tmp(2,jj),jj=1,3),ch10,&
296 0 : (rprimd_tmp(3,jj),jj=1,3),ch10,&
297 0 : 'Expected primitive vectors:',ch10,&
298 0 : (rprim(1,jj),jj=1,3),ch10,&
299 0 : (rprim(2,jj),jj=1,3),ch10,&
300 0 : (rprim(3,jj),jj=1,3),ch10
301 0 : ABI_ERROR(msg)
302 : end if
303 :
304 : ! Apply rotation to rprim_md
305 2816 : Invar%rprimd_md = MATMUL(rotation, Invar%rprimd_md)
306 :
307 : ! ---------------------------------------------------------------------------- !
308 :
309 : ! Recompute dimensioned primitive vectors
310 1760 : rprimd_md = MATMUL(multiplicity, rprim)
311 44 : if (line==0.or.line==1) then
312 140 : do ii=1,3
313 455 : do jj=1,3
314 420 : rprimd_md(ii,jj) = acell_unitcell(ii) * rprimd_md(ii,jj)
315 : end do
316 : end do
317 : else if (line==2) then
318 36 : do ii=1,3
319 117 : do jj=1,3
320 108 : rprimd_md(ii,jj) = acell_unitcell(jj) * rprimd_md(ii,jj)
321 : end do
322 : end do
323 : end if
324 :
325 : ! Echo some (re)computed quantities
326 44 : write(Invar%stdout,*) ' '
327 44 : write(Invar%stdout,*) '#############################################################################'
328 44 : write(Invar%stdout,*) '########################## Computed quantities ##############################'
329 44 : write(Invar%stdout,*) '#############################################################################'
330 :
331 : ! Check the off-diagonal elements
332 176 : do ii=1,3
333 176 : write(Invar%stdlog,'(a,1x,3(f16.10,1x))') 'The rprimd_md (computed)=',(rprimd_md(ii,jj),jj=1,3)
334 : end do
335 : if((abs(rprimd_md(1,2)-Invar%rprimd_md(1,2)).gt.tol5).or.(abs(rprimd_md(1,3)-Invar%rprimd_md(1,3)).gt.tol5).or.&
336 : & (abs(rprimd_md(2,1)-Invar%rprimd_md(2,1)).gt.tol5).or.(abs(rprimd_md(3,1)-Invar%rprimd_md(3,1)).gt.tol5).or.&
337 : & (abs(rprimd_md(2,3)-Invar%rprimd_md(2,3)).gt.tol5).or.(abs(rprimd_md(3,2)-Invar%rprimd_md(3,2)).gt.tol5).or.&
338 44 : & (abs(rprimd_md(1,1)-Invar%rprimd_md(1,1)).gt.tol5).or.(abs(rprimd_md(2,2)-Invar%rprimd_md(2,2)).gt.tol5).or.&
339 : & (abs(rprimd_md(3,3)-Invar%rprimd_md(3,3)).gt.tol5)) then
340 0 : do ii=1,3
341 0 : write(Invar%stdlog,'(a,1x,3(f16.10,1x))') 'The rprimd (from the input file or NetCDF file) is=',&
342 0 : & (Invar%rprimd_md(ii,jj),jj=1,3)
343 : end do
344 0 : do ii=1,3
345 0 : write(Invar%stdlog,'(a,1x,3(f16.10,1x))') 'However, using multiplicity (from the input file)=',&
346 0 : & (multiplicity(ii,jj),jj=1,3)
347 : end do
348 0 : do ii=1,3
349 0 : write(Invar%stdlog,'(a,1x,3(f16.10,1x))') 'rprim (from the aTDEP code)=',(rprim(ii,jj),jj=1,3)
350 : end do
351 0 : write(Invar%stdlog,'(a,1x,3(f16.10,1x))') 'and acell (from the calculation)=',(acell_unitcell(ii),ii=1,3)
352 0 : ABI_ERROR(' RPRIMD IS NOT RELATED TO RPRIM AND MULTIPLICITY. MODIFY YOUR RPRIMD.')
353 : end if
354 :
355 : ! Check the diagonal elements
356 44 : if ((Invar%bravais(1).eq.2).and.(Invar%bravais(2).eq.0)) then !monoclinic
357 1 : if ((acell_unitcell(1).gt.acell_unitcell(3)).or.&
358 : & (acell_unitcell(2).gt.acell_unitcell(3))) then
359 0 : ABI_ERROR('You must set a,b <= c in the conventional lattice')
360 : end if
361 43 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.3)) then !C face centered orthorombique
362 7 : if (acell_unitcell(1).ge.acell_unitcell(2)) then
363 0 : ABI_ERROR('You must set a < b in the conventional lattice')
364 : end if
365 36 : else if (Invar%bravais(1).eq.6) then !hexagonal
366 4 : if(abs(acell_unitcell(1)-acell_unitcell(2)).gt.tol8) then
367 0 : ABI_ERROR(' STOP: THE PRECISION ON THE LATTICE PARAMETERS IS NOT SUFFICIENT')
368 : end if
369 4 : acell_unitcell(2)=acell_unitcell(1)
370 32 : else if (Invar%bravais(1).eq.7) then !cubic
371 25 : if((abs(acell_unitcell(1)-acell_unitcell(2)).gt.tol8).or.&
372 : & (abs(acell_unitcell(2)-acell_unitcell(3)).gt.tol8)) then
373 0 : ABI_ERROR('THE PRECISION ON THE LATTICE PARAMETERS IS NOT SUFFICIENT')
374 : end if
375 25 : acell_unitcell(2)=acell_unitcell(1)
376 25 : acell_unitcell(3)=acell_unitcell(1)
377 : end if
378 44 : write(Invar%stdout,'(a,1x,3(f16.10,1x))') ' acell_unitcell=',acell_unitcell(:)
379 :
380 : ! Recompute rprimd_md with the symmetrized acell,
381 : ! in order to have a precision higher than 1.d-8.
382 1760 : rprimd_md = MATMUL(multiplicity, rprim)
383 44 : if (line==0.or.line==1) then
384 140 : do ii=1,3
385 455 : do jj=1,3
386 420 : rprimd_md(ii,jj) = acell_unitcell(ii) * rprimd_md(ii,jj)
387 : end do
388 : end do
389 : else if (line==2) then
390 36 : do ii=1,3
391 117 : do jj=1,3
392 108 : rprimd_md(ii,jj) = acell_unitcell(jj) * rprimd_md(ii,jj)
393 : end do
394 : end do
395 : end if
396 176 : do ii=1,3
397 176 : write(Invar%stdout,'(a,1x,3(f16.10,1x))') ' rprimd_md=',(rprimd_md(ii,jj),jj=1,3)
398 : end do
399 :
400 : ! Define the rprimd with respect to the acell_unitcell, according to the value of "line"
401 44 : if (line==2) then
402 9 : rprimd(1,1)=rprim(1,1)*acell_unitcell(1) ; rprimd(1,2)=rprim(1,2)*acell_unitcell(2) ; rprimd(1,3)=rprim(1,3)*acell_unitcell(3)
403 9 : rprimd(2,1)=rprim(2,1)*acell_unitcell(1) ; rprimd(2,2)=rprim(2,2)*acell_unitcell(2) ; rprimd(2,3)=rprim(2,3)*acell_unitcell(3)
404 9 : rprimd(3,1)=rprim(3,1)*acell_unitcell(1) ; rprimd(3,2)=rprim(3,2)*acell_unitcell(2) ; rprimd(3,3)=rprim(3,3)*acell_unitcell(3)
405 : else if (line==0.or.line==1) then
406 35 : rprimd(1,1)=rprim(1,1)*acell_unitcell(1) ; rprimd(1,2)=rprim(1,2)*acell_unitcell(1) ; rprimd(1,3)=rprim(1,3)*acell_unitcell(1)
407 35 : rprimd(2,1)=rprim(2,1)*acell_unitcell(2) ; rprimd(2,2)=rprim(2,2)*acell_unitcell(2) ; rprimd(2,3)=rprim(2,3)*acell_unitcell(2)
408 35 : rprimd(3,1)=rprim(3,1)*acell_unitcell(3) ; rprimd(3,2)=rprim(3,2)*acell_unitcell(3) ; rprimd(3,3)=rprim(3,3)*acell_unitcell(3)
409 : end if
410 :
411 : ! Define transpose and inverse of rprimd
412 572 : rprimdt = TRANSPOSE(rprimd)
413 :
414 : ! Compute gmet, rmet, gprimd
415 44 : call metric(Lattice%gmet,Lattice%gprimd,Invar%stdlog,Lattice%rmet,rprimdt,Lattice%ucvol)
416 :
417 44 : call matr3inv(rprimd, rprimdtm1)
418 44 : call matr3inv(rprimdt, rprimdm1)
419 :
420 : ! Store all these values in the 'Lattice' datatype
421 176 : Lattice%acell_unitcell(:) =acell_unitcell(:)
422 44 : Lattice%angle_alpha =Invar%angle_alpha
423 44 : Lattice%brav =brav
424 528 : Lattice%bravais(:) =Invar%bravais(:)
425 44 : Lattice%line =line
426 572 : Lattice%multiplicity (:,:)=multiplicity(:,:)
427 572 : Lattice%multiplicitym1(:,:)=multiplicitym1(:,:)
428 572 : Lattice%rprim (:,:)=rprim (:,:)
429 572 : Lattice%rprimt (:,:)=rprimt (:,:)
430 572 : Lattice%rprimm1 (:,:)=rprimm1 (:,:)
431 572 : Lattice%rprimd (:,:)=rprimd (:,:)
432 572 : Lattice%rprimdm1 (:,:)=rprimdm1 (:,:)
433 572 : Lattice%rprimdt (:,:)=rprimdt (:,:)
434 572 : Lattice%rprimdtm1 (:,:)=rprimdtm1 (:,:)
435 572 : Lattice%rprimd_md (:,:)=rprimd_md (:,:)
436 :
437 44 : end subroutine tdep_make_latt
438 :
439 : !=====================================================================================================
440 :
441 0 : end module m_tdep_latt
|