pumapy.material_properties

pumapy.material_properties.anisotropic_radiation

class pumapy.material_properties.anisotropic_radiation.AnisotropicRadiation(workspace, void_cutoff, sources_number, direction, bin_density, export_plot)[source]

Bases: object

compute()[source]
error_check()[source]
log_input()[source]
log_output()[source]
pumapy.material_properties.anisotropic_radiation.compute_extinction_coefficients_anisotropic(ws, rays_distances, sources_number, bin_density=10000, export_pathname=None)[source]

Compute the extinction coefficient based on the ray casting radiation simulation (this is normally a step inside the compute_radiation function)

Parameters
  • ws (pumapy.Workspace) – domain

  • rays_distances (np.ndarray) – rays distances, as output by compute_radiation function

  • sources_number (int) – number of light sources spread randomly in the void space (i.e. 0)

  • bin_density (int) – number of bins used to create histogram of ray distances

  • export_pathname (str) – path to save curve plot of ray distance distribution

Returns

extinction coefficient (beta), its standard deviation

Return type

(float, float)

pumapy.material_properties.anisotropic_radiation.compute_radiation_anisotropic(workspace, void_cutoff, sources_number, bin_density=10000, export_pathname=None)[source]

Compute the anisotropic radiative thermal conductivity through ray tracing

Parameters
  • workspace (pumapy.Workspace) – domain

  • void_cutoff ((int, int)) – specify the void phase

  • sources_number (int) – number of light sources spread randomly in the void space (i.e. 0)

  • bin_density (int) – number of bins used to create histogram of ray distances

  • export_pathname (str) – path to save curve plot of ray distance distribution

Returns

extinction coefficient (beta), its standard deviation and of ray distances

Return type

(float, float, np.ndarray)

pumapy.material_properties.conductivity

pumapy.material_properties.conductivity.compute_electrical_conductivity(workspace, cond_map, direction, side_bc='p', prescribed_bc=None, tolerance=1e-05, maxiter=10000, solver_type='bicgstab', display_iter=True, method='fv', matrix_free=True)[source]

Compute the electrical conductivity

Parameters
  • workspace (pumapy.Workspace) – domain

  • cond_map (IsotropicConductivityMap or AnisotropicConductivityMap) – local constituents electrical conductivities

  • direction (string) – direction for solve (‘x’,’y’,’z’, or ‘’ for prescribed_bc). If provided, prescribed_bc is ignored

  • side_bc (string) – side boundary conditions can be symmetric (‘s’) or periodic (‘p’). Only periodic available when method=’fe’

  • prescribed_bc – object holding dirichlet BC, only available for isotropic of MPFA implementations.

Need to set direction=’’ in order to provide it. When prescribed_bc is provided, keff is not printed but it is computed as if direction==’x’ for testing purposes. :type prescribed_bc: pumapy.IsotropicConductivityBC or pumapy.AnisotropicConductivityBC or None :param tolerance: tolerance for iterative solver :type tolerance: float :param maxiter: maximum Iterations for solver :type maxiter: int :param solver_type: solver type, options: ‘bicgstab’ (default), ‘cg’, ‘gmres’, ‘minres’ (only for method=’fe’), ‘direct’ :type solver_type: string :param display_iter: display iterations and residual :type display_iter: bool :param method: whether to use finite volume solver (‘fv’, either isotropic solver if IsotropicConductivityMap is passed, or mpfa if AnisotropicConductivityMap) or finite element Q1-Q1 EBE solver (‘fe’). For the latter method, it is recommended to use solver_type=’minres’ as lighter and faster :type method: string :param matrix_free: if True, then use matrix-free method if possible (only available for fv isotropic solver or for fe solver when the solver type is not ‘direct’) :type matrix_free: bool :return: electrical conductivity, potential field, flux :rtype: ((float, float, float), numpy.ndarray, numpy.ndarray)

pumapy.material_properties.conductivity.compute_thermal_conductivity(workspace, cond_map, direction, side_bc='p', prescribed_bc=None, tolerance=1e-05, maxiter=10000, solver_type='bicgstab', display_iter=True, method='fv', matrix_free=True)[source]

Compute the thermal conductivity

