pyxem / orix

Analysing crystal orientations and symmetry in Python
https://orix.readthedocs.io
GNU General Public License v3.0
78 stars 45 forks source link

Questions about definition and sources for FundamentalRegion #466

Closed argerlt closed 7 months ago

argerlt commented 7 months ago

Could someone involved in the writing of OrientationRegion (ideally @harripj or @bm424, since they seemed to have written the code) explain what is being done exactly in the function orix.quaternion.orientation_region._get_large_cell_normals as well as orix.quaternion.OrientationRegion.from_symmetry? here is a link. More importantly, can they link to any sources they used in creating this method for defining the fundamental zone?

I am in a discussion with colleagues about consistent definitions for the fundamental zone of misorientation spaces, and in all my tests, ORIX's definition seems to handle all the edge cases well and in a self-consistent fashion. The image below is a good example, where the FZ($D_2$) for an orientation is plotted along with the FZ($D_2$, $D_2$) for a misorientation. It shows off the distinction between the two, and makes obvious how of the 4 equivalent misorientations that fall in the larger orientation FZ, only one falls into the misorientation FZ (ie, the disorientation)

image

However, to quote Robert Krakow in his paper "On three-dimensional misorientation spaces "The particular fundamental zone obtained depends on the alignment of axes and the order in which symmetry operators are combined for misorientations". The Fundamental zone defined by Orix is not necessarily a unique choice, and clarification on how it was chosen would be greatly appreciated. Figure 16 of the same paper gives an excellent example of the consequences of inconsistent application.

I THINK because of how get_distinguished_points is defined on line 709:

     distinguished_points = s1.outer(s2).antipodal.unique(antipodal=False)

Your definition is identical to the "precipitation logic" Krakow et. al. describe in Appendix B, but I am not positive.

Thanks in advance for any help.

bm424 commented 7 months ago

Hi @argerlt - it's been a while since I looked at this, and the code has moved on quite a lot since I worked on it, so it's probably worth double-checking anything I say here.

Most of the groundwork for the implementation in orix comes from MTEX (link to orientation region code) and based on theory from Orientations and Rotations (Morawiec 2004), and you're right to have identified that this code about misorientations was building on Robert's paper.

Back when I was working on this, I remember spending a lot of time staring confusedly at stereographic projections of symmetries and I think I eventually convinced myself that the fundamental sector that one would pick "by eye" was kind of inconsistent, and I couldn't come up with a maths-y way of generating the "right-looking" sector. I ended up creating more of a procedural approach, basically working out which 1, 2, or 3 planes were needed to cut up the larger zone based on observation. The code for this is here and I wrote down the approach in my thesis. (link here - see section 5.3 and page 135).

I appreciate my old explanations aren't super clear (not least to me :P), happy to discuss it further.

argerlt commented 7 months ago

@bm424 Thanks, this comment and your theses were helpful, and I think I understand what is happening now.

I would like to add some documentation for these functions in the near future. I believe the choices made as part of this function affect how a "disorientation" is defined, i.e. what ORIX calculates using transform_to_fundamental_zone. Specifically, I believe the choice of how mirrors and inversions are handled can be up to interpretation. This implementation is great in that it ensures ORIX always produces self-consistent FZ, but its not clear what assumptions are made and how they relate to, say, equivalent assumptions in MTEX or OIM.

For now I think this issue can be closed. thanks again for the help, I learned a lot!