Skip to main content

DFTD4ParamAPI

Trait DFTD4ParamAPI 

Source
pub trait DFTD4ParamAPI: Sized {
    // Required method
    fn new_param_f(self) -> Result<DFTD4Param, DFTD4Error>;

    // Provided method
    fn new_param(self) -> DFTD4Param { ... }
}
Expand description

Trait for creating DFTD4Param from damping parameter structs.

Required Methods§

Provided Methods§

Source

fn new_param(self) -> DFTD4Param

Examples found in repository?
examples/test_interface.rs (line 243)
208fn test_r2scan3c() {
209    // Use r2SCAN-3c for a mindless molecule (custom D4 model)
210    let thr = 1.0e-8;
211
212    let numbers = vec![1, 9, 15, 13, 1, 1, 13, 5, 3, 15, 8, 1, 1, 5, 16, 1];
213    #[rustfmt::skip]
214    let positions = vec![
215        -2.14132037405479, -1.34402701877044, -2.32492500904728,
216         4.46671289205392, -2.04800110524830,  0.44422406067087,
217        -4.92212517643478, -1.73734240529793,  0.96890323821450,
218        -1.30966093045696, -0.52977363497805,  3.44453452239668,
219        -4.34208759006189, -4.30470270977329,  0.39887431726215,
220         0.61788392767516,  2.62484136683297, -3.28228926932647,
221         4.23562873444840, -1.68839322682951, -3.53824299552792,
222         2.23130060612446,  1.93579813100155, -1.80384647554323,
223        -2.32285463652832,  2.90603947535842, -1.39684847191937,
224         2.34557941578250,  2.86074312333371,  1.82827238641666,
225        -3.66431367659153, -0.42910188232667, -1.81957402856634,
226        -0.34927881505446, -1.75988134003940,  5.98017466326572,
227         0.29500802281217, -2.00226104143537,  0.53023447931897,
228         2.10449364205058, -0.56741404446633,  0.30975625014335,
229        -1.59355304432499,  3.69176153150419,  2.87878226787916,
230         4.34858700256050,  2.39171478113440, -2.61802993563738,
231    ];
232
233    // Python test uses custom D4 model with ga=2.0, gc=1.0
234    let model = DFTD4Model::custom_d4(&numbers, &positions, 2.0, 1.0, 6.0, None, None, None);
235
236    let param = DFTD4RationalDampingParamBuilder::default()
237        .s8(0.0)
238        .a1(0.42)
239        .a2(5.65)
240        .s9(2.0)
241        .build()
242        .unwrap()
243        .new_param();
244    let res = model.get_dispersion(&param, false);
245
246    assert_abs_diff_eq!(res.energy, -0.008016697276824889, epsilon = thr);
247
248    let res = model.get_dispersion(&param, true);
249
250    assert_abs_diff_eq!(res.energy, -0.008016697276824889, epsilon = thr);
251}
252
253#[cfg(feature = "api-v3_2")]
254fn test_pair_resolved() {
255    // Calculate pairwise resolved dispersion energy for a molecule
256    let thr = 1.0e-8;
257
258    let numbers = vec![16, 16, 16, 16, 16, 16, 16, 16];
259    #[rustfmt::skip]
260    let positions = vec![
261        -4.15128787379191,  1.71951973863958, -0.93066267097296,
262        -4.15128787379191, -1.71951973863958,  0.93066267097296,
263        -1.71951973863958, -4.15128787379191, -0.93066267097296,
264         1.71951973863958, -4.15128787379191,  0.93066267097296,
265         4.15128787379191, -1.71951973863958, -0.93066267097296,
266         4.15128787379191,  1.71951973863958,  0.93066267097296,
267         1.71951973863958,  4.15128787379191, -0.93066267097296,
268        -1.71951973863958,  4.15128787379191,  0.93066267097296,
269    ];
270    #[rustfmt::skip]
271    let pair_disp2 = vec![
272        -0.00000000e-0, -5.80599854e-4, -4.74689854e-4, -2.11149449e-4, -1.63163128e-4, -2.11149449e-4, -4.74689854e-4, -5.80599854e-4,
273        -5.80599854e-4, -0.00000000e-0, -5.80599854e-4, -4.74689854e-4, -2.11149449e-4, -1.63163128e-4, -2.11149449e-4, -4.74689854e-4,
274        -4.74689854e-4, -5.80599854e-4, -0.00000000e-0, -5.80599854e-4, -4.74689854e-4, -2.11149449e-4, -1.63163128e-4, -2.11149449e-4,
275        -2.11149449e-4, -4.74689854e-4, -5.80599854e-4, -0.00000000e-0, -5.80599854e-4, -4.74689854e-4, -2.11149449e-4, -1.63163128e-4,
276        -1.63163128e-4, -2.11149449e-4, -4.74689854e-4, -5.80599854e-4, -0.00000000e-0, -5.80599854e-4, -4.74689854e-4, -2.11149449e-4,
277        -2.11149449e-4, -1.63163128e-4, -2.11149449e-4, -4.74689854e-4, -5.80599854e-4, -0.00000000e-0, -5.80599854e-4, -4.74689854e-4,
278        -4.74689854e-4, -2.11149449e-4, -1.63163128e-4, -2.11149449e-4, -4.74689854e-4, -5.80599854e-4, -0.00000000e-0, -5.80599854e-4,
279        -5.80599854e-4, -4.74689854e-4, -2.11149449e-4, -1.63163128e-4, -2.11149449e-4, -4.74689854e-4, -5.80599854e-4, -0.00000000e-0,
280    ];
281    #[rustfmt::skip]
282    let pair_disp3 = vec![
283        0.00000000e-0, 3.39353850e-7, 8.74462839e-7, 1.17634100e-6, 9.86937310e-7, 1.17634100e-6, 8.74462839e-7, 3.39353850e-7,
284        3.39353850e-7, 0.00000000e-0, 3.39353850e-7, 8.74462839e-7, 1.17634100e-6, 9.86937310e-7, 1.17634100e-6, 8.74462839e-7,
285        8.74462839e-7, 3.39353850e-7, 0.00000000e-0, 3.39353850e-7, 8.74462839e-7, 1.17634100e-6, 9.86937310e-7, 1.17634100e-6,
286        1.17634100e-6, 8.74462839e-7, 3.39353850e-7, 0.00000000e-0, 3.39353850e-7, 8.74462839e-7, 1.17634100e-6, 9.86937310e-7,
287        9.86937310e-7, 1.17634100e-6, 8.74462839e-7, 3.39353850e-7, 0.00000000e-0, 3.39353850e-7, 8.74462839e-7, 1.17634100e-6,
288        1.17634100e-6, 9.86937310e-7, 1.17634100e-6, 8.74462839e-7, 3.39353850e-7, 0.00000000e-0, 3.39353850e-7, 8.74462839e-7,
289        8.74462839e-7, 1.17634100e-6, 9.86937310e-7, 1.17634100e-6, 8.74462839e-7, 3.39353850e-7, 0.00000000e-0, 3.39353850e-7,
290        3.39353850e-7, 8.74462839e-7, 1.17634100e-6, 9.86937310e-7, 1.17634100e-6, 8.74462839e-7, 3.39353850e-7, 0.00000000e-0,
291    ];
292
293    let model = DFTD4Model::new(&numbers, &positions, None, None, None);
294
295    let param = DFTD4RationalDampingParamBuilder::default()
296        .s8(1.20065498)
297        .a1(0.40085597)
298        .a2(5.02928789)
299        .build()
300        .unwrap()
301        .new_param();
302    let res = model.get_pairwise_dispersion(&param);
303
304    for (a, b) in res.pair_energy2.iter().zip(pair_disp2.iter()) {
305        assert_abs_diff_eq!(a, b, epsilon = thr);
306    }
307
308    for (a, b) in res.pair_energy3.iter().zip(pair_disp3.iter()) {
309        assert_abs_diff_eq!(a, b, epsilon = thr);
310    }
311}

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§