Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Xtof

Pages: [1] 2
1
Hi Alex and Ovito users,

Recently I started working with the DXA modifier of Ovito to determine the Burguers vector of Dislocation Loops (DL) in Fe. I succeeded to define interstitial 1/2<111> and <100> DL with LAMMPS. Ovito identified well their Burguers vector in both cases.
Then, I tried to do the same with vacancy DLs. In the case of a vacancy <100> DL (89 sites), I just removed the atoms and equilibrated the system in LAMMPS. In this case, Ovito was not able to identify a dislocation segment.

Any idea why this occurs? Is it due to a limitation of Ovito in this particular case or could it be due to a wrong description of these objects by MD (wrong potential)?

Many thanks in advance and best regards,
Christophe

2
Dear Alex and OVITO users,

I managed to write, on the one hand, a Python script to analyse clusters with the Wigner-Seitz modifier, and, on the other hand, a Python script to analyse dislocations with the DXA modifier.
Both scripts work well separately.
With the first one, I get the size, nature (SIA or V) and coordinates of clusters. With the second one, I am able to determine, when clusters are sufficiently large, their Burgers vector. For n>=7 (in bcc Fe) the DXA modifier identifies very well 1/2<111> dislocation loops.
Now, what I would like to do is, when a cluster is sufficiently large and a dislocation loop is identified, correlate the Burgers vector given by the DXA modifier with the corresponding information obtained with the WS modifier in order to store in a file, the size of the cluster, its nature (SIA or V), its coordinates and its Burgers vector.

How to correlate the information obtained with the WS modifier with that obtained with the DXA modifier? Any idea how to do that?

Many thanks in advance and best regards,
Christophe

3
Support Forum / Identification of Burgers vector of defects
« on: March 05, 2018, 09:39:50 AM »
Dear Alex and OVITO users,

Under collision cascade, sometimes, relatively large clusters of defects can form. In particular, Dislocation Loops.

I would like to determine their Burgers vector. Is it possible with the Dislocation Analysis modifier? If so, I would like to know if it is possible to distinguish between defects with a Burgers vector <111> from those with a Burgers vector <-1 1 1>.

With best regards,
Christophe

4
Dear Alex and OVITO users,

I wrote a script to identify defects in SiC after cascade. I use the WS modifier with the per_type_occupancies option.
I developed the script on my PC (i7 proc, Ubuntu 14.04) with the version dev105 and it works well. Then, I wanted to run it on the HPC Marconi where I have all the data and surprisingly, it does not work. It throws a Segmentation fault. I tried with different versions (dev52, dev105, dev115) and same thing. It is the first time that such problem occurs.
The nodes on the HPC Marconi are 2 x 24-cores Intel Xeon 8160 CPU (Skylake) at 2.10 GHz.

Best regards,
Christophe

5
Dear Alex and OVITO users,

I am trying to determine defects (including antisites) in a binary system such as SiC.
Using the SelectExpressionModifier, it works well.
For instance, to determine the number of Si vacancies (type=1) I proceed as follows:


Code: [Select]

    node = import_file(file_coord_final)
   
    # Construct the modifier for Wigner Seitz analysis of SIA and V
    ws_mod = WignerSeitzAnalysisModifier(eliminate_cell_deformation = True)

    # Load the reference crystal   
    ws_mod.reference.load(file_coord_init)
   
    # Add the modifier to the modification pipeline
    node.modifiers.append(ws_mod)

# Select vacancies of type Si (type=1)
    select_vacancies_mod = SelectExpressionModifier(expression = 'Occupancy == 0 && ParticleType == 1')
    node.modifiers.append(select_vacancies_mod)
   
   
    node.compute()



This works fine and for a given cascade I obtain 31 Si vacancies.

