Clazz.declarePackage ("J.adapter.readers.xtal");
Clazz.load (["J.adapter.smarter.AtomSetCollectionReader"], "J.adapter.readers.xtal.AbinitReader", null, function () {
c$ = Clazz.decorateAsClass (function () {
this.znucl = null;
this.inputOnly = false;
this.nAtom = 0;
this.nType = 0;
this.typeArray = null;
this.cellLattice = null;
Clazz.instantialize (this, arguments);
}, J.adapter.readers.xtal, "AbinitReader", J.adapter.smarter.AtomSetCollectionReader);
Clazz.overrideMethod (c$, "initializeReader", 
function () {
this.setSpaceGroupName ("P1");
this.doApplySymmetry = true;
this.setFractionalCoordinates (false);
this.inputOnly = this.checkFilterKey ("INPUT");
});
Clazz.overrideMethod (c$, "checkLine", 
function () {
if (this.line.contains ("natom")) {
this.readNoatom ();
} else if (this.line.contains ("ntypat") || this.line.contains ("ntype")) {
this.readNotypes ();
} else if (this.line.contains ("typat") || this.line.contains ("type")) {
this.readTypesequence ();
} else if (this.line.contains ("Pseudopotential")) {
this.readAtomSpecies ();
} else if (this.line.contains ("Symmetries :")) {
this.readSpaceGroup ();
} else if (this.line.contains ("Real(R)+Recip(G)")) {
this.readIntiallattice ();
if (this.inputOnly) this.continuing = false;
} else if (this.line.contains ("xcart")) {
this.readAtoms ();
}return true;
});
Clazz.defineMethod (c$, "readNoatom", 
 function () {
var tokens = this.getTokens ();
if (tokens.length <= 2) this.nAtom = this.parseIntStr (tokens[1]);
});
Clazz.defineMethod (c$, "readNotypes", 
 function () {
var tokens = this.getTokens ();
if (tokens.length <= 2) this.nType = this.parseIntStr (tokens[1]);
});
Clazz.defineMethod (c$, "readTypesequence", 
 function () {
this.fillFloatArray (this.line.substring (12), 0, this.typeArray =  Clazz.newFloatArray (this.nAtom, 0));
});
Clazz.defineMethod (c$, "readAtomSpecies", 
 function () {
this.znucl =  Clazz.newFloatArray (this.nType, 0);
for (var i = 0; i < this.nType; i++) {
this.discardLinesUntilContains ("zion");
var tokens = this.getTokens ();
this.znucl[i] = this.parseFloatStr (tokens[tokens[0] === "-" ? 1 : 0]);
}
});
Clazz.defineMethod (c$, "readSpaceGroup", 
 function () {
});
Clazz.defineMethod (c$, "readIntiallattice", 
 function () {
var f = 0;
this.cellLattice =  Clazz.newFloatArray (9, 0);
for (var i = 0; i < 9; i++) {
if (i % 3 == 0) {
this.line = this.rd ().substring (6);
f = this.parseFloatStr (this.line);
}this.cellLattice[i] = f * 0.5291772;
f = this.parseFloat ();
}
this.applySymmetry ();
});
Clazz.defineMethod (c$, "applySymmetry", 
 function () {
if (this.cellLattice == null) return;
this.setSpaceGroupName ("P1");
for (var i = 0; i < 3; i++) this.addExplicitLatticeVector (i, this.cellLattice, i * 3);

var atoms = this.asc.atoms;
var i0 = this.asc.getAtomSetAtomIndex (this.asc.iSet);
if (!this.iHaveFractionalCoordinates) for (var i = this.asc.ac; --i >= i0; ) this.setAtomCoord (atoms[i]);

this.applySymmetryAndSetTrajectory ();
});
Clazz.defineMethod (c$, "readAtoms", 
 function () {
this.asc.newAtomSet ();
this.iHaveFractionalCoordinates = false;
var i0 = this.asc.ac;
this.line = this.line.substring (12);
while (this.line != null && !this.line.contains ("x")) {
var atom = this.asc.addNewAtom ();
this.setAtomCoordScaled (atom, this.getTokens (), 0, 0.5291772);
this.rd ();
}
this.discardLinesUntilContains ("z");
if (this.znucl == null) this.fillFloatArray (this.line.substring (12), 0, this.znucl =  Clazz.newFloatArray (this.nType, 0));
var atoms = this.asc.atoms;
for (var i = 0; i < this.nAtom; i++) atoms[i + i0].elementNumber = Clazz.floatToShort (this.znucl[Clazz.floatToInt (this.typeArray[i]) - 1]);

this.applySymmetry ();
});
});
