dkriegner / xrayutilities

xrayutilities - a package with useful scripts for X-ray diffraction physicists
http://xrayutilities.sourceforge.io
GNU General Public License v2.0
81 stars 29 forks source link

Stacking orientation of non-cubic layers #170

Open rugfri opened 1 year ago

rugfri commented 1 year ago

Dear Dominik,

I would like to create a stack where a layer with tetragonal symmetry is on a cubic substrate. My understanding is that the layer is stacked with the 001 direction perpendicular to the surface. Is this correct? If yes, is there a way to change this and how? And, a bit more elaborated, would also be possible to fix the orientation of the layer in-plane axes?

Further, possibly tricky (?), if the 100 direction is perpendicular to the surface, the --equivalent-- 010 in-plane axis may have different length compared to the 100. How to implement this? As I understand xrayutilities obviously expects only "a"-axis and not "b" for TET symmetry.

Thanks! Ruggero

dkriegner commented 1 year ago

Hi, at the moment these possibilities are indeed a bit limited. There exist only PseudomorphicStack001 and PseudomorphicStack111 for 001 and 111 oriented initially cubic materials.

But the general question is with what aim you want to produce such a stack? Be aware that many of the simulation models impose some limitations on the layer stacks. So if you want to simulate lets say radial scans be sure to check the requirements of the model you use.

In general tetragonal materials on cubic substrate might still work in case the square base of the tetragonal system is on the 001 cubic surface. I did not test PseudomorphicMaterial for this case but I imagine it could work. This needs to be tested.

For all other combinations and in particular if you want to impose some strain I think you need to generate the stacks manually (maybe ApplyStrain can help). The problem then simply is that the code automatically can't know what matching conditions it should apply. In that sense also the inplane direction currently in the code can't be specified since it does not play a particular role. If you specify more precisely the aim what you want to achieve I can maybe give more hints.

Regarding the second question: If a material is tetragonal by definition it has only free "a" and "c" parameters. If you want to lower the symmetry of a material convert the material to P1 space group.

This can be done for example like this:

import xrayutilities as xu
Si = xu.materials.Si
SiP1 = xu.materials.Crystal("SiP1", Si.lattice.convert_to_P1())

Then all unit cell parameters can be changed independently.

rugfri commented 1 year ago

Hi, thanks for the reply. In a first instance, my goal is to simulate radial scans of a stack where a layer with tetragonal symmetry is on a cubic substrate. And compare the cases where the layer orientation changes, that is when the tet c-axis is perpendicular/parallel to the substrate surface.

dkriegner commented 1 year ago

From your reply I understand you want to calculate long symmetric radial scans. In this case the inplane orientation does not matter. Also I guess in a first place you will want to ignore any strain.

For this type of calculations I think only the xu.simpack.KinematicalMultiBeamModel model is appropriate since all other models only calculate the vicinity of a specific Bragg peak. This model however needs 001 surface. So for this to work you have to define the tetragonal cell in a way that 001 always corresponds to the out of plane direction. This can of course be done so the 001 corresponds to any of your tetragonal axis.

So I believe this works if you define the materials manually using space group 1:

xu.materials.Crystal("name", xu.materials.SGLattice(1, ....))

Also consider looking at this example https://xrayutilities.sourceforge.io/examples.html#visualization-of-the-bragg-peaks-in-a-reciprocal-space-plane which visualizes reciprocal space planes (Bragg peak positions) and works for any material combination/orientation.

rugfri commented 10 months ago

Thanks, form the ApplyStrain documentation, no elastic response is considered thus no strain broadening is generated. What would be a good way to introduce the effect in a layer? Should one follow the idea of the graded multilayer (that is currently implemented for composition gradients) and generate a stack of (many) layers with slightly different lattice parameter? (maybe there is a risk of being computationally inefficient?) Or is there a better way? Thanks

dkriegner commented 10 months ago

I feel there is a misunderstanding about ApplyStrain. This function is only used to transform a unit cell. Therefore if (or if not) one considers there the elastic response of the material has nothing to do with strain broadening since the applied strain is applied to the full material in a homogeneous fashion.

Strain broadening can only result from inhomogeneous strain distributions. Therefore, yes one option is to use a graded multilayer with varying properties. It is certainly computationally demanding but in the radial scans I do not see another option at the moment. Generally all this simulation code is well applicable only for near perfect crystalline cases. In case of inhomogeneities/imperfections one has to apply some tricks. One thing one likely should also not ignore that the code performs all calculation for one coherently illuminated layer stack. So the multilayer approach above with different properties can for example not describe a lateral variation of properties. This can get important since lateral inhomogeneities might need to be summed up incoherently (sum/averaging intensities). Such scenarios are maybe better mimicked by performing various simulations with varying properties and averaging the resulting intensities.

I do this for example regulary to mimick variations in film thickness. It might be also appropriate to mimic strain broadening.

rugfri commented 7 months ago

From your reply I understand you want to calculate long symmetric radial scans. In this case the inplane orientation does not matter. Also I guess in a first place you will want to ignore any strain.

For this type of calculations I think only the xu.simpack.KinematicalMultiBeamModel model is appropriate since all other models only calculate the vicinity of a specific Bragg peak. This model however needs 001 surface. So for this to work you have to define the tetragonal cell in a way that 001 always corresponds to the out of plane direction. This can of course be done so the 001 corresponds to any of your tetragonal axis.

So I believe this works if you define the materials manually using space group 1:

xu.materials.Crystal("name", xu.materials.SGLattice(1, ....))

Also consider looking at this example https://xrayutilities.sourceforge.io/examples.html#visualization-of-the-bragg-peaks-in-a-reciprocal-space-plane which visualizes reciprocal space planes (Bragg peak positions) and works for any material combination/orientation.

Thanks, I have tried to follow your suggestion creating the material as P1, and from this the layer and the stack. But when I try to calculate the intensity I get this error. 'SGLattice' object has no attribute 'chi0'

Could you please show how to proceed in this case, maybe using the case of BaTiO3. That is building a layer BaTiO3 layer with the a-axis along the surface normal of the stack?

Thank you!

dkriegner commented 7 months ago

From the error you list I assume you are using an SGLattice object where a Crystal object should be used. Please try it with a Crystal object. Provide a minimal example which does not work for you in case you want me to fix any code.

rugfri commented 7 months ago

Thank you. Sorry, I missed that.