Line data Source code
1 : !!****m* ABINIT/m_spgbuilder
2 : !! NAME
3 : !! m_spgbuilder
4 : !!
5 : !! FUNCTION
6 : !! Spacegroup builder.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2008-2026 ABINIT group (RC, XG)
10 : !! This file is distributed under the terms of the
11 : !! GNU General Public License, see ~abinit/COPYING
12 : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : !!
14 : !! SOURCE
15 :
16 : #if defined HAVE_CONFIG_H
17 : #include "config.h"
18 : #endif
19 :
20 : #include "abi_common.h"
21 :
22 : module m_spgbuilder
23 :
24 : use defs_basis
25 : use m_errors
26 : use m_abicore
27 :
28 : use m_symtk, only : sg_multable, print_symmetries
29 : use m_symsg, only : symsgcube, symsghexa, symsgmono, symsgortho, symsgtetra
30 :
31 : implicit none
32 :
33 : private
34 : !!***
35 :
36 : public :: gensymspgr
37 : public :: gensymshub
38 : public :: gensymshub4
39 : !!***
40 :
41 : contains
42 : !!***
43 :
44 : !!****f* m_spgbuilder/gensymspgr
45 : !! NAME
46 : !! gensymspgr
47 : !!
48 : !! FUNCTION
49 : !! Give all the symmetry operations starting from the space group symbol.
50 : !! Suppose we are working in a conventional cell
51 : !! If brvltt 0 or positive, the pure translations of the
52 : !! Bravais lattice are included as generator of the group.
53 : !! In brvltt=-1, no pure translation is present, and the
54 : !! cell should be changed from conventional to primitive,
55 : !! outside of this routine.
56 : !! Treat also Shubnikov type III space groups.
57 : !!
58 : !! INPUTS
59 : !! brvltt = input variable giving Bravais lattice
60 : !! msym = default number of symmetry operations
61 : !! shubnikov= magnetic type of the space group to be generated
62 : !! spgaxor = orientation of the cell axis (might be needed)
63 : !! spgorig = second choice of origin for certain groups
64 : !! (might be needed if nsym==0)
65 : !! spgroup = number of space group
66 : !! spgroupma= number of the magnetic space group
67 : !!
68 : !! OUTPUT
69 : !! nsym = number of symmetry operations
70 : !! symafm(nsym)=(anti)ferromagnetic part of symmetry operations
71 : !! symrel(3,3,nsym)=symmetry operations in real space in terms
72 : !! of primitive translations
73 : !! tnons(3,nsym)=nonsymmorphic translations for symmetry operations
74 : !!
75 : !! SIDE EFFECTS
76 : !! brvltt = input variable giving Bravais lattice
77 : !!
78 : !! SOURCE
79 :
80 1623 : subroutine gensymspgr(brvltt,msym,nsym,shubnikov,spgaxor,spgorig,spgroup,spgroupma,symafm,symrel,tnons)
81 :
82 : !Arguments ------------------------------------
83 : !scalars
84 : integer,intent(in) :: msym,shubnikov,spgaxor,spgorig,spgroup,spgroupma
85 : integer,intent(inout) :: brvltt
86 : integer,intent(out) :: nsym
87 : !arrays
88 : integer,intent(inout) :: symafm(msym),symrel(3,3,msym) !vz_i
89 : real(dp),intent(inout) :: tnons(3,msym) !vz_i
90 :
91 : !Local variables ------------------------------
92 : ! intsym,inttn = intermediate real to swap the columns of the symmetry matrix
93 : ! bckbrvltt = backup to brvltt to compare the assigned and the input values
94 : !real(dp) :: tsec(2)
95 : !scalars
96 : integer :: bckbrvltt,ii,inversion,jj,kk,ierr
97 : integer :: intsym
98 : real(dp) :: inttn
99 : character(len=500) :: message
100 : ! *************************************************************************
101 :
102 : !List of the input parameters
103 : !DEBUG
104 : !write(std_out,*)' gensymspgr : enter with:'
105 : !write(std_out,*)' spgroup = ',spgroup
106 : !write(std_out,*)' spgaxor = ',spgaxor
107 : !write(std_out,*)' spgorig = ',spgorig
108 : !write(std_out,*)' brvltt = ',brvltt
109 : !ENDDEBUG
110 :
111 : !Assume that the value of spgroupma is consistent with the one of spgroup
112 : !(this has been checked earlier)
113 :
114 : !Tests for consistency first the space group number and then the orientation
115 : !Checks the space group number
116 1623 : if (.not.(spgroup>0 .and. spgroup<231) ) then
117 : write(message, '(a,i0,a,a,a,a)' )&
118 0 : & 'spgroup must be between 1 to 230, but is ',spgroup,ch10,&
119 0 : & 'This is not allowed. ',ch10,&
120 0 : & 'Action: modify spgroup in the input file.'
121 0 : ABI_ERROR(message)
122 : end if
123 :
124 : !Checks the orientation
125 1623 : if (.not.(spgaxor>0 .and. spgaxor<10)) then
126 : write(message, '(a,i12,a,a,a,a)' )&
127 0 : & 'spgaxor must be from 1 to 9, but is',spgaxor,ch10,&
128 0 : & 'This is not allowed. ',ch10,&
129 0 : & 'Action: modify spgaxor in the input file.'
130 0 : ABI_ERROR(message)
131 : end if
132 :
133 : !Checks the consistency between the origin and space group
134 1623 : if (spgorig==1 .or. spgorig==2) then
135 : else
136 : write(message, '(a,i4,a,a,a,a,a,a)' )&
137 0 : & 'spgorig is',spgorig,ch10,&
138 0 : & 'while it should be 0 or 1',ch10,&
139 0 : & 'This is not allowed. ',ch10,&
140 0 : & 'Action: modify spgorig in the input file.'
141 0 : ABI_ERROR(message)
142 : end if
143 :
144 1623 : if (spgorig>1) then
145 0 : select case (spgroup)
146 : case (48,50,59,68,70,85,86,88,125,126,129,130,133,134,137,138,&
147 : & 141,142,201,203,222,224,227,228)
148 : case default
149 : write(message, '(a,a,a,a,a)' )&
150 0 : & 'spgroup does not accept several origin choices',ch10,&
151 0 : & 'This is not allowed. ',ch10,&
152 0 : & 'Action: modify spgorig in the input file.'
153 7 : ABI_ERROR(message)
154 : end select
155 : end if
156 :
157 : !Checks for consistency between the orientation and space group
158 1623 : if (spgaxor>1) then
159 0 : select case (spgroup)
160 : case (3:74,146,148,155,160,161,166,167)
161 : case default
162 : write(message, '(a,a,a,a,a)' )&
163 0 : & 'spgroup does not accept several orientations',ch10,&
164 0 : & 'This is not allowed. ',ch10,&
165 0 : & 'Action: modify spgaxor or spgroup in the input file.'
166 74 : ABI_ERROR(message)
167 : end select
168 : end if
169 :
170 1623 : if (brvltt<-1 .or. brvltt>7)then
171 : write(message, '(a,i4,a,a,a,a,a,a)' )&
172 0 : & 'The input brvltt was ',brvltt,ch10,&
173 0 : & 'and it should be an integer from -1 to 7',ch10,&
174 0 : & 'This is not allowed. ',ch10,&
175 0 : & 'Action: modify brvltt in the input file.'
176 0 : ABI_ERROR(message)
177 : end if
178 :
179 : !Assign nsym for each group according first to the order of the group
180 : !Note that this value might be modified later:
181 : !first because of the product with the inversion,
182 : !second because of the centering operations
183 5 : select case (spgroup)
184 : case (1,2)
185 5 : nsym=1
186 : case (3:9)
187 34 : nsym=2
188 : case (143:148)
189 43 : nsym=3
190 : case (10:42,44:47,49,51:58,60:67,69,71:84,87)
191 560 : nsym=4
192 : case (149:176)
193 242 : nsym=6
194 : case (48,50,59,68,70,85,86,88:121,123,124,127,128,131,132,135,136,139,140)
195 398 : nsym=8
196 : case (177:200,202,204:206)
197 127 : nsym=12
198 : case (43,122,125,126,129,130,133,134,137,138)
199 97 : nsym=16
200 : case (201,207:219,221,223,225,226,229,230)
201 72 : nsym=24
202 : case (141,142)
203 20 : nsym=32
204 : case (203,220,222,224)
205 15 : nsym=48
206 : case (227,228)
207 1623 : nsym=192
208 : end select
209 :
210 : !DEBUG
211 : !write(std_out,*)'gensymspgr : assigns nsym = ',nsym
212 : !ENDDEBUG
213 :
214 : !Makes a backup to the brvltt for further comparison with the assigned value
215 1623 : bckbrvltt=brvltt
216 : !Default brvltt
217 1623 : brvltt=1
218 :
219 : !call timab(47,1,tsec)
220 :
221 : !Assigns the first part of the symmetry operations:
222 : !Rotation axis and mirror planes with or without translations,
223 : !and sometimes also inversion operations.
224 : select case (spgroup)
225 : case (1:2)
226 65 : symrel(:,:,1)=0
227 5 : symrel(1,1,1)=1 ; symrel(2,2,1)=1 ; symrel(3,3,1)=1
228 20 : tnons(:,1)=zero ; symafm(1)=1
229 : case (3:15)
230 : call symsgmono(brvltt,msym,nsym,shubnikov,spgaxor,spgorig,spgroup,&
231 79 : & spgroupma,symafm,symrel,tnons)
232 : case (16:74)
233 : call symsgortho(msym,nsym,shubnikov,spgaxor,spgorig,spgroup,&
234 521 : & spgroupma,symafm,symrel,tnons)
235 : case (75:142)
236 : call symsgtetra(msym,nsym,shubnikov,spgaxor,spgorig,spgroup,&
237 509 : & spgroupma,symafm,symrel,tnons)
238 : case (143:194)
239 : call symsghexa(brvltt,msym,nsym,shubnikov,spgaxor,spgorig,spgroup,&
240 391 : & spgroupma,symafm,symrel,tnons)
241 : case (195:230)
242 : call symsgcube(msym,nsym,shubnikov,spgaxor,spgorig,spgroup,&
243 1623 : & spgroupma,symafm,symrel,tnons)
244 : end select
245 :
246 : !call timab(47,2,tsec)
247 :
248 : !Assign the inversion center (if necessary).
249 : !Note that for monoclinic space groups, the inversion was already
250 : !assigned in symsgmono.f. Some other inversions have also been assigned in the
251 : !corresponding system routine
252 1623 : inversion=0
253 597 : select case (spgroup)
254 : case (2,47,49,51:58,60:67,69,71:74,83,84,87,123,124,127,128,131,132,&
255 : & 135,136,139,140,147,148,162:167,175,176,191:194,200,202,204:206,&
256 : & 221,223,225,226,229,230)
257 597 : inversion=1
258 : ! Treat the magnetic part
259 1623 : if(shubnikov==3)then
260 : select case (spgroup)
261 : case(2) ! Triclinic
262 123 : inversion=-1
263 : case(47,49,51:58,60:67,69,71:74) ! Orthorhombic
264 202 : select case (spgroupma)
265 : case(251,253,259,261,267,268,271,279,280,283,291,292,293,297,307,&
266 : & 308,309,313,323,324,325,329,339,340,341,345,355,356,359,367,368,371,&
267 : & 379,380,381,385,395,396,399,407,408,411,419,420,421,425,435,437,443,&
268 : & 444,445,449,459,460,461,465,471,472,473,477,483,484,487,493,494,497,&
269 : & 503,504,507,513,514,517,523,525,529,531,535,537,541,542,545,550,552,556,557,560)
270 123 : inversion=-1
271 : end select
272 : case(83,84,87,123,124,127,128,131,132,135,136,139,140) ! Tetragonal
273 133 : select case (spgroupma)
274 : case(46,47,54,55,62,63,70,71,78,79,84,85,341,344,346,347,353,356,358,359,365,&
275 : & 368,370,371,377,380,382,383,389,392,394,395,401,404,406,407,&
276 : & 413,416,418,419,425,428,430,431,437,440,442,443,449,452,454,455,&
277 : & 461,464,466,467,473,476,478,479,485,488,490,491,497,500,502,503,&
278 : & 509,512,514,515,521,524,526,527,533,536,538,539,543,546,548,549)
279 79 : inversion=-1
280 : end select
281 : case(147,148,162:167,175,176,191:194) ! Hexagonal or rhombohedral
282 77 : select case (spgroupma)
283 : case(15,19,75,76,81,82,87,88,93,94,99,100,105,106,139,140,145,146,&
284 : & 235,236,237,241,245,246,247,251,255,256,257,261,265,266,267,271)
285 54 : inversion=-1
286 : end select
287 : case(200,202,204:206,221,223,225,226,229,230) ! Cubic
288 280 : select case (spgroupma)
289 : case(16,20,24,28,32,35,39,94,96,100,102,106,108,112,114,118,120,124,126,&
290 : & 130,132,136,138,142,144,147,149)
291 23 : inversion=-1
292 : end select
293 : end select
294 : end if
295 : end select
296 :
297 : !DEBUG
298 : !write(std_out,*)' gensymspgr : before inversion'
299 : !write(std_out,*)' Describe the different symmetry operations (index,symrel,tnons,symafm)'
300 : !do ii=1,nsym
301 : !write(std_out,'(i3,2x,9i3,3es12.2,i3)')ii,symrel(:,:,ii),tnons(:,ii),symafm(ii)
302 : !end do
303 : !ENDDEBUG
304 :
305 : if(inversion/=0)then
306 4613 : do ii=1,nsym ! visit all the symmetries assigned before
307 16064 : do jj=1,3 ! visit the 3x3 matrix corresponding to the symmetry i
308 12048 : tnons(jj,nsym+ii)=-tnons(jj,ii)
309 52208 : do kk=1,3
310 48192 : symrel(jj,kk,nsym+ii)=-symrel(jj,kk,ii)
311 : end do
312 : end do
313 4613 : symafm(nsym+ii)=inversion*symafm(ii)
314 : end do
315 597 : nsym=nsym*2
316 : end if
317 :
318 : !DEBUG
319 : !write(std_out,*)' gensymspgr : after inversion'
320 : !write(std_out,*)' Describe the different symmetry operations (index,symrel,tnons,symafm)'
321 : !do ii=1,nsym
322 : !write(std_out,'(i3,2x,9i3,3es12.2,i3)')ii,symrel(:,:,ii),tnons(:,ii),symafm(ii)
323 : !end do
324 : !ENDDEBUG
325 :
326 : !Assign the Bravais lattice to each space group to which it has not yet
327 : !been assigned
328 28 : select case (spgroup)
329 : case (38:41)
330 28 : brvltt=5 ! A
331 : case (20,21,35:37,63:68)
332 101 : brvltt=4 ! C
333 : case (22,42,43,69,70,196,202,203,209,210,216,219,225:228)
334 63 : brvltt=3 ! F
335 : case (23,24,44:46,71:74,79,80,82,87,88,97,98,107:110,119:122,&
336 : & 139:142,197,199,204,206,211,214,217,220,229,230)
337 181 : brvltt=2 ! I
338 : case (146,148,155,160,161,166,167)
339 1623 : if (spgaxor==1) then
340 36 : brvltt=7
341 : end if
342 : end select
343 :
344 1623 : if (bckbrvltt/=0 .and. bckbrvltt/=-1) then
345 34 : if (bckbrvltt/=brvltt) then
346 : write(message, '(a,i8,a,a,a,i8,a,a)' )&
347 0 : & 'The assigned brvltt ',brvltt,' is not equal',ch10,&
348 0 : & 'to the input value ',bckbrvltt,ch10,&
349 0 : & 'Assume experienced user. Execution will continue.'
350 0 : ABI_WARNING(message)
351 : end if
352 : end if
353 :
354 : !if(bckbrvltt>=0)then
355 : !Complete the set of primitive symmetries by translations
356 : !associated with brvltt.
357 1651 : select case (brvltt)
358 : ! Bravais lattice type : A ! translation associated: b/2+c/2
359 : case (5)
360 140 : do ii=1,nsym
361 112 : tnons(1,nsym+ii)=tnons(1,ii)
362 112 : tnons(2,nsym+ii)=tnons(2,ii)+0.5
363 112 : tnons(3,nsym+ii)=tnons(3,ii)+0.5
364 1456 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
365 140 : symafm(nsym+ii)=symafm(ii)
366 : end do
367 28 : nsym=nsym*2
368 :
369 : ! Bravais lattice type : B ! translation associated: a/2+c/2
370 : case (6)
371 0 : do ii=1,nsym
372 0 : tnons(1,nsym+ii)=tnons(1,ii)+0.5
373 0 : tnons(2,nsym+ii)=tnons(2,ii)
374 0 : tnons(3,nsym+ii)=tnons(3,ii)+0.5
375 0 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
376 0 : symafm(nsym+ii)=symafm(ii)
377 : end do
378 0 : nsym=nsym*2
379 :
380 : ! Bravais lattice type : C ! translation associated: a/2+b/2
381 : case (4)
382 886 : do ii=1,nsym
383 760 : tnons(1,nsym+ii)=tnons(1,ii)+0.5
384 760 : tnons(2,nsym+ii)=tnons(2,ii)+0.5
385 760 : tnons(3,nsym+ii)=tnons(3,ii)
386 9880 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
387 886 : symafm(nsym+ii)=symafm(ii)
388 : end do
389 126 : nsym=nsym*2
390 :
391 : ! Bravais lattice type : F ! translations associated: a/2+b/2,b/2+c/2,b/2+c/2
392 : case (3)
393 : ! For space groups containing d elements, all the symmetry operations
394 : ! have already been obtained
395 63 : if(spgroup/=43 .and. spgroup/=227 .and. spgroup/=228)then
396 1189 : do ii=1,nsym
397 : ! First translation: a/2+b/2
398 1140 : tnons(1,nsym+ii)=tnons(1,ii)+0.5
399 1140 : tnons(2,nsym+ii)=tnons(2,ii)+0.5
400 1140 : tnons(3,nsym+ii)=tnons(3,ii)
401 14820 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
402 1189 : symafm(nsym+ii)=symafm(ii)
403 : end do
404 : ! Second translation: b/2+c/2
405 1189 : do ii=1,nsym
406 1140 : tnons(1,2*nsym+ii)=tnons(1,ii)
407 1140 : tnons(2,2*nsym+ii)=tnons(2,ii)+0.5
408 1140 : tnons(3,2*nsym+ii)=tnons(3,ii)+0.5
409 14820 : symrel(:,:,2*nsym+ii)=symrel(:,:,ii)
410 1189 : symafm(2*nsym+ii)=symafm(ii)
411 : end do
412 : ! Third translation: a/2+c/2
413 1189 : do ii=1,nsym
414 1140 : tnons(1,3*nsym+ii)=tnons(1,ii)+0.5
415 1140 : tnons(2,3*nsym+ii)=tnons(2,ii)
416 1140 : tnons(3,3*nsym+ii)=tnons(3,ii)+0.5
417 14820 : symrel(:,:,3*nsym+ii)=symrel(:,:,ii)
418 1189 : symafm(3*nsym+ii)=symafm(ii)
419 : end do
420 49 : nsym=nsym*4
421 : end if
422 :
423 : ! Bravais lattice type: I ! translation associated: a/2+b/2+c/2
424 : case (2)
425 : ! For space groups containing d elements, all the symmetry operations
426 : ! have already been obtained
427 181 : if(spgroup/=122 .and. spgroup/=141 .and. spgroup/=142 .and. &
428 36 : & spgroup/=220 )then
429 1914 : do ii=1,nsym ! visit all the symmetries assigned before
430 7040 : tnons(:,nsym+ii)=tnons(:,ii)+0.5
431 22880 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
432 1914 : symafm(nsym+ii)=symafm(ii)
433 : end do
434 154 : nsym=nsym*2
435 : end if
436 :
437 : ! Bravais lattice type: R
438 : ! translations for hexagonal axes ONLY: (2/3,1/3,1/3) & (1/3,2/3,2/3)
439 : ! first translation (2/3,1/3,1/3)
440 : case (7)
441 348 : do ii=1,nsym
442 312 : tnons(1,nsym+ii)=tnons(1,ii)+two_thirds
443 312 : tnons(2,nsym+ii)=tnons(2,ii)+third
444 312 : tnons(3,nsym+ii)=tnons(3,ii)+third
445 4056 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
446 348 : symafm(nsym+ii)=symafm(ii)
447 : end do
448 : ! Second translation (1/3,2/3,2/3)
449 348 : do ii=1,nsym
450 312 : tnons(1,2*nsym+ii)=tnons(1,ii)+third
451 312 : tnons(2,2*nsym+ii)=tnons(2,ii)+two_thirds
452 312 : tnons(3,2*nsym+ii)=tnons(3,ii)+two_thirds
453 4056 : symrel(:,:,2*nsym+ii)=symrel(:,:,ii)
454 348 : symafm(2*nsym+ii)=symafm(ii)
455 : end do
456 1659 : nsym=nsym*3
457 :
458 : end select
459 :
460 : !end if
461 :
462 : !Translate tnons in the ]-0.5,0.5] interval
463 104751 : tnons(:,1:nsym)=tnons(:,1:nsym)-nint(tnons(:,1:nsym)-1.0d-8)
464 :
465 : !Orientations for the orthorhombic space groups
466 : !WARNING : XG 000620 : I am not sure that this coding is correct !!
467 1623 : if (spgroup>15 .and. spgroup <75) then
468 508 : select case (spgaxor)
469 : case (1) ! abc
470 508 : write(std_out,*)' the choosen orientation corresponds to: abc; the proper one'
471 : case (2) ! cab
472 34 : do ii=1,nsym
473 32 : intsym=symrel(1,1,ii)
474 32 : symrel(1,1,ii)=symrel(2,2,ii)
475 32 : symrel(2,2,ii)=intsym
476 32 : inttn=tnons(1,ii)
477 32 : tnons(1,ii)=tnons(2,ii)
478 34 : tnons(2,ii)=inttn
479 : end do
480 34 : do ii=1,nsym
481 32 : intsym=symrel(1,1,ii)
482 32 : symrel(1,1,ii)=symrel(3,3,ii)
483 32 : symrel(3,3,ii)=intsym
484 32 : inttn=tnons(1,ii)
485 32 : tnons(1,ii)=tnons(3,ii)
486 34 : tnons(3,ii)=inttn
487 : end do
488 2 : write(std_out,*)' the choosen orientation corresponds to: cab'
489 : case (3) ! bca
490 43 : do ii=1,nsym
491 40 : intsym=symrel(1,1,ii)
492 40 : symrel(1,1,ii)=symrel(2,2,ii)
493 40 : symrel(2,2,ii)=intsym
494 40 : inttn=tnons(1,ii)
495 40 : tnons(1,ii)=tnons(2,ii)
496 43 : tnons(2,ii)=inttn
497 : end do
498 43 : do ii=1,nsym
499 40 : intsym=symrel(2,2,ii)
500 40 : symrel(2,2,ii)=symrel(3,3,ii)
501 40 : symrel(3,3,ii)=intsym
502 40 : inttn=tnons(2,ii)
503 40 : tnons(2,ii)=tnons(3,ii)
504 43 : tnons(3,ii)=inttn
505 : end do
506 3 : write(std_out,*)' the choosen orientation corresponds to: bca'
507 : case (4) ! acb
508 34 : do ii=1,nsym
509 32 : intsym=symrel(2,2,ii)
510 32 : symrel(2,2,ii)=symrel(3,3,ii)
511 32 : symrel(3,3,ii)=intsym
512 32 : inttn=tnons(1,ii)
513 32 : tnons(2,ii)=tnons(3,ii)
514 34 : tnons(3,ii)=inttn
515 : end do
516 2 : write(std_out,*)' the choosen orientation corresponds to: acb'
517 : case (5) ! bac
518 43 : do ii=1,nsym
519 40 : intsym=symrel(1,1,ii)
520 40 : symrel(1,1,ii)=symrel(2,2,ii)
521 40 : symrel(2,2,ii)=intsym
522 40 : inttn=tnons(1,ii)
523 40 : tnons(1,ii)=tnons(2,ii)
524 43 : tnons(2,ii)=inttn
525 : end do
526 3 : write(std_out,*)' the choosen orientation corresponds to: bac'
527 : case (6) ! cba
528 34 : do ii=1,nsym
529 32 : intsym=symrel(1,1,ii)
530 32 : symrel(1,1,ii)=symrel(3,3,ii)
531 32 : symrel(3,3,ii)=intsym
532 32 : inttn=tnons(1,ii)
533 32 : tnons(1,ii)=tnons(3,ii)
534 34 : tnons(3,ii)=inttn
535 : end do
536 523 : write(std_out,*)' the choosen orientation corresponds to: cba'
537 : end select
538 : end if
539 :
540 : !DEBUG
541 : !write(std_out,*)' gensymspgr : out of the Bravais lattice, nsym is',nsym
542 : !ENDDEBUG
543 :
544 1623 : call sg_multable(nsym,symafm,symrel,ierr,tnons=tnons,tnons_tol=tol5)
545 1623 : if (ierr/=0) call print_symmetries([std_out], nsym, symrel, tnons, symafm)
546 :
547 1623 : ABI_CHECK(ierr==0,"Error in group closure")
548 :
549 1623 : end subroutine gensymspgr
550 : !!***
551 :
552 : !!****f* m_spgbuilder/gensymshub
553 : !! NAME
554 : !! gensymshub
555 : !!
556 : !! FUNCTION
557 : !! Analyse the Shubnikov space group, from the input of the
558 : !! the Fedorov space group number, and the Shubnikov space group number:
559 : !! 1) determine the type (III or IV)
560 : !! 2) for type (IV), determine the translation generating
561 : !! the anti-ferromagnetic operations
562 : !! At present, follow strictly the specifications of Bradley
563 : !! and Cracknell. However, one should take into account the
564 : !! orientation of the symmetry group (spgaxor).
565 : !!
566 : !! INPUTS
567 : !! spgroup = number of space group
568 : !! spgroupma = number of magnetic space group
569 : !!
570 : !! OUTPUT
571 : !! genafm(3) = in case of shubnikov type IV, translation, generator of the
572 : !! anti-ferromagnetic symmetry operations
573 : !! shubnikov = type of the shubnikov group
574 : !!
575 : !! SOURCE
576 :
577 1192 : subroutine gensymshub(genafm,spgroup,spgroupma,shubnikov)
578 :
579 : !Arguments ------------------------------------
580 : !scalars
581 : integer,intent(in) :: spgroup,spgroupma
582 : integer,intent(out) :: shubnikov
583 : !arrays
584 : real(dp),intent(out) :: genafm(3)
585 :
586 : !Local variables ------------------------------
587 : !scalars
588 : integer :: brvlttbw=0,spgrmatch=1
589 : character(len=500) :: message
590 : ! *************************************************************************
591 :
592 : !List of the input parameters
593 : !DEBUG
594 : !write(std_out,*)
595 : !write(std_out,*)' gensymshub : enter with:'
596 : !write(std_out,*)' brvlttbw = ',brvlttbw
597 : !write(std_out,*)' spgroup = ',spgroup
598 : !write(std_out,*)' spgroupma = ',spgroupma
599 : !ENDDEBUG
600 :
601 : !Test for consistency the magnetic and non-magnetic space group
602 1193 : select case (spgroup)
603 : case(1)
604 1 : if (.not.(spgroupma>=3 .and. 3 >=spgroupma) ) spgrmatch=0
605 : case(2)
606 2 : if (.not.(spgroupma>=6 .and. 7 >=spgroupma) ) spgrmatch=0
607 : case(3)
608 4 : if (.not.(spgroupma>=3 .and. 6 >=spgroupma) ) spgrmatch=0
609 : case(4)
610 4 : if (.not.(spgroupma>=9 .and. 12 >=spgroupma) ) spgrmatch=0
611 : case(5)
612 3 : if (.not.(spgroupma>=15 .and. 17 >=spgroupma) ) spgrmatch=0
613 : case(6)
614 4 : if (.not.(spgroupma>=20 .and. 23 >=spgroupma) ) spgrmatch=0
615 : case(7)
616 6 : if (.not.(spgroupma>=26 .and. 31 >=spgroupma) ) spgrmatch=0
617 : case(8)
618 3 : if (.not.(spgroupma>=34 .and. 36 >=spgroupma) ) spgrmatch=0
619 : case(9)
620 3 : if (.not.(spgroupma>=39 .and. 41 >=spgroupma) ) spgrmatch=0
621 : case(10)
622 6 : if (.not.(spgroupma>=44 .and. 49 >=spgroupma) ) spgrmatch=0
623 : case(11)
624 6 : if (.not.(spgroupma>=52 .and. 57 >=spgroupma) ) spgrmatch=0
625 : case(12)
626 5 : if (.not.(spgroupma>=60 .and. 64 >=spgroupma) ) spgrmatch=0
627 : case(13)
628 8 : if (.not.(spgroupma>=67 .and. 74 >=spgroupma) ) spgrmatch=0
629 : case(14)
630 8 : if (.not.(spgroupma>=77 .and. 84 >=spgroupma) ) spgrmatch=0
631 : case(15)
632 5 : if (.not.(spgroupma>=87 .and. 91 >=spgroupma) ) spgrmatch=0
633 : case(16)
634 4 : if (.not.(spgroupma>= 3 .and. 6>=spgroupma) ) spgrmatch=0
635 : case(17)
636 7 : if (.not.(spgroupma>= 9 .and. 15 >=spgroupma) ) spgrmatch=0
637 : case(18)
638 7 : if (.not.(spgroupma>=18 .and. 24 >=spgroupma) ) spgrmatch=0
639 : case(19)
640 4 : if (.not.(spgroupma>=27 .and. 30 >=spgroupma) ) spgrmatch=0
641 : case(20)
642 5 : if (.not.(spgroupma>=33 .and. 37 >=spgroupma) ) spgrmatch=0
643 : case(21)
644 5 : if (.not.(spgroupma>=40 .and. 44 >=spgroupma) ) spgrmatch=0
645 : case(22)
646 2 : if (.not.(spgroupma>=47 .and. 48 >=spgroupma) ) spgrmatch=0
647 : case(23)
648 2 : if (.not.(spgroupma>=51 .and. 52 >=spgroupma) ) spgrmatch=0
649 : case(24)
650 2 : if (.not.(spgroupma>=55 .and. 56 >=spgroupma) ) spgrmatch=0
651 : case(25)
652 7 : if (.not.(spgroupma>=59 .and. 65 >=spgroupma) ) spgrmatch=0
653 : case(26)
654 10 : if (.not.(spgroupma>=68 .and. 77 >=spgroupma) ) spgrmatch=0
655 : case(27)
656 7 : if (.not.(spgroupma>=80 .and. 86 >=spgroupma) ) spgrmatch=0
657 : case(28)
658 10 : if (.not.(spgroupma>=89 .and. 98 >=spgroupma) ) spgrmatch=0
659 : case(29)
660 10 : if (.not.(spgroupma>=101 .and. 110 >=spgroupma) ) spgrmatch=0
661 : case(30)
662 10 : if (.not.(spgroupma>=113 .and. 122 >=spgroupma) ) spgrmatch=0
663 : case(31)
664 10 : if (.not.(spgroupma>=125 .and. 134 >=spgroupma) ) spgrmatch=0
665 : case(32)
666 7 : if (.not.(spgroupma>=137 .and. 143 >=spgroupma) ) spgrmatch=0
667 : case(33)
668 10 : if (.not.(spgroupma>=146 .and. 155 >=spgroupma) ) spgrmatch=0
669 : case(34)
670 7 : if (.not.(spgroupma>=158 .and. 164 >=spgroupma) ) spgrmatch=0
671 : case(35)
672 5 : if (.not.(spgroupma>=167 .and. 171>=spgroupma) ) spgrmatch=0
673 : case(36)
674 6 : if (.not.(spgroupma>=174 .and. 179>=spgroupma) ) spgrmatch=0
675 : case(37)
676 5 : if (.not.(spgroupma>=182 .and. 186 >=spgroupma) ) spgrmatch=0
677 : case(38)
678 6 : if (.not.(spgroupma>=189 .and. 194 >=spgroupma) ) spgrmatch=0
679 : case(39)
680 6 : if (.not.(spgroupma>=197 .and. 202 >=spgroupma) ) spgrmatch=0
681 : case(40)
682 6 : if (.not.(spgroupma>=205 .and. 210 >=spgroupma) ) spgrmatch=0
683 : case(41)
684 6 : if (.not.(spgroupma>=213 .and. 218 >=spgroupma) ) spgrmatch=0
685 : case(42)
686 3 : if (.not.(spgroupma>=221 .and. 223>=spgroupma) ) spgrmatch=0
687 : case(43)
688 3 : if (.not.(spgroupma>=226 .and. 228>=spgroupma) ) spgrmatch=0
689 : case(44)
690 4 : if (.not.(spgroupma>=231 .and. 234 >=spgroupma) ) spgrmatch=0
691 : case(45)
692 4 : if (.not.(spgroupma>=237 .and. 240 >=spgroupma) ) spgrmatch=0
693 : case(46)
694 6 : if (.not.(spgroupma>=243 .and. 248 >=spgroupma) ) spgrmatch=0
695 : case(47)
696 6 : if (.not.(spgroupma>=251 .and. 256 >=spgroupma) ) spgrmatch=0
697 : case(48)
698 6 : if (.not.(spgroupma>=259 .and. 264 >=spgroupma) ) spgrmatch=0
699 : case(49)
700 10 : if (.not.(spgroupma>=267 .and. 276 >=spgroupma) ) spgrmatch=0
701 : case(50)
702 10 : if (.not.(spgroupma>=279 .and. 288 >=spgroupma) ) spgrmatch=0
703 : case(51)
704 14 : if (.not.(spgroupma>=291 .and. 304 >=spgroupma) ) spgrmatch=0
705 : case(52)
706 14 : if (.not.(spgroupma>=307 .and. 320 >=spgroupma) ) spgrmatch=0
707 : case(53)
708 14 : if (.not.(spgroupma>=323 .and. 336 >=spgroupma) ) spgrmatch=0
709 : case(54)
710 14 : if (.not.(spgroupma>=339 .and. 352 >=spgroupma) ) spgrmatch=0
711 : case(55)
712 10 : if (.not.(spgroupma>=355 .and. 364 >=spgroupma) ) spgrmatch=0
713 : case(56)
714 10 : if (.not.(spgroupma>=367 .and. 376 >=spgroupma) ) spgrmatch=0
715 : case(57)
716 14 : if (.not.(spgroupma>=379 .and. 392 >=spgroupma) ) spgrmatch=0
717 : case(58)
718 10 : if (.not.(spgroupma>=395 .and. 404 >=spgroupma) ) spgrmatch=0
719 : case(59)
720 10 : if (.not.(spgroupma>=407 .and. 416 >=spgroupma) ) spgrmatch=0
721 : case(60)
722 14 : if (.not.(spgroupma>=419 .and. 432 >=spgroupma) ) spgrmatch=0
723 : case(61)
724 6 : if (.not.(spgroupma>=435 .and. 440 >=spgroupma) ) spgrmatch=0
725 : case(62)
726 14 : if (.not.(spgroupma>=443 .and. 456 >=spgroupma) ) spgrmatch=0
727 : case(63)
728 10 : if (.not.(spgroupma>=459 .and. 468 >=spgroupma) ) spgrmatch=0
729 : case(64)
730 10 : if (.not.(spgroupma>=471 .and. 480 >=spgroupma) ) spgrmatch=0
731 : case(65)
732 8 : if (.not.(spgroupma>=483 .and. 490 >=spgroupma) ) spgrmatch=0
733 : case(66)
734 8 : if (.not.(spgroupma>=493 .and. 500 >=spgroupma) ) spgrmatch=0
735 : case(67)
736 8 : if (.not.(spgroupma>=503 .and. 510 >=spgroupma) ) spgrmatch=0
737 : case(68)
738 8 : if (.not.(spgroupma>=513 .and. 520 >=spgroupma) ) spgrmatch=0
739 : case(69)
740 4 : if (.not.(spgroupma>=523 .and. 526 >=spgroupma) ) spgrmatch=0
741 : case(70)
742 4 : if (.not.(spgroupma>=529 .and. 532 >=spgroupma) ) spgrmatch=0
743 : case(71)
744 4 : if (.not.(spgroupma>=535 .and. 538 >=spgroupma) ) spgrmatch=0
745 : case(72)
746 7 : if (.not.(spgroupma>=541 .and. 547 >=spgroupma) ) spgrmatch=0
747 : case(73)
748 4 : if (.not.(spgroupma>=550 .and. 553 >=spgroupma) ) spgrmatch=0
749 : case(74)
750 7 : if (.not.(spgroupma>=556 .and. 562 >=spgroupma) ) spgrmatch=0
751 : case(75)
752 4 : if (.not.(spgroupma>= 3 .and. 6>=spgroupma) ) spgrmatch=0
753 : case(76)
754 4 : if (.not.(spgroupma>= 9 .and. 12 >=spgroupma) ) spgrmatch=0
755 : case(77)
756 4 : if (.not.(spgroupma>= 15 .and. 18>=spgroupma) ) spgrmatch=0
757 : case(78)
758 4 : if (.not.(spgroupma>= 21 .and. 24>=spgroupma) ) spgrmatch=0
759 : case(79)
760 2 : if (.not.(spgroupma>= 27 .and. 28 >=spgroupma) ) spgrmatch=0
761 : case(80)
762 2 : if (.not.(spgroupma>= 31 .and. 32 >=spgroupma) ) spgrmatch=0
763 : case(81)
764 4 : if (.not.(spgroupma>= 35 .and. 38 >=spgroupma) ) spgrmatch=0
765 : case(82)
766 2 : if (.not.(spgroupma>= 41 .and. 42 >=spgroupma) ) spgrmatch=0
767 : case(83)
768 6 : if (.not.(spgroupma>=45 .and. 50>=spgroupma) ) spgrmatch=0
769 : case(84)
770 6 : if (.not.(spgroupma>=53 .and. 58>=spgroupma) ) spgrmatch=0
771 : case(85)
772 6 : if (.not.(spgroupma>=61 .and. 66>=spgroupma) ) spgrmatch=0
773 : case(86)
774 6 : if (.not.(spgroupma>=69 .and. 74>=spgroupma) ) spgrmatch=0
775 : case(87)
776 4 : if (.not.(spgroupma>=77 .and. 80>=spgroupma) ) spgrmatch=0
777 : case(88)
778 4 : if (.not.(spgroupma>=83 .and. 86>=spgroupma) ) spgrmatch=0
779 : case(89)
780 6 : if (.not.(spgroupma>=89 .and. 94>=spgroupma) ) spgrmatch=0
781 : case(90)
782 6 : if (.not.(spgroupma>=97 .and. 102>=spgroupma) ) spgrmatch=0
783 : case(91)
784 6 : if (.not.(spgroupma>=105 .and. 110>=spgroupma) ) spgrmatch=0
785 : case(92)
786 6 : if (.not.(spgroupma>=113 .and. 118>=spgroupma) ) spgrmatch=0
787 : case(93)
788 6 : if (.not.(spgroupma>=121 .and. 126>=spgroupma) ) spgrmatch=0
789 : case(94)
790 6 : if (.not.(spgroupma>=129 .and. 134>=spgroupma) ) spgrmatch=0
791 : case(95)
792 6 : if (.not.(spgroupma>=137 .and. 142>=spgroupma) ) spgrmatch=0
793 : case(96)
794 6 : if (.not.(spgroupma>=145 .and. 150>=spgroupma) ) spgrmatch=0
795 : case(97)
796 4 : if (.not.(spgroupma>=153 .and. 156>=spgroupma) ) spgrmatch=0
797 : case(98)
798 4 : if (.not.(spgroupma>=159 .and. 162>=spgroupma) ) spgrmatch=0
799 : case(99)
800 6 : if (.not.(spgroupma>=165 .and. 170>=spgroupma) ) spgrmatch=0
801 : case(100)
802 6 : if (.not.(spgroupma>=173 .and. 178>=spgroupma) ) spgrmatch=0
803 : case(101)
804 6 : if (.not.(spgroupma>=181 .and. 186>=spgroupma) ) spgrmatch=0
805 : case(102)
806 6 : if (.not.(spgroupma>=189 .and. 194>=spgroupma) ) spgrmatch=0
807 : case(103)
808 6 : if (.not.(spgroupma>=197 .and. 202>=spgroupma) ) spgrmatch=0
809 : case(104)
810 6 : if (.not.(spgroupma>=205 .and. 210>=spgroupma) ) spgrmatch=0
811 : case(105)
812 6 : if (.not.(spgroupma>=213 .and. 218>=spgroupma) ) spgrmatch=0
813 : case(106)
814 6 : if (.not.(spgroupma>=221 .and. 226>=spgroupma) ) spgrmatch=0
815 : case(107)
816 4 : if (.not.(spgroupma>=229 .and. 232>=spgroupma) ) spgrmatch=0
817 : case(108)
818 4 : if (.not.(spgroupma>=235 .and. 238>=spgroupma) ) spgrmatch=0
819 : case(109)
820 4 : if (.not.(spgroupma>=241 .and. 244>=spgroupma) ) spgrmatch=0
821 : case(110)
822 4 : if (.not.(spgroupma>=247 .and. 250>=spgroupma) ) spgrmatch=0
823 : case(111)
824 6 : if (.not.(spgroupma>=253 .and. 258>=spgroupma) ) spgrmatch=0
825 : case(112)
826 6 : if (.not.(spgroupma>=261 .and. 266>=spgroupma) ) spgrmatch=0
827 : case(113)
828 6 : if (.not.(spgroupma>=269 .and. 274>=spgroupma) ) spgrmatch=0
829 : case(114)
830 6 : if (.not.(spgroupma>=277 .and. 282>=spgroupma) ) spgrmatch=0
831 : case(115)
832 6 : if (.not.(spgroupma>=285 .and. 290>=spgroupma) ) spgrmatch=0
833 : case(116)
834 6 : if (.not.(spgroupma>=293 .and. 298>=spgroupma) ) spgrmatch=0
835 : case(117)
836 6 : if (.not.(spgroupma>=301 .and. 306>=spgroupma) ) spgrmatch=0
837 : case(118)
838 6 : if (.not.(spgroupma>=309 .and. 314>=spgroupma) ) spgrmatch=0
839 : case(119)
840 4 : if (.not.(spgroupma>=317 .and. 320>=spgroupma) ) spgrmatch=0
841 : case(120)
842 4 : if (.not.(spgroupma>=323 .and. 326>=spgroupma) ) spgrmatch=0
843 : case(121)
844 4 : if (.not.(spgroupma>=329 .and. 332>=spgroupma) ) spgrmatch=0
845 : case(122)
846 4 : if (.not.(spgroupma>=335 .and. 338>=spgroupma) ) spgrmatch=0
847 : case(123)
848 10 : if (.not.(spgroupma>=341 .and. 350>=spgroupma) ) spgrmatch=0
849 : case(124)
850 10 : if (.not.(spgroupma>=353 .and. 362>=spgroupma) ) spgrmatch=0
851 : case(125)
852 10 : if (.not.(spgroupma>=365 .and. 374>=spgroupma) ) spgrmatch=0
853 : case(126)
854 10 : if (.not.(spgroupma>=377 .and. 386>=spgroupma) ) spgrmatch=0
855 : case(127)
856 10 : if (.not.(spgroupma>=389 .and. 398>=spgroupma) ) spgrmatch=0
857 : case(128)
858 10 : if (.not.(spgroupma>=401 .and. 410>=spgroupma) ) spgrmatch=0
859 : case(129)
860 10 : if (.not.(spgroupma>=413 .and. 422>=spgroupma) ) spgrmatch=0
861 : case(130)
862 10 : if (.not.(spgroupma>=425 .and. 434>=spgroupma) ) spgrmatch=0
863 : case(131)
864 10 : if (.not.(spgroupma>=437 .and. 446>=spgroupma) ) spgrmatch=0
865 : case(132)
866 10 : if (.not.(spgroupma>=449 .and. 458>=spgroupma) ) spgrmatch=0
867 : case(133)
868 10 : if (.not.(spgroupma>=461 .and. 470>=spgroupma) ) spgrmatch=0
869 : case(134)
870 10 : if (.not.(spgroupma>=473 .and. 482>=spgroupma) ) spgrmatch=0
871 : case(135)
872 10 : if (.not.(spgroupma>=485 .and. 494>=spgroupma) ) spgrmatch=0
873 : case(136)
874 10 : if (.not.(spgroupma>=497 .and. 506>=spgroupma) ) spgrmatch=0
875 : case(137)
876 10 : if (.not.(spgroupma>=509 .and. 518>=spgroupma) ) spgrmatch=0
877 : case(138)
878 10 : if (.not.(spgroupma>=521 .and. 530>=spgroupma) ) spgrmatch=0
879 : case(139)
880 8 : if (.not.(spgroupma>=533 .and. 540>=spgroupma) ) spgrmatch=0
881 : case(140)
882 8 : if (.not.(spgroupma>=543 .and. 550>=spgroupma) ) spgrmatch=0
883 : case(141)
884 8 : if (.not.(spgroupma>=553 .and. 560>=spgroupma) ) spgrmatch=0
885 : case(142)
886 8 : if (.not.(spgroupma>=563 .and. 570>=spgroupma) ) spgrmatch=0
887 : case(143)
888 1 : if (.not.(spgroupma>=3 .and. 3>=spgroupma) ) spgrmatch=0
889 : case(144)
890 1 : if (.not.(spgroupma>=6 .and. 6>=spgroupma) ) spgrmatch=0
891 : case(145)
892 1 : if (.not.(spgroupma>=9 .and. 9>=spgroupma) ) spgrmatch=0
893 : case(146)
894 1 : if (.not.(spgroupma>=12 .and. 12>=spgroupma) ) spgrmatch=0
895 : case(147)
896 2 : if (.not.(spgroupma>=15 .and. 16>=spgroupma) ) spgrmatch=0
897 : case(148)
898 2 : if (.not.(spgroupma>=19 .and. 20>=spgroupma) ) spgrmatch=0
899 : case(149)
900 2 : if (.not.(spgroupma>=23 .and. 24>=spgroupma) ) spgrmatch=0
901 : case(150)
902 2 : if (.not.(spgroupma>=27 .and. 28>=spgroupma) ) spgrmatch=0
903 : case(151)
904 2 : if (.not.(spgroupma>=31 .and. 32>=spgroupma) ) spgrmatch=0
905 : case(152)
906 2 : if (.not.(spgroupma>=35 .and. 36>=spgroupma) ) spgrmatch=0
907 : case(153)
908 2 : if (.not.(spgroupma>=39 .and. 40>=spgroupma) ) spgrmatch=0
909 : case(154)
910 2 : if (.not.(spgroupma>=43 .and. 44>=spgroupma) ) spgrmatch=0
911 : case(155)
912 2 : if (.not.(spgroupma>=47 .and. 48>=spgroupma) ) spgrmatch=0
913 : case(156)
914 2 : if (.not.(spgroupma>=51 .and. 52>=spgroupma) ) spgrmatch=0
915 : case(157)
916 2 : if (.not.(spgroupma>=55 .and. 56>=spgroupma) ) spgrmatch=0
917 : case(158)
918 2 : if (.not.(spgroupma>=59 .and. 60>=spgroupma) ) spgrmatch=0
919 : case(159)
920 2 : if (.not.(spgroupma>=63 .and. 64>=spgroupma) ) spgrmatch=0
921 : case(160)
922 2 : if (.not.(spgroupma>=67 .and. 68>=spgroupma) ) spgrmatch=0
923 : case(161)
924 2 : if (.not.(spgroupma>=71 .and. 72>=spgroupma) ) spgrmatch=0
925 : case(162)
926 4 : if (.not.(spgroupma>=75 .and. 78>=spgroupma) ) spgrmatch=0
927 : case(163)
928 4 : if (.not.(spgroupma>=81 .and. 84>=spgroupma) ) spgrmatch=0
929 : case(164)
930 4 : if (.not.(spgroupma>=87 .and. 90>=spgroupma) ) spgrmatch=0
931 : case(165)
932 4 : if (.not.(spgroupma>=93 .and. 96>=spgroupma) ) spgrmatch=0
933 : case(166)
934 5 : if (.not.(spgroupma>=99 .and. 102>=spgroupma) ) spgrmatch=0
935 : case(167)
936 4 : if (.not.(spgroupma>=105 .and. 108>=spgroupma) ) spgrmatch=0
937 : case(168)
938 2 : if (.not.(spgroupma>=111 .and. 112>=spgroupma) ) spgrmatch=0
939 : case(169)
940 2 : if (.not.(spgroupma>=115 .and. 116>=spgroupma) ) spgrmatch=0
941 : case(170)
942 2 : if (.not.(spgroupma>=119 .and. 120>=spgroupma) ) spgrmatch=0
943 : case(171)
944 2 : if (.not.(spgroupma>=123 .and. 124>=spgroupma) ) spgrmatch=0
945 : case(172)
946 2 : if (.not.(spgroupma>=127 .and. 128>=spgroupma) ) spgrmatch=0
947 : case(173)
948 2 : if (.not.(spgroupma>=131 .and. 132>=spgroupma) ) spgrmatch=0
949 : case(174)
950 2 : if (.not.(spgroupma>=135 .and. 136>=spgroupma) ) spgrmatch=0
951 : case(175)
952 4 : if (.not.(spgroupma>=139 .and. 142>=spgroupma) ) spgrmatch=0
953 : case(176)
954 4 : if (.not.(spgroupma>=145 .and. 148>=spgroupma) ) spgrmatch=0
955 : case(177)
956 4 : if (.not.(spgroupma>=151 .and. 154>=spgroupma) ) spgrmatch=0
957 : case(178)
958 4 : if (.not.(spgroupma>=157 .and. 160>=spgroupma) ) spgrmatch=0
959 : case(179)
960 4 : if (.not.(spgroupma>=163 .and. 166>=spgroupma) ) spgrmatch=0
961 : case(180)
962 4 : if (.not.(spgroupma>=169 .and. 172>=spgroupma) ) spgrmatch=0
963 : case(181)
964 4 : if (.not.(spgroupma>=175 .and. 178>=spgroupma) ) spgrmatch=0
965 : case(182)
966 4 : if (.not.(spgroupma>=181 .and. 184>=spgroupma) ) spgrmatch=0
967 : case(183)
968 4 : if (.not.(spgroupma>=187 .and. 190>=spgroupma) ) spgrmatch=0
969 : case(184)
970 4 : if (.not.(spgroupma>=193 .and. 196>=spgroupma) ) spgrmatch=0
971 : case(185)
972 4 : if (.not.(spgroupma>=199 .and. 202>=spgroupma) ) spgrmatch=0
973 : case(186)
974 4 : if (.not.(spgroupma>=205 .and. 208>=spgroupma) ) spgrmatch=0
975 : case(187)
976 4 : if (.not.(spgroupma>=211 .and. 214>=spgroupma) ) spgrmatch=0
977 : case(188)
978 4 : if (.not.(spgroupma>=217 .and. 220>=spgroupma) ) spgrmatch=0
979 : case(189)
980 4 : if (.not.(spgroupma>=223 .and. 226>=spgroupma) ) spgrmatch=0
981 : case(190)
982 4 : if (.not.(spgroupma>=229 .and. 232>=spgroupma) ) spgrmatch=0
983 : case(191)
984 8 : if (.not.(spgroupma>=235 .and. 242>=spgroupma) ) spgrmatch=0
985 : case(192)
986 8 : if (.not.(spgroupma>=245 .and. 252>=spgroupma) ) spgrmatch=0
987 : case(193)
988 8 : if (.not.(spgroupma>=255 .and. 262>=spgroupma) ) spgrmatch=0
989 : case(194)
990 8 : if (.not.(spgroupma>=265 .and. 272>=spgroupma) ) spgrmatch=0
991 : case(195)
992 1 : if (.not.(spgroupma>=3 .and. 3>=spgroupma) ) spgrmatch=0
993 : case(196)
994 1 : if (.not.(spgroupma>=6 .and. 6>=spgroupma) ) spgrmatch=0
995 : case(197)
996 0 : spgrmatch=0
997 : case(198)
998 1 : if (.not.(spgroupma>=11 .and. 11>=spgroupma) ) spgrmatch=0
999 : case(199)
1000 0 : spgrmatch=0
1001 : case(200)
1002 2 : if (.not.(spgroupma>=16 .and. 17>=spgroupma) ) spgrmatch=0
1003 : case(201)
1004 2 : if (.not.(spgroupma>=20 .and. 21>=spgroupma) ) spgrmatch=0
1005 : case(202)
1006 2 : if (.not.(spgroupma>=24 .and. 25>=spgroupma) ) spgrmatch=0
1007 : case(203)
1008 2 : if (.not.(spgroupma>=28 .and. 29>=spgroupma) ) spgrmatch=0
1009 : case(204)
1010 1 : if (.not.(spgroupma>=32 .and. 32>=spgroupma) ) spgrmatch=0
1011 : case(205)
1012 2 : if (.not.(spgroupma>=35 .and. 36>=spgroupma) ) spgrmatch=0
1013 : case(206)
1014 1 : if (.not.(spgroupma>=39 .and. 39>=spgroupma) ) spgrmatch=0
1015 : case(207)
1016 2 : if (.not.(spgroupma>=42 .and. 43>=spgroupma) ) spgrmatch=0
1017 : case(208)
1018 2 : if (.not.(spgroupma>=46 .and. 47>=spgroupma) ) spgrmatch=0
1019 : case(209)
1020 2 : if (.not.(spgroupma>=50 .and. 51>=spgroupma) ) spgrmatch=0
1021 : case(210)
1022 2 : if (.not.(spgroupma>=54 .and. 55>=spgroupma) ) spgrmatch=0
1023 : case(211)
1024 1 : if (.not.(spgroupma>=58 .and. 58>=spgroupma) ) spgrmatch=0
1025 : case(212)
1026 2 : if (.not.(spgroupma>=61 .and. 62>=spgroupma) ) spgrmatch=0
1027 : case(213)
1028 2 : if (.not.(spgroupma>=65 .and. 66>=spgroupma) ) spgrmatch=0
1029 : case(214)
1030 1 : if (.not.(spgroupma>=69 .and. 69>=spgroupma) ) spgrmatch=0
1031 : case(215)
1032 2 : if (.not.(spgroupma>=72 .and. 73>=spgroupma) ) spgrmatch=0
1033 : case(216)
1034 2 : if (.not.(spgroupma>=76 .and. 77>=spgroupma) ) spgrmatch=0
1035 : case(217)
1036 1 : if (.not.(spgroupma>=80 .and. 80>=spgroupma) ) spgrmatch=0
1037 : case(218)
1038 2 : if (.not.(spgroupma>=83 .and. 84>=spgroupma) ) spgrmatch=0
1039 : case(219)
1040 2 : if (.not.(spgroupma>=87 .and. 88>=spgroupma) ) spgrmatch=0
1041 : case(220)
1042 1 : if (.not.(spgroupma>=91 .and. 91>=spgroupma) ) spgrmatch=0
1043 : case(221)
1044 4 : if (.not.(spgroupma>=94 .and. 97>=spgroupma) ) spgrmatch=0
1045 : case(222)
1046 4 : if (.not.(spgroupma>=100 .and. 103>=spgroupma) ) spgrmatch=0
1047 : case(223)
1048 4 : if (.not.(spgroupma>=106 .and. 109>=spgroupma) ) spgrmatch=0
1049 : case(224)
1050 4 : if (.not.(spgroupma>=112 .and. 115>=spgroupma) ) spgrmatch=0
1051 : case(225)
1052 4 : if (.not.(spgroupma>=118 .and. 121>=spgroupma) ) spgrmatch=0
1053 : case(226)
1054 4 : if (.not.(spgroupma>=124 .and. 127>=spgroupma) ) spgrmatch=0
1055 : case(227)
1056 4 : if (.not.(spgroupma>=130 .and. 133>=spgroupma) ) spgrmatch=0
1057 : case(228)
1058 4 : if (.not.(spgroupma>=136 .and. 139>=spgroupma) ) spgrmatch=0
1059 : case(229)
1060 3 : if (.not.(spgroupma>=142 .and. 144>=spgroupma) ) spgrmatch=0
1061 : case(230)
1062 3 : if (.not.(spgroupma>=147 .and. 149>=spgroupma) ) spgrmatch=0
1063 : case default
1064 : write(message, '(3a,i8,4a)' )&
1065 0 : & 'The non-magnetic spacegroup is not specified ',ch10,&
1066 0 : & 'while the magnetic space group is specified, spgroupma= ',spgroupma,ch10,&
1067 0 : & 'This is not allowed. ',ch10,&
1068 0 : & 'Action: specify spgroup in the input file.'
1069 1192 : ABI_ERROR(message)
1070 : end select
1071 :
1072 1192 : if (spgrmatch==0) then
1073 : write(message, '(a,i8,a,a,i8,4a)' )&
1074 0 : & 'mismatch between the non-magnetic spacegroup ',spgroup,ch10,&
1075 0 : & 'and the magnetic space group ',spgroupma,ch10,&
1076 0 : & 'This is not allowed. ',ch10,&
1077 0 : & 'Action: modify spgroup or spgroupma in the input file.'
1078 0 : ABI_ERROR(message)
1079 : end if
1080 :
1081 : !DEBUG
1082 : !write(std_out,*) ' gensymshub, after check the spgroup ... '
1083 : !ENDDEBUG
1084 :
1085 : !Assign the magnetic Bravais lattice type from the magnetic space group number
1086 : !As the magnetic space group number begins with 1 for EACH crystal system
1087 : !we must first make our choice as a function of spgroup
1088 :
1089 : !Convention :
1090 : !brvlttbw = input variable giving Bravais black-and-white translation
1091 : !(from 1 to 8 : Shubnikov type IV space group)
1092 : !1,2,3 = 1/2 translation along a, b, or c respectively
1093 : !4,5,6 = translation corresponding to A,B,C centering, respectively
1094 : !7 = I centering
1095 : !8 = (1/2 0 0) centering corresponding to normal F lattice
1096 : !9 -> Shubnikov type III space group
1097 : !Note that the use of the table 7.3 (p585) of Bradney and Cracknell
1098 : !for the definition of the translation vectors
1099 : !is extremely confusing, due to the strange choice of basis
1100 : !vectors of table 3.1.
1101 : !See table 7.4 (p588) for the spgroupma interpretation
1102 :
1103 3 : select case(spgroup)
1104 : case(1,2) !Triclinic
1105 69 : select case(spgroupma)
1106 : case(6)
1107 1 : brvlttbw=9 !ShubIII
1108 : case(3,7)
1109 3 : brvlttbw=1 !Ps (note that it is not body centered, according to Table
1110 : ! 7.3 of Bradley and Cracknell)
1111 : end select
1112 : case(3:15) !Monoclinic
1113 534 : select case(spgroupma)
1114 : case(3,9,15,20,26,34,39,44:46,52:54,60:62,67:69,77:79,87:89)
1115 25 : brvlttbw=9 !ShubIII
1116 : case(4,10,17,21,27,36,41,47,55,64,70,80,91)
1117 13 : brvlttbw=1 !a
1118 : case(5,11,22,29,48,56,71,81)
1119 8 : brvlttbw=2 !b
1120 : case(16,28,35,40,63,72,82,90)
1121 8 : brvlttbw=3 !c
1122 : case(31,73,83)
1123 3 : brvlttbw=4 !A
1124 : case(6,12,23,30,49,57,74,84)
1125 65 : brvlttbw=6 !C
1126 : end select
1127 : case(16:74) !Orthorhombic
1128 1091 : select case(spgroupma)
1129 : case(3,9,10,18,19,27,33,34,40,41,47,51,55,59,60,68:70,&
1130 : & 80,81,89:91,101:103,113:115,125:127,137,138,146:148,158,159,&
1131 : & 167,168,174:176,182,183,189:191,197:199,205:207,213:215,221,&
1132 : & 222,226,227,231,232,237,238,243:245,251:253,259:261,267:271,&
1133 : & 279:283,291:297,307:313,323:329,339:345,355:359,367:371,&
1134 : & 379:385,395:399,407:411,419:425,435:437,443:449,459:465,&
1135 : & 471:477,483:487,493:497,503:507,513:517,523:525,529:531,&
1136 : & 535:537,541:545,550:552,556:560)
1137 213 : brvlttbw=9 !ShubIII
1138 : case(4,11,20,28,36,43,62,71,83,92,104,116,128,140,&
1139 : & 149,160,170,178,185,192,200,208,216,234,240,247,254,262,272,&
1140 : & 284,298,314,330,346,360,372,386,400,412,426,438,450,467,&
1141 : & 479,489,499,509,519,547,562)
1142 50 : brvlttbw=1 !a
1143 : case(72,93,105,117,129,150,248,299,315,331,347,387,427,451)
1144 14 : brvlttbw=2 !b
1145 : case(12,21,35,42,52,56,61,73,82,94,106,118,130,139,&
1146 : & 151,161,169,177,184,193,201,209,217,233,239,246,273,285,300,&
1147 : & 316,332,348,361,373,388,401,413,428,452,466,478,488,498,&
1148 : & 508,518,538,546,553,561)
1149 49 : brvlttbw=3 !c
1150 : case(13,22,37,44,64,74,85,95,107,119,131,142,152,162,&
1151 : & 171,179,186,274,286,301,317,333,349,362,374,389,402,414,429,&
1152 : & 453,468,480,490,500,510,520)
1153 36 : brvlttbw=4 !A
1154 : case(75,96,108,120,132,153,302,318,334,350,390,430,454)
1155 13 : brvlttbw=5 !B
1156 : case(5,14,23,29,63,76,84,97,109,121,133,141,154,163,&
1157 : & 194,202,210,218,255,263,275,287,303,319,335,351,363,375,&
1158 : & 391,403,415,431,439,455)
1159 34 : brvlttbw=6 !C
1160 : case(6,15,24,30,65,77,86,98,110,122,134,143,155,164,256,&
1161 : & 264,276,288,304,320,336,352,364,376,392,404,416,432,440,456)
1162 30 : brvlttbw=7 !I
1163 : case(48,223,228,526,532)
1164 444 : brvlttbw=8 !s
1165 : end select
1166 : case(75:142) !Tetragonal
1167 871 : select case(spgroupma)
1168 : case(3,9,15,21,27,31,35,41,45:47,53:55,61:63,69:71,&
1169 : & 77:79,83:85,89:91,97:99,105:107,113:115,121:123,129:131,&
1170 : & 137:139,145:147,153:155,159:161,165:167,173:175,181:183,&
1171 : & 189:191,197:199,205:207,213:215,221:223,229:231,235:237,&
1172 : & 241:243,247:249,253:255,261:263,269:271,277:279,285:287,&
1173 : & 293:295,301:303,309:311,317:319,323:325,329:331,335:337,&
1174 : & 341:347,353:359,365:371,377:383,389:395,401:407,413:419,&
1175 : & 425:431,437:443,449:455,461:467,473:479,485:491,497:503,&
1176 : & 509:515,521:527,533:539,543:549,553:559,563:569)
1177 268 : brvlttbw=9 !ShubIII
1178 : case(4,10,16,22,28,32,36,42,48,56,64,72,80,86,92,100,&
1179 : & 108,116,124,132,140,148,156,162,168,176,184,192,200,208,&
1180 : & 216,224,232,238,244,250,256,264,272,280,288,296,304,312,&
1181 : & 320,326,332,338,348,360,372,384,396,408,420,432,444,456,&
1182 : & 468,480,492,504,516,528,540,550,560,570)
1183 68 : brvlttbw=3 !c
1184 : case(5,11,17,23,37,49,57,65,73,93,101,109,117,125,133,141,&
1185 : & 149,169,177,185,193,201,209,217,225,257,265,273,281,289,297,&
1186 : & 305,313,349,361,373,385,397,409,421,433,445,457,469,481,493,&
1187 : & 505,517,529)
1188 49 : brvlttbw=6 !C
1189 : case(6,12,18,24,38,50,58,66,74,94,102,110,118,126,134,142,&
1190 : & 150,170,178,186,194,202,210,218,226,258,266,274,282,290,298,&
1191 : & 306,314,350,362,374,386,398,410,422,434,446,458,470,482,494,&
1192 : & 506,518,530)
1193 434 : brvlttbw=7 !I
1194 : end select
1195 : case(143:194) !Hexagonal
1196 362 : select case(spgroupma)
1197 : case(15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,&
1198 : & 75:77,81:83,87:89,93:95,99:101,105:107,111,115,119,123,127,&
1199 : & 131,135,139:141,145:147,151:153,157:159,163:165,169:171,&
1200 : & 175:177,181:183,187:189,193:195,199:201,205:207,211:213,&
1201 : & 217:219,223:225,229:231,235:241,245:251,255:261,265:271)
1202 116 : brvlttbw=9 !ShubIII
1203 : case(3,6,9,16,24,28,32,36,40,44,52,56,60,64,78,84,&
1204 : & 90,96,112,116,120,124,128,132,136,142,148,154,160,166,172,&
1205 : & 178,184,190,196,202,208,214,220,226,232,242,252,262,272)
1206 : ! brvlttbw=6 !C XG230719 This is likely erroneous
1207 45 : brvlttbw=3 !c
1208 : case(12,20,48,68,72,102,108)
1209 169 : brvlttbw=7 !I
1210 : end select
1211 : case(195:230) !Cubic
1212 1192 : select case(spgroupma)
1213 : case(16,20,24,28,32,35,39,42,46,50,54,58,61,65,69,&
1214 : & 72,76,80,83,87,91,94:96,100:102,106:108,112:114,118:120,&
1215 : & 124:126,130:132,136:138,142:144,147:149)
1216 51 : brvlttbw=9 !ShubIII
1217 : case(3,11,17,21,36,43,47,62,66,73,84,97,103,109,115)
1218 15 : brvlttbw=7 !I
1219 : case(6,25,29,51,55,77,88,121,127,133,139)
1220 77 : brvlttbw=8 !s
1221 : end select
1222 : end select
1223 :
1224 1192 : if(brvlttbw==9)shubnikov=3 !Shubnikov type III
1225 1192 : if(brvlttbw>=1 .and. brvlttbw<=8) shubnikov=4 !Shubnikov type IV
1226 :
1227 1192 : genafm(:)=zero
1228 1192 : if(shubnikov==4)then
1229 518 : if(brvlttbw==1)genafm(1)=half
1230 518 : if(brvlttbw==2)genafm(2)=half
1231 518 : if(brvlttbw==3)genafm(3)=half
1232 518 : if(brvlttbw>=4 .and. brvlttbw<=8)then
1233 1044 : genafm(:)=half
1234 261 : if(brvlttbw==4)genafm(1)=zero
1235 261 : if(brvlttbw==5)genafm(2)=zero
1236 261 : if(brvlttbw==6)genafm(3)=zero
1237 : end if
1238 : end if
1239 :
1240 : !DEBUG
1241 : !write(std_out,*) 'gensymshub : end '
1242 : !write(std_out,*) 'gensymshub : brvlttbw=',brvlttbw
1243 : !write(std_out,*) 'gensymshub : genafm=',genafm
1244 : !write(std_out,*) 'gensymshub, shubnikov =',shubnikov
1245 : !ENDDEBUG
1246 :
1247 1192 : end subroutine gensymshub
1248 : !!***
1249 :
1250 : !!****f* m_spgbuilder/gensymshub4
1251 : !! NAME
1252 : !! gensymshub4
1253 : !!
1254 : !! FUNCTION
1255 : !! Assigns the Bravais magnetic translations for shubnikov type IV
1256 : !! symmetry groups starting from the Fedorov space group
1257 : !! and the translation, generator of the anti-ferromagnetic
1258 : !! operations (as input). It will double nsym and tnons. In the end both
1259 : !! symrel and tnons are completely determined.
1260 : !!
1261 : !! INPUTS
1262 : !! genafm(3) = translation, generator of the anti-ferromagnetic symmatry operations
1263 : !! msym = maximum number of symmetry operations
1264 : !!
1265 : !! OUTPUT
1266 : !! symafm(msym)= (anti)ferromagnetic part of symmetry operations
1267 : !!
1268 : !! SIDE EFFECTS
1269 : !! nsym=number of symmetry operations, without magnetic operations at input,
1270 : !! and with magnetic operations at output
1271 : !! symrel(3,3,msym)=symmetry operations in real space in terms
1272 : !! of primitive translations, without magnetic operations at input,
1273 : !! and with magnetic operations at output
1274 : !! tnons(3,msym)=nonsymmorphic translations for symmetry operations
1275 : !! without magnetic operations at input,
1276 : !! and with magnetic operations at output
1277 : !!
1278 : !! SOURCE
1279 :
1280 519 : subroutine gensymshub4(genafm,msym,nsym,symafm,symrel,tnons)
1281 :
1282 : !Arguments ------------------------------------
1283 : !scalars
1284 : integer,intent(in) :: msym
1285 : integer,intent(inout) :: nsym
1286 : !arrays
1287 : integer,intent(inout) :: symafm(msym),symrel(3,3,msym)
1288 : real(dp),intent(in) :: genafm(3)
1289 : real(dp),intent(inout) :: tnons(3,msym)
1290 :
1291 : !Local variables ------------------------------
1292 : !scalars
1293 : integer :: ii
1294 : character(len=500) :: message
1295 : ! *************************************************************************
1296 :
1297 519 : if(msym<2*nsym)then
1298 : write(message, '(3a)' )&
1299 0 : 'The number of symmetries in the Shubnikov type IV space group',ch10,&
1300 0 : 'is larger than the maximal allowed number of symmetries.'
1301 0 : ABI_ERROR(message)
1302 : end if
1303 :
1304 6666 : do ii=1,nsym
1305 24588 : tnons(:,nsym+ii)=tnons(:,ii)+genafm(:)
1306 79911 : symrel(:,:,nsym+ii)=symrel(:,:,ii)
1307 6147 : symafm(ii)=1
1308 6666 : symafm(nsym+ii)=-1
1309 : end do
1310 519 : nsym=nsym*2
1311 :
1312 519 : end subroutine gensymshub4
1313 : !!***
1314 :
1315 : end module m_spgbuilder
1316 : !!***
|