function davidson_direct_ci_init() result(this) use bit_rep_data, only: NIfD use direct_ci, only: create_direct_ci_arrays use FciMCData, only: davidson_ras, davidson_classes, davidson_strings, davidson_iluts, davidson_excits use ras, only: initialise_ras_space, find_ras_size type(DavidsonCalcType) :: this integer :: class_i, class_j, j, sym_i, sym_j write(stdout, '(/,1X,"Beginning Direct CI Davidson calculation.",/)'); call neci_flush(stdout) call initialise_ras_space(davidson_ras, davidson_classes) ! The total hilbert space dimension of calculation to be performed. call find_ras_size(davidson_ras, davidson_classes, this%super%space_size) allocate(davidson_strings(-1:tot_nelec, davidson_ras%num_strings)) allocate(davidson_iluts(0:NIfD, davidson_ras%num_strings)) allocate(davidson_excits(davidson_ras%num_strings)) ! Create the arrays used by the direct CI multiplication. call create_direct_ci_arrays(davidson_ras, davidson_classes, davidson_strings, & davidson_iluts, davidson_excits) ! Allocate input and output direct CI vectors. allocate(direct_ci_inp(size(davidson_classes), size(davidson_classes), 0:7)) allocate(direct_ci_out(size(davidson_classes), size(davidson_classes), 0:7)) do class_i = 1, size(davidson_classes) do j = 1, davidson_classes(class_i)%num_comb class_j = davidson_classes(class_i)%allowed_combns(j) do sym_i = 0, 7 sym_j = ieor(int(HFSym_ras), sym_i) if (davidson_classes(class_i)%num_sym(sym_i) == 0) cycle if (davidson_classes(class_j)%num_sym(sym_j) == 0) cycle allocate(direct_ci_inp(class_i, class_j, sym_i)% & elements(1:davidson_classes(class_i)%num_sym(sym_i), 1:davidson_classes(class_j)%num_sym(sym_j))) allocate(direct_ci_out(class_i, class_j, sym_i)% & elements(1:davidson_classes(class_i)%num_sym(sym_i), 1:davidson_classes(class_j)%num_sym(sym_j))) end do end do end do end function davidson_direct_ci_init