perf: 降低 JSON 输出精度 15→8 位 + 添加 I/O 阶段提示

- C/C++/Fortran 引擎:%.15g/setprecision(15)/g0 → %.8g/g0.8
- 添加 "正在写入轨迹数据…" 提示,说明 100% 后的等待原因
- trajectory.txt 文件从 419MB → 407MB(仍有优化空间)
This commit is contained in:
2026-06-12 05:53:27 +08:00
parent 52505e9aff
commit c158c74609
4 changed files with 15 additions and 11 deletions
+9 -7
View File
@@ -790,12 +790,14 @@ static void write_trajectory_json(const char *path, const Trajectory *traj,
const char *names[] = {"traj_x","traj_y","traj_z","traj_vx","traj_vy","traj_vz"}; const char *names[] = {"traj_x","traj_y","traj_z","traj_vx","traj_vy","traj_vz"};
double *arrs[] = {traj->x, traj->y, traj->z, traj->vx, traj->vy, traj->vz}; double *arrs[] = {traj->x, traj->y, traj->z, traj->vx, traj->vy, traj->vz};
printf("[C-engine] 正在写入轨迹数据…\n");
fflush(stdout);
for (int a = 0; a < 6; a++) { for (int a = 0; a < 6; a++) {
fprintf(f, " \"%s\": [\n", names[a]); fprintf(f, " \"%s\": [\n", names[a]);
for (int t = 0; t < traj->n_steps; t++) { for (int t = 0; t < traj->n_steps; t++) {
fprintf(f, " ["); fprintf(f, " [");
for (int i = 0; i < traj->n_atoms; i++) { for (int i = 0; i < traj->n_atoms; i++) {
fprintf(f, "%.15g", arrs[a][t * traj->n_atoms + i]); fprintf(f, "%.8g", arrs[a][t * traj->n_atoms + i]);
if (i < traj->n_atoms - 1) fputc(',', f); if (i < traj->n_atoms - 1) fputc(',', f);
} }
fprintf(f, "]"); fprintf(f, "]");
@@ -809,12 +811,12 @@ static void write_trajectory_json(const char *path, const Trajectory *traj,
/* 标量参数 */ /* 标量参数 */
fprintf(f, " \"NT\": %d,\n", params->NT); fprintf(f, " \"NT\": %d,\n", params->NT);
fprintf(f, " \"DT\": %.15g,\n", params->DT); fprintf(f, " \"DT\": %.8g,\n", params->DT);
fprintf(f, " \"NSTEP\": %d,\n", params->NSTEP); fprintf(f, " \"NSTEP\": %d,\n", params->NSTEP);
fprintf(f, " \"method\": \"%s\",\n", params->method); fprintf(f, " \"method\": \"%s\",\n", params->method);
fprintf(f, " \"warmup_steps\": %d,\n", params->warmup_steps); fprintf(f, " \"warmup_steps\": %d,\n", params->warmup_steps);
fprintf(f, " \"G\": [%.15g, %.15g, %.15g],\n", params->G[0], params->G[1], params->G[2]); fprintf(f, " \"G\": [%.8g, %.8g, %.8g],\n", params->G[0], params->G[1], params->G[2]);
fprintf(f, " \"B\": [%.15g, %.15g, %.15g],\n", params->B[0], params->B[1], params->B[2]); fprintf(f, " \"B\": [%.8g, %.8g, %.8g],\n", params->B[0], params->B[1], params->B[2]);
fprintf(f, " \"atom_ids\": ["); fprintf(f, " \"atom_ids\": [");
for (int i = 0; i < atoms->n_atoms; i++) { for (int i = 0; i < atoms->n_atoms; i++) {
@@ -826,7 +828,7 @@ static void write_trajectory_json(const char *path, const Trajectory *traj,
fprintf(f, " \"atom_masses\": ["); fprintf(f, " \"atom_masses\": [");
for (int i = 0; i < atoms->n_atoms; i++) { for (int i = 0; i < atoms->n_atoms; i++) {
if (i > 0) fputc(',', f); if (i > 0) fputc(',', f);
fprintf(f, "%.15g", atoms->masses[i]); fprintf(f, "%.8g", atoms->masses[i]);
} }
fprintf(f, "],\n"); fprintf(f, "],\n");
@@ -840,14 +842,14 @@ static void write_trajectory_json(const char *path, const Trajectory *traj,
fprintf(f, " \"bond_stiffness\": ["); fprintf(f, " \"bond_stiffness\": [");
for (int b = 0; b < bonds->n_bonds; b++) { for (int b = 0; b < bonds->n_bonds; b++) {
if (b > 0) fputc(',', f); if (b > 0) fputc(',', f);
fprintf(f, "%.15g", bonds->stiffness[b]); fprintf(f, "%.8g", bonds->stiffness[b]);
} }
fprintf(f, "],\n"); fprintf(f, "],\n");
fprintf(f, " \"bond_rest_lengths\": ["); fprintf(f, " \"bond_rest_lengths\": [");
for (int b = 0; b < bonds->n_bonds; b++) { for (int b = 0; b < bonds->n_bonds; b++) {
if (b > 0) fputc(',', f); if (b > 0) fputc(',', f);
fprintf(f, "%.15g", bonds->rest_lengths[b]); fprintf(f, "%.8g", bonds->rest_lengths[b]);
} }
fprintf(f, "],\n"); fprintf(f, "],\n");
fprintf(f, " \"driving_force\": %d\n", params->driving_force); fprintf(f, " \"driving_force\": %d\n", params->driving_force);
+2 -1
View File
@@ -695,7 +695,8 @@ static void write_trajectory_json(
{ {
std::ofstream f(path); std::ofstream f(path);
if (!f) die("无法写入 " + path); if (!f) die("无法写入 " + path);
f << std::setprecision(15); std::cout << "[Cpp-engine] 正在写入轨迹数据…" << std::endl;
f << std::setprecision(8);
f << "{\n"; f << "{\n";
+3 -2
View File
@@ -166,6 +166,7 @@ program dynamics_f90
end do end do
! 输出轨迹 ! 输出轨迹
write(*, '("[Fortran-engine] 正在写入轨迹数据…")')
call write_json(output_dir, traj_x, traj_y, traj_z, traj_vx, traj_vy, traj_vz, & call write_json(output_dir, traj_x, traj_y, traj_z, traj_vx, traj_vy, traj_vz, &
record_steps, n_atoms, atom_ids, masses, & record_steps, n_atoms, atom_ids, masses, &
NT, DT, NSTEP, warmup_steps, method, G, B, & NT, DT, NSTEP, warmup_steps, method, G, B, &
@@ -1071,7 +1072,7 @@ subroutine json_arr(u, vals, n, has_next, indent)
write(u, '(a)', advance='no') indent // '[' write(u, '(a)', advance='no') indent // '['
do i = 1, n do i = 1, n
if (i > 1) write(u, '(a)', advance='no') ',' if (i > 1) write(u, '(a)', advance='no') ','
write(u, '(g0)', advance='no') vals(i) write(u, '(g0.8)', advance='no') vals(i)
end do end do
if (has_next) then if (has_next) then
write(u, '(a)') '],' write(u, '(a)') '],'
@@ -1108,7 +1109,7 @@ subroutine write_dbl_arr(u, name, arr, n, has_next)
write(u, '(a)', advance='no') ' "' // trim(name) // '": [' write(u, '(a)', advance='no') ' "' // trim(name) // '": ['
do i = 1, n do i = 1, n
if (i > 1) write(u, '(a)', advance='no') ',' if (i > 1) write(u, '(a)', advance='no') ','
write(u, '(g0)', advance='no') arr(i) write(u, '(g0.8)', advance='no') arr(i)
end do end do
if (has_next) then if (has_next) then
write(u, '(a)') '],' write(u, '(a)') '],'
+1 -1
View File
@@ -16,7 +16,7 @@ plot_wave_save_mp4: 1 # 输出波形 MP4(需 step_plot_wave=1
# ── 计算引擎 ────────────────────────────────── # ── 计算引擎 ──────────────────────────────────
# 可选: python, c, cpp, fortran, java # 可选: python, c, cpp, fortran, java
engine: c # 默认使用 python 引擎 engine: cpp # 默认使用 python 引擎
# ── 盒子 ────────────────────────────────────── # ── 盒子 ──────────────────────────────────────
box_a: 80.0 # 立方体半边长,粒子被限制在 [-box_a, box_a]³ 内 box_a: 80.0 # 立方体半边长,粒子被限制在 [-box_a, box_a]³ 内