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()) &
300 CALL timestop(handle)
316 matrix_s, S_evects, sub_env)
318 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
319 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: evals
324 TYPE(
dbcsr_type),
INTENT(in),
POINTER :: matrix_s
325 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: s_evects
328 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_write_newtonx_output'
330 INTEGER :: handle, iocc, ispin, istate, ivirt, nao, &
331 nspins, nstates, ounit
332 INTEGER,
DIMENSION(maxspins) :: nmo_active, nmo_occ, nmo_virt
333 LOGICAL :: print_phases, print_virtuals, &
335 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: phase_evects
337 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mo
340 CALL timeset(routinen, handle)
341 CALL section_vals_val_get(tddfpt_print_section,
"NAMD_PRINT%PRINT_VIRTUALS", l_val=print_virtuals)
343 CALL section_vals_val_get(tddfpt_print_section,
"NAMD_PRINT%SCALE_WITH_PHASES", l_val=scale_with_phases)
345 nspins =
SIZE(evects, 1)
346 nstates =
SIZE(evects, 2)
348 IF (debug_this_module)
THEN
349 cpassert(
SIZE(evals) == nstates)
351 cpassert(nstates > 0)
356 IF (sub_env%is_split)
THEN
357 CALL cp_abort(__location__,
"NEWTONX interface print not possible when states"// &
358 " are distributed to different CPU pools.")
363 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
364 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nmo_active(ispin))
365 IF (nmo_occ(ispin) /= nmo_active(ispin))
THEN
366 CALL cp_abort(__location__,
"NEWTONX interface print not possible when using"// &
367 " a reduced set of active occupied orbitals.")
372 extension=
".inp", file_form=
"FORMATTED", file_action=
"WRITE", file_status=
"REPLACE")
376 IF (print_virtuals)
THEN
377 ALLOCATE (evects_mo(nspins, nstates))
378 DO istate = 1, nstates
383 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
384 nmo_virt(ispin) =
SIZE(gs_mos(ispin)%evals_virt)
386 context=sub_env%blacs_env, &
387 nrow_global=nmo_virt(ispin), ncol_global=nmo_occ(ispin))
391 ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
394 DO istate = 1, nstates
401 gs_mos(ispin)%mos_virt, &
402 s_evects(ispin, istate), &
404 evects_mo(ispin, istate))
409 DO istate = 1, nstates
412 IF (.NOT. print_virtuals)
THEN
415 WRITE (ounit,
"(/,A)")
"ES EIGENVECTORS SIZE"
422 WRITE (ounit,
"(/,A)")
"ES EIGENVECTORS SIZE"
429 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
430 ALLOCATE (phase_evects(nmo_occ(ispin)))
431 IF (print_virtuals)
THEN
432 CALL compute_phase_eigenvectors(evects_mo(ispin, istate), phase_evects, sub_env)
434 CALL compute_phase_eigenvectors(evects(ispin, istate), phase_evects, sub_env)
437 WRITE (ounit,
"(/,A,/)")
"PHASES ES EIGENVECTORS"
438 DO iocc = 1, nmo_occ(ispin)
439 WRITE (ounit,
"(F20.14)") phase_evects(iocc)
442 DEALLOCATE (phase_evects)
447 IF (print_virtuals)
THEN
453 WRITE (ounit,
"(/,A)")
"OCCUPIED MOS SIZE"
460 WRITE (ounit,
"(A)")
"OCCUPIED MO EIGENVALUES"
462 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
463 DO iocc = 1, nmo_occ(ispin)
464 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%evals_occ(iocc)
469 IF (print_virtuals)
THEN
472 WRITE (ounit,
"(/,A)")
"VIRTUAL MOS SIZE"
479 WRITE (ounit,
"(A)")
"VIRTUAL MO EIGENVALUES"
481 nmo_virt(ispin) =
SIZE(gs_mos(ispin)%evals_virt)
482 DO ivirt = 1, nmo_virt(ispin)
483 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%evals_virt(ivirt)
491 IF (print_phases)
THEN
493 WRITE (ounit,
"(A)")
"PHASES OCCUPIED ORBITALS"
495 DO iocc = 1, nmo_occ(ispin)
496 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%phases_occ(iocc)
499 IF (print_virtuals)
THEN
500 WRITE (ounit,
"(A)")
"PHASES VIRTUAL ORBITALS"
502 DO ivirt = 1, nmo_virt(ispin)
503 WRITE (ounit,
"(F20.14)") gs_mos(ispin)%phases_virt(ivirt)
512 CALL timestop(handle)
525 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
526 INTEGER,
INTENT(in) :: ounit
527 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: s_evects
528 TYPE(
dbcsr_type),
INTENT(in),
POINTER :: matrix_s
530 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_check_orthonormality'
532 INTEGER :: handle, ispin, ivect, jvect, nspins, &
534 INTEGER,
DIMENSION(maxspins) :: nactive
535 REAL(kind=
dp) :: norm
536 REAL(kind=
dp),
DIMENSION(maxspins) :: weights
538 CALL timeset(routinen, handle)
540 nspins =
SIZE(evects, 1)
541 nvects_total =
SIZE(evects, 2)
543 IF (debug_this_module)
THEN
544 cpassert(
SIZE(s_evects, 1) == nspins)
545 cpassert(
SIZE(s_evects, 2) == nvects_total)
549 CALL cp_fm_get_info(matrix=evects(ispin, 1), ncol_global=nactive(ispin))
552 DO jvect = 1, nvects_total
554 DO ivect = 1, jvect - 1
555 CALL cp_fm_trace(evects(:, jvect), s_evects(:, ivect), weights(1:nspins), accurate=.false.)
556 norm = sum(weights(1:nspins))
566 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
569 CALL cp_fm_trace(evects(:, jvect), s_evects(:, jvect), weights(1:nspins), accurate=.false.)
571 norm = sum(weights(1:nspins))
572 norm = 1.0_dp/sqrt(norm)
574 IF ((ounit > 0) .AND. debug_this_module)
WRITE (ounit,
'(A,F10.8)')
"norm", norm
578 CALL timestop(handle)
587 SUBROUTINE compute_phase_eigenvectors(evects, phase_evects, sub_env)
592 REAL(kind=
dp),
DIMENSION(:),
INTENT(out) :: phase_evects
595 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_phase_eigenvectors'
596 REAL(kind=
dp),
PARAMETER :: eps_dp = epsilon(0.0_dp)
598 INTEGER :: handle, icol_global, icol_local, irow_global, irow_local, ncol_global, &
599 ncol_local, nrow_global, nrow_local, sign_int
600 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: minrow_neg_array, minrow_pos_array, &
602 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
603 REAL(kind=
dp) :: element
604 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
607 CALL timeset(routinen, handle)
610 CALL cp_fm_get_info(evects, nrow_global=nrow_global, ncol_global=ncol_global, &
611 nrow_local=nrow_local, ncol_local=ncol_local, local_data=my_block, &
612 row_indices=row_indices, col_indices=col_indices)
614 ALLOCATE (minrow_neg_array(ncol_global), minrow_pos_array(ncol_global), sum_sign_array(ncol_global))
615 minrow_neg_array(:) = nrow_global
616 minrow_pos_array(:) = nrow_global
617 sum_sign_array(:) = 0
619 DO icol_local = 1, ncol_local
620 icol_global = col_indices(icol_local)
622 DO irow_local = 1, nrow_local
623 irow_global = row_indices(irow_local)
625 element = my_block(irow_local, icol_local)
628 IF (element >= eps_dp)
THEN
630 ELSE IF (element <= -eps_dp)
THEN
634 sum_sign_array(icol_global) = sum_sign_array(icol_global) + sign_int
636 IF (sign_int > 0)
THEN
637 IF (minrow_pos_array(icol_global) > irow_global) &
638 minrow_pos_array(icol_global) = irow_global
639 ELSE IF (sign_int < 0)
THEN
640 IF (minrow_neg_array(icol_global) > irow_global) &
641 minrow_neg_array(icol_global) = irow_global
647 CALL sub_env%para_env%sum(sum_sign_array)
648 CALL sub_env%para_env%min(minrow_neg_array)
649 CALL sub_env%para_env%min(minrow_pos_array)
651 DO icol_global = 1, ncol_global
653 IF (sum_sign_array(icol_global) > 0)
THEN
655 phase_evects(icol_global) = 1.0_dp
656 ELSE IF (sum_sign_array(icol_global) < 0)
THEN
658 phase_evects(icol_global) = -1.0_dp
661 IF (minrow_pos_array(icol_global) <= minrow_neg_array(icol_global))
THEN
664 phase_evects(icol_global) = 1.0_dp
667 phase_evects(icol_global) = -1.0_dp
673 DEALLOCATE (minrow_neg_array, minrow_pos_array, sum_sign_array)
675 CALL timestop(handle)
677 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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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_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.