64#include "./base/base_uses.f90"
70 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_loop_utils'
88 energy_only, just_energy, exit_inner_loop)
91 LOGICAL :: diis_step, energy_only, just_energy, &
103 scf_env%iter_count = 0
104 exit_inner_loop = .false.
118 SUBROUTINE qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, &
124 LOGICAL :: diis_step, energy_only
126 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_new_mos'
128 INTEGER :: handle, ispin
129 LOGICAL :: has_unit_metric, skip_diag_sub
130 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
137 CALL timeset(routinen, handle)
139 NULLIFY (energy, ks_env, matrix_ks, matrix_s, rho, mos, dft_control)
142 matrix_s=matrix_s, energy=energy, &
144 matrix_ks=matrix_ks, rho=rho, mos=mos, &
145 dft_control=dft_control, &
146 has_unit_metric=has_unit_metric)
147 scf_env%iter_param = 0.0_dp
151 IF (dft_control%correct_el_density_dip)
THEN
152 scf_env%sum_zeff_corr = qs_env%total_zeff_corr
153 IF (abs(qs_env%total_zeff_corr) > 0.0_dp)
THEN
155 CALL cp_abort(__location__, &
156 "Please use ALGORITHM STANDARD in "// &
157 "SCF%DIAGONALIZATION if "// &
158 "CORE_CORRECTION /= 0.0 and "// &
159 "SURFACE_DIPOLE_CORRECTION TRUE ")
160 ELSEIF (dft_control%roks)
THEN
161 CALL cp_abort(__location__, &
162 "Combination of "// &
163 "CORE_CORRECTION /= 0.0 and "// &
164 "SURFACE_DIPOLE_CORRECTION TRUE "// &
165 "is not implemented with ROKS")
166 ELSEIF (scf_control%diagonalization%mom)
THEN
167 CALL cp_abort(__location__, &
168 "Combination of "// &
169 "CORE_CORRECTION /= 0.0 and "// &
170 "SURFACE_DIPOLE_CORRECTION TRUE "// &
171 "is not implemented with SCF%MOM")
176 SELECT CASE (scf_env%method)
178 CALL cp_abort(__location__, &
179 "unknown scf method: "// &
187 IF (abs(qs_env%total_zeff_corr) > 0.0_dp)
THEN
188 CALL cp_abort(__location__, &
189 "CORE_CORRECTION /= 0.0 plus SURFACE_DIPOLE_CORRECTION TRUE "// &
190 "requires SCF%DIAGONALIZATION: ALGORITHM STANDARD")
193 matrix_ks, matrix_s, scf_section, diis_step)
197 IF (dft_control%roks)
THEN
199 scf_control, scf_section, diis_step, &
202 IF (scf_control%diagonalization%mom)
THEN
204 matrix_s, scf_control, scf_section, &
208 matrix_s, scf_control, scf_section, &
211 IF (scf_control%do_diag_sub)
THEN
212 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
213 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
214 IF (.NOT. skip_diag_sub)
THEN
216 ks_env, scf_section, scf_control)
222 IF (dft_control%roks)
THEN
224 scf_control, scf_section, diis_step, &
228 scf_control, scf_section, &
233 CALL do_ot_diag(scf_env, mos, matrix_ks, matrix_s, &
234 scf_control, scf_section, diis_step)
237 IF ((scf_env%krylov_space%eps_std_diag > 0.0_dp) .AND. &
238 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%krylov_space%eps_std_diag))
THEN
239 IF (scf_env%krylov_space%always_check_conv)
THEN
241 scf_control, scf_section, check_moconv_only=.true.)
244 matrix_s, scf_control, scf_section, diis_step)
247 scf_control, scf_section)
249 IF (scf_control%do_diag_sub)
THEN
250 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
251 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
252 IF (.NOT. skip_diag_sub)
THEN
254 ks_env, scf_section, scf_control)
260 scf_section, .false.)
263 CALL qs_scf_loop_do_ot(qs_env, scf_env, scf_control%smear, mos, rho, &
264 qs_env%mo_derivs, energy%total, &
265 matrix_s, energy_only=energy_only, has_unit_metric=has_unit_metric)
269 energy%efermi = 0.0_dp
271 DO ispin = 1,
SIZE(mos)
272 energy%kTS = energy%kTS + mos(ispin)%kTS
273 energy%efermi = energy%efermi + mos(ispin)%mu
275 energy%efermi = energy%efermi/real(
SIZE(mos), kind=
dp)
277 CALL timestop(handle)
295 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_new_mos_kp'
297 INTEGER :: handle, ispin
298 LOGICAL :: has_unit_metric
299 REAL(
dp) :: diis_error
300 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
306 CALL timeset(routinen, handle)
308 NULLIFY (dft_control, kpoints, matrix_ks, matrix_s)
310 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints)
311 scf_env%iter_param = 0.0_dp
313 IF (dft_control%roks) &
314 cpabort(
"KP code: ROKS method not available: ")
316 SELECT CASE (scf_env%method)
318 CALL cp_abort(__location__, &
319 "KP code: Unknown scf method: "// &
323 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s)
325 diis_step, diis_error, qs_env)
327 scf_env%iter_param = diis_error
328 scf_env%iter_method =
"DIIS/Diag."
330 IF (scf_env%mixing_method == 0)
THEN
331 scf_env%iter_method =
"NoMix/Diag."
332 ELSE IF (scf_env%mixing_method == 1)
THEN
333 scf_env%iter_param = scf_env%p_mix_alpha
334 scf_env%iter_method =
"P_Mix/Diag."
335 ELSEIF (scf_env%mixing_method > 1)
THEN
336 scf_env%iter_param = scf_env%mixing_store%alpha
337 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
341 CALL get_qs_env(qs_env=qs_env, has_unit_metric=has_unit_metric)
342 cpassert(has_unit_metric)
344 CALL cp_abort(__location__, &
345 "KP code: Scf method not available: "// &
351 CALL cp_abort(__location__, &
352 "KP code: Scf method not available: "// &
357 IF (scf_env%mixing_method == 0)
THEN
358 scf_env%iter_method =
"NoMix/SMGL"
359 ELSE IF (scf_env%mixing_method == 1)
THEN
360 scf_env%iter_param = scf_env%p_mix_alpha
361 scf_env%iter_method =
"P_Mix/SMGL"
362 ELSE IF (scf_env%mixing_method > 1)
THEN
363 scf_env%iter_param = scf_env%mixing_store%alpha
364 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/SMGL"
366 CALL run_smeagol_emtrans(qs_env, last=.false., iter=scf_env%iter_count, rho_ao_kp=scf_env%p_mix_new)
371 energy%efermi = 0.0_dp
372 mos => kpoints%kp_env(1)%kpoint_env%mos
373 DO ispin = 1,
SIZE(mos, 2)
374 energy%kTS = energy%kTS + mos(1, ispin)%kTS
375 energy%efermi = energy%efermi + mos(1, ispin)%mu
377 energy%efermi = energy%efermi/real(
SIZE(mos, 2), kind=
dp)
379 CALL timestop(handle)
400 SUBROUTINE qs_scf_loop_do_ot(qs_env, scf_env, smear, mos, rho, mo_derivs, total_energy, &
401 matrix_s, energy_only, has_unit_metric)
406 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
409 REAL(kind=
dp),
INTENT(IN) :: total_energy
411 LOGICAL,
INTENT(INOUT) :: energy_only
412 LOGICAL,
INTENT(IN) :: has_unit_metric
414 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_loop_do_ot'
416 INTEGER :: handle, ispin
418 TYPE(
dbcsr_type),
POINTER :: orthogonality_metric
420 CALL timeset(routinen, handle)
425 IF (has_unit_metric)
THEN
426 NULLIFY (orthogonality_metric)
428 orthogonality_metric => matrix_s(1)%matrix
434 CALL ot_scf_mini(mos, mo_derivs, smear, orthogonality_metric, &
435 total_energy, energy_only, scf_env%iter_delta, &
438 DO ispin = 1,
SIZE(mos)
442 DO ispin = 1,
SIZE(mos)
444 rho_ao(ispin)%matrix, &
448 scf_env%iter_method = scf_env%qs_ot_env(1)%OT_METHOD_FULL
449 scf_env%iter_param = scf_env%qs_ot_env(1)%ds_min
450 qs_env%broyden_adaptive_sigma = scf_env%qs_ot_env(1)%broyden_adaptive_sigma
452 CALL timestop(handle)
454 END SUBROUTINE qs_scf_loop_do_ot
469 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
475 SELECT CASE (scf_env%mixing_method)
478 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
484 delta=scf_env%iter_delta)
487 CALL cp_abort(__location__, &
488 "unknown scf mixing method: "// &
504 outer_loop_converged, exit_outer_loop)
508 LOGICAL :: should_stop, outer_loop_converged, &
511 REAL(kind=
dp) :: outer_loop_eps
513 outer_loop_converged = .true.
514 IF (scf_control%outer_scf%have_scf)
THEN
516 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
517 outer_loop_converged = .false.
521 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
523 IF (outer_loop_eps < scf_control%outer_scf%eps_scf) outer_loop_converged = .true.
526 exit_outer_loop = should_stop .OR. outer_loop_converged .OR. &
527 scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf
542 exit_inner_loop, inner_loop_converged, output_unit)
546 LOGICAL :: should_stop, exit_inner_loop, &
548 INTEGER :: output_unit
550 inner_loop_converged = .false.
551 exit_inner_loop = .false.
554 start_time=qs_env%start_time)
555 IF (scf_env%iter_delta < scf_control%eps_scf)
THEN
556 IF (output_unit > 0)
THEN
557 WRITE (unit=output_unit, fmt=
"(/,T3,A,I5,A/)") &
558 "*** SCF run converged in ", scf_env%iter_count,
" steps ***"
560 inner_loop_converged = .true.
561 exit_inner_loop = .true.
562 ELSE IF (should_stop .OR. scf_env%iter_count >= scf_control%max_scf)
THEN
563 inner_loop_converged = .false.
564 exit_inner_loop = .true.
565 IF (output_unit > 0)
THEN
566 WRITE (unit=output_unit, fmt=
"(/,T3,A,I5,A/)") &
567 "Leaving inner SCF loop after reaching ", scf_env%iter_count,
" steps."
581 SUBROUTINE qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
588 CHARACTER(len=default_string_length) :: name
589 INTEGER :: ic, ispin, nc
590 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
594 IF (scf_env%mixing_method > 0)
THEN
596 nc =
SIZE(scf_env%p_mix_new, 2)
597 SELECT CASE (scf_env%mixing_method)
600 rho_ao_kp, para_env, scf_env%iter_delta, &
601 scf_env%iter_count, diis=diis_step, &
604 DO ispin = 1, dft_control%nspins
606 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
612 DO ispin = 1, dft_control%nspins
614 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
619 END SUBROUTINE qs_scf_undo_mixing
634 LOGICAL,
INTENT(IN) :: mix_rho
644 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, &
645 para_env, scf_env%iter_count)
663 INTEGER,
INTENT(IN) :: output_unit
665 LOGICAL :: do_kpoints
672 NULLIFY (energy, rho, dft_control, ks_env)
674 CALL get_qs_env(qs_env=qs_env, energy=energy, ks_env=ks_env, &
675 rho=rho, dft_control=dft_control, para_env=para_env, &
676 do_kpoints=do_kpoints)
678 CALL cleanup_scf_loop(scf_env)
684 CALL qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
699 SUBROUTINE cleanup_scf_loop(scf_env)
702 CHARACTER(len=*),
PARAMETER :: routinen =
'cleanup_scf_loop'
704 INTEGER :: handle, ispin
706 CALL timeset(routinen, handle)
708 SELECT CASE (scf_env%method)
710 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
713 DEALLOCATE (scf_env%qs_ot_env)
727 CALL cp_abort(__location__, &
728 "unknown scf method method:"// &
732 CALL timestop(handle)
734 END SUBROUTINE cleanup_scf_loop
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Types and basic routines needed for a kpoint calculation.
Interface to the message passing library MPI.
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public broyden_mixing_nr
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
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.
subroutine, public fb_env_do_diag(fb_env, qs_env, matrix_ks, matrix_s, scf_section, diis_step)
Do filtered matrix method diagonalisation.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
methods for deltaSCF calculations
subroutine, public do_mom_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
do an SCF iteration, then compute occupation numbers of the new molecular orbitals according to their...
basic functionality for using ot in the scf routines.
subroutine, public ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, energy_only, delta, qs_ot_env)
...
subroutine, public ot_scf_destroy(qs_ot_env)
...
Routines for performing an outer scf loop.
subroutine, public outer_loop_gradient(qs_env, scf_env)
computes the gradient wrt to the outer loop variables
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public do_ot_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to iterative diagonalization using OT with S matrix; basically,...
subroutine, public do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block davidson space approach
subroutine, public do_roks_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, orthogonal_basis)
Solve a set restricted open Kohn-Sham (ROKS) equations based on the alpha and beta Kohn-Sham matrices...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
subroutine, public do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, ks_env, scf_section, scf_control)
inner loop within MOS subspace, to refine occupation and density, before next diagonalization of the ...
subroutine, public do_block_krylov_diag(scf_env, mos, matrix_ks, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block Krylov-space approach
subroutine, public do_special_diag(scf_env, mos, matrix_ks, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization without S matrix basically, in goes the ks matrix ...
subroutine, public do_general_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
...
Utility routines for qs_scf.
subroutine, public qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
takes known energy and derivatives and produces new wfns and or density matrix
subroutine, public qs_scf_inner_finalize(scf_env, qs_env, diis_step, output_unit)
Performs the necessary steps before leaving innner scf loop.
subroutine, public qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, exit_inner_loop, inner_loop_converged, output_unit)
checks whether exit conditions for inner loop are satisfied
subroutine, public qs_scf_set_loop_flags(scf_env, diis_step, energy_only, just_energy, exit_inner_loop)
computes properties for a given hamiltonian using the current wfn
subroutine, public qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho)
Performs the updates rho (takes care of mixing as well)
subroutine, public qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step)
Updates MOs and density matrix using diagonalization Kpoint code.
subroutine, public qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, outer_loop_converged, exit_outer_loop)
checks whether exit conditions for outer loop are satisfied
subroutine, public qs_scf_density_mixing(scf_env, rho, para_env, diis_step)
Performs the requested density mixing if any needed.
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public qs_scf_print_summary(output_unit, qs_env)
writes a summary of information after scf
module that contains the definitions of the scf types
integer, parameter, public ot_diag_method_nr
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public smeagol_method_nr
integer, parameter, public ot_method_nr
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
integer, parameter, public general_diag_method_nr
parameters that control an scf iteration
subroutine, public run_smeagol_emtrans(qs_env, last, iter, rho_ao_kp)
Run NEGF/SMEAGOL transport calculation.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.
contains the parameters needed by a scf run