diff -urN povray-3.50c/src/fnintern.cpp povray-3.50c-ww/src/fnintern.cpp
--- povray-3.50c/src/fnintern.cpp	2003-01-07 02:08:27.000000000 +0100
+++ povray-3.50c-ww/src/fnintern.cpp	2003-06-16 21:55:47.000000000 +0200
@@ -151,6 +151,12 @@
 DBL f_pattern(DBL *ptr, unsigned int fn); // 77
 DBL f_noise_generator(DBL *ptr, unsigned int fn); // 78
 
+DBL f_orbit320(DBL *ptr, unsigned int fn); // 79
+DBL f_orbit310(DBL *ptr, unsigned int fn); // 80
+DBL f_besselJ(DBL *ptr,unsigned int fn); // 81
+DBL f_besselJD(DBL *ptr,unsigned int fn); // 82
+DBL f_CAVITY(DBL *ptr,unsigned int fn); // 83
+
 void f_pigment(DBL *ptr, unsigned int fn, unsigned int sp); // 0
 void f_transform(DBL *ptr, unsigned int fn, unsigned int sp); // 1
 void f_spline(DBL *ptr, unsigned int fn, unsigned int sp); // 2
@@ -241,6 +247,11 @@
 	{ f_noise3d,                 0 + 3 }, // 76
 	{ f_pattern,                 0 + 3 }, // 77
 	{ f_noise_generator,         1 + 3 }, // 78
+	{ f_orbit320,                0 + 3 }, // 79
+	{ f_orbit310,                0 + 3 }, // 80
+	{ f_besselJ,                 1 + 3 }, // 81
+	{ f_besselJD,                1 + 3 }, // 81
+	{ f_CAVITY,                  1 + 3 }, // 81
 	{ NULL, 0 }
 };
 
@@ -252,7 +263,7 @@
 	{ NULL, 0 }
 };
 
-unsigned int POVFPU_TrapTableSize = 79;
+unsigned int POVFPU_TrapTableSize = 84;
 unsigned int POVFPU_TrapSTableSize = 3;
 
 
@@ -1228,6 +1239,61 @@
 	return Noise(Vec, &TPat);
 }
 
+DBL f_orbit320(DBL *ptr, unsigned int fn) // 79
+{
+	static const double a0=1;
+	static const double c1=1.0/(81.0*sqrt(6.0*M_PI)) * pow(1.0/a0,3.0/2.0) * 1.0/(a0*a0);
+	
+	register double r=sqrt(PARAM_X * PARAM_X + PARAM_Y * PARAM_Y + PARAM_Z * PARAM_Z);
+	//register double theta=atan2(sqrt(PARAM_X * PARAM_X + PARAM_Y * PARAM_Y),PARAM_Z);
+	register double cos_theta = PARAM_Z / r;
+	double psi = c1 * r*r * exp(-r/(3.0*a0)) * (3.0*cos_theta*cos_theta-1.0);
+	return( psi*psi );
+}
+
+DBL f_orbit310(DBL *ptr, unsigned int fn) // 80
+{
+	static const double a0=1;
+	static const double c1=sqrt(2.0/M_PI)/81.0 * pow(1.0/a0,3.0/2.0);
+	
+	register double r=sqrt(PARAM_X * PARAM_X + PARAM_Y * PARAM_Y + PARAM_Z * PARAM_Z);
+	register double cos_theta = PARAM_Z / r;
+	double psi = c1 * (6.0 - r/a0) * r/a0 * exp(-r/(3.0*a0)) * cos_theta;
+	return( psi*psi );
+}
+
+#include "/usr/local/numerics/include/gsl/gsl_sf_bessel.h"
+
+inline DBL _f_besselJ(DBL x,int m)
+{
+	return(gsl_sf_bessel_Jn(m,x));
+}
+inline DBL _f_besselJD(DBL x,int m)
+{
+	double eps=0.00001;
+	double vA=gsl_sf_bessel_Jn(m,x-eps);
+	double vB=gsl_sf_bessel_Jn(m,x+eps);
+	return((vB-vA)/(2.0*eps));
+}
+
+DBL f_besselJ(DBL *ptr, unsigned int fn) // 81
+{
+	return(_f_besselJ(PARAM_X,int(PARAM(0)+0.5)));
+}
+
+DBL f_besselJD(DBL *ptr, unsigned int fn) // 81
+{
+	return(_f_besselJD(PARAM_X,int(PARAM(0)+0.5)));
+}
+
+DBL f_CAVITY(DBL *ptr, unsigned int fn) // 82
+{
+	int m=int(PARAM(0)+0.5);
+	double tmpA=sin(m*PARAM_Y)*_f_besselJ(PARAM_X,m);
+	double tmpB=cos(m*PARAM_Y)*m/PARAM_X*_f_besselJD(PARAM_X,m);
+	return(hypot(tmpA,tmpB));
+}
+
 void f_pigment(DBL *ptr, unsigned int fn, unsigned int sp) // 0
 {
 	VECTOR Vec = { PARAM_N_X(5), PARAM_N_Y(5), PARAM_N_Z(5) };

