From 4c46212312a81fe702feba7aab8c7972f64635db Mon Sep 17 00:00:00 2001 From: Sanath Date: Wed, 24 Sep 2025 16:45:01 +0200 Subject: [PATCH 1/4] merged main --- MSUtils/lattices/lattice_image.py | 89 +++++++++++++++++++------------ 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/MSUtils/lattices/lattice_image.py b/MSUtils/lattices/lattice_image.py index 59c7850..e744b32 100644 --- a/MSUtils/lattices/lattice_image.py +++ b/MSUtils/lattices/lattice_image.py @@ -15,48 +15,59 @@ def physical_to_voxel(point, dimensions, shape): - return np.round(point / dimensions * (np.array(shape) - 1)).astype(int) + """ + Map a physical coordinate in [0, L] to voxel index in [0, N-1], + consistently with spacing = L/(N-1). + """ + point = np.asarray(point, dtype=np.float64) + shape = np.asarray(shape, dtype=np.int64) + dimensions = np.asarray(dimensions, dtype=np.float64) + + # Map [0, L] -> [0, N-1], then clamp + idx = np.floor(point / dimensions * (shape - 1) + 0.5).astype(np.int64) + idx = np.clip(idx, 0, shape - 1) + return idx def draw_strut(microstructure, start, end, radius, voxel_sizes, strut_type, L): - start = np.array(start) - end = np.array(end) + start = np.asarray(start, dtype=np.float64) + end = np.asarray(end, dtype=np.float64) direction = end - start length = np.linalg.norm(direction) + if length == 0: + return direction /= length - num_points = int(length / np.linalg.norm(voxel_sizes)) - points = np.linspace(0, length, num_points) - points = start + np.outer(points, direction) + # Step roughly one voxel diagonal in PHYSICAL space + step = np.linalg.norm(voxel_sizes) + num_points = max(1, int(np.ceil(length / step))) + ts = np.linspace(0.0, length, num_points, dtype=np.float64) + points = start + np.outer(ts, direction) - voxel_radius = [radius / voxel_sizes[i] for i in range(3)] + # Radius window in index units for bounding box + voxel_radius = np.array( + [radius / voxel_sizes[i] for i in range(3)], dtype=np.float64 + ) - for point in points: - voxel_point = physical_to_voxel(point, L, microstructure.shape) - x, y, z = voxel_point - x_min, x_max = ( - max(0, int(x - voxel_radius[0])), - min(microstructure.shape[0], int(x + voxel_radius[0] + 1)), - ) - y_min, y_max = ( - max(0, int(y - voxel_radius[1])), - min(microstructure.shape[1], int(y + voxel_radius[1] + 1)), - ) - z_min, z_max = ( - max(0, int(z - voxel_radius[2])), - min(microstructure.shape[2], int(z + voxel_radius[2] + 1)), - ) + for p in points: + x, y, z = physical_to_voxel(p, L, microstructure.shape) + + x_min = max(0, int(np.floor(x - voxel_radius[0]))) + x_max = min(microstructure.shape[0], int(np.ceil(x + voxel_radius[0] + 1))) + y_min = max(0, int(np.floor(y - voxel_radius[1]))) + y_max = min(microstructure.shape[1], int(np.ceil(y + voxel_radius[1] + 1))) + z_min = max(0, int(np.floor(z - voxel_radius[2]))) + z_max = min(microstructure.shape[2], int(np.ceil(z + voxel_radius[2] + 1))) if strut_type == "circle": xx, yy, zz = np.ogrid[x_min:x_max, y_min:y_max, z_min:z_max] - distance = ( - ((xx - x) * voxel_sizes[0]) ** 2 - + ((yy - y) * voxel_sizes[1]) ** 2 - + ((zz - z) * voxel_sizes[2]) ** 2 - ) - mask = distance <= radius**2 - - microstructure[x_min:x_max, y_min:y_max, z_min:z_max][mask] = 1 + # Compute PHYSICAL distance (consistent spacing) + dx = (xx - x) * voxel_sizes[0] + dy = (yy - y) * voxel_sizes[1] + dz = (zz - z) * voxel_sizes[2] + distance2 = dx * dx + dy * dy + dz * dz + mask = distance2 <= (radius * radius) + microstructure[x_min:x_max, y_min:y_max, z_min:z_max][mask] = 1 def create_lattice_image( @@ -76,14 +87,22 @@ def create_lattice_image( - microstructure: ndarray - The generated microstructure image. """ if L is None: - L = [1, 1, 1] + L = [1.0, 1.0, 1.0] + L = np.asarray(L, dtype=np.float64) vertices, edges = unit_cell_func() - voxel_sizes = [L[i] / [Nx, Ny, Nz][i] for i in range(3)] + + # CONSISTENT voxel spacing with 0..N-1 indexing + Nvec = np.array([Nx, Ny, Nz], dtype=np.int64) + voxel_sizes = L / (Nvec - 1).astype(np.float64) microstructure = np.zeros((Nx, Ny, Nz), dtype=np.int8) - for edge in edges: - start, end = vertices[edge[0]] * L, vertices[edge[1]] * L + + # scale vertices into physical domain [0, L] + phys_vertices = vertices * L + + for a, b in edges: + start, end = phys_vertices[a], phys_vertices[b] draw_strut(microstructure, start, end, radius, voxel_sizes, strut_type, L) return microstructure @@ -128,7 +147,7 @@ def create_lattice_image( write_xdmf( h5_filepath="data/lattice_microstructures.h5", xdmf_filepath="data/lattice_microstructures.xdmf", - microstructure_length=L, + microstructure_length=L[::-1], time_series=False, verbose=True, ) From 977967c257560e9f63a8acc1db0f8ca3a1dea9c4 Mon Sep 17 00:00:00 2001 From: Sanath Date: Wed, 24 Sep 2025 17:42:58 +0200 Subject: [PATCH 2/4] didnt start yet --- pixi.lock | 320 ++++++++++++++++++++++++------------------------- pyproject.toml | 3 +- 2 files changed, 161 insertions(+), 162 deletions(-) diff --git a/pixi.lock b/pixi.lock index c2b41c5..6733d65 100644 --- a/pixi.lock +++ b/pixi.lock @@ -31,7 +31,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda @@ -65,7 +65,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py311h52bc045_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.1-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.2-h2b0a6b4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -80,7 +80,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py311h0b2f468_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.0-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -109,7 +109,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.24.2-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.24.3-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda @@ -208,7 +208,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h4f16b4b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.15.0-h54a6638_1.conda @@ -223,7 +223,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.1-py311hc53b721_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.2-py311hc53b721_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.6-py311h38be061_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py311h0f3be63_1.conda @@ -249,9 +249,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -328,7 +328,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.4.2-h5250a2e_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.45-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 @@ -390,7 +390,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.4-h950ec3b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311he66fa18_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py311h8ebb5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/charls-2.4.2-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda @@ -424,7 +424,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.7.0-py311h7a2b322_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.1-h07555a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.2-h07555a4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-2.86.0-h7f22f8f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.0-h8650975_0.conda @@ -436,7 +436,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/gstreamer-1.24.11-h7d1b200_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py311h9f650d9_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-11.5.0-hc5d3ef4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-11.5.1-hc5d3ef4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf4-4.2.15-h8138101_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -477,7 +477,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-21.1.0-default_h7f9524c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.1-h3d58e20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.24-hcc1b750_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda @@ -539,7 +539,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libzopfli-1.0.3-h046ec9c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.0-hf4e0ed4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-6.0.1-py311h2bdc24d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-6.0.2-py311h58ed208_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.6-py311h6eed73b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.6-py311h48d7e91_1.conda @@ -561,9 +561,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nss-3.116-h2b2a826_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openh264-2.6.0-h4883158_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h036ada5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openldap-2.6.10-hd8a590d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.3-h230baf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.3-h230baf5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-h6ef8af8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -636,7 +636,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/vtk-9.4.2-h3d6103e_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/vtk-base-9.4.2-py311h3fa69e7_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/vtk-io-ffmpeg-9.4.2-hfb61129_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2 @@ -676,7 +676,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h8e7cc95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py310h55fa279_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/charls-2.4.2-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda @@ -710,7 +710,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.7.0-py310ha18c8e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.1-h7542897_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.2-h7542897_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-2.86.0-h52a91e1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.0-hb9d6e3a_0.conda @@ -722,7 +722,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gstreamer-1.24.11-hfe24232_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py310hedce8ad_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-11.5.0-haf38c7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-11.5.1-haf38c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -762,7 +762,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-21.1.0-default_h6e8f826_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.1-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -824,7 +824,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzopfli-1.0.3-h9f76cd9_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.0-hbb9b287_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.0.1-py310h278f833_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.0.2-py310h0be8703_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.6-py310hb6292c7_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.6-py310h0181960_1.conda @@ -846,9 +846,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.116-h1c710a3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py310hd45542a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.6.0-hb5b2745_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.3-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.3-h5503f6c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -922,7 +922,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.4.2-h6baca55_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-base-9.4.2-py310h4183ee4_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-io-ffmpeg-9.4.2-h555742c_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 @@ -1586,9 +1586,9 @@ packages: - pkg:pypi/certifi?source=compressed-mapping size: 158692 timestamp: 1754231530168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda - sha256: bbd04c8729e6400fa358536b1007c1376cc396d569b71de10f1df7669d44170e - md5: 82e0123a459d095ac99c76d150ccdacf +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda + sha256: 4986d5b3ce60af4e320448a1a2231cb5dd5e3705537e28a7b58951a24bd69893 + md5: 6cb6c4d57d12dfa0ecdd19dbe758ffc9 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.4.6,<3.5.0a0 @@ -1597,14 +1597,13 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=compressed-mapping - size: 303055 - timestamp: 1756808613387 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311he66fa18_1.conda - sha256: f5c6c73e0a389d2c89e10b36883e18cd3abd14756d9d01d53856aaae3131f219 - md5: 70cd671f73c5c08899d5c43366d37787 + size: 304057 + timestamp: 1758716282627 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py311h8ebb5ae_0.conda + sha256: 2f83931e589c53ce9cdd85d96686c3ec431077f567c85e6710e6b05c9099b202 + md5: c79d9a886f7089352482fbb9b7f079a9 depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -1612,14 +1611,13 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - - pkg:pypi/cffi?source=hash-mapping - size: 294021 - timestamp: 1756808523082 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h8e7cc95_1.conda - sha256: 00707b0e001e5664942a85c34748056a0fe5826343c3ca7fcc56906e012e83b8 - md5: ea244ae76c1fc8d7b016647814414bc6 + - pkg:pypi/cffi?source=compressed-mapping + size: 295961 + timestamp: 1758716718225 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py310h55fa279_0.conda + sha256: 168aeed86d4301968686fff10c7b548fef3869e3a3626a5690b26492c3d53dfc + md5: 9b468d51129a8f2b9c7861762af9ff95 depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -1628,11 +1626,10 @@ packages: - python >=3.10,<3.11.0a0 *_cpython - python_abi 3.10.* *_cp310 license: MIT - license_family: MIT purls: - - pkg:pypi/cffi?source=hash-mapping - size: 233253 - timestamp: 1756808698190 + - pkg:pypi/cffi?source=compressed-mapping + size: 235806 + timestamp: 1758716420351 - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda sha256: d5696636733b3c301054b948cdd793f118efacce361d9bd4afb57d5980a9064f md5: 57df494053e17dce2ac3a0b33e1b2a2e @@ -2573,9 +2570,9 @@ packages: - pkg:pypi/frozenlist?source=hash-mapping size: 50891 timestamp: 1752167597255 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.1-h2b0a6b4_0.conda - sha256: b827285fe001806beeddcc30953d2bd07869aeb0efe4581d56432c92c06b0c48 - md5: 2935d9c0526277bd42373cf23d49d51f +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.2-h2b0a6b4_0.conda + sha256: 8b4001081a9ec9946fc385220f0072e3624db44e52ce2b4e53fa4b500bc9ab7a + md5: bd99bea47e0a1821b15b8b7ccfc4fa04 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2583,15 +2580,15 @@ packages: - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 579596 - timestamp: 1757867209855 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.1-h07555a4_0.conda - sha256: 0343f7ecaa2eb1508ab588e1733387a08209369bcc270d968a86b4932b4f4176 - md5: 1acdb57394592a2f0b907a62bafcab6e + size: 573269 + timestamp: 1758713426562 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.2-h07555a4_0.conda + sha256: b6678d1da279aa89355c459e08ca46b4fc8e3c9c638e5f34da52b2b137f658d3 + md5: 4138b6b3e10ac7f881d185630b708846 depends: - __osx >=10.13 - libglib >=2.86.0,<3.0a0 @@ -2599,15 +2596,15 @@ packages: - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 550033 - timestamp: 1757867587694 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.1-h7542897_0.conda - sha256: 4fc9a4010b5de9370cb93469aba2cd915b4eebb627a882b199862e8a5f8eaefe - md5: 3c1e55f893bf4e1442104cd477e4aa26 + size: 547455 + timestamp: 1758713524262 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.2-h7542897_0.conda + sha256: 546143b49d95c816333a22685238bb9912ae2414f58f014deb12ec0df93efc04 + md5: 41e23aaa2c9adb0dc13dca8d70f21375 depends: - __osx >=11.0 - libglib >=2.86.0,<3.0a0 @@ -2615,12 +2612,12 @@ packages: - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 544351 - timestamp: 1757868176500 + size: 544250 + timestamp: 1758713647128 - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda sha256: cbfa8c80771d1842c2687f6016c5e200b52d4ca8f2cc119f6377f64f899ba4ff md5: c42356557d7f2e37676e121515417e3b @@ -3098,17 +3095,17 @@ packages: - pkg:pypi/h5py?source=hash-mapping size: 1074637 timestamp: 1756767953483 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.0-h15599e2_0.conda - sha256: 04d33cef3345ce6e3fbbfb5539ebc8a3730026ea94ce6ace1f8f8d3551fa079c - md5: 47599428437d622bfee24fbd06a2d0b4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda + sha256: 3bf149eab76768ed10f95eba015ca996cd6be7dc666996a004c4a8340a57cd60 + md5: b90a6ec73cc7d630981f78d4c7ca8fed depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - icu >=75.1,<76.0a0 - libexpat >=2.7.1,<3.0a0 - - libfreetype >=2.14.0 - - libfreetype6 >=2.14.0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 - libgcc >=14 - libglib >=2.86.0,<3.0a0 - libstdcxx >=14 @@ -3116,11 +3113,11 @@ packages: license: MIT license_family: MIT purls: [] - size: 2048134 - timestamp: 1757867460348 -- conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-11.5.0-hc5d3ef4_0.conda - sha256: 14ad02a688ecbc7e2f70238870e795fec34072bd8ea950724865e311e150faff - md5: 4ee034a41e3feae5ec8b2ed3771c64ca + size: 2427482 + timestamp: 1758640288422 +- conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-11.5.1-hc5d3ef4_0.conda + sha256: 59e2904a9c11896522d8ddb3271d2c6eeec9f7e5009c8968e54539ee122f5cc0 + md5: 9363d59f8ba44515263514f12ac2c1aa depends: - __osx >=10.13 - cairo >=1.18.4,<2.0a0 @@ -3128,18 +3125,18 @@ packages: - icu >=75.1,<76.0a0 - libcxx >=19 - libexpat >=2.7.1,<3.0a0 - - libfreetype >=2.14.0 - - libfreetype6 >=2.14.0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 - libglib >=2.86.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 1611143 - timestamp: 1757867604495 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-11.5.0-haf38c7b_0.conda - sha256: 455c8aae54c03c150d49f1b860f27c5ec031023dd66748e3e397a5bdfad9c1e8 - md5: dc4609299527284d40fd43f4a776f230 + size: 1580169 + timestamp: 1758640414887 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-11.5.1-haf38c7b_0.conda + sha256: ceea9b35e8e81a0e345035f2e46574a213b7d3d7b2f8fdd0cb049490bddde6c2 + md5: effd4cec7d221d77cd937a83132f5b9e depends: - __osx >=11.0 - cairo >=1.18.4,<2.0a0 @@ -3147,15 +3144,15 @@ packages: - icu >=75.1,<76.0a0 - libcxx >=19 - libexpat >=2.7.1,<3.0a0 - - libfreetype >=2.14.0 - - libfreetype6 >=2.14.0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 - libglib >=2.86.0,<3.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 1556926 - timestamp: 1757868671438 + size: 1514711 + timestamp: 1758640885114 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 md5: bd77f8da987968ec3927990495dc22e4 @@ -3938,9 +3935,9 @@ packages: purls: [] size: 188306 timestamp: 1745264362794 -- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.24.2-hb700be7_0.conda - sha256: 32ebf62ee30ee8b83d18c9155a41c589123e36cd98ab26f1601bc25f2c42d4ef - md5: b39c6a955603043485950e264c222558 +- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.24.3-hb700be7_0.conda + sha256: 7209dbe2a8fed51a60c593f1592eba71ea1a8b11b109ddf6bc46f9ba97c4ad6b + md5: 753ddaa1303e04cfef8e1e5f9e9b7a2a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -3948,8 +3945,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 606171 - timestamp: 1756365270629 + size: 610313 + timestamp: 1758698525395 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda sha256: dcd1429a1782864c452057a6c5bc1860f2b637dc20a2b7e6eacd57395bbceff8 md5: 83b160d4da3e1e847bf044997621ed63 @@ -4642,26 +4639,26 @@ packages: purls: [] size: 403456 timestamp: 1749033320430 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.1-h3d58e20_0.conda - sha256: dd207d8882854f22072b7fd4f03726e0e182e0666986ec880168f1753f7415dc - md5: 7f5b7dfca71a5c165ce57f46e9e48480 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda + sha256: c3feab716740baa6193a1bc5c948c47c913e28f6e52d418bb67123cb92b9761e + md5: 34cd9d03a8f27081a556cb397a19f6cd depends: - __osx >=10.13 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 571163 - timestamp: 1757525814844 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.1-hf598326_0.conda - sha256: 6af03355967b7b097d5820dde05e0c709945fdb01f4bc56d11499d8bf7435239 - md5: d5790f3769fedeea4e021483272bdc53 + size: 572006 + timestamp: 1758698149906 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda + sha256: 3de00998c8271f599d6ed9aea60dc0b3e5b1b7ff9f26f8eac95f86f135aa9beb + md5: edfa256c5391f789384e470ce5c9f340 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 568291 - timestamp: 1757525671408 + size: 568154 + timestamp: 1758698306949 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf md5: 64f0c503da58ec25ebd359e4d990afa8 @@ -6840,17 +6837,17 @@ packages: purls: [] size: 83849 timestamp: 1748856224950 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda - sha256: 776e28735cee84b97e4d05dd5d67b95221a3e2c09b8b13e3d6dbe6494337d527 - md5: af930c65e9a79a3423d6d36e265cef65 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 37087 - timestamp: 1757334557450 + size: 37135 + timestamp: 1758626800002 - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h4f16b4b_2.conda sha256: e0df324fb02fa05a05824b8db886b06659432b5cff39495c59e14a37aa23d40f md5: 2c65566e79dc11318ce689c656fb551c @@ -7286,9 +7283,9 @@ packages: - pkg:pypi/loguru?source=hash-mapping size: 59696 timestamp: 1746634858826 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.1-py311hc53b721_1.conda - sha256: b30b79ae85cd16ef639eae136ad86abb7d120ec4baa77f8215b9b4548ab39d57 - md5: a21fe7d37336b21378667233aca2504b +- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.2-py311hc53b721_0.conda + sha256: 431db76b7d9ecaf1d8689f55f7d9651046abc9aa1f05d0e3d3ccd254cc5c340f + md5: 78a3ed9edec407843eeaad7d6786fdfb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -7300,11 +7297,11 @@ packages: license: BSD-3-Clause and MIT-CMU purls: - pkg:pypi/lxml?source=hash-mapping - size: 1603661 - timestamp: 1756829146640 -- conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-6.0.1-py311h2bdc24d_1.conda - sha256: 76a73697bd6687224390da7c3dcecbc7e74e205661dc130483932d4d8963e291 - md5: ecfe89c05cd4680616b3a6695bf81018 + size: 1600897 + timestamp: 1758535446426 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-6.0.2-py311h58ed208_0.conda + sha256: f51b5955b2843c0d88721c3b5a5f96e5edd39b1a76a221e303aeaea0fd61eb0a + md5: b5d291fe7dc6e7a2c0103b33e8efe5ab depends: - __osx >=10.13 - libxml2 >=2.13.8,<2.14.0a0 @@ -7315,11 +7312,11 @@ packages: license: BSD-3-Clause and MIT-CMU purls: - pkg:pypi/lxml?source=hash-mapping - size: 1385746 - timestamp: 1756829282030 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.0.1-py310h278f833_1.conda - sha256: c81ba986144679944c5697b8d817879648f83c1bcb3af7d86acb6077cf6068e5 - md5: 0ddb10d69c1288ac718c74a1f48c4b90 + size: 1386092 + timestamp: 1758535936515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.0.2-py310h0be8703_0.conda + sha256: a1833745bb0ca4eb402f552c191511174dddef1c7bc6cba56261420e58417539 + md5: e29f57271ea0b3d8394e7976b9a250d7 depends: - __osx >=11.0 - libxml2 >=2.13.8,<2.14.0a0 @@ -7330,9 +7327,9 @@ packages: - python_abi 3.10.* *_cp310 license: BSD-3-Clause and MIT-CMU purls: - - pkg:pypi/lxml?source=compressed-mapping - size: 1300720 - timestamp: 1756829330013 + - pkg:pypi/lxml?source=hash-mapping + size: 1302864 + timestamp: 1758535594742 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -7679,7 +7676,7 @@ packages: - pypi: ./ name: msutils version: 0.1.0 - sha256: 0c58fb761745ee0b89f65bb9d57ffcf0173b226e303340003ff732ed0ab49a57 + sha256: 59de227fc54eaec87a397a5add9a577da3f74e2b0e9bfb473ed83dd412620ac7 editable: true - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.6.3-py311h2dc5d0c_0.conda sha256: cde96613adebfa3a2c57abd4bf4026b6829d276fa95756ac6516115a7ff83b1f @@ -8062,49 +8059,49 @@ packages: purls: [] size: 601538 timestamp: 1739400923874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda - sha256: 0b7396dacf988f0b859798711b26b6bc9c6161dca21bacfd778473da58730afa - md5: 01243c4aaf71bde0297966125aea4706 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d + md5: 11b3379b191f63139e29c0d19dee24cd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libpng >=1.6.50,<1.7.0a0 - libstdcxx >=14 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 357828 - timestamp: 1754297886899 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h036ada5_1.conda - sha256: fea2a79edb123fda31d73857e96b6cd24404a31d41693d8ef41235caed74b28e - md5: 38f264b121a043cf379980c959fb2d75 + size: 355400 + timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda + sha256: fdf4708a4e45b5fd9868646dd0c0a78429f4c0b8be490196c975e06403a841d0 + md5: a67d3517ebbf615b91ef9fdc99934e0c depends: - __osx >=10.13 - libcxx >=19 - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 336370 - timestamp: 1754297904811 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda - sha256: 6013916893fcd9bc97c479279cfe4616de7735ec566bad0ee41bc729e14d31b2 - md5: ab581998c77c512d455a13befcddaac3 + size: 334875 + timestamp: 1758489493148 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda + sha256: dd73e8f1da7dd6a5494c5586b835cbe2ec68bace55610b1c4bf927400fe9c0d7 + md5: 6bf3d24692c157a41c01ce0bd17daeea depends: - __osx >=11.0 - libcxx >=19 - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 320198 - timestamp: 1754297986425 + size: 319967 + timestamp: 1758489514651 - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 md5: 2e5bf4f1da39c0b32778561c3c4e5878 @@ -8148,9 +8145,9 @@ packages: purls: [] size: 843597 timestamp: 1748010484231 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda - sha256: 8c313f79fd9408f53922441fbb4e38f065e2251840f86862f05bdf613da7980f - md5: 72b3dd72e4f0b88cdacf3421313480f0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda + sha256: 0572be1b7d3c4f4c288bb8ab1cb6007b5b8b9523985b34b862b5222dea3c45f5 + md5: 4fc6c4c88da64c0219c0c6c0408cedd4 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -8158,30 +8155,30 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 3136554 - timestamp: 1758040407921 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.3-h230baf5_0.conda - sha256: b38470dc57c365e40cea5968f393f3d5ddd36bc779623a17b843f437fd15ea06 - md5: d51f5ce62794a19fa67da1ff101bae05 + size: 3128517 + timestamp: 1758597915858 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.3-h230baf5_1.conda + sha256: 8eeb0d7e01784c1644c93947ba5e6e55d79f9f9c8dd53b33a6523efb93afd56c + md5: f601470d724024fec8dbb98a2dd5b39c depends: - __osx >=10.13 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 2743344 - timestamp: 1758041755497 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.3-h5503f6c_0.conda - sha256: c547508f11f214125fe5fc66da3d5a5dad6a9204315ee880b5ba65cdb32b6572 - md5: 161d97c4c31b7851617119e6f851927f + size: 2742974 + timestamp: 1758599496115 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.3-h5503f6c_1.conda + sha256: d5499ee2611a0ca9d84e9d60a5978d1f17350e94915c89026f5d9346ccf0a987 + md5: 4b23b1e2aa9d81b16204e1304241ccae depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 3069340 - timestamp: 1758040933817 + size: 3069376 + timestamp: 1758598263612 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -8857,6 +8854,7 @@ packages: - python >=3.10 - python license: MIT + license_family: MIT purls: - pkg:pypi/pyparsing?source=compressed-mapping size: 104044 @@ -10783,17 +10781,17 @@ packages: purls: [] size: 138011 timestamp: 1749836220507 -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 - md5: b68980f2495d096e71c7fd9d7ccf63e6 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + sha256: e311b64e46c6739e2a35ab8582c20fa30eb608da130625ed379f4467219d4813 + md5: 7e1e5ff31239f9cd5855714df8a3783d depends: - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT purls: - - pkg:pypi/wcwidth?source=hash-mapping - size: 32581 - timestamp: 1733231433877 + - pkg:pypi/wcwidth?source=compressed-mapping + size: 33670 + timestamp: 1758622418893 - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.4.0-pyhd8ed1ab_0.conda sha256: 0f7258a383db60fb8563eb64df13c0df1c4c6cdcdb3428a06f3ef4f562fc5beb md5: a7c17eeb817efebaf59a48fdeab284a4 diff --git a/pyproject.toml b/pyproject.toml index f012fdd..017baf7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ h5py = ">=3.14.0,<4" scipy = ">=1.11.4,<2" matplotlib = ">=3.10.6,<4" scikit-image = ">=0.25.2,<0.26" -lxml = ">=6.0.1,<7" +lxml = ">=6.0.2,<7" plotly = ">=6.3.0,<7" sympy = ">=1.14.0,<2" ipykernel = ">=6.30.1,<7" @@ -40,6 +40,7 @@ quaternion = ">=2024.0.12,<2025" beartype = ">=0.21.0,<0.22" pre-commit = ">=4.3.0,<5" puma = ">=3.2.0,<4" +pyvista = ">=0.46.3,<0.47" [tool.pixi.environments] From a92d398ed5af42635bcfae4b362147de21ef2d77 Mon Sep 17 00:00:00 2001 From: Sanath Date: Thu, 25 Sep 2025 15:44:37 +0200 Subject: [PATCH 3/4] periodic voronoi foam microstructures working --- MSUtils/lattices/lattice_image.py | 33 +++++++----- MSUtils/voronoi/VoronoiSeeds.py | 4 +- MSUtils/voronoi/voronoi_foam.py | 89 +++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 MSUtils/voronoi/voronoi_foam.py diff --git a/MSUtils/lattices/lattice_image.py b/MSUtils/lattices/lattice_image.py index e744b32..709a3f0 100644 --- a/MSUtils/lattices/lattice_image.py +++ b/MSUtils/lattices/lattice_image.py @@ -29,27 +29,34 @@ def physical_to_voxel(point, dimensions, shape): return idx +def _inside_cell(P, L, eps=1e-12): + P = np.asarray(P, float) + L = np.asarray(L, float) + return np.all(P >= -eps) and np.all(P < L + eps) + + def draw_strut(microstructure, start, end, radius, voxel_sizes, strut_type, L): - start = np.asarray(start, dtype=np.float64) - end = np.asarray(end, dtype=np.float64) + start = np.asarray(start, np.float64) + end = np.asarray(end, np.float64) + L = np.asarray(L, np.float64) + direction = end - start length = np.linalg.norm(direction) if length == 0: return direction /= length - # Step roughly one voxel diagonal in PHYSICAL space - step = np.linalg.norm(voxel_sizes) + step = np.linalg.norm(voxel_sizes) # ~ one voxel diagonal num_points = max(1, int(np.ceil(length / step))) ts = np.linspace(0.0, length, num_points, dtype=np.float64) - points = start + np.outer(ts, direction) - # Radius window in index units for bounding box - voxel_radius = np.array( - [radius / voxel_sizes[i] for i in range(3)], dtype=np.float64 - ) + voxel_radius = np.array([radius / voxel_sizes[i] for i in range(3)], np.float64) + + for t in ts: + p = start + t * direction + if not _inside_cell(p, L): + continue - for p in points: x, y, z = physical_to_voxel(p, L, microstructure.shape) x_min = max(0, int(np.floor(x - voxel_radius[0]))) @@ -61,13 +68,13 @@ def draw_strut(microstructure, start, end, radius, voxel_sizes, strut_type, L): if strut_type == "circle": xx, yy, zz = np.ogrid[x_min:x_max, y_min:y_max, z_min:z_max] - # Compute PHYSICAL distance (consistent spacing) dx = (xx - x) * voxel_sizes[0] dy = (yy - y) * voxel_sizes[1] dz = (zz - z) * voxel_sizes[2] - distance2 = dx * dx + dy * dy + dz * dz - mask = distance2 <= (radius * radius) + mask = (dx * dx + dy * dy + dz * dz) <= (radius * radius) microstructure[x_min:x_max, y_min:y_max, z_min:z_max][mask] = 1 + else: + raise ValueError("Only 'circle' implemented.") def create_lattice_image( diff --git a/MSUtils/voronoi/VoronoiSeeds.py b/MSUtils/voronoi/VoronoiSeeds.py index 87d2353..e6b29e6 100644 --- a/MSUtils/voronoi/VoronoiSeeds.py +++ b/MSUtils/voronoi/VoronoiSeeds.py @@ -128,7 +128,9 @@ def _generate_seeds(self) -> None: ) case "diamond": # Diamond-like seed points self.num_crystals = 2 - self.seeds = np.array([[0, 0, 0], [0.5, 0.5, 0.5]]) + self.seeds = np.array([[0, 0, 0], [0.5, 0.5, 0.5]]) * np.array( + self.RVE_length + ) case _: raise ValueError("Unknown sampling method! : " + self.method) # Add more sampling methods here if needed diff --git a/MSUtils/voronoi/voronoi_foam.py b/MSUtils/voronoi/voronoi_foam.py new file mode 100644 index 0000000..8d5b62b --- /dev/null +++ b/MSUtils/voronoi/voronoi_foam.py @@ -0,0 +1,89 @@ +import numpy as np +from MSUtils.lattices.lattice_image import draw_strut, _inside_cell +from MSUtils.voronoi.VoronoiTessellation import PeriodicVoronoiTessellation +from MSUtils.voronoi.VoronoiSeeds import VoronoiSeeds +from MSUtils.general.MicrostructureImage import MicrostructureImage +from MSUtils.general.h52xdmf import write_xdmf + + +def _all_voronoi_edges(tess): + """ + Extract all edges from a PeriodicVoronoiTessellation object. + Each edge is represented as a tuple of its two endpoints. + """ + vor = tess.voronoi + edges = [] + for verts in vor.ridge_vertices: + if any(v == -1 for v in verts): + continue + if len(verts) < 2: + continue + cyc = list(verts) + [verts[0]] + for u, v in zip(cyc[:-1], cyc[1:]): + edges.append((vor.vertices[u].astype(float), vor.vertices[v].astype(float))) + return edges + + +def periodic_voronoi_foam( + tess, N, L, strut_radius, dtype=np.uint8, strut_type="circle" +): + """ + Use FULL Voronoi (with duplicated seeds) and draw every edge whose + start or end lies inside [0,L)^d. No periodic translations needed. + """ + N = np.asarray(N, int) + L = np.asarray(L, float) + + micro = np.zeros(tuple(N.tolist()), dtype=dtype) + voxel_sizes = L / (N - 1).astype(float) + + edges = _all_voronoi_edges(tess) + + # De-dup to avoid overdrawing: hash by midpoint & direction (sign-agnostic) + seen = set() + + for V0, V1 in edges: + if not (_inside_cell(V0, L) or _inside_cell(V1, L)): + continue + + mid = 0.5 * (V0 + V1) + d = V1 - V0 + nrm = np.linalg.norm(d) + 1e-15 + diru = np.round(d / nrm, 6) + key = tuple(np.round(mid / np.maximum(L, 1.0), 6)) + tuple( + np.minimum(diru, -diru) + ) + if key in seen: + continue + seen.add(key) + + draw_strut(micro, V0, V1, strut_radius, voxel_sizes, strut_type, L) + + return micro + + +if __name__ == "__main__": + + num_crystals = 125 + L = [1, 1, 1] + Nx, Ny, Nz = 512, 512, 512 + permute_order = "zyx" + strut_radius = 0.01 + + # Generate Voronoi seeds and tessellation + SeedInfo = VoronoiSeeds(num_crystals, L, "sobol", BitGeneratorSeed=42) + tess = PeriodicVoronoiTessellation(L, SeedInfo.seeds) + + # Generate Voronoi foam image + micro = periodic_voronoi_foam( + tess, [Nx, Ny, Nz], L, strut_radius, strut_type="circle" + ) + + IMG = MicrostructureImage(image=micro, L=L) + IMG.write("data/voro_foam.h5", "/dset_0", order=permute_order) + + write_xdmf( + "data/voro_foam.h5", + "data/voro_foam.xdmf", + microstructure_length=L[::-1], + ) From d345ebd6933f2fbec2024f6f33cb98d50639682f Mon Sep 17 00:00:00 2001 From: Sanath Date: Thu, 25 Sep 2025 15:52:38 +0200 Subject: [PATCH 4/4] update lock --- pixi.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pixi.lock b/pixi.lock index 6733d65..7c6a05b 100644 --- a/pixi.lock +++ b/pixi.lock @@ -25,7 +25,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-he3183e4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.21.2-h4cfbee9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.21.3-h4cfbee9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 @@ -384,7 +384,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/brunsli-0.1-hd38a3c4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/c-blosc2-2.21.2-h415348b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-blosc2-2.21.3-h415348b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 @@ -1438,9 +1438,9 @@ packages: purls: [] size: 179696 timestamp: 1744128058734 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.21.2-h4cfbee9_0.conda - sha256: 18d6e1cd95c59f6e6d090721a9af26c07bf592da51a43818ea923caa8cbaa6d6 - md5: 30fe6bea5d1a914883109365eccebf3b +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.21.3-h4cfbee9_0.conda + sha256: 4a222cff1b3507b289352ab94d110974dad3dace11e2d0eea405ba3147764eba + md5: 93027b8ac9d0e596eb5b759ef56a03f1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1451,11 +1451,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 347863 - timestamp: 1757544790973 -- conda: https://conda.anaconda.org/conda-forge/osx-64/c-blosc2-2.21.2-h415348b_0.conda - sha256: ccf096655af834aa1de1ccfa8cddb61c2be291805e2f946d25b295213c211196 - md5: db24436da5ba29103f9e531b7d10d481 + size: 350470 + timestamp: 1758798098407 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-blosc2-2.21.3-h415348b_0.conda + sha256: f3dc50b060e5a7907bb61efcc08b60ce3c71b8c892fb5b4410300a0aa2cb97c9 + md5: 1b4494414b7e58852220f8bc4996f0b1 depends: - __osx >=10.13 - libcxx >=19 @@ -1465,8 +1465,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 286492 - timestamp: 1757545051396 + size: 287427 + timestamp: 1758798852350 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-blosc2-2.19.1-h9c47b6e_0.conda sha256: a4e7042bc5ddc6eb91e375492412fb1bd958acc4e2f3323eb675d2aafd806f6a md5: 2de310b1ae2c0d43125de29b9be71ca9 @@ -7676,7 +7676,7 @@ packages: - pypi: ./ name: msutils version: 0.1.0 - sha256: 59de227fc54eaec87a397a5add9a577da3f74e2b0e9bfb473ed83dd412620ac7 + sha256: 866506ca8cdf4cbca6372133f8891cfa151228b84dc51a5c5e1917731d15e366 editable: true - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.6.3-py311h2dc5d0c_0.conda sha256: cde96613adebfa3a2c57abd4bf4026b6829d276fa95756ac6516115a7ff83b1f