anchor.diff:                         & i9,")")') iStr2, strN2
            cycle
         endif
  -      do i = 0, k-1
  -         if (count(ilabeling2==i)/=count(ilabeling1==i)) then
  -            write(13,'("Concentrations don''t match for color ",i1)') i
  -            cycle compareloop
  -         endif
  +      ! If ilabeling2 *or* one if its complements has the correct concentration, then we need to continue in the check.
  +
  +      do iLP = 1, nLP ! Loop over all complements of the labels (stored in 'labPerms')
  +         do i = 0,k-1 ! Loop over each color to make the complement of the label
  +            where  (ilabeling2==i) tempLab = labPerms(iLP,i+1)
  +         enddo
  +         concMatch = .true.
  +         do i = 0, k-1
  +            if (count(tempLab==i)/=count(ilabeling1==i)) then
  +               concMatch = .false.
  +            endif
  +         enddo
  +         if (concMatch) exit
         enddo
  -      write(13,'("Concentrations match for structures ",2(i6,1x))') strN, strN2
  -
  -!! Aug 12 This block of 30 lines was moved from above. We only need to check for L1/=L2 after everything else matches.
  -   ! We do this even though there are no duplicates to remove. The routine also generates the vectors subscripts for the label permutations and we need these to generate the list of equivalent labelings
  -
  -! dRotList1 is used in following two calls because, at this point, we've established that they would be the same, and it's more efficient to find dRotList1 outside of the compare loop
  -   call remove_duplicate_lattices(HNFin,LatDim2,pLV2,rot,shift,dset2,dRotList1,HNFout,fixOp,&
  -                                  LattRotList2,sLVlist,degen_list,eps)
  +      if (.not. concMatch) then
  +         write(13,'("Concentrations (and all complements) don''t match")')
  +         cycle compareloop
  +      endif
  +      write(13,'("Concentrations (or complements) match for structures:",2(i6,1x))') strN, strN2
  +! <<< The next 100 lines or so compares the labelings---everything else matches at this point >>>
  +
  +   ! We do "remove_duplicate_lattices" even though there are no duplicates to remove because the routine also generates the vector subscripts for the label permutations and we need these to generate the list of equivalent labelings
  +   ! We could use dRotList1 is used in the "remove_..." and "get_r..." calls below because, at this point, we've established that dRotList1 and dRotList2 would be the same, and it would be more efficient to find dRotList1 outside of the compare loop
  +   call get_dvector_permutations(pLV2,dset2,nD2,rot,shift,dRotList2,LatDim2,eps) ! get dRotList2
  +   call remove_duplicate_lattices(HNFin,LatDim2,pLV2,rot,shift,dset2,dRotList2,HNFout,fixOp,&
  +                                  LattRotList2,sLVlist,degen_list,eps) ! get fixing operations
      open(17,file="debug_rotation_permutations.out")
      ! Get the list of label permutations
  -   call get_rotation_perms_lists(pLV2,HNFout,L2,SNF,fixOp,LattRotList2,dRotList1,eps)
  +   call get_rotation_perms_lists(pLV2,HNFout,L2,SNF,fixOp,LattRotList2,dRotList2,eps)
      write(17,'("Rots Indx:",/,8(24(i3,1x),/))') LattRotList2(1)%RotIndx(:)
      write(17,'("Permutation group (trans+rot):")')
      nP = size(LattRotList2(1)%perm,1)
  
