From 8c719035cdb28171e5c6223c09cf9ebe4a36a88f Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Tue, 3 Mar 2026 15:36:30 -0500 Subject: [PATCH 01/44] Enable multithreading for system.cpp (Line~ 4100) (cherry picked from commit 229d62edc98b8faddc27f3476a6ab5e2a3ece63e) --- src/control.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/control.h b/src/control.h index af3051f5..184c181b 100644 --- a/src/control.h +++ b/src/control.h @@ -291,6 +291,7 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri Tokenize runtokenize(setline); n_setargs = runtokenize.count(); //n_setargs = tokenize(setline, setargs); + //high_start = clock::now(); if ( n_setargs==0 ) { cout << "Error: No atom set command found."; @@ -385,7 +386,9 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri //analyzer.analyze(setline); //analyzer.write(filename); } - + //high_finish = clock::now(); + //duration = time_count(high_start, high_finish); + //benchmark << duration; return analyzer; } From 1b8cffd8acf4592f0604f63e2eeeef396f8ebaf8 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Thu, 25 Jun 2026 19:24:34 +0700 Subject: [PATCH 02/44] Adding high-resolution clock. Adapted from 1176fd45ecde950126c1d8c392bb31f6faed80de --- src/control.h | 8 ++++---- src/incoherent_scattering_function.h | 2 +- src/mean_square_displacement.cpp | 2 -- src/system.cpp | 10 ++++------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/control.h b/src/control.h index 184c181b..90ae4198 100644 --- a/src/control.h +++ b/src/control.h @@ -291,7 +291,7 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri Tokenize runtokenize(setline); n_setargs = runtokenize.count(); //n_setargs = tokenize(setline, setargs); - //high_start = clock::now(); + high_start = clock::now(); if ( n_setargs==0 ) { cout << "Error: No atom set command found."; @@ -386,9 +386,9 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri //analyzer.analyze(setline); //analyzer.write(filename); } - //high_finish = clock::now(); - //duration = time_count(high_start, high_finish); - //benchmark << duration; + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + benchmark << duration; return analyzer; } diff --git a/src/incoherent_scattering_function.h b/src/incoherent_scattering_function.h index a32cdf1e..cf124a21 100644 --- a/src/incoherent_scattering_function.h +++ b/src/incoherent_scattering_function.h @@ -34,7 +34,7 @@ class Incoherent_Scattering_Function:public Correlation_2D void bin_hook(Trajectory_List * t_list, int timegapii, int thisii, int nextii); void postprocess_bins(); - //bool isThreadSafe(){return true;}; + bool isThreadSafe(){return true;}; }; } diff --git a/src/mean_square_displacement.cpp b/src/mean_square_displacement.cpp index ff714217..3bccbfc1 100644 --- a/src/mean_square_displacement.cpp +++ b/src/mean_square_displacement.cpp @@ -154,7 +154,6 @@ void Mean_Square_Displacement::list_displacementkernel(int timegapii,int thisii, // weighting[timegapii]+=trajectory_list->show_n_trajectories(currenttime); // //weighting[timegapii]+=(trajectory_list[0]).show_n_trajectories(currenttime); // (trajectory_list[0]).listloop(this,currenttime); - #pragma omp atomic weighting[timegapii]+=trajectory_list->show_n_trajectories(thisii); (trajectory_list[0]).listloop(this,timegapii, thisii, nextii); } @@ -163,7 +162,6 @@ void Mean_Square_Displacement::list_displacementkernel(int timegapii,int thisii, void Mean_Square_Displacement::listkernel(Trajectory* current_trajectory, int timegapii,int thisii, int nextii) { - #pragma omp atomic msd[timegapii]+=current_trajectory->distance(thisii,nextii)*current_trajectory->distance(thisii,nextii); } diff --git a/src/system.cpp b/src/system.cpp index 1cdf24ab..b3781929 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -4105,9 +4105,7 @@ void System::displacement_list(Analysis* analysis, bool fullblock)const #endif { { - int thisii; - int nextii; - //#pragma omp parallel for schedule(dynamic) if(analysis->isThreadSafe()) // TODO: Test if we can use the old loop + #pragma omp parallel for schedule(status) if(analysis->isThreadSafe()) // TODO: Test if we can use the old loop for(int timegapii=0;timegapiilist_displacementkernel(timegapii,thisii,nextii); //#pragma omp atomic displacement_count++; @@ -4136,7 +4134,7 @@ void System::displacement_list(Analysis* analysis, bool fullblock)const { - //#pragma omp parallel for schedule(dynamic) if(analysis->isThreadSafe()) // This makes this loop execute in parallel, splitting by time values. + #pragma omp parallel for schedule(dynamic) if(analysis->isThreadSafe()) // This makes this loop execute in parallel, splitting by time values. for(int timegapii=n_exponential_steps; timegapii Date: Thu, 25 Jun 2026 19:31:44 +0700 Subject: [PATCH 03/44] Enabling Multithreading: ISFS - Adapted from bf5a91e1ae1e345e48630a57d2927a5c33c9d0cc --- dual_remote_sync_audit.csv | 87 ++++++++++++++++++++++++++ src/control.h | 18 +++++- src/incoherent_scattering_function.cpp | 1 - src/system.cpp | 2 +- 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 dual_remote_sync_audit.csv diff --git a/dual_remote_sync_audit.csv b/dual_remote_sync_audit.csv new file mode 100644 index 00000000..beb7b32e --- /dev/null +++ b/dual_remote_sync_audit.csv @@ -0,0 +1,87 @@ +direction,status,cherry_marker,status_reason,sha,short_sha,date,author,subject,files_changed,insertions,deletions,binary_files,file_changes +public-to-private,candidate,+,,793001167ba1223bb0b6c82dd89147e54c51bb52,7930011,2025-10-31,simmons.davids@gmail.com,Bump version to 1.0.1,1,1,1,0,VERSION (+1/-1) +public-to-private,candidate,+,,d68011fbcefb5f7b119e0840a5a07e343f5b77c0,d68011f,2025-11-03,Branham2,Create read_bond_neighbors.md,1,5,0,0,Manual/read_bond_neighbors.md (+5/-0) +public-to-private,candidate,+,,cd78368a559fbe3e8da5b5065dfe067eff212832,cd78368,2025-11-03,Pierre Kawak,Update README.md with permanent DOI to latest release,1,1,1,0,README.md (+1/-1) +public-to-private,candidate,+,,142f3ced06db49f96d9ad612ca6a26730e0c9e37,142f3ce,2025-11-03,Pierre Kawak,Update CITATION.cff with permanent DOI to most recent version,1,1,1,0,CITATION.cff (+1/-1) +public-to-private,candidate,+,,4219fb97e2213a37cdaf522d7677e6cf2789db1d,4219fb9,2025-11-04,Pierre Kawak,Update README.md with permanent DOI to latest release pt2,1,1,1,0,README.md (+1/-1) +public-to-private,candidate,+,,d758149c62bb9a070f7ea32649e6ab333862d685,d758149,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO,2,22,0,0,README.md (+5/-0); _layouts/default.html (+17/-0) +public-to-private,candidate,+,,e5c6abbaf05e4054d94fbcbc205f14fdac2961ea,e5c6abb,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO: found bug. Trying another method. This setup broke the builds homepage and automatic Jekyll theme formatting.,2,0,22,0,README.md (+0/-5); _layouts/default.html (+0/-17) +public-to-private,candidate,+,,d849e6f85a01079549c127ac493d54d0159d54bd,d849e6f,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO try #2: adding via _config.yml in repo root,1,4,0,0,_config.yml (+4/-0) +public-to-private,candidate,+,,a2dd4396cd961519ca1154db57f28b35c5df76c1,a2dd439,2025-11-16,Pierre Kawak,added jekyll-sitemap plugin to Pages build to help Google with crawling,1,2,0,0,_config.yml (+2/-0) +public-to-private,candidate,+,,d3444a7217ec2adb6400a2154a2301b181c3e2e6,d3444a7,2025-11-17,Pierre Kawak,Fix formatting and improve clarity in isf_list.md,1,5,3,0,Manual/isf_list.md (+5/-3) +public-to-private,candidate,+,,588e8b889a08e35b5e5b9b4694d1b5d4cac0286e,588e8b8,2026-02-06,Pierre Kawak,Update citation information in README.md,1,2,2,0,README.md (+2/-2) +public-to-private,candidate,+,,69b574a74a63611be8e008b16002fb5f0d4ca310,69b574a,2026-02-06,Pierre Kawak,Revise citations in README.md for AMDAT,1,4,2,0,README.md (+4/-2) +public-to-private,candidate,+,,92979a40cd5d24567f92bd37c5f4d5dc5b25378a,92979a4,2026-02-06,Pierre Kawak,Correct citation format in README.md,1,1,1,0,README.md (+1/-1) +public-to-private,candidate,+,,74b2e5c4997de007b7ab179b2cf25d9ce957da02,74b2e5c,2026-04-30,Pierre Kawak,Update gcc and gxx dependencies in environment.yml to fix GitHub Actions,1,2,2,0,environment.yml (+2/-2) +private-to-public,private-only,+,This is just creating testfiles,7630a124c8e732383a544ed28339af8f18a544e6,7630a12,2026-02-19,Khanh Ma,Create a test file for msd,1,13,0,0,testfiles/msd.in (+13/-0) +private-to-public,move,+,This opened pragma in system,229d62edc98b8faddc27f3476a6ab5e2a3ece63e,229d62e,2026-03-03,Khanh Ma,Enable multithreading for system.cpp (Line~ 4100),1,4,1,0,src/control.h (+4/-1) +private-to-public,move-with-edits,+,Change source codes & Create benchmarking environment,1176fd45ecde950126c1d8c392bb31f6faed80de,1176fd4,2026-03-04,Khanh Ma,Starting environment for ISFS mulitithreading,11,163,13,3,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+44/-0); benchmark/benchmark.csv (+6/-0); benchmark/benchmark.py (+91/-0); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/control.h (+4/-4); src/incoherent_scattering_function.h (+1/-1); src/mean_square_displacement.cpp (+0/-2); src/system.cpp (+4/-6); testfiles/isfs.in (+13/-0) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,bf5a91e1ae1e345e48630a57d2927a5c33c9d0cc,bf5a91e,2026-03-06,Khanh Ma,ISFS Enabled multithreading,8,28,14,2,benchmark/autorun.sh (+2/-2); benchmark/benchmark.csv (+6/-5); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/control.h (+16/-2); src/incoherent_scattering_function.cpp (+0/-1); src/system.cpp (+1/-1); testfiles/isfs.in (+3/-3) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,f6130411ca27fd890fe953e4a0d590200f92bcfc,f613041,2026-03-09,Khanh Ma,Improve benchmark script. Add PAD to MSD.,10,233,110,3,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+2/-2); benchmark/benchmark.csv (+3/-6); benchmark/benchmark.py (+166/-73); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/mean_square_displacement.cpp (+56/-23); src/mean_square_displacement.h (+4/-4); testfiles/isfs.in (+1/-1); testfiles/msd.in (+1/-1) +private-to-public,private-only,+,Testing with outputs,ae23719de2f569781a89915eaeba518ccfb854bc,ae23719,2026-03-09,Khanh Ma,ISFS Multithreading Enabled,8,18,4,4,benchmark/benchmark.csv (+5/-3); benchmark/benchmark_avg.csv (+6/-0); benchmark/benchmark_std.csv (+6/-0); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/runtime_vs_timegaps.png (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); benchmark/speedup_vs_threads.png (+binary/-binary); testfiles/msd.in (+1/-1) +private-to-public,move,+,README edit,797d3ff4f6159d436e4594fbacb21057caa078fa,797d3ff,2026-03-18,dssimmons,Update README.md,1,1,1,0,README.md (+1/-1) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,5345b4316dba3164b5b549996aff6de4572079c8,5345b43,2026-03-18,Khanh Ma,"Enables multithreading for MD, MSD_2D, Van Hove Self, Bond autocorrelation function.",64,707,317,16,Makefile (+2/-6); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+69/-38); benchmark/baf/baf.config (+4/-0); benchmark/baf/baf.csv (+25/-0); benchmark/baf/baf_validation.csv (+25/-0); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchmark.csv (+0/-6); benchmark/benchmark.py (+0/-184); benchmark/benchmark_avg.csv (+0/-6); benchmark/benchmark_std.csv (+0/-6); benchmark/benchplot.py (+107/-0); benchmark/md/md.config (+4/-0); benchmark/md/md.csv (+2/-0); benchmark/md/md_validation.csv (+2/-0); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+4/-0); benchmark/msd/msd.csv (+2/-0); benchmark/msd/msd_validation.csv (+2/-0); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+4/-0); benchmark/msd2d/msd2d.csv (+25/-0); benchmark/msd2d/msd2d_validation.csv (+25/-0); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/runtime_vs_timegaps.png (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); benchmark/speedup_vs_threads.png (+binary/-binary); benchmark/submit.sh (+71/-0); benchmark/vhd/vhs.config (+4/-0); benchmark/vhd/vhs.csv (+25/-0); benchmark/vhd/vhs_validation.csv (+25/-0); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+4/-0); benchmark/vhs/vhs.csv (+25/-0); benchmark/vhs/vhs_validation.csv (+25/-0); src/analysis.h (+1/-0); src/bond_autocorrelation_function.h (+1/-1); src/control.cpp (+10/-2); src/control.h (+1/-5); src/mean_displacement.cpp (+8/-6); src/mean_displacement.h (+2/-1); src/mean_square_displacement_2d.cpp (+55/-24); src/mean_square_displacement_2d.h (+7/-8); src/space_time_correlation_function.cpp (+6/-4); src/space_time_correlation_function.h (+1/-1); src/system.cpp (+1/-1); src/van_hove_distinct.cpp (+8/-5); src/van_hove_distinct.h (+1/-1); src/van_hove_self.cpp (+9/-8); src/van_hove_self.h (+1/-1); testfiles/baf.in (+44/-0); testfiles/isfs.in (+1/-1); testfiles/md.in (+18/-0); testfiles/msd.in (+7/-2); testfiles/msd2d.in (+18/-0); testfiles/vhd.in (+13/-0); testfiles/vhs.in (+13/-0) +private-to-public,move,+,README edit,b9c795b1e1f7613c7af721f3fd7d9d4cd5699748,b9c795b,2026-03-18,dssimmons,Update README.md,1,8,5,0,README.md (+8/-5) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,fcfc2d98cf293bd2d85089723b7402d4d8e01067,fcfc2d9,2026-03-20,Khanh Ma,Add PADDING to Bond autocorrelation function,35,382,195,16,benchmark/baf/baf.csv (+4/-24); benchmark/baf/baf_validation.csv (+1/-21); benchmark/baf/local/baf.csv (+25/-0); benchmark/baf/local/baf_validation.csv (+25/-0); benchmark/baf/local/runtime.png (+binary/-binary); benchmark/baf/local/speedup.png (+binary/-binary); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/md/autorun.sh (+75/-0); benchmark/md/md.csv (+25/-2); benchmark/md/md_validation.csv (+25/-2); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.csv (+2/-1); benchmark/msd/msd_validation.csv (+2/-1); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/local/runtime.png (+binary/-binary); benchmark/msd2d/local/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.csv (+21/-21); benchmark/msd2d/msd2d_validation.csv (+21/-21); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/submit.sh (+6/-6); benchmark/vhs/local/runtime.png (+binary/-binary); benchmark/vhs/local/speedup.png (+binary/-binary); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.csv (+21/-21); benchmark/vhs/vhs_validation.csv (+21/-21); src/bond_autocorrelation_function.cpp (+95/-42); src/bond_autocorrelation_function.h (+3/-2); testfiles/baf.in (+1/-1); testfiles/isfs.in (+7/-2); testfiles/msd.in (+2/-7) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,f8b46f792b55734da1e13d2f2f628ac59e97520a,f8b46f7,2026-03-21,Khanh Ma,"Add PADDING to MD -> No major improvement due to the nature of low-cost computation in MD, which makes the multithreaded math less significant than the memory bandwidth. Solving memory-related scalability issue would demand a massive change to the structure of the codebase",5,81,76,0,benchmark/md/md.csv (+6/-25); benchmark/md/md_validation.csv (+6/-25); src/mean_displacement.cpp (+64/-22); src/mean_displacement.h (+4/-3); testfiles/md.in (+1/-1) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,8af43be2c5d6f370aa972a3c2f6f03c13a804bff,8af43be,2026-03-21,Khanh Ma,Test MD with Padding,4,50,12,2,benchmark/md/md.csv (+25/-6); benchmark/md/md_validation.csv (+25/-6); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,6c74f818866f9d1ea9686c3aca96dca075337261,6c74f81,2026-03-23,Khanh Ma,"Enables multithreading for MD, MSD_2D, VHS, Bond_autocorrelation_Function. Tested all the above analysis for bin_list",46,4,622,18,VERSION (+1/-1); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/baf/baf.config (+0/-4); benchmark/baf/baf.csv (+0/-5); benchmark/baf/baf_validation.csv (+0/-5); benchmark/baf/local/baf.csv (+0/-25); benchmark/baf/local/baf_validation.csv (+0/-25); benchmark/baf/local/runtime.png (+binary/-binary); benchmark/baf/local/speedup.png (+binary/-binary); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+0/-107); benchmark/md/autorun.sh (+0/-75); benchmark/md/md.config (+0/-4); benchmark/md/md.csv (+0/-25); benchmark/md/md_validation.csv (+0/-25); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+0/-4); benchmark/msd/msd.csv (+0/-3); benchmark/msd/msd_validation.csv (+0/-3); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/local/runtime.png (+binary/-binary); benchmark/msd2d/local/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+0/-4); benchmark/msd2d/msd2d.csv (+0/-25); benchmark/msd2d/msd2d_validation.csv (+0/-25); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71); benchmark/vhd/vhs.config (+0/-4); benchmark/vhd/vhs.csv (+0/-25); benchmark/vhd/vhs_validation.csv (+0/-25); benchmark/vhs/local/runtime.png (+binary/-binary); benchmark/vhs/local/speedup.png (+binary/-binary); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+0/-4); benchmark/vhs/vhs.csv (+0/-25); benchmark/vhs/vhs_validation.csv (+0/-25); src/control.cpp (+1/-1); src/control.h (+1/-1); testfiles/vhd.in (+1/-1) +private-to-public,private-only,+,github workflow testing,f1293d9029bbb9e725d1c0dbbaac5765e08e00b4,f1293d9,2026-03-25,Khanh Ma,"Change check-version to only perform version checks on push, allows PRs to pass because PRs haven't had any tags to it yet",1,1,0,0,.github/workflows/check-version.yml (+1/-0) +private-to-public,private-only,+,github workflow testing,538c146ecd78ad4d6f2b4876c0afa5401884b47e,538c146,2026-03-25,Khanh Ma,Adds success notification for new PRs in VERSION check,1,6,0,0,.github/workflows/check-version.yml (+6/-0) +private-to-public,move,+,Change environment.yml to make conda use latest C/C++ compiler,6809bb7d2c0c9f13eec213418c19dcd1c411cba9,6809bb7,2026-03-25,Khanh Ma,Update VERSION check and test build check with general versions of C/C++ compiler in environment.yml,2,9,8,0,.github/workflows/check-version.yml (+7/-6); environment.yml (+2/-2) +private-to-public,private-only,+,github workflow testing,879aaa9ced9311edc22a57d0dca5c897a319735f,879aaa9,2026-03-26,Khanh Ma,Skip version check for new PRs yet still returns success on Github UI,1,2,2,0,.github/workflows/check-version.yml (+2/-2) +private-to-public,move,+,Bump version to 1.1.0,65a874d6c33fbe3c58b893f50f304f6b438f4d2a,65a874d,2026-03-26,Khanh Ma,Update version to 1.0.1,1,1,1,0,VERSION (+1/-1) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,d096985634153d4127e4059ddf2ca2569ae7501e,d096985,2026-04-01,Khanh Ma,Enable multithreading for Non Gaussian Parameter and Van Hove Distinct,51,574,55,16,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+75/-0); benchmark/baf/baf.config (+4/-0); benchmark/baf/baf.csv (+25/-0); benchmark/baf/baf_validation.csv (+25/-0); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+107/-0); benchmark/md/md.config (+4/-0); benchmark/md/md.csv (+2/-0); benchmark/md/md_validation.csv (+2/-0); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+4/-0); benchmark/msd/msd.csv (+2/-0); benchmark/msd/msd_validation.csv (+2/-0); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+4/-0); benchmark/msd2d/msd2d.csv (+25/-0); benchmark/msd2d/msd2d_validation.csv (+25/-0); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/ngp/ngp.config (+4/-0); benchmark/ngp/ngp.csv (+3/-0); benchmark/ngp/ngp_validation.csv (+3/-0); benchmark/ngp/runtime.png (+binary/-binary); benchmark/ngp/speedup.png (+binary/-binary); benchmark/submit.sh (+71/-0); benchmark/vhd/runtime.png (+binary/-binary); benchmark/vhd/speedup.png (+binary/-binary); benchmark/vhd/vhd.config (+4/-0); benchmark/vhd/vhd.csv (+5/-0); benchmark/vhd/vhd_validation.csv (+5/-0); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+4/-0); benchmark/vhs/vhs.csv (+25/-0); benchmark/vhs/vhs_validation.csv (+25/-0); src/control.cpp (+9/-2); src/control.h (+1/-1); src/intermediate_scattering_function.h (+1/-1); src/non_gaussian_parameter.cpp (+49/-30); src/non_gaussian_parameter.h (+4/-4); src/space_time_correlation_function.cpp (+11/-6); src/van_hove_distinct.cpp (+11/-9); testfiles/isf_list.in (+13/-0); testfiles/ngp.in (+18/-0); testfiles/vhd.in (+1/-1); testfiles/vhs.in (+1/-1) +private-to-public,private-only,+,github workflow testing,37f3f45cb2d1dbc86b2f99a735fa3d9d6c7b0760,37f3f45,2026-04-01,Khanh Ma,Remove benchmarking region. Make check-version more robust. Ready to push,43,4,459,16,.github/workflows/check-version.yml (+1/-1); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/baf/baf.config (+0/-4); benchmark/baf/baf.csv (+0/-25); benchmark/baf/baf_validation.csv (+0/-25); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+0/-107); benchmark/md/md.config (+0/-4); benchmark/md/md.csv (+0/-2); benchmark/md/md_validation.csv (+0/-2); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+0/-4); benchmark/msd/msd.csv (+0/-2); benchmark/msd/msd_validation.csv (+0/-2); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+0/-4); benchmark/msd2d/msd2d.csv (+0/-25); benchmark/msd2d/msd2d_validation.csv (+0/-25); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/ngp/ngp.config (+0/-4); benchmark/ngp/ngp.csv (+0/-3); benchmark/ngp/ngp_validation.csv (+0/-3); benchmark/ngp/runtime.png (+binary/-binary); benchmark/ngp/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71); benchmark/vhd/runtime.png (+binary/-binary); benchmark/vhd/speedup.png (+binary/-binary); benchmark/vhd/vhd.config (+0/-4); benchmark/vhd/vhd.csv (+0/-5); benchmark/vhd/vhd_validation.csv (+0/-5); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+0/-4); benchmark/vhs/vhs.csv (+0/-25); benchmark/vhs/vhs_validation.csv (+0/-25); src/control.cpp (+2/-2); src/control.h (+1/-1) +private-to-public,move,+,Documentation,88a17cf8d24497ecc0b318a8c908c11a3288b29d,88a17cf,2026-04-02,dssimmons,Create isf.md,1,31,0,0,Manual/isf.md (+31/-0) +private-to-public,move,+,Documentation,c5999747f82ea2faee4bf90fac0b4cf349dbf515,c599974,2026-04-02,dssimmons,Update trajectory_lists.md,1,1,2,0,Manual/trajectory_lists.md (+1/-2) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,986663ff73527948aa823eac9d52080af78b71a0,986663f,2026-04-05,Khanh Ma,"Creates OpenMP loop parallelism for time loop in analysis_onetime.cpp, and enables multithreading for Radial Distribution Function",19,356,39,2,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+75/-0); benchmark/benchplot.py (+107/-0); benchmark/rdf/rdf.config (+4/-0); benchmark/rdf/rdf.csv (+3/-0); benchmark/rdf/rdf_validation.csv (+3/-0); benchmark/submit.sh (+71/-0); src/analysis_onetime.cpp (+4/-0); src/control.cpp (+8/-0); src/control.h (+1/-1); src/incoherent_scattering_function.cpp (+3/-3); src/mean_displacement.h (+1/-1); src/mean_square_displacement.cpp (+3/-3); src/mean_square_displacement.h (+1/-1); src/radial_distribution_function.cpp (+55/-26); src/radial_distribution_function.h (+3/-3); testfiles/rdf.in (+13/-0); testfiles/vhd.in (+1/-1) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,5dea40f2cd09c73e1c08834fa57aaf0ad313d9df,5dea40f,2026-04-06,Khanh Ma,Enables multithreading for Composition and Composition vs time,19,61,193,2,benchmark/comp/comp.config (+4/-0); benchmark/comp/comp.csv (+4/-0); benchmark/comp/comp_validation.csv (+4/-0); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); src/composition.cpp (+25/-17); src/composition.h (+6/-5); src/composition_timedependent.cpp (+3/-3); src/composition_timedependent.h (+2/-0); testfiles/baf.in (+0/-44); testfiles/comp.in (+13/-0); testfiles/isf_list.in (+0/-13); testfiles/isfs.in (+0/-18); testfiles/md.in (+0/-18); testfiles/msd.in (+0/-13); testfiles/msd2d.in (+0/-18); testfiles/ngp.in (+0/-18); testfiles/vhd.in (+0/-13); testfiles/vhs.in (+0/-13) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,80a0f72dfc3fe64171ca46d792b9d79dc90a51f8,80a0f72,2026-04-08,Khanh Ma,Multithreading enabled for Radial Count,21,236,47,6,benchmark/comp/comp.csv (+25/-4); benchmark/comp/comp_validation.csv (+25/-4); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); benchmark/rdf/rdf.config (+0/-4); benchmark/rdf/rdf.csv (+25/-3); benchmark/rdf/rdf_validation.csv (+25/-3); benchmark/rdf/runtime.png (+binary/-binary); benchmark/rdf/speedup.png (+binary/-binary); benchmark/rnf/rnf.config (+4/-0); benchmark/rnf/rnf.csv (+25/-0); benchmark/rnf/rnf_validation.csv (+25/-0); benchmark/rnf/runtime.png (+binary/-binary); benchmark/rnf/speedup.png (+binary/-binary); src/control.cpp (+8/-0); src/radial_count.cpp (+31/-25); src/radial_count.h (+3/-3); testfiles/mcd.in (+13/-0); testfiles/rdf.in (+1/-1); testfiles/rnf.in (+13/-0); testfiles/strfac.in (+13/-0) +private-to-public,private-only,+,Removing benchmarking files,c4e6bf238f744b40676be05d6006bdc81fd4ddda,c4e6bf2,2026-04-08,Khanh Ma,Remove develop region,19,0,411,8,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/benchplot.py (+0/-107); benchmark/comp/comp.config (+0/-4); benchmark/comp/comp.csv (+0/-25); benchmark/comp/comp_validation.csv (+0/-25); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); benchmark/rdf/rdf.csv (+0/-25); benchmark/rdf/rdf_validation.csv (+0/-25); benchmark/rdf/runtime.png (+binary/-binary); benchmark/rdf/speedup.png (+binary/-binary); benchmark/rnf/rnf.config (+0/-4); benchmark/rnf/rnf.csv (+0/-25); benchmark/rnf/rnf_validation.csv (+0/-25); benchmark/rnf/runtime.png (+binary/-binary); benchmark/rnf/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71) +private-to-public,move,+,Documentation,79c079a21e69488220d80191fc6cc8c180bd73a5,79c079a,2026-04-10,dssimmons,Update overview.md,1,2,2,0,Manual/overview.md (+2/-2) +private-to-public,move,+,Documentation,7c0cd87e030b9c6ddf19a6ef3ac856cdd8c7c44b,7c0cd87,2026-04-10,dssimmons,Create multithreading.md,1,4,0,0,Manual/multithreading.md (+4/-0) +private-to-public,move,+,Documentation,a16651834d485384431a1f8519db3dc273cfe2f7,a166518,2026-04-10,dssimmons,Update msd.md,1,5,0,0,Manual/msd.md (+5/-0) +private-to-public,move,+,Documentation,6f7a4b871a70aedbb15679304172b39540f8a18b,6f7a4b8,2026-04-10,dssimmons,Update overview.md,1,1,1,0,Manual/overview.md (+1/-1) +private-to-public,move,+,Documentation,243e5ec3b11609e6da3f6a6f5d801690981aa417,243e5ec,2026-04-10,dssimmons,Update overview.md,1,1,1,0,Manual/overview.md (+1/-1) +private-to-public,move,+,Documentation,044c2d98ef78ed5bfe831e715d2697915477ae70,044c2d9,2026-04-13,Bao Khanh Ma,Enhance separate multithreading documentation in Manual,1,52,1,0,Manual/multithreading.md (+52/-1) +private-to-public,move,+,Documentation,6e10078bc2fbcd5d5b6cb7494fa2b915172c08b9,6e10078,2026-04-14,Bao Khanh Ma,Add multithreading badge to mean displacement doc,1,2,0,0,Manual/mean_displacement.md (+2/-0) +private-to-public,move,+,Documentation,31be0e63626e0d9ec4037a53a0f25601e8606fbe,31be0e6,2026-04-14,Bao Khanh Ma,Add multithreading badge to msd_2d documentation,1,2,0,0,Manual/msd_2d.md (+2/-0) +private-to-public,move,+,Documentation,931459ffa24d4fe67dfc5c4813fafbd609b33507,931459f,2026-04-14,Bao Khanh Ma,Add multithreading badge to ngp documentation,1,2,0,0,Manual/ngp.md (+2/-0) +private-to-public,move,+,Documentation,7cb8360e675814c95a1beb33e929bed2dbd76cc4,7cb8360,2026-04-14,Bao Khanh Ma,Add multithreading badge to radial_count.md,1,3,0,0,Manual/radial_count.md (+3/-0) +private-to-public,move,+,Documentation,411ec9ce8d1ea0995c677158cd38b9b4a9d247cd,411ec9c,2026-04-14,Bao Khanh Ma,Update rdf.md,1,3,0,0,Manual/rdf.md (+3/-0) +private-to-public,move,+,Documentation,e9672aa6b77ddcc82c1f49cb7d1a88c5342855e3,e9672aa,2026-04-14,Bao Khanh Ma,Add multithreading badge to vhd.md,1,2,0,0,Manual/vhd.md (+2/-0) +private-to-public,move,+,Documentation,e8adf1904fb8b062db4ee9c7561ce25b03e16b95,e8adf19,2026-04-14,Bao Khanh Ma,Add multithreading badge to vhs documentation,1,2,0,0,Manual/vhs.md (+2/-0) +private-to-public,move,+,Documentation,be7134e8cf367d16a0411cb95e307cb1c8c4098d,be7134e,2026-04-14,Bao Khanh Ma,Fix links and formatting in multithreading documentation,1,11,11,0,Manual/multithreading.md (+11/-11) +private-to-public,move,+,Documentation,5f3a604facf9f2494228a2228a4a4fc1ba783031,5f3a604,2026-04-14,Bao Khanh Ma,Update multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) +private-to-public,move,+,Documentation,cf6b2896b30856ded78473a0a52b41ad4df8218c,cf6b289,2026-04-14,Bao Khanh Ma,Fix typo in multithreading documentation,1,1,1,0,Manual/multithreading.md (+1/-1) +private-to-public,move,+,Documentation,2b04516b78012de14e650ebe3c50d7dd468842f8,2b04516,2026-04-14,Bao Khanh Ma,Update multithreading.md,1,16,10,0,Manual/multithreading.md (+16/-10) +private-to-public,move,+,Documentation,8cbf1ceab637de04e223b8a2e3bfc8f19fa34969,8cbf1ce,2026-04-17,dssimmons,Update trajectory_bin_list.md,1,1,1,0,Manual/trajectory_bin_list.md (+1/-1) +private-to-public,move,+,Documentation,8df31de0e0cdb36265b27d2cb8d58debeb39a950,8df31de,2026-04-17,simmons.davids@gmail.com,"Revert ""Update overview.md""",1,1,1,0,Manual/overview.md (+1/-1) +private-to-public,move,+,Documentation,1e57a77d39cce5a5125bb3c2dded8a7d9be14cd3,1e57a77,2026-04-17,simmons.davids@gmail.com,"Revert ""Revert ""Update overview.md""""",1,1,1,0,Manual/overview.md (+1/-1) +private-to-public,move,+,Documentation,827ae1fc2fe5b0b1cdf258c4623390f14ce0a9cc,827ae1f,2026-04-17,simmons.davids@gmail.com,"Revert ""Update trajectory_bin_list.md""",1,1,1,0,Manual/trajectory_bin_list.md (+1/-1) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,e3e8689fb93906d5b8e31132ad1f577617dfe34f,e3e8689,2026-04-25,Khanh Ma,Multithreading enabled for Orientational_Correlation and Neighbor_Decorrelation,32,942,144,0,benchmark (+1/-0); src/composition.cpp (+0/-5); src/control.cpp (+4/-1); src/mean_displacement.cpp (+0/-6); src/mean_square_displacement.cpp (+0/-6); src/mean_square_displacement_2d.cpp (+0/-5); src/neighbor_decorrelation_function.cpp (+31/-23); src/neighbor_decorrelation_function.h (+4/-4); src/orientational_correlation.cpp (+35/-26); src/orientational_correlation.h (+5/-5); src/system.cpp (+3/-9); testfiles/binnedcomp/binnedcomp_bin_0_0_0.bindata (+6/-0); testfiles/binnedcomp/binnedcomp_bin_1_0_0.bindata (+6/-0); testfiles/binnedisfs/binnedisfs_bin_0_0_0.bindata (+94/-0); testfiles/binnedisfs/binnedisfs_bin_1_0_0.bindata (+94/-0); testfiles/binnedmd/binnedmd_bin_0_0_0.bindata (+93/-0); testfiles/binnedmd/binnedmd_bin_1_0_0.bindata (+93/-0); testfiles/binnedmsd/binnedmsd_bin_0_0_0.bindata (+93/-0); testfiles/binnedmsd/binnedmsd_bin_1_0_0.bindata (+93/-0); testfiles/binnedmsd2d/binnedmsd2d_bin_0_0_0.bindata (+93/-0); testfiles/binnedmsd2d/binnedmsd2d_bin_1_0_0.bindata (+93/-0); testfiles/comp.in (+7/-2); testfiles/isfs.in (+16/-0); testfiles/mcd.in (+0/-13); testfiles/md.in (+16/-0); testfiles/msd.in (+16/-0); testfiles/msd2d.in (+16/-0); testfiles/ndf.in (+16/-0); testfiles/orientational_correlation.in (+14/-0); testfiles/rdf.in (+0/-13); testfiles/rnf.in (+0/-13); testfiles/strfac.in (+0/-13) +private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,9821b957ace56f11c456a2d796011dbc248cb4a7,9821b95,2026-04-26,Khanh Ma,Delete benchmarking files and clean testfiles. Ready to push onto origin,20,5,911,0,benchmark (+0/-1); src/control.cpp (+1/-36); src/control.h (+4/-4); testfiles/binnedcomp/binnedcomp_bin_0_0_0.bindata (+0/-6); testfiles/binnedcomp/binnedcomp_bin_1_0_0.bindata (+0/-6); testfiles/binnedisfs/binnedisfs_bin_0_0_0.bindata (+0/-94); testfiles/binnedisfs/binnedisfs_bin_1_0_0.bindata (+0/-94); testfiles/binnedmd/binnedmd_bin_0_0_0.bindata (+0/-93); testfiles/binnedmd/binnedmd_bin_1_0_0.bindata (+0/-93); testfiles/binnedmsd/binnedmsd_bin_0_0_0.bindata (+0/-93); testfiles/binnedmsd/binnedmsd_bin_1_0_0.bindata (+0/-93); testfiles/binnedmsd2d/binnedmsd2d_bin_0_0_0.bindata (+0/-93); testfiles/binnedmsd2d/binnedmsd2d_bin_1_0_0.bindata (+0/-93); testfiles/comp.in (+0/-18); testfiles/isfs.in (+0/-16); testfiles/md.in (+0/-16); testfiles/msd.in (+0/-16); testfiles/msd2d.in (+0/-16); testfiles/ndf.in (+0/-16); testfiles/orientational_correlation.in (+0/-14) +private-to-public,move,+,Documentation,f20e233b3597d45a70060faf5719167d0bf203e4,f20e233,2026-04-29,dssimmons,Update multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) +private-to-public,private-only,+,Update version but incorrectly,ec9458d7426e806eb12b14679e93ef7a0494d244,ec9458d,2026-05-07,Bao Khanh Ma,Update version from 1.0.1 to 1.1,1,1,1,0,VERSION (+1/-1) +private-to-public,move,+,Update version,9608de75cdb78eccea367a21b81bc91eaa9461f1,9608de7,2026-05-07,Bao Khanh Ma,Update VERSION,1,1,1,0,VERSION (+1/-1) +private-to-public,private-only,+,Revert changes in github worflow,a9dcd840af3c1dfd2df64d301b11cf74fd76c1ab,a9dcd84,2026-05-07,Khanh Ma,Abort skipping VERSION check in PR. (I temporarily disabled VERSION check before while integrating multithreading due to inexperience in tags and version control in Github. I will now enable it again.),1,0,6,0,.github/workflows/check-version.yml (+0/-6) +private-to-public,move,+,Change source code,971e40377dbe67190c2c98cff271343c7ad8365f,971e403,2026-05-13,Pierre Kawak,Fix custom/xyz template parsing and species atom counts,1,18,19,0,src/system.cpp (+18/-19) +private-to-public,move,+,Change source code,84ae88838522dd6448a119fedb5db3c57bca6196,84ae888,2026-05-21,simmons.davids@gmail.com,updated composition.cpp to enable it work with bin_lists binned to trajectories,1,1,0,0,src/composition.cpp (+1/-0) +private-to-public,move,+,Documentation,d086944f016da9c60f5946ebbd11ef62457928cc,d086944,2026-05-22,dssimmons,Update multithreading.md,1,0,5,0,Manual/multithreading.md (+0/-5) +private-to-public,move,+,Change source code,ea2ff0b7c126944ee57d5e78973b779af86b2e48,ea2ff0b,2026-05-22,dssimmons,Update composition_timedependent.cpp,1,1,0,0,src/composition_timedependent.cpp (+1/-0) +private-to-public,move,+,Documentation,99b51f2a47b50743b2e2b57ec7c0a1b6e193cc1b,99b51f2,2026-05-22,dssimmons,Update composition_vs_time.md,1,5,1,0,Manual/composition_vs_time.md (+5/-1) +private-to-public,move,+,Change source code,c60f9a9e82c634fcb11807605c33e3ff43b40907,c60f9a9,2026-05-28,simmons.davids@gmail.com,implemented new multibody_trajlist_intersection tool that finds subsets of multibodies with at least n beads contained within a specified trajectory list at each time,6,298,3,0,src/control.cpp (+43/-0); src/control.h (+3/-2); src/multibody_bead_region.cpp (+1/-1); src/multibody_trajlist_intersection.cpp (+187/-0); src/multibody_trajlist_intersection.h (+46/-0); testfiles/analysis.in (+18/-0) +private-to-public,move,+,Documentation,2574c7f62e804be2ac1da2babc1e81bb8b9beeab,2574c7f,2026-05-28,dssimmons,Update multibodies.md,1,2,1,0,Manual/multibodies.md (+2/-1) +private-to-public,move,+,Documentation,a4d2d310c5c30bafc137d7ff58f12e25e8341a2a,a4d2d31,2026-05-28,dssimmons,Update multibodies.md,1,1,1,0,Manual/multibodies.md (+1/-1) +private-to-public,move,+,Documentation,0fd3d79b529bf4cd711e3632ad75f22b8fce5b45,0fd3d79,2026-05-28,dssimmons,Create multibody_trajlist_intersection.md,1,7,0,0,Manual/multibody_trajlist_intersection.md (+7/-0) +private-to-public,move,+,Documentation,2d2923682c1f3c42488505573e0605dd394dcd8d,2d29236,2026-06-16,Bao Khanh Ma,Rename 'baf' to 'raf' since 'baf' is a depracated command,1,1,1,0,Manual/multithreading.md (+1/-1) +private-to-public,move,+,Documentation,4ca3e3ab0fe9dfb552a8962dae22fdd9187da128,4ca3e3a,2026-06-16,Bao Khanh Ma,Update description for 'raf' function in multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) + +# Review rows with status=candidate before cherry-picking. +"# Candidate order is oldest-to-newest, excluding patch-equivalent and private-only commits." +# COPY public-to-private: git cherry-pick -x 793001167ba1 d68011fbcefb cd78368a559f 142f3ced06db 4219fb97e221 d758149c62bb e5c6abbaf05e d849e6f85a01 a2dd4396cd96 d3444a7217ec 588e8b889a08 69b574a74a63 92979a40cd5d 74b2e5c4997d +# COPY private-to-public part 1: git cherry-pick -x 7630a124c8e7 229d62edc98b 1176fd45ecde bf5a91e1ae1e f6130411ca27 ae23719de2f5 797d3ff4f615 5345b4316dba b9c795b1e1f7 fcfc2d98cf29 f8b46f792b55 8af43be2c5d6 6c74f818866f f1293d9029bb 538c146ecd78 6809bb7d2c0c 879aaa9ced93 65a874d6c33f d09698563415 37f3f45cb2d1 +# COPY private-to-public part 2: git cherry-pick -x 88a17cf8d244 c5999747f82e 986663ff7352 5dea40f2cd09 80a0f72dfc3f c4e6bf238f74 79c079a21e69 7c0cd87e030b a16651834d48 6f7a4b871a70 243e5ec3b116 044c2d98ef78 6e10078bc2fb 31be0e63626e 931459ffa24d 7cb8360e6758 411ec9ce8d1e e9672aa6b77d e8adf1904fb8 be7134e8cf36 +# COPY private-to-public part 3: git cherry-pick -x 5f3a604facf9 cf6b2896b308 2b04516b7801 8cbf1ceab637 8df31de0e0cd 1e57a77d39cc 827ae1fc2fe5 e3e8689fb939 9821b957ace5 f20e233b3597 ec9458d7426e 9608de75cdb7 a9dcd840af3c 971e40377dbe 84ae88838522 d086944f016d ea2ff0b7c126 99b51f2a47b5 c60f9a9e82c6 2574c7f62e80 +# COPY private-to-public part 4: git cherry-pick -x a4d2d310c5c3 0fd3d79b529b 2d2923682c1f 4ca3e3ab0fe9 diff --git a/src/control.h b/src/control.h index 90ae4198..67db4c2c 100644 --- a/src/control.h +++ b/src/control.h @@ -12,6 +12,7 @@ #include //#include #include +#include #include #include #include @@ -87,8 +88,21 @@ class Control Space_Time_Correlation_Function vht; Gaussian_Comparison * gaussian_comparison; //array of Gaussian comparison objects int n_gaussian_comparisons; - time_t start; //timer start - time_t finish; //timer stop + //Timer + time_t start, finish; + + //High-resolution timer (For algorithm benchmarking) + using clock = std::chrono::steady_clock; + using timepoint = clock::time_point; + timepoint high_start; //timer start + timepoint high_finish; //timer stop + float duration; + float time_count(timepoint start, timepoint finish){ + return std::chrono::duration(finish - start).count(); + } + + //Patching data to benchmark + ofstream benchmark{"benchmark/benchmark.csv", ios::app}; /*Arrays to store analysis results with a name given by the user, for later recall and use in other analysis techniques*/ diff --git a/src/incoherent_scattering_function.cpp b/src/incoherent_scattering_function.cpp index 42f4a1f3..32ae4f66 100644 --- a/src/incoherent_scattering_function.cpp +++ b/src/incoherent_scattering_function.cpp @@ -293,7 +293,6 @@ void Incoherent_Scattering_Function::listkernel(Trajectory* current_trajectory, coordinate2 = current_trajectory->show_unwrapped(nextii); tempcorrelation += double(cos(vectorlist[wavevectorii]&(coordinate2-coordinate1))) / double(vectorcount); } - #pragma omp atomic correlation[timegapii][wavenumberii] += float(tempcorrelation); } } diff --git a/src/system.cpp b/src/system.cpp index b3781929..762d30e4 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -4105,7 +4105,7 @@ void System::displacement_list(Analysis* analysis, bool fullblock)const #endif { { - #pragma omp parallel for schedule(status) if(analysis->isThreadSafe()) // TODO: Test if we can use the old loop + #pragma omp parallel for schedule(static) if(analysis->isThreadSafe()) // TODO: Test if we can use the old loop for(int timegapii=0;timegapii Date: Thu, 25 Jun 2026 19:33:45 +0700 Subject: [PATCH 04/44] Padding MSD - Adapted from f6130411ca27fd890fe953e4a0d590200f92bcfc --- src/mean_square_displacement.cpp | 79 ++++++++++++++++++++++---------- src/mean_square_displacement.h | 8 ++-- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/mean_square_displacement.cpp b/src/mean_square_displacement.cpp index 3bccbfc1..34009b2b 100644 --- a/src/mean_square_displacement.cpp +++ b/src/mean_square_displacement.cpp @@ -13,14 +13,15 @@ #include using namespace std; +const int PAD = 16; Mean_Square_Displacement::Mean_Square_Displacement() { n_times = 0; //allocate memory for mean square displacement data - msd = new float [n_times]; - weighting = new float [n_times]; + msd = new float * [n_times]; + weighting = new float * [n_times]; atomcount = 0; } @@ -36,15 +37,20 @@ Mean_Square_Displacement::Mean_Square_Displacement(const Mean_Square_Displacemen n_times = copy.n_times; atomcount = copy.atomcount; - msd = new float [n_times]; - weighting = new float [n_times]; + msd = new float * [n_times]; + weighting = new float * [n_times]; + + for(int i = 0; i < n_times; i++){ + msd[i] = new float[PAD]; + weighting[i] = new float[PAD]; + } timetable = system->displacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - msd = new float [n_times]; - weighting = new float [n_times]; + msd = new float * [n_times]; + weighting = new float * [n_times]; + + for(int i = 0; i < n_times; i++){ + msd[i] = new float[PAD]; + weighting[i] = new float[PAD]; + } + timetable = system->displacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data + for(int i = 0; i < n_times; i++){ + delete [] msd[i]; + delete [] weighting[i]; + } delete [] msd; delete [] weighting; - msd = new float [n_times]; - weighting = new float [n_times]; + msd = new float * [n_times]; + weighting = new float * [n_times]; + + for(int i = 0; i < n_times; i++){ + msd[i] = new float[PAD]; + weighting[i] = new float[PAD]; + } timetable = system->displacement_times(); for(timeii=0;timeiishow_n_trajectories(currenttime); // //weighting[timegapii]+=(trajectory_list[0]).show_n_trajectories(currenttime); // (trajectory_list[0]).listloop(this,currenttime); - weighting[timegapii]+=trajectory_list->show_n_trajectories(thisii); + weighting[timegapii][0]+=trajectory_list->show_n_trajectories(thisii); (trajectory_list[0]).listloop(this,timegapii, thisii, nextii); } @@ -162,7 +195,7 @@ void Mean_Square_Displacement::list_displacementkernel(int timegapii,int thisii, void Mean_Square_Displacement::listkernel(Trajectory* current_trajectory, int timegapii,int thisii, int nextii) { - msd[timegapii]+=current_trajectory->distance(thisii,nextii)*current_trajectory->distance(thisii,nextii); + msd[timegapii][0]+=current_trajectory->distance(thisii,nextii)*current_trajectory->distance(thisii,nextii); } @@ -172,7 +205,7 @@ void Mean_Square_Displacement::postprocess_list() for(int timeii=0;timeii Date: Wed, 18 Mar 2026 20:07:52 -0400 Subject: [PATCH 05/44] Update README.md Added link of exponential time spacing to time scheme documentation (cherry picked from commit 797d3ff4f6159d436e4594fbacb21057caa078fa) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22103612..8326d039 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ It provides a wide variety of high-performance analyses integral to molecular mo ## Why AMDAT (at a glance) * Fast, in-memory engine – load once, analyze many time delays without re-reading files. -* Blocked exponential time spacing – efficient long-timescale dynamics across orders of magnitude. +* Blocked [exponential time spacing](/Manual/time_scheme.md) – efficient long-timescale dynamics across orders of magnitude. * Modular data abstractions – trajectory / neighbor / multibody / value lists compose into rich workflows. * Validated analyses – * static and time-resolved structure factors, From 1f87c2c062819c458b7fd60ed87c2aab092d5c73 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 09:35:40 +0700 Subject: [PATCH 06/44] Enable multithreading for MD, MSD, Van Hove, and BAF analyses: Public-safe adaptation of private commit 5345b431. --- Makefile | 8 +-- src/analysis.h | 1 + src/bond_autocorrelation_function.h | 2 +- src/control.cpp | 12 +++- src/control.h | 6 +- src/mean_displacement.cpp | 14 +++-- src/mean_displacement.h | 3 +- src/mean_square_displacement_2d.cpp | 79 +++++++++++++++++-------- src/mean_square_displacement_2d.h | 15 +++-- src/space_time_correlation_function.cpp | 10 ++-- src/space_time_correlation_function.h | 2 +- src/system.cpp | 2 +- src/van_hove_distinct.cpp | 13 ++-- src/van_hove_distinct.h | 2 +- src/van_hove_self.cpp | 17 +++--- src/van_hove_self.h | 2 +- 16 files changed, 114 insertions(+), 74 deletions(-) diff --git a/Makefile b/Makefile index 0d879825..e98a759e 100644 --- a/Makefile +++ b/Makefile @@ -122,9 +122,6 @@ XDR_OBJS := $(patsubst $(XDR_SRC_DIR)/%.c,$(BUILD_DIR)/xdr/%.o,$(XDR_CSRCS)) # Some distros require -lm for math symbols used by xdrfile LDLIBS += -lm -# Ensure dir exists -$(shell mkdir -p $(BUILD_DIR)/xdr) - # --- Source discovery (flat, only src/*.cpp) --------------------------------- SRCS := $(wildcard $(SRC_DIR)/*.cpp) @@ -138,9 +135,6 @@ SRCS := $(filter-out $(EXCLUDE_SRCS),$(SRCS)) OBJS := $(patsubst $(SRC_DIR)/%.cpp,$(BUILD_DIR)/%.o,$(SRCS)) DEPS := $(OBJS:.o=.d) -# Ensure build dirs exist -$(shell mkdir -p $(BUILD_DIR)) - # --- Targets ----------------------------------------------------------------- .PHONY: all clean distclean rebuild format lint help all: $(APP) @@ -204,11 +198,13 @@ $(APP): $(OBJS) $(XDR_OBJS) $(VORO_OBJS) | qvectors voro # Compile C++: strictly src/.cpp → build/.o $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp | $(VERSION_H) @echo " CXX $<" + @mkdir -p $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ # Compile C from xdrfile: third_party/xdrfile-1.1b/src/*.c → build/xdr/*.o $(BUILD_DIR)/xdr/%.o: $(XDR_SRC_DIR)/%.c @echo " CC $<" + @mkdir -p $(dir $@) $(CC) $(XDR_CFLAGS) -c $< -o $@ ## Compile voro++: third_party/voro++-0.4.6/src/*.cc → build/voro/*.o (isolated includes) diff --git a/src/analysis.h b/src/analysis.h index 53311cfe..c1b51175 100644 --- a/src/analysis.h +++ b/src/analysis.h @@ -88,6 +88,7 @@ class Analysis virtual void listkernel(Trajectory*, int, int, int){cout<<"Error: Trajectory list targets not fully implemented for this analysis method.\n";}; //added by Michael? virtual void listkernel2(Trajectory*, Trajectory*, int, int, int){cout<<"Error: Trajectory list targets not fully implemented for this analysis method.\n";}; //listkernel for use only when two (nested) trajectory loops are needed. virtual void listkernel(Trajectory*){cout<<"Error: Trajectory list targets not fully implemented for this analysis method.\n";}; + virtual void listkernel(Trajectory*,int){cout<<"Error: Trajectory list targets not fully implemented for this analysis method.\n";}; /*System loop methods*/ diff --git a/src/bond_autocorrelation_function.h b/src/bond_autocorrelation_function.h index 014c1b73..71366d03 100644 --- a/src/bond_autocorrelation_function.h +++ b/src/bond_autocorrelation_function.h @@ -70,7 +70,7 @@ class Bond_Autocorrelation_Function: public Multibody_Analysis //void bin_hook(Trajectory_List*,int,int,int); //void postprocess_bins(); -// bool isThreadSafe(){return true;}; + bool isThreadSafe(){return true;}; }; } diff --git a/src/control.cpp b/src/control.cpp index fd011f09..32163cb4 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -2541,12 +2541,16 @@ void Control::calc_vhs() vhs.set(analyte, n_bins, max_range); cout << "\nCalculating self part of Van Hove correlation function."; start = time(NULL); + high_start = clock::now(); run_analysis(&vhs,runline); - finish = time(NULL); vhs_defined=1; + vhs.write(filename); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; + finish = time(NULL); cout << "\nCalculated self Van Hove in " << finish-start<<" seconds."; - vhs.write(filename); } @@ -5022,8 +5026,12 @@ void Control::baf() Bond_Autocorrelation_Function bafun(analyte,dim); cout << "\nCalculating bond autocorrelation function.\n";cout.flush(); start = time(NULL); + high_start = clock::now(); bafun.analyze(multibodylist); // pass run_analysis template the analysis type 'Mean_Square_Displacement' finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated bond autocorrelation function in " << finish-start<<" seconds."<(finish - start).count(); } - //Patching data to benchmark - ofstream benchmark{"benchmark/benchmark.csv", ios::app}; - - /*Arrays to store analysis results with a name given by the user, for later recall and use in other analysis techniques*/ //To be added //Space_Time_Correlation_Function * space_time_correlations [LISTSIZE]; @@ -402,7 +398,7 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri } high_finish = clock::now(); duration = time_count(high_start, high_finish); - benchmark << duration; + cerr << duration; return analyzer; } diff --git a/src/mean_displacement.cpp b/src/mean_displacement.cpp index cc7f2b8d..eb5581af 100644 --- a/src/mean_displacement.cpp +++ b/src/mean_displacement.cpp @@ -149,20 +149,22 @@ void Mean_Displacement::analyze(Trajectory_List * t_list) void Mean_Displacement::list_displacementkernel(int timegapii,int thisii, int nextii) { - currenttime=thisii; - nexttime=nextii; - currenttimegap=timegapii; + int currenttimegap=timegapii; + int currenttime=thisii; + int nexttime=nextii; weighting[timegapii]+=trajectory_list->show_n_trajectories(currenttime); //weighting[timegapii]+=(trajectory_list[0]).show_n_trajectories(currenttime); - (trajectory_list[0]).listloop(this,currenttime); + (trajectory_list[0]).listloop(this,currenttimegap,currenttime,nexttime); } -void Mean_Displacement::listkernel(Trajectory* current_trajectory) +void Mean_Displacement::listkernel(Trajectory* current_trajectory, int currenttimegap, int currenttime, int nexttime) { - md[currenttimegap]+=current_trajectory->show_unwrapped(nexttime)-current_trajectory->show_unwrapped(currenttime); + Coordinate c_next = current_trajectory->show_unwrapped(nexttime); + Coordinate c_this = current_trajectory->show_unwrapped(currenttime); + md[currenttimegap]+=c_next-c_this; } diff --git a/src/mean_displacement.h b/src/mean_displacement.h index 7cf5eea8..405a9e88 100644 --- a/src/mean_displacement.h +++ b/src/mean_displacement.h @@ -44,13 +44,14 @@ class Mean_Displacement: public Analysis void analyze(Trajectory_List *,Trajectory_List *){cout<<"Error: Trajectory list targets with two lists not implemented for this analysis method.\n";}; //analysis method for when two trajectory lists are needed void analyze(Trajectory_List * t_list); void list_displacementkernel(int,int,int); - void listkernel(Trajectory *); + void listkernel(Trajectory *,int,int,int); void postprocess_list(); void bin_hook(Trajectory_List*,int,int,int); void postprocess_bins(); Coordinate show(int t)const{return md[t];}; //method to return one timestep of msd array + bool isThreadSafe(){return true;} }; } diff --git a/src/mean_square_displacement_2d.cpp b/src/mean_square_displacement_2d.cpp index 415c8094..6213e258 100644 --- a/src/mean_square_displacement_2d.cpp +++ b/src/mean_square_displacement_2d.cpp @@ -12,14 +12,19 @@ using namespace std; +const int PAD = 16; + Mean_Square_Displacement_2D::Mean_Square_Displacement_2D() { system=0; plane=""; n_times=0; atomcount=0; - msd = new float [n_times]; - weighting = new int [n_times]; + + msd = new float * [n_times]; + weighting = new int * [n_times]; + weighting_temp = new int [n_times]; + timetable = new float [n_times]; distancefun = &Trajectory::distance; } @@ -40,14 +45,20 @@ Mean_Square_Displacement_2D::Mean_Square_Displacement_2D(const Mean_Square_Displ distancefun = copy.distancefun; trajectory_list=copy.trajectory_list; - msd = new float [n_times]; - weighting = new int [n_times]; + msd = new float * [n_times]; + weighting = new int * [n_times]; + + for(int i = 0; i < n_times; i++){ + msd[i] = new float[PAD]; + weighting[i] = new int[PAD]; + } + timetable = system->displacement_times(); for (int timeii=0;timeiidisplacement_times(); for (int timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - msd = new float [n_times]; - weighting =system->timegap_weighting(); + msd = new float * [n_times]; + weighting = new int * [n_times]; + + for(int i = 0; i < n_times; i++){ + msd[i] = new float[PAD]; + weighting[i] = new int[PAD]; + } + + weighting_temp = system->timegap_weighting(); timetable = system->displacement_times(); + for(timeii=0;timeiidisplacement_list(this); postprocess_list(); @@ -134,16 +165,16 @@ void Mean_Square_Displacement_2D::analyze(Trajectory_List * t_list) void Mean_Square_Displacement_2D::list_displacementkernel(int timegapii,int thisii, int nextii) { - currenttime=thisii; - nexttime=nextii; - currenttimegap=timegapii; - weighting[timegapii]+=trajectory_list[0].show_n_trajectories(currenttime); - (trajectory_list[0]).listloop(this,currenttime); + int currenttimegap=timegapii; + int currenttime=thisii; + int nexttime=nextii; + weighting[timegapii][0]+=trajectory_list[0].show_n_trajectories(currenttime); + (trajectory_list[0]).listloop(this,currenttimegap,currenttime,nexttime); } -void Mean_Square_Displacement_2D::listkernel(Trajectory* current_trajectory) +void Mean_Square_Displacement_2D::listkernel(Trajectory* current_trajectory, int currenttimegap,int currenttime, int nexttime) { - msd[currenttimegap]+=(current_trajectory->*distancefun)(currenttime,nexttime)*(current_trajectory->*distancefun)(currenttime,nexttime); + msd[currenttimegap][0]+=(current_trajectory->*distancefun)(currenttime,nexttime)*(current_trajectory->*distancefun)(currenttime,nexttime); } void Mean_Square_Displacement_2D::postprocess_list() @@ -151,7 +182,7 @@ void Mean_Square_Displacement_2D::postprocess_list() int timeii; for(timeii=0;timeiiisThreadSafe()) // This makes this loop execute in parallel, splitting by time values. + #pragma omp parallel for schedule(dynamic) if(analysis->isThreadSafe()) // This makes this loop execute in parallel, splitting by time values. for(int timegapii=n_exponential_steps; timegapiishow_unwrapped(nextii)-current_trajectory->show_unwrapped(thisii)).length(); + Coordinate this_c = current_trajectory->show_unwrapped(nextii); + Coordinate next_c = current_trajectory->show_unwrapped(thisii); + float distance = (next_c - this_c).length(); bin(timegapii,distance); - weighting[timegapii]++; - - + weighting[timegapii][0]++; } diff --git a/src/van_hove_self.h b/src/van_hove_self.h index efe47145..e56f7742 100644 --- a/src/van_hove_self.h +++ b/src/van_hove_self.h @@ -26,7 +26,7 @@ class Van_Hove_Self: public Space_Time_Correlation_Function void analyze(Trajectory_List * t_list); void list_displacementkernel(int,int,int); void listkernel (Trajectory* current_trajectory, int timegapii, int thisii, int nextii); - + bool isThreadSafe(){return true;} }; } From 0644b028b5c8b155aaa5b6c5889bf05cd6f9a74d Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 09:38:42 +0700 Subject: [PATCH 07/44] Update README for public multithreading changes: Public-safe adaptation of private commit b9c795b. --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8326d039..7873f55e 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ It provides a wide variety of high-performance analyses integral to molecular mo * Fast, in-memory engine – load once, analyze many time delays without re-reading files. * Blocked [exponential time spacing](/Manual/time_scheme.md) – efficient long-timescale dynamics across orders of magnitude. -* Modular data abstractions – trajectory / neighbor / multibody / value lists compose into rich workflows. -* Validated analyses – - * static and time-resolved structure factors, - * radial distribution functions, - * mean-square displacements, +* Modular data abstractions – [trajectory](Manual/trajectory_lists.md) / [neighbor](Manual/neighborlist.md) / [multibody](Manual/multibodies.md) / [value](Manual/value_list.md) lists compose into rich workflows. +* Validated analyses such as - + * [static](Manual/structure_factor.md) and [time-resolved](Manual/isf_list.md) structure factors, + * [radial distribution functions](Manual/rdf.md), + * [mean-square displacements](Manual/msd.md), * neighbor correlations, * clustering, and more. * Plain-text outputs – easy post-processing in Python/Matlab/Excel/VMD/OVITO. @@ -162,6 +162,9 @@ If you use AMDAT, please cite: > Kawak, Drayer, and Simmons, "AMDAT: An Open-Source Molecular Dynamics Analysis Toolkit for Supercooled Liquids, Glass-Forming Materials, and Complex Fluids". arXiv, 2026. DOI: [10.48550/arXiv.2602.05865](https://doi.org/10.48550/arXiv.2602.05865) +and +> https://arxiv.org/abs/2602.05865 + *Also see [CITATION.cff](CITATION.cff).* ## Authors & Maintainers From e4fff857edac2ece0002ec8fb5297148bd3b8f93 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 09:50:33 +0700 Subject: [PATCH 08/44] Add padding support to bond autocorrelation function: Public-safe adaptation of private commit fcfc2d9. --- src/bond_autocorrelation_function.cpp | 137 ++++++++++++++++++-------- src/bond_autocorrelation_function.h | 5 +- 2 files changed, 98 insertions(+), 44 deletions(-) diff --git a/src/bond_autocorrelation_function.cpp b/src/bond_autocorrelation_function.cpp index 9d87b0a2..f346fa03 100644 --- a/src/bond_autocorrelation_function.cpp +++ b/src/bond_autocorrelation_function.cpp @@ -22,8 +22,8 @@ Bond_Autocorrelation_Function::Bond_Autocorrelation_Function() n_times = 0; //allocate memory for mean square displacement data - baf = new float [n_times]; - weighting = new int [n_times]; + baf = new float * [n_times]; + weighting = new int * [n_times]; atomcount = 0; dimensions.set(1,1,1); @@ -43,15 +43,20 @@ Bond_Autocorrelation_Function::Bond_Autocorrelation_Function(const Bond_Autocorr n_times = copy.n_times; atomcount = copy.atomcount; - baf = new float [n_times]; - weighting = new int [n_times]; + baf = new float * [n_times]; + weighting = new int * [n_times]; + + for(int i = 0; i < n_times; i++){ + baf[i] = new float[16]; + weighting[i] = new int[16]; + } timetable = system->displacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - baf = new float [n_times]; - weighting = new int [n_times]; + baf = new float * [n_times]; + weighting = new int * [n_times]; timetable = system->displacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - baf = new float [n_times]; - weighting = new int [n_times]; + baf = new float * [n_times]; + weighting = new int * [n_times]; + + for(int i = 0; i < n_times; i++){ + baf[i] = new float[16]; + weighting[i] = new int[16]; + } timetable = system->displacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - baf = new float [n_times]; - weighting = new int [n_times]; + baf = new float * [n_times]; + weighting = new int * [n_times]; + + for(int i = 0; i < n_times; i++){ + baf[i] = new float[16]; + weighting[i] = new int[16]; + } timetable = system->displacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiishow_n_multibodies(thisii); + weighting[timegapii][0]+=multibody_list->show_n_multibodies(thisii); multibody_list->listloop(this,timegapii, thisii, nextii); } @@ -339,7 +392,7 @@ void Bond_Autocorrelation_Function::listkernel(Multibody* current_multibody, int float dotproduct = (this->*vprep)((*current_multibody)(1)->show_unwrapped(thisii)-(*current_multibody)(0)->show_unwrapped(thisii))&(this->*vprep)((*current_multibody)(1)->show_unwrapped(nextii)-(*current_multibody)(0)->show_unwrapped(nextii)); //compute dot product between unit vectors at initial and later times - baf[timegapii]+=(this->*legendre_p)(dotproduct);//increment baf by chosen legendre polynomial of dot product above + baf[timegapii][0]+=(this->*legendre_p)(dotproduct);//increment baf by chosen legendre polynomial of dot product above } @@ -349,7 +402,7 @@ void Bond_Autocorrelation_Function::postprocess_list() for(int timeii=0;timeii Date: Fri, 3 Jul 2026 10:01:27 +0700 Subject: [PATCH 09/44] Add padding support to mean displacement Public-safe adaptation of private commit f8b46f7. --- src/mean_displacement.cpp | 86 +++++++++++++++++++++++++++++---------- src/mean_displacement.h | 7 ++-- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/mean_displacement.cpp b/src/mean_displacement.cpp index eb5581af..eb2316b2 100644 --- a/src/mean_displacement.cpp +++ b/src/mean_displacement.cpp @@ -12,14 +12,15 @@ #include "static_trajectory_list.h" using namespace std; +const int PAD = 16; Mean_Displacement::Mean_Displacement() { n_times = 0; //allocate memory for mean square displacement data - md = new Coordinate [n_times]; - weighting = new int [n_times]; + md = new Coordinate * [n_times]; + weighting = new int * [n_times]; atomcount = 0; } @@ -35,15 +36,21 @@ Mean_Displacement::Mean_Displacement(const Mean_Displacement & copy) n_times = copy.n_times; atomcount = copy.atomcount; - md = new Coordinate [n_times]; - weighting = new int [n_times]; + md = new Coordinate * [n_times]; + weighting = new int * [n_times]; + + for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - md = new Coordinate [n_times]; - weighting = new int [n_times]; + md = new Coordinate * [n_times]; + weighting = new int * [n_times]; + + for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiitimegap_weighting(); + int timeii; + weighting_temp = system->timegap_weighting(); + for(timeii=0;timeiishow_n_trajectories(currenttime); + weighting[timegapii][0]+=trajectory_list->show_n_trajectories(currenttime); //weighting[timegapii]+=(trajectory_list[0]).show_n_trajectories(currenttime); (trajectory_list[0]).listloop(this,currenttimegap,currenttime,nexttime); } @@ -164,7 +206,7 @@ void Mean_Displacement::listkernel(Trajectory* current_trajectory, int currentti { Coordinate c_next = current_trajectory->show_unwrapped(nexttime); Coordinate c_this = current_trajectory->show_unwrapped(currenttime); - md[currenttimegap]+=c_next-c_this; + md[currenttimegap][0]+=c_next-c_this; } @@ -175,7 +217,7 @@ void Mean_Displacement::postprocess_list() for(int timeii=0;timeii Date: Fri, 3 Jul 2026 10:08:36 +0700 Subject: [PATCH 10/44] Update control handling for multithreading Public-safe adaptation of private commit 6c74f81. --- src/control.cpp | 2 +- src/control.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/control.cpp b/src/control.cpp index 32163cb4..0e391f8a 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -2547,7 +2547,7 @@ void Control::calc_vhs() vhs.write(filename); high_finish = clock::now(); duration = time_count(high_start, high_finish); - cerr << duration; + //cerr << duration; finish = time(NULL); cout << "\nCalculated self Van Hove in " << finish-start<<" seconds."; diff --git a/src/control.h b/src/control.h index 0e0ddfc7..ea4c388e 100644 --- a/src/control.h +++ b/src/control.h @@ -398,7 +398,7 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri } high_finish = clock::now(); duration = time_count(high_start, high_finish); - cerr << duration; + //cerr << duration; return analyzer; } From cd2bc2afd86f0e0bc778f9b2c37154e41c9b1db1 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:09:33 +0700 Subject: [PATCH 11/44] Change environment.yml to make conda use latest C/C++ compiler. Adapted to public-safe from 6809bb7. --- .github/workflows/check-version.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/check-version.yml b/.github/workflows/check-version.yml index dda4592f..5d95458a 100644 --- a/.github/workflows/check-version.yml +++ b/.github/workflows/check-version.yml @@ -23,11 +23,18 @@ jobs: shell: bash run: | set -euo pipefail + + if [ "${{ github.event_name }}" = "pull_request" ]; then + echo "VERSION check skipped for pull requests. ✅" + exit 0 + fi + if ! git tag --list | grep -q .; then echo "No tags found; skipping check." echo "skip=true" >> "$GITHUB_OUTPUT" exit 0 fi + tag="$(git describe --tags --abbrev=0)" echo "Latest tag: $tag" echo "tag=$tag" >> "$GITHUB_OUTPUT" From f9416b6a152d753a46612d18a81cdf74f3b7325c Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:18:10 +0700 Subject: [PATCH 12/44] Enable multithreading for Non Gaussian Parameter and Van Hove Distinct. Public-safe adaptation from commit d096985. --- src/control.cpp | 11 +++- src/control.h | 2 +- src/intermediate_scattering_function.h | 2 +- src/non_gaussian_parameter.cpp | 79 +++++++++++++++---------- src/non_gaussian_parameter.h | 8 +-- src/space_time_correlation_function.cpp | 17 ++++-- src/van_hove_distinct.cpp | 20 ++++--- 7 files changed, 86 insertions(+), 53 deletions(-) diff --git a/src/control.cpp b/src/control.cpp index 0e391f8a..2e078c64 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -2568,7 +2568,7 @@ void Control::calc_vhd() int n_bins; string filename; - int expected = 3; + int expected = 5; argcheck(expected); filename = args[1]; @@ -2583,8 +2583,12 @@ void Control::calc_vhd() vhd.set(analyte, n_bins, max_range); cout << "\nCalculating distinct Van Hove correlation function."; start = time(NULL); + high_start = clock::now(); run_analysis(&vhd, runline); finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated distinct Van Hove in " << finish-start<<" seconds.\n"; cout << "Writing distinct Van Hove to file. "; vhd.write(filename); @@ -3362,6 +3366,7 @@ void Control::ngp() runline = read_line(); cout <<"\n"<< runline; + //high_start = clock::now(); //analyte->unwrap(); //should already be unwrapped Mean_Square_Displacement msd(analyte); run_analysis(&msd, runline); @@ -3370,7 +3375,9 @@ void Control::ngp() ngpar=run_analysis (ngpar,runline,filename); // pass run_analysis template the analysis type //ngpar.write(filename); cout << "\n Peak time index of non-Gaussian parameter is " << ngpar.max() << "."; - + //high_finish = clock::now(); + //duration = time_count(high_start, high_finish); + //cerr << duration; } diff --git a/src/control.h b/src/control.h index ea4c388e..0e0ddfc7 100644 --- a/src/control.h +++ b/src/control.h @@ -398,7 +398,7 @@ Analysis_type Control::run_analysis(Analysis_type analyzer, string setline, stri } high_finish = clock::now(); duration = time_count(high_start, high_finish); - //cerr << duration; + cerr << duration; return analyzer; } diff --git a/src/intermediate_scattering_function.h b/src/intermediate_scattering_function.h index 132592de..4231aac9 100644 --- a/src/intermediate_scattering_function.h +++ b/src/intermediate_scattering_function.h @@ -32,7 +32,7 @@ class Intermediate_Scattering_Function:public Correlation_2D //void displacementkernel(int timegapii, int thisii, int nextii, int species_index, int molecule_index, int atom_type, int atom_index); void displacementkernel(int timegapii, int thisii, int nextii, Trajectory * traj); - + bool isThreadSafe(){return true;} }; } diff --git a/src/non_gaussian_parameter.cpp b/src/non_gaussian_parameter.cpp index a024fef1..0e43b301 100644 --- a/src/non_gaussian_parameter.cpp +++ b/src/non_gaussian_parameter.cpp @@ -12,20 +12,24 @@ using namespace std; - Non_Gaussian_Parameter::Non_Gaussian_Parameter() { system = 0; n_times = 0; msd = 0; - ngp = new float [n_times]; - weighting = new long int [n_times]; + ngp = new float* [n_times]; + weighting = new long int * [n_times]; + for(int timeii=0;timeii displacement_times(); for(int timeii=0;timeii displacement_times(); for(int timeii=0;timeii displacement_times(); for(timeii=0;timeiishow_n_trajectories(thisii); + int currenttime=thisii; + int nexttime=nextii; + int currenttimegap=timegapii; + weighting[timegapii][0]+=trajectory_list->show_n_trajectories(thisii); (trajectory_list[0]).listloop(this,timegapii,thisii,nextii); } @@ -124,8 +142,8 @@ void Non_Gaussian_Parameter::listkernel(Trajectory* current_trajectory) void Non_Gaussian_Parameter::listkernel(Trajectory* current_trajectory, int timegapii,int thisii, int nextii) { - #pragma omp atomic - ngp[timegapii]+=pow(current_trajectory->distance(thisii,nextii),4); + double dist = current_trajectory->distance(thisii,nextii); + ngp[timegapii][0]+=dist*dist*dist*dist; } @@ -135,8 +153,9 @@ void Non_Gaussian_Parameter::postprocess_list() for(timeii=0;timeiishow(timeii)),2.0)); - ngp[timeii] -= 1.0; + double timestepmsd = msd->show(timeii); + ngp[timeii][0] *= (3.0/(float(weighting[timeii][0])))/(5*timestepmsd*timestepmsd); + ngp[timeii][0] -= 1.0; } } @@ -153,7 +172,7 @@ void Non_Gaussian_Parameter::write(string filename)const output << "Non-Gaussian parameter data created by AMDAT v." << amdat::build::SEMVER << "\n"; for(timeii=0;timeiimaxvalue) + if(ngp[timeii][0]>maxvalue) { - maxvalue = ngp[timeii]; + maxvalue = ngp[timeii][0]; maxtime = timeii; } } diff --git a/src/non_gaussian_parameter.h b/src/non_gaussian_parameter.h index 0dee15fd..3ff48158 100644 --- a/src/non_gaussian_parameter.h +++ b/src/non_gaussian_parameter.h @@ -16,15 +16,15 @@ namespace std{ class Non_Gaussian_Parameter: public Analysis { int n_times; - float * ngp; - long int * weighting; + float ** ngp; + long int ** weighting; Mean_Square_Displacement const * msd; float * timetable; int atomcount; float * n_atoms; //calculation variables - int currenttime, nexttime, currenttimegap; + //int currenttime, nexttime, currenttimegap; public: Non_Gaussian_Parameter(); @@ -47,7 +47,7 @@ class Non_Gaussian_Parameter: public Analysis void bin_hook(Trajectory_List * t_list, int timegapii, int thisii, int nextii); void postprocess_bins(); - //bool isThreadSafe(){return true;}; + bool isThreadSafe(){return true;}; }; } diff --git a/src/space_time_correlation_function.cpp b/src/space_time_correlation_function.cpp index 683382f7..55a17b3e 100644 --- a/src/space_time_correlation_function.cpp +++ b/src/space_time_correlation_function.cpp @@ -148,7 +148,7 @@ void Space_Time_Correlation_Function::spherical_fourier() { //float ** fourier; //define pointer to array of fourier transformed data - float * wavenumber; //array of wavenumbers + float ** wavenumber; //array of wavenumbers int kii; //index over wavenumbers int rii; //index over radius float r; //mean radius of present shell @@ -166,7 +166,10 @@ void Space_Time_Correlation_Function::spherical_fourier() } delete [] spatial_inverse; - wavenumber = new float [n_wavenumbers]; + wavenumber = new float * [n_wavenumbers]; + for(int i = 0; i < n_wavenumbers; i++){ + wavenumber[i] = new float [16]; + } spatial_inverse = new float* [n_times]; for(timeii=0;timeiishow_n_trajectories(thisii); + weighting[timegapii][0]+=trajectory_list->show_n_trajectories(thisii); // current_list1->listloop(this,timegapii, thisii, nextii); trajectory_list->listloop(this,timegapii, thisii, nextii); } @@ -205,12 +207,12 @@ void Van_Hove_Distinct::listkernel2(Trajectory* traj1, Trajectory* traj2, int ti float distance; if(traj1!=traj2) { - (traj2->show_coordinate(nextii)-(traj1->show_coordinate(thisii))).length_unwrapped(system->size()); //calculate shortest distance between two coordinates, taking into account periodic boundaries + distance = (traj2->show_coordinate(nextii)-(traj1->show_coordinate(thisii))).length_unwrapped(system->size()); //calculate shortest distance between two coordinates, taking into account periodic boundaries bin(timegapii,distance); } else { - weighting[timegapii][0]--; + //weighting[timegapii][0]--; } } From 25d947bfec1055a36e232593d725fe3e330f2116 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:19:06 +0700 Subject: [PATCH 13/44] Create isf.md. Public-safe adaptation from 88a17cf. --- Manual/isf.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Manual/isf.md diff --git a/Manual/isf.md b/Manual/isf.md new file mode 100644 index 00000000..512d3627 --- /dev/null +++ b/Manual/isf.md @@ -0,0 +1,31 @@ +