Parameters
  • workspace (pumapy.Workspace) – domain

  • cond_map (IsotropicConductivityMap or AnisotropicConductivityMap) – local constituents themal conductivities

  • direction (string) – direction for solve (‘x’,’y’,’z’, or ‘’ for prescribed_bc). If provided, prescribed_bc is ignored

  • side_bc (string) – side boundary conditions can be symmetric (‘s’) or periodic (‘p’). Only periodic available when method=’fe’

  • prescribed_bc – object holding dirichlet BC, only available for isotropic of MPFA implementations.

Need to set direction=’’ in order to provide it. When prescribed_bc is provided, keff is not printed but it is computed as if direction==’x’ for testing purposes. :type prescribed_bc: pumapy.IsotropicConductivityBC or pumapy.AnisotropicConductivityBC or None :param tolerance: tolerance for iterative solver :type tolerance: float :param maxiter: maximum Iterations for solver :type maxiter: int :param solver_type: solver type, options: ‘bicgstab’ (default), ‘cg’, ‘gmres’, ‘minres’ (only for method=’fe’), ‘direct’ :type solver_type: string :param display_iter: display iterations and residual :type display_iter: bool :param method: whether to use finite volume solver (‘fv’, either isotropic solver if IsotropicConductivityMap is passed, or mpfa if AnisotropicConductivityMap) or finite element Q1-Q1 EBE solver (‘fe’). For the latter method, it is recommended to use solver_type=’minres’ as lighter and faster :type method: string :param matrix_free: if True, then use matrix-free method if possible (only available for fv isotropic solver or for fe solver when the solver type is not ‘direct’) :type matrix_free: bool :return: thermal conductivity, temperature field, flux :rtype: ((float, float, float), numpy.ndarray, numpy.ndarray)

Example

>>> import pumapy as puma
>>> ws_fiberform = puma.import_3Dtiff(puma.path_to_example_file("200_fiberform.tif"), 1.3e-6)
Importing .../200_fiberform.tif ... Done
>>> ws_fiberform.rescale(0.5, segmented=False)
Rescaled workspace size: (100, 100, 100)
>>> # Conductivity with Isotropic local phases
>>> cond_map = puma.IsotropicConductivityMap()
>>> cond_map.add_material((0, 89), 0.0257)
>>> cond_map.add_material((90, 255), 12)
>>> k_eff_x, T_x, q_x = puma.compute_thermal_conductivity(ws_fiberform, cond_map, 'x', 's', matrix_free=True)
Approximate memory requirement for simulation...
>>> # Conductivity with Anisotropic local phases
>>> puma.compute_orientation_st(ws_fiberform, cutoff=(90, 255))
First gradient computation...
>>> cond_map = puma.AnisotropicConductivityMap()
>>> # conductivity of the void phase to be 0.0257 (air at STP)
>>> cond_map.add_isotropic_material((0, 89), 0.0257)
>>> # axial fiber conductivity of 12, radial fiber conductivity of 0.7
>>> cond_map.add_material_to_orient((90, 255), 12., 0.7)
>>> k_eff_z, T_z, q_z = puma.compute_thermal_conductivity(ws_fiberform, cond_map, 'z', 's')  # method='fe' for finite element
Approximate memory requirement for simulation...
>>> # plot_conductivity_fields(ws, T_z, q_z)  # to visualize fields
>>> # export_conductivity_fields_vti("path/to/folder", ws, T_z, q_z)  # to export fields
pumapy.material_properties.conductivity.export_conductivity_fields_vti(filepath, workspace, T, q)[source]

Export conductivity fields, as output by the conductivity function

Parameters
  • filepath (string) –

  • workspace (puma.Workspace or numpy.ndarray) – domain

  • T (numpy.ndarray) – temperature field

  • q (numpy.ndarray) – flux field

pumapy.material_properties.conductivity.plot_conductivity_fields(workspace, T, q, show_cbar=True, show_edges=False, xy_view=False, rm_id=None, notebook=False)[source]

Plot the workspace colored by the temperature and flux fields, as output by the conductivity function

Parameters
  • workspace (pumapy.Workspace) – domain

  • T (numpy.ndarray) – temperature field

  • q (numpy.ndarray) – flux field

  • show_cbar (bool) – show colorbar in each plot

  • show_edges (bool) – show edges in mesh

  • xy_view (bool) – show plot aligned with xy plane

  • rm_id (float or None) – remove a phase of the material from thresholded mesh

  • notebook (bool) – plotting interactively in a jupyter notebook (overwrites show_grid to False)

pumapy.material_properties.elasticity

