66#include "./base/base_uses.f90"
72 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ec_environment'
95 cpassert(.NOT.
ASSOCIATED(ec_env))
97 CALL init_ec_env(qs_env, ec_env, dft_section, ec_section)
111 SUBROUTINE init_ec_env(qs_env, ec_env, dft_section, ec_section)
117 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_ec_env'
119 INTEGER :: handle, ikind, maxlgto, nkind, unit_nr
120 LOGICAL :: explicit, gpw, paw_atom
121 REAL(kind=
dp) :: eps_pgf_orb, rc
129 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
133 section1, section2, xc_fun_section, &
136 CALL timeset(routinen, handle)
138 NULLIFY (atomic_kind_set, dispersion_env, ec_env%ls_env, para_env)
139 NULLIFY (ec_env%sab_orb, ec_env%sac_ae, ec_env%sac_ppl, ec_env%sap_ppnl)
140 NULLIFY (ec_env%matrix_ks, ec_env%matrix_h, ec_env%matrix_s)
141 NULLIFY (ec_env%matrix_t, ec_env%matrix_p, ec_env%matrix_w)
142 NULLIFY (ec_env%task_list)
143 NULLIFY (ec_env%mao_coef)
144 NULLIFY (ec_env%force)
145 NULLIFY (ec_env%dispersion_env)
146 NULLIFY (ec_env%xc_section)
147 NULLIFY (ec_env%matrix_z)
148 NULLIFY (ec_env%matrix_hz)
149 NULLIFY (ec_env%matrix_wz)
150 NULLIFY (ec_env%z_admm)
151 NULLIFY (ec_env%p_env)
152 NULLIFY (ec_env%vxc_rspace)
153 NULLIFY (ec_env%vtau_rspace)
154 NULLIFY (ec_env%vadmm_rspace)
155 NULLIFY (ec_env%rhoout_r, ec_env%rhoz_r)
156 NULLIFY (ec_env%x_data)
157 ec_env%should_update = .true.
159 ec_env%do_ec_admm = .false.
160 ec_env%do_ec_hfx = .false.
161 ec_env%reuse_hfx = .false.
163 IF (qs_env%energy_correction)
THEN
165 cpassert(
PRESENT(ec_section))
168 IF (logger%para_env%is_source())
THEN
175 i_val=ec_env%ks_solver)
177 i_val=ec_env%energy_functional)
179 i_val=ec_env%factorization)
181 i_val=ec_env%ec_initial_guess)
183 r_val=ec_env%eps_default)
189 i_val=ec_env%mao_max_iter)
191 r_val=ec_env%mao_eps_grad)
193 r_val=ec_env%mao_eps1)
195 i_val=ec_env%mao_iolevel)
198 l_val=ec_env%skip_ec)
201 l_val=ec_env%debug_forces)
203 l_val=ec_env%debug_stress)
205 l_val=ec_env%debug_external)
210 c_val=ec_env%exresp_fn)
212 c_val=ec_env%exresult_fn)
214 l_val=ec_env%do_error)
216 ec_env%do_skip = .false.
219 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind)
221 SELECT CASE (ec_env%basis)
224 qs_kind => qs_kind_set(ikind)
225 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
226 IF (
ASSOCIATED(basis_set))
THEN
227 NULLIFY (harris_basis)
228 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
229 IF (
ASSOCIATED(harris_basis))
THEN
232 NULLIFY (harris_basis)
239 qs_kind => qs_kind_set(ikind)
240 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
241 IF (
ASSOCIATED(basis_set))
THEN
242 NULLIFY (harris_basis)
243 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
244 IF (
ASSOCIATED(harris_basis))
THEN
247 NULLIFY (harris_basis)
249 CALL get_qs_env(qs_env, dft_control=dft_control)
250 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
252 harris_basis%kind_radius = basis_set%kind_radius
258 qs_kind => qs_kind_set(ikind)
259 NULLIFY (harris_basis)
260 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
261 IF (.NOT.
ASSOCIATED(harris_basis))
THEN
262 cpwarn(
"Harris Basis not defined for all types of atoms.")
266 cpabort(
"Unknown basis set for energy correction (Harris functional)")
269 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type=
"HARRIS")
272 CALL get_qs_env(qs_env, dft_control=dft_control)
273 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
274 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
276 qs_kind => qs_kind_set(ikind)
277 NULLIFY (harris_basis)
278 CALL get_qs_kind(qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
279 CALL get_qs_kind(qs_kind, hard_radius=rc, gpw_type_forced=gpw)
280 NULLIFY (harris_soft_basis)
283 dft_control%qs_control%gapw_control%eps_fit, &
285 dft_control%qs_control%gapw_control%force_paw, gpw)
294 ec_env%basis_inconsistent = .false.
295 IF (ec_env%basis ==
"HARRIS")
THEN
297 qs_kind => qs_kind_set(ikind)
299 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
301 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
303 IF (basis_set%name /= harris_basis%name)
THEN
304 ec_env%basis_inconsistent = .true.
310 IF (ec_env%energy_functional ==
ec_functional_dc .AND. ec_env%basis_inconsistent)
THEN
311 CALL cp_abort(__location__, &
312 "DC-DFT: Correction and ground state need to use the same basis. "// &
313 "Checked by comparing basis set names only.")
315 IF (ec_env%energy_functional ==
ec_functional_ext .AND. ec_env%basis_inconsistent)
THEN
316 CALL cp_abort(__location__, &
317 "Exteranl Energy: Correction and ground state need to use the same basis. "// &
318 "Checked by comparing basis set names only.")
322 SELECT CASE (ec_env%energy_functional)
324 ec_env%ec_name =
"Harris"
326 ec_env%ec_name =
"DC-DFT"
328 ec_env%ec_name =
"External Energy"
330 cpabort(
"unknown energy correction")
340 ec_env%xc_section => section1
342 ec_env%xc_section => xc_section
345 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
347 dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
350 dft_control%drho_by_collocation = dft_control%drho_by_collocation .OR. &
354 ALLOCATE (dispersion_env)
356 xc_section => ec_env%xc_section
357 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, para_env=para_env)
364 cpabort(
"nl-vdW functionals not available for EC calculations")
369 ec_env%dispersion_env => dispersion_env
376 ec_env%use_ls_solver = .false.
381 IF (ec_env%use_ls_solver)
THEN
382 CALL ec_ls_create(qs_env, ec_env)
387 CALL timestop(handle)
389 END SUBROUTINE init_ec_env
400 SUBROUTINE ec_ls_create(qs_env, ec_env)
404 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ls_create'
414 CALL timeset(routinen, handle)
416 ALLOCATE (ec_env%ls_env)
417 ls_env => ec_env%ls_env
419 NULLIFY (dft_control, input, ls_env%para_env)
422 dft_control=dft_control, &
424 molecule_set=molecule_set, &
425 particle_set=particle_set, &
426 para_env=ls_env%para_env, &
427 nelectron_spin=ls_env%nelectron_spin)
430 ls_env%nspins = dft_control%nspins
431 ls_env%natoms =
SIZE(particle_set, 1)
432 CALL ls_env%para_env%retain()
435 ALLOCATE (ls_env%ls_mstruct%atom_to_molecule(ls_env%natoms))
436 CALL molecule_of_atom(molecule_set, atom_to_mol=ls_env%ls_mstruct%atom_to_molecule)
438 ls_env%do_transport = .false.
439 ls_env%do_pao = .false.
440 ls_env%ls_mstruct%do_pao = ls_env%do_pao
441 ls_env%do_pexsi = .false.
442 ls_env%has_unit_metric = .false.
450 CALL section_vals_val_get(ec_section,
"MATRIX_CLUSTER_TYPE", i_val=ls_env%ls_mstruct%cluster_type)
453 CALL section_vals_val_get(ec_section,
"REPORT_ALL_SPARSITIES", l_val=ls_env%report_all_sparsities)
463 SELECT CASE (ec_env%ks_solver)
467 SELECT CASE (ls_env%s_inversion_type)
469 ls_env%needs_s_inv = .true.
470 ls_env%use_s_sqrt = .true.
472 ls_env%needs_s_inv = .true.
473 ls_env%use_s_sqrt = .false.
475 ls_env%needs_s_inv = .false.
476 ls_env%use_s_sqrt = .false.
481 ls_env%needs_s_inv = .false.
482 ls_env%use_s_sqrt = .true.
487 SELECT CASE (ls_env%s_preconditioner_type)
489 ls_env%has_s_preconditioner = .false.
491 ls_env%has_s_preconditioner = .true.
495 ls_env%extrapolation_order = 0
496 ls_env%scf_history%nstore = 0
497 ls_env%scf_history%istore = 0
498 ALLOCATE (ls_env%scf_history%matrix(ls_env%nspins, ls_env%scf_history%nstore))
500 NULLIFY (ls_env%mixing_store)
502 CALL timestop(handle)
504 END SUBROUTINE ec_ls_create
517 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_write_input'
519 INTEGER :: handle, unit_nr
523 CALL timeset(routinen, handle)
526 IF (logger%para_env%is_source())
THEN
532 IF (unit_nr > 0)
THEN
534 WRITE (unit_nr,
'(T2,A)') &
535 "!"//repeat(
"-", 29)//
" Energy Correction "//repeat(
"-", 29)//
"!"
538 SELECT CASE (ec_env%energy_functional)
540 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"HARRIS FUNCTIONAL"
542 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"DC-DFT"
544 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"External"
546 WRITE (unit_nr,
'()')
549 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"eps_default:", ec_env%eps_default
552 SELECT CASE (ec_env%basis)
554 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC basis: ",
"ORBITAL"
556 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC basis: ",
"PRIMITIVE"
558 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC Basis: ",
"HARRIS"
562 IF (ec_env%do_ec_hfx)
THEN
564 WRITE (unit_nr,
'(T2,A,T61,L20)')
"DC-DFT with HFX", ec_env%do_ec_hfx
565 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Reuse HFX integrals", ec_env%reuse_hfx
566 WRITE (unit_nr,
'(T2,A,T61,L20)')
"DC-DFT HFX with ADMM", ec_env%do_ec_admm
574 SELECT CASE (ec_env%ks_solver)
576 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"DIAGONALIZATION"
578 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"OT DIAGONALIZATION"
580 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"MATRIX_SIGN"
582 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"TRS4"
585 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"TC2"
588 WRITE (unit_nr,
'()')
592 WRITE (unit_nr,
'(T2,A,T61,L20)')
"MAO:", ec_env%mao
593 WRITE (unit_nr,
'(T2,A,T61,L20)')
"MAO_IOLEVEL:", ec_env%mao_iolevel
594 WRITE (unit_nr,
'(T2,A,T61,I20)')
"MAO_MAX_ITER:", ec_env%mao_max_iter
595 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"MAO_EPS_GRAD:", ec_env%mao_eps_grad
596 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"MAO_EPS1:", ec_env%mao_eps1
597 WRITE (unit_nr,
'()')
601 IF (.NOT. ec_env%use_ls_solver)
THEN
603 WRITE (unit_nr,
'(T2,A)')
"MO Solver"
604 WRITE (unit_nr,
'()')
606 SELECT CASE (ec_env%ks_solver)
609 SELECT CASE (ec_env%factorization)
611 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Factorization: ",
"CHOLESKY"
620 SELECT CASE (ec_env%ec_initial_guess)
622 WRITE (unit_nr,
'(T2,A,T61,A20)')
"OT Diag initial guess: ",
"ATOMIC"
624 WRITE (unit_nr,
'(T2,A,T61,A20)')
"OT Diag initial guess: ",
"GROUND STATE DM"
628 cpabort(
"Unknown Diagonalization algorithm for Harris functional")
633 WRITE (unit_nr,
'(T2,A)')
"AO Solver"
634 WRITE (unit_nr,
'()')
636 ls_env => ec_env%ls_env
637 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"eps_filter:", ls_env%eps_filter
638 WRITE (unit_nr,
'(T2,A,T61,L20)')
"fixed chemical potential (mu)", ls_env%fixed_mu
639 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing inv(S):", ls_env%needs_s_inv
640 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing sqrt(S):", ls_env%use_s_sqrt
641 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing S preconditioner ", ls_env%has_s_preconditioner
643 IF (ls_env%use_s_sqrt)
THEN
644 SELECT CASE (ls_env%s_sqrt_method)
646 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"NEWTONSCHULZ"
648 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"PROOT"
650 cpabort(
"Unknown sqrt method.")
652 WRITE (unit_nr,
'(T2,A,T61,I20)')
"S sqrt order:", ls_env%s_sqrt_order
655 SELECT CASE (ls_env%s_preconditioner_type)
657 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"NONE"
659 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"ATOMIC"
661 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"MOLECULAR"
664 SELECT CASE (ls_env%ls_mstruct%cluster_type)
666 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"ATOMIC")
668 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"MOLECULAR")
670 cpabort(
"Unknown cluster type")
677 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
678 WRITE (unit_nr,
'()')
682 CALL timestop(handle)
Define the atomic kind types and their sub types.
subroutine, public remove_basis_from_container(container, inum, basis_type)
...
subroutine, public add_basis_set_to_container(container, basis_set, basis_set_type)
...
subroutine, public allocate_gto_basis_set(gto_basis_set)
...
subroutine, public copy_gto_basis_set(basis_set_in, basis_set_out)
...
subroutine, public create_primitive_basis_set(basis_set, pbasis, lmax)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public niklasson2014
integer, save, public niklasson2003
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Types needed for a for a Energy Correction.
Energy correction environment setup and handling.
subroutine, public ec_write_input(ec_env)
Print out the energy correction input section.
subroutine, public ec_env_create(qs_env, ec_env, dft_section, ec_section)
Allocates and intitializes ec_env.
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
Define the data structure for the molecule information.
subroutine, public molecule_of_atom(molecule_set, atom_to_mol)
finds for each atom the molecule it belongs to
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
Define the data structure for the particle information.
Calculation of non local dispersion functionals Some routines adapted from: Copyright (C) 2001-2009 Q...
subroutine, public qs_dispersion_nonloc_init(dispersion_env, para_env)
...
Calculation of dispersion using pair potentials.
subroutine, public qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
...
Definition of disperson types for DFT calculations.
Set disperson types for DFT calculations.
subroutine, public qs_dispersion_env_set(dispersion_env, xc_section)
...
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, sab_cneo, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public create_soft_basis(orb_basis, soft_basis, eps_fit, rc, paw_atom, paw_type_forced, gpw_r3d_rs_type_forced)
create the soft basis from a GTO basis
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Exchange and Correlation functional calculations.
logical function, public xc_uses_norm_drho(xc_fun_section, lsd)
...
logical function, public xc_uses_kinetic_energy_density(xc_fun_section, lsd)
...
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information on the energy correction functional for KG.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.