@@ -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
3839end
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
100100end
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+
102142function 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
143183end
144184
185+
145186function 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" ))
147188end
@@ -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
256302end
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+
258321function 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
274337end
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
0 commit comments