46 use const_gbl,
only: stdout
47 use global_utils,
only: print_ukrmol_header
48 use precisn,
only: wp, longint
49 use mpi_gbl,
only: mpi_mod_start, mpi_mod_finalize, master, myrank, mpi_mod_print_info
50 use options_module,
only: optionsset, ham_pars_io_wrapper
51 use orbital_module,
only: orbitaltable
52 use csf_module,
only: csfobject, csforbital, csfmanager
53 use ci_hamiltonian_module,
only: target_ci_hamiltonian
54 use basematrix_module,
only: basematrix
55 use baseintegral_module,
only: baseintegral
56 use diagonalizer_module,
only: basediagonalizer
57 use memorymanager_module,
only: master_memory
58 use parallelization_module,
only: process_grid
59 use postprocessing_module,
only: postprocess
60 use uncontracted_hamiltonian_module,
only: uncontracted_hamiltonian
61 use contracted_hamiltonian_module,
only: contracted_hamiltonian
62 use timing_module,
only: master_timer
63 use target_rmat_ci_module,
only: target_rmat_ci, read_ci_mat
64 use dispatcher_module,
only: dispatchintegral, dispatchmatrixanddiagonalizer, initialize_libraries
65 use writermatrix_module,
only: writermatrix
66 use solutionhandler_module,
only: solutionhandler
70 type(optionsset) :: scatci_input
71 type(orbitaltable) :: orbitals
72 type(uncontracted_hamiltonian) :: enrgms
73 type(contracted_hamiltonian) :: enrgmx
74 type(csfmanager) :: configuration_manager
75 class(baseintegral),
pointer :: integrals => null()
76 class(target_ci_hamiltonian),
pointer :: tgt_ci_hamiltonian => null()
77 class(basediagonalizer),
pointer :: diagonalizer => null()
78 class(basematrix),
pointer :: matrix_elements => null()
79 type(solutionhandler),
allocatable :: solutions(:)
80 type(csfobject),
allocatable :: csfs(:)
81 type(target_rmat_ci),
allocatable :: ci_rmat(:)
82 real(wp),
allocatable :: test_eig(:), test_vecs(:,:)
83 integer :: num_mat_elms, i, j
85 integer :: usr_ef_type
87 logical,
parameter :: sequential_diagonalizations = .false.
88 logical,
parameter :: master_writes_to_stdout = .true.
89 logical,
parameter :: allow_shared_memory = .true.
91 call mpi_mod_start(master_writes_to_stdout, allow_shared_memory)
92 call master_timer % initialize()
93 if (myrank == master)
call print_ukrmol_header(stdout)
94 call mpi_mod_print_info(stdout)
97 call initialize_libraries
100 call scatci_input % read
101 allocate (solutions(
size(scatci_input % opts)))
104 call process_grid % setup(
size(scatci_input % opts), sequential_diagonalizations)
105 call process_grid % summarize
106 if (.not. process_grid % sequential)
call scatci_input % setup_write_order
108 call master_timer % start_timer(
"Wall Time")
111 symmetry_loop:
do i = 1,
size(scatci_input % opts)
113 if (.not. process_grid % is_my_group_work(i)) cycle
115 call orbitals % initialize(scatci_input % opts(i) % tot_num_spin_orbitals, &
116 scatci_input % opts(i) % tot_num_orbitals, &
117 scatci_input % opts(i) % sym_group_flag, &
118 scatci_input % opts(i) % num_syms, &
119 scatci_input % opts(i) % positron_flag)
120 call orbitals % construct(scatci_input % opts(i) % num_orbitals_sym, &
121 scatci_input % opts(i) % num_target_orbitals_sym_dinf_congen, &
122 scatci_input % opts(i) % num_orbitals_sym, &
123 scatci_input % opts(i) % num_electronic_orbitals_sym, &
124 scatci_input % opts(i) % num_target_orbitals_sym_congen)
127 call orbitals % compute_electron_index(scatci_input % opts(i) % num_electrons, &
128 scatci_input % opts(i) % reference_dtrs)
131 call configuration_manager % initialize(scatci_input % opts(i), orbitals)
134 call master_timer % start_timer(
"Construct CSFs")
135 call configuration_manager % create_csfs(csfs, &
136 scatci_input % opts(i) % orbital_sequence_number, &
137 scatci_input % opts(i) % num_ci_target_sym, &
138 scatci_input % opts(i) % lambda_continuum_orbitals_target)
139 call master_timer % stop_timer(
"Construct CSFs")
140 call master_memory % print_memory_report
143 if (.not.
associated(integrals))
then
144 call dispatchintegral(scatci_input % opts(i) % sym_group_flag, &
145 scatci_input % opts(i) % use_UKRMOL_integrals, &
147 call integrals % initialize(scatci_input % opts(i), &
148 orbitals % total_num_orbitals, &
149 orbitals % orbital_map)
150 call integrals % load_integrals(scatci_input % opts(i) % integral_unit)
151 call master_memory % print_memory_report
155 if (scatci_input % opts(i) % diagonalization_flag ==
read_from_file)
then
156 call solutions(i) % construct(scatci_input % opts(i))
157 call solutions(i) % export_header(scatci_input % opts(i), integrals)
158 call solutions(i) % read_from_file(scatci_input % opts(i))
160 call configuration_manager % finalize
164 write (stdout, *)
' Load CI target and construct matrix elements'
175 if (scatci_input % opts(i) % do_ci_contraction())
then
176 usr_ef = scatci_input % opts(i) % enh_factor
177 usr_ef_type = scatci_input % opts(i) % enh_factor_type
178 scatci_input % opts(i) % enh_factor = 1.0
179 scatci_input % opts(i) % enh_factor_type = 0
181 allocate(ci_rmat(scatci_input % opts(i) % num_target_sym))
182 do j = 1, scatci_input % opts(i) % num_target_sym
183 call ci_rmat(j) % initialize(j, &
184 scatci_input % opts(i) % num_target_state_sym(j), &
185 scatci_input % opts(i) % num_ci_target_sym(j), &
186 scatci_input % opts(i) % ci_phase(j), &
187 integrals % get_core_energy())
190 if (scatci_input % opts(i) % ci_target_switch > 0)
then
191 call read_ci_mat(scatci_input % opts(i), ci_rmat)
193 do j = 1, scatci_input % opts(i) % num_target_sym
194 allocate(target_ci_hamiltonian::tgt_ci_hamiltonian)
195 call dispatchmatrixanddiagonalizer(scatci_input % opts(i) % diagonalizer_choice, &
196 scatci_input % opts(i) % force_serial, &
197 scatci_input % opts(i) % num_ci_target_sym(j), &
198 ci_rmat(j) % nstat, &
202 scatci_input % opts(i) % hamiltonian_unit)
205 call matrix_elements % set_options(scatci_input % opts(i))
207 call tgt_ci_hamiltonian % construct(scatci_input % opts(i), csfs, orbitals, integrals)
208 call tgt_ci_hamiltonian % initialize(j)
210 call master_timer % start_timer(
"Build CI Hamiltonian")
211 call tgt_ci_hamiltonian % build_hamiltonian(matrix_elements)
212 call master_timer % stop_timer(
"Build CI Hamiltonian")
213 call master_timer % report_timers
215 call master_timer % start_timer(
"Diagonalization")
216 call diagonalizer % diagonalize(matrix_elements, ci_rmat(j) % nstat, ci_rmat(j), .true., &
217 scatci_input % opts(i), integrals)
218 call master_timer % stop_timer(
"Diagonalization")
220 call ci_rmat(j) % print
221 call master_timer % report_timers
223 call matrix_elements % destroy
224 if (process_grid % grank == master)
close (scatci_input % opts(i) % hamiltonian_unit)
225 deallocate(matrix_elements, diagonalizer)
226 deallocate(tgt_ci_hamiltonian)
229 scatci_input % opts(i) % enh_factor = usr_ef
230 scatci_input % opts(i) % enh_factor_type = usr_ef_type
234 call dispatchmatrixanddiagonalizer(scatci_input % opts(i) % diagonalizer_choice, &
235 scatci_input % opts(i) % force_serial, &
236 scatci_input % opts(i) % contracted_mat_size, &
237 scatci_input % opts(i) % num_eigenpairs, &
241 scatci_input % opts(i) % hamiltonian_unit)
243 call matrix_elements % set_options(scatci_input % opts(i))
245 call integrals % write_matrix_header(scatci_input % opts(i) % hamiltonian_unit, &
246 scatci_input % opts(i) % contracted_mat_size)
247 allocate(writermatrix::matrix_elements)
249 call matrix_elements % set_options(scatci_input % opts(i))
252 call matrix_elements % exclude_row_column(scatci_input % opts(i) % exclude_rowcolumn)
255 if (scatci_input % opts(i) % do_ci_contraction())
then
256 call enrgmx % construct(scatci_input % opts(i), csfs, orbitals, integrals)
257 call enrgmx % initialize(ci_rmat)
258 call master_timer % start_timer(
"C-Hamiltonian Build")
259 call enrgmx % build_hamiltonian(matrix_elements)
260 call master_timer % stop_timer(
"C-Hamiltonian Build")
263 call enrgms % construct(scatci_input % opts(i), csfs, orbitals, integrals)
264 call master_timer % start_timer(
"Target-Hamiltonian Build")
265 call enrgms % build_hamiltonian(matrix_elements)
266 call master_timer % stop_timer(
"Target-Hamiltonian Build")
273 call configuration_manager % finalize
275 call master_memory % print_memory_report
276 write (stdout,
"('Matrix N is ',i8)") matrix_elements % get_matrix_size()
277 write (stdout,
"('Num elements is ',i14)") matrix_elements % get_size()
278 call master_timer % report_timers
281 scatci_input % opts(i) % num_eigenpairs = min(scatci_input % opts(i) % num_eigenpairs, &
282 matrix_elements % get_matrix_size())
283 call solutions(i) % construct(scatci_input % opts(i))
284 call master_timer % start_timer(
"Diagonalization")
285 call diagonalizer % diagonalize(matrix_elements, &
286 scatci_input % opts(i) % num_eigenpairs, &
289 scatci_input % opts(i), &
291 call master_timer % stop_timer(
"Diagonalization")
292 call master_timer % report_timers
294 write (stdout,
'(/,"Diagonalization not selected")')
295 num_mat_elms = matrix_elements % get_size()
297 call master_timer % start_timer(
"Matrix Save")
299 call master_timer % stop_timer(
"Matrix Save")
301 if (process_grid % grank == master)
call ham_pars_io_wrapper(scatci_input % opts(i), .true., num_mat_elms)
303 write (stdout,
'(/,"Parameters written to: ham_data")')
306 if (process_grid % grank == master)
close (scatci_input % opts(i) % hamiltonian_unit)
308 call matrix_elements % destroy
310 deallocate (diagonalizer)
311 deallocate (matrix_elements)
316 call postprocess(scatci_input, solutions)
317 call master_timer % stop_timer(
"Wall Time")
318 call master_timer % report_timers
321 if (
associated(integrals))
then
322 call integrals % finalize
327 call mpi_mod_finalize
program mpi_scatci
MPI-SCATCI main program.
MPI SCATCI Constants module.
integer, parameter read_from_file
Do not diagonalize, just read from file.
integer, parameter no_diagonalization
No diagonalization.
integer, parameter main_hamiltonian
Hamiltonain is a scattering one.
integer, parameter no_ci_target
No Ci target contraction (target only run)
integer, parameter target_hamiltonian
Hamiltonain is target one.