      program read_magnetic_data
* read data about magnetic space groups
* input data from magnetic_table.dat
      implicit none
      integer i,j,k,m,n

* for the ith nonhexagonal point operator:
* point_op_label(i): point operator symbol (from Litvin)
      character point_op_label(48)*8
* point_op_xyz(i): point operator in x,y,z notation
      character point_op_xyz(48)*10
* point_op_matrix(i): point operator matrix
      integer point_op_matrix(3,3,48)

* for the ith hexagonal point operator:
* point_op_hex_label(i): point operator symbol (from Litvin)
      character point_op_hex_label(24)*8
* point_op_hex_xyz(i): point operator in x,y,z notation
      character point_op_hex_xyz(24)*10
* point_op_hex_matrix(i): point operator matrix
      integer point_op_hex_matrix(3,3,24)

* number of magnetic space groups
      integer magcount
      parameter(magcount=1651)

* for the ith magnetic space group
* nlabel_bns(i): numerical label in BNS setting
      character nlabel_bns(magcount)*12
* nlabel_parts_bns(j,i): jth part of nlabel_bns
      integer nlabelparts_bns(2,magcount)
* spacegroup_label_uinfied(i): unified group symbol
      character spacegroup_label_unified(magcount)*27
* spacegroup_label_bns(i): group symbol
      character spacegroup_label_bns(magcount)*14
* nlabel_og(i): numerical label in OG setting
      character nlabel_og(magcount)*12
* nlabel_parts_og(j,i): jth part of nlabel_og
      integer nlabelparts_og(3,magcount)
* label_og(i): group symbol
      character spacegroup_label_og(magcount)*14
* magtype(i): type of magnetic space group (1-4)
      integer magtype(magcount)

* BNS-OG transformation (if type-4)
* bnsog_point_op(j,k,i): 3x3 point operator part of transformation
      integer bnsog_point_op(3,3,magcount)
* bnsog_origin(j,i): translation part of transformation
* bnsog_point_origin(i): common denominator
      integer bnsog_origin(3,magcount)
      integer bnsog_origin_denom(magcount)

* iops_count(i): number of point operators
      integer ops_count(magcount)
* wyckoff_count(i): number of wyckoff sites
      integer wyckoff_site_count(magcount)
* wyckoff_pos_count(j,i): number of positions in jth wyckoff site
      integer wyckoff_pos_count(27,magcount)
* wyckoff_mult(j,i): multiplicity for jth wyckoff site
      integer wyckoff_mult(27,magcount)
* wyckoff_label(j,i): symbol (a,b,c,...,z,alpha) for jth wyckoff site
      character wyckoff_label(27,magcount)

* for BNS setting
* lattice_bns_vectors_count(i): number of lattice vectors defining the lattice
      integer lattice_bns_vectors_count(magcount)
* lattice_bns_vectors(k,j,i): kth component of the jth lattice vector
* lattice_bns_vectors_denom(j,i): common denominator
      integer lattice_bns_vectors(3,6,magcount)
      integer lattice_bns_vectors_denom(6,magcount)
* for jth operator
* ops_bns_point_op(j,i): point operator part
      integer ops_bns_point_op(96,magcount)
* ops_bns_trans(k,j,i): kth component of translation part
* ops_bns_trans_denom(j,i): common denominator
      integer ops_bns_trans(3,96,magcount)
      integer ops_bns_trans_denom(96,magcount)
* ops_bns_timeinv(j,i): 1=no time inversion, -1=time inversion
      integer ops_bns_timeinv(96,magcount)
* for jth wyckoff site
* wyckoff_bns_fract(k,j,i): kth component of fractional part of wyckoff position
* wyckoff_bns_fract_denom(j,i): common denominator
      integer wyckoff_bns_fract(3,96,27,magcount)
      integer wyckoff_bns_fract_denom(96,27,magcount)
* wyckoff_bns_xyz(m,k,j,i): mth component to coeffcient of kth paramater (x,y,z)
      integer wyckoff_bns_xyz(3,3,96,27,magcount)
* wyckoff_bns_mag(m,k,j,i): mth component to coeffcient of kth magnetic
* paramater (mx,my,mz)
      integer wyckoff_bns_mag(3,3,96,27,magcount)

* for OG setting (for type-4 groups)
* lattice_og_vectors_count(i): number of lattice vectors defining the lattice
      integer lattice_og_vectors_count(magcount)
* lattice_og_vectors(k,j,i): kth component of the jth lattice vector
* lattice_og_vectors_denom(j,i): common denominator
      integer lattice_og_vectors(3,6,magcount)
      integer lattice_og_vectors_denom(6,magcount)
* for jth operator
* ops_og_point_op(j,i): point operator part
      integer ops_og_point_op(96,magcount)
