Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

1. Prepare training/test data

try:
    import torch
    print("successfully imported torch")
    print(torch.__version__)
except ImportError:
    !! pip install torch torchvision torchaudio --user --index-url https://download.pytorch.org/whl/cpu
    print("completed installing torch")
successfully imported torch
2.6.0+cu124
try:
    import numpy as np
    print("successfully imported numpy")
    print(np.__version__)
except ImportError:
    !! pip install numpy --user --upgrade
    print("completed installing numpy")
successfully imported numpy
1.26.4
try:
    from matplotlib import pyplot as plt
    print("successfully imported matplotlib")
except ImportError:
    !! pip install matplotlib --user --upgrade
    print("completed installing matplotlib")
successfully imported matplotlib
!! pip install aenet-gpr --user --upgrade
print("completed installing aenet-gpr")

! pip show aenet-gpr
completed installing aenet-gpr
Name: aenet-gpr
Version: 2.6.5
Summary: Atomistic simulation tools based on Gaussian Processes Regression
Home-page: https://github.com/atomisticnet/aenet-gpr
Author: In Won Yeu
Author-email: iy2185@columbia.edu
License: MPL-2.0
Location: /data/home/iy2185/.local/lib/python3.12/site-packages
Requires: ase
Required-by: 
import os, sys, site
sys.path.append(site.USER_SITE)

import aenet_gpr
print(aenet_gpr.__version__)
2.6.5
from IPython.display import Image

try:
    import ase.io
    print("successfully imported ase")
except ImportError:
    !! pip install ase --user --upgrade
    print("completed installing ASE")

    import ase.io
    print("successfully imported ase")
successfully imported ase

1. Prepare training/test data

We are using train/test HSE06 data of EC dimer prepared in aenet-gpr/example/2_EC-EC/

import os.path

! rm -rf 2_EC-EC
! mkdir 2_EC-EC

if os.path.isfile("../example/2_EC-EC/train_set_tutorial.zip"):
    ! unzip -oq ../example/2_EC-EC/train_set_tutorial.zip -d ./2_EC-EC/
    print("number of train data:")
    ! find ./2_EC-EC/train_set_tutorial/ -type f | wc -l
else:
    ! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
    ! unzip -oq train_set_tutorial.zip -d ./2_EC-EC/
    ! rm train_set_tutorial.zip
    print("number of train data:")
    ! find ./2_EC-EC/train_set_tutorial/ -type f | wc -l
--2025-10-19 16:57:05--  https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip [following]
--2025-10-19 16:57:05--  https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 101063 (99K) [application/zip]
Saving to: ‘train_set_tutorial.zip’

train_set_tutorial. 100%[===================>]  98.69K  --.-KB/s    in 0.002s  

2025-10-19 16:57:05 (42.6 MB/s) - ‘train_set_tutorial.zip’ saved [101063/101063]

number of train data:
80
if os.path.isfile("../example/2_EC-EC/test_set_tutorial.zip"):
    ! unzip -oq ../example/2_EC-EC/test_set_tutorial.zip -d ./2_EC-EC/
    print("number of test data:")
    ! find ./2_EC-EC/test_set_tutorial/ -type f | wc -l
else:
    ! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
    ! unzip -oq test_set_tutorial.zip -d ./2_EC-EC/
    ! rm test_set_tutorial.zip
    print("number of test data:")
    ! find ./2_EC-EC/test_set_tutorial/ -type f | wc -l
--2025-10-19 16:57:07--  https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip [following]
--2025-10-19 16:57:08--  https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 257174 (251K) [application/zip]
Saving to: ‘test_set_tutorial.zip’

test_set_tutorial.z 100%[===================>] 251.15K  --.-KB/s    in 0.004s  

2025-10-19 16:57:08 (58.5 MB/s) - ‘test_set_tutorial.zip’ saved [257174/257174]

number of test data:
161
atoms = ase.io.read("./2_EC-EC/test_set_tutorial/file_0000.xsf")
ase.io.write('2EC.png', atoms)
Image("2EC.png")
<IPython.core.display.Image object>