isf

+

function

+ +Calculates the full intermediate scattering function of the system via the Fourier transform of the density. + +

Syntax

+ +``` +structure_factor + + (if symmetry = asymmetric only) +``` + +`` is either `auto` or `manual`. The `manual` functionality is not currently documented; employ auto. + +`` is either `symmetric` or `asymmetric`. +If `symmetric`, the analysis calculates the structure factor between the set of particles specified in target and itself. +If `asymmetric`, then a second target must be specified, and the partial structure factor describing correlations of `` with only `` is calculated. +`` and `` are the indices of the limits on time spacings to be calculated. +Options for ```` are ``xyz``, ``xy``, ``xz``, ``yz``, ``x``, ``y``, and ``z``. +This chooses which dimensions in k-space to include in the calculation of the intermediate scattering function. +``xyz`` computes the full radial three dimensional isf, ``xy``, ``yz``, and ``xz`` calculate two-dimensional in-plane radial isf's, and ``x``, ``y``, and ``z`` compute one-dimensional isf's. +```` determines the longest distance which will be decomposed into inverse space. +If a distance of 0 is given, the full box size is used. +Any deviation from '0' will in general produce incorrect results for the structure factor, especially at low k. + +`` determines what times to loop over. +If `timescheme` is -1, loop over all times. +If `timescheme` is zero or positive, only use one time per block, with the value setting the time index offset from the beginning of the block. +In most cases this should be set to either 0 or -1, with -1 giving improved statistical strength at the cost of much longer compute times. +The level of improvement in statistical strength will depend on the timescale for structural decorrelation in comparison to the length of a trajectory block. From cfaebff79189344f5b6a8302bb28b258976ba0f5 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:19:36 +0700 Subject: [PATCH 14/44] Update trajectory_lists.md. Adapted from c599974 --- Manual/trajectory_lists.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Manual/trajectory_lists.md b/Manual/trajectory_lists.md index 9615c993..b58c2fbe 100644 --- a/Manual/trajectory_lists.md +++ b/Manual/trajectory_lists.md @@ -50,7 +50,7 @@ A large number of analysis tools target `trajectory_list` objects. | [`displacement_dist`](displacement_dist.md) | Computes the displacement of each particle at some time separation and reports a distribution | Tab demarcated data file. | | [`displacement_map`](displacement_map.md) | Generates maps of particle displacement magnitude and writes to pdb files with value beta specifying displacement.| PDB file | | [`incremental_mean_displacement`](incremental_mean_displacement.md) | Calculates mean displacement of particles as a function of time. | Tab demarcated data file. | -| [`isf_list`](isf_list.md) | Calculate full intermediate scattering function | Tab demarkated data file | +| [`isf`](isf.md) | Calculate full intermediate scattering function | Tab demarkated data file | | [`isfs`](isfs.md) | Calculates the self-part of the intermediate scattering function. | Tab demarkated data file | | [`mean_closest_distance`](mean_closest_distance.md) | Calculates the average distance between particles in two distinct `trajectory_list`s. | Tab demarkated data file | | [`mean_displacement`](mean_displacement.md) | Calculates the mean (not mean square) displacement vector of all particles as a function of time. | Tab demarcated data file | @@ -81,7 +81,6 @@ A large number of analysis tools target `trajectory_list` objects. | `find_fast_fixedthreshold` | Finds fast particles based on displacements higher than some value. Likely to become deprecated in favor of valuelist approach. | new `trajectory_list` | | [`find_between`](find_between.md) | Finds particles with displacements in some value range. Likely to become deprecated in favor of valuelist approach. | new `trajectory_list` | | `gyration_radius` | Deprecated; to be removed. | - | -| `isf` | Deprecated; to be removed. | - | | `radial_debye_waller` | Computes dwf as a function of distance from (0,0,0). Planned for deprecation.| | `vector_autocorrelation_function` | Computes autocorrelation function for a specified set of vectors. Essentially replaced by [`raf`](raf.md) [`multibody`](multibodies.md) functionality and planned for deprecation. | Tab-demarcated data file. | From b858e50cdd1f0cc72e9461433a95b62d5b2c4b22 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:23:25 +0700 Subject: [PATCH 15/44] Creates OpenMP loop parallelism for time loop in analysis_onetime.cpp, and enables multithreading for Radial Distribution Function. Adapted from 986663f. --- src/analysis_onetime.cpp | 4 ++ src/control.cpp | 8 +++ src/incoherent_scattering_function.cpp | 6 +- src/mean_displacement.h | 2 +- src/mean_square_displacement.cpp | 6 +- src/mean_square_displacement.h | 2 +- src/radial_distribution_function.cpp | 81 +++++++++++++++++--------- src/radial_distribution_function.h | 6 +- 8 files changed, 78 insertions(+), 37 deletions(-) diff --git a/src/analysis_onetime.cpp b/src/analysis_onetime.cpp index 2aa3a29c..da3e3b8d 100644 --- a/src/analysis_onetime.cpp +++ b/src/analysis_onetime.cpp @@ -29,6 +29,7 @@ void Analysis_Onetime::analyze(Trajectory_List * t_list) if(time_scheme==-1) { + #pragma omp parallel for schedule(static) if(this->isThreadSafe()) for (timeii=0; timeiishow_n_timesteps();timeii++) { timekernel(timeii); @@ -40,6 +41,7 @@ void Analysis_Onetime::analyze(Trajectory_List * t_list) } else { + #pragma omp parallel for schedule(static) if(this->isThreadSafe()) for (timeii=time_scheme; timeiishow_n_exponentials();timeii+=system->show_n_exponential_steps()) { timekernel(timeii); @@ -62,6 +64,7 @@ void Analysis_Onetime::analyze(Trajectory_List * t_list,Trajectory_List* t_list2 if(time_scheme==-1) { + #pragma omp parallel for schedule(static) if(this->isThreadSafe()) for (timeii=0; timeiishow_n_timesteps();timeii++) { timekernel2(timeii); @@ -73,6 +76,7 @@ void Analysis_Onetime::analyze(Trajectory_List * t_list,Trajectory_List* t_list2 } else { + #pragma omp parallel for schedule(static) if(this->isThreadSafe()) for (timeii=time_scheme; timeiishow_n_exponentials();timeii+=system->show_n_exponential_steps()) { timekernel2(timeii); diff --git a/src/control.cpp b/src/control.cpp index 2e078c64..def7dcaf 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -2880,8 +2880,12 @@ void Control::rdf() { cout << "\nCalculating radial distribution function.\n";cout.flush(); start = time(NULL); + high_start = clock::now(); rad_dis_fun.analyze(trajlist1); finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated radial distribution function in " << finish-start<<" seconds.\n"; } else if(symmetry=="asymmetric") @@ -2893,9 +2897,13 @@ void Control::rdf() trajlist2=find_trajectorylist(listname2); cout << "\nCalculating radial distribution function.\n";cout.flush(); start = time(NULL); + high_start = clock::now(); //calls bins rad_dis_fun.analyze(trajlist1,trajlist2); finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated radial distribution function in " << finish-start<<" seconds.\n"; } else diff --git a/src/incoherent_scattering_function.cpp b/src/incoherent_scattering_function.cpp index 32ae4f66..90d2dc54 100644 --- a/src/incoherent_scattering_function.cpp +++ b/src/incoherent_scattering_function.cpp @@ -227,9 +227,9 @@ void Incoherent_Scattering_Function::analyze(Trajectory_List * t_list) void Incoherent_Scattering_Function::list_displacementkernel(int timegapii,int thisii, int nextii) { - currenttime=thisii; - nexttime=nextii; - timegap=timegapii; + int currenttime=thisii; + int nexttime=nextii; + int timegap=timegapii; // //cout<show_n_trajectories(currenttime)<<"\t"<show_n_trajectories(currenttime))/float(timegap_weighting[timegap]); // //n_atoms[timegap]+=float(trajectory_list->show_n_trajectories(currenttime)); diff --git a/src/mean_displacement.h b/src/mean_displacement.h index 4cea2a62..fdb1849b 100644 --- a/src/mean_displacement.h +++ b/src/mean_displacement.h @@ -24,7 +24,7 @@ class Mean_Displacement: public Analysis int atomcount; /*internal calculation variables*/ - int currenttime, nexttime, currenttimegap; + //int currenttime, nexttime, currenttimegap; public: diff --git a/src/mean_square_displacement.cpp b/src/mean_square_displacement.cpp index 34009b2b..a0b7a4fa 100644 --- a/src/mean_square_displacement.cpp +++ b/src/mean_square_displacement.cpp @@ -180,9 +180,9 @@ void Mean_Square_Displacement::analyze(Trajectory_List * t_list) void Mean_Square_Displacement::list_displacementkernel(int timegapii,int thisii, int nextii) { - currenttime=thisii; - nexttime=nextii; - currenttimegap=timegapii; + int currenttime=thisii; + int nexttime=nextii; + int currenttimegap=timegapii; // weighting[timegapii]+=trajectory_list->show_n_trajectories(currenttime); // //weighting[timegapii]+=(trajectory_list[0]).show_n_trajectories(currenttime); diff --git a/src/mean_square_displacement.h b/src/mean_square_displacement.h index 3bce29bc..34add43a 100644 --- a/src/mean_square_displacement.h +++ b/src/mean_square_displacement.h @@ -22,7 +22,7 @@ class Mean_Square_Displacement: public Analysis float atomcount; /*internal calculation variables*/ - int currenttime, nexttime, currenttimegap; + //int currenttime, nexttime, currenttimegap; public: diff --git a/src/radial_distribution_function.cpp b/src/radial_distribution_function.cpp index b3b7bfd7..cc4b2656 100644 --- a/src/radial_distribution_function.cpp +++ b/src/radial_distribution_function.cpp @@ -22,8 +22,8 @@ Radial_Distribution_Function::Radial_Distribution_Function():Analysis_Onetime() time_rdf= new float * [n_times]; mean_rdf= new float [n_bins]; - n_atoms_i=new int [n_times]; - n_atoms_j = new int [n_times]; + n_atoms_i=new int * [n_times]; + n_atoms_j = new int * [n_times]; } @@ -59,14 +59,19 @@ Radial_Distribution_Function::Radial_Distribution_Function(System*sys, int nbins time_rdf= new float * [n_times]; mean_rdf= new float [n_bins]; - n_atoms_i=new int [n_times]; - n_atoms_j = new int [n_times]; + n_atoms_i=new int * [n_times]; + n_atoms_j = new int * [n_times]; + for(timeii=0;timeiishow_n_trajectories(system_time(timeii)); - n_atoms_j[timeii]=trajectory_list2->show_n_trajectories(system_time(timeii)); + n_atoms_i[timeii][0]=trajectory_list->show_n_trajectories(system_time(timeii)); + n_atoms_j[timeii][0]=trajectory_list2->show_n_trajectories(system_time(timeii)); trajectory_list->listloop(this,0, timeii, 0); } @@ -266,14 +292,17 @@ void Radial_Distribution_Function::bin(int timestep, float distance) { boxsize = system->size(system_time(timeii)); boxvolume=boxsize.show_x()*boxsize.show_y()*boxsize.show_z(); - rhoj=float(n_atoms_j[timeii])/boxvolume; - n_i_total+=n_atoms_i[timeii]; + rhoj=float(n_atoms_j[timeii][0])/boxvolume; + n_i_total+=n_atoms_i[timeii][0]; for(binii=0;biniisize(system_time(timeii)); boxvolume=boxsize.show_x()*boxsize.show_y()*boxsize.show_z(); - mean_rho+=float(n_atoms_j[timeii])/boxvolume/n_times; + mean_rho+=float(n_atoms_j[timeii][0])/boxvolume/n_times; } min_k = 2.*PI/max_distance; diff --git a/src/radial_distribution_function.h b/src/radial_distribution_function.h index eaecd879..754ea4c1 100644 --- a/src/radial_distribution_function.h +++ b/src/radial_distribution_function.h @@ -21,8 +21,8 @@ class Radial_Distribution_Function: public Analysis_Onetime int n_times; float ** time_rdf; float * mean_rdf; - int * n_atoms_i; - int * n_atoms_j; + int ** n_atoms_i; + int ** n_atoms_j; public: @@ -53,7 +53,7 @@ class Radial_Distribution_Function: public Analysis_Onetime -// bool isThreadSafe(){return true;}; + bool isThreadSafe(){return true;}; }; } From 1759439848eae34a3d3f3d980a22e707cd791efd Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:25:23 +0700 Subject: [PATCH 16/44] Enables multithreading for Composition and Composition vs time. Adapted from 5dea40f. --- src/composition.cpp | 42 ++++++++++++++++++------------- src/composition.h | 11 ++++---- src/composition_timedependent.cpp | 6 ++--- src/composition_timedependent.h | 2 ++ 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/composition.cpp b/src/composition.cpp index bae36efa..b7108b42 100644 --- a/src/composition.cpp +++ b/src/composition.cpp @@ -31,12 +31,13 @@ Composition::Composition() } current_comp = new float* [n_times]; - current_density = new float [n_times]; + current_density = new float * [n_times]; for (int timeii=0; timeiishow_n_trajectories(timeii); - current_time = timeii; - current_density[current_time] = current_total_atoms/volume; + int current_total_atoms=trajectory_list->show_n_trajectories(timeii); + int current_time = timeii; + current_density[current_time][0] = current_total_atoms/volume; - trajectory_list->listloop(this,current_time); + trajectory_list->listloop(this,0,current_time,0); + #pragma omp atomic total_atoms += current_total_atoms; - average_density+=current_density[current_time]; + #pragma omp atomic + average_density+=current_density[current_time][0]; for (int typeii=0;typeiishow_type()-1; - #pragma omp atomic current_comp[current_time][traj_type]++; } diff --git a/src/composition.h b/src/composition.h index 48eaceee..3bd79003 100644 --- a/src/composition.h +++ b/src/composition.h @@ -23,12 +23,12 @@ class Composition: public Analysis_Onetime int n_atomtypes; int n_molecules; int n_times; - int current_time; - int current_total_atoms; + //int current_time; + //int current_total_atoms; int total_atoms; float volume; - float * current_density; + float ** current_density; float average_density; float * time_average_comp; float** current_comp; @@ -46,12 +46,13 @@ class Composition: public Analysis_Onetime Analysis_Type what_are_you(){Analysis_Type type = composition; return type;}; - void listkernel(Trajectory *); + //void listkernel(Trajectory *); + void listkernel(Trajectory *,int,int,int); void timekernel(int); void postprocess_list(); void write(string); void write(ofstream&); - bool isThreadSafe(){return false;}; + bool isThreadSafe(){return true;}; diff --git a/src/composition_timedependent.cpp b/src/composition_timedependent.cpp index 78a119a3..40f1b760 100644 --- a/src/composition_timedependent.cpp +++ b/src/composition_timedependent.cpp @@ -43,8 +43,8 @@ void Composition_TimeDependent::write(string filename) for (int timeii=0; timeiishow_time(timeii); - output << "\t" << current_density[timeii]; - output << "\t" << current_density[timeii]*volume; + output << "\t" << current_density[timeii][0]; + output << "\t" << current_density[timeii][0]*volume; for(int typeii=0;typeiishow_time(timeii); - output << "\t" << current_density[timeii]; + output << "\t" << current_density[timeii][0]; for (int typeii=0;typeii Date: Fri, 3 Jul 2026 10:27:40 +0700 Subject: [PATCH 17/44] Multithreading enabled for Radial Count. Adapted from 80a0f72 --- src/control.cpp | 8 +++++++ src/radial_count.cpp | 56 ++++++++++++++++++++++++-------------------- src/radial_count.h | 6 ++--- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/control.cpp b/src/control.cpp index def7dcaf..b92259ba 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -3038,8 +3038,12 @@ void Control::rnf() { cout << "\nCalculating non-normalized radial distribution function.\n";cout.flush(); start = time(NULL); + high_start = clock::now(); rad_dis_fun.analyze(trajlist1); finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated non-normalized radial distribution function in " << finish-start<<" seconds.\n"; } else if(symmetry=="asymmetric") @@ -3051,9 +3055,13 @@ void Control::rnf() trajlist2=find_trajectorylist(listname2); cout << "\nCalculating non-normalized radial distribution function.\n";cout.flush(); start = time(NULL); + high_start = clock::now(); //calls bins rad_dis_fun.analyze(trajlist1,trajlist2); finish = time(NULL); + high_finish = clock::now(); + duration = time_count(high_start, high_finish); + cerr << duration; cout << "\nCalculated non-normalized radial distribution function in " << finish-start<<" seconds.\n"; } else diff --git a/src/radial_count.cpp b/src/radial_count.cpp index af3ed578..b4fcdd35 100644 --- a/src/radial_count.cpp +++ b/src/radial_count.cpp @@ -22,8 +22,8 @@ Radial_Count::Radial_Count():Analysis_Onetime() time_rdf= new float * [n_times]; mean_rdf= new float [n_bins]; - n_atoms_i=new int [n_times]; - n_atoms_j = new int [n_times]; + n_atoms_i=new int * [n_times]; + n_atoms_j = new int * [n_times]; } @@ -59,14 +59,16 @@ Radial_Count::Radial_Count(System*sys, int nbins, int timescheme, float maxdista time_rdf= new float * [n_times]; mean_rdf= new float [n_bins]; - n_atoms_i=new int [n_times]; - n_atoms_j = new int [n_times]; + n_atoms_i=new int * [n_times]; + n_atoms_j = new int * [n_times]; for(timeii=0;timeiishow_n_trajectories(system_time(timeii)); - n_atoms_j[timeii]=trajectory_list2->show_n_trajectories(system_time(timeii)); + n_atoms_i[timeii][0]=trajectory_list->show_n_trajectories(system_time(timeii)); + n_atoms_j[timeii][0]=trajectory_list2->show_n_trajectories(system_time(timeii)); trajectory_list->listloop(this,0, timeii, 0); } @@ -266,14 +270,16 @@ void Radial_Count::bin(int timestep, float distance) { boxsize = system->size(system_time(timeii)); boxvolume=boxsize.show_x()*boxsize.show_y()*boxsize.show_z(); - rhoj=float(n_atoms_j[timeii])/boxvolume; - n_i_total+=n_atoms_i[timeii]; + rhoj=float(n_atoms_j[timeii][0])/boxvolume; + n_i_total+=n_atoms_i[timeii][0]; for(binii=0;binii Date: Fri, 10 Apr 2026 15:44:33 -0400 Subject: [PATCH 18/44] Update overview.md Change general manual wording to reflect partial implementation of multithreading. (cherry picked from commit 79c079a21e69488220d80191fc6cc8c180bd73a5) --- Manual/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Manual/overview.md b/Manual/overview.md index 1408aba3..ea3b6be4 100644 --- a/Manual/overview.md +++ b/Manual/overview.md @@ -6,7 +6,7 @@ AMDAT can read multiple file formats produced by the LAMMPS molecular dynamics s A central feature of AMDAT is its ability to read in and analyze blocked, exponentially-spaced trajectories. This is essential for analysis for dynamics over many orders of magnitude in time. The handling of this is currently documented in the [input_files](input_file.md) documentation. Both the documentation and the underlying functionality for this are expected to be expanded in the near future. -AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT presently does not include multithreading, although this capability is planned for introduction in a future update. +AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below.

Making AMDAT

@@ -38,7 +38,7 @@ AMDAT is run from the command line, specifying the filename of a user [input fil `-n <# OF PROCESSORS>` -Presently, no analysis methods allow for multithreading, so this option does nothing. Eventually, this will permit AMDAT to run some analyses on `<# OF PROCESSORS>` processing cores. Defaults to 1 if not given.. +This sets AMDAT to run certain analyses (those for which multithreading is enabled) on `<# OF PROCESSORS>` processing cores. Defaults to 1 if not given.. `-c ` From f452cd15b300ec1e9f2df0584845690f568ace78 Mon Sep 17 00:00:00 2001 From: dssimmons <113654652+dssimmons@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:58:04 -0400 Subject: [PATCH 19/44] Create multithreading.md Creating stub page for multithreading documentation. (cherry picked from commit 7c0cd87e030b9c6ddf19a6ef3ac856cdd8c7c44b) --- Manual/multithreading.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Manual/multithreading.md diff --git a/Manual/multithreading.md b/Manual/multithreading.md new file mode 100644 index 00000000..f9193309 --- /dev/null +++ b/Manual/multithreading.md @@ -0,0 +1,4 @@ +

AMDAT Multithreading

+ +AMDAT currently has CPU multithreading implemented for a subset of functions. These functions include the following. + From f40b124a9fcc0ac77efef96e8ad2ea5edc55da6e Mon Sep 17 00:00:00 2001 From: dssimmons <113654652+dssimmons@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:59:07 -0400 Subject: [PATCH 20/44] Update msd.md Added flag for multithreaded. (cherry picked from commit a16651834d485384431a1f8519db3dc273cfe2f7) --- Manual/msd.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Manual/msd.md b/Manual/msd.md index 100428ea..f11ff52a 100644 --- a/Manual/msd.md +++ b/Manual/msd.md @@ -1,4 +1,7 @@

msd

+ +[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) +

Function

Calculates mean square displacement, as follows. @@ -14,3 +17,5 @@ _msd \_ _\_ + + From 00dff24411c310c4c1ccccc34bcc259c9ad43f72 Mon Sep 17 00:00:00 2001 From: dssimmons <113654652+dssimmons@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:01:07 -0400 Subject: [PATCH 21/44] Update overview.md Updated multithreading documentation. (cherry picked from commit 6f7a4b871a70aedbb15679304172b39540f8a18b) --- Manual/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/overview.md b/Manual/overview.md index ea3b6be4..6297b0cc 100644 --- a/Manual/overview.md +++ b/Manual/overview.md @@ -38,7 +38,7 @@ AMDAT is run from the command line, specifying the filename of a user [input fil `-n <# OF PROCESSORS>` -This sets AMDAT to run certain analyses (those for which multithreading is enabled) on `<# OF PROCESSORS>` processing cores. Defaults to 1 if not given.. +This sets AMDAT to run certain analyses (those for which multithreading is enabled) on `<# OF PROCESSORS>` processing cores. Defaults to 1 if not given. Analysis tools with multithreading capabilities are identified by this flag in their documentation page: [![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md). Additional information and a full list of analysis tools with multithreading capabilities can be found at [multithreading](multithreading.md). `-c ` From 018760f864be8befe4c21ebd17e5c80d8b976821 Mon Sep 17 00:00:00 2001 From: dssimmons <113654652+dssimmons@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:01:47 -0400 Subject: [PATCH 22/44] Update overview.md More multithreading documentation. (cherry picked from commit 243e5ec3b11609e6da3f6a6f5d801690981aa417) --- Manual/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/overview.md b/Manual/overview.md index 6297b0cc..3b08b4ac 100644 --- a/Manual/overview.md +++ b/Manual/overview.md @@ -6,7 +6,7 @@ AMDAT can read multiple file formats produced by the LAMMPS molecular dynamics s A central feature of AMDAT is its ability to read in and analyze blocked, exponentially-spaced trajectories. This is essential for analysis for dynamics over many orders of magnitude in time. The handling of this is currently documented in the [input_files](input_file.md) documentation. Both the documentation and the underlying functionality for this are expected to be expanded in the near future. -AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below. +AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below or at this link: [multithreading](multithreading.md).

Making AMDAT

From 2ea4f41184151baa6ad514a039cedc14f659929d Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:20:24 -0400 Subject: [PATCH 23/44] Enhance separate multithreading documentation in Manual Updates the multithreading documentation initially (cherry picked from commit 044c2d98ef78ed5bfe831e715d2697915477ae70) --- Manual/multithreading.md | 53 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index f9193309..3fee5320 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -1,4 +1,55 @@

AMDAT Multithreading

-AMDAT currently has CPU multithreading implemented for a subset of functions. These functions include the following. +## Overview +HPC workflow in general takes a lot of time, and Molecular Dynamic Simulation is no exception. AMDAT facilitates research by supporting multithreading (currently implemented for a subset of functions) using OpenMP. The list of analysis with multithreading enabled to speedup computation is illustrated below. + +--- +| Analysis | Description | Maximum Speedup Tested (Compared to Serial) | +|----------|-------------|------------------------| +| `md` | Calculate Mean Displacement | 7x | +| `msd` | Calculate Mean Square Displacement | 10x | +| `msd_2d` | Calculate Mean Square Displacement for two dimensional analysis | 9x | +| `isfs` | Calculate Incoherent Scattering Function | 20x | +| `vhs` | Calculate Van Hove Self | 12x | +| `vhd` | Calculate Van Hove Distinct | 20x | +| `baf` | Calculate Bond Autocorrelatoion Function | 15x | +| `ngp` | Calculate Non Gaussian Parameter | 30x | +| `composition` | Calculate Composition | 7x | +| `rdf` | Calculate Radial Distribution Function | 21x | +| `rnf` | Calculate Radial Count | 23x | + + +## Inconsistency in performance between analysis + +AMDAT is currently implemented as highly object-oriented with its underlying structure is AoS (Array of Structure). Hence, data are organized in adjacent memory blocks, which are prone to Cache Coherency due to hardware architecture of fetching blocks of memory into cache line. In parallel programming, this conflict in the memory is called false-sharing. To fix this, AMDAT uses padding to separate each memory location further from each other, reducing Cache Coherency conflicts. +This approach, however, trades spatial locality from serial for alleviated memory conflict, preventing achieving perfect speedup. Therefore, speedups are inconsistent between analysis types due to the nature of how we store their data. + +## System Requirements + +To use multithreading effectively in AMDAT, make sure the following requirements are met: + +- AMDAT is compiled with **OpenMP** support +- Your system has a multi-core CPU +- The OpenMP runtime is available in your environment + +## Analysis Requirements + +Parallelism is introduced to reduce the runtime of time-based loops. +To avoid oversubscription and ensure efficient resource utilization, +the optimal number of threads is allocated can be given by: + +$$N_{\text{threads}} = \min \left( N_{\text{iterations}},\; N_{\text{CPU}} \right).$$ + +where: +- $$\ N_{\text{iterations}} \$$ is the number of independent time-based iterations. +- $$\ N_{\text{CPU}} \$$ is the maximum number of hardware threads (logical CPUs) available on the node. + +## Usage + +Running AMDAT is very simple with conda build, because OpenMP is already preinstalled. The flag `-n` will allocate the desired number of parallel regions for your analysis. + +### Example with msd + +```bash +./AMDAT -n 8 -i ./testfiles/msd.in From eab3fdbfc463a35f92763c3aa6abcba13e4de7b5 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:00:04 -0400 Subject: [PATCH 24/44] Add multithreading badge to mean displacement doc Added a badge for multithreading to the mean displacement documentation. (cherry picked from commit 6e10078bc2fbcd5d5b6cb7494fa2b915172c08b9) --- Manual/mean_displacement.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Manual/mean_displacement.md b/Manual/mean_displacement.md index c511fab5..74c590de 100644 --- a/Manual/mean_displacement.md +++ b/Manual/mean_displacement.md @@ -1,5 +1,7 @@

mean_displacement

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) + Calculates the mean (not mean square) displacement vector of all particles as a function of time. When used with trajectory_bin_lists, particularly useful for extracting gradients in displacement of the system. Syntax is as follows. _mean\_displacement \_ From 207ded383a001d829523ff0ea25de40a431c8bf6 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:01:18 -0400 Subject: [PATCH 25/44] Add multithreading badge to msd_2d documentation (cherry picked from commit 31be0e63626e0d9ec4037a53a0f25601e8606fbe) --- Manual/msd_2d.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Manual/msd_2d.md b/Manual/msd_2d.md index 8d23facc..5a3a9943 100644 --- a/Manual/msd_2d.md +++ b/Manual/msd_2d.md @@ -1,5 +1,7 @@

msd_2d

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) +

Function

Calculates mean square displacement in two dimensions From c7fbb32a81a3de2c99f6b402017400f0ead9ffe8 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:01:41 -0400 Subject: [PATCH 26/44] Add multithreading badge to ngp documentation (cherry picked from commit 931459ffa24d4fe67dfc5c4813fafbd609b33507) --- Manual/ngp.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Manual/ngp.md b/Manual/ngp.md index ccef5f95..9010109f 100644 --- a/Manual/ngp.md +++ b/Manual/ngp.md @@ -1,5 +1,7 @@

ngp

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) +

Function

Calculates non-Gaussian parameter of the mean squared displacement. From 521cd1140c6e95d092f8aad9f37cf395ebee478c Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:02:22 -0400 Subject: [PATCH 27/44] Add multithreading badge to radial_count.md Added a badge for multithreading to radial_count documentation. (cherry picked from commit 7cb8360e675814c95a1beb33e929bed2dbd76cc4) --- Manual/radial_count.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Manual/radial_count.md b/Manual/radial_count.md index 8513142d..dbcfd8b6 100644 --- a/Manual/radial_count.md +++ b/Manual/radial_count.md @@ -1,5 +1,8 @@

radial_count

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) + +--- Computes a non-normalized radial distribution function - essentially the mean number of particles in shells a distance $r$ to $r+\Delta r$ from a central particle. Syntax is as follows. From 55a6d4e9f87c6d081d2035cbfb2d306b4a9ffa16 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:02:38 -0400 Subject: [PATCH 28/44] Update rdf.md (cherry picked from commit 411ec9ce8d1ea0995c677158cd38b9b4a9d247cd) --- Manual/rdf.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Manual/rdf.md b/Manual/rdf.md index 921d7f69..e4a54f18 100644 --- a/Manual/rdf.md +++ b/Manual/rdf.md @@ -1,4 +1,7 @@

