Poscar2xcrysden.pl: Difference between revisions

From Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 17: Line 17:




print "Insert the atoms number of each specie\n";
print "Insert the atoms number of each specie\n";
print "For finish Ctrl+D:\n";
print "For finish Ctrl+D:\n";


@at=<STDIN>;
@at=<STDIN>;


print "\n";
print "\n";
print "Insert the species labels\n";
print "Insert the species labels\n";


for ($p=0;$p<@at;$p++){
for ($p=0;$p<@at;$p++){


   $k=$p+1;
   $k=$p+1;
Line 37: Line 37:




for ($r=0; $r<@ARGV;$r++) {
for ($r=0; $r<@ARGV;$r++) {


  #for ($r=0;$r<$#ARGV+1;$r++) { #$numArgs = $#ARGV + 1;  
  #for ($r=0;$r<$#ARGV+1;$r++) { #$numArgs = $#ARGV + 1;  
Line 43: Line 43:
  #print "$ARGV[$r] : $ENV{$ARGV[$r]}\n";
  #print "$ARGV[$r] : $ENV{$ARGV[$r]}\n";


open (IN,$ARGV[$r]);
open (IN,$ARGV[$r]);


$i=0;
$i=0;
          
          
         @at=();               
         @at=();               


while (<IN>) {
while (<IN>) {


   if ($. ==1){ $name=$_;chomp($name);};
   if ($. ==1){ $name=$_;chomp($name);};
Line 116: Line 116:
   };
   };


};
};


close (IN);
close (IN);


  # DATA PROCESSING
  # DATA PROCESSING
Line 124: Line 124:
  # Convert fractional coordinates to positive values  
  # Convert fractional coordinates to positive values  


for ($p=0;$p<$NAT;$p++){
for ($p=0;$p<$NAT;$p++){


   if ($x[$p]<0.0) {
   if ($x[$p]<0.0) {
Line 144: Line 144:
   };
   };


};
};


  # 1.Transformation to cartesian coordinates   
  # 1.Transformation to cartesian coordinates   


for ($i=0;$i<$NAT;$i++){
for ($i=0;$i<$NAT;$i++){


   $xc[$i]=($escala)*($x[$i]*$ax+$y[$i]*$bx+$z[$i]*$cx);
   $xc[$i]=($escala)*($x[$i]*$ax+$y[$i]*$bx+$z[$i]*$cx);
Line 159: Line 159:
   #print "$zc[$i]";
   #print "$zc[$i]";


};
};


  # 2.Write results in suitable format  
  # 2.Write results in suitable format  


@output=<$ARGV[$r].xcrysden>; chomp(@output);
@output=<$ARGV[$r].xcrysden>; chomp(@output);




open (OUT1, ">@output");  
open (OUT1, ">@output");  




print OUT1 "set xsfStructure {\n";
print OUT1 "set xsfStructure {\n";


print OUT1 " DIM-GROUP\n";
print OUT1 " DIM-GROUP\n";


print OUT1 " 3 1\n";
print OUT1 " 3 1\n";


print OUT1 " PRIMVEC\n";
print OUT1 " PRIMVEC\n";


$eax=$escala*$ax;$eay=$escala*$ay;$eaz=$escala*$az;
$eax=$escala*$ax;$eay=$escala*$ay;$eaz=$escala*$az;


printf OUT1 "%3.10f %3.10f %3.10f\n",$eax,$eay,$eaz;
printf OUT1 "%3.10f %3.10f %3.10f\n",$eax,$eay,$eaz;


$ebx=$escala*$bx;$eby=$escala*$by;$ebz=$escala*$bz;
$ebx=$escala*$bx;$eby=$escala*$by;$ebz=$escala*$bz;


printf OUT1 "%3.10f %3.10f %3.10f\n",$ebx,$eby,$ebz;
printf OUT1 "%3.10f %3.10f %3.10f\n",$ebx,$eby,$ebz;


$ecx=$escala*$cx;$ecy=$escala*$cy;$ecz=$escala*$cz;
$ecx=$escala*$cx;$ecy=$escala*$cy;$ecz=$escala*$cz;


printf OUT1 "%3.10f %3.10f %3.10f\n",$ecx,$ecy,$ecz;
printf OUT1 "%3.10f %3.10f %3.10f\n",$ecx,$ecy,$ecz;


print OUT1 " PRIMCOORD\n";
print OUT1 " PRIMCOORD\n";


printf OUT1 "%5.0f 1\n",$NAT;
printf OUT1 "%5.0f 1\n",$NAT;




Line 197: Line 197:




$index=0;
  $index=0;


for ($p=0;$p<@at;$p++){
  for ($p=0;$p<@at;$p++){
    
    
   for ($i=$index;$i<$index+$at[$p];$i++){
   for ($i=$index;$i<$index+$at[$p];$i++){
Line 209: Line 209:
   $index=$index+$at[$p];
   $index=$index+$at[$p];


};
  };






print OUT1 "}\n";
print OUT1 "}\n";


print OUT1 "WriteFile  \$system(SCRDIR)/xc_tmp.\$system(PID) \$xsfStructure w\n";
print OUT1 "WriteFile  \$system(SCRDIR)/xc_tmp.\$system(PID) \$xsfStructure w\n";


print OUT1 "catch {exec \$system(BINDIR)/xsf2xsf \$system(SCRDIR)/xc_tmp.\$system(PID) \$system(SCRDIR)/xc_struc.\$system(PID)}\n";
print OUT1 "catch {exec \$system(BINDIR)/xsf2xsf \$system(SCRDIR)/xc_tmp.\$system(PID) \$system(SCRDIR)/xc_struc.\$system(PID)}\n";


print OUT1 "xc_openstr xcr \$system(SCRDIR)/xc_struc.\$system(PID) .mesa PL\n";
print OUT1 "xc_openstr xcr \$system(SCRDIR)/xc_struc.\$system(PID) .mesa PL\n";


print OUT1 "UpdateWMTitle  tempest.xcrysden\n";
print OUT1 "UpdateWMTitle  tempest.xcrysden\n";


print OUT1 "set working_XSF_file \$system(SCRDIR)/xc_struc.\$system(PID)\n";
print OUT1 "set working_XSF_file \$system(SCRDIR)/xc_struc.\$system(PID)\n";


print OUT1 "Get_sInfoArray\n";
print OUT1 "Get_sInfoArray\n";


print OUT1 "DisplayDefaultMode\n";
print OUT1 "DisplayDefaultMode\n";


print OUT1 " xcAppendState render\n";
print OUT1 " xcAppendState render\n";


print OUT1 " xcUpdateState\n";
print OUT1 " xcUpdateState\n";


print OUT1 "SetWatchCursor\n";
print OUT1 "SetWatchCursor\n";


print OUT1 " set xcCursor(dont_update) 1\n";
print OUT1 " set xcCursor(dont_update) 1\n";


print OUT1 "set nxdir 1\n";
print OUT1 "set nxdir 1\n";


print OUT1 "set nydir 1\n";
print OUT1 "set nydir 1\n";


print OUT1 "set nzdir 1\n";
print OUT1 "set nzdir 1\n";


print OUT1 "array set radio {space {SpaceFill based on covalent radii} .mesa,bg #000000 cellmode prim frames rods unitrep cell hexamode parapipedal ball {Balls based on covalent radii}}\n";
print OUT1 "array set radio {space {SpaceFill based on covalent radii} .mesa,bg #000000 cellmode prim frames rods unitrep cell hexamode parapipedal ball     {Balls based on covalent radii}}\n";


print OUT1 "CellMode 1\n";
print OUT1 "CellMode 1\n";


print OUT1 "DispFramesAs\n";
print OUT1 "DispFramesAs\n";


print OUT1 "xc_newvalue .mesa 2\n";
print OUT1 "xc_newvalue .mesa 2\n";


print OUT1 "xc_newvalue .mesa 0\n";
print OUT1 "xc_newvalue .mesa 0\n";


print OUT1 "set xcCursor(dont_update) 0\n";
print OUT1 "set xcCursor(dont_update) 0\n";


print OUT1 "ResetCursor\n";
print OUT1 "ResetCursor\n";


close (OUT1);
close (OUT1);


print "\n";
print "\n";


print "Result in @output\n";
print "Result in @output\n";


print "\n";
print "\n";


print "                                      J.C.R\n";
print "                                      J.C.R\n";
};
};

Revision as of 15:17, 1 August 2007

#! /usr/bin/perl
#----------------------------------------------------------------
# PROGRAM FOR  GENERATE XCRYSDEN INPUTS    
# OF VASP POSCAR/CONTCAR FILES   
#
# UTILIZATION:
# perl Poscar2xcrysden.pl file1 file2 .... fileN
#
# By Javier Carrasco (carrasco@qf.ub.es)
# Modified By Monica Garcia  (mgarcia@iciq.es)
#----------------------------------------------------------------
#READ PARAMETERS FOR GENERATE OUTPUT 


print "Insert the atoms number of each specie\n";
print "For finish Ctrl+D:\n";
@at=<STDIN>;
print "\n";
print "Insert the species labels\n";
for ($p=0;$p<@at;$p++){
  $k=$p+1;
        print "Label $k, $at[$p] atom/s de:\n";
                 $label[$p]=<STDIN>;chomp($label[$p]);
                          };
                          
#READ poscar/contcar FILES 


for ($r=0; $r<@ARGV;$r++) {
#for ($r=0;$r<$#ARGV+1;$r++) { #$numArgs = $#ARGV + 1; 
#print "$ARGV[$r] : $ENV{$ARGV[$r]}\n";
open (IN,$ARGV[$r]);

$i=0;

       @at=();               

while (<IN>) {

 		if ($. ==1){ $name=$_;chomp($name);};
 		if ($. ==2) { $escala=$_;chomp($escala);};
 		if ($. ==3) {
     			@fields=split(' ');
     			$ax=$fields[0];
     			$ay=$fields[1];
     			$az=$fields[2];
 		};
  		if ($.==4){
     			@fields=split(' ');
     			$bx=$fields[0];
      			$by=$fields[1];
     			$bz=$fields[2];
 		};
  		if ($.==5){
     			@fields=split(' ');
     			$cx=$fields[0];
      			$cy=$fields[1];
     			$cz=$fields[2];
		 };
 		if ($.==6){
     			@at=split(' ');
                       #print "@at";
                       $NAT=0;
      			$suma=0;
      			$sum=0;
      			for ($j=0;$j<@at;$j++){
         			$at[$j]=$at[$j];
         			$sum=$sum+1;
         			$NAT=$NAT+$at[$j];
      			};
                       #print "$NAT";
 		};
 		if (($.>8)&&($.<$NAT+9)){
     			@fields=split (' ');
     			$x[$i]=$fields[0];$y[$i]=$fields[1];$z[$i]=$fields[2];
     			$optx[$i]=$fields[3];$opty[$i]=$fields[4];$optz[$i]=$fields[5];


     			$i++;
 		};
};
close (IN);
# DATA PROCESSING
# Convert fractional coordinates to positive values 
for ($p=0;$p<$NAT;$p++){
  if ($x[$p]<0.0) {
     $x[$p]=$x[$p]+1;
  };
  if ($y[$p]<0.0) {
     $y[$p]=$y[$p]+1;
  };
  if ($z[$p]<0.0) {
     $z[$p]=$z[$p]+1;
  };
};
# 1.Transformation to cartesian coordinates  
for ($i=0;$i<$NAT;$i++){
  $xc[$i]=($escala)*($x[$i]*$ax+$y[$i]*$bx+$z[$i]*$cx);
  #print "$xc[$i]";
  $yc[$i]=($escala)*($x[$i]*$ay+$y[$i]*$by+$z[$i]*$cy);
  #print "$yc[$i]";
  $zc[$i]=($escala)*($x[$i]*$az+$y[$i]*$bz+$z[$i]*$cz);
  #print "$zc[$i]";
};
# 2.Write results in suitable format 
@output=<$ARGV[$r].xcrysden>; chomp(@output);


open (OUT1, ">@output"); 


print OUT1 "set xsfStructure {\n";
print OUT1 " DIM-GROUP\n";
print OUT1 " 3 1\n";
print OUT1 " PRIMVEC\n";
$eax=$escala*$ax;$eay=$escala*$ay;$eaz=$escala*$az;
printf OUT1 "%3.10f %3.10f %3.10f\n",$eax,$eay,$eaz;
$ebx=$escala*$bx;$eby=$escala*$by;$ebz=$escala*$bz;
printf OUT1 "%3.10f %3.10f %3.10f\n",$ebx,$eby,$ebz;
$ecx=$escala*$cx;$ecy=$escala*$cy;$ecz=$escala*$cz;
printf OUT1 "%3.10f %3.10f %3.10f\n",$ecx,$ecy,$ecz;
print OUT1 " PRIMCOORD\n";
printf OUT1 "%5.0f 1\n",$NAT;


#Initialization  $index


 $index=0;
 for ($p=0;$p<@at;$p++){
 
  for ($i=$index;$i<$index+$at[$p];$i++){
  printf OUT1 "$label[$p] %2.8f %2.8f %2.8f\n",$xc[$i],$yc[$i],$zc[$i];
  };
  $index=$index+$at[$p];
 };


print OUT1 "}\n";
print OUT1 "WriteFile   \$system(SCRDIR)/xc_tmp.\$system(PID) \$xsfStructure w\n";
print OUT1 "catch {exec \$system(BINDIR)/xsf2xsf \$system(SCRDIR)/xc_tmp.\$system(PID) \$system(SCRDIR)/xc_struc.\$system(PID)}\n";
print OUT1 "xc_openstr xcr \$system(SCRDIR)/xc_struc.\$system(PID) .mesa PL\n";
print OUT1 "UpdateWMTitle  tempest.xcrysden\n";
print OUT1 "set working_XSF_file \$system(SCRDIR)/xc_struc.\$system(PID)\n";
print OUT1 "Get_sInfoArray\n";
print OUT1 "DisplayDefaultMode\n";
print OUT1 " xcAppendState render\n";
print OUT1 " xcUpdateState\n";
print OUT1 "SetWatchCursor\n";
print OUT1 " set xcCursor(dont_update) 1\n";
print OUT1 "set nxdir 1\n";
print OUT1 "set nydir 1\n";
print OUT1 "set nzdir 1\n";
print OUT1 "array set radio {space {SpaceFill based on covalent radii} .mesa,bg #000000 cellmode prim frames rods unitrep cell hexamode parapipedal ball      {Balls based on covalent radii}}\n";
print OUT1 "CellMode 1\n";
print OUT1 "DispFramesAs\n";
print OUT1 "xc_newvalue .mesa 2\n";
print OUT1 "xc_newvalue .mesa 0\n";
print OUT1 "set xcCursor(dont_update) 0\n";
print OUT1 "ResetCursor\n";
close (OUT1);
print "\n";
print "Result in @output\n";
print "\n";
print "                                      J.C.R\n";
};