47#include "./base/base_uses.f90"
53 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_restart'
55 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
57 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
58 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
78 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
79 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: evals
85 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_write_restart'
87 INTEGER :: handle, ispin, istate, nao, nspins, &
89 INTEGER,
DIMENSION(maxspins) :: nmo_active
92 CALL timeset(routinen, handle)
94 nspins =
SIZE(evects, 1)
95 nstates =
SIZE(evects, 2)
97 IF (debug_this_module)
THEN
98 cpassert(
SIZE(evals) == nstates)
100 cpassert(nstates > 0)
105 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nmo_active(ispin))
109 extension=
".tdwfn", file_status=
"REPLACE", file_action=
"WRITE", &
110 do_backup=.true., file_form=
"UNFORMATTED")
113 WRITE (ounit) nstates, nspins, nao
114 WRITE (ounit) nmo_active(1:nspins)
118 DO istate = 1, nstates
139 CALL timestop(handle)
161 fm_pool_ao_mo_active, blacs_env_global)
RESULT(nstates_read)
162 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(inout) :: evects
163 REAL(kind=
dp),
DIMENSION(:),
INTENT(out) :: evals
170 INTEGER :: nstates_read
172 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_read_restart'
174 CHARACTER(len=20) :: read_str, ref_str
175 CHARACTER(LEN=default_path_length) :: filename
176 INTEGER :: handle, ispin, istate, iunit, n_rep_val, &
177 nao, nao_read, nspins, nspins_read, &
179 INTEGER,
DIMENSION(maxspins) :: nmo_active, nmo_active_read
181 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_read
186 CALL timeset(routinen, handle)
188 cpassert(
ASSOCIATED(tddfpt_section))
192 IF (n_rep_val > 0)
THEN
197 extension=
".tdwfn", my_local=.false.)
200 CALL blacs_env_global%get(para_env=para_env_global)
202 IF (para_env_global%is_source())
THEN
207 CALL para_env_global%bcast(nstates_read)
209 CALL cp_warn(__location__, &
210 "User requested to restart the TDDFPT wave functions from the file '"//trim(filename)// &
211 "' which does not exist. Guess wave functions will be constructed using Kohn-Sham orbitals.")
212 CALL timestop(handle)
216 CALL open_file(file_name=filename, file_action=
"READ", file_form=
"UNFORMATTED", &
217 file_status=
"OLD", unit_number=iunit)
220 nspins =
SIZE(evects, 1)
221 nstates =
SIZE(evects, 2)
225 CALL cp_fm_get_info(evtest, nrow_global=nao, ncol_global=nmo_active(ispin))
229 IF (para_env_global%is_source())
THEN
230 READ (iunit) nstates_read, nspins_read, nao_read
232 IF (nspins_read /= nspins)
THEN
235 CALL cp_abort(__location__, &
236 "Restarted TDDFPT wave function contains incompatible number of spin components ("// &
237 trim(read_str)//
" instead of "//trim(ref_str)//
").")
240 IF (nao_read /= nao)
THEN
243 CALL cp_abort(__location__, &
244 "Incompatible number of atomic orbitals ("//trim(read_str)//
" instead of "//trim(ref_str)//
").")
247 READ (iunit) nmo_active_read(1:nspins)
250 IF (nmo_active_read(ispin) /= nmo_active(ispin))
THEN
251 CALL cp_abort(__location__, &
252 "Incompatible number of electrons and/or multiplicity.")
256 IF (nstates_read /= nstates)
THEN
259 CALL cp_warn(__location__, &
260 "TDDFPT restart file contains "//trim(read_str)// &
261 " wave function(s) however "//trim(ref_str)// &
262 " excited states were requested.")
265 CALL para_env_global%bcast(nstates_read)
268 IF (nstates_read <= 0)
THEN
269 CALL timestop(handle)
273 IF (para_env_global%is_source())
THEN
274 ALLOCATE (evals_read(nstates_read))
275 READ (iunit) evals_read
276 IF (nstates_read <= nstates)
THEN
277 evals(1:nstates_read) = evals_read(1:nstates_read)
279 evals(1:nstates) = evals_read(1:nstates)
281 DEALLOCATE (evals_read)
283 CALL para_env_global%bcast(evals)
285 DO istate = 1, nstates_read
287 IF (istate <= nstates)
THEN
297 IF (para_env_global%is_source())
THEN
301 CALL timestop(handle)
317 matrix_s, S_evects, sub_env)
319 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
320 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: evals
325 TYPE(
dbcsr_type),
INTENT(in),
POINTER :: matrix_s
326 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: s_evects
329 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_write_newtonx_output'
331 INTEGER :: handle, iocc, ispin, istate, ivirt, nao, &
332 nspins, nstates, ounit
333 INTEGER,
DIMENSION(maxspins) :: nmo_active, nmo_occ, nmo_virt
334 LOGICAL :: print_phases, print_virtuals, &
336 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: phase_evects
338 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mo
341 CALL timeset(routinen, handle)
342 CALL section_vals_val_get(tddfpt_print_section,
"NAMD_PRINT%PRINT_VIRTUALS", l_val=print_virtuals)
344 CALL section_vals_val_get(tddfpt_print_section,
"NAMD_PRINT%SCALE_WITH_PHASES", l_val=scale_with_phases)
346 nspins =
SIZE(evects, 1)
347 nstates =
SIZE(evects, 2)
349 IF (debug_this_module)
THEN
350 cpassert(
SIZE(evals) == nstates)
352 cpassert(nstates > 0)
357 IF (sub_env%is_split)
THEN
358 CALL cp_abort(__location__,
"NEWTONX interface print not possible when states"// &
359 " are distributed to different CPU pools.")
364 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
365 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nmo_active(ispin))
366 IF (nmo_occ(ispin) /= nmo_active(ispin))
THEN
367 CALL cp_abort(__location__,
"NEWTONX interface print not possible when using"// &
368 " a reduced set of active occupied orbitals.")
373 extension=
".inp", file_form=
"FORMATTED", file_action=
"WRITE", file_status=
"REPLACE")
377 IF (print_virtuals)
THEN
378 ALLOCATE (evects_mo(nspins, nstates))
379 DO istate = 1, nstates
384 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
385 nmo_virt(ispin) =
SIZE(gs_mos(ispin)%evals_virt)
387 context=sub_env%blacs_env, &
388 nrow_global=nmo_virt(ispin), ncol_global=nmo_occ(ispin))
392 ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
395 DO istate = 1, nstates
402 gs_mos(ispin)%mos_virt, &
403 s_evects(ispin, istate), &
405 evects_mo(ispin, istate))
410 DO istate = 1, nstates
413 IF (.NOT. print_virtuals)
THEN
416 WRITE (ounit,
"(/,A)")
"ES EIGENVECTORS SIZE"
423 WRITE (ounit,
"(/,A)")
"ES EIGENVECTORS SIZE"
430 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
431 ALLOCATE (phase_evects(nmo_occ(ispin)))
432 IF (print_virtuals)
THEN
433 CALL compute_phase_eigenvectors(evects_mo(ispin, istate), phase_evects, sub_env)
435 CALL compute_phase_eigenvectors(evects(ispin, istate), phase_evects, sub_env)
438 WRITE (ounit,
"(/,A,/)")
"PHASES ES EIGENVECTORS"
439 DO iocc = 1, nmo_occ(ispin)
440 WRITE (ounit,
"(F20.14)") phase_evects(iocc)
443 DEALLOCATE (phase_evects)
448 IF (print_virtuals)
THEN
454 WRITE (ounit,
"(/,A)")
"OCCUPIED MOS SIZE"
461 WRITE (ounit,
"(A)")
"OCCUPIED MO EIGENVALUES"
463 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
464 DO iocc = 1, nmo_occ(ispin)
465 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%evals_occ(iocc)
470 IF (print_virtuals)
THEN
473 WRITE (ounit,
"(/,A)")
"VIRTUAL MOS SIZE"
480 WRITE (ounit,
"(A)")
"VIRTUAL MO EIGENVALUES"
482 nmo_virt(ispin) =
SIZE(gs_mos(ispin)%evals_virt)
483 DO ivirt = 1, nmo_virt(ispin)
484 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%evals_virt(ivirt)
492 IF (print_phases)
THEN
494 WRITE (ounit,
"(A)")
"PHASES OCCUPIED ORBITALS"
496 DO iocc = 1, nmo_occ(ispin)
497 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%phases_occ(iocc)
500 IF (print_virtuals)
THEN
501 WRITE (ounit,
"(A)")
"PHASES VIRTUAL ORBITALS"
503 DO ivirt = 1, nmo_virt(ispin)
504 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%phases_virt(ivirt)
513 CALL timestop(handle)
526 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
527 INTEGER,
INTENT(in) :: ounit
528 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: s_evects
529 TYPE(
dbcsr_type),
INTENT(in),
POINTER :: matrix_s
531 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_check_orthonormality'
533 INTEGER :: handle, ispin, ivect, jvect, nspins, &
535 INTEGER,
DIMENSION(maxspins) :: nactive
536 REAL(kind=
dp) :: norm
537 REAL(kind=
dp),
DIMENSION(maxspins) :: weights
539 CALL timeset(routinen, handle)
541 nspins =
SIZE(evects, 1)
542 nvects_total =
SIZE(evects, 2)
544 IF (debug_this_module)
THEN
545 cpassert(
SIZE(s_evects, 1) == nspins)
546 cpassert(
SIZE(s_evects, 2) == nvects_total)
550 CALL cp_fm_get_info(matrix=evects(ispin, 1), ncol_global=nactive(ispin))
553 DO jvect = 1, nvects_total
555 DO ivect = 1, jvect - 1
556 CALL cp_fm_trace(evects(:, jvect), s_evects(:, ivect), weights(1:nspins), accurate=.false.)
557 norm = sum(weights(1:nspins))
567 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
570 CALL cp_fm_trace(evects(:, jvect), s_evects(:, jvect), weights(1:nspins), accurate=.false.)
572 norm = sum(weights(1:nspins))
573 norm = 1.0_dp/sqrt(norm)
575 IF ((ounit > 0) .AND. debug_this_module)
WRITE (ounit,
'(A,F10.8)')
"norm", norm
579 CALL timestop(handle)
588 SUBROUTINE compute_phase_eigenvectors(evects, phase_evects, sub_env)
593 REAL(kind=
dp),
DIMENSION(:),
INTENT(out) :: phase_evects
596 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_phase_eigenvectors'
597 REAL(kind=
dp),
PARAMETER :: eps_dp = epsilon(0.0_dp)
599 INTEGER :: handle, icol_global, icol_local, irow_global, irow_local, ncol_global, &
600 ncol_local, nrow_global, nrow_local, sign_int
601 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: minrow_neg_array, minrow_pos_array, &
603 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
604 REAL(kind=
dp) :: element
605 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
608 CALL timeset(routinen, handle)
611 CALL cp_fm_get_info(evects, nrow_global=nrow_global, ncol_global=ncol_global, &
612 nrow_local=nrow_local, ncol_local=ncol_local, local_data=my_block, &
613 row_indices=row_indices, col_indices=col_indices)
615 ALLOCATE (minrow_neg_array(ncol_global), minrow_pos_array(ncol_global), sum_sign_array(ncol_global))
616 minrow_neg_array(:) = nrow_global
617 minrow_pos_array(:) = nrow_global
618 sum_sign_array(:) = 0
620 DO icol_local = 1, ncol_local
621 icol_global = col_indices(icol_local)
623 DO irow_local = 1, nrow_local
624 irow_global = row_indices(irow_local)
626 element = my_block(irow_local, icol_local)
629 IF (element >= eps_dp)
THEN
631 ELSE IF (element <= -eps_dp)
THEN
635 sum_sign_array(icol_global) = sum_sign_array(icol_global) + sign_int
637 IF (sign_int > 0)
THEN
638 IF (minrow_pos_array(icol_global) > irow_global)
THEN
639 minrow_pos_array(icol_global) = irow_global
641 ELSE IF (sign_int < 0)
THEN
642 IF (minrow_neg_array(icol_global) > irow_global)
THEN
643 minrow_neg_array(icol_global) = irow_global
650 CALL sub_env%para_env%sum(sum_sign_array)
651 CALL sub_env%para_env%min(minrow_neg_array)
652 CALL sub_env%para_env%min(minrow_pos_array)
654 DO icol_global = 1, ncol_global
656 IF (sum_sign_array(icol_global) > 0)
THEN
658 phase_evects(icol_global) = 1.0_dp
659 ELSE IF (sum_sign_array(icol_global) < 0)
THEN
661 phase_evects(icol_global) = -1.0_dp
664 IF (minrow_pos_array(icol_global) <= minrow_neg_array(icol_global))
THEN
667 phase_evects(icol_global) = 1.0_dp
670 phase_evects(icol_global) = -1.0_dp
676 DEALLOCATE (minrow_neg_array, minrow_pos_array, sum_sign_array)
678 CALL timestop(handle)
680 END SUBROUTINE compute_phase_eigenvectors
methods related to the blacs parallel environment
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_write_unformatted(fm, unit)
...
subroutine, public cp_fm_read_unformatted(fm, unit)
...
subroutine, public cp_fm_write_info(matrix, io_unit)
Write nicely formatted info about the FM to the given I/O unit (including the underlying FM struct)
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_write_formatted(fm, unit, header, value_format)
Write out a full matrix in plain text.
various routines to log and control the output. The idea is that decisions about where to log should ...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
subroutine, public tddfpt_check_orthonormality(evects, ounit, s_evects, matrix_s)
...
subroutine, public tddfpt_write_newtonx_output(evects, evals, gs_mos, logger, tddfpt_print_section, matrix_s, s_evects, sub_env)
Write Ritz vectors to a binary restart file.
subroutine, public tddfpt_write_restart(evects, evals, gs_mos, logger, tddfpt_print_section)
Write Ritz vectors to a binary restart file.
integer function, public tddfpt_read_restart(evects, evals, gs_mos, logger, tddfpt_section, tddfpt_print_section, fm_pool_ao_mo_active, blacs_env_global)
Initialise initial guess vectors by reading (un-normalised) Ritz vectors from a binary restart file.
Utilities for string manipulations.
subroutine, public integer_to_string(inumber, string)
Converts an integer number to a string. The WRITE statement will return an error message,...
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
to create arrays of pools
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Parallel (sub)group environment.
Ground state molecular orbitals.