vol_frac_WC_1 = phase_volumes_1[1]/np.float(M**3) vol_frac_Co_1 = 1 - vol_frac_WC_1 mass_frac_WC_1 = ccb.mass_fraction(vol_frac_WC_1) d_eq_1 = ccb.volume_to_eq_d(grain_volumes_1*delta_x**3) sum_gb_voxels_1 = np.sum(gb_voxels_1) contiguity_1 = sum_gb_voxels_1 / np.float(sum_gb_voxels_1 + np.sum(interface_voxels_1)) ccb.write_hdf5('testfile_1.hdf5', 3*[M], 3*[delta_x], trunc_triangles, grain_ids_1, phases_1, good_voxels_1, euler_angles_1, surface_voxels_1, gb_voxels_1, interface_voxels_1, overlaps_0) # Make new copies to play with the bounded monte carlo potts simulation. grain_ids_2 = grain_ids_0.copy() gb_voxels_2 = gb_voxels_0.copy() start_time = time.time() ccb_c.make_mcp_bound(M, grain_ids_2, gb_voxels_2, voxel_indices_0, mc_steps, kBT) print np.str(time.time() - start_time) + " seconds" surface_voxels_2, gb_voxels_2_1, interface_voxels_2 = ccb_c.calc_surface_prop(M, grain_ids_2) phases_2, good_voxels_2, euler_angles_2, phase_volumes_2, grain_volumes_2 = ccb_c.calc_grain_prop(M, grain_ids_2, trunc_triangles) vol_frac_WC_2 = phase_volumes_2[1]/np.float(M**3) vol_frac_Co_2 = 1 - vol_frac_WC_2 mass_frac_WC_2 = ccb.mass_fraction(vol_frac_WC_2) d_eq_2 = ccb.volume_to_eq_d(grain_volumes_2*delta_x**3) sum_gb_voxels_2 = np.sum(gb_voxels_2) contiguity_2 = sum_gb_voxels_2 / np.float(sum_gb_voxels_2 + np.sum(interface_voxels_2)) ccb.write_hdf5('testfile_2.hdf5', 3*[M], 3*[delta_x], trunc_triangles, grain_ids_2, phases_2, good_voxels_2, euler_angles_2, surface_voxels_2, gb_voxels_2, interface_voxels_2, overlaps_0) ccb.write_oofem('testfile_2', 3*[M], 3*[delta_x], trunc_triangles, grain_ids_2)
# Compute actual volume fraction: print("Generated volume fraction of Co (before tweaks):", vol_frac_Co_0) print("Contiguity (before tweaks)", contiguity_0) # Make new copies to play with the monte carlo potts simulation. grain_ids_2 = grain_ids_0.copy() gb_voxels_2 = gb_voxels_0.copy() if mc_steps > 0: start_time = time.time() # Do Potts on coarse grid first for an improved initial guess. M_coarseMC = M//2 grain_ids_coarse, overlaps_coarse, voxel_indices_coarse = ccb_c.populate_voxels(M_coarseMC, L, trunc_triangles, 0, M_coarseMC, 1.0) surface_voxels_coarse, gb_voxels_coarse, interface_voxels_coarse = ccb_c.calc_surface_prop(M_coarseMC, grain_ids_coarse) ccb_c.make_mcp_bound(M_coarseMC, grain_ids_coarse, gb_voxels_coarse, overlaps_coarse, voxel_indices_coarse, np.int(mc_steps*M_coarseMC**4), tau) # # Copy over that solution to the overlap regions of the fine grid as a starting point M2 = M**2 i = np.nonzero(overlaps_0)[0] iz = i // M2 iy = (i - iz*M2) // M ix = i - iz*M2 - iy*M cix = ix * M_coarseMC // M ciy = iy * M_coarseMC // M ciz = iz * M_coarseMC // M ci = cix + ciy*M_coarseMC + ciz*M_coarseMC**2 gid = grain_ids_coarse[ci] # Could use a Cython implementation for efficiency. for ii, g in zip(i, gid): if g != grain_ids_2[ii] and np.searchsorted(voxel_indices_0[g-2], ii) < len(voxel_indices_0[g-2]):