def is_aligned_with(self, mesh): min_size = min(mesh.num, self.num) min_step = min(mesh.phys_step, self.phys_step) max_step = max(mesh.phys_step, self.phys_step) step_ratio = max_step / min_step # print step_ratio, m.rnd(step_ratio), abs(m.floor(step_ratio) - step_ratio) # if abs(m.floor(step_ratio) - step_ratio) < 1e-6:#step_ratio.is_integer(): if check_if_integer(step_ratio, 1e-8): shift = (mesh.to_phys(mesh.local_nodes)[:min_size] - self.to_phys(self.local_nodes)[:min_size]) / min_step if shift[0].is_integer() or abs(round(shift[0]) - shift[0]) < 1e-6: return True else: print 'SHIFT!!! %3.16f' % shift[0] return False else: print abs(m.floor(step_ratio) - step_ratio) return False
def add_mesh(self, mesh): level = m.log(self.get_root_mesh().phys_step / mesh.phys_step, self.refinement_coefficient) # print level, np.floor(level), int(m.floor(level)), abs(m.floor(level) - level), level.is_integer() # if abs(m.floor(level) - level) > 1e-10: if not check_if_integer(level, 1e-10): raise Exception('all child meshes must have step multiple to the root mesh with refinement coefficient') if self.aligned and not self.get_root_mesh().is_aligned_with(mesh): raise Exception('all child meshes must be aligned with the root mesh') # level = int(m.floor(level)) lower_estimation = m.floor(level) upper_estimation = m.ceil(level) if abs(lower_estimation - level) < abs(upper_estimation - level): level = int(lower_estimation) else: level = int(upper_estimation) try: self.Tree[level].append(mesh) except KeyError: self.Tree[level] = [mesh] self.cleanup()