Example 1: GAP 2017 Carbon

Tasks

  • Train energy, forces, and virials of carbon.

  • Plot the properties calculated by HotPP vs DFT.

  • Use ASE Calculator interface.

  • Plot the phono spectrum.

Input

You can see the following files required by this task in this fold.

carbon
|- input.yaml
|- model.ckpt
|- data/
|  |- train.traj
|  |- test.traj
  • model.ckpt is a checkpoint of pre-trained model, we will continue our train from this to quickly reproduce the results.

  • train.traj is the training data, it can be any format which can be red by ase if the type is ase. The target energy should be stored in info['energy'] or can be got by get_potential_energy(), the target forces should be stored in info['forces'] or can be got by get_forces(), the target virials should be stored in info['virial'] (or info['stress']) or can be got by get_stress() , we will convert it to virial by multiple -volume.

  • test.traj is the testset.

  • `input.yaml <https://gitlab.com/bigd4/hotpp/-/blob/master/examples/carbon/input.yaml>`__ controls the specific details of model architecture and training. Some import parameters in this tasks are:

cutoff: 3.0
Data:
  type: ase
  trainSet: data/train.traj
  testSet: data/test.traj
Train:
  allowMissing: True
  targetProp: ["energy", "forces", "virial"]
  weight: [0.5, 1.0, 0.2]
  maxEpoch: 10

These parameters mean the cutoff in this task is 3.0 Å. We use data/train.traj as trainset and data/test/traj as testset (actually it should be vaildation dataset here). We set allowMissing to True since only part of the structures has virial property. We train energy, forces, and virial in this task, and the weights are 0.5, 1.0, 0.2 respectively. And we just train 10 epoch from previously trained model since it is only an example. (It takes about 15 min on my computer with RTX 2070, you can decrease it to save time)

Train

Now, we can train the model by:

