/* KdV JEDNACINA implicitna - spektralna metoda http://bojan.info/diplomski/num/kdv.c Napomene: - Poziva gnuplot, koji treba biti instaliran na sistemu (po potrebi promijeniti "wgnuplot" u "gnuplot" na kraju funkcije cgplot.) - Izbor gnuplot terminala (GIF ili LateX) se podesava sa #define GIF - Za izlaz napraviti folder 'output/gif' odn. 'output/latex'. - Pocetni uvjet zadati sa #define START(x) */ #include #include #include #include /* PRETPROCESORSKE VARIJABLE */ #define PI (4 * atan(1)) /* prostorna resetka */ #define N 1024 /* broj prostornih celija */ #define L 50.0 /* duzina prostornog intervala */ #define X(j) (j*L/N) /* j-ti cvor */ #define A (L/(2*PI)) /* vremenska diskretizacija */ #define DT .005 /* vremenski korak */ #define T 11.0 /* max. vrijeme */ #define GPSTEP 99 /* plot svakih GPSTEP+1 koraka */ /* koeficijenti */ #define DISP 1.0 /* koeficijent disperzije */ /* pocetni uvjet */ #define START(x) 12/A*(.64/(cosh(.8*(x-5))*cosh(.8*(x-5)))\ + .25/(cosh(.5*(x-5))*cosh(.5*(x-5)))) /* 2 solitona: 12/A*(.64/(cosh(.8*(x-5))*cosh(.8*(x-5)))\ + .25/(cosh(.5*(x-15))*cosh(.5*(x-15)))) */ /* gausijan: ( exp(-2*(x-.25*L)*(x-.25*L)) / A ) */ /* gnuplot */ #define GIF 0 /* 0/1 = LaTeX/gif terminal */ #define XMIN 0.0*L /* min. apscise */ #define XMAX 1.0*L /* max. apscise */ #define YMIN -.1 /* min. ordinate */ #define YMAX 8.0 /* max. ordinate */ /* NR */ #define NR_END 1 #define FREE_ARG char* #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr /* PROTOTIPOVI FUNKCIJA */ void init(__complex__ float u[]); void cgplot(__complex__ float u[], int n); /* funkcije adaptirane iz NR */ __complex__ float *cfvector(long nl, long nh); void free_cfvector(__complex__ float *v, long nl, long nh); void cfour1(__complex__ float data[], unsigned long nn, int isign); /* originalne NR funkcije */ void nrerror(char error_text[]); float *vector(long nl, long nh); int *ivector(long nl, long nh); void free_vector(float *v, long nl, long nh); void free_ivector(int *v, long nl, long nh); int main() { __complex__ float *u; /* valna funkcija */ u = cfvector(0,N-1); init(u); /* zadavanje pocetnih uvjeta */ __complex__ float *v, *w, *temp; /* pomocni vektori */ v = cfvector(0,N-1); w = cfvector(0,N-1); temp = cfvector(0,N-1); __complex__ float *uop, *bop; /* dif. oper. u k-prostoru */ uop = cfvector(0,N-1); /* operator U */ bop = cfvector(0,N-1); /* operator B */ int *kk; /* vektor sa valnim brojevima */ kk = ivector(0,N-1); int j; /* brojac za koracanje kroz x-prostor */ int k; /* brojac za koracanje kroz k-prostor */ int i; /* brojac za iteraciju rjesenja implicitne jedn.*/ float m = DISP * DT / pow(A,3); /* pomocni faktor */ __complex__ naz; /* nazivnik za uop i bop */ for(k=0; k i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=nn; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=mmax << 1; theta=isign*(6.28318530717959/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m