static void exact_sol(double x, double y, scalar& u0, scalar& u1, scalar& u1dx, scalar& u0dy) { scalar dx,dy; u0 = exact0(x,y,dx,dy); u1 = exact1(x,y,dx,dy); scalar Hr = der_Hr(x,y); scalar Ht = der_Ht(x,y); scalar Hrr = der_Hrr(x,y); scalar Hrt = der_Hrt(x,y); scalar Htr = der_Htr(x,y); scalar Htt = der_Htt(x,y); double r = sqrt(x*x + y*y); double theta = atan2(y,x); scalar i = cplx(0.0,1.0); u1dx = i * (( Hrr * x/r + Hrt * (-y/(r*r))) * x/r + Hr * (y*y)/(r*r*r) - ((Htr * x/r + Htt * (-y/(r*r))) * y/(r*r) + Ht * (-2.0*x*y/(r*r*r*r)))); u0dy = -i * (( Hrr * y/r + Hrt * x/(r*r)) * y/r + Hr * (x*x)/(r*r*r) + (Htr * y/r + Htt * x/(r*r)) * x/(r*r) + Ht * (-2.0*x*y/(r*r*r*r))); }
cplx bc_values(int marker, double x, double y) { scalar dx, dy; return exact0(x, y, dx, dy)*tau[marker][0] + exact1(x, y, dx, dy)*tau[marker][1]; }
void test01 ( ) /******************************************************************************/ /* Purpose: TEST01 carries out test case #1. Discussion: Use A1, C1, F1, EXACT1, EXACT_UX1. Licensing: This code is distributed under the GNU LGPL license. Modified: 14 June 2014 Author: John Burkardt Reference: Dianne O'Leary, Scientific Computing with Case Studies, SIAM, 2008, ISBN13: 978-0-898716-66-5, LC: QA401.O44. */ { int i; int n = 11; double e1; double e2; double h1s; double *u; double uexact; double *x; double x_first; double x_last; printf ( "\n" ); printf ( "TEST01\n" ); printf ( " Solve -( A(x) U'(x) )' + C(x) U(x) = F(x)\n" ); printf ( " for 0 < x < 1, with U(0) = U(1) = 0.\n" ); printf ( " A1(X) = 1.0\n" ); printf ( " C1(X) = 0.0\n" ); printf ( " F1(X) = X * ( X + 3 ) * exp ( X )\n" ); printf ( " U1(X) = X * ( 1 - X ) * exp ( X )\n" ); printf ( "\n" ); printf ( " Number of nodes = %d\n", n ); /* Geometry definitions. */ x_first = 0.0; x_last = 1.0; x = r8vec_even_new ( n, x_first, x_last ); u = fem1d_bvp_linear ( n, a1, c1, f1, x ); printf ( "\n" ); printf ( " I X U Uexact Error\n" ); printf ( "\n" ); for ( i = 0; i < n; i++ ) { uexact = exact1 ( x[i] ); printf ( " %4d %8f %14f %14f %14e\n", i, x[i], u[i], uexact, fabs ( u[i] - uexact ) ); } e1 = l1_error ( n, x, u, exact1 ); e2 = l2_error_linear ( n, x, u, exact1 ); h1s = h1s_error_linear ( n, x, u, exact_ux1 ); printf ( "\n" ); printf ( " l1 norm of error = %g\n", e1 ); printf ( " L2 norm of error = %g\n", e2 ); printf ( " Seminorm of error = %g\n", h1s ); free ( u ); free ( x ); return; }