66 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
67 INTENT(OUT) :: p_act_mo_a
68 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
69 INTENT(OUT),
OPTIONAL :: p_act_mo_b
72 CHARACTER(KIND=C_CHAR),
DIMENSION(512) :: c_error
73 CHARACTER(LEN=512) :: error_text
74 INTEGER :: max_iter, ms2, n2, n4, nmo_active, &
76 LOGICAL :: ionode, restricted_orbitals
77 REAL(kind=
dp) :: energy_active, threshold
78 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eri_aa, eri_ab, eri_bb, fock_a, fock_b, &
81 nmo_active = active_space_env%nmo_active
82 nspins = active_space_env%nspins
83 restricted_orbitals = active_space_env%restricted_orbitals
84 n2 = nmo_active*nmo_active
86 ionode = para_env%is_source()
88 ALLOCATE (fock_a(n2), eri_aa(n4), p_act_mo_a(n2))
89 ALLOCATE (fock_b(max(1, n2)), eri_ab(max(1, n4)), eri_bb(max(1, n4)), p_beta(max(1, n2)))
95 associate(act_indices => active_space_env%active_orbitals(:, 1))
98 CALL eri_to_array(active_space_env%eri, eri_aa, active_space_env%active_orbitals, 1, 1)
100 IF (nspins == 2)
THEN
101 IF (.NOT.
PRESENT(p_act_mo_b))
THEN
102 cpabort(
"Missing beta output buffer for local active-space FCI solver.")
104 ALLOCATE (p_act_mo_b(n2))
105 associate(act_indices => active_space_env%active_orbitals(:, 2))
108 IF (restricted_orbitals)
THEN
109 eri_ab(1:n4) = eri_aa
110 eri_bb(1:n4) = eri_aa
112 CALL eri_to_array(active_space_env%eri, eri_ab(1:n4), active_space_env%active_orbitals, 1, 2)
113 CALL eri_to_array(active_space_env%eri, eri_bb(1:n4), active_space_env%active_orbitals, 2, 2)
118 energy_active = 0.0_dp
120 c_error(:) = c_null_char
121 ms2 = active_space_env%multiplicity - 1
123 threshold = 1.0e-8_dp
126 status = libfci_solve(int(nspins, c_int), int(nmo_active, c_int), &
127 int(active_space_env%nelec_active, c_int), int(ms2, c_int), &
128 fock_a, fock_b, eri_aa, eri_ab, eri_bb, int(max_iter, c_int), &
129 REAL(threshold, c_double), int(200, c_int), int(1, c_int), int(0, c_int), &
130 energy_active, p_act_mo_a, p_beta, c_error, int(size(c_error), c_int))
131 error_text = c_string(c_error)
134 CALL para_env%bcast(status, para_env%source)
135 CALL para_env%bcast(error_text, para_env%source)
136 IF (status /= 0)
THEN
137 IF (len_trim(error_text) > 0)
THEN
138 cpabort(
"Local active-space FCI solver failed: "//trim(error_text))
140 cpabort(
"Local active-space FCI solver failed.")
144 CALL para_env%bcast(energy_active, para_env%source)
145 CALL para_env%bcast(p_act_mo_a, para_env%source)
146 active_space_env%energy_active = energy_active
147 IF (nspins == 2)
THEN
148 p_act_mo_b(:) = p_beta(1:n2)
149 CALL para_env%bcast(p_act_mo_b, para_env%source)
152 DEALLOCATE (fock_a, fock_b, eri_aa, eri_ab, eri_bb, p_beta)
154 mark_used(active_space_env)
156 mark_used(p_act_mo_a)
157 IF (
PRESENT(p_act_mo_b))
THEN
158 mark_used(p_act_mo_b)
160 cpabort(
"AS_SOLVER FCI requires CP2K to be built with LibFCI support.")