Source code for EPWpy.Abinit.Abinit_util

# Author: Samuel Ponc\'e
# Date: 02/07/2024
# Converter of quadrupole tensor from Abinit to EPW format (Quadrupole.fmt). 

import numpy as np

[docs] class Abinit_utilities: """ This is the utility class for abinit interface """ def __init__(self, folder = 'abinit',file = 'input'): """ Utility class for Abinit """ self.fold = folder self.file = file
[docs] def quadrupole(self): """ writes the quadrupole.fmt file """ abinit2epw(f'./{self.fold}/{self.file}')
[docs] def abinit2epw(filename): quad = np.zeros((4,3,3,3)) # atoms, direction, efield, qgrad # Read the input file user_input = filename AB_file = user_input#.strip() with open(f'{AB_file}.abo','r') as N: for lines in N: tmp = lines.split() if (len(tmp) < 1): continue if (tmp[0] == 'natom' and len(tmp) == 2): natom = int(tmp[1]) break N.close() quad = np.zeros((natom,3,3,3)) # atoms, direction, efield, qgrad Found = 0 with open(f'{AB_file}.abo','r') as N: for lines in N: tmp = lines.split() if (len(tmp) < 1): continue if (tmp[0] == 'Quadrupole'): Found = 1 continue if (tmp[0] == 'efidir' and Found == 1): Found = 2 continue if (Found == 2 and tmp[0] == 'Electronic'): Found = 0 continue if (Found == 2): at = int(tmp[1]) - 1 dirc = int(tmp[2]) - 1 efield = int(tmp[0]) - 1 qgrad = int(tmp[3]) - 1 val = float(tmp[4]) if np.absolute(val) < 1E-6: val = 0.0 quad[at,dirc,efield,qgrad] = val N.close() print(' atom dir Qxx Qyy Qzz Qyz Qxz Qxy') for ii in np.arange(natom): at = ii dirc = 0 print(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) at = ii dirc = 1 print(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) at = ii dirc = 2 print(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) with open('quadrupole.fmt','w') as f: f.write(' atom dir Qxx Qyy Qzz Qyz Qxz Qxy\n') for ii in np.arange(natom): at = ii dirc = 0 f.write(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) f.write('\n') at = ii dirc = 1 f.write(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) f.write('\n') at = ii dirc = 2 f.write(' %3i %3i %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f'%(at+1, dirc+1, quad[at,dirc,0,0], quad[at,dirc,1,1], quad[at,dirc,2,2], quad[at,dirc,1,2], quad[at,dirc,0,2], quad[at,dirc,0,1],)) f.write('\n')