Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion topoangles.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -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?"}
}
Expand Down
2 changes: 1 addition & 1 deletion topobonds.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -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!"}
}
Expand Down
2 changes: 1 addition & 1 deletion topodihedrals.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -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?"}
}
Expand Down
2 changes: 1 addition & 1 deletion topoimpropers.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -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?"}
}
Expand Down
37 changes: 24 additions & 13 deletions topolammps.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
#
# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2022,2023 by Axel Kohlmeyer <akohlmey@gmail.com>
# $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.
#
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -1462,4 +1473,4 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} {
}
puts $fp ""
return
}
}