2-1. Train–Test with default Cartesian fingerprint

! rm -f train.in

if os.path.isfile("../example/2_EC-EC/train.in"):
    ! cp ../example/2_EC-EC/train.in .
else:
    ! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train.in
--2025-10-19 16:57:18--  https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train.in
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train.in [following]
--2025-10-19 16:57:18--  https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train.in
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 566 [text/plain]
Saving to: ‘train.in’

train.in            100%[===================>]     566  --.-KB/s    in 0s      

2025-10-19 16:57:19 (7.58 MB/s) - ‘train.in’ saved [566/566]

! cat train.in
# File path
Train_file ./2_EC-EC/train_set_tutorial/file_*.xsf
Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf

# Train model save (default: False)
# Train_model_save True

# File format (default: xsf)
File_format xsf

# Descriptor (default: cartesian coordinates)
Descriptor cart

# Kernel parameter
# scale 1.5
# weight 1.0

# Data process (default: batch, 25)
data_process batch
batch_size 25

# Flags for xsf file writing (default: False)
Train_write False
Test_write False
# Additional_write True

# Data augmentation parameter
# Disp_length 0.05
# Num_copy 3
! python -m aenet_gpr train.in
======================================================================
aenet-GPR: surrogate GPR for GPR-ANN indirect force training
======================================================================

2025-10-19 16:57:22.

Developed by In Won Yeu

This program performs three main steps:
1. Train: Generates a GPR model using the provided structure, energy, and force data.
2. Test: Uses the generated GPR model to predict values for the test set structures.
3. Augmentation: Performs data augmentation in xsf file format, compatible with aenet-(PyTorch),
supporting a GPR-ANN training in conjunction with aenet-(PyTorch).

Each of these steps is executed once the input file (train.in) contains the keywords:
Train_file [train file path]
Test_file [test file path]
Additional_write [True]


======================================================================
Train
======================================================================

Read reference training data

Time needed for reading data:            0.107673 s
Maximum CPU memory used:             0.411438 GB
Maximum GPU memory used:             0.000000 GB
Energy data size: (80,)  # (N_data, )
Force data size: (80, 20, 3)  # (N_data, N_atom, 3)
----------------------------------------------------------------------
Candidate scales: tensor([0.2000, 0.4000, 0.8000])
Updated scale: 0.4000000059604645
Updated weight: 0.6186434141732067
----------------------------------------------------------------------
Model train

Training parameters
{'num_data': 80, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}

Time needed for training:            6.130978 s
Maximum CPU memory used:             1.049934 GB
Maximum GPU memory used:             0.000000 GB
----------------------------------------------------------------------
======================================================================
Test
======================================================================
----------------------------------------------------------------------
Model evaluation for test set
Time needed for test evaluation:            7.146077 s
Maximum CPU memory used:             1.362583 GB
Maximum GPU memory used:             0.000000 GB
----------------------------------------------------------------------
GPR energy MAE (eV): 0.040727771845763525
GPR force MAE (eV/Ang): 0.29170825780360404

Saving test target to [energy_test_reference.npy] and [force_test_reference.npy]
Saving GPR prediction to [energy_test_gpr.npy], [force_test_gpr.npy], [unc_e_test_gpr.npy], and [unc_f_test_gpr.npy]


2-2. Visualize the results

energy_test_gpr = np.load("./energy_test_gpr.npy")
energy_test_reference = np.load("./energy_test_reference.npy")

force_test_gpr = np.load("./force_test_gpr.npy")
force_test_reference = np.load("./force_test_reference.npy")

unc_e_test_gpr = np.load("./unc_e_test_gpr.npy")
unc_f_test_gpr = np.load("./unc_f_test_gpr.npy")
diff_per_atom = (energy_test_reference - energy_test_gpr) / 20