rdf

+ +[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) +

Function

From 02870f7032921e849176e86a251b481fe3c227e1 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:02:57 -0400 Subject: [PATCH 29/44] Add multithreading badge to vhd.md Added a badge for multithreading to the VHD documentation. (cherry picked from commit e9672aa6b77ddcc82c1f49cb7d1a88c5342855e3) --- Manual/vhd.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Manual/vhd.md b/Manual/vhd.md index 6e1ed683..8061b03e 100644 --- a/Manual/vhd.md +++ b/Manual/vhd.md @@ -1,5 +1,7 @@

vhd

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) +

Function

Calculates distinct part of the Van Hove function. The distinct van Hove is by construction asymmetric, computed between two distinct sets of atoms $a$ and $b$ ($a$ and $b$ may be the same). When asymmetric, $a$ is the central particle in the $G(r,\Delta t)$ calculation and $b$ is the set of particles for which densities around the central particles are computed. From cc7d865194c47779669eb024a7e0924f6e4d3e2c Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:03:07 -0400 Subject: [PATCH 30/44] Add multithreading badge to vhs documentation Added a badge for multithreading support in the documentation. (cherry picked from commit e8adf1904fb8b062db4ee9c7561ce25b03e16b95) --- Manual/vhs.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Manual/vhs.md b/Manual/vhs.md index c9082895..e6e837b7 100644 --- a/Manual/vhs.md +++ b/Manual/vhs.md @@ -1,5 +1,7 @@

