From: <ha...@us...> - 2011-09-09 00:17:10
|
Revision: 16047 http://jmol.svn.sourceforge.net/jmol/?rev=16047&view=rev Author: hansonr Date: 2011-09-09 00:17:04 +0000 (Fri, 09 Sep 2011) Log Message: ----------- version=12.2.RC6 # new feature: preliminary CASTEP .phonon frequency file reader Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-08 20:58:32 UTC (rev 16046) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-09 00:17:04 UTC (rev 16047) @@ -53,8 +53,9 @@ /** * CASTEP (http://www.castep.org) .cell file format - * * relevant section of .cell file are included as comments below + * + * also .phonon frequency reader -- ha...@st... 9/2011 * * @author Joerg Meyer, FHI Berlin 2009 (me...@fh...) * @version 1.2 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-09 11:42:51
|
Revision: 16048 http://jmol.svn.sourceforge.net/jmol/?rev=16048&view=rev Author: hansonr Date: 2011-09-09 11:42:44 +0000 (Fri, 09 Sep 2011) Log Message: ----------- Castep reader phonon Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-09 00:17:04 UTC (rev 16047) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-09 11:42:44 UTC (rev 16048) @@ -55,7 +55,8 @@ * CASTEP (http://www.castep.org) .cell file format * relevant section of .cell file are included as comments below * - * also .phonon frequency reader -- ha...@st... 9/2011 + * preliminary .phonon frequency reader -- ha...@st... 9/2011 + * atom's mass is encoded as bfactor * * @author Joerg Meyer, FHI Berlin 2009 (me...@fh...) * @version 1.2 @@ -70,6 +71,8 @@ private boolean iHaveFractionalCoordinates; private boolean isPhonon; + private int atomCount; + @Override public void initializeReader() throws Exception { @@ -135,15 +138,6 @@ continuing = false; } - /* - Unit cell vectors (A) - 0.000000 1.819623 1.819623 - 1.819623 0.000000 1.819623 - 1.819623 1.819623 0.000000 - Fractional Co-ordinates - 1 0.000000 0.000000 0.000000 B 10.811000 - 2 0.250000 0.250000 0.250000 N 14.006740 - */ @Override protected boolean checkLine() throws Exception { // only for .phonon file @@ -157,81 +151,11 @@ } if (line.indexOf("q-pt") >= 0) { readPhononFrequencies(); + return true; } return true; } - private void readPhononUnitCell() throws Exception { - abc = readDirectLatticeVectors(line.indexOf("bohr") >= 0); - setSpaceGroupName("P1"); - setLatticeVectors(); - } - - private void readPhononFractionalCoord() throws Exception { - setFractionalCoordinates(true); - while (readLine() != null && line.indexOf("END") < 0) { - String[] tokens = getTokens(); - Atom atom = atomSetCollection.addNewAtom(); - setAtomCoord(atom, parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3])); - atom.elementSymbol = tokens[4]; - } - } - - - /* - q-pt= 1 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000 - 1 58.268188 0.0000000 - 2 58.268188 0.0000000 - 3 58.292484 0.0000000 - 4 1026.286406 13.9270643 - 5 1026.286406 13.9270643 - 6 1262.072445 13.9271267 - Phonon Eigenvectors - Mode Ion X Y Z - 1 1 -0.188759409143 0.000000000000 0.344150676582 0.000000000000 -0.532910085817 0.000000000000 - 1 2 -0.213788416373 0.000000000000 0.389784162147 0.000000000000 -0.603572578624 0.000000000000 - 2 1 -0.506371267280 0.000000000000 -0.416656077168 0.000000000000 -0.089715190073 0.000000000000 - 2 2 -0.573514781701 0.000000000000 -0.471903590472 0.000000000000 -0.101611191184 0.000000000000 - 3 1 0.381712598768 0.000000000000 -0.381712598812 0.000000000000 -0.381712598730 0.000000000000 - 3 2 0.433161430960 0.000000000000 -0.433161431010 0.000000000000 -0.433161430917 0.000000000000 - 4 1 0.431092607594 0.000000000000 -0.160735361462 0.000000000000 0.591827969056 0.000000000000 - 4 2 -0.380622988260 0.000000000000 0.141917473232 0.000000000000 -0.522540461492 0.000000000000 - 5 1 0.434492641457 0.000000000000 0.590583470288 0.000000000000 -0.156090828832 0.000000000000 - 5 2 -0.383624967478 0.000000000000 -0.521441660837 0.000000000000 0.137816693359 0.000000000000 - 6 1 0.433161430963 0.000000000000 -0.433161430963 0.000000000000 -0.433161430963 0.000000000000 - 6 2 -0.381712598770 0.000000000000 0.381712598770 0.000000000000 0.381712598770 0.000000000000 - */ - - private void readPhononFrequencies() throws Exception { - List<Float> freqs = new ArrayList<Float>(); - while (readLine() != null && line.indexOf("Phonon") < 0) { - String[] tokens = getTokens(); - freqs.add(Float.valueOf(parseFloat(tokens[1]))); - } - readLine(); - int frequencyCount = freqs.size(); - int atomCount = atomSetCollection.getAtomCount(); - for (int i = 0; i < frequencyCount; i++) { - if (!doGetVibration(++vibrationNumber)) { - for (int j = 0; j < atomCount; j++) - readLine(); - continue; - } - cloneLastAtomSet(atomCount); - int iAtom = atomSetCollection.getLastAtomSetAtomIndex(); - float freq = freqs.get(i).floatValue(); - atomSetCollection.setAtomSetFrequency(null, null, "" + freq, null); - atomSetCollection.setAtomSetName(TextFormat.formatDecimal(freq, 2) - + " cm-1"); - for (int j = 0; j < atomCount; j++) { - String[] tokens = getTokens(readLine()); - atomSetCollection.addVibrationVector(iAtom++, parseFloat(tokens[2]), - parseFloat(tokens[4]), parseFloat(tokens[6]), true); - } - } - } - - @Override protected void finalizeReader() throws Exception { if (isPhonon) { @@ -401,4 +325,97 @@ } return tokens.length; } + + //////////// phonon code //////////// + + /* + Unit cell vectors (A) + 0.000000 1.819623 1.819623 + 1.819623 0.000000 1.819623 + 1.819623 1.819623 0.000000 + Fractional Co-ordinates + 1 0.000000 0.000000 0.000000 B 10.811000 + 2 0.250000 0.250000 0.250000 N 14.006740 + */ + private void readPhononUnitCell() throws Exception { + abc = readDirectLatticeVectors(line.indexOf("bohr") >= 0); + setSpaceGroupName("P1"); + setLatticeVectors(); + } + + private void readPhononFractionalCoord() throws Exception { + setFractionalCoordinates(true); + while (readLine() != null && line.indexOf("END") < 0) { + String[] tokens = getTokens(); + Atom atom = atomSetCollection.addNewAtom(); + setAtomCoord(atom, parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3])); + atom.bfactor = parseFloat(tokens[5]); // mass, actually + atom.elementSymbol = tokens[4]; + } + atomCount = atomSetCollection.getAtomCount(); + } + + + /* + q-pt= 1 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000 + 1 58.268188 0.0000000 + 2 58.268188 0.0000000 + 3 58.292484 0.0000000 + 4 1026.286406 13.9270643 + 5 1026.286406 13.9270643 + 6 1262.072445 13.9271267 + Phonon Eigenvectors + Mode Ion X Y Z + 1 1 -0.188759409143 0.000000000000 0.344150676582 0.000000000000 -0.532910085817 0.000000000000 + 1 2 -0.213788416373 0.000000000000 0.389784162147 0.000000000000 -0.603572578624 0.000000000000 + 2 1 -0.506371267280 0.000000000000 -0.416656077168 0.000000000000 -0.089715190073 0.000000000000 + 2 2 -0.573514781701 0.000000000000 -0.471903590472 0.000000000000 -0.101611191184 0.000000000000 + 3 1 0.381712598768 0.000000000000 -0.381712598812 0.000000000000 -0.381712598730 0.000000000000 + 3 2 0.433161430960 0.000000000000 -0.433161431010 0.000000000000 -0.433161430917 0.000000000000 + 4 1 0.431092607594 0.000000000000 -0.160735361462 0.000000000000 0.591827969056 0.000000000000 + 4 2 -0.380622988260 0.000000000000 0.141917473232 0.000000000000 -0.522540461492 0.000000000000 + 5 1 0.434492641457 0.000000000000 0.590583470288 0.000000000000 -0.156090828832 0.000000000000 + 5 2 -0.383624967478 0.000000000000 -0.521441660837 0.000000000000 0.137816693359 0.000000000000 + 6 1 0.433161430963 0.000000000000 -0.433161430963 0.000000000000 -0.433161430963 0.000000000000 + 6 2 -0.381712598770 0.000000000000 0.381712598770 0.000000000000 0.381712598770 0.000000000000 + */ + + private void readPhononFrequencies() throws Exception { + String[] tokens = getTokens(); + Vector3f qvec = new Vector3f(parseFloat(tokens[2]),parseFloat(tokens[3]),parseFloat(tokens[4])); + if (supercell == null && qvec.length() != 0) + return; + List<Float> freqs = new ArrayList<Float>(); + while (readLine() != null && line.indexOf("Phonon") < 0) { + tokens = getTokens(); + freqs.add(Float.valueOf(parseFloat(tokens[1]))); + } + readLine(); + int frequencyCount = freqs.size(); + for (int i = 0; i < frequencyCount; i++) { + if (!doGetVibration(++vibrationNumber)) { + for (int j = 0; j < atomCount; j++) + readLine(); + continue; + } + if (desiredVibrationNumber <= 0) + cloneLastAtomSet(atomCount); + int iAtom = atomSetCollection.getLastAtomSetAtomIndex(); + float freq = freqs.get(i).floatValue(); + atomSetCollection.setAtomSetFrequency(null, null, "" + freq, null); + atomSetCollection.setAtomSetName(TextFormat.formatDecimal(freq, 2) + + " cm-1"); + Atom[] atoms = atomSetCollection.getAtoms(); + for (int j = 0; j < atomCount; j++) { + tokens = getTokens(readLine()); + float factor = (float) Math.sqrt(1/atoms[iAtom].bfactor); + atomSetCollection.addVibrationVector(iAtom++, parseFloat(tokens[2]) * factor, + parseFloat(tokens[4]) * factor, parseFloat(tokens[6]) * factor, true); + } + } + } + + + + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-11 18:33:15
|
Revision: 16058 http://jmol.svn.sourceforge.net/jmol/?rev=16058&view=rev Author: hansonr Date: 2011-09-11 18:33:09 +0000 (Sun, 11 Sep 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 12:08:27 UTC (rev 16057) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 18:33:09 UTC (rev 16058) @@ -78,11 +78,8 @@ public void initializeReader() throws Exception { while (tokenizeCastepCell() > 0) { - if (isPhonon) { - if (doPackUnitCell && supercell != null) - doPackUnitCell = false; + if (isPhonon) return; // use checkLine - } if ((tokens.length >= 2) && (tokens[0].equalsIgnoreCase("%BLOCK"))) { /* @@ -405,11 +402,12 @@ boolean isGammaPoint = (qvec.length() == 0); float[] fsc = (supercell == null || !supercell.startsWith("=") ? null : atomSetCollection.setSuperCell(supercell.substring(1), new float[16])); + float nx = 0, ny = 0, nz = 0; if (fsc != null) { // only select corresponding phonon vector -- one that has integral dot product - float dx = (qvec.x == 0 ? 1 : qvec.x) * fsc[0]; - float dy = (qvec.y == 0 ? 1 : qvec.y) * fsc[5]; - float dz = (qvec.z == 0 ? 1 : qvec.z) * fsc[10]; + float dx = (qvec.x == 0 ? 1 : qvec.x) * (nx = fsc[0]); + float dy = (qvec.y == 0 ? 1 : qvec.y) * (ny = fsc[5]); + float dz = (qvec.z == 0 ? 1 : qvec.z) * (nz = fsc[10]); if (Math.abs(dx - 1) > 0.001 || Math.abs(dy - 1) > 0.001 || Math.abs(dz - 1) > 0.001 @@ -436,6 +434,7 @@ int frequencyCount = freqs.size(); float[] data = new float[8]; Vector3f v = new Vector3f(); + Vector3f t = new Vector3f(); atomSetCollection.setCollectionName(qname); for (int i = 0; i < frequencyCount; i++) { if (!doGetVibration(++vibrationNumber)) { @@ -447,6 +446,7 @@ cloneLastAtomSet(atomCount, atomPts); applySymmetryAndSetTrajectory(); } + symmetry = atomSetCollection.getSymmetry(); int iatom = atomSetCollection.getLastAtomSetAtomIndex(); float freq = freqs.get(i).floatValue(); atomSetCollection.setAtomSetFrequency(null, null, "" + freq, null); @@ -456,37 +456,41 @@ int aCount = atomSetCollection.getAtomCount(); for (int j = 0; j < atomCount; j++) { fillFloatArray(null, 0, data); - for (int ipt = 0, k = iatom++; k < aCount; k++) + for (int k = iatom++; k < aCount; k++) if (atoms[k].atomSite == j) { - setPhononVector(data, atoms[k], ipt++, qvec, v); + if (qvec != null) { + // fractional coordinates now in terms of + // the SUPERCELL need to be multiplied by + // the supercell scaling factors + t.sub(atoms[k], atoms[atoms[k].atomSite]); + t.x *= nx; + t.y *= ny; + t.z *= nz; + } + setPhononVector(data, atoms[k], t, qvec, v); atomSetCollection.addVibrationVector(k, v.x, v.y, v.z, true); } } } } - private final static Vector3f v000 = new Vector3f(); - private static final double TWOPI = Math.PI * 2; /** * transform complex vibration vector to a real vector by * applying the appropriate translation, * storing the results in v * - * @param data from .phonon line parsed for floats + * @param data from .phonon line parsed for floats * @param atom - * @param icell - * @param qvec - * @param v return vector + * @param rTrans translation vector in unit fractional coord + * @param qvec q point vector + * @param v return vector */ - private void setPhononVector(float[] data, Atom atom, int icell, Vector3f qvec, Vector3f v) { - // complex vx = data[2/3], vy = data[4/5], vz = data[6/7] + private void setPhononVector(float[] data, Atom atom, Vector3f rTrans, Vector3f qvec, Vector3f v) { + // complex[r/i] vx = data[2/3], vy = data[4/5], vz = data[6/7] if (qvec == null) { v.set(data[2], data[4], data[6]); } else { - Vector3f[] st = atomSetCollection.supercellTranslations; - Vector3f t = (icell < 0 ? v000 : st[icell % st.length]); - // from CASTEP ceteprouts.pm: // $phase = $qptx*$$sh[0] + $qpty*$$sh[1] + $qptz*$$sh[2]; // $cosph = cos($twopi*$phase); $sinph = sin($twopi*$phase); @@ -494,7 +498,7 @@ // push @$pertyo, $cosph*$$perty_r[$iat] + $sinph*$$perty_i[$iat]; // push @$pertzo, $cosph*$$pertz_r[$iat] + $sinph*$$pertz_i[$iat]; - double phase = qvec.dot(t); + double phase = qvec.dot(rTrans); double cosph = Math.cos(TWOPI * phase); double sinph = Math.sin(TWOPI * phase); v.x = (float)(cosph * data[2] + sinph * data[3]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-11 23:30:41
|
Revision: 16060 http://jmol.svn.sourceforge.net/jmol/?rev=16060&view=rev Author: hansonr Date: 2011-09-11 23:30:34 +0000 (Sun, 11 Sep 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 19:50:54 UTC (rev 16059) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 23:30:34 UTC (rev 16060) @@ -59,7 +59,13 @@ * preliminary .phonon frequency reader -- ha...@st... 9/2011 * -- Many thanks to Keith Refson for his assistance with this implementation * -- atom's mass is encoded as bfactor - * -- FILTER options include "q=n" where n is an integer (-n for second version), or "q={1/4 1/4 1}" + * -- FILTER options include "q=n" where n is an integer or "q={1/4 1/4 0}" + * -- for non-simple fractions, you must match the q vector with these + * -- for simple fractions, you can also just specify SUPERCELL {a b c} where + * -- the number of cells matches a given wavevector -- SUPERCELL {4 4 1}, for example + * -- following this with ".1" ".2" etc. gives first, second, third, etc. occurance: + * -- load "xxx.phonon" FILTER "q=1.3" .... + * -- load "xxx.phonon" FILTER "{0 0 0}.3" .... * * @author Joerg Meyer, FHI Berlin 2009 (me...@fh...) * @version 1.2 @@ -79,8 +85,10 @@ @Override public void initializeReader() throws Exception { - if (filter != null) + if (filter != null) { filter = filter.replace('(','{').replace(')','}'); + filter = TextFormat.simpleReplace(filter, "-PT", ""); + } while (tokenizeCastepCell() > 0) { if (isPhonon) return; // use checkLine @@ -395,34 +403,38 @@ private Point3f[] atomPts; private String lastQPt; + private int qpt2; private void readPhononFrequencies() throws Exception { String[] tokens = getTokens(); Vector3f qvec = new Vector3f(parseFloat(tokens[2]), parseFloat(tokens[3]), parseFloat(tokens[4])); String fcoord = getFractionalCoord(qvec); + String qtoks = "{" + tokens[2] + " " + tokens[3] + " " + tokens[4] + "}"; if (fcoord == null) - fcoord = tokens[2] + " " + tokens[3] + " " + tokens[4]; - fcoord = "{" + fcoord + "}"; + fcoord = qtoks; + else + fcoord = "{" + fcoord + "}"; boolean isOK = false; boolean isSecond = (tokens[1].equals(lastQPt)); + qpt2 = (isSecond ? qpt2 + 1 : 1); + lastQPt = tokens[1]; + //TODO not quite right: can have more than two options. if (filter != null && checkFilter("Q=")) { // check for an explicit q=n or q={1/4 1/2 1/4} - if (!checkFilter("Q=" + (isSecond ? "-" : "") + fcoord) - && !checkFilter("Q=" + (isSecond ? "-" : "") + lastQPt + ";") - - ) + isOK = (checkFilter("Q=" + fcoord + "." + qpt2 + ";") + || checkFilter("Q=" + lastQPt + "." + qpt2 + ";") + || !isSecond && checkFilter("Q=" + fcoord + ";") + || !isSecond && checkFilter("Q=" + lastQPt + ";")); + if (!isOK) return; - isOK = true; } - if (!isOK && isSecond) - return; boolean isGammaPoint = (qvec.length() == 0); float[] fsc = (supercell == null || !supercell.startsWith("=") ? null : atomSetCollection.setSuperCell(supercell.substring(1), new float[16])); float nx = 1, ny = 1, nz = 1; - if (fsc != null && !isOK) { + if (fsc != null && !isOK && !isSecond) { // only select corresponding phonon vector // relating to this supercell -- one that has integral dot product float dx = (qvec.x == 0 ? 1 : qvec.x) * (nx = fsc[0]); @@ -436,7 +448,9 @@ isOK = true; } if (fsc == null || !havePhonons) - appendLoadNote("q=" + qvec); + appendLoadNote(line); + if (!isOK && isSecond) + return; if (!isOK && (fsc == null) == !isGammaPoint) return; if (havePhonons) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-11 23:32:32
|
Revision: 16061 http://jmol.svn.sourceforge.net/jmol/?rev=16061&view=rev Author: hansonr Date: 2011-09-11 23:32:25 +0000 (Sun, 11 Sep 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 23:30:34 UTC (rev 16060) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-11 23:32:25 UTC (rev 16061) @@ -60,7 +60,8 @@ * -- Many thanks to Keith Refson for his assistance with this implementation * -- atom's mass is encoded as bfactor * -- FILTER options include "q=n" where n is an integer or "q={1/4 1/4 0}" - * -- for non-simple fractions, you must match the q vector with these + * -- for non-simple fractions, you must use the exact form of the wavevector description: + * -- load "xxx.phonon" FILTER "q=(-0.083333 0.083333 0.500000) * -- for simple fractions, you can also just specify SUPERCELL {a b c} where * -- the number of cells matches a given wavevector -- SUPERCELL {4 4 1}, for example * -- following this with ".1" ".2" etc. gives first, second, third, etc. occurance: @@ -88,6 +89,7 @@ if (filter != null) { filter = filter.replace('(','{').replace(')','}'); filter = TextFormat.simpleReplace(filter, "-PT", ""); + filter = TextFormat.simpleReplace(filter, " ", " "); } while (tokenizeCastepCell() > 0) { if (isPhonon) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-13 13:47:49
|
Revision: 16063 http://jmol.svn.sourceforge.net/jmol/?rev=16063&view=rev Author: hansonr Date: 2011-09-13 13:47:43 +0000 (Tue, 13 Sep 2011) Log Message: ----------- CASTEP phonon phase corrected Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-12 18:50:48 UTC (rev 16062) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-13 13:47:43 UTC (rev 16063) @@ -79,10 +79,13 @@ private float a, b, c, alpha, beta, gamma; private Vector3f[] abc = new Vector3f[3]; private boolean iHaveFractionalCoordinates; + private int atomCount; private boolean isPhonon; + private Point3f[] atomPts; + private boolean havePhonons = false; + private String lastQPt; + private int qpt2; - private int atomCount; - @Override public void initializeReader() throws Exception { @@ -97,12 +100,6 @@ if ((tokens.length >= 2) && (tokens[0].equalsIgnoreCase("%BLOCK"))) { /* - * unit cell can only be set later - * to get symmetry properly initialized - - * see below! - */ - - /* %BLOCK LATTICE_ABC ang 16.66566792 8.33283396 16.82438907 @@ -364,15 +361,16 @@ String[] tokens = getTokens(); Atom atom = atomSetCollection.addNewAtom(); setAtomCoord(atom, parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3])); - atom.bfactor = parseFloat(tokens[5]); // mass, actually atom.elementSymbol = tokens[4]; + atom.bfactor = parseFloat(tokens[5]); // mass, actually } atomCount = atomSetCollection.getAtomCount(); + // we collect the atom points, because any supercell business + // will trash those, and we need the originals atomPts = new Point3f[atomCount]; Atom[] atoms = atomSetCollection.getAtoms(); for (int i = 0; i < atomCount; i++) atomPts[i] = new Point3f(atoms[i]); - } @@ -400,13 +398,6 @@ 6 2 -0.381712598770 0.000000000000 0.381712598770 0.000000000000 0.381712598770 0.000000000000 */ - private boolean havePhonons = false; - - private Point3f[] atomPts; - - private String lastQPt; - private int qpt2; - private void readPhononFrequencies() throws Exception { String[] tokens = getTokens(); Vector3f qvec = new Vector3f(parseFloat(tokens[2]), parseFloat(tokens[3]), @@ -538,16 +529,16 @@ // from CASTEP ceteprouts.pm: // $phase = $qptx*$$sh[0] + $qpty*$$sh[1] + $qptz*$$sh[2]; // $cosph = cos($twopi*$phase); $sinph = sin($twopi*$phase); - // push @$pertxo, $cosph*$$pertx_r[$iat] + $sinph*$$pertx_i[$iat]; - // push @$pertyo, $cosph*$$perty_r[$iat] + $sinph*$$perty_i[$iat]; - // push @$pertzo, $cosph*$$pertz_r[$iat] + $sinph*$$pertz_i[$iat]; + // push @$pertxo, $cosph*$$pertx_r[$iat] - $sinph*$$pertx_i[$iat]; + // push @$pertyo, $cosph*$$perty_r[$iat] - $sinph*$$perty_i[$iat]; + // push @$pertzo, $cosph*$$pertz_r[$iat] - $sinph*$$pertz_i[$iat]; double phase = qvec.dot(rTrans); double cosph = Math.cos(TWOPI * phase); double sinph = Math.sin(TWOPI * phase); - v.x = (float)(cosph * data[2] + sinph * data[3]); - v.y = (float)(cosph * data[4] + sinph * data[5]); - v.z = (float)(cosph * data[6] + sinph * data[7]); + v.x = (float)(cosph * data[2] - sinph * data[3]); + v.y = (float)(cosph * data[4] - sinph * data[5]); + v.z = (float)(cosph * data[6] - sinph * data[7]); } v.scale((float) Math.sqrt(1 / atom.bfactor)); // mass stored in bfactor } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-21 22:12:14
|
Revision: 16089 http://jmol.svn.sourceforge.net/jmol/?rev=16089&view=rev Author: hansonr Date: 2011-09-21 22:12:07 +0000 (Wed, 21 Sep 2011) Log Message: ----------- CASTEP reader overhaul Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-21 21:19:27 UTC (rev 16088) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-21 22:12:07 UTC (rev 16089) @@ -53,21 +53,20 @@ import javax.vecmath.Vector3f; /** - * CASTEP (http://www.castep.org) .cell file format - * relevant section of .cell file are included as comments below + * CASTEP (http://www.castep.org) .cell file format relevant section of .cell + * file are included as comments below * - * preliminary .phonon frequency reader -- ha...@st... 9/2011 - * -- Many thanks to Keith Refson for his assistance with this implementation - * -- atom's mass is encoded as bfactor - * -- FILTER options include "q=n" where n is an integer or "q={1/4 1/4 0}" - * -- for non-simple fractions, you must use the exact form of the wavevector description: - * -- load "xxx.phonon" FILTER "q=(-0.083333 0.083333 0.500000) - * -- for simple fractions, you can also just specify SUPERCELL {a b c} where - * -- the number of cells matches a given wavevector -- SUPERCELL {4 4 1}, for example - * -- following this with ".1" ".2" etc. gives first, second, third, etc. occurance: - * -- load "xxx.phonon" FILTER "q=1.3" .... - * -- load "xxx.phonon" FILTER "{0 0 0}.3" .... - * + * preliminary .phonon frequency reader -- ha...@st... 9/2011 -- Many + * thanks to Keith Refson for his assistance with this implementation -- atom's + * mass is encoded as bfactor -- FILTER options include "q=n" where n is an + * integer or "q={1/4 1/4 0}" -- for non-simple fractions, you must use the + * exact form of the wavevector description: -- load "xxx.phonon" FILTER + * "q=(-0.083333 0.083333 0.500000) -- for simple fractions, you can also just + * specify SUPERCELL {a b c} where -- the number of cells matches a given + * wavevector -- SUPERCELL {4 4 1}, for example -- following this with ".1" ".2" + * etc. gives first, second, third, etc. occurance: -- load "xxx.phonon" FILTER + * "q=1.3" .... -- load "xxx.phonon" FILTER "{0 0 0}.3" .... + * * @author Joerg Meyer, FHI Berlin 2009 (me...@fh...) * @version 1.2 */ @@ -76,14 +75,17 @@ private String[] tokens; + private boolean isPhonon; + private boolean isOutput; + private boolean isCell; + private float a, b, c, alpha, beta, gamma; private Vector3f[] abc = new Vector3f[3]; - private boolean iHaveFractionalCoordinates; + private int atomCount; - private boolean isPhonon; - private boolean isOutput; private Point3f[] atomPts; - private boolean havePhonons = false; + + private boolean havePhonons = false; private String lastQPt; private int qpt2; private Vector3f desiredQpt; @@ -100,7 +102,7 @@ } continuing = readFileData(); } - + private void setDesiredQpt(String s) { desiredQpt = new Vector3f(); desiredQ = ""; @@ -158,8 +160,8 @@ private boolean readFileData() throws Exception { while (tokenizeCastepCell() > 0) - if ((tokens.length >= 2) && (tokens[0].equalsIgnoreCase("%BLOCK"))) { - + if (tokens.length >= 2 && tokens[0].equalsIgnoreCase("%BLOCK")) { + Logger.info(line); /* %BLOCK LATTICE_ABC ang @@ -191,8 +193,8 @@ %ENDBLOCK POSITIONS_FRAC */ if (tokens[1].equalsIgnoreCase("POSITIONS_FRAC")) { + setFractionalCoordinates(true); readPositionsFrac(); - iHaveFractionalCoordinates = true; continue; } /* @@ -202,8 +204,8 @@ %ENDBLOCK POSITIONS_ABS */ if (tokens[1].equalsIgnoreCase("POSITIONS_ABS")) { + setFractionalCoordinates(false); readPositionsAbs(); - iHaveFractionalCoordinates = false; continue; } } @@ -246,7 +248,7 @@ } return true; } - + /* Real Lattice(A) Reciprocal Lattice(1/A) 2.6954645 2.6954645 0.0000000 1.1655107 1.1655107 -1.1655107 @@ -260,7 +262,7 @@ float[] xyz = new float[3]; for (int i = 0; i < 3; i++) { fillFloatArray(null, 12, xyz); - addPrimitiveLatticeVector(i, xyz, 0); + addPrimitiveLatticeVector(i, xyz, 0); } } @@ -278,8 +280,9 @@ Atom atom = atomSetCollection.addNewAtom(); tokens = getTokens(); atom.elementSymbol = tokens[1]; - setAtomCoord(atom, parseFloat(tokens[3]), parseFloat(tokens[4]), parseFloat(tokens[5])); - } + setAtomCoord(atom, parseFloat(tokens[3]), parseFloat(tokens[4]), + parseFloat(tokens[5])); + } } private void readTrajectories() throws Exception { @@ -298,10 +301,9 @@ String[] tokens = getTokens(); Atom atom = atomSetCollection.addNewAtom(); atom.elementSymbol = tokens[0]; - setAtomCoord(atom, - parseFloat(tokens[2]) * ANGSTROMS_PER_BOHR, - parseFloat(tokens[3]) * ANGSTROMS_PER_BOHR, - parseFloat(tokens[4]) * ANGSTROMS_PER_BOHR); + setAtomCoord(atom, parseFloat(tokens[2]) * ANGSTROMS_PER_BOHR, + parseFloat(tokens[3]) * ANGSTROMS_PER_BOHR, parseFloat(tokens[4]) + * ANGSTROMS_PER_BOHR); readLine(); } applySymmetryAndSetTrajectory(); @@ -324,9 +326,8 @@ super.finalizeReader(); return; } - + doApplySymmetry = true; - setFractionalCoordinates(iHaveFractionalCoordinates); // relay length of and angles between cell vectors to Jmol setUnitCell(a, b, c, alpha, beta, gamma); /* @@ -336,16 +337,15 @@ * from cartesian to fractional coordinates (which are used * internally by Jmol) */ - setLatticeVectors(); + if (!iHaveUnitCell) + setLatticeVectors(); int nAtoms = atomSetCollection.getAtomCount(); /* * this needs to be run either way (i.e. even if coordinates are already * fractional) - to satisfy the logic in AtomSetCollectionReader() */ - for (int n = 0; n < nAtoms; n++) { - Atom atom = atomSetCollection.getAtom(n); - setAtomCoord(atom); - } + for (int i = 0; i < nAtoms; i++) + setAtomCoord(atomSetCollection.getAtom(i)); super.finalizeReader(); } @@ -360,7 +360,7 @@ private void readLatticeAbc() throws Exception { if (tokenizeCastepCell() == 0) return; - float factor = readLengthUnit(); + float factor = readLengthUnit(tokens[0]); if (tokens.length >= 3) { a = parseFloat(tokens[0]) * factor; b = parseFloat(tokens[1]) * factor; @@ -391,7 +391,7 @@ private void readLatticeCart() throws Exception { if (tokenizeCastepCell() == 0) return; - float factor = readLengthUnit(); + float factor = readLengthUnit(tokens[0]); float x, y, z; for (int n = 0; n < 3; n++) { if (tokens.length >= 3) { @@ -425,77 +425,73 @@ private void readPositionsAbs() throws Exception { if (tokenizeCastepCell() == 0) return; - float factor = readLengthUnit(); + float factor = readLengthUnit(tokens[0]); readAtomData(factor); } /* to be kept in sync with Utilities/io.F90 */ - private final static String[] lengthUnitIds = { - "bohr", "m", "cm", "nm", "ang", "a0" }; + private final static String[] lengthUnitIds = { "bohr", "m", "cm", "nm", + "ang", "a0" }; - private final static float[] lengthUnitFactors = { - ANGSTROMS_PER_BOHR, 1E10f, 1E8f, 1E1f, 1.0f, ANGSTROMS_PER_BOHR }; + private final static float[] lengthUnitFactors = { ANGSTROMS_PER_BOHR, 1E10f, + 1E8f, 1E1f, 1.0f, ANGSTROMS_PER_BOHR }; - private final static int lengthUnits = lengthUnitIds.length; - - private float readLengthUnit() throws Exception { + private float readLengthUnit(String units) throws Exception { float factor = 1.0f; - for (int i=0; i<lengthUnits; i++) { - if (tokens[0].equalsIgnoreCase(lengthUnitIds[i])) { + for (int i = 0; i < lengthUnitIds.length; i++) + if (units.equalsIgnoreCase(lengthUnitIds[i])) { factor = lengthUnitFactors[i]; tokenizeCastepCell(); + break; } - } return factor; } private void readAtomData(float factor) throws Exception { - float x, y, z; do { - if (tokens[0].equalsIgnoreCase("%ENDBLOCK")) - break; if (tokens.length >= 4) { Atom atom = atomSetCollection.addNewAtom(); - x = parseFloat(tokens[1]) * factor; - y = parseFloat(tokens[2]) * factor; - z = parseFloat(tokens[3]) * factor; - atom.set(x, y, z); atom.elementSymbol = tokens[0]; + atom.set(parseFloat(tokens[1]), parseFloat(tokens[2]), + parseFloat(tokens[3])); + atom.scale(factor); } else { Logger.warn("cannot read line with CASTEP atom data: " + line); } - } while (tokenizeCastepCell() > 0); + } while (tokenizeCastepCell() > 0 + && !tokens[0].equalsIgnoreCase("%ENDBLOCK")); } private int tokenizeCastepCell() throws Exception { - while (true) { - if (readLine() == null) - return 0; - if (line.trim().length() == 0) + while (readLine() != null) { + if ((line = line.trim()).length() == 0 || line.startsWith("#") + || line.startsWith("!")) continue; - if (line.startsWith(" BEGIN header")) { - isPhonon = true; - Logger.info("reading CASTEP .phonon file"); - return -1; + if (!isCell) { + if (line.startsWith("%")) { + isCell = true; + break; + } + if (line.startsWith("BEGIN header")) { + isPhonon = true; + Logger.info("reading CASTEP .phonon file"); + return -1; + } + if (line.contains("CASTEP")) { + isOutput = true; + Logger.info("reading CASTEP .castep file"); + return -1; + } } - if (line.contains("CASTEP")) { - isOutput = true; - Logger.info("reading CASTEP .castep file"); - return -1; - } - tokens = getTokens(); - if (line.startsWith("#") || line.startsWith("!") || tokens[0].equals("#") - || tokens[0].equals("!")) - continue; break; } - return tokens.length; + return (line == null ? 0 : (tokens = getTokens()).length); } - + //////////// phonon code //////////// - + /* Unit cell vectors (A) 0.000000 1.819623 1.819623 @@ -516,7 +512,8 @@ while (readLine() != null && line.indexOf("END") < 0) { String[] tokens = getTokens(); Atom atom = atomSetCollection.addNewAtom(); - setAtomCoord(atom, parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3])); + setAtomCoord(atom, parseFloat(tokens[1]), parseFloat(tokens[2]), + parseFloat(tokens[3])); atom.elementSymbol = tokens[4]; atom.bfactor = parseFloat(tokens[5]); // mass, actually } @@ -528,7 +525,6 @@ for (int i = 0; i < atomCount; i++) atomPts[i] = new Point3f(atoms[i]); } - /* q-pt= 1 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000 @@ -568,7 +564,7 @@ boolean isOK = false; boolean isSecond = (tokens[1].equals(lastQPt)); qpt2 = (isSecond ? qpt2 + 1 : 1); - + lastQPt = tokens[1]; //TODO not quite right: can have more than two options. if (filter != null && checkFilter("Q=")) { @@ -578,16 +574,16 @@ if (v.length() < 0.001f) fcoord = desiredQ; } - isOK = (checkFilter("Q=" + fcoord + "." + qpt2 + ";") - || checkFilter("Q=" + lastQPt + "." + qpt2 + ";") - || !isSecond && checkFilter("Q=" + fcoord + ";") - || !isSecond && checkFilter("Q=" + lastQPt + ";")); + isOK = (checkFilter("Q=" + fcoord + "." + qpt2 + ";") + || checkFilter("Q=" + lastQPt + "." + qpt2 + ";") || !isSecond + && checkFilter("Q=" + fcoord + ";") || !isSecond + && checkFilter("Q=" + lastQPt + ";")); if (!isOK) return; } boolean isGammaPoint = (qvec.length() == 0); - float[] fsc = (supercell == null || !supercell.startsWith("=") ? null : - atomSetCollection.setSuperCell(supercell.substring(1), new float[16])); + float[] fsc = (supercell == null || !supercell.startsWith("=") ? null + : atomSetCollection.setSuperCell(supercell.substring(1), new float[16])); float nx = 1, ny = 1, nz = 1; if (fsc != null && !isOK && !isSecond) { // only select corresponding phonon vector @@ -595,10 +591,8 @@ float dx = (qvec.x == 0 ? 1 : qvec.x) * (nx = fsc[0]); float dy = (qvec.y == 0 ? 1 : qvec.y) * (ny = fsc[5]); float dz = (qvec.z == 0 ? 1 : qvec.z) * (nz = fsc[10]); - if (Math.abs(dx - 1) > 0.001 - || Math.abs(dy - 1) > 0.001 - || Math.abs(dz - 1) > 0.001 - ) + if (Math.abs(dx - 1) > 0.001 || Math.abs(dy - 1) > 0.001 + || Math.abs(dz - 1) > 0.001) return; isOK = true; } @@ -666,27 +660,33 @@ } private String getFractionalCoord(Vector3f qvec) { - return (isInt(qvec.x * 12) && isInt(qvec.y * 12) && isInt(qvec.z * 12) ? - getSymmetry().fcoord(qvec) : null); + return (isInt(qvec.x * 12) && isInt(qvec.y * 12) && isInt(qvec.z * 12) ? getSymmetry() + .fcoord(qvec) + : null); } private static boolean isInt(float f) { return (Math.abs(f - (int) f) < 0.001f); - } + } private static final double TWOPI = Math.PI * 2; + /** - * transform complex vibration vector to a real vector by - * applying the appropriate translation, - * storing the results in v + * transform complex vibration vector to a real vector by applying the + * appropriate translation, storing the results in v * - * @param data from .phonon line parsed for floats + * @param data + * from .phonon line parsed for floats * @param atom - * @param rTrans translation vector in unit fractional coord - * @param qvec q point vector - * @param v return vector + * @param rTrans + * translation vector in unit fractional coord + * @param qvec + * q point vector + * @param v + * return vector */ - private void setPhononVector(float[] data, Atom atom, Vector3f rTrans, Vector3f qvec, Vector3f v) { + private void setPhononVector(float[] data, Atom atom, Vector3f rTrans, + Vector3f qvec, Vector3f v) { // complex[r/i] vx = data[2/3], vy = data[4/5], vz = data[6/7] if (qvec == null) { v.set(data[2], data[4], data[6]); @@ -697,15 +697,15 @@ // push @$pertxo, $cosph*$$pertx_r[$iat] - $sinph*$$pertx_i[$iat]; // push @$pertyo, $cosph*$$perty_r[$iat] - $sinph*$$perty_i[$iat]; // push @$pertzo, $cosph*$$pertz_r[$iat] - $sinph*$$pertz_i[$iat]; - + double phase = qvec.dot(rTrans); double cosph = Math.cos(TWOPI * phase); double sinph = Math.sin(TWOPI * phase); - v.x = (float)(cosph * data[2] - sinph * data[3]); - v.y = (float)(cosph * data[4] - sinph * data[5]); - v.z = (float)(cosph * data[6] - sinph * data[7]); + v.x = (float) (cosph * data[2] - sinph * data[3]); + v.y = (float) (cosph * data[4] - sinph * data[5]); + v.z = (float) (cosph * data[6] - sinph * data[7]); } v.scale((float) Math.sqrt(1 / atom.bfactor)); // mass stored in bfactor } - + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-21 22:40:40
|
Revision: 16091 http://jmol.svn.sourceforge.net/jmol/?rev=16091&view=rev Author: hansonr Date: 2011-09-21 22:40:33 +0000 (Wed, 21 Sep 2011) Log Message: ----------- CASTEP reader overhaul Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-21 22:39:41 UTC (rev 16090) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-21 22:40:33 UTC (rev 16091) @@ -56,7 +56,7 @@ * CASTEP (http://www.castep.org) .cell file format relevant section of .cell * file are included as comments below * - * preliminary .phonon frequency reader -- ha...@st... 9/2011 -- Many + * preliminary .castep, .phonon frequency reader -- ha...@st... 9/2011 -- Many * thanks to Keith Refson for his assistance with this implementation -- atom's * mass is encoded as bfactor -- FILTER options include "q=n" where n is an * integer or "q={1/4 1/4 0}" -- for non-simple fractions, you must use the This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-22 19:14:51
|
Revision: 16101 http://jmol.svn.sourceforge.net/jmol/?rev=16101&view=rev Author: hansonr Date: 2011-09-22 19:14:45 +0000 (Thu, 22 Sep 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-22 17:41:32 UTC (rev 16100) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2011-09-22 19:14:45 UTC (rev 16101) @@ -263,6 +263,7 @@ */ private void readOutputUnitCell() throws Exception { + applySymmetryAndSetTrajectory(); atomSetCollection.newAtomSet(); setFractionalCoordinates(true); abc = read3Vectors(false); @@ -286,7 +287,6 @@ setAtomCoord(atom, parseFloat(tokens[3]), parseFloat(tokens[4]), parseFloat(tokens[5])); } - applySymmetryAndSetTrajectory(); } /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2012-05-23 16:53:36
|
Revision: 17203 http://jmol.svn.sourceforge.net/jmol/?rev=17203&view=rev Author: hansonr Date: 2012-05-23 16:53:26 +0000 (Wed, 23 May 2012) Log Message: ----------- Castep reader H:xxx atom names Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2012-05-23 07:38:58 UTC (rev 17202) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2012-05-23 16:53:26 UTC (rev 17203) @@ -452,7 +452,14 @@ do { if (tokens.length >= 4) { Atom atom = atomSetCollection.addNewAtom(); - atom.elementSymbol = tokens[0]; + int pt = tokens[0].indexOf(":"); + if (pt >= 0) { + atom.elementSymbol = tokens[0].substring(0, pt); + atom.atomName = tokens[0]; + } else { + atom.elementSymbol = tokens[0]; + } + atom.set(parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3])); atom.scale(factor); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2013-02-26 23:19:24
|
Revision: 17951 http://jmol.svn.sourceforge.net/jmol/?rev=17951&view=rev Author: hansonr Date: 2013-02-26 23:19:15 +0000 (Tue, 26 Feb 2013) Log Message: ----------- removing Math.toDegrees() -- not implemented in Java2Script Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-02-25 00:47:27 UTC (rev 17950) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-02-26 23:19:15 UTC (rev 17951) @@ -81,6 +81,8 @@ public class CastepReader extends AtomSetCollectionReader { + private static final float RAD_TO_DEG = (float) (180.0 / Math.PI); + private String[] tokens; private boolean isPhonon; @@ -418,9 +420,9 @@ a = abc[0].length(); b = abc[1].length(); c = abc[2].length(); - alpha = (float) Math.toDegrees(abc[1].angle(abc[2])); - beta = (float) Math.toDegrees(abc[2].angle(abc[0])); - gamma = (float) Math.toDegrees(abc[0].angle(abc[1])); + alpha = (abc[1].angle(abc[2]) * RAD_TO_DEG); + beta = (abc[2].angle(abc[0]) * RAD_TO_DEG); + gamma = (abc[0].angle(abc[1]) * RAD_TO_DEG); } private void readPositionsFrac() throws Exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pie...@us...> - 2013-04-20 14:34:40
|
Revision: 18133 http://sourceforge.net/p/jmol/code/18133 Author: pierocanepa Date: 2013-04-20 14:34:34 +0000 (Sat, 20 Apr 2013) Log Message: ----------- Added energies to CASTEP readers Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-19 22:03:56 UTC (rev 18132) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-20 14:34:34 UTC (rev 18133) @@ -252,6 +252,8 @@ readOutputCharges(); } else if (doProcessLines && line.contains("Born Effective Charges")) { readOutputBornChargeTensors(); + } else if (line.contains("Final energy")) { + readEnergy(); } return true; } @@ -310,8 +312,19 @@ setAtomCoordXYZ(atom, parseFloatStr(tokens[3]), parseFloatStr(tokens[4]), parseFloatStr(tokens[5])); } + + } + private void readEnergy() throws Exception { + tokens = getTokens(); + Double energy = Double.valueOf(Double.parseDouble(tokens[4])); + + atomSetCollection.setAtomSetName("Energy = " + energy + " eV"); + atomSetCollection.setAtomSetEnergy("" + energy, energy.floatValue()); + atomSetCollection.setAtomSetAuxiliaryInfo("Energy", energy); + } + private void readPhononTrajectories() throws Exception { isTrajectory = (desiredVibrationNumber <= 0); doApplySymmetry = true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pie...@us...> - 2013-04-21 19:44:08
|
Revision: 18140 http://sourceforge.net/p/jmol/code/18140 Author: pierocanepa Date: 2013-04-21 19:44:04 +0000 (Sun, 21 Apr 2013) Log Message: ----------- Improvements of castep's reader Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-21 18:38:06 UTC (rev 18139) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-21 19:44:04 UTC (rev 18140) @@ -312,8 +312,16 @@ setAtomCoordXYZ(atom, parseFloatStr(tokens[3]), parseFloatStr(tokens[4]), parseFloatStr(tokens[5])); } - - + /* + is better to do this also here + in case the output is only a + geometry optimization and not + both volume and geometry + */ + applySymmetryAndSetTrajectory(); + atomSetCollection.newAtomSet(); + setLatticeVectors(); + } private void readEnergy() throws Exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pie...@us...> - 2013-04-21 20:43:29
|
Revision: 18141 http://sourceforge.net/p/jmol/code/18141 Author: pierocanepa Date: 2013-04-21 20:43:26 +0000 (Sun, 21 Apr 2013) Log Message: ----------- Improvements of castep's reader Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-21 19:44:04 UTC (rev 18140) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-04-21 20:43:26 UTC (rev 18141) @@ -287,7 +287,7 @@ private void readOutputUnitCell() throws Exception { applySymmetryAndSetTrajectory(); - atomSetCollection.newAtomSet(); + //atomSetCollection.newAtomSet(); setFractionalCoordinates(true); abc = read3Vectors(false); setLatticeVectors(); @@ -312,15 +312,6 @@ setAtomCoordXYZ(atom, parseFloatStr(tokens[3]), parseFloatStr(tokens[4]), parseFloatStr(tokens[5])); } - /* - is better to do this also here - in case the output is only a - geometry optimization and not - both volume and geometry - */ - applySymmetryAndSetTrajectory(); - atomSetCollection.newAtomSet(); - setLatticeVectors(); } @@ -331,6 +322,15 @@ atomSetCollection.setAtomSetName("Energy = " + energy + " eV"); atomSetCollection.setAtomSetEnergy("" + energy, energy.floatValue()); atomSetCollection.setAtomSetAuxiliaryInfo("Energy", energy); + /* + is better to do this also here + in case the output is only a + geometry optimization and not + both volume and geometry + */ + applySymmetryAndSetTrajectory(); + atomSetCollection.newAtomSet(); + setLatticeVectors(); } private void readPhononTrajectories() throws Exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pie...@us...> - 2013-05-26 12:54:24
|
Revision: 18251 http://sourceforge.net/p/jmol/code/18251 Author: pierocanepa Date: 2013-05-26 12:54:17 +0000 (Sun, 26 May 2013) Log Message: ----------- CASTEP energy reading fixed Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-05-26 03:39:10 UTC (rev 18250) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-05-26 12:54:17 UTC (rev 18251) @@ -88,6 +88,7 @@ private boolean isPhonon; private boolean isOutput; private boolean isCell; + private boolean isDispersion; private float a, b, c, alpha, beta, gamma; private V3[] abc = new V3[3]; @@ -240,7 +241,9 @@ protected boolean checkLine() throws Exception { // only for .phonon, castep output, or other BEGIN HEADER type files if (isOutput) { - if (line.contains("Real Lattice(A)")) { + if (line.contains("DFT+D: Semi-empirical")){ + isDispersion = true; + } else if (line.contains("Real Lattice(A)")) { readOutputUnitCell(); } else if (line.contains("Fractional coordinates of atoms")) { if (doGetModel(++modelNumber, null)) { @@ -317,7 +320,15 @@ private void readEnergy() throws Exception { tokens = getTokens(); - Double energy = Double.valueOf(Double.parseDouble(tokens[4])); + Double energy; + + if (!isDispersion) { + energy = Double.valueOf(Double.parseDouble(tokens[3])); + } else { + discardLinesUntilContains("Dispersion corrected final energy*"); + tokens = getTokens(); + energy = Double.valueOf(Double.parseDouble(tokens[5])); + } atomSetCollection.setAtomSetName("Energy = " + energy + " eV"); atomSetCollection.setAtomSetEnergy("" + energy, energy.floatValue()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2013-06-27 07:57:34
|
Revision: 18365 http://sourceforge.net/p/jmol/code/18365 Author: hansonr Date: 2013-06-27 07:57:27 +0000 (Thu, 27 Jun 2013) Log Message: ----------- ___JmolVersion="13.1.17_dev_2013.06.26" new feature: CASTEP reader filter option q=all Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-06-26 22:26:39 UTC (rev 18364) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-06-27 07:57:27 UTC (rev 18365) @@ -59,14 +59,18 @@ * CASTEP (http://www.castep.org) .cell file format relevant section of .cell * file are included as comments below * - * preliminary .castep, .phonon frequency reader -- ha...@st... 9/2011 -- Many - * thanks to Keith Refson for his assistance with this implementation -- atom's - * mass is encoded as bfactor -- FILTER options include "q=n" where n is an - * integer or "q={1/4 1/4 0}" -- for non-simple fractions, you must use the - * exact form of the wavevector description: -- load "xxx.phonon" FILTER - * "q=(-0.083333 0.083333 0.500000) -- for simple fractions, you can also just - * specify SUPERCELL {a b c} where -- the number of cells matches a given - * wavevector -- SUPERCELL {4 4 1}, for example + * preliminary .castep, .phonon frequency reader + * -- ha...@st... 9/2011 + * -- Many thanks to Keith Refson for his assistance with this implementation + * -- atom's mass is encoded as bfactor + * -- FILTER options include + * "q=n" where n is an integer + * "q={1/4 1/4 0}" + * "q=ALL" + * -- for non-simple fractions, you must use the exact form of the wavevector description: + * -- load "xxx.phonon" FILTER "q=(-0.083333 0.083333 0.500000) + * -- for simple fractions, you can also just specify SUPERCELL {a b c} where + * the number of cells matches a given wavevector -- SUPERCELL {4 4 1}, for example * * note: following was never implemented? * @@ -103,6 +107,8 @@ private String chargeType = "MULL"; + private boolean isAllQ; + @Override public void initializeReader() throws Exception { if (filter != null) { @@ -113,7 +119,8 @@ } filter = filter.replace('(', '{').replace(')', '}'); filter = TextFormat.simpleReplace(filter, " ", " "); - if (filter.indexOf("{") >= 0) + isAllQ = (filter.indexOf("Q=ALL") >= 0); + if (!isAllQ && filter.indexOf("{") >= 0) setDesiredQpt(filter.substring(filter.indexOf("{"))); filter = TextFormat.simpleReplace(filter, "-PT", ""); } @@ -714,13 +721,13 @@ fcoord = qtoks; else fcoord = "{" + fcoord + "}"; - boolean isOK = false; + boolean isOK = isAllQ; boolean isSecond = (tokens[1].equals(lastQPt)); qpt2 = (isSecond ? qpt2 + 1 : 1); lastQPt = tokens[1]; //TODO not quite right: can have more than two options. - if (filter != null && checkFilterKey("Q=")) { + if (!isOK && filter != null && checkFilterKey("Q=")) { // check for an explicit q=n or q={1/4 1/2 1/4} if (desiredQpt != null) { v.sub2(desiredQpt, qvec); @@ -757,7 +764,7 @@ return; if (!isOK && (ptSupercell == null) == !isGammaPoint) return; - if (havePhonons) + if (havePhonons && !isAllQ) return; havePhonons = true; String qname = "q=" + lastQPt + " " + fcoord; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-06-14 04:13:49
|
Revision: 19836 http://sourceforge.net/p/jmol/code/19836 Author: hansonr Date: 2014-06-14 04:13:42 +0000 (Sat, 14 Jun 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2014-06-14 04:13:36 UTC (rev 19835) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2014-06-14 04:13:42 UTC (rev 19836) @@ -329,7 +329,7 @@ private void readEnergy(int pt) throws Exception { if (isTrajectory) - asc.setTrajectory(); + applySymmetryAndSetTrajectory(); tokens = getTokens(); try { Double energy = Double.valueOf(Double.parseDouble(tokens[pt])); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |