From c158c7460994bda31dce24c6720077b6dd19732d Mon Sep 17 00:00:00 2001 From: Ying-Li Niu <64801511@qq.com> Date: Fri, 12 Jun 2026 05:53:27 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E9=99=8D=E4=BD=8E=20JSON=20=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E7=B2=BE=E5=BA=A6=2015=E2=86=928=20=E4=BD=8D=20+=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20I/O=20=E9=98=B6=E6=AE=B5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - C/C++/Fortran 引擎:%.15g/setprecision(15)/g0 → %.8g/g0.8 - 添加 "正在写入轨迹数据…" 提示,说明 100% 后的等待原因 - trajectory.txt 文件从 419MB → 407MB(仍有优化空间) --- engines/c/main.c | 16 +++++++++------- engines/cpp/main.cpp | 3 ++- engines/fortran/main.f90 | 5 +++-- examples/case06/input/input.txt | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/engines/c/main.c b/engines/c/main.c index 6242f79..61f4468 100644 --- a/engines/c/main.c +++ b/engines/c/main.c @@ -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"}; 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++) { fprintf(f, " \"%s\": [\n", names[a]); for (int t = 0; t < traj->n_steps; t++) { fprintf(f, " ["); 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); } 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, " \"DT\": %.15g,\n", params->DT); + fprintf(f, " \"DT\": %.8g,\n", params->DT); fprintf(f, " \"NSTEP\": %d,\n", params->NSTEP); fprintf(f, " \"method\": \"%s\",\n", params->method); 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, " \"B\": [%.15g, %.15g, %.15g],\n", params->B[0], params->B[1], params->B[2]); + fprintf(f, " \"G\": [%.8g, %.8g, %.8g],\n", params->G[0], params->G[1], params->G[2]); + fprintf(f, " \"B\": [%.8g, %.8g, %.8g],\n", params->B[0], params->B[1], params->B[2]); fprintf(f, " \"atom_ids\": ["); 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\": ["); for (int i = 0; i < atoms->n_atoms; i++) { if (i > 0) fputc(',', f); - fprintf(f, "%.15g", atoms->masses[i]); + fprintf(f, "%.8g", atoms->masses[i]); } fprintf(f, "],\n"); @@ -840,14 +842,14 @@ static void write_trajectory_json(const char *path, const Trajectory *traj, fprintf(f, " \"bond_stiffness\": ["); for (int b = 0; b < bonds->n_bonds; b++) { if (b > 0) fputc(',', f); - fprintf(f, "%.15g", bonds->stiffness[b]); + fprintf(f, "%.8g", bonds->stiffness[b]); } fprintf(f, "],\n"); fprintf(f, " \"bond_rest_lengths\": ["); for (int b = 0; b < bonds->n_bonds; b++) { if (b > 0) fputc(',', f); - fprintf(f, "%.15g", bonds->rest_lengths[b]); + fprintf(f, "%.8g", bonds->rest_lengths[b]); } fprintf(f, "],\n"); fprintf(f, " \"driving_force\": %d\n", params->driving_force); diff --git a/engines/cpp/main.cpp b/engines/cpp/main.cpp index 62353c3..6221cb2 100644 --- a/engines/cpp/main.cpp +++ b/engines/cpp/main.cpp @@ -695,7 +695,8 @@ static void write_trajectory_json( { std::ofstream f(path); if (!f) die("无法写入 " + path); - f << std::setprecision(15); + std::cout << "[Cpp-engine] 正在写入轨迹数据…" << std::endl; + f << std::setprecision(8); f << "{\n"; diff --git a/engines/fortran/main.f90 b/engines/fortran/main.f90 index 9de8257..fa26955 100644 --- a/engines/fortran/main.f90 +++ b/engines/fortran/main.f90 @@ -166,6 +166,7 @@ program dynamics_f90 end do ! 输出轨迹 + write(*, '("[Fortran-engine] 正在写入轨迹数据…")') call write_json(output_dir, traj_x, traj_y, traj_z, traj_vx, traj_vy, traj_vz, & record_steps, n_atoms, atom_ids, masses, & 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 // '[' do i = 1, n 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 if (has_next) then write(u, '(a)') '],' @@ -1108,7 +1109,7 @@ subroutine write_dbl_arr(u, name, arr, n, has_next) write(u, '(a)', advance='no') ' "' // trim(name) // '": [' do i = 1, n 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 if (has_next) then write(u, '(a)') '],' diff --git a/examples/case06/input/input.txt b/examples/case06/input/input.txt index 00f47c5..43bd61c 100644 --- a/examples/case06/input/input.txt +++ b/examples/case06/input/input.txt @@ -16,7 +16,7 @@ plot_wave_save_mp4: 1 # 输出波形 MP4(需 step_plot_wave=1) # ── 计算引擎 ────────────────────────────────── # 可选: python, c, cpp, fortran, java -engine: c # 默认使用 python 引擎 +engine: cpp # 默认使用 python 引擎 # ── 盒子 ────────────────────────────────────── box_a: 80.0 # 立方体半边长,粒子被限制在 [-box_a, box_a]³ 内