print(diff_per_atom.min(), diff_per_atom.max())
-0.0037080216154208754 0.007426366634354054
fig = plt.figure(figsize=(7, 6))
ax2 = fig.subplots()

font_x = {'size': 20, 'color': 'black'}
font_y = {'size': 20, 'color': 'black'}
font_tick = {'size': 16, 'color': 'black'}


# The second plot
counts, bins = np.histogram(diff_per_atom, bins=30, range=(-0.003, 0.03))

ax2.hist(bins[:-1], bins, weights=counts, facecolor='dimgray', alpha=1.0, edgecolor='black')

ax2.set_xlabel("DFT $-$ GPR (eV/atom)", fontdict=font_x)
ax2.set_xlim([-0.03, 0.03])
x_labels = [round(label, 2) for label in ax2.get_xticks()]
ax2.set_xticks(x_labels)
ax2.set_xlim([-0.03, 0.03])
ax2.set_xticklabels(x_labels, fontdict=font_tick)

ax2.set_ylabel("Number of structures", fontdict=font_y)
ax2.set_ylim([0, 50])
y_labels = [int(label) for label in ax2.get_yticks()]
ax2.set_yticks(y_labels)
ax2.set_ylim([0, 50])
ax2.set_yticklabels(y_labels, fontdict=font_tick)

[x.set_linewidth(1.5) for x in ax2.spines.values()]
ax2.tick_params(bottom=False, top=True, left=True, right=True)
ax2.tick_params(labelbottom=True, labeltop=False, labelleft=True, labelright=False)
ax2.tick_params(direction='in', length=8, width=1.5)

ax2.grid(True, which='both', linestyle=':', linewidth=0.7, alpha=0.7)

fig.tight_layout()
plt.show()
<Figure size 700x600 with 1 Axes>

3. Uncertainty vs Error

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr

# --- Energy error vs uncertainty ---
energy_error = np.abs(energy_test_gpr - energy_test_reference)
unc_e = unc_e_test_gpr

r_energy, _ = pearsonr(energy_error, unc_e)

plt.figure(figsize=(6, 5))
plt.scatter(unc_e, energy_error, alpha=0.6, edgecolors='k')
plt.xlabel("Energy uncertainty (eV)")
plt.ylabel("Energy absolute error (eV)")
plt.title(f"Energy Error vs Uncertainty\nPearson r = {r_energy:.3f}")
plt.grid(True)
plt.tight_layout()
plt.show()
<Figure size 600x500 with 1 Axes>
# --- Force error vs uncertainty ---
force_error = np.abs(force_test_gpr - force_test_reference).reshape(-1)
unc_f = unc_f_test_gpr.reshape(-1)

r_force, _ = pearsonr(force_error, unc_f)

plt.figure(figsize=(6, 5))
plt.scatter(unc_f, force_error, alpha=0.6, edgecolors='k')
plt.xlabel("Force uncertainty (eV/Å)")
plt.ylabel("Force absolute error (eV/Å)")
plt.title(f"Force Error vs Uncertainty\nPearson r = {r_force:.3f}")
plt.grid(True)
plt.xlim(0.0, 1.0)
plt.ylim(0, 2.0)
plt.tight_layout()
plt.show()
<Figure size 600x500 with 1 Axes>

4. Augment

So, using these parameters, augment step will be executed.

! sed -i '3s|.*|# Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf|' train.in
! sed -i '25s|.*|Additional_write True|' train.in
! sed -i '28s|.*|Disp_length 0.05|' train.in
! sed -i '29s|.*|Num_copy 2|' train.in
! cat train.in
# File path
Train_file ./2_EC-EC/train_set_tutorial/file_*.xsf
# Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf

# Train model save (default: False)
# Train_model_save True

# File format (default: xsf)
File_format xsf

# Descriptor (default: cartesian coordinates)
Descriptor cart

# Kernel parameter
# scale 1.5
# weight 1.0

# Data process (default: batch, 25)
data_process batch
batch_size 25

# Flags for xsf file writing (default: False)
Train_write False
Test_write False
Additional_write True