pumapy.material_properties.elasticity.compute_elasticity(workspace, elast_map, direction, side_bc='p', tolerance=1e-05, maxiter=100000, solver_type='bicgstab', display_iter=True, method='fv', matrix_free=True)[source]

Compute the effective elasticity coefficient

Parameters
  • workspace (pumapy.Workspace) – domain

  • elast_map (pumapy.ElasticityMap) – local elasticity of the constituents

  • direction (string) – direction for solve (‘x’,’y’, ‘z’, ‘yz’, ‘xz’, ‘xy’)

  • side_bc (string) – side boundary conditions can be symmetric (‘s’) or periodic (‘p’). Only periodic available when method=’fe’

  • tolerance – tolerance for iterative solver

  • maxiter (int) – maximum Iterations for solver

  • solver_type (string) – solver type, options: ‘bicgstab’ (default), ‘minres’ (only for method=’fe’), ‘gmres’, ‘direct’

  • display_iter (bool) – display iterations and residual

  • method – whether to use finite volume solver (‘fv’, i.e. mpsa) or finite element Q1-Q1 EBE solver (‘fe’).

Type

tolerance: float

For the latter method, it is recommended to use solver_type=’minres’ as lighter and faster :type method: string :param matrix_free: if True, then use matrix-free method if possible (only available for fe solver when the solver type is not ‘direct’) :type matrix_free: bool :return: elasticity, displacement field, direct stresses (sigma xx, yy, zz), shear stresses (tau yz, xz, xy) :rtype: ((float, float, float, float, float, float), numpy.ndarray, numpy.ndarray, numpy.ndarray)

Example

>>> import pumapy as puma
>>> ws = puma.Workspace.from_shape_value((20, 20, 20), 1)
>>> ws[int(ws.matrix.shape[0] / 2):] = 2
>>> elast_map = puma.experimental.ElasticityMap()
>>> elast_map.add_isotropic_material((1, 1), 200, 0.3)
>>> elast_map.add_isotropic_material((2, 2), 400, 0.1)
>>> C = np.zeros((6, 6))
>>> C[:, 0], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='x', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> C[:, 1], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='y', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> C[:, 2], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='z', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> C[:, 3], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='yz', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> C[:, 4], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='xz', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> C[:, 5], u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='xy', solver_type='direct')
Approximate memory requirement for simulation: ...
>>> coeffs = puma.experimental.get_E_nu_from_elasticity(C)
E1 ...
>>> #puma.plot_elasticity_fields(ws, u, s, t)  # to visualize fields
>>> #puma.warp_elasticity_fields(ws, u, s, t, 5)  # to visualize fields
>>> #puma.export_elasticity_fields_vti("path/to/folder", ws, u, s, t)  # to export fields
>>> C1, u, s, t = puma.experimental.compute_elasticity(ws, elast_map, direction='x', solver_type='direct', method='fe')  # finite element solver
Approximate memory requirement for simulation: ...
pumapy.material_properties.elasticity.compute_stress_analysis(workspace, elast_map, prescribed_bc, side_bc='p', tolerance=1e-05, maxiter=100000, solver_type='bicgstab', display_iter=True)[source]

Compute stress analysis based on specific user-input dirichlet boundary conditions

Parameters
  • workspace (pumapy.Workspace) – domain

  • elast_map (pumapy.ElasticityMap) – local elasticity of the constituents

  • prescribed_bc (pumapy.ElasticityBC) – object holding the elasticity dirichlet boundary conditions

  • side_bc (string) – side boundary conditions can be symmetric (‘s’) or periodic (‘p’)

  • tolerance – tolerance for iterative solver

  • maxiter (int) – maximum Iterations for solver

  • solver_type (string) – solver type, options: ‘gmres’ (default), ‘bicgstab’, ‘direct’

  • display_iter (bool) – display iterations and residual

Type

tolerance: float

Returns

elasticity, displacement field, direct stresses (sigma xx, yy, zz), shear stresses (tau yz, xz, xy)

Return type

(numpy.ndarray, numpy.ndarray, numpy.ndarray)

Example

