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:
+9
-7
@@ -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);
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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)') '],'
|
||||||
|
|||||||
@@ -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]³ 内
|
||||||
|
|||||||
Reference in New Issue
Block a user