15 using namespace linal;
17 static inline double max(double a, double b)
19 return (a > b) ? a : b;
23 double rp(double x, double y) {
24 return -6.0 * sin(y) * sin(2.0 * x);
27 double ans(double x, double y) {
28 return sin(y) * sin(2.0 * x);
31 double ans2(double x, double y, double t)
33 return x*sin(y+t)*ipow(cos(x),4);
36 double rp2(double x, double y, double t, double mu, double sigma)
38 return sin(y+t)*ipow(cos(x),2)*(9*mu*sin(x)*cos(x)+20*mu*x*ipow(cos(x),2)+sigma*x*ipow(cos(x),2)-15*mu*x);
43 long nlat = 3*19, nlon = 3*36;
44 double dlat = M_PI / (nlat-1);
45 double dlon = 2. * M_PI /nlon;
51 vector < double > u(nlat * nlon);
52 vector < double > v(nlat * nlon);
53 vector < double > r(nlat * nlon);
55 SphereOperator op(nlat, nlon, 0);
56 SphereLaplace lapl(op);
60 for (i = 0; i < nlat; ++i) {
61 for (j = 0; j < nlon; ++j) {
62 double phi = -0.5 * M_PI + i * dlat;
63 double lambda = j * dlon;
65 r[i * nlon + j] = rp2(phi, lambda, 0, mu, sigma);
69 lapl.solve(&u[0], &r[0], -mu, sigma);
71 for (i = 0; i < nlat; ++i) {
72 for (j = 0; j < nlon; ++j) {
73 double phi = -0.5 * M_PI + i * dlat;
74 double lambda = j * dlon;
76 nev1 = max(nev1, fabs(u[i * nlon + j] - ans2(phi, lambda, 0)));
80 fprintf(stderr, "nev1=%.16le \n", nev1);
82 lapl.calc(&v[0], &u[0]);
85 for (i = 0; i < nlat; ++i) {
86 for (j = 0; j < nlon; ++j) {
87 double phi = -0.5 * M_PI + i * dlat;
88 double lambda = j * dlon;
90 nev1 = max(nev1, fabs(5 * v[i * nlon + j] - r[i * nlon + j]));
94 fprintf(stderr, "nev1=%.16le \n", nev1);
97 int main(int argc, char * argv[])