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
codice:
#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;
}