11 using namespace linal;
13 double u1_t (double x, double y, double t)
15 return x*sin(y+t)*ipow(cos(x),4);
18 double u2_t (double x, double y, double t)
20 return x*cos(y+t)*ipow(cos(x),4);
23 double rp_f1(double x, double y, double t, const SphereBaroclin::Conf * conf)
25 double sigma = conf->sigma;
27 double sigma1= conf->sigma;
28 double mu1 = conf->mu;
29 double alpha = conf->alpha;
31 return -45*mu*sin(y+t)*x-(9./2.)*sigma*
32 ipow(cos(x),3)*sin(y+t)*sin(x)+(9./2.)*sigma*
33 ipow(cos(x),3)*sin(x)*cos(y+t)-10*sigma*
34 ipow(cos(x),4)*x*sin(y+t)+10*sigma*
35 ipow(cos(x),4)*x*cos(y+t)+(15./2.)*sigma*
36 ipow(cos(x),2)*x*sin(y+t)-(15./2.)*sigma*
37 ipow(cos(x),2)*x*cos(y+t)-360*mu*sin(y+t)*sin(x)*
38 ipow(cos(x),3)+147*mu*sin(y+t)*sin(x)*cos(x)-400*mu*sin(y+t)*x*
39 ipow(cos(x),4)+390*mu*sin(y+t)*x*
40 ipow(cos(x),2)-20*x*cos(y+t)*
41 ipow(cos(x),4)-9*cos(y+t)*
42 ipow(cos(x),3)*sin(x)+15*x*cos(y+t)*
46 double rp_g1(double x, double y, double t, const SphereBaroclin::Conf * conf)
48 double sigma = conf->sigma;
50 double sigma1= conf->sigma;
51 double mu1 = conf->mu;
52 double alpha = conf->alpha;
54 double alpha2 = alpha * alpha;
55 double r = 20*x*sin(y+t)*
56 ipow(cos(x),4)+9*sin(y+t)*
57 ipow(cos(x),3)*sin(x)-15*x*sin(y+t)*
58 ipow(cos(x),2)+390*mu*cos(y+t)*x*
59 ipow(cos(x),2)-10*sigma*
60 ipow(cos(x),4)*x*cos(y+t)-(9./2.)*sigma*
61 ipow(cos(x),3)*sin(y+t)*sin(x)-alpha2*
62 ipow(cos(x),7)*x-45*mu*cos(y+t)*x+18*
64 ipow(cos(y+t),2)*sin(x)-9*
65 ipow(cos(x),6)*sin(x)+9*x*
66 ipow(cos(x),5)-(9./2.)*sigma*
67 ipow(cos(x),3)*sin(x)*cos(y+t)-30*x*x*
68 ipow(cos(x),4)*sin(x)-18*x*
70 ipow(cos(y+t),2)+alpha2*
71 ipow(cos(x),4)*x*sin(y+t)+(15./2.)*sigma*
72 ipow(cos(x),2)*x*sin(y+t)+(15./2.)*sigma*
73 ipow(cos(x),2)*x*cos(y+t)-400*mu*cos(y+t)*x*
74 ipow(cos(x),4)+147*mu*cos(y+t)*sin(x)*cos(x)+60*x*x*
76 ipow(cos(y+t),2)*sin(x)-360*mu*cos(y+t)*sin(x)*
77 ipow(cos(x),3)-10*sigma*
78 ipow(cos(x),4)*x*sin(y+t)+4*alpha2*
79 ipow(cos(x),6)*x*x*sin(x)-9*alpha2*
80 ipow(cos(x),3)*mu1*cos(y+t)*sin(x)-20*alpha2*
81 ipow(cos(x),4)*mu1*cos(y+t)*x+15*alpha2*
82 ipow(cos(x),2)*mu1*cos(y+t)*x-alpha2*
83 ipow(cos(x),4)*sigma1*x*cos(y+t);
88 double rp_f2(double x, double y, double t, const SphereBaroclin::Conf * conf)
90 double sigma = conf->sigma;
92 double sigma1= conf->sigma;
93 double mu1 = conf->mu;
94 double alpha = conf->alpha;
97 ipow(cos(x),3)*sin(x)-20*x*cos(y+t)*
98 ipow(cos(x),4)+15*x*cos(y+t)*
99 ipow(cos(x),2)-(9./2.)*sigma*
100 ipow(cos(x),3)*sin(y+t)*sin(x)+(9./2.)*sigma*
101 ipow(cos(x),3)*sin(x)*cos(y+t)-10*sigma*
102 ipow(cos(x),4)*x*sin(y+t)+10*sigma*
103 ipow(cos(x),4)*x*cos(y+t)+(15./2.)*sigma*
104 ipow(cos(x),2)*x*sin(y+t)-(15./2.)*sigma*
105 ipow(cos(x),2)*x*cos(y+t)-360*mu*sin(y+t)*sin(x)*
106 ipow(cos(x),3)+147*mu*sin(y+t)*sin(x)*cos(x)-400*mu*sin(y+t)*x*
107 ipow(cos(x),4)+390*mu*sin(y+t)*x*
108 ipow(cos(x),2)-45*mu*sin(y+t)*x;
111 double rp_g2(double x, double y, double t, SphereBaroclin::Conf * conf)
113 double sigma = conf->sigma;
114 double mu = conf->mu;
115 double sigma1= conf->sigma;
116 double mu1 = conf->mu;
117 double alpha = conf->alpha;
119 return -15*x*sin(y+t)*
120 ipow(cos(x),2)+20*x*sin(y+t)*
121 ipow(cos(x),4)+9*sin(y+t)*
122 ipow(cos(x),3)*sin(x)-(9./2.)*sigma*
123 ipow(cos(x),3)*sin(x)*cos(y+t)-10*sigma*
124 ipow(cos(x),4)*x*sin(y+t)-10*sigma*
125 ipow(cos(x),4)*x*cos(y+t)-(9./2.)*sigma*
126 ipow(cos(x),3)*sin(y+t)*sin(x)+(15./2.)*sigma*
127 ipow(cos(x),2)*x*sin(y+t)+(15./2.)*sigma*
128 ipow(cos(x),2)*x*cos(y+t)-360*mu*cos(y+t)*sin(x)*
129 ipow(cos(x),3)+147*mu*cos(y+t)*sin(x)*cos(x)-400*mu*cos(y+t)*x*
130 ipow(cos(x),4)+390*mu*cos(y+t)*x*
131 ipow(cos(x),2)-45*mu*cos(y+t)*x;
134 double rp1(double phi, double lambda, SphereBaroclin::Conf * conf)
136 double omg = 2.*M_PI/24./60./60.; // ?
139 double c = T0*T0/R/R;
142 double pt1 = -0.5 * (sin(x)*M_PI*x-2*sin(x)*x*x);
143 if (fabs(pt1) > 1e-14) {
147 double pt2 = -0.5*(-M_PI+4*x);
148 return -T0/R * 16.0 / M_PI / M_PI * 30.0 * (pt1 + pt2);
151 double rp2(double phi, double lambda, SphereBaroclin::Conf * conf)
153 double omg = 2.*M_PI/24./60./60.; // ?
156 double c = T0*T0/R/R;
159 double pt1 = -0.5 * (sin(x)*M_PI*x-2*sin(x)*x*x);
160 if (fabs(pt1) > 1e-14) {
164 double pt2 = -0.5*(-M_PI+4*x);
165 return -T0/R * 16.0 / M_PI / M_PI * 30.0 * (pt1 + pt2);
168 double cor(double phi, double lambda, double, const SphereBaroclin::Conf * conf)
170 return 2.*sin(phi) + // l
171 0.5 * cos(2*lambda)*sin(2*phi)*sin(2*phi); //h
174 double zero_cor(double phi, double lambda, double, const SphereBaroclin::Conf * conf)
179 double u0(double phi, double lambda)
181 double omg = 2.*M_PI/24./60./60.; // ?
185 return -T0/R * 16.0 / M_PI / M_PI * 30.0 *
186 (M_PI/4 * phi * phi - phi * phi * phi / 3);
189 #define pOff(i, j) ( i ) * conf.nlon + ( j )
191 template < typename T >
192 void proj(double * u, SphereBaroclin & bv, SphereBaroclin::Conf & conf, T rp, double t)
194 double dlat = M_PI / (conf.nlat - 1);
195 double dlon = 2. * M_PI / conf.nlon;
197 for (int i = 0; i < conf.nlat; ++i) {
198 double phi = -0.5 * M_PI + i * dlat;
199 for (int j = 0; j < conf.nlon; ++j) {
200 double lambda = j * dlon;
201 u[pOff(i, j)] = rp(phi, lambda, t);
206 void test_barvortex()
208 SphereBaroclin::Conf conf;
211 double omg = 2.*M_PI/24./60./60.; // ?
216 conf.sigma = 1.14e-2;
219 conf.sigma1= conf.sigma;
236 int n = conf.nlat * conf.nlon;
239 double T = 30 * 2.0 * M_PI;;
244 SphereBaroclin bv(conf);
245 vector < double > u1(n);
246 vector < double > u2(n);
247 vector < double > u11(n);
248 vector < double > u21(n);
249 vector < double > u1r(n);
250 vector < double > u2r(n);
252 fprintf(stderr, "#mesh_w:%d\n", conf.nlon);
253 fprintf(stderr, "#mesh_h:%d\n", conf.nlat);
254 fprintf(stderr, "#tau:%.16lf\n", conf.tau);
255 fprintf(stderr, "#sigma:%.16lf\n", conf.sigma);
256 fprintf(stderr, "#mu:%.16lf\n", conf.mu);
257 fprintf(stderr, "#sigma1:%.16lf\n", conf.sigma1);
258 fprintf(stderr, "#mu1:%.16lf\n", conf.mu1);
259 fprintf(stderr, "#alpha:%.16lf\n", conf.alpha);
260 fprintf(stderr, "#k1:%.16lf\n", conf.k1);
261 fprintf(stderr, "#k2:%.16lf\n", conf.k2);
262 fprintf(stderr, "#theta:%.16lf\n", conf.theta);
263 fprintf(stderr, "#rp:kornev1\n");
264 fprintf(stderr, "#coriolis:kornev1\n");
265 fprintf(stderr, "#initial:kornev1\n");
266 fprintf(stderr, "#build:$Id$\n");
268 proj(&u1[0], bv, conf, u1_t, 0);
269 proj(&u2[0], bv, conf, u2_t, 0);
272 bv.S_step(&u11[0], &u21[0], &u1[0], &u2[0], t);
275 proj(&u1r[0], bv, conf, u1_t, t);
276 proj(&u2r[0], bv, conf, u2_t, t);
278 nr1 = bv.dist(&u11[0], &u1r[0]);
279 nr2 = bv.dist(&u21[0], &u2r[0]);
280 fprintf(stderr, "t=%le; nr=%le; nr=%le; min=%le; max=%le;\n",
282 vec_find_min(&u11[0], n),
283 vec_find_max(&u11[0], n));
285 if (isnan(nr1) || isnan(nr2)) {
295 int main(int argc, char ** argv)
297 fprintf(stderr, "#cmd:");
298 for (int i = 0; i < argc; ++i) {
299 fprintf(stderr, "%s ", argv[i]);
301 fprintf(stderr, "\n");