Relations…
January 15, 2014 Posted by Emre S. Tasci
Recently, we needed to schematize the relations between the coefficients of a symmetric tensor matrix such that, beyond the tedious numerical values, the basic relations such as equivalency or (-1) times would be visible to the eye.
Consider the following 16×16 matrix:
0.06483 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.65809 0.65809 0.60365 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10993 0.00000 0.00000 0.37862 0.37862 0.00000 0.00000 0.00000 0.00000 0.86568 0.00000 0.00000 0.42424 0.00000 0.00000 0.00000 0.00000 0.10993 0.00000 0.00000 0.12949 0.00000 0.00000 0.00000 0.00000 0.00000 -0.86568 0.00000 0.00000 0.42424 0.00000 0.00000 0.00000 0.00000 0.10259 0.00000 0.00000 0.84469 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.73695 0.00000 0.37862 0.00000 0.00000 0.01584 0.00000 0.00000 0.00000 0.00000 0.00000 0.84812 0.00000 0.00000 0.87983 0.00000 0.00000 0.00000 0.37862 0.12949 0.00000 0.00000 0.01584 0.00000 0.00000 0.00000 0.00000 0.00000 -0.84812 0.00000 0.00000 0.87983 0.00000 0.00000 0.00000 0.00000 0.84469 0.00000 0.00000 0.01168 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.87050 0.65809 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.88440 0.28986 0.45572 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.65809 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.28986 0.88440 0.45572 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.60365 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.45572 0.45572 0.89801 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.86568 0.00000 0.00000 0.84812 0.00000 0.00000 0.00000 0.00000 0.00000 0.35993 0.00000 0.00000 0.19336 0.00000 0.00000 0.00000 0.00000 -0.86568 0.00000 0.00000 -0.84812 0.00000 0.00000 0.00000 0.00000 0.00000 0.35993 0.00000 0.62239 -0.62239 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 1.18908 0.00000 0.00000 0.00000 0.00000 0.42424 0.00000 0.00000 0.87983 0.00000 0.00000 0.00000 0.00000 0.00000 0.19336 0.62239 0.00000 0.54930 0.00000 0.00000 0.00000 0.00000 0.42424 0.00000 0.00000 0.87983 0.00000 0.00000 0.00000 0.00000 0.00000 -0.62239 0.00000 0.00000 0.54930 0.00000 0.00000 0.00000 0.00000 0.73695 0.00000 0.00000 0.87050 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.55094
if you really want to, you can verify that its coefficients satisfy the following properties:
Non-zero Elements:
(1,1), (1,8), (1,9), (1,10),
(2,2), (2,5), (2,6), (2,11), (2,14),
(3,3), (3,6), (3,12), (3,15),
(4,4), (4,7), (4,16),
(5,5), (5,11), (5,14),
(6,6), (6,12), (6,15),
(7,7), (7,16),
(8,8), (8,9), (8,10),
(9,9), (9,10),
(10,10),
(11,11), (11,14),
(12,12), (12,14), (12,15),
(13,13), (14,14), (15,15),
(16,16)
Equality relations:
(1,9) = (1,8)
(3,3) = (2,2)
(2,6) = (2,5)
(3,12) = -(2,11)
(3,15) = (2,14)
(6,6) = (5,5)
(6,12) = -(5,11)
(6,15) = (5,14)
(9,9) = (8,8)
(9,10) = (8,10)
(12,12) = (11,11)
(12,15) = -(12,14)
(15,15) = (14,14)
These kind of relations are sought upon tensor matrices (at least, in group theory 8), kind of postulating the imposed limits and… (have I said “relations”?). So, the sort-of-important-like thingy is to be able to spot them after evaluating some calculations in the computers.
Have you verified yet? Good! Now let’s take a look at this:
So, this is what we’ll be discussing in this post – preparation of such graphs. We’ll be using the PHP module Imagick for ImageMagick functions and objects. On Ubuntu, you can install the package from the command line as:
sudo apt-get install php5-imagick
(don’t forget to restart the http server if you’re working via a web interface instead of cli)
Before going further into the graph production, here is a description of producing a random matrix compatible with the given conditions in Octave:
Constructing a sample matrix in Octave
clear; # Declare the matrix T=[]; # == >> === non-zero coefficients ===== 0 ===== # I used the shorcuts and scripting of Vim to easily format the like lines.. non_zero_coeff = []; non_zero_coeff = [non_zero_coeff; 1 1]; non_zero_coeff = [non_zero_coeff; 1 8]; non_zero_coeff = [non_zero_coeff; 1 9]; non_zero_coeff = [non_zero_coeff; 1 10]; non_zero_coeff = [non_zero_coeff; 2 2]; non_zero_coeff = [non_zero_coeff; 2 5]; non_zero_coeff = [non_zero_coeff; 2 11]; non_zero_coeff = [non_zero_coeff; 2 14]; non_zero_coeff = [non_zero_coeff; 3 3]; non_zero_coeff = [non_zero_coeff; 3 6]; non_zero_coeff = [non_zero_coeff; 3 12]; non_zero_coeff = [non_zero_coeff; 3 15]; non_zero_coeff = [non_zero_coeff; 4 4]; non_zero_coeff = [non_zero_coeff; 4 7]; non_zero_coeff = [non_zero_coeff; 3 12]; non_zero_coeff = [non_zero_coeff; 4 16]; non_zero_coeff = [non_zero_coeff; 5 5]; non_zero_coeff = [non_zero_coeff; 5 11]; non_zero_coeff = [non_zero_coeff; 1 9]; non_zero_coeff = [non_zero_coeff; 5 14]; non_zero_coeff = [non_zero_coeff; 6 6]; non_zero_coeff = [non_zero_coeff; 6 12]; non_zero_coeff = [non_zero_coeff; 1 9]; non_zero_coeff = [non_zero_coeff; 6 15]; non_zero_coeff = [non_zero_coeff; 7 7]; non_zero_coeff = [non_zero_coeff; 7 16]; non_zero_coeff = [non_zero_coeff; 8 8]; non_zero_coeff = [non_zero_coeff; 8 9]; non_zero_coeff = [non_zero_coeff; 8 10]; non_zero_coeff = [non_zero_coeff; 6 15]; non_zero_coeff = [non_zero_coeff; 9 9]; non_zero_coeff = [non_zero_coeff; 9 10]; non_zero_coeff = [non_zero_coeff; 10 10]; non_zero_coeff = [non_zero_coeff; 11 11]; non_zero_coeff = [non_zero_coeff; 11 14]; non_zero_coeff = [non_zero_coeff; 12 12]; non_zero_coeff = [non_zero_coeff; 12 14]; non_zero_coeff = [non_zero_coeff; 13 13]; non_zero_coeff = [non_zero_coeff; 14 14]; non_zero_coeff = [non_zero_coeff; 15 15]; non_zero_coeff = [non_zero_coeff; 16 16]; # Assign random values to the non-zero coefficients: for i=1:rows(non_zero_coeff) T(non_zero_coeff(i,1),non_zero_coeff(i,2)) = rand; endfor # == << === non-zero coefficients ===== 1 ===== # == >> === Relations ===== 0 ===== T(1,9)=T(1,8); T(3,3)=T(2,2); T(2,6)=T(2,5); T(3,12)=-T(2,11); T(3,15)=T(2,14); T(6,6)=T(5,5); T(6,12)=-T(5,11); T(6,15)=T(5,14); T(9,9)=T(8,8); T(9,10)=T(8,10); T(12,12)=T(11,11); T(12,15)=-T(12,14); T(15,15)=T(14,14); # == << === Relations ===== 1 ===== # == >> === Symmetry ===== 0 ===== for i=1:rows(T) for j=i:columns(T) T(j,i) = T(i,j); endfor endfor # == << === Symmetry ===== 1 ===== # Export the matrix to a file: save("input.data.txt","T");
Finding out the relations between the coefficients
Doing a double loop over i=1:rows and j=i:cols, for each of the coefficients in and above the diagonal, taking one as reference (checking if abs(T(i,j))>0 and recording to an array, say “non-zero-coeff-array” if so) and then comparing it with the rest of the elements (that comes after it) with another double loop i2=i:rows and j2=j:cols. If T(i2,j2) is equal to +-T(i,j), we also note this (three values for each i2,j2 equivalency identification: i2,j2 and +/-1) in another array (say “equal-array”).
For example, according to our case the (9,9) element of the non-zero-coeff-array would be TRUE and the same element of the equal-array would be a sub-array holding the values (8,8,1).
Painting on a canvas
Once you have access to the ImageMagick library through Imagick, we can start “painting” a canvas by first defining the canvas (width, height and background color):
# Declare the object (/holder)
$image = new Imagick();
# Define the canvas (size 640x640 pixels with white background)
$image->newImage( 640, 640, new ImagickPixel( 'white' ) );
Let’s put a circle (filled, black) in the center with a radius of 30 pixels:
# Define the circle:
$circle = new ImagickDraw();
$circle->setFillColor("#000000");
$circle->circle(320,320,350,320);
# Add (/register) it to the canvas:
$image->drawImage($circle);
As for the production of the image file, we need to designate it as a PNG image and then export it to a file:
<code># Designate the image type as PNG:
$image->setImageFormat( "png" );
# Export (/write) it to a file "out.png":
$fp = fopen("out.png","w");
fwrite($fp,$image);
fclose($fp);
This is what you -should- get:
not bad for beginning, right? 😉
The circle function has 4 parameters: the (x,y) coordinates of the center and the coordinates of a point that is on the edge of the circle. Let’s draw another circle, this time an unfilled one below this filled one:
# Declare the object (/holder)
$image = new Imagick();
# Define the canvas (size 640x640 pixels with white background)
$image --->newImage( 640, 640, new ImagickPixel( 'white' ) );
# Define the 1st, filled circle:
$circle = new ImagickDraw();
$circle->setFillColor("#000000");
$circle->circle(320,320,350,320);
# Add (/register) it to the canvas:
$image->drawImage($circle);
# Define the 2nd, unfilled circle:
$circle = new ImagickDraw();
$circle->setStrokeColor("#000000");
$circle->setStrokeWidth(2);
$circle->setFillColor("none");
$circle->circle(320,350,350,350);
# Add (/register) it to the canvas:
$image->drawImage($circle);
# Designate the image type as PNG:
$image->setImageFormat( "png" );
# Export (/write) it to a file "out.png":
$fp = fopen("out.png","w");
fwrite($fp,$image);
fclose($fp);
The “stroke” methods are responsible for the perimeter and the fillcolor setting to “none” ensures that we have an otherwise invisible circle.
So far, so good.. Let’s add a line that passes between the circles from (120,50) to (520,50):
# Define the line:
$line = new ImagickDraw();
$line->setStrokeColor("#000000");
$line->setStrokeWidth(2);
$line->line(120,350,520,350);
$image->drawImage($line);
Mapping the rows and cols to x and y
Suppose that we have a 16×16 matrix to be mapped onto a 640×640 canvas. We could map (i=0,j=0) to (x=0,y=0) and (i=16,j=16) to (x=640,y=640) but it wouldn’t be right:
doesn’t look right, right? And here’s the code that produced it:
# Declare the object (/holder)
$image = new Imagick();
# Define the canvas (size 640x640 pixels with white background)
$image--->newImage( 640, 640, new ImagickPixel( 'white' ) );
# Define the 1st, filled circle:
$dxy = 640 / 16;
for($i=1;$i<=16;$i++)
{
for($j=1;$j<=16;$j++)
{
$circle = new ImagickDraw();
$circle->setFillColor("#000000");
$circle->circle($dxy*($j-1),$dxy*($i-1),$dxy*($j-1)+$dxy/6,$dxy*($i-1));
# Add (/register) it to the canvas:
$image->drawImage($circle);
}
}
# Designate the image type as PNG:
$image->setImageFormat( "png" );
# Export (/write) it to a file "out.png":
$fp = fopen("out.png","w");
fwrite($fp,$image);
fclose($fp);
What we need to do is to shift it half of the periodicity in the x & y directions:
That’s more like it — this shift was introduced to the code by changing the coordinate parameters of the circle(s):
$circle->circle($dxy*($j-1/2),$dxy*($i-1/2),$dxy*($j-1/2)+$dxy/6,$dxy*($i-1/2));
So, depending on the value (zero/non-zero) of an element of our tensor, we can put it as a big circle (r=$dxy/6) or a small one (r=$dxy/12). In addition, if it’s negative, we can have it drawn as an unfilled one (
$circle->setStrokeColor("#000000"); $circle->setStrokeWidth(2); $circle->setFillColor("none");
). We’re almost ready aside from the connecting the related entries!
Connecting the dots
Suppose that we’d like to connect the circles corresponding to the (i1,j1) and the (i2,j2) elements of the tensor. On the canvas, their centers will be given as ($dxy*($j1-1/2),$dxy*($i1-1/2)) and ($dxy*($j2-1/2),$dxy*($i2-1/2)) where $dxy is the conversion unit of 1 step in the row-col matrix to that of the canvas (for simplicity I assumed a square canvas which is not necessary — then we’d have a $dx=$width/$num_cols and a $dy=$height/$num_rows. Also note that the rows are associated with the height ($i <-> vertical) and the columns are with the width ($j <-> horizontal) (that’s why $j’s come before $i’s in the center equations).
So, let’s join (11,5) to (9,3): in a 640×640 canvas, (11,5) is centered at ((640/16)*(5-1/2) = 180, (640/16)*(11-1/2) = 420) and similarly (9,3) is centered at (100,340). Let’s put them on the map and connect their centers with a line:
# Declare the object (/holder)
$image = new Imagick();
# Define the canvas (size 640x640 pixels with white background)
$image->newImage( 640, 640, new ImagickPixel( 'white' ) );
$dxy = 640/16; # 40px
$radius = $dxy/6; #6.6667px
# Define the unfilled (11,5) circle:
$circle = new ImagickDraw();
$circle->setStrokeColor("#000000");
$circle->setStrokeWidth(2);
$circle->setFillColor("none");
$circle->circle(180,420,180+$radius,420);
# Add (/register) it to the canvas:
$image->drawImage($circle);
# Define the unfilled (9,3) circle:
$circle = new ImagickDraw();
$circle->setStrokeColor("#000000");
$circle->setStrokeWidth(2);
$circle->setFillColor("none");
$circle->circle(100,340,100+$radius,340);
# Add (/register) it to the canvas:
$image->drawImage($circle);
# Connect them with a line:
$line = new ImagickDraw();
$line->setStrokeColor("#000000");
$line->setStrokeWidth(2);
$line->line(180,420,100,340);
$image->drawImage($line);
# Designate the image type as PNG:
$image->setImageFormat( "png" );
# Export (/write) it to a file "out.png":
$fp = fopen("out.png","w");
fwrite($fp,$image);
fclose($fp);
Devil is in the details
By now, hopefully you’ve got the idea of how to swing things in your way. In my case, if I spent the 40% of the time doing the things I described, the remaining 60% went in adjusting the line such that it starts on the perimeter of the circle, not from the center of it, i.e.,
and this requires the determination of the angle of the line connecting our nodes. The angle of a line passing through two points (x1,y1) & (x2,y2) is given by: arctan[(y2-y1)/(x2-x1)], where the value is nothing but the A of the y=Ax+B line equation, and we need to translate the beginning and the final points of our line in this direction by an amount of a radius:
# Find the tangent of the line:
$tg = (340-420)/(100-180);
$alpha_radian = atan($tg);
$alpha_deg = $alpha_radian * 180 / M_PI;
# Connect them with a line:
$line = new ImagickDraw();
$line->setStrokeColor("#000000");
$line->setStrokeWidth(2);
$line->line(180-$radius*cos($alpha_radian),420-$radius*sin($alpha_radian),100+ $radius*cos($alpha_radian),340+$radius*sin($alpha_radian));
$image->drawImage($line);
and that’s more or less all about it!
One picture is worth a thousand words
You can have a sneak peak of the working code via here: http://144.122.31.125/cgi-bin/cryst/programs/tensor_graph/
Exploring through the paths of subgroups, collecting indexes on the way…
June 6, 2011 Posted by Emre S. Tasci
Having a personal wiki has its pros and cons with the pros being obvious but, on the other hand, one doesn’t feel like reposting what he has already committed into the corresponding wikipedia entry (and since reposting means filtering out the sensitive information and generalizing it, it is double the effort). So this fact, more or less, explains my absence of activity in this blog for the last 1.5 years. But then, there is one negative aspect of personal wikipedia “blogging” – it’s like putting everything under the rug : you classify the data/information and then you forget that it is there. That’s when “actual” blogging (like this one) comes handy. So, sorry & welcome back..
Today, I’ll present a code that I’ve just written to parse out the compatible paths from a tree. In my case, the three is the list of subgroups with indexes that one can acquire using Bilbao Crystallographic Server’s marvelous SUBGROUPGRAPH tool. For low indexes, you can already have SUBGROUPGRAPH do this for you by specifying your supergroup G, subgroup H and the index [G:H]. For example, for G=136, H=14 and [G:H] = 8, you can have the following paths drawn:
But as I said, things can get rough when you have a high index. In that case, we can (and we will) try to parse and analyze the paths tree which is outputted by SUBGROUPGRAPH when no index is designated, e.g., for G=136, H=14:
Where you see the maximal subgroups for the involved groups and their corresponding indexes. So, to go from P4_2/mnm (#136) to P2_1/c (#14) with index 8, we can follow the path:
P4_2/mnm (#136) –[2]–> Cmmm (#65) –[2]–> Pmna (#53) –[2]–> P2_1/c (#14)
with the related indexes given in the brackets totaling to 2x2x2 = 8.
The problem I had today was to find possible paths going from G=Fd-3m (#227) to H=Cc (#9) with index [G:H] = 192.
I first parsed the subgroup list into an array with their indexes, then followed the possible paths.
<?PHP
/* Emre S. Tasci <exxx.txxxx@ehu.es> *
* By parsing the possible subgroup paths obtained from
* SUBGROUPGRAPH, finds the paths that are compatible
* with the given terminal super & sub groups and the
* designated index.
*
* 06/06/11 */
# Input Data === 0 ====================================================
$start_sup = 227;
$crit_index = 192;
$end_sub = 9;
$arr = file("data.txt"); # A sample of data.txt for the case of #227->#9
# is included at the end of the code.
# Input Data === 1 ====================================================
$arr_subs = Array();
$arr_labels = Array();
foreach($arr as $line)
{
$auxarr = preg_split("/[ \t]+/",trim($line));
#echo $auxarr[2]."\n";
$sup = $auxarr[1];
$suplabel = $auxarr[2];
$arrsubs = split(";",$auxarr[3]);
$arr_labels[$sup] = $suplabel;
foreach($arrsubs as $subind)
{
$auxarr2 = Array();
preg_match("/([0-9]+)\[([0-9]+)\]/",$subind,$auxarr2);
#print_r($auxarr2);
$sub = $auxarr2[1];
$index = $auxarr2[2];
$arr_subs[$sup][$index][] = $sub;
}
}
#print_r($arr_subs);
# Start exploring
$start_sup = sprintf("%03d",$start_sup);
$end_sub = sprintf("%03d",$end_sub);
$arr_paths = Array();
$arr_paths[$start_sup] = 1;
findpath($start_sup);
function findpath($current_sup)
{
global $arr_paths,$arr_subs,$crit_index,$end_sub;
#echo "*".$current_sup."*\n";
if(strrpos($current_sup,"-") !== FALSE)
{
$current_sup_last_sup = substr($current_sup,strrpos($current_sup,"-")+1);
$current_sup_last_sup = substr($current_sup_last_sup,0,strpos($current_sup_last_sup,"["));
}
else
$current_sup_last_sup = $current_sup;
#echo "*".$current_sup_last_sup."*\n";
$subindexes = array_keys($arr_subs[$current_sup_last_sup]);
foreach($subindexes as $subindex)
{
$subs = $arr_subs[$current_sup_last_sup][$subindex];
echo $subindex.": ".join(",",$subs)."\n";
foreach($subs as $sub)
{
echo $current_sup."-".$sub."[".$subindex."]"."\n";
$arr_paths[$current_sup."-".$sub."[".$subindex."]"] = $arr_paths[$current_sup] * $subindex;
if($arr_paths[$current_sup."-".$sub."[".$subindex."]"]<$crit_index)
findpath($current_sup."-".$sub."[".$subindex."]");
elseif($arr_paths[$current_sup."-".$sub."[".$subindex."]"] == $crit_index && $sub == $end_sub)
echo "\nPath Found: ".$current_sup."-".$sub."[".$subindex."]"."\n\n";
}
}
#print_r($subindexes);
}
print_r($arr_paths);
/*
data.txt:
1 227 Fd-3m 141[3];166[4];203[2];216[2]
2 220 I-43d 122[3];161[4]
3 219 F-43c 120[3];161[4];218[4]
4 218 P-43n 112[3];161[4];220[4]
5 217 I-43m 121[3];160[4];215[2];218[2]
6 216 F-43m 119[3];160[4];215[4]
7 215 P-43m 111[3];160[4];216[2];217[4];219[2]
8 203 Fd-3 070[3]
9 167 R-3c 015[3];161[2];165[3];167[4];167[5];167[7]
10 166 R-3m 012[3];160[2];164[3];166[2];166[4];166[5];166[7];167[2]
11 165 P-3c1 015[3];158[2];163[3];165[3];165[4];165[5];165[7]
12 164 P-3m1 012[3];156[2];162[3];164[2];164[3];164[4];164[5];164[7];165[2]
13 163 P-31c 015[3];159[2];163[3];163[4];163[5];163[7];165[3];167[3]
14 162 P-31m 012[3];157[2];162[2];162[3];162[4];162[5];162[7];163[2];164[3];166[3]
15 161 R3c 009[3];158[3];161[4];161[5];161[7]
16 160 R3m 008[3];156[3];160[2];160[4];160[5];160[7];161[2]
17 159 P31c 009[3];158[3];159[3];159[4];159[5];159[7];161[3]
18 158 P3c1 009[3];158[3];158[4];158[5];158[7];159[3]
19 157 P31m 008[3];156[3];157[2];157[3];157[4];157[5];157[7];159[2];160[3]
20 156 P3m1 008[3];156[2];156[3];156[4];156[5];156[7];157[3];158[2]
21 141 I41/amd 070[2];074[2];088[2];109[2];119[2];122[2];141[3];141[5];141[7];141[9]
22 122 I-42d 043[2];122[3];122[5];122[7];122[9]
23 121 I-42m 042[2];111[2];112[2];113[2];114[2];121[3];121[5];121[7];121[9]
24 120 I-4c2 045[2];116[2];117[2];120[3];120[5];120[7];120[9]
25 119 I-4m2 044[2];115[2];118[2];119[3];119[5];119[7];119[9]
26 118 P-4n2 034[2];118[3];118[5];118[7];118[9];122[2]
27 117 P-4b2 032[2];117[2];117[3];117[5];117[7];117[9];118[2]
28 116 P-4c2 027[2];112[2];114[2];116[3];116[5];116[7];116[9]
29 115 P-4m2 025[2];111[2];113[2];115[2];115[3];115[5];115[7];115[9];116[2];121[2]
30 114 P-421c 037[2];114[3];114[5];114[7];114[9]
31 113 P-421m 035[2];113[2];113[3];113[5];113[7];113[9];114[2]
32 112 P-42c 037[2];112[3];112[5];112[7];112[9];116[2];118[2]
33 111 P-42m 035[2];111[2];111[3];111[5];111[7];111[9];112[2];115[2];117[2];119[2];120[2]
34 109 I41md 043[2];044[2];109[3];109[5];109[7];109[9]
35 088 I41/a 015[2];088[3];088[5];088[7];088[9]
36 074 Imma 012[2];015[2];044[2];046[2];051[2];052[2];053[2];062[2];074[3];074[5];074[7]
37 070 Fddd 015[2];043[2];070[3];070[5];070[7]
38 064 Cmce 012[2];014[2];015[2];036[2];039[2];041[2];053[2];054[2];055[2];056[2];057[2];060[2];061[2];062[2];064[3];064[5];064[7]
39 063 Cmcm 011[2];012[2];015[2];036[2];038[2];040[2];051[2];052[2];057[2];058[2];059[2];060[2];062[2];063[3];063[5];063[7]
40 062 Pnma 011[2];014[2];026[2];031[2];033[2];062[3];062[5];062[7]
41 061 Pbca 014[2];029[2];061[3];061[5];061[7]
42 060 Pbcn 013[2];014[2];029[2];030[2];033[2];060[3];060[5];060[7]
43 059 Pmmn 011[2];013[2];025[2];031[2];056[2];059[2];059[3];059[5];059[7];062[2]
44 058 Pnnm 010[2];014[2];031[2];034[2];058[3];058[5];058[7]
45 057 Pbcm 011[2];013[2];014[2];026[2];028[2];029[2];057[2];057[3];057[5];057[7];060[2];061[2];062[2]
46 056 Pccn 013[2];014[2];027[2];033[2];056[3];056[5];056[7]
47 055 Pbam 010[2];014[2];026[2];032[2];055[2];055[3];055[5];055[7];058[2];062[2]
48 054 Pcca 013[2];014[2];027[2];029[2];032[2];052[2];054[2];054[3];054[5];054[7];056[2];060[2]
49 053 Pmna 010[2];013[2];014[2];028[2];030[2];031[2];052[2];053[2];053[3];053[5];053[7];058[2];060[2]
50 052 Pnna 013[2];014[2];030[2];033[2];034[2];052[3];052[5];052[7]
51 051 Pmma 010[2];011[2];013[2];025[2];026[2];028[2];051[2];051[3];051[5];051[7];053[2];054[2];055[2];057[2];059[2];063[2];064[2]
52 046 Ima2 008[2];009[2];026[2];028[2];030[2];033[2];046[3];046[5];046[7]
53 045 Iba2 009[2];027[2];029[2];032[2];045[3];045[5];045[7]
54 044 Imm2 008[2];025[2];031[2];034[2];044[3];044[5];044[7]
55 043 Fdd2 009[2];043[3];043[5];043[7]
56 042 Fmm2 008[2];035[2];036[2];037[2];038[2];039[2];040[2];041[2];042[3];042[5];042[7]
57 041 Aea2 007[2];009[2];029[2];030[2];032[2];033[2];041[3];041[5];041[7]
58 040 Ama2 006[2];009[2];028[2];031[2];033[2];034[2];040[3];040[5];040[7]
59 039 Aem2 007[2];008[2];026[2];027[2];028[2];029[2];039[2];039[3];039[5];039[7];041[2];045[2];046[2]
60 038 Amm2 006[2];008[2];025[2];026[2];030[2];031[2];038[2];038[3];038[5];038[7];040[2];044[2];046[2]
61 037 Ccc2 009[2];027[2];030[2];034[2];037[3];037[5];037[7]
62 036 Cmc21 008[2];009[2];026[2];029[2];031[2];033[2];036[3];036[5];036[7]
63 035 Cmm2 008[2];025[2];028[2];032[2];035[2];035[3];035[5];035[7];036[2];037[2];044[2];045[2];046[2]
64 034 Pnn2 007[2];034[3];034[5];034[7];043[2]
65 033 Pna21 007[2];033[3];033[5];033[7]
66 032 Pba2 007[2];032[2];032[3];032[5];032[7];033[2];034[2]
67 031 Pmn21 006[2];007[2];031[2];031[3];031[5];031[7];033[2]
68 030 Pnc2 007[2];030[2];030[3];030[5];030[7];034[2]
69 029 Pca21 007[2];029[2];029[3];029[5];029[7];033[2]
70 028 Pma2 006[2];007[2];028[2];028[3];028[5];028[7];029[2];030[2];031[2];032[2];040[2];041[2]
71 027 Pcc2 007[2];027[2];027[3];027[5];027[7];030[2];037[2]
72 026 Pmc21 006[2];007[2];026[2];026[3];026[5];026[7];029[2];031[2];036[2]
73 025 Pmm2 006[2];025[2];025[3];025[5];025[7];026[2];027[2];028[2];035[2];038[2];039[2];042[2]
74 015 C2/c 009[2];013[2];014[2];015[3];015[5];015[7]
75 014 P21/c 007[2];014[2];014[3];014[5];014[7]
76 013 P2/c 007[2];013[2];013[3];013[5];013[7];014[2];015[2]
77 012 C2/m 008[2];010[2];011[2];012[2];012[3];012[5];012[7];013[2];014[2];015[2]
78 011 P21/m 006[2];011[2];011[3];011[5];011[7];014[2]
79 010 P2/m 006[2];010[2];010[3];010[5];010[7];011[2];012[2];013[2]
80 008 Cm 006[2];007[2];008[2];008[3];008[5];008[7];009[2]
81 007 Pc 007[2];007[3];007[5];007[7];009[2]
82 006 Pm 006[2];006[3];006[5];006[7];007[2];008[2]
83 009 Cc 007[2];009[3];009[5];009[7]
*/
When run, the code lists all the paths with the matching ones preceded by “Path Found”, so if you grep wrt it, you’ll have, for this example:
sururi@husniya:/xxx$ php find_trpath_for_index.php |grep Path|sed "s:Path Found\: ::"
227-141[3]-070[2]-015[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-070[2]-015[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-070[2]-015[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-070[2]-015[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-070[2]-015[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-070[2]-015[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-070[2]-015[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-070[2]-043[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-008[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-008[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-008[2]-009[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-010[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-011[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-011[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-011[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-008[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-008[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-012[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-015[2]-009[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-015[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-012[2]-015[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-012[2]-015[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-015[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-015[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-008[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-008[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-008[2]-009[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-027[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-027[2]-037[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-035[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-035[2]-036[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-035[2]-037[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-035[2]-045[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-035[2]-046[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-038[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-038[2]-040[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-038[2]-046[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-039[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-039[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-039[2]-041[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-039[2]-045[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-039[2]-046[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-042[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-042[2]-036[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-042[2]-037[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-042[2]-040[2]-009[2]
227-141[3]-074[2]-044[2]-025[2]-042[2]-041[2]-009[2]
227-141[3]-074[2]-044[2]-031[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-031[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-044[2]-031[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-031[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-031[2]-033[2]-007[2]-009[2]
227-141[3]-074[2]-044[2]-034[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-008[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-008[2]-008[2]-009[2]
227-141[3]-074[2]-046[2]-008[2]-009[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-026[2]-036[2]-008[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-032[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-028[2]-041[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-030[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-030[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-030[2]-034[2]-007[2]-009[2]
227-141[3]-074[2]-046[2]-030[2]-034[2]-043[2]-009[2]
227-141[3]-074[2]-046[2]-033[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-010[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-011[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-011[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-011[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-027[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-027[2]-037[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-035[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-035[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-035[2]-037[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-035[2]-045[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-035[2]-046[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-038[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-038[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-038[2]-046[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-039[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-039[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-039[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-039[2]-045[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-039[2]-046[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-042[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-042[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-042[2]-037[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-042[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-025[2]-042[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-026[2]-036[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-032[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-028[2]-041[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-063[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-063[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-063[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-064[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-064[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-051[2]-064[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-053[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-027[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-027[2]-037[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-054[2]-032[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-055[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-055[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-055[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-055[2]-032[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-057[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-059[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-059[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-059[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-036[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-038[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-038[2]-040[2]-009[2]
227-141[3]-074[2]-051[2]-063[2]-038[2]-046[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-036[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-039[2]-007[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-039[2]-008[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-039[2]-041[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-039[2]-045[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-039[2]-046[2]-009[2]
227-141[3]-074[2]-051[2]-064[2]-041[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-052[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-030[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-030[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-030[2]-034[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-030[2]-034[2]-043[2]-009[2]
227-141[3]-074[2]-052[2]-033[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-052[2]-034[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-012[2]-008[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-012[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-010[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-032[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-028[2]-041[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-030[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-030[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-030[2]-034[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-030[2]-034[2]-043[2]-009[2]
227-141[3]-074[2]-053[2]-031[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-031[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-053[2]-031[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-031[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-031[2]-033[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-033[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-034[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-052[2]-034[2]-043[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-028[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-028[2]-040[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-028[2]-041[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-053[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-058[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-058[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-058[2]-034[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-058[2]-034[2]-043[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-013[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-013[2]-015[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-030[2]-007[2]-009[2]
227-141[3]-074[2]-053[2]-060[2]-033[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-011[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-011[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-062[2]-011[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-026[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-026[2]-036[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-029[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-026[2]-036[2]-008[2]-009[2]
227-141[3]-074[2]-062[2]-031[2]-006[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-031[2]-006[2]-008[2]-009[2]
227-141[3]-074[2]-062[2]-031[2]-007[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-031[2]-031[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-031[2]-033[2]-007[2]-009[2]
227-141[3]-074[2]-062[2]-033[2]-007[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-013[2]-007[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-013[2]-013[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-013[2]-013[2]-015[2]-009[2]
227-141[3]-088[2]-015[2]-013[2]-014[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-014[2]-007[2]-007[2]-009[2]
227-141[3]-088[2]-015[2]-014[2]-014[2]-007[2]-009[2]
227-141[3]-109[2]-043[2]-009[2]-007[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-006[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-006[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-007[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-008[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-008[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-008[2]-009[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-006[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-006[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-026[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-026[2]-036[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-027[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-027[2]-037[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-028[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-028[2]-040[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-028[2]-041[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-035[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-035[2]-036[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-035[2]-037[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-035[2]-045[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-035[2]-046[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-038[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-038[2]-040[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-038[2]-046[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-039[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-039[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-039[2]-041[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-039[2]-045[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-039[2]-046[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-042[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-042[2]-036[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-042[2]-037[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-042[2]-040[2]-009[2]
227-141[3]-109[2]-044[2]-025[2]-042[2]-041[2]-009[2]
227-141[3]-109[2]-044[2]-031[2]-006[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-031[2]-006[2]-008[2]-009[2]
227-141[3]-109[2]-044[2]-031[2]-007[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-031[2]-031[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-031[2]-033[2]-007[2]-009[2]
227-141[3]-109[2]-044[2]-034[2]-007[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-006[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-006[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-007[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-008[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-008[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-008[2]-009[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-006[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-006[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-026[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-026[2]-036[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-027[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-027[2]-037[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-028[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-028[2]-040[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-028[2]-041[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-035[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-035[2]-036[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-035[2]-037[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-035[2]-045[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-035[2]-046[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-038[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-038[2]-040[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-038[2]-046[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-039[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-039[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-039[2]-041[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-039[2]-045[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-039[2]-046[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-042[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-042[2]-036[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-042[2]-037[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-042[2]-040[2]-009[2]
227-141[3]-119[2]-044[2]-025[2]-042[2]-041[2]-009[2]
227-141[3]-119[2]-044[2]-031[2]-006[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-031[2]-006[2]-008[2]-009[2]
227-141[3]-119[2]-044[2]-031[2]-007[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-031[2]-031[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-031[2]-033[2]-007[2]-009[2]
227-141[3]-119[2]-044[2]-034[2]-007[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-006[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-006[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-026[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-026[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-027[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-027[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-028[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-028[2]-040[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-028[2]-041[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-035[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-035[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-035[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-035[2]-045[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-035[2]-046[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-038[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-038[2]-040[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-038[2]-046[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-039[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-039[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-039[2]-041[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-039[2]-045[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-039[2]-046[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-042[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-042[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-042[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-042[2]-040[2]-009[2]
227-141[3]-119[2]-115[2]-025[2]-042[2]-041[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-035[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-035[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-035[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-035[2]-045[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-035[2]-046[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-112[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-111[2]-120[2]-045[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-035[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-035[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-035[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-035[2]-045[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-035[2]-046[2]-009[2]
227-141[3]-119[2]-115[2]-113[2]-114[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-116[2]-027[2]-007[2]-009[2]
227-141[3]-119[2]-115[2]-116[2]-027[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-116[2]-112[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-116[2]-114[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-042[2]-008[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-042[2]-036[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-042[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-042[2]-040[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-042[2]-041[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-112[2]-037[2]-009[2]
227-141[3]-119[2]-115[2]-121[2]-114[2]-037[2]-009[2]
227-141[3]-119[2]-118[2]-034[2]-007[2]-007[2]-009[2]
227-141[3]-122[2]-043[2]-009[2]-007[2]-007[2]-009[2]
227-166[4]-012[3]-008[2]-006[2]-007[2]-009[2]
227-166[4]-012[3]-008[2]-006[2]-008[2]-009[2]
227-166[4]-012[3]-008[2]-007[2]-007[2]-009[2]
227-166[4]-012[3]-008[2]-008[2]-007[2]-009[2]
227-166[4]-012[3]-008[2]-008[2]-008[2]-009[2]
227-166[4]-012[3]-008[2]-009[2]-007[2]-009[2]
227-166[4]-012[3]-010[2]-006[2]-007[2]-009[2]
227-166[4]-012[3]-010[2]-006[2]-008[2]-009[2]
227-166[4]-012[3]-010[2]-012[2]-008[2]-009[2]
227-166[4]-012[3]-010[2]-012[2]-015[2]-009[2]
227-166[4]-012[3]-010[2]-013[2]-007[2]-009[2]
227-166[4]-012[3]-010[2]-013[2]-015[2]-009[2]
227-166[4]-012[3]-011[2]-006[2]-007[2]-009[2]
227-166[4]-012[3]-011[2]-006[2]-008[2]-009[2]
227-166[4]-012[3]-011[2]-014[2]-007[2]-009[2]
227-166[4]-012[3]-012[2]-008[2]-007[2]-009[2]
227-166[4]-012[3]-012[2]-008[2]-008[2]-009[2]
227-166[4]-012[3]-012[2]-012[2]-008[2]-009[2]
227-166[4]-012[3]-012[2]-012[2]-015[2]-009[2]
227-166[4]-012[3]-012[2]-013[2]-007[2]-009[2]
227-166[4]-012[3]-012[2]-013[2]-015[2]-009[2]
227-166[4]-012[3]-012[2]-014[2]-007[2]-009[2]
227-166[4]-012[3]-013[2]-007[2]-007[2]-009[2]
227-166[4]-012[3]-013[2]-013[2]-007[2]-009[2]
227-166[4]-012[3]-013[2]-013[2]-015[2]-009[2]
227-166[4]-012[3]-013[2]-014[2]-007[2]-009[2]
227-166[4]-012[3]-014[2]-007[2]-007[2]-009[2]
227-166[4]-012[3]-014[2]-014[2]-007[2]-009[2]
227-166[4]-012[3]-015[2]-009[2]-007[2]-009[2]
227-166[4]-012[3]-015[2]-013[2]-007[2]-009[2]
227-166[4]-012[3]-015[2]-013[2]-015[2]-009[2]
227-166[4]-012[3]-015[2]-014[2]-007[2]-009[2]
227-166[4]-160[2]-008[3]-006[2]-007[2]-009[2]
227-166[4]-160[2]-008[3]-006[2]-008[2]-009[2]
227-166[4]-160[2]-008[3]-007[2]-007[2]-009[2]
227-166[4]-160[2]-008[3]-008[2]-007[2]-009[2]
227-166[4]-160[2]-008[3]-008[2]-008[2]-009[2]
227-166[4]-160[2]-008[3]-009[2]-007[2]-009[2]
227-166[4]-160[2]-160[2]-008[3]-007[2]-009[2]
227-166[4]-160[2]-160[2]-008[3]-008[2]-009[2]
227-166[4]-160[2]-160[2]-160[2]-008[3]-009[2]
227-166[4]-160[2]-160[2]-160[2]-161[2]-009[3]
227-166[4]-160[2]-161[2]-009[3]-007[2]-009[2]
227-166[4]-160[2]-161[2]-161[4]-009[3]
227-166[4]-160[2]-160[4]-008[3]-009[2]
227-166[4]-160[2]-160[4]-161[2]-009[3]
227-166[4]-166[2]-012[3]-008[2]-007[2]-009[2]
227-166[4]-166[2]-012[3]-008[2]-008[2]-009[2]
227-166[4]-166[2]-012[3]-012[2]-008[2]-009[2]
227-166[4]-166[2]-012[3]-012[2]-015[2]-009[2]
227-166[4]-166[2]-012[3]-013[2]-007[2]-009[2]
227-166[4]-166[2]-012[3]-013[2]-015[2]-009[2]
227-166[4]-166[2]-012[3]-014[2]-007[2]-009[2]
227-166[4]-166[2]-160[2]-008[3]-007[2]-009[2]
227-166[4]-166[2]-160[2]-008[3]-008[2]-009[2]
227-166[4]-166[2]-160[2]-160[2]-008[3]-009[2]
227-166[4]-166[2]-160[2]-160[2]-161[2]-009[3]
227-166[4]-166[2]-166[2]-012[3]-008[2]-009[2]
227-166[4]-166[2]-166[2]-012[3]-015[2]-009[2]
227-166[4]-166[2]-166[2]-160[2]-008[3]-009[2]
227-166[4]-166[2]-166[2]-160[2]-161[2]-009[3]
227-166[4]-166[2]-166[2]-167[2]-015[3]-009[2]
227-166[4]-166[2]-166[2]-167[2]-161[2]-009[3]
227-166[4]-167[2]-015[3]-009[2]-007[2]-009[2]
227-166[4]-167[2]-015[3]-013[2]-007[2]-009[2]
227-166[4]-167[2]-015[3]-013[2]-015[2]-009[2]
227-166[4]-167[2]-015[3]-014[2]-007[2]-009[2]
227-166[4]-167[2]-161[2]-009[3]-007[2]-009[2]
227-166[4]-167[2]-161[2]-161[4]-009[3]
227-166[4]-167[2]-167[4]-015[3]-009[2]
227-166[4]-167[2]-167[4]-161[2]-009[3]
227-166[4]-166[4]-012[3]-008[2]-009[2]
227-166[4]-166[4]-012[3]-015[2]-009[2]
227-166[4]-166[4]-160[2]-008[3]-009[2]
227-166[4]-166[4]-160[2]-161[2]-009[3]
227-166[4]-166[4]-167[2]-015[3]-009[2]
227-166[4]-166[4]-167[2]-161[2]-009[3]
227-203[2]-070[3]-015[2]-009[2]-007[2]-007[2]-009[2]
227-203[2]-070[3]-015[2]-013[2]-007[2]-007[2]-009[2]
227-203[2]-070[3]-015[2]-013[2]-013[2]-007[2]-009[2]
227-203[2]-070[3]-015[2]-013[2]-013[2]-015[2]-009[2]
227-203[2]-070[3]-015[2]-013[2]-014[2]-007[2]-009[2]
227-203[2]-070[3]-015[2]-014[2]-007[2]-007[2]-009[2]
227-203[2]-070[3]-015[2]-014[2]-014[2]-007[2]-009[2]
227-203[2]-070[3]-043[2]-009[2]-007[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-006[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-006[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-007[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-008[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-008[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-008[2]-009[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-006[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-006[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-026[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-026[2]-036[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-027[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-027[2]-037[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-028[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-028[2]-040[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-028[2]-041[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-035[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-035[2]-036[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-035[2]-037[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-035[2]-045[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-035[2]-046[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-038[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-038[2]-040[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-038[2]-046[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-039[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-039[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-039[2]-041[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-039[2]-045[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-039[2]-046[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-042[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-042[2]-036[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-042[2]-037[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-042[2]-040[2]-009[2]
227-216[2]-119[3]-044[2]-025[2]-042[2]-041[2]-009[2]
227-216[2]-119[3]-044[2]-031[2]-006[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-031[2]-006[2]-008[2]-009[2]
227-216[2]-119[3]-044[2]-031[2]-007[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-031[2]-031[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-031[2]-033[2]-007[2]-009[2]
227-216[2]-119[3]-044[2]-034[2]-007[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-006[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-006[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-026[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-026[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-027[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-027[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-028[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-028[2]-040[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-028[2]-041[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-035[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-035[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-035[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-035[2]-045[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-035[2]-046[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-038[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-038[2]-040[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-038[2]-046[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-039[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-039[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-039[2]-041[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-039[2]-045[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-039[2]-046[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-042[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-042[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-042[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-042[2]-040[2]-009[2]
227-216[2]-119[3]-115[2]-025[2]-042[2]-041[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-035[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-035[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-035[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-035[2]-045[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-035[2]-046[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-112[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-111[2]-120[2]-045[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-035[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-035[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-035[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-035[2]-045[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-035[2]-046[2]-009[2]
227-216[2]-119[3]-115[2]-113[2]-114[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-116[2]-027[2]-007[2]-009[2]
227-216[2]-119[3]-115[2]-116[2]-027[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-116[2]-112[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-116[2]-114[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-042[2]-008[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-042[2]-036[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-042[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-042[2]-040[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-042[2]-041[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-112[2]-037[2]-009[2]
227-216[2]-119[3]-115[2]-121[2]-114[2]-037[2]-009[2]
227-216[2]-119[3]-118[2]-034[2]-007[2]-007[2]-009[2]
227-216[2]-160[4]-008[3]-006[2]-007[2]-009[2]
227-216[2]-160[4]-008[3]-006[2]-008[2]-009[2]
227-216[2]-160[4]-008[3]-007[2]-007[2]-009[2]
227-216[2]-160[4]-008[3]-008[2]-007[2]-009[2]
227-216[2]-160[4]-008[3]-008[2]-008[2]-009[2]
227-216[2]-160[4]-008[3]-009[2]-007[2]-009[2]
227-216[2]-160[4]-160[2]-008[3]-007[2]-009[2]
227-216[2]-160[4]-160[2]-008[3]-008[2]-009[2]
227-216[2]-160[4]-160[2]-160[2]-008[3]-009[2]
227-216[2]-160[4]-160[2]-160[2]-161[2]-009[3]
227-216[2]-160[4]-161[2]-009[3]-007[2]-009[2]
227-216[2]-160[4]-161[2]-161[4]-009[3]
227-216[2]-160[4]-160[4]-008[3]-009[2]
227-216[2]-160[4]-160[4]-161[2]-009[3]
227-216[2]-215[4]-111[3]-035[2]-008[2]-009[2]
227-216[2]-215[4]-111[3]-035[2]-036[2]-009[2]
227-216[2]-215[4]-111[3]-035[2]-037[2]-009[2]
227-216[2]-215[4]-111[3]-035[2]-045[2]-009[2]
227-216[2]-215[4]-111[3]-035[2]-046[2]-009[2]
227-216[2]-215[4]-111[3]-112[2]-037[2]-009[2]
227-216[2]-215[4]-111[3]-120[2]-045[2]-009[2]
227-216[2]-215[4]-160[4]-008[3]-009[2]
227-216[2]-215[4]-160[4]-161[2]-009[3]
227-216[2]-215[4]-219[2]-120[3]-045[2]-009[2]
227-216[2]-215[4]-219[2]-161[4]-009[3]
Coordination Numbers
September 3, 2009 Posted by Emre S. Tasci
Recently, we are working on liquid alloys and for our work, we need the coordination number distribution. It’s kind of a gray area when you talk about coordination number of atoms in a liquid but it’s better than nothing to understand the properties and even more. I’d like to write a log on the tools I’ve recently coded/used in order to refer to in the future if a similar situation occurs. Also, maybe there are some others conducting similar research so, the tools introduced here may be helpful to them.
Recently, while searching recent publications on liquid alloys, I’ve found a very good and resourceful article on liquid Na-K alloys by Dr. J.-F. Wax (“Molecular dynamics study of the static structure of liquid Na-K alloys”, Physica B 403 (2008) 4241-48 | doi:10.1016/j.physb.2008.09.014). In this paper, among other properties, he had also presented the partial pair distribution functions. Partial-pair distribution functions is the averaged probability that you’ll encounter an atom in r distance starting from another atom. In solid phase, due to the symmetry of the crystal structure, you have discrete values instead of a continuous distribution and everything is crystal clear but I guess that’s the price we pay dealing with liquids. 8)
Partial-pair distribution functions are very useful in the sense that they let you derive the bond-length between constituent atom species, corresponding to the first minimums of the plots. Hence, one can see the neighborhood ranges by just looking at the plots.
I’ve sent a mail to Dr. Wax explaining my research topics and my interest and asking for his research data to which he very kindly and generously replied by providing his data.
He had sent me a big file with numerous configurations (coordinates of the atoms) following each other. The first -and the simplest- task was to split the file into seperate configuration files via this bash script:
#!/bin/bash
# Script Name: split_POS4.sh
# Splits the NaK conf files compilation POS4_DAT into sepearate
# conf files.
# Emre S. Tasci <e.tasci@tudelft.nl>
# 01/09/09
linestart=2
p="p"
for (( i = 1; i <= 1000; i++ ))
do
echo $i;
lineend=$(expr $linestart + 2047)
confname=$(printf "%04d" $i)
echo -e "3\n2048" > $confname
sed -n "$linestart,$(echo $lineend$p)" POS4_DAT >> $confname
linestart=$(expr $lineend + 1)
cat $confname | qhull i TO $confname.hull
done
(The compilation was of 1000 configurations, each with 2048 atoms)
As you can check in the line before the “done” closer, I’ve -proudly- used Qhull software to calculate the convex hull of each configuration. A convex hull is the -hopefully minimum- shape that covers all your system. So, for each configuration I now had 2 files: “xxxx” (where xxxx is the id/number of the configuration set) storing the coordinates (preceded by 3 and 2048, corresponding to dimension and number of atoms information for the qhull to parse & process) and “xxxx.hull” file, generated by the qhull, containing the vertices list of each facet (preceded by the total number of facets).
A facet is (in 3D) the plane formed by the vertice points. Imagine a cube, where an atom lies at each corner, 3 in the inside. So, we can say that our system consists of 11 atoms and the minimal shape that has edges selected from system’s atoms and covering the whole is a cube, with the edges being the 8 atoms at the corners. Now, add an atom floating over the face at the top. Now the convex hull that wraps our new system would no longer be a 6-faced, 8-edged cube but a 9-faced, 9-edged polygon. I need to know the convex hull geometry in order to correctly calculate the coordination number distributions (details will follow shortly).
The aforementioned two files look like:
sururi@husniya hull_calcs $ head 0001
3
2048
0.95278770E+00 0.13334565E+02 0.13376155E+02
0.13025256E+02 0.87618381E+00 0.20168993E+01
0.12745038E+01 0.14068998E-01 0.22887323E+01
0.13066590E+02 0.20788591E+01 0.58119183E+01
0.10468218E+00 0.58523640E-01 0.64288678E+01
0.12839412E+02 0.13117012E+02 0.79093881E+01
0.11918105E+01 0.12163854E+02 0.10270868E+02
0.12673985E+02 0.11642538E+02 0.10514597E+02
sururi@husniya hull_calcs $ head 0001.hull
180
568 1127 1776
1992 104 1551
956 449 1026
632 391 1026
391 632 1543
391 956 1026
966 632 1026
966 15 1039
632 966 1039
The sets of 3 numbers in the xxxx.hull file is the ids/numbers of the atoms forming the edges of the facets, i.e., they are the vertices.
To calculate the coordination number distribution, you need to pick each atom and then simply count the other atoms within the cut-off distance depending on your atom’s and the neighboring atom’s species. After you do the counting for every atom, you average the results and voilà ! there is your CN distribution. But here’s the catch: In order to be able to count properly, you must make sure that, your reference atom’s cutoff radii stay within your system — otherwise you’ll be undercounting. Suppose your reference atom is one of the atoms at the corners of the cube: It will (generally/approximately) lack 7/8 of the neighbouring atoms it would normally have if it was to be the center atom of the specimen/sample. Remember that we are studying a continuous liquid and trying to model the system via ensembles of samples. So we should omit these atoms which has neighborhoods outside of our systems. Since neighborhoods are defined through bond-length, we should only include the atoms with a distance to the outside of at least cut-off radii. The “outside” is defined as the region outside the convex hull and it’s designated by the facets (planes).
From the xxxx.hull file, we have the ids of the vertice atoms and their coordinates are stored in the xxxx file. To define the plane equation
we will use the three vertice points, say p1, p2 and p3. From these 3 points, we calculate the normal n as:
then, the plane equation (hence the coefficients a,b,c,d) can be derived by comparing the following equation:
Here, (x0,y0,z0) are just the coordinates of any of the vertice points. And finally, the distance D between a point p1(x1,y1,z1) and a plane (a,b,c,d) is given by:
Since vector operations are involved, I thought it’s better to do this job in Octave and wrote the following script that calculates the coefficients of the facets and then sets down to find out the points whose distances to all the facets are greater than the given cut-off radius:
sururi@husniya trunk $ cat octave_find_atoms_within.m
DummyA = 3;
%conf_index=292;
% Call from the command line like :
% octave -q --eval "Rcut=1.65;conf_index=293;path='$(pwd)';" octave_find_atoms_within.m
% hence specifying the conf_index at the command line.
% Emre S. Tasci <e.tasci@tudelft.nl> *
%
% From the positions and vertices file, calculates the plane
% equations (stored in "facet_coefficients") and then
% filters the atoms with respect to their distances to these
% facets. Writes the output to
% "hull_calcs/xxxx_insiders.txt" file
% 03/09/09 */
conf_index_name = num2str(sprintf("%04d",conf_index));;
%clock
clear facet_coefficients;
facet_coefficients = [];
global p v facet_coefficients
fp = fopen(strcat(path,"/hull_calcs/",conf_index_name));
k = fscanf(fp,"%d",2); % 1st is dim (=3), 2nd is number of atoms (=2048)
p = fscanf(fp,"%f",[k(1),k(2)]);
p = p';
fclose(fp);
%p = load("/tmp/del/delco");
fp = fopen(strcat(path,"/hull_calcs/",conf_index_name,".hull"));
k = fscanf(fp,"%d",1);% number of facets
v = fscanf(fp,"%d",[3,k]);
v = v';
fclose(fp);
%v = load("/tmp/del/delver");
function [a,b,c,d,e] = getPlaneCoefficients(facet_index)
global p v
% Get the 3 vertices
p1 = p(v(facet_index,1)+1,:); % The +1s come from the fact
p2 = p(v(facet_index,2)+1,:); % that qhull enumeration begins
p3 = p(v(facet_index,3)+1,:); % from 0 while Octave's from 1
%printf("%d: %f %f %f %f %f %f %f %f %f\n",facet_index,p1,p2,p3);
% Calculate the normal
n = cross((p2-p1),(p3-p1));
% Calculate the coefficients of the plane :
% ax + by + cz +d = 0
a = n(1);
b = n(2);
c = n(3);
d = -(dot(n,p1));
e = norm(n);
if(e==0)
printf("%f\n",p1);
printf("%f\n",p2);
printf("%f\n",p3);
printf("%d\n",facet_index);
endif
endfunction
function dist = distanceToPlane(point_index,facet_index)
global p facet_coefficients
k = facet_coefficients(facet_index,:);
n = [k(1) k(2) k(3)];
dist = abs(dot(n,p(point_index,:)) + k(4)) / k(5);
endfunction
for i = [1:size(v)(1)]
[a,b,c,d,e] = getPlaneCoefficients(i);
facet_coefficients = [ facet_coefficients ; [a,b,c,d,e]];
endfor
%Rcut = 1.65; % Defined from command line calling
% Find the points that are not closer than Rcut
inside_atoms = [];
for point = [1:size(p)(1)]
%for point = [1:100]
inside=true;
for facet = [1:size(v)(1)]
%for facet = [1:10]
%printf("%d - %d : %f\n",point,facet,dist);
if (distanceToPlane(point,facet)<Rcut)
inside = false;
break;
endif
endfor
if(inside)
inside_atoms = [inside_atoms point-1];
endif
endfor
fp = fopen(strcat(path,"/hull_calcs/",conf_index_name,"_insiders.txt"),"w");
fprintf(fp,"%d\n",inside_atoms);
fclose(fp);
%clock
This script is runned within the following php code which then takes the filtered atoms and does the counting using them:
<?PHP
/* Emre S. Tasci <e.tasci@tudelft.nl> *
*
* parse_configuration_data.php
*
* Written in order to parse the configuation files
* obtained from J.F. Wax in order to calculate the
* Coordination Number distribution. Each configuration
* file contain 2048 atoms' coordinates starting at the
* 3rd line. There is also a convex hull file generated
* using qhull (http://www.qhull.com) that contains the
* indexes (starting from 0) of the atoms that form the
* vertices of the convex hull. Finally there is the
* IP.dat file that identifies each atom (-1 for K; 1 for
* Na -- the second column is the relative masses).
*
* 02/09/09 */
/*
# if present, remove the previous run's results file
if(file_exists("results.txt"))
unlink("results.txt");
*/
error_reporting(E_ALL ^ E_NOTICE);
if(!file_exists("results.txt"))
{
$fp = fopen("results.txt","w");
fwrite($fp,"CONF#"."\tNa".implode("\tNa",range(1,20))."\tK".implode("\tK",range(1,20))."\n");
fclose($fp);
}
# Support for command line variable passing:
for($i=1;$i<sizeof($_SERVER["argv"]);$i++)
{
list($var0,$val0) = explode("=",$_SERVER["argv"][$i]);
$_GET[$var0] = $val0;
}
if($_GET["configuration"])
calculate($_GET["configuration"]);
else
exit("Please specify a configuration number [php parse_configuration_data.php configuration=xxx]\n");
function calculate($conf_index)
{
# Define the atoms array
$arr_atoms = Array();
# Get the information from the files
parse_types($arr_atoms);
$refs = get_vertices($conf_index);
parse_coordinates($arr_atoms,$conf_index);
# Define the Rcut-off values (obtained from partial parid distribution minimums)
$Rcut_arr = Array();
$Rscale = 3.828; # To convert reduced distances to Angstrom (if needed)
$Rscale = 1; # To convert reduced distances to Angstrom
$Rcut_arr["Na"]["Na"] = 1.38 * $Rscale;
$Rcut_arr["Na"]["K"] = 1.65 * $Rscale;
$Rcut_arr["K"]["Na"] = 1.65 * $Rscale;
$Rcut_arr["K"]["K"] = 1.52 * $Rscale;
$Rcut = $Rcut_arr["Na"]["K"]; # Taking the maximum one as the Rcut for safety
/*
# We have everything we need, so proceed to check
# if an atom is at safe distance wrt to the vertices
# Define all the ids
$arr_test_ids = range(0,2047);
# Subtract the ref atoms' ids
$arr_test_ids = array_diff($arr_test_ids, $refs);
sort($arr_test_ids);
//print_r($arr_test_ids);
$arr_passed_atom_ids = Array();
# Check each atom against refs
for($id=0, $size=sizeof($arr_test_ids); $id<$size; $id++)
{
//echo $id."\n";
$arr_atoms[$arr_test_ids[$id]]["in"] = TRUE;
foreach ($refs as $ref)
{
$distance = distance($arr_atoms[$arr_test_ids[$id]],$arr_atoms[$ref]);
//echo "\t".$ref."\t".$distance."\n";
if($distance < $Rcut)
{
$arr_atoms[$arr_test_ids[$id]]["in"] = FALSE;
break;
}
}
if($arr_atoms[$arr_test_ids[$id]]["in"] == TRUE)
$arr_passed_atom_ids[] = $arr_test_ids[$id];
}
*/
# Run the octave script file to calculate the inside atoms
if(!file_exists("hull_calcs/".sprintf("%04d",$conf_index)."_insiders.txt"))
exec("octave -q --eval \"Rcut=".$Rcut.";conf_index=".$conf_index.";path='$(pwd)';\" octave_find_atoms_within.m");
# Read the file generated by Octave
$arr_passed_atom_ids = file("hull_calcs/".sprintf("%04d",$conf_index)."_insiders.txt",FILE_IGNORE_NEW_LINES);
$arr_test_ids = range(0,2047);
$arr_test_ids = array_diff($arr_test_ids, $refs);
sort($arr_test_ids);
for($i=0, $size=sizeof($arr_test_ids);$i<$size;$i++)
$arr_atoms[$arr_test_ids[$i]]["in"]=FALSE;
# Begin checking every passed atom
foreach($arr_passed_atom_ids as $passed_atom_id)
{
$arr_atoms[$passed_atom_id]["in"] = TRUE;
for($i=0, $size=sizeof($arr_atoms); $i<$size; $i++)
{
$distance = distance($arr_atoms[$passed_atom_id],$arr_atoms[$i]);
//echo $passed_atom_id."\t---\t".$i."\n";
if($distance < $Rcut_arr[$arr_atoms[$passed_atom_id]["id"]][$arr_atoms[$i]["id"]] && $distance>0.001)
$arr_atoms[$passed_atom_id]["neighbour_count"] += 1;
}
}
# Do the binning
$CN_Na = Array();
$CN_K = Array();
for($i=0, $size=sizeof($arr_atoms); $i<$size; $i++)
{
if(array_key_exists("neighbour_count",$arr_atoms[$i]))
{
${"CN_".$arr_atoms[$i]['id']}[$arr_atoms[$i]["neighbour_count"]] += 1;
}
}
ksort($CN_Na);
ksort($CN_K);
//print_r($arr_atoms);
//print_r($CN_Na);
//print_r($CN_K);
# Report the results
$filename = "results/".sprintf("%04d",$conf_index)."_results.txt";
$fp = fopen($filename,"w");
fwrite($fp, "### Atoms array ###\n");
fwrite($fp,var_export($arr_atoms,TRUE)."\n");
fwrite($fp, "\n### CN Distribution for Na ###\n");
fwrite($fp,var_export($CN_Na,TRUE)."\n");
fwrite($fp, "\n### CN Distribution for K ###\n");
fwrite($fp,var_export($CN_K,TRUE)."\n");
# Percentage calculation:
$sum_Na = array_sum($CN_Na);
$sum_K = array_sum($CN_K);
foreach($CN_Na as $key=>$value)
$CN_Na[$key] = $value * 100 / $sum_Na;
foreach($CN_K as $key=>$value)
$CN_K[$key] = $value * 100 / $sum_K;
//print_r($CN_Na);
//print_r($CN_K);
fwrite($fp, "\n### CN Distribution (Percentage) for Na ###\n");
fwrite($fp,var_export($CN_Na,TRUE)."\n");
fwrite($fp, "\n### CN Distribution (Percentage) for K ###\n");
fwrite($fp,var_export($CN_K,TRUE)."\n");
fclose($fp);
# Write the summary to the results file
$fp = fopen("results.txt","a");
for($i=1;$i<=20;$i++)
{
if(!array_key_exists($i,$CN_Na))
$CN_Na[$i] = 0;
if(!array_key_exists($i,$CN_K))
$CN_K[$i] = 0;
}
ksort($CN_Na);
ksort($CN_K);
fwrite($fp,sprintf("%04d",$conf_index)."\t".implode("\t",$CN_Na)."\t".implode("\t",$CN_K)."\n");
fclose($fp);
}
function parse_types(&$arr_atoms)
{
# Parse the types
$i = 0;
$fp = fopen("IP.DAT", "r");
while(!feof($fp))
{
$line = fgets($fp,4096);
$auxarr = explode(" ",$line);
if($auxarr[0]==-1)
$arr_atoms[$i]["id"] = "Na";
else
$arr_atoms[$i]["id"] = "K";
$i++;
}
fclose($fp);
array_pop($arr_atoms);
return 0;
}
function get_vertices($conf_index)
{
$arr_refs = Array();
# Get the ids of the vertices of the convex hull
$filename = "hull_calcs/".sprintf("%04d",$conf_index).".hull";
$fp = fopen($filename, "r");
# Bypass the first line
$line = fgets($fp,4096);
while(!feof($fp))
{
$line = fgets($fp,4096);
$auxarr = explode(" ",$line);
array_pop($auxarr);
$arr_refs = array_merge($arr_refs, $auxarr);
}
fclose($fp);
// $arr_refs = array_unique($arr_refs); # This doesn't lose the keys
$arr_refs = array_keys(array_count_values($arr_refs)); # But this does.
return $arr_refs;
}
function parse_coordinates(&$arr_atoms, $conf_index)
{
# Parse the coordinates
$i = 0;
$filename = "hull_calcs/".sprintf("%04d",$conf_index);
$fp = fopen($filename, "r");
# Bypass the first two lines
$line = fgets($fp,4096);
$line = fgets($fp,4096);
while(!feof($fp))
{
$line = fgets($fp,4096);
$arr_atoms[$i]["coords"] = explode(" ",$line);
array_shift($arr_atoms[$i]["coords"]);
$i++;
}
fclose($fp);
array_pop($arr_atoms);
return 0;
}
function distance(&$atom1,&$atom2)
{
# Calculate the distance between the two atoms
$x1 = $atom1["coords"][0];
$x2 = $atom2["coords"][0];
$y1 = $atom1["coords"][1];
$y2 = $atom2["coords"][1];
$z1 = $atom1["coords"][2];
$z2 = $atom2["coords"][2];
return sqrt(pow($x1-$x2,2) + pow($y1-$y2,2) + pow($z1-$z2,2));
}
?>
The code above generates a “results/xxxx_results.txt” file containing all the information obtained in arrays format and also appends to “results.txt” file the relevant configuration file’s CN distribution summary. The systems can be visualized using the output generated by the following plotter.php script:
<?PHP
/* Emre S. Tasci <e.tasci@tudelft.nl> *
* Parses the results/xxxx_results.txt file and generates
* an XYZ file such that the atoms are labeled as the
* vertice atoms, close-vertice atoms and inside atoms..
* 02/09/09 */
# Support for command line variable passing:
for($i=1;$i<sizeof($_SERVER["argv"]);$i++)
{
list($var0,$val0) = explode("=",$_SERVER["argv"][$i]);
$_GET[$var0] = $val0;
}
if($_GET["configuration"])
$conf_index = $_GET["configuration"];
else
exit("Please specify a configuration number [php plotter.php configuration=xxx]\n");
$filename = sprintf("%04d",$conf_index);
# Get the atom array from the results file. Since results file
# contains other arrays as well, we slice the file using sed for the
# relevant part
$last_arr_line = exec('grep "### CN Distribution" results/'.$filename.'_results.txt -n -m1|sed "s:^\([0-9]\+\).*:\1:gi"');
exec('sed -n "2,'.($last_arr_line-1).'p" results/'.$filename.'_results.txt > system_tmp_array_dump_file');
$str=file_get_contents('system_tmp_array_dump_file');
$atom_arr=eval('return '.$str.';');
unlink('system_tmp_array_dump_file');
# Now that we have the coordinates, we itarate over the atoms to check
# the characteristic and designate them in the XYZ file.
$fp = fopen("system_".$filename.".xyz","w");
fwrite($fp,sizeof($atom_arr)."\n");
fwrite($fp,"Generated by plotter.php\n");
for($i=0, $size=sizeof($atom_arr);$i<$size;$i++)
{
if(!array_key_exists("in",$atom_arr[$i]))
$atomlabel = "Mg";#Vertices
elseif($atom_arr[$i]["in"]==TRUE)
$atomlabel = $atom_arr[$i]["id"];#Inside atoms
else
$atomlabel = "O";#Close-vertice atoms
fwrite($fp,$atomlabel."\t".implode("\t",$atom_arr[$i]["coords"]));
}
fclose($fp);
?>
which generates a “system_xxxx.xyz” file, ready to be viewed in a standard molecule viewing software. It designates the vertice atoms (of the convex hull, remember? 8)as “Mg” and the atoms close to them as “O” for easy-viewing purpose. A sample parsed file looks like this:
The big orange atoms are the omitted vertice atoms; the small red ones are the atoms critically close to the facets and hence also omitted ones. You can see the purple and yellow atoms which have passed the test sitting happilly inside, with the counting done using them.. 8)
POSCAR2Cif with symmetries discovered
June 4, 2009 Posted by Emre S. Tasci
In previous posts, I had submitted two codes:
- POSCAR2Cif : that converts a given POSCAR file to CIF, so to speak, ruthlessly, i.e. just as is, without checking for symmetries or anything.
- POSCAR2findsymm : another converter that takes a POSCAR file, and prepares an input file such that Harold Stokes’ findsym code from the ISOTROPY package would proceed it and deduce the symmetry information. If findsym executable is not accessible in your system (or if you run the script with the “t” flag set to on), it would just print the input to the screen and you could use it to fill the input form of the code’s web implementation, instead
Anyway, recently it occured to me to write another script that would parse the output of the POSCAR2findsymm output and use that output to construct a CIF file that contained the equivalent sites, etc.. So, ladies and gentlemen, here it is (drums roll)…
Example: Code in action
Using the same POSCAR_Pd3S file as in the POSCAR2Cif entry… Feeding it to POSCAR2findsymm and then applying findsymm2cif on it
sururi@husniya tmp $ python /code/POSCAR2findsym/POSCAR2findsym.py POSCAR_Pd3S | php /code/vaspie/findsymm2cif.php speclist=Pd,S
_cell_length_a 7.21915
_cell_length_b 5.56683
_cell_length_c 7.68685
_cell_angle_alpha 90.00000
_cell_angle_beta 90.00000
_cell_angle_gamma 90.00000
_symmetry_Int_Tables_number 40
loop_
_atom_site_label
_atom_site_type_symbol
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
Pd01 Pd 0.75000 0.17834 0.31139
Pd02 Pd 0.75000 0.17845 0.69126
Pd03 Pd 0.50000 0.00000 0.00132
S01 S 0.75000 0.81592 0.50152
Code
#!/usr/bin/php
<?PHP
//require("/code/toolbox/commandline.inc.php"); # Equivalent handling of $_GET / $_POST
# ============/code/toolbox/commandline.inc.php========================================
// Enables the same treat for command line parameters
// as those of GET parameters.
// Also sets the $first, $last ranges including the gall parameter
//Support for command line variable passing:
for($i=1;$i<sizeof($_SERVER["argv"]);$i++)
{
list($var0,$val0) = explode("=",$_SERVER["argv"][$i]);
$_GET[$var0] = $val0;
}
# ============/code/toolbox/commandline.inc.php========================================
if($_GET["h"]||$_GET["help"])
{
$help = <<<lol
* Script name: findsymmetry2cif.php *
* Converts the specified FINDSYM output to CIF format *
* More Information on FINDSYM : http://stokes.byu.edu/findsym.html *
* *
* (If you have access) More information on script: *
* http://dutsm2017.stm.tudelft.nl/mediawiki/index.php?title=Findsymm2cif
* *
* Emre S. Tasci <e.tasci@tudelft.nl> *
* 23/05/09 *
Usage:
f : input file (Default = stdin)
o : output file (Default = stdout)
identical : if set (identical=1), then the output will be the
transformation matrix and origin shift applied to the coordinates
so that the given coordinates will be regained.
speclist : Define the name of the species, seperated by 'xx' or ',' to be used
with neighbour listing (Default = AxxBxxCxx...)
(Labels can also be seperated via [space] as long as speclist is given
in quotation -- Example: ... speclist=\"Au Si\" )
Example : php findsymmetry2cif.php f=POSCAR_RhBi4 speclist=Bi,Rh identical=1
lol;
echo $help."\n";
exit;
}
$input = "php://stdin";
if($_GET["f"]) $input=$_GET["f"];
$outfile = "php://stdout";
if($_GET["o"]) $outfile=$_GET["o"];
$species_type_template = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
if($_GET["speclist"])$species_type_template = split("xx| |,",$_GET["speclist"]);
//if(file_exists("findsymm2cif_php.tmp"))
// unlink("findsymm2cif_php.tmp");
if($input == "php://stdin")
{
$lol = file("php://stdin");
$fp1 = fopen("findsymm2cif_php2.tmp","w");
foreach($lol as $line)
fwrite($fp1,$line);
fclose($fp1);
$input = "findsymm2cif_php2.tmp";
}
exec('lstart=`grep -n "Type of each atom:" '.$input.'|sed "s:^\([0-9]\+\).*:\1:gi"`;lstart=`expr $lstart + 1`;lfinish=`grep -n "Position of each atom (dimensionless coordinates)" '.$input.'|sed "s:^\([0-9]\+\).*:\1:gi"`;lfinish=`expr $lfinish - 1`;cat '.$input.' |sed -n "`echo $lstart`,`echo $lfinish`p" | sed \':a;N;$!ba;s/\n/ /g\' > findsymm2cif_php.tmp');
exec('grep "Number of atoms in unit cell:" '.$input.' -A1 | tail -n1 >> findsymm2cif_php.tmp');
exec('grep "Space Group" '.$input.' | awk \'{print $3}\' >> findsymm2cif_php.tmp');
exec('grep "Origin at" '.$input.' | awk \'{print $3 "\t" $4 "\t" $5}\' >> findsymm2cif_php.tmp');
exec('grep "Vectors a,b,c:" '.$input.' -A3 | tail -n3 >> findsymm2cif_php.tmp');
exec('grep "Values of a,b,c,alpha,beta,gamma:" '.$input.' -A1 | tail -n1 >> findsymm2cif_php.tmp');
exec('grep "Wyckoff" '.$input.' -A1 -n | grep "^[0-9]\+-[0-9]"| sed "s:\(^[0-9]\+\)-[0-9]\+\(.*\):\1\t\2:gi" >> findsymm2cif_php.tmp');
if($input == "findsymm2cif_php2.tmp")
{
$input = "php://stdin";
//unlink("findsymm2cif_php2.tmp");
}
//exec("sh findsymm2cif.sh findsymm.out",$file);
$file = file("findsymm2cif_php.tmp");
$type_atoms = split("[ \t]+",trim($file[0]));
$specie_count = Array();
$k = 0;
$specie_count[$k] = 1;
for($i=1; $i < sizeof($type_atoms); $i++)
{
if($type_atoms[$i] != $type_atoms[$i-1])
$k++;
$specie_count[$k]++;
}
for($i=1; $i<sizeof($specie_count); $i++)
$specie_count[$i] += $specie_count[$i-1];
//print_r($specie_count);
$numatoms = trim($file[1]);
$sgno = trim($file[2]);
$origin_shift = split("[ \t]+",trim($file[3]));
$tr_x = split("[ \t]+",trim($file[4]));
$tr_y = split("[ \t]+",trim($file[5]));
$tr_z = split("[ \t]+",trim($file[6]));
$params = split("[ \t]+",trim($file[7]));
$specie = Array();
for($i = 8;$i<sizeof($file);$i++)
$specie[] = split("[ \t]+",trim($file[$i]));
$totatoms = 0;
for($i = 0; $i < sizeof($specie)-1; $i++)
{
$specie[$i][0] = $specie[$i+1][0] - $specie[$i][0] - 1;
$totatoms += $specie[$i][0];
}
$specie[sizeof($specie)-1][0] = $numatoms - $totatoms;
//print_r($specie);
//print_r($specie_count);
$atoms_counted = 0;
for($i = 0; $i < sizeof($specie); $i++)
{
# Going over atoms
$atoms_counted += $specie[$i][0];
for($j = 0; $j<sizeof($specie_count); $j++)
{
if($atoms_counted <= $specie_count[$j])
{
$specie[$i][0] = $species_type_template[$j];
break;
}
}
}
//print_r($specie);
if($_GET["identical"])
{
# Calculate the atom positions corresponding with the given POSCAR
$trmatrix=Array();
$trmatrix[0][0] = $tr_x[0];
$trmatrix[0][1] = $tr_x[1];
$trmatrix[0][2] = $tr_x[2];
$trmatrix[1][0] = $tr_y[0];
$trmatrix[1][1] = $tr_y[1];
$trmatrix[1][2] = $tr_y[2];
$trmatrix[2][0] = $tr_z[0];
$trmatrix[2][1] = $tr_z[1];
$trmatrix[2][2] = $tr_z[2];
for($i=0;$i < sizeof($specie); $i++)
{
$x = $specie[$i][1];
$y = $specie[$i][2];
$z = $specie[$i][3];
$xx = $x*$trmatrix[0][0] + $y*$trmatrix[1][0] + $z*$trmatrix[2][0];
$yy = $x*$trmatrix[0][1] + $y*$trmatrix[1][1] + $z*$trmatrix[2][1];
$zz = $x*$trmatrix[0][2] + $y*$trmatrix[1][2] + $z*$trmatrix[2][2];
$xx += $origin_shift[0];
$yy += $origin_shift[1];
$zz += $origin_shift[2];
$specie[$i][1] = $xx;
$specie[$i][2] = $yy;
$specie[$i][3] = $zz;
for($j=1;$j<4;$j++)
{
while($specie[$i][$j]>=1.0)
$specie[$i][$j]-=1.0;
while($specie[$i][$j]<0.0)
$specie[$i][$j]+=1.0;
}
}
}
$fp = fopen($outfile,"w");
fwrite($fp,"_cell_length_a"."\t".$params[0]."\n");
fwrite($fp,"_cell_length_b"."\t".$params[1]."\n");
fwrite($fp,"_cell_length_c"."\t".$params[2]."\n");
fwrite($fp,"_cell_angle_alpha"."\t".$params[3]."\n");
fwrite($fp,"_cell_angle_beta"."\t".$params[4]."\n");
fwrite($fp,"_cell_angle_gamma"."\t".$params[5]."\n");
fwrite($fp,"_symmetry_Int_Tables_number"."\t".$sgno."\n\n");
fwrite($fp, "loop_\n_atom_site_label\n_atom_site_type_symbol\n_atom_site_fract_x\n_atom_site_fract_y\n_atom_site_fract_z\n");
//print_r ($specie);
$k = 0;
$specie_type = $specie[0][0];
for($i=0;$i<sizeof($specie);$i++)
{
if($specie[$i][0] == $specie_type)
$k++;
else
{
$k = 1;
$specie_type = $specie[$i][0];
}
fwrite($fp, $specie[$i][0].sprintf("%02d",$k)."\t".$specie[$i][0]."\t".sprintf("%8.5f",$specie[$i][1])."\t".sprintf("%8.5f",$specie[$i][2])."\t".sprintf("%8.5f",$specie[$i][3])."\n");
}
fclose($fp);
?>
POSCAR2Cif
May 23, 2009 Posted by Emre S. Tasci
Converts POSCAR files to CIF format. Uses Octave (latvec2par) to convert the unit cell vectors to lattice cell parameters. It is assumed (compulsory) that the atom coordinates in the POSCAR file are in fractional (direct) coordinates.
Parameters
f : input file (Default = POSCAR)
o : output file (Default = <inputfilename>.cif)
t : if set (t=1), then the output is written to the screen
speclist : Define the name of the species, seperated by 'xx' or ',' to be used
with neighbour listing (Default = AxxBxxCxx...)
(Labels can also be seperated via [space] as long as speclist is given
in quotation -- Example: ... speclist=\"Au Si\" )
Example
sururi@husniya OUTCARs_final_structures $ cat POSCAR_Pd3S
Pd3S
1.00000000000000
4.7454403619558345 0.0098182468538853 0.0000000000000000
-1.4895902658503473 4.5055989020479856 0.0000000000000000
0.0000000000000000 0.0000000000000000 7.2191545483192190
6 2
Direct
0.1330548697855782 0.5102695954022698 0.2500000000000000
0.4897304045977232 0.8669451452144267 0.7500000000000000
0.5128136657304309 0.1302873334247993 0.2500000000000000
0.8697126665752007 0.4871863042695738 0.7500000000000000
0.0013210250693640 0.9986789749306360 0.0000000000000000
0.0013210250693640 0.9986789749306360 0.5000000000000000
0.6856021298170862 0.6825558526447357 0.2500000000000000
0.3174442073552622 0.3143978111829124 0.7500000000000000
sururi@husniya OUTCARs_final_structures $ php POSCAR2CIF.php f=POSCAR_Pd3S t=1 speclist=Pd,S
data_
loop_
_symmetry_equiv_pos_as_xyz
x,y,z
_cell_length_a 4.745451
_cell_length_b 4.745451
_cell_length_c 7.219155
_cell_angle_alpha 90.000000
_cell_angle_beta 90.000000
_cell_angle_gamma 108.175792
loop_
_atom_site_label
_atom_site_type_symbol
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
Pd01 Pd 0.1330548697855782 0.5102695954022698 0.2500000000000000
Pd02 Pd 0.4897304045977232 0.8669451452144267 0.7500000000000000
Pd03 Pd 0.5128136657304309 0.1302873334247993 0.2500000000000000
Pd04 Pd 0.8697126665752007 0.4871863042695738 0.7500000000000000
Pd05 Pd 0.0013210250693640 0.9986789749306360 0.0000000000000000
Pd06 Pd 0.0013210250693640 0.9986789749306360 0.5000000000000000
S01 S 0.6856021298170862 0.6825558526447357 0.2500000000000000
S02 S 0.3174442073552622 0.3143978111829124 0.7500000000000000
Code
#!/usr/bin/php
<?PHP
/* Emre S. Tasci <e.tasci@tudelft.nl> *
* Script name: POSCAR2CIF.php *
* Converts the specified POSCAR file to CIF format *
* Uses octave to convert the unit cell vectors *
* to lattice parameters. *
* 23/05/09 */
//require("/code/toolbox/commandline.inc.php"); # Equivalent handling of $_GET / $_POST
# ============/code/toolbox/commandline.inc.php========================================
// Enables the same treat for command line parameters
// as those of GET parameters.
// Also sets the $first, $last ranges including the gall parameter
//Support for command line variable passing:
for($i=1;$i<sizeof($_SERVER["argv"]);$i++)
{
list($var0,$val0) = explode("=",$_SERVER["argv"][$i]);
$_GET[$var0] = $val0;
}
$first = -2; //disabled by default
$last = -3;
if($_GET["gfirst"]) $first = $_GET["gfirst"];
if($_GET["glast"] ) $last = $_GET["glast"];
if($_GET["gall"] ) {$first = $_GET["gall"]; $last = $first;}
# ============/code/toolbox/commandline.inc.php========================================
if($_GET["h"]||$_GET["help"])
{
$help = <<<lol
* Script name: POSCAR2CIF.php *
* Converts the specified POSCAR file to CIF format *
* Uses octave to convert the unit cell vectors *
* to lattice parameters. *
* Emre S. Tasci <e.tasci@tudelft.nl> *
* 23/05/09 *
Usage:
f : input file (Default = POSCAR)
o : output file (Default = <inputfilename>.cif)
t : if set (t=1), then the output is written to the screen
speclist : Define the name of the species, seperated by 'xx' or ',' to be used
with neighbour listing (Default = AxxBxxCxx...)
(Labels can also be seperated via [space] as long as speclist is given
in quotation -- Example: ... speclist=\"Au Si\" )
Example : php POSCAR2CIF.php f=POSCAR_RhBi4 speclist=Bi,Rh
lol;
echo $help."\n";
exit;
}
if($_GET["file"])$inputfile = $_GET["file"];
else if($_GET["f"])$inputfile = $_GET["f"];
else $inputfile="POSCAR";
$outfile = $inputfile.".cif";
if($_GET["o"]) $outfile=$_GET["o"];
if($_GET["t"]) $outfile = "php://stdout";
$species_type_template = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
if($_GET["speclist"])$species_type_template = split("xx| |,",$_GET["speclist"]);
//echo sizeof($_GET["speclist"])."\n";
exec('sed -n "3,6p" '.$inputfile.'|awk \'{print $1"\t"$2"\t"$3}\'',$out);
$octfp = fopen("octrungetvolnpar.m","w");
fwrite($octfp,"kini=[\n");
for ($i=0;$i<3;$i++)
fwrite($octfp,$out[$i]."\n");
fwrite($octfp,"];\n\n");
fwrite($octfp,"numatom = [".$out[3]."];\n\n");
$numatoms = split("[ \t]+",trim($out[3]));
// Write the octave operations
fwrite($octfp,"k1 = latvec2par (kini);totatom=sum(numatom );\n");
fwrite($octfp,"for i=1:6;printf(\"%f\\n\",k1(i));endfor;\nprintf(\"%d\\n\",totatom)\n");
fclose($octfp);
// Execute the octave file to find the lattice parameters and volume
exec('octave -q '.$thisdir.'octrungetvolnpar.m',$out3);
unlink("octrungetvolnpar.m");
//echo $out3[0]."\n";
/*
for ($i=0;$i<sizeof($out3);$i++)
echo $i."\t".$out3[$i]."\n";
*/
exec('grep "Direct" '.$inputfile.' -n|sed "s:^\([0-9]\+\).*:\1:"',$start);# Line number of the Direct prompt
$start = $start[0];
$start++;
$finish = $start+$out3[sizeof($out3)-1]-1;
exec('sed -n "'.$start.','.$finish.'p" '.$inputfile,$outr);
$fpo = fopen($outfile, "w");
fwrite($fpo, "data_\nloop_\n_symmetry_equiv_pos_as_xyz\nx,y,z\n");
fwrite($fpo, "_cell_length_a\t".$out3[0]."\n");
//echo $out3[0];
fwrite($fpo, "_cell_length_b\t".$out3[1]."\n");
fwrite($fpo, "_cell_length_c\t".$out3[2]."\n");
fwrite($fpo, "_cell_angle_alpha\t".$out3[3]."\n");
fwrite($fpo, "_cell_angle_beta\t".$out3[4]."\n");
fwrite($fpo, "_cell_angle_gamma\t".$out3[5]."\n");
fwrite($fpo, "loop_\n_atom_site_label\n_atom_site_type_symbol\n_atom_site_fract_x\n_atom_site_fract_y\n_atom_site_fract_z\n");
$k = 0;
for($specie=0;$specie<sizeof($numatoms);$specie++)
for($i=1;$i<=$numatoms[$specie];$i++)
{
fwrite($fpo, $species_type_template[$specie].sprintf("%02d",$i)."\t".$species_type_template[$specie]."\t".$outr[$k]."\n");
$k++;
}
fclose($fpo);
?>