Добрый день.Я магистр физической химии с небольшим опытом в программировании.Я пытаюсь написать программу для получения распределения Больцмана, используя метод Монте-Карло.Таким образом, для каждой итерации цикла «for» моя программа генерирует матрицу, которая содержит квантованные значения энергии и количество частиц, занимающих каждый уровень, затем записывает значения в файл с именем plot.dat сэнергии в первом столбце (для обозначения «х») и количество частиц во втором (для обозначения «у»).Когда файл записывается, программа запрашивает gnuplot для повторного отображения графики (предварительно построенной в начале с использованием 10 и 999 в качестве начальных значений для 'x' и 'y' соответственно), используя новые значения, чтобы я мог получить графический выводсостояния физической системы каждый раз, когда завершается итерация (то есть «живой график» файла plot.dat, который обновляется каждый раз при изменении файла).Программа работает почти так же, как и ожидалось, но каждые 20-30 итераций примерно .. gnuplot зависает примерно на 10 секунд, и в командной строке появляется:
gnuplot> plot "auxiliar.dat"
^
line 0: x range is invalid
line 0: warning: Skipping data file with no valid points
Затем программа продолжает работать нормально, с gnuplotОбновление сюжета, который каждую итерацию, пока он снова не зависнет.Я не знаю точно, что происходит, но я подозреваю, что gnuplot пытается прочитать файл plot.dat, пока он обновляется программой, и, как следствие, происходит сбой.Вот часть тревожного кода:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *plot;
FILE *pipe = popen("gnuplot -persist" , "wt");
plot=fopen("plot.dat", "wt");
fprintf(plot, "10 999\n");
fclose (plot);
fprintf(pipe, "plot %plot.dat%c\n", '"', '"');
int iteration, part1, part2, iteration_msg;
for (iteration = 0; iteration < 110000; iteration++)
{
/* Code of Monte Carlo method here */
/* Update plot.dat with the new values */
fprintf(plot, "%d %d\n", plotdata[fila][1],plotdata[fila][0]);
fclose (plot);
/*Replot plot.dat in gnu after it's updated*/
fprintf(pipe, "replot\n");
}
fclose(pipe);
return 0;
}
Можете ли вы помочь мне решить эту проблему?Заранее спасибо.Примечание: я работаю в Windows.