From 947bdf6934bfe52b888ee4415c2cb06134476163 Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Tue, 30 Jun 2026 15:49:37 +0200 Subject: [PATCH 1/7] Push get_free_energy_hessian_dev() and environment into clean tree (meson parallel not working) --- Modules/Classify.py | 784 +++++++ Modules/Ensemble.py | 261 +++ Modules/qClassify.py | 345 ++++ SCHAModules/get_gq.f90 | 75 + SCHAModules/get_ur_upsilon_matrices.f90 | 69 + SCHAModules/module_hess.f90 | 2411 ++++++++++++++++++++++ SCHAModules/module_new_thermodynamic.f90 | 27 + meson.build | 9 +- meson.build.sscha | 2 + old_setup.py | 10 +- 10 files changed, 3988 insertions(+), 5 deletions(-) create mode 100644 Modules/Classify.py create mode 100644 Modules/qClassify.py create mode 100644 SCHAModules/get_gq.f90 create mode 100644 SCHAModules/get_ur_upsilon_matrices.f90 create mode 100644 SCHAModules/module_hess.f90 diff --git a/Modules/Classify.py b/Modules/Classify.py new file mode 100644 index 000000000..f7b117c02 --- /dev/null +++ b/Modules/Classify.py @@ -0,0 +1,784 @@ +import cellconstructor as CC +import cellconstructor.Phonons +import cellconstructor.Structure +import cellconstructor.symmetries +import cellconstructor.Methods + +import SCHAModules + +#import FModules + +import spglib +import numpy as np +import sys +import time + +""" +This module contains the functions employed for the symmetry classification of atoms and +wave-vector orbits. +""" + +def map_singlet(dyn, symprec=1e-5, verbose=False): + """ + Classifies atomic singlets, and returns the atomic map for each symmetry operation. + + Parameters + ---------- + - dyn: object + Cellconstructor dynamical matrix. + - symprec: float + Tolerance parameter for spglib in symmetry detection. + Defaults to 1e-5. + - verbose: bool + If True prints information during execution. + Defaults to False. + + Returns + ------- + - mapping: np.ndarray + Atomic mapping for each symmetry operation. Dimension [Natom_sc,Nsym]. + - orbit1s: np.ndarray + Symmetry mapping for each atomic mapping. Dimension [Natom_sc,Nsym]. + - rot_cart: np.ndarray + Variable containing all the symmetry operations of the crystal. Dimension [Nsym,3,3] + - map_uc: np.ndarray + An array that works as a tool to know which index i we need to consider, taking + index j as reference (unit-cell). Dimension [Natom_sc, Natom_sc]. + - map_tr: np.ndarray + This array says which is the translation employed to map atom index i using index + j as reference (unit-cell). Dimension [Natom_sc, Natom_sc]. + - T_list: np.ndarray + Contains all the translations in unit-cell fractional units. Dimension [Nq,3]. + - T_list_frac: np.ndarray + Contains all the translations in supercell fractional units. Dimension [Nq,3]. + """ + + start_time = time.time() + sg = spglib.get_spacegroup(dyn.structure.get_spglib_cell(), symprec) + + if verbose: + print("Initial SG=", sg) + print("===== STARTING SINGLET CLASSIFICATION =====") + + spg_syms = spglib.get_symmetry(dyn.structure.get_spglib_cell(), symprec) + sym_uc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms, regolarize=False) + + Nsym = len(sym_uc) + + # Obtain number of supercells. GetSupercell returns the modulation as + # 3 dimensional list, sc_size. + sc_size = dyn.GetSupercell() + Nsupercell = np.prod(sc_size) + + # Obtain point group symmetries in cryst coord respect sc: + sym_list = np.zeros((Nsym,3,4),dtype=np.float64) + for isym in range(Nsym): + sym_list[isym,:,:] = sym_uc[isym] + for ll in range(3): # Transl respect sc + sym_list[isym,ll,3] = sym_list[isym,ll,3]/sc_size[ll] + + # Create an object from the Phonons class of the SC + dyn_sc = dyn.GenerateSupercellDyn(sc_size) + + # Get the symmetries of the supercell + spg_syms_sc = spglib.get_symmetry(dyn_sc.structure.get_spglib_cell(), symprec) + sym_list_sc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms_sc, regolarize= False) + + # Obtain symmetries that are pure translations: + translation = np.zeros((Nsupercell,3,4),dtype=np.float64) + for i in range(Nsupercell): + translation[i,:,:] = sym_list_sc[i*Nsym] # The first is always a translation + + T_list = np.empty([sc_size[0]*sc_size[1]*sc_size[2], 3], dtype=np.float64) + T_list_frac = np.empty([sc_size[0]*sc_size[1]*sc_size[2], 3], dtype=np.float64) + for Tx in range(sc_size[0]): + for Ty in range(sc_size[1]): + for Tz in range(sc_size[2]): + index = Tx*sc_size[2]*sc_size[1]+Ty*sc_size[2]+Tz + T_list[index] = np.array([Tx, Ty, Tz]) + T_list_frac[index] = np.array([Tx/sc_size[0],Ty/sc_size[1],Tz/sc_size[2]]) + + map_uc, map_tr = _map_unitcell(dyn_sc, T_list_frac) + + #Obtain the rotations in cartesian coord: + rot_cart = np.zeros((Nsym,3,3),dtype=np.float64) + for isym in range(Nsym): + rot_cart[isym] = cellconstructor.Methods.convert_matrix_cart_cryst2(sym_list[isym,:,:3], dyn.structure.unit_cell, cryst_to_cart = True) + # Set elements smaller than the threshold to 0.0 + rot_cart[isym][np.abs(rot_cart[isym]) < 1e-12] = 0.0 + + Natoms_sc = dyn_sc.structure.N_atoms + + singlet=np.zeros(1,dtype=np.intc) + singlet_sym=np.zeros(1,dtype=np.intc) + + mapping = np.zeros((Natoms_sc, Nsym), dtype='1e-12: # As a trivial constrain is a row of zeroes in R2 + nontrivial[iperm,isym,indexprime]=1 + else: + M[iperm,isym,indexprime,index]=0.0 + + for ii in range(Natoms): # Unit cell, rest of the atoms (doublets) can be achieved by translations + for jj in range(Natoms_sc): + doublet[0]=ii + doublet[1]=jj + if _doublet_in_list(doublet, all2, nall2): + continue + for ll in range(2): + ref2[nref2, ll] = doublet[ll] + nref2+=1 + if (nref2 == array_size): + ref2 = np.concatenate((ref2,ref2), axis = 0) + norbit = np.concatenate((norbit, norbit), axis = 0) + orbit2a = np.concatenate((orbit2a,orbit2a), axis = 0) + orbit2s = np.concatenate((orbit2s,orbit2s), axis = 0) + R = np.concatenate((R,R), axis = 0) + kernel = np.concatenate((kernel,kernel), axis = 0) + n_indep_fc = np.concatenate((n_indep_fc,n_indep_fc), axis = 0) + indep_fc = np.concatenate((indep_fc,indep_fc), axis = 0) + array_size<<=1 # Double the size + Nequiv=0 # Number of equiv. doublets in the orbit of this ref. doublet + equilist[:,:] = 0.0 + nconstrain = 0 # Amount of contrains for this ref. doublet + constrain[:,:] = 0.0 #Restart + for iperm in range(2): + doublet_perm[0]=doublet[permutations[iperm,0]] + doublet_perm[1]=doublet[permutations[iperm,1]] + for isym in range(Nsym): + doublet_sym = [orbit1a[doublet_perm[0],isym], orbit1a[doublet_perm[1],isym]] + if (doublet_sym[0] >= Natoms): #First atom has to be always in the first unit cell + doublet_sym[1] = map_uc[doublet_sym[0],doublet_sym[1]] + doublet_sym[0] = map_uc[doublet_sym[0],doublet_sym[0]] + if Nequiv==0 or not(_doublets_are_equal(doublet,doublet_sym) or _doublet_in_list(doublet_sym, equilist, Nequiv)): + equilist[Nequiv] = doublet_sym + orbit2a[nref2-1, Nequiv] = doublet_sym + all2[nall2] = doublet_sym + orbit2s[nref2-1, Nequiv] = [iperm,isym] + R[nref2-1,Nequiv] = Rot[iperm,isym] + Nequiv+=1 + nall2+=1 + if _doublets_are_equal(doublet,doublet_sym): + for indexprime in range(9): + if nontrivial[iperm,isym,indexprime]: #1=true + for ll in range(9): + constrain[nconstrain,ll] = M[iperm,isym,indexprime,ll] + nconstrain+=1 + + norbit[nref2-1] = Nequiv + # Gauss-Jordan Elimination for a doublet: + constrain_reduced = constrain[:max(nconstrain,9),:9] + kern, indep = _gauss_jordan(constrain_reduced) + if verbose: + print("Reference doublet: (", ii,",", jj,").") + print("Orbit size:", Nequiv,". Number of constrains:",nconstrain,". Number of independent elements:", indep.shape[0]) + print(" ") + # Save results of the elimination for this doublet: + for iaux in range(9): + for jaux in range(9): + kernel[nref2-1, iaux, jaux] = kern[iaux,jaux] + n_indep_fc[nref2-1] = indep.shape[0] + for iaux in range(indep.shape[0]): + indep_fc[nref2-1,iaux] = indep[iaux] + + if (nall2 == tot2): # All the doublets have been analyzed; exit nested loop + break + else: # This is executed if the inner loop completes without breaking + continue + break + + tensor = np.zeros((nref2,max(norbit),9,max(n_indep_fc)),dtype=np.float64) + for i in range(nref2): + for j in range(norbit[i]): + for indexprime in range(9): + for index in range(n_indep_fc[i]): + tensor[i,j,indexprime,index] = np.sum(R[i,j,indexprime,:] * kernel[i,:,index]) + + end_time = time.time() + execution_time = end_time - start_time + + if verbose: + print(" ") + print("Total doublets:", nall2) + print("Number of Orbits:",nref2) + print("Total number of independent elements:", sum(n_indep_fc[:nref2])) + print(" ") + + print("Saving null-space and rotation matrices...") + print("execution_time in doublet recognition:", execution_time, " s") + print("===== DOUBLET CLASSIFICATION and GJ ELIMINATION FINISHED ======") + print(" ") + + sys.stdout.flush() + + return(orbit2a[:nref2], orbit2s[:nref2], norbit[:nref2], indep_fc[:nref2], n_indep_fc[:nref2], tensor[:nref2]) + +def recognize_triplet(dyn, orbit1a, map_uc, symprec=1e-5, verbose=False): + """ + Classifies atomic triplets, and returns the atomic map for each symmetry operation, + as well as the required information to reconstruct the 3rd order FCs from the symmetry independent + triplets. + + Parameters + ---------- + - dyn: object + Cellconstructor dynamical matrix. + - orbit1a: np.ndarray + Atomic mapping for each symmetry operation. Dimension [Natom_sc,Nsym]. + - map_uc: An array that works as a tool to know which index i we need to consider, taking + index j as reference (unit-cell). Dimension [Natom_sc, Natom_sc]. + - symprec: float + Tolerance parameter for spglib in symmetry detection. + Defaults to 1e-5. + - verbose: bool + If True prints information during execution. + Defaults to False. + + Returns + ------- + - orbit3a: np.ndarray + Triplet mapping for each symmetry operation. Dimension [Nref3,tbd,3]. + In the second axis, valid inforation is up to the norbit[ref2]-th element. + - orbit3s: np.ndarray + Symmetry mapping for each doublet mapping. Dimension [Nref3,tbd,2]. + In the second axis, valid inforation is up to the norbit2[ref2]-th element. + - norbit: np.ndarray + Number of equivalent doublets for each of the orbits. Dimension [Nref3]. + - indep_fc: np.ndarray + Which are the independent cartesian elements from the 3x3x3 FC matrix. Dimension [Nref3,27]. + In the second axis, valid information is up to the n_indep_fc[ref2]-th element. + - n_indep_fc: np.ndarray + Number of independent cartesian elements for each reference triplet. Dimension [Nref3]. + - kernel: np.ndarray + Kernel from which we will reconstruct the 3x3x3 FC matrix, knowing just the independet + elements. Dimension [Nref3, 27, 27] + - Rot: np.ndarray + Contains all the third order cartesian symmetry operations for all permutions. + Dimension [6,Nsym,27,27] + - mapping_triplet: np.ndarray + Maps an arbitrary triplet to its reference triplet, permutaion, and symmtry operation after + the classification. Dimension [Natom,Natom_sc,Natom_sc,3] + """ + start_time = time.time() + + if verbose: + print("===== STARTING TRIPLET CLASSIFICATION =====") + + # Get the symmetries of the unit cell + spg_syms = spglib.get_symmetry(dyn.structure.get_spglib_cell(), symprec) + sym_uc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms, regolarize= False) #In crystalline coord respect uc (trans!) + nsym = len(sym_uc) + + # Obtain the Sc size (list of 3 integers) + sc_size = dyn.GetSupercell() + nsupercell = np.prod(sc_size) + + # Obtain point group symmetries in cryst coord respect sc: + sym_list = np.zeros((nsym,3,4),dtype=np.float64) + for isym in range(nsym): + sym_list[isym,:,:] = sym_uc[isym] + for ll in range(3): # Transl respect sc + sym_list[isym,ll,3] = sym_list[isym,ll,3]/sc_size[ll] + + # Create an object from the Phonons class of the SC + dyn_supercell = dyn.GenerateSupercellDyn(sc_size) + + # Get the symmetries of the supercell + spg_syms_sc = spglib.get_symmetry(dyn_supercell.structure.get_spglib_cell(), symprec) + sym_list_sc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms_sc, regolarize= False) + + # Obtain symmetries that are pure translations: + translation = np.zeros((nsupercell,3,4),dtype=np.float64) + for i in range(nsupercell): + translation[i,:,:] = sym_list_sc[i*nsym] + + + #Obtain the rotations in cartesian coord: + rot_cart = np.zeros((nsym,3,3),dtype=np.float64) + for isym in range(nsym): + rot_cart[isym] = cellconstructor.Methods.convert_matrix_cart_cryst2(sym_list[isym,:,:3], dyn.structure.unit_cell, cryst_to_cart = True) + # Set elements smaller than the threshold to 0.0 + rot_cart[isym][np.abs(rot_cart[isym]) < 1e-12] = 0.0 + + # Number of atoms + nat = dyn.structure.N_atoms + ntot = dyn_supercell.structure.N_atoms + + + permutations=np.array([[0,1,2], [1,0,2], [2,1,0], [0,2,1], [1,2,0], [2,0,1]], dtype=np.intc) + + # Initial size of array + array_size = 16 + + #Reference triplets: + ref3 = np.zeros((array_size,3),dtype=np.intc) + nref3 = 0 + + #List of all triplets: + tot3=nat*ntot**2 + nall3=0 + + #Create Rotation tensor: R_{αβγ}^{α'β'γ'}= R_{α}^{α'}*R_{β}^{β'}*R_{γ}^{γ'} + Rot = np.zeros((6,nsym,27,27),dtype=np.float64) # Following Eq. (45), 2nd index refers to a single index combining α'β'γ' + + #In order to take into account perm of indexes: + cart_index = np.zeros(3,dtype=np.intc) + for iperm in range(6): + for isym in range(nsym): + for alphaprime in range(3): + for betaprime in range(3): + for gammaprime in range(3): + indexprime = (3*alphaprime+betaprime)*3+gammaprime + for alpha in range(3): + cart_index[0] = alpha + for beta in range(3): + cart_index[1] = beta + for gamma in range(3): + cart_index[2] = gamma + index = (3*alpha+beta)*3+gamma + alphaperm=cart_index[permutations[iperm,0]] + betaperm =cart_index[permutations[iperm,1]] + gammaperm=cart_index[permutations[iperm,2]] + Rot[iperm,isym,indexprime,index] = rot_cart[isym,alphaprime,alphaperm]*rot_cart[isym,betaprime,betaperm]*rot_cart[isym,gammaprime,gammaperm] + + + #Matrix in which we apply Gauus-Jordan: M = R-I : + M=Rot.copy() + nontrivial=np.zeros((6,nsym,27),dtype=np.intc) + + for iperm in range(6): + for isym in range(nsym): + for indexprime in range(27): + M[iperm,isym,indexprime,indexprime]-=1.0 #Possible values in the diagonal of M: 0,-1,-2 + for index in range(27): + if abs(M[iperm,isym,indexprime,index])>1e-12: # As a trivial constrain is a row of zeroes in R2 + nontrivial[iperm,isym,indexprime]=1 + else: + M[iperm,isym,indexprime,index]=0.0 + + nref3 = SCHAModules.module_hess.get_nref3(nat,ntot,tot3,nsym,orbit1a,map_uc) + orbit3a, orbit3s, norbit, indep_fc, n_indep_fc, kernel, mapping_triplet = SCHAModules.module_hess.recognize_triplet(nat,ntot,tot3,nref3,nsym,orbit1a,map_uc,nontrivial,M,verbose) + + end_time = time.time() + execution_time = end_time - start_time + + # Print detailed info + if verbose: + print(" ") + print("Total triplets:", tot3) + print("Number of Orbits:", nref3) + print("Total number of independent elements:", sum(n_indep_fc[:nref3])) + print(" ") + + + print("execution_time in triplet recognition:", execution_time, " s") + print("===== TRIPLET CLASSIFICATION and GJ ELIMINATION FINISHED ======") + print(" ") + + sys.stdout.flush() + + return(orbit3a[:nref3], orbit3s[:nref3], norbit[:nref3], indep_fc[:nref3], n_indep_fc[:nref3], kernel[:nref3], Rot, mapping_triplet) + +def recognize_quadruplet(dyn, orbit1a, map_uc, verbose=False, symprec=1e-5): + """ + Classifies atomic quadruplets, and returns the atomic map for each symmetry operation, + as well as the required information to reconstruct the 4th order FCs from the symmetry independent + quadruplets. + + Parameters + ---------- + - dyn: object + Cellconstructor dynamical matrix. + - orbit1a: np.ndarray + Atomic mapping for each symmetry operation. Dimension [Natom_sc,Nsym]. + - map_uc: An array that works as a tool to know which index i we need to consider, taking + index j as reference (unit-cell). Dimension [Natom_sc, Natom_sc]. + - symprec: float + Tolerance parameter for spglib in symmetry detection. + Defaults to 1e-5. + - verbose: bool + If True prints information during execution. + Defaults to False. + + Returns + ------- + - orbit4a: np.ndarray + Triplet mapping for each symmetry operation. Dimension [Nref4,tbd,4]. + In the second axis, valid inforation is up to the norbit[ref2]-th element. + - orbit4s: np.ndarray + Symmetry mapping for each doublet mapping. Dimension [Nref4,tbd,2]. + In the second axis, valid inforation is up to the norbit4[ref4]-th element. + - norbit: np.ndarray + Number of equivalent doublets for each of the orbits. Dimension [Nref4]. + - indep_fc: np.ndarray + Which are the independent cartesian elements from the 3x3x3x3 FC matrix. Dimension [Nref4,81]. + In the second axis, valid information is up to the n_indep_fc[ref4]-th element. + - n_indep_fc: np.ndarray + Number of independent cartesian elements for each reference triplet. Dimension [Nref4]. + - kernel: np.ndarray + Kernel from which we will reconstruct the 3x3x3x3 FC matrix, knowing just the independet + elements. Dimension [Nref4, 81, 81] + - Rot: np.ndarray + Contains all the third order cartesian symmetry operations for all permutions. + Dimension [24,Nsym,81,81] + - mapping_quadruplets: np.ndarray + Maps an arbitrary triplet to its reference triplet, permutaion, and symmtry operation after + the classification. Dimension [Natom,Natom_sc,Natom_sc,3] + """ + + start_time = time.time() + + if verbose: + print("===== STARTING QUADRUPLET CLASSIFICATION =====") + + # Get the symmetries of the unit cell + spg_syms = spglib.get_symmetry(dyn.structure.get_spglib_cell(), symprec) + sym_uc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms, regolarize= False) #In crystalline coord respect uc (trans!) + nsym = len(sym_uc) + + # Obtain the Sc size (list of 3 integers) + sc_size = dyn.GetSupercell() + nsupercell = np.prod(sc_size) + + # Obtain point group symmetries in cryst coord respect sc: + sym_list = np.zeros((nsym,3,4),dtype=np.float64) + for isym in range(nsym): + sym_list[isym,:,:] = sym_uc[isym] + for ll in range(3): # Transl respect sc + sym_list[isym,ll,3] = sym_list[isym,ll,3]/sc_size[ll] + + # Create an object from the Phonons class of the SC + dyn_supercell = dyn.GenerateSupercellDyn(sc_size) + + # Get the symmetries of the supercell + spg_syms_sc = spglib.get_symmetry(dyn_supercell.structure.get_spglib_cell(), symprec) + sym_list_sc = cellconstructor.symmetries.GetSymmetriesFromSPGLIB(spg_syms_sc, regolarize= False) + + # Obtain symmetries that are pure translations: + translation = np.zeros((nsupercell,3,4),dtype=np.float64) + for i in range(nsupercell): + translation[i,:,:] = sym_list_sc[i*nsym] + + + #Obtain the rotations in cartesian coord: + rot_cart = np.zeros((nsym,3,3),dtype=np.float64) + for isym in range(nsym): + rot_cart[isym] = cellconstructor.Methods.convert_matrix_cart_cryst2(sym_list[isym,:,:3], dyn.structure.unit_cell, cryst_to_cart = True) + # Set elements smaller than the threshold to 0.0 + rot_cart[isym][np.abs(rot_cart[isym]) < 1e-12] = 0.0 + + # Number of atoms + nat = dyn.structure.N_atoms + ntot = dyn_supercell.structure.N_atoms + + tot4=nat*ntot**3 + + #Create Rotation tensor: R_{αβγ}^{α'β'γ'}= R_{α}^{α'}*R_{β}^{β'}*R_{γ}^{γ'} + Rot = np.zeros((24,nsym,81,81),dtype=np.float64) # Following Eq. (45), 2nd index refers to a single index combining α'β'γ' + #In order to take into account perm of indexes: + Rot = SCHAModules.module_hess.generate_rot4(rot_cart) + #Matrix in which we appllly Gauus-Jordan: M = R-I : + M=Rot.copy() + nontrivial=np.zeros((24,nsym,81),dtype=np.intc) + + for iperm in range(24): + for isym in range(nsym): + for indexprime in range(81): + M[iperm,isym,indexprime,indexprime]-=1.0 #Possible values in the diagonal of M: 0,-1,-2 + for index in range(81): + if abs(M[iperm,isym,indexprime,index])>1e-12: # As a trivial constrain is a row of zeroes in R2 + nontrivial[iperm,isym,indexprime]=1 + else: + M[iperm,isym,indexprime,index]=0.0 + + nref4 = SCHAModules.module_hess.get_nref4(nat,ntot,tot4,nsym,orbit1a,map_uc) + orbit4a, orbit4s, norbit, indep_fc, n_indep_fc, kernel, mapping_quadruplet = SCHAModules.module_hess.recognize_quadruplet(nat,ntot,tot4,nref4,nsym,orbit1a,map_uc,nontrivial,M,verbose) + + end_time = time.time() + execution_time = end_time - start_time + + if verbose: + print(" ") + print("Total quadruplets:", tot4) + print("Number of Orbits:",nref4) + print("Total number of independent elements:", sum(n_indep_fc[:nref4])) + print(" ") + + print("execution_time in quadruplet recognition:", execution_time, " s") + print("===== QUADRUPLET CLASSIFICATION and GJ ELIMINATION FINISHED ======") + print(" ") + return(orbit4a[:nref4], orbit4s[:nref4], norbit[:nref4], indep_fc[:nref4], n_indep_fc[:nref4], kernel[:nref4], Rot, mapping_quadruplet) + +# Small functions required in main subroutines. + +def _gauss_jordan(a): + """ + ShengBTE: Specialized version of Gaussian elimination. + """ + + EPS =1e-10 + row=a.shape[0] + col=a.shape[1] + + dependent=np.empty(col,dtype=np.intc) + independent=np.empty(col,dtype=np.intc) + b=np.zeros((col,col),dtype=np.double) + + irow=0 + ndependent=0 + nindependent=0 + for k in range(min(row,col)): + for i in range(row): + if abs(a[i,k])EPS: + for j in range(k,col): + tmp=a[irow,j] + a[irow,j]=a[i,j] + a[i,j]=tmp + if abs(a[irow,k])>EPS: + dependent[ndependent]=k + ndependent+=1 + for j in range(col-1,k,-1): + a[irow,j]/=a[irow,k] + a[irow,k]=1. + for i in range(row): + if i==irow: + continue + for j in range(col-1,k,-1): + a[i,j]-=a[i,k]*a[irow,j]/a[irow,k] + a[i,k]=0. + if irow Ry/bohr^2 + + # Generate the Phonon structure by including the odd correction + dyn_hessian = self.current_dyn.Copy() + for iq in range(len(self.current_dyn.q_tot)): + if get_full_hessian: + dyn_hessian.dynmats[iq] = self.current_dyn.dynmats[iq] + dynq_odd[iq, :, :] + else: + dyn_hessian.dynmats[iq] = dynq_odd[iq, :, :] + return dyn_hessian def compute_ensemble(self, calculator, compute_stress = True, stress_numerical = False, cluster = None, verbose = True, timer=None): diff --git a/Modules/qClassify.py b/Modules/qClassify.py new file mode 100644 index 000000000..4c1dce834 --- /dev/null +++ b/Modules/qClassify.py @@ -0,0 +1,345 @@ +import cellconstructor as CC +import cellconstructor.Phonons +import cellconstructor.Structure +import cellconstructor.symmetries +import cellconstructor.Methods + +import SCHAModules + +#import FModules + +import spglib +import numpy as np +import sys +import time + +def map_singlet(q_list, q_list_frac, rcell, rot_cart): + """ + This functions performs the mapping between the commensurate wave-vectors of the + supercell. + + Parameters + ---------- + - q_list: np.ndarray + List of wave-vectors in cartesian coordinates. Dimension [Nq,3]. + - q_list_frac: np.ndarray + List of wave-vectors in fractional coordinates. Dimension [Nq,3]. + - rcell: np.ndarray + Reciprocal unit-cell. Dimension [3,3]. + - rot_cart: np.ndarray + Point symmetry in cartesian coordinates. Dimension [Nsym,3,3]. + + Returns + ------- + - mapping: np.ndarray + The mapping between symmetry related wave-vectors for each point + point symmetry of the crystal. Dimension [Nq,Nsym] + - orbit1a: np.ndarray + Wave-vector classification in orbits. The classification is not + unique in this case, because needs to be used to construct the P + matrix (symmetry related elements appear more than once). + Dimension [Nq,tbd,1]. + - orbit1s: np.ndarray + Which symmetry makes the classification in orbits/stars of orbit1a. + Dimension [Nq,tbd,1]. + - norbit: np.ndarray + Number of wave-vectors in orbit. Dimension [Nrefq1]. + - its_zb: np.ndarray + Checks whether the points in q_list are on zone border or not. This + is later used to impose time-reversal symmetry. + """ + + q_list_frac_fixed = np.empty(q_list_frac.shape) + its_zb = np.empty(q_list_frac.shape[0], dtype=np.int8) + for qi,q in enumerate(q_list): + q_list_frac_fixed[qi] = CC.Methods.cart_to_cryst(rcell, _map_q_to_1st_bz(rcell, q)) + if np.all((np.abs(np.round(2*q_list_frac_fixed[qi], 6))%1)<1e-6): + its_zb[qi] = 0 + else: + for alpha in range(3): + if np.abs(q_list[qi,alpha])>1e-6: + if q_list[qi,alpha] > 1e-6: + its_zb[qi] = 1 # Non zone border. Positive class. + break + else: + its_zb[qi] = 2 # Non zone border. Negative class. + break + + mapping = np.zeros([len(q_list), rot_cart.shape[0]], dtype=np.int32) + for qi, q in enumerate(q_list): + for isym in range(rot_cart.shape[0]): + q_sym_cart = rot_cart[isym] @ q + q_sym_cart_1bz = _map_q_to_1st_bz(rcell, q_sym_cart) + q_sym = CC.Methods.cart_to_cryst(rcell, q_sym_cart_1bz) + match = np.all(np.abs(q_list_frac_fixed-q_sym)<1e-3, axis=1) + qii = np.where(match) + mapping[qi,isym] = qii[0][0] + + orbit1a = np.zeros([len(q_list),rot_cart.shape[0],1], dtype=np.int32) + orbit1s = np.zeros([len(q_list),rot_cart.shape[0],1], dtype=np.int32) + + # Loop over all q-points, and knowing the mapping build the star for each q-point + # All the classifications are considered (equivalents are not excluded in next iters) + + for qi in range(len(q_list)): + for isym,qsym in enumerate(mapping[qi,:]): + orbit1a[qi,isym,0] = qsym + orbit1s[qi,isym,0] = isym + return mapping, orbit1a, orbit1s, its_zb + +def recognize_doublet(q_list, mapping, verbose=False): + """ + This function classifies wave-vector doublets in orbits. + + Parameters + ---------- + - q_list: np.ndarray + List of wave-vectors in cartesian coordinates. Dimension [Nq,3]. + - mapping: np.ndarray + The mapping between symmetry related wave-vectors for each point + point symmetry of the crystal. Dimension [Nq,Nsym] + - verbose: bool + If True prints information during execution. + Defaults to False. + Returns + ------- + - orbit2a: np.ndarray + Wave-vector doublet classification in orbits. Dimension [Nrefq2,tbd,2]. + - orbit2s: np.ndarray + Which symmetry makes the classification in orbits/stars of orbit2a. + Dimension [Nrefq2,tbd,2]. + - norbit: np.ndarray + Number of wave-vectors in orbit. Dimension [Nrefq2]. + - nref2: int + Number of reference q-doublets. + """ + + start_time = time.time() + + if verbose: + print("===== STARTING Q-DOUBLET CLASSIFICATION =====") + + doublet = np.empty([2], dtype=np.int32) + doublet_sym = np.empty([2], dtype=np.int32) + doublet_perm = np.empty([2], dtype=np.int32) + + permutations = [[0,1],[1,0]] + + orbit2t = np.zeros([len(q_list)**2,len(q_list)**2,2], dtype=np.int32) + orbit2o = np.zeros([len(q_list)**2,len(q_list)**2,2], dtype=np.int32) + equilist=np.zeros([len(q_list)**2,2], dtype=np.int32) + norbit2 = np.zeros([len(q_list)**2], dtype=np.int32) + nref2 = 0 + nall2 = 0 + for qmu in range(len(q_list)): + for qnu in range(len(q_list)): + if qmu==0 and qnu == 0: + orbit2t[nref2,0,:] = [0,0] + orbit2o[nref2,0,:] = [0,0] + nref2 += 1 + nall2 += 1 + norbit2[nref2-1] += 1 + else: + doublet[:] = [qmu, qnu] + if not _doublet_in_list(doublet,equilist,nall2): + equilist[nall2] = doublet + orbit2t[nref2,0,:] = doublet + orbit2o[nref2,0,:] = [0,0] + nref2 += 1 + nall2 += 1 + norbit2[nref2-1] += 1 + else: + continue + equiv=1 + for iperm in range(len(permutations)): + doublet_perm[0] = doublet[permutations[iperm][0]] + doublet_perm[1] = doublet[permutations[iperm][1]] + for isym in range(mapping.shape[1]): + doublet_sym = np.array([mapping[doublet_perm[0],isym], mapping[doublet_perm[1],isym]], dtype=np.int32) + if not _doublet_in_list(doublet_sym,equilist,nall2): + equilist[nall2] = doublet_sym + orbit2t[nref2-1,equiv,:]=doublet_sym + orbit2o[nref2-1,equiv,:]=[iperm,isym] + equiv += 1 + nall2 += 1 + norbit2[nref2-1] += 1 + if verbose: + print(f"Reference q-doublet: ({qmu},{qnu})") + print(f"Orbit size: {equiv}\n") + + end_time = time.time() + execution_time = end_time - start_time + + if verbose: + print(" ") + print("Total q-doublets:", nall2) + print("Number of Orbits:", nref2) + print(" ") + print("execution_time in q-doublet recognition:", execution_time, " s") + print("===== Q-DOUBLET CLASSIFICATION FINISHED ======") + print(" ") + + return orbit2t[:nref2], orbit2o[:nref2], norbit2[:nref2], nref2 + + +def recognize_quadruplet(q_list, mapping, verbose=False): + """ + This function classifies wave-vector quadruplets in orbits. It is writen + if fortran. This function is just an interface. + + Parameters + ---------- + - q_list: np.ndarray + List of wave-vectors in cartesian coordinates. Dimension [Nq,3]. + - mapping: np.ndarray + The mapping between symmetry related wave-vectors for each point + point symmetry of the crystal. Dimension [Nq,Nsym] + - verbose: bool + If True prints information during execution. + Defaults to False. + Returns + ------- + - orbit4a: np.ndarray + Wave-vector doublet classification in orbits. Dimension [Nrefq4,tbd,4]. + - orbit4s: np.ndarray + Which symmetry makes the classification in orbits/stars of orbit4a. + Dimension [Nrefq4,tbd,2]. + - norbit: np.ndarray + Number of wave-vectors in orbit. Dimension [Nrefq4]. + - nrefq4: int + Number of reference q-quadruplets. + """ + + start_time = time.time() + + if verbose: + print("===== STARTING Q-QUADRUPLET CLASSIFICATION =====") + + nrefq4, norbitq4 = SCHAModules.module_hess.get_q_nref4(mapping) + orbit4a, orbit4s, norbit, nrefq4 = SCHAModules.module_hess.recognize_q_quadruplet(nrefq4, norbitq4, q_list, mapping,verbose) + + end_time = time.time() + execution_time = end_time - start_time + + if verbose: + print(" ") + print("Total q-doublets:", len(q_list)**4) + print("Number of Orbits:", nrefq4) + print(" ") + print("execution_time in q-doublet recognition:", execution_time, " s") + print("===== Q-QUADRUPLET CLASSIFICATION FINISHED ======") + print(" ") + + sys.stdout.flush() + + return orbit4a[:nrefq4], orbit4s[:nrefq4], norbit[:nrefq4], nrefq4 + +def construct_Pmn(mapping, orbit1t, orbit1o, pol_vecs, rot_cart): + """ + This function construct the P matrix. + + Parameters + ---------- + - mapping: np.ndarray + The mapping between symmetry related wave-vectors for each point + point symmetry of the crystal. Dimension [Nq,Nsym] + - orbit1a: np.ndarray + Wave-vector classification in orbits. The classification is not + unique in this case(symmetry related elements appear more than once). + Dimension [Nq,tbd,1]. + - orbit1s: np.ndarray + Which symmetry makes the classification in orbits/stars of orbit1a. + Dimension [Nq,tbd,1]. + - pol_vecs: np.ndarray + Polarization vectors used to construct the P matrix. + Dimension [Nq,Nmode,Nmode_sc] + - rot_cart: np.ndarray + Point symmetry in cartesian coordinates. Dimension [Nsym,3,3]. + Returns + ------- + - Pmn: np.ndarray + Pmn matrix. Dimension [Nq,Nmode,Nmode,Nsym] + """ + # This should go in fortran if its computationally expensive + nmodes = pol_vecs.shape[1] + nat_sc = int(pol_vecs.shape[2]/3) + nsym = rot_cart.shape[0] + rot_pol_vec = np.empty([nat_sc,3], dtype=np.complex128) + Pmn = np.empty([orbit1t.shape[0],nmodes,nmodes,nsym], dtype = np.complex128) + for si, star in enumerate(orbit1t): + for qsi in range(nsym): + isym = orbit1o[si,qsi,0] + for mu in range(nmodes): + for nu in range(nmodes): + for a in range(nat_sc): + b = mapping[a,isym] + for alpha in range(3): + ref_pol_vec = np.reshape(pol_vecs[star[0],nu,:],[nat_sc,3]) + rot_pol_vec[b, alpha] = np.matmul(rot_cart[isym,alpha,:],np.transpose(ref_pol_vec[a,:])) + Pmn[si,mu,nu,qsi] = np.matmul(np.conjugate(pol_vecs[star[qsi],mu,:]),np.transpose(np.reshape(rot_pol_vec, [nat_sc*3])))[0] + + return Pmn + +def find_degeneracies(wq): + """ + This function looks for vibrational modes with the same wave-vector modulation + and degenerate energies. + + Parameters + ---------- + - wq: np.ndarray + Eigenvalue of the dynamical matrix. Dimension [Nq,Nmode] + Returns + ------- + - degs: np.ndarray + If the i-th and j-th mode are degenerate for a given wave-vector q: + degs[qi,i,j] == True. Dimension [Nq,Nmode,Nmode]. + """ + + iq = wq.shape[0] + nmodes = wq.shape[1] + degs = np.zeros([iq,nmodes,nmodes], dtype=bool) + for q in range(iq): + for mu in range(nmodes): + for nu in range(nmodes): + if np.abs(wq[q,mu]-wq[q,nu])<1e-6: + degs[q,mu,nu]=True + return degs + +def _map_q_to_1st_bz(rcell, q_cart, atol=1e-5): + """ + Maps q_cart to the 1st BZ. + On boundary ties (e.g., equidistant points), it deterministically + prefers the vector that is lexicographically smaller in Cartesian coordinates. + """ + q_cart = np.array(q_cart).flatten() + rcell = np.array(rcell) + + inv_rcell = np.linalg.inv(rcell) + q_frac = q_cart @ inv_rcell + q_frac_wrapped = q_frac - np.round(q_frac) + + shifts = np.array([-1, 0, 1]) + grid_frac = np.stack(np.meshgrid(shifts, shifts, shifts), -1).reshape(-1, 3) + + candidate_fracs = q_frac_wrapped + grid_frac + candidate_carts = candidate_fracs @ rcell + + distances_sq = np.sum(candidate_carts**2, axis=1) + min_dist_sq = np.min(distances_sq) + + # This tolerance must be wider than the 6-digit precision of the input + is_close = np.abs(distances_sq - min_dist_sq) < atol + tied_candidates = candidate_carts[is_close] + + idx = np.lexsort((tied_candidates[:, 2], tied_candidates[:, 1], tied_candidates[:, 0])) + + return tied_candidates[idx[0]] + +def _doublet_in_list(doublet, llist, nlist): + """ + Return True if doublet is found in llist[:,:nlist]. + """ + return any(np.all(doublet == llist[:nlist, :], axis=1)) + # axis = 1 along rows + # any() function returns True if any element of an iterable is True \ No newline at end of file diff --git a/SCHAModules/get_gq.f90 b/SCHAModules/get_gq.f90 new file mode 100644 index 000000000..5510559fe --- /dev/null +++ b/SCHAModules/get_gq.f90 @@ -0,0 +1,75 @@ + +subroutine get_gq (a, wr, transmode, T, g, da, n_mode, iq) + + use thermodynamic + implicit none + + + double precision, dimension(iq, n_mode), intent(in) :: a, wr + logical, dimension(iq, n_mode), intent(in) :: transmode + double precision, intent(in) :: T + double precision, dimension(iq, iq, n_mode,n_mode), intent(out) :: g + + integer :: mu, nu, iq, qmu, qnu + integer :: n_mode + double precision, dimension(iq,n_mode), intent(out) :: da + + logical, parameter :: debug = .false. + + + if (debug) then + print *, "=== DEBUG GET_G ===" + print *, "N_MODE:", n_mode + call flush() + end if + + call w_to_daq(wr, T, da, iq, n_mode) + + ! do i=1, iq + ! print*, da(iq,:) + ! end do + + ! Calculate the matrix g that will enter in the final equation + do qmu = 1, iq + do mu = 1, n_mode + do qnu = 1, iq + do nu = 1, n_mode + if (transmode(qmu, mu) .or. transmode(qnu, nu)) then + g(qmu, qnu, mu, nu) = 0.0d0 + + else + ! 2. Calculate the difference between the two frequencies + ! We use a relative difference (abs(w1-w2)/w2) to be scale-independent + if (abs(wr(qmu, mu) - wr(qnu, nu)) < 0.00001d0 * wr(qnu, nu)) then + + ! DEGENERACY CASE: Frequencies are so close that we must use the Limit + ! This handles both (qmu,mu)==(qnu,nu) AND different modes with same frequency + g(qmu, qnu, mu, nu) = da(qmu, mu) / (wr(qmu, mu) * a(qmu, mu)**3.0d0) + + else + ! GENERAL CASE: Frequencies are different enough to divide safely + g(qmu, qnu, mu, nu) = (a(qmu, mu)**2.0d0 - a(qnu, nu)**2.0d0) / & + (wr(qmu, mu)**2.0d0 - wr(qnu, nu)**2.0d0) / & + (a(qnu, nu)**2.0d0 * a(qmu, mu)**2.0d0) + end if + end if +! if (transmode(qmu, mu) .or. transmode(qnu, nu)) then +! g(qmu, qnu, mu,nu) = 0.0d0 +! else if ((mu .eq. nu) .and. (qmu .eq. qnu)) then +! g(qmu, qnu, mu,nu) = da(qmu, mu) / wr(qmu, mu) / a(qmu, mu)**3.0d0 +! else if & +! (((mu .ne. nu ) .or. (qmu .ne. qnu)) .and. abs((wr(qmu, mu)-wr(qnu, nu))/wr(qnu, nu)) .lt. 0.00001d0) then +! !g(mu,nu) = 0.0d0 +! g(qmu, qnu, mu,nu) = da(qmu, mu) / wr(qmu, mu) / a(qmu, mu)**3.0d0 +! else +! g(qmu, qnu, mu,nu) = (a(qmu, mu)**2.0d0 - a(qnu, nu)**2.0d0) / & +! (wr(qmu, mu)**2.0d0 - wr(qnu, nu)**2.0d0) / & +! ( a(qnu, nu)**2.0d0 * a(qmu, mu)**2.0d0 ) +! end if + end do + end do + end do + end do + + end subroutine get_gq + \ No newline at end of file diff --git a/SCHAModules/get_ur_upsilon_matrices.f90 b/SCHAModules/get_ur_upsilon_matrices.f90 new file mode 100644 index 000000000..c39841491 --- /dev/null +++ b/SCHAModules/get_ur_upsilon_matrices.f90 @@ -0,0 +1,69 @@ +! This subroutine calculates the rotated displacement and +! upsilon matrices needed for the third order force constants + +subroutine get_ur_upsilon_matrices (a, er, transmode, amass, ityp_sc, u, & + ur, eprod, nat_sc, n_mode, n_random, ntyp) + + use omp_lib + use stochastic + implicit none + + double precision, dimension(n_mode), intent(in) :: a + double precision, dimension(nat_sc,n_mode,3), intent(in) :: er + logical, dimension(n_mode), intent(in) :: transmode + double precision, dimension(ntyp), intent(in) :: amass + integer, dimension(nat_sc), intent(in) :: ityp_sc + double precision, dimension(n_random,nat_sc,3), intent(in) :: u + double precision, dimension(n_random,n_mode), intent(out) :: ur + double precision, dimension(n_mode,n_mode), intent(out) :: eprod + + integer :: nat_sc, n_mode, n_random, ntyp + + double precision, dimension(:,:), allocatable :: e, u2 + + integer :: i, j, mu, alpha + integer :: ka + + allocate(e(n_mode,n_mode)) + allocate(u2(n_random,n_mode)) + + ! Calculate e polarization vectors with lengths and masses + + do mu = 1, n_mode + ka = 0 + do i = 1, nat_sc + do alpha = 1, 3 + ka = ka + 1 + if (transmode(mu)) then + e(mu,ka) = 0.0d0 + else + e(mu,ka) = er(i,mu,alpha) * sqrt(amass(ityp_sc(i))) / a(mu) + end if + end do + end do + end do + + ! Get displacements in a rank two tensor + + ka = 0 + + do i = 1, nat_sc + do alpha = 1, 3 + ka = ka + 1 + u2(:,ka) = u(:,i,alpha) + end do + end do + + ! Calculate product between two e matrices + ! eprod is the Upsilon matrix (see Raffaello's paper) + call dgemm('T','N',n_mode,n_mode,n_mode,1.0d0,e,n_mode,& + e,n_mode,0.0d0,eprod,n_mode) + + ! Rotate displacementes + ! Here ur are Upsilon * u2 + call dgemm('N', 'T', n_random, n_mode, n_mode, 1.0d0, & + u2, n_random, eprod, n_mode, 0.0d0, ur, n_random) + + deallocate(e, u2) + + end subroutine get_ur_upsilon_matrices diff --git a/SCHAModules/module_hess.f90 b/SCHAModules/module_hess.f90 new file mode 100644 index 000000000..e0a578bed --- /dev/null +++ b/SCHAModules/module_hess.f90 @@ -0,0 +1,2411 @@ +! This subroutine calculates the stochastic average of an element of the +! third order force constants based on fu2 and lmat. +! The force constants element is given with three indexes that correspond +! to atom-cartesian coordinates. +! +! NOTE: there is a first addend that is not implemented at the moment +! because it should be zero if the odd correction is calculated +! at the atomic positions that minimize the gradient with respect +! to Wyckoff positions. This non-implemented addend vanishes +! if positions are fixed by symmetry. +! Version de get_v3_element_sym pero guardando datos en una matrix auxiliar + +module module_hess + +use omp_lib +implicit none + +contains + +subroutine get_v3_red(nat, norbit3, orbit3t, orbit3o, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, & + ur, eprod, f, rho, log_err, s_cart, irt, translations_irt, v3_red, ref_3fc, & + nref3, dim2, nat_sc, n_mode, n_random, nr, nperm, nsym) + + use stochastic + implicit none + + integer, intent(in) :: nat + integer, dimension(nref3), intent(in) :: norbit3, n_indep_3fc_elem + integer, dimension(nref3,dim2,3), intent(in) :: orbit3t + integer, dimension(nref3,dim2,2), intent(in) :: orbit3o + double precision, dimension(nref3,27,27), intent(in) :: kernel_3fc + double precision, dimension(nperm, nsym, 27, 27), intent(in) :: rot_3fc + integer, dimension(nref3,27), intent(in) :: indep_3fc_elem + + double precision, dimension(n_random,n_mode), intent(in) :: ur + double precision, dimension(n_mode,n_mode), intent(in) :: eprod + double precision, dimension(n_random,nat_sc,3), intent(in) :: f + double precision, dimension(n_random), intent(in) :: rho + character (len=10), intent(in) :: log_err + double precision, dimension(3,3,48), intent(in) :: s_cart + integer, dimension(48,nat_sc), intent(in) :: irt + integer, dimension(nat_sc,nr), intent(in) :: translations_irt + + double precision, dimension(nat*3,nat_sc*3,nat_sc*3), intent(out) :: v3_red + double precision, dimension(nref3, 27), intent(out) :: ref_3fc + + integer :: nref3, dim2, nat_sc, n_mode, n_random, nr, nperm, nsym + double precision :: v3 + double precision, dimension(maxval(n_indep_3fc_elem)) :: indep_3fc + double precision, dimension(27) :: tmp_ref_3fc + double precision, dimension(27) :: aux_3fc + + integer :: ref3, equiv, nat1, nat2, nat3, i, alpha, beta, gamma, ind1, ind2, ind3, comb_ind1, comb_ind2, index, iperm, isym + + + indep_3fc = 0 ! We need to initialise it to zero. + ref_3fc = 0 + tmp_ref_3fc = 0 + v3_red = 0 + aux_3fc = 0 + + !$omp parallel private (equiv, i, nat1, nat2, nat3, alpha, beta, gamma, v3, indep_3fc, tmp_ref_3fc) + !$omp do schedule (dynamic, 1) private (ind1, comb_ind1, ind2, comb_ind2, ind3, index, iperm, isym, aux_3fc) + do ref3 = 1, nref3 + do equiv = 1, norbit3(ref3) + nat1 = orbit3t(ref3,equiv,1) + nat2 = orbit3t(ref3,equiv,2) + nat3 = orbit3t(ref3,equiv,3) + if (equiv == 1) then + do i = 1, n_indep_3fc_elem(ref3) + alpha = indep_3fc_elem(ref3,i)/9 + beta = mod(indep_3fc_elem(ref3,i),9)/3 + gamma = mod(indep_3fc_elem(ref3,i),3) + call get_v3_element_sym(3*nat1+alpha, 3*nat2+beta, 3*nat3+gamma, & + ur, eprod, f, rho, log_err, nsym, s_cart, irt, translations_irt, v3, & + nat_sc, n_mode, n_random, nr) + indep_3fc(i) = v3 + call dgemv('N', 27, n_indep_3fc_elem(ref3), 1.0d0, & + kernel_3fc(ref3, :, :n_indep_3fc_elem(ref3)), 27, & + indep_3fc(:n_indep_3fc_elem(ref3)), 1, 0.0d0, tmp_ref_3fc, 1) + ref_3fc(ref3, :) = tmp_ref_3fc + end do + do ind1 = 0, 2 + comb_ind1 = 3*nat1+ind1+1 + do ind2 = 0, 2 + comb_ind2 = 3*nat2+ind2+1 + do ind3 = 0, 2 + index = (3*ind1+ind2)*3+ind3+1 + v3_red(comb_ind1, comb_ind2, 3*nat3+ind3+1) = & + ref_3fc(ref3, index) + end do + end do + end do + else + iperm = orbit3o(ref3, equiv, 1)+1 + isym = orbit3o(ref3, equiv, 2)+1 + call dgemv('N', 27, 27, 1.0d0, rot_3fc(iperm,isym,:,:), 27, ref_3fc(ref3,:), 1, & + 0.0d0, aux_3fc, 1) + do ind1 = 0, 2 + comb_ind1 = 3*nat1+ind1+1 + do ind2 = 0, 2 + comb_ind2 = 3*nat2+ind2+1 + do ind3 = 0, 2 + index = (3*ind1+ind2)*3+ind3+1 + v3_red(comb_ind1, comb_ind2, 3*nat3+ind3+1) = aux_3fc(index) + end do + end do + end do + end if + end do + end do + !$omp end do + !$omp end parallel + end subroutine get_v3_red + +subroutine get_ref3fc(nat, orbit3t, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc,& + ur, eprod, f, rho, log_err, s_cart, irt, translations_irt, verbose, ref_3fc, & + nref3, dim2, nat_sc, n_mode, n_random, nr, nperm, nsym) + + use stochastic + implicit none + + integer, intent(in) :: nat + integer, dimension(nref3), intent(in) :: n_indep_3fc_elem + integer, dimension(nref3,dim2,3), intent(in) :: orbit3t + double precision, dimension(nref3,27,27), intent(in) :: kernel_3fc + double precision, dimension(nperm, nsym, 27, 27), intent(in) :: rot_3fc + integer, dimension(nref3,27), intent(in) :: indep_3fc_elem + + double precision, dimension(n_random,n_mode), intent(in) :: ur + double precision, dimension(n_mode,n_mode), intent(in) :: eprod + double precision, dimension(n_random,nat_sc,3), intent(in) :: f + double precision, dimension(n_random), intent(in) :: rho + character (len=10), intent(in) :: log_err + double precision, dimension(3,3,48), intent(in) :: s_cart + integer, dimension(48,nat_sc), intent(in) :: irt + integer, dimension(nat_sc,nr), intent(in) :: translations_irt + + logical, intent(in) :: verbose + + double precision, dimension(nref3, 27), intent(out) :: ref_3fc + + integer :: nref3, dim2, nat_sc, n_mode, n_random, nr + double precision :: v3 + double precision, dimension(maxval(n_indep_3fc_elem)) :: indep_3fc + double precision, dimension(27) :: tmp_ref_3fc + + integer :: ref3, nat1, nat2, nat3, i, alpha, beta, gamma, nperm, nsym + + + indep_3fc = 0 ! We need to initialise it to zero. + ref_3fc = 0 + tmp_ref_3fc = 0 + + if (verbose) then + print *, "======================= get_ref3fc() ======================= " + print *, "Computing the independent elements for the third order FCs." + end if + + !$omp parallel private (i, nat1, nat2, nat3, alpha, beta, gamma, v3, indep_3fc, tmp_ref_3fc) + !$omp do schedule (dynamic, 1) private (v3, indep_3fc, tmp_ref_3fc) + do ref3 = 1, nref3 + !debugging parallel installation + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + print *, "Iteration ", ref3, "executed by thread ", omp_get_thread_num() + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + nat1 = orbit3t(ref3,1,1) + nat2 = orbit3t(ref3,1,2) + nat3 = orbit3t(ref3,1,3) + do i = 1, n_indep_3fc_elem(ref3) + alpha = indep_3fc_elem(ref3,i)/9 + beta = mod(indep_3fc_elem(ref3,i),9)/3 + gamma = mod(indep_3fc_elem(ref3,i),3) + call get_v3_element_sym(3*nat1+alpha, 3*nat2+beta, 3*nat3+gamma, & + ur, eprod, f, rho, log_err, nsym, s_cart, irt, translations_irt, v3, & + nat_sc, n_mode, n_random, nr) + indep_3fc(i) = v3 + call dgemv('N', 27, n_indep_3fc_elem(ref3), 1.0d0, & + kernel_3fc(ref3, :, :n_indep_3fc_elem(ref3)), 27, & +indep_3fc(:n_indep_3fc_elem(ref3)), 1, 0.0d0, tmp_ref_3fc, 1) + ref_3fc(ref3, :) = tmp_ref_3fc + end do + end do + !$omp end do + !$omp end parallel + if (verbose) then + print *, "======================= DONE =======================" + print *, "" + end if +end subroutine get_ref3fc + +subroutine get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, & + ur, eprod, f, rho, log_err, s_cart, irt, translations_irt, verbose, ref_4fc, & + nref4, dim2, nat_sc, n_mode, n_random, nr, nperm, nsym) + + use stochastic + implicit none + + integer, dimension(nref4), intent(in) :: n_indep_4fc_elem + integer, dimension(nref4,dim2,4), intent(in) :: orbit4t + double precision, dimension(nref4,81,81), intent(in) :: kernel_4fc + double precision, dimension(nperm, nsym, 81, 81), intent(in) :: rot_4fc + integer, dimension(nref4,81), intent(in) :: indep_4fc_elem + + double precision, dimension(n_random,n_mode), intent(in) :: ur + double precision, dimension(n_mode,n_mode), intent(in) :: eprod + double precision, dimension(n_random,nat_sc,3), intent(in) :: f + double precision, dimension(n_random), intent(in) :: rho + character (len=10), intent(in) :: log_err + double precision, dimension(3,3,48), intent(in) :: s_cart + integer, dimension(48,nat_sc), intent(in) :: irt + integer, dimension(nat_sc,nr), intent(in) :: translations_irt + + logical, intent(in) :: verbose + double precision, dimension(nref4, 81), intent(out) :: ref_4fc + + integer :: nref4, dim2, nat_sc, n_mode, n_random, nr + double precision :: v4 + double precision, dimension(maxval(n_indep_4fc_elem)) :: indep_4fc + double precision, dimension(81) :: tmp_ref_4fc + + integer :: ref4, equiv, nat1, nat2, nat3, nat4, i, alpha, beta, gamma, delta + integer :: nperm, nsym + + + indep_4fc = 0 ! We need to initialise it to zero. + ref_4fc = 0 + tmp_ref_4fc = 0 + + if (verbose) then + print *, "======================= get_ref4fc() ======================= " + print *, "Computing the independent elements for the 4th order FCs." + end if + + !$omp parallel private (i, nat1, nat2, nat3, nat4, alpha, beta, gamma, delta) + !$omp do schedule (dynamic, 1) private (v4, indep_4fc, tmp_ref_4fc) + do ref4 = 1, nref4 + nat1 = orbit4t(ref4,1,1) + nat2 = orbit4t(ref4,1,2) + nat3 = orbit4t(ref4,1,3) + nat4 = orbit4t(ref4,1,4) + do i = 1, n_indep_4fc_elem(ref4) + alpha = indep_4fc_elem(ref4,i)/27 + beta = mod(indep_4fc_elem(ref4,i),27)/9 + gamma = mod(mod(indep_4fc_elem(ref4,i),27),9)/3 + delta = mod(indep_4fc_elem(ref4,i),3) + call get_v4_element_sym(3*nat1+alpha, 3*nat2+beta, 3*nat3+gamma, 3*nat4+delta, & +ur, eprod, f, rho, log_err, nsym, s_cart, irt, translations_irt, v4, & +nat_sc, n_mode, n_random, nr) + indep_4fc(i) = v4 + call dgemv('N', 81, n_indep_4fc_elem(ref4), 1.0d0, & + kernel_4fc(ref4, :, :n_indep_4fc_elem(ref4)), 81, & +indep_4fc(:n_indep_4fc_elem(ref4)), 1, 0.0d0, tmp_ref_4fc, 1) + ref_4fc(ref4, :) = tmp_ref_4fc + end do + end do + !$omp end do + !$omp end parallel + if (verbose) then + print *, "======================= DONE =======================" + print *, "" + end if +end subroutine get_ref4fc + +subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1,& + n_mode_sc,n_mode,iq,nperm,nsym,nref3,nrefq2,dimq2,nat,nat_sc) + + implicit none + + integer, dimension(nrefq2,dimq2,2), intent(in) :: refq2 + + complex, dimension(iq, n_mode, n_mode_sc), intent(in) :: pol_vecs + + double precision, dimension(nperm, nsym, 27, 27), intent(in) :: rot_3fc + double precision, dimension(nref3, 27), intent(in) :: ref_3fc + + integer, dimension(nat,nat_sc,nat_sc,3), intent(in) :: mapping_triplet + + logical, intent(in) :: verbose + + complex, dimension(nrefq2, n_mode, n_mode, n_mode), intent(out) :: v1 + + double precision, dimension(27) :: aux_3fc + integer :: n_mode_sc, n_mode, ns, qmu, qnu, mu, nu, at3, iq, index, nrefq2, dimq2, i,j, rq2 + integer :: nperm,nsym,nref3,ref3,equiv,iperm,isym,a,b,c,alpha,beta,gamma,nat,nat_sc + complex, dimension(:), allocatable :: laux1, laux2 + complex, dimension(:,:), allocatable :: lres1 + + logical, parameter :: debug = .false. + + ns = n_mode_sc + + ! Allocate stuff + + allocate(lres1(n_mode,n_mode_sc)) + allocate(laux1(n_mode_sc)) + allocate(laux2(n_mode_sc)) + + if (verbose) then + print*, "======================= get_ref_vsq() =======================" + print*, "Computing all reference V_{a}^{\alpha}(q1,q2)." + end if + v1 = 0 + !$omp parallel private (qmu,qnu,at3,a,alpha,mu,laux1,lres1,ref3,equiv,iperm,isym,i,j) + !$omp do schedule (dynamic, 1) private (b,c,aux_3fc,beta,gamma,index,nu,laux2) + do rq2 = 1, nrefq2 + qmu = refq2(rq2,1,1) + qnu = refq2(rq2,1,2) + do at3 = 1, n_mode + a = (at3-1)/3 + alpha = mod(at3-1,3) + lres1(:,:) = (0.0d0, 0.0d0) + do b = 0, nat_sc-1 + do c = 0, nat_sc-1 + ref3 = mapping_triplet(a+1,b+1,c+1,1)+1 + iperm = mapping_triplet(a+1,b+1,c+1,2)+1 + isym = mapping_triplet(a+1,b+1,c+1,3)+1 + aux_3fc = 0.0d0 + do j = 1, 27 + do i = 1, 27 + aux_3fc(i) = aux_3fc(i) + & +rot_3fc(iperm, isym, i, j) * ref_3fc(ref3, j) + end do + end do + do mu = 1, n_mode + do beta = 0, 2 + do gamma = 0, 2 + index = & +(3*alpha+beta)*3+gamma+1 + lres1(mu,3*c+gamma+1) = & +lres1(mu,3*c+gamma+1) + aux_3fc(index) * pol_vecs(qmu+1,mu,3*b+beta+1) + end do + end do + end do + end do + end do + do mu = 1, n_mode + do nu = 1, n_mode + laux2 = CONJG(pol_vecs(qnu+1,nu,:)) + v1(rq2, at3, mu, nu) = sum(lres1(mu,:)*laux2) + end do + end do + end do + end do + !$omp end do + !$omp end parallel + if (verbose) then + print*, "======================= DONE =======================" + print*, "" + endif + deallocate(laux1) + deallocate(lres1) + deallocate(laux2) + +end subroutine get_ref_vsq + +subroutine get_all_vsq(pol_vecs, v3_red, map_uc, vs, iq, n_mode, n_mode_sc, nat_sc) + + implicit none + + complex(8), dimension(iq,n_mode,n_mode_sc), intent(in) :: pol_vecs + double precision, dimension(n_mode,n_mode_sc,n_mode_sc), intent(in) :: v3_red + + integer, dimension(nat_sc, nat_sc), intent(in) :: map_uc + + complex(8), dimension(n_mode_sc,iq,iq,n_mode,n_mode), intent(out) :: vs + + + integer :: iq, n_mode, n_mode_sc, nat_sc, nat + + integer :: q1,q2,mu1,mu2,a,b,c,at,bt,ct + integer :: alpha,beta,gamma + + vs = 0.0d0 + do concurrent(q1=1:iq,q2=1:iq) + do concurrent(mu1=1:n_mode,mu2=1:n_mode) + do concurrent(at=1:nat_sc,bt=1:nat_sc,ct=1:nat_sc) + a = map_uc(at,at)+1 + b = map_uc(at,bt)+1 + c = map_uc(at,ct)+1 + do concurrent(alpha=1:3,beta=1:3,gamma=1:3) + vs(3*(at-1)+alpha,q1,q2,mu1,mu2)=vs(3*(at-1)+alpha,q1,q2,mu1,mu2)+& +v3_red(3*(a-1)+alpha,3*(b-1)+beta,3*(c-1)+gamma)*& +pol_vecs(q1,mu1,3*(bt-1)+beta)*conjg(pol_vecs(q2,mu2,3*(ct-1)+gamma)) + end do + end do + end do + end do + +end subroutine get_all_vsq + +subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose,& + v1,n_mode_sc,n_mode,iq,nperm,nsym,nref4,nrefq4,dimq4,nat,nat_sc) + + implicit none + + integer, dimension(nrefq4,dimq4,4), intent(in) :: refq4 + + complex(8), dimension(iq, n_mode, n_mode_sc), intent(in) :: pol_vecs + + double precision, dimension(nperm, nsym, 81, 81), intent(in) :: rot_4fc + double precision, dimension(nref4, 81), intent(in) :: ref_4fc + + integer, dimension(nat,nat_sc,nat_sc,nat_sc,3), intent(in) :: mapping_quadruplet + + logical, intent(in) :: verbose + + complex(8), dimension(nrefq4, n_mode, n_mode, n_mode, n_mode), intent(out) :: v1 + + double precision, dimension(81) :: aux_4fc + double precision, dimension(3,3,3,3) :: aux_4fc_3 + + complex(8), dimension(9,9) :: aux_4fc_ij + integer :: n_mode_sc, n_mode, ns, q1, q2, q3, q4, iq, nrefq4, dimq4, ii, jj, rq4 + integer :: nperm,nsym,nref4,ref4,iperm,isym,at,bt,ct,dt,alpha,beta,gamma,delta,nat,nat_sc + integer :: mu1,mu2,mu3,mu4,a,b,c,d + + double precision, parameter :: pi = 4.0d0*atan(1.0d0) + double precision :: tstart, tend + complex(8), parameter :: j = (0.0d0, 1.0d0) + complex(8), dimension(n_mode*n_mode,n_mode*n_mode) :: vflat + complex(8), dimension(nat_sc,n_mode*n_mode,n_mode*n_mode) :: vtmp + complex(8), dimension(9,n_mode*n_mode) :: tmp + complex(8), dimension(nat_sc*nat_sc,9,n_mode*n_mode) :: L, R + + if (verbose) then + tstart = omp_get_wtime() + print*, "======================= get_ref_wsq() =======================" + print*, "Computing the", nrefq4, "reference W(-q1,q2,q3,-q4)." + print*, "This might take some time..." + end if + + ns = n_mode_sc + + v1 = 0.0d0 + tstart = omp_get_wtime() + do rq4 = 1, nrefq4 + q1 = refq4(rq4,1,1)+1 + q2 = refq4(rq4,1,2)+1 + q3 = refq4(rq4,1,3)+1 + q4 = refq4(rq4,1,4)+1 + !$omp parallel private (bt,alpha,beta) + !$omp do schedule (static) private (mu1,mu2) + do at = 1, nat_sc + do bt=1, nat_sc + do alpha = 1, 3 + do mu1 = 1, n_mode + do beta = 1, 3 + do mu2 = 1, n_mode + L(nat_sc*(at-1)+bt,3*(alpha-1)+beta,n_mode*(mu1-1)+mu2) = & +CONJG(pol_vecs(q1,mu1,3*(at-1)+alpha))*pol_vecs(q2,mu2,3*(bt-1)+beta) + end do + end do + end do + end do + end do + end do + !$omp end do + !$omp end parallel + !$omp parallel private (dt,gamma,delta) + !$omp do schedule (static) private (mu3,mu4) + do ct=1, nat_sc + do dt=1, nat_sc + do gamma = 1, 3 + do mu3 = 1, n_mode + do delta = 1, 3 + do mu4 = 1, n_mode + R(nat_sc*(ct-1)+dt,3*(gamma-1)+delta,n_mode*(mu3-1)+mu4) = & +pol_vecs(q3,mu3,3*(ct-1)+gamma)*conjg(pol_vecs(q4,mu4,3*(dt-1)+delta))!*phase + end do + end do + end do + end do + end do + end do + !$omp end do + !$omp end parallel + vflat = 0.0d0 + tmp = 0.0d0 + do a = 1, nat + vtmp = 0.0d0 + !$omp parallel private (c,d,tmp,ref4,iperm,isym,aux_4fc,aux_4fc_ij) + !$omp do schedule (static) private (alpha,beta,gamma,delta) + do b=1, nat_sc + do c=1, nat_sc + do d=1, nat_sc + ref4 = mapping_quadruplet(a,b,c,d,1)+1 + iperm = mapping_quadruplet(a,b,c,d,2)+1 + isym = mapping_quadruplet(a,b,c,d,3)+1 + aux_4fc=0.0d0 + call dgemv( & +'N',81,81,1.0d0,rot_4fc(iperm,isym,:,:),81,ref_4fc(ref4,:),1,0.0d0,aux_4fc,1) + do alpha= 1, 3 + do beta = 1, 3 + do gamma = 1, 3 + do delta = 1, 3 + aux_4fc_ij(3*(alpha-1)+beta,3*(gamma-1)+delta) = & +aux_4fc(3*(3*(3*(alpha-1)+beta-1)+gamma-1)+delta) + end do + end do + end do + end do + call zgemm( & +'N','N', 9, n_mode*n_mode, 9, (1.0d0,0.0d0), aux_4fc_ij, 9, R(nat_sc*(c-1)+d,:,:), 9, (0.0d0,0.0d0), tmp, 9) + call zgemm( & +'T','N', n_mode*n_mode, n_mode*n_mode, 9, (1.0d0,0.0d0), L(nat_sc*(a-1)+b,:,:), 9, tmp, 9, & +(1.0d0,0.0d0), vtmp(b,:,:), n_mode*n_mode) + end do + end do + end do + !$omp end do + !$omp end parallel + vflat = vflat + sum(vtmp, dim=1)*iq + end do + do mu1=1,n_mode + do mu2=1,n_mode + do mu3=1,n_mode + do mu4=1,n_mode + v1(rq4,mu1,mu2,mu3,mu4) = vflat(n_mode*(mu1-1)+mu2,n_mode*(mu3-1)+mu4) + end do + end do + end do + end do + end do + if (verbose) then + tend = omp_get_wtime() + print*, "Elapsed time inside get_ref_wsq():", tend-tstart + print*, "======================= DONE =======================" + print*, "" + endif +end subroutine get_ref_wsq + +subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & +wsq_scf, nrefq4, n_mode, iq, dimq4, nsym) + + implicit none + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(in) :: wsq1 + + double precision, dimension(iq, iq, n_mode, n_mode), intent(in) :: F + + integer, dimension(nrefq4,dimq4,4), intent(in) :: refq4 + integer, dimension(nrefq4,dimq4,2), intent(in) :: refq4o + integer, dimension(nrefq4), intent(in) :: norbitq4 + + complex(8), dimension(iq, n_mode, n_mode, nsym), intent(in) :: P + logical, dimension(iq, n_mode, n_mode), intent(in) :: degs + logical, intent(in) :: verbose + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(out) :: wsq_scf + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode) :: wsq2 + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode) :: wsqn + + double precision :: tstart, tend + + integer, dimension(12,4) :: perms + integer, dimension(4) :: nunu, lala, mumu1, mumu2 + integer :: nrefq4, n_mode, iq, dimq4, nsym + integer :: mu1,mu2,mu3,mu4,mu5,mu6,iter + integer :: rq4_0,rq4_1,rq4_2,q4i_1,q4i_2,q1,q2,q3,q4,q5_1,q6_1,q5_2,q6_2 + integer :: q1_ref, q2_ref, q3_ref, q4_ref, q5_1ref, q5_2ref, q6_1ref, q6_2ref + integer :: nu1,nu2,nu5,nu6,lambda3,lambda4,lambda5,lambda6 + integer :: q10,q20,q30,q40,q5,q6,iperm_1,iperm_2,isym_1,isym_2 + + complex(8) :: ktea1, ktea2, W1, W2 + double precision, parameter :: eps = 1e-6 + integer, parameter :: maxiter = 50 + + perms = reshape([ & + 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & + 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & + [12,4], order=[2,1]) + + if (verbose) then + tstart = omp_get_wtime() + print*, "======================= get_scf_wsq() =======================" + print*, "Self-consintent loop to compute \Theta(-q1,q2,q3,-q4)." + print*, "" + end if + wsq_scf = wsq1 + do1 : do iter = 1, maxiter + if (verbose) then + print*, " Iteration", iter + end if + if (iter == 1) then + wsq2 = wsq1 + else + wsq2 = wsqn + end if + wsqn = (0.0d0,0.0d0) + do rq4_0 = 1, nrefq4 + q10 = refq4(rq4_0,1,1)+1 + q20 = refq4(rq4_0,1,2)+1 + q30 = refq4(rq4_0,1,3)+1 + q40 = refq4(rq4_0,1,4)+1 + do rq4_1 = 1, nrefq4 + q1_ref = refq4(rq4_1,1,1)+1 + q2_ref = refq4(rq4_1,1,2)+1 + q5_1ref = refq4(rq4_1,1,3)+1 + q6_1ref = refq4(rq4_1,1,4)+1 + do q4i_1 = 1, norbitq4(rq4_1) + q1 = refq4(rq4_1,q4i_1,1)+1 + q2 = refq4(rq4_1,q4i_1,2)+1 + q5_1 = refq4(rq4_1,q4i_1,3)+1 + q6_1 = refq4(rq4_1,q4i_1,4)+1 + iperm_1 = refq4o(rq4_1,q4i_1,1) + isym_1 = refq4o(rq4_1,q4i_1,2)+1 + if ((q10 == q1) .and. (q20 == q2)) then + do rq4_2 = 1, nrefq4 + q5_2ref = refq4(rq4_2,1,1)+1 + q6_2ref = refq4(rq4_2,1,2)+1 + q3_ref = refq4(rq4_2,1,3)+1 + q4_ref = refq4(rq4_2,1,4)+1 + do q4i_2 = 1, norbitq4(rq4_2) + q5_2 = refq4(rq4_2,q4i_2,1)+1 + q6_2 = refq4(rq4_2,q4i_2,2)+1 + q3 = refq4(rq4_2,q4i_2,3)+1 + q4 = refq4(rq4_2,q4i_2,4)+1 + iperm_2 = refq4o(rq4_2,q4i_2,1) + isym_2 = refq4o(rq4_2,q4i_2,2)+1 + if ((q30 == q3) .and. (q40 == q4)) then + if ((q5_1 == q5_2) .and. (q6_1 == q6_2)) then + !$omp parallel & + !$omp private (mu2,mu3,mu4,mu5,mu6) & + !$omp private (nu1,nu2,nu5,nu6,lambda5,lambda6,lambda3,lambda4,nunu,lala,mumu1,mumu2) + !$omp do schedule (dynamic, 1) private (ktea1,ktea2,W1,W2) + do mu1 = 1, n_mode + do nu1 = 1, n_mode + if (degs(q1,nu1,mu1)) then + do mu2 = 1, n_mode + do nu2 = 1, n_mode + if (degs(q2,nu2,mu2)) then + do mu5 = 1, n_mode + do nu5 = 1, n_mode + if (degs(q5_1,nu5,mu5)) then + do mu6 = 1, n_mode + mumu1 = [mu1,mu2,mu5,mu6] + do nu6 = 1, n_mode + nunu = [nu1,nu2,nu5,nu6] + if (degs(q6_1,nu6,mu6)) then + ktea1 = & +P(q1_ref,mumu1(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,1)),isym_1)*& +CONJG(P(q2_ref,mumu1(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,2)),isym_1))*& +CONJG(P(q5_1ref,mumu1(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,3)),isym_1))*& +P(q6_1ref,mumu1(perms(iperm_1+1,4)),nunu(perms(iperm_1+1,4)),isym_1) + if (iperm_1 == 0) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 1) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 2) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 3) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 4) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 5) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 6) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 7) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 8) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 9) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 10) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 11) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + end if + do mu3 = 1, n_mode + do lambda3 = 1, n_mode + if (degs(q3,lambda3,mu3)) then + do mu4 = 1, n_mode + do lambda4 = 1, n_mode + mumu2 = [mu5,mu6,mu3,mu4] + if (degs(q4,lambda4,mu4)) then + do lambda5 = 1, n_mode + if (degs(q5_2,lambda5,mu5)) then + do lambda6 = 1, n_mode + lala = [lambda5,lambda6,lambda3,lambda4] + if (degs(q6_2,lambda6,mu6)) then + ktea2 = & +P(q5_2ref,mumu2(perms(iperm_2+1,1)),lala(perms(iperm_2+1,1)),isym_2)*& +CONJG(P(q6_2ref,mumu2(perms(iperm_2+1,2)),lala(perms(iperm_2+1,2)),isym_2))*& +CONJG(P(q3_ref,mumu2(perms(iperm_2+1,3)),lala(perms(iperm_2+1,3)),isym_2))*& +P(q4_ref,mumu2(perms(iperm_2+1,4)),lala(perms(iperm_2+1,4)),isym_2) + if (iperm_2 == 0) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 1) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 2) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 3) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 4) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 5) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 6) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 7) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 8) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 9) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 10) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 11) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + end if + wsqn(rq4_0,mu1,mu2,mu3,mu4) = & +wsqn(rq4_0,mu1,mu2,mu3,mu4) + 0.5d0*F(q5_1,q6_1,mu5,mu6)*W1*W2 + end if + end do + end if + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + !$omp end do + !$omp end parallel + end if + end if + end do + end do + end if + end do + end do + end do + if (verbose) then + print*, " MAXVAL(W^{n})=", MAXVAL(ABS(wsqn)), ". Threshold=", eps + print*, "" + end if + wsq_scf = wsq_scf + wsqn + if (MAXVAL(ABS(wsqn)) < eps) exit do1 + end do do1 + if (verbose) then + tend = omp_get_wtime() + print*, "Convergence found with", iter, "iterations" + print*, "" + print*, "Elapsed time inside get_scf_wsq():", tend-tstart + print*, "======================= DONE =======================" + print*, "" + endif + +end subroutine get_scf_wsq + +subroutine get_indep2fc( & + vs_red, refq2, refq2o, norbitq2, orbit2t, n_indep_elem, indep_elem, rot_cart, mapping, map_uc, map_tr, T_list, q_list, F, & + verbose, indep_fc, nrefq2, n_mode, dimq2, nref2, dim2, Natom_sc, Nqpoint, Nsym) + + implicit none + + complex, dimension(nrefq2,n_mode,n_mode,n_mode) :: vs_red + integer, dimension(nrefq2,dimq2,2), intent(in) :: refq2 + integer, dimension(nrefq2,dimq2,2), intent(in) :: refq2o + integer, dimension(nrefq2), intent(in) :: norbitq2 + + integer, dimension(nref2,dim2,2), intent(in) :: orbit2t + integer, dimension(nref2), intent(in) :: n_indep_elem + integer, dimension(nref2,9), intent(in) :: indep_elem + + double precision, dimension(Nsym,3,3), intent(in) :: rot_cart + + integer, dimension(Natom_sc, Nsym), intent(in) :: mapping + integer, dimension(Natom_sc, Natom_sc), intent(in) :: map_uc + integer, dimension(Natom_sc), intent(in) :: map_tr + double precision, dimension(Nqpoint, 3), intent(in) :: T_list, q_list + double precision, dimension(Nqpoint, Nqpoint, n_mode, n_mode), intent(in) :: F + + logical, intent(in) :: verbose + + double precision, dimension(nref2,9), intent(out) :: indep_fc + + double precision, parameter :: pi = 4.0d0*atan(1.0d0) + complex, parameter :: j = (0.0d0, 1.0d0) + + integer, dimension(2) :: munu + integer, dimension(2,2) :: permutations + integer :: ref2, nat1, nat2, i, alpha, beta, rq2, q2i, iperm, isym, nat1p, nat2p, nat1p_uc, nat2p_uc, mu, nu + integer :: nrefq2, n_mode, dimq2, nref2, dim2, Natom_sc, Nqpoint, Nsym + complex, dimension(n_mode) :: vs_q + complex :: Vsa, Vsb + + if (verbose) then + print*, "======================= get_indep2fc() =======================" + print*, "Computing independent third order corrections to FCs \Phi^{3}_{a,b}^{\alpha,\beta}" + end if + + permutations = reshape([1,2,2,1],[2,2]) + + indep_fc = 0 + do ref2 = 1, nref2 + nat1 = orbit2t(ref2,1,1) + nat2 = orbit2t(ref2,1,2) + do i = 1, n_indep_elem(ref2) + alpha = indep_elem(ref2,i)/3 + beta = mod(indep_elem(ref2,i),3) + do rq2 = 1, nrefq2 + do q2i = 1, norbitq2(rq2) + iperm = refq2o(rq2,q2i,1) + isym = refq2o(rq2,q2i,2) + nat1p = findloc(mapping(:,isym+1),nat1, dim=1)-1 + nat2p = findloc(mapping(:,isym+1),nat2, dim=1)-1 + nat1p_uc = map_uc(nat1p+1,nat1p+1) + nat2p_uc = map_uc(nat2p+1,nat2p+1) + do mu = 1, n_mode + do nu = 1, n_mode + munu(1) = mu + munu(2) = nu + vs_q = & +vs_red(rq2,:,munu(permutations(iperm+1,1)), munu(permutations(iperm+1,2))) + Vsa = & +dot_product(rot_cart(isym+1,alpha+1,:),vs_q(nat1p_uc*3+1:(nat1p_uc+1)*3+1)) * & +exp(-2*j*pi*dot_product(q_list(refq2(rq2,1,1)+1,:)-q_list(refq2(rq2,1,2)+1,:),T_list(map_tr(nat1p+1)+1,:))) + Vsb = & +dot_product(rot_cart(isym+1,beta+1,:),vs_q(nat2p_uc*3+1:(nat2p_uc+1)*3+1)) * & +exp(-2*j*pi*dot_product(q_list(refq2(rq2,1,1)+1,:)-q_list(refq2(rq2,1,2)+1,:),T_list(map_tr(nat2p+1)+1,:))) + indep_fc(ref2,i) = indep_fc(ref2,i) + & +real(0.5d0*F(refq2(rq2,1,1)+1,refq2(rq2,1,2)+1,munu(permutations(iperm+1,1)), munu(permutations(iperm+1,2)))*Vsa*CONJG(Vsb)) + end do + end do + end do + end do + end do + end do + if (verbose) then + print *, "======================= DONE =======================" + print *, "" + end if +end subroutine get_indep2fc + +subroutine get_indep2fc_v4( & + vs, ws_red, refq4, refq4o, norbitq4, orbit2t, n_indep_elem, indep_elem, & + F, Ds, degs, mapping, rot_cart, verbose, indep_fc, nref2, nrefq4, n_mode, dimq4, dim2, n_mode_sc, iq, nsym, nat_sc) + + implicit none + + complex, dimension(n_mode_sc,iq,iq,n_mode,n_mode), intent(in) :: vs + complex, dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(in) :: ws_red + integer, dimension(nrefq4,dimq4,4), intent(in) :: refq4 + integer, dimension(nrefq4,dimq4,2), intent(in) :: refq4o + integer, dimension(nrefq4), intent(in) :: norbitq4 + + integer, dimension(nref2,dim2,2), intent(in) :: orbit2t + integer, dimension(nref2), intent(in) :: n_indep_elem + integer, dimension(nref2,9), intent(in) :: indep_elem + double precision, dimension(iq, iq, n_mode, n_mode), intent(in) :: F + + complex(8), dimension(iq, n_mode, n_mode, nsym), intent(in) :: Ds + logical, dimension(iq, n_mode, n_mode), intent(in) :: degs + + integer, dimension(nat_sc, nsym), intent(in) :: mapping + double precision, dimension(nsym,3,3), intent(in) :: rot_cart + + logical, intent(in) :: verbose + + double precision, dimension(nref2,9), intent(out) :: indep_fc + + double precision, parameter :: pi = 4.0d0*atan(1.0d0) + complex, parameter :: j = (0.0d0, 1.0d0) + + integer, dimension(4) :: munu,nunu + integer :: ref2, nat1, nat2, i, alpha, beta, rq4, q4i, iperm, isym, nsym + integer :: mu1, mu2, mu3, mu4, nu1, nu2, nu3, nu4, q1, q2, q3, q4, q10, q20, q30, q40 + integer :: nrefq4, n_mode, dimq4, nref2, dim2, n_mode_sc, iq, nat1p, nat2p, nat_sc + complex :: W, vsa, vsb + + if (verbose) then + print*, "======================= get_indep2fc_v4() =======================" + print*, "Computing independent 4th order corrections to FCs \Phi^{4}_{a,b}^{\alpha,\beta}" + end if + + indep_fc = 0.0d0 + !$omp parallel & + !$omp private (nat1,nat2,i,alpha,beta,rq4,q4i,q1,q2,q3,q4,q10,q20,q30,q40) & + !$omp private (iperm,isym,nat1p,nat2p,mu1,mu2,mu3,mu4) + !$omp do schedule (dynamic, 1) private (W,vsa,vsb) + do ref2 = 1, nref2 + nat1 = orbit2t(ref2,1,1) + nat2 = orbit2t(ref2,1,2) + do i = 1, n_indep_elem(ref2) + alpha = indep_elem(ref2,i)/3+1 + beta = mod(indep_elem(ref2,i),3)+1 + do rq4 = 1, nrefq4 + do q4i = 1, norbitq4(rq4) + q1 = refq4(rq4,q4i,1)+1 + q2 = refq4(rq4,q4i,2)+1 + q3 = refq4(rq4,q4i,3)+1 + q4 = refq4(rq4,q4i,4)+1 + q10 = refq4(rq4,1,1)+1 + q20 = refq4(rq4,1,2)+1 + q30 = refq4(rq4,1,3)+1 + q40 = refq4(rq4,1,4)+1 + iperm = refq4o(rq4,q4i,1) + isym = refq4o(rq4,q4i,2) + nat1p = findloc(mapping(:,isym+1),nat1, dim=1)-1 + nat2p = findloc(mapping(:,isym+1),nat2, dim=1)-1 + do mu1=1,n_mode + do mu2=1,n_mode + do mu3=1,n_mode + do mu4=1,n_mode + W = ws_red(rq4,mu1,mu2,mu3,mu4) + if (iperm == 0) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q10,q20,mu1,mu2)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q30,q40,mu3,mu4)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 1) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q20,q10,mu2,mu1)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q40,q30,mu4,mu3)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*CONJG(W)*CONJG(vsb)) + elseif (iperm == 2) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q30,q40,mu3,mu4)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q10,q20,mu1,mu2)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*CONJG(W)*CONJG(vsb)) + elseif (iperm == 3) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q40,q30,mu4,mu3)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q20,q10,mu2,mu1)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 4) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q10,q30,mu1,mu3)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q20,q40,mu2,mu4)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 5) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q30,q10,mu3,mu1)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q40,q20,mu4,mu2)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*CONJG(W)*CONJG(vsb)) + elseif (iperm == 6) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q20,q40,mu2,mu4)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q10,q30,mu1,mu3)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*CONJG(W)*CONJG(vsb)) + elseif (iperm == 7) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q40,q20,mu4,mu2)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q30,q10,mu3,mu1)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 8) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q40,q20,mu4,mu2)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q30,q10,mu3,mu1)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 9) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q20,q40,mu2,mu4)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q10,q30,mu1,mu3)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 10) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q30,q10,mu3,mu1)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q40,q20,mu4,mu2)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + elseif (iperm == 11) then + vsa= & + dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q10,q30,mu1,mu3)) + vsb= & + dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q20,q40,mu2,mu4)) + indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & +F(q10,q20,mu1,mu2) * & +F(q30,q40,mu3,mu4) * & +vsa*W*CONJG(vsb)) + + end if + end do + end do + end do + end do + end do + end do + end do + end do + !$omp end do + !$omp end parallel + if (verbose) then + print *, "======================= DONE =======================" + print *, "" + end if +end subroutine get_indep2fc_v4 + + +subroutine get_rotq_ws(q, pol_vecs, v4, T_list, q_list, map_tr, map_uc, isym, rot_cart_inv, rot_4fc_inv, mapping, & + w, iq, n_mode, n_mode_sc, nat_sc, nsym) + + implicit none + + integer, dimension(4), intent(in) :: q + complex(8), dimension(iq,n_mode,n_mode_sc), intent(in) :: pol_vecs + double precision, dimension(n_mode_sc,n_mode_sc,n_mode_sc,n_mode_sc), intent(in) :: v4 + double precision, dimension(iq, 3), intent(in) :: T_list, q_list + + integer, dimension(nat_sc), intent(in) :: map_tr + integer, dimension(nat_sc, nat_sc), intent(in) :: map_uc + + integer, intent(in) :: isym + double precision, dimension(nsym,3,3), intent(in) :: rot_cart_inv + double precision, dimension(24,nsym,81,81), intent(in) :: rot_4fc_inv + integer, dimension(iq,nsym), intent(in) :: mapping + !integer, dimension(nat_sc,nsym), intent(in) :: mapping_inv + + complex(8), dimension(n_mode,n_mode,n_mode,n_mode), intent(out) :: w + double precision, dimension(81) :: flatv4, rot_flat_v4 + + complex(8) :: rot_pol_alpha1, rot_pol_alpha2, rot_pol_alpha3, rot_pol_alpha4 + integer :: iq, n_mode, n_mode_sc, nat_sc + + integer :: q1,q2,q3,q4,mu1,mu2,mu3,mu4,flatmu,index,ii + integer :: a1,a2,a3,a4,alpha1,alpha2,alpha3,alpha4,nsym + + double precision, parameter :: pi = 4.0d0*atan(1.0d0) + complex, parameter :: j = (0.0d0, 1.0d0) + complex :: phase + + ! Get integers + w = 0.0d0 + + q1 = q(1)+1 + q2 = q(2)+1 + q3 = q(3)+1 + q4 = q(4)+1 + + !$omp parallel private (mu1,mu2,mu3,mu4, rot_pol_alpha1, rot_pol_alpha2, rot_pol_alpha3, rot_pol_alpha4) + !$omp do schedule (dynamic, 1) private (a1,a2,a3,a4,alpha1,alpha2,alpha3,alpha4,ii,rot_flat_v4,flatv4,index) + do flatmu = 1, n_mode**4 + mu1 = (flatmu-1)/n_mode**3 + 1 + mu2 = mod(flatmu-1,n_mode**3)/n_mode**2 + 1 + mu3 = mod(flatmu-1,n_mode**2)/n_mode + 1 + mu4 = mod(flatmu-1,n_mode) + 1 + do a1 = 1, nat_sc + do a2 = 1, nat_sc + do a3 = 1, nat_sc + do a4 = 1, nat_sc + do alpha1 = 1, 3 + do alpha2 = 1, 3 + do alpha3 = 1, 3 + do alpha4 = 1, 3 + index = 3*(3*(3*(alpha1-1)+alpha2-1)+alpha3-1)+alpha4 + flatv4(index) = & +v4(3*(a1-1)+alpha1,3*(a2-1)+alpha2,3*(a3-1)+alpha3,3*(a4-1)+alpha4) + end do + end do + end do + end do + do alpha1 = 1, 3 + rot_pol_alpha1 = & +! dot_product(rot_cart_inv(isym+1,alpha1,:),pol_vecs(mapping(q1,isym+1)+1,mu1,3*(a1-1)+1:3*a1+1)) +dot_product(rot_cart_inv(1,alpha1,:),pol_vecs(mapping(q1,isym+1)+1,mu1,3*(a1-1)+1:3*a1+1)) + do alpha2 = 1, 3 + rot_pol_alpha2 = & +! dot_product(rot_cart_inv(isym+1,alpha2,:),pol_vecs(mapping(q2,isym+1)+1,mu2,3*(a2-1)+1:3*a2+1)) +dot_product(rot_cart_inv(1,alpha2,:),pol_vecs(mapping(q2,isym+1)+1,mu2,3*(a2-1)+1:3*a2+1)) + do alpha3 = 1, 3 + rot_pol_alpha3 = & +! dot_product(rot_cart_inv(isym+1,alpha3,:),pol_vecs(mapping(q3,isym+1)+1,mu3,3*(a3-1)+1:3*a3+1)) +dot_product(rot_cart_inv(1,alpha3,:),pol_vecs(mapping(q3,isym+1)+1,mu3,3*(a3-1)+1:3*a3+1)) + do alpha4 = 1, 3 + rot_pol_alpha4 = & +! dot_product(rot_cart_inv(isym+1,alpha4,:),pol_vecs(mapping(q4,isym+1)+1,mu4,3*(a4-1)+1:3*a4+1)) +dot_product(rot_cart_inv(1,alpha4,:),pol_vecs(mapping(q4,isym+1)+1,mu4,3*(a4-1)+1:3*a4+1)) + index = 3*(3*(3*(alpha1-1)+alpha2-1)+alpha3-1)+alpha4 + rot_flat_v4(index) = 0 + do ii = 1, 81 + rot_flat_v4(index) = rot_flat_v4(index) + & + ! rot_4fc_inv(1, isym+1, index, ii) * flatv4(ii) + rot_4fc_inv(1, 1, index, ii) * flatv4(ii) + end do + w(mu1,mu2,mu3,mu4) = w(mu1,mu2,mu3,mu4) + & +conjg(rot_pol_alpha1*rot_pol_alpha2)*& +rot_flat_v4(index)*& +rot_pol_alpha3*rot_pol_alpha4 + end do + end do + end do + end do + end do + end do + end do + end do + end do + !$omp end do + !$omp end parallel + print*, q1, q2, q3, q4, MAXVAL(ABS(w)) + +end subroutine get_rotq_ws + + ! This subroutine calculates the stochastic average of an element of the +! third order force constants based on fu2 and lmat. +! The force constants element is given with three indexes that correspond +! to atom-cartesian coordinates. +! +! NOTE: there is a first addend that is not implemented at the moment +! because it should be zero if the odd correction is calculated +! at the atomic positions that minimize the gradient with respect +! to Wyckoff positions. This non-implemented addend vanishes +! if positions are fixed by symmetry. +! Version de get_v3_element_sym pero guardando datos en una matrix auxiliar + +subroutine get_v3_element_sym (na_in, nb_in, nc_in, ur, eprod, f, rho, log_err, & + nsym, s_cart, irt, translations_irt, v3, nat_sc, n_mode, n_random, nr) + + use omp_lib + use stochastic + implicit none + + integer, intent(in) :: na_in, nb_in, nc_in, nsym + double precision, dimension(n_random,n_mode), intent(in) :: ur + double precision, dimension(n_mode,n_mode), intent(in) :: eprod + double precision, dimension(n_random,nat_sc,3), intent(in) :: f + double precision, dimension(n_random), intent(in) :: rho + character (len=10), intent(in) :: log_err + double precision, dimension(3,3,48), intent(in) :: s_cart + integer, dimension(48,nat_sc), intent(in) :: irt + integer, dimension(nat_sc,nr), intent(in) :: translations_irt + double precision, intent(out) :: v3 + + integer :: nat_sc, n_mode, n_random, nr + + double precision, dimension(:), allocatable :: fun + double precision, dimension(:,:), allocatable :: Rot,v3_tp, v3_s!aux matrix where the elements have transl and perm sym applied + double precision :: v3_aux, av, av_err + double precision :: aux_elem1, aux_elem2, aux_elem3 + + integer, dimension(3) :: triplet, triplet_sym + integer :: alpha, beta, gamma + integer :: isym, ii, jj, kk, na, nb, nc, cartesian_index, r + + logical, parameter :: debug = .false. + real :: t1, t2 + + ! Allocate stuff + if (debug) then + print *, "=== V3 ELEMENT DEBUG ===" + print *, "Atomic-cartesian coord of the element:", na_in, nb_in, nc_in + print *, "" + call flush() + end if + + allocate(fun(n_random)) + allocate(Rot(nsym,27)) + allocate(v3_tp(nsym,27)) + allocate(v3_s(nsym,nsym)) + + v3 = 0.0d0 + + triplet(1) = na_in/3 + 1 ! +1 Fortran + triplet(2) = nb_in/3 + 1 + triplet(3) = nc_in/3 + 1 + alpha = mod(na_in,3) + 1 + beta = mod(nb_in,3) + 1 + gamma = mod(nc_in,3) + 1 + + v3_tp(:,:) = 0.0d0 + do isym = 1, nsym + triplet_sym(1) = irt(isym, triplet(1)) + triplet_sym(2) = irt(isym, triplet(2)) + triplet_sym(3) = irt(isym, triplet(3)) + do ii = 1, 3 + do jj = 1, 3 + do kk = 1, 3 + ! Single atomic-cartesian index in fortran + na = 3 * (triplet_sym(1)-1) + ii + nb = 3 * (triplet_sym(2)-1) + jj + nc = 3 * (triplet_sym(3)-1) + kk + cartesian_index = (3*(ii-1)+(jj-1))*3+(kk-1)+1 + + ! Obtain Rot element with trans and perm symmetries applied only if the multiplication + ! of Rotation matrix elements is not 0: + Rot(isym,cartesian_index) = s_cart(alpha, ii, isym)*s_cart(beta, jj, isym)*s_cart(gamma, kk, isym) + if (Rot(isym,cartesian_index) /= 0.0d0 .and. abs(Rot(isym,cartesian_index))>1.0e-12) then + + !v3_aux = 0.0d0 + if (na == nb.and.na == nc.and.nb == nc) then !No need of applying perm symmetry to the element: + do r = 1, nr + ! Translated Single atomic-cartesian index (nb, nc same as na) + na = 3 * (translations_irt(triplet_sym(1), r)-1) + ii + fun(:) = ( eprod(na,na) - ur(:,na) * ur(:,na) ) * & + f(:, translations_irt(triplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,av,av_err) + v3_tp(isym, cartesian_index) = v3_tp(isym, cartesian_index) + av + end do + + elseif (na == nb .and. na /= nc) then + ! Need to apply perm+trans symmetry to the element + do r = 1, nr + ! Translated Single atomic-cartesian index in fortran + na = 3 * (translations_irt(triplet_sym(1), r)-1) + ii + nc = 3 * (translations_irt(triplet_sym(3), r)-1) + kk + fun(:) = ( eprod(na,nc) - ur(:,na) * ur(:,nc) ) * & + f(:, translations_irt(triplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = ( eprod(na,na) - ur(:,na) * ur(:,na) ) * & + f(:, translations_irt(triplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v3_tp(isym, cartesian_index) = v3_tp(isym, cartesian_index) + & + (2.0d0*aux_elem1+aux_elem2) / 3.0d0 + end do + + elseif (na == nc .and. na /= nb) then + do r = 1, nr + ! Translated Single atomic-cartesian index in fortran + na = 3 * (translations_irt(triplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(triplet_sym(2), r)-1) + jj + fun(:) = ( eprod(nb,na) - ur(:,nb) * ur(:,na) ) * & + f(:, translations_irt(triplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = ( eprod(na,na) - ur(:,na) * ur(:,na) ) * & + f(:, translations_irt(triplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v3_tp(isym, cartesian_index) = v3_tp(isym, cartesian_index) + & + (2.0d0*aux_elem1+aux_elem2) / 3.0d0 + end do + + elseif (nb == nc .and. na /= nc) then + do r = 1, nr + ! Translated Single atomic-cartesian index in fortran + na = 3 * (translations_irt(triplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(triplet_sym(2), r)-1) + jj + fun(:) = ( eprod(nb,nb) - ur(:,nb) * ur(:,nb) ) * & + f(:, translations_irt(triplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = ( eprod(na,nb) - ur(:,na) * ur(:,nb) ) * & + f(:, translations_irt(triplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v3_tp(isym, cartesian_index) = v3_tp(isym, cartesian_index) + & + (aux_elem1+2.0d0*aux_elem2) / 3.0d0 + end do + + elseif (na /= nb .and. na /= nc .and. nb /= nc) then + do r = 1, nr + ! Translated Single atomic-cartesian index in fortran + na = 3 * (translations_irt(triplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(triplet_sym(2), r)-1) + jj + nc = 3 * (translations_irt(triplet_sym(3), r)-1) + kk + ! fun is inv with respect nb <-> nc + fun(:) = ( eprod(nb,nc) - ur(:,nb) * ur(:,nc) ) * & + f(:, translations_irt(triplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = ( eprod(na,nc) - ur(:,na) * ur(:,nc) ) * & + f(:, translations_irt(triplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = ( eprod(na,nb) - ur(:,na) * ur(:,nb) ) * & + f(:, translations_irt(triplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v3_tp(isym, cartesian_index) = v3_tp(isym, cartesian_index) + & + (aux_elem1+aux_elem2+aux_elem3) / 3.0d0 + end do + end if + end if + end do + end do + end do + end do + + ! Apply space group symmetry + !call dgemm('N', 'T', nsym, nsym, 27, 1.0d0, & + ! v3_tp, nsym, Rot, 27, 0.0d0, v3_s, nsym) + + do isym = 1, nsym + v3 = v3 + sum(Rot(isym,:)*v3_tp(isym,:)) + end do + v3 = v3 / (real(nr)*real(nsym)) + + deallocate(fun,v3_tp,Rot,v3_s) + + end subroutine get_v3_element_sym + +subroutine get_v4_element_sym (na_in, nb_in, nc_in, nd_in, ur, eprod, f, rho, log_err, & + nsym, s_cart, irt, translations_irt, v4, nat_sc, n_mode, n_random, nr) + + use omp_lib + use stochastic + implicit none + + integer, intent(in) :: na_in, nb_in, nc_in, nd_in, nsym + double precision, dimension(n_random,n_mode), intent(in) :: ur + double precision, dimension(n_mode,n_mode), intent(in) :: eprod + double precision, dimension(n_random,nat_sc,3), intent(in) :: f + double precision, dimension(n_random), intent(in) :: rho + character (len=10), intent(in) :: log_err + double precision, dimension(3,3,48), intent(in) :: s_cart + integer, dimension(48,nat_sc), intent(in) :: irt + integer, dimension(nat_sc,nr), intent(in) :: translations_irt + double precision, intent(out) :: v4 + + integer :: nat_sc, n_mode, n_random, nr + + double precision, dimension(:), allocatable :: fun + double precision, dimension(:,:), allocatable :: Rot,v4_tp, v4_s!aux matrix where the elements have transl and perm sym applied + double precision :: v4_aux, av, av_err + double precision :: aux_elem1, aux_elem2, aux_elem3, aux_elem4, aux_elem5, aux_elem6 + + integer, dimension(4) :: qplet, qplet_sym + integer :: alpha, beta, gamma, delta + integer :: isym, ii, jj, kk, ll, na, nb, nc, nd, cartesian_index, r + + logical, parameter :: debug = .false. + real :: t1, t2 + + ! Allocate stuff + if (debug) then + print *, "=== V4 ELEMENT DEBUG ===" + print *, "Atomic-cartesian coord of the element:", na_in, nb_in, nc_in, nd_in + print *, "" + call flush() + end if + + allocate(fun(n_random)) + allocate(Rot(nsym,81)) + allocate(v4_tp(nsym,81)) + allocate(v4_s(nsym,nsym)) + + v4 = 0.0d0 + + qplet(1) = na_in/3 + 1 + qplet(2) = nb_in/3 + 1 + qplet(3) = nc_in/3 + 1 + qplet(4) = nd_in/3 + 1 + alpha = mod(na_in,3) + 1 + beta = mod(nb_in,3) + 1 + gamma = mod(nc_in,3) + 1 + delta = mod(nd_in,3) + 1 + + v4_tp(:,:) = 0.0d0 + do isym = 1, nsym + qplet_sym(1) = irt(isym, qplet(1)) + qplet_sym(2) = irt(isym, qplet(2)) + qplet_sym(3) = irt(isym, qplet(3)) + qplet_sym(4) = irt(isym, qplet(4)) + do ii = 1, 3 + do jj = 1, 3 + do kk = 1, 3 + do ll = 1, 3 + ! Single atomic-cartesian index in fortran + na = 3 * (qplet_sym(1)-1) + ii + nb = 3 * (qplet_sym(2)-1) + jj + nc = 3 * (qplet_sym(3)-1) + kk + nd = 3 * (qplet_sym(4)-1) + ll + cartesian_index = (((ii-1)*3+(jj-1))*3+(kk-1))*3+ll + Rot(isym,cartesian_index) = & + s_cart(alpha, ii, isym)*s_cart(beta, jj, isym)*s_cart(gamma, kk, isym)*s_cart(delta, ll, isym) + + if (abs(Rot(isym,cartesian_index))>1.0e-12) then !If element is zero, we need nothing. + if (na == nb .and. na == nc .and. na == nd) then ! All elements are the same. + !print*, "1" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,na) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,av,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + av + end do + elseif (na == nb .and. na == nc) then ! 3 elements are equal. + !print*, "2.1" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,na) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nd) * ur(:,na) * ur(:,na) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+3*aux_elem2)/4.0d0 + end do + elseif (nb == nc .and. nb == nd) then ! 3 elements are equal. + !print*, "2.2" + do r = 1, nr + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + fun(:) = & + - ur(:,nb) * ur(:,nb) * ur(:,nb) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nb) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+3*aux_elem2)/4.0d0 + end do + elseif (nc == nd .and. nc == na) then ! 3 elements are equal. + !print*, "2.3" + do r = 1, nr + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + fun(:) = & + - ur(:,nc) * ur(:,nc) * ur(:,nc) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nc) * ur(:,nc) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+3*aux_elem2)/4.0d0 + end do + elseif (nd == na .and. nd == nb) then ! 3 elements are equal. + !print*, "2.4" + do r = 1, nr + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + fun(:) = & + - ur(:,nd) * ur(:,nd) * ur(:,nd) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nc) * ur(:,nd) * ur(:,nd) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+3*aux_elem2)/4.0d0 + end do + elseif (na == nb .and. nc == nd) then ! 2 and 2 + !print*, "3.1" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nc) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nc) * ur(:,nc) * ur(:,na) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2) / 2.0d0 + end do + elseif ((na == nc .and. nb == nd) .or. (na==nd .and. nb==nc)) then + !print*, "3.2" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nb) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nb) * ur(:,na) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2) / 2.0d0 + end do + elseif (na == nb) then ! 2-1 + !print*, "4.1" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nc) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nd) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nc) * ur(:,nd) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3)/4.0d0 + end do + elseif (na == nc) then ! 2-1 + !print*, "4.2" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,na) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nd) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nd) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3)/4.0d0 + end do + elseif (na == nd) then ! 2-1 + !print*, "4.3" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,na) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,na) * ur(:,na) * ur(:,nc) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nc) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3)/4.0d0 + end do + elseif (nb == nc) then ! 2-1 + !print*, "4.4" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nb) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nb) * ur(:,nd) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nd) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3)/4.0d0 + end do + elseif (nb == nd) then ! 2-1 + !print*, "4.5" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nb) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nb) * ur(:,nc) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nc) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3)/4.0d0 + end do + elseif (nc == nd) then ! 2-1 + !print*, "4.6" + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + fun(:) = & + - ur(:,na) * ur(:,nc) * ur(:,nc) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nc) * ur(:,nc) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nc) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+2*aux_elem3) / 4.0d0 + end do + else ! None + do r = 1, nr + na = 3 * (translations_irt(qplet_sym(1), r)-1) + ii + nb = 3 * (translations_irt(qplet_sym(2), r)-1) + jj + nc = 3 * (translations_irt(qplet_sym(3), r)-1) + kk + nd = 3 * (translations_irt(qplet_sym(4), r)-1) + ll + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nc) * f(:,translations_irt(qplet_sym(4), r), ll) + call average_error_weight(fun,rho,log_err,aux_elem1,av_err) + fun(:) = & + - ur(:,nb) * ur(:,nc) * ur(:,nd) * f(:,translations_irt(qplet_sym(1), r), ii) + call average_error_weight(fun,rho,log_err,aux_elem2,av_err) + fun(:) = & + - ur(:,na) * ur(:,nc) * ur(:,nd) * f(:,translations_irt(qplet_sym(2), r), jj) + call average_error_weight(fun,rho,log_err,aux_elem3,av_err) + fun(:) = & + - ur(:,na) * ur(:,nb) * ur(:,nd) * f(:,translations_irt(qplet_sym(3), r), kk) + call average_error_weight(fun,rho,log_err,aux_elem4,av_err) + v4_tp(isym, cartesian_index) = & + v4_tp(isym, cartesian_index) + (aux_elem1+aux_elem2+aux_elem3+aux_elem4) / 4.0d0 + end do + end if + end if + end do + end do + end do + end do + end do + + do isym = 1, nsym + v4 = v4 + sum(Rot(isym,:)*v4_tp(isym,:)) + end do + v4 = v4 / (real(nr)*real(nsym)) + + deallocate(fun,v4_tp,Rot,v4_s) + +end subroutine get_v4_element_sym + +subroutine get_nref3(nat, nat_sc, tot3, nsym, mappings, map_uc, nref3) + + integer, intent(in) :: nat, nat_sc, nsym, tot3 + integer, dimension(:,:), intent(in) :: mappings, map_uc + + integer, intent(out) :: nref3 + + integer, dimension(tot3,3) :: all3, ref3 + integer, dimension(6*nsym, 3) :: equilist + + integer, dimension(6,3) :: permutations + integer, dimension(3) :: triplet, triplet_perm, triplet_sym + integer :: ii, jj, kk, nall3, equiv, iperm, isym + logical :: its_in_list + + permutations = reshape( & + [1,2,3, 2,1,3, 3,2,1, 1,3,2, 2,3,1, 3,1,2], & + [6,3], order=[2,1]) + + nref3 = 0 + nall3 = 0 + doii : do ii = 0, nat-1 + dojj : do jj = 0, nat_sc-1 + dokk: do kk = 0, nat_sc-1 + triplet = [ii, jj, kk] + call triplet_in_list(triplet, all3, nall3, its_in_list) + if (its_in_list) cycle dokk + nref3 = nref3 + 1 + ref3(nref3,:) = triplet + equiv = 0 + do iperm = 1, 6 + triplet_perm(1) = triplet(permutations(iperm,1)) + triplet_perm(2) = triplet(permutations(iperm,2)) + triplet_perm(3) = triplet(permutations(iperm,3)) + do isym = 1, nsym + triplet_sym = & +[mappings(triplet_perm(1)+1,isym), mappings(triplet_perm(2)+1,isym), mappings(triplet_perm(3)+1,isym)] + if (triplet_sym(1) >= nat) then + triplet_sym(2) = map_uc(triplet_sym(1)+1, triplet_sym(2)+1) + triplet_sym(3) = map_uc(triplet_sym(1)+1, triplet_sym(3)+1) + triplet_sym(1) = map_uc(triplet_sym(1)+1, triplet_sym(1)+1) + end if + call triplet_in_list(triplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = triplet_sym + all3(nall3+1,:) = triplet_sym + equiv = equiv + 1 + nall3 = nall3 + 1 + end if + end do + end do + if (nall3 == tot3) exit doii + end do dokk + end do dojj + end do doii +end subroutine + +subroutine get_nref4(nat, nat_sc, tot4, nsym, mappings, map_uc, nref4) + + integer, intent(in) :: nat, nat_sc, nsym, tot4 + integer, dimension(:,:), intent(in) :: mappings, map_uc + + integer, intent(out) :: nref4 + + integer, dimension(tot4,4) :: all4, ref4 + integer, dimension(24*nsym, 4) :: equilist + + integer, dimension(24,4) :: permutations + integer, dimension(4) :: qplet, qplet_perm, qplet_sym + integer :: ii, jj, kk, ll, nall4, equiv, iperm, isym + logical :: its_in_list + + permutations = reshape( & + [1,2,3,4, 2,1,3,4, 3,2,1,4, 1,3,2,4, 2,3,1,4, 3,1,2,4, & + 1,2,4,3, 2,1,4,3, 4,2,1,3, 1,4,2,3, 2,4,1,3, 4,1,2,3, & + 1,4,3,2, 4,1,3,2, 3,4,1,2, 1,3,4,2, 4,3,1,2, 3,1,4,2, & + 4,2,3,1, 2,4,3,1, 3,2,4,1, 4,3,2,1, 2,3,4,1, 3,4,2,1], & + [24,4], order=[2,1]) + + nref4 = 0 + nall4 = 0 + doii : do ii = 0, nat-1 + dojj : do jj = 0, nat_sc-1 + dokk: do kk = 0, nat_sc-1 + doll: do ll = 0, nat_sc-1 + qplet = [ii, jj, kk, ll] + call qplet_in_list(qplet, all4, nall4, its_in_list) + if (its_in_list) cycle doll + nref4 = nref4 + 1 + ref4(nref4,:) = qplet + equiv = 0 + do iperm = 1, 24 + qplet_perm(1) = qplet(permutations(iperm,1)) + qplet_perm(2) = qplet(permutations(iperm,2)) + qplet_perm(3) = qplet(permutations(iperm,3)) + qplet_perm(4) = qplet(permutations(iperm,4)) + do isym = 1, nsym + qplet_sym = & +[mappings(qplet_perm(1)+1,isym), mappings(qplet_perm(2)+1,isym), mappings(qplet_perm(3)+1,isym), mappings(qplet_perm(4)+1,isym)] + if (qplet_sym(1) >= nat) then + qplet_sym(2) = map_uc(qplet_sym(1)+1, qplet_sym(2)+1) + qplet_sym(3) = map_uc(qplet_sym(1)+1, qplet_sym(3)+1) + qplet_sym(4) = map_uc(qplet_sym(1)+1, qplet_sym(4)+1) + qplet_sym(1) = map_uc(qplet_sym(1)+1, qplet_sym(1)+1) + end if + call qplet_in_list(qplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = qplet_sym + all4(nall4+1,:) = qplet_sym + equiv = equiv + 1 + nall4 = nall4 + 1 + end if + end do + end do + if (nall4 == tot4) exit doii + end do doll + end do dokk + end do dojj + end do doii +end subroutine + + +subroutine get_q_nref4(mappings, nref4, norbitq4, iq, nsym) + + integer, dimension(iq,nsym), intent(in) :: mappings + + integer, intent(out) :: nref4 + integer, intent(out) :: norbitq4 + + integer, allocatable, dimension(:,:) :: all4 + integer, allocatable, dimension(:) :: norbit4 + integer, dimension(12*nsym, 4) :: equilist + + integer, dimension(12,4) :: permutations + integer, dimension(4) :: qplet, qplet_perm, qplet_sym + integer :: q1, q2, q3, q4, nall4, equiv, iperm, isym, iq, nsym + logical :: its_in_list + + allocate(all4(iq**4,4)) + allocate(norbit4(iq**4)) + + permutations = reshape([ & + 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & + 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & + [12,4], order=[2,1]) + + !permutations = reshape([1,2,3,4], [1,4]) + + nref4 = 0 + nall4 = 0 + norbit4 = 0 + do1 : do q1 = 1, iq + do2 : do q2 = 1, iq + do3: do q3 = 1, iq + do4: do q4 = 1, iq + qplet = [q1-1, q2-1, q3-1, q4-1] + call qplet_in_list(qplet, all4, nall4, its_in_list) + if (its_in_list) cycle do4 + nref4 = nref4 + 1 + equiv = 0 + do iperm = 1, 12 + qplet_perm(1) = qplet(permutations(iperm,1)) + qplet_perm(2) = qplet(permutations(iperm,2)) + qplet_perm(3) = qplet(permutations(iperm,3)) + qplet_perm(4) = qplet(permutations(iperm,4)) + do isym = 1, nsym + qplet_sym = & +[mappings(qplet_perm(1)+1,isym), mappings(qplet_perm(2)+1,isym), mappings(qplet_perm(3)+1,isym), mappings(qplet_perm(4)+1,isym)] + call qplet_in_list(qplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = qplet_sym + all4(nall4+1,:) = qplet_sym + equiv = equiv + 1 + nall4 = nall4 + 1 + end if + end do + end do + norbit4(nref4) = equiv + if (nall4 == iq**4) exit do1 + end do do4 + end do do3 + end do do2 + end do do1 + norbitq4 = MAXVAL(norbit4) +end subroutine + +subroutine recognize_q_quadruplet(nref4, norbitq4, q_list, mappings, verbose, & +orbit4t, orbit4o, norbit, ref4, iq, nsym) + integer, intent(in) :: nref4, norbitq4 + double precision, dimension(iq,3), intent(in) :: q_list + integer, dimension(iq,nsym), intent(in) :: mappings + logical, intent(in) :: verbose + + integer, dimension(nref4,norbitq4,4), intent(out) :: orbit4t + integer, dimension(nref4,norbitq4,2), intent(out) :: orbit4o + integer, dimension(nref4), intent(out) :: norbit + integer, intent(out) :: ref4 + + + integer, dimension(iq**4,4) :: all4 + integer, dimension(norbitq4, 4) :: equilist + + integer, dimension(12,4) :: permutations + integer, dimension(4) :: qplet, qplet_perm, qplet_sym + integer :: q1, q2, q3, q4, nall4, equiv, iperm, isym + integer :: iq, nsym + + double precision, dimension(3) :: qsum + logical :: its_in_list, its_cons + + orbit4t = 0 + orbit4o = 0 + + permutations = reshape([ & + 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & + 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & + [12,4], order=[2,1]) + + ref4 = 0 + nall4 = 0 + do1 : do q1 = 1, iq + do2 : do q2 = 1, iq + do3: do q3 = 1, iq + do4: do q4 = 1, iq + qplet = [q1-1,q2-1,q3-1,q4-1] + call qplet_in_list(qplet, all4, nall4, its_in_list) + if (its_in_list) cycle do4 + qsum(:) = & +-q_list(q1,:)+q_list(q2,:)+q_list(q3,:)-q_list(q4,:) + call is_qcons(qsum, its_cons) + if (its_cons) then + ref4 = ref4 + 1 + equiv = 0 + do iperm = 1, 12 + qplet_perm(1) = qplet(permutations(iperm,1)) + qplet_perm(2) = qplet(permutations(iperm,2)) + qplet_perm(3) = qplet(permutations(iperm,3)) + qplet_perm(4) = qplet(permutations(iperm,4)) + do isym = 1, nsym + qplet_sym = & + [mappings(qplet_perm(1)+1,isym), mappings(qplet_perm(2)+1,isym), mappings(qplet_perm(3)+1,isym), mappings(qplet_perm(4)+1,isym)] + call qplet_in_list(qplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = qplet_sym + orbit4t(ref4,equiv+1,:) = qplet_sym + all4(nall4+1,:) = qplet_sym + orbit4o(ref4,equiv+1,:) = [iperm-1, isym-1] + equiv = equiv + 1 + nall4 = nall4 + 1 + end if + end do + end do + norbit(ref4) = equiv + else + equiv = 0 + do iperm = 1, 12 + qplet_perm(1) = qplet(permutations(iperm,1)) + qplet_perm(2) = qplet(permutations(iperm,2)) + qplet_perm(3) = qplet(permutations(iperm,3)) + qplet_perm(4) = qplet(permutations(iperm,4)) + do isym = 1, nsym + qplet_sym = & + [mappings(qplet_perm(1)+1,isym), mappings(qplet_perm(2)+1,isym), mappings(qplet_perm(3)+1,isym), mappings(qplet_perm(4)+1,isym)] + call qplet_in_list(qplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = qplet_sym + all4(nall4+1,:) = qplet_sym + equiv = equiv + 1 + nall4 = nall4 + 1 + end if + end do + end do + end if + if (verbose) then + print*, "Reference q-quadruplet: (",q1,",",q2,",",q3,",",q4,")" + print*, "Orbit size:", equiv + print*, "" + end if + if (nall4 == iq**4) exit do1 + end do do4 + end do do3 + end do do2 + end do do1 +end subroutine + +subroutine recognize_triplet(nat, nat_sc, tot3, nref3, nsym, mappings, map_uc, nontrivial, M, & + verbose, orbit3t, orbit3o, norbit, indep_fc, n_indep_fc, kernel, mapping_triplet) + + integer, intent(in) :: nat, nat_sc, nsym, tot3, nref3 + integer, dimension(:,:,:), intent(in) :: nontrivial + double precision, dimension(:,:,:,:), intent(in) :: M + integer, dimension(:,:), intent(in) :: mappings, map_uc + logical, intent(in) :: verbose + + double precision, dimension(nref3,27,27), intent(out) :: kernel + integer, dimension(nref3,27), intent(out) :: indep_fc + integer, dimension(nref3), intent(out) :: norbit, n_indep_fc + integer, dimension(nref3,6*nsym,3), intent(out) :: orbit3t + integer, dimension(nref3,6*nsym,2), intent(out) :: orbit3o + integer, dimension(nat,nat_sc,nat_sc,3), intent(out) :: mapping_triplet + + double precision, allocatable, dimension(:,:) :: constrain_reduced + + integer, dimension(tot3,3) :: all3 + integer, dimension(6*nsym, 3) :: equilist + integer, dimension(27) :: indep + double precision, dimension(27,27) :: kern + double precision, dimension(6*nsym*27,27) :: constrain + + integer, dimension(6,3) :: permutations + integer, dimension(3) :: triplet, triplet_perm, triplet_sym + integer :: ii, jj, kk, nall3, equiv, nconstrain, iperm, isym, iaux, & +jaux, indexprime, ll, nindep, iw, ref3 + logical :: its_in_list + + character(len=100) :: filename + + + kernel = 0 + orbit3t = 0 + orbit3o = 0 + mapping_triplet = 0 + permutations = reshape( & + [1,2,3, 2,1,3, 3,2,1, 1,3,2, 2,3,1, 3,1,2], & + [6,3], order=[2,1]) + + ref3 = 0 + nall3 = 0 + doii : do ii = 0, nat-1 + dojj : do jj = 0, nat_sc-1 + dokk: do kk = 0, nat_sc-1 + triplet = [ii, jj, kk] + call triplet_in_list(triplet, all3, nall3, its_in_list) + if (its_in_list) cycle dokk + ref3 = ref3 + 1 + equiv = 0 + nconstrain = 0 + constrain = 0 + do iperm = 1, 6 + triplet_perm(1) = triplet(permutations(iperm,1)) + triplet_perm(2) = triplet(permutations(iperm,2)) + triplet_perm(3) = triplet(permutations(iperm,3)) + do isym = 1, nsym + triplet_sym = & +[mappings(triplet_perm(1)+1,isym), mappings(triplet_perm(2)+1,isym), mappings(triplet_perm(3)+1,isym)] + if (triplet_sym(1) >= nat) then + triplet_sym(2) = map_uc(triplet_sym(1)+1, triplet_sym(2)+1) + triplet_sym(3) = map_uc(triplet_sym(1)+1, triplet_sym(3)+1) + triplet_sym(1) = map_uc(triplet_sym(1)+1, triplet_sym(1)+1) + end if + call triplet_in_list(triplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = triplet_sym + orbit3t(ref3,equiv+1,:) = triplet_sym + all3(nall3+1,:) = triplet_sym + orbit3o(ref3,equiv+1,:) = [iperm-1, isym-1] + mapping_triplet(triplet_sym(1)+1,triplet_sym(2)+1,triplet_sym(3)+1,:) = & +[ref3-1,iperm-1,isym-1] + equiv = equiv + 1 + nall3 = nall3 + 1 + end if + if (all(triplet == triplet_sym)) then + do indexprime = 1, 27 + if (nontrivial(iperm,isym,indexprime)==1) then + do ll = 1, 27 + constrain(nconstrain+1, ll) = & + M(iperm,isym,indexprime,ll) + end do + nconstrain = nconstrain + 1 + end if + end do + end if + end do + end do + norbit(ref3) = equiv + allocate(constrain_reduced(max(nconstrain,27),27)) + constrain_reduced(:,:) = 0 + do iaux = 1, nconstrain + do jaux =1, 27 + constrain_reduced(iaux,jaux) = constrain(iaux,jaux) + end do + end do + call gauss_jordan(constrain_reduced, max(nconstrain,27), 27, nconstrain, kern, indep, nindep) + + deallocate(constrain_reduced) + if (verbose) then + print *, "Reference triplet: (", ii, ",", jj, ",", kk, ")." + print *, "Orbit size:", equiv, ". Number of constrains: ", & +nconstrain, ". Number of independent elemements:", nindep + print *, "" + end if + do iaux = 1, 27 + do jaux = 1, 27 + kernel(ref3,iaux,jaux) = kern(iaux,jaux) + end do + end do + + n_indep_fc(ref3) = nindep + do iaux = 1, nindep + indep_fc(ref3,iaux) = indep(iaux)-1 ! Giving it in python indexing + end do + if (nall3 == tot3) exit doii + end do dokk + end do dojj + end do doii +end subroutine + +subroutine generate_rot4(rot_cart, Rot, nsym) + + double precision, dimension(nsym,3,3), intent(in) :: rot_cart + double precision, dimension(24,nsym,81,81), intent(out) :: Rot + + integer, dimension(24,4) :: perms + integer, dimension(4) :: cindex + + integer :: nsym + integer :: iperm,isym,alphap,betap,gammap,thetap,indexp,alpha,beta,gamma,theta,index + integer :: alphaperm, betaperm, gammaperm, thetaperm + + perms = reshape([ & + 1,2,3,4, 1,2,4,3, 1,3,2,4, 1,3,4,2, 1,4,2,3, 1,4,3,2, & ! 1 at start + 2,1,3,4, 2,1,4,3, 2,3,1,4, 2,3,4,1, 2,4,1,3, 2,4,3,1, & ! 2 at start + 3,1,2,4, 3,1,4,2, 3,2,1,4, 3,2,4,1, 3,4,1,2, 3,4,2,1, & ! 3 at start + 4,1,2,3, 4,1,3,2, 4,2,1,3, 4,2,3,1, 4,3,1,2, 4,3,2,1 ], & ! 4 at start + [24, 4], order=[2,1]) + + do iperm = 1, 24 + do isym = 1, nsym + do alphap = 1, 3 + do betap = 1, 3 + do gammap = 1, 3 + do thetap = 1, 3 + indexp = 3*(3*(3*(alphap-1)+betap-1)+gammap-1)+thetap + do alpha = 1, 3 + cindex(1) = alpha + do beta = 1, 3 + cindex(2) = beta + do gamma = 1, 3 + cindex(3) = gamma + do theta = 1, 3 + cindex(4) = theta + index = 3*(3*(3*(alpha-1)+beta-1)+gamma-1)+theta + alphaperm=cindex(perms(iperm,1)) + betaperm=cindex(perms(iperm,2)) + gammaperm=cindex(perms(iperm,3)) + thetaperm=cindex(perms(iperm,4)) + Rot(iperm,isym,indexp,index) = & +rot_cart(isym,alphap,alphaperm)*rot_cart(isym,betap,betaperm)*rot_cart(isym,gammap,gammaperm)*rot_cart(isym,thetap,thetaperm) + end do + end do + end do + end do + end do + end do + end do + end do + end do + end do +end subroutine generate_Rot4 + +subroutine recognize_quadruplet(nat, nat_sc, tot4, nref4, nsym, mappings, map_uc, nontrivial, M, verbose, & + orbit4t, orbit4o, norbit, indep_fc, n_indep_fc, kernel, mapping_quadruplet) + + integer, intent(in) :: nat, nat_sc, nsym, tot4, nref4 + integer, dimension(:,:,:), intent(in) :: nontrivial + double precision, dimension(:,:,:,:), intent(in) :: M + integer, dimension(:,:), intent(in) :: mappings, map_uc + logical, intent(in) :: verbose + + double precision, dimension(nref4,81,81), intent(out) :: kernel + integer, dimension(nref4,81), intent(out) :: indep_fc + integer, dimension(nref4), intent(out) :: norbit, n_indep_fc + integer, dimension(nref4,24*nsym,4), intent(out) :: orbit4t + integer, dimension(nref4,24*nsym,2), intent(out) :: orbit4o + integer, dimension(nat,nat_sc,nat_sc,nat_sc,3), intent(out) :: mapping_quadruplet + + double precision, allocatable, dimension(:,:) :: constrain_reduced + + integer, dimension(tot4,4) :: all4 + integer, dimension(24*nsym, 4) :: equilist + integer, dimension(81) :: indep + double precision, dimension(81,81) :: kern + double precision, dimension(24*nsym*81,81) :: constrain + + integer, dimension(24,4) :: permutations + integer, dimension(4) :: qplet, qplet_perm, qplet_sym + integer :: ii, jj, kk, ll, nall4, equiv, nconstrain, iperm, isym, iaux, & +jaux, indexprime, mm, nindep, iw, ref4 + logical :: its_in_list + + character(len=100) :: filename + + + kernel = 0 + orbit4t = 0 + orbit4o = 0 + mapping_quadruplet = 0 + +permutations = reshape([ & + 1,2,3,4, 1,2,4,3, 1,3,2,4, 1,3,4,2, 1,4,2,3, 1,4,3,2, & ! 1 at start + 2,1,3,4, 2,1,4,3, 2,3,1,4, 2,3,4,1, 2,4,1,3, 2,4,3,1, & ! 2 at start + 3,1,2,4, 3,1,4,2, 3,2,1,4, 3,2,4,1, 3,4,1,2, 3,4,2,1, & ! 3 at start + 4,1,2,3, 4,1,3,2, 4,2,1,3, 4,2,3,1, 4,3,1,2, 4,3,2,1 ], & ! 4 at start + [24, 4], order=[2,1]) + + ref4 = 0 + nall4 = 0 + doii : do ii = 0, nat-1 + dojj : do jj = 0, nat_sc-1 + dokk: do kk = 0, nat_sc-1 + doll: do ll = 0, nat_sc-1 + qplet = [ii, jj, kk, ll] + call qplet_in_list(qplet, all4, nall4, its_in_list) + if (its_in_list) cycle doll + ref4 = ref4 + 1 + equiv = 0 + nconstrain = 0 + constrain = 0 + do iperm = 1, 24 + qplet_perm(1) = qplet(permutations(iperm,1)) + qplet_perm(2) = qplet(permutations(iperm,2)) + qplet_perm(3) = qplet(permutations(iperm,3)) + qplet_perm(4) = qplet(permutations(iperm,4)) + do isym = 1, nsym + qplet_sym = & +[mappings(qplet_perm(1)+1,isym), mappings(qplet_perm(2)+1,isym), mappings(qplet_perm(3)+1,isym), mappings(qplet_perm(4)+1,isym)] + if (qplet_sym(1) >= nat) then + qplet_sym(2) = map_uc(qplet_sym(1)+1, qplet_sym(2)+1) + qplet_sym(3) = map_uc(qplet_sym(1)+1, qplet_sym(3)+1) + qplet_sym(4) = map_uc(qplet_sym(1)+1, qplet_sym(4)+1) + qplet_sym(1) = map_uc(qplet_sym(1)+1, qplet_sym(1)+1) + end if + call qplet_in_list(qplet_sym, equilist, equiv, its_in_list) + if (((iperm==1) .and. (isym==1)) .or. (.not. its_in_list)) then + equilist(equiv+1,:) = qplet_sym + orbit4t(ref4,equiv+1,:) = qplet_sym + all4(nall4+1,:) = qplet_sym + orbit4o(ref4,equiv+1,:) = [iperm-1, isym-1] + mapping_quadruplet( & +qplet_sym(1)+1,qplet_sym(2)+1,qplet_sym(3)+1,qplet_sym(4)+1,:) = [ref4-1,iperm-1,isym-1] + equiv = equiv + 1 + nall4 = nall4 + 1 + end if + if (all(qplet == qplet_sym)) then + do indexprime = 1, 81 + if (nontrivial(iperm,isym,indexprime)==1) then + do mm = 1, 81 + constrain(nconstrain+1, mm) = & + M(iperm,isym,indexprime,mm) + end do + nconstrain = nconstrain + 1 + end if + end do + end if + end do + end do + norbit(ref4) = equiv + allocate(constrain_reduced(max(nconstrain,81),81)) + constrain_reduced(:,:) = 0 + do iaux = 1, nconstrain + do jaux =1, 81 + constrain_reduced(iaux,jaux) = constrain(iaux,jaux) + end do + end do + call gauss_jordan(& + constrain_reduced, max(nconstrain,81), 81, nconstrain, kern, indep, nindep) + deallocate(constrain_reduced) + if (verbose) then + print*, & + "Reference quadruplet: (", ii, ",", jj, ",", kk, ",", ll, ")." + print*, "Orbit size:", equiv, ". Number of constrains: ", nconstrain, & + ". Number of independet elements:", nindep + print*, "" + end if + do iaux = 1, 81 + do jaux = 1, 81 + kernel(ref4,iaux,jaux) = kern(iaux,jaux) + end do + end do + + n_indep_fc(ref4) = nindep + do iaux = 1, nindep + indep_fc(ref4,iaux) = indep(iaux)-1 ! Giving it in python indexing + end do + if (nall4 == tot4) exit doii + end do doll + end do dokk + end do dojj + end do doii +end subroutine + +subroutine triplet_in_list(triplet, all3, nall3, its_in_list) + integer, dimension(3), intent(in) :: triplet + integer, dimension(:,:), intent(in) :: all3 + integer, intent(in) :: nall3 + + logical, intent(out) :: its_in_list + + integer :: i + its_in_list=.false. + do i = 1, nall3 + if (all(triplet == all3(i,:))) then + its_in_list=.true. + return + end if + end do +end subroutine + +subroutine qplet_in_list(qplet, all4, nall4, its_in_list) + integer, dimension(4), intent(in) :: qplet + integer, dimension(:,:), intent(in) :: all4 + integer, intent(in) :: nall4 + + logical, intent(out) :: its_in_list + + integer :: i + its_in_list=.false. + do i = 1, nall4 + if (all(qplet == all4(i,:))) then + its_in_list=.true. + return + end if + end do +end subroutine + +subroutine is_qcons(qsum, its_cons) + double precision, dimension(3), intent(in) :: qsum + logical, intent(out) :: its_cons + + double precision :: q1, q2, q3 + double precision, parameter :: eps=1e-3 + + q1 = modulo(abs(qsum(1))+eps,1.0d0) + q2 = modulo(abs(qsum(2))+eps,1.0d0) + q3 = modulo(abs(qsum(3))+eps,1.0d0) + if ((q1<2*eps) .and. (q2<2*eps) .and. (q3<2*eps)) then + its_cons = .true. + else + its_cons = .false. + end if +end subroutine + +subroutine gauss_jordan(a, lda, n, nconstrain, b, independent, n_indep) + implicit none + + integer, intent(in) :: lda, n, nconstrain + real(8), intent(inout) :: a(lda, n) + real(8), intent(out) :: b(n, n) + integer, intent(out) :: independent(n) + integer, intent(out) :: n_indep + + real(8), parameter :: EPS = 1d-10 + integer :: dependent(n) + integer :: i, j, k, i_row, pivot_row, n_dep + real(8) :: tmp, pivot_val + + ! Initialize + b = 0.0d0 + n_dep = 0 + n_indep = 0 + i_row = 1 + + do k = 1, n + pivot_row = 0 + + ! Only look for a pivot if we have rows left within the 13 + if (i_row <= nconstrain) then + pivot_row = i_row + ! Find max in column k (rows i_row to 13) + do i = i_row + 1, nconstrain + if (abs(a(i, k)) > abs(a(pivot_row, k))) pivot_row = i + end do + + if (abs(a(pivot_row, k)) > EPS) then + ! SUCCESS: Found a pivot + n_dep = n_dep + 1 + dependent(n_dep) = k + + ! 1. Swap rows to move pivot to i_row + if (pivot_row /= i_row) then + do j = 1, n + tmp = a(i_row, j) + a(i_row, j) = a(pivot_row, j) + a(pivot_row, j) = tmp + end do + end if + + ! 2. Normalize the pivot row + pivot_val = a(i_row, k) + do j = 1, n + a(i_row, j) = a(i_row, j) / pivot_val + end do + ! Force exact 1.0 to avoid precision drift + a(i_row, k) = 1.0d0 + + ! 3. Eliminate other rows (only within the 13 logical rows) + do i = 1, nconstrain + if (i /= i_row) then + tmp = a(i, k) + if (abs(tmp) > EPS) then + do j = 1, n + a(i, j) = a(i, j) - tmp * a(i_row, j) + end do + a(i, k) = 0.0d0 ! Force exact 0.0 + end if + end if + end do + + i_row = i_row + 1 + cycle + end if + end if + + ! No pivot found in this column -> Independent + n_indep = n_indep + 1 + independent(n_indep) = k + end do + + ! 4. Build Null Space Basis B + ! Only map if we actually found pivots + !if (n_dep > 0) then + do j = 1, n_indep + do i = 1, n_dep + ! Row 'i' of RREF matrix 'a' corresponds to the 'i-th' dependent column + b(dependent(i), j) = -a(i, independent(j)) + end do + b(independent(j), j) = 1.0d0 + end do + !end if + +end subroutine gauss_jordan + +end module module_hess diff --git a/SCHAModules/module_new_thermodynamic.f90 b/SCHAModules/module_new_thermodynamic.f90 index 93db8776b..f3c8da762 100644 --- a/SCHAModules/module_new_thermodynamic.f90 +++ b/SCHAModules/module_new_thermodynamic.f90 @@ -23,6 +23,33 @@ subroutine w_to_a(w,T, a, n) end if end subroutine w_to_a + subroutine w_to_daq(w,T, da, iq, n) + double precision, intent(in) :: T + double precision, dimension(iq, n), intent(in) :: w + double precision, dimension(iq, n), intent(out) :: da + + + integer :: n, iq + double precision, dimension(iq, n) :: a, b + double precision :: beta + + + if (T .eq. 0.0D0) then + da = - dsqrt(1.0d0 / (8.0d0 * w**3.0d0)) + else + ! result_w_to_da = - dsqrt((1.0d0 / dtanH(0.5d0 * w * & + ! 315774.65221921849D0 / T )) / & + ! (8.0d0 * m * w**3.0d0) ) * & + ! (1.0d0 + (w * 315774.65221921849D0 / T) * & + ! (1.0d0 / dsinH(0.5d0 * w * & + ! 315774.65221921849D0 / T ))) + beta = 315774.65221921849D0 / T + a = w * beta + dsinH(w * beta) + b = dsqrt(1.0d0 / (32.0d0 * (w**3.0d0) * & + (dsinH(0.5d0 * w * beta)**3.0) * dcosH(0.5d0 * w * beta))) + da = - a * b + end if + end subroutine w_to_daq ! Computes da/dw starting from the w frequencies ! w unit <= Ha diff --git a/meson.build b/meson.build index 4a35e93e2..999a41d1f 100644 --- a/meson.build +++ b/meson.build @@ -123,6 +123,7 @@ common_link_flags = ['-fopenmp'] # For OpenMP # --- SCHAModules extension --- schamodules_sources = [ + 'SCHAModules/module_hess.f90', 'SCHAModules/module_stochastic.f90', 'SCHAModules/module_new_thermodynamic.f90', 'SCHAModules/module_anharmonic.f90', @@ -133,12 +134,14 @@ schamodules_sources = [ 'SCHAModules/cell_force.f90', 'SCHAModules/get_gradient_supercell_fast.f90', 'SCHAModules/get_g.f90', + 'SCHAModules/get_gq.f90', 'SCHAModules/get_emat.f90', 'SCHAModules/get_v3.f90', 'SCHAModules/get_odd_straight.f90', 'SCHAModules/get_cmat.f90', 'SCHAModules/get_v4.f90', - 'SCHAModules/get_odd_straight_with_v4.f90' + 'SCHAModules/get_odd_straight_with_v4.f90', + 'SCHAModules/get_ur_upsilon_matrices.f90', # ,'SCHAModules/module_polarization.f90' ] ## Generate the C wrapper with f2py using a custom target @@ -218,7 +221,9 @@ py.install_sources([ 'Modules/SchaMinimizer.py', 'Modules/Tools.py', 'Modules/Utilities.py', - 'Modules/cli.py' + 'Modules/cli.py', + 'Modules/Classify.py', + 'Modules/qClassify.py', ], subdir: 'sscha', ) diff --git a/meson.build.sscha b/meson.build.sscha index a7c1fa0dc..4705a0a6f 100644 --- a/meson.build.sscha +++ b/meson.build.sscha @@ -37,6 +37,7 @@ quadmath_dep = fc.find_library('quadmath', required: false) py.extension_module('sscha', [ + '''module_hess.f90''', '''module_stochastic.f90''', '''module_new_thermodynamic.f90''', '''module_anharmonic.f90''', @@ -47,6 +48,7 @@ py.extension_module('sscha', '''cell_force.f90''', '''get_gradient_supercell_fast.f90''', '''get_g.f90''', + '''get_gq.f90''', '''get_emat.f90''', '''get_v3.f90''', '''get_odd_straight.f90''', diff --git a/old_setup.py b/old_setup.py index 5719db97c..70beee808 100644 --- a/old_setup.py +++ b/old_setup.py @@ -56,7 +56,9 @@ # Compile the fortran SCHA modules SCHAModules = Extension(name = "SCHAModules", - sources = ["SCHAModules/module_stochastic.f90", + sources = [ + "SCHAModules/module_stochastic.f90", + "SCHAModules/module_hess.f90", "SCHAModules/module_new_thermodynamic.f90", "SCHAModules/module_anharmonic.f90", "SCHAModules/get_stress_tensor.f90", @@ -66,12 +68,14 @@ "SCHAModules/cell_force.f90", "SCHAModules/get_gradient_supercell_fast.f90", "SCHAModules/get_g.f90", + "SCHAModules/get_gq.f90", "SCHAModules/get_emat.f90", "SCHAModules/get_v3.f90", "SCHAModules/get_odd_straight.f90", "SCHAModules/get_cmat.f90", "SCHAModules/get_v4.f90", - "SCHAModules/get_odd_straight_with_v4.f90"], + "SCHAModules/get_odd_straight_with_v4.f90", + "SCHAModules/get_ur_upsilon_matrices.f90"], extra_f90_compile_args = EXTRA_F90_FLAGS, extra_link_args= EXTRA_LINK_ARGS, **lapack_opt) @@ -101,7 +105,7 @@ package_data={"": ["*.jl"]}, setup_requires = ["numpy", "ase", "scipy", "cellconstructor", "spglib", "matplotlib"], ext_modules = [SCHAModules], # odd_HP - scripts = ["scripts/sscha", "scripts/cluster_check.x", "scripts/plot_frequencies.py", + scripts = ["scripts/sscha.x", "scripts/cluster_check.x", "scripts/plot_frequencies.py", "scripts/sscha-plot-data.py", "scripts/static-vc-relax.pyx", "scripts/read_incomplete_ensemble.py"], license = "GPLv3" From 97012300f60da16684a63a59591dd4c259382e3b Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Tue, 30 Jun 2026 17:02:01 +0200 Subject: [PATCH 2/7] Added openmp_dep flags in meson.build for parallelization --- Modules/Ensemble.py | 3 +-- meson.build | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/Ensemble.py b/Modules/Ensemble.py index 903ffd101..09b856c0e 100644 --- a/Modules/Ensemble.py +++ b/Modules/Ensemble.py @@ -3848,8 +3848,7 @@ def get_free_energy_hessian(self, include_v4 = False, get_full_hessian = True, v def get_free_energy_hessian_dev(self, include_v4 = False, get_full_hessian = True, verbose = False): """ - Dev function. With the meson installation, the OpenMP parallelization is NOT WORKING! - With the old installation everything is fine (old_setup.py) + Dev function. GET THE FREE ENERGY ODD CORRECTION DEV ====================================== diff --git a/meson.build b/meson.build index 999a41d1f..4af2cb271 100644 --- a/meson.build +++ b/meson.build @@ -106,10 +106,10 @@ project('python-sscha', # --- END OF NUMPY CONFIGURATION --- if openblas_dep.found() message('openblas environment detected correctly.') - list_dep = [py_dep, mpi_dep, quadmath_dep, openblas_dep, lapack_dep, blas_dep] + list_dep = [py_dep, mpi_dep, quadmath_dep, openblas_dep, lapack_dep, blas_dep, openmp_dep] else warning('No openblas found.') - list_dep = [py_dep, mpi_dep, quadmath_dep, lapack_dep, blas_dep] + list_dep = [py_dep, mpi_dep, quadmath_dep, lapack_dep, blas_dep, openmp_dep] endif # --- Common Flags --- From b78fd8e428f3d2a482853be19f54509f79fb9f4a Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Wed, 1 Jul 2026 12:04:25 +0200 Subject: [PATCH 3/7] Differentiate between get_scf_wsq and get_sum_wsq --- Modules/Ensemble.py | 12 +- SCHAModules/module_hess.f90 | 274 ++++++++++++++++++++++++++++++++++-- 2 files changed, 273 insertions(+), 13 deletions(-) diff --git a/Modules/Ensemble.py b/Modules/Ensemble.py index 09b856c0e..9b48ffd85 100644 --- a/Modules/Ensemble.py +++ b/Modules/Ensemble.py @@ -3846,7 +3846,7 @@ def get_free_energy_hessian(self, include_v4 = False, get_full_hessian = True, v return dyn_hessian, d3* 2.0 # Ha to Ry return dyn_hessian - def get_free_energy_hessian_dev(self, include_v4 = False, get_full_hessian = True, verbose = False): + def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_full_hessian = True, verbose = False): """ Dev function. @@ -4059,12 +4059,14 @@ def get_free_energy_hessian_dev(self, include_v4 = False, get_full_hessian = Tru degs = qClassify.find_degeneracies(trs_wq) Pmn = qClassify.construct_Pmn(mapping, orbitq1a, orbitq1s, trs_polvecs, rot_cart) - ws_red_scf = SCHAModules.module_hess.get_scf_wsq(ws_red, trs_gq, refq4, refq4o, norbitq4, Pmn, degs, verbose) - v_red, ref_3fc = SCHAModules.module_hess.get_v3_red(nat, norbit3, orbit3a, orbit3s, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt) vs = SCHAModules.module_hess.get_all_vsq(trs_l, v_red, map_uc) - - indep_fc4 = SCHAModules.module_hess.get_indep2fc_v4(vs, ws_red_scf, refq4, refq4o, norbitq4, orbit2a, n_indep_elem, indep_elem, trs_gq, Pmn, degs, mapping, rot_cart, verbose) + + if do_scf: + ws_red_scf = SCHAModules.module_hess.get_scf_wsq(ws_red, trs_gq, refq4, refq4o, norbitq4, Pmn, degs, verbose) + indep_fc4 = SCHAModules.module_hess.get_indep2fc_v4(vs, ws_red_scf, refq4, refq4o, norbitq4, orbit2a, n_indep_elem, indep_elem, trs_gq, Pmn, degs, mapping, rot_cart, verbose) + else: + indep_fc4 = SCHAModules.module_hess.get_indep2fc_v4(vs, ws_red, refq4, refq4o, norbitq4, orbit2a, n_indep_elem, indep_elem, trs_gq, Pmn, degs, mapping, rot_cart, verbose) indep_fc += indep_fc4 phi_sc_odd = np.zeros((n_modes, n_modes), dtype = np.double) for ref2 in range(nref2): diff --git a/SCHAModules/module_hess.f90 b/SCHAModules/module_hess.f90 index e0a578bed..54f3ada87 100644 --- a/SCHAModules/module_hess.f90 +++ b/SCHAModules/module_hess.f90 @@ -160,12 +160,6 @@ subroutine get_ref3fc(nat, orbit3t, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc !$omp parallel private (i, nat1, nat2, nat3, alpha, beta, gamma, v3, indep_3fc, tmp_ref_3fc) !$omp do schedule (dynamic, 1) private (v3, indep_3fc, tmp_ref_3fc) do ref3 = 1, nref3 - !debugging parallel installation - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - print *, "Iteration ", ref3, "executed by thread ", omp_get_thread_num() - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nat1 = orbit3t(ref3,1,1) nat2 = orbit3t(ref3,1,2) nat3 = orbit3t(ref3,1,3) @@ -567,6 +561,7 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & complex(8) :: ktea1, ktea2, W1, W2 double precision, parameter :: eps = 1e-6 + double precision, parameter :: alpha_mix = 0.5d0 integer, parameter :: maxiter = 50 perms = reshape([ & @@ -575,11 +570,270 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & [12,4], order=[2,1]) + wsq_scf = wsq1 + if (verbose) then tstart = omp_get_wtime() print*, "======================= get_scf_wsq() =======================" print*, "Self-consintent loop to compute \Theta(-q1,q2,q3,-q4)." print*, "" + end if + do1 : do iter = 1, maxiter + if (verbose) then + print*, " Iteration", iter + end if + if (iter == 1) then + wsq2 = wsq1 + else + wsq2 = wsq_scf + end if + wsqn = (0.0d0,0.0d0) + do rq4_0 = 1, nrefq4 + q10 = refq4(rq4_0,1,1)+1 + q20 = refq4(rq4_0,1,2)+1 + q30 = refq4(rq4_0,1,3)+1 + q40 = refq4(rq4_0,1,4)+1 + do rq4_1 = 1, nrefq4 + q1_ref = refq4(rq4_1,1,1)+1 + q2_ref = refq4(rq4_1,1,2)+1 + q5_1ref = refq4(rq4_1,1,3)+1 + q6_1ref = refq4(rq4_1,1,4)+1 + do q4i_1 = 1, norbitq4(rq4_1) + q1 = refq4(rq4_1,q4i_1,1)+1 + q2 = refq4(rq4_1,q4i_1,2)+1 + q5_1 = refq4(rq4_1,q4i_1,3)+1 + q6_1 = refq4(rq4_1,q4i_1,4)+1 + iperm_1 = refq4o(rq4_1,q4i_1,1) + isym_1 = refq4o(rq4_1,q4i_1,2)+1 + if ((q10 == q1) .and. (q20 == q2)) then + do rq4_2 = 1, nrefq4 + q5_2ref = refq4(rq4_2,1,1)+1 + q6_2ref = refq4(rq4_2,1,2)+1 + q3_ref = refq4(rq4_2,1,3)+1 + q4_ref = refq4(rq4_2,1,4)+1 + do q4i_2 = 1, norbitq4(rq4_2) + q5_2 = refq4(rq4_2,q4i_2,1)+1 + q6_2 = refq4(rq4_2,q4i_2,2)+1 + q3 = refq4(rq4_2,q4i_2,3)+1 + q4 = refq4(rq4_2,q4i_2,4)+1 + iperm_2 = refq4o(rq4_2,q4i_2,1) + isym_2 = refq4o(rq4_2,q4i_2,2)+1 + if ((q30 == q3) .and. (q40 == q4)) then + if ((q5_1 == q5_2) .and. (q6_1 == q6_2)) then + !$omp parallel & + !$omp private (mu2,mu3,mu4,mu5,mu6) & + !$omp private (nu1,nu2,nu5,nu6,lambda5,lambda6,lambda3,lambda4,nunu,lala,mumu1,mumu2) + !$omp do schedule (dynamic, 1) private (ktea1,ktea2,W1,W2) + do mu1 = 1, n_mode + do nu1 = 1, n_mode + if (degs(q1,nu1,mu1)) then + do mu2 = 1, n_mode + do nu2 = 1, n_mode + if (degs(q2,nu2,mu2)) then + do mu5 = 1, n_mode + do nu5 = 1, n_mode + if (degs(q5_1,nu5,mu5)) then + do mu6 = 1, n_mode + mumu1 = [mu1,mu2,mu5,mu6] + do nu6 = 1, n_mode + nunu = [nu1,nu2,nu5,nu6] + if (degs(q6_1,nu6,mu6)) then + ktea1 = & +P(q1_ref,mumu1(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,1)),isym_1)*& +CONJG(P(q2_ref,mumu1(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,2)),isym_1))*& +CONJG(P(q5_1ref,mumu1(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,3)),isym_1))*& +P(q6_1ref,mumu1(perms(iperm_1+1,4)),nunu(perms(iperm_1+1,4)),isym_1) + if (iperm_1 == 0) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 1) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 2) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 3) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 4) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 5) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 6) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 7) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 8) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + elseif (iperm_1 == 9) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 10) then + W1 = & +CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) + elseif (iperm_1 == 11) then + W1 = & +ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) + end if + do mu3 = 1, n_mode + do lambda3 = 1, n_mode + if (degs(q3,lambda3,mu3)) then + do mu4 = 1, n_mode + do lambda4 = 1, n_mode + mumu2 = [mu5,mu6,mu3,mu4] + if (degs(q4,lambda4,mu4)) then + do lambda5 = 1, n_mode + if (degs(q5_2,lambda5,mu5)) then + do lambda6 = 1, n_mode + lala = [lambda5,lambda6,lambda3,lambda4] + if (degs(q6_2,lambda6,mu6)) then + ktea2 = & +P(q5_2ref,mumu2(perms(iperm_2+1,1)),lala(perms(iperm_2+1,1)),isym_2)*& +CONJG(P(q6_2ref,mumu2(perms(iperm_2+1,2)),lala(perms(iperm_2+1,2)),isym_2))*& +CONJG(P(q3_ref,mumu2(perms(iperm_2+1,3)),lala(perms(iperm_2+1,3)),isym_2))*& +P(q4_ref,mumu2(perms(iperm_2+1,4)),lala(perms(iperm_2+1,4)),isym_2) + if (iperm_2 == 0) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 1) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 2) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 3) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 4) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 5) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 6) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 7) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 8) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + elseif (iperm_2 == 9) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 10) then + W2 = & +CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) + elseif (iperm_2 == 11) then + W2 = & +ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) + end if + wsqn(rq4_0,mu1,mu2,mu3,mu4) = & +wsqn(rq4_0,mu1,mu2,mu3,mu4) + 0.5d0*F(q5_1,q6_1,mu5,mu6)*W1*W2 + end if + end do + end if + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + end if + end do + end do + !$omp end do + !$omp end parallel + end if + end if + end do + end do + end if + end do + end do + end do + wsq_scf = wsq_scf*(1-alpha_mix) +alpha_mix*(wsq1+wsqn) + if (verbose) then + print*, " MAXVAL(|W(n)-W(n-1)|)", MAXVAL(ABS(wsq_scf-wsq2)), ". Threshold (weighted by alpha_mix)=", eps*alpha_mix + print*, "" + end if + if (MAXVAL(ABS(wsq_scf-wsq2)) < eps*alpha_mix) exit do1 + end do do1 + if (verbose) then + tend = omp_get_wtime() + print*, "Convergence found with", iter, "iterations" + print*, "" + print*, "Elapsed time inside get_scf_wsq():", tend-tstart + print*, "======================= DONE =======================" + print*, "" + endif + +end subroutine get_scf_wsq + +subroutine get_sum_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & +wsq_scf, nrefq4, n_mode, iq, dimq4, nsym) + + implicit none + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(in) :: wsq1 + + double precision, dimension(iq, iq, n_mode, n_mode), intent(in) :: F + + integer, dimension(nrefq4,dimq4,4), intent(in) :: refq4 + integer, dimension(nrefq4,dimq4,2), intent(in) :: refq4o + integer, dimension(nrefq4), intent(in) :: norbitq4 + + complex(8), dimension(iq, n_mode, n_mode, nsym), intent(in) :: P + logical, dimension(iq, n_mode, n_mode), intent(in) :: degs + logical, intent(in) :: verbose + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(out) :: wsq_scf + + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode) :: wsq2 + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode) :: wsqn + + double precision :: tstart, tend + + integer, dimension(12,4) :: perms + integer, dimension(4) :: nunu, lala, mumu1, mumu2 + integer :: nrefq4, n_mode, iq, dimq4, nsym + integer :: mu1,mu2,mu3,mu4,mu5,mu6,iter + integer :: rq4_0,rq4_1,rq4_2,q4i_1,q4i_2,q1,q2,q3,q4,q5_1,q6_1,q5_2,q6_2 + integer :: q1_ref, q2_ref, q3_ref, q4_ref, q5_1ref, q5_2ref, q6_1ref, q6_2ref + integer :: nu1,nu2,nu5,nu6,lambda3,lambda4,lambda5,lambda6 + integer :: q10,q20,q30,q40,q5,q6,iperm_1,iperm_2,isym_1,isym_2 + + complex(8) :: ktea1, ktea2, W1, W2 + double precision, parameter :: eps = 1e-6 + integer, parameter :: maxiter = 50 + + perms = reshape([ & + 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & + 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & + [12,4], order=[2,1]) + + if (verbose) then + tstart = omp_get_wtime() + print*, "======================= get_sum_wsq() =======================" + print*, "Looking where to truncate the analytical sum of \Theta(-q1,q2,q3,-q4)." + print*, "" end if wsq_scf = wsq1 do1 : do iter = 1, maxiter @@ -773,11 +1027,15 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & end do end do if (verbose) then - print*, " MAXVAL(W^{n})=", MAXVAL(ABS(wsqn)), ". Threshold=", eps + print*, " MAXVAL(|W^{n}|)=", MAXVAL(ABS(wsqn)), ". Threshold=", eps print*, "" end if wsq_scf = wsq_scf + wsqn if (MAXVAL(ABS(wsqn)) < eps) exit do1 + if (MAXVAL(ABS(wsqn)) > MAXVAL(ABS(wsq2))) then + print*, "W^{(n)} is not decaying. Returning first order correction..." + wsqn=wsq1 + end if end do do1 if (verbose) then tend = omp_get_wtime() @@ -788,7 +1046,7 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & print*, "" endif -end subroutine get_scf_wsq +end subroutine get_sum_wsq subroutine get_indep2fc( & vs_red, refq2, refq2o, norbitq2, orbit2t, n_indep_elem, indep_elem, rot_cart, mapping, map_uc, map_tr, T_list, q_list, F, & From d310125eaa48271050021e151c132a683836a0d3 Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Fri, 3 Jul 2026 09:23:13 +0200 Subject: [PATCH 4/7] Fix in V permutations when summing in get_indep_2fc(), and improved outlogs --- Modules/Ensemble.py | 21 +++++++++++----- Modules/qClassify.py | 4 +-- SCHAModules/module_hess.f90 | 49 +++++++++++++++++++++++++++---------- 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/Modules/Ensemble.py b/Modules/Ensemble.py index 9b48ffd85..63a757d57 100644 --- a/Modules/Ensemble.py +++ b/Modules/Ensemble.py @@ -3846,7 +3846,7 @@ def get_free_energy_hessian(self, include_v4 = False, get_full_hessian = True, v return dyn_hessian, d3* 2.0 # Ha to Ry return dyn_hessian - def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_full_hessian = True, verbose = False): + def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1e-6, alpha_mix=0.3, get_full_hessian = True, verbose = False): """ Dev function. @@ -3865,6 +3865,15 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_ful include_v4 : bool If True we include the fourth order force constant matrix. This requires a lot of memory + do_scf : bool + If True, the W matrix is self-consitently converged. Otherwise, just the first + correction of the fourth-order is considered (False often enough in practice). + eps : float + Precision to reach for the max value of |W|. It is later weighted by alpha-mix + in practice to ensure convergence. Defaults to 1e-6. + alpha_mix : float + Mixing parameter used in the scf loop of W, where + W(n+1)=W(n)(1-alpha_mix)+alpha_mix*W(n+1). Default to 0.3. get_full_hessian : bool If True the full hessian matrix is returned, if false, only the correction to the SSCHA dynamical matrix is returned. @@ -4039,10 +4048,10 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_ful nat = self.current_dyn.structure.N_atoms n_modes = self.current_dyn.structure.N_atoms*mod[0]*mod[1]*mod[2]*3 - ref_3fc = SCHAModules.module_hess.get_ref3fc(nat, orbit3a, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, verbose) + ref_3fc = SCHAModules.module_hess.get_ref3fc(nat, orbit3a, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, True) vs_red = np.empty([nrefq2,nat*3,nat*3,nat*3], dtype=np.complex128) - vs_red = SCHAModules.module_hess.get_ref_vsq(refq2,trs_l,rot_3fc,ref_3fc,mapping_triplet,verbose) + vs_red = SCHAModules.module_hess.get_ref_vsq(refq2,trs_l,rot_3fc,ref_3fc,mapping_triplet,True) trs_gq, daq = SCHAModules.get_gq(trs_aq, trs_wq, transq, self.current_T) indep_fc = SCHAModules.module_hess.get_indep2fc(vs_red, refq2, refq2o, norbitq2, orbit2a, n_indep_elem, indep_elem, rot_cart, mapping, map_uc, map_tr, T_list, trs_qlist, trs_gq, verbose) @@ -4051,10 +4060,10 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_ful orbit4t, orbit4o, norbit_4, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, mapping_quadruplet = Classify.recognize_quadruplet(self.current_dyn, mapping, map_uc, verbose) - ref_4fc = SCHAModules.module_hess.get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, verbose) + ref_4fc = SCHAModules.module_hess.get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, True) ws_red = np.zeros([nrefq4,nat*3,nat*3,nat*3,nat*3], dtype=np.complex128) - ws_red = SCHAModules.module_hess.get_ref_wsq(refq4,trs_l,rot_4fc,ref_4fc,mapping_quadruplet,verbose) + ws_red = SCHAModules.module_hess.get_ref_wsq(refq4,trs_l,rot_4fc,ref_4fc,mapping_quadruplet,True) degs = qClassify.find_degeneracies(trs_wq) Pmn = qClassify.construct_Pmn(mapping, orbitq1a, orbitq1s, trs_polvecs, rot_cart) @@ -4063,7 +4072,7 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, get_ful vs = SCHAModules.module_hess.get_all_vsq(trs_l, v_red, map_uc) if do_scf: - ws_red_scf = SCHAModules.module_hess.get_scf_wsq(ws_red, trs_gq, refq4, refq4o, norbitq4, Pmn, degs, verbose) + ws_red_scf = SCHAModules.module_hess.get_scf_wsq(ws_red, trs_gq, refq4, refq4o, norbitq4, Pmn, degs, True, eps, alpha_mix) indep_fc4 = SCHAModules.module_hess.get_indep2fc_v4(vs, ws_red_scf, refq4, refq4o, norbitq4, orbit2a, n_indep_elem, indep_elem, trs_gq, Pmn, degs, mapping, rot_cart, verbose) else: indep_fc4 = SCHAModules.module_hess.get_indep2fc_v4(vs, ws_red, refq4, refq4o, norbitq4, orbit2a, n_indep_elem, indep_elem, trs_gq, Pmn, degs, mapping, rot_cart, verbose) diff --git a/Modules/qClassify.py b/Modules/qClassify.py index 4c1dce834..deec18c4e 100644 --- a/Modules/qClassify.py +++ b/Modules/qClassify.py @@ -52,7 +52,7 @@ def map_singlet(q_list, q_list_frac, rcell, rot_cart): q_list_frac_fixed = np.empty(q_list_frac.shape) its_zb = np.empty(q_list_frac.shape[0], dtype=np.int8) for qi,q in enumerate(q_list): - q_list_frac_fixed[qi] = CC.Methods.cart_to_cryst(rcell, _map_q_to_1st_bz(rcell, q)) + q_list_frac_fixed[qi] = np.round(CC.Methods.cart_to_cryst(rcell, _map_q_to_1st_bz(rcell, q)),6) if np.all((np.abs(np.round(2*q_list_frac_fixed[qi], 6))%1)<1e-6): its_zb[qi] = 0 else: @@ -70,7 +70,7 @@ def map_singlet(q_list, q_list_frac, rcell, rot_cart): for isym in range(rot_cart.shape[0]): q_sym_cart = rot_cart[isym] @ q q_sym_cart_1bz = _map_q_to_1st_bz(rcell, q_sym_cart) - q_sym = CC.Methods.cart_to_cryst(rcell, q_sym_cart_1bz) + q_sym = np.round(CC.Methods.cart_to_cryst(rcell, q_sym_cart_1bz),6) match = np.all(np.abs(q_list_frac_fixed-q_sym)<1e-3, axis=1) qii = np.where(match) mapping[qi,isym] = qii[0][0] diff --git a/SCHAModules/module_hess.f90 b/SCHAModules/module_hess.f90 index 54f3ada87..e42c27783 100644 --- a/SCHAModules/module_hess.f90 +++ b/SCHAModules/module_hess.f90 @@ -277,6 +277,7 @@ subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1 complex, dimension(nrefq2, n_mode, n_mode, n_mode), intent(out) :: v1 double precision, dimension(27) :: aux_3fc + double precision :: tstart, tend integer :: n_mode_sc, n_mode, ns, qmu, qnu, mu, nu, at3, iq, index, nrefq2, dimq2, i,j, rq2 integer :: nperm,nsym,nref3,ref3,equiv,iperm,isym,a,b,c,alpha,beta,gamma,nat,nat_sc complex, dimension(:), allocatable :: laux1, laux2 @@ -293,13 +294,17 @@ subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1 allocate(laux2(n_mode_sc)) if (verbose) then - print*, "======================= get_ref_vsq() =======================" - print*, "Computing all reference V_{a}^{\alpha}(q1,q2)." + tstart = omp_get_wtime() + print*, "======================= get_ref_vsq() ======================" + print*, "" + print*, " Computing all reference V_{a}^{\alpha}(q1,q2)." + print*, "" end if v1 = 0 !$omp parallel private (qmu,qnu,at3,a,alpha,mu,laux1,lres1,ref3,equiv,iperm,isym,i,j) !$omp do schedule (dynamic, 1) private (b,c,aux_3fc,beta,gamma,index,nu,laux2) do rq2 = 1, nrefq2 + print*, " Calculating V(rq2=", rq2,") out of", nrefq2 qmu = refq2(rq2,1,1) qnu = refq2(rq2,1,2) do at3 = 1, n_mode @@ -341,6 +346,9 @@ subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1 !$omp end do !$omp end parallel if (verbose) then + tend = omp_get_wtime() + print*, "" + print*, "Elapsed time inside get_ref_vsq():", tend-tstart, "seconds." print*, "======================= DONE =======================" print*, "" endif @@ -421,9 +429,12 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose if (verbose) then tstart = omp_get_wtime() - print*, "======================= get_ref_wsq() =======================" - print*, "Computing the", nrefq4, "reference W(-q1,q2,q3,-q4)." - print*, "This might take some time..." + print*, "======================= get_ref_wsq() ======================" + print*, "" + print*, " Computing the", nrefq4, "reference W(-q1,q2,q3,-q4)." + print*, "" + print*, " This might take some time..." + print*, "" end if ns = n_mode_sc @@ -431,6 +442,7 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose v1 = 0.0d0 tstart = omp_get_wtime() do rq4 = 1, nrefq4 + print*, " Calculating W(rq4=", rq4,") out of", nrefq4 q1 = refq4(rq4,1,1)+1 q2 = refq4(rq4,1,2)+1 q3 = refq4(rq4,1,3)+1 @@ -520,13 +532,14 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose end do if (verbose) then tend = omp_get_wtime() - print*, "Elapsed time inside get_ref_wsq():", tend-tstart + print*, "" + print*, "Elapsed time inside get_ref_wsq():", tend-tstart, "seconds." print*, "======================= DONE =======================" print*, "" endif end subroutine get_ref_wsq -subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & +subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, alpha_mix, & wsq_scf, nrefq4, n_mode, iq, dimq4, nsym) implicit none @@ -543,6 +556,8 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & logical, dimension(iq, n_mode, n_mode), intent(in) :: degs logical, intent(in) :: verbose + double precision, intent(in) :: eps, alpha_mix + complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode), intent(out) :: wsq_scf complex(8), dimension(nrefq4,n_mode,n_mode,n_mode,n_mode) :: wsq2 @@ -560,8 +575,6 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & integer :: q10,q20,q30,q40,q5,q6,iperm_1,iperm_2,isym_1,isym_2 complex(8) :: ktea1, ktea2, W1, W2 - double precision, parameter :: eps = 1e-6 - double precision, parameter :: alpha_mix = 0.5d0 integer, parameter :: maxiter = 50 perms = reshape([ & @@ -575,12 +588,16 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & if (verbose) then tstart = omp_get_wtime() print*, "======================= get_scf_wsq() =======================" - print*, "Self-consintent loop to compute \Theta(-q1,q2,q3,-q4)." + print*, "" + print*, " Self-consintent loop to compute \Theta(-q1,q2,q3,-q4)." + print*, "" + print*, " eps=", eps, " alpha_mix=", alpha_mix print*, "" end if do1 : do iter = 1, maxiter if (verbose) then print*, " Iteration", iter + print*, " ---------------------" end if if (iter == 1) then wsq2 = wsq1 @@ -779,7 +796,7 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & tend = omp_get_wtime() print*, "Convergence found with", iter, "iterations" print*, "" - print*, "Elapsed time inside get_scf_wsq():", tend-tstart + print*, "Elapsed time inside get_scf_wsq():", tend-tstart, "seconds." print*, "======================= DONE =======================" print*, "" endif @@ -839,6 +856,7 @@ subroutine get_sum_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & do1 : do iter = 1, maxiter if (verbose) then print*, " Iteration", iter + print*, " -----------------------" end if if (iter == 1) then wsq2 = wsq1 @@ -1041,7 +1059,7 @@ subroutine get_sum_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & tend = omp_get_wtime() print*, "Convergence found with", iter, "iterations" print*, "" - print*, "Elapsed time inside get_scf_wsq():", tend-tstart + print*, "Elapsed time inside get_scf_wsq():", tend-tstart, "seconds." print*, "======================= DONE =======================" print*, "" endif @@ -1119,8 +1137,13 @@ subroutine get_indep2fc( & Vsb = & dot_product(rot_cart(isym+1,beta+1,:),vs_q(nat2p_uc*3+1:(nat2p_uc+1)*3+1)) * & exp(-2*j*pi*dot_product(q_list(refq2(rq2,1,1)+1,:)-q_list(refq2(rq2,1,2)+1,:),T_list(map_tr(nat2p+1)+1,:))) - indep_fc(ref2,i) = indep_fc(ref2,i) + & + if (iperm == 0) then + indep_fc(ref2,i) = indep_fc(ref2,i) + & real(0.5d0*F(refq2(rq2,1,1)+1,refq2(rq2,1,2)+1,munu(permutations(iperm+1,1)), munu(permutations(iperm+1,2)))*Vsa*CONJG(Vsb)) + else + indep_fc(ref2,i) = indep_fc(ref2,i) + & +real(0.5d0*F(refq2(rq2,1,1)+1,refq2(rq2,1,2)+1,munu(permutations(iperm+1,1)), munu(permutations(iperm+1,2)))*CONJG(Vsa)*Vsb) + end if end do end do end do From 8e97e02a51ddc235df7f3b7fb614201f845be648 Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Tue, 7 Jul 2026 11:36:30 +0200 Subject: [PATCH 5/7] Minimal changes in the logout --- SCHAModules/module_hess.f90 | 135 ++++++++++++------------------------ 1 file changed, 44 insertions(+), 91 deletions(-) diff --git a/SCHAModules/module_hess.f90 b/SCHAModules/module_hess.f90 index e42c27783..77cb0df76 100644 --- a/SCHAModules/module_hess.f90 +++ b/SCHAModules/module_hess.f90 @@ -225,7 +225,7 @@ subroutine get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot if (verbose) then print *, "======================= get_ref4fc() ======================= " - print *, "Computing the independent elements for the 4th order FCs." + print *, " Computing the independent elements for the 4th order FCs" end if !$omp parallel private (i, nat1, nat2, nat3, nat4, alpha, beta, gamma, delta) @@ -297,14 +297,15 @@ subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1 tstart = omp_get_wtime() print*, "======================= get_ref_vsq() ======================" print*, "" - print*, " Computing all reference V_{a}^{\alpha}(q1,q2)." + print*, " Computing all reference V_{a}^{\alpha}(q1,q2)" print*, "" end if v1 = 0 !$omp parallel private (qmu,qnu,at3,a,alpha,mu,laux1,lres1,ref3,equiv,iperm,isym,i,j) !$omp do schedule (dynamic, 1) private (b,c,aux_3fc,beta,gamma,index,nu,laux2) do rq2 = 1, nrefq2 - print*, " Calculating V(rq2=", rq2,") out of", nrefq2 + print "(A, I8, A, I8)", & +" Calculating V(rq2=", rq2,") out of", nrefq2 qmu = refq2(rq2,1,1) qnu = refq2(rq2,1,2) do at3 = 1, n_mode @@ -348,7 +349,7 @@ subroutine get_ref_vsq(refq2,pol_vecs,rot_3fc,ref_3fc,mapping_triplet,verbose,v1 if (verbose) then tend = omp_get_wtime() print*, "" - print*, "Elapsed time inside get_ref_vsq():", tend-tstart, "seconds." + print "(A, ES16.6,A)", " Elapsed time inside get_ref_vsq():", tend-tstart, " seconds" print*, "======================= DONE =======================" print*, "" endif @@ -431,7 +432,8 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose tstart = omp_get_wtime() print*, "======================= get_ref_wsq() ======================" print*, "" - print*, " Computing the", nrefq4, "reference W(-q1,q2,q3,-q4)." + print "(A, I8, A)", & +" Computing the", nrefq4, " reference W^{(1)}(q1,q2,q3,q4)" print*, "" print*, " This might take some time..." print*, "" @@ -442,7 +444,7 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose v1 = 0.0d0 tstart = omp_get_wtime() do rq4 = 1, nrefq4 - print*, " Calculating W(rq4=", rq4,") out of", nrefq4 + print "(A, I8, A, I8)", " Calculating W(rq4=", rq4,") out of", nrefq4 q1 = refq4(rq4,1,1)+1 q2 = refq4(rq4,1,2)+1 q3 = refq4(rq4,1,3)+1 @@ -533,7 +535,7 @@ subroutine get_ref_wsq(refq4,pol_vecs,rot_4fc,ref_4fc,mapping_quadruplet,verbose if (verbose) then tend = omp_get_wtime() print*, "" - print*, "Elapsed time inside get_ref_wsq():", tend-tstart, "seconds." + print "(A, ES16.6,A)", " Elapsed time inside get_ref_wsq():", tend-tstart, " seconds" print*, "======================= DONE =======================" print*, "" endif @@ -565,7 +567,7 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, double precision :: tstart, tend - integer, dimension(12,4) :: perms + integer, dimension(8,4) :: perms integer, dimension(4) :: nunu, lala, mumu1, mumu2 integer :: nrefq4, n_mode, iq, dimq4, nsym integer :: mu1,mu2,mu3,mu4,mu5,mu6,iter @@ -574,29 +576,31 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, integer :: nu1,nu2,nu5,nu6,lambda3,lambda4,lambda5,lambda6 integer :: q10,q20,q30,q40,q5,q6,iperm_1,iperm_2,isym_1,isym_2 + logical :: its_conv complex(8) :: ktea1, ktea2, W1, W2 - integer, parameter :: maxiter = 50 + integer, parameter :: maxiter = 10 perms = reshape([ & 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & - 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & - 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & - [12,4], order=[2,1]) + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1], & + [8,4], order=[2,1]) wsq_scf = wsq1 + its_conv = .true. if (verbose) then tstart = omp_get_wtime() print*, "======================= get_scf_wsq() =======================" print*, "" - print*, " Self-consintent loop to compute \Theta(-q1,q2,q3,-q4)." + print*, " Self-consintent loop to compute W(q1,q2,q3,q4)" print*, "" - print*, " eps=", eps, " alpha_mix=", alpha_mix + print "(A, ES16.6, A, ES16.6)", & +" eps=", eps, "; alpha_mix=", alpha_mix print*, "" end if do1 : do iter = 1, maxiter if (verbose) then - print*, " Iteration", iter + print "(A, I4)", " Iteration", iter print*, " ---------------------" end if if (iter == 1) then @@ -683,18 +687,6 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) elseif (iperm_1 == 7) then W1 = & -ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) - elseif (iperm_1 == 8) then - W1 = & -ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) - elseif (iperm_1 == 9) then - W1 = & -CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) - elseif (iperm_1 == 10) then - W1 = & -CONJG(ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4)))) - elseif (iperm_1 == 11) then - W1 = & ktea1*wsq2(rq4_1,nunu(perms(iperm_1+1,1)),nunu(perms(iperm_1+1,2)),nunu(perms(iperm_1+1,3)),nunu(perms(iperm_1+1,4))) end if do mu3 = 1, n_mode @@ -737,18 +729,6 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) elseif (iperm_2 == 7) then W2 = & -ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) - elseif (iperm_2 == 8) then - W2 = & -ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) - elseif (iperm_2 == 9) then - W2 = & -CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) - elseif (iperm_2 == 10) then - W2 = & -CONJG(ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4)))) - elseif (iperm_2 == 11) then - W2 = & ktea2*wsq1(rq4_2,lala(perms(iperm_2+1,1)),lala(perms(iperm_2+1,2)),lala(perms(iperm_2+1,3)),lala(perms(iperm_2+1,4))) end if wsqn(rq4_0,mu1,mu2,mu3,mu4) = & @@ -787,16 +767,28 @@ subroutine get_scf_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, eps, end do wsq_scf = wsq_scf*(1-alpha_mix) +alpha_mix*(wsq1+wsqn) if (verbose) then - print*, " MAXVAL(|W(n)-W(n-1)|)", MAXVAL(ABS(wsq_scf-wsq2)), ". Threshold (weighted by alpha_mix)=", eps*alpha_mix + print "(A, ES16.6)", & +" MAXVAL(|W(n)-W(n-1)|) =", MAXVAL(ABS(wsq_scf-wsq2)) + print "(A, ES16.6)", & +" Threshold (weighted by alpha_mix) =", eps*alpha_mix print*, "" end if if (MAXVAL(ABS(wsq_scf-wsq2)) < eps*alpha_mix) exit do1 + if (iter == maxiter) then + wsq_scf = wsq1 + its_conv = .false. + end if end do do1 if (verbose) then tend = omp_get_wtime() - print*, "Convergence found with", iter, "iterations" + if (its_conv) then + print "(A, I4, A)", " Convergence found with", iter, " iterations" + else + print "(A, I4, A)", " Convergence not found with", iter, " iterations" + print "(A)", " Returning first order W^{(1)}(q1,q2,q3,q4)" + end if print*, "" - print*, "Elapsed time inside get_scf_wsq():", tend-tstart, "seconds." + print "(A, ES16.6,A)", " Elapsed time inside get_scf_wsq():", tend-tstart, " seconds" print*, "======================= DONE =======================" print*, "" endif @@ -1059,7 +1051,7 @@ subroutine get_sum_wsq(wsq1, F, refq4, refq4o, norbitq4, P, degs, verbose, & tend = omp_get_wtime() print*, "Convergence found with", iter, "iterations" print*, "" - print*, "Elapsed time inside get_scf_wsq():", tend-tstart, "seconds." + print "(A, ES16.6,A)", " Elapsed time inside get_scf_wsq():", tend-tstart, " seconds" print*, "======================= DONE =======================" print*, "" endif @@ -1299,43 +1291,6 @@ subroutine get_indep2fc_v4( & F(q10,q20,mu1,mu2) * & F(q30,q40,mu3,mu4) * & vsa*W*CONJG(vsb)) - elseif (iperm == 8) then - vsa= & - dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q40,q20,mu4,mu2)) - vsb= & - dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q30,q10,mu3,mu1)) - indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & -F(q10,q20,mu1,mu2) * & -F(q30,q40,mu3,mu4) * & -vsa*W*CONJG(vsb)) - elseif (iperm == 9) then - vsa= & - dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q20,q40,mu2,mu4)) - vsb= & - dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q10,q30,mu1,mu3)) - indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & -F(q10,q20,mu1,mu2) * & -F(q30,q40,mu3,mu4) * & -vsa*W*CONJG(vsb)) - elseif (iperm == 10) then - vsa= & - dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q30,q10,mu3,mu1)) - vsb= & - dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q40,q20,mu4,mu2)) - indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & -F(q10,q20,mu1,mu2) * & -F(q30,q40,mu3,mu4) * & -vsa*W*CONJG(vsb)) - elseif (iperm == 11) then - vsa= & - dot_product(rot_cart(isym+1,alpha,:),vs(3*nat1p+1:3*(nat1p+1)+1,q10,q30,mu1,mu3)) - vsb= & - dot_product(rot_cart(isym+1,beta,:),vs(3*nat2p+1:3*(nat2p+1)+1,q20,q40,mu2,mu4)) - indep_fc(ref2,i) = indep_fc(ref2,i) + real(0.25d0* & -F(q10,q20,mu1,mu2) * & -F(q30,q40,mu3,mu4) * & -vsa*W*CONJG(vsb)) - end if end do end do @@ -2088,7 +2043,7 @@ subroutine get_q_nref4(mappings, nref4, norbitq4, iq, nsym) integer, allocatable, dimension(:) :: norbit4 integer, dimension(12*nsym, 4) :: equilist - integer, dimension(12,4) :: permutations + integer, dimension(8,4) :: permutations integer, dimension(4) :: qplet, qplet_perm, qplet_sym integer :: q1, q2, q3, q4, nall4, equiv, iperm, isym, iq, nsym logical :: its_in_list @@ -2098,9 +2053,8 @@ subroutine get_q_nref4(mappings, nref4, norbitq4, iq, nsym) permutations = reshape([ & 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & - 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & - 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & - [12,4], order=[2,1]) + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1], & + [8,4], order=[2,1]) !permutations = reshape([1,2,3,4], [1,4]) @@ -2116,7 +2070,7 @@ subroutine get_q_nref4(mappings, nref4, norbitq4, iq, nsym) if (its_in_list) cycle do4 nref4 = nref4 + 1 equiv = 0 - do iperm = 1, 12 + do iperm = 1, 8 qplet_perm(1) = qplet(permutations(iperm,1)) qplet_perm(2) = qplet(permutations(iperm,2)) qplet_perm(3) = qplet(permutations(iperm,3)) @@ -2158,7 +2112,7 @@ subroutine recognize_q_quadruplet(nref4, norbitq4, q_list, mappings, verbose, & integer, dimension(iq**4,4) :: all4 integer, dimension(norbitq4, 4) :: equilist - integer, dimension(12,4) :: permutations + integer, dimension(8,4) :: permutations integer, dimension(4) :: qplet, qplet_perm, qplet_sym integer :: q1, q2, q3, q4, nall4, equiv, iperm, isym integer :: iq, nsym @@ -2171,9 +2125,8 @@ subroutine recognize_q_quadruplet(nref4, norbitq4, q_list, mappings, verbose, & permutations = reshape([ & 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1, & - 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1, & - 4,2,3,1, 2,4,1,3, 3,1,4,2, 1,3,2,4], & - [12,4], order=[2,1]) + 1,3,2,4, 3,1,4,2, 2,4,1,3, 4,2,3,1], & + [8,4], order=[2,1]) ref4 = 0 nall4 = 0 @@ -2190,7 +2143,7 @@ subroutine recognize_q_quadruplet(nref4, norbitq4, q_list, mappings, verbose, & if (its_cons) then ref4 = ref4 + 1 equiv = 0 - do iperm = 1, 12 + do iperm = 1, 8 qplet_perm(1) = qplet(permutations(iperm,1)) qplet_perm(2) = qplet(permutations(iperm,2)) qplet_perm(3) = qplet(permutations(iperm,3)) @@ -2212,7 +2165,7 @@ subroutine recognize_q_quadruplet(nref4, norbitq4, q_list, mappings, verbose, & norbit(ref4) = equiv else equiv = 0 - do iperm = 1, 12 + do iperm = 1, 8 qplet_perm(1) = qplet(permutations(iperm,1)) qplet_perm(2) = qplet(permutations(iperm,2)) qplet_perm(3) = qplet(permutations(iperm,3)) From 83a5f43e11c2cc5a8f18cb3344da3a34e97129b7 Mon Sep 17 00:00:00 2001 From: Manex Alkorta Date: Tue, 21 Jul 2026 12:20:31 +0200 Subject: [PATCH 6/7] Added test_free_energy_hessian_dev and remove dummy variables from ensemble.init() --- Modules/Ensemble.py | 46 +- .../test_free_energy_hessian_dev/hessianv4_1 | 149 ++++++ .../test_free_energy_hessian_dev/hessianv4_2 | 494 ++++++++++++++++++ .../test_free_energy_hessian_dev/hessianv4_3 | 218 ++++++++ .../data_ensemble/all_properties_pop1.json | 1 + .../sscha/data_ensemble/dyn_gen_pop1_1 | 149 ++++++ .../sscha/data_ensemble/dyn_gen_pop1_2 | 494 ++++++++++++++++++ .../sscha/data_ensemble/dyn_gen_pop1_3 | 218 ++++++++ .../sscha/data_ensemble/energies_pop1.npy | Bin 0 -> 928 bytes .../sscha/data_ensemble/forces_pop1.npy | Bin 0 -> 86528 bytes .../sscha/data_ensemble/stresses_pop1.npy | Bin 0 -> 7328 bytes .../sscha/data_ensemble/xats_pop1.npy | Bin 0 -> 86528 bytes .../test_free_energy_hessian_dev.py | 35 ++ 13 files changed, 1780 insertions(+), 24 deletions(-) create mode 100644 tests/test_free_energy_hessian_dev/hessianv4_1 create mode 100644 tests/test_free_energy_hessian_dev/hessianv4_2 create mode 100644 tests/test_free_energy_hessian_dev/hessianv4_3 create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/all_properties_pop1.json create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_1 create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_2 create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_3 create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/energies_pop1.npy create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/forces_pop1.npy create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/stresses_pop1.npy create mode 100644 tests/test_free_energy_hessian_dev/sscha/data_ensemble/xats_pop1.npy create mode 100644 tests/test_free_energy_hessian_dev/test_free_energy_hessian_dev.py diff --git a/Modules/Ensemble.py b/Modules/Ensemble.py index 63a757d57..9de4644a9 100644 --- a/Modules/Ensemble.py +++ b/Modules/Ensemble.py @@ -252,19 +252,6 @@ def __init__(self, dyn0, T0, supercell = None, **kwargs): # A flag that memorize if the ensemble has also the stresses self.has_stress = True - # Store data for calculations of 3FC elements: - self.a = np.zeros( (Nsc * 3), dtype = np.double) - self.new_pol = np.zeros( (Nsc, Nsc * 3, 3), dtype = np.double) - # If the element is sym: - self.ur = np.zeros( (self.N, Nsc * 3)) - self.upsilon = np.zeros( (Nsc*3, Nsc * 3)) - # Symmetry data for sym 3FC: - self.nsym = 0 - self.s_cart = np.zeros( (3, 3, 48) , dtype = np.float64, order = "F") - self.s_inv_cart = np.zeros( (3, 3, 48) , dtype = np.float64, order = "F") - self.irt = np.zeros( (48, Nsc), dtype = np.intc, order = "F") - self.translations_irt = np.zeros( (Nsc, np.prod(self.supercell)), dtype = np.intc, order = "F") - # A flag for each configuration that check if it possess a force and a stress self.force_computed = None self.stress_computed = None @@ -3911,6 +3898,17 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 nat_sc = int(np.shape(pols)[0] / 3) nat = self.dyn_0.structure.N_atoms + a = np.zeros( (nat_sc * 3), dtype = np.double) + new_pol = np.zeros( (nat_sc, nat_sc * 3, 3), dtype = np.double) + # If the element is sym: + ur = np.zeros( (self.N, nat_sc * 3)) + upsilon = np.zeros( (nat_sc*3, nat_sc * 3)) + # Symmetry data for sym 3FC: + s_cart = np.zeros( (3, 3, 48) , dtype = np.float64, order = "F") + s_inv_cart = np.zeros( (3, 3, 48) , dtype = np.float64, order = "F") + irt = np.zeros( (48, nat_sc), dtype = np.intc, order = "F") + translations_irt = np.zeros( (nat_sc, np.prod(self.supercell)), dtype = np.intc, order = "F") + # Get the translational modes if not self.ignore_small_w: trans = CC.Methods.get_translations(pols, super_structure.get_masses_array()) @@ -3933,25 +3931,25 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 u = self.u_disps.reshape((self.N, nat_sc, 3), order = "C") #/ Bohr log_err = "err_yesrho" - self.a = SCHAModules.thermodynamic.w_to_a(w, self.current_T) + a = SCHAModules.thermodynamic.w_to_a(w, self.current_T) # Get the polarization vectors in the correct format for i in range(nat_sc): for j in range(n_modes): - self.new_pol[i, j, :] = pols[3*i : 3*(i+1), j] + new_pol[i, j, :] = pols[3*i : 3*(i+1), j] #Calculating rotated displacements and upsilon matrix" - self.ur, self.upsilon = SCHAModules.get_ur_upsilon_matrices(self.a, self.new_pol, trans, amass, ityp, u) + ur, upsilon = SCHAModules.get_ur_upsilon_matrices(a, new_pol, trans, amass, ityp, u) #Obtaining symmetry data qe_sym = CC.symmetries.QE_Symmetry(super_structure) qe_sym.SetupFromSPGLIB() # SpaceGroup symmetries data - self.nsym, self.s_cart, self.s_inv_cart, self.irt = qe_sym.QE_nsym, qe_sym.QE_s_cart, qe_sym.QE_s_inv_cart, qe_sym.QE_irt - self.s_cart = np.asfortranarray(self.s_cart) - self.s_inv_cart = np.asfortranarray(self.s_inv_cart) + s_cart, s_inv_cart, irt = qe_sym.QE_s_cart, qe_sym.QE_s_inv_cart, qe_sym.QE_irt + s_cart = np.asfortranarray(s_cart) + s_inv_cart = np.asfortranarray(s_inv_cart) #Translations - self.translations_irt = qe_sym.QE_translations_irt + translations_irt = qe_sym.QE_translations_irt #self.prepare_sym_third_fc = False wq = np.empty(nat*3, dtype=np.float64) @@ -4048,7 +4046,7 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 nat = self.current_dyn.structure.N_atoms n_modes = self.current_dyn.structure.N_atoms*mod[0]*mod[1]*mod[2]*3 - ref_3fc = SCHAModules.module_hess.get_ref3fc(nat, orbit3a, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, True) + ref_3fc = SCHAModules.module_hess.get_ref3fc(nat, orbit3a, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, ur, upsilon, f, self.rho, log_err, s_inv_cart, irt, translations_irt, True) vs_red = np.empty([nrefq2,nat*3,nat*3,nat*3], dtype=np.complex128) vs_red = SCHAModules.module_hess.get_ref_vsq(refq2,trs_l,rot_3fc,ref_3fc,mapping_triplet,True) @@ -4060,7 +4058,7 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 orbit4t, orbit4o, norbit_4, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, mapping_quadruplet = Classify.recognize_quadruplet(self.current_dyn, mapping, map_uc, verbose) - ref_4fc = SCHAModules.module_hess.get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt, True) + ref_4fc = SCHAModules.module_hess.get_ref4fc(orbit4t, indep_4fc_elem, n_indep_4fc_elem, kernel_4fc, rot_4fc, ur, upsilon, f, self.rho, log_err, s_inv_cart, irt, translations_irt, True) ws_red = np.zeros([nrefq4,nat*3,nat*3,nat*3,nat*3], dtype=np.complex128) ws_red = SCHAModules.module_hess.get_ref_wsq(refq4,trs_l,rot_4fc,ref_4fc,mapping_quadruplet,True) @@ -4068,7 +4066,7 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 degs = qClassify.find_degeneracies(trs_wq) Pmn = qClassify.construct_Pmn(mapping, orbitq1a, orbitq1s, trs_polvecs, rot_cart) - v_red, ref_3fc = SCHAModules.module_hess.get_v3_red(nat, norbit3, orbit3a, orbit3s, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, self.ur, self.upsilon, f, self.rho, log_err, self.s_inv_cart, self.irt, self.translations_irt) + v_red, ref_3fc = SCHAModules.module_hess.get_v3_red(nat, norbit3, orbit3a, orbit3s, indep_3fc_elem, n_indep_3fc_elem, kernel_3fc, rot_3fc, ur, upsilon, f, self.rho, log_err, s_inv_cart, irt, translations_irt) vs = SCHAModules.module_hess.get_all_vsq(trs_l, v_red, map_uc) if do_scf: @@ -4089,7 +4087,7 @@ def get_free_energy_hessian_dev(self, include_v4 = False, do_scf = True, eps = 1 for r in range(nr): # Translated Single atomic-cartesian index # Fortran to Py: -1 - phi_sc_odd[3*(self.translations_irt[nat1,r]-1)+alpha, 3*(self.translations_irt[nat2,r]-1)+beta] = fc9[index] + phi_sc_odd[3*(translations_irt[nat1,r]-1)+alpha, 3*(translations_irt[nat2,r]-1)+beta] = fc9[index] dynq_odd = CC.Phonons.GetDynQFromFCSupercell(phi_sc_odd, np.array(self.current_dyn.q_tot), self.current_dyn.structure, super_structure) self.convert_units(UNITS_DEFAULT) diff --git a/tests/test_free_energy_hessian_dev/hessianv4_1 b/tests/test_free_energy_hessian_dev/hessianv4_1 new file mode 100644 index 000000000..6f3b51f82 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/hessianv4_1 @@ -0,0 +1,149 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0799999999999996 0.0000000000000000 0.0000000000000000 + -1.5399999999999998 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000002 0.0000000000000001 -0.0040643610314026 + 2 1 -0.0000000000000001 1.7782388266666669 2.5209356389685977 + 3 2 -0.0000000000000002 0.0000000000000001 1.9032535866761318 + 4 2 -0.0000000000000001 1.7782388266666669 4.4282535866761314 + + Dynamical Matrix in cartesian axes + + q = ( 0.000000000000 0.000000000000 0.000000000000 ) + + 1 1 + 0.2224249498463850 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.2224249504252410 0.0000000000000000 0.0000000000059596 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0000000000059596 0.0000000000000000 0.4271177583537886 0.0000000000000000 + 1 2 + 0.0102391881583775 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0102391881730570 0.0000000000000000 0.0000000000005833 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000005833 0.0000000000000000 -0.2191138738805857 0.0000000000000000 + 1 3 + -0.0606756614223764 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0606756615756377 0.0000000000000000 0.0000000000013264 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000012314 0.0000000000000000 -0.0514604669025081 0.0000000000000000 + 1 4 + -0.1719884765823874 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1719884770226615 0.0000000000000000 -0.0000000000078693 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000066077 0.0000000000000000 -0.1565434175706992 0.0000000000000000 + 2 1 + 0.0102391881583775 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0102391881730570 0.0000000000000000 -0.0000000000005833 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000005833 0.0000000000000000 -0.2191138738805857 0.0000000000000000 + 2 2 + 0.2224249498463850 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.2224249504252410 0.0000000000000000 -0.0000000000059596 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000059596 0.0000000000000000 0.4271177583537886 0.0000000000000000 + 2 3 + -0.1719884765823874 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1719884770226615 0.0000000000000000 0.0000000000078693 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000066077 0.0000000000000000 -0.1565434175706992 0.0000000000000000 + 2 4 + -0.0606756614223764 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0606756615756377 0.0000000000000000 -0.0000000000013264 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000012314 0.0000000000000000 -0.0514604669025081 0.0000000000000000 + 3 1 + -0.0606756614223763 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0606756615756377 0.0000000000000000 0.0000000000012314 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0000000000013264 0.0000000000000000 -0.0514604669025081 0.0000000000000000 + 3 2 + -0.1719884765823874 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1719884770226615 0.0000000000000000 0.0000000000066077 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000078693 0.0000000000000000 -0.1565434175706992 0.0000000000000000 + 3 3 + 0.2508160735417163 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.2508160741961777 0.0000000000000000 -0.0000000000085173 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000085173 0.0000000000000000 0.3726347100885012 0.0000000000000000 + 3 4 + -0.0181519355369513 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0181519355978773 0.0000000000000000 0.0000000000006783 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000006783 0.0000000000000000 -0.1646308256152895 0.0000000000000000 + 4 1 + -0.1719884765823874 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1719884770226615 0.0000000000000000 -0.0000000000066077 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000078693 0.0000000000000000 -0.1565434175706992 0.0000000000000000 + 4 2 + -0.0606756614223764 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0606756615756377 0.0000000000000000 -0.0000000000012314 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000013264 0.0000000000000000 -0.0514604669025081 0.0000000000000000 + 4 3 + -0.0181519355369513 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0181519355978773 0.0000000000000000 -0.0000000000006783 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0000000000006783 0.0000000000000000 -0.1646308256152895 0.0000000000000000 + 4 4 + 0.2508160735417163 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.2508160741961777 0.0000000000000000 0.0000000000085173 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000085173 0.0000000000000000 0.3726347100885012 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.000000000000 0.000000000000 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 0.00000009 [THz] = 0.00000300 [cm-1] +( 0.145757 0.000000 0.282883 0.000000 0.385658 0.000000 ) +( 0.145757 0.000000 0.282883 0.000000 0.385658 0.000000 ) +( 0.145757 0.000000 0.282883 0.000000 0.385658 0.000000 ) +( 0.145757 0.000000 0.282883 0.000000 0.385658 0.000000 ) + freq ( 2) = 0.00000018 [THz] = 0.00000609 [cm-1] +( -0.453056 0.000000 -0.047546 0.000000 0.206106 0.000000 ) +( -0.453056 0.000000 -0.047546 0.000000 0.206106 0.000000 ) +( -0.453056 0.000000 -0.047546 0.000000 0.206106 0.000000 ) +( -0.453056 0.000000 -0.047546 0.000000 0.206106 0.000000 ) + freq ( 3) = 0.00000048 [THz] = 0.00001597 [cm-1] +( -0.153281 0.000000 0.409532 0.000000 -0.242463 0.000000 ) +( -0.153281 0.000000 0.409532 0.000000 -0.242463 0.000000 ) +( -0.153281 0.000000 0.409532 0.000000 -0.242463 0.000000 ) +( -0.153281 0.000000 0.409532 0.000000 -0.242463 0.000000 ) + freq ( 4) = 8.00349639 [THz] = 266.96786497 [cm-1] +( -0.620838 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( 0.620838 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( 0.338468 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( -0.338468 0.000000 0.000000 0.000000 -0.000000 0.000000 ) + freq ( 5) = 8.00349640 [THz] = 266.96786533 [cm-1] +( -0.000000 0.000000 -0.620838 0.000000 0.000000 0.000000 ) +( 0.000000 0.000000 0.620838 0.000000 0.000000 0.000000 ) +( 0.000000 0.000000 0.338468 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 -0.338468 0.000000 -0.000000 0.000000 ) + freq ( 6) = 16.01350909 [THz] = 534.15309058 [cm-1] +( -0.000000 0.000000 -0.000000 0.000000 0.661398 0.000000 ) +( 0.000000 0.000000 -0.000000 0.000000 -0.661398 0.000000 ) +( -0.000000 0.000000 0.000000 0.000000 -0.250106 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 0.250106 0.000000 ) + freq ( 7) = 17.07550534 [THz] = 569.57746747 [cm-1] +( 0.160559 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( -0.160559 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( 0.688637 0.000000 0.000000 0.000000 0.000000 0.000000 ) +( -0.688637 0.000000 -0.000000 0.000000 0.000000 0.000000 ) + freq ( 8) = 17.07550537 [THz] = 569.57746823 [cm-1] +( -0.000000 0.000000 0.160559 0.000000 -0.000000 0.000000 ) +( 0.000000 0.000000 -0.160559 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 0.688637 0.000000 0.000000 0.000000 ) +( 0.000000 0.000000 -0.688637 0.000000 0.000000 0.000000 ) + freq ( 9) = 17.13443009 [THz] = 571.54298523 [cm-1] +( -0.000000 0.000000 -0.000000 0.000000 -0.278046 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 -0.278046 0.000000 ) +( -0.000000 0.000000 -0.000000 0.000000 0.650147 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 0.650147 0.000000 ) + freq ( 10) = 18.12168868 [THz] = 604.47438219 [cm-1] +( -0.278046 0.000000 -0.000000 0.000000 0.000000 0.000000 ) +( -0.278046 0.000000 -0.000000 0.000000 0.000000 0.000000 ) +( 0.650147 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( 0.650147 0.000000 0.000000 0.000000 -0.000000 0.000000 ) + freq ( 11) = 18.12168870 [THz] = 604.47438296 [cm-1] +( -0.000000 0.000000 0.278046 0.000000 0.000000 0.000000 ) +( -0.000000 0.000000 0.278046 0.000000 -0.000000 0.000000 ) +( 0.000000 0.000000 -0.650147 0.000000 -0.000000 0.000000 ) +( 0.000000 0.000000 -0.650147 0.000000 0.000000 0.000000 ) + freq ( 12) = 23.40869849 [THz] = 780.83002148 [cm-1] +( -0.000000 0.000000 0.000000 0.000000 0.112887 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 -0.112887 0.000000 ) +( 0.000000 0.000000 -0.000000 0.000000 0.698038 0.000000 ) +( 0.000000 0.000000 -0.000000 0.000000 -0.698038 0.000000 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/hessianv4_2 b/tests/test_free_energy_hessian_dev/hessianv4_2 new file mode 100644 index 000000000..6462d86e9 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/hessianv4_2 @@ -0,0 +1,494 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0799999999999996 0.0000000000000000 0.0000000000000000 + -1.5399999999999998 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000002 0.0000000000000001 -0.0040643610314026 + 2 1 -0.0000000000000001 1.7782388266666669 2.5209356389685977 + 3 2 -0.0000000000000002 0.0000000000000001 1.9032535866761318 + 4 2 -0.0000000000000001 1.7782388266666669 4.4282535866761314 + + Dynamical Matrix in cartesian axes + + q = ( 0.108225108225 -0.062483795452 0.000000000000 ) + + 1 1 + 0.3958009952090623 -0.0000000000000000 -0.0900904464358003 0.0000000000020968 0.0283947723327762 -0.0173442625765976 + -0.0900904464358003 -0.0000000000020968 0.2917735091319263 0.0000000000000000 -0.0163937294657359 0.0100137146780768 + 0.0283947723327762 0.0173442625765976 -0.0163937294657359 -0.0100137146780768 0.3402477292884483 0.0000000000000000 + 1 2 + 0.0185483738902733 0.0232566841134256 -0.0097955739167446 -0.0117163297567411 -0.0186055725084274 0.0076850528651325 + -0.0097955739167446 -0.0117163297567411 0.0072374194519390 0.0097278318887487 0.0107419323088244 -0.0044369673482009 + 0.0186055725084274 -0.0076850528651325 -0.0107419323088244 0.0044369673482009 -0.0778973143196023 -0.0473041144915655 + 1 3 + -0.0937483106703049 0.0024190034899978 0.0218299408486330 0.0001133629466162 0.0130462750260910 -0.0010238154840392 + 0.0218299408502933 0.0001133629405777 -0.0685412664430253 0.0025499037496298 -0.0075322704064378 0.0005911001452720 + -0.0064509614591519 0.0125640186489183 0.0037244643370694 -0.0072538395597315 -0.0426793819146574 -0.0031938921409990 + 1 4 + -0.1075788962811942 -0.0813423568744044 0.0086458695496716 0.0222258455982902 -0.0048839827935514 0.0003876020100562 + 0.0086458695488760 0.0222258456005533 -0.0975955063203465 -0.0556781611835205 0.0028197687756240 -0.0002237821280973 + -0.0039969467195630 -0.0094580179232763 0.0023076382596049 0.0054605891973994 -0.0828162127215586 -0.0493899768164609 + 2 1 + 0.0185483738902733 -0.0232566841134256 -0.0097955739167446 0.0117163297567411 0.0186055725084274 0.0076850528651325 + -0.0097955739167446 0.0117163297567411 0.0072374194519390 -0.0097278318887487 -0.0107419323088244 -0.0044369673482009 + -0.0186055725084274 -0.0076850528651325 0.0107419323088244 0.0044369673482009 -0.0778973143196023 0.0473041144915655 + 2 2 + 0.3958009952090623 -0.0000000000000000 -0.0900904464358003 -0.0000000000020968 -0.0283947723327762 -0.0173442625765976 + -0.0900904464358003 0.0000000000020968 0.2917735091319263 0.0000000000000000 0.0163937294657359 0.0100137146780768 + -0.0283947723327762 0.0173442625765976 0.0163937294657359 -0.0100137146780768 0.3402477292884483 0.0000000000000000 + 2 3 + -0.1075788962811942 0.0813423568744044 0.0086458695496716 -0.0222258455982902 0.0048839827935514 0.0003876020100562 + 0.0086458695488760 -0.0222258456005533 -0.0975955063203465 0.0556781611835205 -0.0028197687756239 -0.0002237821280973 + 0.0039969467195630 -0.0094580179232763 -0.0023076382596049 0.0054605891973993 -0.0828162127215586 0.0493899768164609 + 2 4 + -0.0937483106703049 -0.0024190034899978 0.0218299408486330 -0.0001133629466162 -0.0130462750260910 -0.0010238154840391 + 0.0218299408502933 -0.0001133629405777 -0.0685412664430253 -0.0025499037496298 0.0075322704064378 0.0005911001452720 + 0.0064509614591519 0.0125640186489183 -0.0037244643370694 -0.0072538395597315 -0.0426793819146574 0.0031938921409990 + 3 1 + -0.0937483106703049 -0.0024190034899978 0.0218299408502933 -0.0001133629405777 -0.0064509614591519 -0.0125640186489183 + 0.0218299408486330 -0.0001133629466162 -0.0685412664430253 -0.0025499037496298 0.0037244643370694 0.0072538395597315 + 0.0130462750260910 0.0010238154840392 -0.0075322704064378 -0.0005911001452720 -0.0426793819146574 0.0031938921409990 + 3 2 + -0.1075788962811942 -0.0813423568744044 0.0086458695488760 0.0222258456005533 0.0039969467195630 0.0094580179232763 + 0.0086458695496716 0.0222258455982902 -0.0975955063203465 -0.0556781611835205 -0.0023076382596049 -0.0054605891973994 + 0.0048839827935514 -0.0003876020100562 -0.0028197687756239 0.0002237821280973 -0.0828162127215586 -0.0493899768164609 + 3 3 + 0.3873104603304947 0.0000000000000000 -0.0645272940399710 -0.0000000000033022 -0.0046397847578027 -0.0137887230696395 + -0.0645272940399710 0.0000000000033022 0.3128007601000330 0.0000000000000000 0.0026787809710959 0.0079609229893422 + -0.0046397847578027 0.0137887230696395 0.0026787809710959 -0.0079609229893422 0.3395135913303324 0.0000000000000000 + 3 4 + 0.0123142951637397 0.0056111576848711 -0.0163155595009675 -0.0044046761866275 -0.0228959341028040 0.0119955536007650 + -0.0163155595009675 -0.0044046761866275 -0.0065252901690319 0.0005250757331788 0.0132189737413603 -0.0069256361086445 + 0.0228959341028040 -0.0119955536007650 -0.0132189737413603 0.0069256361086445 -0.0691649331198385 -0.0514198595881247 + 4 1 + -0.1075788962811942 0.0813423568744044 0.0086458695488760 -0.0222258456005533 -0.0039969467195630 0.0094580179232763 + 0.0086458695496716 -0.0222258455982902 -0.0975955063203465 0.0556781611835205 0.0023076382596049 -0.0054605891973994 + -0.0048839827935514 -0.0003876020100562 0.0028197687756240 0.0002237821280973 -0.0828162127215586 0.0493899768164609 + 4 2 + -0.0937483106703049 0.0024190034899978 0.0218299408502933 0.0001133629405777 0.0064509614591519 -0.0125640186489183 + 0.0218299408486330 0.0001133629466162 -0.0685412664430253 0.0025499037496298 -0.0037244643370694 0.0072538395597315 + -0.0130462750260910 0.0010238154840391 0.0075322704064378 -0.0005911001452720 -0.0426793819146574 -0.0031938921409990 + 4 3 + 0.0123142951637397 -0.0056111576848711 -0.0163155595009675 0.0044046761866275 0.0228959341028040 0.0119955536007650 + -0.0163155595009675 0.0044046761866275 -0.0065252901690319 -0.0005250757331788 -0.0132189737413603 -0.0069256361086445 + -0.0228959341028040 -0.0119955536007650 0.0132189737413603 0.0069256361086445 -0.0691649331198385 0.0514198595881247 + 4 4 + 0.3873104603304947 0.0000000000000000 -0.0645272940399710 0.0000000000033022 0.0046397847578027 -0.0137887230696395 + -0.0645272940399710 -0.0000000000033022 0.3128007601000330 0.0000000000000000 -0.0026787809710959 0.0079609229893422 + 0.0046397847578027 0.0137887230696395 -0.0026787809710959 -0.0079609229893422 0.3395135913303324 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.108225108225 0.062483795452 0.000000000000 ) + + 1 1 + 0.3958009952090623 0.0000000000000000 -0.0900904464358003 -0.0000000000020968 0.0283947723327762 0.0173442625765976 + -0.0900904464358003 0.0000000000020968 0.2917735091319263 -0.0000000000000000 -0.0163937294657359 -0.0100137146780768 + 0.0283947723327762 -0.0173442625765976 -0.0163937294657359 0.0100137146780768 0.3402477292884483 -0.0000000000000000 + 1 2 + 0.0185483738902733 -0.0232566841134256 -0.0097955739167446 0.0117163297567411 -0.0186055725084274 -0.0076850528651325 + -0.0097955739167446 0.0117163297567411 0.0072374194519390 -0.0097278318887487 0.0107419323088244 0.0044369673482009 + 0.0186055725084274 0.0076850528651325 -0.0107419323088244 -0.0044369673482009 -0.0778973143196023 0.0473041144915655 + 1 3 + -0.0937483106703049 -0.0024190034899978 0.0218299408486330 -0.0001133629466162 0.0130462750260910 0.0010238154840392 + 0.0218299408502933 -0.0001133629405777 -0.0685412664430253 -0.0025499037496298 -0.0075322704064378 -0.0005911001452720 + -0.0064509614591519 -0.0125640186489183 0.0037244643370694 0.0072538395597315 -0.0426793819146574 0.0031938921409990 + 1 4 + -0.1075788962811942 0.0813423568744044 0.0086458695496716 -0.0222258455982902 -0.0048839827935514 -0.0003876020100562 + 0.0086458695488760 -0.0222258456005533 -0.0975955063203465 0.0556781611835205 0.0028197687756240 0.0002237821280973 + -0.0039969467195630 0.0094580179232763 0.0023076382596049 -0.0054605891973994 -0.0828162127215586 0.0493899768164609 + 2 1 + 0.0185483738902733 0.0232566841134256 -0.0097955739167446 -0.0117163297567411 0.0186055725084274 -0.0076850528651325 + -0.0097955739167446 -0.0117163297567411 0.0072374194519390 0.0097278318887487 -0.0107419323088244 0.0044369673482009 + -0.0186055725084274 0.0076850528651325 0.0107419323088244 -0.0044369673482009 -0.0778973143196023 -0.0473041144915655 + 2 2 + 0.3958009952090623 0.0000000000000000 -0.0900904464358003 0.0000000000020968 -0.0283947723327762 0.0173442625765976 + -0.0900904464358003 -0.0000000000020968 0.2917735091319263 -0.0000000000000000 0.0163937294657359 -0.0100137146780768 + -0.0283947723327762 -0.0173442625765976 0.0163937294657359 0.0100137146780768 0.3402477292884483 -0.0000000000000000 + 2 3 + -0.1075788962811942 -0.0813423568744044 0.0086458695496716 0.0222258455982902 0.0048839827935514 -0.0003876020100562 + 0.0086458695488760 0.0222258456005533 -0.0975955063203465 -0.0556781611835205 -0.0028197687756239 0.0002237821280973 + 0.0039969467195630 0.0094580179232763 -0.0023076382596049 -0.0054605891973993 -0.0828162127215586 -0.0493899768164609 + 2 4 + -0.0937483106703049 0.0024190034899978 0.0218299408486330 0.0001133629466162 -0.0130462750260910 0.0010238154840391 + 0.0218299408502933 0.0001133629405777 -0.0685412664430253 0.0025499037496298 0.0075322704064378 -0.0005911001452720 + 0.0064509614591519 -0.0125640186489183 -0.0037244643370694 0.0072538395597315 -0.0426793819146574 -0.0031938921409990 + 3 1 + -0.0937483106703049 0.0024190034899978 0.0218299408502933 0.0001133629405777 -0.0064509614591519 0.0125640186489183 + 0.0218299408486330 0.0001133629466162 -0.0685412664430253 0.0025499037496298 0.0037244643370694 -0.0072538395597315 + 0.0130462750260910 -0.0010238154840392 -0.0075322704064378 0.0005911001452720 -0.0426793819146574 -0.0031938921409990 + 3 2 + -0.1075788962811942 0.0813423568744044 0.0086458695488760 -0.0222258456005533 0.0039969467195630 -0.0094580179232763 + 0.0086458695496716 -0.0222258455982902 -0.0975955063203465 0.0556781611835205 -0.0023076382596049 0.0054605891973994 + 0.0048839827935514 0.0003876020100562 -0.0028197687756239 -0.0002237821280973 -0.0828162127215586 0.0493899768164609 + 3 3 + 0.3873104603304947 -0.0000000000000000 -0.0645272940399710 0.0000000000033022 -0.0046397847578027 0.0137887230696395 + -0.0645272940399710 -0.0000000000033022 0.3128007601000330 -0.0000000000000000 0.0026787809710959 -0.0079609229893422 + -0.0046397847578027 -0.0137887230696395 0.0026787809710959 0.0079609229893422 0.3395135913303324 -0.0000000000000000 + 3 4 + 0.0123142951637397 -0.0056111576848711 -0.0163155595009675 0.0044046761866275 -0.0228959341028040 -0.0119955536007650 + -0.0163155595009675 0.0044046761866275 -0.0065252901690319 -0.0005250757331788 0.0132189737413603 0.0069256361086445 + 0.0228959341028040 0.0119955536007650 -0.0132189737413603 -0.0069256361086445 -0.0691649331198385 0.0514198595881247 + 4 1 + -0.1075788962811942 -0.0813423568744044 0.0086458695488760 0.0222258456005533 -0.0039969467195630 -0.0094580179232763 + 0.0086458695496716 0.0222258455982902 -0.0975955063203465 -0.0556781611835205 0.0023076382596049 0.0054605891973994 + -0.0048839827935514 0.0003876020100562 0.0028197687756240 -0.0002237821280973 -0.0828162127215586 -0.0493899768164609 + 4 2 + -0.0937483106703049 -0.0024190034899978 0.0218299408502933 -0.0001133629405777 0.0064509614591519 0.0125640186489183 + 0.0218299408486330 -0.0001133629466162 -0.0685412664430253 -0.0025499037496298 -0.0037244643370694 -0.0072538395597315 + -0.0130462750260910 -0.0010238154840391 0.0075322704064378 0.0005911001452720 -0.0426793819146574 0.0031938921409990 + 4 3 + 0.0123142951637397 0.0056111576848711 -0.0163155595009675 -0.0044046761866275 0.0228959341028040 -0.0119955536007650 + -0.0163155595009675 -0.0044046761866275 -0.0065252901690319 0.0005250757331788 -0.0132189737413603 0.0069256361086445 + -0.0228959341028040 0.0119955536007650 0.0132189737413603 -0.0069256361086445 -0.0691649331198385 -0.0514198595881247 + 4 4 + 0.3873104603304947 -0.0000000000000000 -0.0645272940399710 -0.0000000000033022 0.0046397847578027 0.0137887230696395 + -0.0645272940399710 0.0000000000033022 0.3128007601000330 -0.0000000000000000 -0.0026787809710959 -0.0079609229893422 + 0.0046397847578027 -0.0137887230696395 -0.0026787809710959 0.0079609229893422 0.3395135913303324 0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( 0.108225108225 0.062483795452 0.000000000000 ) + + 1 1 + 0.3958009952090623 -0.0000000000000000 0.0900904464358003 0.0000000000020968 -0.0283947723327762 -0.0173442625765976 + 0.0900904464358003 -0.0000000000020968 0.2917735091319263 -0.0000000000000000 -0.0163937294657359 -0.0100137146780768 + -0.0283947723327762 0.0173442625765976 -0.0163937294657359 0.0100137146780768 0.3402477292884483 -0.0000000000000000 + 1 2 + 0.0185483738902733 -0.0232566841134256 0.0097955739167446 -0.0117163297567411 0.0186055725084274 0.0076850528651325 + 0.0097955739167446 -0.0117163297567411 0.0072374194519390 -0.0097278318887487 0.0107419323088244 0.0044369673482009 + -0.0186055725084274 -0.0076850528651325 -0.0107419323088244 -0.0044369673482009 -0.0778973143196023 0.0473041144915655 + 1 3 + -0.0937483106703049 -0.0024190034899978 -0.0218299408486330 0.0001133629466162 -0.0130462750260910 -0.0010238154840392 + -0.0218299408502933 0.0001133629405777 -0.0685412664430253 -0.0025499037496298 -0.0075322704064378 -0.0005911001452720 + 0.0064509614591519 0.0125640186489183 0.0037244643370694 0.0072538395597315 -0.0426793819146574 0.0031938921409990 + 1 4 + -0.1075788962811942 0.0813423568744044 -0.0086458695496716 0.0222258455982902 0.0048839827935514 0.0003876020100562 + -0.0086458695488760 0.0222258456005533 -0.0975955063203464 0.0556781611835205 0.0028197687756240 0.0002237821280973 + 0.0039969467195630 -0.0094580179232763 0.0023076382596049 -0.0054605891973994 -0.0828162127215586 0.0493899768164609 + 2 1 + 0.0185483738902733 0.0232566841134256 0.0097955739167446 0.0117163297567411 -0.0186055725084274 0.0076850528651325 + 0.0097955739167446 0.0117163297567411 0.0072374194519390 0.0097278318887487 -0.0107419323088244 0.0044369673482009 + 0.0186055725084274 -0.0076850528651325 0.0107419323088244 -0.0044369673482009 -0.0778973143196023 -0.0473041144915655 + 2 2 + 0.3958009952090623 0.0000000000000000 0.0900904464358003 -0.0000000000020968 0.0283947723327762 -0.0173442625765976 + 0.0900904464358003 0.0000000000020968 0.2917735091319263 0.0000000000000000 0.0163937294657359 -0.0100137146780768 + 0.0283947723327762 0.0173442625765976 0.0163937294657359 0.0100137146780768 0.3402477292884483 -0.0000000000000000 + 2 3 + -0.1075788962811942 -0.0813423568744044 -0.0086458695496716 -0.0222258455982902 -0.0048839827935514 0.0003876020100562 + -0.0086458695488760 -0.0222258456005533 -0.0975955063203464 -0.0556781611835205 -0.0028197687756239 0.0002237821280973 + -0.0039969467195630 -0.0094580179232763 -0.0023076382596049 -0.0054605891973994 -0.0828162127215586 -0.0493899768164609 + 2 4 + -0.0937483106703049 0.0024190034899978 -0.0218299408486330 -0.0001133629466162 0.0130462750260910 -0.0010238154840391 + -0.0218299408502933 -0.0001133629405777 -0.0685412664430253 0.0025499037496298 0.0075322704064378 -0.0005911001452720 + -0.0064509614591519 0.0125640186489183 -0.0037244643370694 0.0072538395597315 -0.0426793819146574 -0.0031938921409990 + 3 1 + -0.0937483106703049 0.0024190034899978 -0.0218299408502933 -0.0001133629405777 0.0064509614591519 -0.0125640186489183 + -0.0218299408486330 -0.0001133629466162 -0.0685412664430253 0.0025499037496298 0.0037244643370694 -0.0072538395597315 + -0.0130462750260910 0.0010238154840392 -0.0075322704064378 0.0005911001452720 -0.0426793819146574 -0.0031938921409990 + 3 2 + -0.1075788962811942 0.0813423568744044 -0.0086458695488760 0.0222258456005533 -0.0039969467195630 0.0094580179232763 + -0.0086458695496716 0.0222258455982902 -0.0975955063203465 0.0556781611835205 -0.0023076382596049 0.0054605891973994 + -0.0048839827935514 -0.0003876020100562 -0.0028197687756239 -0.0002237821280973 -0.0828162127215586 0.0493899768164609 + 3 3 + 0.3873104603304947 -0.0000000000000000 0.0645272940399710 -0.0000000000033022 0.0046397847578027 -0.0137887230696395 + 0.0645272940399710 0.0000000000033022 0.3128007601000330 0.0000000000000000 0.0026787809710959 -0.0079609229893422 + 0.0046397847578027 0.0137887230696395 0.0026787809710959 0.0079609229893422 0.3395135913303324 0.0000000000000000 + 3 4 + 0.0123142951637397 -0.0056111576848711 0.0163155595009675 -0.0044046761866275 0.0228959341028040 0.0119955536007650 + 0.0163155595009675 -0.0044046761866275 -0.0065252901690319 -0.0005250757331788 0.0132189737413603 0.0069256361086445 + -0.0228959341028040 -0.0119955536007650 -0.0132189737413603 -0.0069256361086445 -0.0691649331198385 0.0514198595881247 + 4 1 + -0.1075788962811942 -0.0813423568744044 -0.0086458695488760 -0.0222258456005533 0.0039969467195630 0.0094580179232763 + -0.0086458695496716 -0.0222258455982902 -0.0975955063203465 -0.0556781611835205 0.0023076382596049 0.0054605891973994 + 0.0048839827935514 -0.0003876020100562 0.0028197687756240 -0.0002237821280973 -0.0828162127215586 -0.0493899768164609 + 4 2 + -0.0937483106703049 -0.0024190034899978 -0.0218299408502933 0.0001133629405777 -0.0064509614591519 -0.0125640186489183 + -0.0218299408486330 0.0001133629466162 -0.0685412664430253 -0.0025499037496298 -0.0037244643370694 -0.0072538395597315 + 0.0130462750260910 0.0010238154840391 0.0075322704064378 0.0005911001452720 -0.0426793819146574 0.0031938921409990 + 4 3 + 0.0123142951637397 0.0056111576848711 0.0163155595009675 0.0044046761866275 -0.0228959341028040 0.0119955536007650 + 0.0163155595009675 0.0044046761866275 -0.0065252901690319 0.0005250757331788 -0.0132189737413603 0.0069256361086445 + 0.0228959341028040 -0.0119955536007650 0.0132189737413603 -0.0069256361086445 -0.0691649331198385 -0.0514198595881247 + 4 4 + 0.3873104603304947 -0.0000000000000000 0.0645272940399710 0.0000000000033022 -0.0046397847578027 -0.0137887230696395 + 0.0645272940399710 -0.0000000000033022 0.3128007601000330 -0.0000000000000000 -0.0026787809710959 -0.0079609229893422 + -0.0046397847578027 0.0137887230696395 -0.0026787809710959 0.0079609229893422 0.3395135913303324 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( 0.000000000000 -0.124967590905 0.000000000000 ) + + 1 1 + 0.2397597649151019 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 0.4478147398459458 0.0000000000000000 0.0327874589560405 0.0200274293644370 + -0.0000000000000000 0.0000000000000000 0.0327874589560405 -0.0200274293644370 0.3402477292884455 0.0000000000000000 + 1 2 + 0.0017754133499780 0.0028517050886525 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 0.0138971164836638 0.0359717059308967 0.0184269860209769 -0.0141686040969205 + 0.0000000000000000 0.0000000000000000 -0.0184269860209769 0.0141686040969205 -0.0020179023352198 -0.0911131104797318 + 1 3 + -0.0559377440485983 -0.0026153538670788 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.1063518331764700 -0.0023535533636105 0.0150645408183579 0.0011822002876996 + 0.0000000000000000 0.0000000000000000 -0.0074489286821819 -0.0145076791195267 -0.0426793819177516 0.0031938921418597 + 1 4 + 0.0091961324423662 -0.1016202837314614 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.0252721660795177 -0.1445762212435378 0.0032073710691415 -0.0046602004277339 + -0.0000000000000000 -0.0000000000000000 -0.0071503790742363 -0.0094575363171414 -0.0013648625937255 -0.0964159325473625 + 2 1 + 0.0017754133499780 -0.0028517050886525 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0138971164836638 -0.0359717059308967 -0.0184269860209769 -0.0141686040969205 + -0.0000000000000000 0.0000000000000000 0.0184269860209769 0.0141686040969205 -0.0020179023352198 0.0911131104797318 + 2 2 + 0.2397597649151019 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.4478147398459458 0.0000000000000000 -0.0327874589560405 0.0200274293644370 + -0.0000000000000000 -0.0000000000000000 -0.0327874589560405 -0.0200274293644370 0.3402477292884455 0.0000000000000000 + 2 3 + 0.0091961324423662 0.1016202837314614 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0252721660795177 0.1445762212435378 -0.0032073710691414 -0.0046602004277339 + -0.0000000000000000 -0.0000000000000000 0.0071503790742363 -0.0094575363171414 -0.0013648625937255 0.0964159325473625 + 2 4 + -0.0559377440485983 0.0026153538670788 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1063518331764700 0.0023535533636105 -0.0150645408183579 0.0011822002876996 + -0.0000000000000000 0.0000000000000000 0.0074489286821819 -0.0145076791195267 -0.0426793819177516 -0.0031938921418597 + 3 1 + -0.0559377440485983 0.0026153538670788 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.1063518331764700 0.0023535533636105 -0.0074489286821819 0.0145076791195267 + 0.0000000000000000 0.0000000000000000 0.0150645408183579 -0.0011822002876996 -0.0426793819177516 -0.0031938921418597 + 3 2 + 0.0091961324423662 -0.1016202837314614 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.0252721660795177 -0.1445762212435378 0.0071503790742363 0.0094575363171414 + -0.0000000000000000 0.0000000000000000 -0.0032073710691414 0.0046602004277339 -0.0013648625937255 -0.0964159325473625 + 3 3 + 0.2755459087314531 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.4245653119997521 0.0000000000000000 -0.0053575619766296 0.0159218459759531 + -0.0000000000000000 0.0000000000000000 -0.0053575619766296 -0.0159218459759531 0.3395135913323811 0.0000000000000000 + 3 4 + 0.0062249330897197 -0.0148178290536726 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0038053020078961 0.0228993713394422 0.0252145283017408 -0.0159702966079428 + 0.0000000000000000 -0.0000000000000000 -0.0252145283017408 0.0159702966079428 -0.0099484330681331 -0.0856085195419856 + 4 1 + 0.0091961324423662 0.1016202837314614 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0252721660795177 0.1445762212435378 -0.0071503790742363 0.0094575363171414 + -0.0000000000000000 0.0000000000000000 0.0032073710691415 0.0046602004277339 -0.0013648625937255 0.0964159325473625 + 4 2 + -0.0559377440485983 -0.0026153538670788 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1063518331764700 -0.0023535533636105 0.0074489286821819 0.0145076791195267 + -0.0000000000000000 0.0000000000000000 -0.0150645408183579 -0.0011822002876996 -0.0426793819177516 0.0031938921418597 + 4 3 + 0.0062249330897197 0.0148178290536726 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0038053020078961 -0.0228993713394422 -0.0252145283017408 -0.0159702966079428 + -0.0000000000000000 0.0000000000000000 0.0252145283017408 0.0159702966079428 -0.0099484330681331 0.0856085195419856 + 4 4 + 0.2755459087314531 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4245653119997521 0.0000000000000000 0.0053575619766296 0.0159218459759531 + 0.0000000000000000 0.0000000000000000 0.0053575619766296 -0.0159218459759531 0.3395135913323811 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.000000000000 0.124967590905 0.000000000000 ) + + 1 1 + 0.2397597649151019 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.4478147398459458 -0.0000000000000000 0.0327874589560405 -0.0200274293644370 + -0.0000000000000000 -0.0000000000000000 0.0327874589560405 0.0200274293644370 0.3402477292884455 -0.0000000000000000 + 1 2 + 0.0017754133499780 -0.0028517050886525 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0138971164836638 -0.0359717059308967 0.0184269860209769 0.0141686040969205 + 0.0000000000000000 -0.0000000000000000 -0.0184269860209769 -0.0141686040969205 -0.0020179023352198 0.0911131104797318 + 1 3 + -0.0559377440485983 0.0026153538670788 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1063518331764700 0.0023535533636105 0.0150645408183579 -0.0011822002876996 + 0.0000000000000000 -0.0000000000000000 -0.0074489286821819 0.0145076791195267 -0.0426793819177516 -0.0031938921418597 + 1 4 + 0.0091961324423662 0.1016202837314614 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.0252721660795177 0.1445762212435378 0.0032073710691415 0.0046602004277339 + -0.0000000000000000 0.0000000000000000 -0.0071503790742363 0.0094575363171414 -0.0013648625937255 0.0964159325473625 + 2 1 + 0.0017754133499780 0.0028517050886525 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.0138971164836638 0.0359717059308967 -0.0184269860209769 0.0141686040969205 + -0.0000000000000000 -0.0000000000000000 0.0184269860209769 -0.0141686040969205 -0.0020179023352198 -0.0911131104797318 + 2 2 + 0.2397597649151019 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4478147398459458 -0.0000000000000000 -0.0327874589560405 -0.0200274293644370 + -0.0000000000000000 0.0000000000000000 -0.0327874589560405 0.0200274293644370 0.3402477292884455 -0.0000000000000000 + 2 3 + 0.0091961324423662 -0.1016202837314614 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0252721660795177 -0.1445762212435378 -0.0032073710691414 0.0046602004277339 + -0.0000000000000000 0.0000000000000000 0.0071503790742363 0.0094575363171414 -0.0013648625937255 -0.0964159325473625 + 2 4 + -0.0559377440485983 -0.0026153538670788 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.1063518331764700 -0.0023535533636105 -0.0150645408183579 -0.0011822002876996 + -0.0000000000000000 -0.0000000000000000 0.0074489286821819 0.0145076791195267 -0.0426793819177516 0.0031938921418597 + 3 1 + -0.0559377440485983 -0.0026153538670788 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1063518331764700 -0.0023535533636105 -0.0074489286821819 -0.0145076791195267 + 0.0000000000000000 -0.0000000000000000 0.0150645408183579 0.0011822002876996 -0.0426793819177516 0.0031938921418597 + 3 2 + 0.0091961324423662 0.1016202837314614 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.0252721660795177 0.1445762212435378 0.0071503790742363 -0.0094575363171414 + -0.0000000000000000 -0.0000000000000000 -0.0032073710691414 -0.0046602004277339 -0.0013648625937255 0.0964159325473625 + 3 3 + 0.2755459087314531 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4245653119997521 -0.0000000000000000 -0.0053575619766296 -0.0159218459759531 + -0.0000000000000000 -0.0000000000000000 -0.0053575619766296 0.0159218459759531 0.3395135913323811 -0.0000000000000000 + 3 4 + 0.0062249330897197 0.0148178290536726 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0038053020078961 -0.0228993713394422 0.0252145283017408 0.0159702966079428 + 0.0000000000000000 0.0000000000000000 -0.0252145283017408 -0.0159702966079428 -0.0099484330681331 0.0856085195419856 + 4 1 + 0.0091961324423662 -0.1016202837314614 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0252721660795177 -0.1445762212435378 -0.0071503790742363 -0.0094575363171414 + -0.0000000000000000 -0.0000000000000000 0.0032073710691415 -0.0046602004277339 -0.0013648625937255 -0.0964159325473625 + 4 2 + -0.0559377440485983 0.0026153538670788 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.1063518331764700 0.0023535533636105 0.0074489286821819 -0.0145076791195267 + -0.0000000000000000 -0.0000000000000000 -0.0150645408183579 0.0011822002876996 -0.0426793819177516 -0.0031938921418597 + 4 3 + 0.0062249330897197 -0.0148178290536726 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0038053020078961 0.0228993713394422 -0.0252145283017408 0.0159702966079428 + -0.0000000000000000 -0.0000000000000000 0.0252145283017408 -0.0159702966079428 -0.0099484330681331 -0.0856085195419856 + 4 4 + 0.2755459087314531 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.4245653119997521 -0.0000000000000000 0.0053575619766296 -0.0159218459759531 + 0.0000000000000000 -0.0000000000000000 0.0053575619766296 0.0159218459759531 0.3395135913323811 0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.108225108225 -0.062483795452 0.000000000000 ) + + 1 1 + 0.3958009952090623 0.0000000000000000 0.0900904464358003 -0.0000000000020968 -0.0283947723327762 0.0173442625765976 + 0.0900904464358003 0.0000000000020968 0.2917735091319263 0.0000000000000000 -0.0163937294657359 0.0100137146780768 + -0.0283947723327762 -0.0173442625765976 -0.0163937294657359 -0.0100137146780768 0.3402477292884483 0.0000000000000000 + 1 2 + 0.0185483738902733 0.0232566841134256 0.0097955739167446 0.0117163297567411 0.0186055725084274 -0.0076850528651325 + 0.0097955739167446 0.0117163297567411 0.0072374194519390 0.0097278318887487 0.0107419323088244 -0.0044369673482009 + -0.0186055725084274 0.0076850528651325 -0.0107419323088244 0.0044369673482009 -0.0778973143196023 -0.0473041144915655 + 1 3 + -0.0937483106703049 0.0024190034899978 -0.0218299408486330 -0.0001133629466162 -0.0130462750260910 0.0010238154840392 + -0.0218299408502933 -0.0001133629405777 -0.0685412664430253 0.0025499037496298 -0.0075322704064378 0.0005911001452720 + 0.0064509614591519 -0.0125640186489183 0.0037244643370694 -0.0072538395597315 -0.0426793819146574 -0.0031938921409990 + 1 4 + -0.1075788962811942 -0.0813423568744044 -0.0086458695496716 -0.0222258455982902 0.0048839827935514 -0.0003876020100562 + -0.0086458695488760 -0.0222258456005533 -0.0975955063203465 -0.0556781611835205 0.0028197687756240 -0.0002237821280973 + 0.0039969467195630 0.0094580179232763 0.0023076382596049 0.0054605891973994 -0.0828162127215586 -0.0493899768164609 + 2 1 + 0.0185483738902733 -0.0232566841134256 0.0097955739167446 -0.0117163297567411 -0.0186055725084274 -0.0076850528651325 + 0.0097955739167446 -0.0117163297567411 0.0072374194519390 -0.0097278318887487 -0.0107419323088244 -0.0044369673482009 + 0.0186055725084274 0.0076850528651325 0.0107419323088244 0.0044369673482009 -0.0778973143196023 0.0473041144915655 + 2 2 + 0.3958009952090623 -0.0000000000000000 0.0900904464358003 0.0000000000020968 0.0283947723327762 0.0173442625765976 + 0.0900904464358003 -0.0000000000020968 0.2917735091319263 -0.0000000000000000 0.0163937294657359 0.0100137146780768 + 0.0283947723327762 -0.0173442625765976 0.0163937294657359 -0.0100137146780768 0.3402477292884483 0.0000000000000000 + 2 3 + -0.1075788962811942 0.0813423568744044 -0.0086458695496716 0.0222258455982902 -0.0048839827935514 -0.0003876020100562 + -0.0086458695488760 0.0222258456005533 -0.0975955063203465 0.0556781611835205 -0.0028197687756239 -0.0002237821280973 + -0.0039969467195630 0.0094580179232763 -0.0023076382596049 0.0054605891973994 -0.0828162127215586 0.0493899768164609 + 2 4 + -0.0937483106703049 -0.0024190034899978 -0.0218299408486330 0.0001133629466162 0.0130462750260910 0.0010238154840391 + -0.0218299408502933 0.0001133629405777 -0.0685412664430253 -0.0025499037496298 0.0075322704064378 0.0005911001452720 + -0.0064509614591519 -0.0125640186489183 -0.0037244643370694 -0.0072538395597315 -0.0426793819146574 0.0031938921409990 + 3 1 + -0.0937483106703049 -0.0024190034899978 -0.0218299408502933 0.0001133629405777 0.0064509614591519 0.0125640186489183 + -0.0218299408486330 0.0001133629466162 -0.0685412664430253 -0.0025499037496298 0.0037244643370694 0.0072538395597315 + -0.0130462750260910 -0.0010238154840392 -0.0075322704064378 -0.0005911001452720 -0.0426793819146574 0.0031938921409990 + 3 2 + -0.1075788962811942 -0.0813423568744044 -0.0086458695488760 -0.0222258456005533 -0.0039969467195630 -0.0094580179232763 + -0.0086458695496716 -0.0222258455982902 -0.0975955063203465 -0.0556781611835205 -0.0023076382596049 -0.0054605891973994 + -0.0048839827935514 0.0003876020100562 -0.0028197687756239 0.0002237821280973 -0.0828162127215586 -0.0493899768164609 + 3 3 + 0.3873104603304947 0.0000000000000000 0.0645272940399710 0.0000000000033022 0.0046397847578027 0.0137887230696395 + 0.0645272940399710 -0.0000000000033022 0.3128007601000330 -0.0000000000000000 0.0026787809710959 0.0079609229893422 + 0.0046397847578027 -0.0137887230696395 0.0026787809710959 -0.0079609229893422 0.3395135913303324 -0.0000000000000000 + 3 4 + 0.0123142951637397 0.0056111576848711 0.0163155595009675 0.0044046761866275 0.0228959341028040 -0.0119955536007650 + 0.0163155595009675 0.0044046761866275 -0.0065252901690319 0.0005250757331788 0.0132189737413603 -0.0069256361086445 + -0.0228959341028040 0.0119955536007650 -0.0132189737413603 0.0069256361086445 -0.0691649331198385 -0.0514198595881247 + 4 1 + -0.1075788962811942 0.0813423568744044 -0.0086458695488760 0.0222258456005533 0.0039969467195630 -0.0094580179232763 + -0.0086458695496716 0.0222258455982902 -0.0975955063203465 0.0556781611835205 0.0023076382596049 -0.0054605891973994 + 0.0048839827935514 0.0003876020100562 0.0028197687756240 0.0002237821280973 -0.0828162127215586 0.0493899768164609 + 4 2 + -0.0937483106703049 0.0024190034899978 -0.0218299408502933 -0.0001133629405777 -0.0064509614591519 0.0125640186489183 + -0.0218299408486330 -0.0001133629466162 -0.0685412664430253 0.0025499037496298 -0.0037244643370694 0.0072538395597315 + 0.0130462750260910 -0.0010238154840391 0.0075322704064378 -0.0005911001452720 -0.0426793819146574 -0.0031938921409990 + 4 3 + 0.0123142951637397 -0.0056111576848711 0.0163155595009675 -0.0044046761866275 -0.0228959341028040 -0.0119955536007650 + 0.0163155595009675 -0.0044046761866275 -0.0065252901690319 -0.0005250757331788 -0.0132189737413603 -0.0069256361086445 + 0.0228959341028040 0.0119955536007650 0.0132189737413603 0.0069256361086445 -0.0691649331198385 0.0514198595881247 + 4 4 + 0.3873104603304947 0.0000000000000000 0.0645272940399710 -0.0000000000033022 -0.0046397847578027 0.0137887230696395 + 0.0645272940399710 0.0000000000033022 0.3128007601000330 0.0000000000000000 -0.0026787809710959 0.0079609229893422 + -0.0046397847578027 -0.0137887230696395 -0.0026787809710959 -0.0079609229893422 0.3395135913303324 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.108225108225 -0.062483795452 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 7.19037637 [THz] = 239.84510438 [cm-1] +( -0.281534 0.000000 -0.487631 0.000000 0.000000 -0.000000 ) +( -0.263335 0.099580 -0.456109 0.172478 -0.000000 0.000000 ) +( -0.213702 -0.008355 -0.370144 -0.014471 0.000000 -0.000000 ) +( -0.196933 0.083403 -0.341098 0.144457 -0.000000 -0.000000 ) + freq ( 2) = 7.81945089 [THz] = 260.82876868 [cm-1] +( -0.054742 0.000000 0.031605 0.000000 0.564451 -0.048274 ) +( 0.039851 -0.037531 -0.023008 0.021668 0.444009 -0.351840 ) +( 0.024894 -0.002823 -0.014373 0.001630 0.415043 -0.044404 ) +( -0.020058 0.015013 0.011580 -0.008667 0.332589 -0.252224 ) + freq ( 3) = 9.78042006 [THz] = 326.23965029 [cm-1] +( -0.343923 0.000000 -0.595693 -0.000000 -0.000000 0.000000 ) +( 0.320161 -0.125619 0.554535 -0.217578 -0.000000 -0.000000 ) +( 0.081435 0.009232 0.141049 0.015990 -0.000000 -0.000000 ) +( -0.072436 0.038338 -0.125463 0.066403 -0.000000 0.000000 ) + freq ( 4) = 10.87487797 [THz] = 362.74683113 [cm-1] +( 0.479782 0.000000 -0.277002 -0.000000 -0.116149 -0.032381 ) +( 0.442673 -0.185017 -0.255577 0.106820 0.094678 -0.074667 ) +( 0.357716 0.070077 -0.206528 -0.040459 -0.025481 0.026994 ) +( 0.303025 -0.202603 -0.174951 0.116973 0.033920 0.015080 ) + freq ( 5) = 12.62937029 [THz] = 421.27038702 [cm-1] +( -0.463283 0.000000 0.267476 -0.000000 -0.125308 0.407126 ) +( 0.452105 -0.101153 -0.261023 0.058401 -0.211176 -0.369943 ) +( 0.023754 0.126667 -0.013715 -0.073131 -0.013422 -0.100235 ) +( 0.004475 0.128797 -0.002584 -0.074361 0.008787 0.100747 ) + freq ( 6) = 13.78280888 [THz] = 459.74495158 [cm-1] +( -0.378486 0.000000 0.218519 -0.000000 -0.107087 -0.515466 ) +( 0.269082 -0.266170 -0.155354 0.153674 0.286369 0.441776 ) +( 0.097242 -0.064126 -0.056143 0.037023 0.029395 0.113445 ) +( -0.114230 0.022796 0.065951 -0.013161 -0.058882 -0.101325 ) + freq ( 7) = 17.04855010 [THz] = 568.67833757 [cm-1] +( -0.045810 0.000000 -0.079345 0.000000 0.000000 0.000000 ) +( 0.024057 0.038985 0.041668 0.067523 0.000000 0.000000 ) +( -0.193054 -0.292629 -0.334379 -0.506848 -0.000000 -0.000000 ) +( 0.350412 0.010618 0.606932 0.018391 -0.000000 -0.000000 ) + freq ( 8) = 17.05623769 [THz] = 568.93476797 [cm-1] +( -0.035431 0.000000 0.020456 -0.000000 0.125829 -0.167252 ) +( -0.022780 -0.027138 0.013152 0.015668 0.047205 -0.203906 ) +( -0.059681 0.077997 0.034457 -0.045032 -0.433290 0.503904 ) +( 0.021370 -0.095858 -0.012338 0.055344 -0.107382 0.655842 ) + freq ( 9) = 17.59460420 [THz] = 586.89273902 [cm-1] +( -0.104616 0.000000 -0.181200 0.000000 -0.000000 0.000000 ) +( -0.102064 0.022963 -0.176781 0.039773 0.000000 0.000000 ) +( 0.307955 0.138635 0.533393 0.240122 0.000000 -0.000000 ) +( 0.270014 -0.202850 0.467678 -0.351346 -0.000000 -0.000000 ) + freq ( 10) = 19.22314475 [THz] = 641.21499696 [cm-1] +( 0.034154 0.000000 -0.019719 -0.000000 0.019724 -0.022217 ) +( -0.031161 0.013980 0.017991 -0.008072 0.027090 0.012196 ) +( 0.472810 0.043010 -0.272977 -0.024832 -0.054410 -0.440534 ) +( -0.413778 0.232781 0.238895 -0.134396 0.130685 0.424207 ) + freq ( 11) = 21.47260255 [THz] = 716.24882158 [cm-1] +( -0.033152 0.000000 0.019140 -0.000000 -0.047254 -0.042298 ) +( -0.005302 -0.032725 0.003061 0.018894 0.049312 0.039881 ) +( -0.327675 0.176713 0.189183 -0.102025 -0.250540 -0.496936 ) +( 0.122029 -0.351720 -0.070453 0.203066 0.530610 0.167833 ) + freq ( 12) = 22.95256842 [THz] = 765.61516214 [cm-1] +( 0.194113 0.000000 -0.112071 0.000000 0.026171 -0.010517 ) +( 0.148692 -0.124781 -0.085848 0.072042 -0.026808 0.008767 ) +( -0.579298 0.022911 0.334458 -0.013228 0.005117 0.028109 ) +( -0.458476 0.354839 0.264701 -0.204866 0.014150 0.024821 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/hessianv4_3 b/tests/test_free_energy_hessian_dev/hessianv4_3 new file mode 100644 index 000000000..72fcdf998 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/hessianv4_3 @@ -0,0 +1,218 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0799999999999996 0.0000000000000000 0.0000000000000000 + -1.5399999999999998 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000002 0.0000000000000001 -0.0040643610314026 + 2 1 -0.0000000000000001 1.7782388266666669 2.5209356389685977 + 3 2 -0.0000000000000002 0.0000000000000001 1.9032535866761318 + 4 2 -0.0000000000000001 1.7782388266666669 4.4282535866761314 + + Dynamical Matrix in cartesian axes + + q = ( 0.216450216450 0.000000000000 0.000000000000 ) + + 1 1 + 0.3616676361354612 0.0000000000000000 -0.0000000000000000 0.0384932955866087 -0.0000000000000000 0.0000000000010808 + -0.0000000000000000 -0.0384932955866087 0.3616676371106657 -0.0000000000000000 0.0000000000110410 0.0000000000000000 + -0.0000000000000000 -0.0000000000010808 0.0000000000110410 -0.0000000000000000 0.3164727847954889 -0.0000000000000000 + 1 2 + -0.0010134482035200 0.0000000000000000 -0.0000000000000000 -0.0010134482133073 0.0000000000000000 0.0174951349852188 + -0.0000000000000000 -0.0010134482133073 0.0010134482032634 0.0000000000000000 0.0174951350108037 -0.0000000000000000 + -0.0000000000000000 -0.0174951349852188 -0.0174951350108037 0.0000000000000000 0.0000000000005866 -0.0000000000000000 + 1 3 + -0.0838533408733757 -0.0000000000000000 -0.0000000000000000 -0.0170043159797630 0.0000000000000000 0.0000000000021709 + 0.0000000000000000 0.0170043159765576 -0.0838533411018781 0.0000000000000000 -0.0000000000028958 -0.0000000000000000 + 0.0000000000000000 0.0000000000006932 0.0000000000002707 -0.0000000000000000 -0.0389353850994676 0.0000000000000000 + 1 4 + 0.0051233148174714 -0.0000000000000000 0.0000000000000000 0.0051233148252969 -0.0000000000000000 -0.0038684784943790 + 0.0000000000000000 0.0051233148326877 -0.0051233148088685 0.0000000000000000 -0.0038684785068310 0.0000000000000000 + 0.0000000000000000 0.0039174694146904 0.0039174694145958 -0.0000000000000000 0.0000000000034851 0.0000000000000000 + 2 1 + -0.0010134482035200 -0.0000000000000000 -0.0000000000000000 0.0010134482133073 -0.0000000000000000 0.0174951349852188 + -0.0000000000000000 0.0010134482133073 0.0010134482032634 -0.0000000000000000 -0.0174951350108037 -0.0000000000000000 + 0.0000000000000000 -0.0174951349852188 0.0174951350108037 0.0000000000000000 0.0000000000005866 0.0000000000000000 + 2 2 + 0.3616676361354612 -0.0000000000000000 0.0000000000000000 -0.0384932955866087 -0.0000000000000000 0.0000000000010808 + 0.0000000000000000 0.0384932955866087 0.3616676371106656 -0.0000000000000000 -0.0000000000110410 0.0000000000000000 + -0.0000000000000000 -0.0000000000010808 -0.0000000000110410 -0.0000000000000000 0.3164727847954889 -0.0000000000000000 + 2 3 + 0.0051233148174714 0.0000000000000000 0.0000000000000000 -0.0051233148252969 -0.0000000000000000 -0.0038684784943790 + 0.0000000000000000 -0.0051233148326877 -0.0051233148088685 -0.0000000000000000 0.0038684785068310 0.0000000000000000 + -0.0000000000000000 0.0039174694146904 -0.0039174694145958 -0.0000000000000000 0.0000000000034851 -0.0000000000000000 + 2 4 + -0.0838533408733757 -0.0000000000000000 0.0000000000000000 0.0170043159797630 -0.0000000000000000 0.0000000000021709 + 0.0000000000000000 -0.0170043159765576 -0.0838533411018781 -0.0000000000000000 0.0000000000028958 -0.0000000000000000 + -0.0000000000000000 0.0000000000006932 -0.0000000000002707 -0.0000000000000000 -0.0389353850994676 -0.0000000000000000 + 3 1 + -0.0838533408733757 -0.0000000000000000 0.0000000000000000 -0.0170043159765576 0.0000000000000000 -0.0000000000006932 + -0.0000000000000000 0.0170043159797630 -0.0838533411018781 -0.0000000000000000 0.0000000000002707 0.0000000000000000 + 0.0000000000000000 -0.0000000000021709 -0.0000000000028958 0.0000000000000000 -0.0389353850994676 -0.0000000000000000 + 3 2 + 0.0051233148174714 -0.0000000000000000 0.0000000000000000 0.0051233148326877 -0.0000000000000000 -0.0039174694146904 + 0.0000000000000000 0.0051233148252969 -0.0051233148088685 0.0000000000000000 -0.0039174694145958 0.0000000000000000 + 0.0000000000000000 0.0038684784943790 0.0038684785068310 -0.0000000000000000 0.0000000000034851 0.0000000000000000 + 3 3 + 0.3832694786915660 0.0000000000000000 0.0000000000000000 -0.0399146991058411 -0.0000000000000000 -0.0000000000018791 + 0.0000000000000000 0.0399146991058411 0.3832694797228522 -0.0000000000000000 -0.0000000000100507 0.0000000000000000 + -0.0000000000000000 0.0000000000018791 -0.0000000000100507 -0.0000000000000000 0.3185927640358261 -0.0000000000000000 + 3 4 + 0.0132181192209605 -0.0000000000000000 0.0000000000000000 0.0132181192416233 0.0000000000000000 0.0301072734461605 + 0.0000000000000000 0.0132181192416233 -0.0132181192621357 0.0000000000000000 0.0301072734848801 -0.0000000000000000 + -0.0000000000000000 -0.0301072734461605 -0.0301072734848801 0.0000000000000000 -0.0000000000008396 -0.0000000000000000 + 4 1 + 0.0051233148174714 0.0000000000000000 0.0000000000000000 -0.0051233148326877 0.0000000000000000 -0.0039174694146904 + 0.0000000000000000 -0.0051233148252969 -0.0051233148088685 -0.0000000000000000 0.0039174694145958 0.0000000000000000 + -0.0000000000000000 0.0038684784943790 -0.0038684785068310 -0.0000000000000000 0.0000000000034851 -0.0000000000000000 + 4 2 + -0.0838533408733757 0.0000000000000000 0.0000000000000000 0.0170043159765576 -0.0000000000000000 -0.0000000000006932 + -0.0000000000000000 -0.0170043159797630 -0.0838533411018781 0.0000000000000000 -0.0000000000002707 0.0000000000000000 + -0.0000000000000000 -0.0000000000021709 0.0000000000028958 0.0000000000000000 -0.0389353850994676 0.0000000000000000 + 4 3 + 0.0132181192209605 0.0000000000000000 0.0000000000000000 -0.0132181192416233 -0.0000000000000000 0.0301072734461605 + 0.0000000000000000 -0.0132181192416233 -0.0132181192621357 -0.0000000000000000 -0.0301072734848801 -0.0000000000000000 + 0.0000000000000000 -0.0301072734461605 0.0301072734848801 0.0000000000000000 -0.0000000000008396 0.0000000000000000 + 4 4 + 0.3832694786915660 -0.0000000000000000 0.0000000000000000 0.0399146991058411 0.0000000000000000 -0.0000000000018791 + 0.0000000000000000 -0.0399146991058411 0.3832694797228522 0.0000000000000000 0.0000000000100507 -0.0000000000000000 + 0.0000000000000000 0.0000000000018791 0.0000000000100507 0.0000000000000000 0.3185927640358261 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.216450216450 0.000000000000 0.000000000000 ) + + 1 1 + 0.3616676361354612 -0.0000000000000000 -0.0000000000000000 -0.0384932955866087 -0.0000000000000000 -0.0000000000010808 + -0.0000000000000000 0.0384932955866087 0.3616676371106657 0.0000000000000000 0.0000000000110410 -0.0000000000000000 + -0.0000000000000000 0.0000000000010808 0.0000000000110410 0.0000000000000000 0.3164727847954889 0.0000000000000000 + 1 2 + -0.0010134482035200 -0.0000000000000000 -0.0000000000000000 0.0010134482133073 0.0000000000000000 -0.0174951349852188 + -0.0000000000000000 0.0010134482133073 0.0010134482032634 -0.0000000000000000 0.0174951350108037 0.0000000000000000 + -0.0000000000000000 0.0174951349852188 -0.0174951350108037 -0.0000000000000000 0.0000000000005866 0.0000000000000000 + 1 3 + -0.0838533408733757 0.0000000000000000 -0.0000000000000000 0.0170043159797630 0.0000000000000000 -0.0000000000021709 + 0.0000000000000000 -0.0170043159765576 -0.0838533411018781 -0.0000000000000000 -0.0000000000028958 0.0000000000000000 + 0.0000000000000000 -0.0000000000006932 0.0000000000002707 0.0000000000000000 -0.0389353850994676 -0.0000000000000000 + 1 4 + 0.0051233148174714 0.0000000000000000 0.0000000000000000 -0.0051233148252969 -0.0000000000000000 0.0038684784943790 + 0.0000000000000000 -0.0051233148326877 -0.0051233148088685 -0.0000000000000000 -0.0038684785068310 -0.0000000000000000 + 0.0000000000000000 -0.0039174694146904 0.0039174694145958 0.0000000000000000 0.0000000000034851 -0.0000000000000000 + 2 1 + -0.0010134482035200 0.0000000000000000 -0.0000000000000000 -0.0010134482133073 -0.0000000000000000 -0.0174951349852188 + -0.0000000000000000 -0.0010134482133073 0.0010134482032634 0.0000000000000000 -0.0174951350108037 0.0000000000000000 + 0.0000000000000000 0.0174951349852188 0.0174951350108037 -0.0000000000000000 0.0000000000005866 -0.0000000000000000 + 2 2 + 0.3616676361354612 0.0000000000000000 0.0000000000000000 0.0384932955866087 -0.0000000000000000 -0.0000000000010808 + 0.0000000000000000 -0.0384932955866087 0.3616676371106656 0.0000000000000000 -0.0000000000110410 -0.0000000000000000 + -0.0000000000000000 0.0000000000010808 -0.0000000000110410 0.0000000000000000 0.3164727847954889 0.0000000000000000 + 2 3 + 0.0051233148174714 -0.0000000000000000 0.0000000000000000 0.0051233148252969 -0.0000000000000000 0.0038684784943790 + 0.0000000000000000 0.0051233148326877 -0.0051233148088685 0.0000000000000000 0.0038684785068310 -0.0000000000000000 + -0.0000000000000000 -0.0039174694146904 -0.0039174694145958 0.0000000000000000 0.0000000000034851 0.0000000000000000 + 2 4 + -0.0838533408733757 0.0000000000000000 0.0000000000000000 -0.0170043159797630 -0.0000000000000000 -0.0000000000021709 + 0.0000000000000000 0.0170043159765576 -0.0838533411018781 0.0000000000000000 0.0000000000028958 0.0000000000000000 + -0.0000000000000000 -0.0000000000006932 -0.0000000000002707 0.0000000000000000 -0.0389353850994676 0.0000000000000000 + 3 1 + -0.0838533408733757 0.0000000000000000 0.0000000000000000 0.0170043159765576 0.0000000000000000 0.0000000000006932 + -0.0000000000000000 -0.0170043159797630 -0.0838533411018781 0.0000000000000000 0.0000000000002707 -0.0000000000000000 + 0.0000000000000000 0.0000000000021709 -0.0000000000028958 -0.0000000000000000 -0.0389353850994676 0.0000000000000000 + 3 2 + 0.0051233148174714 0.0000000000000000 0.0000000000000000 -0.0051233148326877 -0.0000000000000000 0.0039174694146904 + 0.0000000000000000 -0.0051233148252969 -0.0051233148088685 -0.0000000000000000 -0.0039174694145958 -0.0000000000000000 + 0.0000000000000000 -0.0038684784943790 0.0038684785068310 0.0000000000000000 0.0000000000034851 -0.0000000000000000 + 3 3 + 0.3832694786915660 -0.0000000000000000 0.0000000000000000 0.0399146991058411 -0.0000000000000000 0.0000000000018791 + 0.0000000000000000 -0.0399146991058411 0.3832694797228522 0.0000000000000000 -0.0000000000100507 -0.0000000000000000 + -0.0000000000000000 -0.0000000000018791 -0.0000000000100507 0.0000000000000000 0.3185927640358261 0.0000000000000000 + 3 4 + 0.0132181192209605 0.0000000000000000 0.0000000000000000 -0.0132181192416233 0.0000000000000000 -0.0301072734461605 + 0.0000000000000000 -0.0132181192416233 -0.0132181192621357 -0.0000000000000000 0.0301072734848801 0.0000000000000000 + -0.0000000000000000 0.0301072734461605 -0.0301072734848801 -0.0000000000000000 -0.0000000000008396 0.0000000000000000 + 4 1 + 0.0051233148174714 -0.0000000000000000 0.0000000000000000 0.0051233148326877 0.0000000000000000 0.0039174694146904 + 0.0000000000000000 0.0051233148252969 -0.0051233148088685 0.0000000000000000 0.0039174694145958 -0.0000000000000000 + -0.0000000000000000 -0.0038684784943790 -0.0038684785068310 0.0000000000000000 0.0000000000034851 0.0000000000000000 + 4 2 + -0.0838533408733757 -0.0000000000000000 0.0000000000000000 -0.0170043159765576 -0.0000000000000000 0.0000000000006932 + -0.0000000000000000 0.0170043159797630 -0.0838533411018781 -0.0000000000000000 -0.0000000000002707 -0.0000000000000000 + -0.0000000000000000 0.0000000000021709 0.0000000000028958 -0.0000000000000000 -0.0389353850994676 -0.0000000000000000 + 4 3 + 0.0132181192209605 -0.0000000000000000 0.0000000000000000 0.0132181192416233 -0.0000000000000000 -0.0301072734461605 + 0.0000000000000000 0.0132181192416233 -0.0132181192621357 0.0000000000000000 -0.0301072734848801 0.0000000000000000 + 0.0000000000000000 0.0301072734461605 0.0301072734848801 -0.0000000000000000 -0.0000000000008396 -0.0000000000000000 + 4 4 + 0.3832694786915660 0.0000000000000000 0.0000000000000000 -0.0399146991058411 0.0000000000000000 0.0000000000018791 + 0.0000000000000000 0.0399146991058411 0.3832694797228522 -0.0000000000000000 0.0000000000100507 0.0000000000000000 + 0.0000000000000000 -0.0000000000018791 0.0000000000100507 -0.0000000000000000 0.3185927640358261 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.216450216450 0.000000000000 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 11.20652026 [THz] = 373.80922561 [cm-1] +( -0.198678 0.000000 0.000000 0.198678 -0.000001 -0.614760 ) +( -0.198680 0.000000 -0.000000 -0.198680 -0.000000 -0.614754 ) +( -0.102243 0.000000 0.000000 0.102243 -0.000000 -0.149064 ) +( -0.102244 0.000000 -0.000000 -0.102244 -0.000000 -0.149062 ) + freq ( 2) = 11.20652026 [THz] = 373.80922562 [cm-1] +( 0.198680 0.000000 0.000000 -0.198680 -0.000001 -0.614754 ) +( -0.198678 0.000000 -0.000000 -0.198678 -0.000000 0.614760 ) +( 0.102244 -0.000000 0.000000 -0.102244 -0.000000 -0.149062 ) +( -0.102243 0.000000 -0.000000 -0.102243 -0.000000 0.149064 ) + freq ( 3) = 11.31780847 [THz] = 377.52140014 [cm-1] +( -0.480401 0.000000 -0.000000 -0.480401 -0.000000 -0.000000 ) +( 0.480401 -0.000000 -0.000000 -0.480401 0.000000 0.000000 ) +( -0.138619 -0.000000 -0.000000 -0.138619 -0.000000 -0.000000 ) +( 0.138619 -0.000000 -0.000000 -0.138619 0.000000 0.000000 ) + freq ( 4) = 11.46760713 [THz] = 382.51814507 [cm-1] +( 0.492196 0.000000 -0.000000 0.492196 0.000000 -0.000000 ) +( 0.492196 -0.000000 0.000000 -0.492196 0.000000 -0.000000 ) +( 0.087995 -0.000000 -0.000000 0.087995 0.000000 -0.000000 ) +( 0.087995 -0.000000 0.000000 -0.087995 0.000000 -0.000000 ) + freq ( 5) = 12.30386740 [THz] = 410.41278086 [cm-1] +( -0.401048 0.000000 0.000000 0.401048 0.000012 -0.289371 ) +( 0.401087 0.000017 -0.000017 0.401087 0.000000 0.289343 ) +( -0.217364 0.000000 0.000000 0.217364 0.000000 -0.007737 ) +( 0.217385 0.000009 -0.000009 0.217385 0.000000 0.007736 ) + freq ( 6) = 12.30386740 [THz] = 410.41278086 [cm-1] +( 0.401087 0.000000 0.000000 -0.401087 0.000012 -0.289343 ) +( 0.401048 0.000017 -0.000017 0.401048 0.000000 -0.289371 ) +( 0.217385 0.000000 0.000000 -0.217385 0.000000 -0.007736 ) +( 0.217364 0.000009 -0.000009 0.217364 0.000000 -0.007737 ) + freq ( 7) = 17.13411786 [THz] = 571.53257029 [cm-1] +( 0.072021 0.000000 0.000000 -0.072021 -0.000000 -0.050956 ) +( -0.072022 0.000000 -0.000000 -0.072022 -0.000000 0.050956 ) +( -0.242235 -0.000000 -0.000000 0.242235 0.000001 0.608010 ) +( 0.242238 -0.000000 0.000000 0.242238 0.000000 -0.608004 ) + freq ( 8) = 17.13411786 [THz] = 571.53257031 [cm-1] +( 0.072022 0.000000 -0.000000 -0.072022 0.000000 0.050956 ) +( 0.072021 -0.000000 0.000000 0.072021 -0.000000 0.050956 ) +( -0.242238 -0.000000 0.000000 0.242238 -0.000001 -0.608004 ) +( -0.242235 0.000000 -0.000000 -0.242235 -0.000000 -0.608010 ) + freq ( 9) = 19.66935808 [THz] = 656.09906909 [cm-1] +( 0.085435 0.000000 -0.000000 -0.085435 -0.000000 -0.034630 ) +( 0.085434 -0.000001 0.000001 0.085434 -0.000000 -0.034630 ) +( -0.415866 -0.000000 0.000000 0.415866 0.000002 0.371909 ) +( -0.415862 0.000002 -0.000002 -0.415862 0.000000 0.371912 ) + freq ( 10) = 19.66935808 [THz] = 656.09906910 [cm-1] +( 0.085434 0.000000 0.000000 -0.085434 0.000000 0.034630 ) +( -0.085435 0.000001 -0.000001 -0.085435 0.000000 -0.034630 ) +( -0.415862 0.000000 -0.000000 0.415862 -0.000002 -0.371912 ) +( 0.415866 -0.000002 0.000002 0.415866 -0.000000 0.371909 ) + freq ( 11) = 20.04119388 [THz] = 668.50217461 [cm-1] +( 0.061237 0.000000 -0.000000 0.061237 0.000000 -0.000000 ) +( -0.061237 0.000000 -0.000000 0.061237 -0.000000 0.000000 ) +( -0.496236 0.000000 -0.000000 -0.496236 -0.000000 0.000000 ) +( 0.496236 -0.000000 0.000000 -0.496236 0.000000 -0.000000 ) + freq ( 12) = 21.18476945 [THz] = 706.64774439 [cm-1] +( -0.038118 0.000000 0.000000 -0.038118 -0.000000 -0.000000 ) +( -0.038118 0.000000 -0.000000 0.038118 0.000000 -0.000000 ) +( 0.498545 -0.000000 0.000000 0.498545 -0.000000 0.000000 ) +( 0.498545 -0.000000 0.000000 -0.498545 0.000000 0.000000 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/all_properties_pop1.json b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/all_properties_pop1.json new file mode 100644 index 000000000..4a5e2a108 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/all_properties_pop1.json @@ -0,0 +1 @@ +{"properties": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]} \ No newline at end of file diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_1 b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_1 new file mode 100644 index 000000000..6bfe9abb4 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_1 @@ -0,0 +1,149 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0800000000000001 0.0000000000000000 0.0000000000000000 + -1.5400000000000000 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000000 0.0000000000000002 0.0000000000000000 + 2 1 -0.0000000000000001 1.7782388266666669 2.5249999999999999 + 3 2 -0.0000000000000000 0.0000000000000002 1.8937500000000027 + 4 2 -0.0000000000000001 1.7782388266666669 4.4187500000000020 + + Dynamical Matrix in cartesian axes + + q = ( 0.000000000000 0.000000000000 0.000000000000 ) + + 1 1 + 0.2222940580748697 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.2222940586842538 0.0000000000000000 -0.0000000000000001 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000000001 0.0000000000000000 0.4454211992892303 0.0000000000000000 + 1 2 + 0.0089716505813523 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0089716506059468 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000001 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.2228448862427722 0.0000000000000000 + 1 3 + -0.0598142485887568 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0598142487527281 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000002 0.0000000000000000 -0.0000000000000001 0.0000000000000000 -0.0564136676639685 0.0000000000000000 + 1 4 + -0.1714514600674649 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.1714514605374723 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000001 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.1661626453824892 0.0000000000000000 + 2 1 + 0.0089716505813523 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0089716506059468 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.2228448862427722 0.0000000000000000 + 2 2 + 0.2222940580748696 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.2222940586842539 0.0000000000000000 0.0000000000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 0.4454211992892301 0.0000000000000000 + 2 3 + -0.1714514600674648 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1714514605374722 0.0000000000000000 0.0000000000000002 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.1661626453824892 0.0000000000000000 + 2 4 + -0.0598142485887568 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000001 0.0000000000000000 -0.0598142487527281 0.0000000000000000 -0.0000000000000003 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 -0.0564136676639684 0.0000000000000000 + 3 1 + -0.0598142485887568 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000002 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0598142487527281 0.0000000000000000 -0.0000000000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0564136676639685 0.0000000000000000 + 3 2 + -0.1714514600674648 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1714514605374722 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000002 0.0000000000000000 -0.1661626453824893 0.0000000000000000 + 3 3 + 0.2520285752899360 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.2520285759808325 0.0000000000000000 0.0000000000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 0.3860157688538152 0.0000000000000000 + 3 4 + -0.0207628666337141 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0207628666906321 0.0000000000000000 0.0000000000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.1634394558073576 0.0000000000000000 + 4 1 + -0.1714514600674649 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1714514605374724 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.1661626453824892 0.0000000000000000 + 4 2 + -0.0598142485887568 0.0000000000000000 -0.0000000000000001 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0598142487527281 0.0000000000000000 0.0000000000000001 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000000003 0.0000000000000000 -0.0564136676639684 0.0000000000000000 + 4 3 + -0.0207628666337141 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0207628666906321 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000001 0.0000000000000000 -0.1634394558073576 0.0000000000000000 + 4 4 + 0.2520285752899361 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.2520285759808327 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.3860157688538153 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.000000000000 0.000000000000 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 0.00000019 [THz] = 0.00000619 [cm-1] +( -0.042098 0.000000 -0.332591 0.000000 0.370960 0.000000 ) +( -0.042098 0.000000 -0.332591 0.000000 0.370960 0.000000 ) +( -0.042098 0.000000 -0.332591 0.000000 0.370960 0.000000 ) +( -0.042098 0.000000 -0.332591 0.000000 0.370960 0.000000 ) + freq ( 2) = 0.00000027 [THz] = 0.00000906 [cm-1] +( 0.493729 0.000000 -0.077746 0.000000 -0.013675 0.000000 ) +( 0.493729 0.000000 -0.077746 0.000000 -0.013675 0.000000 ) +( 0.493729 0.000000 -0.077746 0.000000 -0.013675 0.000000 ) +( 0.493729 0.000000 -0.077746 0.000000 -0.013675 0.000000 ) + freq ( 3) = 0.00000044 [THz] = 0.00001454 [cm-1] +( -0.066777 0.000000 -0.365156 0.000000 -0.334966 0.000000 ) +( -0.066777 0.000000 -0.365156 0.000000 -0.334966 0.000000 ) +( -0.066777 0.000000 -0.365156 0.000000 -0.334966 0.000000 ) +( -0.066777 0.000000 -0.365156 0.000000 -0.334966 0.000000 ) + freq ( 4) = 8.04814146 [THz] = 268.45706391 [cm-1] +( -0.622553 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( 0.622553 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( 0.335303 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( -0.335303 0.000000 0.000000 0.000000 -0.000000 0.000000 ) + freq ( 5) = 8.04814147 [THz] = 268.45706428 [cm-1] +( 0.000000 0.000000 0.622553 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 -0.622553 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 -0.335303 0.000000 -0.000000 0.000000 ) +( 0.000000 0.000000 0.335303 0.000000 -0.000000 0.000000 ) + freq ( 6) = 16.26304129 [THz] = 542.47658758 [cm-1] +( -0.000000 0.000000 0.000000 0.000000 -0.658941 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 0.658941 0.000000 ) +( -0.000000 0.000000 0.000000 0.000000 0.256509 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 -0.256509 0.000000 ) + freq ( 7) = 17.17896585 [THz] = 573.02853813 [cm-1] +( -0.158718 0.000000 0.000000 0.000000 0.000000 0.000000 ) +( 0.158718 0.000000 -0.000000 0.000000 -0.000000 0.000000 ) +( -0.689064 0.000000 0.000000 0.000000 0.000000 0.000000 ) +( 0.689064 0.000000 -0.000000 0.000000 0.000000 0.000000 ) + freq ( 8) = 17.17896588 [THz] = 573.02853891 [cm-1] +( 0.000000 0.000000 0.158718 0.000000 0.000000 0.000000 ) +( -0.000000 0.000000 -0.158718 0.000000 0.000000 0.000000 ) +( 0.000000 0.000000 0.689064 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 -0.689064 0.000000 -0.000000 0.000000 ) + freq ( 9) = 17.72447635 [THz] = 591.22480696 [cm-1] +( 0.000000 0.000000 0.000000 0.000000 -0.278046 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 -0.278046 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 0.650147 0.000000 ) +( -0.000000 0.000000 -0.000000 0.000000 0.650147 0.000000 ) + freq ( 10) = 18.06714633 [THz] = 602.65504564 [cm-1] +( -0.278046 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( -0.278046 0.000000 0.000000 0.000000 -0.000000 0.000000 ) +( 0.650147 0.000000 -0.000000 0.000000 0.000000 0.000000 ) +( 0.650147 0.000000 -0.000000 0.000000 0.000000 0.000000 ) + freq ( 11) = 18.06714636 [THz] = 602.65504647 [cm-1] +( 0.000000 0.000000 0.278046 0.000000 0.000000 0.000000 ) +( 0.000000 0.000000 0.278046 0.000000 0.000000 0.000000 ) +( -0.000000 0.000000 -0.650147 0.000000 -0.000000 0.000000 ) +( -0.000000 0.000000 -0.650147 0.000000 -0.000000 0.000000 ) + freq ( 12) = 23.69136614 [THz] = 790.25879788 [cm-1] +( 0.000000 0.000000 0.000000 0.000000 -0.116121 0.000000 ) +( -0.000000 0.000000 -0.000000 0.000000 0.116121 0.000000 ) +( 0.000000 0.000000 0.000000 0.000000 -0.697507 0.000000 ) +( -0.000000 0.000000 -0.000000 0.000000 0.697507 0.000000 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_2 b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_2 new file mode 100644 index 000000000..70a062de7 --- /dev/null +++ b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_2 @@ -0,0 +1,494 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0800000000000001 0.0000000000000000 0.0000000000000000 + -1.5400000000000000 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000000 0.0000000000000002 0.0000000000000000 + 2 1 -0.0000000000000001 1.7782388266666669 2.5249999999999999 + 3 2 -0.0000000000000000 0.0000000000000002 1.8937500000000027 + 4 2 -0.0000000000000001 1.7782388266666669 4.4187500000000020 + + Dynamical Matrix in cartesian axes + + q = ( 0.108225108225 -0.062483795452 0.000000000000 ) + + 1 1 + 0.3953851121452506 0.0000000000000000 -0.0924314139568956 -0.0000000000000000 0.0298406331914964 -0.0168556555738940 + -0.0924314139568956 0.0000000000000000 0.2886545096236606 -0.0000000000000000 -0.0172284976295140 0.0097316172962944 + 0.0298406331914964 0.0168556555738940 -0.0172284976295140 -0.0097316172962944 0.3458171338040109 0.0000000000000000 + 1 2 + 0.0178458752628794 0.0258911936826404 -0.0088605020429228 -0.0124094616128501 -0.0183848153504154 0.0070356730332983 + -0.0088605020429228 -0.0124094616128498 0.0076146488185035 0.0115619817286214 0.0106144781061129 -0.0040620477252728 + 0.0183848153504153 -0.0070356730332983 -0.0106144781061127 0.0040620477252727 -0.0783401628844314 -0.0480614403983630 + 1 3 + -0.0965730017659494 0.0014617978067044 0.0223802275878645 0.0001755064505345 0.0131633952642390 0.0007459270044941 + 0.0223802275878641 0.0001755064505345 -0.0707305411505100 0.0016644552039107 -0.0075998898096748 -0.0004306611574308 + -0.0067820334599575 0.0130220647422712 0.0039156088491266 -0.0075182925946598 -0.0444591393640964 -0.0018963418789673 + 1 4 + -0.1073249235689483 -0.0801279396989314 0.0112357890059528 0.0211405178085244 -0.0031750624059442 -0.0013023795180820 + 0.0112357890059526 0.0211405178085242 -0.0943509522310900 -0.0557169725900106 0.0018331231372783 0.0007519291663824 + -0.0015393337558602 -0.0114329368404193 0.0008887347595367 0.0066008091714916 -0.0837220189916974 -0.0497794927653874 + 2 1 + 0.0178458752628794 -0.0258911936826404 -0.0088605020429228 0.0124094616128498 0.0183848153504153 0.0070356730332983 + -0.0088605020429228 0.0124094616128501 0.0076146488185035 -0.0115619817286214 -0.0106144781061127 -0.0040620477252726 + -0.0183848153504154 -0.0070356730332983 0.0106144781061129 0.0040620477252728 -0.0783401628844314 0.0480614403983630 + 2 2 + 0.3953851121452510 0.0000000000000000 -0.0924314139568961 -0.0000000000000001 -0.0298406331914963 -0.0168556555738939 + -0.0924314139568961 0.0000000000000001 0.2886545096236612 0.0000000000000000 0.0172284976295139 0.0097316172962943 + -0.0298406331914963 0.0168556555738939 0.0172284976295139 -0.0097316172962942 0.3458171338040109 0.0000000000000000 + 2 3 + -0.1073249235689485 0.0801279396989315 0.0112357890059530 -0.0211405178085244 0.0031750624059441 -0.0013023795180820 + 0.0112357890059527 -0.0211405178085243 -0.0943509522310903 0.0557169725900109 -0.0018331231372784 0.0007519291663824 + 0.0015393337558601 -0.0114329368404194 -0.0008887347595367 0.0066008091714916 -0.0837220189916973 0.0497794927653876 + 2 4 + -0.0965730017659494 -0.0014617978067044 0.0223802275878645 -0.0001755064505345 -0.0131633952642389 0.0007459270044940 + 0.0223802275878645 -0.0001755064505345 -0.0707305411505100 -0.0016644552039108 0.0075998898096748 -0.0004306611574309 + 0.0067820334599576 0.0130220647422711 -0.0039156088491265 -0.0075182925946600 -0.0444591393640964 0.0018963418789673 + 3 1 + -0.0965730017659494 -0.0014617978067044 0.0223802275878641 -0.0001755064505345 -0.0067820334599575 -0.0130220647422712 + 0.0223802275878645 -0.0001755064505345 -0.0707305411505100 -0.0016644552039107 0.0039156088491266 0.0075182925946598 + 0.0131633952642390 -0.0007459270044941 -0.0075998898096748 0.0004306611574308 -0.0444591393640964 0.0018963418789673 + 3 2 + -0.1073249235689485 -0.0801279396989315 0.0112357890059527 0.0211405178085244 0.0015393337558601 0.0114329368404194 + 0.0112357890059530 0.0211405178085244 -0.0943509522310903 -0.0557169725900109 -0.0008887347595367 -0.0066008091714916 + 0.0031750624059441 0.0013023795180820 -0.0018331231372784 -0.0007519291663824 -0.0837220189916974 -0.0497794927653876 + 3 3 + 0.3877742054627855 0.0000000000000000 -0.0649640623620073 0.0000000000000001 -0.0047485286660504 -0.0139089819839099 + -0.0649640623620073 -0.0000000000000001 0.3127601686382750 0.0000000000000000 0.0027415643073566 0.0080303545035712 + -0.0047485286660504 0.0139089819839099 0.0027415643073566 -0.0080303545035712 0.3493025963892997 -0.0000000000000000 + 3 4 + 0.0134894162246296 0.0056508523586642 -0.0159267304221525 -0.0047468632754974 -0.0212181047602426 0.0115158737055671 + -0.0159267304221527 -0.0047468632754975 -0.0049011879566798 0.0001696467868126 0.0122502785118107 -0.0066486927929760 + 0.0212181047602425 -0.0115158737055673 -0.0122502785118108 0.0066486927929762 -0.0701494288195834 -0.0529881654024535 + 4 1 + -0.1073249235689483 0.0801279396989314 0.0112357890059526 -0.0211405178085242 -0.0015393337558602 0.0114329368404193 + 0.0112357890059528 -0.0211405178085244 -0.0943509522310900 0.0557169725900106 0.0008887347595367 -0.0066008091714916 + -0.0031750624059442 0.0013023795180820 0.0018331231372783 -0.0007519291663824 -0.0837220189916974 0.0497794927653874 + 4 2 + -0.0965730017659494 0.0014617978067044 0.0223802275878645 0.0001755064505345 0.0067820334599576 -0.0130220647422711 + 0.0223802275878645 0.0001755064505345 -0.0707305411505100 0.0016644552039108 -0.0039156088491265 0.0075182925946600 + -0.0131633952642389 -0.0007459270044940 0.0075998898096748 0.0004306611574309 -0.0444591393640965 -0.0018963418789673 + 4 3 + 0.0134894162246296 -0.0056508523586643 -0.0159267304221527 0.0047468632754975 0.0212181047602425 0.0115158737055673 + -0.0159267304221526 0.0047468632754975 -0.0049011879566798 -0.0001696467868126 -0.0122502785118108 -0.0066486927929762 + -0.0212181047602426 -0.0115158737055671 0.0122502785118107 0.0066486927929760 -0.0701494288195834 0.0529881654024534 + 4 4 + 0.3877742054627852 0.0000000000000000 -0.0649640623620071 0.0000000000000000 0.0047485286660503 -0.0139089819839100 + -0.0649640623620071 -0.0000000000000000 0.3127601686382747 -0.0000000000000000 -0.0027415643073566 0.0080303545035710 + 0.0047485286660503 0.0139089819839100 -0.0027415643073566 -0.0080303545035710 0.3493025963892999 0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.108225108225 0.062483795452 0.000000000000 ) + + 1 1 + 0.3953851121452505 0.0000000000000000 -0.0924314139568956 0.0000000000000000 0.0298406331914964 0.0168556555738940 + -0.0924314139568956 -0.0000000000000000 0.2886545096236607 0.0000000000000000 -0.0172284976295139 -0.0097316172962941 + 0.0298406331914964 -0.0168556555738940 -0.0172284976295139 0.0097316172962941 0.3458171338040105 0.0000000000000000 + 1 2 + 0.0178458752628793 -0.0258911936826403 -0.0088605020429229 0.0124094616128501 -0.0183848153504153 -0.0070356730332983 + -0.0088605020429228 0.0124094616128501 0.0076146488185040 -0.0115619817286217 0.0106144781061129 0.0040620477252726 + 0.0183848153504155 0.0070356730332981 -0.0106144781061128 -0.0040620477252726 -0.0783401628844315 0.0480614403983632 + 1 3 + -0.0965730017659493 -0.0014617978067044 0.0223802275878645 -0.0001755064505345 0.0131633952642390 -0.0007459270044942 + 0.0223802275878642 -0.0001755064505345 -0.0707305411505104 -0.0016644552039108 -0.0075998898096749 0.0004306611574307 + -0.0067820334599577 -0.0130220647422711 0.0039156088491266 0.0075182925946599 -0.0444591393640964 0.0018963418789673 + 1 4 + -0.1073249235689484 0.0801279396989314 0.0112357890059528 -0.0211405178085244 -0.0031750624059442 0.0013023795180821 + 0.0112357890059528 -0.0211405178085243 -0.0943509522310902 0.0557169725900108 0.0018331231372784 -0.0007519291663823 + -0.0015393337558602 0.0114329368404193 0.0008887347595368 -0.0066008091714915 -0.0837220189916975 0.0497794927653875 + 2 1 + 0.0178458752628794 0.0258911936826403 -0.0088605020429228 -0.0124094616128501 0.0183848153504155 -0.0070356730332981 + -0.0088605020429229 -0.0124094616128501 0.0076146488185040 0.0115619817286217 -0.0106144781061128 0.0040620477252726 + -0.0183848153504153 0.0070356730332983 0.0106144781061129 -0.0040620477252726 -0.0783401628844315 -0.0480614403983632 + 2 2 + 0.3953851121452508 0.0000000000000000 -0.0924314139568959 0.0000000000000000 -0.0298406331914963 0.0168556555738941 + -0.0924314139568958 -0.0000000000000000 0.2886545096236611 -0.0000000000000000 0.0172284976295138 -0.0097316172962942 + -0.0298406331914964 -0.0168556555738941 0.0172284976295138 0.0097316172962942 0.3458171338040104 -0.0000000000000000 + 2 3 + -0.1073249235689483 -0.0801279396989314 0.0112357890059528 0.0211405178085246 0.0031750624059443 0.0013023795180821 + 0.0112357890059530 0.0211405178085244 -0.0943509522310904 -0.0557169725900109 -0.0018331231372783 -0.0007519291663823 + 0.0015393337558600 0.0114329368404191 -0.0008887347595366 -0.0066008091714917 -0.0837220189916974 -0.0497794927653874 + 2 4 + -0.0965730017659494 0.0014617978067044 0.0223802275878643 0.0001755064505344 -0.0131633952642389 -0.0007459270044942 + 0.0223802275878644 0.0001755064505346 -0.0707305411505101 0.0016644552039107 0.0075998898096746 0.0004306611574308 + 0.0067820334599576 -0.0130220647422711 -0.0039156088491267 0.0075182925946601 -0.0444591393640964 -0.0018963418789672 + 3 1 + -0.0965730017659493 0.0014617978067044 0.0223802275878642 0.0001755064505345 -0.0067820334599578 0.0130220647422711 + 0.0223802275878645 0.0001755064505345 -0.0707305411505104 0.0016644552039108 0.0039156088491266 -0.0075182925946599 + 0.0131633952642390 0.0007459270044942 -0.0075998898096749 -0.0004306611574307 -0.0444591393640964 -0.0018963418789673 + 3 2 + -0.1073249235689483 0.0801279396989314 0.0112357890059530 -0.0211405178085244 0.0015393337558600 -0.0114329368404191 + 0.0112357890059528 -0.0211405178085246 -0.0943509522310904 0.0557169725900109 -0.0008887347595366 0.0066008091714917 + 0.0031750624059443 -0.0013023795180821 -0.0018331231372783 0.0007519291663823 -0.0837220189916974 0.0497794927653874 + 3 3 + 0.3877742054627854 0.0000000000000000 -0.0649640623620071 -0.0000000000000000 -0.0047485286660504 0.0139089819839100 + -0.0649640623620072 0.0000000000000000 0.3127601686382750 -0.0000000000000000 0.0027415643073566 -0.0080303545035710 + -0.0047485286660504 -0.0139089819839100 0.0027415643073566 0.0080303545035710 0.3493025963892997 -0.0000000000000000 + 3 4 + 0.0134894162246296 -0.0056508523586642 -0.0159267304221527 0.0047468632754975 -0.0212181047602425 -0.0115158737055672 + -0.0159267304221527 0.0047468632754976 -0.0049011879566798 -0.0001696467868125 0.0122502785118108 0.0066486927929761 + 0.0212181047602425 0.0115158737055672 -0.0122502785118107 -0.0066486927929761 -0.0701494288195834 0.0529881654024534 + 4 1 + -0.1073249235689484 -0.0801279396989314 0.0112357890059528 0.0211405178085243 -0.0015393337558602 -0.0114329368404193 + 0.0112357890059528 0.0211405178085244 -0.0943509522310902 -0.0557169725900108 0.0008887347595368 0.0066008091714915 + -0.0031750624059442 -0.0013023795180821 0.0018331231372784 0.0007519291663823 -0.0837220189916975 -0.0497794927653875 + 4 2 + -0.0965730017659494 -0.0014617978067044 0.0223802275878645 -0.0001755064505346 0.0067820334599576 0.0130220647422711 + 0.0223802275878643 -0.0001755064505344 -0.0707305411505101 -0.0016644552039107 -0.0039156088491267 -0.0075182925946601 + -0.0131633952642389 0.0007459270044942 0.0075998898096746 -0.0004306611574308 -0.0444591393640964 0.0018963418789672 + 4 3 + 0.0134894162246296 0.0056508523586642 -0.0159267304221527 -0.0047468632754976 0.0212181047602425 -0.0115158737055672 + -0.0159267304221527 -0.0047468632754975 -0.0049011879566798 0.0001696467868125 -0.0122502785118107 0.0066486927929761 + -0.0212181047602425 0.0115158737055672 0.0122502785118108 -0.0066486927929761 -0.0701494288195834 -0.0529881654024534 + 4 4 + 0.3877742054627856 -0.0000000000000000 -0.0649640623620072 0.0000000000000001 0.0047485286660503 0.0139089819839098 + -0.0649640623620072 -0.0000000000000001 0.3127601686382749 -0.0000000000000000 -0.0027415643073566 -0.0080303545035710 + 0.0047485286660503 -0.0139089819839098 -0.0027415643073566 0.0080303545035709 0.3493025963893001 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( 0.108225108225 0.062483795452 0.000000000000 ) + + 1 1 + 0.3953851121452508 0.0000000000000000 0.0924314139568958 -0.0000000000000000 -0.0298406331914964 -0.0168556555738941 + 0.0924314139568958 0.0000000000000000 0.2886545096236609 -0.0000000000000000 -0.0172284976295141 -0.0097316172962944 + -0.0298406331914964 0.0168556555738941 -0.0172284976295141 0.0097316172962944 0.3458171338040105 -0.0000000000000000 + 1 2 + 0.0178458752628794 -0.0258911936826404 0.0088605020429228 -0.0124094616128501 0.0183848153504155 0.0070356730332984 + 0.0088605020429231 -0.0124094616128500 0.0076146488185039 -0.0115619817286217 0.0106144781061128 0.0040620477252728 + -0.0183848153504153 -0.0070356730332980 -0.0106144781061128 -0.0040620477252728 -0.0783401628844314 0.0480614403983631 + 1 3 + -0.0965730017659494 -0.0014617978067044 -0.0223802275878646 0.0001755064505345 -0.0131633952642390 0.0007459270044941 + -0.0223802275878645 0.0001755064505345 -0.0707305411505103 -0.0016644552039108 -0.0075998898096749 0.0004306611574307 + 0.0067820334599576 0.0130220647422711 0.0039156088491267 0.0075182925946600 -0.0444591393640965 0.0018963418789673 + 1 4 + -0.1073249235689485 0.0801279396989315 -0.0112357890059529 0.0211405178085245 0.0031750624059443 -0.0013023795180821 + -0.0112357890059527 0.0211405178085244 -0.0943509522310904 0.0557169725900109 0.0018331231372786 -0.0007519291663822 + 0.0015393337558600 -0.0114329368404194 0.0008887347595366 -0.0066008091714917 -0.0837220189916972 0.0497794927653874 + 2 1 + 0.0178458752628794 0.0258911936826404 0.0088605020429230 0.0124094616128500 -0.0183848153504153 0.0070356730332980 + 0.0088605020429228 0.0124094616128501 0.0076146488185039 0.0115619817286217 -0.0106144781061128 0.0040620477252728 + 0.0183848153504155 -0.0070356730332984 0.0106144781061128 -0.0040620477252728 -0.0783401628844314 -0.0480614403983631 + 2 2 + 0.3953851121452507 0.0000000000000000 0.0924314139568959 0.0000000000000000 0.0298406331914963 -0.0168556555738938 + 0.0924314139568959 -0.0000000000000000 0.2886545096236612 -0.0000000000000000 0.0172284976295139 -0.0097316172962942 + 0.0298406331914963 0.0168556555738938 0.0172284976295139 0.0097316172962942 0.3458171338040108 -0.0000000000000000 + 2 3 + -0.1073249235689484 -0.0801279396989314 -0.0112357890059529 -0.0211405178085246 -0.0031750624059442 -0.0013023795180822 + -0.0112357890059527 -0.0211405178085244 -0.0943509522310903 -0.0557169725900108 -0.0018331231372783 -0.0007519291663824 + -0.0015393337558601 -0.0114329368404194 -0.0008887347595366 -0.0066008091714914 -0.0837220189916975 -0.0497794927653875 + 2 4 + -0.0965730017659494 0.0014617978067045 -0.0223802275878644 -0.0001755064505343 0.0131633952642390 0.0007459270044943 + -0.0223802275878644 -0.0001755064505345 -0.0707305411505103 0.0016644552039107 0.0075998898096748 0.0004306611574307 + -0.0067820334599577 0.0130220647422713 -0.0039156088491266 0.0075182925946602 -0.0444591393640963 -0.0018963418789672 + 3 1 + -0.0965730017659494 0.0014617978067044 -0.0223802275878645 -0.0001755064505345 0.0067820334599576 -0.0130220647422711 + -0.0223802275878646 -0.0001755064505345 -0.0707305411505103 0.0016644552039108 0.0039156088491267 -0.0075182925946600 + -0.0131633952642390 -0.0007459270044941 -0.0075998898096749 -0.0004306611574307 -0.0444591393640965 -0.0018963418789673 + 3 2 + -0.1073249235689484 0.0801279396989314 -0.0112357890059527 0.0211405178085244 -0.0015393337558601 0.0114329368404194 + -0.0112357890059529 0.0211405178085246 -0.0943509522310903 0.0557169725900108 -0.0008887347595366 0.0066008091714914 + -0.0031750624059442 0.0013023795180822 -0.0018331231372783 0.0007519291663824 -0.0837220189916975 0.0497794927653875 + 3 3 + 0.3877742054627852 0.0000000000000000 0.0649640623620074 0.0000000000000001 0.0047485286660504 -0.0139089819839100 + 0.0649640623620074 -0.0000000000000001 0.3127601686382747 -0.0000000000000000 0.0027415643073566 -0.0080303545035709 + 0.0047485286660503 0.0139089819839100 0.0027415643073567 0.0080303545035709 0.3493025963892996 0.0000000000000000 + 3 4 + 0.0134894162246296 -0.0056508523586643 0.0159267304221526 -0.0047468632754975 0.0212181047602426 0.0115158737055673 + 0.0159267304221527 -0.0047468632754976 -0.0049011879566797 -0.0001696467868126 0.0122502785118107 0.0066486927929761 + -0.0212181047602425 -0.0115158737055672 -0.0122502785118107 -0.0066486927929761 -0.0701494288195834 0.0529881654024534 + 4 1 + -0.1073249235689485 -0.0801279396989315 -0.0112357890059527 -0.0211405178085244 0.0015393337558600 0.0114329368404194 + -0.0112357890059529 -0.0211405178085245 -0.0943509522310904 -0.0557169725900109 0.0008887347595366 0.0066008091714917 + 0.0031750624059443 0.0013023795180821 0.0018331231372786 0.0007519291663822 -0.0837220189916972 -0.0497794927653874 + 4 2 + -0.0965730017659494 -0.0014617978067045 -0.0223802275878644 0.0001755064505345 -0.0067820334599577 -0.0130220647422713 + -0.0223802275878644 0.0001755064505343 -0.0707305411505103 -0.0016644552039107 -0.0039156088491266 -0.0075182925946602 + 0.0131633952642390 -0.0007459270044943 0.0075998898096748 -0.0004306611574307 -0.0444591393640963 0.0018963418789672 + 4 3 + 0.0134894162246296 0.0056508523586643 0.0159267304221526 0.0047468632754976 -0.0212181047602425 0.0115158737055672 + 0.0159267304221526 0.0047468632754976 -0.0049011879566797 0.0001696467868126 -0.0122502785118107 0.0066486927929761 + 0.0212181047602426 -0.0115158737055673 0.0122502785118107 -0.0066486927929761 -0.0701494288195834 -0.0529881654024534 + 4 4 + 0.3877742054627855 0.0000000000000000 0.0649640623620073 0.0000000000000000 -0.0047485286660504 -0.0139089819839099 + 0.0649640623620073 -0.0000000000000000 0.3127601686382749 -0.0000000000000000 -0.0027415643073567 -0.0080303545035710 + -0.0047485286660504 0.0139089819839099 -0.0027415643073567 0.0080303545035710 0.3493025963892998 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( 0.000000000000 -0.124967590905 0.000000000000 ) + + 1 1 + 0.2352892071759150 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.4487504150318749 0.0000000000000000 0.0344569952590280 0.0194632345925882 + 0.0000000000000000 -0.0000000000000000 0.0344569952590280 -0.0194632345925882 0.3458171338040104 0.0000000000000000 + 1 2 + 0.0025587210329432 0.0043629162854070 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.0171464159385494 0.0364131332826432 0.0176501519837601 -0.0143227666217227 + -0.0000000000000000 0.0000000000000002 -0.0176501519837602 0.0143227666217226 -0.0024523415309095 -0.0918752915366282 + 1 3 + -0.0578093105519457 -0.0017657838956696 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1094942324707786 -0.0013604691141124 0.0151997796193496 -0.0008613223148616 + 0.0000000000000002 -0.0000000000000002 -0.0078312176982533 -0.0150365851893201 -0.0444591393640963 0.0018963418789674 + 1 4 + 0.0062499341266516 -0.0978481708230901 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000001 -0.0230571271669135 -0.1447307181705745 0.0005307438462690 -0.0039269915457478 + -0.0000000000000001 -0.0000000000000001 -0.0105442016221603 -0.0081401435439590 -0.0012492901504643 -0.0973951417584333 + 2 1 + 0.0025587210329432 -0.0043629162854070 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000002 + -0.0000000000000000 0.0000000000000000 0.0171464159385494 -0.0364131332826432 -0.0176501519837602 -0.0143227666217226 + 0.0000000000000000 0.0000000000000000 0.0176501519837601 0.0143227666217227 -0.0024523415309095 0.0918752915366282 + 2 2 + 0.2352892071759146 -0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4487504150318748 0.0000000000000000 -0.0344569952590277 0.0194632345925885 + -0.0000000000000000 0.0000000000000000 -0.0344569952590277 -0.0194632345925885 0.3458171338040106 -0.0000000000000000 + 2 3 + 0.0062499341266516 0.0978481708230901 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0230571271669134 0.1447307181705744 -0.0005307438462693 -0.0039269915457479 + 0.0000000000000000 0.0000000000000000 0.0105442016221603 -0.0081401435439590 -0.0012492901504645 0.0973951417584335 + 2 4 + -0.0578093105519457 0.0017657838956696 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.1094942324707784 0.0013604691141121 -0.0151997796193496 -0.0008613223148614 + 0.0000000000000000 -0.0000000000000000 0.0078312176982532 -0.0150365851893200 -0.0444591393640964 -0.0018963418789673 + 3 1 + -0.0578093105519457 0.0017657838956696 -0.0000000000000000 -0.0000000000000000 0.0000000000000002 0.0000000000000002 + -0.0000000000000000 -0.0000000000000000 -0.1094942324707785 0.0013604691141124 -0.0078312176982533 0.0150365851893201 + -0.0000000000000000 0.0000000000000000 0.0151997796193496 0.0008613223148616 -0.0444591393640963 -0.0018963418789674 + 3 2 + 0.0062499341266515 -0.0978481708230901 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0230571271669134 -0.1447307181705744 0.0105442016221603 0.0081401435439590 + 0.0000000000000000 0.0000000000000000 -0.0005307438462693 0.0039269915457479 -0.0012492901504645 -0.0973951417584335 + 3 3 + 0.2752531489399451 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.4252812254695735 0.0000000000000000 -0.0054831286147131 0.0160607090071419 + -0.0000000000000000 0.0000000000000000 -0.0054831286147131 -0.0160607090071419 0.3493025963892999 0.0000000000000000 + 3 4 + 0.0048217325921132 -0.0134933961866357 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0040751472247473 0.0238412697331886 0.0237661530822418 -0.0145694106113002 + 0.0000000000000000 0.0000000000000000 -0.0237661530822418 0.0145694106113002 -0.0108143778441652 -0.0872452707501970 + 4 1 + 0.0062499341266516 0.0978481708230901 0.0000000000000000 -0.0000000000000001 -0.0000000000000001 0.0000000000000001 + 0.0000000000000000 0.0000000000000000 -0.0230571271669135 0.1447307181705745 -0.0105442016221603 0.0081401435439590 + 0.0000000000000000 -0.0000000000000000 0.0005307438462690 0.0039269915457478 -0.0012492901504643 0.0973951417584333 + 4 2 + -0.0578093105519457 -0.0017657838956696 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.1094942324707784 -0.0013604691141121 0.0078312176982532 0.0150365851893200 + -0.0000000000000000 -0.0000000000000000 -0.0151997796193496 0.0008613223148614 -0.0444591393640964 0.0018963418789673 + 4 3 + 0.0048217325921132 0.0134933961866357 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 -0.0040751472247473 -0.0238412697331886 -0.0237661530822418 -0.0145694106113002 + 0.0000000000000000 0.0000000000000000 0.0237661530822418 0.0145694106113002 -0.0108143778441652 0.0872452707501970 + 4 4 + 0.2752531489399451 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 0.4252812254695737 -0.0000000000000000 0.0054831286147132 0.0160607090071419 + 0.0000000000000000 -0.0000000000000000 0.0054831286147132 -0.0160607090071419 0.3493025963892997 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.000000000000 0.124967590905 0.000000000000 ) + + 1 1 + 0.2352892071759150 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4487504150318750 -0.0000000000000000 0.0344569952590278 -0.0194632345925883 + 0.0000000000000000 0.0000000000000000 0.0344569952590278 0.0194632345925883 0.3458171338040103 0.0000000000000000 + 1 2 + 0.0025587210329432 -0.0043629162854071 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 0.0171464159385495 -0.0364131332826429 0.0176501519837603 0.0143227666217227 + -0.0000000000000000 -0.0000000000000002 -0.0176501519837602 -0.0143227666217226 -0.0024523415309094 0.0918752915366283 + 1 3 + -0.0578093105519457 0.0017657838956696 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1094942324707785 0.0013604691141123 0.0151997796193497 0.0008613223148615 + 0.0000000000000002 0.0000000000000001 -0.0078312176982534 0.0150365851893200 -0.0444591393640964 -0.0018963418789674 + 1 4 + 0.0062499341266516 0.0978481708230900 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000001 -0.0230571271669135 0.1447307181705746 0.0005307438462693 0.0039269915457477 + -0.0000000000000001 0.0000000000000001 -0.0105442016221603 0.0081401435439592 -0.0012492901504643 0.0973951417584334 + 2 1 + 0.0025587210329432 0.0043629162854070 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000002 + 0.0000000000000000 -0.0000000000000000 0.0171464159385494 0.0364131332826429 -0.0176501519837602 0.0143227666217226 + -0.0000000000000000 0.0000000000000000 0.0176501519837603 -0.0143227666217227 -0.0024523415309095 -0.0918752915366283 + 2 2 + 0.2352892071759146 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000001 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.4487504150318747 -0.0000000000000000 -0.0344569952590280 -0.0194632345925882 + -0.0000000000000001 0.0000000000000000 -0.0344569952590280 0.0194632345925882 0.3458171338040106 0.0000000000000000 + 2 3 + 0.0062499341266516 -0.0978481708230901 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0230571271669132 -0.1447307181705747 -0.0005307438462691 0.0039269915457477 + 0.0000000000000000 -0.0000000000000000 0.0105442016221601 0.0081401435439592 -0.0012492901504643 -0.0973951417584335 + 2 4 + -0.0578093105519457 -0.0017657838956696 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.1094942324707786 -0.0013604691141122 -0.0151997796193496 0.0008613223148616 + 0.0000000000000000 0.0000000000000000 0.0078312176982534 0.0150365851893201 -0.0444591393640965 0.0018963418789673 + 3 1 + -0.0578093105519456 -0.0017657838956696 -0.0000000000000000 -0.0000000000000000 0.0000000000000002 -0.0000000000000001 + -0.0000000000000000 0.0000000000000000 -0.1094942324707785 -0.0013604691141123 -0.0078312176982534 -0.0150365851893200 + 0.0000000000000000 0.0000000000000000 0.0151997796193497 -0.0008613223148615 -0.0444591393640964 0.0018963418789674 + 3 2 + 0.0062499341266516 0.0978481708230901 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0230571271669132 0.1447307181705747 0.0105442016221601 -0.0081401435439592 + 0.0000000000000000 0.0000000000000000 -0.0005307438462691 -0.0039269915457477 -0.0012492901504643 0.0973951417584335 + 3 3 + 0.2752531489399451 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.4252812254695738 -0.0000000000000000 -0.0054831286147130 -0.0160607090071419 + -0.0000000000000000 -0.0000000000000000 -0.0054831286147130 0.0160607090071419 0.3493025963892998 0.0000000000000000 + 3 4 + 0.0048217325921132 0.0134933961866357 0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.0040751472247473 -0.0238412697331887 0.0237661530822419 0.0145694106113002 + 0.0000000000000000 -0.0000000000000000 -0.0237661530822419 -0.0145694106113001 -0.0108143778441653 0.0872452707501971 + 4 1 + 0.0062499341266516 -0.0978481708230900 -0.0000000000000000 0.0000000000000001 -0.0000000000000001 -0.0000000000000001 + 0.0000000000000000 -0.0000000000000000 -0.0230571271669135 -0.1447307181705746 -0.0105442016221603 -0.0081401435439592 + 0.0000000000000000 0.0000000000000000 0.0005307438462693 -0.0039269915457477 -0.0012492901504643 -0.0973951417584334 + 4 2 + -0.0578093105519457 0.0017657838956696 -0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 -0.1094942324707786 0.0013604691141122 0.0078312176982534 -0.0150365851893201 + -0.0000000000000000 0.0000000000000000 -0.0151997796193496 -0.0008613223148616 -0.0444591393640965 -0.0018963418789673 + 4 3 + 0.0048217325921132 -0.0134933961866357 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.0040751472247474 0.0238412697331887 -0.0237661530822419 0.0145694106113001 + 0.0000000000000000 -0.0000000000000000 0.0237661530822419 -0.0145694106113001 -0.0108143778441652 -0.0872452707501971 + 4 4 + 0.2752531489399452 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 0.0000000000000000 0.4252812254695736 -0.0000000000000000 0.0054831286147132 -0.0160607090071421 + 0.0000000000000000 0.0000000000000000 0.0054831286147132 0.0160607090071421 0.3493025963892999 0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.108225108225 -0.062483795452 0.000000000000 ) + + 1 1 + 0.3953851121452506 0.0000000000000000 0.0924314139568958 -0.0000000000000000 -0.0298406331914964 0.0168556555738939 + 0.0924314139568958 0.0000000000000000 0.2886545096236614 -0.0000000000000000 -0.0172284976295142 0.0097316172962942 + -0.0298406331914964 -0.0168556555738939 -0.0172284976295142 -0.0097316172962942 0.3458171338040105 0.0000000000000000 + 1 2 + 0.0178458752628795 0.0258911936826404 0.0088605020429231 0.0124094616128502 0.0183848153504153 -0.0070356730332983 + 0.0088605020429229 0.0124094616128500 0.0076146488185040 0.0115619817286217 0.0106144781061128 -0.0040620477252727 + -0.0183848153504151 0.0070356730332984 -0.0106144781061127 0.0040620477252728 -0.0783401628844315 -0.0480614403983630 + 1 3 + -0.0965730017659495 0.0014617978067044 -0.0223802275878646 -0.0001755064505345 -0.0131633952642390 -0.0007459270044941 + -0.0223802275878647 -0.0001755064505345 -0.0707305411505104 0.0016644552039107 -0.0075998898096749 -0.0004306611574308 + 0.0067820334599578 -0.0130220647422711 0.0039156088491264 -0.0075182925946601 -0.0444591393640965 -0.0018963418789672 + 1 4 + -0.1073249235689484 -0.0801279396989314 -0.0112357890059528 -0.0211405178085244 0.0031750624059442 0.0013023795180820 + -0.0112357890059528 -0.0211405178085244 -0.0943509522310902 -0.0557169725900108 0.0018331231372784 0.0007519291663823 + 0.0015393337558602 0.0114329368404193 0.0008887347595366 0.0066008091714916 -0.0837220189916975 -0.0497794927653874 + 2 1 + 0.0178458752628795 -0.0258911936826404 0.0088605020429229 -0.0124094616128500 -0.0183848153504151 -0.0070356730332984 + 0.0088605020429231 -0.0124094616128502 0.0076146488185040 -0.0115619817286217 -0.0106144781061127 -0.0040620477252728 + 0.0183848153504153 0.0070356730332983 0.0106144781061128 0.0040620477252727 -0.0783401628844315 0.0480614403983630 + 2 2 + 0.3953851121452508 -0.0000000000000000 0.0924314139568960 -0.0000000000000000 0.0298406331914963 0.0168556555738939 + 0.0924314139568960 0.0000000000000000 0.2886545096236610 0.0000000000000000 0.0172284976295140 0.0097316172962941 + 0.0298406331914963 -0.0168556555738939 0.0172284976295140 -0.0097316172962941 0.3458171338040104 0.0000000000000000 + 2 3 + -0.1073249235689487 0.0801279396989315 -0.0112357890059530 0.0211405178085245 -0.0031750624059442 0.0013023795180822 + -0.0112357890059529 0.0211405178085245 -0.0943509522310905 0.0557169725900108 -0.0018331231372783 0.0007519291663825 + -0.0015393337558601 0.0114329368404193 -0.0008887347595368 0.0066008091714916 -0.0837220189916975 0.0497794927653874 + 2 4 + -0.0965730017659494 -0.0014617978067045 -0.0223802275878647 0.0001755064505345 0.0131633952642392 -0.0007459270044942 + -0.0223802275878646 0.0001755064505344 -0.0707305411505105 -0.0016644552039107 0.0075998898096749 -0.0004306611574307 + -0.0067820334599576 -0.0130220647422711 -0.0039156088491266 -0.0075182925946601 -0.0444591393640962 0.0018963418789672 + 3 1 + -0.0965730017659495 -0.0014617978067044 -0.0223802275878647 0.0001755064505345 0.0067820334599578 0.0130220647422711 + -0.0223802275878646 0.0001755064505345 -0.0707305411505104 -0.0016644552039107 0.0039156088491264 0.0075182925946601 + -0.0131633952642390 0.0007459270044941 -0.0075998898096749 0.0004306611574308 -0.0444591393640965 0.0018963418789672 + 3 2 + -0.1073249235689487 -0.0801279396989315 -0.0112357890059529 -0.0211405178085245 -0.0015393337558601 -0.0114329368404193 + -0.0112357890059530 -0.0211405178085245 -0.0943509522310905 -0.0557169725900109 -0.0008887347595368 -0.0066008091714916 + -0.0031750624059442 -0.0013023795180822 -0.0018331231372783 -0.0007519291663825 -0.0837220189916975 -0.0497794927653874 + 3 3 + 0.3877742054627851 -0.0000000000000000 0.0649640623620073 -0.0000000000000000 0.0047485286660504 0.0139089819839099 + 0.0649640623620073 0.0000000000000000 0.3127601686382748 -0.0000000000000000 0.0027415643073566 0.0080303545035709 + 0.0047485286660504 -0.0139089819839099 0.0027415643073566 -0.0080303545035709 0.3493025963892999 0.0000000000000000 + 3 4 + 0.0134894162246298 0.0056508523586645 0.0159267304221529 0.0047468632754977 0.0212181047602424 -0.0115158737055673 + 0.0159267304221527 0.0047468632754977 -0.0049011879566794 0.0001696467868128 0.0122502785118107 -0.0066486927929763 + -0.0212181047602425 0.0115158737055673 -0.0122502785118109 0.0066486927929761 -0.0701494288195836 -0.0529881654024535 + 4 1 + -0.1073249235689484 0.0801279396989314 -0.0112357890059528 0.0211405178085243 0.0015393337558602 -0.0114329368404193 + -0.0112357890059528 0.0211405178085244 -0.0943509522310902 0.0557169725900108 0.0008887347595366 -0.0066008091714916 + 0.0031750624059442 -0.0013023795180820 0.0018331231372784 -0.0007519291663823 -0.0837220189916975 0.0497794927653874 + 4 2 + -0.0965730017659494 0.0014617978067045 -0.0223802275878646 -0.0001755064505344 -0.0067820334599576 0.0130220647422711 + -0.0223802275878647 -0.0001755064505345 -0.0707305411505105 0.0016644552039107 -0.0039156088491266 0.0075182925946601 + 0.0131633952642392 0.0007459270044942 0.0075998898096749 0.0004306611574307 -0.0444591393640962 -0.0018963418789672 + 4 3 + 0.0134894162246298 -0.0056508523586645 0.0159267304221527 -0.0047468632754977 -0.0212181047602425 -0.0115158737055673 + 0.0159267304221529 -0.0047468632754977 -0.0049011879566793 -0.0001696467868127 -0.0122502785118109 -0.0066486927929761 + 0.0212181047602424 0.0115158737055673 0.0122502785118107 0.0066486927929763 -0.0701494288195836 0.0529881654024535 + 4 4 + 0.3877742054627853 0.0000000000000000 0.0649640623620072 0.0000000000000000 -0.0047485286660502 0.0139089819839100 + 0.0649640623620072 -0.0000000000000000 0.3127601686382748 -0.0000000000000000 -0.0027415643073565 0.0080303545035711 + -0.0047485286660502 -0.0139089819839100 -0.0027415643073565 -0.0080303545035711 0.3493025963892999 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.108225108225 -0.062483795452 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 7.21209382 [THz] = 240.56952047 [cm-1] +( 0.283395 0.000000 0.490855 0.000000 -0.000000 0.000000 ) +( 0.262985 -0.105603 0.455503 -0.182909 0.000000 0.000000 ) +( 0.211214 0.008700 0.365834 0.015068 -0.000000 0.000000 ) +( 0.192760 -0.086779 0.333871 -0.150305 0.000000 0.000000 ) + freq ( 2) = 7.91965761 [THz] = 264.17130470 [cm-1] +( -0.059119 0.000000 0.034133 0.000000 0.564379 -0.069136 ) +( 0.040223 -0.043327 -0.023223 0.025015 0.434657 -0.366574 ) +( 0.025072 -0.007592 -0.014475 0.004383 0.409927 -0.055508 ) +( -0.022622 0.013208 0.013061 -0.007626 0.319584 -0.262655 ) + freq ( 3) = 9.70716478 [THz] = 323.79611748 [cm-1] +( -0.346063 0.000000 -0.599399 0.000000 -0.000000 0.000000 ) +( 0.319176 -0.133739 0.552830 -0.231642 -0.000000 0.000000 ) +( 0.071621 0.010523 0.124052 0.018227 -0.000000 -0.000000 ) +( -0.061990 0.037384 -0.107370 0.064751 -0.000000 0.000000 ) + freq ( 4) = 10.83449689 [THz] = 361.39986366 [cm-1] +( 0.479755 0.000000 -0.276987 0.000000 -0.120773 -0.036635 ) +( 0.449825 -0.166800 -0.259706 0.096302 0.100502 -0.076339 ) +( 0.356933 0.070812 -0.206075 -0.040884 -0.020579 0.014437 ) +( 0.310045 -0.190492 -0.179005 0.109981 0.024314 0.006382 ) + freq ( 5) = 12.71878984 [THz] = 424.25310188 [cm-1] +( -0.477580 0.000000 0.275731 -0.000000 -0.128217 0.382384 ) +( 0.468555 -0.092407 -0.270520 0.053351 -0.199782 -0.350349 ) +( 0.012936 0.130636 -0.007468 -0.075422 -0.016146 -0.099970 ) +( 0.012585 0.130670 -0.007266 -0.075442 0.003502 0.101205 ) + freq ( 6) = 13.83954049 [THz] = 461.63731420 [cm-1] +( 0.360798 0.000000 -0.208307 0.000000 0.117686 0.530597 ) +( -0.251225 0.258962 0.145045 -0.149512 -0.298890 -0.453925 ) +( -0.100709 0.069142 0.058144 -0.039919 -0.029349 -0.101443 ) +( 0.119750 -0.024140 -0.069138 0.013937 0.052375 0.091700 ) + freq ( 7) = 16.98331966 [THz] = 566.50248445 [cm-1] +( -0.037628 0.000000 -0.065174 0.000000 0.000000 0.000000 ) +( 0.026920 0.026291 0.046627 0.045537 0.000000 0.000000 ) +( -0.244129 -0.252953 -0.422844 -0.438127 -0.000000 -0.000000 ) +( 0.351392 -0.010397 0.608628 -0.018009 -0.000000 -0.000000 ) + freq ( 8) = 17.30495688 [THz] = 577.23114599 [cm-1] +( -0.030513 0.000000 0.017617 -0.000000 0.134889 -0.157448 ) +( -0.015433 -0.026323 0.008910 0.015197 0.067602 -0.195997 ) +( -0.066184 0.071378 0.038211 -0.041210 -0.477634 0.463687 ) +( 0.028101 -0.093196 -0.016224 0.053807 -0.158433 0.646560 ) + freq ( 9) = 17.56546392 [THz] = 585.92072411 [cm-1] +( -0.105011 0.000000 -0.181885 0.000000 -0.000000 0.000000 ) +( -0.099279 0.034220 -0.171956 0.059271 0.000000 0.000000 ) +( 0.323377 0.096952 0.560106 0.167925 0.000000 -0.000000 ) +( 0.274132 -0.197039 0.474810 -0.341282 -0.000000 -0.000000 ) + freq ( 10) = 19.34609198 [THz] = 645.31607423 [cm-1] +( 0.036264 0.000000 -0.020937 0.000000 0.018524 -0.011837 ) +( -0.030289 0.019941 0.017488 -0.011513 0.021982 -0.000299 ) +( 0.497475 0.000504 -0.287217 -0.000291 -0.090705 -0.399450 ) +( -0.415232 0.273978 0.239734 -0.158181 0.143894 0.383513 ) + freq ( 11) = 21.60078303 [THz] = 720.52446156 [cm-1] +( -0.025617 0.000000 0.014790 -0.000000 -0.049131 -0.041251 ) +( -0.007319 -0.024549 0.004226 0.014173 0.053569 0.035297 ) +( -0.290756 0.178346 0.167868 -0.102968 -0.300503 -0.499579 ) +( 0.087841 -0.329591 -0.050715 0.190289 0.564611 0.145242 ) + freq ( 12) = 23.01627490 [THz] = 767.74018129 [cm-1] +( 0.195263 0.000000 -0.112735 0.000000 0.026646 -0.007927 ) +( 0.149538 -0.125563 -0.086336 0.072494 -0.025503 0.011064 ) +( -0.578831 0.027093 0.334188 -0.015642 0.012307 0.023094 ) +( -0.460707 0.351466 0.265989 -0.202919 0.005426 0.025600 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_3 b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_3 new file mode 100644 index 000000000..5aad4f6da --- /dev/null +++ b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/dyn_gen_pop1_3 @@ -0,0 +1,218 @@ +Dynamical matrix file +File generated with the CellConstructor by Lorenzo Monacelli +2 4 0 1.8897259890000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 +Basis vectors + 3.0800000000000001 0.0000000000000000 0.0000000000000000 + -1.5400000000000000 2.6673582400000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 5.0499999999999998 + 1 'Si ' 25597.9124185021937592 + 2 'C ' 10947.3571678344233078 + 1 1 -0.0000000000000000 0.0000000000000002 0.0000000000000000 + 2 1 -0.0000000000000001 1.7782388266666669 2.5249999999999999 + 3 2 -0.0000000000000000 0.0000000000000002 1.8937500000000027 + 4 2 -0.0000000000000001 1.7782388266666669 4.4187500000000020 + + Dynamical Matrix in cartesian axes + + q = ( 0.216450216450 0.000000000000 0.000000000000 ) + + 1 1 + 0.3629049593445280 0.0000000000000000 0.0000000000000000 0.0401736847790275 -0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.0401736847790275 0.3629049603393745 0.0000000000000000 -0.0000000000000001 -0.0000000000000002 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000001 0.0000000000000001 0.3248961958652314 0.0000000000000000 + 1 2 + -0.0022686428252526 0.0000000000000000 0.0000000000000000 -0.0022686428283621 0.0000000000000000 0.0182716442814441 + 0.0000000000000001 -0.0022686428283623 0.0022686428314718 -0.0000000000000001 0.0182716443064883 -0.0000000000000000 + -0.0000000000000001 -0.0182716442814441 -0.0182716443064884 0.0000000000000001 -0.0000000000000000 -0.0000000000000001 + 1 3 + -0.0859000011505260 -0.0000000000000000 -0.0000000000000000 -0.0175104027917954 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000001 0.0175104027917954 -0.0859000013860073 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000001 0.0000000000000000 -0.0000000000000000 -0.0000000000000002 -0.0454872736039265 0.0000000000000001 + 1 4 + 0.0025335096411226 0.0000000000000000 0.0000000000000000 0.0025335096445953 -0.0000000000000000 -0.0064224813714593 + -0.0000000000000000 0.0025335096445956 -0.0025335096480681 0.0000000000000000 -0.0064224813802625 0.0000000000000000 + 0.0000000000000000 0.0006748924167946 0.0006748924177197 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 2 1 + -0.0022686428252526 -0.0000000000000000 0.0000000000000001 0.0022686428283623 -0.0000000000000001 0.0182716442814441 + 0.0000000000000000 0.0022686428283621 0.0022686428314718 0.0000000000000001 -0.0182716443064884 -0.0000000000000001 + 0.0000000000000000 -0.0182716442814441 0.0182716443064883 0.0000000000000000 -0.0000000000000000 0.0000000000000001 + 2 2 + 0.3629049593445282 0.0000000000000000 -0.0000000000000003 -0.0401736847790278 -0.0000000000000000 -0.0000000000000001 + -0.0000000000000003 0.0401736847790277 0.3629049603393747 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000001 -0.0000000000000000 -0.0000000000000000 0.3248961958652311 0.0000000000000000 + 2 3 + 0.0025335096411227 -0.0000000000000000 -0.0000000000000000 -0.0025335096445953 0.0000000000000000 -0.0064224813714593 + -0.0000000000000000 -0.0025335096445953 -0.0025335096480679 -0.0000000000000000 0.0064224813802624 0.0000000000000000 + -0.0000000000000000 0.0006748924167947 -0.0006748924177195 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 2 4 + -0.0859000011505259 -0.0000000000000000 -0.0000000000000000 0.0175104027917954 -0.0000000000000000 -0.0000000000000001 + 0.0000000000000001 -0.0175104027917955 -0.0859000013860073 0.0000000000000001 -0.0000000000000001 -0.0000000000000002 + 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0454872736039263 -0.0000000000000000 + 3 1 + -0.0859000011505260 0.0000000000000000 -0.0000000000000001 -0.0175104027917955 0.0000000000000001 -0.0000000000000000 + -0.0000000000000000 0.0175104027917954 -0.0859000013860073 -0.0000000000000000 -0.0000000000000000 0.0000000000000002 + -0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0000000000000000 -0.0454872736039265 -0.0000000000000001 + 3 2 + 0.0025335096411227 0.0000000000000000 -0.0000000000000000 0.0025335096445953 -0.0000000000000000 -0.0006748924167947 + -0.0000000000000000 0.0025335096445953 -0.0025335096480679 0.0000000000000000 -0.0006748924177195 0.0000000000000000 + 0.0000000000000000 0.0064224813714593 0.0064224813802624 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 3 3 + 0.3839145560528554 0.0000000000000000 0.0000000000000000 -0.0395707525473309 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0395707525473309 0.3839145571052963 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 0.3333213403895823 -0.0000000000000000 + 3 4 + 0.0124739815484718 -0.0000000000000000 -0.0000000000000000 0.0124739815655695 -0.0000000000000000 0.0299698091760760 + 0.0000000000000000 0.0124739815655695 -0.0124739815826671 -0.0000000000000000 0.0299698092171545 0.0000000000000000 + 0.0000000000000000 -0.0299698091760759 -0.0299698092171546 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 4 1 + 0.0025335096411226 0.0000000000000000 -0.0000000000000000 -0.0025335096445956 0.0000000000000000 -0.0006748924167946 + 0.0000000000000000 -0.0025335096445953 -0.0025335096480681 -0.0000000000000000 0.0006748924177197 0.0000000000000000 + -0.0000000000000000 0.0064224813714593 -0.0064224813802625 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 4 2 + -0.0859000011505259 0.0000000000000000 0.0000000000000001 0.0175104027917955 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0175104027917954 -0.0859000013860073 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0000000000000001 -0.0000000000000001 0.0000000000000002 -0.0454872736039263 0.0000000000000000 + 4 3 + 0.0124739815484718 0.0000000000000000 0.0000000000000000 -0.0124739815655695 0.0000000000000000 0.0299698091760759 + -0.0000000000000000 -0.0124739815655695 -0.0124739815826671 0.0000000000000000 -0.0299698092171546 0.0000000000000000 + -0.0000000000000000 -0.0299698091760759 0.0299698092171545 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 4 4 + 0.3839145560528550 -0.0000000000000000 0.0000000000000000 0.0395707525473307 0.0000000000000000 0.0000000000000002 + 0.0000000000000000 -0.0395707525473307 0.3839145571052964 -0.0000000000000000 0.0000000000000001 -0.0000000000000000 + 0.0000000000000000 -0.0000000000000002 0.0000000000000001 0.0000000000000000 0.3333213403895823 -0.0000000000000000 + + Dynamical Matrix in cartesian axes + + q = ( -0.216450216450 0.000000000000 0.000000000000 ) + + 1 1 + 0.3629049593445280 0.0000000000000000 0.0000000000000000 -0.0401736847790275 -0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 0.0401736847790275 0.3629049603393745 -0.0000000000000000 -0.0000000000000001 0.0000000000000002 + -0.0000000000000000 0.0000000000000000 -0.0000000000000001 -0.0000000000000001 0.3248961958652314 -0.0000000000000000 + 1 2 + -0.0022686428252526 -0.0000000000000000 0.0000000000000000 0.0022686428283621 0.0000000000000000 -0.0182716442814441 + 0.0000000000000001 0.0022686428283623 0.0022686428314718 0.0000000000000001 0.0182716443064883 0.0000000000000000 + -0.0000000000000001 0.0182716442814441 -0.0182716443064884 -0.0000000000000001 -0.0000000000000000 0.0000000000000001 + 1 3 + -0.0859000011505260 0.0000000000000000 -0.0000000000000000 0.0175104027917954 -0.0000000000000000 0.0000000000000000 + -0.0000000000000001 -0.0175104027917954 -0.0859000013860073 -0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 0.0000000000000001 -0.0000000000000000 -0.0000000000000000 0.0000000000000002 -0.0454872736039265 -0.0000000000000001 + 1 4 + 0.0025335096411226 -0.0000000000000000 0.0000000000000000 -0.0025335096445953 -0.0000000000000000 0.0064224813714593 + -0.0000000000000000 -0.0025335096445956 -0.0025335096480681 -0.0000000000000000 -0.0064224813802625 -0.0000000000000000 + 0.0000000000000000 -0.0006748924167946 0.0006748924177197 -0.0000000000000000 0.0000000000000000 0.0000000000000000 + 2 1 + -0.0022686428252526 0.0000000000000000 0.0000000000000001 -0.0022686428283623 -0.0000000000000001 -0.0182716442814441 + 0.0000000000000000 -0.0022686428283621 0.0022686428314718 -0.0000000000000001 -0.0182716443064884 0.0000000000000001 + 0.0000000000000000 0.0182716442814441 0.0182716443064883 -0.0000000000000000 -0.0000000000000000 -0.0000000000000001 + 2 2 + 0.3629049593445282 -0.0000000000000000 -0.0000000000000003 0.0401736847790278 -0.0000000000000000 0.0000000000000001 + -0.0000000000000003 -0.0401736847790277 0.3629049603393747 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000001 -0.0000000000000000 0.0000000000000000 0.3248961958652311 -0.0000000000000000 + 2 3 + 0.0025335096411227 0.0000000000000000 -0.0000000000000000 0.0025335096445953 0.0000000000000000 0.0064224813714593 + -0.0000000000000000 0.0025335096445953 -0.0025335096480679 0.0000000000000000 0.0064224813802624 -0.0000000000000000 + -0.0000000000000000 -0.0006748924167947 -0.0006748924177195 0.0000000000000000 -0.0000000000000000 0.0000000000000000 + 2 4 + -0.0859000011505259 0.0000000000000000 -0.0000000000000000 -0.0175104027917954 -0.0000000000000000 0.0000000000000001 + 0.0000000000000001 0.0175104027917955 -0.0859000013860073 -0.0000000000000001 -0.0000000000000001 0.0000000000000002 + 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 0.0000000000000000 -0.0454872736039263 0.0000000000000000 + 3 1 + -0.0859000011505260 -0.0000000000000000 -0.0000000000000001 0.0175104027917955 0.0000000000000001 0.0000000000000000 + -0.0000000000000000 -0.0175104027917954 -0.0859000013860073 0.0000000000000000 -0.0000000000000000 -0.0000000000000002 + -0.0000000000000000 -0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.0454872736039265 0.0000000000000001 + 3 2 + 0.0025335096411227 -0.0000000000000000 -0.0000000000000000 -0.0025335096445953 -0.0000000000000000 0.0006748924167947 + -0.0000000000000000 -0.0025335096445953 -0.0025335096480679 -0.0000000000000000 -0.0006748924177195 -0.0000000000000000 + 0.0000000000000000 -0.0064224813714593 0.0064224813802624 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 3 3 + 0.3839145560528554 -0.0000000000000000 0.0000000000000000 0.0395707525473309 0.0000000000000000 -0.0000000000000000 + 0.0000000000000000 -0.0395707525473309 0.3839145571052963 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.3333213403895823 0.0000000000000000 + 3 4 + 0.0124739815484718 0.0000000000000000 -0.0000000000000000 -0.0124739815655695 -0.0000000000000000 -0.0299698091760760 + 0.0000000000000000 -0.0124739815655695 -0.0124739815826671 0.0000000000000000 0.0299698092171545 -0.0000000000000000 + 0.0000000000000000 0.0299698091760759 -0.0299698092171546 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 4 1 + 0.0025335096411226 -0.0000000000000000 -0.0000000000000000 0.0025335096445956 0.0000000000000000 0.0006748924167946 + 0.0000000000000000 0.0025335096445953 -0.0025335096480681 0.0000000000000000 0.0006748924177197 -0.0000000000000000 + -0.0000000000000000 -0.0064224813714593 -0.0064224813802625 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 4 2 + -0.0859000011505259 -0.0000000000000000 0.0000000000000001 -0.0175104027917955 0.0000000000000000 0.0000000000000000 + -0.0000000000000000 0.0175104027917954 -0.0859000013860073 0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000001 -0.0000000000000001 -0.0000000000000002 -0.0454872736039263 -0.0000000000000000 + 4 3 + 0.0124739815484718 -0.0000000000000000 0.0000000000000000 0.0124739815655695 0.0000000000000000 -0.0299698091760759 + -0.0000000000000000 0.0124739815655695 -0.0124739815826671 -0.0000000000000000 -0.0299698092171546 -0.0000000000000000 + -0.0000000000000000 0.0299698091760759 0.0299698092171545 0.0000000000000000 0.0000000000000000 -0.0000000000000000 + 4 4 + 0.3839145560528550 0.0000000000000000 0.0000000000000000 -0.0395707525473307 0.0000000000000000 -0.0000000000000002 + 0.0000000000000000 0.0395707525473307 0.3839145571052964 0.0000000000000000 0.0000000000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000002 0.0000000000000001 -0.0000000000000000 0.3333213403895823 0.0000000000000000 + + Diagonalizing the dynamical matrix + + q = ( 0.216450216450 0.000000000000 0.000000000000 ) + +*************************************************************************** + freq ( 1) = 11.25813985 [THz] = 375.53106949 [cm-1] +( -0.252314 0.000000 0.000000 0.252314 0.464152 0.147083 ) +( 0.054664 -0.172503 0.172503 0.054664 -0.000000 -0.678898 ) +( -0.143078 0.000000 0.000000 0.143078 0.120712 0.038252 ) +( 0.030998 -0.097820 0.097820 0.030998 -0.000000 -0.176561 ) + freq ( 2) = 11.25813985 [THz] = 375.53106949 [cm-1] +( -0.180957 0.000000 -0.000000 0.180957 -0.647182 -0.205083 ) +( -0.076219 0.240526 -0.240526 -0.076219 0.000000 -0.486899 ) +( -0.102614 -0.000000 -0.000000 0.102614 -0.168313 -0.053336 ) +( -0.043221 0.136393 -0.136393 -0.043221 0.000000 -0.126628 ) + freq ( 3) = 11.36663058 [THz] = 379.14993033 [cm-1] +( 0.490358 0.000000 -0.000000 0.490358 -0.000000 -0.000000 ) +( 0.490358 -0.000000 -0.000000 -0.490358 0.000000 -0.000000 ) +( 0.097721 0.000000 -0.000000 0.097721 -0.000000 -0.000000 ) +( 0.097721 0.000000 -0.000000 -0.097721 0.000000 -0.000000 ) + freq ( 4) = 11.39450448 [THz] = 380.07970318 [cm-1] +( -0.482115 0.000000 0.000000 -0.482115 -0.000000 -0.000000 ) +( 0.482115 -0.000000 -0.000000 -0.482115 -0.000000 0.000000 ) +( -0.132534 0.000000 0.000000 -0.132534 -0.000000 -0.000000 ) +( 0.132534 -0.000000 -0.000000 -0.132534 -0.000000 0.000000 ) + freq ( 5) = 12.37937992 [THz] = 412.93160723 [cm-1] +( 0.548919 0.000000 -0.000000 -0.548919 0.057713 -0.013201 ) +( 0.015949 0.069723 -0.069723 0.015949 -0.000000 -0.454360 ) +( 0.292378 0.000000 -0.000000 -0.292378 0.007261 -0.001661 ) +( 0.008495 0.037138 -0.037138 0.008495 -0.000000 -0.057166 ) + freq ( 6) = 12.37937992 [THz] = 412.93160723 [cm-1] +( 0.071524 0.000000 0.000000 -0.071524 -0.442920 0.101314 ) +( -0.122399 -0.535099 0.535099 -0.122399 0.000000 -0.059203 ) +( 0.038097 -0.000000 0.000000 -0.038097 -0.055727 0.012747 ) +( -0.065195 -0.285017 0.285017 -0.065195 0.000000 -0.007449 ) + freq ( 7) = 17.45596855 [THz] = 582.26835215 [cm-1] +( 0.007320 0.000000 0.000000 -0.007320 -0.037461 0.074377 ) +( 0.092655 0.046667 -0.046667 0.092655 -0.000000 0.005876 ) +( -0.027112 0.000000 -0.000000 0.027112 0.368565 -0.731768 ) +( -0.343158 -0.172836 0.172836 -0.343158 0.000000 -0.057814 ) + freq ( 8) = 17.45596855 [THz] = 582.26835215 [cm-1] +( 0.103744 0.000000 -0.000000 -0.103744 0.002643 -0.005248 ) +( -0.006538 -0.003293 0.003293 -0.006538 0.000000 0.083278 ) +( -0.384226 -0.000000 0.000000 0.384226 -0.026007 0.051635 ) +( 0.024214 0.012196 -0.012196 0.024214 -0.000000 -0.819344 ) + freq ( 9) = 19.82578121 [THz] = 661.31678239 [cm-1] +( -0.118743 0.000000 0.000000 0.118743 0.003427 -0.000537 ) +( 0.001221 0.007790 -0.007790 0.001221 0.000000 0.052230 ) +( 0.559237 0.000000 -0.000000 -0.559237 -0.038209 0.005989 ) +( -0.005751 -0.036690 0.036690 -0.005751 -0.000000 -0.582400 ) + freq ( 10) = 19.82578121 [THz] = 661.31678239 [cm-1] +( 0.007886 0.000000 0.000000 -0.007886 0.051600 -0.008088 ) +( 0.018388 0.117311 -0.117311 0.018388 0.000000 -0.003469 ) +( -0.037138 0.000000 -0.000000 0.037138 -0.575375 0.090187 ) +( -0.086600 -0.552491 0.552491 -0.086600 -0.000000 0.038676 ) + freq ( 11) = 20.06366581 [THz] = 669.25175759 [cm-1] +( -0.058381 0.000000 -0.000000 -0.058381 -0.000000 0.000000 ) +( 0.058381 -0.000000 0.000000 -0.058381 -0.000000 -0.000000 ) +( 0.496580 -0.000000 0.000000 0.496580 0.000000 -0.000000 ) +( -0.496580 0.000000 -0.000000 0.496580 0.000000 0.000000 ) + freq ( 12) = 21.18201501 [THz] = 706.55586610 [cm-1] +( -0.042460 0.000000 -0.000000 -0.042460 0.000000 -0.000000 ) +( -0.042460 0.000000 -0.000000 0.042460 0.000000 -0.000000 ) +( 0.498194 -0.000000 0.000000 0.498194 -0.000000 0.000000 ) +( 0.498194 -0.000000 -0.000000 -0.498194 0.000000 0.000000 ) +*************************************************************************** diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/energies_pop1.npy b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/energies_pop1.npy new file mode 100644 index 0000000000000000000000000000000000000000..e9423f282f021a0bcf028b2c086781d2124d41d4 GIT binary patch literal 928 zcmbV~{WBAA9LK2~c_?*P9bGe$ty+$J)f#uXNphiwB`F;6&Zi^F6|;^oP5;i-std9>JA-z}6SiBV6I3KPV5v)$d?I2$?44Ca4-ER}9N zy`YrP+uW_pPHgjV>m9otYJj=x@`eMD?Ivp>Gp?1```U4bG?teUx}dd;B7yJ=AqVf*cGs5pSi? zI~K_i1Ys_wexJGo`<+bp{hH4~9#;Ln2Jis0V}1mApc%s(?}GS5~KKD#31R z#ZCv@`8&3#qZTZD-Q-}6-^H-G?5qy_Zd2FN0zLbfu&(FmpS9d0ZNVN5Tk2wpz2>S{ zE&b4OwB*tkn7`E&p52Q(j-I*Ue-D0>xAI9T`qFYHeU5+*r-B*Xn3pBweu@R7T@SHM zv3C`p7aj-ygR7qezCpfyzPTkTP}VHUcEW aTteqoCJWVIUcmg)G5nvr@7IlcL+>90SF7Lv literal 0 HcmV?d00001 diff --git a/tests/test_free_energy_hessian_dev/sscha/data_ensemble/forces_pop1.npy b/tests/test_free_energy_hessian_dev/sscha/data_ensemble/forces_pop1.npy new file mode 100644 index 0000000000000000000000000000000000000000..d083f8cbf4a3eb699e5c28df4518d7bdf9ad92b4 GIT binary patch literal 86528 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�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 Date: Wed, 22 Jul 2026 09:52:56 +0200 Subject: [PATCH 7/7] Reduce tolerance of test_free_energy_hessian_dev.py --- .../test_free_energy_hessian_dev.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_free_energy_hessian_dev/test_free_energy_hessian_dev.py b/tests/test_free_energy_hessian_dev/test_free_energy_hessian_dev.py index 5bcbc88da..17ebd37b9 100644 --- a/tests/test_free_energy_hessian_dev/test_free_energy_hessian_dev.py +++ b/tests/test_free_energy_hessian_dev/test_free_energy_hessian_dev.py @@ -25,10 +25,12 @@ def test_free_energy_hessian_dev(): np.testing.assert_allclose( dyn_hessian_dev.dynmats, dyn_hessian.dynmats, - atol=1e-4, + atol=5e-5, err_msg="Hessian matrix from dev implementation does not match reference!" ) + dyn_hessian.save_qe("hessianv4_new_") + if __name__ == "__main__": test_free_energy_hessian_dev()