Hi list!
The attached program crashes after allocating memory (marked "still alive"
int the file). Ihave no idea why, allocating memory for the classical
integrations
works fine. I'm using dev-cpp 4.9 and gsl 1.6.
Any ideas?
LG Flo
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_plain.h>
#include <gsl/gsl_monte_miser.h>
/* dünner Film mit Ausdehnung 2b in y und 2a in y, zentriert, b>=a
printf("%e %e\n",1./0.,0./0.); ergibt: 1.#INF00e+00 -1.#IND00e+00
*/
double a,b,d,jc,acc;
int intervalls;
gsl_integration_workspace *w;
double f(double x,double y)
{
double P,Q,sum1,sum2;
P=sqrt((a-x)*(a-x)+(b-y)*(b-y));
Q=sqrt(x*x+(b-a-y)*(b-a-y));
sum1=sqrt(2.)*log((sqrt(2.)*P+a+b-x-y)/(sqrt(2.)*Q-a+b-x-y));
sum2=log( fabs( ( (P+y-b)*(y-b+a)*(P+x-a)*x) / ( (y-b)*(Q+y-b+a)*(x-a)*(Q+x)
) ) );
return sum1+sum2;
}
double Bz(double x,double y)
{
return 1.e-7*jc*d*(f(x,y)+f(-x,y)+f(x,-y)+f(-x,-y));
}
/*
overrides the default signal handler, no abort in case of errors
*/
void handler(const char * reason,const char * file,int line,int gsl_errno)
{
int i;
printf("%s in %s (%i): Error %i\n",reason,file,line,gsl_errno);
getchar();
}
void print_field()
{
int i,j;
FILE *file;
file=fopen("log.dat","w");
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++)
{
fprintf(file,"%e\t",Bz(-a+2.*a/100.*j,b-2.*b/100*i));
}
fprintf(file,"\n");
}
fclose(file);
}
// y-> b-a+y
double int1(double y,void *params)
{
double result,error;
int status;
gsl_function F;
double func1(double x,void *params)
{
return fabs(Bz(x,b-a+y));
}
F.function=&func1;
F.params=NULL;
status=gsl_integration_qags(&F,0,y,0,acc,intervalls,w,&result,&error);
return result;
}
double intint1()
{
double result,error;
int status;
gsl_function F;
F.function=&int1;
F.params=NULL;
status=gsl_integration_qags(&F,0,a,0,acc,intervalls,w,&result,&error);
return result;
}
double int2(double x,void *params)
{
double result,error;
int status;
gsl_function F;
double func2(double y,void *params)
{
return fabs(Bz(x,y));
}
F.function=&func2;
F.params=NULL;
status=gsl_integration_qags(&F,0,b-a+x,0,acc,intervalls,w,&result,&error);
return result;
}
double intint2()
{
double result,error;
int status;
gsl_function F;
F.function=&int2;
F.params=NULL;
status=gsl_integration_qags(&F,0,a,0,acc,intervalls,w,&result,&error);
return result;
}
double g(double *k, size_t dim, void *params)
{
return fabs(Bz(k[0],k[1]));
}
int main()
{
gsl_error_handler_t *old_handler;
int i,status;
double dummy,result,error;
FILE *file;
a=0.0001;
b=0.0002;
d=0.000001;
jc=1.e9;
intervalls=1e3;
acc=1.e-6;
double xl[2] = {0,0};
double xu[3] = {a,b};
const gsl_rng_type *T;
gsl_rng *r;
gsl_monte_function G={&g,2,0};
size_t calls = 500000;
// override handler, allocate workspace memory
old_handler=gsl_set_error_handler(&handler);
w=gsl_integration_workspace_alloc(intervalls);
file=fopen("file.log","w");
printf("%e\n",(intint2()+intint1())/(a*b));
gsl_rng_env_setup ();
T=gsl_rng_default;
// still alive
printf("Allocating workspace for montecarlo integration\n");
r=gsl_rng_alloc (T);
printf("Dead\n");
// dead
{
gsl_monte_miser_state *s= gsl_monte_miser_alloc (3);
gsl_monte_miser_integrate(&G,xl,xu,3,calls,r,s,&result,&error);
gsl_monte_miser_free (s);
}
printf("monte carlo: %e\n",result/(a*b));
getchar();
}
_______________________________________________
Help-gsl mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gsl