PDA

Visualizza la versione completa : [C]Utilizzo delle pipe nella grafica con gnuplot


xavier310
18-12-2012, 23:09
Ciao ragazzi =) vorrei chiedervi se potre indicarmi qualche pdf o qualche link dove discute dell'utilizzo delle pipe per avere una dinamicità visiva nell'elaborazione dati, volendo utilizzare gnuplot per far ciò. Cioè il codice mi deve leggere da file i dati e tramite gnuplot vedere che li plotta punto per punto. Oppure se non risulta molto complicato potreste indicarmi come dovrei fare (cioè la sintassi e l'utilizzo) e le avvertenze da prendere in considerazione?

MItaly
19-12-2012, 00:57
Non ho mica capito cosa vuoi fare e cosa c'entri il C in tutto questo... :confused:

xavier310
19-12-2012, 01:03
Questo di seguito è un esempio preso da internet. A me serve solo capire come avere gli stessi effetti di gnuplot volendo graficare ul randomWalk in tre dimensioni




#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

#define L 400

#define L2 (L * L)
#define VOL L2
#define DIM 2
#define DIM2 (2 * DIM)

#define FNORM (2.3283064365e-10)
#define RANDOM ((ira[ip++] = ira[ip1++] + ira[ip2++]) ^ ira[ip3++])
#define FRANDOM (FNORM * RANDOM)
#define pm1 ((FRANDOM > 0.5) ? 1 : -1)

/* Address: x + y * L */
/* Ordine J: +x +y -x -y */

int s[VOL], mag, ener;
float prob[2*DIM2+1];

unsigned myrand, ira[256];
unsigned char ip, ip1, ip2, ip3;

unsigned rand4init(void)
{
unsigned long long y;

y = (myrand*16807LL);
myrand = (y&0x7fffffff) + (y>>31);
if (myrand&0x80000000)
myrand = (myrand&0x7fffffff) + 1;
return myrand;
}

void Init_Random(void)
{
unsigned i;

ip=128;
ip1=ip-24;
ip2=ip-55;
ip3=ip-61;

for (i=ip3; i<ip; i++)
ira[i] = rand4init();
}

void Errore(char* stringa)
{
fprintf(stderr, "ERROR: %s\n", stringa);
exit(1);
}

void Init_Prob(float temp)
{
int i;

if (temp > 0.0)
for (i=0; i<=2*DIM2; i++)
prob[i] = exp(-2.*i/temp);
else
for (i=0; i<=2*DIM2; i++)
prob[i] = 0.0;
}

void Init_Spin(void)
{
unsigned site;

mag = 0;
for (site=0; site<VOL; site++) {
s[site] = pm1;
mag += s[site];
}
ener = 0;
for (site=0; site<VOL-L; site++)
ener -= s[site] * s[site+L];
for (site=VOL-L; site<VOL; site++)
ener -= s[site] * s[site+L-VOL];
for (site=0; site<VOL; site++) {
if (site%L == L-1)
ener -= s[site] * s[site+1-L];
else
ener -= s[site] * s[site+1];
}
}

void One_Step(void)
{
unsigned site, ix, iy;
int index;

site = 0;
// caso iy = 0
// caso ix = 0
index = s[site] * (s[site+L2-L] + s[site+L-1] + s[site+1] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
//caso 0 < ix < L-1
for (ix=1; ix<L-1; ix++, site++) {
index = s[site] * (s[site+L2-L] + s[site-1] + s[site+1] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
}
// caso ix = L-1
index = s[site] * (s[site+L2-L] + s[site-1] + s[site+1-L] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
// caso 0 < iy < L-1
for (iy=1; iy<L-1; iy++) {
// caso ix = 0
index = s[site] * (s[site-L] + s[site+L-1] + s[site+1] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
//caso 0 < ix < L-1
for (ix=1; ix<L-1; ix++, site++) {
index = s[site] * (s[site-L] + s[site-1] + s[site+1] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
}
// caso ix = L-1
index = s[site] * (s[site-L] + s[site-1] + s[site+1-L] + s[site+L]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
}
// caso iy = L-1
// caso ix = 0
index = s[site] * (s[site-L] + s[site+L-1] + s[site+1] + s[site+L-L2]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
//caso 0 < ix < L-1
for (ix=1; ix<L-1; ix++, site++) {
index = s[site] * (s[site-L] + s[site-1] + s[site+1] + s[site+L-L2]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
}
// caso ix = L-1
index = s[site] * (s[site-L] + s[site-1] + s[site+1-L] + s[site+L-L2]);
if (index <= 0 || FRANDOM < prob[index]) {
s[site] = -s[site];
mag += 2 * s[site];
ener += 2 * index;
}
site++;
if (site != VOL)
Errore("in One_Step");
}

void Write_Config(char * filename)
{
unsigned i;
FILE * out = fopen(filename, "w");

for (i=0; i<VOL; i++)
if (s[i] == 1)
fprintf(out, "%u %u\n", i%L, (unsigned)(i/L));
fclose(out);
}


int main(int argc, char *argv[])
{
unsigned t, n_samples, is, n_iter, flag;
float temperature;
FILE * gpl;

if (argc != 5) {
fprintf(stderr, "usage: %s <T> <n_iter> <n_samples> <seed>\n",
argv[0]);
exit(1);
}

temperature = (float)atof(argv[1]);
n_iter = (unsigned)atoi(argv[2]);
n_samples = (unsigned)atoi(argv[3]);
myrand = (unsigned)atoi(argv[4]);

/* printf("# L = %d T = %.3f random_seed = %u\n", L, temperature, myrand); */
/* fflush(stdout); */

Init_Random();
Init_Prob(temperature);

gpl = popen("gnuplot -persist","w");
fprintf(gpl, "unset key\n set size square\nset xra [0:%u]\nset yra [0:%u]\n",
L, L);
sleep(1);

for (is=0; is<n_samples; is++) {

Init_Spin();
Write_Config("conf.dat");
fprintf(gpl, "plot 'conf.dat' w d\n");
fflush(gpl);
sleep(1);
//printf("%u %g %g\n", 0, (float)ener/VOL, (float)mag/VOL);
flag = 1;
for (t=1; t<=n_iter && flag; t++) {
One_Step();
//printf("%u %g %g\n", t, (float)ener/VOL, (float)mag/VOL);
if (t % 10 == 0) {
Write_Config("conf.dat");
fprintf(gpl, "rep\n");
fflush(gpl);
sleep(1);
if (ener == -2*VOL)
flag = 0;
}
}
/* printf("\n"); */
/* fflush(stdout); */
}
return 0;
}

Loading