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.ckptis a checkpoint of pre-trained model, we will continue our train from this to quickly reproduce the results.train.trajis the training data, it can be any format which can be red byaseif thetypeisase. The target energy should be stored ininfo['energy']or can be got byget_potential_energy(), the target forces should be stored ininfo['forces']or can be got byget_forces(), the target virials should be stored ininfo['virial'](orinfo['stress']) or can be got byget_stress(), we will convert it tovirialby multiple-volume.test.trajis 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
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:
|
|
|
|---|---|---|
|
|
|
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
ase-infer.pt and lammps-infer.pt, we only need ase-infer.pt in this example.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')