# Data augmentation parameter
Disp_length 0.05
Num_copy 2
! rm -rf additional_xsf/
! python -m aenet_gpr train.in
======================================================================
aenet-GPR: surrogate GPR for GPR-ANN indirect force training
======================================================================

2025-10-19 17:03:57.

Developed by In Won Yeu

This program performs three main steps:
1. Train: Generates a GPR model using the provided structure, energy, and force data.
2. Test: Uses the generated GPR model to predict values for the test set structures.
3. Augmentation: Performs data augmentation in xsf file format, compatible with aenet-(PyTorch),
supporting a GPR-ANN training in conjunction with aenet-(PyTorch).

Each of these steps is executed once the input file (train.in) contains the keywords:
Train_file [train file path]
Test_file [test file path]
Additional_write [True]


======================================================================
Train
======================================================================

Read reference training data

Time needed for reading data:            0.104494 s
Maximum CPU memory used:             0.411098 GB
Maximum GPU memory used:             0.000000 GB
Energy data size: (80,)  # (N_data, )
Force data size: (80, 20, 3)  # (N_data, N_atom, 3)
----------------------------------------------------------------------
Candidate scales: tensor([0.2000, 0.4000, 0.8000])
Updated scale: 0.4000000059604645
Updated weight: 0.6186434141732067
----------------------------------------------------------------------
Model train

Training parameters
{'num_data': 80, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}

Time needed for training:            5.970094 s
Maximum CPU memory used:             1.059208 GB
Maximum GPU memory used:             0.000000 GB
----------------------------------------------------------------------
======================================================================
Augmentation
======================================================================
----------------------------------------------------------------------
Additional structure generation

Time needed for additional generation:            0.039869 s
Maximum CPU memory used:             1.059208 GB
Maximum GPU memory used:             0.000000 GB
Displacement length (Ang): 0.05
Multiple: 2
N_additional = N_reference (80) * Multiple (2) = 160
----------------------------------------------------------------------
----------------------------------------------------------------------
Model evaluation for additional set

Test parameters
{'num_data': 160, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}

Time needed for additional evaluation:            7.070997 s
Maximum CPU memory used:             1.284821 GB
Maximum GPU memory used:             0.000000 GB
----------------------------------------------------------------------

Saving GPR prediction to [energy_additional_gpr.npy], [force_additional_gpr.npy], [unc_e_additional_gpr.npy], and [unc_f_additional_gpr.npy]
======================================================================
Writing additional xsf files to additional_xsf

Time needed for writing xsf files:            0.737324 s
Maximum CPU memory used:             1.284821 GB
Maximum GPU memory used:             0.000000 GB
======================================================================

Now, 160 new data have been augmented

