XML, 行列演算のためのperl モジュールの追加@ubuntu クラスタ

XMLファイルを読み、中のデータを用いて行列演算して新たな出力を出すperlスクリプトを作った。数台からなる計算機クラスタでqsubで実行すると、XML::TreePPがないと言われて蹴られる。locateすると出てくるのだが。。

 

解決:クラスタのほかのノードで当該モジュールがないのだった。

 

apt install libxml-treepp-perl

apt install pdl

 

pdlはpythonのnumpyに相当し、線形代数の演算ができる。

 

XMLを読むのは、pythonよりperlのほうが情報豊富で苦労しなさげ。

 

 

perl スクリプト(抜粋)

#!/usr/bin/perl
use XML::TreePP;
use PDL;
use PDL::Matrix;
$atoangs = 0.529177210903;
$tpp = XML::TreePP->new();
$output_str = $tpp->parsefile( "./pwscf.save/data-file-schema.xml" )->{'qes:espresso'}->{output}->{atomic_structure};
$outfile="outfile.in";
$species = $tpp->parsefile( "./pwscf.save/data-file-schema.xml" )->{'qes:espresso'}->{output}->{atomic_species}{species};
for ($cnt = 0; $cnt < @$species; $cnt++) {
$Elename[$cnt] = $species->[$cnt]{"-name"};
$AM[$cnt] = $species->[$cnt]->{mass};
$pseu[$cnt] = $species->[$cnt]->{pseudo_file};
}
$NumEle = $cnt;
$cell = $output_str->{cell};
@values1 = split(/\ +/, $cell->{a1});
@values2 = split(/\ +/, $cell->{a2});
@values3 = split(/\ +/, $cell->{a3});
$latmat = transpose mpdl [$values1[0], $values1[1], $values1[2]],[$values2[0], $values2[1], $values2[2]], [$values3[0], $values3[1], $values3[2]];
$inv_latmat = matinv $latmat;
$latmat_angs = $latmat * $atoangs;
print $latmat_angs;
$atoms = $output_str->{atomic_positions}{atom};
for ($cnt = 0; $cnt < @$atoms; $cnt++) {
$Ele[$cnt] = $atoms->[$cnt]{"-name"};
@values = split(/\ +/, $atoms->[$cnt]{"#text"});
$vecs[$cnt] = $inv_latmat x vpdl [$values[0], $values[1], $values[2]];
}
$NumAtom = $cnt;
 

 

XMLファイル(抜粋)

<?xml version="1.0" encoding="UTF-8"?>
<qes:espresso xsi:schemaLocation="http://www.quantum-espresso.org/ns/qes/qes-1.0 http://www.quantum-espresso.org/ns/qes/qes_190304.xsd" Units="Hartree atomic units" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:qes="http://www.quantum-espresso.org/ns/qes/qes-1.0">
<!--If not explicitely indicated, all quantities are expressed in Hartree atomic units-->
 <output>
  <atomic_species ntyp="3" pseudo_dir="/home/kazu/code/q-e-qe-6.4.1/pseudo/">
   <species name="La">
    <mass>1.389054700000000e2</mass>
    <pseudo_file>La.GGA-PBE-paw-v1.0.UPF</pseudo_file>
   </species>
   <species name="Ni">
    <mass>5.869340000000000e1</mass>
    <pseudo_file>Ni.pbe-n-kjpaw_psl.0.1.UPF</pseudo_file>
   </species>
   <species name="H">
    <mass>1.007840000000000e0</mass>
    <pseudo_file>H.pbe-kjpaw.UPF</pseudo_file>
   </species>
  </atomic_species>
  <atomic_structure nat="7" alat="9.465753785382e0">
   <atomic_positions>
    <atom name="La" index="1">-1.217251700909747e-32 2.141722930468157e-29 -2.721842942506151e-2</atom>
    <atom name="Ni" index="2">4.814656111825143e0 1.323651475565205e-1 3.788438000729285e0</atom>
    <atom name="Ni" index="3">-2.521959636272156e0 4.103431929548313e0 3.788438000729285e0</atom>
    <atom name="Ni" index="4">2.521959636272268e0 4.103431929548313e0 3.788438000729285e0</atom>
    <atom name="Ni" index="5">-7.881823348472788e-15 5.559486004435515e0 1.717033344341329e-1</atom>
    <atom name="Ni" index="6">4.814656111825137e0 2.779743002217776e0 6.059817340507488e-4</atom>
    <atom name="H" index="7">-7.881823348472788e-15 5.559486004435515e0 4.762324442962814e0</atom>
   </atomic_positions>
   <cell>
    <a1>9.629312223650285e0 5.119608937696974e-17 -6.690357308400310e-32</a1>
    <a2>-4.814656111825132e0 8.339229006653209e0 1.266195749666919e-30</a2>
    <a3>3.414603160550775e-30 6.419899798150495e-30 7.639779029058094e0</a3>
   </cell>
  </atomic_structure>