18 dbcsr_csr_dbcsr_blkrow_dist, dbcsr_csr_destroy, dbcsr_csr_type, dbcsr_csr_write, &
21 dbcsr_type_no_symmetry, dbcsr_type_symmetric
49#include "./base/base_uses.f90"
55 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_csr_write'
75 CHARACTER(len=*),
PARAMETER :: routinen =
'write_ks_matrix_csr'
77 INTEGER :: handle, output_unit
78 LOGICAL :: do_kpoints, do_ks_csr_write, real_space
80 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
84 CALL timeset(routinen, handle)
95 IF (do_ks_csr_write)
THEN
96 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints, matrix_ks_kp=matrix_ks, do_kpoints=do_kpoints)
100 IF (do_kpoints .AND. .NOT. real_space)
THEN
101 CALL write_matrix_kp_csr(mat=matrix_ks, dft_section=dft_section, &
102 kpoints=kpoints, prefix=
"KS")
104 CALL write_matrix_csr(dft_section, mat=matrix_ks, kpoints=kpoints, do_kpoints=do_kpoints, &
109 CALL timestop(handle)
125 CHARACTER(len=*),
PARAMETER :: routinen =
'write_s_matrix_csr'
127 INTEGER :: handle, output_unit
128 LOGICAL :: do_kpoints, do_s_csr_write, real_space
130 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
134 CALL timeset(routinen, handle)
136 NULLIFY (dft_section)
145 IF (do_s_csr_write)
THEN
146 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints, matrix_s_kp=matrix_s, do_kpoints=do_kpoints)
150 IF (do_kpoints .AND. .NOT. real_space)
THEN
151 CALL write_matrix_kp_csr(mat=matrix_s, dft_section=dft_section, &
152 kpoints=kpoints, prefix=
"S")
154 CALL write_matrix_csr(dft_section, mat=matrix_s, kpoints=kpoints, do_kpoints=do_kpoints, &
159 CALL timestop(handle)
175 SUBROUTINE write_matrix_csr(dft_section, mat, kpoints, prefix, do_kpoints)
180 CHARACTER(*),
INTENT(in) :: prefix
181 LOGICAL,
INTENT(IN) :: do_kpoints
183 CHARACTER(len=*),
PARAMETER :: routinen =
'write_matrix_csr'
185 CHARACTER(LEN=default_path_length) :: file_name, fileformat, subs_string
186 INTEGER :: handle, ic, ispin, ncell, nspin, &
188 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
189 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cell_to_index
190 INTEGER,
DIMENSION(:, :),
POINTER :: i2c
191 INTEGER,
DIMENSION(:, :, :),
POINTER :: c2i
192 LOGICAL :: bin, do_symmetric, uptr
193 REAL(kind=
dp) :: thld
195 TYPE(dbcsr_csr_type) :: mat_csr
196 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_nosym
201 CALL timeset(routinen, handle)
206 subs_string =
"PRINT%"//prefix//
"_CSR_WRITE"
213 fileformat =
"UNFORMATTED"
215 fileformat =
"FORMATTED"
223 i2c => kpoints%index_to_cell
224 c2i => kpoints%cell_to_index
231 IF (do_symmetric)
THEN
232 CALL desymmetrize_rs_matrix(mat, mat_nosym, cell_to_index, index_to_cell, kpoints)
233 ncell =
SIZE(index_to_cell, 2)
235 ALLOCATE (cell_to_index(lbound(c2i, 1):ubound(c2i, 1), &
236 lbound(c2i, 2):ubound(c2i, 2), &
237 lbound(c2i, 3):ubound(c2i, 3)))
238 cell_to_index(lbound(c2i, 1):ubound(c2i, 1), &
239 lbound(c2i, 2):ubound(c2i, 2), &
240 lbound(c2i, 3):ubound(c2i, 3)) = c2i
242 ALLOCATE (index_to_cell(3, ncell))
243 index_to_cell(1:3, 1:ncell) = i2c
249 IF (output_unit > 0)
THEN
250 WRITE (output_unit,
"(/,A15,T15,I4,A)") prefix//
" CSR write| ", &
251 ncell,
" periodic images"
252 WRITE (output_unit,
"(T7,A,T17,A,T24,A,T31,A)")
"Number",
"X",
"Y",
"Z"
254 WRITE (output_unit,
"(T8,I3,T15,I3,T22,I3,T29,I3)") ic, index_to_cell(:, ic)
263 CALL dbcsr_copy(matrix_nosym, mat_nosym(ispin, ic)%matrix)
264 WRITE (file_name,
'(2(A,I0))') prefix//
"_SPIN_", ispin,
"_R_", ic
269 CALL dbcsr_copy(matrix_nosym, mat(ispin, ic)%matrix)
271 WRITE (file_name,
'(A,I0)') prefix//
"_SPIN_", ispin
275 mat_csr, dbcsr_csr_dbcsr_blkrow_dist)
279 extension=
".csr", middle_name=trim(file_name), &
280 file_status=
"REPLACE", file_form=fileformat)
281 CALL dbcsr_csr_write(mat_csr, unit_nr, upper_triangle=uptr, threshold=thld, binary=bin)
284 CALL dbcsr_csr_destroy(mat_csr)
291 DEALLOCATE (cell_to_index, index_to_cell)
292 IF (do_symmetric)
THEN
301 CALL timestop(handle)
303 END SUBROUTINE write_matrix_csr
315 SUBROUTINE write_matrix_kp_csr(mat, dft_section, kpoints, prefix)
320 CHARACTER(*),
INTENT(in) :: prefix
322 CHARACTER(len=*),
PARAMETER :: routinen =
'write_matrix_kp_csr'
324 CHARACTER(LEN=default_path_length) :: file_name, fileformat, subs_string
325 INTEGER :: handle, igroup, ik, ikp, ispin, kplocal, &
326 nkp_groups, output_unit, unit_nr
327 INTEGER,
DIMENSION(2) :: kp_range
328 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
329 LOGICAL :: bin, uptr, use_real_wfn
330 REAL(kind=
dp) :: thld
331 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
333 TYPE(dbcsr_csr_type) :: mat_csr
335 TYPE(
dbcsr_type),
POINTER :: imatrix, imatrix_nosym, rmatrix, &
340 CALL timeset(routinen, handle)
345 subs_string =
"PRINT%"//prefix//
"_CSR_WRITE"
352 fileformat =
"UNFORMATTED"
354 fileformat =
"FORMATTED"
360 CALL get_kpoint_info(kpoints, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
361 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_nl)
365 matrix_type=dbcsr_type_symmetric)
368 IF (.NOT. use_real_wfn)
THEN
370 ALLOCATE (rmatrix_nosym, imatrix, imatrix_nosym)
371 CALL dbcsr_create(rmatrix_nosym, template=mat(1, 1)%matrix, &
372 matrix_type=dbcsr_type_no_symmetry)
374 matrix_type=dbcsr_type_antisymmetric)
375 CALL dbcsr_create(imatrix_nosym, template=mat(1, 1)%matrix, &
376 matrix_type=dbcsr_type_no_symmetry)
382 kplocal = kp_range(2) - kp_range(1) + 1
384 DO ispin = 1,
SIZE(mat, 1)
385 DO igroup = 1, nkp_groups
387 ik = kp_dist(1, igroup) + ikp - 1
389 IF (use_real_wfn)
THEN
392 xkp=xkp(1:3, ik), cell_to_index=kpoints%cell_to_index, sab_nl=sab_nl)
401 CALL rskp_transform(rmatrix=rmatrix, cmatrix=imatrix, rsmat=mat, ispin=ispin, &
402 xkp=xkp(1:3, ik), cell_to_index=kpoints%cell_to_index, sab_nl=sab_nl)
410 imatrix=imatrix_nosym, &
412 dist_format=dbcsr_csr_dbcsr_blkrow_dist)
415 WRITE (file_name,
'(2(A,I0))') prefix//
"_SPIN_", ispin,
"_K_", ik
417 extension=
".csr", middle_name=trim(file_name), &
418 file_status=
"REPLACE", file_form=fileformat)
419 CALL dbcsr_csr_write(mat_csr, unit_nr, upper_triangle=uptr, threshold=thld, binary=bin)
423 CALL dbcsr_csr_destroy(mat_csr)
429 IF (.NOT. use_real_wfn)
THEN
433 DEALLOCATE (rmatrix_nosym, imatrix, imatrix_nosym)
435 CALL timestop(handle)
437 END SUBROUTINE write_matrix_kp_csr
448 SUBROUTINE desymmetrize_rs_matrix(mat, mat_nosym, cell_to_index, index_to_cell, kpoints)
452 INTENT(INOUT),
POINTER :: mat_nosym
453 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :), &
454 INTENT(OUT) :: cell_to_index
455 INTEGER,
ALLOCATABLE,
DIMENSION(:, :),
INTENT(OUT) :: index_to_cell
458 CHARACTER(len=*),
PARAMETER :: routinen =
'desymmetrize_rs_matrix'
460 INTEGER :: handle, iatom, ic, icn, icol, irow, &
461 ispin, jatom, ncell, nomirror, nspin, &
463 INTEGER,
DIMENSION(3) :: cell
464 INTEGER,
DIMENSION(:, :),
POINTER :: i2c
465 INTEGER,
DIMENSION(:, :, :),
POINTER :: c2i
466 LOGICAL :: found, lwtr
467 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block
469 DIMENSION(:),
POINTER :: nl_iterator
473 CALL timeset(routinen, handle)
475 i2c => kpoints%index_to_cell
476 c2i => kpoints%cell_to_index
481 nx = max(abs(lbound(c2i, 1)), abs(ubound(c2i, 1)))
482 ny = max(abs(lbound(c2i, 2)), abs(ubound(c2i, 3)))
483 nz = max(abs(lbound(c2i, 3)), abs(ubound(c2i, 3)))
484 ALLOCATE (cell_to_index(-nx:nx, -ny:ny, -nz:nz))
485 cell_to_index(lbound(c2i, 1):ubound(c2i, 1), &
486 lbound(c2i, 2):ubound(c2i, 2), &
487 lbound(c2i, 3):ubound(c2i, 3)) = c2i
493 IF (cell_to_index(-cell(1), -cell(2), -cell(3)) == 0) &
494 nomirror = nomirror + 1
498 ALLOCATE (index_to_cell(3, ncell + nomirror))
499 index_to_cell(:, 1:ncell) = i2c
503 cell = index_to_cell(:, ic)
504 IF (cell_to_index(-cell(1), -cell(2), -cell(3)) == 0)
THEN
505 nomirror = nomirror + 1
506 index_to_cell(:, ncell + nomirror) = -cell
507 cell_to_index(-cell(1), -cell(2), -cell(3)) = ncell + nomirror
510 ncell = ncell + nomirror
518 ALLOCATE (mat_nosym(ispin, ic)%matrix)
520 template=mat(1, 1)%matrix, &
521 matrix_type=dbcsr_type_no_symmetry)
523 sab_nl, desymmetrize=.true.)
524 CALL dbcsr_set(mat_nosym(ispin, ic)%matrix, 0.0_dp)
534 ic = cell_to_index(cell(1), cell(2), cell(3))
535 icn = cell_to_index(-cell(1), -cell(2), -cell(3))
542 IF (iatom > jatom)
THEN
549 row=irow, col=icol, block=block, found=found)
556 row=iatom, col=jatom, block=transpose(block))
558 row=jatom, col=iatom, block=block)
561 row=iatom, col=jatom, block=block)
563 row=jatom, col=iatom, block=transpose(block))
575 CALL timestop(handle)
577 END SUBROUTINE desymmetrize_rs_matrix
logical function, public dbcsr_has_symmetry(matrix)
...
subroutine, public dbcsr_convert_dbcsr_to_csr(dbcsr_mat, csr_mat)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_csr_create_and_convert_complex(rmatrix, imatrix, csr_mat, dist_format)
Combines csr_create_from_dbcsr and convert_dbcsr_to_csr to produce a complex CSR matrix.
subroutine, public dbcsr_csr_create_from_dbcsr(dbcsr_mat, csr_mat, dist_format, csr_sparsity, numnodes)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_put_block(matrix, row, col, block, summation)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
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)
...
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
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.