Skip to content

Commit 2fd27d8

Browse files
Merge pull request #43 from TheDisorderedOrganization/CLI
CLI
2 parents 12e6735 + acd406e commit 2fd27d8

15 files changed

Lines changed: 6318 additions & 6108 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ Manifest.toml
1616
log_output/
1717
log_error/
1818
data/
19+
deps/build.log
1920

2021
!config_0.xyz

Project.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ version = "0.1.0"
44

55
[deps]
66
Arianna = "07692032-97b4-4f8d-80d7-e18df88d31a9"
7+
Comonicon = "863f3e99-da2a-4334-8734-de3dacbe5542"
78
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
89
ConcreteStructs = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
910
Coverage = "a2441757-f6aa-5fb2-8edb-039e3f45d037"
@@ -15,15 +16,16 @@ PProf = "e4faabce-9ead-11e9-39d9-4379958e3056"
1516
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1617
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1718
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
19+
TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
1820
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
19-
YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6"
2021

2122
[compat]
2223
Arianna = "0.1.2"
24+
Comonicon = "1.0.8"
2325
Coverage = "1.6.1"
2426
DataStructures = "0.18.20"
2527
DelimitedFiles = "1.9.1"
2628
PProf = "3.2.0"
2729
Printf = "1.11.0"
28-
YAML = "0.4.12"
30+
TOML = "1.0.3"
2931
julia = "1.9"

deps/build.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
using ParticlesMC; ParticlesMC.comonicon_install()

scripts/main.jl

Lines changed: 0 additions & 29 deletions
This file was deleted.

scripts/parse_input.jl

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/IO/IO.jl

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ function load_configuration(filename::String)
3434
return load_configuration(io, LAMMPS())
3535
else
3636
error("Unsupported file format: $filename")
37+
return nothing
3738
end
3839
end
3940

@@ -53,7 +54,7 @@ function load_configuration(io, format::Arianna.Format; m=1)
5354
error("molecule dimension must be 1")
5455
end
5556
molecule = Vector{Int}(undef, N)
56-
btype, bond = read_bonds(data, N, format)
57+
bond = read_bonds(data, N, format)
5758
end
5859
if bool_species
5960
species_d, species_index = column_info["species"]
@@ -93,12 +94,51 @@ function load_configuration(io, format::Arianna.Format; m=1)
9394
)
9495
if bool_molecule
9596
config_dict[:molecule] = molecule
96-
config_dict[:btype] = btype
9797
config_dict[:bond] = bond
9898
end
9999
return config_dict
100100
end
101101

102+
function read_bonds(filename::String, N)
103+
io = open(filename, "r")
104+
N_bonds = parse(Int, io[1])
105+
return construct_bonds_array(io[2:end], N_bonds, N)
106+
end
107+
108+
function construct_bonds_array(io, N_bonds, N)
109+
bond = [Vector{Int}() for _ in 1:N]
110+
bond_index = 1
111+
for i in 1:N_bonds
112+
line = split(io[i], " ")
113+
if length(line) != 2
114+
error("Invalid bond format in line $i: expected two integers.")
115+
end
116+
try
117+
atom_i, atom_j = parse.(Int, line[bond_index:bond_index+1])
118+
catch
119+
error("Invalid bond format in line $i: Could not parse integers.")
120+
end
121+
push!(bond[atom_i], atom_j)
122+
push!(bond[atom_j], atom_i)
123+
end
124+
return bond
125+
end
126+
127+
function get_model(data, i::Int, j::Int)
128+
key = i <= j ? "$i-$j" : "$j-$i"
129+
m = data[key]
130+
if m["name"] == "GeneralKG"
131+
return GeneralKG(m["epsilon"], m["sigma"], m["k"], m["r0"]; rcut = m["rcut"])
132+
elseif m["name"] == "SmoothLennardJones"
133+
return SmoothLennardJones(m["epsilon"], m["sigma"]; rcut = m["rcut"])
134+
elseif m["name"] == "LennardJones"
135+
return LennardJones(m["epsilon"], m["sigma"]; rcut = m["rcut"])
136+
else
137+
error("Model $(m["name"]) is not implemented")
138+
return nothing
139+
end
140+
end
141+
102142
function read_bonds(data, N, format::Arianna.Format)
103143
selrow = get_selrow(format, N, 1)
104144
bonds_data = data[N+selrow:end]
@@ -133,15 +173,16 @@ function read_bonds(data, N, format::Arianna.Format)
133173
else
134174
btype_ij = 1
135175
end
136-
push!(btype[atom_i], btype_ij)
137-
push!(btype[atom_j], btype_ij)
176+
#push!(btype[atom_i], btype_ij)
177+
#push!(btype[atom_j], btype_ij)
138178
end
139179
else
140180
error("Bond array is not written in the $format file")
141181
end
142-
return btype, bond
182+
return bond
143183
end
144184

