Skip to content

Add orientation distribution function estimation #113

@adigitoleo

Description

@adigitoleo

A common texture diagnostic in the literature is the orientation distribution function, which is required e.g. for the "texture index" (J-index) calculation, and also would give nicer pole figure contours. It is possible to calculate both a discrete ODF (histogram in SO(3)) and a continuous version. The continuous one is based on the discrete one.

Discrete ODF

  • Ensure statistically sound number of orientations (at least a couple of hundred?)
  • Set up grid of equidistant reference points in SO(3)
  • Get distances from each orientation to each reference point, complexity O(n_grains x n_points)
  • Assign each orientation to the nearest reference point
  • Return counts of orientations on the SO(3) grid

We can get a good uniform grid on SO(3) by Hopf fibration, it's basically combining even samples on a circle with samples from a disk (could even try geometry.shirley_concentric_squaredisk to get the S2 sampling). Depending on the grid resolution we could have some reference points counting zero nearby orientations, maybe we need to re-bin the output.

Continuous ODF
This is where it gets interesting. It seems like there are two options: 1) use spherical harmonics, 2) use other kernel functions like Gaussians. The spherical harmonics method seems ot be preferred, the original form comes from Bunge 1982 "Texture analysis in materials science", Butterworths. Recently there was some clarification about whether we should use even terms in the harmonic expansion, see 8.5 in Man 2023 "Crystallographic texture and group representations", Springer. It gets more complicated if we want to take into account crystallite symmetry (which is recommended) because we need to "symmetrise" the spherical harmonics.

Either way, we need to estimate the harmonics coefficients:

  • Choose a maximum term L (e.g. L=22) to truncate the infinite series. Kind of arbitrary, but might have some relation to the symmetry? Probably expose this as an API parameter.
  • Estimate coefficients using something like 8.44 from Man 2023. Seems like in the simplest form it has complexity O(n_grains x L).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions