Проблема передачи данных из C-программы в Gnuplot - PullRequest
1 голос
/ 22 сентября 2019

Добрый день.Я магистр физической химии с небольшим опытом в программировании.Я пытаюсь написать программу для получения распределения Больцмана, используя метод Монте-Карло.Таким образом, для каждой итерации цикла «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.

1 Ответ

1 голос
/ 24 сентября 2019

Мне удалось решить проблему очистки буфера канала после каждой итерации с помощью:

fflush(pipe);
...