185+
145186
function missing_key_error(key)
146187
error(error("$key array has not been found in metadata or is not defined. Define the $key in the args Dict"))
147188
end
@@ -201,12 +242,7 @@ function load_chains(init_path; args=Dict(), verbose=false)
201242
# Fold back into the box
202243
initial_position_array .= [[fold_back(x, box) for x in X] for (X, box) in zip(initial_position_array, initial_box_array)]
203244
# Parse model
204-
if occursin(r"\(", input_models[1]) && occursin(r"\)", input_models[1])
205-
model = eval(Meta.parse(input_models[1])) # Parse the string if it has parentheses
206-
else
207-
model = eval(Meta.parse(input_models[1] * "()")) # Else, append () and evaluate
208-
end
209-
@assert isa(model, AbstractArray)
245+
210246
# Copy configurations nsim times (replicas)
211247
if haskey(args, "nsim") && !isnothing(args["nsim"]) && args["nsim"] > 1
212248
nsim = args["nsim"]
@@ -218,7 +254,17 @@ function load_chains(init_path; args=Dict(), verbose=false)
218254
end
219255
# Handle cell list (this is classy)
220256
available_species = unique(vcat(initial_species_array...))
221-
maxcut = maximum([m.rcut for m in model])
257+
n_species = length(available_species)
258+
if input_models[1] isa Dict
259+
model_matrix = SMatrix{n_species, n_species}([get_model(input_models[1], i, j) for i in 1:n_species, j in 1:n_species])
260+
elseif occursin(r"\(", input_models[1]) && occursin(r"\)", input_models[1])
261+
model_matrix = eval(Meta.parse(input_models[1])) # Parse the string if it has parentheses
262+
else
263+
model_matrix = eval(Meta.parse(input_models[1] * "()")) # Else, append () and evaluate
264+
end
265+
@assert isa(model_matrix, AbstractArray)
266+
267+
maxcut = maximum([m.rcut for m in model_matrix])
222268
Z = mean(initial_density_array) * volume_sphere(maxcut, d)
223269
list_type = Z / N < 0.1 ? LinkedList : EmptyList
224270
if haskey(args, "list_type") && !isnothing(args["list_type"])
@@ -230,10 +276,10 @@ function load_chains(init_path; args=Dict(), verbose=false)
230276
if bool_molecule
231277
initial_molecule_array = broadcast_dict(config_dict, :molecule)
232278
initial_bond_array = broadcast_dict(config_dict, :bond)
233-
initial_btype_array = broadcast_dict(config_dict, :btype)
234-
chains = [System(initial_position_array[k], initial_species_array[k], initial_molecule_array[k], initial_density_array[k], initial_temperature_array[k], model, initial_bond_array[k], list_type=list_type) for k in eachindex(initial_position_array)]
279+
#initial_btype_array = broadcast_dict(config_dict, :btype)
280+
chains = [System(initial_position_array[k], initial_species_array[k], initial_molecule_array[k], initial_density_array[k], initial_temperature_array[k], model_matrix, initial_bond_array[k], list_type=list_type) for k in eachindex(initial_position_array)]
235281
else
236-
chains = [System(initial_position_array[k], initial_species_array[k], initial_density_array[k], initial_temperature_array[k], model, list_type=list_type) for k in eachindex(initial_position_array)]
282+
chains = [System(initial_position_array[k], initial_species_array[k], initial_density_array[k], initial_temperature_array[k], model_matrix, list_type=list_type) for k in eachindex(initial_position_array)]
237283
end
238284
verbose && println("$(length(chains)) chains created")
239285
return chains
@@ -255,6 +301,23 @@ function write_position(io, position, digits::Int)
255301
return nothing
256302
end
257303