>>> import pumapy as puma
>>> ws = puma.Workspace.from_shape_value((20, 22, 22), 1)
>>> ws[ws.matrix.shape[0]//2:] = 2
>>> ws[:, [0, -1]] = 0
>>> ws[:, :, [0, -1]] = 0
>>> elast_map = puma.experimental.ElasticityMap()
>>> elast_map.add_isotropic_material((0, 0), 1e-5, 0.3)
>>> elast_map.add_isotropic_material((1, 1), 200, 0.3)
>>> elast_map.add_isotropic_material((2, 2), 400, 0.1)
>>> bc = puma.experimental.ElasticityBC(ws)
>>> bc.xfaces[0, :, :, 0] = 0
>>> bc.xfaces[0, :, :, 1] = 0
>>> bc.xfaces[0, :, :, 2] = 0
>>> bc.xfaces[1, :, :, 0] = 0
>>> bc.xfaces[1, :, :, 1] = 1
>>> bc.xfaces[1, :, :, 2] = 0
>>> u, s, t = puma.experimental.compute_stress_analysis(ws, elast_map, bc)
Approximate memory requirement for simulation: ...
>>> # puma.warp_elasticity_fields(ws[:, 1:-1, 1:-1], u[:, 1:-1, 1:-1], s[:, 1:-1, 1:-1], t[:, 1:-1, 1:-1], 20, show_original=0., show_edges=True)  # to visualize
pumapy.material_properties.elasticity.export_elasticity_fields_vti(filepath, workspace, u, s, t)[source]

Export conductivity fields, as output by the conductivity function

Parameters
  • filepath (string) –

  • workspace (puma.Workspace or numpy.ndarray) – domain

  • u (numpy.ndarray) – displacement field

  • s (numpy.ndarray) – direct stress field

  • t (numpy.ndarray) – shear stress field

pumapy.material_properties.elasticity.get_E_nu_from_elasticity(C)[source]

Compute Young’s moduli E1, E2, E3, Shear moduli G23, G13, G12, and Poisson’s ratios nu12, nu23, nu31 for an orthotropic material from its symmetric elastic stiffness tensor

Parameters

C (np.ndarray) – 6x6 elasticity tensor

Returns

Young’s moduli E1, E2, E3 and Poisson’s ratios nu12, nu23, nu31

Return type

(float, float, float, float, float, float)

pumapy.material_properties.elasticity.plot_elasticity_fields(workspace, u, s, t, show_cbar=True, show_edges=False, xy_view=False, rm_id=None, notebook=False)[source]

Plot the workspace according to the displacement and stress fields output by the elasticity functions

Parameters
  • workspace (pumapy.Workspace) – domain

  • u (numpy.ndarray) – displacement field

  • s (numpy.ndarray) – direct stress field

  • t (numpy.ndarray) – shear stress field

  • show_cbar (bool) – show colorbar in each plot

  • show_edges (bool) – show edges in mesh

  • xy_view (bool) – show plot aligned with xy plane

  • rm_id (float or None) – remove a phase of the material from thresholded mesh

  • notebook (bool) – plotting interactively in a jupyter notebook (overwrites show_grid to False)

pumapy.material_properties.elasticity.remove_rbms(workspace, void_id, direction)[source]

Remove Rigid Body Movements (RBMs), i.e. unconnected or “floating” voxels, in a segmented domain along a specified direction

Parameters
  • workspace (pumapy.Workspace) – domain

  • void_id (int) – specify the void ID to discard from RBMs identification

  • direction (str) – Cartesian direction that has to be connected, options: ‘x’, ‘y’, ‘z’

Returns

workspace without the possible RBMs determined by not being connected from side to side N.B. The output workspace is segmented into 0=void, 1=solid

Return type

pumapy.Workspace

Example

>>> import pumapy as puma
>>> workspace = puma.import_3Dtiff(puma.path_to_example_file("100_fiberform.tif"))
Importing ...
>>> workspace.binarize(103)
>>> new_ws = puma.experimental.remove_rbms(workspace, void_id=0, direction='y')
>>> # puma.render_volume(workspace, (1, 1), solid_color=(255, 255, 255))  # to visualize before and after
>>> # puma.render_volume(new_ws, (1, new_ws.max()), solid_color=(255, 255, 255))
pumapy.material_properties.elasticity.warp_elasticity_fields(workspace, u, s, t, scale_factor=1, show_original=0.0, show_cbar=True, show_edges=False, xy_view=False, rm_id=None, show_axes=True, notebook=False)[source]

Warp the workspace according to the displacement field output by the elasticity functions, and colored by displacement and stress components

Parameters
  • workspace (pumapy.Workspace) – domain

  • u (numpy.ndarray) – displacement field

  • s (numpy.ndarray) – direct stress field

  • t (numpy.ndarray) – shear stress field

  • scale_factor (float) – scaling factor for warp

  • show_original (float) – opacity of the original workspace before warp

  • show_cbar (bool) – show colorbar in each plot

  • show_edges (bool) – show edges in mesh

  • xy_view (bool) – show plot aligned with xy plane

  • rm_id (float or None) – remove a phase of the material from warped mesh (only works for 2D slice)

  • show_axes (float) – show the axes and side dimensions

  • notebook (bool) – plotting interactively in a jupyter notebook (overwrites show_grid to False)

pumapy.material_properties.mean_intercept_length

pumapy.material_properties.mean_intercept_length.compute_mean_intercept_length(workspace, void_cutoff)[source]

Computation of the mean intercept length

Parameters
  • workspace (pumapy.Workspace) – domain

  • void_cutoff ((int, int)) – specify the void or gaseous phase of the domain

Returns

mean intercept length in x,y,z

Return type

(float, float, float)

Example

>>> import pumapy as puma
>>> ws = puma.import_3Dtiff(puma.path_to_example_file("200_fiberform.tif"), 1.3e-6)
Importing ...
>>> mil = puma.compute_mean_intercept_length(ws, (0, 89))

pumapy.material_properties.orientation

Further explained in publication: Semeraro, F., Ferguson, J.C., Panerai, F., King, R.J. and Mansour, N.N., 2020. Anisotropic analysis of fibrous and woven materials part 1: Estimation of local orientation. Computational Materials Science, 178, p.109631. (https://www.sciencedirect.com/science/article/abs/pii/S0927025620301221)

Please cite using this BibTex: @article{semeraro2020anisotropic,

title={Anisotropic analysis of fibrous and woven materials part 1: Estimation of local orientation}, author={Semeraro, Federico and Ferguson, Joseph C and Panerai, Francesco and King, Robert J and Mansour, Nagi N}, journal={Computational Materials Science}, volume={178}, pages={109631}, year={2020}, publisher={Elsevier}

}

class pumapy.material_properties.orientation.OrientationST(ws, sigma, rho, cutoff, edt)[source]

Bases: object

compute()[source]
error_check()[source]
log_input()[source]
log_output()[source]
pumapy.material_properties.orientation.compute_angular_differences(matrix, orientation1, orientation2, cutoff)[source]

Compute angular difference between two orientation ndarrays

Parameters
  • matrix (np.ndarray) – domain matrix

  • orientation1 (np.ndarray) – orientation as (x, y, z, 3)

  • orientation2 (np.ndarray) – orientation as (x, y, z, 3)

  • cutoff ((int, int)) – to binarize domain

Returns

angle_errors in degrees, mean, std

Return type

(np.ndarray, float, float)

pumapy.material_properties.orientation.compute_orientation_st(ws, cutoff, sigma=1.4, rho=0.7, edt=False)[source]

Compute orientation of the material by the structure tensor algorithm

Parameters
  • ws (pumapy.Workspace) – domain

  • cutoff ((int, int)) – which grayscales to consider

  • sigma (float) – kernel size parameter for Gaussian derivatives (should be lower than rho)

  • rho (float) – kernel size parameter for Gaussian filter of derivatives of grayscales (should be higher than sigma)

  • edt (bool) – indicating if we need to apply Euclidean Distance Transform before computing ST

Returns

True if successful, False otherwise.

Return type

bool

Example

>>> import pumapy as puma
>>> import pyvista as pv
>>> ws = puma.import_3Dtiff(puma.path_to_example_file("100_fiberform.tif"), 1.3e-6)  # import example file
Importing ...
>>> puma.compute_orientation_st(ws, cutoff=(90, 255), sigma=0.7, rho=1.4)  # compute orientation
First gradient computation ...
>>> # p = pv.Plotter(shape=(1, 2))  # to visualize the orientation field
>>> # p.subplot(0, 0)
>>> # p.add_text("Microstructure")
>>> # puma.render_contour(ws, (90, 255), add_to_plot=p, plot_directly=False)
>>> # p.subplot(0, 1)
>>> # p.add_text("Detected fiber orientation")
>>> # puma.render_orientation(ws, add_to_plot=p, plot_directly=False)
>>> # p.show()  # to visualize it

pumapy.material_properties.permeability

pumapy.material_properties.permeability.compute_permeability(workspace, solid_cutoff, direction='xyz', tol=1e-08, maxiter=10000, solver_type='minres', display_iter=True, matrix_free=True, precondition=False, output_fields=True)[source]

Compute the permeability using first-order Q1-Q1 Finite Element solver and periodic BC on the sides.

Note: the iterative solvers have been observed to struggle converging for some cases. This is often connected to having the preconditioner option as True.

Parameters
  • workspace (pumapy.Workspace) – domain

  • solid_cutoff ((int, int)) – specify the solid phase

  • direction – direction for solve (‘xyz’,’x’,’y’,’z’). Note that if solver_type=”direct”, then the direction

is considered as “xyz” automatically because there is no need to invert the A sparse matrix multiple times :type direction: str :param tol: tolerance for iterative solver :type tol: float :param maxiter: maximum Iterations for solver :type maxiter: int :param solver_type: solver type, options: ‘minres’ (default, only works if precondition=False), ‘cg’, ‘direct’ :type solver_type: string :param display_iter: display iteration in iterative solver :type display_iter: bool :param matrix_free: solve system using matrix-free method (True, recommended) or building the sparse A matrix (False) :type matrix_free: bool :param precondition: solve system with Jacobi preconditioner (True) or without (False, default because it reduces memory, but more iterations. The default minres iterative solver does not support this kind of preconditioner) :type precondition: bool :param output_fields: export velocity and pressure fields (True, default) or not (False, lower memory) :type output_fields: bool :return: effective permeability (3x3 matrix) and, if output_fields=True, the normalized velocity field for the corresponding direction (arranged as tuple of numpy.ndarrays, i.e. (ux, uy, uz). If output_fields=False, then (None, None, None) is output :rtype: numpy.ndarray, (numpy.ndarray, numpy.ndarray, numpy.ndarray)

Example

>>> import pumapy as puma
>>> import pyvista as pv
>>> ws = puma.generate_random_fibers_transverseisotropic(shape=(50, 50, 50), radius=2, porosity=0.7, direction='x', variation=15, length=200, allow_intersect=True, segmented=True)
 Fibers created...
>>> keff, (ux, _, _) = puma.compute_permeability(ws, (1, ws.max()), direction='x', tol=1e-7)
Approximate memory requirement for simulation: ...
>>> # p = pv.Plotter()  # to visualize it
>>> # puma.render_orientation(ux, add_to_plot=p, scale_factor=2e12, plot_directly=False)
>>> # ws.voxel_length = 1  # the voxel_length is converted to 1 for plotting the workspace together with the velocity
>>> # puma.render_volume(ws, cutoff=(1, ws.max()), add_to_plot=p, plot_directly=False, cmap='jet')
>>> # p.show()

pumapy.material_properties.radiation

class pumapy.material_properties.radiation.Radiation(workspace, void_cutoff, sources_number, particles_number, boundary_behavior, bin_density, rayexport_filepathname, export_plot)[source]

Bases: object

compute()[source]
error_check()[source]
generate_sources()[source]
log_input()[source]
log_output()[source]
pumapy.material_properties.radiation.compute_extinction_coefficients(ws, rays_distances, sources_number, particles_number, bin_density=10000, export_pathname=None)[source]

Compute the extinction coefficient based on the ray casting radiation simulation (this is normally a step inside the compute_radiation function)

Parameters
  • ws (pumapy.Workspace) – domain

  • rays_distances (np.ndarray) – rays distances, as output by compute_radiation function

  • sources_number (int) – number of light sources spread randomly in the void space (i.e. 0)

  • degree_accuracy (int) – angle difference between rays emitted in degrees (has to be an exact divider of 180°)

  • bin_density (int) – number of bins used to create histogram of ray distances

  • export_pathname (str) – path to save curve plot of ray distance distribution

Returns

extinction coefficient (beta), its standard deviation

Return type

(float, float)

pumapy.material_properties.radiation.compute_radiation(workspace, void_cutoff, sources_number, particles_number, boundary_behavior=1, bin_density=10000, exportparticles_filepathname='', export_pathname=None)[source]

Compute the radiative thermal conductivity through ray tracing (N.B. 0 material ID in workspace refers to gas phases unless otherwise specified)

Parameters
  • workspace (pumapy.Workspace) – domain

  • void_cutoff ((int, int)) – specify the void phase

  • sources_number (int) – number of light sources spread randomly in the void space (i.e. 0)

  • particles_number (int) – number of particles emitted at each source point

  • boundary_behavior (int) – how to treat particles exiting the domain: 0=kill, 1=periodic (default)

  • bin_density (int) – number of bins used to create histogram of ray distances

  • exportparticles_filepathname (string) – path and name of the particle files exported as VTK points

  • export_pathname (str) – path to save curve plot of ray distance distribution

Returns

extinction coefficient (beta), its standard deviation and of ray distances

Return type

(float, float, np.ndarray)

Example

>>> import pumapy as puma
>>> ws_fiberform = puma.import_3Dtiff(puma.path_to_example_file("200_fiberform.tif"), 0.65e-6)
Importing ...
>>> beta, beta_std, rays_distances = puma.experimental.compute_radiation(ws_fiberform, (0, 89), 100, 500)
 Number of particles in Ray Tracing simulation...

pumapy.material_properties.surface_area

class pumapy.material_properties.surface_area.SurfaceArea(workspace, cutoff, flag_gaussian)[source]

Bases: object

compute()[source]
log_input()[source]
log_output()[source]
pumapy.material_properties.surface_area.compute_surface_area(workspace, cutoff, flag_gaussian=False)[source]

Computation of the surface area based on isosurface

Parameters
  • workspace (pumapy.Workspace) – domain

  • cutoff ((int, int)) – specify the solid phase

  • flag_gaussian (bool) – apply Gaussian filter before generating surface

Returns

area, specific_area

Return type

(float, float)

Example

>>> import pumapy as puma
>>> ws = puma.import_3Dtiff(puma.path_to_example_file("200_fiberform.tif"), 1.3e-6) # import workspace
Importing ...
>>> area, specific_area = puma.compute_surface_area(ws, cutoff=(90, 255)) # computing surface area

pumapy.material_properties.tortuosity

pumapy.material_properties.tortuosity.compute_continuum_tortuosity(workspace, cutoff, direction, side_bc='p', prescribed_bc=None, tolerance=0.0001, maxiter=10000, solver_type='cg', display_iter=True, matrix_free=True)[source]

Compute the tortuosity modelling the local conductivity as isotropic

Parameters
  • workspace (pumapy.Workspace) – domain

  • cutoff ((int, int)) – cutoff to binarize domain specifying the void phase

  • direction (string) – direction for solve (‘x’,’y’, or ‘z’)

  • side_bc (string) – side boundary conditions (string) can be symmetric (‘s’), periodic (‘p’) or dirichlet (‘d’)

  • prescribed_bc (pumapy.IsotropicConductivityBC or None) – 3D array holding dirichlet BC

  • tolerance (float) – tolerance for iterative solver

  • maxiter (int) – maximum Iterations for solver

  • solver_type (string) – solver type, options: ‘cg’ (default), ‘bicgstab’, ‘direct’

  • display_iter (bool) – display iterations and residual

  • matrix_free (bool) – if True, then use matrix-free method

Returns

tortuosity, diffusivity, porosity, concentration field

Return type

((float, float, float), float, float, numpy.ndarray)

Example

>>> import pumapy as puma
>>> ws_fiberform = puma.import_3Dtiff(puma.path_to_example_file("200_fiberform.tif"), 1.3e-6)
Importing ...
>>> n_eff_x, Deff_x, poro, C_x = puma.compute_continuum_tortuosity(ws_fiberform, (0, 89), 'x', side_bc='s', tolerance=1e-4)
Approximate memory requirement for simulation...
pumapy.material_properties.tortuosity.divide_zero(x, y)[source]

pumapy.material_properties.volume_fraction

class pumapy.material_properties.volume_fraction.VolumeFraction(workspace, cutoff, display)[source]

Bases: object

compute()[source]
error_check()[source]
log_input()[source]
log_output()[source]
pumapy.material_properties.volume_fraction.compute_volume_fraction(workspace, cutoff, display=True)[source]

Compute the volume fraction

Parameters
  • workspace (pumapy.Workspace or np.ndarray) – domain

  • cutoff ((int, int)) – to binarize domain

  • display (bool) – print result

Returns

volume fraction

Return type

float

Example

>>> import pumapy as puma
>>> ws = puma.import_3Dtiff(puma.path_to_example_file("100_fiberform.tif"), 1.3e-6) # import example file
Importing ...
>>> vf = puma.compute_volume_fraction(ws, cutoff=(90, 255)) # compute volume fraction
Volume Fraction for cutoff ...