vhs

+[![multi](https://img.shields.io/badge/Multithreaded-blue)](multithreading.md) + Calculates self-part of the Van Hove function. ``` From 9e8a218da874f1705d8d473d854968cce2df2149 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:08:22 -0400 Subject: [PATCH 31/44] Fix links and formatting in multithreading documentation Updated links in the analysis table and corrected formatting for CPU count in the threading formula. (cherry picked from commit be7134e8cf367d16a0411cb95e307cb1c8c4098d) --- Manual/multithreading.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index 3fee5320..08d1ec30 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -6,17 +6,17 @@ HPC workflow in general takes a lot of time, and Molecular Dynamic Simulation is --- | Analysis | Description | Maximum Speedup Tested (Compared to Serial) | |----------|-------------|------------------------| -| `md` | Calculate Mean Displacement | 7x | -| `msd` | Calculate Mean Square Displacement | 10x | -| `msd_2d` | Calculate Mean Square Displacement for two dimensional analysis | 9x | -| `isfs` | Calculate Incoherent Scattering Function | 20x | -| `vhs` | Calculate Van Hove Self | 12x | -| `vhd` | Calculate Van Hove Distinct | 20x | +| [`md`](md.md) | Calculate Mean Displacement | 7x | +| [`msd`](msd.md) | Calculate Mean Square Displacement | 10x | +| [`msd_2d`](msd_2d.md) | Calculate Mean Square Displacement for two dimensional analysis | 9x | +| [`isfs`](isfs.md) | Calculate Incoherent Scattering Function | 20x | +| [`vhs`](vhs.md) | Calculate Van Hove Self | 12x | +| [`vhd`](vhd.md) | Calculate Van Hove Distinct | 20x | | `baf` | Calculate Bond Autocorrelatoion Function | 15x | -| `ngp` | Calculate Non Gaussian Parameter | 30x | -| `composition` | Calculate Composition | 7x | -| `rdf` | Calculate Radial Distribution Function | 21x | -| `rnf` | Calculate Radial Count | 23x | +| [`ngp`](ngp.md) | Calculate Non Gaussian Parameter | 30x | +| [`composition`](composition.md) | Calculate Composition | 7x | +| [`rdf`](rdf.md) | Calculate Radial Distribution Function | 21x | +| [`rnf`](rnf.md) | Calculate Radial Count | 23x | ## Inconsistency in performance between analysis @@ -38,7 +38,7 @@ Parallelism is introduced to reduce the runtime of time-based loops. To avoid oversubscription and ensure efficient resource utilization, the optimal number of threads is allocated can be given by: -$$N_{\text{threads}} = \min \left( N_{\text{iterations}},\; N_{\text{CPU}} \right).$$ +$$N_{\text{threads}} = \min\left(N_{\text{iterations}},\;N_{\text{CPUs}} \right).$$ where: - $$\ N_{\text{iterations}} \$$ is the number of independent time-based iterations. From 14ee3ed42564511ebfb54d9af09840de0d1f615a Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:10:58 -0400 Subject: [PATCH 32/44] Update multithreading.md (cherry picked from commit 5f3a604facf9f2494228a2228a4a4fc1ba783031) --- Manual/multithreading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index 08d1ec30..ec9f415d 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -6,7 +6,7 @@ HPC workflow in general takes a lot of time, and Molecular Dynamic Simulation is --- | Analysis | Description | Maximum Speedup Tested (Compared to Serial) | |----------|-------------|------------------------| -| [`md`](md.md) | Calculate Mean Displacement | 7x | +| [`md`](mean_displacement.md) | Calculate Mean Displacement | 7x | | [`msd`](msd.md) | Calculate Mean Square Displacement | 10x | | [`msd_2d`](msd_2d.md) | Calculate Mean Square Displacement for two dimensional analysis | 9x | | [`isfs`](isfs.md) | Calculate Incoherent Scattering Function | 20x | From 2f9992c408ace70d8248d84be2f53442e78f0a90 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:51:25 -0400 Subject: [PATCH 33/44] Fix typo in multithreading documentation (cherry picked from commit cf6b2896b30856ded78473a0a52b41ad4df8218c) --- Manual/multithreading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index ec9f415d..9a92750a 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -42,7 +42,7 @@ $$N_{\text{threads}} = \min\left(N_{\text{iterations}},\;N_{\text{CPUs}} \right) where: - $$\ N_{\text{iterations}} \$$ is the number of independent time-based iterations. -- $$\ N_{\text{CPU}} \$$ is the maximum number of hardware threads (logical CPUs) available on the node. +- $$\ N_{\text{CPUs}} \$$ is the maximum number of hardware threads (logical CPUs) available on the node. ## Usage From 53556ad469caff941d4f928cbe6a535f94d2e760 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Tue, 14 Apr 2026 11:33:05 -0400 Subject: [PATCH 34/44] Update multithreading.md (cherry picked from commit 2b04516b78012de14e650ebe3c50d7dd468842f8) --- Manual/multithreading.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index 9a92750a..50b10044 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -1,17 +1,17 @@

AMDAT Multithreading

## Overview -HPC workflow in general takes a lot of time, and Molecular Dynamic Simulation is no exception. AMDAT facilitates research by supporting multithreading (currently implemented for a subset of functions) using OpenMP. The list of analysis with multithreading enabled to speedup computation is illustrated below. +High-performance computing workflows can be computationally expensive, and molecular dynamics analysis is no exception. To accelerate selected analyses, AMDAT supports multithreading with OpenMP. The analyses that currently support multithreading are listed below. --- | Analysis | Description | Maximum Speedup Tested (Compared to Serial) | |----------|-------------|------------------------| | [`md`](mean_displacement.md) | Calculate Mean Displacement | 7x | | [`msd`](msd.md) | Calculate Mean Square Displacement | 10x | -| [`msd_2d`](msd_2d.md) | Calculate Mean Square Displacement for two dimensional analysis | 9x | +| [`msd_2d`](msd_2d.md) | Calculate Mean Square Displacement for two-dimensional analysis | 9x | | [`isfs`](isfs.md) | Calculate Incoherent Scattering Function | 20x | -| [`vhs`](vhs.md) | Calculate Van Hove Self | 12x | -| [`vhd`](vhd.md) | Calculate Van Hove Distinct | 20x | +| [`vhs`](vhs.md) | Calculate self part of Van Hove Function | 12x | +| [`vhd`](vhd.md) | Calculate distinct part of Van Hove Function | 20x | | `baf` | Calculate Bond Autocorrelatoion Function | 15x | | [`ngp`](ngp.md) | Calculate Non Gaussian Parameter | 30x | | [`composition`](composition.md) | Calculate Composition | 7x | @@ -21,28 +21,34 @@ HPC workflow in general takes a lot of time, and Molecular Dynamic Simulation is ## Inconsistency in performance between analysis -AMDAT is currently implemented as highly object-oriented with its underlying structure is AoS (Array of Structure). Hence, data are organized in adjacent memory blocks, which are prone to Cache Coherency due to hardware architecture of fetching blocks of memory into cache line. In parallel programming, this conflict in the memory is called false-sharing. To fix this, AMDAT uses padding to separate each memory location further from each other, reducing Cache Coherency conflicts. -This approach, however, trades spatial locality from serial for alleviated memory conflict, preventing achieving perfect speedup. Therefore, speedups are inconsistent between analysis types due to the nature of how we store their data. +AMDAT is currently implemented with a highly object-oriented design and an array-of-structures (AoS) memory layout. Hence, data are organized in adjacent memory blocks, making them more prone to Cache Coherency issue. In parallel system, this conflict results in false-sharing, meaning different threads try to have writing access to one common cache line, despite aiming at independent memory location. To fix performance bottleneck, AMDAT uses padding to separate each memory location further from each other, reducing Cache Coherency conflicts. This approach, however, trades spatial locality from serial implementation for mitigated memory conflict in parallel tasks, making perfect speed-up realistically unachievable. Therefore, speed-ups are inconsistent between analyses due to the differences in how we store the data. ## System Requirements To use multithreading effectively in AMDAT, make sure the following requirements are met: -- AMDAT is compiled with **OpenMP** support - Your system has a multi-core CPU -- The OpenMP runtime is available in your environment +- The OpenMP runtime is available in your environment (This is already handled by Conda) ## Analysis Requirements Parallelism is introduced to reduce the runtime of time-based loops. -To avoid oversubscription and ensure efficient resource utilization, +However, to avoid oversubscription and ensure efficient resource utilization, the optimal number of threads is allocated can be given by: $$N_{\text{threads}} = \min\left(N_{\text{iterations}},\;N_{\text{CPUs}} \right).$$ where: -- $$\ N_{\text{iterations}} \$$ is the number of independent time-based iterations. - $$\ N_{\text{CPUs}} \$$ is the maximum number of hardware threads (logical CPUs) available on the node. +- $$\ N_{\text{iterations}} \$$ is the number of independent time-based iterations. In AMDAT's input files, it is highlighted as shown below: + +> system +> xyz_log +> ./testfiles/traj.xyz ./testfiles/log.lammps +> exponential **`70`** 77 1.05 0 0 .01 +> polymer 50 +> +> ... ## Usage From a75cbf531e6ef614110c554ab51cc97260b6e7d5 Mon Sep 17 00:00:00 2001 From: dssimmons <113654652+dssimmons@users.noreply.github.com> Date: Fri, 17 Apr 2026 15:10:39 -0400 Subject: [PATCH 35/44] Update trajectory_bin_list.md (cherry picked from commit 8cbf1ceab637de04e223b8a2e3bfc8f19fa34969) --- Manual/trajectory_bin_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/trajectory_bin_list.md b/Manual/trajectory_bin_list.md index f863d759..2e7f1b1c 100644 --- a/Manual/trajectory_bin_list.md +++ b/Manual/trajectory_bin_list.md @@ -17,7 +17,7 @@ Similarly to `trajectory_list`, these commands' syntax includes a "type" line, w Put another way, this takes the intersection of the `trajectory_list` and each bin of the `trajectory_bin_list`, and performs the calculation on each bin individually. The analysis will in general output a separate tab-demarcated file for each bin, which may produce a large number of files. An ending will be appended to the name of each output file with the bin indicies (e.g. `.2.1.2.bindata`) -The optional argument `` specifies whether or not, for dynamic analyses, the algorithm retains only particles that are in the bin at start and end times of a given time gap. The default is zero, meaning this check is not performed. +The optional argument `` is currently not operational. In general, for dynamical analysis, the algorithm analyzes only particles that are in the bin at start and end times of a given time gap. | Command | Effect | Output | |----------|----------|----------| From 521b47de1caa286e794131f7610afba224aabca6 Mon Sep 17 00:00:00 2001 From: "simmons.davids@gmail.com" Date: Fri, 17 Apr 2026 15:39:03 -0400 Subject: [PATCH 36/44] Revert "Update overview.md" This reverts commit 243e5ec3b11609e6da3f6a6f5d801690981aa417. (cherry picked from commit 8df31de0e0cdb36265b27d2cb8d58debeb39a950) --- Manual/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/overview.md b/Manual/overview.md index 3b08b4ac..6297b0cc 100644 --- a/Manual/overview.md +++ b/Manual/overview.md @@ -6,7 +6,7 @@ AMDAT can read multiple file formats produced by the LAMMPS molecular dynamics s A central feature of AMDAT is its ability to read in and analyze blocked, exponentially-spaced trajectories. This is essential for analysis for dynamics over many orders of magnitude in time. The handling of this is currently documented in the [input_files](input_file.md) documentation. Both the documentation and the underlying functionality for this are expected to be expanded in the near future. -AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below or at this link: [multithreading](multithreading.md). +AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below.

Making AMDAT

From ce2e850b96315c14a244bc021b3b64f7b6bf35c6 Mon Sep 17 00:00:00 2001 From: "simmons.davids@gmail.com" Date: Fri, 17 Apr 2026 15:47:55 -0400 Subject: [PATCH 37/44] Revert "Revert "Update overview.md"" This reverts commit 8df31de0e0cdb36265b27d2cb8d58debeb39a950. (cherry picked from commit 1e57a77d39cce5a5125bb3c2dded8a7d9be14cd3) --- Manual/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/overview.md b/Manual/overview.md index 6297b0cc..3b08b4ac 100644 --- a/Manual/overview.md +++ b/Manual/overview.md @@ -6,7 +6,7 @@ AMDAT can read multiple file formats produced by the LAMMPS molecular dynamics s A central feature of AMDAT is its ability to read in and analyze blocked, exponentially-spaced trajectories. This is essential for analysis for dynamics over many orders of magnitude in time. The handling of this is currently documented in the [input_files](input_file.md) documentation. Both the documentation and the underlying functionality for this are expected to be expanded in the near future. -AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below. +AMDAT includes no built-in tools for visualization of either trajectories or properties of trajectories. All results are output in a text-based form and must be viewed in another software (exe python, julia, excel, matlab,...). AMDAT does not include the ability to aggregate statistics acquired based on multiple simulations; this requires use of post-analysis software, such as python, julia, matlab, igor, excel, or similar. AMDAT includes CPU multithreading for select analysis function; more information is provided below or at this link: [multithreading](multithreading.md).

Making AMDAT

From 3e7d63fb4f13063779175a45803a0f9741c95d52 Mon Sep 17 00:00:00 2001 From: "simmons.davids@gmail.com" Date: Fri, 17 Apr 2026 15:48:41 -0400 Subject: [PATCH 38/44] Revert "Update trajectory_bin_list.md" This reverts commit 8cbf1ceab637de04e223b8a2e3bfc8f19fa34969. (cherry picked from commit 827ae1fc2fe5b0b1cdf258c4623390f14ce0a9cc) --- Manual/trajectory_bin_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/trajectory_bin_list.md b/Manual/trajectory_bin_list.md index 2e7f1b1c..f863d759 100644 --- a/Manual/trajectory_bin_list.md +++ b/Manual/trajectory_bin_list.md @@ -17,7 +17,7 @@ Similarly to `trajectory_list`, these commands' syntax includes a "type" line, w Put another way, this takes the intersection of the `trajectory_list` and each bin of the `trajectory_bin_list`, and performs the calculation on each bin individually. The analysis will in general output a separate tab-demarcated file for each bin, which may produce a large number of files. An ending will be appended to the name of each output file with the bin indicies (e.g. `.2.1.2.bindata`) -The optional argument `` is currently not operational. In general, for dynamical analysis, the algorithm analyzes only particles that are in the bin at start and end times of a given time gap. +The optional argument `` specifies whether or not, for dynamic analyses, the algorithm retains only particles that are in the bin at start and end times of a given time gap. The default is zero, meaning this check is not performed. | Command | Effect | Output | |----------|----------|----------| From 0f398be5974deac8827a48eaa2fcf7efb7b8610e Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:34:58 +0700 Subject: [PATCH 39/44] Multithreading enabled for Orientational_Correlation and Neighbor_Decorrelation. Adapted from e3e8689 --- src/composition.cpp | 5 -- src/control.cpp | 5 +- src/mean_displacement.cpp | 6 --- src/mean_square_displacement.cpp | 6 --- src/mean_square_displacement_2d.cpp | 5 -- src/neighbor_decorrelation_function.cpp | 54 ++++++++++++---------- src/neighbor_decorrelation_function.h | 8 ++-- src/orientational_correlation.cpp | 61 ++++++++++++++----------- src/orientational_correlation.h | 10 ++-- src/system.cpp | 12 ++--- 10 files changed, 82 insertions(+), 90 deletions(-) diff --git a/src/composition.cpp b/src/composition.cpp index b7108b42..97a69999 100644 --- a/src/composition.cpp +++ b/src/composition.cpp @@ -133,11 +133,6 @@ Composition Composition::operator=(const Composition & copy) { delete [] time_average_comp; - for(int timeii=0; timeii (ndf,runline,filename); // pass run_analysis template the analysis type 'Neighbor_Decorrelation_Function' - finish = time(NULL); cout << "\nCalculated neighbor_decorrelation_function in " << finish-start<<" seconds."<displacement_times(); for(timeii=0;timeiishow_n_timegaps(); //allocate memory for mean square displacement data - ndf = new float [n_times]; - weighting = new float [n_times]; + ndf = new float * [n_times]; + weighting = new float * [n_times]; timetable = system->displacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiidisplacement_times(); for(timeii=0;timeiishow_n_trajectories(thisii); + weighting[timegapii][0]+=trajectory_list->show_n_trajectories(thisii); (trajectory_list[0]).listloop(this,timegapii, thisii, nextii); } @@ -169,7 +177,7 @@ void Neighbor_Decorrelation_Function::listkernel(Trajectory* current_trajectory, trajID=current_trajectory->show_trajectory_ID(); - ndf[timegapii]+=n_list->n_persistent_neighbors(trajID,thisii,nextii); + ndf[timegapii][0]+=n_list->n_persistent_neighbors(trajID,thisii,nextii); } @@ -179,7 +187,7 @@ void Neighbor_Decorrelation_Function::postprocess_list() for(int timeii=0;timeiishow_n_timesteps(); - correlation = new float [n_times]; - weighting = new float [n_times]; + correlation = new float * [n_times]; + weighting = new float * [n_times]; for(timeii=0;timeiishow_n_timesteps(); - correlation = new float [n_times]; - weighting = new float [n_times]; + correlation = new float * [n_times]; + weighting = new float * [n_times]; for(timeii=0;timeiiisThreadSafe()) for(int timeii=0; timeiishow_n_timesteps(); timeii++) { - weighting[timeii]+=multibody_list->show_n_multibodies(timeii); + weighting[timeii][0]+=multibody_list->show_n_multibodies(timeii); multibody_list->listloop(this,0, timeii, 0); } postprocess_list(); @@ -129,7 +138,7 @@ void Orientational_Correlation::analyze(Multibody_List * t_list) void Orientational_Correlation::listkernel(Multibody* current_multibody, int timegapii,int thisii, int nextii) { float dotproduct= (((*current_multibody)(1)->show_unwrapped(thisii)-(*current_multibody)(0)->show_unwrapped(thisii)).unit_vector())&((correlated_vector).unit_vector()); //compute dot product between unit vectors at initial and later times - correlation[thisii]+=0.5*(3.0*dotproduct*dotproduct - 1.0); //increment baf by second legendre polynomial of dot product above + correlation[thisii][0]+=0.5*(3.0*dotproduct*dotproduct - 1.0); //increment baf by second legendre polynomial of dot product above } @@ -138,9 +147,9 @@ void Orientational_Correlation::postprocess_list() float cumulative_weighting=0; for(int timeii=0;timeiishow_time(timeii)<<"\t"<show_time(timeii)<<"\t"<show_time(timeii)<<"\t"<show_time(timeii)<<"\t"<isThreadSafe()) // TODO: Test if we can use the old loop for(int timegapii=0;timegapiilist_displacementkernel(timegapii,thisii,nextii); - #pragma omp atomic displacement_count++; abort = (displacement_count == displacement_limit && displacement_limit != 0); - #pragma omp flush(abort) } //if(displacement_count == displacement_limit) break; // cout << thisii << "\t" << nextii << "\n"; @@ -4250,10 +4246,8 @@ void System::displacement_list(Multibody_Analysis* analysis, bool fullblock)cons int thisii = n_exponential_steps*blockii+expii+int(frt); int nextii = thisii + n_exponential_steps*block_timegapii; analysis->list_displacementkernel(timegapii,thisii,nextii); - #pragma omp atomic displacement_count++; abort = (displacement_count == displacement_limit && displacement_limit != 0); - #pragma omp flush(abort) // analysis->list_displacementkernel(timegapii,thisii,nextii); // displacement_count++; // // if (displacement_count == displacement_limit) break; From 39d63d0a489651909ac81960ce061f1133a38f83 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 10:52:55 +0700 Subject: [PATCH 40/44] Clean control timing after multithreading changes Public-safe adaptation of private commit 9821b95. --- src/control.cpp | 37 +------------------------------------ src/control.h | 8 ++++---- 2 files changed, 5 insertions(+), 40 deletions(-) diff --git a/src/control.cpp b/src/control.cpp index 3df570fd..d4f32b66 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -2540,13 +2540,9 @@ void Control::calc_vhs() vhs.set(analyte, n_bins, max_range); cout << "\nCalculating self part of Van Hove correlation function."; start = time(NULL); - high_start = clock::now(); run_analysis(&vhs,runline); vhs_defined=1; vhs.write(filename); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - //cerr << duration; finish = time(NULL); cout << "\nCalculated self Van Hove in " << finish-start<<" seconds."; @@ -2582,12 +2578,8 @@ void Control::calc_vhd() vhd.set(analyte, n_bins, max_range); cout << "\nCalculating distinct Van Hove correlation function."; start = time(NULL); - high_start = clock::now(); run_analysis(&vhd, runline); - finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; + finish = time(NULL);; cout << "\nCalculated distinct Van Hove in " << finish-start<<" seconds.\n"; cout << "Writing distinct Van Hove to file. "; vhd.write(filename); @@ -2879,12 +2871,8 @@ void Control::rdf() { cout << "\nCalculating radial distribution function.\n";cout.flush(); start = time(NULL); - high_start = clock::now(); rad_dis_fun.analyze(trajlist1); finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; cout << "\nCalculated radial distribution function in " << finish-start<<" seconds.\n"; } else if(symmetry=="asymmetric") @@ -2896,13 +2884,9 @@ void Control::rdf() trajlist2=find_trajectorylist(listname2); cout << "\nCalculating radial distribution function.\n";cout.flush(); start = time(NULL); - high_start = clock::now(); //calls bins rad_dis_fun.analyze(trajlist1,trajlist2); finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; cout << "\nCalculated radial distribution function in " << finish-start<<" seconds.\n"; } else @@ -3037,12 +3021,8 @@ void Control::rnf() { cout << "\nCalculating non-normalized radial distribution function.\n";cout.flush(); start = time(NULL); - high_start = clock::now(); rad_dis_fun.analyze(trajlist1); finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; cout << "\nCalculated non-normalized radial distribution function in " << finish-start<<" seconds.\n"; } else if(symmetry=="asymmetric") @@ -3054,13 +3034,9 @@ void Control::rnf() trajlist2=find_trajectorylist(listname2); cout << "\nCalculating non-normalized radial distribution function.\n";cout.flush(); start = time(NULL); - high_start = clock::now(); //calls bins rad_dis_fun.analyze(trajlist1,trajlist2); finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; cout << "\nCalculated non-normalized radial distribution function in " << finish-start<<" seconds.\n"; } else @@ -3381,7 +3357,6 @@ void Control::ngp() runline = read_line(); cout <<"\n"<< runline; - //high_start = clock::now(); //analyte->unwrap(); //should already be unwrapped Mean_Square_Displacement msd(analyte); run_analysis(&msd, runline); @@ -3390,9 +3365,6 @@ void Control::ngp() ngpar=run_analysis (ngpar,runline,filename); // pass run_analysis template the analysis type //ngpar.write(filename); cout << "\n Peak time index of non-Gaussian parameter is " << ngpar.max() << "."; - //high_finish = clock::now(); - //duration = time_count(high_start, high_finish); - //cerr << duration; } @@ -5048,12 +5020,8 @@ void Control::baf() Bond_Autocorrelation_Function bafun(analyte,dim); cout << "\nCalculating bond autocorrelation function.\n";cout.flush(); start = time(NULL); - high_start = clock::now(); bafun.analyze(multibodylist); // pass run_analysis template the analysis type 'Mean_Square_Displacement' finish = time(NULL); - high_finish = clock::now(); - duration = time_count(high_start, high_finish); - cerr << duration; cout << "\nCalculated bond autocorrelation function in " << finish-start<<" seconds."< Date: Wed, 29 Apr 2026 16:19:20 -0400 Subject: [PATCH 41/44] Update multithreading.md typo fix (cherry picked from commit f20e233b3597d45a70060faf5719167d0bf203e4) --- Manual/multithreading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/multithreading.md b/Manual/multithreading.md index 50b10044..26ab830c 100644 --- a/Manual/multithreading.md +++ b/Manual/multithreading.md @@ -12,7 +12,7 @@ High-performance computing workflows can be computationally expensive, and molec | [`isfs`](isfs.md) | Calculate Incoherent Scattering Function | 20x | | [`vhs`](vhs.md) | Calculate self part of Van Hove Function | 12x | | [`vhd`](vhd.md) | Calculate distinct part of Van Hove Function | 20x | -| `baf` | Calculate Bond Autocorrelatoion Function | 15x | +| `baf` | Calculate Bond Autocorrelation Function | 15x | | [`ngp`](ngp.md) | Calculate Non Gaussian Parameter | 30x | | [`composition`](composition.md) | Calculate Composition | 7x | | [`rdf`](rdf.md) | Calculate Radial Distribution Function | 21x | From 3b97b6f6a6d9efc6b85427cb615a8c3d73615532 Mon Sep 17 00:00:00 2001 From: Bao Khanh Ma <150126824+BaoKhanhMa@users.noreply.github.com> Date: Thu, 7 May 2026 14:22:22 -0400 Subject: [PATCH 42/44] Cherry-pick the remaining Documentation changes. --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7dea76ed..9084fa2f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.1 +1.1.0 From 6a0618fe9980c5635b950dbcab81bd0a0e2c57d6 Mon Sep 17 00:00:00 2001 From: Khanh Ma Date: Fri, 3 Jul 2026 11:07:46 +0700 Subject: [PATCH 43/44] Remove sync audit CSV from public branch --- dual_remote_sync_audit.csv | 87 -------------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 dual_remote_sync_audit.csv diff --git a/dual_remote_sync_audit.csv b/dual_remote_sync_audit.csv deleted file mode 100644 index beb7b32e..00000000 --- a/dual_remote_sync_audit.csv +++ /dev/null @@ -1,87 +0,0 @@ -direction,status,cherry_marker,status_reason,sha,short_sha,date,author,subject,files_changed,insertions,deletions,binary_files,file_changes -public-to-private,candidate,+,,793001167ba1223bb0b6c82dd89147e54c51bb52,7930011,2025-10-31,simmons.davids@gmail.com,Bump version to 1.0.1,1,1,1,0,VERSION (+1/-1) -public-to-private,candidate,+,,d68011fbcefb5f7b119e0840a5a07e343f5b77c0,d68011f,2025-11-03,Branham2,Create read_bond_neighbors.md,1,5,0,0,Manual/read_bond_neighbors.md (+5/-0) -public-to-private,candidate,+,,cd78368a559fbe3e8da5b5065dfe067eff212832,cd78368,2025-11-03,Pierre Kawak,Update README.md with permanent DOI to latest release,1,1,1,0,README.md (+1/-1) -public-to-private,candidate,+,,142f3ced06db49f96d9ad612ca6a26730e0c9e37,142f3ce,2025-11-03,Pierre Kawak,Update CITATION.cff with permanent DOI to most recent version,1,1,1,0,CITATION.cff (+1/-1) -public-to-private,candidate,+,,4219fb97e2213a37cdaf522d7677e6cf2789db1d,4219fb9,2025-11-04,Pierre Kawak,Update README.md with permanent DOI to latest release pt2,1,1,1,0,README.md (+1/-1) -public-to-private,candidate,+,,d758149c62bb9a070f7ea32649e6ab333862d685,d758149,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO,2,22,0,0,README.md (+5/-0); _layouts/default.html (+17/-0) -public-to-private,candidate,+,,e5c6abbaf05e4054d94fbcbc205f14fdac2961ea,e5c6abb,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO: found bug. Trying another method. This setup broke the builds homepage and automatic Jekyll theme formatting.,2,0,22,0,README.md (+0/-5); _layouts/default.html (+0/-17) -public-to-private,candidate,+,,d849e6f85a01079549c127ac493d54d0159d54bd,d849e6f,2025-11-16,Pierre Kawak,adding google site verification tag to optimize SEO try #2: adding via _config.yml in repo root,1,4,0,0,_config.yml (+4/-0) -public-to-private,candidate,+,,a2dd4396cd961519ca1154db57f28b35c5df76c1,a2dd439,2025-11-16,Pierre Kawak,added jekyll-sitemap plugin to Pages build to help Google with crawling,1,2,0,0,_config.yml (+2/-0) -public-to-private,candidate,+,,d3444a7217ec2adb6400a2154a2301b181c3e2e6,d3444a7,2025-11-17,Pierre Kawak,Fix formatting and improve clarity in isf_list.md,1,5,3,0,Manual/isf_list.md (+5/-3) -public-to-private,candidate,+,,588e8b889a08e35b5e5b9b4694d1b5d4cac0286e,588e8b8,2026-02-06,Pierre Kawak,Update citation information in README.md,1,2,2,0,README.md (+2/-2) -public-to-private,candidate,+,,69b574a74a63611be8e008b16002fb5f0d4ca310,69b574a,2026-02-06,Pierre Kawak,Revise citations in README.md for AMDAT,1,4,2,0,README.md (+4/-2) -public-to-private,candidate,+,,92979a40cd5d24567f92bd37c5f4d5dc5b25378a,92979a4,2026-02-06,Pierre Kawak,Correct citation format in README.md,1,1,1,0,README.md (+1/-1) -public-to-private,candidate,+,,74b2e5c4997de007b7ab179b2cf25d9ce957da02,74b2e5c,2026-04-30,Pierre Kawak,Update gcc and gxx dependencies in environment.yml to fix GitHub Actions,1,2,2,0,environment.yml (+2/-2) -private-to-public,private-only,+,This is just creating testfiles,7630a124c8e732383a544ed28339af8f18a544e6,7630a12,2026-02-19,Khanh Ma,Create a test file for msd,1,13,0,0,testfiles/msd.in (+13/-0) -private-to-public,move,+,This opened pragma in system,229d62edc98b8faddc27f3476a6ab5e2a3ece63e,229d62e,2026-03-03,Khanh Ma,Enable multithreading for system.cpp (Line~ 4100),1,4,1,0,src/control.h (+4/-1) -private-to-public,move-with-edits,+,Change source codes & Create benchmarking environment,1176fd45ecde950126c1d8c392bb31f6faed80de,1176fd4,2026-03-04,Khanh Ma,Starting environment for ISFS mulitithreading,11,163,13,3,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+44/-0); benchmark/benchmark.csv (+6/-0); benchmark/benchmark.py (+91/-0); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/control.h (+4/-4); src/incoherent_scattering_function.h (+1/-1); src/mean_square_displacement.cpp (+0/-2); src/system.cpp (+4/-6); testfiles/isfs.in (+13/-0) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,bf5a91e1ae1e345e48630a57d2927a5c33c9d0cc,bf5a91e,2026-03-06,Khanh Ma,ISFS Enabled multithreading,8,28,14,2,benchmark/autorun.sh (+2/-2); benchmark/benchmark.csv (+6/-5); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/control.h (+16/-2); src/incoherent_scattering_function.cpp (+0/-1); src/system.cpp (+1/-1); testfiles/isfs.in (+3/-3) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,f6130411ca27fd890fe953e4a0d590200f92bcfc,f613041,2026-03-09,Khanh Ma,Improve benchmark script. Add PAD to MSD.,10,233,110,3,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+2/-2); benchmark/benchmark.csv (+3/-6); benchmark/benchmark.py (+166/-73); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); src/mean_square_displacement.cpp (+56/-23); src/mean_square_displacement.h (+4/-4); testfiles/isfs.in (+1/-1); testfiles/msd.in (+1/-1) -private-to-public,private-only,+,Testing with outputs,ae23719de2f569781a89915eaeba518ccfb854bc,ae23719,2026-03-09,Khanh Ma,ISFS Multithreading Enabled,8,18,4,4,benchmark/benchmark.csv (+5/-3); benchmark/benchmark_avg.csv (+6/-0); benchmark/benchmark_std.csv (+6/-0); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/runtime_vs_timegaps.png (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); benchmark/speedup_vs_threads.png (+binary/-binary); testfiles/msd.in (+1/-1) -private-to-public,move,+,README edit,797d3ff4f6159d436e4594fbacb21057caa078fa,797d3ff,2026-03-18,dssimmons,Update README.md,1,1,1,0,README.md (+1/-1) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,5345b4316dba3164b5b549996aff6de4572079c8,5345b43,2026-03-18,Khanh Ma,"Enables multithreading for MD, MSD_2D, Van Hove Self, Bond autocorrelation function.",64,707,317,16,Makefile (+2/-6); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+69/-38); benchmark/baf/baf.config (+4/-0); benchmark/baf/baf.csv (+25/-0); benchmark/baf/baf_validation.csv (+25/-0); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchmark.csv (+0/-6); benchmark/benchmark.py (+0/-184); benchmark/benchmark_avg.csv (+0/-6); benchmark/benchmark_std.csv (+0/-6); benchmark/benchplot.py (+107/-0); benchmark/md/md.config (+4/-0); benchmark/md/md.csv (+2/-0); benchmark/md/md_validation.csv (+2/-0); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+4/-0); benchmark/msd/msd.csv (+2/-0); benchmark/msd/msd_validation.csv (+2/-0); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+4/-0); benchmark/msd2d/msd2d.csv (+25/-0); benchmark/msd2d/msd2d_validation.csv (+25/-0); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/runtime_vs_timegaps.pdf (+binary/-binary); benchmark/runtime_vs_timegaps.png (+binary/-binary); benchmark/speedup_vs_threads.pdf (+binary/-binary); benchmark/speedup_vs_threads.png (+binary/-binary); benchmark/submit.sh (+71/-0); benchmark/vhd/vhs.config (+4/-0); benchmark/vhd/vhs.csv (+25/-0); benchmark/vhd/vhs_validation.csv (+25/-0); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+4/-0); benchmark/vhs/vhs.csv (+25/-0); benchmark/vhs/vhs_validation.csv (+25/-0); src/analysis.h (+1/-0); src/bond_autocorrelation_function.h (+1/-1); src/control.cpp (+10/-2); src/control.h (+1/-5); src/mean_displacement.cpp (+8/-6); src/mean_displacement.h (+2/-1); src/mean_square_displacement_2d.cpp (+55/-24); src/mean_square_displacement_2d.h (+7/-8); src/space_time_correlation_function.cpp (+6/-4); src/space_time_correlation_function.h (+1/-1); src/system.cpp (+1/-1); src/van_hove_distinct.cpp (+8/-5); src/van_hove_distinct.h (+1/-1); src/van_hove_self.cpp (+9/-8); src/van_hove_self.h (+1/-1); testfiles/baf.in (+44/-0); testfiles/isfs.in (+1/-1); testfiles/md.in (+18/-0); testfiles/msd.in (+7/-2); testfiles/msd2d.in (+18/-0); testfiles/vhd.in (+13/-0); testfiles/vhs.in (+13/-0) -private-to-public,move,+,README edit,b9c795b1e1f7613c7af721f3fd7d9d4cd5699748,b9c795b,2026-03-18,dssimmons,Update README.md,1,8,5,0,README.md (+8/-5) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,fcfc2d98cf293bd2d85089723b7402d4d8e01067,fcfc2d9,2026-03-20,Khanh Ma,Add PADDING to Bond autocorrelation function,35,382,195,16,benchmark/baf/baf.csv (+4/-24); benchmark/baf/baf_validation.csv (+1/-21); benchmark/baf/local/baf.csv (+25/-0); benchmark/baf/local/baf_validation.csv (+25/-0); benchmark/baf/local/runtime.png (+binary/-binary); benchmark/baf/local/speedup.png (+binary/-binary); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/md/autorun.sh (+75/-0); benchmark/md/md.csv (+25/-2); benchmark/md/md_validation.csv (+25/-2); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.csv (+2/-1); benchmark/msd/msd_validation.csv (+2/-1); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/local/runtime.png (+binary/-binary); benchmark/msd2d/local/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.csv (+21/-21); benchmark/msd2d/msd2d_validation.csv (+21/-21); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/submit.sh (+6/-6); benchmark/vhs/local/runtime.png (+binary/-binary); benchmark/vhs/local/speedup.png (+binary/-binary); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.csv (+21/-21); benchmark/vhs/vhs_validation.csv (+21/-21); src/bond_autocorrelation_function.cpp (+95/-42); src/bond_autocorrelation_function.h (+3/-2); testfiles/baf.in (+1/-1); testfiles/isfs.in (+7/-2); testfiles/msd.in (+2/-7) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,f8b46f792b55734da1e13d2f2f628ac59e97520a,f8b46f7,2026-03-21,Khanh Ma,"Add PADDING to MD -> No major improvement due to the nature of low-cost computation in MD, which makes the multithreaded math less significant than the memory bandwidth. Solving memory-related scalability issue would demand a massive change to the structure of the codebase",5,81,76,0,benchmark/md/md.csv (+6/-25); benchmark/md/md_validation.csv (+6/-25); src/mean_displacement.cpp (+64/-22); src/mean_displacement.h (+4/-3); testfiles/md.in (+1/-1) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,8af43be2c5d6f370aa972a3c2f6f03c13a804bff,8af43be,2026-03-21,Khanh Ma,Test MD with Padding,4,50,12,2,benchmark/md/md.csv (+25/-6); benchmark/md/md_validation.csv (+25/-6); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,6c74f818866f9d1ea9686c3aca96dca075337261,6c74f81,2026-03-23,Khanh Ma,"Enables multithreading for MD, MSD_2D, VHS, Bond_autocorrelation_Function. Tested all the above analysis for bin_list",46,4,622,18,VERSION (+1/-1); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/baf/baf.config (+0/-4); benchmark/baf/baf.csv (+0/-5); benchmark/baf/baf_validation.csv (+0/-5); benchmark/baf/local/baf.csv (+0/-25); benchmark/baf/local/baf_validation.csv (+0/-25); benchmark/baf/local/runtime.png (+binary/-binary); benchmark/baf/local/speedup.png (+binary/-binary); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+0/-107); benchmark/md/autorun.sh (+0/-75); benchmark/md/md.config (+0/-4); benchmark/md/md.csv (+0/-25); benchmark/md/md_validation.csv (+0/-25); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+0/-4); benchmark/msd/msd.csv (+0/-3); benchmark/msd/msd_validation.csv (+0/-3); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/local/runtime.png (+binary/-binary); benchmark/msd2d/local/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+0/-4); benchmark/msd2d/msd2d.csv (+0/-25); benchmark/msd2d/msd2d_validation.csv (+0/-25); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71); benchmark/vhd/vhs.config (+0/-4); benchmark/vhd/vhs.csv (+0/-25); benchmark/vhd/vhs_validation.csv (+0/-25); benchmark/vhs/local/runtime.png (+binary/-binary); benchmark/vhs/local/speedup.png (+binary/-binary); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+0/-4); benchmark/vhs/vhs.csv (+0/-25); benchmark/vhs/vhs_validation.csv (+0/-25); src/control.cpp (+1/-1); src/control.h (+1/-1); testfiles/vhd.in (+1/-1) -private-to-public,private-only,+,github workflow testing,f1293d9029bbb9e725d1c0dbbaac5765e08e00b4,f1293d9,2026-03-25,Khanh Ma,"Change check-version to only perform version checks on push, allows PRs to pass because PRs haven't had any tags to it yet",1,1,0,0,.github/workflows/check-version.yml (+1/-0) -private-to-public,private-only,+,github workflow testing,538c146ecd78ad4d6f2b4876c0afa5401884b47e,538c146,2026-03-25,Khanh Ma,Adds success notification for new PRs in VERSION check,1,6,0,0,.github/workflows/check-version.yml (+6/-0) -private-to-public,move,+,Change environment.yml to make conda use latest C/C++ compiler,6809bb7d2c0c9f13eec213418c19dcd1c411cba9,6809bb7,2026-03-25,Khanh Ma,Update VERSION check and test build check with general versions of C/C++ compiler in environment.yml,2,9,8,0,.github/workflows/check-version.yml (+7/-6); environment.yml (+2/-2) -private-to-public,private-only,+,github workflow testing,879aaa9ced9311edc22a57d0dca5c897a319735f,879aaa9,2026-03-26,Khanh Ma,Skip version check for new PRs yet still returns success on Github UI,1,2,2,0,.github/workflows/check-version.yml (+2/-2) -private-to-public,move,+,Bump version to 1.1.0,65a874d6c33fbe3c58b893f50f304f6b438f4d2a,65a874d,2026-03-26,Khanh Ma,Update version to 1.0.1,1,1,1,0,VERSION (+1/-1) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,d096985634153d4127e4059ddf2ca2569ae7501e,d096985,2026-04-01,Khanh Ma,Enable multithreading for Non Gaussian Parameter and Van Hove Distinct,51,574,55,16,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+75/-0); benchmark/baf/baf.config (+4/-0); benchmark/baf/baf.csv (+25/-0); benchmark/baf/baf_validation.csv (+25/-0); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+107/-0); benchmark/md/md.config (+4/-0); benchmark/md/md.csv (+2/-0); benchmark/md/md_validation.csv (+2/-0); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+4/-0); benchmark/msd/msd.csv (+2/-0); benchmark/msd/msd_validation.csv (+2/-0); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+4/-0); benchmark/msd2d/msd2d.csv (+25/-0); benchmark/msd2d/msd2d_validation.csv (+25/-0); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/ngp/ngp.config (+4/-0); benchmark/ngp/ngp.csv (+3/-0); benchmark/ngp/ngp_validation.csv (+3/-0); benchmark/ngp/runtime.png (+binary/-binary); benchmark/ngp/speedup.png (+binary/-binary); benchmark/submit.sh (+71/-0); benchmark/vhd/runtime.png (+binary/-binary); benchmark/vhd/speedup.png (+binary/-binary); benchmark/vhd/vhd.config (+4/-0); benchmark/vhd/vhd.csv (+5/-0); benchmark/vhd/vhd_validation.csv (+5/-0); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+4/-0); benchmark/vhs/vhs.csv (+25/-0); benchmark/vhs/vhs_validation.csv (+25/-0); src/control.cpp (+9/-2); src/control.h (+1/-1); src/intermediate_scattering_function.h (+1/-1); src/non_gaussian_parameter.cpp (+49/-30); src/non_gaussian_parameter.h (+4/-4); src/space_time_correlation_function.cpp (+11/-6); src/van_hove_distinct.cpp (+11/-9); testfiles/isf_list.in (+13/-0); testfiles/ngp.in (+18/-0); testfiles/vhd.in (+1/-1); testfiles/vhs.in (+1/-1) -private-to-public,private-only,+,github workflow testing,37f3f45cb2d1dbc86b2f99a735fa3d9d6c7b0760,37f3f45,2026-04-01,Khanh Ma,Remove benchmarking region. Make check-version more robust. Ready to push,43,4,459,16,.github/workflows/check-version.yml (+1/-1); benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/baf/baf.config (+0/-4); benchmark/baf/baf.csv (+0/-25); benchmark/baf/baf_validation.csv (+0/-25); benchmark/baf/runtime.png (+binary/-binary); benchmark/baf/speedup.png (+binary/-binary); benchmark/benchplot.py (+0/-107); benchmark/md/md.config (+0/-4); benchmark/md/md.csv (+0/-2); benchmark/md/md_validation.csv (+0/-2); benchmark/md/runtime.png (+binary/-binary); benchmark/md/speedup.png (+binary/-binary); benchmark/msd/msd.config (+0/-4); benchmark/msd/msd.csv (+0/-2); benchmark/msd/msd_validation.csv (+0/-2); benchmark/msd/runtime.png (+binary/-binary); benchmark/msd/speedup.png (+binary/-binary); benchmark/msd2d/msd2d.config (+0/-4); benchmark/msd2d/msd2d.csv (+0/-25); benchmark/msd2d/msd2d_validation.csv (+0/-25); benchmark/msd2d/runtime.png (+binary/-binary); benchmark/msd2d/speedup.png (+binary/-binary); benchmark/ngp/ngp.config (+0/-4); benchmark/ngp/ngp.csv (+0/-3); benchmark/ngp/ngp_validation.csv (+0/-3); benchmark/ngp/runtime.png (+binary/-binary); benchmark/ngp/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71); benchmark/vhd/runtime.png (+binary/-binary); benchmark/vhd/speedup.png (+binary/-binary); benchmark/vhd/vhd.config (+0/-4); benchmark/vhd/vhd.csv (+0/-5); benchmark/vhd/vhd_validation.csv (+0/-5); benchmark/vhs/runtime.png (+binary/-binary); benchmark/vhs/speedup.png (+binary/-binary); benchmark/vhs/vhs.config (+0/-4); benchmark/vhs/vhs.csv (+0/-25); benchmark/vhs/vhs_validation.csv (+0/-25); src/control.cpp (+2/-2); src/control.h (+1/-1) -private-to-public,move,+,Documentation,88a17cf8d24497ecc0b318a8c908c11a3288b29d,88a17cf,2026-04-02,dssimmons,Create isf.md,1,31,0,0,Manual/isf.md (+31/-0) -private-to-public,move,+,Documentation,c5999747f82ea2faee4bf90fac0b4cf349dbf515,c599974,2026-04-02,dssimmons,Update trajectory_lists.md,1,1,2,0,Manual/trajectory_lists.md (+1/-2) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,986663ff73527948aa823eac9d52080af78b71a0,986663f,2026-04-05,Khanh Ma,"Creates OpenMP loop parallelism for time loop in analysis_onetime.cpp, and enables multithreading for Radial Distribution Function",19,356,39,2,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+75/-0); benchmark/benchplot.py (+107/-0); benchmark/rdf/rdf.config (+4/-0); benchmark/rdf/rdf.csv (+3/-0); benchmark/rdf/rdf_validation.csv (+3/-0); benchmark/submit.sh (+71/-0); src/analysis_onetime.cpp (+4/-0); src/control.cpp (+8/-0); src/control.h (+1/-1); src/incoherent_scattering_function.cpp (+3/-3); src/mean_displacement.h (+1/-1); src/mean_square_displacement.cpp (+3/-3); src/mean_square_displacement.h (+1/-1); src/radial_distribution_function.cpp (+55/-26); src/radial_distribution_function.h (+3/-3); testfiles/rdf.in (+13/-0); testfiles/vhd.in (+1/-1) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,5dea40f2cd09c73e1c08834fa57aaf0ad313d9df,5dea40f,2026-04-06,Khanh Ma,Enables multithreading for Composition and Composition vs time,19,61,193,2,benchmark/comp/comp.config (+4/-0); benchmark/comp/comp.csv (+4/-0); benchmark/comp/comp_validation.csv (+4/-0); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); src/composition.cpp (+25/-17); src/composition.h (+6/-5); src/composition_timedependent.cpp (+3/-3); src/composition_timedependent.h (+2/-0); testfiles/baf.in (+0/-44); testfiles/comp.in (+13/-0); testfiles/isf_list.in (+0/-13); testfiles/isfs.in (+0/-18); testfiles/md.in (+0/-18); testfiles/msd.in (+0/-13); testfiles/msd2d.in (+0/-18); testfiles/ngp.in (+0/-18); testfiles/vhd.in (+0/-13); testfiles/vhs.in (+0/-13) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,80a0f72dfc3fe64171ca46d792b9d79dc90a51f8,80a0f72,2026-04-08,Khanh Ma,Multithreading enabled for Radial Count,21,236,47,6,benchmark/comp/comp.csv (+25/-4); benchmark/comp/comp_validation.csv (+25/-4); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); benchmark/rdf/rdf.config (+0/-4); benchmark/rdf/rdf.csv (+25/-3); benchmark/rdf/rdf_validation.csv (+25/-3); benchmark/rdf/runtime.png (+binary/-binary); benchmark/rdf/speedup.png (+binary/-binary); benchmark/rnf/rnf.config (+4/-0); benchmark/rnf/rnf.csv (+25/-0); benchmark/rnf/rnf_validation.csv (+25/-0); benchmark/rnf/runtime.png (+binary/-binary); benchmark/rnf/speedup.png (+binary/-binary); src/control.cpp (+8/-0); src/radial_count.cpp (+31/-25); src/radial_count.h (+3/-3); testfiles/mcd.in (+13/-0); testfiles/rdf.in (+1/-1); testfiles/rnf.in (+13/-0); testfiles/strfac.in (+13/-0) -private-to-public,private-only,+,Removing benchmarking files,c4e6bf238f744b40676be05d6006bdc81fd4ddda,c4e6bf2,2026-04-08,Khanh Ma,Remove develop region,19,0,411,8,benchmark/__pycache__/benchmark.cpython-313.pyc (+binary/-binary); benchmark/__pycache__/benchplot.cpython-313.pyc (+binary/-binary); benchmark/autorun.sh (+0/-75); benchmark/benchplot.py (+0/-107); benchmark/comp/comp.config (+0/-4); benchmark/comp/comp.csv (+0/-25); benchmark/comp/comp_validation.csv (+0/-25); benchmark/comp/runtime.png (+binary/-binary); benchmark/comp/speedup.png (+binary/-binary); benchmark/rdf/rdf.csv (+0/-25); benchmark/rdf/rdf_validation.csv (+0/-25); benchmark/rdf/runtime.png (+binary/-binary); benchmark/rdf/speedup.png (+binary/-binary); benchmark/rnf/rnf.config (+0/-4); benchmark/rnf/rnf.csv (+0/-25); benchmark/rnf/rnf_validation.csv (+0/-25); benchmark/rnf/runtime.png (+binary/-binary); benchmark/rnf/speedup.png (+binary/-binary); benchmark/submit.sh (+0/-71) -private-to-public,move,+,Documentation,79c079a21e69488220d80191fc6cc8c180bd73a5,79c079a,2026-04-10,dssimmons,Update overview.md,1,2,2,0,Manual/overview.md (+2/-2) -private-to-public,move,+,Documentation,7c0cd87e030b9c6ddf19a6ef3ac856cdd8c7c44b,7c0cd87,2026-04-10,dssimmons,Create multithreading.md,1,4,0,0,Manual/multithreading.md (+4/-0) -private-to-public,move,+,Documentation,a16651834d485384431a1f8519db3dc273cfe2f7,a166518,2026-04-10,dssimmons,Update msd.md,1,5,0,0,Manual/msd.md (+5/-0) -private-to-public,move,+,Documentation,6f7a4b871a70aedbb15679304172b39540f8a18b,6f7a4b8,2026-04-10,dssimmons,Update overview.md,1,1,1,0,Manual/overview.md (+1/-1) -private-to-public,move,+,Documentation,243e5ec3b11609e6da3f6a6f5d801690981aa417,243e5ec,2026-04-10,dssimmons,Update overview.md,1,1,1,0,Manual/overview.md (+1/-1) -private-to-public,move,+,Documentation,044c2d98ef78ed5bfe831e715d2697915477ae70,044c2d9,2026-04-13,Bao Khanh Ma,Enhance separate multithreading documentation in Manual,1,52,1,0,Manual/multithreading.md (+52/-1) -private-to-public,move,+,Documentation,6e10078bc2fbcd5d5b6cb7494fa2b915172c08b9,6e10078,2026-04-14,Bao Khanh Ma,Add multithreading badge to mean displacement doc,1,2,0,0,Manual/mean_displacement.md (+2/-0) -private-to-public,move,+,Documentation,31be0e63626e0d9ec4037a53a0f25601e8606fbe,31be0e6,2026-04-14,Bao Khanh Ma,Add multithreading badge to msd_2d documentation,1,2,0,0,Manual/msd_2d.md (+2/-0) -private-to-public,move,+,Documentation,931459ffa24d4fe67dfc5c4813fafbd609b33507,931459f,2026-04-14,Bao Khanh Ma,Add multithreading badge to ngp documentation,1,2,0,0,Manual/ngp.md (+2/-0) -private-to-public,move,+,Documentation,7cb8360e675814c95a1beb33e929bed2dbd76cc4,7cb8360,2026-04-14,Bao Khanh Ma,Add multithreading badge to radial_count.md,1,3,0,0,Manual/radial_count.md (+3/-0) -private-to-public,move,+,Documentation,411ec9ce8d1ea0995c677158cd38b9b4a9d247cd,411ec9c,2026-04-14,Bao Khanh Ma,Update rdf.md,1,3,0,0,Manual/rdf.md (+3/-0) -private-to-public,move,+,Documentation,e9672aa6b77ddcc82c1f49cb7d1a88c5342855e3,e9672aa,2026-04-14,Bao Khanh Ma,Add multithreading badge to vhd.md,1,2,0,0,Manual/vhd.md (+2/-0) -private-to-public,move,+,Documentation,e8adf1904fb8b062db4ee9c7561ce25b03e16b95,e8adf19,2026-04-14,Bao Khanh Ma,Add multithreading badge to vhs documentation,1,2,0,0,Manual/vhs.md (+2/-0) -private-to-public,move,+,Documentation,be7134e8cf367d16a0411cb95e307cb1c8c4098d,be7134e,2026-04-14,Bao Khanh Ma,Fix links and formatting in multithreading documentation,1,11,11,0,Manual/multithreading.md (+11/-11) -private-to-public,move,+,Documentation,5f3a604facf9f2494228a2228a4a4fc1ba783031,5f3a604,2026-04-14,Bao Khanh Ma,Update multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) -private-to-public,move,+,Documentation,cf6b2896b30856ded78473a0a52b41ad4df8218c,cf6b289,2026-04-14,Bao Khanh Ma,Fix typo in multithreading documentation,1,1,1,0,Manual/multithreading.md (+1/-1) -private-to-public,move,+,Documentation,2b04516b78012de14e650ebe3c50d7dd468842f8,2b04516,2026-04-14,Bao Khanh Ma,Update multithreading.md,1,16,10,0,Manual/multithreading.md (+16/-10) -private-to-public,move,+,Documentation,8cbf1ceab637de04e223b8a2e3bfc8f19fa34969,8cbf1ce,2026-04-17,dssimmons,Update trajectory_bin_list.md,1,1,1,0,Manual/trajectory_bin_list.md (+1/-1) -private-to-public,move,+,Documentation,8df31de0e0cdb36265b27d2cb8d58debeb39a950,8df31de,2026-04-17,simmons.davids@gmail.com,"Revert ""Update overview.md""",1,1,1,0,Manual/overview.md (+1/-1) -private-to-public,move,+,Documentation,1e57a77d39cce5a5125bb3c2dded8a7d9be14cd3,1e57a77,2026-04-17,simmons.davids@gmail.com,"Revert ""Revert ""Update overview.md""""",1,1,1,0,Manual/overview.md (+1/-1) -private-to-public,move,+,Documentation,827ae1fc2fe5b0b1cdf258c4623390f14ce0a9cc,827ae1f,2026-04-17,simmons.davids@gmail.com,"Revert ""Update trajectory_bin_list.md""",1,1,1,0,Manual/trajectory_bin_list.md (+1/-1) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,e3e8689fb93906d5b8e31132ad1f577617dfe34f,e3e8689,2026-04-25,Khanh Ma,Multithreading enabled for Orientational_Correlation and Neighbor_Decorrelation,32,942,144,0,benchmark (+1/-0); src/composition.cpp (+0/-5); src/control.cpp (+4/-1); src/mean_displacement.cpp (+0/-6); src/mean_square_displacement.cpp (+0/-6); src/mean_square_displacement_2d.cpp (+0/-5); src/neighbor_decorrelation_function.cpp (+31/-23); src/neighbor_decorrelation_function.h (+4/-4); src/orientational_correlation.cpp (+35/-26); src/orientational_correlation.h (+5/-5); src/system.cpp (+3/-9); testfiles/binnedcomp/binnedcomp_bin_0_0_0.bindata (+6/-0); testfiles/binnedcomp/binnedcomp_bin_1_0_0.bindata (+6/-0); testfiles/binnedisfs/binnedisfs_bin_0_0_0.bindata (+94/-0); testfiles/binnedisfs/binnedisfs_bin_1_0_0.bindata (+94/-0); testfiles/binnedmd/binnedmd_bin_0_0_0.bindata (+93/-0); testfiles/binnedmd/binnedmd_bin_1_0_0.bindata (+93/-0); testfiles/binnedmsd/binnedmsd_bin_0_0_0.bindata (+93/-0); testfiles/binnedmsd/binnedmsd_bin_1_0_0.bindata (+93/-0); testfiles/binnedmsd2d/binnedmsd2d_bin_0_0_0.bindata (+93/-0); testfiles/binnedmsd2d/binnedmsd2d_bin_1_0_0.bindata (+93/-0); testfiles/comp.in (+7/-2); testfiles/isfs.in (+16/-0); testfiles/mcd.in (+0/-13); testfiles/md.in (+16/-0); testfiles/msd.in (+16/-0); testfiles/msd2d.in (+16/-0); testfiles/ndf.in (+16/-0); testfiles/orientational_correlation.in (+14/-0); testfiles/rdf.in (+0/-13); testfiles/rnf.in (+0/-13); testfiles/strfac.in (+0/-13) -private-to-public,move-with-edits,+,Change source codes & Developing benchmarking environment,9821b957ace56f11c456a2d796011dbc248cb4a7,9821b95,2026-04-26,Khanh Ma,Delete benchmarking files and clean testfiles. Ready to push onto origin,20,5,911,0,benchmark (+0/-1); src/control.cpp (+1/-36); src/control.h (+4/-4); testfiles/binnedcomp/binnedcomp_bin_0_0_0.bindata (+0/-6); testfiles/binnedcomp/binnedcomp_bin_1_0_0.bindata (+0/-6); testfiles/binnedisfs/binnedisfs_bin_0_0_0.bindata (+0/-94); testfiles/binnedisfs/binnedisfs_bin_1_0_0.bindata (+0/-94); testfiles/binnedmd/binnedmd_bin_0_0_0.bindata (+0/-93); testfiles/binnedmd/binnedmd_bin_1_0_0.bindata (+0/-93); testfiles/binnedmsd/binnedmsd_bin_0_0_0.bindata (+0/-93); testfiles/binnedmsd/binnedmsd_bin_1_0_0.bindata (+0/-93); testfiles/binnedmsd2d/binnedmsd2d_bin_0_0_0.bindata (+0/-93); testfiles/binnedmsd2d/binnedmsd2d_bin_1_0_0.bindata (+0/-93); testfiles/comp.in (+0/-18); testfiles/isfs.in (+0/-16); testfiles/md.in (+0/-16); testfiles/msd.in (+0/-16); testfiles/msd2d.in (+0/-16); testfiles/ndf.in (+0/-16); testfiles/orientational_correlation.in (+0/-14) -private-to-public,move,+,Documentation,f20e233b3597d45a70060faf5719167d0bf203e4,f20e233,2026-04-29,dssimmons,Update multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) -private-to-public,private-only,+,Update version but incorrectly,ec9458d7426e806eb12b14679e93ef7a0494d244,ec9458d,2026-05-07,Bao Khanh Ma,Update version from 1.0.1 to 1.1,1,1,1,0,VERSION (+1/-1) -private-to-public,move,+,Update version,9608de75cdb78eccea367a21b81bc91eaa9461f1,9608de7,2026-05-07,Bao Khanh Ma,Update VERSION,1,1,1,0,VERSION (+1/-1) -private-to-public,private-only,+,Revert changes in github worflow,a9dcd840af3c1dfd2df64d301b11cf74fd76c1ab,a9dcd84,2026-05-07,Khanh Ma,Abort skipping VERSION check in PR. (I temporarily disabled VERSION check before while integrating multithreading due to inexperience in tags and version control in Github. I will now enable it again.),1,0,6,0,.github/workflows/check-version.yml (+0/-6) -private-to-public,move,+,Change source code,971e40377dbe67190c2c98cff271343c7ad8365f,971e403,2026-05-13,Pierre Kawak,Fix custom/xyz template parsing and species atom counts,1,18,19,0,src/system.cpp (+18/-19) -private-to-public,move,+,Change source code,84ae88838522dd6448a119fedb5db3c57bca6196,84ae888,2026-05-21,simmons.davids@gmail.com,updated composition.cpp to enable it work with bin_lists binned to trajectories,1,1,0,0,src/composition.cpp (+1/-0) -private-to-public,move,+,Documentation,d086944f016da9c60f5946ebbd11ef62457928cc,d086944,2026-05-22,dssimmons,Update multithreading.md,1,0,5,0,Manual/multithreading.md (+0/-5) -private-to-public,move,+,Change source code,ea2ff0b7c126944ee57d5e78973b779af86b2e48,ea2ff0b,2026-05-22,dssimmons,Update composition_timedependent.cpp,1,1,0,0,src/composition_timedependent.cpp (+1/-0) -private-to-public,move,+,Documentation,99b51f2a47b50743b2e2b57ec7c0a1b6e193cc1b,99b51f2,2026-05-22,dssimmons,Update composition_vs_time.md,1,5,1,0,Manual/composition_vs_time.md (+5/-1) -private-to-public,move,+,Change source code,c60f9a9e82c634fcb11807605c33e3ff43b40907,c60f9a9,2026-05-28,simmons.davids@gmail.com,implemented new multibody_trajlist_intersection tool that finds subsets of multibodies with at least n beads contained within a specified trajectory list at each time,6,298,3,0,src/control.cpp (+43/-0); src/control.h (+3/-2); src/multibody_bead_region.cpp (+1/-1); src/multibody_trajlist_intersection.cpp (+187/-0); src/multibody_trajlist_intersection.h (+46/-0); testfiles/analysis.in (+18/-0) -private-to-public,move,+,Documentation,2574c7f62e804be2ac1da2babc1e81bb8b9beeab,2574c7f,2026-05-28,dssimmons,Update multibodies.md,1,2,1,0,Manual/multibodies.md (+2/-1) -private-to-public,move,+,Documentation,a4d2d310c5c30bafc137d7ff58f12e25e8341a2a,a4d2d31,2026-05-28,dssimmons,Update multibodies.md,1,1,1,0,Manual/multibodies.md (+1/-1) -private-to-public,move,+,Documentation,0fd3d79b529bf4cd711e3632ad75f22b8fce5b45,0fd3d79,2026-05-28,dssimmons,Create multibody_trajlist_intersection.md,1,7,0,0,Manual/multibody_trajlist_intersection.md (+7/-0) -private-to-public,move,+,Documentation,2d2923682c1f3c42488505573e0605dd394dcd8d,2d29236,2026-06-16,Bao Khanh Ma,Rename 'baf' to 'raf' since 'baf' is a depracated command,1,1,1,0,Manual/multithreading.md (+1/-1) -private-to-public,move,+,Documentation,4ca3e3ab0fe9dfb552a8962dae22fdd9187da128,4ca3e3a,2026-06-16,Bao Khanh Ma,Update description for 'raf' function in multithreading.md,1,1,1,0,Manual/multithreading.md (+1/-1) - -# Review rows with status=candidate before cherry-picking. -"# Candidate order is oldest-to-newest, excluding patch-equivalent and private-only commits." -# COPY public-to-private: git cherry-pick -x 793001167ba1 d68011fbcefb cd78368a559f 142f3ced06db 4219fb97e221 d758149c62bb e5c6abbaf05e d849e6f85a01 a2dd4396cd96 d3444a7217ec 588e8b889a08 69b574a74a63 92979a40cd5d 74b2e5c4997d -# COPY private-to-public part 1: git cherry-pick -x 7630a124c8e7 229d62edc98b 1176fd45ecde bf5a91e1ae1e f6130411ca27 ae23719de2f5 797d3ff4f615 5345b4316dba b9c795b1e1f7 fcfc2d98cf29 f8b46f792b55 8af43be2c5d6 6c74f818866f f1293d9029bb 538c146ecd78 6809bb7d2c0c 879aaa9ced93 65a874d6c33f d09698563415 37f3f45cb2d1 -# COPY private-to-public part 2: git cherry-pick -x 88a17cf8d244 c5999747f82e 986663ff7352 5dea40f2cd09 80a0f72dfc3f c4e6bf238f74 79c079a21e69 7c0cd87e030b a16651834d48 6f7a4b871a70 243e5ec3b116 044c2d98ef78 6e10078bc2fb 31be0e63626e 931459ffa24d 7cb8360e6758 411ec9ce8d1e e9672aa6b77d e8adf1904fb8 be7134e8cf36 -# COPY private-to-public part 3: git cherry-pick -x 5f3a604facf9 cf6b2896b308 2b04516b7801 8cbf1ceab637 8df31de0e0cd 1e57a77d39cc 827ae1fc2fe5 e3e8689fb939 9821b957ace5 f20e233b3597 ec9458d7426e 9608de75cdb7 a9dcd840af3c 971e40377dbe 84ae88838522 d086944f016d ea2ff0b7c126 99b51f2a47b5 c60f9a9e82c6 2574c7f62e80 -# COPY private-to-public part 4: git cherry-pick -x a4d2d310c5c3 0fd3d79b529b 2d2923682c1f 4ca3e3ab0fe9 From e7ccd71e9ab78e2a7b0e13f43392c3329617c112 Mon Sep 17 00:00:00 2001 From: Pierre Kawak <50343302+pkawak@users.noreply.github.com> Date: Tue, 7 Jul 2026 18:39:55 -0500 Subject: [PATCH 44/44] Update VERSION check logic in workflow Removed VERSION check skip for pull requests (included in error). --- .github/workflows/check-version.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/check-version.yml b/.github/workflows/check-version.yml index 5d95458a..df2f23ce 100644 --- a/.github/workflows/check-version.yml +++ b/.github/workflows/check-version.yml @@ -24,11 +24,6 @@ jobs: run: | set -euo pipefail - if [ "${{ github.event_name }}" = "pull_request" ]; then - echo "VERSION check skipped for pull requests. ✅" - exit 0 - fi - if ! git tag --list | grep -q .; then echo "No tags found; skipping check." echo "skip=true" >> "$GITHUB_OUTPUT"