Now, I wish to determine antisites, i.e., Si atoms that are in C vacancies and vice-versa. To do so, I took the example given in OVITO website on a binary system (https://ovito.org/manual/python/modules/ovito_modifiers.html#ovito.modifiers.WignerSeitzAnalysisModifier).
Following this example, I simply extended my script to take into account the occupancy number per particle type.

The resulting script is similar to the previous one, except that the WS modifier takes into account the occupancy number per particle type. Also, in the SelectExpressionModifier, one has to take into account that Occupancy has now 2 components. If for instance, I want to select Si vacancies (type 1), I do the following:

Code: [Select]

...
    ws_mod = WignerSeitzAnalysisModifier(per_type_occupancies = True, eliminate_cell_deformation = True)
...

# Select vacancies of type Si (type=1)
    select_vacancies_mod = SelectExpressionModifier(expression = 'Occupancy.1 == 0 && ParticleType == 1')
    node.modifiers.append(select_vacancies_mod)
   

    node.compute()



This works. However, this time, I get 49 Si vacancies.
Clearly, there is something that I am doing wrong.


I also find a problem with determining the SIA of Si type when I use Occupancy.x. I use the following SelectExpressionModifier to find Si SIAs:


Code: [Select]

    select_SIA_mod = SelectExpressionModifier(expression = 'Occupancy.1 == 2 && ParticleType == 1')


The number of Si SIA I obtain this way is too small and clearly not correct.

Do I use correctly Occupancy.1 in the SelectExpressionModifier?

Any help is appreciated.
Many thanks in advance and best regards,
Christophe

6
Dear Alex and OVITO users,

After a cascade in SiC, I am trying to determine the number of SIAs of type Si (type 1) and those of type C (type 2).
To do so, I started from an ovitos script that was working fine for the Fe case and slightly modified it, changing the selection expression.
To select interstitials of type Si (1) this is what I did:

Code: [Select]

# import the cascade file
node = import_file(file_coord_final)
   
# Construct the modifier for Wigner Seitz analysis of SIA and V
ws_mod = WignerSeitzAnalysisModifier(eliminate_cell_deformation = True)

# Load the reference crystal   
ws_mod.reference.load(file_coord_init)
   
# Add the modifier to the modification pipeline
node.modifiers.append(ws_mod)

node.compute()


# Selection of interstitials of type Si (occupancy >=2, particle type = 1)
select_SIA_mod = SelectExpressionModifier(expression = 'Occupancy == 2 && Particle Type == 1')
node.modifiers.append(select_SIA_mod)
   
node.compute()



All this works but does not return the expected result. The total number of SIAs is 112. I checked it with the OVITO GUI. The number of SIAs of type Si is equal to 51. However, the script returns 112, that is, the total number of SIAs. It seems the condition 'Particle Type == 1' is not taken into account. But likely, I did something wrong.

Could you please give me a hand?

Many thanks in advance and best regards,
Christophe

7
Support Forum / Question about rendering viewport
« on: February 08, 2018, 09:40:25 AM »
Dear Alex and OVITO users,

I am trying to produce a picture of a collision cascade for an article (see attachment). The frame appears in blue but I would like to have it in black. Is it possible? I do not find the option in the rendering panel where to tune this.

Many thanks in advance and best regards,
Christophe

8
Hi all,

A few months ago I wrote a Python script to analyse defects that form during cascades (with the WS analyser). I used it many times and it works fine.
However, yesterday it crashed with the following error message:

ERROR: LAMMPS dump file parsing error. Invalid number of atoms in line 4:
1002514050

ERROR: The Python script 'loop_script_ovito_analysis_good_cascades.py' has exited with an error.
Traceback (most recent call last):
  File "loop_script_ovito_analysis_good_cascades.py", line 77, in <module>
    node = import_file(file_coord_final)
  File "/marconi/home/userexternal/cortiz00/ovito-2.8.0-x86_64/lib/ovito/plugins/python/ovito/io/__init__.py", line 117, in import_file
    if not node.wait(signalError = True):
  File "/marconi/home/userexternal/cortiz00/ovito-2.8.0-x86_64/lib/ovito/plugins/python/ovito/__init__.py", line 160, in _ObjectNode_wait
    raise RuntimeError("Data pipeline evaluation failed with the following error: %s" % state.status.text)
RuntimeError: Data pipeline evaluation failed with the following error: LAMMPS dump file parsing error. Invalid number of atoms in line 4:
1002514050

Is it due to a too large number of atoms in the box (~ 1000 millions)? Is there a limit to the number of atoms in ovitos?


Many thanks in advance and best regards,
Christophe

9
Dear OVITO users,

I am trying to visualise defects that form during a cascade using their occupancy (CoordinationAnalysis Modifier) and their potential energy.
With LAMMPS, I dumped in a file coordinates and potential energy of atoms.
Then, in OVITO (GUI), I am trying to discard some atoms by combining their occupancy and the potential energy with SelectExpression Modifier.
However, it is not possible to define an expression with the potential energy and the occupancy. Either the potential energy appears in the list of possible variables, or occupancy. Both at the same time is not possible.

Is it a bug?

With best regards,
Christophe

10
Support Forum / Time (ps) of each frame in a movie
« on: June 01, 2017, 01:38:37 PM »
Dear all,

I generated a movie of how SIA and V form during a cascade (WS + CoordinationNumber modifiers) using a dump file obtained with LAMMPS.
Is there a way to print the time (in ps) at each frame?

Best regards,
Christophe

11
Support Forum / Problem with render of viewport
« on: May 23, 2017, 04:32:59 PM »
Dear all,

I am trying to export a figure of the active viewport where there are some interstitials and vacancies (with different colours) in a crystal after a collision cascade. However, the picture that I get looses all colours (see attachment). It gets all black and white.
Is there a way to get in the picture exactly the same thing as in the active viewport (including colours)?

Many thanks in advance and best regards,
Christophe

12
Hi all,

I am trying to identify interstitials and vacancies after a collision cascade in Fe. This is done with LAMMPS code. A projectile hits an open surface with a kinetic energy of 10 keV and the evolution of the system is followed during approx 30 ps.
I have implemented a script with the Wigner-Seitz modifier to identify SIA and V, it works well.
However, I observed that in some cases, the number of vacancies or interstitials is extremely high, very far from the expected mean. For instance, if I expect in average 100 SIA to form, the script gives me 3000. After digging a bit, I found that this happens because in some cases, the WS modifier interprets one of the surfaces as made of V and the one in front as SIA (see picture attached).
I thus have to remove these surface atoms from the WS analysis.
After discussing it with Alex in a previous post, he recommended identifying surface atoms with the CoordinationNumber modifier. In BCC crystal like Fe, the coordination number of atoms in bulk is 8. Thus, surface atoms should have a lower coordination number.
Using the CoordinationNumber modifier I can indeed identify surface atoms. With 'Coordination == 4' in the SelectExpression modifier I can isolate atoms from both surfaces that induce wrong results. However, I found that some of the defects also have a CN=4. Thus, if I remove atoms from the surface by selecting them with 'Coordination == 4' I also remove some of the "real" defects.

Why WS interprets surface atoms as defects? To answer this question, the only idea I can think of is that during the evolution of the system, the system expands a little bit since the surface is open and the temperature increases. Thus, when the WS modifier tries to identify SIA and V by comparing the reference crystal and the crystal with defects, it sees that the surface atoms have moved and interprets they are defects. Does it make sense?

How can I separate real defects from surface atoms without removing "real" defects with the CN? Any idea?


Many thanks in advance for any help.
Best regards,
Christophe

13
Hi all,

I am analysing the defects produced by a cascade in Fe obtained with LAMMPS. The crystal has an open surface and the Fe projectile comes from outside with E=10 keV.
As a result, some atoms are sputtered from the surface.
Using the Ovito GUI, according to the Wigner-Seitz modifier, there are 205 V and 178 SIA. I obtained the same thing with ovitos script that I wrote some time ago. The number of V and SIA are different as expected since some atoms are sputtered and some end up as adatom and cannot recombine with vacancies. No surprise here from the physical point of view.

However, I tried to understand more into detail what's going on using the occupancy boolean and the expression select modifier.
Occupancy == 0 (vacancies) produces 205. This correct.
Occupancy > 1 (in principle SIA) produces 109 and not 178 as given by the Wigner-Seitz modifier.

Where could the difference come from? Which is the correct result? Could there be a problem of interpretation by modifiers due to the fact that the total number of atoms in the reference crystal is not the same than the one in the final crystal (after cascade) due to the sputtering of some atoms?

With best regards,
Christophe

14
Dear all,

I wrote a Python script with OVITO to identify vacancy and interstitial clusters after a cascade. I use WignerSeitzModifier, SelectExpressionModifier and ClusterAnalysisModifier. It works well.
I also succeeded to define a custom modifier to calculate the fraction of vacancies and interstitials in clusters and put the results as new attributes. This also works well.
Now, I would like to modify with a custom modifier the results of the ClusterAnalysisModifier. Indeed, I found out that after selection of vacancies, the result of ClusterAnalysisModifier, which is an array of IDs of clusters to which particles have been assigned include, includes particles that have not been selected (ID=0):

Code: [Select]

# Selection of vacancies
select_vacancies_mod = SelectExpressionModifier(expression = 'Occupancy == 0')
node.modifiers.append(select_vacancies_mod)

# Calculate clusters of vacancies
cluster_vacancies_mod = ClusterAnalysisModifier(cutoff = 2.86, sort_by_size = True, only_selected = True)
node.modifiers.append(cluster_vacancies_mod)

node.compute()

node.output.particle_properties['Cluster'].array
>>>[0 0 0 0...0...]


As a result, when one uses numpy.bincount(node.output.particle_properties['Cluster'].array) to determine the different sizes of the clusters, one get one very large cluster made of all atoms that were not selected (with cluster ID = 0).

Therefore, I would like to automatically eliminate these from node.output.particle_properties['Cluster'].array. Of course, I could do this easily with Python but I would like to do it in the OVITO fashion, with a custom modifier and modify the particle_properties['Cluster'] in the pipeline.



I tried the following custom modifier, but it sends an error: ValueError: Assignment to the 'marray' property is restricted. Left and right-hand side must be identical.

Code: [Select]

def ClusterVacanciesModifier(frame, input, output):

# Import the array of id of clusters to which particles are assigned to
    cluster_ID = input.particle_properties['Cluster'].array

    cluster_property = output.copy_if_needed(output.particle_properties['Cluster'])

    cluster_ID = cluster_ID[cluster_ID > 0]

    cluster_property.marray = cluster_ID



I guess I wrongly used or defined cluster_property. Should I use instead or in addition output.create_particle_property(ParticleProperty.Type.Cluster) ?

Many thanks in advance and best regards,
Christophe

15
Dear all,

I wrote a Python script to determine from a LAMMPS dump file where interstitials and vacancies are:

Code: [Select]
# import the cascade file
node = import_file("cascade_MD.xyz")

# Construct the modifier for Wigner Seitz analysis of SIA and V
modws = WignerSeitzAnalysisModifier(eliminate_cell_deformation = True)
modws.reference.load("crystal_eq.xyz")

# Add the modifier to the modification pipeline
node.modifiers.append(modws)

# Performs computation
output = node.compute()


It works well. I get 41 SIA and V.
Now, I would like to determine how vacancies are clustered. My idea is to select from all atoms, those that have an occupancy = 0 (definition of vac). I thus used the SelectExpressionModifier as follows:

Code: [Select]
mod2 = SelectExpressionModifier(expression = 'Occupancy == 0')
node.modifiers.append(mod2)

selection_vacancies = node.compute()

However, when I check the number of particles in selection_vacancies (selection_vacancies.number_of_particles) I find that all atoms from the initial data file are there, whereas I expected that only vacancies would be selected. But if I check selection_vacancies.attributes['SelectExpression.num_selected'], I get the right number of vacancies. I guess there is something I misunderstood.

How can I isolate vacancies and use them with ClusterAnalysisModifier ?

A possible solution I guess would be to select particles with occupancy > 0 (others than vacancies) and delete them with the DeleteSelectedParticleModifier. Is that correct ? If so, how then could I reverse it and select only interstitials and do the same exercice if they are already deleted ?

Many thanks in advance for any suggestion.
Christophe

Pages: [1] 2