Dear all.
I am currently trying to find the shortest interatomic distance in a cell.
This is because we are trying to predict the electrical properties of metals and crystals from that value (although there are others).
I think sample file of Materials Script(ex. CalcUniqueBondLengthAngles.pl), but this code wasn't helpful as it's supposed to contain join information(use "collection = source->Bonds").
How to calculate the minimum distance between atom(Atoms Distance under fig.)??
Thank You!
PS(2020/12/01).
I write this code.
This code's flow is
"select two atoms -> calculate distance -> remove Duplicate value"
However, this code is heavy because it calculates (ex. A_B and B_A) for all combinations.
Can you give me some advice on how to improve this code and make it lighter?
#!perl
use strict;
use warnings;
use MaterialsScript qw(:all);
use Math::Trig;
sub Length {
my (\\\$atom1, \\\$atom2) = @_;
return sqrt((\\\$atom1->X - \\\$atom2->X)**2 + (\\\$atom1->Y - \\\$atom2->Y)**2 + (\\\$atom1->Z - \\\$atom2->Z)**2);
}
my \\\$doc = \\\$Documents{"urea.xsd"};
my \\\$atoms = \\\$doc->AsymmetricUnit->Atoms;
my (\\\$name1, \\\$name2, \\\$length, @lengths);
for (my \\\$i=0; \\\$i<\\\$atoms->Count; ++\\\$i) {
my \\\$atom1 = \\\$doc->AsymmetricUnit->Atoms(\\\$i);
for (my \\\$j=0; \\\$j<\\\$atoms->Count; ++\\\$j) {
my \\\$atom2 = \\\$doc->AsymmetricUnit->Atoms(\\\$j);
if (\\\$atom1->X == \\\$atom2->X and \\\$atom1->Y == \\\$atom2->Y and \\\$atom1->Z == \\\$atom2->Z){
next;
}
\\\$length = Length(\\\$atom1, \\\$atom2);
push(@lengths, \\\$length);
}
}
my %uniq = map {\\\$_ => 1} @lengths;
my @uniq_lengths = keys %uniq;
@uniq_lengths = sort{\\\$a <=> \\\$b} @uniq_lengths;
print "first min ".\\\$uniq_lengths[0]."\\n";
print "secound min ".\\\$uniq_lengths[1]."\\n";
print "therd min ".\\\$uniq_lengths[2]."\\n";