Это простая задача перечисления симметрии. Я даю полный обзор, но знание квантовой химии не требуется.
Двухчастичный интеграл : И имеет следующие 4 симметрии: У меня есть функция, которая вычисляет интеграл и сохраняет его в одномерном массиве , проиндексированном следующим образом:⟨ я J | к л ⟩ = ∫ г | * я ( х ) г | * J ( х ' ) г | к ( х ) г | л ( х ' ) ⟨ я J | к л ⟩ = ⟨ J я | л к ⟩ = ⟨ к л | я J ⟩ = ⟨ л к | J я ⟩
int2
int2(ijkl2intindex2(i, j, k, l))
где функция ijkl2intindex2
возвращает уникальный индекс, принимая во внимание вышеуказанные симметрии. Единственное требование состоит в том, что если вы перебираете все комбинации i, j, k, l (от 1 до n каждая), он будет int2
последовательно заполнять массив и назначать один и тот же индекс всем комбинациям ijkl, которые связаны с вышеуказанным 4 симметрии.
Моя текущая реализация в Фортране здесь . Это очень медленно. Кто-нибудь знает, как сделать это эффективно? (На любом языке.)
Подсказка: если орбитали действительны, то в дополнение к вышеуказанным симметриям можно поменять местами и чтобы мы получили всего 8 симметрий: и тогда можно реализовать очень быструю функцию для ее индексации, см. мою реализацию здесь . Я хотел бы найти эффективную схему индексации для случаев, когда орбитали не являются реальными.я ↔ к J ↔ л ⟨ я J | к л ⟩ = ⟨ J я
Примечание: функции, которые я реализовал, фактически принимают четыре числа , , , в так называемой «химической» записи , то есть аргументы и взаимозаменяемы, но это не важно.J K L ( я J | к л ) = ⟨ я K | J л ⟩ J K