@@ -203,6 +203,14 @@ pub fn run_sweep_loop(
203203 let mut overlap2_stat = Statistics :: new ( n_temps, 1 ) ;
204204 let mut overlap4_stat = Statistics :: new ( n_temps, 1 ) ;
205205
206+ let mut mags_buf = vec ! [ 0.0f32 ; n_temps] ;
207+ let mut mags2_buf = vec ! [ 0.0f32 ; n_temps] ;
208+ let mut mags4_buf = vec ! [ 0.0f32 ; n_temps] ;
209+ let mut energies_buf = vec ! [ 0.0f32 ; n_temps] ;
210+ let mut overlaps_buf = vec ! [ 0.0f32 ; n_temps] ;
211+ let mut overlaps2_buf = vec ! [ 0.0f32 ; n_temps] ;
212+ let mut overlaps4_buf = vec ! [ 0.0f32 ; n_temps] ;
213+
206214 for sweep_id in 0 ..n_sweeps {
207215 if interrupted. load ( Ordering :: Relaxed ) {
208216 return Err ( "interrupted" . to_string ( ) ) ;
@@ -265,15 +273,13 @@ pub fn run_sweep_loop(
265273 }
266274 }
267275 }
276+ }
268277
269- ( real. energies , _) = spins:: energy:: compute_energies (
270- lattice,
271- & real. spins ,
272- & real. couplings ,
273- n_systems,
274- false ,
275- ) ;
276- } else {
278+ let pt_this_sweep = config
279+ . pt_interval
280+ . is_some_and ( |interval| sweep_id % interval == 0 ) ;
281+
282+ if record || pt_this_sweep {
277283 ( real. energies , _) = spins:: energy:: compute_energies (
278284 lattice,
279285 & real. spins ,
@@ -284,10 +290,12 @@ pub fn run_sweep_loop(
284290 }
285291
286292 if record {
287- let mut mags = vec ! [ 0.0f32 ; n_temps] ;
288- let mut mags2 = vec ! [ 0.0f32 ; n_temps] ;
289- let mut mags4 = vec ! [ 0.0f32 ; n_temps] ;
290- let mut energies_ordered = vec ! [ 0.0f32 ; n_temps] ;
293+ for t in 0 ..n_temps {
294+ mags_buf[ t] = 0.0 ;
295+ mags2_buf[ t] = 0.0 ;
296+ mags4_buf[ t] = 0.0 ;
297+ energies_buf[ t] = 0.0 ;
298+ }
291299
292300 for r in 0 ..n_replicas {
293301 let offset = r * n_temps;
@@ -300,25 +308,27 @@ pub fn run_sweep_loop(
300308 }
301309 let mag = sum as f32 / n_spins as f32 ;
302310 let m2 = mag * mag;
303- mags [ t] = mag;
304- mags2 [ t] = m2;
305- mags4 [ t] = m2 * m2;
306- energies_ordered [ t] = real. energies [ system_id] ;
311+ mags_buf [ t] = mag;
312+ mags2_buf [ t] = m2;
313+ mags4_buf [ t] = m2 * m2;
314+ energies_buf [ t] = real. energies [ system_id] ;
307315 }
308316
309- mags_stat. update ( & mags ) ;
310- mags2_stat. update ( & mags2 ) ;
311- mags4_stat. update ( & mags4 ) ;
312- energies_stat. update ( & energies_ordered ) ;
313- energies2_stat. update ( & energies_ordered ) ;
317+ mags_stat. update ( & mags_buf ) ;
318+ mags2_stat. update ( & mags2_buf ) ;
319+ mags4_stat. update ( & mags4_buf ) ;
320+ energies_stat. update ( & energies_buf ) ;
321+ energies2_stat. update ( & energies_buf ) ;
314322 }
315323
316324 for pair_idx in 0 ..n_pairs {
317325 let r_a = 2 * pair_idx;
318326 let r_b = 2 * pair_idx + 1 ;
319- let mut overlaps = vec ! [ 0.0f32 ; n_temps] ;
320- let mut overlaps2 = vec ! [ 0.0f32 ; n_temps] ;
321- let mut overlaps4 = vec ! [ 0.0f32 ; n_temps] ;
327+ for t in 0 ..n_temps {
328+ overlaps_buf[ t] = 0.0 ;
329+ overlaps2_buf[ t] = 0.0 ;
330+ overlaps4_buf[ t] = 0.0 ;
331+ }
322332
323333 for t in 0 ..n_temps {
324334 let sys_a = real. system_ids [ r_a * n_temps + t] ;
@@ -331,14 +341,14 @@ pub fn run_sweep_loop(
331341 }
332342 let q = dot as f32 / n_spins as f32 ;
333343 let q2 = q * q;
334- overlaps [ t] = q;
335- overlaps2 [ t] = q2;
336- overlaps4 [ t] = q2 * q2;
344+ overlaps_buf [ t] = q;
345+ overlaps2_buf [ t] = q2;
346+ overlaps4_buf [ t] = q2 * q2;
337347 }
338348
339- overlap_stat. update ( & overlaps ) ;
340- overlap2_stat. update ( & overlaps2 ) ;
341- overlap4_stat. update ( & overlaps4 ) ;
349+ overlap_stat. update ( & overlaps_buf ) ;
350+ overlap2_stat. update ( & overlaps2_buf ) ;
351+ overlap4_stat. update ( & overlaps4_buf ) ;
342352 }
343353 }
344354
@@ -399,7 +409,11 @@ pub fn run_sweep_loop(
399409 }
400410 top4_n += 1 ;
401411 }
412+ }
413+ }
402414
415+ if pt_this_sweep {
416+ if config. overlap_cluster . is_some ( ) {
403417 ( real. energies , _) = spins:: energy:: compute_energies (
404418 lattice,
405419 & real. spins ,
@@ -408,22 +422,17 @@ pub fn run_sweep_loop(
408422 false ,
409423 ) ;
410424 }
411- }
412-
413- if let Some ( interval) = config. pt_interval {
414- if sweep_id % interval == 0 {
415- for r in 0 ..n_replicas {
416- let offset = r * n_temps;
417- let sid_slice = & mut real. system_ids [ offset..offset + n_temps] ;
418- let temp_slice = & real. temperatures [ offset..offset + n_temps] ;
419- mcmc:: tempering:: parallel_tempering (
420- & real. energies ,
421- temp_slice,
422- sid_slice,
423- n_spins,
424- & mut real. rngs [ offset] ,
425- ) ;
426- }
425+ for r in 0 ..n_replicas {
426+ let offset = r * n_temps;
427+ let sid_slice = & mut real. system_ids [ offset..offset + n_temps] ;
428+ let temp_slice = & real. temperatures [ offset..offset + n_temps] ;
429+ mcmc:: tempering:: parallel_tempering (
430+ & real. energies ,
431+ temp_slice,
432+ sid_slice,
433+ n_spins,
434+ & mut real. rngs [ offset] ,
435+ ) ;
427436 }
428437 }
429438 }
0 commit comments