! cd ./additional_xsf/ && ls
file_00000.xsf	file_00032.xsf	file_00064.xsf	file_00096.xsf	file_00128.xsf
file_00001.xsf	file_00033.xsf	file_00065.xsf	file_00097.xsf	file_00129.xsf
file_00002.xsf	file_00034.xsf	file_00066.xsf	file_00098.xsf	file_00130.xsf
file_00003.xsf	file_00035.xsf	file_00067.xsf	file_00099.xsf	file_00131.xsf
file_00004.xsf	file_00036.xsf	file_00068.xsf	file_00100.xsf	file_00132.xsf
file_00005.xsf	file_00037.xsf	file_00069.xsf	file_00101.xsf	file_00133.xsf
file_00006.xsf	file_00038.xsf	file_00070.xsf	file_00102.xsf	file_00134.xsf
file_00007.xsf	file_00039.xsf	file_00071.xsf	file_00103.xsf	file_00135.xsf
file_00008.xsf	file_00040.xsf	file_00072.xsf	file_00104.xsf	file_00136.xsf
file_00009.xsf	file_00041.xsf	file_00073.xsf	file_00105.xsf	file_00137.xsf
file_00010.xsf	file_00042.xsf	file_00074.xsf	file_00106.xsf	file_00138.xsf
file_00011.xsf	file_00043.xsf	file_00075.xsf	file_00107.xsf	file_00139.xsf
file_00012.xsf	file_00044.xsf	file_00076.xsf	file_00108.xsf	file_00140.xsf
file_00013.xsf	file_00045.xsf	file_00077.xsf	file_00109.xsf	file_00141.xsf
file_00014.xsf	file_00046.xsf	file_00078.xsf	file_00110.xsf	file_00142.xsf
file_00015.xsf	file_00047.xsf	file_00079.xsf	file_00111.xsf	file_00143.xsf
file_00016.xsf	file_00048.xsf	file_00080.xsf	file_00112.xsf	file_00144.xsf
file_00017.xsf	file_00049.xsf	file_00081.xsf	file_00113.xsf	file_00145.xsf
file_00018.xsf	file_00050.xsf	file_00082.xsf	file_00114.xsf	file_00146.xsf
file_00019.xsf	file_00051.xsf	file_00083.xsf	file_00115.xsf	file_00147.xsf
file_00020.xsf	file_00052.xsf	file_00084.xsf	file_00116.xsf	file_00148.xsf
file_00021.xsf	file_00053.xsf	file_00085.xsf	file_00117.xsf	file_00149.xsf
file_00022.xsf	file_00054.xsf	file_00086.xsf	file_00118.xsf	file_00150.xsf
file_00023.xsf	file_00055.xsf	file_00087.xsf	file_00119.xsf	file_00151.xsf
file_00024.xsf	file_00056.xsf	file_00088.xsf	file_00120.xsf	file_00152.xsf
file_00025.xsf	file_00057.xsf	file_00089.xsf	file_00121.xsf	file_00153.xsf
file_00026.xsf	file_00058.xsf	file_00090.xsf	file_00122.xsf	file_00154.xsf
file_00027.xsf	file_00059.xsf	file_00091.xsf	file_00123.xsf	file_00155.xsf
file_00028.xsf	file_00060.xsf	file_00092.xsf	file_00124.xsf	file_00156.xsf
file_00029.xsf	file_00061.xsf	file_00093.xsf	file_00125.xsf	file_00157.xsf
file_00030.xsf	file_00062.xsf	file_00094.xsf	file_00126.xsf	file_00158.xsf
file_00031.xsf	file_00063.xsf	file_00095.xsf	file_00127.xsf	file_00159.xsf

Their structures are perturbed from reference training data and their energy tags are given from the GPR predictions

! cd ./additional_xsf/ && cat file_00015.xsf
# total energy = -18640.9461593190389976 eV