positive.code:       write(17,'("Perm #",i3,":",1x,200(i2,1x))') ip,LattRotList2(1)%perm(ip,:)
     enddo
     call find_equivalent_labelings(ilabeling2,LattRotList2,qLabel,rotProdLab)
     do i = 1,size(qLabel,1)
  !      write(*,'("pL: ",i3,2x,14i1)')i,qLabel(i,:)
     enddo
        if (any(L1/=L2)) then ! We must find the automorphism that connects the two different groups and adjust ilabeling2 accordingly
           if (associated(g1)) deallocate(g1); if (associated(g2)) deallocate(g2)
           !1) build the member list
           call make_member_list(diag,g1) ! This routine allocates g1
           !2) find the group automorphism
           call matrix_inverse(real(L2(:,:,1),dp),L2inv,err)
           if (err) stop "L2inv is not defined"
           T = matmul(L1(:,:,1),L2inv)
            ! do i = 1,3
            !    write(*,'(" T:  ",3(f7.3,1x))') T(i,:)
            ! enddo
           allocate(g2(3,size(g1,2)))
           !g2 = -1
           g2 = nint(matmul(T,g1))
           g2 = modulo(g2,spread(diag,2,n))
           !if (any(g2==-1)) stop "Bug in group member mapping"
           ! do i = 1,3
           !    write(*,'("g2: ",20(i2,1x))') g2(i,:)
           ! enddo
           ! print*
  
           ! Next, find the rearrangement between the two groups (the automorphism)
           if (allocated(automorphism)) deallocate(automorphism)
           allocate(automorphism(n2))
           call find_permutation_of_group(g1,g2,automorphism)
           write(13,"('automorphism')")
           write(13,"(20i1)") automorphism
           ! 3) Apply the automorphism to every permuted labeling (qLabels)
  
           do j = 1,size(qLabel,1)
              do i = 0, n*nD2-1, n
                 qLabel(j,1+i:n+i) = qLabel(j,automorphism+i)
              enddo
              ! write(*,'(i3,"   qL:  ",20(i1))') j, qLabel(j,:)
           enddo
           print*
           !4) proceed as normal
        endif
        foundLab = .false.
           ! We need to loop over all permutations (to get the full orbit) because we do not know
           ! which member of the orbit is the representative.
           ! Also, for 50-50 labelings that are self-complementary (more generally, any
           ! "equiatomic" labeling may be self-complementary), we also need to check the
           ! complement of each labeling because any of the complements may appear in either list.
           ! GLWH 2019, see email chain, subject: "Monk?", with Rod Forcade starting May 16 2019
           do jL = 1, size(qlabel,1)
              ilabeling2 = qLabel(jL,:)
              if(all(ilabeling2==ilabeling1)) then
                 foundLab = .true.
                 write(13,'("MATCH  Perm #: ",i3)') jl
                 if (match/=0) then
                    write(13,'("Additional match found: ",i6," == ",i6)') strN, strN2
                     write(13,'("In file 2, structure ",i6)') strN2
                     write(13,'("was equivalent to ",i6)') match
                     write(13,'("in file 1")')
                    stop "BUG! Found more than one match in struct_enum.out file"
                 endif
                 match = strN2
                 exit
              endif
              !if equiatomic then check for complements. I think it's OK to not check permutations (we've already done that above). We just need to check for different complements of the same labeling...
              if (equiatomic) then ! check complements as well
                 do iLP = 2, nLP ! Loop over all complements of the labels
                                 ! (stored in 'labPerms'). Start at 2 since
                                 ! we want to skip the identity. We already checked the unpermuted case in the preceding `if` statement.
                    do i = 0,k-1
                       where  (ilabeling2==i) tempLab = labPerms(iLP,i+1)
                    enddo
                    if(all(ilabeling1==tempLab)) then
                       foundLab = .true.
                       if (match/=0) then
                          write(13,'("Additional match found: ",i6," == ",i6)') strN, strN2
                          write(13,'("In file 2, structure ",i6)') strN2
                          write(13,'("was also equivalent to ",i6)') match
                          write(13,'("in file 1")')
                          stop "BUG! Found more than one match in struct_enum.out file"
                       endif
                       match = strN2
                       exit !iLP loop over complements
                    endif
                 enddo !iLP loop
              endif
              if (foundLab) exit ! loop over permutations. Some labelings are invariant under some permutations. So without the exit, we will find a duplicate
           enddo ! jL Loop over permutations
        if(.not. foundLab) then
           write(13,'("Labeling didn''t match for str #:",i8)') strN
        else
           write(13,'("Structure number:",i8," in file2 is a match to ",i8," in file1!")') strN2, strN
        endif
        !if (match/=0) exit
     enddo compareloop
     close(f2)
     if(match==0) then
        write(13,'("Match for str #:",i8," in file 1 was not found in file 2")') strN
        stop
     else
        write(13,'("Structure number:",i8," is a match to # ",i9," in file 2.")') strN, match
     endif
  
negative.code: integer, allocatable :: ilabeling1(:), ilabeling2(:), atomType(:), automorphism(:)
  integer, allocatable :: tempLab(:)
  real(dp) :: eps
  logical full, HNFmatch, foundLab, err, concMatch
  character(maxLabLength)   :: labeling ! List, 0..k-1, of the atomic type at each site
  type(RotPermList)         :: dRotList1, dRotList2
  type(RotPermList),pointer :: LattRotList2(:)
  type(opList), pointer     :: fixOp(:)
  integer, pointer          :: crange(:,:), degen_list(:), rotProdLab(:), labPerms(:,:)
  