[1]:
! hotpp train --load_checkpoint model.ckpt
17:58:04

    )            (    (
 ( /(          ) )\ ) )\ )
 )\())      ( /((()/((()/(
((_)\   (   )\())/(_))/(_))
 _((_)  )\ (_))/(_)) (_))
| || | ((_)| |_ | _ \| _ \
| __ |/ _ \|  _||  _/|  _/
|_||_|\___/ \__||_|  |_|
HotPP (v.1.0.0 RELEASE)

17:58:04
Branch: update_examples
Commit ID: b11589299d7d8d018201a2cea0d8aa5da0a12bc3
Commit Message: example tmp
Diff:


17:58:09   Using seed 52614
17:58:09   Preparing data...
17:58:11   numWorkers: 8
17:58:12   Now 0
17:58:18   Calculating ground energy...
17:58:18   n_neighbor   : 13.572470657917297
17:58:18   all_elements : [6]
17:58:18   ground_energy  : [-156.75123297795537]
17:58:18   std   : 2.868865634734073
17:58:18   mean  : 0.0
GPU available: True (cuda), used: True
TPU available: False, using: 0 TPU cores
IPU available: False, using: 0 IPUs
HPU available: False, using: 0 HPUs
`Trainer(val_check_interval=1.0)` was configured so validation will run at the end of the training epoch..
17:58:18   Load checkpoints from model.ckpt
You are using a CUDA device ('NVIDIA RTX 5880 Ada Generation') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision
Missing logger folder: /home/gegejun/src/hotpp/examples/carbon/outDir/lightning_logs
Restoring states from the checkpoint path at model.ckpt
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
17:58:20
Equivalent weight: ['models.main.en_equivalent_blocks.0.node_block.graph_conv.radial_fn.mlp.0.weight', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.radial_fn.mlp.2.weight', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.0.linear.weights', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.1.linear.weights', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.2.linear.weights', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.U.linear_list.0.weight', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.tensor_product.linear_list.0.linear.weight', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.tensor_product.linear_list.1.linear.weight', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.tensor_product.linear_list.2.linear.weight', 'models.main.en_equivalent_blocks.0.node_block.self_interact.linear_list.0.weight', 'models.main.en_equivalent_blocks.0.node_block.self_interact.linear_list.1.weight', 'models.main.en_equivalent_blocks.0.node_block.self_interact.linear_list.2.weight', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.0.weights', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.1.weights', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.2.weights', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.radial_fn.mlp.0.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.radial_fn.mlp.2.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.0.linear.weights', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.1.linear.weights', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.2.linear.weights', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.U.linear_list.0.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.U.linear_list.1.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.U.linear_list.2.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.0.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.1.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.2.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.3.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.4.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.5.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.6.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.7.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.8.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.9.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.tensor_product.linear_list.10.linear.weight', 'models.main.en_equivalent_blocks.1.node_block.self_interact.linear_list.0.weight', 'models.main.en_equivalent_blocks.1.node_block.self_interact.linear_list.1.weight', 'models.main.en_equivalent_blocks.1.node_block.self_interact.linear_list.2.weight', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.0.weights', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.1.weights', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.2.weights', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.radial_fn.mlp.0.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.radial_fn.mlp.2.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.0.linear.weights', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.1.linear.weights', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.2.linear.weights', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.U.linear_list.0.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.U.linear_list.1.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.U.linear_list.2.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.0.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.1.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.2.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.3.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.4.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.5.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.6.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.7.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.8.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.9.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.tensor_product.linear_list.10.linear.weight', 'models.main.en_equivalent_blocks.2.node_block.self_interact.linear_list.0.weight', 'models.main.en_equivalent_blocks.2.node_block.self_interact.linear_list.1.weight', 'models.main.en_equivalent_blocks.2.node_block.self_interact.linear_list.2.weight', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.0.weights', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.1.weights', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.2.weights', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.radial_fn.mlp.0.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.radial_fn.mlp.2.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.0.linear.weights', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.1.linear.weights', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.2.linear.weights', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.U.linear_list.0.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.U.linear_list.1.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.U.linear_list.2.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.0.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.1.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.2.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.3.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.4.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.5.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.6.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.7.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.8.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.9.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.tensor_product.linear_list.10.linear.weight', 'models.main.en_equivalent_blocks.3.node_block.self_interact.linear_list.0.weight', 'models.main.en_equivalent_blocks.3.node_block.self_interact.linear_list.1.weight', 'models.main.en_equivalent_blocks.3.node_block.self_interact.linear_list.2.weight', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.0.weights', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.1.weights', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.2.weights', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.radial_fn.mlp.0.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.radial_fn.mlp.2.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.0.linear.weights', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.1.linear.weights', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.2.linear.weights', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.U.linear_list.0.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.U.linear_list.1.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.U.linear_list.2.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.tensor_product.linear_list.0.linear.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.tensor_product.linear_list.1.linear.weight', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.tensor_product.linear_list.2.linear.weight', 'models.main.en_equivalent_blocks.4.node_block.self_interact.linear_list.0.weight', 'models.main.en_equivalent_blocks.4.node_block.non_linear.activate_list.0.weights']
Equivalent bias  : ['models.main.en_equivalent_blocks.0.node_block.graph_conv.radial_fn.radial_fn.freqs', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.radial_fn.mlp.0.bias', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.radial_fn.mlp.2.bias', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.0.linear.bias', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.1.linear.bias', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.rbf_mixing_list.2.linear.bias', 'models.main.en_equivalent_blocks.0.node_block.graph_conv.U.linear_list.0.bias', 'models.main.en_equivalent_blocks.0.node_block.self_interact.linear_list.0.bias', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.0.bias', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.1.bias', 'models.main.en_equivalent_blocks.0.node_block.non_linear.activate_list.2.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.radial_fn.radial_fn.freqs', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.radial_fn.mlp.0.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.radial_fn.mlp.2.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.0.linear.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.1.linear.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.rbf_mixing_list.2.linear.bias', 'models.main.en_equivalent_blocks.1.node_block.graph_conv.U.linear_list.0.bias', 'models.main.en_equivalent_blocks.1.node_block.self_interact.linear_list.0.bias', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.0.bias', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.1.bias', 'models.main.en_equivalent_blocks.1.node_block.non_linear.activate_list.2.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.radial_fn.radial_fn.freqs', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.radial_fn.mlp.0.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.radial_fn.mlp.2.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.0.linear.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.1.linear.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.rbf_mixing_list.2.linear.bias', 'models.main.en_equivalent_blocks.2.node_block.graph_conv.U.linear_list.0.bias', 'models.main.en_equivalent_blocks.2.node_block.self_interact.linear_list.0.bias', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.0.bias', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.1.bias', 'models.main.en_equivalent_blocks.2.node_block.non_linear.activate_list.2.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.radial_fn.radial_fn.freqs', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.radial_fn.mlp.0.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.radial_fn.mlp.2.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.0.linear.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.1.linear.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.rbf_mixing_list.2.linear.bias', 'models.main.en_equivalent_blocks.3.node_block.graph_conv.U.linear_list.0.bias', 'models.main.en_equivalent_blocks.3.node_block.self_interact.linear_list.0.bias', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.0.bias', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.1.bias', 'models.main.en_equivalent_blocks.3.node_block.non_linear.activate_list.2.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.radial_fn.radial_fn.freqs', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.radial_fn.mlp.0.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.radial_fn.mlp.2.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.0.linear.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.1.linear.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.rbf_mixing_list.2.linear.bias', 'models.main.en_equivalent_blocks.4.node_block.graph_conv.U.linear_list.0.bias', 'models.main.en_equivalent_blocks.4.node_block.self_interact.linear_list.0.bias', 'models.main.en_equivalent_blocks.4.node_block.non_linear.activate_list.0.bias']
Embedding        : ['models.main.embedding_layer.z_weights.weight', 'models.main.edge_embedding.linear.weights', 'models.main.edge_embedding.linear.bias']
Readout          : ['models.main.readout_layer.layer_dict.site_energy.activate_fn.weights', 'models.main.readout_layer.layer_dict.site_energy.activate_fn.bias', 'models.main.readout_layer.layer_dict.site_energy.layer1.weights', 'models.main.readout_layer.layer_dict.site_energy.layer1.bias', 'models.main.readout_layer.layer_dict.site_energy.layer2.weights', 'models.main.readout_layer.layer_dict.site_energy.layer2.bias']
Others           : ['models.main.radial_fn.radial_fn.freqs', 'models.main.radial_fn.mlp.0.weight', 'models.main.radial_fn.mlp.0.bias', 'models.main.radial_fn.mlp.2.weight', 'models.main.radial_fn.mlp.2.bias', 'models.ground_energy.one_hot.z_weights.weight']

  | Name  | Type              | Params
--------------------------------------------
0 | model | MultiAtomicModule | 368 K
--------------------------------------------
368 K     Trainable params
7         Non-trainable params
368 K     Total params
1.474     Total estimated model params size (MB)
Restored all states from the checkpoint at model.ckpt
17:58:23     epoch   |   step   |    lr    |        total        |       energy        |       forces        |       virial
17:58:23      996    |  254235  | 4.71e-05 |   nan    /  0.4781  |   nan    /  0.0104  |   nan    /  0.4770  |   nan    /  0.0732
18:00:23      997    |  254490  | 4.71e-05 |  0.3883  /  0.3961  |  0.0193  /  0.0179  |  0.3880  /  0.3950  |  0.0092  /  0.0607
18:02:45      998    |  254745  | 4.71e-05 |  0.3883  /  0.3966  |  0.0198  /  0.0190  |  0.3880  /  0.3953  |  0.0092  /  0.0653
18:05:02      999    |  255000  | 4.71e-05 |  0.3880  /  0.3961  |  0.0196  /  0.0182  |  0.3877  /  0.3949  |  0.0093  /  0.0627
18:07:12      1000   |  255255  | 4.71e-05 |  0.3882  /  0.3964  |  0.0192  /  0.0186  |  0.3879  /  0.3951  |  0.0097  /  0.0648
18:09:37      1001   |  255510  | 4.71e-05 |  0.3879  /  0.3960  |  0.0191  /  0.0182  |  0.3876  /  0.3948  |  0.0093  /  0.0637
18:11:34      1002   |  255765  | 4.71e-05 |  0.3879  /  0.3962  |  0.0194  /  0.0195  |  0.3876  /  0.3949  |  0.0091  /  0.0628
18:13:26      1003   |  256020  | 4.71e-05 |  0.3882  /  0.3961  |  0.0195  /  0.0187  |  0.3879  /  0.3948  |  0.0095  /  0.0637
18:15:32      1004   |  256275  | 4.71e-05 |  0.3880  /  0.3961  |  0.0194  /  0.0185  |  0.3877  /  0.3949  |  0.0093  /  0.0635
18:17:29      1005   |  256530  | 4.71e-05 |  0.3879  /  0.3964  |  0.0195  /  0.0187  |  0.3875  /  0.3951  |  0.0094  /  0.0654
`Trainer.fit` stopped: `max_epochs=1006` reached.

You can also monitor the loss and learning rate curve by

$ tensorboard --logdir=outDir
during and after training.
The epoch begin from 996 since the model.ckpt stop there, and the training end at 1005 epoch because the maxEpoch is 10.

Eval

After training done, we can evaluate the model.

[2]:
%mkdir eval
%cd eval
! hotpp eval -m ../outDir/best.pt -d ../data/test.traj -p energy forces virial --device cuda -b 16
mkdir: cannot create directory ‘eval’: File exists
/home/gegejun/src/hotpp/examples/carbon/eval
100%|███████████████████████████████████████████| 29/29 [00:04<00:00,  6.67it/s]

This command means that we use outDir/best.pt to evaluate energy, forces, and virial of data/test.traj with cuda, and the batchsize is 16, then the target property and the predicted property are saved by npy, you can load them by:

import numpy as np
n_atoms = np.load('n_atoms.npy')
e_dft = np.load('target_energy.npy')
e_hot = np.load('output_energy.npy')

And you can analyze them. To plot them to compare with DFT:

[3]:
! hotpp plot -p per_energy forces per_virial
 per_energy : 0.0185 0.0136
   forces   : 0.4130 0.3148
 per_virial : 0.0635 0.0445

This command means that we plot peratom energy, forces, and peratom virial calculated by HotPP and the target values. And you can see the results:

peratom energy

forces

peratom virial

perenergy

forces

pervirial

If you need plot energy instead of peratom energy, just use:

$ hotpp plot -p energy

ASE Calculations

Then we introduce the usage of ASE Calculator interface. First, we freeze the model so you can use it in the environment just with pytorch, and do not require hotpp being installed.

[4]:
! hotpp freeze ../outDir/best.pt
This command will give ase-infer.pt and lammps-infer.pt, we only need ase-infer.pt in this example.
Copy the ase interface file to the current fold or add the-path-to-hotase.py to PYTHONPATH so you can imort Calculator from this file. And you can use it as an Calculator of ase.
[9]:
%cp ../../../interface/ase/hotase.py .
from hotase import MiaoCalculator
from ase.build import bulk

atoms = bulk('C', 'diamond', cubic=True)
calc = MiaoCalculator("ase-infer.pt")
atoms.calc = calc
print(f"\nenergy:\n {atoms.get_potential_energy()}"
      f"\nforces:\n {atoms.get_forces()}"
      f"\nstress:\n {atoms.get_stress()}")

energy:
 -1266.2486926519648
forces:
 [[-7.79359758e-15 -1.52816128e-14  8.82974249e-16]
 [ 8.54871729e-15  1.44051437e-14 -1.97247697e-15]
 [ 1.37142901e-14 -5.63988079e-15 -2.05564732e-15]
 [ 6.52256027e-15 -1.86294852e-15  5.46784840e-15]
 [-8.45957548e-15 -2.02962647e-16 -2.51534904e-16]
 [-2.09379735e-15  3.34931735e-15 -2.35922393e-15]
 [-1.40404181e-14 -1.63242222e-15 -1.47104551e-15]
 [ 2.49643098e-15  6.96274635e-15  1.93421668e-15]]
stress:
 [9.92307113e-02 9.92307113e-02 9.92307113e-02 6.29962891e-16
 3.00032693e-16 1.77363437e-16]

We can also plot the phono spectrum of diamond with such Calculator. This task need Phonopy, install it by

$ pip install phonopy

if required.

Copy the phono calculator file to the current fold or add the-path-to-phono.py to PYTHONPATH so you can imort functions from this file.

[8]:
%cp ../../../tools/hotphono.py .
%cp ../force_constant_dft.npy .
import hotphono
import numpy as np
from phonopy import Phonopy
from phonopy.interface.phonopy_yaml import PhonopyYaml
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid

unitcell = hotphono.ase2phono(atoms)
supercell_matrix = np.array([2, 2, 2])
phonon = Phonopy(unitcell=unitcell,
                 supercell_matrix=supercell_matrix,
                 # primitive_matrix=primitive_matrix,
                 primitive_matrix='auto')

force_constants = np.load("force_constant_dft.npy")
phonon.force_constants = force_constants
phpy_yaml = PhonopyYaml(settings={'force_sets': True,
                                  'displacements': True,
                                  'force_constants': True,
                                  'born_effective_charge': True,
                                  'dielectric_constant': True})
phpy_yaml.set_phonon_info(phonon)
atoms.info['phono_info'] = phpy_yaml._data
band_dict = hotphono.get_band_structure(phonon, atoms)
fig = plt.figure(figsize=(12, 10))
axs = ImageGrid(fig, 111, nrows_ncols=(1, len(band_dict['labels_path'])), axes_pad=0.2, label_mode="L")
#plot_band_structure(band_dict, axs, 'g')

force_constants = np.load("force_constant_dft.npy")
phonon.force_constants = force_constants
phpy_yaml = PhonopyYaml(settings={'force_sets': True,
                                  'displacements': True,
                                  'force_constants': True,
                                  'born_effective_charge': True,
                                  'dielectric_constant': True})
phpy_yaml.set_phonon_info(phonon)
atoms.info['phono_info'] = phpy_yaml._data
band_dict = hotphono.get_band_structure(phonon, atoms)
hotphono.plot_band_structure(band_dict, axs, 'green', max_freq=50)


force_constants = hotphono.get_force_constants(calc, phonon)
phonon.force_constants = force_constants
phpy_yaml = PhonopyYaml(settings={'force_sets': True,
                                  'displacements': True,
                                  'force_constants': True,
                                  'born_effective_charge': True,
                                  'dielectric_constant': True})
phpy_yaml.set_phonon_info(phonon)
atoms.info['phono_info'] = phpy_yaml._data
band_dict = hotphono.get_band_structure(phonon, atoms)
hotphono.plot_band_structure(band_dict, axs, 'blue', linestyle='--', max_freq=50)


plt.savefig('phono.pdf')

../../_images/examples_carbon_carbon_12_0.png