This is the mail archive of the
gsl-discuss@sources.redhat.com
mailing list for the GSL project.
Re: Some (probably) ridiculous questions
- To: Brian Gough <bjg at network-theory dot co dot uk>
- Subject: Re: Some (probably) ridiculous questions
- From: Jean-Max Redonnet <redonnet at lgmt-fab1 dot ups-tlse dot fr>
- Date: Sat, 7 Jul 2001 12:47:13 +0200
- Cc: gsl-discuss at sourceware dot cygnus dot com
- Organization: LGMT
- References: <01070611531200.01910@lgmt-fab5.ups-tlse.fr> <15173.56028.740003.364874@debian>
- Reply-To: redonnetNO at SPAMlgmt dot ups-tlse dot fr
Le Vendredi 6 Juillet 2001 17:35, Brian Gough a écrit :
<snip>
>
> Hello,
>
> The gsl_function type is mainly designed for interfacing to the
> univariate gsl routines. It is not really a general facility so it
> does not handle other cases that are not used in the library, such as
> surfaces.
>
> The way to handle this sort of situation is,
>
> -- define your own surface function type in the way that you normally
> would in your C-programs
>
> -- if you need to use a gsl routine, for example to integrate along a
> line, define a function to create the appropriate gsl_function by
> mapping from your surface type.
>
> Philosophically, calls to GSL routines, and the GSL types, can be at a
> "lower-level" than your program.
>
> regards
> Brian Gough
Thanks for your help to a definitively poor programmer (and mathematician)
But I'm not sure I really understand what you mean...
I think I have defined a surface function type as you proposed.
This part seems to work as expected.
but I don't see how to define a function to create the appropriate
gsl_function...
Here the code :
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_diff.h>
#define RAD2DEG(X) (X*180/M_PI)
#define DEG2RAD(X) (X*M_PI/180)
struct surf_function_struct {
double (* fx)(double u, double v);
double (* fy)(double u, double v);
double (* fz)(double u, double v);;
};
typedef struct surf_function_struct surf_function ;
double C0_fx(double u)
{
return 80*u;
}
double C0_fy(double u)
{
return 80*tan(DEG2RAD(22.5))*(u-0.5);
}
double C0_fz(double u)
{
return 40;
}
double C1_fx(double u)
{
return 80*u;
}
double C1_fy(double u)
{
return -80*tan(DEG2RAD(22.5))*(u-0.5);
}
double C1_fz(double u)
{
return -40;
}
double S_fx(double u, double v)
{
return (1-v)*C0_fx(u)+v*C1_fx(u);
}
double S_fy(double u, double v)
{
return (1-v)*C0_fy(u)+v*C1_fy(u);
}
double S_fz(double u, double v)
{
return (1-v)*C0_fz(u)+v*C1_fz(u);
}
int main (void)
{
double u,v;
surf_function surf;
u = 0.5;
v = 0.5;
surf.fx = &S_fx;
surf.fy = &S_fy;
surf.fz = &S_fz;
printf(" | %f \n", S_fx(u,v));
printf(" S(%.1f,%.1f) = | %f \n", u, v, S_fy(u,v));
printf(" | %f \n", S_fz(u,v));
printf(" | %f \n", surf.fx(u,v));
printf(" S(%.1f,%.1f) = | %f \n", u, v, surf.fy(u,v));
printf(" | %f \n", surf.fz(u,v));
return 0;
}
You would be my definitive heroe if you can help me on this point.
Thanks.
--
===============================================================================
Veuillez noter ma nouvelle adresse électronique :
mailto:redonnetNO@SPAMlgmt.ups-tlse.fr