def produce_fc3(self, forces_fc3, displacement_dataset=None, cutoff_distance=None, # set fc3 zero is_translational_symmetry=False, is_permutation_symmetry=False, is_permutation_symmetry_fc2=False, translational_symmetry_type=None): if displacement_dataset is None: disp_dataset = self._displacement_dataset else: disp_dataset = displacement_dataset for forces, disp1 in zip(forces_fc3, disp_dataset['first_atoms']): disp1['forces'] = forces fc2 = get_fc2(self._supercell, self._symmetry, disp_dataset) if is_permutation_symmetry_fc2: set_permutation_symmetry(fc2) if is_translational_symmetry: tsym_type = 1 else: tsym_type = 0 if translational_symmetry_type: tsym_type = translational_symmetry_type if tsym_type: set_translational_invariance( fc2, translational_symmetry_type=tsym_type) count = len(disp_dataset['first_atoms']) for disp1 in disp_dataset['first_atoms']: for disp2 in disp1['second_atoms']: disp2['delta_forces'] = forces_fc3[count] - disp1['forces'] count += 1 self._fc3 = get_fc3( self._supercell, disp_dataset, fc2, self._symmetry, translational_symmetry_type=tsym_type, is_permutation_symmetry=is_permutation_symmetry, verbose=self._log_level) # Set fc3 elements zero beyond cutoff_distance if cutoff_distance: if self._log_level: print("Cutting-off fc3 by zero (cut-off distance: %f)" % cutoff_distance) self.cutoff_fc3_by_zero(cutoff_distance) # Set fc2 if self._fc2 is None: self._fc2 = fc2
def produce_fc3( self, forces_fc3, displacement_dataset=None, cutoff_distance=None, # set fc3 zero is_translational_symmetry=False, is_permutation_symmetry=False, is_permutation_symmetry_fc2=False, translational_symmetry_type=None, ): if displacement_dataset is None: disp_dataset = self._displacement_dataset else: disp_dataset = displacement_dataset for forces, disp1 in zip(forces_fc3, disp_dataset["first_atoms"]): disp1["forces"] = forces fc2 = get_fc2(self._supercell, self._symmetry, disp_dataset) if is_permutation_symmetry_fc2: set_permutation_symmetry(fc2) if is_translational_symmetry: tsym_type = 1 else: tsym_type = 0 if translational_symmetry_type: tsym_type = translational_symmetry_type if tsym_type: set_translational_invariance(fc2, translational_symmetry_type=tsym_type) count = len(disp_dataset["first_atoms"]) for disp1 in disp_dataset["first_atoms"]: for disp2 in disp1["second_atoms"]: disp2["delta_forces"] = forces_fc3[count] - disp1["forces"] count += 1 self._fc3 = get_fc3( self._supercell, disp_dataset, fc2, self._symmetry, translational_symmetry_type=tsym_type, is_permutation_symmetry=is_permutation_symmetry, verbose=self._log_level, ) # Set fc3 elements zero beyond cutoff_distance if cutoff_distance: if self._log_level: print("Cutting-off fc3 by zero (cut-off distance: %f)" % cutoff_distance) self.cutoff_fc3_by_zero(cutoff_distance) # Set fc2 if self._fc2 is None: self._fc2 = fc2
def produce_fc4( self, forces_fc4, displacement_dataset, translational_symmetry_type=0, is_permutation_symmetry=False, is_permutation_symmetry_fc3=False, is_permutation_symmetry_fc2=False, ): disp_dataset = displacement_dataset file_count = 0 for disp1 in disp_dataset["first_atoms"]: disp1["forces"] = forces_fc4[file_count] file_count += 1 self._fc2 = get_fc2(self._supercell, self._symmetry, disp_dataset) if is_permutation_symmetry_fc2: set_permutation_symmetry(self._fc2) if translational_symmetry_type: set_translational_invariance(self._fc2, translational_symmetry_type=translational_symmetry_type) for disp1 in disp_dataset["first_atoms"]: for disp2 in disp1["second_atoms"]: disp2["forces"] = forces_fc4[file_count] disp2["delta_forces"] = disp2["forces"] - disp1["forces"] file_count += 1 self._fc3 = get_fc3( self._supercell, disp_dataset, self._fc2, self._symmetry, translational_symmetry_type=translational_symmetry_type, is_permutation_symmetry=is_permutation_symmetry_fc3, verbose=self._log_level, ) for disp1 in disp_dataset["first_atoms"]: for disp2 in disp1["second_atoms"]: for disp3 in disp2["third_atoms"]: disp3["delta_forces"] = forces_fc4[file_count] - disp2["forces"] file_count += 1 self._fc4 = get_fc4( self._supercell, disp_dataset, self._fc3, self._symmetry, translational_symmetry_type=translational_symmetry_type, is_permutation_symmetry=is_permutation_symmetry, verbose=self._log_level, )
def produce_fc4(self, forces_fc4, displacement_dataset, translational_symmetry_type=0, is_permutation_symmetry=False, is_permutation_symmetry_fc3=False, is_permutation_symmetry_fc2=False): disp_dataset = displacement_dataset file_count = 0 for disp1 in disp_dataset['first_atoms']: disp1['forces'] = forces_fc4[file_count] file_count += 1 self._fc2 = get_fc2(self._supercell, self._symmetry, disp_dataset) if is_permutation_symmetry_fc2: set_permutation_symmetry(self._fc2) if translational_symmetry_type: set_translational_invariance( self._fc2, translational_symmetry_type=translational_symmetry_type) for disp1 in disp_dataset['first_atoms']: for disp2 in disp1['second_atoms']: disp2['forces'] = forces_fc4[file_count] disp2['delta_forces'] = disp2['forces'] - disp1['forces'] file_count += 1 self._fc3 = get_fc3( self._supercell, disp_dataset, self._fc2, self._symmetry, translational_symmetry_type=translational_symmetry_type, is_permutation_symmetry=is_permutation_symmetry_fc3, verbose=self._log_level) for disp1 in disp_dataset['first_atoms']: for disp2 in disp1['second_atoms']: for disp3 in disp2['third_atoms']: disp3['delta_forces'] = (forces_fc4[file_count] - disp2['forces']) file_count += 1 self._fc4 = get_fc4( self._supercell, disp_dataset, self._fc3, self._symmetry, translational_symmetry_type=translational_symmetry_type, is_permutation_symmetry=is_permutation_symmetry, verbose=self._log_level)