// check_cylinder_deriv.c cylindrical coordinates // x = r cos theta 0 <= theta < 2 Pi // y = r sin theta r < 0 restriction for derivative // z = z z double // r = sqrt(x^2+y^2) // theta = arctan(y,x) if theta<0 theta = 2 Pi + arctan(y,x) // z = z // // compute del U(radius,theta,z) r=radius, t=theta angle, z=height // del U = (d/dr U, 1/r d/dt U, d/dz U) // // compute del^2 U(radius,theta,z) r=radius, t=theta angle, z=height // del^2 U = d/dr(r d/dr U) + 1/r^2 d^2/dt^2 U + d^2/dz^2 U // = 2/r d/dr U + d^2/dr^2 U + 1/r^2 d^2/dt^2 U + d^2/dz^2 U #include #include #include "nuderiv.h" #undef abs #define abs(a) ((a)<0.0?(-(a)):(a)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) static const int Nr = 5; // number of radius static const int Nt = 7; // number of angles static const int Nz = 5; // number of Z coordinates // solution for boundary and checking static double U(double R, double T, double Z) { return R*R*R + T*T*T + Z*Z*Z; } // end U // analytic derivatives of solution, for checking static double Ur(double R, double T, double Z) { return 3.0*R*R; } // end Ur static double Urr(double R, double T, double Z) { return 6.0*R; } // end Urr static double Ut(double R, double T, double Z) { return 3.0*T*T; } // end Ut static double Utt(double R, double T, double Z) { return 6.0*T; } // end Utt static double Uz(double R, double T, double Z) { return 3.0*Z*Z; } // end Uz static double Uzz(double R, double T, double Z) { return 6.0*Z; } // end Uzz static double Uuu(double R, double T, double Z) { return 2.0*Ur(R,T,Z)/R + Urr(R,T,Z) + Utt(R,T,Z)/(R*R) + Uzz(R,T,Z); } // end Uuu static double D2(double Urv, double Urrv, double Uttv, double Uzzv, double R) { return 2.0*Urv/R + Urrv + Uttv/(R*R)+ Uzzv; } // end D2 static int S(int i, int j, int k) { // index of each grid point return i*Nt*Nz + j*Nz + k; } // end S int main(int argc, char * argv[]) // check_cylinder_deriv { double Pi = 3.1415926535897932384626433832795028841971; double Rmin = 0.2; double Rmax = 1.0; double Hr = (Rmax-Rmin)/(double)(Nr-1); double Tmin = 0.0; double Tmax = 300.0*Pi/180.0; // Ht not applicable double Zmin = -1.0; double Zmax = 1.0; double Hz = (Zmax-Zmin)/(double)(Nz-1); double Rg[Nr]; // r grid values 0..Nr-1 double Tg[Nt]; // theta grid values double Zg[Nz]; // z grid values const int Nrtz = Nr*Nt*Nz; double Ua[Nrtz]; // U is solution, Ua solution actual for checking double Cr[Nr]; // coefficients of first deriv wrt r double Crr[Nr]; // coefficients of second deriv wrt r double Ctt[Nt]; // coefficients of second deriv wrt t double Czz[Nz]; // coefficients of second deriv wrt z double R, T, Z, Ana, Cmp, Err; double Urv, Urrv, Uttv, Uzzv; // computed derivatives double Maxerrur = 0.0, Maxerrurr = 0.0, Maxerrutt = 0.0; double Maxerruzz = 0.0, Maxerr = 0.0; double X, Y, Tmp; int i, j, k, ii, jj, kk; printf("check_cylinder_deriv.c starting\n"); printf("r gird values, not necessarily equally spaced\n"); for(i=0; i0.0001) printf("R error\n"); Tmp = atan2(Y,X); if(Tmp<0.0) Tmp = 2.0*Pi + Tmp; if(abs(Tmp-T)>0.0001) printf("Theta error\n"); // Z = Z } // k } // j } // i for(i=0; i