ATOMS
O     9.97065996106500     6.46635005812972     12.21593334522877     -1.15869724576312     -0.60309149486231     0.99615841564892
O     8.44536407201865     5.29733104422497     13.48408658363084     -0.01350280495380     0.22143818708766     -0.61780919881785
O     9.99286631347819     4.19238271088024     12.32159337159564     0.06463443556037     -0.99968307968704     -1.40632970281874
C     9.33670213066266     7.47904915079535     13.11058062527982     -4.54776510059830     -2.19826669485126     -2.57229641109970
C     7.92777366896470     6.63428687083957     13.62116515332962     6.25116583293155     0.38040007289875     0.28212693994131
C     9.46651467269076     5.20344897778359     12.55040792880843     0.64869706340766     1.90457285067633     2.08678323426103
H     8.88951953973056     8.25273585001219     12.38788003892017     1.28946179466327     -0.35490303243622     0.90213320511167
H     9.92985508661475     7.76074808189103     13.86560678502387     0.80332788132769     0.90574691147812     0.98313744800933
H     7.90108231803724     6.90346445209486     14.69564978974586     -1.31411455527912     -0.39014087070777     -0.13480631656984
H     7.21123067525057     6.67710779092105     12.90877406049722     -2.28800784198768     1.33449272352351     -0.78843168556723
O     4.91826425429386     2.44398779473527     13.37397981575701     1.66528592192142     0.56291818334518     2.01074744839687
O     3.15237912970306     2.92965434059455     12.13282488175020     0.99693884066342     -0.52550429358988     0.46907422773334
O     4.02161655331011     0.83052840552308     12.11701816223277     0.10314522771125     -0.10523794684186     0.36320142277876
C     4.72139866531235     3.84893622336680     13.55825605462893     0.50541416210727     0.52264030899472     -1.08891268021501
C     3.33330653190436     4.08486021555220     12.97254096493174     0.93287530486782     0.35551311278508     -2.01383881711453
C     4.09385604309408     1.90964341788034     12.57309440754714     -2.50850351619152     1.15358760975927     -2.12814394988642
H     5.45989277436800     4.43795605442972     12.96434307646078     0.31886911364352     -0.92397407547324     0.26722376544777
H     4.89262149610875     4.23505131046355     14.56880014519296     -0.31962292977434     -0.54357472444843     1.12998393062999
H     2.53094594244838     4.12194766025730     13.59032748793689     -1.06801779021283     0.07177053771449     1.97277280258740
H     3.22680331094396     5.02287580962462     12.35203428150133     0.55042741793405     -0.25508025082462     0.24525909385575
! cd ./additional_xsf/ && cat file_00016.xsf
# total energy = -18639.6648082992396667 eV

ATOMS
O     10.15227370342503     6.44958580651717     12.25833599680163     -3.12009724387923     0.39843798955373     1.80916286227078
O     8.42634633166613     5.26870987872721     13.43168261890704     0.33309106596194     2.06278251068965     -1.00644457039500
O     10.07431938966726     4.06763328367860     12.28310862739118     -2.17084568279310     4.57831799047725     0.93948534814079
C     9.14352045878790     7.52426161213143     13.16112073993508     1.46499884108945     -1.11849846897069     -3.64417826868910
C     7.96195922886718     6.77266820917396     13.55584194884421     1.72099610393700     -2.30784958203667     0.60615956803558
C     9.51640272207787     5.25746043737564     12.56770061403314     2.39613207853284     -4.08472419763649     -0.17682694111950
H     8.89714808707697     8.33155335402885     12.40250791091782     0.13959902431421     -0.12712446678022     0.39800009645046
H     10.00813383494060     7.79757660903536     13.70306282437868     0.05454168919526     0.40369189021505     1.50626184110737
H     7.84323126271538     6.85968730478338     14.63884905846113     -0.23303448126635     0.21487638844205     -0.10817042286214
H     7.12981728203202     6.85044936181053     12.93628718689347     -0.43311016408211     0.28111033068590     -0.39088162760505
O     4.94501688600860     2.40859896586763     13.44006717355307     0.24660198576990     -0.01754125758632     -0.31856240437557
O     3.16555973820007     2.98442404429890     12.22272752856466     0.06302623632492     -2.51592727622568     -1.65386672005491
O     3.95580912305566     0.84399281288004     12.14492543032332     -0.16139316380740     -1.16658399238769     -0.47840317454882
C     4.74467825241762     3.80452097941570     13.61567495392377     -0.24693827397360     0.04724906123076     -3.72083951737494
C     3.35947002294384     4.04359363810228     12.88388748755841     0.26069392398630     1.71072797249965     1.96301485044233
C     4.04506453414193     1.88219489587209     12.55441072670702     -0.52975442042521     2.58486030863648     0.69021117936760
H     5.47878331841619     4.42378639873902     12.96060996549916     0.47700165981299     -0.38168525547312     0.56140237501311
H     4.83918484833238     4.08553803539405     14.50428339135624     -0.03046378995507     0.07038175611235     2.21236528940847
H     2.60906550069688     4.00490471040284     13.71174641156211     0.20581146586767     0.29702369776066     -0.43513352507919
H     3.26324122453052     5.07348432176532     12.31842223438886     0.30842855608991     -1.53301908820481     0.18055175339416