castep_param_io/param/
template.rs

1use 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}