from __future__ import print_function, division
import numpy as np
from ctypes import c_int, sizeof
#
#
#
[docs]class openmx_mat_c():
def __init__(self, natoms, Total_NumOrbs, FNAN, natn):
"""
Bookkeeper for the OpenMX matrices (costom sparse format from OpenMX (and Fireball?))
natoms : number of atoms in the unit cell
Total_NumOrbs : array of size (natoms+1) in which we store number of atomic orbitals per each atom. The array is one-based?
FNAN : array of size (natoms+1). the number of first nearest neighbouring atoms per atom. The array is one-based ?
natn : array of size (natoms+1,max(FNAN)+1) grobal index of neighboring atoms of an atom ct_AN
"""
assert natoms>0
self.natoms = natoms
assert len(Total_NumOrbs)==natoms+1
self.Total_NumOrbs = Total_NumOrbs
self.Total_NumOrbs_mx = max(Total_NumOrbs)
assert len(FNAN)==natoms+1
self.FNAN = FNAN
self.FNAN_mx = max(FNAN)
assert natn.shape==(natoms+1, max(FNAN)+1)
self.natn = natn
[docs] def get_dims(self):
return [self.natoms+1, self.FNAN_mx+1, self.Total_NumOrbs_mx, self.Total_NumOrbs_mx]
[docs] def fromfile(self, f, out=None, dtype=np.float):
""" Read from an open file f """
if out is None:
res = np.zeros((self.natoms+1, self.FNAN_mx+1, self.Total_NumOrbs_mx, self.Total_NumOrbs_mx), dtype=dtype)
else :
res = out
for ct_AN in range(1,self.natoms+1):
for h_AN in range(0,self.FNAN[ct_AN]+1):
for i in range(self.Total_NumOrbs[ct_AN]):
c = self.Total_NumOrbs[self.natn[ct_AN,h_AN]]
res[ct_AN,h_AN,i,0:c] = np.fromfile(f, count=c)
return res