📄 stencil3.cpp
字号:
#include <blitz/array.h>
#include <blitz/array/stencil-et.h>
BZ_USING_NAMESPACE(blitz)
BZ_USING_NAMESPACE(blitz::tensor)
typedef Array<float,2> Array2D;
int main()
{
// We'll work on arrays which are (2N+1) x (2N+1)
const int N = 5;
Range D(-N,+N);
// Spatial domain is [-L,+L]
double L = 1.0;
// Resolution of grid: points are spaced at distance h
double h = L / N;
Array2D F(D,D), Lapl2(D,D), Lapl4(D,D), LaplExact(D,D);
// Sample the function cos(x+y) on the grid
F = cos((i+j) * h);
// We'll use 4th order accurate stencils, which are
// 5x5 stencils. This means we need to leave a border
// of 2 around the interior. We can just make Fi an
// alias for the interior of F, etc.
Range Di(-N+2,N-2);
Array2D Fi = F(Di,Di), Lapl2i = Lapl2(Di,Di),
Lapl4i = Lapl4(Di,Di), LaplExacti = LaplExact(Di,Di);
// Now we can apply the Laplacian2D4n stencil, which
// is a 4th-order accurate approximation to the Laplacian.
// The "n" means "normalized", so the factor is h^2
// instead of 12h^2.
Lapl4i = Laplacian2D4(Fi) / (h*h);
// For comparison, we'll also do a 2nd-order accurate
// approximation.
Lapl2i = Laplacian2D(Fi) / (h*h);
// Compare to the exact Laplacian, which is -2 cos(x+y)
LaplExact = -2 * cos((i+j) * h);
cout << "Approximate O(h^2): " << Lapl2i << endl
<< "Approximate O(h^4): " << Lapl4i << endl
<< "Exact: " << LaplExacti << endl;
cout << "Root-mean-square errors:" << endl
<< "2nd order approximation: " << sqrt(mean(sqr(LaplExacti-Lapl2i)))
<< endl
<< "4th order approximation: " << sqrt(mean(sqr(LaplExacti-Lapl4i)))
<< endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -