castep_param_io/param/
template.rs1use super::{
2 band_structure::{BSExtraBands, BSXcFunctional, BandStructureBuilder},
3 BandsOptionBuilder, BasisSetBuilder, CalculatePropertiesBuilder, CastepParam,
4 CastepParamBuilder, CastepParamBuilderError, CastepTask, Continuation,
5 DensityMixingParamsBuilder, ElectroMinimizationBuilder, ElectronicParamBuilder, ExtraBands,
6 FiniteBasisCorr, GeneralBuilder, GeomMethod, GeomOptBuilder, MetalsMethod, MixingScheme,
7 OptStrategy, PopulationAnalysisBuilder, WritePropertiesBuilder, XCFunctional, XcParamBuilder,
8};
9
10impl CastepParam {
11 pub fn param_template(cutoff_energy: f64, spin: f64) -> CastepParamBuilder {
12 let mut builder = CastepParamBuilder::default();
13 builder
14 .basis_set(
15 BasisSetBuilder::default()
16 .cut_off_energy(cutoff_energy)
17 .grid_scale(1.5)
18 .fine_grid_scale(1.5)
19 .finite_basis_corr(FiniteBasisCorr::NoCorrection)
20 .build()
21 .expect("Error in building Basis Set keywords"),
22 )
23 .electronic(
24 ElectronicParamBuilder::default()
25 .bands_option(
26 BandsOptionBuilder::default()
27 .extra_bands(ExtraBands::PercExtraBands(72.0))
28 .build()
29 .expect("Error in building extra bands options"),
30 )
31 .spin(spin)
32 .build()
33 .expect("Error in building Electronic Parameter keywords"),
34 )
35 .electro_min(
36 ElectroMinimizationBuilder::default()
37 .elec_energy_tol(1e-5)
38 .max_scf_cycles(6000)
39 .fix_occupancy(false)
40 .smearing_width(0.10)
41 .spin_fix(6)
42 .num_dump_cycles(0)
43 .metals_method(MetalsMethod::DM)
44 .build()
45 .expect("Error in building Electronic Minimization keywords"),
46 )
47 .density_mixing(
48 DensityMixingParamsBuilder::default()
49 .mixing_scheme(MixingScheme::Pulay)
50 .mix_charge_amp(0.5)
51 .mix_spin_amp(2.0)
52 .mix_charge_gmax(1.5)
53 .mix_spin_gmax(1.5)
54 .mix_history_length(20)
55 .build()
56 .expect("Error in building Mixing Scheme keywords"),
57 )
58 .population_analysis(
59 PopulationAnalysisBuilder::default()
60 .popn_calculate(true)
61 .popn_bond_cutoff(3.0)
62 .pdos_calculate_weights(true)
63 .build()
64 .expect("Error in building Population Analysis keywords"),
65 )
66 .xc_correlation(
67 XcParamBuilder::default()
68 .xc_functional(XCFunctional::PBE)
69 .spin_polarised(true)
70 .build()
71 .expect("Error in building Exchange Correlation keywords"),
72 );
73 builder
74 }
75 pub fn geom_opt_param_template(
76 cutoff_energy: f64,
77 spin: f64,
78 ) -> Result<CastepParam, CastepParamBuilderError> {
79 let mut builder = CastepParam::param_template(cutoff_energy, spin);
80 builder
81 .general_keywords(
82 GeneralBuilder::default()
83 .task(CastepTask::GeometryOptimization)
84 .comment("CASTEP calculation from Rhino".to_string())
85 .opt_strategy(OptStrategy::Speed)
86 .page_wvfns(0)
87 .write_props(
88 WritePropertiesBuilder::default()
89 .formatted_potential(true)
90 .formatted_density(true)
91 .orbitals(true)
92 .build()
93 .expect("Error in building Write Properties"),
94 )
95 .calculate_props(
96 CalculatePropertiesBuilder::default()
97 .elf(false)
98 .stress(false)
99 .hirshfeld(true)
100 .densdiff(false)
101 .build()
102 .expect("Calculate properties build failed"),
103 )
104 .build()
105 .expect("Error in building General keywords"),
106 )
107 .geom_opt(
108 GeomOptBuilder::default()
109 .geom_energy_tol(5e-5)
110 .geom_force_tol(0.1)
111 .geom_stress_tol(0.2)
112 .geom_disp_tol(0.005)
113 .geom_max_iter(6000)
114 .geom_method(GeomMethod::BFGS)
115 .build()
116 .expect("Error in building Geometry Optimization keywords"),
117 );
118 builder.build()
119 }
120
121 pub fn dos_opt_param_template(
122 cutoff_energy: f64,
123 spin: f64,
124 ) -> Result<CastepParam, CastepParamBuilderError> {
125 let mut builder = CastepParam::param_template(cutoff_energy, spin);
126 builder
127 .general_keywords(
128 GeneralBuilder::default()
129 .task(CastepTask::BandStructure)
130 .comment("CASTEP calculation from Rhino".to_string())
131 .continuation_reuse(Continuation::Default)
132 .opt_strategy(OptStrategy::Speed)
133 .page_wvfns(0)
134 .write_props(
135 WritePropertiesBuilder::default()
136 .formatted_potential(true)
137 .formatted_density(true)
138 .orbitals(true)
139 .build()
140 .expect("Error in building Write Properties"),
141 )
142 .calculate_props(
143 CalculatePropertiesBuilder::default()
144 .elf(false)
145 .stress(false)
146 .hirshfeld(true)
147 .densdiff(false)
148 .build()
149 .expect("Calculate properties build failed"),
150 )
151 .build()
152 .expect("Error in building General keywords"),
153 )
154 .band_structure(
155 BandStructureBuilder::default()
156 .bs_extra_bands(BSExtraBands::PercExtra(72.0))
157 .bs_xc_functional(BSXcFunctional::PBE)
158 .bs_eigenvalue_tol(1e-5)
159 .bs_write_eigenvalues(true)
160 .build()
161 .expect("Error in building band_structure keywords"),
162 )
163 .build()
164 }
165}