Check if any atoms appear in multiple fragments This is O(nfrag * natoms_per_frag^2) which is acceptable for typical fragment sizes
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(input_fragment_t), | intent(in) | :: | fragments(:) | |||
| integer, | intent(in) | :: | nfrag | |||
| type(error_t), | intent(out) | :: | error |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | private | :: | atom_i | ||||
| integer, | private | :: | atom_j | ||||
| integer, | private | :: | i | ||||
| integer, | private | :: | j | ||||
| integer, | private | :: | k | ||||
| integer, | private | :: | l |
subroutine check_fragment_overlap(fragments, nfrag, error) !! Check if any atoms appear in multiple fragments !! This is O(nfrag * natoms_per_frag^2) which is acceptable for typical fragment sizes use mqc_config_parser, only: input_fragment_t use pic_io, only: to_char type(input_fragment_t), intent(in) :: fragments(:) integer, intent(in) :: nfrag type(error_t), intent(out) :: error integer :: i, j, k, l integer :: atom_i, atom_j ! Compare each pair of fragments do i = 1, nfrag - 1 do j = i + 1, nfrag ! Compare atoms in fragment i with atoms in fragment j do k = 1, size(fragments(i)%indices) atom_i = fragments(i)%indices(k) do l = 1, size(fragments(j)%indices) atom_j = fragments(j)%indices(l) if (atom_i == atom_j) then ! Found overlapping atom call error%set(ERROR_VALIDATION, "Overlapping fragments detected: fragments "//to_char(i)//" and "// & to_char(j)//" both contain atom "//to_char(atom_i)// & ". Set allow_overlapping_fragments = true to allow this.") return end if end do end do end do end do end subroutine check_fragment_overlap