diff --git a/topoangles.tcl b/topoangles.tcl index 3fa0657..7366702 100644 --- a/topoangles.tcl +++ b/topoangles.tcl @@ -29,7 +29,7 @@ proc ::TopoTools::angleinfo {infotype sel {flag none}} { numangles { return $numangles } numangletypes { return [array size angletypes] } - angletypenames { return [lsort -ascii [array names angletypes]] } + angletypenames { return [lsort -integer [array names angletypes]] } getanglelist { return $anglelist } default { return "bug! shoot the programmer?"} } diff --git a/topobonds.tcl b/topobonds.tcl index 2ac853a..d441ec8 100644 --- a/topobonds.tcl +++ b/topobonds.tcl @@ -37,7 +37,7 @@ proc ::TopoTools::bondinfo {infotype sel {flag none}} { switch $infotype { numbonds { return $numbonds } numbondtypes { return [array size bondtypes] } - bondtypenames { return [lsort -ascii [array names bondtypes]] } + bondtypenames { return [lsort -integer [array names bondtypes]] } getbondlist { return $bidxlist } default { return "bug? shoot the programmer!"} } diff --git a/topodihedrals.tcl b/topodihedrals.tcl index 9f661d9..80f8ced 100644 --- a/topodihedrals.tcl +++ b/topodihedrals.tcl @@ -30,7 +30,7 @@ proc ::TopoTools::dihedralinfo {infotype sel {flag none}} { numdihedrals { return $numdihedrals } numdihedraltypes { return [array size dihedraltypes] } - dihedraltypenames { return [lsort -ascii [array names dihedraltypes]] } + dihedraltypenames { return [lsort -integer [array names dihedraltypes]] } getdihedrallist { return $dihedrallist } default { return "bug! shoot the programmer?"} } diff --git a/topoimpropers.tcl b/topoimpropers.tcl index 2f85527..77e266c 100644 --- a/topoimpropers.tcl +++ b/topoimpropers.tcl @@ -30,7 +30,7 @@ proc ::TopoTools::improperinfo {infotype sel {flag none}} { numimpropers { return $numimpropers } numimpropertypes { return [array size impropertypes] } - impropertypenames { return [lsort -ascii [array names impropertypes]] } + impropertypenames { return [lsort -integer [array names impropertypes]] } getimproperlist { return $improperlist } default { return "bug! shoot the programmer?"} } diff --git a/topolammps.tcl b/topolammps.tcl index ab353e8..5e3e46e 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -4,6 +4,11 @@ # # Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2022,2023 by Axel Kohlmeyer # $Id: topolammps.tcl,v 1.47 2023/04/21 05:41:03 johns Exp $ +# +# FIXED VERSION: Changed all atom type sorting from -ascii to -integer +# to preserve numerical order (1,2,3...10,11,12,13) instead of +# alphabetical order (1,10,11,12,13,2,3,4,5,6,7,8,9) +# Fix date: 2026-02-05 # high level subroutines for LAMMPS support. # @@ -243,9 +248,9 @@ proc ::TopoTools::readlammpsdata {filename style {flags none}} { # apply masses. Atoms section sets a default of 1.0. # since the Masses section can appear before the Atoms section # we have to set it here after the parsing. - if {[llength atommasses] > 0} { + if {[llength $atommasses] > 0} { # we have type labels, but masses are indexed by numeric type - if {([lindex $atommasses 0] == 1) && ([llength atomlabels] > 0)} { + if {([lindex $atommasses 0] == 1) && ([llength $atomlabels] > 0)} { foreach {t m} $atommasses {d l} $atomlabels { set msel [atomselect $mol "type '$l'"] $msel set mass $m @@ -883,7 +888,8 @@ proc ::TopoTools::writelammpsdata {mol filename typelabels style sel {flags none set lammps(angles) [angleinfo numangles $sel] set lammps(dihedrals) [dihedralinfo numdihedrals $sel] set lammps(impropers) [improperinfo numimpropers $sel] - set lammps(atomtypes) [llength [lsort -ascii -unique [$sel get {type}]]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set lammps(atomtypes) [llength [lsort -integer -unique [$sel get {type}]]] set lammps(bondtypes) [bondinfo numbondtypes $sel] set lammps(angletypes) [angleinfo numangletypes $sel] set lammps(dihedraltypes) [dihedralinfo numdihedraltypes $sel] @@ -1074,7 +1080,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { array set lammps $flags if {$lammps(atomtypes) > 0} { - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set typeid 1 puts $fp " Atom Type Labels\n" @@ -1129,7 +1136,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { proc ::TopoTools::writelammpsmasses {fp sel typelabels} { # first run the checks and build list of masses - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set masslist {} set mol [$sel molid] set selstr [$sel text] @@ -1166,12 +1174,14 @@ proc ::TopoTools::writelammpsatoms {fp sel style typelabels} { vmdcon -info "writing LAMMPS Atoms section in style '$style'." puts $fp " Atoms # $style\n" - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set resmap [lsort -unique -integer [$sel get resid]] set atomid 0 foreach adat [$sel get {type resid charge x y z resname mass radius}] { lassign $adat type resid charge x y z resname mass radius - set atomtype [lsearch -sorted -ascii $typemap $type] + # FIXED: Changed from -ascii to -integer for numerical search + set atomtype [lsearch -sorted -integer $typemap $type] set resid [lsearch -sorted -integer $resmap $resid] incr atomid incr atomtype @@ -1264,7 +1274,7 @@ proc ::TopoTools::writelammpsbonds {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d" $bondid $t $at1 $at2] } else { - set type [lsearch -ascii $bondtypes $t] + set type [lsearch -integer $bondtypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1295,7 +1305,7 @@ proc ::TopoTools::writelammpsangles {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d" $angleid $t $at1 $at2 $at3] } else { - set type [lsearch -ascii $angletypes $t] + set type [lsearch -integer $angletypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1327,7 +1337,7 @@ proc ::TopoTools::writelammpsdihedrals {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d %d" $dihedralid $t $at1 $at2 $at3 $at4] } else { - set type [lsearch -ascii $dihedraltypes $t] + set type [lsearch -integer $dihedraltypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1359,7 +1369,7 @@ proc ::TopoTools::writelammpsimpropers {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d %d" $improperid $t $at1 $at2 $at3 $at4] } else { - set type [lsearch -ascii $impropertypes $t] + set type [lsearch -integer $impropertypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1397,7 +1407,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { atoms { puts $fp "\# Pair Coeffs\n\#" set aid 1 - set atlist [lsort -ascii -unique [$sel get {type}]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set atlist [lsort -integer -unique [$sel get {type}]] foreach at $atlist { if {$typelabels} { puts $fp "\# $at" @@ -1462,4 +1473,4 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { } puts $fp "" return -} +} \ No newline at end of file