LCOV - code coverage report
Current view: top level - src - kpsym.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 0.0 % 1068 0
Test Date: 2025-07-25 12:55:17 Functions: 0.0 % 18 0

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief K-points and crystal symmetry routines based on
      10              : !     K290 code:
      11              : !     Written on September 12th, 1979.
      12              : !     IBM-retouched on October 27th, 1980.
      13              : !     Generation of special points modified on 26-May-82 by ohn.
      14              : !     Retouched on January 8th, 1997
      15              : !     Integration in CPMD-FEMD Program by Thierry Deutsch
      16              : !     ==--------------------------------------------------------------==
      17              : !     Playing with special points and creation of 'CRYSTALLOGRAPHIC'
      18              : !     File for band structure calculations.
      19              : !     Generation of special points in k-space for an arbitrary lattice,
      20              : !     Following the method Monkhorst,Pack, Phys. Rev. B13 (1976) 5188
      21              : !     Modified by Macdonald, Phys. Rev. B18 (1978) 5897
      22              : !     Modified also by Ole Holm Nielsen ("SYMMETRIZATION")
      23              : !     ==--------------------------------------------------------------==
      24              : !     (GROUP1, PGL1, ATFTM1, ROT1 FROM THE
      25              : !      "COMPUTER PHYSICS COMMUNICATIONS" PACKAGE "ACMI" - (1971,1974)
      26              : !      Worlton-Warren).
      27              : ! **************************************************************************************************
      28              : MODULE kpsym
      29              : 
      30              :    USE kinds,                           ONLY: dp
      31              :    USE mathlib,                         ONLY: invmat
      32              :    USE string_utilities,                ONLY: xstring
      33              : #include "./base/base_uses.f90"
      34              : 
      35              :    IMPLICIT NONE
      36              :    PRIVATE
      37              : 
      38              :    PUBLIC  :: K290s, GROUP1s
      39              : 
      40              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpsym'
      41              : 
      42              : ! **************************************************************************************************
      43              : 
      44              : CONTAINS
      45              : 
      46              : ! **************************************************************************************************
      47              : !> \brief ...
      48              : !> \param iout ...
      49              : !> \param nat ...
      50              : !> \param nkpoint ...
      51              : !> \param nsp ...
      52              : !> \param iq1 ...
      53              : !> \param iq2 ...
      54              : !> \param iq3 ...
      55              : !> \param istriz ...
      56              : !> \param a1 ...
      57              : !> \param a2 ...
      58              : !> \param a3 ...
      59              : !> \param alat ...
      60              : !> \param strain ...
      61              : !> \param xkapa ...
      62              : !> \param rx ...
      63              : !> \param tvec ...
      64              : !> \param ty ...
      65              : !> \param isc ...
      66              : !> \param f0 ...
      67              : !> \param ntvec ...
      68              : !> \param wvk0 ...
      69              : !> \param wvkl ...
      70              : !> \param lwght ...
      71              : !> \param lrot ...
      72              : !> \param nhash ...
      73              : !> \param includ ...
      74              : !> \param list ...
      75              : !> \param rlist ...
      76              : !> \param delta ...
      77              : ! **************************************************************************************************
      78            0 :    SUBROUTINE k290s(iout, nat, nkpoint, nsp, iq1, iq2, iq3, istriz, &
      79            0 :                     a1, a2, a3, alat, strain, xkapa, rx, tvec, &
      80            0 :                     ty, isc, f0, ntvec, wvk0, wvkl, lwght, lrot, &
      81            0 :                     nhash, includ, list, rlist, delta)
      82              :       ! ==================================================================
      83              :       ! WRITTEN ON SEPTEMBER 12TH, 1979.
      84              :       ! IBM-RETOUCHED ON OCTOBER 27TH, 1980.
      85              :       ! Tsukuba-retouched on March 19th, 2008.
      86              :       ! GENERATION OF SPECIAL POINTS MODIFIED ON 26-MAY-82 BY OHN.
      87              :       ! RETOUCHED ON JANUARY 8TH, 1997
      88              :       ! INTEGRATION IN CPMD-FEMD PROGRAM BY THIERRY DEUTSCH
      89              :       ! ==--------------------------------------------------------------==
      90              :       ! PLAYING WITH SPECIAL POINTS AND CREATION OF 'CRYSTALLOGRAPHIC'
      91              :       ! FILE FOR BAND STRUCTURE CALCULATIONS.
      92              :       ! GENERATION OF SPECIAL POINTS IN K-SPACE FOR AN ARBITRARY LATTICE,
      93              :       ! FOLLOWING THE METHOD MONKHORST,PACK, PHYS. REV. B13 (1976) 5188
      94              :       ! MODIFIED BY MACDONALD, PHYS. REV. B18 (1978) 5897
      95              :       ! MODIFIED ALSO BY OLE HOLM NIELSEN ("SYMMETRIZATION")
      96              :       ! ==--------------------------------------------------------------==
      97              :       ! TESTING THEIR EFFICIENCY AND PREPARATION OF THE
      98              :       ! "STRUCTURAL" FILE FOR RUNNING THE
      99              :       ! SELF-CONSISTENT BAND STRUCTURE PROGRAMS.
     100              :       ! IN THE CASES WHERE THE POINT GROUP OF THE CRYSTAL DOES NOT
     101              :       ! CONTAIN INVERSION, THE LATTER IS ARTIFICIALLY ADDED, IN ORDER
     102              :       ! TO MAKE USE OF THE HERMITICITY OF THE HAMILTONIAN
     103              :       ! ==--------------------------------------------------------------==
     104              :       ! == INPUT:                                                       ==
     105              :       ! ==   IOUT    LOGIC FILE NUMBER                                  ==
     106              :       ! ==   NAT     NUMBER OF ATOMS                                    ==
     107              :       ! ==   NKPOINT MAXIMAL NUMBER OF K POINTS                         ==
     108              :       ! ==   NSP     NUMBER OF SPECIES                                  ==
     109              :       ! ==   IQ1,IQ2,IQ3 THE MONKHORST-PACK MESH PARAMETERS             ==
     110              :       ! ==   ISTRIZ  SWITCH FOR SYMMETRIZATION                          ==
     111              :       ! ==   A1(3),A2(3),A3(3) LATTICE VECTORS                          ==
     112              :       ! ==   ALAT    LATTICE CONSTANT                                   ==
     113              :       ! ==   STRAIN(3,3)  STRAIN APPLIED TO LATTICE IN ORDER            ==
     114              :       ! ==           TO HAVE K POINTS WITH SYMMETRY OF STRAINED LATTICE ==
     115              :       ! ==   XKAPA(3,NAT)   ATOMS COORDINATES                           ==
     116              :       ! ==   TY(NAT)      TYPES OF ATOMS                                ==
     117              :       ! ==   WVK0(3) SHIFT FOR K POINTS MESh (MACDONALD ARTICLE)        ==
     118              :       ! ==   NHASH   SIZE OF THE HASH TABLES (LIST)                     ==
     119              :       ! ==   DELTA   REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)       ==
     120              :       ! ==           K-VECTOR < DELTA IS CONSIDERED ZERO                ==
     121              :       ! == OUTPUT:                                                      ==
     122              :       ! ==   RX(3,NAT) SCRATCH ARRAY USED BY GROUP1 ROUTINE             ==
     123              :       ! ==   TVEC(1:3,1:NTVEC) TRANSLATION VECTORS (SEE NTVEC)          ==
     124              :       ! ==   ISC(NAT)  SCRATCH ARRAY USED BY GROUP1 ROUTINE             ==
     125              :       ! ==   F0(49,NAT) ATOM TRANSFORMATION TABLE                       ==
     126              :       ! ==              IF NTVEC/=1 THE 49TH GIVES INEQUIVALENT ATOMS   ==
     127              :       ! ==   NTVEC NUMBER OF TRANSLATION VECTORS (IF NOT PRIMITIVE CELL)==
     128              :       ! ==   WVKL(3,NKPOINT) SPECIAL KPOINTS GENERATED                  ==
     129              :       ! ==   LWGHT(NKPOINT)  WEIGHT FOR EACH K POINT                    ==
     130              :       ! ==   LROT(48,NKPOINT) SYMMETRY OPERATION FOR EACH K POINTS      ==
     131              :       ! ==   INCLUD(NKPOINT)  SCRATCH ARRAY USED BY SPPT2               ==
     132              :       ! ==   LIST(NKPOINT+NHASH) HASH TABLE USED BY SPPT2               ==
     133              :       ! ==   RLIST(3,NKPOINT) SCRATCH ARRAY USED BY SPPT2               ==
     134              :       ! ==--------------------------------------------------------------==
     135              :       ! SUBROUTINES NEEDED:
     136              :       ! SPPT2, GROUP1, PGL1, ATFTM1, ROT1, STRUCT,
     137              :       ! BZRDUC, INBZ, MESH, BZDEFI
     138              :       ! (GROUP1, PGL1, ATFTM1, ROT1 FROM THE
     139              :       ! "COMPUTER PHYSICS COMMUNICATIONS" PACKAGE "ACMI" - (1971,1974)
     140              :       ! WORLTON-WARREN).
     141              :       ! ==================================================================
     142              :       INTEGER                                            :: iout, nat, nkpoint, nsp, iq1, iq2, iq3, &
     143              :                                                             istriz
     144              :       REAL(KIND=dp)                                      :: a1(3), a2(3), a3(3), alat, strain(6), &
     145              :                                                             xkapa(3, nat), rx(3, nat), tvec(3, nat)
     146              :       INTEGER                                            :: ty(nat), isc(nat), f0(49, nat), ntvec
     147              :       REAL(KIND=dp)                                      :: wvk0(3), wvkl(3, nkpoint)
     148              :       INTEGER                                            :: lwght(nkpoint), lrot(48, nkpoint), &
     149              :                                                             nhash, includ(nkpoint), &
     150              :                                                             list(nkpoint + nhash)
     151              :       REAL(KIND=dp)                                      :: rlist(3, nkpoint), delta
     152              : 
     153              :       CHARACTER(len=10), DIMENSION(48), PARAMETER :: rname_cubic = (/' 1        ', ' 2[ 10 0] ', &
     154              :          ' 2[ 01 0] ', ' 2[ 00 1] ', ' 3[-1-1-1]', ' 3[ 11-1] ', ' 3[-11 1] ', ' 3[ 1-11] ', &
     155              :          ' 3[ 11 1] ', ' 3[-11-1] ', ' 3[-1-11] ', ' 3[ 1-1-1]', ' 2[-11 0] ', ' 4[ 00 1] ', &
     156              :          ' 4[ 00-1] ', ' 2[ 11 0] ', ' 2[ 0-11] ', ' 2[ 01 1] ', ' 4[ 10 0] ', ' 4[-10 0] ', &
     157              :          ' 2[-10 1] ', ' 4[ 0-10] ', ' 2[ 10 1] ', ' 4[ 01 0] ', '-1        ', '-2[ 10 0] ', &
     158              :          '-2[ 01 0] ', '-2[ 00 1] ', '-3[-1-1-1]', '-3[ 11-1] ', '-3[-11 1] ', '-3[ 1-11] ', &
     159              :          '-3[ 11 1] ', '-3[-11-1] ', '-3[-1-11] ', '-3[ 1-1-1]', '-2[-11 0] ', '-4[ 00 1] ', &
     160              :          '-4[ 00-1] ', '-2[ 11 0] ', '-2[ 0-11] ', '-2[ 01 1] ', '-4[ 10 0] ', '-4[-10 0] ', &
     161              :          '-2[-10 1] ', '-4[ 0-10] ', '-2[ 10 1] ', '-4[ 01 0] '/)
     162              :       CHARACTER(len=11), DIMENSION(24), PARAMETER :: rname_hexai = (/' 1         ', ' 6[ 00  1] ', &
     163              :          ' 3[ 00  1] ', ' 2[ 00  1] ', ' 3[ 00 -1] ', ' 6[ 00 -1] ', ' 2[ 01  0] ', ' 2[-11  0] ', &
     164              :          ' 2[ 10  0] ', ' 2[ 21  0] ', ' 2[ 11  0] ', ' 2[ 12  0] ', '-1         ', '-6[ 00  1] ', &
     165              :          '-3[ 00  1] ', '-2[ 00  1] ', '-3[ 00 -1] ', '-6[ 00 -1] ', '-2[ 01  0] ', '-2[-11  0] ', &
     166              :          '-2[ 10  0] ', '-2[ 21  0] ', '-2[ 11  0] ', '-2[ 12  0] '/)
     167              :       CHARACTER(len=12), DIMENSION(7), PARAMETER :: icst = (/'TRICLINIC   ', 'MONOCLINIC  ', &
     168              :          'ORTHORHOMBIC', 'TETRAGONAL  ', 'CUBIC       ', 'TRIGONAL    ', 'HEXAGONAL   '/)
     169              : 
     170              :       INTEGER :: i, ib(48), ib0(48), ihc, ihc0, ihg, ihg0, indpg, indpg0, invadd, istrin, iswght, &
     171              :          isy, isy0, itype, j, k, l, li, li0, lmax, n, nc, nc0, ntot, ntvec0
     172              :       INTEGER, DIMENSION(49, 1)                          :: f00
     173              :       REAL(KIND=dp) :: a01(3), a02(3), a03(3), b01(3), b02(3), b03(3), b1(3), b2(3), b3(3), &
     174              :          dtotstr, origin(3), origin0(3), proj1, proj2, proj3, r(3, 3, 48), r0(3, 3, 48), totstr, &
     175              :          tvec0(3, 1), volum, vv0(3)
     176              :       REAL(KIND=dp), DIMENSION(3, 1)                     :: x0
     177              :       REAL(KIND=dp), DIMENSION(3, 48)                    :: v, v0
     178              : 
     179            0 :       f00 = 0
     180            0 :       x0 = 0._dp
     181            0 :       v = 0._dp
     182            0 :       v0 = 0._dp
     183              : ! ==--------------------------------------------------------------==
     184              : ! READ IN LATTICE STRUCTURE
     185              : ! ==--------------------------------------------------------------==
     186            0 :       DO i = 1, 3
     187            0 :          a01(i) = a1(i)/alat
     188            0 :          a02(i) = a2(i)/alat
     189            0 :          a03(i) = a3(i)/alat
     190              :       END DO
     191            0 :       WRITE (iout, '(" KPSYM| NUMBER OF ATOMS (STRUCT):",I6)') nat
     192            0 :       IF (iout > 0) &
     193            0 :          WRITE (iout, '(" KPSYM|",10X,"K   TYPE",14X,"X(K)")')
     194            0 :       itype = 0
     195            0 :       DO i = 1, nat
     196              :          ! Assign an atomic type (for internal purposes)
     197            0 :          IF (i .NE. 1) THEN
     198            0 :             DO j = 1, (i - 1)
     199            0 :                IF (ty(j) .EQ. ty(i)) THEN
     200              :                   ! Type located
     201              :                   GOTO 178
     202              :                END IF
     203              :             END DO
     204              :             ! New type
     205              :          END IF
     206            0 :          itype = itype + 1
     207            0 :          IF (itype .GT. nsp) THEN
     208            0 :             IF (iout > 0) &
     209              :                WRITE (iout, '(A,I4,")")') &
     210            0 :                ' KPSYM| NUMBER OF ATOMIC TYPES EXCEEDS DIMENSION (NSP=)', &
     211            0 :                nsp
     212            0 :             IF (iout > 0) &
     213              :                WRITE (iout, '(" KPSYM| THE ARRAY TY IS:",/,9(1X,10I7,/))') &
     214            0 :                (ty(j), j=1, nat)
     215            0 :             CALL stopgm('K290', 'FATAL ERROR')
     216              :          END IF
     217              : 178      CONTINUE
     218            0 :          IF (iout > 0) &
     219              :             WRITE (iout, '(" KPSYM|",6X,I5,I6,3F10.5)') &
     220            0 :             i, ty(i), (xkapa(j, i), j=1, 3)
     221              :       END DO
     222              :       ! ==--------------------------------------------------------------==
     223              :       ! IS THE STRAIN SIGNIFICANT ?
     224              :       ! ==--------------------------------------------------------------==
     225            0 :       dtotstr = delta*delta
     226            0 :       totstr = 0._dp
     227            0 :       istrin = 0
     228            0 :       DO i = 1, 6
     229            0 :          totstr = totstr + ABS(strain(i))
     230              :       END DO
     231            0 :       IF (totstr .GT. dtotstr) istrin = 1
     232              :       ! ==--------------------------------------------------------------==
     233              :       ! Volume of the cell.
     234              :       volum = a1(1)*a2(2)*a3(3) + a2(1)*a3(2)*a1(3) + &
     235              :               a3(1)*a1(2)*a2(3) - a1(3)*a2(2)*a3(1) - &
     236            0 :               A2(3)*A3(2)*A1(1) - A3(3)*A1(2)*A2(1)
     237            0 :       volum = ABS(volum)
     238            0 :       b1(1) = (a2(2)*a3(3) - a2(3)*a3(2))/volum
     239            0 :       b1(2) = (a2(3)*a3(1) - a2(1)*a3(3))/volum
     240            0 :       b1(3) = (a2(1)*a3(2) - a2(2)*a3(1))/volum
     241            0 :       b2(1) = (a3(2)*a1(3) - a3(3)*a1(2))/volum
     242            0 :       b2(2) = (a3(3)*a1(1) - a3(1)*a1(3))/volum
     243            0 :       b2(3) = (a3(1)*a1(2) - a3(2)*a1(1))/volum
     244            0 :       b3(1) = (a1(2)*a2(3) - a1(3)*a2(2))/volum
     245            0 :       b3(2) = (a1(3)*a2(1) - a1(1)*a2(3))/volum
     246            0 :       b3(3) = (a1(1)*a2(2) - a1(2)*a2(1))/volum
     247              :       ! ==--------------------------------------------------------------==
     248            0 :       DO i = 1, 3
     249            0 :          b01(i) = b1(i)*alat
     250            0 :          b02(i) = b2(i)*alat
     251            0 :          b03(i) = b3(i)*alat
     252              :       END DO
     253              :       ! ==--------------------------------------------------------------==
     254              :       ! == GROUP-THEORY ANALYSIS OF LATTICE                             ==
     255              :       ! ==--------------------------------------------------------------==
     256              :       CALL group1s(iout, a1, a2, a3, nat, ty, xkapa, b1, b2, b3, &
     257              :                    ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
     258            0 :                    v, f0, r, tvec, origin, rx, isc, delta)
     259              :       ! ==--------------------------------------------------------------==
     260            0 :       DO n = nc + 1, 48
     261            0 :          ib(n) = 0
     262              :       END DO
     263              :       ! ==--------------------------------------------------------------==
     264            0 :       invadd = 0
     265            0 :       IF (li .EQ. 0) THEN
     266            0 :          IF (iout > 0) &
     267              :             WRITE (iout, '(A,/,A,/,A)') &
     268            0 :             ' KPSYM| ALTHOUGH THE POINT GROUP OF THE CRYSTAL DOES NOT', &
     269            0 :             ' KPSYM| CONTAIN INVERSION, THE SPECIAL POINT GENERATION ALGORITHM', &
     270            0 :             ' KPSYM| WILL CONSIDER IT AS A SYMMETRY OPERATION'
     271            0 :          invadd = 1
     272              :       END IF
     273              :       ! ==--------------------------------------------------------------==
     274              :       ! == CRYSTALLOGRAPHIC DATA                                        ==
     275              :       ! ==--------------------------------------------------------------==
     276            0 :       IF (iout > 0) THEN
     277            0 :          WRITE (iout, '(/," KPSYM| CRYSTALLOGRAPHIC DATA:")')
     278            0 :          WRITE (iout, '(4X,"A1",3F10.5,10X,"B1",3F10.5)') a1, b1
     279            0 :          WRITE (iout, '(4X,"A2",3F10.5,10X,"B2",3F10.5)') a2, b2
     280            0 :          WRITE (iout, '(4X,"A3",3F10.5,10X,"B3",3F10.5)') a3, b3
     281              :       END IF
     282              :       ! ==--------------------------------------------------------------==
     283              :       ! == GROUP-THEORETICAL INFORMATION                                ==
     284              :       ! ==--------------------------------------------------------------==
     285            0 :       IF (iout > 0) &
     286            0 :          WRITE (iout, '(/," KPSYM| GROUP-THEORETICAL INFORMATION:")')
     287              :       ! IHG .... Point group of the primitive lattice, holohedral
     288            0 :       IF (iout > 0) &
     289              :          WRITE (iout, &
     290              :                 '(" KPSYM|    POINT GROUP OF THE PRIMITIVE LATTICE: ",A," SYSTEM")') &
     291            0 :          icst(ihg)
     292              :       ! IHC .... Code distinguishing between hexagonal and cubic groups
     293              :       ! ISY .... Code indicating whether the space group is symmorphic
     294            0 :       IF (isy .EQ. 0) THEN
     295            0 :          IF (iout > 0) &
     296            0 :             WRITE (iout, '(" KPSYM|",4X,"NONSYMMORPHIC GROUP")')
     297            0 :       ELSEIF (isy .EQ. 1) THEN
     298            0 :          IF (iout > 0) &
     299            0 :             WRITE (iout, '(" KPSYM|",4X,"SYMMORPHIC GROUP")')
     300            0 :       ELSEIF (isy .EQ. -1) THEN
     301            0 :          IF (iout > 0) &
     302            0 :             WRITE (iout, '(" KPSYM|",4X,"SYMMORPHIC GROUP WITH NON-STANDARD ORIGIN")')
     303            0 :       ELSEIF (isy .EQ. -2) THEN
     304            0 :          IF (iout > 0) &
     305            0 :             WRITE (iout, '(" KPSYM|",4X,"NONSYMMORPHIC GROUP???")')
     306              :       END IF
     307              :       ! LI ..... Inversions symmetry
     308            0 :       IF (li .EQ. 0) THEN
     309            0 :          IF (iout > 0) &
     310            0 :             WRITE (iout, '(" KPSYM|",4X,"NO INVERSION SYMMETRY")')
     311            0 :       ELSEIF (li .GT. 0) THEN
     312            0 :          IF (iout > 0) &
     313            0 :             WRITE (iout, '(" KPSYM|",4X,"INVERSION SYMMETRY")')
     314              :       END IF
     315              :       ! NC ..... Total number of elements in the point group
     316            0 :       IF (iout > 0) &
     317              :          WRITE (iout, &
     318            0 :                 '(" KPSYM|",4X,"TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP:",I3)') nc
     319            0 :       IF (iout > 0) &
     320              :          WRITE (iout, '(" KPSYM|",4X,"TO SUM UP: (",I1,5I3,")")') &
     321            0 :          ihg, ihc, isy, li, nc, indpg
     322              :       ! IB ..... List of the rotations constituting the point group
     323            0 :       IF (iout > 0) &
     324            0 :          WRITE (iout, '(/," KPSYM|",4X,"LIST OF THE ROTATIONS:")')
     325            0 :       IF (iout > 0) &
     326            0 :          WRITE (iout, '(7X,12I4)') (ib(i), i=1, nc)
     327              :       ! V ...... Nonprimitive translations (for nonsymmorphic groups)
     328            0 :       IF (isy .LE. 0) THEN
     329            0 :          IF (iout > 0) &
     330            0 :             WRITE (iout, '(/," KPSYM|",4X,"NONPRIMITIVE TRANSLATIONS:")')
     331            0 :          IF (iout > 0) &
     332              :             WRITE (iout, '(A,A)') &
     333            0 :             ' ROT    V  IN THE BASIS A1, A2, A3      ', &
     334            0 :             'V  IN CARTESIAN COORDINATES'
     335              :          ! Cartesian components of nonprimitive translation.
     336            0 :          DO i = 1, nc
     337            0 :             DO j = 1, 3
     338            0 :                vv0(j) = v(1, i)*a1(j) + v(2, i)*a2(j) + v(3, i)*a3(j)
     339              :             END DO
     340            0 :             IF (iout > 0) &
     341              :                WRITE (iout, '(1X,I3,3F10.5,3X,3F10.5)') &
     342            0 :                ib(i), (v(j, i), j=1, 3), vv0
     343              :          END DO
     344              :       END IF
     345              :       ! F0 ..... The function defined in Maradudin, Ipatova by
     346              :       ! eq. (3.2.12): atom transformation table.
     347            0 :       IF (iout > 0) &
     348              :          WRITE (iout, &
     349            0 :                 '(/," KPSYM|",4X,"ATOM TRANSFORMATION TABLE (MARADUDIN,VOSKO):")')
     350            0 :       IF (iout > 0) &
     351            0 :          WRITE (iout, '(5(4X,"R  AT->AT"))')
     352            0 :       IF (iout > 0) &
     353            0 :          WRITE (iout, '(I5," [Identity]")') 1
     354            0 :       DO k = 2, nc
     355            0 :          DO j = 1, nat
     356            0 :             IF (iout > 0) &
     357            0 :                WRITE (iout, '(I5,2I4)', advance="no") ib(k), j, f0(k, j)
     358            0 :             IF ((MOD(j, 5) .EQ. 0) .AND. iout > 0) &
     359            0 :                WRITE (iout, *)
     360              :          END DO
     361            0 :          IF ((MOD(j - 1, 5) .NE. 0) .AND. iout > 0) &
     362            0 :             WRITE (iout, *)
     363              :       END DO
     364              :       ! R ...... List of the 3 x 3 rotation matrices
     365            0 :       IF (iout > 0) &
     366            0 :          WRITE (iout, '(/," KPSYM|",4X,"LIST OF THE 3 X 3 ROTATION MATRICES:")')
     367            0 :       IF (ihc .EQ. 0) THEN
     368            0 :          DO k = 1, nc
     369            0 :             IF (iout > 0) &
     370              :                WRITE (iout, &
     371              :                       '(4X,I3," (",I2,": ",A11,")",2(3F14.6,/,25X),3F14.6)') &
     372            0 :                k, ib(k), rname_hexai(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
     373              :          END DO
     374              :       ELSE
     375            0 :          DO k = 1, nc
     376            0 :             IF (iout > 0) &
     377              :                WRITE (iout, &
     378              :                       '(4X,I3," (",I2,": ",A10,") ",2(3F14.6,/,25X),3F14.6)') &
     379            0 :                k, ib(k), rname_cubic(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
     380              :          END DO
     381              :       END IF
     382              :       ! ==--------------------------------------------------------------==
     383              :       ! GENERATE THE BRAVAIS LATTICE
     384              :       ! ==--------------------------------------------------------------==
     385              :       CALL group1s(iout, a01, a02, a03, 1, ty, x0, b01, b02, b03, &
     386              :                    ihg0, ihc0, isy0, li0, nc0, indpg0, ib0, ntvec0, &
     387            0 :                    v0, f00, r0, tvec0, origin0, rx, isc, delta)
     388              :       ! ==--------------------------------------------------------------==
     389              :       ! It is assumed that the same 'type' of symmetry operations
     390              :       ! (cubic/hexagonal) will apply to the crystal as well as the Bravais
     391              :       ! lattice.
     392              :       ! ==--------------------------------------------------------------==
     393            0 :       IF (iout > 0) &
     394              :          WRITE (iout, '(/,1X,19("*"),A,25("*"))') &
     395            0 :          ' GENERATION OF SPECIAL POINTS '
     396              :       ! Parameter Q of Monkhorst and Pack, generalized for 3 axes B1,2,3
     397            0 :       IF (iout > 0) &
     398              :          WRITE (iout, '(A,/,1X,3I5)') &
     399            0 :          ' KPSYM| MONKHORST-PACK PARAMETERS (GENERALIZED) IQ1,IQ2,IQ3:', &
     400            0 :          iq1, iq2, iq3
     401              :       ! WVK0 is the shift of the whole mesh (see Macdonald)
     402            0 :       IF (iout > 0) &
     403              :          WRITE (iout, '(A,/,1X,3F10.5)') &
     404            0 :          ' KPSYM| CONSTANT VECTOR SHIFT (MACDONALD) OF THIS MESH:', wvk0
     405            0 :       IF (iabs(iq1) + iabs(iq2) + iabs(iq3) .EQ. 0) GOTO 710
     406            0 :       IF (ABS(istriz) .NE. 1) THEN
     407            0 :          IF (iout > 0) &
     408            0 :             WRITE (iout, '(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
     409            0 :          IF (iout > 0) &
     410            0 :             WRITE (iout, '(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
     411            0 :          CALL stopgm('K290', 'ISTRIZ WRONG ARGUMENT')
     412              :       END IF
     413            0 :       IF (iout > 0) &
     414            0 :          WRITE (iout, '(" KPSYM| SYMMETRIZATION SWITCH: ",I3)', advance="no") istriz
     415            0 :       IF (istriz .EQ. 1) THEN
     416            0 :          IF (iout > 0) &
     417            0 :             WRITE (iout, '(" (SYMMETRIZATION OF MONKHORST-PACK MESH)")')
     418              :       ELSE
     419            0 :          IF (iout > 0) &
     420            0 :             WRITE (iout, '(" (NO SYMMETRIZATION OF MONKHORST-PACK MESH)")')
     421              :       END IF
     422              :       ! Set to 0.
     423            0 :       DO i = 1, nkpoint
     424            0 :          lwght(i) = 0
     425              :       END DO
     426              :       ! ==--------------------------------------------------------------==
     427              :       ! == Generation of the points (they are not multiplied            ==
     428              :       ! == by 2*Pi because B1,2,3  were not,either)                     ==
     429              :       ! ==--------------------------------------------------------------==
     430            0 :       IF (nc .GT. nc0) THEN
     431              :          ! Due to non-use of primitive cell, the crystal has more
     432              :          ! rotations than Bravais lattice.
     433              :          ! We use only the rotations for Bravais lattices
     434            0 :          IF (ntvec .EQ. 1) THEN
     435            0 :             IF (iout > 0) &
     436            0 :                WRITE (iout, *) ' KPSYM| NUMBER OF ROTATIONS FOR BRAVAIS LATTICE', nc0
     437            0 :             IF (iout > 0) &
     438            0 :                WRITE (iout, *) ' KPSYM| NUMBER OF ROTATIONS FOR CRYSTAL LATTICE', nc
     439            0 :             IF (iout > 0) &
     440            0 :                WRITE (iout, *) ' KPSYM| NO DUPLICATION FOUND'
     441              :             CALL stopgm('ERROR', &
     442            0 :                         'SOMETHING IS WRONG IN GROUP DETERMINATION')
     443              :          END IF
     444            0 :          nc = nc0
     445            0 :          DO i = 1, nc0
     446            0 :             ib(i) = ib0(i)
     447              :          END DO
     448            0 :          IF (iout > 0) &
     449            0 :             WRITE (iout, '(/,1X,20("! "),"WARNING",20("!"))')
     450            0 :          IF (iout > 0) &
     451              :             WRITE (iout, '(A)') &
     452            0 :             ' KPSYM| THE CRYSTAL HAS MORE SYMMETRY THAN THE BRAVAIS LATTICE'
     453            0 :          IF (iout > 0) &
     454              :             WRITE (iout, '(A)') &
     455            0 :             ' KPSYM| BECAUSE THIS IS NOT A PRIMITIVE CELL'
     456            0 :          IF (iout > 0) &
     457              :             WRITE (iout, '(A)') &
     458            0 :             ' KPSYM| USE ONLY SYMMETRY FROM BRAVAIS LATTICE'
     459            0 :          IF (iout > 0) &
     460            0 :             WRITE (iout, '(1X,20("! "),"WARNING",20("!"),/)')
     461              :       END IF
     462              :       CALL sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
     463              :                  a01, a02, a03, b01, b02, b03, &
     464              :                  invadd, nc, ib, r, ntot, wvkl, lwght, lrot, nc0, ib0, istriz, &
     465            0 :                  nhash, includ, list, rlist, delta)
     466              :       ! ==--------------------------------------------------------------==
     467              :       ! == Check on error signals                                       ==
     468              :       ! ==--------------------------------------------------------------==
     469            0 :       IF (iout > 0) &
     470            0 :          WRITE (iout, '(/," KPSYM|",1X,I5," SPECIAL POINTS GENERATED")') ntot
     471            0 :       IF (ntot .EQ. 0) THEN
     472              :          GOTO 710
     473            0 :       ELSE IF (ntot .LT. 0) THEN
     474            0 :          IF (iout > 0) &
     475            0 :             WRITE (iout, '(A,I5,/,A,/,A)') ' KPSYM| DIMENSION NKPOINT =', nkpoint, &
     476            0 :             ' KPSYM| INSUFFICIENT FOR ACCOMMODATING ALL THE SPECIAL POINTS', &
     477            0 :             ' KPSYM| WHAT FOLLOWS IS AN INCOMPLETE LIST'
     478            0 :          ntot = iabs(ntot)
     479              :       END IF
     480              :       ! Before using the list WVKL as wave vectors, they have to be
     481              :       ! multiplied by 2*Pi
     482              :       ! The list of weights LWGHT is not normalized
     483            0 :       iswght = 0
     484            0 :       DO i = 1, ntot
     485            0 :          iswght = iswght + lwght(i)
     486              :       END DO
     487            0 :       IF (iout > 0) &
     488              :          WRITE (iout, '(8X,A,T33,A,4X,A)') &
     489            0 :          'WAVEVECTOR K', 'WEIGHT', 'UNFOLDING ROTATIONS'
     490              :       ! Set near-zeroes equal to zero:
     491            0 :       DO l = 1, ntot
     492            0 :          DO i = 1, 3
     493            0 :             IF (ABS(wvkl(i, l)) .LT. delta) wvkl(i, l) = 0._dp
     494              :          END DO
     495            0 :          IF (istrin .NE. 0) THEN
     496              :             ! Express special points in (unstrained) basis.
     497            0 :             proj1 = 0._dp
     498            0 :             proj2 = 0._dp
     499            0 :             proj3 = 0._dp
     500            0 :             DO i = 1, 3
     501            0 :                proj1 = proj1 + wvkl(i, l)*a01(i)
     502            0 :                proj2 = proj2 + wvkl(i, l)*a02(i)
     503            0 :                proj3 = proj3 + wvkl(i, l)*a03(i)
     504              :             END DO
     505            0 :             DO i = 1, 3
     506            0 :                wvkl(i, l) = proj1*b1(i) + proj2*b2(i) + proj3*b3(i)
     507              :             END DO
     508              :          END IF
     509            0 :          lmax = lwght(l)
     510            0 :          IF (iout > 0) &
     511              :             WRITE (iout, fmt='(1X,I5,3F8.4,I8,T42,12I3)') &
     512            0 :             l, (wvkl(i, l), i=1, 3), lwght(l), (lrot(i, l), i=1, MIN(lmax, 12))
     513            0 :          DO j = 13, lmax, 12
     514            0 :             IF (iout > 0) &
     515              :                WRITE (iout, fmt='(T42,12I3)') &
     516            0 :                (lrot(i, l), i=j, MIN(lmax, j - 1 + 12))
     517              :          END DO
     518              :       END DO
     519            0 :       IF (iout > 0) &
     520            0 :          WRITE (iout, '(24X,"TOTAL:",I8)') iswght
     521              :       ! ==--------------------------------------------------------------==
     522              : 710   CONTINUE
     523              :       ! ==--------------------------------------------------------------==
     524            0 :       RETURN
     525              :    END SUBROUTINE k290s
     526              : ! **************************************************************************************************
     527              : 
     528              : ! **************************************************************************************************
     529              : !> \brief ...
     530              : !> \param iout ...
     531              : !> \param a1 ...
     532              : !> \param a2 ...
     533              : !> \param a3 ...
     534              : !> \param nat ...
     535              : !> \param ty ...
     536              : !> \param x ...
     537              : !> \param b1 ...
     538              : !> \param b2 ...
     539              : !> \param b3 ...
     540              : !> \param ihg ...
     541              : !> \param ihc ...
     542              : !> \param isy ...
     543              : !> \param li ...
     544              : !> \param nc ...
     545              : !> \param indpg ...
     546              : !> \param ib ...
     547              : !> \param ntvec ...
     548              : !> \param v ...
     549              : !> \param f0 ...
     550              : !> \param r ...
     551              : !> \param tvec ...
     552              : !> \param origin ...
     553              : !> \param rx ...
     554              : !> \param isc ...
     555              : !> \param delta ...
     556              : ! **************************************************************************************************
     557            0 :    SUBROUTINE group1s(iout, a1, a2, a3, nat, ty, x, b1, b2, b3, &
     558              :                       ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
     559            0 :                       v, f0, r, tvec, origin, rx, isc, delta)
     560              :       ! ==--------------------------------------------------------------==
     561              :       ! == WRITTEN ON SEPTEMBER 10TH - FROM THE ACMI COMPLEX            ==
     562              :       ! == (WORLTON AND WARREN, COMPUT.PHYS.COMMUN. 8,71-84 (1974))     ==
     563              :       ! == (AND 3,88-117 (1972))                                        ==
     564              :       ! == BASIC CRYSTALLOGRAPHIC INFORMATION                           ==
     565              :       ! == ABOUT A GIVEN CRYSTAL STRUCTURE.                             ==
     566              :       ! == SUBROUTINES NEEDED: PGL1,ATFTM1,ROT1,RLV3                    ==
     567              :       ! ==--------------------------------------------------------------==
     568              :       ! == INPUT DATA:                                                  ==
     569              :       ! == IOUT ... NUMBER OF THE OUTPUT UNIT FOR ON-LINE PRINTING      ==
     570              :       ! ==          OF VARIOUS MESSAGES                                 ==
     571              :       ! ==          IF IOUT.LE.0 NO MESSAGE                             ==
     572              :       ! == A1,A2,A3 .. ELEMENTARY TRANSLATIONS OF THE LATTICE, IN SOME  ==
     573              :       ! ==          UNIT OF LENGTH                                      ==
     574              :       ! == NAT .... NUMBER OF ATOMS IN THE UNIT CELL                    ==
     575              :       ! ==          ALL THE DIMENSIONS ARE SET FOR NAT .LE. 20          ==
     576              :       ! == TY ..... INTEGERS DISTINGUISHING BETWEEN THE ATOMS OF        ==
     577              :       ! ==          DIFFERENT TYPE. TY(I) IS THE TYPE OF THE I-TH ATOM  ==
     578              :       ! ==          OF THE BASIS                                        ==
     579              :       ! == X ...... CARTESIAN COORDINATES OF THE NAT ATOMS OF THE BASIS ==
     580              :       ! == DELTA... REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)           ==
     581              :       ! ==--------------------------------------------------------------==
     582              :       ! == OUTPUT DATA:                                                 ==
     583              :       ! == B1,B2,B3 .. RECIPROCAL LATTICE VECTORS, NOT MULTIPLIED BY    ==
     584              :       ! ==          ANY 2PI, IN UNITS RECIPROCAL TO THOSE OF A1,A2,A3   ==
     585              :       ! == IHG .... POINT GROUP OF THE PRIMITIVE LATTICE, HOLOHEDRAL    ==
     586              :       ! ==          GROUP NUMBER:                                       ==
     587              :       ! ==          IHG=1 STANDS FOR TRICLINIC    SYSTEM                ==
     588              :       ! ==          IHG=2 STANDS FOR MONOCLINIC   SYSTEM                ==
     589              :       ! ==          IHG=3 STANDS FOR ORTHORHOMBIC SYSTEM                ==
     590              :       ! ==          IHG=4 STANDS FOR TETRAGONAL   SYSTEM                ==
     591              :       ! ==          IHG=5 STANDS FOR CUBIC        SYSTEM                ==
     592              :       ! ==          IHG=6 STANDS FOR TRIGONAL     SYSTEM                ==
     593              :       ! ==          IHG=7 STANDS FOR HEXAGONAL    SYSTEM                ==
     594              :       ! == IHC .... CODE DISTINGUISHING BETWEEN HEXAGONAL AND CUBIC     ==
     595              :       ! ==          GROUPS                                              ==
     596              :       ! ==          IHC=0 STANDS FOR HEXAGONAL GROUPS                   ==
     597              :       ! ==          IHC=1 STANDS FOR CUBIC GROUPS                       ==
     598              :       ! == ISY .... CODE INDICATING WHETHER THE SPACE GROUP IS          ==
     599              :       ! ==          SYMMORPHIC OR NONSYMMORPHIC                         ==
     600              :       ! ==          ISY= 0 NONSYMMORPHIC GROUP                          ==
     601              :       ! ==          ISY= 1 SYMMORPHIC GROUP                             ==
     602              :       ! ==          ISY=-1 SYMMORPHIC GROUP WITH NON-STANDARD ORIGIN    ==
     603              :       ! ==          ISY=-2 UNDETERMINED (NORMALLY NEVER)                ==
     604              :       ! ==          THE GROUP IS CONSIDERED SYMMORPHIC IF FOR EACH      ==
     605              :       ! ==          OPERATION OF THE POINT GROUP THE SUM OF THE 3       ==
     606              :       ! ==          COMPONENTS OF ABS(V(N)) (NONPRIMITIVE TRANSLATION,  ==
     607              :       ! ==          SEE BELOW) IS LT. 0.0001                            ==
     608              :       ! == ORIGIN   STANDARD ORIGIN IF SYMMORPHIC (CRYSTAL COORDINATES) ==
     609              :       ! == LI ..... CODE INDICATING WHETHER THE POINT GROUP             ==
     610              :       ! ==          OF THE CRYSTAL CONTAINS INVERSION OR NOT            ==
     611              :       ! ==          (OPERATIONS 13 OR 25 IN RESPECTIVELY HEXAGONAL      ==
     612              :       ! ==          OR CUBIC GROUPS).                                   ==
     613              :       ! ==          LI=0 MEANS: DOES NOT CONTAIN INVERSION              ==
     614              :       ! ==          LI.GT.0 MEANS: THERE IS INVERSION IN THE POINT      ==
     615              :       ! ==                         GROUP OF THE CRYSTAL                 ==
     616              :       ! == NC ..... TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP OF THE  ==
     617              :       ! ==          CRYSTAL                                             ==
     618              :       ! == INDPG .. POINT GROUP INDEX (DETERMINED IF SYMMORPHIC GROUP)  ==
     619              :       ! == IB ..... LIST OF THE ROTATIONS CONSTITUTING THE POINT GROUP  ==
     620              :       ! ==          OF THE CRYSTAL. THE NUMBERING IS THAT DEFINED IN    ==
     621              :       ! ==          WORLTON AND WARREN, I.E. THE ONE MATERIALIZED IN THE==
     622              :       ! ==          ARRAY R (SEE BELOW)                                 ==
     623              :       ! ==          ONLY THE FIRST NC ELEMENTS OF THE ARRAY IB ARE      ==
     624              :       ! ==          MEANINGFUL                                          ==
     625              :       ! == NTVEC .. NUMBER OF TRANSLATIONAL VECTORS                     ==
     626              :       ! ==          ASSOCIATED WITH IDENTITY OPERATOR I.E.              ==
     627              :       ! ==          GIVES THE NUMBER OF IDENTICAL PRIMITIVE CELLS       ==
     628              :       ! == V ...... NONPRIMITIVE TRANSLATIONS (IN THE CASE OF NONSYMMOR-==
     629              :       ! ==          PHIC GROUPS). V(I,N) IS THE I-TH COMPONENT          ==
     630              :       ! ==          OF THE TRANSLATION CONNECTED WITH THE N-TH ELEMENT  ==
     631              :       ! ==          OF THE POINT GROUP (I.E. WITH THE ROTATION          ==
     632              :       ! ==          NUMBER IB(N) ).                                     ==
     633              :       ! ==          ATTENTION: V(I) ARE NOT CARTESIAN COMPONENTS,       ==
     634              :       ! ==          THEY REFER TO THE SYSTEM A1,A2,A3.                  ==
     635              :       ! == F0 ..... THE FUNCTION DEFINED IN MARADUDIN, IPATOVA BY       ==
     636              :       ! ==          EQ. (3.2.12): ATOM TRANSFORMATION TABLE.            ==
     637              :       ! ==          THE ELEMENT F0(N,KAPA) MEANS THAT THE N-TH          ==
     638              :       ! ==          OPERATION OF THE SPACE GROUP (I.E. OPERATION NUMBER ==
     639              :       ! ==          IB(N), TOGETHER WITH AN EVENTUAL NONPRIMITIVE       ==
     640              :       ! ==          TRANSLATION  V(N)) TRANSFERS THE ATOM KAPA INTO THE ==
     641              :       ! ==          ATOM F0(N,KAPA).                                    ==
     642              :       ! ==          THE 49TH LINE GIVES EQUIVALENT ATOMS FOR            ==
     643              :       ! ==          FRACTIONAl TRANSLATIONS ASSOCIATED WITH IDENTITY    ==
     644              :       ! == R ...... LIST OF THE 3 X 3 ROTATION MATRICES                 ==
     645              :       ! ==          (XYZ REPRESENTATION OF THE O(H) OR D(6)H GROUPS)    ==
     646              :       ! ==          ALL 48 OR 24 MATRICES ARE LISTED.                   ==
     647              :       ! ==          FOLLOW NOTATION OF WORLTON-WARREN(1972)             ==
     648              :       ! == TVEC  .. LIST OF NTVEC TRANSLATIONAL VECTORS                 ==
     649              :       ! ==          ASSOCIATED WITH IDENTITY OPERATOR                   ==
     650              :       ! ==          TVEC(1:3,1) = \(0,0,0\)                             ==
     651              :       ! ==          (CRYSTAL COORDINATES)                               ==
     652              :       ! == RX ..... SCRATCH ARRAY                                       ==
     653              :       ! == ISC .... SCRATCH ARRAY                                       ==
     654              :       ! ==--------------------------------------------------------------==
     655              :       ! == PRINTED OUTPUT:                                              ==
     656              :       ! == PROGRAM PRINTS THE TYPE OF THE LATTICE (IHG, IN WORDS),      ==
     657              :       ! == LISTS THE OPERATIONS OF THE  POINT GROUP OF THE              ==
     658              :       ! == CRYSTAL, INDICATES WHETHER THE SPACE GROUP IS SYMMORPHIC OR  ==
     659              :       ! == NONSYMMORPHIC AND WHETHER THE POINT GROUP OF THE CRYSTAL     ==
     660              :       ! == CONTAINS INVERSION.                                          ==
     661              :       ! ==--------------------------------------------------------------==
     662              :       INTEGER                                            :: iout
     663              :       REAL(dp)                                           :: a1(3), a2(3), a3(3)
     664              :       INTEGER                                            :: nat, ty(nat)
     665              :       REAL(dp)                                           :: x(3, nat), b1(3), b2(3), b3(3)
     666              :       INTEGER                                            :: ihg, ihc, isy, li, nc, indpg, ib(48), &
     667              :                                                             ntvec
     668              :       REAL(dp)                                           :: v(3, 48)
     669              :       INTEGER                                            :: f0(49, nat)
     670              :       REAL(dp)                                           :: r(3, 3, 48), tvec(3, nat), origin(3), &
     671              :                                                             rx(3, nat)
     672              :       INTEGER                                            :: isc(nat)
     673              :       REAL(dp)                                           :: delta
     674              : 
     675              :       INTEGER                                            :: i, ncprim
     676              :       REAL(dp)                                           :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
     677              : 
     678            0 :       DO i = 1, 3
     679            0 :          a(i, 1) = a1(i)
     680            0 :          a(i, 2) = a2(i)
     681            0 :          a(i, 3) = a3(i)
     682              :       END DO
     683              :       ! ==--------------------------------------------------------------==
     684              :       ! == A(I,J) IS THE I-TH CARTESIAN COMPONENT OF THE J-TH PRIMITIVE ==
     685              :       ! == TRANSLATION VECTOR OF THE DIRECT LATTICE                     ==
     686              :       ! == TY(I) IS AN INTEGER DISTINGUISHING ATOMS OF DIFFERENT TYPE,  ==
     687              :       ! == I.E., DIFFERENT ATOMIC SPECIES                               ==
     688              :       ! == X(J,I) IS THE J-TH CARTESIAN COMPONENT OF THE POSITION       ==
     689              :       ! == VECTOR FOR THE I-TH ATOM IN THE UNIT CELL.                   ==
     690              :       ! ==--------------------------------------------------------------==
     691              :       ! ==DETERMINE PRIMITIVE LATTICE VECTORS FOR THE RECIPROCAL LATTICE==
     692              :       ! ==--------------------------------------------------------------==
     693            0 :       CALL calbrec(a, ai)
     694            0 :       DO i = 1, 3
     695            0 :          b1(i) = ai(1, i)
     696            0 :          b2(i) = ai(2, i)
     697            0 :          b3(i) = ai(3, i)
     698              :       END DO
     699              :       ! ==--------------------------------------------------------------==
     700              :       ! Determination of the translation vectors associated with
     701              :       ! the Identity matrix i.e. if the cell is duplicated
     702              :       ! Give also the ``primitive lattice''
     703            0 :       CALL primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
     704              :       ! ==--------------------------------------------------------------==
     705              :       ! Determination of the holohedral group (and crystal system)
     706            0 :       CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
     707            0 :       IF (ntvec .GT. 1) THEN
     708              :          ! All rotations found by PGL1 have axes in x, y or z cart. axis
     709              :          ! So we have too check if we do not loose symmetry
     710            0 :          ncprim = nc
     711              :          ! The hexagonal system is found if the z axis is the sixfold axis
     712            0 :          CALL pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
     713            0 :          IF (ncprim .GT. nc) THEN
     714              :             ! More symmetry with
     715            0 :             CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
     716              :          END IF
     717              :       END IF
     718              : 
     719              :       ! Determination of the space group
     720              :       CALL atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, rx, &
     721            0 :                   nc, indpg, ntvec, a, ai, li, isy, isc, delta)
     722              : 
     723            0 :       IF (iout .GT. 0) THEN
     724            0 :          IF (li .GT. 0) THEN
     725              :             IF (iout > 0) &
     726              :                WRITE (iout, '(1X,A)') &
     727            0 :                'KPSYM| THE POINT GROUP OF THE CRYSTAL CONTAINS THE INVERSION'
     728              :          END IF
     729            0 :          IF (iout > 0) &
     730            0 :             WRITE (iout, *)
     731              :       END IF
     732              : 
     733            0 :    END SUBROUTINE group1s
     734              : ! **************************************************************************************************
     735              : !> \brief ...
     736              : !> \param a ...
     737              : !> \param ai ...
     738              : ! **************************************************************************************************
     739            0 :    SUBROUTINE calbrec(a, ai)
     740              :       ! ==--------------------------------------------------------------==
     741              :       ! == CALCULATE RECIPROCAL VECTOR BASIS (AI(1:3,1:3))              ==
     742              :       ! == INPUT:                                                       ==
     743              :       ! ==   A(3,3) A(I,J) IS THE I-TH CARTESIAN COMPONENT              ==
     744              :       ! ==          OF THE J-TH PRIMITIVE TRANSLATION VECTOR OF         ==
     745              :       ! ==          THE DIRECT LATTICE                                  ==
     746              :       ! == OUTPUT:                                                      ==
     747              :       ! ==   AI(3,3) RECIPROCAL VECTOR BASIS                            ==
     748              :       ! ==--------------------------------------------------------------==
     749              :       REAL(dp)                                           :: a(3, 3), ai(3, 3)
     750              : 
     751              :       INTEGER                                            :: i, il, iu, j, jl, ju
     752              :       REAL(dp)                                           :: det
     753              : 
     754              :       det = a(1, 1)*a(2, 2)*a(3, 3) + a(2, 1)*a(1, 3)*a(3, 2) + &
     755              :             a(3, 1)*a(1, 2)*a(2, 3) - a(1, 1)*a(2, 3)*a(3, 2) - &
     756            0 :             A(2, 1)*A(1, 2)*A(3, 3) - A(3, 1)*A(1, 3)*A(2, 2)
     757            0 :       det = 1._dp/det
     758            0 :       DO i = 1, 3
     759            0 :          il = 1
     760            0 :          iu = 3
     761            0 :          IF (i .EQ. 1) il = 2
     762            0 :          IF (i .EQ. 3) iu = 2
     763            0 :          DO j = 1, 3
     764            0 :             jl = 1
     765            0 :             ju = 3
     766            0 :             IF (j .EQ. 1) jl = 2
     767            0 :             IF (j .EQ. 3) ju = 2
     768              :             ai(j, i) = (-1._dp)**(i + j)*det* &
     769            0 :                        (A(IL, JL)*A(IU, JU) - A(IL, JU)*A(IU, JL))
     770              :          END DO
     771              :       END DO
     772              :       ! ==--------------------------------------------------------------==
     773            0 :       RETURN
     774              :    END SUBROUTINE calbrec
     775              :    ! ==================================================================
     776              : ! **************************************************************************************************
     777              : !> \brief ...
     778              : !> \param a ...
     779              : !> \param ai ...
     780              : !> \param ap ...
     781              : !> \param api ...
     782              : !> \param nat ...
     783              : !> \param ty ...
     784              : !> \param x ...
     785              : !> \param ntvec ...
     786              : !> \param tvec ...
     787              : !> \param f0 ...
     788              : !> \param isc ...
     789              : !> \param delta ...
     790              : ! **************************************************************************************************
     791            0 :    SUBROUTINE primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
     792              :       ! ==--------------------------------------------------------------==
     793              :       ! == DETERMINATION OF THE TRANSLATION VECTORS ASSOCIATED WITH     ==
     794              :       ! == THE IDENTITY SYMMETRY I.E. IF THE CELL IS DUPLICATED         ==
     795              :       ! == GIVE ALSO THE PRIMITIVE DIRECT AND RECIPROCAL LATTICE VECTOR ==
     796              :       ! ==--------------------------------------------------------------==
     797              :       ! == INPUT:                                                       ==
     798              :       ! ==   A(3,3)   A(I,J) IS THE I-TH CARTESIAN COMPONENT            ==
     799              :       ! ==            OF THE J-TH TRANSLATION VECTOR OF                 ==
     800              :       ! ==            THE DIRECT LATTICE                                ==
     801              :       ! ==   AI(3,3)  RECIPROCAL VECTOR BASIS (CARTESIAN)               ==
     802              :       ! ==   NAT      NUMBER OF ATOMS                                   ==
     803              :       ! ==   TY(NAT)  TYPE OF ATOMS                                     ==
     804              :       ! ==   X(3,NAT) ATOMIC COORDINATES IN CARTESIAN COORDINATES       ==
     805              :       ! == DELTA      REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)         ==
     806              :       ! == OUTPUT:                                                      ==
     807              :       ! ==   AP(3,3)  COMPONENTS OF THE PRIMITIVE TRANSLATION VECTORS   ==
     808              :       ! ==   API(3,3) PRIMITIVE RECIPROCAL BASIS VECTORS                ==
     809              :       ! ==            BOTH BAISI ARE IN CARTESIAN COORDINATES           ==
     810              :       ! ==   NTVEC    NUMBER OF TRANSLATION VECTORS (FRACTIONNAL)       ==
     811              :       ! ==   TVEC(3,NTVEC) COMPONENTS OF TRANSLATIONAL VECTORS          ==
     812              :       ! ==                 (CRYSTAL COORDINATES)                        ==
     813              :       ! ==   F0(49,NAT)    GIVES INEQUIVALENT ATOM FOR EACH ATOM        ==
     814              :       ! ==                 THE 49-TH LINE                               ==
     815              :       ! ==   ISC(NAT)      SCRATCH ARRAY                                ==
     816              :       ! ==--------------------------------------------------------------==
     817              :       REAL(dp)                                           :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
     818              :       INTEGER                                            :: nat, ty(nat)
     819              :       REAL(dp)                                           :: x(3, nat)
     820              :       INTEGER                                            :: ntvec
     821              :       REAL(dp)                                           :: tvec(3, nat)
     822              :       INTEGER                                            :: f0(49, nat), isc(nat)
     823              :       REAL(dp)                                           :: delta
     824              : 
     825              :       INTEGER                                            :: i, il, iv, j, k2
     826              :       LOGICAL                                            :: oksym
     827              :       REAL(dp)                                           :: vr(3), xb(3)
     828              : 
     829              : ! Variables
     830              : ! ==--------------------------------------------------------------==
     831              : ! First we check if there exist fractional translational vectors
     832              : ! associated with Identity operation i.e.
     833              : ! if the cell is duplicated or not.
     834              : 
     835            0 :       ntvec = 1
     836            0 :       tvec(1, 1) = 0._dp
     837            0 :       tvec(2, 1) = 0._dp
     838            0 :       tvec(3, 1) = 0._dp
     839            0 :       DO i = 1, nat
     840            0 :          f0(49, i) = i
     841              :       END DO
     842            0 :       DO k2 = 2, nat
     843            0 :          IF (ty(1) .NE. ty(k2)) GOTO 100
     844            0 :          DO i = 1, 3
     845            0 :             xb(i) = x(i, k2) - x(i, 1)
     846              :          END DO
     847              :          ! A fractional translation vector VR is defined.
     848            0 :          CALL rlv3(ai, xb, vr, il, delta)
     849            0 :          CALL checkrlv3(1, nat, ty, x, x, vr, f0, ai, isc, .TRUE., oksym, delta)
     850            0 :          IF (oksym) THEN
     851              :             ! A fractional translational vector is found
     852            0 :             ntvec = ntvec + 1
     853              :             ! F0(49,1:NAT) gives number of equivalent atoms
     854              :             ! and has atom indexes of inequivalent atoms (for translation)
     855            0 :             DO i = 1, nat
     856            0 :                IF (f0(49, i) .GT. f0(1, i)) f0(49, i) = f0(1, i)
     857              :             END DO
     858            0 :             DO i = 1, 3
     859            0 :                tvec(i, ntvec) = vr(i)
     860              :             END DO
     861              :          END IF
     862            0 : 100      CONTINUE
     863              :       END DO
     864              :       ! ==-------------------------------------------------------------==
     865            0 :       DO i = 1, 3
     866            0 :          ap(1, i) = a(1, i)
     867            0 :          ap(2, i) = a(2, i)
     868            0 :          ap(3, i) = a(3, i)
     869            0 :          api(1, i) = ai(1, i)
     870            0 :          api(2, i) = ai(2, i)
     871            0 :          api(3, i) = ai(3, i)
     872              :       END DO
     873            0 :       IF (ntvec .EQ. 1) THEN
     874              :          ! The current cell is definitely a primitive one
     875              :          ! Copy A and AI to AP and API
     876              :       ELSE
     877              :          ! We are looking for the primitive lattice vector basis set
     878              :          ! AP is our current lattice vector basis
     879            0 :          DO iv = 2, ntvec
     880              :             ! TVEC in cartesian coordinates
     881            0 :             DO i = 1, 3
     882              :                xb(i) = tvec(1, iv)*a(i, 1) &
     883              :                        + TVEC(2, IV)*A(I, 2) &
     884            0 :                        + TVEC(3, IV)*A(I, 3)
     885              :             END DO
     886              :             ! We calculare TVEC in AP basis
     887            0 :             CALL rlv3(api, xb, vr, il, delta)
     888            0 :             DO i = 1, 3
     889            0 :                IF (ABS(vr(i)) .GT. delta) THEN
     890            0 :                   il = NINT(1._dp/ABS(vr(i)))
     891            0 :                   IF (il .GT. 1) THEN
     892              :                      ! We replace AP(1:3,I) by TVEC(1:3,IV)
     893            0 :                      DO j = 1, 3
     894            0 :                         ap(j, i) = xb(j)
     895              :                      END DO
     896              :                      ! Calculate new API
     897            0 :                      CALL calbrec(ap, api)
     898            0 :                      GOTO 200  ! EXIT
     899              :                   END IF
     900              :                END IF
     901              :             END DO
     902            0 : 200         CONTINUE
     903              :          END DO
     904              :       END IF
     905              :       ! ==--------------------------------------------------------------==
     906            0 :       RETURN
     907              :    END SUBROUTINE primlatt
     908              :    ! ==================================================================
     909              : ! **************************************************************************************************
     910              : !> \brief ...
     911              : !> \param a ...
     912              : !> \param ai ...
     913              : !> \param ihc ...
     914              : !> \param nc ...
     915              : !> \param ib ...
     916              : !> \param ihg ...
     917              : !> \param r ...
     918              : !> \param delta ...
     919              : ! **************************************************************************************************
     920            0 :    SUBROUTINE pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
     921              :       ! ==--------------------------------------------------------------==
     922              :       ! == WRITTEN ON SEPTEMBER 11TH, 1979 - FROM ACMI COMPLEX          ==
     923              :       ! == AUXILIARY SUBROUTINE TO GROUP1                               ==
     924              :       ! == SUBROUTINE PGL DETERMINES THE POINT GROUP OF THE LATTICE     ==
     925              :       ! == AND THE CRYSTAL SYSTEM.                                      ==
     926              :       ! == SUBROUTINES NEEDED: ROT1, RLV3                               ==
     927              :       ! ==--------------------------------------------------------------==
     928              :       ! == WARNING: FOR THE HEXAGONAL SYSTEM, THE 3RD AXIS SUPPOSE      ==
     929              :       ! ==          TO BE THE SIX-FOLD AXIS                             ==
     930              :       ! ==--------------------------------------------------------------==
     931              :       ! == INPUT:                                                       ==
     932              :       ! == A ..... DIRECT LATTICE VECTORS                               ==
     933              :       ! == AI .... RECIPROCAL LATTICE VECTORS                           ==
     934              :       ! == DELTA.. REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)            ==
     935              :       ! ==--------------------------------------------------------------==
     936              :       ! == OUTPUT:                                                      ==
     937              :       ! == IHC .... CODE DISTINGUISHING BETWEEN HEXAGONAL AND CUBIC     ==
     938              :       ! ==          GROUPS                                              ==
     939              :       ! ==          IHC=0 STANDS FOR HEXAGONAL GROUPS                   ==
     940              :       ! ==          IHC=1 STANDS FOR CUBIC GROUPS                       ==
     941              :       ! == NC .... NUMBER OF ROTATIONS IN THE POINT GROUP               ==
     942              :       ! == IB .... SET OF ROTATION                                      ==
     943              :       ! == IHG .... POINT GROUP OF THE PRIMITIVE LATTICE, HOLOHEDRAL    ==
     944              :       ! ==          GROUP NUMBER:                                       ==
     945              :       ! ==          IHG=1 STANDS FOR TRICLINIC    SYSTEM                ==
     946              :       ! ==          IHG=2 STANDS FOR MONOCLINIC   SYSTEM                ==
     947              :       ! ==          IHG=3 STANDS FOR ORTHORHOMBIC SYSTEM                ==
     948              :       ! ==          IHG=4 STANDS FOR TETRAGONAL   SYSTEM                ==
     949              :       ! ==          IHG=5 STANDS FOR CUBIC        SYSTEM                ==
     950              :       ! ==          IHG=6 STANDS FOR TRIGONAL     SYSTEM                ==
     951              :       ! ==          IHG=7 STANDS FOR HEXAGONAL    SYSTEM                ==
     952              :       ! == R ...... LIST OF THE 3 X 3 ROTATION MATRICES                 ==
     953              :       ! ==          (XYZ REPRESENTATION OF THE O(H) OR D(6)H GROUPS)    ==
     954              :       ! ==          ALL 48 OR 24 MATRICES ARE LISTED.                   ==
     955              :       ! ==          FOLLOW NOTATION OF WORLTON-WARREN(1972)             ==
     956              :       ! ==--------------------------------------------------------------==
     957              :       REAL(dp)                                           :: a(3, 3), ai(3, 3)
     958              :       INTEGER                                            :: ihc, nc, ib(48), ihg
     959              :       REAL(dp)                                           :: r(3, 3, 48), delta
     960              : 
     961              :       INTEGER                                            :: i, j, k, lx, n, nr
     962              :       REAL(dp)                                           :: tr, vr(3), xa(3)
     963              : 
     964            0 :       DO ihc = 0, 1
     965              :          ! IHC is 0 for hexagonal groups and 1 for cubic groups.
     966            0 :          IF (ihc .EQ. 0) THEN
     967              :             nr = 24
     968              :          ELSE
     969            0 :             nr = 48
     970              :          END IF
     971            0 :          nc = 0
     972              :          ! Constructs rotation operations.
     973            0 :          CALL rot1(ihc, r)
     974            0 :          DO n = 1, nr
     975            0 :             ib(n) = 0
     976              :             ! Rotate the A1,2,3 vectors by rotation No. N
     977            0 :             DO k = 1, 3
     978            0 :                DO i = 1, 3
     979            0 :                   xa(i) = 0._dp
     980            0 :                   DO j = 1, 3
     981            0 :                      xa(i) = xa(i) + r(i, j, n)*a(j, k)
     982              :                   END DO
     983              :                END DO
     984            0 :                CALL rlv3(ai, xa, vr, lx, delta)
     985            0 :                tr = 0._dp
     986            0 :                DO i = 1, 3
     987            0 :                   tr = tr + ABS(vr(i))
     988              :                END DO
     989              :                ! If VR.ne.0, then XA cannot be a multiple of a lattice vector
     990            0 :                IF (tr .GT. delta) GOTO 140
     991              :             END DO
     992            0 :             nc = nc + 1
     993            0 :             ib(nc) = n
     994            0 : 140         CONTINUE
     995              :          END DO
     996              :          ! ==------------------------------------------------------------==
     997              :          ! IHG stands for holohedral group number.
     998            0 :          IF (ihc .EQ. 0) THEN
     999              :             ! Hexagonal group:
    1000            0 :             IF (nc .EQ. 12) ihg = 6
    1001            0 :             IF (nc .GT. 12) ihg = 7
    1002            0 :             IF (nc .GE. 12) RETURN
    1003              :             ! Too few operations, try cubic group: (IHC=1,NR=48)
    1004              :          ELSE
    1005              :             ! Cubic group:
    1006            0 :             IF (nc .LT. 4) ihg = 1
    1007            0 :             IF (nc .EQ. 4) ihg = 2
    1008            0 :             IF (nc .GT. 4) ihg = 3
    1009            0 :             IF (nc .EQ. 16) ihg = 4
    1010            0 :             IF (nc .GT. 16) ihg = 5
    1011            0 :             RETURN
    1012              :          END IF
    1013              :       END DO
    1014              :       ! ==--------------------------------------------------------------==
    1015              :       RETURN
    1016              :    END SUBROUTINE pgl1
    1017              :    ! ==================================================================
    1018              : ! **************************************************************************************************
    1019              : !> \brief ...
    1020              : !> \param ai ...
    1021              : !> \param xb ...
    1022              : !> \param vr ...
    1023              : !> \param il ...
    1024              : !> \param delta ...
    1025              : ! **************************************************************************************************
    1026            0 :    SUBROUTINE rlv3(ai, xb, vr, il, delta)
    1027              :       ! ==--------------------------------------------------------------==
    1028              :       ! == WRITTEN ON SEPTEMBER 11TH, 1979 - FROM ACMI COMPLEX          ==
    1029              :       ! == AUXILIARY SUBROUTINE TO GROUP1                               ==
    1030              :       ! == SUBROUTINE RLV REMOVES A DIRECT LATTICE VECTOR               ==
    1031              :       ! == FROM XB LEAVING THE REMAINDER IN VR.                         ==
    1032              :       ! == IF A NONZERO LATTICE VECTOR WAS REMOVED, IL IS MADE NONZERO. ==
    1033              :       ! == VR STANDS FOR V-REFERENCE.                                   ==
    1034              :       ! ==--------------------------------------------------------------==
    1035              :       ! == INPUT:                                                       ==
    1036              :       ! ==    AI(I,J) ARE THE RECIPROCAL LATTICE VECTORS,               ==
    1037              :       ! ==            B(I) = AI(I,J),J=1,2,3                            ==
    1038              :       ! ==    XB(1:3) VECTOR IN CARTESIAN COORDINATES                   ==
    1039              :       ! == DELTA      REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)         ==
    1040              :       ! == OUTPUT:                                                      ==
    1041              :       ! ==    VR IS NOT GIVEN IN CARTESIAN COORDINATES BUT              ==
    1042              :       ! ==       IN THE SYSTEM A1,A2,A3 (CRYSTAL COORDINATES)           ==
    1043              :       ! ==       AND BETWEEN -1/2 AND 1/2                               ==
    1044              :       ! ==    IL ABS OF VR                                              ==
    1045              :       ! == K.K., 23.10.1979                                             ==
    1046              :       ! ==--------------------------------------------------------------==
    1047              :       REAL(dp)                                           :: ai(3, 3), xb(3), vr(3)
    1048              :       INTEGER                                            :: il
    1049              :       REAL(dp)                                           :: delta
    1050              : 
    1051              :       INTEGER                                            :: i
    1052              :       REAL(dp)                                           :: ts
    1053              : 
    1054            0 :       il = 0
    1055            0 :       DO i = 1, 3
    1056            0 :          vr(i) = 0._dp
    1057              :       END DO
    1058            0 :       ts = ABS(xb(1)) + ABS(xb(2)) + ABS(xb(3))
    1059            0 :       IF (ts .LE. delta) RETURN
    1060            0 :       DO i = 1, 3
    1061            0 :          vr(i) = vr(i) + ai(i, 1)*xb(1) + ai(i, 2)*xb(2) + ai(i, 3)*xb(3)
    1062            0 :          il = il + NINT(ABS(vr(i)))
    1063              :          ! Change in order to have correct determination of origin and
    1064              :          ! symmorphic group (T.D 30/03/98)
    1065              :          ! VR(I) = - MOD(real(VR(I),kind=dp),1._dp)
    1066            0 :          vr(i) = NINT(vr(i)) - vr(i)
    1067              :       END DO
    1068              :       ! ==--------------------------------------------------------------==
    1069              :       RETURN
    1070              :    END SUBROUTINE rlv3
    1071              :    ! ==================================================================
    1072              : ! **************************************************************************************************
    1073              : !> \brief ...
    1074              : !> \param iout ...
    1075              : !> \param r ...
    1076              : !> \param v ...
    1077              : !> \param x ...
    1078              : !> \param f0 ...
    1079              : !> \param origin ...
    1080              : !> \param ib ...
    1081              : !> \param ty ...
    1082              : !> \param nat ...
    1083              : !> \param ihg ...
    1084              : !> \param ihc ...
    1085              : !> \param rx ...
    1086              : !> \param nc ...
    1087              : !> \param indpg ...
    1088              : !> \param ntvec ...
    1089              : !> \param a ...
    1090              : !> \param ai ...
    1091              : !> \param li ...
    1092              : !> \param isy ...
    1093              : !> \param isc ...
    1094              : !> \param delta ...
    1095              : ! **************************************************************************************************
    1096            0 :    SUBROUTINE atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, &
    1097            0 :                      rx, nc, indpg, ntvec, a, ai, li, isy, isc, delta)
    1098              :       ! ==--------------------------------------------------------------==
    1099              :       ! == WRITTEN ON SEPTEMBER 11TH, 1979 - FROM ACMI COMPLEX          ==
    1100              :       ! == AUXILIARY SUBROUTINE TO GROUP1                               ==
    1101              :       ! == SUBROUTINE ATFTMT DETERMINES                                 ==
    1102              :       ! ==            THE POINT GROUP OF THE CRYSTAL,                   ==
    1103              :       ! ==            THE ATOM TRANSFORMATION TABLE,F0,                 ==
    1104              :       ! ==            THE FRACTIONAL TRANSLATIONS,V,                    ==
    1105              :       ! ==            ASSOCIATED WITH EACH ROTATION.                    ==
    1106              :       ! == SUBROUTINES NEEDED: RLV3 CHECKRLV3 SYMMORPHIC STOPGM XSTRING ==
    1107              :       ! == MAY 14TH,1998: A LOT OF CHANGES (ARGUMENTS)                  ==
    1108              :       ! ==                BETTER DETERMINATION OF V                     ==
    1109              :       ! == SEP 15TH,1998: DETERMINATION OF FRACTIONAL TRANSLATIONAL VEC.==
    1110              :       ! ==--------------------------------------------------------------==
    1111              :       ! == INPUT:                                                       ==
    1112              :       ! ==   IOUT Logical file number (output)                          ==
    1113              :       ! ==        If IOUT.LE.0 no message                               ==
    1114              :       ! ==   IHG  Holohedral group number (determined by PGL1)          ==
    1115              :       ! ==   IHC  Code distinguishing between hexagonal and cubic groups==
    1116              :       ! ==          IHC=0 stands for hexagonal groups                   ==
    1117              :       ! ==          IHC=1 stands for cubic groups                       ==
    1118              :       ! ==   NC   Number of rotation operations                         ==
    1119              :       ! ==   NAT  Number of atoms (used in the routine)                 ==
    1120              :       ! ==   X    Coordinates of atoms (cartesian)                      ==
    1121              :       ! ==   TY   Type of atoms                                         ==
    1122              :       ! ==   R    Sets of transformation operations (cartesian)         ==
    1123              :       ! ==   IB   Index giving NC operations in R                       ==
    1124              :       ! ==   AI   Reciprocal lattice vectors                            ==
    1125              :       ! ==   NTVEC Number of translational vectors                      ==
    1126              :       ! ==        associated with Identity                              ==
    1127              :       ! ==        if primitive cell NTVEC=1, TVEC=(0,0,0)               ==
    1128              :       ! == DELTA  REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)             ==
    1129              :       ! == OUTPUT:                                                      ==
    1130              :       ! ==   RX(3,NAT) Scratch array                                    ==
    1131              :       ! ==   ISC(NAT)  Scratch array                                    ==
    1132              :       ! ==   NC        is modified (number of symmetry operations)      ==
    1133              :       ! ==   INDPG     Point group index                                ==
    1134              :       ! ==   V(3,48)   The fractional translations associated           ==
    1135              :       ! ==             with each rotation (crystal coordinates)         ==
    1136              :       ! ==   F0(1:48,NAT)                                               ==
    1137              :       ! ==        The atom transformation table for rotation (48,NAT)   ==
    1138              :       ! ==   ORIGIN Standard origin if symmorphic (crystal coordinates) ==
    1139              :       ! ==   ISY  = 1 Isommorphic group                                 ==
    1140              :       ! ==        =-1 Isommorphic group with non-standard origin        ==
    1141              :       ! ==        = 0 Non-Isommorphic group                             ==
    1142              :       ! ==        =-2 Undetermined (normally never)                     ==
    1143              :       ! == LI ..... Code indicating whether the point group             ==
    1144              :       ! ==          of the crystal contains inversion or not            ==
    1145              :       ! ==          (operations 13 or 25 in respectively hexagonal      ==
    1146              :       ! ==          or cubic groups).                                   ==
    1147              :       ! ==          LI=0    : does not contain inversion                ==
    1148              :       ! ==          LI.GT.0 : there is inversion in the point           ==
    1149              :       ! ==                    group of the crystal                      ==
    1150              :       ! ==--------------------------------------------------------------==
    1151              :       ! INDPG group   indpg   group    indpg  group     indpg   group   ==
    1152              :       ! == 1    1 (c1)    9    3m (c3v)   17  4/mmm(d4h)  25   222(d2)  ==
    1153              :       ! == 2   <1>(ci)   10   <3>m(d3d)   18     6 (c6)   26   mm2(c2v) ==
    1154              :       ! == 3    2 (c2)   11     4 (c4)    19    <6>(c3h)  27   mmm(d2h) ==
    1155              :       ! == 4    m (c1h)  12    <4>(s4)    20    6/m(c6h)  28   23 (t)   ==
    1156              :       ! == 5   2/m(c2h)  13    4/m(c4h)   21    622(d6)   29   m3 (th)  ==
    1157              :       ! == 6    3 (c3)   14    422(d4)    22    6mm(c6v)  30   432(o)   ==
    1158              :       ! == 7   <3>(c3i)  15    4mm(c4v)   23  <6>m2(d3h)  31 <4>3m(td)  ==
    1159              :       ! == 8   32 (d3)   16  <4>2m(d2d)   24  6/mmm(d6h)  32   m3m(oh)  ==
    1160              :       ! ==--------------------------------------------------------------==
    1161              :       ! rname_cubic: Name of 48 rotations (convention Warren-Worlton)
    1162              :       INTEGER                                            :: iout
    1163              :       REAL(dp)                                           :: r(3, 3, 48), v(3, 48), origin(3)
    1164              :       INTEGER                                            :: ib(48), nat, ty(nat), f0(49, nat)
    1165              :       REAL(dp)                                           :: x(3, nat)
    1166              :       INTEGER                                            :: ihg, ihc
    1167              :       REAL(dp)                                           :: rx(3, nat)
    1168              :       INTEGER                                            :: nc, indpg, ntvec
    1169              :       REAL(dp)                                           :: a(3, 3), ai(3, 3)
    1170              :       INTEGER                                            :: li, isy, isc(nat)
    1171              :       REAL(dp)                                           :: delta
    1172              : 
    1173              :       CHARACTER(len=10), DIMENSION(48), PARAMETER :: rname_cubic = (/' 1        ', ' 2[ 10 0] ', &
    1174              :          ' 2[ 01 0] ', ' 2[ 00 1] ', ' 3[-1-1-1]', ' 3[ 11-1] ', ' 3[-11 1] ', ' 3[ 1-11] ', &
    1175              :          ' 3[ 11 1] ', ' 3[-11-1] ', ' 3[-1-11] ', ' 3[ 1-1-1]', ' 2[-11 0] ', ' 4[ 00 1] ', &
    1176              :          ' 4[ 00-1] ', ' 2[ 11 0] ', ' 2[ 0-11] ', ' 2[ 01 1] ', ' 4[ 10 0] ', ' 4[-10 0] ', &
    1177              :          ' 2[-10 1] ', ' 4[ 0-10] ', ' 2[ 10 1] ', ' 4[ 01 0] ', '-1        ', '-2[ 10 0] ', &
    1178              :          '-2[ 01 0] ', '-2[ 00 1] ', '-3[-1-1-1]', '-3[ 11-1] ', '-3[-11 1] ', '-3[ 1-11] ', &
    1179              :          '-3[ 11 1] ', '-3[-11-1] ', '-3[-1-11] ', '-3[ 1-1-1]', '-2[-11 0] ', '-4[ 00 1] ', &
    1180              :          '-4[ 00-1] ', '-2[ 11 0] ', '-2[ 0-11] ', '-2[ 01 1] ', '-4[ 10 0] ', '-4[-10 0] ', &
    1181              :          '-2[-10 1] ', '-4[ 0-10] ', '-2[ 10 1] ', '-4[ 01 0] '/)
    1182              :       CHARACTER(len=11), DIMENSION(24), PARAMETER :: rname_hexai = (/' 1         ', ' 6[ 00  1] ', &
    1183              :          ' 3[ 00  1] ', ' 2[ 00  1] ', ' 3[ 00 -1] ', ' 6[ 00 -1] ', ' 2[ 01  0] ', ' 2[-11  0] ', &
    1184              :          ' 2[ 10  0] ', ' 2[ 21  0] ', ' 2[ 11  0] ', ' 2[ 12  0] ', '-1         ', '-6[ 00  1] ', &
    1185              :          '-3[ 00  1] ', '-2[ 00  1] ', '-3[ 00 -1] ', '-6[ 00 -1] ', '-2[ 01  0] ', '-2[-11  0] ', &
    1186              :          '-2[ 10  0] ', '-2[ 21  0] ', '-2[ 11  0] ', '-2[ 12  0] '/)
    1187              :       CHARACTER(len=12), DIMENSION(7), PARAMETER :: icst = (/'TRICLINIC   ', 'MONOCLINIC  ', &
    1188              :          'ORTHORHOMBIC', 'TETRAGONAL  ', 'CUBIC       ', 'TRIGONAL    ', 'HEXAGONAL   '/)
    1189              :       CHARACTER(len=3), DIMENSION(32), PARAMETER :: pgrd = (/'c1 ', 'ci ', 'c2 ', 'c1h', 'c2h', &
    1190              :          'c3 ', 'c3i', 'd3 ', 'c3v', 'd3 ', 'c4 ', 's4 ', 'c4h', 'd4 ', 'c4v', 'd2d', 'd4h', 'c6 ',&
    1191              :          'c3h', 'c6h', 'd6 ', 'c6v', 'd3h', 'd6h', 'd2 ', 'c2v', 'd2h', 't  ', 'th ', 'o  ', 'td ',&
    1192              :          'oh '/)
    1193              :       CHARACTER(len=5), DIMENSION(32), PARAMETER :: pgrp = (/'    1', '  <1>', '    2', '    m', &
    1194              :          '  2/m', '    3', '  <3>', '   32', '   3m', ' <3>m', '    4', '  <4>', '  4/m', '  422', &
    1195              :          '  4mm', '<4>2m', '4/mmm', '    6', '  <6>', '  6/m', '  622', '  6mm', '<6>m2', '6/mmm', &
    1196              :          '  222', '  mm2', '  mmm', '   23', '   m3', '  432', '<4>3m', '  m3m'/)
    1197              : 
    1198              :       INTEGER                                            :: i, iis(48), il, info, j, k, k2, l, n, &
    1199              :                                                             nca, ni
    1200              :       LOGICAL                                            :: nodupli, oksym
    1201              :       REAL(dp)                                           :: vc(3, 48), vr(3), vs, xb(3)
    1202              : 
    1203            0 :       nodupli = ntvec .EQ. 1
    1204            0 :       nca = 0
    1205            0 :       DO n = 1, 48
    1206            0 :          iis(n) = 0
    1207              :       END DO
    1208              :       ! Calculate translational vector for each operation
    1209              :       ! and atom transformation table.
    1210            0 :       DO n = 1, nc
    1211            0 :          l = ib(n)
    1212            0 :          iis(l) = 1
    1213            0 :          DO k = 1, nat
    1214            0 :             DO i = 1, 3
    1215            0 :                rx(i, k) = r(i, 1, l)*x(1, k) + r(i, 2, l)*x(2, k) + r(i, 3, l)*x(3, k)
    1216              :             END DO
    1217              :          END DO
    1218            0 :          DO k = 1, 3
    1219            0 :             vr(k) = 0._dp
    1220              :          END DO
    1221              :          ! First we determine for VR=(/0,0,0/)
    1222              :          ! IMPORTANT IF NOT UNIQUE ATOMS FOR DETERMINATION OF SYMMORPHIC
    1223            0 :          CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
    1224            0 :          IF (oksym) THEN
    1225              :             GOTO 190
    1226              :          END IF
    1227              :          ! Now we try other possible VR
    1228              :          ! F0(49,1:NAT) has only inequivalent atom indexes for translation
    1229            0 :          DO k2 = 1, nat
    1230            0 :             IF (f0(49, k2) .LT. k2) GOTO 185
    1231            0 :             IF (ty(1) .NE. ty(k2)) GOTO 185
    1232            0 :             DO i = 1, 3
    1233            0 :                xb(i) = rx(i, 1) - x(i, k2)
    1234              :             END DO
    1235              :             ! A translation vector VR is defined.
    1236            0 :             CALL rlv3(ai, xb, vr, il, delta)
    1237              :             ! ==----------------------------------------------------------==
    1238              :             ! == SUBROUTINE RLV3 REMOVES A DIRECT LATTICE VECTOR FROM XB  ==
    1239              :             ! == LEAVING THE REMAINDER IN VR. IF A NONZERO LATTICE        ==
    1240              :             ! == VECTOR WAS REMOVED, IL IS MADE NONZERO.                  ==
    1241              :             ! == VR STANDS FOR V-REFERENCE.                               ==
    1242              :             ! == VR IS NOT GIVEN IN CARTESIAN COORDINATES BUT             ==
    1243              :             ! == IN THE SYSTEM A1,A2,A3.     K.K., 23.10.1979             ==
    1244              :             ! ==----------------------------------------------------------==
    1245            0 :             CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
    1246            0 :             IF (oksym) THEN
    1247              :                GOTO 190
    1248              :             END IF
    1249            0 : 185         CONTINUE
    1250              :          END DO
    1251            0 :          iis(l) = 0
    1252            0 :          GOTO 210
    1253              : 190      CONTINUE
    1254            0 :          nca = nca + 1
    1255            0 :          DO i = 1, 3
    1256            0 :             v(i, nca) = vr(i)
    1257              :          END DO
    1258              :          ! ==------------------------------------------------------------==
    1259              :          ! == V(I,N) IS THE I-TH COMPONENT OF THE FRACTIONAL             ==
    1260              :          ! == TRANSLATION ASSOCIATED WITH THE ROTATION N.                ==
    1261              :          ! == ATTENTION: V(I) ARE NOT CARTESIAN COMPONENTS, THEY ARE     ==
    1262              :          ! == GIVEN IN THE SYSTEM A1,A2,A3.                              ==
    1263              :          ! == K.K., 23.10. 1979                                         ==
    1264              :          ! ==------------------------------------------------------------==
    1265            0 : 210      CONTINUE
    1266              :       END DO
    1267              :       ! Remove unused operations
    1268            0 :       i = 0
    1269            0 :       ni = 13
    1270            0 :       IF (ihg .LT. 6) ni = 25
    1271            0 :       li = 0
    1272            0 :       DO n = 1, nc
    1273            0 :          l = ib(n)
    1274            0 :          IF (iis(l) .EQ. 0) GOTO 230 ! CYCLE
    1275            0 :          i = i + 1
    1276            0 :          ib(i) = ib(n)
    1277            0 :          IF (ib(i) .EQ. ni) li = i
    1278            0 :          DO k = 1, nat
    1279            0 :             f0(i, k) = f0(n, k)
    1280              :          END DO
    1281            0 : 230      CONTINUE
    1282              :       END DO
    1283              :       ! ==--------------------------------------------------------------==
    1284            0 :       nc = i
    1285            0 :       vs = 0._dp
    1286            0 :       DO n = 1, nc
    1287            0 :          vs = vs + ABS(v(1, n)) + ABS(v(2, n)) + ABS(v(3, n))
    1288              :       END DO
    1289              :       ! THE ORIGINAL VALUE DELTA=0.0001 WAS MODIFIED
    1290              :       ! BY K.K. , SEPTEMBER 1979 TO 0.0005
    1291              :       ! AND RETURNED TO 0.0001 BY RJN OCT 1987
    1292            0 :       IF (vs .GT. delta) THEN
    1293            0 :          isy = 0
    1294              :       ELSE
    1295            0 :          isy = 1
    1296              :       END IF
    1297              :       ! ==--------------------------------------------------------------==
    1298              :       ! Determination of the point group
    1299              :       ! (Thierry Deutsch - 1998 [Maybe not complete!!])
    1300            0 :       IF (ihg .LT. 6) THEN
    1301            0 :          IF (nc .EQ. 0) THEN
    1302            0 :             IF (iout > 0) &
    1303            0 :                WRITE (iout, '(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nC
    1304            0 :             CALL stopgm('ATFTM1', 'NUMBER OF ROTATION NULL')
    1305              :             ! Triclinic system
    1306            0 :          ELSEIF (nc .EQ. 1) THEN
    1307              :             ! IB=1
    1308            0 :             indpg = 1           ! 1 (c1)
    1309            0 :          ELSEIF (nc .EQ. 2 .AND. ib(2) .EQ. 25) THEN
    1310              :             ! IB=125
    1311            0 :             indpg = 2           ! <1>(ci)
    1312            0 :          ELSEIF (nc .EQ. 2 .AND. ( &
    1313              :                  ib(2) .EQ. 4 .OR. & ! 2[001]
    1314              :                  ib(2) .EQ. 2 .OR. & ! 2[100]
    1315              :                  ib(2) .EQ. 3)) THEN ! 2[010]
    1316              :             ! Monoclinic system
    1317              :             ! IB=14 (z-axis) OR
    1318              :             ! IB=12 (x-axis) OR
    1319              :             ! IB=13 (y-axis)
    1320            0 :             indpg = 3           ! 2 (c2)
    1321            0 :          ELSEIF (nc .EQ. 2 .AND. ( &
    1322              :                  ib(2) .EQ. 28 .OR. &
    1323              :                  ib(2) .EQ. 26 .OR. &
    1324              :                  ib(2) .EQ. 27)) THEN
    1325              :             ! IB=128 (z-axis) OR
    1326              :             ! IB=126 (x-axis) OR
    1327              :             ! IB=127 (y-axis)
    1328            0 :             indpg = 4           ! m (c1h)
    1329            0 :          ELSEIF (nc .EQ. 4 .AND. ( &
    1330              :                  ib(4) .EQ. 28 .OR. & ! 2[001]
    1331              :                  ib(4) .EQ. 27 .OR. & ! 2[010]
    1332              :                  ib(4) .EQ. 26 .OR. & ! 2[100]
    1333              :                  ib(4) .EQ. 37 .OR. & ! -2[-110]
    1334              :                  ib(4) .EQ. 40)) THEN ! 2[110]
    1335              :             ! IB=1  425 28 (z-axis)  OR
    1336              :             ! IB=1  225 26 (x-axis)  OR
    1337              :             ! IB=1  325 27 (y-axis)  OR
    1338              :             ! IB=113 2537 (-xy-axis)OR
    1339              :             ! IB=116 2540 (xy-axis)
    1340            0 :             indpg = 5           ! 2/m(c2h)
    1341            0 :          ELSEIF (nc .EQ. 4 .AND. ( &
    1342              :                  ib(4) .EQ. 15 .OR. &
    1343              :                  ib(4) .EQ. 20 .OR. &
    1344              :                  ib(4) .EQ. 24)) THEN
    1345              :             ! Tetragonal system
    1346              :             ! IB=14 1415 (z-axis) OR
    1347              :             ! IB=12 1920 (x-axis) OR
    1348              :             ! IB=13 2224 (y-axis)
    1349            0 :             indpg = 11          ! 4 (c4)
    1350            0 :          ELSEIF (nc .EQ. 4 .AND. ( &
    1351              :                  ib(4) .EQ. 39 .OR. &
    1352              :                  ib(4) .EQ. 44 .OR. &
    1353              :                  ib(4) .EQ. 48)) THEN
    1354              :             ! IB=14 3839 (z-axis) OR
    1355              :             ! IB=12 4344 (x-axis) OR
    1356              :             ! IB=13 4648 (y-axis)
    1357            0 :             indpg = 12          ! <4>(s4)
    1358            0 :          ELSEIF (nc .EQ. 8 .AND. ( &
    1359              :                  (ib(3) .EQ. 14 .AND. ib(8) .EQ. 39) .OR. &
    1360              :                  (ib(3) .EQ. 19 .AND. ib(8) .EQ. 44) .OR. &
    1361              :                  (ib(3) .EQ. 22 .AND. ib(8) .EQ. 48))) THEN
    1362              :             ! IB=14 1415 2825 3839 (z-axis) OR
    1363              :             ! IB=12 1920 2625 4344 (x-axis) OR
    1364              :             ! IB=13 2224 2725 4648 (y-axis)
    1365            0 :             indpg = 13          ! 422(d4)
    1366            0 :          ELSEIF (nc .EQ. 8 .AND. ib(4) .EQ. 4 .AND. ( &
    1367              :                  ib(8) .EQ. 16 .OR. &
    1368              :                  ib(8) .EQ. 20 .OR. &
    1369              :                  ib(8) .EQ. 24)) THEN
    1370              :             ! IB=12 3 413 1415 16 (z-axis) OR
    1371              :             ! IB=12 3 417 1920 18 (x-axis) OR
    1372              :             ! IB=12 3 421 2224 23 (y-axis)
    1373            0 :             indpg = 14          ! 4/m(c4h)
    1374            0 :          ELSEIF (nc .EQ. 8 .AND. ( &
    1375              :                  ib(8) .EQ. 40 .OR. &
    1376              :                  ib(8) .EQ. 42 .OR. &
    1377              :                  ib(8) .EQ. 47)) THEN
    1378              :             ! IB=14 1415 2627 3740 (z-axis) OR
    1379              :             ! IB=12 1920 2827 4142 (x-axis) OR
    1380              :             ! IB=13 2224 2628 4547 (y-axis)
    1381            0 :             indpg = 15          ! 4mm(c4v)
    1382            0 :          ELSEIF (nc .EQ. 8 .AND. ( &
    1383              :                  (ib(3) .EQ. 13 .AND. ib(8) .EQ. 39) .OR. &
    1384              :                  (ib(3) .EQ. 17 .AND. ib(8) .EQ. 44) .OR. &
    1385              :                  (ib(3) .EQ. 21 .AND. ib(8) .EQ. 48))) THEN
    1386              :             ! IB=14 1316 2627 3839 (z-axis) OR
    1387              :             ! IB=12 1718 2827 4344 (x-axis) OR
    1388              :             ! IB=13 2123 2628 4648 (y-axis)
    1389            0 :             indpg = 16          ! <4>2m(d2d)
    1390            0 :          ELSEIF (nc .EQ. 16 .AND. ( &
    1391              :                  ib(16) .EQ. 40 .OR. &
    1392              :                  ib(16) .EQ. 44 .OR. &
    1393              :                  ib(16) .EQ. 48)) THEN
    1394              :             ! IB=12 3 413 1415 1625 2627 2837 3839 40 (z-axis) OR
    1395              :             ! IB=12 3 417 1920 1825 2627 2841 4344 42 (x-axis) OR
    1396              :             ! IB=12 3 421 2224 2325 2627 2845 4648 47 (y-axis)
    1397            0 :             indpg = 17          ! 4/mmm(d4h)
    1398            0 :          ELSEIF (nc .EQ. 4 .AND. (ib(4) .EQ. 4)) THEN
    1399              :             ! Orthorhombic system
    1400              :             ! IB=12  3  4
    1401            0 :             indpg = 25          ! 222(d2)
    1402            0 :          ELSEIF (nc .EQ. 4 .AND. ( &
    1403              :                  ib(4) .EQ. 27 .OR. &
    1404              :                  ib(4) .EQ. 28)) THEN
    1405              :             ! IB=13 2627 (z-axis) OR
    1406              :             ! IB=12 2728 (x-axis) OR
    1407              :             ! IB=14 2628 (y-axis) OR
    1408            0 :             indpg = 26          ! mm2(c2v)
    1409            0 :          ELSEIF (nc .EQ. 8) THEN
    1410              :             ! IB=12 3 425 2627 28
    1411            0 :             indpg = 27          ! mmm(d2h)
    1412            0 :          ELSEIF (nc .EQ. 12 .AND. ( &
    1413              :                  ib(12) .EQ. 12 .OR. &
    1414              :                  ib(12) .EQ. 47 .OR. &
    1415              :                  ib(12) .EQ. 45)) THEN
    1416              :             ! Cubic system
    1417              :             ! IB=12  3  4  5  6  7  8  910 1112 OR
    1418              :             ! IB=15 1113 1823 2530 3537 4247 OR
    1419              :             ! IB=18 1016 1821 2532 3440 4245
    1420            0 :             indpg = 28          ! 23 (t)
    1421            0 :          ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 36) THEN
    1422              :             ! IB= 1  2  3  4  5  6  7  8  910 1112
    1423              :             ! 2526 2728 2930 3132 3334 3536
    1424            0 :             indpg = 29          ! m3 (th)
    1425            0 :          ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 24) THEN
    1426              :             ! IB=12 3 45 6 78 9 1011 12
    1427              :             ! 1314 1516 1718 1920 2122 2324
    1428            0 :             indpg = 30          ! 432 (o)
    1429            0 :          ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 48) THEN
    1430              :             ! IB=12 3 45 6 78 9 1011 12
    1431              :             ! 3738 3940 4142 4345 4647 48
    1432            0 :             indpg = 31          ! <4>3m(td)
    1433            0 :          ELSEIF (nc .EQ. 48) THEN
    1434              :             ! IB=1..48
    1435            0 :             indpg = 32          ! m3m(oh)
    1436              :          ELSE
    1437              :             ! WRITE(6,'(" ATFTM1! IHG=",A," NC=",I2)') ICST(IHG),NC
    1438              :             ! WRITE(6,'(" ATFTM1!",19I3)') (IB(I),I=1,NC)
    1439              :             ! WRITE(6,'(" ATFTM1! THIS CASE IS UNKNOWN IN THE DATABASE")')
    1440              :             ! Probably a sub-group of 32
    1441            0 :             indpg = -32
    1442              :          END IF
    1443              :       ELSEIF (ihg .GE. 6) THEN
    1444            0 :          IF (nc .EQ. 0) THEN
    1445            0 :             IF (iout > 0) &
    1446            0 :                WRITE (iout, '(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nC
    1447            0 :             CALL stopgm('ATFTM1', 'NUMBER OF ROTATION NULL')
    1448              :             ! Triclinic system
    1449            0 :          ELSEIF (nc .EQ. 1) THEN
    1450              :             ! IB=1
    1451            0 :             indpg = 1           ! 1 (c1)
    1452            0 :          ELSEIF (nc .EQ. 2 .AND. ib(2) .EQ. 13) THEN
    1453              :             ! IB=113
    1454            0 :             indpg = 2           ! <1>(ci)
    1455            0 :          ELSEIF (nc .EQ. 2 .AND. ( &
    1456              :                  ib(2) .EQ. 4)) THEN ! 2[001]
    1457              :             ! Monoclinic system
    1458              :             ! IB=1 4
    1459            0 :             indpg = 3           ! 2 (c2)
    1460            0 :          ELSEIF (nc .EQ. 2 .AND. ( &
    1461              :                  ib(2) .EQ. 16)) THEN
    1462              :             ! IB=116
    1463            0 :             indpg = 4           ! m (c1h)
    1464            0 :          ELSEIF (nc .EQ. 4 .AND. ( &
    1465              :                  ib(4) .EQ. 24 .OR. &
    1466              :                  ib(4) .EQ. 20)) THEN
    1467              :             ! IB=112 1324 OR
    1468              :             ! IB=1  813 20
    1469            0 :             indpg = 5           ! 2/m(c2h)
    1470            0 :          ELSEIF (nc .EQ. 3 .AND. ib(3) .EQ. 5) THEN
    1471              :             ! Trigonal system
    1472              :             ! IB=13 5
    1473            0 :             indpg = 6           ! 3 (c3)
    1474            0 :          ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 17) THEN
    1475              :             ! IB=113 1517 35
    1476            0 :             indpg = 7           ! <3>(c3i)
    1477            0 :          ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 11) THEN
    1478              :             ! IB=17 9 1135
    1479            0 :             indpg = 8           ! 32 (d3)
    1480            0 :          ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 23) THEN
    1481              :             ! IB=13 5 1921 23
    1482            0 :             indpg = 9           ! 3m (c3v)
    1483            0 :          ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 23) THEN
    1484              :             ! IB=13 5 79 1113 1517 1921 23
    1485            0 :             indpg = 10          ! <3>m(d3d)
    1486            0 :          ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 6) THEN
    1487              :             ! Hexagonal system
    1488              :             ! IB=12 3 45 6
    1489            0 :             indpg = 18          ! 6 (c6)
    1490            0 :          ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 18) THEN
    1491              :             ! IB=13 5 1416 18
    1492            0 :             indpg = 19          ! <6>(c3h)
    1493            0 :          ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 18) THEN
    1494              :             ! IB=12 3 45 6 1314 1516 1718
    1495            0 :             indpg = 20          ! 6/m(c6h)
    1496            0 :          ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 12) THEN
    1497              :             ! IB=12 3 45 6 78 9 1011 12
    1498            0 :             indpg = 21          ! 622(d6)
    1499            0 :          ELSEIF (nc .EQ. 12 .AND. ib(2) .EQ. 2 .AND. ib(12) .EQ. 24) THEN
    1500              :             ! IB=12 3 45 6 1920 2122 2324
    1501            0 :             indpg = 22          ! 6mm(c6v)
    1502            0 :          ELSEIF (nc .EQ. 12 .AND. ib(2) .EQ. 3 .AND. ib(12) .EQ. 24) THEN
    1503              :             ! IB=13 5 79 1114 1618 2022 24
    1504            0 :             indpg = 23          ! <6>m2(d3h)
    1505            0 :          ELSEIF (nc .EQ. 24) THEN
    1506              :             ! IB=1..24
    1507            0 :             indpg = 24          ! 6/mmm(d6h)
    1508              :          ELSE
    1509              :             ! Probably a sub-group of 24
    1510              :             ! WRITE(6,'(" ATFTM1! IHG=",A," NC=",I2)') ICST(IHG),NC
    1511              :             ! WRITE(6,'(" ATFTM1!",48I3)') (IB(I),I=1,NC)
    1512              :             ! WRITE(6,'(" ATFTM1! THIS CASE IS UNKNOWN IN THE DATABASE")')
    1513            0 :             indpg = -24
    1514              :          END IF
    1515              :       END IF
    1516              :       ! ==--------------------------------------------------------------==
    1517              :       ! == Determination if the space group is symmorphic or not        ==
    1518              :       ! ==--------------------------------------------------------------==
    1519            0 :       IF (isy .NE. 1) THEN
    1520              :          ! Transform V in cartesian coordinates
    1521            0 :          DO n = 1, nc
    1522            0 :             vc(1, n) = a(1, 1)*v(1, n) + a(1, 2)*v(2, n) + a(1, 3)*v(3, n)
    1523            0 :             vc(2, n) = a(2, 1)*v(1, n) + a(2, 2)*v(2, n) + a(2, 3)*v(3, n)
    1524            0 :             vc(3, n) = a(3, 1)*v(1, n) + a(3, 2)*v(2, n) + a(3, 3)*v(3, n)
    1525              :          END DO
    1526            0 :          CALL symmorphic(nc, ib, r, vc, ai, info, origin, delta)
    1527            0 :          IF (info .EQ. 1) THEN
    1528            0 :             CALL rlv3(ai, origin, xb, il, delta)
    1529              :             ! !!!RLV3 determines -XB in crystal coordinates
    1530              :             ! !!We want between 0.0 and 1.0
    1531            0 :             DO i = 1, 3
    1532            0 :                IF (-xb(i) .GE. 0._dp) THEN
    1533            0 :                   origin(i) = -xb(i)
    1534              :                ELSE
    1535            0 :                   origin(i) = 1._dp - xb(i)
    1536              :                END IF
    1537              :             END DO
    1538            0 :             DO i = 1, 3
    1539            0 :                xb(i) = a(i, 1)*origin(1) + a(i, 2)*origin(2) + a(i, 3)*origin(3)
    1540              :             END DO
    1541            0 :             isy = -1
    1542            0 :          ELSEIF (info .EQ. 0) THEN
    1543            0 :             isy = 0
    1544              :          ELSE
    1545            0 :             isy = -2
    1546              :          END IF
    1547              :       ELSE
    1548            0 :          DO i = 1, 3
    1549            0 :             origin(i) = 0._dp
    1550              :          END DO
    1551              :       END IF
    1552              :       ! ==--------------------------------------------------------------==
    1553              :       ! == Output                                                       ==
    1554              :       ! ==--------------------------------------------------------------==
    1555            0 :       IF (iout .GT. 0) THEN
    1556              :          IF (iout > 0) &
    1557            0 :             WRITE (iout, *)
    1558            0 :          CALL xstring(icst(ihg), i, j)
    1559            0 :          IF ((ihg .EQ. 7 .AND. nc .EQ. 24) .OR. &
    1560              :              (ihg .EQ. 5 .AND. nc .EQ. 48)) THEN
    1561            0 :             IF (iout > 0) &
    1562              :                WRITE (iout, '(A,A,A)') &
    1563            0 :                ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS THE FULL ', &
    1564            0 :                icst(ihg) (i:j), &
    1565            0 :                ' GROUP'
    1566              :          ELSE
    1567            0 :             IF (iout > 0) &
    1568              :                WRITE (iout, '(A,A,A,I2,A)') &
    1569            0 :                ' KPSYM| THE CRYSTAL SYSTEM IS ', &
    1570            0 :                icst(ihg) (i:j), &
    1571            0 :                ' WITH ', nc, ' OPERATIONS:'
    1572            0 :             IF (ihc .EQ. 0) THEN
    1573            0 :                IF (iout > 0) &
    1574            0 :                   WRITE (iout, '( 5(5(A13),/))') (rname_hexai(ib(i)), i=1, nc)
    1575              :             ELSE
    1576            0 :                IF (iout > 0) &
    1577            0 :                   WRITE (iout, '(10(5(A13),/))') (rname_cubic(ib(i)), i=1, nc)
    1578              :             END IF
    1579              :          END IF
    1580              :          ! ==------------------------------------------------------------==
    1581            0 :          IF (isy .EQ. 1) THEN
    1582            0 :             IF (iout > 0) &
    1583              :                WRITE (iout, '(A)') &
    1584            0 :                ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
    1585            0 :          ELSEIF (isy .EQ. -1) THEN
    1586            0 :             IF (iout > 0) &
    1587              :                WRITE (iout, '(A)') &
    1588            0 :                ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
    1589            0 :             IF (iout > 0) &
    1590              :                WRITE (iout, '(A,A,/,T3,3F10.6,3X,3F10.6)') &
    1591            0 :                ' KPSYM| THE STANDARD ORIGIN OF COORDINATES IS:   ', &
    1592            0 :                '[CARTESIAN]   [CRYSTAL]', xb, origin
    1593            0 :          ELSEIF (isy .EQ. 0) THEN
    1594            0 :             IF (iout > 0) &
    1595              :                WRITE (iout, '(A,/,3X,A,F15.6,A)') &
    1596            0 :                ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
    1597            0 :                ' (SUM OF TRANSLATION VECTORS=', vs, ')'
    1598            0 :          ELSEIF (isy .EQ. -2) THEN
    1599            0 :             IF (iout > 0) &
    1600              :                WRITE (iout, '(A,A)') &
    1601            0 :                ' KPSYM| CANNOT DETERMINE IF THE SPACE GROUP IS', &
    1602            0 :                ' SYMMORPHIC OR NOT'
    1603            0 :             IF (iout > 0) &
    1604              :                WRITE (iout, '(A,/,A,/,3X,A,F15.6,A)') &
    1605            0 :                ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
    1606            0 :                ' KPSYM| OR ELSE A NON STANDARD ORIGIN OF COORDINATES WAS USED.', &
    1607            0 :                ' KPSYM| (SUM OF TRANSLATION VECTORS=', vs, ')'
    1608              :          END IF
    1609            0 :          IF (indpg .GT. 0) THEN
    1610            0 :             CALL xstring(pgrp(indpg), i, j)
    1611            0 :             CALL xstring(pgrd(indpg), k, l)
    1612            0 :             IF (iout > 0) &
    1613              :                WRITE (iout, '(A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
    1614            0 :                ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS  ', pgrp(indpg) (i:j), &
    1615            0 :                pgrd(indpg) (k:l), indpg
    1616              :          ELSE
    1617            0 :             CALL xstring(pgrp(-indpg), i, j)
    1618            0 :             CALL xstring(pgrd(-indpg), k, l)
    1619            0 :             IF (iout > 0) &
    1620              :                WRITE (iout, '(A,I2,A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
    1621            0 :                ' KPSYM| POINT GROUP: GROUP ORDER=', nc, &
    1622            0 :                '    SUBGROUP OF ', pgrp(-indpg) (i:j), &
    1623            0 :                pgrd(-indpg) (k:l), -indpg
    1624              :          END IF
    1625            0 :          IF (ntvec .EQ. 1) THEN
    1626            0 :             IF (iout > 0) &
    1627              :                WRITE (iout, '(A,T60,I6)') &
    1628            0 :                ' KPSYM| NUMBER OF PRIMITIVE CELL:', ntvec
    1629              :          ELSE
    1630            0 :             IF (iout > 0) &
    1631              :                WRITE (iout, '(A,T60,I6)') &
    1632            0 :                ' KPSYM| NUMBER OF PRIMITIVE CELLS:', ntvec
    1633              :          END IF
    1634              :       END IF
    1635              : 
    1636            0 :    END SUBROUTINE atftm1
    1637              : 
    1638              : ! **************************************************************************************************
    1639              : !> \brief ...
    1640              : !> \param n ...
    1641              : !> \param nat ...
    1642              : !> \param ty ...
    1643              : !> \param rx ...
    1644              : !> \param x ...
    1645              : !> \param vr ...
    1646              : !> \param f0 ...
    1647              : !> \param ai ...
    1648              : !> \param isc ...
    1649              : !> \param nodupli ...
    1650              : !> \param oksym ...
    1651              : !> \param delta ...
    1652              : ! **************************************************************************************************
    1653            0 :    SUBROUTINE checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, &
    1654              :                         nodupli, oksym, delta)
    1655              :       ! ==--------------------------------------------------------------==
    1656              :       ! == WRITTEN IN MAY 14TH, 1998 (T.D.)                             ==
    1657              :       ! == CHECK IF RX+VR GIVES THE SAME LATTICE AS X                   ==
    1658              :       ! == BUILD THE ATOM TRANSFORMATION TABLE                          ==
    1659              :       ! ==--------------------------------------------------------------==
    1660              :       ! == INPUT:                                                       ==
    1661              :       ! ==   N   ROTATION NUMBER (INDEX USED IN F0 BETWEEN 1 AND 48)    ==
    1662              :       ! ==   NAT           NUMBER OF ATOMS                              ==
    1663              :       ! ==   TY(1:NAT)     TYPE OF ATOMS                                ==
    1664              :       ! ==   RX(1:3,1:NAT) ATOMIC COORDINATES FROM Nth ROTATION (CART.) ==
    1665              :       ! ==   X(1:3,1:NAT)  ATOMIC COORDINATES (CARTESIAN)               ==
    1666              :       ! ==   VR(1:3)       TRANSLATION VECTOR (CRYSTAL COOR.)           ==
    1667              :       ! ==   AI(1:3,1:3)   LATTICE RECIPROCAL VECTORS                   ==
    1668              :       ! ==   NODUPLI       .TRUE., THE CELL IS A PRIMITIVE ONE          ==
    1669              :       ! ==                 WE CAN SPEED UP                              ==
    1670              :       ! == DELTA           REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)    ==
    1671              :       ! == OUTPUT:                                                      ==
    1672              :       ! ==   F0(1:49,1:NAT) ATOM TRANSFORMATION TABLE                   ==
    1673              :       ! ==      F0 IS THE FUNCTION DEFINED IN MARADUDIN AND VOSK0       ==
    1674              :       ! ==      BY EQ.(2.35).                                           ==
    1675              :       ! ==      IT DEFINES THE ATOM TRANSFORMATION TABLE                ==
    1676              :       ! ==   OKSYM          TRUE IF RX+VR = X                           ==
    1677              :       ! ==   ISC(1:NAT)     SCRATCH ARRAY                               ==
    1678              :       ! ==                  USED TO SPEED UP THE ROUTINE                ==
    1679              :       ! ==                  EACH ATOM IS ONLY ONCE AN IMAGE             ==
    1680              :       ! ==                  IF NO DUPLICATION OF THE CELL               ==
    1681              :       ! ==--------------------------------------------------------------==
    1682              :       INTEGER                                            :: n, nat, ty(nat)
    1683              :       REAL(dp)                                           :: rx(3, nat), x(3, nat), vr(3)
    1684              :       INTEGER                                            :: f0(49, nat)
    1685              :       REAL(dp)                                           :: ai(3, 3)
    1686              :       INTEGER                                            :: isc(nat)
    1687              :       LOGICAL                                            :: nodupli, oksym
    1688              :       REAL(dp)                                           :: delta
    1689              : 
    1690              :       INTEGER                                            :: ia, ib, il
    1691              :       REAL(dp)                                           :: vt(3), xb(3)
    1692              : 
    1693            0 :       DO ia = 1, nat
    1694            0 :          isc(ia) = 0
    1695              :       END DO
    1696              :       ! Now we check if ROT(N)+VR gives a correct symmetry.
    1697            0 :       DO ia = 1, nat
    1698            0 :          DO ib = 1, nat
    1699            0 :             IF (ty(ia) .EQ. ty(ib) .AND. isc(ib) .EQ. 0) THEN
    1700            0 :                xb(1) = rx(1, ia) - x(1, ib)
    1701            0 :                xb(2) = rx(2, ia) - x(2, ib)
    1702            0 :                xb(3) = rx(3, ia) - x(3, ib)
    1703            0 :                CALL rlv3(ai, xb, vt, il, delta)
    1704              :                ! VT STANDS FOR V-TEST
    1705              :                oksym = (ABS((vr(1) - vt(1)) - NINT(vr(1) - vt(1))) .LT. delta) .AND. &
    1706              :                        (ABS((vr(2) - vt(2)) - NINT(vr(2) - vt(2))) .LT. delta) .AND. &
    1707            0 :                        (ABS((vr(3) - vt(3)) - NINT(vr(3) - vt(3))) .LT. delta)
    1708            0 :                IF (oksym) THEN
    1709            0 :                   IF (nodupli) isc(ib) = 1
    1710            0 :                   f0(n, ia) = ib
    1711              :                   ! IR+VR is the good one: another symmetry operation
    1712              :                   ! Next atom
    1713              :                   GOTO 100
    1714              :                END IF
    1715              :             END IF
    1716              :          END DO
    1717              :          ! VR is not the correct translation vector
    1718              :          RETURN
    1719            0 : 100      CONTINUE
    1720              :       END DO
    1721              :       ! ==--------------------------------------------------------------==
    1722              :       RETURN
    1723              :    END SUBROUTINE checkrlv3
    1724              :    ! ==================================================================
    1725              : ! **************************************************************************************************
    1726              : !> \brief ...
    1727              : !> \param nc ...
    1728              : !> \param ib ...
    1729              : !> \param r ...
    1730              : !> \param v ...
    1731              : !> \param ai ...
    1732              : !> \param info ...
    1733              : !> \param origin ...
    1734              : !> \param delta ...
    1735              : ! **************************************************************************************************
    1736            0 :    SUBROUTINE symmorphic(nc, ib, r, v, ai, info, origin, delta)
    1737              :       ! ==--------------------------------------------------------------==
    1738              :       ! == Check if the group is symmorphic with a non-standard origin  ==
    1739              :       ! == WARNING: If there are equivalent atoms, this routine could   ==
    1740              :       ! == not determine if the space group is symmorphic               ==
    1741              :       ! == So you have to check if the solution V=0 works (see ATFTM1)  ==
    1742              :       ! ==--------------------------------------------------------------==
    1743              :       ! == INPUT:                                                       ==
    1744              :       ! ==   NC Number of operations                                    ==
    1745              :       ! ==   IB(NC) Index of operation in R                             ==
    1746              :       ! ==   R(3,3,48) Rotations                                        ==
    1747              :       ! ==   V(3,NC) Fractional translations related to R(3,3,IB(NC))   ==
    1748              :       ! ==           R AND V ARE IN CARTESIAN COORDINATES               ==
    1749              :       ! ==   AI(I,J) ARE THE RECIPROCAL LATTICE VECTORS,                ==
    1750              :       ! ==           B(I) = AI(I,J),J=1,2,3                             ==
    1751              :       ! == DELTA     REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)          ==
    1752              :       ! ==                                                              ==
    1753              :       ! == OUTPUT:                                                      ==
    1754              :       ! ==   ORIGIN(1:3) Give standard origin (cartesian coordinates)   ==
    1755              :       ! ==            Give the standard origin with smallest coordinates==
    1756              :       ! ==            if NTVEC /= 1                                     ==
    1757              :       ! ==   INFO = 1 The group is symmorphic                           ==
    1758              :       ! ==   INFO = 0 The group is not symmorphic                       ==
    1759              :       ! ==   INFO =-1 The routine cannot determine                      ==
    1760              :       ! ==--------------------------------------------------------------==
    1761              :       INTEGER                                            :: nc, ib(nc)
    1762              :       REAL(dp)                                           :: r(3, 3, 48), v(3, nc), ai(3, 3)
    1763              :       INTEGER                                            :: info
    1764              :       REAL(dp)                                           :: origin(3), delta
    1765              : 
    1766              :       INTEGER                                            :: i, i1, ierror, igood(3), il, imissing2, &
    1767              :                                                             imissing3, iok(3), ionly, ir, j, j1
    1768              :       REAL(dp)                                           :: diag, dif, r2(2, 2), r3(3, 3), vr(3), &
    1769              :                                                             xb(3)
    1770              : 
    1771              : ! Variables
    1772              : ! ==--------------------------------------------------------------==
    1773              : ! Find a point A / V_R = (1-R).OA
    1774              : 
    1775            0 :       DO i = 1, 3
    1776            0 :          iok(i) = 0
    1777              :       END DO
    1778            0 :       DO i = 1, 3
    1779            0 :          origin(i) = 0._dp
    1780              :       END DO
    1781            0 :       DO ir = 1, nc
    1782            0 :          dif = v(1, ir)*v(1, ir) + v(2, ir)*v(2, ir) + v(3, ir)*v(3, ir)
    1783            0 :          IF (dif .GT. delta*delta) THEN
    1784            0 :             DO i = 1, 3
    1785            0 :                igood(i) = 1
    1786              :             END DO
    1787              :             ! V is non-zero. Construct matrix 1-R
    1788            0 :             DO i = 1, 3
    1789            0 :                DO j = 1, 3
    1790            0 :                   r3(i, j) = -r(i, j, ib(ir))
    1791              :                END DO
    1792            0 :                r3(i, i) = 1 + r3(i, i)
    1793              :             END DO
    1794            0 :             CALL invmat(r3, ierror)
    1795            0 :             IF (ierror .EQ. 0) THEN
    1796              :                ! The matrix 3x3 has an inverse.
    1797            0 :                DO i = 1, 3
    1798              :                   vr(i) = r3(i, 1)*v(1, ir) &
    1799              :                           + r3(i, 2)*v(2, ir) &
    1800            0 :                           + r3(i, 3)*v(3, ir)
    1801              :                END DO
    1802              :             ELSE
    1803              :                ! IERROR gives the column which causes some trouble
    1804              :                ! Construct matrix 1-R with 2x2
    1805            0 :                igood(ierror) = 0
    1806            0 :                imissing3 = ierror
    1807            0 :                i1 = 0
    1808            0 :                DO i = 1, 3
    1809            0 :                   IF (i .NE. ierror) THEN
    1810            0 :                      i1 = i1 + 1
    1811            0 :                      j1 = 0
    1812            0 :                      DO j = 1, 3
    1813            0 :                         IF (j .NE. ierror) THEN
    1814            0 :                            j1 = j1 + 1
    1815            0 :                            r2(i1, j1) = -r(i, j, ib(ir))
    1816              :                         END IF
    1817              :                      END DO
    1818            0 :                      r2(i1, i1) = 1 + r2(i1, i1)
    1819              :                   END IF
    1820              :                END DO
    1821            0 :                CALL invmat(r2, ierror)
    1822            0 :                IF (ierror .EQ. 0) THEN
    1823              :                   ! The matrix 2X2 has an inverse.
    1824              :                   ! Solve Vxy = (1-R).OAxy + OAz R3z (z is IMISSING3)
    1825              :                   i1 = 0
    1826            0 :                   DO i = 1, 3
    1827            0 :                      IF (igood(i) .EQ. 1) THEN
    1828            0 :                         i1 = i1 + 1
    1829            0 :                         vr(i) = 0._dp
    1830            0 :                         j1 = 0
    1831            0 :                         DO j = 1, 3
    1832            0 :                            IF (igood(j) .EQ. 1) THEN
    1833            0 :                               j1 = j1 + 1
    1834              :                               vr(i) = vr(i) + r2(i1, j1)*(v(j, ir) + &
    1835            0 :                                                           origin(imissing3)*r(j, imissing3, ib(ir)))
    1836              :                            END IF
    1837              :                         END DO
    1838              :                      ELSE
    1839            0 :                         vr(i) = origin(i)
    1840              :                      END IF
    1841              :                   END DO
    1842              :                ELSE
    1843              :                   ! Construct matrix 1-R with 1x1
    1844              :                   i1 = 0
    1845            0 :                   DO i = 1, 3
    1846            0 :                      IF (i .NE. imissing3) THEN
    1847            0 :                         i1 = i1 + 1
    1848            0 :                         IF (i1 .EQ. ierror) THEN
    1849            0 :                            igood(i) = 0
    1850            0 :                            imissing2 = i
    1851              :                         ELSE
    1852              :                            ionly = i
    1853              :                         END IF
    1854              :                      END IF
    1855              :                   END DO
    1856            0 :                   diag = (1 - r(ionly, ionly, ib(ir)))
    1857            0 :                   IF (ABS(diag) .GT. delta) THEN
    1858              :                      vr(ionly) = 1._dp/diag*(v(ionly, ir) + &
    1859              :                                              origin(imissing3)*r(ionly, imissing3, ib(ir)) + &
    1860            0 :                                              origin(imissing2)*r(ionly, imissing2, ib(ir)))
    1861              :                   ELSE
    1862            0 :                      vr(ionly) = origin(ionly)
    1863            0 :                      igood(ionly) = 0
    1864              :                   END IF
    1865            0 :                   vr(imissing3) = origin(imissing3)
    1866            0 :                   vr(imissing2) = origin(imissing2)
    1867              :                END IF
    1868              :             END IF
    1869              :             ! ==----------------------------------------------------------==
    1870              :             ! Compare VR with ORIGIN
    1871            0 :             dif = 0._dp
    1872              :             ! If NTVEC /=1 there are NTVEC possible standard origins
    1873            0 :             DO i = 1, 3
    1874            0 :                IF (iok(i) .EQ. 1) THEN
    1875            0 :                   dif = dif + ABS(origin(i) - vr(i))
    1876              :                END IF
    1877              :             END DO
    1878            0 :             IF (dif .GT. delta) THEN
    1879              :                ! Non-symmorphic
    1880            0 :                info = 0
    1881            0 :                RETURN
    1882              :             ELSE
    1883            0 :                DO i = 1, 3
    1884            0 :                   IF (iok(i) .NE. 1 .AND. igood(i) .EQ. 1) THEN
    1885            0 :                      iok(i) = 1
    1886            0 :                      origin(i) = vr(i)
    1887              :                   END IF
    1888              :                END DO
    1889              :             END IF
    1890              :          END IF
    1891              :       END DO
    1892              :       ! ==--------------------------------------------------------------==
    1893            0 :       IF (iok(1) .EQ. 0 .AND. iok(2) .EQ. 0 .AND. iok(3) .EQ. 0) THEN
    1894              :          ! Cannot not determine
    1895            0 :          info = -1
    1896            0 :          RETURN
    1897              :       END IF
    1898              :       ! The group is symmorphic
    1899            0 :       info = 1
    1900              :       ! Check
    1901            0 :       DO ir = 1, nc
    1902            0 :          DO i = 1, 3
    1903              :             vr(i) = r(i, 1, ib(ir))*origin(1) &
    1904              :                     + r(i, 2, ib(ir))*origin(2) &
    1905            0 :                     + r(i, 3, ib(ir))*origin(3)
    1906            0 :             vr(i) = (origin(i) - vr(i)) - v(i, ir)
    1907              :          END DO
    1908            0 :          CALL rlv3(ai, vr, xb, il, delta)
    1909            0 :          dif = ABS(xb(1)) + ABS(xb(2)) + ABS(xb(3))
    1910            0 :          IF (dif .GT. delta) THEN
    1911              :             ! Non-symmorphic
    1912            0 :             info = 0
    1913            0 :             RETURN
    1914              :          END IF
    1915              :       END DO
    1916              :       ! ==--------------------------------------------------------------==
    1917              :       RETURN
    1918              :    END SUBROUTINE symmorphic
    1919              :    ! ==================================================================
    1920              : ! **************************************************************************************************
    1921              : !> \brief ...
    1922              : !> \param ihc ...
    1923              : !> \param r ...
    1924              : ! **************************************************************************************************
    1925            0 :    SUBROUTINE rot1(ihc, r)
    1926              :       ! ==--------------------------------------------------------------==
    1927              :       ! == WRITTEN ON FEBRUARY 17TH, 1976                               ==
    1928              :       ! == GENERATION OF THE X,Y,Z-TRANSFORMATION MATRICES 3X3          ==
    1929              :       ! == FOR HEXAGONAL AND CUBIC GROUPS                               ==
    1930              :       ! == SUBROUTINES NEEDED -- NONE                                   ==
    1931              :       ! ==--------------------------------------------------------------==
    1932              :       ! == THIS IS IDENTICAL WITH THE SUBROUTINE ROT OF WORLTON-WARREN  ==
    1933              :       ! == (IN THE AC-COMPLEX), ONLY THE WAY OF TRANSFERRING THE DATA   ==
    1934              :       ! == WAS CHANGED                                                  ==
    1935              :       ! ==--------------------------------------------------------------==
    1936              :       ! == INPUT DATA:                                                  ==
    1937              :       ! == IHC SWITCH DETERMINING IF WE DESIRE                          ==
    1938              :       ! ==     THE HEXAGONAL GROUP(IHC=0) OR THE CUBIC GROUP (IHC=1)    ==
    1939              :       ! == OUTPUT DATA:                                                 ==
    1940              :       ! == R...THE 3X3 MATRICES OF THE DESIRED COORDINATE REPRESENTATION==
    1941              :       ! ==     THEIR NUMBERING CORRESPONDS TO THE SYMMETRY ELEMENTS AS  ==
    1942              :       ! ==     LISTE IN WORLTON-WARREN                                  ==
    1943              :       ! ==              (COMPUT. PHYS. COMM. 3(1972) 88--117)           ==
    1944              :       ! == FOR IHC=0 THE FIRST 24 MATRICES OF THE ARRAY R REPRESENT     ==
    1945              :       ! ==           THE FULL HEXAGONAL GROUP D(6H)                     ==
    1946              :       ! == FOR IHC=1 THE FIRST 48 MATRICES OF THE ARRAY R REPRESENT     ==
    1947              :       ! ==           THE FULL CUBIC GROUP O(H)                          ==
    1948              :       ! ==--------------------------------------------------------------==
    1949              :       INTEGER                                            :: ihc
    1950              :       REAL(dp)                                           :: r(3, 3, 48)
    1951              : 
    1952              :       INTEGER                                            :: i, j, k, n, nv
    1953              :       REAL(dp)                                           :: c, s
    1954              : 
    1955            0 :       DO j = 1, 3
    1956            0 :          DO i = 1, 3
    1957            0 :             DO n = 1, 48
    1958            0 :                r(i, j, n) = 0._dp
    1959              :             END DO
    1960              :          END DO
    1961              :       END DO
    1962            0 :       IF (ihc .EQ. 0) THEN
    1963              :          ! ==------------------------------------------------------------==
    1964              :          ! DEFINE THE GENERATORS FOR THE ROTATION MATRICES--HEXAGONAL GROUP
    1965              :          ! ==------------------------------------------------------------==
    1966            0 :          c = 0.5_dp
    1967            0 :          s = 0.5_dp*SQRT(3.0_dp)
    1968            0 :          r(1, 1, 2) = c
    1969            0 :          r(1, 2, 2) = -s
    1970            0 :          r(2, 1, 2) = s
    1971            0 :          r(2, 2, 2) = c
    1972            0 :          r(1, 1, 7) = -c
    1973            0 :          r(1, 2, 7) = -s
    1974            0 :          r(2, 1, 7) = -s
    1975            0 :          r(2, 2, 7) = c
    1976            0 :          DO n = 1, 6
    1977            0 :             r(3, 3, n) = 1._dp
    1978            0 :             r(3, 3, n + 18) = 1._dp
    1979            0 :             r(3, 3, n + 6) = -1._dp
    1980            0 :             r(3, 3, n + 12) = -1._dp
    1981              :          END DO
    1982              :          ! ==------------------------------------------------------------==
    1983              :          ! == GENERATE THE REST OF THE ROTATION MATRICES                 ==
    1984              :          ! ==------------------------------------------------------------==
    1985            0 :          DO i = 1, 2
    1986            0 :             r(i, i, 1) = 1._dp
    1987            0 :             DO j = 1, 2
    1988            0 :                r(i, j, 6) = r(j, i, 2)
    1989            0 :                DO k = 1, 2
    1990            0 :                   r(i, j, 3) = r(i, j, 3) + r(i, k, 2)*r(k, j, 2)
    1991            0 :                   r(i, j, 8) = r(i, j, 8) + r(i, k, 2)*r(k, j, 7)
    1992            0 :                   r(i, j, 12) = r(i, j, 12) + r(i, k, 7)*r(k, j, 2)
    1993              :                END DO
    1994              :             END DO
    1995              :          END DO
    1996            0 :          DO i = 1, 2
    1997            0 :             DO j = 1, 2
    1998            0 :                r(i, j, 5) = r(j, i, 3)
    1999            0 :                DO k = 1, 2
    2000            0 :                   r(i, j, 4) = r(i, j, 4) + r(i, k, 2)*r(k, j, 3)
    2001            0 :                   r(i, j, 9) = r(i, j, 9) + r(i, k, 2)*r(k, j, 8)
    2002            0 :                   r(i, j, 10) = r(i, j, 10) + r(i, k, 12)*r(k, j, 3)
    2003            0 :                   r(i, j, 11) = r(i, j, 11) + r(i, k, 12)*r(k, j, 2)
    2004              :                END DO
    2005              :             END DO
    2006              :          END DO
    2007            0 :          DO n = 1, 12
    2008            0 :             nv = n + 12
    2009            0 :             DO i = 1, 2
    2010            0 :                DO j = 1, 2
    2011            0 :                   r(i, j, nv) = -r(i, j, n)
    2012              :                END DO
    2013              :             END DO
    2014              :          END DO
    2015              :       ELSE
    2016              :          ! ==------------------------------------------------------------==
    2017              :          ! == DEFINE THE GENERATORS FOR THE ROTATION MATRICES-CUBIC GROUP==
    2018              :          ! ==------------------------------------------------------------==
    2019            0 :          r(1, 3, 9) = 1._dp
    2020            0 :          r(2, 1, 9) = 1._dp
    2021            0 :          r(3, 2, 9) = 1._dp
    2022            0 :          r(1, 1, 19) = 1._dp
    2023            0 :          r(2, 3, 19) = -1._dp
    2024            0 :          r(3, 2, 19) = 1._dp
    2025            0 :          DO i = 1, 3
    2026            0 :             r(i, i, 1) = 1._dp
    2027            0 :             DO j = 1, 3
    2028            0 :                r(i, j, 20) = r(j, i, 19)
    2029            0 :                r(i, j, 5) = r(j, i, 9)
    2030            0 :                DO k = 1, 3
    2031            0 :                   r(i, j, 2) = r(i, j, 2) + r(i, k, 19)*r(k, j, 19)
    2032            0 :                   r(i, j, 16) = r(i, j, 16) + r(i, k, 9)*r(k, j, 19)
    2033            0 :                   r(i, j, 23) = r(i, j, 23) + r(i, k, 19)*r(k, j, 9)
    2034              :                END DO
    2035              :             END DO
    2036              :          END DO
    2037            0 :          DO i = 1, 3
    2038            0 :             DO j = 1, 3
    2039            0 :                DO k = 1, 3
    2040            0 :                   r(i, j, 6) = r(i, j, 6) + r(i, k, 2)*r(k, j, 5)
    2041            0 :                   r(i, j, 7) = r(i, j, 7) + r(i, k, 16)*r(k, j, 23)
    2042            0 :                   r(i, j, 8) = r(i, j, 8) + r(i, k, 5)*r(k, j, 2)
    2043            0 :                   r(i, j, 10) = r(i, j, 10) + r(i, k, 2)*r(k, j, 9)
    2044            0 :                   r(i, j, 11) = r(i, j, 11) + r(i, k, 9)*r(k, j, 2)
    2045            0 :                   r(i, j, 12) = r(i, j, 12) + r(i, k, 23)*r(k, j, 16)
    2046            0 :                   r(i, j, 14) = r(i, j, 14) + r(i, k, 16)*r(k, j, 2)
    2047            0 :                   r(i, j, 15) = r(i, j, 15) + r(i, k, 2)*r(k, j, 16)
    2048            0 :                   r(i, j, 22) = r(i, j, 22) + r(i, k, 23)*r(k, j, 2)
    2049            0 :                   r(i, j, 24) = r(i, j, 24) + r(i, k, 2)*r(k, j, 23)
    2050              :                END DO
    2051              :             END DO
    2052              :          END DO
    2053            0 :          DO i = 1, 3
    2054            0 :             DO j = 1, 3
    2055            0 :                DO k = 1, 3
    2056            0 :                   r(i, j, 3) = r(i, j, 3) + r(i, k, 5)*r(k, j, 12)
    2057            0 :                   r(i, j, 4) = r(i, j, 4) + r(i, k, 5)*r(k, j, 10)
    2058            0 :                   r(i, j, 13) = r(i, j, 13) + r(i, k, 23)*r(k, j, 11)
    2059            0 :                   r(i, j, 17) = r(i, j, 17) + r(i, k, 16)*r(k, j, 12)
    2060            0 :                   r(i, j, 18) = r(i, j, 18) + r(i, k, 16)*r(k, j, 10)
    2061            0 :                   r(i, j, 21) = r(i, j, 21) + r(i, k, 12)*r(k, j, 15)
    2062              :                END DO
    2063              :             END DO
    2064              :          END DO
    2065            0 :          DO n = 1, 24
    2066            0 :             nv = n + 24
    2067            0 :             r(1, 1, nv) = -r(1, 1, n)
    2068            0 :             r(1, 2, nv) = -r(1, 2, n)
    2069            0 :             r(1, 3, nv) = -r(1, 3, n)
    2070            0 :             r(2, 1, nv) = -r(2, 1, n)
    2071            0 :             r(2, 2, nv) = -r(2, 2, n)
    2072            0 :             r(2, 3, nv) = -r(2, 3, n)
    2073            0 :             r(3, 1, nv) = -r(3, 1, n)
    2074            0 :             r(3, 2, nv) = -r(3, 2, n)
    2075            0 :             r(3, 3, nv) = -r(3, 3, n)
    2076              :          END DO
    2077              :       END IF
    2078              :       ! ==--------------------------------------------------------------==
    2079            0 :       RETURN
    2080              :    END SUBROUTINE rot1
    2081              :    ! ==================================================================
    2082              : ! **************************************************************************************************
    2083              : !> \brief ...
    2084              : !> \param iout ...
    2085              : !> \param iq1 ...
    2086              : !> \param iq2 ...
    2087              : !> \param iq3 ...
    2088              : !> \param wvk0 ...
    2089              : !> \param nkpoint ...
    2090              : !> \param a1 ...
    2091              : !> \param a2 ...
    2092              : !> \param a3 ...
    2093              : !> \param b1 ...
    2094              : !> \param b2 ...
    2095              : !> \param b3 ...
    2096              : !> \param inv ...
    2097              : !> \param nc ...
    2098              : !> \param ib ...
    2099              : !> \param r ...
    2100              : !> \param ntot ...
    2101              : !> \param wvkl ...
    2102              : !> \param lwght ...
    2103              : !> \param lrot ...
    2104              : !> \param ncbrav ...
    2105              : !> \param ibrav ...
    2106              : !> \param istriz ...
    2107              : !> \param nhash ...
    2108              : !> \param includ ...
    2109              : !> \param list ...
    2110              : !> \param rlist ...
    2111              : !> \param delta ...
    2112              : ! **************************************************************************************************
    2113            0 :    SUBROUTINE sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
    2114              :                     a1, a2, a3, b1, b2, b3, &
    2115            0 :                     inv, nc, ib, r, ntot, wvkl, lwght, lrot, &
    2116              :                     ncbrav, ibrav, istriz, &
    2117            0 :                     nhash, includ, list, rlist, delta)
    2118              :       ! ==--------------------------------------------------------------==
    2119              :       ! == WRITTEN ON SEPTEMBER 12-20TH, 1979 BY K.K.                   ==
    2120              :       ! == MODIFIED 26-MAY-82 BY OLE HOLM NIELSEN                       ==
    2121              :       ! == GENERATION OF SPECIAL POINTS FOR AN ARBITRARY LATTICE,       ==
    2122              :       ! == FOLLOWING THE METHOD MONKHORST,PACK,                         ==
    2123              :       ! == PHYS. REV. B13 (1976) 5188                                   ==
    2124              :       ! == MODIFIED BY MACDONALD, PHYS. REV. B18 (1978) 5897            ==
    2125              :       ! == THE SUBROUTINE IS WRITTEN ASSUMING THAT THE POINTS ARE       ==
    2126              :       ! == GENERATED IN THE RECIPROCAL SPACE.                           ==
    2127              :       ! == IF, HOWEVER, THE B1,B2,B3 ARE REPLACED BY A1,A2,A3, THEN     ==
    2128              :       ! == SPECIAL POINTS IN THE DIRECT SPACE CAN BE PRODUCED, AS WELL. ==
    2129              :       ! == (NO MULTIPLICATION BY 2PI IS THEN NECESSARY.)                ==
    2130              :       ! == IN THE CASE OF NONSYMMORPHIC GROUPS, THE APPLICATION IN THE  ==
    2131              :       ! == DIRECT SPACE WOULD PROBABLY REQUIRE A CERTAIN CAUTION.       ==
    2132              :       ! == SUBROUTINES NEEDED: BZDEFI,BZRDUC,INBZ,MESH                  ==
    2133              :       ! == IN THE CASES WHERE THE POINT GROUP OF THE CRYSTAL DOES NOT   ==
    2134              :       ! == CONTAIN INVERSION. THE LATTER MAY BE ADDED IF WE WISH        ==
    2135              :       ! == (SEE COMMENT TO THE SWITCH INV).                             ==
    2136              :       ! == REDUCTION TO THE 1ST BRILLOUIN ZONE IS DONE                  ==
    2137              :       ! == BY ADDING G-VECTORS TO FIND THE SHORTEST WAVE-VECTOR.        ==
    2138              :       ! == THE ROTATIONS OF THE BRAVAIS LATTICE ARE APPLIED TO THE      ==
    2139              :       ! == MONKHORST/PACK MESH IN ORDER TO FIND ALL K-POINTS            ==
    2140              :       ! == THAT ARE RELATED BY SYMMETRY. (OLE HOLM NIELSEN)             ==
    2141              :       ! ==--------------------------------------------------------------==
    2142              :       ! == INPUT DATA:                                                  ==
    2143              :       ! == IOUT:    LOGICAL UNIT FOR OUTPUT                             ==
    2144              :       ! ==          IF (IOUT.LE.0) NO MESSAGE                           ==
    2145              :       ! == IQ1,IQ2,IQ3 .. PARAMETER Q OF MONKHORST AND PACK,            ==
    2146              :       ! ==          GENERALIZED AND DIFFERENT FOR THE 3 DIRECTIONS B1,  ==
    2147              :       ! ==          B2 AND B3                                           ==
    2148              :       ! == WVK0 ... THE 'ARBITRARY' SHIFT OF THE WHOLE MESH, DENOTED K0 ==
    2149              :       ! ==          IN MACDONALD. WVK0 = 0 CORRESPONDS TO THE ORIGINAL  ==
    2150              :       ! ==          SCHEME OF MONKHORST AND PACK.                       ==
    2151              :       ! ==          UNITS: 2PI/(UNITS OF LENGTH  USED IN A1, A2, A3),   ==
    2152              :       ! ==          I.E. THE SAME  UNITS AS THE GENERATED SPECIAL POINTS==
    2153              :       ! == NKPOINT .. VARIABLE DIMENSION OF THE (OUTPUT) ARRAYS WVKL,   ==
    2154              :       ! ==          LWGHT,LROT, I.E. SPACE RESERVED FOR THE SPECIAL     ==
    2155              :       ! ==          POINTS AND ACCESSORIES.                             ==
    2156              :       ! ==          NKPOINT HAS TO BE .GE. NTOT (TOTAL NUMBER OF SPECIAL==
    2157              :       ! ==          POINTS. THIS IS CHECKED BY THE SUBROUTINE.          ==
    2158              :       ! == ISTRIZ . INDICATES WHETHER ADDITIONAL MESH POINTS SHOULD BE  ==
    2159              :       ! ==          GENERATED BY APPLYING GROUP OPERATIONS TO THE MESH. ==
    2160              :       ! ==          ISTRIZ=+1 MEANS SYMMETRIZE                          ==
    2161              :       ! ==          ISTRIZ=-1 MEANS DO NOT SYMMETRIZE                   ==
    2162              :       ! == THE FOLLOWING INPUT DATA MAY BE OBTAINED FROM THE SBRT.      ==
    2163              :       ! == B1,B2,B3 .. RECIPROCAL LATTICE VECTORS, NOT MULTIPLIED BY    ==
    2164              :       ! ==          GROUP1: ANY 2PI (IN UNITS RECIPROCAL TO THOSE       ==
    2165              :       ! ==                  OF A1,A2,A3)                                ==
    2166              :       ! == INV .... CODE INDICATING WHETHER WE WISH TO ADD THE INVERSION==
    2167              :       ! ==          TO THE POINT GROUP OF THE CRYSTAL OR NOT (IN THE    ==
    2168              :       ! ==          CASE THAT THE POINT GROUP DOES NOT CONTAIN ANY).    ==
    2169              :       ! ==          INV=0 MEANS: DO NOT ADD INVERSION                   ==
    2170              :       ! ==          INV.NE.0 MEANS: ADD THE INVERSION                   ==
    2171              :       ! ==          INV.NE.0 SHOULD BE THE STANDARD CHOICE WHEN SPPT2   ==
    2172              :       ! ==          IS USED IN RECIPROCAL SPACE - IN ORDER TO MAKE      ==
    2173              :       ! ==          USE OF THE HERMITICITY OF HAMILTONIAN.              ==
    2174              :       ! ==          WHEN USED IN DIRECT SPACE, THE RIGHT CHOICE OF INV  ==
    2175              :       ! ==          WILL DEPEND ON THE NATURE OF THE PHYSICAL PROBLEM.  ==
    2176              :       ! ==          IN THE CASES WHERE THE INVERSION IS ADDED BY THE    ==
    2177              :       ! ==          SWITCH INV, THE LIST IB WILL NOT BE MODIFIED BUT IN ==
    2178              :       ! ==          THE OUTPUT LIST LROT SOME OF THE OPERATIONS WILL    ==
    2179              :       ! ==          APPEAR WITH NEGATIVE SIGN; THIS MEANS THAT THEY HAVE==
    2180              :       ! ==          TO BE APPLIED MULTIPLIED BY INVERSION.              ==
    2181              :       ! == NC ..... TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP OF THE  ==
    2182              :       ! ==          CRYSTAL                                             ==
    2183              :       ! == IB ..... LIST OF THE ROTATIONS CONSTITUTING THE POINT GROUP  ==
    2184              :       ! ==          OF THE CRYSTAL. THE NUMBERING IS THAT DEFINED IN    ==
    2185              :       ! ==          WORLTON AND WARREN, I.E. THE ONE MATERIALIZED IN THE==
    2186              :       ! ==          ARRAY R (SEE BELOW)                                 ==
    2187              :       ! ==          ONLY THE FIRST NC ELEMENTS OF THE ARRAY IB ARE      ==
    2188              :       ! ==          MEANINGFUL                                          ==
    2189              :       ! == R ...... LIST OF THE 3 X 3 ROTATION MATRICES                 ==
    2190              :       ! ==          (XYZ REPRESENTATION OF THE O(H) OR D(6)H GROUPS)    ==
    2191              :       ! ==          ALL 48 OR 24 MATRICES ARE LISTED.                   ==
    2192              :       ! == NCBRAV . TOTAL NUMBER OF ELEMENTS IN RBRAV                   ==
    2193              :       ! == IBRAV .. LIST OF NCBRAV OPERATIONS OF THE BRAVAIS LATTICE    ==
    2194              :       ! == DELTA    REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)           ==
    2195              :       ! ==--------------------------------------------------------------==
    2196              :       ! == OUTPUT DATA:                                                 ==
    2197              :       ! == NTOT ... TOTAL NUMBER OF SPECIAL POINTS                      ==
    2198              :       ! ==          IF NTOT APPEARS NEGATIVE, THIS IS AN ERROR SIGNAL   ==
    2199              :       ! ==          WHICH MEANS THAT THE DIMENSION NKPOINT WAS CHOSEN   ==
    2200              :       ! ==          TOO SMALL SO THAT THE ARRAYS WVKL ETC. CANNOT       ==
    2201              :       ! ==          ACCOMODATE ALL THE GENERATED SPECIAL POINTS.        ==
    2202              :       ! ==          IN THIS CASE THE ARRAYS WILL BE FILLED UP TO NKPOINT==
    2203              :       ! ==          AND FURTHER GENERATION OF NEW POINTS WILL BE        ==
    2204              :       ! ==          INTERRUPTED.                                        ==
    2205              :       ! == WVKL ... LIST OF SPECIAL POINTS.                             ==
    2206              :       ! ==          CARTESIAN COORDINATES AND NOT MULTIPLIED BY 2*PI.   ==
    2207              :       ! ==          ONLY THE FIRST NTOT VECTORS ARE MEANINGFUL          ==
    2208              :       ! ==          ALTHOUGH NO 2 POINTS FROM THE LIST ARE EQUIVALENT   ==
    2209              :       ! ==          BY SYMMETRY, THIS SUBROUTINE STILL HAS A KIND OF    ==
    2210              :       ! ==          'BEAUTY DEFECT': THE POINTS FINALLY                 ==
    2211              :       ! ==          SELECTED ARE NOT NECESSARILY SITUATED IN A          ==
    2212              :       ! ==          'COMPACT' IRREDUCIBLE BRILL.ZONE; THEY MIGHT LIE IN ==
    2213              :       ! ==          DIFFERENT IRREDUCIBLE PARTS OF THE B.Z. - BUT THEY  ==
    2214              :       ! ==          DO REPRESENT AN IRREDUCIBLE SET FOR INTEGRATION     ==
    2215              :       ! ==          OVER THE ENTIRE B.Z.                                ==
    2216              :       ! == LWGHT ... THE LIST OF WEIGHTS OF THE CORRESPONDING POINTS.   ==
    2217              :       ! ==          THESE WEIGHTS ARE NOT NORMALIZED (JUST INTEGERS)    ==
    2218              :       ! == LROT ... FOR EACH SPECIAL POINT THE 'UNFOLDING ROTATIONS'    ==
    2219              :       ! ==          ARE LISTED. IF E.G. THE WEIGHT OF THE I-TH SPECIAL  ==
    2220              :       ! ==          POINT IS LWGHT(I), THEN THE ROTATIONS WITH NUMBERS  ==
    2221              :       ! ==          LROT(J,I), J=1,2,...,LWGHT(I) WILL 'SPREAD' THIS    ==
    2222              :       ! ==          SINGLE POINT FROM THE IRREDUCIBLE PART OF B.Z. INTO ==
    2223              :       ! ==          SEVERAL POINTS IN AN ELEMENTARY UNIT CELL           ==
    2224              :       ! ==          (PARALLELOPIPED) OF THE RECIPROCAL SPACE.           ==
    2225              :       ! ==          SOME OPERATION NUMBERS IN THE LIST LROT MAY APPEAR  ==
    2226              :       ! ==          NEGATIVE, THIS MEANS THAT THE CORRESPONDING ROTATION==
    2227              :       ! ==          HAS TO BE APPLIED WITH INVERSION (THE LATTER HAVING ==
    2228              :       ! ==          BEEN ARTIFICIALLY ADDED AS SYMMETRY OPERATION IN    ==
    2229              :       ! ==          CASE INV.NE.0).NO OTHER EFFORT WAS TAKEN,TO RENUMBER==
    2230              :       ! ==          THE ROTATIONS WITH MINUS SIGN OR TO EXTEND THE      ==
    2231              :       ! ==          LIST OF THE POINT-GROUP OPERATIONS IN THE LIST NB.  ==
    2232              :       ! == INCLUD ... INTEGER ARRAY USED BY SPPT2 INCLUD(NKPOINT)       ==
    2233              :       ! ==          THE FIRST BIT (0) IS USED BY THE ROUTINE.           ==
    2234              :       ! ==          THE OTHER BITS GIVE THE K-POINT INDEX IN            ==
    2235              :       ! ==          THE SPECIAL K-POINT TABLE.                          ==
    2236              :       ! ==--------------------------------------------------------------==
    2237              :       ! == NHASH    USED BY MESH ROUTINE                                ==
    2238              :       ! == LIST     INTEGER ARRAY USED BY MESH  LIST(NHASH+NKPOINT)     ==
    2239              :       ! == RLIST    real(8) :: ARRAY USED BY MESH  RLIST(3,NKPOINT)        ==
    2240              :       ! ==--------------------------------------------------------------==
    2241              :       ! == Use bit manipulations functions                              ==
    2242              :       ! ==  IBSET(I,POS) sets the bit POS to 1 in I integer             ==
    2243              :       ! ==  IBCLR(I,POS) clears the bit POS to 1 in I integer           ==
    2244              :       ! ==  BTEST(I,POS) .TRUE. if bit POS is 1 in I integer            ==
    2245              :       ! ==--------------------------------------------------------------==
    2246              :       INTEGER                                            :: iout, iq1, iq2, iq3
    2247              :       REAL(dp)                                           :: wvk0(3)
    2248              :       INTEGER                                            :: nkpoint
    2249              :       REAL(dp)                                           :: a1(3), a2(3), a3(3), b1(3), b2(3), b3(3)
    2250              :       INTEGER                                            :: inv, nc, ib(48)
    2251              :       REAL(dp)                                           :: r(3, 3, 48)
    2252              :       INTEGER                                            :: ntot
    2253              :       REAL(dp)                                           :: wvkl(3, nkpoint)
    2254              :       INTEGER                                            :: lwght(nkpoint), lrot(48, nkpoint), &
    2255              :                                                             ncbrav, ibrav(48), istriz, nhash, &
    2256              :                                                             includ(nkpoint), list(nkpoint + nhash)
    2257              :       REAL(dp)                                           :: rlist(3, nkpoint), delta
    2258              : 
    2259              :       INTEGER, PARAMETER                                 :: no = 0, nrsdir = 100
    2260              : 
    2261              :       INTEGER                                            :: i, i1, i2, i3, ibsign, igarb0, igarbage, &
    2262              :                                                             igarbg, ii, imesh, iop, iplace, &
    2263              :                                                             iremov, iwvk, j, jplace, k, n, nplane
    2264              :       REAL(dp)                                           :: diff, proja(3), projb(3), &
    2265              :                                                             rsdir(4, nrsdir), ur1, ur2, ur3, &
    2266              :                                                             wva(3), wvk(3)
    2267              : 
    2268              : ! ==--------------------------------------------------------------==
    2269              : 
    2270            0 :       ntot = 0
    2271            0 :       DO i = 1, nkpoint
    2272            0 :          lrot(1, i) = 1
    2273            0 :          DO j = 2, 48
    2274            0 :             lrot(j, i) = 0
    2275              :          END DO
    2276              :       END DO
    2277            0 :       DO i = 1, nkpoint
    2278            0 :          includ(i) = no
    2279              :       END DO
    2280            0 :       DO i = 1, 3
    2281            0 :          wva(i) = 0._dp
    2282              :       END DO
    2283              :       ! ==--------------------------------------------------------------==
    2284              :       ! == DEFINE THE 1ST BRILLOUIN ZONE                                ==
    2285              :       ! ==--------------------------------------------------------------==
    2286            0 :       CALL bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
    2287              :       ! ==--------------------------------------------------------------==
    2288              :       ! == Generation of the mesh (they are not multiplied by 2*pi) by  ==
    2289              :       ! == the Monkhorst/Pack algorithm, supplemented by all rotations  ==
    2290              :       ! ==--------------------------------------------------------------==
    2291              :       ! Initialize the list of vectors
    2292            0 :       iplace = -2
    2293              :       CALL mesh(iout, wva, iplace, igarb0, igarbg, nkpoint, nhash, &
    2294            0 :                 list, rlist, delta)
    2295            0 :       imesh = 0
    2296            0 :       DO i1 = 1, iq1
    2297            0 :          DO i2 = 1, iq2
    2298            0 :             DO i3 = 1, iq3
    2299            0 :                ur1 = REAL(1 + iq1 - 2*i1, kind=dp)/REAL(2*iq1, kind=dp)
    2300            0 :                ur2 = REAL(1 + iq2 - 2*i2, kind=dp)/REAL(2*iq2, kind=dp)
    2301            0 :                ur3 = REAL(1 + iq3 - 2*i3, kind=dp)/REAL(2*iq3, kind=dp)
    2302            0 :                DO i = 1, 3
    2303            0 :                   wvk(i) = ur1*b1(i) + ur2*b2(i) + ur3*b3(i) + wvk0(i)
    2304              :                END DO
    2305              :                ! Reduce WVK to the 1st Brillouin zone
    2306              :                CALL bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, &
    2307            0 :                            nrsdir, nplane, delta)
    2308            0 :                IF (istriz .EQ. 1) THEN
    2309              :                   ! Symmetrization of the k-points mesh.
    2310              :                   ! Apply all the Bravais lattice operations to WVK
    2311            0 :                   DO iop = 1, ncbrav
    2312            0 :                      DO i = 1, 3
    2313            0 :                         wva(i) = 0._dp
    2314            0 :                         DO j = 1, 3
    2315            0 :                            wva(i) = wva(i) + r(i, j, ibrav(iop))*wvk(j)
    2316              :                         END DO
    2317              :                      END DO
    2318              :                      ! Check that WVA is inside the 1 Bz.
    2319            0 :                      IF (.NOT. inside_bz(wva, rsdir, nplane, delta)) GOTO 450
    2320              :                      ! Place WVA in list
    2321            0 :                      iplace = 0
    2322              :                      CALL mesh(iout, wva, iplace, igarb0, igarbg, &
    2323            0 :                                nkpoint, nhash, list, rlist, delta)
    2324              :                      ! If WVA was new (and therefore inserted),
    2325              :                      ! IPLACE is the number.
    2326            0 :                      IF (iplace .GT. 0) imesh = iplace
    2327            0 :                      IF (iplace .GT. nkpoint) GOTO 470
    2328              :                   END DO
    2329              :                ELSE
    2330              :                   ! Place WVK in list
    2331            0 :                   iplace = 0
    2332              :                   CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
    2333            0 :                             nkpoint, nhash, list, rlist, delta)
    2334            0 :                   imesh = iplace
    2335            0 :                   IF (iplace .GT. nkpoint) GOTO 470
    2336              :                END IF
    2337              :             END DO
    2338              :          END DO
    2339              :       END DO
    2340              : !deb
    2341              : !deb get full mesh
    2342              : !deb
    2343            0 :       IF (iout .GT. 0) THEN
    2344              :          ! IMESH: Number of k points in the mesh.
    2345              :          IF (iout > 0) &
    2346              :             WRITE (iout, &
    2347            0 :                    '(" KPSYM| THE WAVEVECTOR MESH CONTAINS ",I5," POINTS")') imesh
    2348            0 :          IF (iout > 0) &
    2349            0 :             WRITE (iout, '(" KPSYM| THE POINTS ARE:")')
    2350            0 :          DO ii = 1, imesh
    2351            0 :             i = ii
    2352              :             CALL mesh(iout, wva, i, igarb0, igarbg, nkpoint, nhash, &
    2353            0 :                       list, rlist, delta)
    2354            0 :             IF (MOD(i, 2) .EQ. 1) THEN
    2355            0 :                IF (iout > 0) &
    2356            0 :                   WRITE (iout, '(1X,I5,3F10.4)', advance="no") i, wva
    2357              :             ELSE
    2358            0 :                IF (iout > 0) &
    2359            0 :                   WRITE (iout, '(1X,I5,3F10.4)') i, wva
    2360              :             END IF
    2361              :          END DO
    2362            0 :          IF (iout > 0) &
    2363            0 :             WRITE (iout, *)
    2364              :       END IF
    2365              :       ! ==--------------------------------------------------------------==
    2366            0 :       IF (istriz .EQ. 1) THEN
    2367              :          ! Now figure out if any special point difference (K - K'') is an
    2368              :          ! integral multiple of a reciprocal-space vector
    2369            0 :          iremov = 0
    2370            0 :          DO i = 1, (imesh - 1)
    2371            0 :             iplace = i
    2372              :             CALL mesh(iout, wva, iplace, igarb0, igarbg, &
    2373            0 :                       nkpoint, nhash, list, rlist, delta)
    2374              :             ! Project WVA onto B1,2,3:
    2375            0 :             proja(1) = 0._dp
    2376            0 :             proja(2) = 0._dp
    2377            0 :             proja(3) = 0._dp
    2378            0 :             DO k = 1, 3
    2379            0 :                proja(1) = proja(1) + wva(k)*a1(k)
    2380            0 :                proja(2) = proja(2) + wva(k)*a2(k)
    2381            0 :                proja(3) = proja(3) + wva(k)*a3(k)
    2382              :             END DO
    2383              :             ! Now loop over all the rest of the mesh points
    2384            0 :             DO j = (i + 1), imesh
    2385            0 :                jplace = j
    2386              :                CALL mesh(iout, wvk, jplace, igarb0, igarbg, &
    2387            0 :                          nkpoint, nhash, list, rlist, delta)
    2388              :                ! Project WVK onto B1,2,3:
    2389            0 :                projb(1) = 0._dp
    2390            0 :                projb(2) = 0._dp
    2391            0 :                projb(3) = 0._dp
    2392            0 :                DO k = 1, 3
    2393            0 :                   projb(1) = projb(1) + wvk(k)*a1(k)
    2394            0 :                   projb(2) = projb(2) + wvk(k)*a2(k)
    2395            0 :                   projb(3) = projb(3) + wvk(k)*a3(k)
    2396              :                END DO
    2397              :                ! Check (PROJA - PROJB): Is it integral ?
    2398            0 :                DO k = 1, 3
    2399            0 :                   diff = proja(k) - projb(k)
    2400            0 :                   IF (ABS(REAL(NINT(diff), kind=dp) - diff) .GT. delta) GOTO 280
    2401              :                END DO
    2402              :                ! DIFF is integral: remove WVK from mesh:
    2403              :                CALL remove(wvk, jplace, igarb0, igarbg, &
    2404            0 :                            nkpoint, nhash, list, rlist, delta)
    2405              :                ! If WVK actually removed, increment IREMOV
    2406            0 :                IF (jplace .GT. 0) iremov = iremov + 1
    2407            0 : 280            CONTINUE
    2408              :             END DO
    2409              :          END DO
    2410            0 :          IF ((iremov .GT. 0 .AND. iout .GT. 0) .AND. iout > 0) &
    2411              :             WRITE (iout, '(A,A,/,A,1X,I6,A,/)') &
    2412            0 :             ' KPSYM| SOME OF THESE MESH POINTS ARE RELATED BY LATTICE ', &
    2413            0 :             'TRANSLATION VECTORS', &
    2414            0 :             ' KPSYM|', iremov, ' OF THE MESH POINTS REMOVED.'
    2415              :       END IF
    2416              :       ! ==--------------------------------------------------------------==
    2417              :       ! == IN THE MESH OF WAVEVECTORS, NOW SEARCH FOR EQUIVALENT POINTS:==
    2418              :       ! == THE INVERSION (TIME REVERSAL !) MAY BE USED.                 ==
    2419              :       ! ==--------------------------------------------------------------==
    2420            0 :       DO iwvk = 1, imesh
    2421              :          ! IF(INCLUD(IWVK) .EQ. YES) GOTO 350
    2422            0 :          IF (BTEST(includ(iwvk), 0)) GOTO 350
    2423              :          ! IWVK has not been encountered previously: new special point,
    2424              :          ! (only if WVK is not a garbage vector, however.)
    2425              :          ! INCLUD(IWVK) = YES
    2426            0 :          includ(iwvk) = IBSET(includ(iwvk), 0)
    2427            0 :          iplace = iwvk
    2428              :          CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
    2429            0 :                    nkpoint, nhash, list, rlist, delta)
    2430              :          ! Find out whether Wvk is in the garbage list
    2431              :          CALL garbag(wvk, igarbage, igarb0, &
    2432            0 :                      nkpoint, nhash, list, rlist, delta)
    2433            0 :          IF (igarbage .GT. 0) GOTO 350
    2434            0 :          ntot = ntot + 1
    2435              :          ! Give the index in the special k points table.
    2436            0 :          includ(iwvk) = includ(iwvk) + ntot*2
    2437            0 :          DO i = 1, 3
    2438            0 :             wvkl(i, ntot) = wvk(i)
    2439              :          END DO
    2440            0 :          lwght(ntot) = 1
    2441              :          ! ==-----------------------------------------------------------==
    2442              :          ! Find all the equivalent points (symmetry given by atoms)
    2443            0 :          DO n = 1, nc
    2444              :             ! Rotate:
    2445            0 :             DO i = 1, 3
    2446            0 :                wva(i) = 0._dp
    2447            0 :                DO j = 1, 3
    2448            0 :                   wva(i) = wva(i) + r(i, j, ib(n))*wvk(j)
    2449              :                END DO
    2450              :             END DO
    2451              :             ibsign = +1
    2452              : 363         CONTINUE
    2453              :             ! Find WVA in the list
    2454            0 :             iplace = -1
    2455              :             CALL mesh(iout, wva, iplace, igarb0, igarbg, &
    2456            0 :                       nkpoint, nhash, list, rlist, delta)
    2457            0 :             IF (iplace .EQ. 0) THEN
    2458            0 :                IF (istriz .EQ. -1) THEN
    2459              :                   ! No symmetrisation -> WVA not in the list
    2460              :                   GOTO 364
    2461              :                ELSE
    2462              :                   ! Find out whether WVA is in the garbage list
    2463              :                   CALL garbag(wva, igarbage, igarb0, &
    2464            0 :                               nkpoint, nhash, list, rlist, delta)
    2465            0 :                   IF (igarbage .EQ. 0) THEN
    2466              :                      ! I think this case is impossible (NC <= NCBRAV)
    2467              :                      ! Error message
    2468              :                      GOTO 490
    2469              :                   END IF
    2470              :                END IF
    2471              :             END IF
    2472              :             ! Find out whether WVA is in the garbage list
    2473              :             CALL garbag(wva, igarbage, igarb0, &
    2474            0 :                         nkpoint, nhash, list, rlist, delta)
    2475            0 :             IF (igarbage .GT. 0) GOTO 370
    2476              :             ! Was WVA encountered before ?
    2477              :             ! IF(INCLUD(IPLACE) .EQ. YES) GOTO 364
    2478            0 :             IF (BTEST(includ(iplace), 0)) GOTO 364
    2479              :             ! Increment weight.
    2480            0 :             lwght(ntot) = lwght(ntot) + 1
    2481            0 :             lrot(lwght(ntot), ntot) = ib(n)*ibsign
    2482              :             ! INCLUD(IPLACE) = YES
    2483            0 :             includ(iplace) = IBSET(includ(iplace), 0)
    2484              :             ! This k-point is an image of a special k-point.
    2485              :             ! Put the index of the special k-point.
    2486            0 :             includ(iplace) = includ(iplace) + ntot*2
    2487              : 364         CONTINUE
    2488            0 :             IF (ibsign .EQ. -1 .OR. inv .EQ. 0) GOTO 370
    2489              :             ! The case where we also apply the inversion to WVA
    2490              :             ! Repeat the search, but for -WVA
    2491            0 :             ibsign = -1
    2492            0 :             DO i = 1, 3
    2493            0 :                wva(i) = -wva(i)
    2494              :             END DO
    2495            0 :             GOTO 363
    2496            0 : 370         CONTINUE
    2497              :          END DO
    2498            0 : 350      CONTINUE
    2499              :       END DO
    2500              :       ! ==--------------------------------------------------------------==
    2501              :       ! == TOTAL NUMBER OF SPECIAL POINTS: NTOT                         ==
    2502              :       ! == BEFORE USING THE LIST WVKL AS WAVE VECTORS, THEY HAVE TO BE  ==
    2503              :       ! == MULTIPLIED BY 2*PI                                           ==
    2504              :       ! == THE LIST OF WEIGHTS LWGHT IS NOT NORMALIZED                  ==
    2505              :       ! ==--------------------------------------------------------------==
    2506            0 :       IF (ntot .GT. nkpoint) THEN
    2507            0 :          IF (iout > 0) &
    2508            0 :             WRITE (iout, *) 'IN SPPT2 NUMBER OF SPECIAL POINTS = ', ntot
    2509            0 :          IF (iout > 0) &
    2510            0 :             WRITE (iout, *) 'BUT NKPOINT = ', nkpoint
    2511            0 :          ntot = -1
    2512              :       END IF
    2513            0 :       IF (iout .GT. 0) THEN
    2514              :          ! Write the index table relating k points in the mesh
    2515              :          ! with special k points
    2516              :          IF (iout > 0) &
    2517              :             WRITE (iout, '(/,A,4X,A)') &
    2518            0 :             ' KPSYM|', 'CROSS TABLE RELATING MESH POINTS WITH SPECIAL POINTS:'
    2519            0 :          IF (iout > 0) &
    2520            0 :             WRITE (iout, '(5(4X,"IK -> SK"))')
    2521            0 :          DO i = 1, imesh
    2522            0 :             iplace = includ(i)/2
    2523            0 :             IF (iout > 0) &
    2524            0 :                WRITE (iout, '(1X,I5,1X,I5)', advance="no") i, iplace
    2525            0 :             IF ((MOD(i, 5) .EQ. 0) .AND. iout > 0) &
    2526            0 :                WRITE (iout, *)
    2527              :          END DO
    2528            0 :          IF ((MOD(j - 1, 5) .NE. 0) .AND. iout > 0) &
    2529            0 :             WRITE (iout, *)
    2530              :       END IF
    2531              :       RETURN
    2532              :       ! ==--------------------------------------------------------------==
    2533              :       ! == ERROR MESSAGES                                               ==
    2534              :       ! ==--------------------------------------------------------------==
    2535              : 450   CONTINUE
    2536            0 :       IF (iout > 0) &
    2537            0 :          WRITE (iout, '(A,/)') ' SUBROUTINE SPPT2 *** FATAL ERROR ***'
    2538            0 :       IF (iout > 0) &
    2539              :          WRITE (iout, '(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
    2540            0 :          ' THE VECTOR     ', wva, &
    2541            0 :          ' GENERATED FROM ', wvk, ' IN THE BASIC MESH', &
    2542            0 :          ' BY ROTATION NO. ', ibrav(iop), ' IS OUTSIDE THE 1BZ'
    2543            0 :       CALL stopgm('SPPT2', 'VECTOR OUTSIDE THE 1BZ')
    2544              :       ! ==--------------------------------------------------------------==
    2545              : 470   CONTINUE
    2546            0 :       IF (iout > 0) &
    2547            0 :          WRITE (iout, '(A,/)') ' SUBROUTINE SPPT2 *** FATAL ERROR ***'
    2548            0 :       IF (iout > 0) &
    2549            0 :          WRITE (iout, *) 'MESH SIZE EXCEEDS NKPOINT=', nkpoint
    2550            0 :       CALL stopgm('SPPT2', 'MESH SIZE EXCEEDED')
    2551              :       ! ==--------------------------------------------------------------==
    2552              : 490   CONTINUE
    2553            0 :       IF (iout > 0) &
    2554            0 :          WRITE (iout, '(A,/)') ' SUBROUTINE SPPT2 *** FATAL ERROR ***'
    2555            0 :       IF (iout > 0) &
    2556              :          WRITE (iout, '(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
    2557            0 :          ' THE VECTOR     ', wva, &
    2558            0 :          ' GENERATED FROM ', wvk, ' IN THE BASIC MESH', &
    2559            0 :          ' BY ROTATION NO. ', ib(n), ' IS NOT IN THE LIST'
    2560            0 :       CALL stopgm('SPPT2', 'VECTOR NOT IN THE LIST')
    2561              :       ! ==--------------------------------------------------------------==
    2562            0 :       RETURN
    2563              :    END SUBROUTINE sppt2
    2564              : ! **************************************************************************************************
    2565              : !> \brief ...
    2566              : !> \param iout ...
    2567              : !> \param wvk ...
    2568              : !> \param iplace ...
    2569              : !> \param igarb0 ...
    2570              : !> \param igarbg ...
    2571              : !> \param nmesh ...
    2572              : !> \param nhash ...
    2573              : !> \param list ...
    2574              : !> \param rlist ...
    2575              : !> \param delta ...
    2576              : ! **************************************************************************************************
    2577            0 :    SUBROUTINE mesh(iout, wvk, iplace, igarb0, igarbg, &
    2578            0 :                    nmesh, nhash, list, rlist, delta)
    2579              :       ! ==--------------------------------------------------------------==
    2580              :       ! == MESH MAINTAINS A LIST OF VECTORS FOR PLACEMENT AND/OR LOOKUP ==
    2581              :       ! ==                                                              ==
    2582              :       ! == ADDITIONAL ENTRY POINTS: REMOVE .... REMOVE VECTOR FROM LIST ==
    2583              :       ! ==                          GARBAG .... WAS VECTOR REMOVED ?    ==
    2584              :       ! ==                                                              ==
    2585              :       ! == WVK ....... VECTOR                                           ==
    2586              :       ! == IPLACE .... ON INPUT: -2 MEANS: INITIALIZE  THE LIST         ==
    2587              :       ! ==                                 (AND RETURN)                 ==
    2588              :       ! ==                       -1 MEANS: FIND WVK IN THE LIST         ==
    2589              :       ! ==                        0 MEANS: ADD  WVK TO THE LIST         ==
    2590              :       ! ==                       >0 MEANS: RETURN WVK NO. IPLACE        ==
    2591              :       ! ==            ON OUTPUT: THE POSITION ASSIGNED TO WVK           ==
    2592              :       ! ==                       (=0 IF WVK IS NOT IN THE LIST)         ==
    2593              :       ! == DELTA      REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)         ==
    2594              :       ! ==--------------------------------------------------------------==
    2595              :       INTEGER                                            :: iout
    2596              :       REAL(dp)                                           :: wvk(3)
    2597              :       INTEGER                                            :: iplace, igarb0, igarbg, nmesh, nhash, &
    2598              :                                                             list(nhash + nmesh)
    2599              :       REAL(dp)                                           :: rlist(3, nmesh), delta
    2600              : 
    2601              :       INTEGER, PARAMETER                                 :: nil = 0
    2602              : 
    2603              :       INTEGER                                            :: i, ihash, ipoint, j
    2604              :       INTEGER, SAVE                                      :: istore
    2605              :       REAL(dp)                                           :: delta1, rhash
    2606              : 
    2607              : ! ==--------------------------------------------------------------==
    2608              : ! == Initialization                                               ==
    2609              : ! ==--------------------------------------------------------------==
    2610              : 
    2611            0 :       delta1 = 10._dp*delta
    2612            0 :       IF (iplace .LE. -2) THEN
    2613            0 :          DO i = 1, nhash + nmesh
    2614            0 :             list(i) = nil
    2615              :          END DO
    2616            0 :          istore = 1
    2617              :          ! IGARB0 points to a linked list of removed WVKS (the garbage).
    2618            0 :          igarb0 = 0
    2619            0 :          igarbg = 0
    2620            0 :          RETURN
    2621              :          ! ==--------------------------------------------------------------==
    2622            0 :       ELSEIF ((iplace .GT. -2) .AND. (iplace .LE. 0)) THEN
    2623              :          ! The particular HASH function used in this case:
    2624              :          rhash = 0.7890_dp*wvk(1) &
    2625              :                  + 0.6810_dp*wvk(2) &
    2626            0 :                  + 0.5811_dp*wvk(3) + delta
    2627            0 :          ihash = INT(ABS(rhash)*REAL(nhash, kind=dp))
    2628            0 :          ihash = MOD(ihash, nhash) + nmesh + 1
    2629              :          ! Search for WVK in linked list
    2630            0 :          ipoint = list(ihash)
    2631            0 :          DO i = 1, 100
    2632              :             ! List exhausted
    2633            0 :             IF (ipoint .EQ. nil) GOTO 130
    2634              :             ! Compare WVK with this element
    2635            0 :             DO j = 1, 3
    2636            0 :                IF (ABS(wvk(j) - rlist(j, ipoint)) .GT. delta1) GOTO 115
    2637              :             END DO
    2638              :             ! WVK located
    2639            0 :             GOTO 160
    2640              :             ! Next element of list
    2641              : 115         CONTINUE
    2642            0 :             ihash = ipoint
    2643            0 :             ipoint = list(ihash)
    2644              :          END DO
    2645              :          ! List too long
    2646            0 :          IF (iout > 0) &
    2647              :             WRITE (iout, '(2A,/,A)') &
    2648            0 :             ' SUBROUTINE MESH *** FATAL ERROR *** LINKED LIST', &
    2649            0 :             ' TOO LONG ***', ' CHOOSE A BETTER HASH-FUNCTION'
    2650            0 :          CALL stopgm('MESH', 'WARNING')
    2651              :          ! WVK was not found
    2652              : 130      CONTINUE
    2653            0 :          IF (iplace .EQ. -1) THEN
    2654              :             ! IPLACE=-1 : search for WVK unsuccessful
    2655            0 :             iplace = 0
    2656            0 :             RETURN
    2657              :          ELSE
    2658              :             ! IPLACE=0: add WVK to the list
    2659            0 :             list(ihash) = istore
    2660            0 :             IF (istore .GT. nmesh) THEN
    2661            0 :                IF (iout > 0) &
    2662            0 :                   WRITE (iout, '(A)') 'SUBROUTINE MESH *** FATAL ERROR ***'
    2663            0 :                IF (iout > 0) &
    2664              :                   WRITE (iout, '(A,I10,A,/,A,3F10.5)') &
    2665            0 :                   ' ISTORE=', istore, ' EXCEEDS DIMENSIONS', &
    2666            0 :                   ' WVK = ', wvk
    2667            0 :                CALL stopgm('MESH', 'WARNING')
    2668              :             END IF
    2669            0 :             list(istore) = nil
    2670            0 :             DO i = 1, 3
    2671            0 :                rlist(i, istore) = wvk(i)
    2672              :             END DO
    2673            0 :             istore = istore + 1
    2674            0 :             iplace = istore - 1
    2675            0 :             RETURN
    2676              :          END IF
    2677              :          ! WVK was found
    2678              : 160      CONTINUE
    2679            0 :          IF (iplace .EQ. 0) RETURN
    2680              :          ! IPLACE=-1
    2681            0 :          iplace = ipoint
    2682            0 :          RETURN
    2683              :       ELSE
    2684              :          ! ==--------------------------------------------------------------==
    2685              :          ! == Return a wavevector (IPLACE > 0)                             ==
    2686              :          ! ==--------------------------------------------------------------==
    2687            0 :          ipoint = iplace
    2688            0 :          IF (ipoint .GE. istore) GOTO 190
    2689            0 :          DO i = 1, 3
    2690            0 :             wvk(i) = rlist(i, ipoint)
    2691              :          END DO
    2692            0 :          RETURN
    2693              :       END IF
    2694              :       ! ==--------------------------------------------------------------==
    2695              :       ! == Error - beyond list                                          ==
    2696              :       ! ==--------------------------------------------------------------==
    2697              : 190   CONTINUE
    2698            0 :       IF (iout > 0) &
    2699              :          WRITE (iout, '(A,/,A,I5,A,/)') &
    2700            0 :          ' SUBROUTINE MESH *** WARNING ***', &
    2701            0 :          ' IPLACE = ', iplace, &
    2702            0 :          ' IS BEYOND THE LISTS - WVK SET TO 1.0E38'
    2703            0 :       DO i = 1, 3
    2704            0 :          wvk(i) = 1.0e38_dp
    2705              :       END DO
    2706              :       ! ==--------------------------------------------------------------==
    2707              :       RETURN
    2708              :    END SUBROUTINE mesh
    2709              : ! **************************************************************************************************
    2710              : !> \brief ...
    2711              : !> \param wvk ...
    2712              : !> \param iplace ...
    2713              : !> \param igarb0 ...
    2714              : !> \param igarbg ...
    2715              : !> \param nmesh ...
    2716              : !> \param nhash ...
    2717              : !> \param list ...
    2718              : !> \param rlist ...
    2719              : !> \param delta ...
    2720              : ! **************************************************************************************************
    2721            0 :    SUBROUTINE remove(wvk, iplace, igarb0, igarbg, &
    2722            0 :                      nmesh, nhash, list, rlist, delta)
    2723              :       ! ==--------------------------------------------------------------==
    2724              :       ! == ENTRY POINT FOR REMOVING A WAVEVECTOR                        ==
    2725              :       ! ==                                                              ==
    2726              :       ! == INPUT:                                                       ==
    2727              :       ! ==   WVK(3)                                                     ==
    2728              :       ! ==   DELTA   REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)          ==
    2729              :       ! == OUTPUT:
    2730              :       ! ==   IPLACE .....1 IF WVK WAS REMOVED                          ==
    2731              :       ! ==                0 IF WVK WAS NOT REMOVED                      ==
    2732              :       ! ==                  (WVK NOT IN THE LINKED LISTS)               ==
    2733              :       ! ==--------------------------------------------------------------==
    2734              :       REAL(dp)                                           :: wvk(3)
    2735              :       INTEGER                                            :: iplace, igarb0, igarbg, nmesh, nhash, &
    2736              :                                                             list(nhash + nmesh)
    2737              :       REAL(dp)                                           :: rlist(3, nmesh), delta
    2738              : 
    2739              :       INTEGER, PARAMETER                                 :: nil = 0
    2740              : 
    2741              :       INTEGER                                            :: i, ihash, ipoint, j
    2742              :       REAL(dp)                                           :: delta1, rhash
    2743              : 
    2744              : ! ==--------------------------------------------------------------==
    2745              : ! Variables
    2746              : ! ==--------------------------------------------------------------==
    2747              : 
    2748            0 :       delta1 = 10._dp*delta
    2749              :       ! The particular hash function used in this case:
    2750              :       rhash = 0.7890_dp*wvk(1) &
    2751              :               + 0.6810_dp*wvk(2) &
    2752            0 :               + 0.5811_dp*wvk(3) + delta
    2753            0 :       ihash = INT(ABS(rhash)*REAL(nhash, kind=dp))
    2754            0 :       ihash = MOD(ihash, nhash) + nmesh + 1
    2755              :       ! Search for WVK in linked list
    2756            0 :       ipoint = list(ihash)
    2757            0 :       DO i = 1, 100
    2758              :          ! List exhausted
    2759            0 :          IF (ipoint .EQ. nil) THEN
    2760              :             ! WVK was not found in the mesh:
    2761            0 :             iplace = 0
    2762            0 :             RETURN
    2763              :          END IF
    2764              :          ! Compare WVK with this element
    2765            0 :          DO j = 1, 3
    2766            0 :             IF (ABS(wvk(j) - rlist(j, ipoint)) .GT. delta1) GOTO 215
    2767              :          END DO
    2768              :          ! WVK located, now remove it from the list:
    2769            0 :          list(ihash) = list(ipoint)
    2770              :          ! LIST(IHASH) now points to the next element in the list,
    2771              :          ! and the present WVK has become garbage.
    2772              :          ! Add WVK to the list of garbage:
    2773            0 :          IF (igarb0 .EQ. 0) THEN
    2774              :             ! Start up the garbage list:
    2775            0 :             igarb0 = ipoint
    2776              :          ELSE
    2777            0 :             list(igarbg) = ipoint
    2778              :          END IF
    2779            0 :          igarbg = ipoint
    2780            0 :          list(igarbg) = nil
    2781            0 :          iplace = 1
    2782            0 :          RETURN
    2783              :          ! Next element of list
    2784              : 215      CONTINUE
    2785            0 :          ihash = ipoint
    2786            0 :          ipoint = list(ihash)
    2787              :       END DO
    2788              :       ! List too long
    2789            0 :       CALL stopgm('MESH', 'LIST TOO LONG')
    2790              :       ! ==--------------------------------------------------------------==
    2791            0 :       RETURN
    2792              :    END SUBROUTINE remove
    2793              : ! **************************************************************************************************
    2794              : !> \brief ...
    2795              : !> \param wvk ...
    2796              : !> \param iplace ...
    2797              : !> \param igarb0 ...
    2798              : !> \param nmesh ...
    2799              : !> \param nhash ...
    2800              : !> \param list ...
    2801              : !> \param rlist ...
    2802              : !> \param delta ...
    2803              : ! **************************************************************************************************
    2804            0 :    SUBROUTINE garbag(wvk, iplace, igarb0, &
    2805            0 :                      nmesh, nhash, list, rlist, delta)
    2806              :       ! ==--------------------------------------------------------------==
    2807              :       ! == ENTRY POINT FOR CHECKING IF A WAVEVECTOR                     ==
    2808              :       ! ==             IS IN THE GARBAGE LIST                           ==
    2809              :       ! == INPUT:                                                       ==
    2810              :       ! ==   WVK(3)                                                     ==
    2811              :       ! ==   DELTA      REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)       ==
    2812              :       ! ==                                                              ==
    2813              :       ! == OUTPUT:                                                      ==
    2814              :       ! ==   IPLACE  ..... I > 0 IS THE PLACE IN THE GARBAGE LIST       ==
    2815              :       ! ==                     0 IF WVK NOT AMONG THE GARBAGE           ==
    2816              :       ! ==--------------------------------------------------------------==
    2817              :       REAL(dp)                                           :: wvk(3)
    2818              :       INTEGER                                            :: iplace, igarb0, nmesh, nhash, &
    2819              :                                                             list(nhash + nmesh)
    2820              :       REAL(dp)                                           :: rlist(3, nmesh), delta
    2821              : 
    2822              :       INTEGER, PARAMETER                                 :: nil = 0
    2823              : 
    2824              :       INTEGER                                            :: i, ihash, ipoint, j
    2825              :       REAL(dp)                                           :: delta1
    2826              : 
    2827              : ! ==--------------------------------------------------------------==
    2828              : ! Variables
    2829              : ! ==--------------------------------------------------------------==
    2830              : 
    2831            0 :       delta1 = 10._dp*delta
    2832              :       ! Search for WVK in linked list
    2833              :       ! Point to the garbage list
    2834            0 :       ipoint = igarb0
    2835            0 :       DO i = 1, nmesh
    2836              :          ! LIST EXHAUSTED
    2837            0 :          IF (ipoint .EQ. nil) THEN
    2838              :             ! WVK was not found in the mesh:
    2839            0 :             iplace = 0
    2840            0 :             RETURN
    2841              :          END IF
    2842              :          ! Compare WVK with this element
    2843            0 :          DO j = 1, 3
    2844            0 :             IF (ABS(wvk(j) - rlist(j, ipoint)) .GT. delta1) GOTO 315
    2845              :          END DO
    2846              :          ! WVK was located in the garbage list
    2847            0 :          iplace = i
    2848            0 :          RETURN
    2849              :          ! Next element of list
    2850              : 315      CONTINUE
    2851            0 :          ihash = ipoint
    2852            0 :          ipoint = list(ihash)
    2853              :       END DO
    2854              :       ! List too long
    2855            0 :       CALL stopgm('GARBAG', 'LIST TOO LONG')
    2856              :       ! ==--------------------------------------------------------------==
    2857            0 :       RETURN
    2858              :    END SUBROUTINE garbag
    2859              : 
    2860              : ! **************************************************************************************************
    2861              : !> \brief ...
    2862              : !> \param wvk ...
    2863              : !> \param a1 ...
    2864              : !> \param a2 ...
    2865              : !> \param a3 ...
    2866              : !> \param b1 ...
    2867              : !> \param b2 ...
    2868              : !> \param b3 ...
    2869              : !> \param rsdir ...
    2870              : !> \param nrsdir ...
    2871              : !> \param nplane ...
    2872              : !> \param delta ...
    2873              : ! **************************************************************************************************
    2874            0 :    SUBROUTINE bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, nrsdir, nplane, delta)
    2875              :       ! ==--------------------------------------------------------------==
    2876              :       ! == REDUCE WVK TO LIE ENTIRELY WITHIN THE 1ST BRILLOUIN ZONE     ==
    2877              :       ! == BY ADDING B-VECTORS                                          ==
    2878              :       ! == DELTA      REQUIRED ACCURACY (1.e-6_dp IS A GOOD VALUE)         ==
    2879              :       ! ==--------------------------------------------------------------==
    2880              :       REAL(dp)                                           :: wvk(3), a1(3), a2(3), a3(3), b1(3), &
    2881              :                                                             b2(3), b3(3)
    2882              :       INTEGER                                            :: nrsdir
    2883              :       REAL(dp)                                           :: rsdir(4, nrsdir)
    2884              :       INTEGER                                            :: nplane
    2885              :       REAL(dp)                                           :: delta
    2886              : 
    2887              :       INTEGER, PARAMETER                                 :: nzones = 4, nnn = 2*nzones + 1, &
    2888              :                                                             nn = nzones + 1
    2889              : 
    2890              :       INTEGER                                            :: i, i1, i2, i3, n1, n2, n3, nn1, nn2, nn3
    2891              :       LOGICAL                                            :: inside
    2892              :       REAL(dp)                                           :: wb(3), wva(3)
    2893              : 
    2894              : ! ==--------------------------------------------------------------==
    2895              : ! Variables
    2896              : ! Look around +/- "NZONES" to locate vector
    2897              : ! NZONES may need to be increased for very anisotropic zones
    2898              : ! ==--------------------------------------------------------------==
    2899              : 
    2900            0 :       IF (.NOT. inside_bz(wvk, rsdir, nplane, delta)) THEN
    2901            0 :          inside = .FALSE.
    2902              :          ! Express WVK in the basis of B1,2,3.
    2903              :          ! This permits an estimate of how far WVK is from the 1Bz.
    2904            0 :          wb(1) = wvk(1)*a1(1) + wvk(2)*a1(2) + wvk(3)*a1(3)
    2905            0 :          wb(2) = wvk(1)*a2(1) + wvk(2)*a2(2) + wvk(3)*a2(3)
    2906            0 :          wb(3) = wvk(1)*a3(1) + wvk(2)*a3(2) + wvk(3)*a3(3)
    2907            0 :          nn1 = NINT(wb(1))
    2908            0 :          nn2 = NINT(wb(2))
    2909            0 :          nn3 = NINT(wb(3))
    2910              :          ! Look around the estimated vector for the one truly inside the 1Bz
    2911            0 :          n1_loop: DO n1 = 1, nnn
    2912            0 :             i1 = nn - n1 - nn1
    2913            0 :             DO n2 = 1, nnn
    2914            0 :                i2 = nn - n2 - nn2
    2915            0 :                DO n3 = 1, nnn
    2916            0 :                   i3 = nn - n3 - nn3
    2917            0 :                   DO i = 1, 3
    2918              :                      wva(i) = wvk(i) + REAL(i1, kind=dp)*b1(i) + REAL(i2, kind=dp)*b2(i) + &
    2919            0 :                               REAL(i3, kind=dp)*b3(i)
    2920              :                   END DO
    2921            0 :                   inside = inside_bz(wva, rsdir, nplane, delta)
    2922            0 :                   IF (inside) EXIT n1_loop
    2923              :                END DO
    2924              :             END DO
    2925              :          END DO n1_loop
    2926            0 :          CPASSERT(inside)
    2927            0 :          wvk(1:3) = wva(1:3)
    2928              :       END IF
    2929              : 
    2930            0 :    END SUBROUTINE bzrduc
    2931              : 
    2932              : ! **************************************************************************************************
    2933              : !> \brief Is wvk in the 1st Brillouin zone ?
    2934              : !>        Check whether wvk lies inside all the planes that define the 1bz.
    2935              : !> \param wvk ...
    2936              : !> \param rsdir ...
    2937              : !> \param nplane ...
    2938              : !> \param delta ...
    2939              : !> \return ...
    2940              : ! **************************************************************************************************
    2941            0 :    FUNCTION inside_bz(wvk, rsdir, nplane, delta) RESULT(inbz)
    2942              :       REAL(KIND=dp), DIMENSION(3)                        :: wvk
    2943              :       REAL(KIND=dp), DIMENSION(:, :)                     :: rsdir
    2944              :       INTEGER                                            :: nplane
    2945              :       REAL(KIND=dp)                                      :: delta
    2946              :       LOGICAL                                            :: inbz
    2947              : 
    2948              :       INTEGER                                            :: n
    2949              :       REAL(KIND=dp)                                      :: projct
    2950              : 
    2951            0 :       inbz = .TRUE.
    2952            0 :       DO n = 1, nplane
    2953            0 :          projct = (rsdir(1, n)*wvk(1) + rsdir(2, n)*wvk(2) + rsdir(3, n)*wvk(3))/rsdir(4, n)
    2954            0 :          IF (ABS(projct) > 0.5_dp + delta) THEN
    2955              :             inbz = .FALSE.
    2956              :             EXIT
    2957              :          END IF
    2958              :       END DO
    2959              : 
    2960            0 :    END FUNCTION inside_bz
    2961              : 
    2962              : ! **************************************************************************************************
    2963              : !> \brief Find the vectors whose halves define the 1st Brillouin zone
    2964              : !>        Output:
    2965              : !>        nplane -- How many elements of rsdir contain normal vectors defining the planes
    2966              : !>        Method:
    2967              : !>        Starting with the parallelopiped spanned by b1,2,3 around the origin,
    2968              : !>        vectors inside a sufficiently large sphere are tested to see whether
    2969              : !>        the planes at 1/2*b will further confine the 1bz.
    2970              : !>        The resulting vectors are not cleaned to avoid redundant planes
    2971              : !> \param iout ...
    2972              : !> \param b1 ...
    2973              : !> \param b2 ...
    2974              : !> \param b3 ...
    2975              : !> \param rsdir ...
    2976              : !> \param nplane ...
    2977              : !> \param delta ...
    2978              : ! **************************************************************************************************
    2979            0 :    SUBROUTINE bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
    2980              :       INTEGER                                            :: iout
    2981              :       REAL(KIND=dp), DIMENSION(3)                        :: b1, b2, b3
    2982              :       REAL(KIND=dp), DIMENSION(:, :)                     :: rsdir
    2983              :       INTEGER                                            :: nplane
    2984              :       REAL(KIND=dp)                                      :: delta
    2985              : 
    2986              :       INTEGER                                            :: i, i1, i2, i3, n, n1, n2, n3, nb1, nb2, &
    2987              :                                                             nb3, nnb1, nnb2, nnb3, nrsdir
    2988              :       REAL(KIND=dp)                                      :: b1len, b2len, b3len, bmax, projct
    2989              :       REAL(KIND=dp), DIMENSION(3)                        :: bvec
    2990              : 
    2991            0 :       nrsdir = SIZE(rsdir, 2)
    2992              : 
    2993            0 :       b1len = b1(1)**2 + b1(2)**2 + b1(3)**2
    2994            0 :       b2len = b2(1)**2 + b2(2)**2 + b2(3)**2
    2995            0 :       b3len = b3(1)**2 + b3(2)**2 + b3(3)**2
    2996              :       ! Lattice containing entirely the Brillouin zone
    2997            0 :       bmax = b1len + b2len + b3len
    2998            0 :       nb1 = INT(SQRT(bmax/b1len) + delta) + 1
    2999            0 :       nb2 = INT(SQRT(bmax/b2len) + delta) + 1
    3000            0 :       nb3 = INT(SQRT(bmax/b3len) + delta) + 1
    3001            0 :       rsdir(:, :) = 0._dp
    3002              :       ! 1Bz is certainly confined inside the 1/2(B1,B2,B3) parallelopiped
    3003            0 :       rsdir(1:3, 1) = b1(1:3)
    3004            0 :       rsdir(1:3, 2) = b2(1:3)
    3005            0 :       rsdir(1:3, 3) = b3(1:3)
    3006            0 :       rsdir(4, 1) = b1len
    3007            0 :       rsdir(4, 2) = b2len
    3008            0 :       rsdir(4, 3) = b3len
    3009              :       ! Starting confinement: 3 planes
    3010            0 :       nplane = 3
    3011            0 :       nnb1 = 2*nb1 + 1
    3012            0 :       nnb2 = 2*nb2 + 1
    3013            0 :       nnb3 = 2*nb3 + 1
    3014              : 
    3015            0 :       DO n1 = 1, nnb1
    3016            0 :          i1 = nb1 + 1 - n1
    3017            0 :          DO n2 = 1, nnb2
    3018            0 :             i2 = nb2 + 1 - n2
    3019            0 :             DO n3 = 1, nnb3
    3020            0 :                i3 = nb3 + 1 - n3
    3021            0 :                IF (i1 .EQ. 0 .AND. i2 .EQ. 0 .AND. i3 .EQ. 0) GOTO 150
    3022            0 :                DO i = 1, 3
    3023              :                   bvec(i) = REAL(i1, kind=dp)*b1(i) + REAL(i2, kind=dp)*b2(i) + &
    3024            0 :                             REAL(i3, kind=dp)*b3(i)
    3025              :                END DO
    3026              :                ! Does the plane of 1/2*BVEC narrow down the 1Bz ?
    3027            0 :                DO n = 1, nplane
    3028              :                   projct = 0.5_dp*(rsdir(1, n)*bvec(1) + rsdir(2, n)*bvec(2) &
    3029            0 :                                    + rsdir(3, n)*bvec(3))/rsdir(4, n)
    3030              :                   ! 1/2*BVEC is outside the Bz - skip this direction
    3031              :                   ! The 1.e-6_dp takes care of single points touching the Bz,
    3032              :                   ! and of the -(plane)
    3033            0 :                   IF (ABS(projct) .GT. 0.5_dp - delta) GOTO 150
    3034              :                END DO
    3035              :                ! 1/2*BVEC further confines the 1Bz - include into RSDIR
    3036            0 :                nplane = nplane + 1
    3037            0 :                CPASSERT(nplane <= nrsdir)
    3038            0 :                DO i = 1, 3
    3039            0 :                   rsdir(i, nplane) = bvec(i)
    3040              :                END DO
    3041              :                ! Length squared
    3042            0 :                rsdir(4, nplane) = bvec(1)**2 + bvec(2)**2 + bvec(3)**2
    3043            0 : 150            CONTINUE
    3044              :             END DO
    3045              :          END DO
    3046              :       END DO
    3047              : 
    3048            0 :       IF (iout > 0) THEN
    3049              :          WRITE (iout, '(A,I3,A,/,A,/,100(" KPSYM|",1X,3F10.4,/))') &
    3050            0 :             ' KPSYM| The 1st Brillouin zone is confined by (at most)', &
    3051            0 :             nplane, ' planes', &
    3052            0 :             ' KPSYM| as defined by the +/- halves of the vectors:', &
    3053            0 :             ((rsdir(i, n), i=1, 3), n=1, nplane)
    3054              :       END IF
    3055              : 
    3056            0 :    END SUBROUTINE bzdefine
    3057              : 
    3058              : ! **************************************************************************************************
    3059              : !> \brief ...
    3060              : !> \param a ...
    3061              : !> \param b ...
    3062              : ! **************************************************************************************************
    3063            0 :    SUBROUTINE stopgm(a, b)
    3064              :       CHARACTER(LEN=*)                                   :: a, b
    3065              : 
    3066            0 :       CALL cp_warn(a, b)
    3067            0 :       CPABORT("stopgm@kpsym")
    3068              : 
    3069            0 :    END SUBROUTINE stopgm
    3070              : 
    3071              : ! **************************************************************************************************
    3072              : 
    3073              : END MODULE kpsym
        

Generated by: LCOV version 2.0-1