* ops_og_trans(k,j,i): kth component of translation part
* ops_og_trans_denom(j,i): common denominator
      integer ops_og_trans(3,96,magcount)
      integer ops_og_trans_denom(96,magcount)
* ops_og_timeinv(j,i): 1=no time inversion, -1=time inversion
      integer ops_og_timeinv(96,magcount)
* for jth wyckoff site
* wyckoff_og_fract(k,j,i): kth component of fractional part of wyckoff position
* wyckoff_og_fract_denom(j,i): common denominator
      integer wyckoff_og_fract(3,96,27,magcount)
      integer wyckoff_og_fract_denom(96,27,magcount)
* wyckoff_og_xyz(m,k,j,i): mth component to coeffcient of kth paramater (x,y,z)
      integer wyckoff_og_xyz(3,3,96,27,magcount)
* wyckoff_og_mag(m,k,j,i): mth component to coeffcient of kth magnetic
* paramater (mx,my,mz)
      integer wyckoff_og_mag(3,3,96,27,magcount)

******************************************************************************
* open data file
      open(30,file='magnetic_data.txt')
* read nonhexangonal point operators
      do i=1,48
        read(30,*)n,point_op_label(i),point_op_xyz(i),
     $       ((point_op_matrix(k,j,i),j=1,3),k=1,3)
        if(n.ne.i)stop
     $       'error in numbering of nonhexagonal point operators'
      enddo
* read hexangonal point operators
      do i=1,24
        read(30,*)n,point_op_hex_label(i),
     $       point_op_hex_xyz(i),
     $       ((point_op_hex_matrix(k,j,i),j=1,3),k=1,3)
        if(n.ne.i)stop
     $       'error in numbering of hexagonal point operators'
      enddo
* read data for each magnetic space group
      do i=1,1651
        read(30,*)(nlabelparts_bns(j,i),j=1,2),nlabel_bns(i),
     $       spacegroup_label_unified(i),
     $       spacegroup_label_bns(i),(nlabelparts_og(j,i),j=1,3),
     $       nlabel_og(i),spacegroup_label_og(i)
        read(30,*)magtype(i)
        if(magtype(i).eq.4)then
          read(30,*)((bnsog_point_op(j,k,i),j=1,3),k=1,3),
     $         (bnsog_origin(j,i),j=1,3),bnsog_origin_denom(i)
        endif
        read(30,*)ops_count(i)
        read(30,*)(ops_bns_point_op(j,i),(ops_bns_trans(k,j,i),k=1,3),
     $       ops_bns_trans_denom(j,i),ops_bns_timeinv(j,i),
     $       j=1,ops_count(i))
        read(30,*)lattice_bns_vectors_count(i)
        read(30,*)((lattice_bns_vectors(k,j,i),k=1,3),
     $       lattice_bns_vectors_denom(j,i),
     $       j=1,lattice_bns_vectors_count(i))
        read(30,*)wyckoff_site_count(i)
        do j=1,wyckoff_site_count(i)
          read(30,*)wyckoff_pos_count(j,i),wyckoff_mult(j,i),
     $         wyckoff_label(j,i)
          do k=1,wyckoff_pos_count(j,i)
            read(30,*)(wyckoff_bns_fract(m,k,j,i),m=1,3),
     $           wyckoff_bns_fract_denom(k,j,i),
     $           ((wyckoff_bns_xyz(m,n,k,j,i),m=1,3),n=1,3),
     $           ((wyckoff_bns_mag(m,n,k,j,i),m=1,3),n=1,3)
          enddo
        enddo
        if(magtype(i).eq.4)then
        read(30,*)ops_count(i)
        read(30,*)(ops_og_point_op(j,i),(ops_og_trans(k,j,i),k=1,3),
     $       ops_og_trans_denom(j,i),ops_og_timeinv(j,i),
     $       j=1,ops_count(i))
        read(30,*)lattice_og_vectors_count(i)
        read(30,*)((lattice_og_vectors(k,j,i),k=1,3),
     $       lattice_og_vectors_denom(j,i),
     $       j=1,lattice_og_vectors_count(i))
        read(30,*)wyckoff_site_count(i)
        do j=1,wyckoff_site_count(i)
          read(30,*)wyckoff_pos_count(j,i),wyckoff_mult(j,i),
     $         wyckoff_label(j,i)
          do k=1,wyckoff_pos_count(j,i)
            read(30,*)(wyckoff_og_fract(m,k,j,i),m=1,3),
     $           wyckoff_og_fract_denom(k,j,i),
     $           ((wyckoff_og_xyz(m,n,k,j,i),m=1,3),n=1,3),
     $           ((wyckoff_og_mag(m,n,k,j,i),m=1,3),n=1,3)
          enddo
        enddo
        endif
      enddo
* close data file
      close(30)
      end