304+
function store_bonds(io, system::Molecules, format::Arianna.Format)
305+
s = 0
306+
for bond in system.bonds
307+
s += length(bond)
308+
end
309+
println(io, s ÷ 2)
310+
write_bonds_header(io, format)
311+
for i in 1:system.N
312+
for j in system.bonds[i]
313+
if i < j
314+
println(io, "$i $j")
315+
end
316+
end
317+
end
318+
return nothing
319+
end
320+
258321
function Arianna.store_trajectory(io, system::Atoms, t, format::Arianna.Format; digits::Integer=6)
259322
write_header(io, system, t, format, digits)
260323
for (species, position) in zip(system.species, system.position)
@@ -273,5 +336,14 @@ function Arianna.store_trajectory(io, system::Molecules, t, format::Arianna.Form
273336
return nothing
274337
end
275338

339+
function Arianna.store_lastframe(io, system::Molecules, t, format::Arianna.Format; digits::Integer=6)
340+
write_header(io, system, t, format, digits)
341+
for (molecule, species, position) in zip(system.molecule, system.species, system.position)
342+
print(io, "$molecule $species")
343+
write_position(io, position, digits)
344+
end
345+
store_bonds(io, system, format)
346+
return nothing
347+
end
276348

277-
end # module
349+
end # module IO

src/IO/exyz.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ function read_bonds_header(bonds, format::EXYZ)
8383
return N_bonds, column_info
8484
end
8585

86+
function write_bonds_header(io, ::EXYZ)
87+
println(io, "Properties=bond:I:2")
88+
return nothing
89+
end
90+
8691
function write_header(io, system::Particles, t, format::EXYZ, digits::Integer)
8792
println(io, length(system))
8893
box_str = compute_box_str(system.box, format)

src/IO/lammps.jl

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,33 @@ struct LAMMPS <: Arianna.Format
55
end
66
end
77

8+
function store_bonds(io, system::Molecules, format::LAMMPS)
9+
error("LAMMPS format does not support bonds format yet.")
10+
return nothing
11+
end
12+
13+
function validate_line_format(line::String, expected_columns::Vector{String})
14+
split_line = split(line, " ")
15+
if length(split_line) != length(expected_columns)
16+
error("Line does not match the expected format. Expected columns: $(join(expected_columns, ", "))")
17+
end
18+
for (i, column) in enumerate(expected_columns)
19+
if column == "type" || column == "molecule"
20+
try
21+
parse(Int, split_line[i])
22+
catch
23+
error("Column '$column' must be an integer. Found: $(split_line[i])")
24+
end
25+
elseif column in ["x", "y", "z"]
26+
try
27+
parse(Float64, split_line[i])
28+
catch
29+
error("Column '$column' must be a float. Found: $(split_line[i])")
30+
end
31+
end
32+
end
33+
end
34+
835
function parse_column_string(column_str::AbstractString, ::LAMMPS)
936
columns = split(column_str, " ")
1037
column_info = OrderedDict{String, Vector}() # Use OrderedDict to maintain order
@@ -23,7 +50,7 @@ function parse_column_string(column_str::AbstractString, ::LAMMPS)
2350
dimension = 2
2451
column_info["pos"] = [dimension, index]
2552
end
26-
elseif (column_name == "y") || (column_name == "y") || (column_name == "ITEM:") || (column_name == "ATOMS")
53+
elseif (column_name == "y") || (column_name == "ITEM:") || (column_name == "ATOMS")
2754
continue
2855
else
2956
error("$column_name is not supported")
@@ -33,7 +60,6 @@ function parse_column_string(column_str::AbstractString, ::LAMMPS)
3360
return column_info
3461
end
3562

36-
3763
function get_selrow(::LAMMPS, N, m)
3864
return m 0 ? (N + 9) * m - N + 1 : length(data) + m * (N + 9) + 3
3965
end

src/IO/xyz.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ function read_bonds_header(bonds, format::XYZ)
7171
return N_bonds, column_info
7272
end
7373

74+
function write_bonds_header(io, ::XYZ)
75+
println(io, "columns:bond")
76+
return nothing
77+
end
7478

7579
function write_header(io, system::Particles, t, format::XYZ, digits::Integer)
7680
println(io, length(system))

0 commit comments

Comments
 (0)