diff --git a/library/Demos/LocalRegions/CMakeLists.txt b/library/Demos/LocalRegions/CMakeLists.txt index 1d6c0ade83e0f3e4226100ef700f325dcf779c6e..0b5550b56367127e197e02f0af23adf3943f1edd 100644 --- a/library/Demos/LocalRegions/CMakeLists.txt +++ b/library/Demos/LocalRegions/CMakeLists.txt @@ -14,7 +14,6 @@ ADD_NEKTAR_EXECUTABLE(LocProject1D demos LocProject1DSource) TARGET_LINK_LIBRARIES(LocProject1D ${LinkLibraries}) SET_LAPACK_LINK_LIBRARIES(LocProject1D) - SET(LocProject2DSource LocProject2D.cpp) ADD_NEKTAR_EXECUTABLE(LocProject2D demos LocProject2DSource) TARGET_LINK_LIBRARIES(LocProject2D ${LinkLibraries}) @@ -25,7 +24,6 @@ ADD_NEKTAR_EXECUTABLE(LocProject3D demos LocProject3DSource) TARGET_LINK_LIBRARIES(LocProject3D ${LinkLibraries}) SET_LAPACK_LINK_LIBRARIES(LocProject3D) - SET(LocProject_Diff1DSource LocProject_Diff1D.cpp) ADD_NEKTAR_EXECUTABLE(LocProject_Diff1D demos LocProject_Diff1DSource) TARGET_LINK_LIBRARIES(LocProject_Diff1D ${LinkLibraries}) @@ -41,46 +39,6 @@ ADD_NEKTAR_EXECUTABLE(LocProject_Diff3D demos LocProject_Diff3DSource) TARGET_LINK_LIBRARIES(LocProject_Diff3D ${LinkLibraries}) SET_LAPACK_LINK_LIBRARIES(LocProject_Diff3D) -SET(LocTetExpDemoSource LocTetExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(LocTetExpDemo demos LocTetExpDemoSource) -TARGET_LINK_LIBRARIES(LocTetExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocTetExpDemo) - -SET(LocPyrExpDemoSource LocPyrExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(LocPyrExpDemo demos LocPyrExpDemoSource) -TARGET_LINK_LIBRARIES(LocPyrExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocPyrExpDemo) - -SET(LocPrismExpDemoSource LocPrismExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(LocPrismExpDemo demos LocPrismExpDemoSource) -TARGET_LINK_LIBRARIES(LocPrismExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocPrismExpDemo) - -SET(LocHexExpDemoSource LocHexExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(LocHexExpDemo demos LocHexExpDemoSource) -TARGET_LINK_LIBRARIES(LocHexExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocHexExpDemo) - -SET(LocHexExpDemoSource LocHexExpDemo_2.cpp) -ADD_NEKTAR_EXECUTABLE(LocHexExpDemo_2 demos LocHexExpDemoSource) -TARGET_LINK_LIBRARIES(LocHexExpDemo_2 ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocHexExpDemo_2) - -SET(LocPrismExpDemoSource LocPrismExpDemo_2.cpp) -ADD_NEKTAR_EXECUTABLE(LocPrismExpDemo_2 demos LocPrismExpDemoSource) -TARGET_LINK_LIBRARIES(LocPrismExpDemo_2 ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocPrismExpDemo_2) - -SET(LocPyrExpDemoSource LocPyrExpDemo_2.cpp) -ADD_NEKTAR_EXECUTABLE(LocPyrExpDemo_2 demos LocPyrExpDemoSource) -TARGET_LINK_LIBRARIES(LocPyrExpDemo_2 ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocPyrExpDemo_2) - -SET(LocTetExpDemoSource LocTetExpDemo_2.cpp) -ADD_NEKTAR_EXECUTABLE(LocTetExpDemo_2 demos LocTetExpDemoSource) -TARGET_LINK_LIBRARIES(LocTetExpDemo_2 ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(LocTetExpDemo_2) - # Generate list of available subdirectories FILE(GLOB dir_list "*") FOREACH(dir ${dir_list}) @@ -108,6 +66,7 @@ ADD_NEKTAR_TEST(LocProject3D_Tet_Ortho_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Tet_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Prism_Ortho_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Prism_Mod_Basis_P6_Q7) +ADD_NEKTAR_TEST(LocProject3D_Pyr_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Hex_Ortho_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Hex_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject3D_Hex_Lagrange_Basis_P6_Q7) @@ -123,6 +82,7 @@ ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Hex_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Hex_Ortho_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Prism_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Prism_Ortho_Basis_P6_Q7) +ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Pyr_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Tet_Mod_Basis_P6_Q7) ADD_NEKTAR_TEST(LocProject_Diff3D_Reg_Tet_Ortho_Basis_P6_Q7) diff --git a/library/Demos/LocalRegions/LocHexExpDemo.cpp b/library/Demos/LocalRegions/LocHexExpDemo.cpp deleted file mode 100644 index d6847eb8e63cba59b66347bacfc81a3515a024f5..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocHexExpDemo.cpp +++ /dev/null @@ -1,311 +0,0 @@ -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace boost; -using namespace Nektar; -using namespace Nektar::LibUtilities; -using namespace Nektar::LocalRegions; -using namespace Nektar::StdRegions; -using namespace Nektar::SpatialDomains; - -/// Defines the test solution which excites all modes in the Hex. -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3); - -/// Specialised pow function returning 1.0 for exponents < 0. -static double pow_loc(const double val, const int i) -{ - return (i < 0)? 1.0: pow(val,i); -} - - -int main(int argc, char *argv[]) -{ - if( argc != 10 ) { - cerr << "Usage: HexDemo Type_x Type_y Type_z numModes_x numModes_y " - "numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" - << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 4 4 4 3 3 3 5 5 5" - << endl; - cerr << endl; - - exit(1); - } - - // Set up the region shape and expansion types - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - BasisType bType_x = static_cast( bType_x_val ); - BasisType bType_y = static_cast( bType_y_val ); - BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - if( (bType_x == eOrtho_B) || (bType_x == eModified_B) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == eOrtho_C) || (bType_x == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == eOrtho_C) || (bType_y == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - - // Set up the number of quadrature points, order of bases, etc - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1; - int Q = yModes - 1; - int R = zModes - 1; - const int three = 3; - - Array solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x, Qtype_y, Qtype_z; - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - if(bType_x != LibUtilities::eFourier) - { - Qtype_x = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_x = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_y != LibUtilities::eFourier) - { - Qtype_y = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_y = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_z != LibUtilities::eFourier) - { - Qtype_z = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_z = LibUtilities::eFourierEvenlySpaced; - } - - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - StdRegions::StdExpansion3D *lhe = 0; - - // //////////////////////////////////////////////////////////////// - // Set up Hexahedron vertex coordinates - // PointGeom (const int coordim, const int vid, double x, - // double y, double z) - - const int nVerts = 8; - const double point[][3] = { - {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, - {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} - }; - - // Populate the list of verts - PointGeomSharedPtr verts[8]; - for( int i = 0; i < nVerts; ++i ) { - verts[i] = MemoryManager - ::AllocateSharedPtr(three, i, point[i][0], - point[i][1], point[i][2]); - } - - // //////////////////////////////////////////////////////////////// - // Set up Hexahedron Edges - // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) - const int nEdges = 12; - const int vertexConnectivity[][2] = { - {0,1}, {1,2}, {2,3}, {0,3}, {0,4}, {1,5}, - {2,6}, {3,7}, {4,5}, {5,6}, {6,7}, {4,7} - }; - - // Populate the list of edges - SegGeomSharedPtr edges[nEdges]; - for( int i = 0; i < nEdges; ++i ) { - PointGeomSharedPtr vertsArray[2]; - for( int j = 0; j < 2; ++j ) { - vertsArray[j] = verts[vertexConnectivity[i][j]]; - } - edges[i] = MemoryManager:: - AllocateSharedPtr( i, three, vertsArray); - } - - // //////////////////////////////////////////////////////////////// - // Set up Hexahedron faces - const int nFaces = 6; - const int edgeConnectivity[][4] = { - {0,1,2,3}, {0,5,8,4}, {1,6,9,5}, - {2,7,10,6}, {3,7,11,4}, {8,9,10,11} - }; - const bool isEdgeFlipped[][4] = { - {0,0,0,1}, {0,0,1,1}, {0,0,1,1}, - {0,0,1,1}, {0,0,1,1}, {0,0,0,1} - }; - - // Populate the list of faces - QuadGeomSharedPtr faces[nFaces]; - for( int i = 0; i < nFaces; ++i ) { - SegGeomSharedPtr edgeArray[4]; - Orientation eorientArray[4]; - for( int j = 0; j < 4; ++j ) { - edgeArray[j] = edges[edgeConnectivity[i][j]]; - eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[i] = MemoryManager::AllocateSharedPtr(i, edgeArray, - eorientArray); - } - - - const LibUtilities::PointsKey pkey1( Qx, Qtype_x ); - const LibUtilities::PointsKey pkey2( Qy, Qtype_y ); - const LibUtilities::PointsKey pkey3( Qz, Qtype_z ); - - const LibUtilities::BasisKey bkey1( bType_x, xModes, pkey1 ); - const LibUtilities::BasisKey bkey2( bType_y, yModes, pkey2 ); - const LibUtilities::BasisKey bkey3( bType_z, zModes, pkey3 ); - - Array xMap(3); - for(int i = 0; i < 3; ++i) { - xMap[i] = MemoryManager - ::AllocateSharedPtr(bkey1, bkey2, bkey3); - } - - SpatialDomains::HexGeomSharedPtr geom - = MemoryManager::AllocateSharedPtr(faces); - geom->SetOwnData(); - - - if( bType_x_val < 10 ) { - lhe = new LocalRegions::HexExp( bkey1, bkey2, bkey3, geom ); - } - - lhe->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Hex_sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z ); - } - //---------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array phys (Qx * Qy * Qz); - Array coeffs(lhe->GetNcoeffs()); - lhe->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - lhe->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << lhe->Linf(phys, solution) << endl; - cout << "L 2 error: " << lhe->L2 (phys, solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - t[0] = 0.5; - t[1] = 0.5; - t[2] = 0.5; - - NekDouble numericSolution = lhe->PhysEvaluate(t, phys); - - solution[0] = Hex_sol( t[0], t[1], t[2], P, Q, R, - bType_x, bType_y, bType_z ); - - cout << "Solution = " << solution[0] << endl; - cout << "Numeric = " << numericSolution << endl; - cout << "Interpolation difference from actual solution at x = ( " - << t[0] << ", " << t[1] << ", " << t[2] << " ): " - << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - - - -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3 ) { - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - a = (Fx ? sin(M_PI*i*x) + cos(M_PI*i*x) : pow_loc(x,i)); - a *= (Fy ? sin(M_PI*j*y) + cos(M_PI*j*y) : pow_loc(y,j)); - a *= (Fz ? sin(M_PI*k*z) + cos(M_PI*k*z) : pow_loc(z,k)); - sol += a; - } - } - } - return sol; -} - diff --git a/library/Demos/LocalRegions/LocHexExpDemo_2.cpp b/library/Demos/LocalRegions/LocHexExpDemo_2.cpp deleted file mode 100644 index 08d6bd9324c09e2d158cfdf8750774eaa67c7284..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocHexExpDemo_2.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include - -#include -#include -#include - - -using namespace Nektar; - -/// modification to deal with exact solution. Return 1 if integer < 0 -static double pow_loc(const double val, const int i) -{ - return (i < 0)? 1.0: pow(val,i); -} - -/// Solution to excite all modes in Hex expansion. -NekDouble Hex_sol( NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3); - -/// Derivative of solution in Hex expansion. -NekDouble Hex_Diff_Sol( NekDouble x, NekDouble y, NekDouble z, - int P, int Q, int R, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3, int dir); - - -int main(int argc, char *argv[]) -{ - if(argc != 8) - { - cerr << "usage: LocHexExpDemo MeshFile nummodes0 nummodes1 nummodes2 " - "nx ny nz" << endl; - exit(1); - } - - int i; - - string in(argv[1]); - int nummodes0 = atoi(argv[2]); - int nummodes1 = atoi(argv[3]); - int nummodes2 = atoi(argv[4]); - int nquad0 = atoi(argv[5]); - int nquad1 = atoi(argv[6]); - int nquad2 = atoi(argv[7]); - int P = nummodes0 - 1; - int Q = nummodes1 - 1; - int R = nummodes2 - 1; - - int ntotquad = nquad0*nquad1*nquad2; - - SpatialDomains::MeshGraph3D graph3D; - graph3D.ReadGeometry(in); - - LibUtilities::BasisType bType = LibUtilities::eModified_A; - LibUtilities::PointsType qtype = LibUtilities::eGaussLobattoLegendre; - - const LibUtilities::PointsKey pointsKey0( nquad0, qtype ); - const LibUtilities::PointsKey pointsKey1( nquad1, qtype ); - const LibUtilities::PointsKey pointsKey2( nquad2, qtype ); - - const LibUtilities::BasisKey basisKey0( bType, nummodes0, pointsKey0 ); - const LibUtilities::BasisKey basisKey1( bType, nummodes1, pointsKey1 ); - const LibUtilities::BasisKey basisKey2( bType, nummodes2, pointsKey2 ); - - SpatialDomains::HexGeomSharedPtr geom; - if(!(geom = boost::dynamic_pointer_cast( - graph3D.GetCompositeItem(0,0)))) - { - cerr << "Could not find HexGeom in input file" << endl; - exit(1); - } - - LocalRegions::HexExpSharedPtr E = MemoryManager - ::AllocateSharedPtr(basisKey0,basisKey1,basisKey2,geom); - - Array sol( ntotquad ); - Array dx( ntotquad, 0.0 ); - Array dy( ntotquad, 0.0 ); - Array dz( ntotquad, 0.0 ); - Array diff_solution_x( ntotquad, 0.0 ); - Array diff_solution_y( ntotquad, 0.0 ); - Array diff_solution_z( ntotquad, 0.0 ); - Array derivatives( ntotquad, 0.0 ); - Array x( ntotquad ); - Array y( ntotquad ); - Array z( ntotquad ); - - E->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(i = 0; i < ntotquad; i++) - { - sol[i] = Hex_sol(x[i],y[i],z[i],P,Q,R, bType, bType, bType); - } - //---------------------------------------------- - - //---------------------------------------------- - // Define the derivative solution - for(int n = 0; n < ntotquad; ++n){ - diff_solution_x[n] = Hex_Diff_Sol( x[n], y[n], z[n], P,Q,R, - bType, bType, bType, 1); - diff_solution_y[n] = Hex_Diff_Sol( x[n], y[n], z[n], P,Q,R, - bType, bType, bType, 2); - diff_solution_z[n] = Hex_Diff_Sol( x[n], y[n], z[n], P,Q,R, - bType, bType, bType, 3); - } - //--------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(E->GetNcoeffs()); - Array phys (ntotquad); - E->FwdTrans( sol, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - E->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << E->Linf(phys, sol) << endl; - cout << "L 2 error: " << E->L2 (phys, sol) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - NekDouble exact_sol = 0.0; - - exact_sol = Hex_sol( t[0], t[1], t[2], nummodes0, nummodes1, nummodes2, - bType, bType, bType); - - NekDouble numericSolution = E->PhysEvaluate(t, phys); - cout << "Numeric solution = " << numericSolution << endl; - cout << "Exact solution = " << exact_sol << endl; - cout << "Difference at x = ( " - << t[0] << ", " << t[1] << ", " << t[2] << " ): " - << numericSolution - exact_sol << endl; - //------------------------------------------- - - E->PhysDeriv( sol, dx, dy, dz); - - double error_x = 0, error_y=0, error_z=0; - - for( int n = 0; n < ntotquad; ++n ) { - error_x += fabs(diff_solution_x[n] - dx[n]); - error_y += fabs(diff_solution_y[n] - dy[n]); - error_z += fabs(diff_solution_z[n] - dz[n]); - } - - cout << "L 1 error of derivatives X = " << error_x << endl; - cout << "L 1 error of derivatives Y = " << error_y << endl; - cout << "L 1 error of derivatives Z = " << error_z << endl; - - return 0; -} - - - -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3) -{ - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - a = (Fx ? sin(M_PI*i*x) + cos(M_PI*i*x) : pow_loc(x,i)); - a *= (Fy ? sin(M_PI*j*y) + cos(M_PI*j*y) : pow_loc(y,j)); - a *= (Fz ? sin(M_PI*k*z) + cos(M_PI*k*z) : pow_loc(z,k)); - sol += a; - } - } - } - return sol; -} - - -NekDouble Hex_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3, int dir){ - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - switch (dir) - { - case 1: - a = i*(Fx ? M_PI*(cos(M_PI*i*x) - sin(M_PI*i*x)) - : pow_loc(x,i-1)); - a *= (Fy ? (sin(M_PI*j*y) + cos(M_PI*j*y)) : pow_loc(y,j)); - a *= (Fz ? (sin(M_PI*k*z) + cos(M_PI*k*z)) : pow_loc(z,k)); - sol += a; - break; - case 2: - a = (Fx ? (sin(M_PI*i*x) + cos(M_PI*i*x)) : pow_loc(x,i)); - a *= j*(Fy ? M_PI*(cos(M_PI*j*y) - sin(M_PI*j*y)) - : pow_loc(y,j-1)); - a *= (Fz ? (sin(M_PI*k*z) + cos(M_PI*k*z)) : pow_loc(z,k)); - sol += a; - break; - case 3: - a = (Fx ? (sin(M_PI*i*x) + cos(M_PI*i*x)) : pow_loc(x,i)); - a *= (Fy ? (sin(M_PI*j*y) + cos(M_PI*j*y)) : pow_loc(y,j)); - a *= k*(Fz ? M_PI*(cos(M_PI*k*z) - sin(M_PI*k*z)) - : pow_loc(z,k-1)); - sol += a; - break; - } - } - } - } - return sol; -} - diff --git a/library/Demos/LocalRegions/LocPrismExpDemo.cpp b/library/Demos/LocalRegions/LocPrismExpDemo.cpp deleted file mode 100644 index b47ed0cd6710e935e0372b0d1685117b9afb1ed8..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocPrismExpDemo.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include - - -using namespace std; - - -using namespace Nektar; - - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3, - LibUtilities::BasisType bType_x, LibUtilities::BasisType bType_y, LibUtilities::BasisType bType_z); - -// using namespace boost; -using namespace Nektar::LibUtilities; -using namespace Nektar::LocalRegions; -using namespace Nektar::StdRegions; -using namespace Nektar::SpatialDomains; - - -int main(int argc, char *argv[]) - { - if( argc != 10 ) { - cerr << "Usage: PrismDemo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an integer value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 4 4 5 3 3 3 5 5 5" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::ePrism; - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::ePrism) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - const int three = 3; - - Array solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha1Beta0; - - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - StdRegions::StdExpansion3D *lpr = 0; - - if( regionShape == LibUtilities::ePrism ) - { - // ////////////////////////////////////////////////////// - // Set up Prism vertex coordinates - - const int nVerts = 6; - const double point[][3] = { - {0,0,0}, {1,0,0}, {1,1,0}, - {0,1,0}, {0,0,1}, {0,1,1} - }; - - // //////////////////////////////////////////////////////////////////////////////////// - // Populate the list of verts - // PointGeom (const int coordim, const int vid, double x, double y, double z) - PointGeomSharedPtr verts[6]; - for(int i=0; i < nVerts; ++i){ - verts[i] = MemoryManager:: - AllocateSharedPtr( three, i, point[i][0], point[i][1], point[i][2] ); - } - - - // ///////////////////////////////////////////////////////////////////// - // Set up Prism Edges - // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) - - const int nEdges = 9; - const int vertexConnectivity[][2] = { - {0,1}, {1,2}, {3,2}, {0,3}, {0,4}, - {1,4}, {2,5}, {3,5}, {4,5} - }; - - - // Populate the list of edges - SegGeomSharedPtr edges[nEdges]; - for(int i=0; i < nEdges; ++i){ - PointGeomSharedPtr vertsArray[2]; - for(int j=0; j<2; ++j){ - vertsArray[j] = verts[vertexConnectivity[i][j]]; - } - edges[i] = MemoryManager::AllocateSharedPtr(i, three, vertsArray); - } - - // ////////////////////////////////////////////////////////////// - // Set up Prism faces - const int nFaces = 5; - //quad-edge connectivity base-face0, vertical-quadface2, vertical-quadface4 - const int quadEdgeConnectivity[][4] = { {0,1,2,3}, {1,6,8,5}, {3,7,8,4} }; - const bool isQuadEdgeFlipped[][4] = { {0,0,1,1}, {0,0,1,1}, {0,0,1,1} }; - // QuadId ordered as 0, 1, 2, otherwise return false - const int quadId[] = { 0,-1,1,-1,2 }; - - //triangle-edge connectivity side-triface-1, side triface-3 - const int triEdgeConnectivity[][3] = { {0,5,4}, {2,6,7} }; - const bool isTriEdgeFlipped[][3] = { {0,0,1}, {0,0,1} }; - // TriId ordered as 0, 1, otherwise return false - const int triId[] = { -1,0,-1,1,-1 }; - - // Populate the list of faces - Geometry2DSharedPtr faces[nFaces]; - for(int f = 0; f < nFaces; ++f){ - if(f == 1 || f == 3) { - int i = triId[f]; - SegGeomSharedPtr edgeArray[3]; - Orientation eorientArray[3]; - for(int j = 0; j < 3; ++j){ - edgeArray[j] = edges[triEdgeConnectivity[i][j]]; - eorientArray[j] = isTriEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[f] = MemoryManager::AllocateSharedPtr(f, edgeArray, eorientArray); - } - else { - int i = quadId[f]; - SegGeomSharedPtr edgeArray[4]; - Orientation eorientArray[4]; - for(int j=0; j < 4; ++j){ - edgeArray[j] = edges[quadEdgeConnectivity[i][j]]; - eorientArray[j] = isQuadEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[f] = MemoryManager::AllocateSharedPtr(f, edgeArray, eorientArray); - } - } - - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - Array xMap(3); - for(int i=0; i < 3; ++i){ - xMap[i] = MemoryManager::AllocateSharedPtr(basisKey_x, basisKey_y, basisKey_z); - - } - - SpatialDomains::PrismGeomSharedPtr geom = MemoryManager::AllocateSharedPtr(faces); - geom->SetOwnData(); - - - if( bType_x_val < 10 ) { - lpr = new LocalRegions::PrismExp( basisKey_x, basisKey_y, basisKey_z, geom ); - } else { - cerr << "Implement the NodalTetExp!!!!!!" << endl; - //lpr = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - lpr->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Prism_sol( x[n], y[n], z[n], P, Q, R, bType_x, bType_y, bType_z ); - } - //---------------------------------------------- - } - - //--------------------------------------------- - // Project onto Expansion - Array phys (Qx * Qy * Qz); - Array coeffs(lpr->GetNcoeffs()); - lpr->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - lpr->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << lpr->Linf(phys, solution) << endl; - cout << "L 2 error: " << lpr->L2 (phys, solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at mid point and print error - Array t = Array(3); - t[0] = 0.5; - t[1] = 0.5; - t[2] = 0.2; - - if( regionShape == LibUtilities::ePrism ) - { - solution[0] = Prism_sol( t[0], t[1], t[2], P, Q, R, bType_x, bType_y, bType_z ); - } - - NekDouble numericSolution = lpr->PhysEvaluate(t, phys); - cout << "Interpolation difference from actual solution at x = ( " << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z ) -{ - - NekDouble sol = 0; - - // case 1 -- Common case - if( (bType_x != LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier) ) - { - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q; ++q) { - for(int r = 0; r <= R - p; ++r) { - sol += pow(x,p) * pow(y,q) * pow(z,r); - } - } - } - } else // case 2 - if((bType_x != LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z == LibUtilities::eFourier)) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R/2; ++k) { - sol += pow(x,i) * pow(y,j) * sin(M_PI*k*z) + pow(x,i) * pow(y,j) * cos(M_PI*k*z); - } - } - } - }else // case 3 - if((bType_x == LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier)) - { - for(int i = 0; i <= P/2; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += sin(M_PI*i*x)* pow(y,j) * pow(z,k) + cos(M_PI*i*x)* pow(y,j) * pow(z,k); - } - } - } - } - else // case 4 - if((bType_x != LibUtilities::eFourier) && (bType_y == LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier)) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q/2; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += pow(x,i)*sin(M_PI*j*y)*pow(z,k) + pow(x,i)*cos(M_PI*j*y)*pow(z,k); - } - } - } - } - - return sol; -} - diff --git a/library/Demos/LocalRegions/LocPrismExpDemo_2.cpp b/library/Demos/LocalRegions/LocPrismExpDemo_2.cpp deleted file mode 100644 index d0de002a30905f70141470431e4f07c934e49843..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocPrismExpDemo_2.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include - -#include -#include -#include - -using namespace Nektar; - - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3); -NekDouble Prism_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z ); - -int main(int argc, char *argv[]) -{ - if(argc != 5) - { - cerr << "usage: LocPrismExpDemo MeshFile nummodes0 nummodes1 nummodes2" << endl; - exit(1); - } - - int i; - - string in(argv[1]); - int nummodes0 = atoi(argv[2]); - int nummodes1 = atoi(argv[3]); - int nummodes2 = atoi(argv[4]); - - int nquad0 = nummodes0 + 1; - int nquad1 = nummodes1 + 1; - int nquad2 = nummodes2 + 1; - int ntotquad = nquad0*nquad1*nquad2; - - SpatialDomains::MeshGraph3D graph3D; - graph3D.ReadGeometry(in); - - LibUtilities::BasisType bTypeX = LibUtilities::eModified_A; - LibUtilities::BasisType bTypeY = LibUtilities::eModified_A; - LibUtilities::BasisType bTypeZ = LibUtilities::eModified_B; - - LibUtilities::PointsType qtypeX = LibUtilities::eGaussLobattoLegendre; - LibUtilities::PointsType qtypeY = LibUtilities::eGaussLobattoLegendre; - LibUtilities::PointsType qtypeZ = LibUtilities::eGaussRadauMAlpha1Beta0; - - const LibUtilities::PointsKey pointsKey0( nquad0, qtypeX ); - const LibUtilities::PointsKey pointsKey1( nquad1, qtypeY ); - const LibUtilities::PointsKey pointsKey2( nquad2, qtypeZ ); - - const LibUtilities::BasisKey basisKey0( bTypeX, nummodes0, pointsKey0 ); - const LibUtilities::BasisKey basisKey1( bTypeY, nummodes1, pointsKey1 ); - const LibUtilities::BasisKey basisKey2( bTypeZ, nummodes2, pointsKey2 ); - - SpatialDomains::PrismGeomSharedPtr geom; - if(!(geom = boost::dynamic_pointer_cast(graph3D.GetCompositeItem(0,0)))) - { - cerr << "Could not find PrismGeom in input file" << endl; - exit(1); - } - - LocalRegions::PrismExpSharedPtr E = MemoryManager:: - AllocateSharedPtr(basisKey0,basisKey1,basisKey2,geom); - - - Array x(ntotquad); - Array y(ntotquad); - Array z(ntotquad); - E->GetCoords(x,y,z); - - Array sol(ntotquad); - //---------------------------------------------- - // Define solution to be projected - for(i = 0; i < ntotquad; i++) - { - sol[i] = Prism_sol(x[i],y[i],z[i],nummodes0,nummodes1,nummodes2); - } - //---------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(E->GetNcoeffs()); - Array phys (ntotquad); - E->FwdTrans( sol, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - E->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << E->Linf(phys, sol) << endl; - cout << "L 2 error: " << E->L2 (phys, sol) << endl; - //-------------------------------------------- - return 0; -} - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int nummodes1, int nummodes2, int nummodes3) -{ - NekDouble sol = 0; - - for(int i = 0; i < nummodes1; ++i) - { - for(int j = 0; j < nummodes2; ++j) - { - for(int k = 0; k < nummodes3; ++k) - { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} - -NekDouble Prism_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z ) -{ - - NekDouble sol = 0; - - // case 1 -- Common case - if( (bType_x != LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier) ) - { - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q; ++q) { - for(int r = 0; r <= R - p; ++r) { - sol += pow(x,p) * pow(y,q) * pow(z,r); - } - } - } - } else // case 2 - if((bType_x != LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z == LibUtilities::eFourier)) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R/2; ++k) { - sol += pow(x,i) * pow(y,j) * sin(M_PI*k*z) + pow(x,i) * pow(y,j) * cos(M_PI*k*z); - } - } - } - }else // case 3 - if((bType_x == LibUtilities::eFourier) && (bType_y != LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier)) - { - for(int i = 0; i <= P/2; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += sin(M_PI*i*x)* pow(y,j) * pow(z,k) + cos(M_PI*i*x)* pow(y,j) * pow(z,k); - } - } - } - } - else // case 4 - if((bType_x != LibUtilities::eFourier) && (bType_y == LibUtilities::eFourier) && (bType_z != LibUtilities::eFourier)) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q/2; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += pow(x,i)*sin(M_PI*j*y)*pow(z,k) + pow(x,i)*cos(M_PI*j*y)*pow(z,k); - } - } - } - } - - return sol; -} - - diff --git a/library/Demos/LocalRegions/LocProject3D.cpp b/library/Demos/LocalRegions/LocProject3D.cpp index 1554db7dc5317d9c4ea789b7b5371504ac9aae06..b15eab5c5ccd391b6bb39475f4143ef8ba4e3d70 100644 --- a/library/Demos/LocalRegions/LocProject3D.cpp +++ b/library/Demos/LocalRegions/LocProject3D.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,9 @@ SpatialDomains::HexGeomSharedPtr CreateHexGeom(int argc, char *argv[]); /// Generates a Hex geometry based on the command-line parameters. SpatialDomains::PrismGeomSharedPtr CreatePrismGeom(int argc, char *argv[]); +/// Generates a Pyramid geometry based on the command-line parameters. +SpatialDomains::PyrGeomSharedPtr CreatePyrGeom(int argc, char *argv[]); + /// Generates a Tet geometry based on the command-line parameters. SpatialDomains::TetGeomSharedPtr CreateTetGeom(int argc, char *argv[]); @@ -48,7 +52,6 @@ static double pow_loc(const double val, const int i) return (i < 0)? 1.0: pow(val,i); } - /// This routine projects a polynomial or trigonmetric functions which /// has energy in all modes of the expansions and reports and error int main(int argc, char *argv[]){ @@ -70,6 +73,7 @@ int main(int argc, char *argv[]){ fprintf(stderr,"Where RegionShape is an integer value which " "dictates the region shape:\n"); fprintf(stderr,"\t Tetrahedron = 5\n"); + fprintf(stderr,"\t Pyramid = 6\n"); fprintf(stderr,"\t Prism = 7\n"); fprintf(stderr,"\t Hexahedron = 8\n"); @@ -95,6 +99,7 @@ int main(int argc, char *argv[]){ // Check to see if 3D region if (regionshape != LibUtilities::eTetrahedron && + regionshape != LibUtilities::ePyramid && regionshape != LibUtilities::ePrism && regionshape != LibUtilities::eHexahedron) { @@ -134,6 +139,29 @@ int main(int argc, char *argv[]){ "or Modified_B"); } break; + case LibUtilities::ePyramid: + if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) + || (btype1 == eModified_B) || (btype1 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 1 cannot be of type Ortho_B, Ortho_C, Modified_B " + "or Modified_C"); + } + if((btype2 == eOrtho_B) || (btype2 == eOrtho_C) + || (btype2 == eModified_B) || (btype2 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 2 cannot be of type Ortho_B, Ortho_C, Modified_B " + "or Modified_C"); + } + if((btype3 == eOrtho_A) || (btype3 == eOrtho_B) + || (btype3 == eModified_A) || (btype3 == eModified_B)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 3 cannot be of type Ortho_A, Ortho_B, Modified_A " + "or Modified_B"); + } + break; case LibUtilities::ePrism: if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) || (btype1 == eModified_B) || (btype1 == eModified_C)) @@ -219,7 +247,8 @@ int main(int argc, char *argv[]){ if(btype3 != LibUtilities::eFourier) { - if (regionshape == LibUtilities::eTetrahedron) + if (regionshape == LibUtilities::eTetrahedron || + regionshape == LibUtilities::ePyramid) { Qtype3 = LibUtilities::eGaussRadauMAlpha2Beta0; } @@ -267,6 +296,21 @@ int main(int argc, char *argv[]){ //---------------------------------------------- } break; + case LibUtilities::ePyramid: + { + SpatialDomains::PyrGeomSharedPtr geom = CreatePyrGeom(argc, argv); + E = new LocalRegions::PyrExp(Bkey1, Bkey2, Bkey3, geom); + E->GetCoords(x,y,z); + + //---------------------------------------------- + // Define solution to be projected (same as tetrahedron space) + for(i = 0; i < nq1*nq2*nq3; ++i) + { + sol[i] = Tet_sol(x[i],y[i],z[i],order1,order2,order3); + } + //---------------------------------------------- + } + break; case LibUtilities::ePrism: { SpatialDomains::PrismGeomSharedPtr geom = CreatePrismGeom(argc, argv); @@ -592,6 +636,112 @@ SpatialDomains::PrismGeomSharedPtr CreatePrismGeom(int argc, char *argv[]) return geom; } +SpatialDomains::PyrGeomSharedPtr CreatePyrGeom(int argc, char *argv[]) +{ + if (argc != 26) + { + cout << "Insufficient points for a pyramid!" << endl; + } + + // ///////////////////////////////////////////////////////////////////// + // Set up Pyramid vertex coordinates + // PointGeom (const int coordim, const int vid, double x, + // double y, double z) + const int nVerts = 6; + const double point[][3] = { + {atof(argv[11]),atof(argv[12]),atof(argv[13])}, + {atof(argv[14]),atof(argv[15]),atof(argv[16])}, + {atof(argv[17]),atof(argv[18]),atof(argv[19])}, + {atof(argv[20]),atof(argv[21]),atof(argv[22])}, + {atof(argv[23]),atof(argv[24]),atof(argv[25])} + }; + + // Populate the list of verts + PointGeomSharedPtr verts[nVerts]; + const int three = 3; + + for( int i = 0; i < nVerts; ++i ) { + verts[i] = MemoryManager + ::AllocateSharedPtr( three, i, point[i][0], + point[i][1], point[i][2] ); + } + + // ///////////////////////////////////////////////////////////////////// + // Set up Pyramid Edges + // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) + const int nEdges = 8; + const int vertexConnectivity[][2] = { + {0,1}, {1,2}, {3,2}, {0,3}, + {0,4}, {1,4}, {2,4}, {3,4} + }; + + // Populate the list of edges + SegGeomSharedPtr edges[nEdges]; + for( int i = 0; i < nEdges; ++i ) { + PointGeomSharedPtr vertsArray[2]; + for( int j = 0; j < 2; ++j ) { + vertsArray[j] = verts[vertexConnectivity[i][j]]; + } + edges[i] = MemoryManager + ::AllocateSharedPtr( i, three, vertsArray); + } + + // //////////////////////////////////////////////////////////////////// + // Set up Pyramid faces + const int nFaces = 5; + const int edgeConnectivity[][4] = { + {0,1,2,3}, + {0,5,4,-1}, // Triangular face + {1,6,5,-1}, // Triangular face + {2,6,7,-1}, // Triangular face + {3,7,4,-1} // Triangular face + }; + const bool isEdgeFlipped[][4] = { + {0,0,1,1}, + {0,0,1,0}, + {0,0,1,0}, + {0,0,1,0}, + {0,0,1,0} + }; + + // Populate the list of faces + Geometry2DSharedPtr faces[5]; + + for (int i = 0; i < nFaces; ++i) { + if (i > 0) + { + SegGeomSharedPtr edgeArray[3]; + Orientation eorientArray[3]; + + for (int j = 0; j < 3; ++j) { + edgeArray[j] = edges[edgeConnectivity[i][j]]; + eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; + } + + faces[i] = MemoryManager + ::AllocateSharedPtr( i, edgeArray, eorientArray); + } + else + { + SegGeomSharedPtr edgeArray[4]; + Orientation eorientArray[4]; + + for (int j = 0; j < 4; ++j) { + edgeArray[j] = edges[edgeConnectivity[i][j]]; + eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; + } + faces[i] = MemoryManager + ::AllocateSharedPtr( i, edgeArray, eorientArray); + } + } + + SpatialDomains::PyrGeomSharedPtr geom = + MemoryManager::AllocateSharedPtr(faces); + geom->SetOwnData(); + + return geom; +} + SpatialDomains::TetGeomSharedPtr CreateTetGeom(int argc, char *argv[]) { if (argc != 23) diff --git a/library/Demos/LocalRegions/LocProject_Diff3D.cpp b/library/Demos/LocalRegions/LocProject_Diff3D.cpp index 02e1f54e7a2e8bd75a269230e19554bc0e8bb805..375dfd41c41ae469ad959a8e8f18057b6c526a6f 100644 --- a/library/Demos/LocalRegions/LocProject_Diff3D.cpp +++ b/library/Demos/LocalRegions/LocProject_Diff3D.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -54,6 +55,9 @@ SpatialDomains::HexGeomSharedPtr CreateHexGeom(int argc, char *argv[]); /// Creates a Prism geometry based on the command-line parameters. SpatialDomains::PrismGeomSharedPtr CreatePrismGeom(int argc, char *argv[]); +/// Generates a Pyramid geometry based on the command-line parameters. +SpatialDomains::PyrGeomSharedPtr CreatePyrGeom(int argc, char *argv[]); + /// Creates a Tet geometry based on the command-line parameters. SpatialDomains::TetGeomSharedPtr CreateTetGeom(int argc, char *argv[]); @@ -86,6 +90,7 @@ int main(int argc, char *argv[]){ fprintf(stderr,"Where RegionShape is an integer value which " "dictates the region shape:\n"); fprintf(stderr,"\t Tetrahedron = 5\n"); + fprintf(stderr,"\t Pyramid = 6\n"); fprintf(stderr,"\t Prism = 7\n"); fprintf(stderr,"\t Hexahedron = 8\n"); @@ -110,6 +115,7 @@ int main(int argc, char *argv[]){ // Check to see if 3D region if (regionshape != LibUtilities::eTetrahedron && + regionshape != LibUtilities::ePyramid && regionshape != LibUtilities::ePrism && regionshape != LibUtilities::eHexahedron) { @@ -150,6 +156,29 @@ int main(int argc, char *argv[]){ "Ortho_B, Modified_A or Modified_B"); } break; + case LibUtilities::ePyramid: + if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) + || (btype1 == eModified_B) || (btype1 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 1 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype2 == eOrtho_B) || (btype2 == eOrtho_C) + || (btype2 == eModified_B) || (btype2 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 2 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype3 == eOrtho_A) || (btype3 == eOrtho_B) + || (btype3 == eModified_A) || (btype3 == eModified_B)) + { + NEKERROR(ErrorUtil::efatal, + "Basis 3 cannot be of type Ortho_A, " + "Ortho_B, Modified_A or Modified_B"); + } + break; case LibUtilities::ePrism: if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) || (btype1 == eModified_B) || (btype1 == eModified_C)) @@ -234,7 +263,8 @@ int main(int argc, char *argv[]){ if(btype3 != LibUtilities::eFourier) { - if (regionshape == LibUtilities::eTetrahedron) + if (regionshape == LibUtilities::eTetrahedron || + regionshape == LibUtilities::ePyramid) { Qtype3 = LibUtilities::eGaussRadauMAlpha2Beta0; } @@ -283,6 +313,29 @@ int main(int argc, char *argv[]){ //---------------------------------------------- } break; + case LibUtilities::ePyramid: + { + const LibUtilities::PointsKey Pkey1(nq1,Qtype1); + const LibUtilities::PointsKey Pkey2(nq2,Qtype2); + const LibUtilities::PointsKey Pkey3(nq3,Qtype3); + const LibUtilities::BasisKey Bkey1(btype1,order1,Pkey1); + const LibUtilities::BasisKey Bkey2(btype2,order2,Pkey2); + const LibUtilities::BasisKey Bkey3(btype3,order3,Pkey3); + + SpatialDomains::PyrGeomSharedPtr geom = CreatePyrGeom(argc, argv); + E = new LocalRegions::PyrExp(Bkey1, Bkey2, Bkey3, geom); + + E->GetCoords(x,y,z); + + //---------------------------------------------- + // Define solution to be projected + for(i = 0; i < nq1*nq2*nq3; ++i) + { + sol[i] = Tet_sol(x[i],y[i],z[i],order1,order2,order3); + } + //---------------------------------------------- + } + break; case LibUtilities::ePrism: { const LibUtilities::PointsKey Pkey1(nq1,Qtype1); @@ -359,6 +412,7 @@ int main(int argc, char *argv[]){ switch(regionshape) { case LibUtilities::eTetrahedron: + case LibUtilities::ePyramid: { for(i = 0; i < nq1*nq2*nq3; ++i) { @@ -757,6 +811,111 @@ SpatialDomains::PrismGeomSharedPtr CreatePrismGeom(int argc, char *argv[]) return geom; } +SpatialDomains::PyrGeomSharedPtr CreatePyrGeom(int argc, char *argv[]) +{ + if (argc != 26) + { + cout << "Insufficient points for a pyramid!" << endl; + } + + // ///////////////////////////////////////////////////////////////////// + // Set up Pyramid vertex coordinates + // PointGeom (const int coordim, const int vid, double x, + // double y, double z) + const int nVerts = 6; + const double point[][3] = { + {atof(argv[11]),atof(argv[12]),atof(argv[13])}, + {atof(argv[14]),atof(argv[15]),atof(argv[16])}, + {atof(argv[17]),atof(argv[18]),atof(argv[19])}, + {atof(argv[20]),atof(argv[21]),atof(argv[22])}, + {atof(argv[23]),atof(argv[24]),atof(argv[25])} + }; + + // Populate the list of verts + PointGeomSharedPtr verts[nVerts]; + const int three = 3; + + for( int i = 0; i < nVerts; ++i ) { + verts[i] = MemoryManager + ::AllocateSharedPtr( three, i, point[i][0], + point[i][1], point[i][2] ); + } + + // ///////////////////////////////////////////////////////////////////// + // Set up Pyramid Edges + // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) + const int nEdges = 8; + const int vertexConnectivity[][2] = { + {0,1}, {1,2}, {3,2}, {0,3}, + {0,4}, {1,4}, {2,4}, {3,4} + }; + + // Populate the list of edges + SegGeomSharedPtr edges[nEdges]; + for( int i = 0; i < nEdges; ++i ) { + PointGeomSharedPtr vertsArray[2]; + for( int j = 0; j < 2; ++j ) { + vertsArray[j] = verts[vertexConnectivity[i][j]]; + } + edges[i] = MemoryManager + ::AllocateSharedPtr( i, three, vertsArray); + } + + // //////////////////////////////////////////////////////////////////// + // Set up Pyramid faces + const int nFaces = 5; + const int edgeConnectivity[][4] = { + {0,1,2,3}, + {0,5,4,-1}, // Triangular face + {1,6,5,-1}, // Triangular face + {2,6,7,-1}, // Triangular face + {3,7,4,-1} // Triangular face + }; + const bool isEdgeFlipped[][4] = { + {0,0,1,1}, + {0,0,1,0}, + {0,0,1,0}, + {0,0,1,0}, + {0,0,1,0} + }; + + // Populate the list of faces + Geometry2DSharedPtr faces[5]; + + for (int i = 0; i < nFaces; ++i) { + if (i > 0) + { + SegGeomSharedPtr edgeArray[3]; + Orientation eorientArray[3]; + + for (int j = 0; j < 3; ++j) { + edgeArray[j] = edges[edgeConnectivity[i][j]]; + eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; + } + + faces[i] = MemoryManager + ::AllocateSharedPtr( i, edgeArray, eorientArray); + } + else + { + SegGeomSharedPtr edgeArray[4]; + Orientation eorientArray[4]; + + for (int j = 0; j < 4; ++j) { + edgeArray[j] = edges[edgeConnectivity[i][j]]; + eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; + } + faces[i] = MemoryManager + ::AllocateSharedPtr( i, edgeArray, eorientArray); + } + } + + SpatialDomains::PyrGeomSharedPtr geom = + MemoryManager::AllocateSharedPtr(faces); + geom->SetOwnData(); + + return geom; +} SpatialDomains::TetGeomSharedPtr CreateTetGeom(int argc, char *argv[]) { diff --git a/library/Demos/LocalRegions/LocPyrExpDemo.cpp b/library/Demos/LocalRegions/LocPyrExpDemo.cpp deleted file mode 100644 index 036371455e28bbfae4723b89f21a5c0f85bfd222..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocPyrExpDemo.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include -#include - -#include -#include - -#include -#include -#include - - -#include -#include -#include -#include -#include -#include - - -using namespace std; - - -using namespace Nektar; - - -NekDouble Pyr_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3); - -// using namespace boost; -using namespace Nektar::LibUtilities; -using namespace Nektar::LocalRegions; -using namespace Nektar::StdRegions; -using namespace Nektar::SpatialDomains; - - -int main(int argc, char *argv[]) - { - if( argc != 10 ) { - cerr << "Usage: PyramidDemo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an integer value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 4 4 4 3 3 3 5 5 5" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::ePyramid; - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::ePyramid ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - const int three = 3; - - Array solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion3D *lpe = 0; - - if( regionShape == LibUtilities::ePyramid ) - { - // ////////////////////////////////////////////////////// - // Set up Prism vertex coordinates - - const int nVerts = 5; - const double point[][3] = { - {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, {0,0,1} - }; - - // //////////////////////////////////////////////////////////////////////////////////// - // Populate the list of verts - // PointGeom (const int coordim, const int vid, double x, double y, double z) - PointGeomSharedPtr verts[5]; - for(int i=0; i < nVerts; ++i){ - verts[i] = MemoryManager:: - AllocateSharedPtr( three, i, point[i][0], point[i][1], point[i][2] ); - } - - - // ///////////////////////////////////////////////////////////////////// - // Set up Pyramid Edges - // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) - - const int nEdges = 8; - const int vertexConnectivity[][2] = { - {0,1},{1,2},{2,3},{0,3},{0,4}, - {1,4},{2,4},{3,4} - }; - - - // Populate the list of edges - SegGeomSharedPtr edges[nEdges]; - for(int i=0; i < nEdges; ++i){ - PointGeomSharedPtr vertsArray[2]; - for(int j=0; j<2; ++j){ - vertsArray[j] = verts[vertexConnectivity[i][j]]; - } - edges[i] = MemoryManager::AllocateSharedPtr(i, three, vertsArray); - } - - // ////////////////////////////////////////////////////////////// - // Set up Prism faces - const int nFaces = 5; - //quad-edge connectivity base-face0, vertical-quadface2, vertical-quadface4 - const int quadEdgeConnectivity[][4] = { {0,1,2,3} }; - const bool isQuadEdgeFlipped[][4] = { {0,0,1,1} }; - // QuadId ordered as 0, 1, 2, otherwise return false - const int quadId[] = { 0,-1,-1,-1,-1 }; - - //triangle-edge connectivity side-triface-1, side triface-3 - const int triEdgeConnectivity[][3] = { {0,5,4}, {1,6,5}, {2,7,6}, {3,7,4} }; - const bool isTriEdgeFlipped[][3] = { {0,0,1}, {0,0,1}, {1,0,1}, {0,0,1} }; - // TriId ordered as 0, 1, otherwise return false - const int triId[] = { -1,0,1,2,3 }; - - // Populate the list of faces - Geometry2DSharedPtr faces[nFaces]; - for(int f = 0; f < nFaces; ++f){ - cout << "f = " << f << endl; - if(f==0){ - int i = quadId[f]; - SegGeomSharedPtr edgeArray[4]; - Orientation eorientArray[4]; - for(int j=0; j < 4; ++j){ - edgeArray[j] = edges[quadEdgeConnectivity[i][j]]; - eorientArray[j] = isQuadEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[f] = MemoryManager::AllocateSharedPtr(f, edgeArray, eorientArray); - cout << "quad faces[" << f << "] = " << faces[f] << endl; - } - else { - int i = triId[f]; - SegGeomSharedPtr edgeArray[3]; - Orientation eorientArray[3]; - for(int j=0; j < 3; ++j){ - edgeArray[j] = edges[triEdgeConnectivity[i][j]]; - eorientArray[j] = isTriEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[f] = MemoryManager::AllocateSharedPtr(f, edgeArray, eorientArray); - cout << "tri faces[" << f << "] = " << faces[f] << endl; - - } - - cout << "faces[" << f << "] = " << faces[f] << endl; - for(int k = 0; k < faces[f]->GetNumEdges(); ++k) { - cout << "faces[" << f << "]->GetEid(" << k << ") = " << faces[f]->GetEid(k) << endl; - } - } - - - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - Array xMap(3); - for(int i=0; i < 3; ++i){ - xMap[i] = MemoryManager::AllocateSharedPtr(basisKey_x, basisKey_y, basisKey_z); - - } - - SpatialDomains::PyrGeomSharedPtr geom = - MemoryManager::AllocateSharedPtr(faces); - geom->SetOwnData(); - - - if( bType_x_val < 10 ) - { - lpe = new LocalRegions::PyrExp( basisKey_x, basisKey_y, basisKey_z, geom ); - } - else - { - cerr << "Implement the NodalTetExp!!!!!!" << endl; - //lpe = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - lpe->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Pyr_sol( x[n], y[n], z[n], P, Q, R ); - } - //---------------------------------------------- - } - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(lpe->GetNcoeffs()); - Array phys (Qx * Qy * Qz); - lpe->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - lpe->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << lpe->Linf(phys, solution) << endl; - cout << "L 2 error: " << lpe->L2 (phys, solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - - if( regionShape == LibUtilities::ePyramid ) - { - solution[0] = Pyr_sol( t[0], t[1], t[2], P, Q, R ); - } - - NekDouble numericSolution = lpe->PhysEvaluate(t, phys); - cout << "Interpolation difference from actual solution at x = ( " << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - -NekDouble Pyr_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q ; ++q) { - for(int r = 0; r <= R - p - q; ++r) { - sol += pow(x,p) * pow(y,q) * pow(z,r); - } - } - } - - return sol; -} - diff --git a/library/Demos/LocalRegions/LocPyrExpDemo_2.cpp b/library/Demos/LocalRegions/LocPyrExpDemo_2.cpp deleted file mode 100644 index 3004d366de4c44b4766e526da3659fa5503d311f..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocPyrExpDemo_2.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include - -#include -#include - -using namespace Nektar; - - -NekDouble Pyr_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3); -NekDouble Pyramid_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R); - -int main(int argc, char *argv[]) -{ - if(argc != 5) - { - cerr << "usage: LocPyrExpDemo MeshFile nummodes0 nummodes1 nummodes2" << endl; - exit(1); - } - - int i; - - string in(argv[1]); - int nummodes0 = atoi(argv[2]); - int nummodes1 = atoi(argv[3]); - int nummodes2 = atoi(argv[4]); - - int nquad0 = nummodes0 + 1; - int nquad1 = nummodes1 + 1; - int nquad2 = nummodes2 + 1; - int ntotquad = nquad0*nquad1*nquad2; - - SpatialDomains::MeshGraph3D graph3D; - graph3D.ReadGeometry(in); - - LibUtilities::BasisType bTypeX = LibUtilities::eModified_A; - LibUtilities::BasisType bTypeY = LibUtilities::eModified_A; - LibUtilities::BasisType bTypeZ = LibUtilities::eModified_C; - - LibUtilities::PointsType qtypeX = LibUtilities::eGaussLobattoLegendre; - LibUtilities::PointsType qtypeY = LibUtilities::eGaussLobattoLegendre; - LibUtilities::PointsType qtypeZ = LibUtilities::eGaussRadauMAlpha2Beta0; - - const LibUtilities::PointsKey pointsKey0( nquad0, qtypeX ); - const LibUtilities::PointsKey pointsKey1( nquad1, qtypeY ); - const LibUtilities::PointsKey pointsKey2( nquad2, qtypeZ ); - - const LibUtilities::BasisKey basisKey0( bTypeX, nummodes0, pointsKey0 ); - const LibUtilities::BasisKey basisKey1( bTypeY, nummodes1, pointsKey1 ); - const LibUtilities::BasisKey basisKey2( bTypeZ, nummodes2, pointsKey2 ); - - SpatialDomains::PyrGeomSharedPtr geom; - if(!(geom = boost::dynamic_pointer_cast(graph3D.GetCompositeItem(0,0)))) - { - cerr << "Could not find PyrGeom in input file" << endl; - exit(1); - } - - LocalRegions::PyrExpSharedPtr E = MemoryManager:: - AllocateSharedPtr(basisKey0,basisKey1,basisKey2,geom); - - - Array x(ntotquad); - Array y(ntotquad); - Array z(ntotquad); - E->GetCoords(x,y,z); - - Array sol(ntotquad); - //---------------------------------------------- - // Define solution to be projected - for(i = 0; i < ntotquad; i++) - { - sol[i] = Pyr_sol(x[i],y[i],z[i],nummodes0,nummodes1,nummodes2); - } - //---------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(E->GetNcoeffs()); - Array phys (ntotquad); - E->FwdTrans( sol, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - E->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << E->Linf(phys, sol) << endl; - cout << "L 2 error: " << E->L2 (phys, sol) << endl; - //-------------------------------------------- - return 0; -} - -NekDouble Pyr_sol(NekDouble x, NekDouble y, NekDouble z, int nummodes1, int nummodes2, int nummodes3) -{ - NekDouble sol = 0; - - for(int i = 0; i < nummodes1; ++i) - { - for(int j = 0; j < nummodes2; ++j) - { - for(int k = 0; k < nummodes3; ++k) - { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} - -NekDouble Pyramid_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q ; ++q) { - for(int r = 0; r <= R - p - q; ++r) { - sol += pow(x,p) * pow(y,q) * pow(z,r); - } - } - } - - return sol; -} diff --git a/library/Demos/LocalRegions/LocTetExpDemo.cpp b/library/Demos/LocalRegions/LocTetExpDemo.cpp deleted file mode 100644 index faeef5f5ff74712c2560349e7025fd712ba9cbf9..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocTetExpDemo.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -// using namespace boost; - -using namespace Nektar; -using namespace Nektar::LibUtilities; -using namespace Nektar::LocalRegions; -using namespace Nektar::StdRegions; -using namespace Nektar::SpatialDomains; -using namespace std; - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R); - -int main(int argc, char *argv[]) -{ - if( argc != 10 ) { - cerr << "Usage: TetDemo Type_x Type_y Type_z numModes_x numModes_y " - "numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an integer value which dictates the basis as:" - << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points" - " on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 4 4 4 3 3 3 5 5 5" - << endl << endl; - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::eTetrahedron; - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - BasisType bType_x = static_cast( bType_x_val ); - BasisType bType_y = static_cast( bType_y_val ); - BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - if( (bType_x == eOrtho_B) || (bType_x == eModified_B) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == eOrtho_C) || (bType_x == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == eOrtho_C) || (bType_y == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - const int three = 3; - - Array solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussRadauMAlpha1Beta0; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion3D *lte = 0; - - const int nVerts = 4; - const double point[][3] = { - {0,0,0}, {1,0,0}, {0,1,0}, {0,0,1} - }; - - // ////////////////////////////////////////////////////////////////////// - // Populate the list of verts - // PointGeom (const int coordim, const int vid, double x, double y, - // double z) - PointGeomSharedPtr verts[4]; - for(int i=0; i < nVerts; ++i){ - verts[i] = MemoryManager:: - AllocateSharedPtr( three, i, point[i][0], point[i][1], point[i][2] ); - } - - // ///////////////////////////////////////////////////////////////////// - // Set up Tetrahedron Edges - // SegGeom (int id, const int coordim), EdgeComponent(id, coordim) - const int nEdges = 6; - const int vertexConnectivity[][2] = { - {0,1},{1,2},{0,2},{0,3},{1,3},{2,3} - }; - - // Populate the list of edges - SegGeomSharedPtr edges[nEdges]; - for(int i=0; i < nEdges; ++i){ - PointGeomSharedPtr vertsArray[2]; - for(int j=0; j<2; ++j){ - vertsArray[j] = verts[vertexConnectivity[i][j]]; - } - edges[i] = MemoryManager - ::AllocateSharedPtr(i, three, vertsArray); - } - - // ////////////////////////////////////////////////////////////////////// - // Set up Tetrahedron faces - const int nFaces = 4; - const int edgeConnectivity[][3] = { - {0,1,2}, {0,4,3}, {1,5,4}, {2,5,3} - }; - const bool isEdgeFlipped[][3] = { - {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1} - }; - - // Populate the list of faces - TriGeomSharedPtr faces[nFaces]; - for(int i=0; i < nFaces; ++i) - { - SegGeomSharedPtr edgeArray[3]; - Orientation eorientArray[3]; - for(int j=0; j < 3; ++j) - { - edgeArray[j] = edges[edgeConnectivity[i][j]]; - eorientArray[j] = isEdgeFlipped[i][j] ? eBackwards : eForwards; - } - faces[i] = MemoryManager - ::AllocateSharedPtr(i, edgeArray, eorientArray); - } - - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - Array xMap(3); - for(int i=0; i < 3; ++i) - { - xMap[i] = MemoryManager - ::AllocateSharedPtr(basisKey_x, basisKey_y, basisKey_z); - } - - SpatialDomains::TetGeomSharedPtr geom = - MemoryManager::AllocateSharedPtr(faces); - geom->SetOwnData(); - - if( bType_x_val < 10 ) - { - lte = new LocalRegions::TetExp( basisKey_x, basisKey_y, - basisKey_z, geom ); - } - else - { - cerr << "Implement the NodalTetExp!!!!!!" << endl; - //lte = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, - // basisKey_z, NodalType ); - exit(1); - } - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - lte->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Tet_sol( x[n], y[n], z[n], P, Q, R ); - } - //---------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(lte->GetNcoeffs()); - Array phys (Qx * Qy * Qz); - lte->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - lte->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << lte->Linf(phys, solution) << endl; - cout << "L 2 error: " << lte->L2 (phys, solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - if( regionShape == LibUtilities::eTetrahedron ) - { - solution[0] = Tet_sol( t[0], t[1], t[2], P, Q, R ); - } - - t[0] = -0.0; - t[1] = -1.0; - t[2] = -1.0; - NekDouble numericSolution = lte->PhysEvaluate(t, phys); - cout << "Numeric Solution: " << numericSolution << endl; - cout << "Actual Solution: " << solution[0] << endl; - cout << "Interpolation difference from actual solution at x = ( " - << t[0] << ", " << t[1] << ", " << t[2] << " ): " - << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q - j; ++j) { - for(int k = 0; k <= R - i - j; ++k) { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} - diff --git a/library/Demos/LocalRegions/LocTetExpDemo_2.cpp b/library/Demos/LocalRegions/LocTetExpDemo_2.cpp deleted file mode 100644 index 14297b962b2c26d42122338149bd64db4239d760..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/LocTetExpDemo_2.cpp +++ /dev/null @@ -1,133 +0,0 @@ -#include - -#include -#include - -using namespace Nektar; - -/// Defines a solution which excites all modes in the Tet expansion. -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3); - -/// Defines another solution which excites all modes in the Tet expansion. -NekDouble Tet_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R); - - -int main(int argc, char *argv[]) -{ - if(argc != 8) - { - cerr << "usage: LocTetExpDemo MeshFile nummodes0 nummodes1 nummodes2 " - "nx ny nz" << endl; - exit(1); - } - - int i; - - string in(argv[1]); - int nummodes0 = atoi(argv[2]); - int nummodes1 = atoi(argv[3]); - int nummodes2 = atoi(argv[4]); - int nquad0 = atoi(argv[5]); - int nquad1 = atoi(argv[6]); - int nquad2 = atoi(argv[7]); - int ntotquad = nquad0*nquad1*nquad2; - - SpatialDomains::MeshGraph3D graph3D; - graph3D.ReadGeometry(in); - - LibUtilities::BasisType bTypeX = LibUtilities::eModified_A; - LibUtilities::BasisType bTypeY = LibUtilities::eModified_B; - LibUtilities::BasisType bTypeZ = LibUtilities::eModified_C; - - LibUtilities::PointsType qtypeX = LibUtilities::eGaussLobattoLegendre; - LibUtilities::PointsType qtypeY = LibUtilities::eGaussRadauMAlpha1Beta0; - LibUtilities::PointsType qtypeZ = LibUtilities::eGaussRadauMAlpha2Beta0; - - const LibUtilities::PointsKey pointsKey0( nquad0, qtypeX ); - const LibUtilities::PointsKey pointsKey1( nquad1, qtypeY ); - const LibUtilities::PointsKey pointsKey2( nquad2, qtypeZ ); - - const LibUtilities::BasisKey basisKey0( bTypeX, nummodes0, pointsKey0 ); - const LibUtilities::BasisKey basisKey1( bTypeY, nummodes1, pointsKey1 ); - const LibUtilities::BasisKey basisKey2( bTypeZ, nummodes2, pointsKey2 ); - - SpatialDomains::TetGeomSharedPtr geom; - if(!(geom = boost::dynamic_pointer_cast( - graph3D.GetCompositeItem(0,0)))) - { - cerr << "Could not find TetGeom in input file" << endl; - exit(1); - } - - LocalRegions::TetExpSharedPtr E = MemoryManager - ::AllocateSharedPtr(basisKey0,basisKey1,basisKey2,geom); - - Array x(ntotquad); - Array y(ntotquad); - Array z(ntotquad); - E->GetCoords(x,y,z); - - Array sol(ntotquad); - //---------------------------------------------- - // Define solution to be projected - for(i = 0; i < ntotquad; i++) - { - sol[i] = Tet_sol(x[i],y[i],z[i],nummodes0,nummodes1,nummodes2); - } - //---------------------------------------------- - - //--------------------------------------------- - // Project onto Expansion - Array coeffs(E->GetNcoeffs()); - Array phys (ntotquad); - E->FwdTrans( sol, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - E->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << E->Linf(phys, sol) << endl; - cout << "L 2 error: " << E->L2 (phys, sol) << endl; - //-------------------------------------------- - return 0; -} - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, - int nummodes1, int nummodes2, int nummodes3) -{ - NekDouble sol = 0; - - for(int i = 0; i < nummodes1; ++i) - { - for(int j = 0; j < nummodes2; ++j) - { - for(int k = 0; k < nummodes3; ++k) - { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} - - -NekDouble Tet_sol2(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q - j; ++j) { - for(int k = 0; k <= R - i - j; ++k) { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} diff --git a/library/Demos/LocalRegions/Makefile.am b/library/Demos/LocalRegions/Makefile.am deleted file mode 100644 index 02f421da842c105f7cdc5ac2851f8b5ff296cb51..0000000000000000000000000000000000000000 --- a/library/Demos/LocalRegions/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ - -bin_PROGRAMS = Project1D Project2D - -Project1D_SOURCES = Project1D.cpp -Project2D_SOURCES = Project2D.cpp - -Project1D_CPPFLAGS = -I$(srcdir)/../.. -Project2D_CPPFLAGS = -I$(srcdir)/../.. - diff --git a/library/Demos/LocalRegions/Tests/LocProject3D_Pyr_Mod_Basis_P6_Q7.tst b/library/Demos/LocalRegions/Tests/LocProject3D_Pyr_Mod_Basis_P6_Q7.tst new file mode 100644 index 0000000000000000000000000000000000000000..040db54843ae6246ff0f9c39e4da06e637f85179 --- /dev/null +++ b/library/Demos/LocalRegions/Tests/LocProject3D_Pyr_Mod_Basis_P6_Q7.tst @@ -0,0 +1,14 @@ + + + Project3D Pyramid Modified basis P=6 Q=7 + LocProject3D + 6 4 4 6 6 6 6 7 7 6 0 0 0 1 0 0 1 1 0 0 1 0 0.5 0.5 0.866 + + + 1.80317e-12 + + + 1.20881e-11 + + + diff --git a/library/Demos/LocalRegions/Tests/LocProject_Diff3D_Reg_Pyr_Mod_Basis_P6_Q7.tst b/library/Demos/LocalRegions/Tests/LocProject_Diff3D_Reg_Pyr_Mod_Basis_P6_Q7.tst new file mode 100644 index 0000000000000000000000000000000000000000..5ff49b8884dec428ec628418b1074e2967a2b513 --- /dev/null +++ b/library/Demos/LocalRegions/Tests/LocProject_Diff3D_Reg_Pyr_Mod_Basis_P6_Q7.tst @@ -0,0 +1,14 @@ + + + LocProject_Diff3D Reg. Prism Modified Basis, P=6, Q=7 + LocProject_Diff3D + 6 4 4 6 6 6 6 7 7 6 0 0 0 1 0 0 1 1 0 0 1 0 0.5 0 1 0.5 0.5 0.866 + + + 5.9107e-12 + + + 3.81348e-11 + + + diff --git a/library/Demos/MultiRegions/CMakeLists.txt b/library/Demos/MultiRegions/CMakeLists.txt index 593b9812df97a56ff3b7409fe869c13c90fca364..88109b8d8e05d91156534121bdda75ce761f6102 100644 --- a/library/Demos/MultiRegions/CMakeLists.txt +++ b/library/Demos/MultiRegions/CMakeLists.txt @@ -125,6 +125,8 @@ ADD_NEKTAR_TEST(Helmholtz3D_CG_Tet) ADD_NEKTAR_TEST(Helmholtz3D_CG_Prism) ADD_NEKTAR_TEST(Helmholtz3D_CG_Prism_iter_ml) ADD_NEKTAR_TEST(Helmholtz3D_CG_Prism_Deformed) +ADD_NEKTAR_TEST(Helmholtz3D_CG_Pyr) +ADD_NEKTAR_TEST(Helmholtz3D_CG_Pyr_Deformed) ADD_NEKTAR_TEST(Helmholtz3D_CG_Homo1D) ADD_NEKTAR_TEST_LENGTHY(Helmholtz3D_HDG_Homo1D) ADD_NEKTAR_TEST(Helmholtz3D_HDG_Prism) diff --git a/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr.tst b/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr.tst new file mode 100644 index 0000000000000000000000000000000000000000..04cc5f8d442718cba7e9d41f415f6da59acd5489 --- /dev/null +++ b/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr.tst @@ -0,0 +1,17 @@ + + + Helmholtz 3D CG for Pyramid + Helmholtz3D + Helmholtz3D_Pyr.xml + + Helmholtz3D_Pyr.xml + + + + 5.36868e-07 + + + 3.78881e-06 + + + diff --git a/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr_Deformed.tst b/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr_Deformed.tst new file mode 100644 index 0000000000000000000000000000000000000000..32be290469a0232c609dcb842c63524f6fae25c8 --- /dev/null +++ b/library/Demos/MultiRegions/Tests/Helmholtz3D_CG_Pyr_Deformed.tst @@ -0,0 +1,17 @@ + + + Helmholtz 3D CG for Pyramid (deformed) + Helmholtz3D + Helmholtz3D_Pyr_Deformed.xml + + Helmholtz3D_Pyr_Deformed.xml + + + + 2.76145e-05 + + + 0.000161114 + + + diff --git a/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr.xml b/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr.xml new file mode 100644 index 0000000000000000000000000000000000000000..f5a7179ae48b64572ee37db1c2f61f21d391264c --- /dev/null +++ b/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr.xml @@ -0,0 +1,106 @@ + + + + + + + +

Lambda = 1

+
+ + + u + + + + C[1-6] + + + + + + + + + + + + + + + +
+ + + 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.00000000e+00 1.00000000e+00 0.00000000e+00 + 0.00000000e+00 1.00000000e+00 0.00000000e+00 + 5.00000000e-01 5.00000000e-01 5.00000000e-01 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 + 1.00000000e+00 0.00000000e+00 1.00000000e+00 + 1.00000000e+00 1.00000000e+00 1.00000000e+00 + 0.00000000e+00 1.00000000e+00 1.00000000e+00 + + + 0 1 + 1 2 + 3 2 + 0 3 + 0 4 + 1 4 + 2 4 + 3 4 + 0 5 + 5 6 + 1 6 + 5 4 + 6 4 + 6 7 + 2 7 + 7 4 + 7 8 + 3 8 + 8 4 + 8 5 + + + 0 1 2 3 + 0 5 4 + 1 6 5 + 2 6 7 + 3 7 4 + 8 9 10 0 + 8 11 4 + 9 12 11 + 10 12 5 + 10 13 14 1 + 13 15 12 + 14 15 6 + 14 16 17 2 + 16 18 15 + 17 18 7 + 17 19 8 3 + 19 11 18 + 19 16 13 9 + + +

0 1 2 3 4

+

5 6 7 8 1

+

9 8 10 11 2

+

12 11 13 14 3

+

15 14 16 6 4

+

17 16 13 10 7

+
+ + P[0-5] + F[0] + F[5] + F[9] + F[12] + F[15] + F[17] + + C[0] +
+
diff --git a/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr_Deformed.xml b/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr_Deformed.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb773b83e9f0ae801c610f1084a6322e4641a1dd --- /dev/null +++ b/library/Demos/MultiRegions/Tests/Helmholtz3D_Pyr_Deformed.xml @@ -0,0 +1,70 @@ + + + + + + + +

Lambda = 1

+
+ + + u + + + + C[1] + + + + + + + + + + + + + + + +
+ + + 0.0 0.0 0.0 + 1.0 0.0 0.0 + 1.0 1.0 0.0 + 0.0 1.0 0.0 + 0.5 0.5 1.0 + + + 0 1 + 1 2 + 3 2 + 0 3 + 0 4 + 1 4 + 2 4 + 3 4 + + + 0 1 2 3 + 0 5 4 + 1 6 5 + 2 6 7 + 3 7 4 + + +

0 1 2 3 4

+
+ + P[0] + F[0-4] + + + 0 0 0 0.5 -0.1 -0.3 1 0 0 + + C[0] +
+
diff --git a/library/Demos/StdRegions/CMakeLists.txt b/library/Demos/StdRegions/CMakeLists.txt index 0264fb9505bb0e5ad74d2e7035c174cb0b1092da..eb74b030e0e62383103ddf35bf313fd3d3a75afe 100644 --- a/library/Demos/StdRegions/CMakeLists.txt +++ b/library/Demos/StdRegions/CMakeLists.txt @@ -38,47 +38,6 @@ ADD_NEKTAR_EXECUTABLE(StdProject_Diff3D demos StdProject_Diff3DSource) TARGET_LINK_LIBRARIES(StdProject_Diff3D ${LinkLibraries}) SET_LAPACK_LINK_LIBRARIES(StdProject_Diff3D) -SET(StdTetExpDemoSource StdTetExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(StdTetExpDemo demos StdTetExpDemoSource) -TARGET_LINK_LIBRARIES(StdTetExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdTetExpDemo) - -SET(StdHexExpDemoSource StdHexExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(StdHexExpDemo demos StdHexExpDemoSource) -TARGET_LINK_LIBRARIES(StdHexExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdHexExpDemo) - -SET(StdTetExp_Diff3DSource StdTetExp_Diff3D.cpp) -ADD_NEKTAR_EXECUTABLE(StdTetExp_Diff3D demos StdTetExp_Diff3DSource) -TARGET_LINK_LIBRARIES(StdTetExp_Diff3D ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdTetExp_Diff3D) - -SET(StdHexExp_Diff3DSource StdHexExp_Diff3D.cpp) -ADD_NEKTAR_EXECUTABLE(StdHexExp_Diff3D demos StdHexExp_Diff3DSource) -TARGET_LINK_LIBRARIES(StdHexExp_Diff3D ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdHexExp_Diff3D) - - -SET(StdPrismExpDemoSource StdPrismExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(StdPrismExpDemo demos StdPrismExpDemoSource) -TARGET_LINK_LIBRARIES(StdPrismExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdPrismExpDemo) - -SET(StdPrismExp_Diff3DSource StdPrismExp_Diff3D.cpp) -ADD_NEKTAR_EXECUTABLE(StdPrismExp_Diff3D demos StdPrismExp_Diff3DSource) -TARGET_LINK_LIBRARIES(StdPrismExp_Diff3D ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdPrismExp_Diff3D) - -SET(StdPyrExpDemoSource StdPyrExpDemo.cpp) -ADD_NEKTAR_EXECUTABLE(StdPyrExpDemo demos StdPyrExpDemoSource) -TARGET_LINK_LIBRARIES(StdPyrExpDemo ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdPyrExpDemo) - -SET(StdPyrExp_Diff3DSource StdPyrExp_Diff3D.cpp) -ADD_NEKTAR_EXECUTABLE(StdPyrExp_Diff3D demos StdPyrExp_Diff3DSource) -TARGET_LINK_LIBRARIES(StdPyrExp_Diff3D ${LinkLibraries}) -SET_LAPACK_LINK_LIBRARIES(StdPyrExp_Diff3D) - # Generate list of available subdirectories FILE(GLOB dir_list "*") LIST(REMOVE_ITEM dir_list "${CMAKE_SOURCE_DIR}/.svn") @@ -88,7 +47,6 @@ FOREACH(dir ${dir_list}) ENDIF(IS_DIRECTORY ${dir} AND EXISTS ${dir}/CMakeLists.txt) ENDFOREACH(dir ${dir_list}) - ADD_NEKTAR_TEST(StdProject1D_Seg_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject1D_Seg_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject1D_Single_Mode_Fourier_P2_Q2) @@ -113,6 +71,7 @@ ADD_NEKTAR_TEST(StdProject3D_Tet_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Tet_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Prism_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Prism_Mod_P6_Q7) +ADD_NEKTAR_TEST(StdProject3D_Pyr_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Hex_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Hex_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject3D_Hex_Lagrange_P6_Q7) @@ -122,8 +81,9 @@ ADD_NEKTAR_TEST(StdProject_Diff3D_Tet_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Tet_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Prism_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Prism_Mod_P6_Q7) +ADD_NEKTAR_TEST(StdProject_Diff3D_Pyr_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Orth_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Mod_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Lagrange_P6_Q7) ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Legendre_P6_Q7) -ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Chebyshev_P6_Q7) \ No newline at end of file +ADD_NEKTAR_TEST(StdProject_Diff3D_Hex_Chebyshev_P6_Q7) diff --git a/library/Demos/StdRegions/StdHexExpDemo.cpp b/library/Demos/StdRegions/StdHexExpDemo.cpp deleted file mode 100644 index e2cf710606db8df8c54627695e73c5d6a22efd20..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdHexExpDemo.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include -using namespace std; - -#include -#include -#include -#include -#include - -using namespace Nektar; -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - -/// Defines a solution which excites all modes in a StdHex expansion. -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z); - -/// modification to deal with exact solution. Return 1 if integer < 0 -static double pow_loc(const double val, const int i) -{ - return (i < 0)? 1.0: pow(val,i); -} - -/// This routine projects a polynomial or trigonmetric functions which -/// has energy in all mdoes of the expansions and reports and error -int main(int argc, char *argv[]) { - if( argc != 10 ) { - cerr << "Usage: HexDemo Type_x Type_y Type_z numModes_x numModes_y " - << "numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" - << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 2 3 3 3 3 5 5 5" - << endl << endl; - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::eHexahedron; - - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - BasisType bType_x = static_cast( bType_x_val ); - BasisType bType_y = static_cast( bType_y_val ); - BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x == eOrtho_B) || (bType_x == eModified_B) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == eOrtho_C) || (bType_x == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == eOrtho_C) || (bType_y == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1; - int Q = yModes - 1; - int R = zModes - 1; - - LibUtilities::PointsType Qtype_x, Qtype_y, Qtype_z; - Array x( Qx * Qy * Qz ); - Array y( Qx * Qy * Qz ); - Array z( Qx * Qy * Qz ); - Array solution( Qx * Qy * Qz ); - Array diff_solution( Qx * Qy * Qz ); - - if(bType_x != LibUtilities::eFourier) - { - Qtype_x = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_x = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_y != LibUtilities::eFourier) - { - Qtype_y = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_y = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_z != LibUtilities::eFourier) - { - Qtype_z = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_z = LibUtilities::eFourierEvenlySpaced; - } - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion *she; - - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - she = new StdRegions::StdHexExp( basisKey_x, basisKey_y, basisKey_z ); - - she->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Hex_sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z ); - } - //---------------------------------------------- - - Array phys (Qx*Qy*Qz); - Array coeffs(xModes*yModes*zModes); - - - //--------------------------------------------- - // Project onto Expansion - she->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - she->BwdTrans(coeffs, phys); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << she->Linf(phys,solution) << endl; - cout << "L 2 error: " << she->L2 (phys,solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - - if( regionShape == LibUtilities::eHexahedron ) { - solution[0] = Hex_sol( t[0], t[1], t[2], P, Q, R, - bType_x, bType_y, bType_z ); - } - - NekDouble numericSolution = she->PhysEvaluate(t,phys); - cout << "Interpolation difference from actual solution at x = ( " - << t[0] << ", " << t[1] << ", " << t[2] << " ): " - << numericSolution - solution[0] << endl; - //------------------------------------------- - cout << "numericSolution = " << numericSolution << endl; - cout << "exact solution = " << solution[0] << endl; - - return 0; -} - - -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3 ) { - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - a = (Fx ? sin(M_PI*i*x) + cos(M_PI*i*x) : pow_loc(x,i)); - a *= (Fy ? sin(M_PI*j*y) + cos(M_PI*j*y) : pow_loc(y,j)); - a *= (Fz ? sin(M_PI*k*z) + cos(M_PI*k*z) : pow_loc(z,k)); - sol += a; - } - } - } - return sol; -} - - diff --git a/library/Demos/StdRegions/StdHexExp_Diff3D.cpp b/library/Demos/StdRegions/StdHexExp_Diff3D.cpp deleted file mode 100644 index 3437b040773757aa4fda5760256f8c749d86d240..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdHexExp_Diff3D.cpp +++ /dev/null @@ -1,306 +0,0 @@ -#include -#include -#include -using namespace std; - -#include -#include -#include -#include -#include - -using namespace Nektar; - -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - -/// Defines a solution which excites all modes in a Hex expansion. -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z); - -/// Derivative of solution on Hex expansion. -NekDouble Hex_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, - int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z, int dir); - -/// modification to deal with exact solution. Return 1 if integer < 0 -static double pow_loc(const double val, const int i) -{ - return (i < 0)? 1.0: pow(val,i); -} - - -/// This routine projects a polynomial or trigonmetric functions which -/// has energy in all mdoes of the expansions and reports and error -int main(int argc, char *argv[]) { - if( argc != 10 ) { - cerr << "Usage: HexDemo Type_x Type_y Type_z numModes_x numModes_y " - "numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" - << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 2 3 3 3 3 5 5 5" - << endl << endl; - exit(1); - } - - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - BasisType bType_x = static_cast( bType_x_val ); - BasisType bType_y = static_cast( bType_y_val ); - BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x == eOrtho_B) || (bType_x == eModified_B) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == eOrtho_C) || (bType_x == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == eOrtho_C) || (bType_y == eModified_C) ) { - NEKERROR(ErrorUtil::efatal, - "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1; - int Q = yModes - 1; - int R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - Array dx(Qx*Qy*Qz,0.0); - Array dy(Qx*Qy*Qz,0.0); - Array dz(Qx*Qy*Qz,0.0); - Array diff_solution_x( Qx * Qy * Qz, 0.0 ); - Array diff_solution_y( Qx * Qy * Qz, 0.0 ); - Array diff_solution_z( Qx * Qy * Qz, 0.0 ); - Array derivatives( Qx * Qy * Qz, 0.0 ); - - LibUtilities::PointsType Qtype_x, Qtype_y, Qtype_z; - Array x( Qx * Qy * Qz ); - Array y( Qx * Qy * Qz ); - Array z( Qx * Qy * Qz ); - - if(bType_x != LibUtilities::eFourier) - { - Qtype_x = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_x = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_y != LibUtilities::eFourier) - { - Qtype_y = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_y = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_z != LibUtilities::eFourier) - { - Qtype_z = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_z = LibUtilities::eFourierEvenlySpaced; - } - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - StdRegions::StdExpansion *she; - - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - she = new StdRegions::StdHexExp( basisKey_x, basisKey_y, basisKey_z ); - - she->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Hex_sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z ); - } - //---------------------------------------------- - - //---------------------------------------------- - // Define the derivative solution - for(int n = 0; n < Qx*Qy*Qz; ++n){ - diff_solution_x[n] = Hex_Diff_Sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z, 1); - diff_solution_y[n] = Hex_Diff_Sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z, 2); - diff_solution_z[n] = Hex_Diff_Sol( x[n], y[n], z[n], P, Q, R, - bType_x, bType_y, bType_z, 3); - } - //--------------------------------------------- - - Array phys (Qx*Qy*Qz); - Array coeffs(xModes*yModes*zModes); - - //--------------------------------------------- - // Project onto Expansion - she->FwdTrans( solution, coeffs); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - she->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << she->Linf(phys,solution) << endl; - cout << "L 2 error: " << she->L2 (phys,solution) << endl; - //-------------------------------------------- - - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - solution[0] = Hex_sol( t[0], t[1], t[2], P, Q, R, - bType_x, bType_y, bType_z ); - - NekDouble numericSolution = she->PhysEvaluate(t,phys); - cout << "Interpolation difference from actual solution at x = ( " - << t[0] << ", " << t[1] << ", " << t[2] << " ): " - << numericSolution - solution[0] << endl; - cout << "numericSolution = " << numericSolution << endl; - cout << "exact solution = " << solution[0] << endl; - //------------------------------------------- - - //-------------------------------------------- - // Taking the physical derivative and putting them into dx, dy, dz. - she->PhysDeriv( phys, dx, dy, dz ); - //-------------------------------------------- - - double error_x = 0, error_y=0, error_z=0; - - for( int n = 0; n < Qx*Qy*Qz; ++n ) - { - error_x += fabs(diff_solution_x[n] - dx[n]); - error_y += fabs(diff_solution_y[n] - dy[n]); - error_z += fabs(diff_solution_z[n] - dz[n]); - } - - cout << "L 1 error of derivatives X = " << error_x << endl; - cout << "L 1 error of derivatives Y = " << error_y << endl; - cout << "L 1 error of derivatives Z = " << error_z << endl; - - return 0; -} - - -NekDouble Hex_sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3 ) -{ - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - a = (Fx ? sin(M_PI*i*x) + cos(M_PI*i*x) : pow_loc(x,i)); - a *= (Fy ? sin(M_PI*j*y) + cos(M_PI*j*y) : pow_loc(y,j)); - a *= (Fz ? sin(M_PI*k*z) + cos(M_PI*k*z) : pow_loc(z,k)); - sol += a; - } - } - } - return sol; -} - - -NekDouble Hex_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, - int order1, int order2, int order3, - LibUtilities::BasisType btype1, - LibUtilities::BasisType btype2, - LibUtilities::BasisType btype3, int dir) -{ - int i,j,k; - NekDouble sol = 0.0; - - int Nx = (btype1 == LibUtilities::eFourier ? order1/2 : order1); - int Ny = (btype2 == LibUtilities::eFourier ? order2/2 : order2); - int Nz = (btype3 == LibUtilities::eFourier ? order3/2 : order3); - bool Fx = (btype1 == LibUtilities::eFourier); - bool Fy = (btype2 == LibUtilities::eFourier); - bool Fz = (btype3 == LibUtilities::eFourier); - NekDouble a; - - for (i = 0; i < Nx; ++i) - { - for (j = 0; j < Ny; ++j) - { - for (k = 0; k < Nz; ++k) - { - a = i*(Fx ? M_PI*(cos(M_PI*i*x) - sin(M_PI*i*x)) - : pow_loc(x,i-1)); - a *= (Fy ? (sin(M_PI*j*y) + cos(M_PI*j*y)) : pow_loc(y,j)); - a *= (Fz ? (sin(M_PI*k*z) + cos(M_PI*k*z)) : pow_loc(z,k)); - sol += a; - a = (Fx ? (sin(M_PI*i*x) + cos(M_PI*i*x)) : pow_loc(x,i)); - a *= j*(Fy ? M_PI*(cos(M_PI*j*y) - sin(M_PI*j*y)) - : pow_loc(y,j-1)); - a *= (Fz ? (sin(M_PI*k*z) + cos(M_PI*k*z)) : pow_loc(z,k)); - sol += a; - a = (Fx ? (sin(M_PI*i*x) + cos(M_PI*i*x)) : pow_loc(x,i)); - a *= (Fy ? (sin(M_PI*j*y) + cos(M_PI*j*y)) : pow_loc(y,j)); - a *= k*(Fz ? M_PI*(cos(M_PI*k*z) - sin(M_PI*k*z)) - : pow_loc(z,k-1)); - sol += a; - } - } - } - return sol; -} - diff --git a/library/Demos/StdRegions/StdPrismExpDemo.cpp b/library/Demos/StdRegions/StdPrismExpDemo.cpp deleted file mode 100644 index cd4c2a086c49c90edf6e495a67d95db71eaf7551..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdPrismExpDemo.cpp +++ /dev/null @@ -1,266 +0,0 @@ - -#include -#include -#include -#include - - -#include -#include -#include -#include -using namespace std; -using namespace Nektar; - - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3, - LibUtilities::BasisType bType_x, LibUtilities::BasisType bType_y, LibUtilities::BasisType bType_z); - -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - - -int main(int argc, char *argv[]) { - if( argc != 10 ) { - cerr << "Usage: StdPrismExpDemo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 1 2 3 3 3 5 5 5" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::ePrism; - - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::ePrism ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - Array diff_solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x, Qtype_y, Qtype_z; - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - if(bType_x != LibUtilities::eFourier) - { - Qtype_x = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_x = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_y != LibUtilities::eFourier) - { - Qtype_y = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_y = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_z != LibUtilities::eFourier) - { - Qtype_z = LibUtilities::eGaussRadauMAlpha1Beta0; - } - else - { - Qtype_z = LibUtilities::eFourierEvenlySpaced; - } - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion *spe = NULL; - - if( regionShape == LibUtilities::ePrism ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 10 ) { - spe = new StdRegions::StdPrismExp( basisKey_x, basisKey_y, basisKey_z ); - } else { - cerr << "Implement the next line!!!!!!" << endl; - //spe = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - spe->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Prism_sol( x[n], y[n], z[n], P, Q, R, bType_x, bType_y, bType_z ); - - } - //---------------------------------------------- - - } - - Array phys (Qx*Qy*Qz); - Array coeffs(xModes*yModes*zModes); - - //--------------------------------------------- - // Project onto Expansion - spe->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - spe->BwdTrans( coeffs, phys ); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "\n*****************************************************\n " << endl; - cout << "L infinity error: " << spe->Linf(phys,solution) << endl; - cout << "L 2 error: " << spe->L2 (phys,solution) << endl; - cout << "\n*****************************************************\n " << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - - if(regionShape == LibUtilities::ePrism ) { - solution[0] = Prism_sol( t[0], t[1], t[2], P, Q, R, bType_x, bType_y, bType_z ); - } - - - NekDouble numericSolution = spe->PhysEvaluate(t,phys); - cout << "\n*****************************************************\n " << endl; - cout << "Interpolation difference from actual solution at x = ( " << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - cout << "numericSolution = " << numericSolution << endl; - cout << "exact solution = " << solution[0] << endl; - cout << "\n*****************************************************\n " << endl; - - // Testing the physical evaluate(u_phys): projection on to the polynomial space given by the prismatic basis function - // The result of output should converge to the interpolation solution - //Array const& u_phys = spe->GetPhys(); - Array prism_solution( Qx * Qy * Qz, 0.0 ); - cout << setprecision(4); - for(int n = 0; n < Qx * Qy * Qz; ++n) { - prism_solution[n] = Prism_sol( x[n], y[n], z[n], P, Q, R, bType_x, bType_y, bType_z ); -/* cout << "prism_solution[" << setw(2)<( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - - // Check to see that correct Expansions are used - if(regionShape == LibUtilities::ePrism ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - Array diff_solution( Qx * Qy * Qz ); - Array diff_solution_x( Qx * Qy * Qz, 0.0 ), diff_solution_y( Qx * Qy * Qz, 0.0 ), diff_solution_z( Qx * Qy * Qz, 0.0 ); - - Array dx(Qx*Qy*Qz,0.0); - Array dy(Qx*Qy*Qz,0.0); - Array dz(Qx*Qy*Qz,0.0); - - LibUtilities::PointsType Qtype_x, Qtype_y, Qtype_z; - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - if(bType_x != LibUtilities::eFourier) - { - Qtype_x = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_x = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_y != LibUtilities::eFourier) - { - Qtype_y = LibUtilities::eGaussLobattoLegendre; - } - else - { - Qtype_y = LibUtilities::eFourierEvenlySpaced; - } - - if(bType_z != LibUtilities::eFourier) - { - Qtype_z = LibUtilities::eGaussRadauMAlpha1Beta0; - } - else - { - Qtype_z = LibUtilities::eFourierEvenlySpaced; - } - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion3D *spe = NULL; - - if( regionShape == LibUtilities::ePrism ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 10 ) { - spe = new StdRegions::StdPrismExp( basisKey_x, basisKey_y, basisKey_z ); - } else { - cerr << "Implement the next line!!!!!!" << endl; - //spe = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - spe->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Prism_sol( x[n], y[n], z[n], P, Q, R, bType_x, bType_y, bType_z ); - //cout << "Prism_solution["<Linf(phys,solution) << endl; - cout << "L 2 error: " << spe->L2 (phys,solution) << endl; - cout << "\n*****************************************************\n " << endl; - //-------------------------------------------- - - - //-------------------------------------------- - // Taking the physical derivative and putting them into dx, dy, dz. - spe->PhysDeriv(phys, dx, dy, dz ); - //-------------------------------------------- - - - double error_x = 0, error_y=0, error_z=0; - - for( int n = 0; n < Qx*Qy*Qz; ++n ) { - - error_x += fabs(diff_solution_x[n] - dx[n]); - error_y += fabs(diff_solution_y[n] - dy[n]); - error_z += fabs(diff_solution_z[n] - dz[n]); - cout << "diff_solution_x[n] = " << diff_solution_x[n] << ", dx[n] = " << dx[n] << ", " << - "diff_solution_y[n] = " << diff_solution_y[n] << ", dy[n] = " << dy[n] << ", " << - "diff_solution_z[n] = " << diff_solution_z[n] << ", dz[n] = " << dz[n] << ", " << - endl; - } - - cout << "\n ******************************************** " << endl; - cout << "L 1 error of derivatives X = " << error_x << endl; - cout << "L 1 error of derivatives Y = " << error_y << endl; - cout << "L 1 error of derivatives Z = " << error_z << endl; - cout << "******************************************** \n" << endl; - //------------------------------------------- - - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - - if (regionShape == LibUtilities::ePrism) - { - diff_solution_x[0] = Prism_Diff_Sol( t[0], t[1], t[2], - P, Q, R, bType_x, bType_y, bType_z, 1 ); - } - - return 0; -} - - - -NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, - int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z ) -{ - NekDouble sol = 0; - - // case 1 -- Common non-Fourier case - if (bType_x != LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q; ++q) { - for(int r = 0; r <= R - p; ++r) { - sol += pow_loc(x,p) * pow_loc(y,q) * pow_loc(z,r); - } - } - } - } - else if (bType_x != LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z == LibUtilities::eFourier) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R/2; ++k) { - sol += pow(x,i) * pow(y,j) * sin(M_PI*k*z) + pow(x,i) * pow(y,j) * cos(M_PI*k*z); - } - } - } - } - else if (bType_x == LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int i = 0; i <= P/2; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += sin(M_PI*i*x)* pow(y,j) * pow(z,k) + cos(M_PI*i*x)* pow(y,j) * pow(z,k); - } - } - } - } - else if (bType_x != LibUtilities::eFourier && - bType_y == LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q/2; ++j) { - for(int k = 0; k <= R - i; ++k) { - sol += pow(x,i)*sin(M_PI*j*y)*pow(z,k) + pow(x,i)*cos(M_PI*j*y)*pow(z,k); - } - } - } - } - - return sol; -} - -NekDouble Prism_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, - int P, int Q, int R, - LibUtilities::BasisType bType_x, - LibUtilities::BasisType bType_y, - LibUtilities::BasisType bType_z, - int dir) -{ - NekDouble sol = 0; - - // case 1 -- Common non-Fourier case - if (bType_x != LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q; ++q) { - for(int r = 0; r <= R - p; ++r) { - if(dir == 1 && p > 0) { sol += p * pow_loc(x,p-1)* pow_loc(y,q) * pow_loc(z,r); } - if(dir == 2 && q > 0) { sol += q * pow_loc(x,p) * pow_loc(y,q-1) * pow_loc(z,r); } - if(dir == 3 && r > 0) { sol += r * pow_loc(x,p) * pow_loc(y,q) * pow_loc(z,r-1); } - } - } - } - } - else if (bType_x != LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z == LibUtilities::eFourier) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R/2; ++k) { - // sol += pow(x,i) * pow(y,j) * sin(M_PI*k*z) + pow(x,i) * pow(y,j) * cos(M_PI*k*z); - if(dir == 1 && i > 0) { sol += i * pow_loc(x,i-1)* pow_loc(y,j)* sin(M_PI*k*z) + - i * pow_loc(x,i-1)* pow_loc(y,j)* cos(M_PI*k*z); } - if(dir == 2 && j > 0) { sol += j * pow_loc(x,i) * pow_loc(y,j-1) * sin(M_PI*k*z) + - j * pow_loc(x,i) * pow_loc(y,j-1) * cos(M_PI*k*z) ; } - if(dir == 3 && k > 0) { sol += k*M_PI*pow_loc(x,i) * pow_loc(y,j) * cos(M_PI*k*z) - - k*M_PI*pow_loc(x,i) * pow_loc(y,j) * sin(M_PI*k*z); } - } - } - } - } - else if (bType_x == LibUtilities::eFourier && - bType_y != LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int i = 0; i <= P/2; ++i) { - for(int j = 0; j <= Q; ++j) { - for(int k = 0; k <= R - i; ++k) { - // sol += sin(M_PI*i*x)* pow(y,j) * pow(z,k) + cos(M_PI*i*x)* pow(y,j) * pow(z,k); - if(dir == 1 && i > 0) { sol += i * M_PI*cos(M_PI*i*x)*pow_loc(y,j)* pow_loc(z,k) - - i * M_PI*sin(M_PI*i*x)*pow_loc(y,j)* pow_loc(z,k) ; } - if(dir == 2 && j > 0) { sol += j * sin(M_PI*i*x)*pow_loc(y,j-1)* pow_loc(z,k) + - j * cos(M_PI*i*x)*pow_loc(y,j-1)* pow_loc(z,k) ; } - if(dir == 3 && k > 0) { sol += k * sin(M_PI*i*x)*pow_loc(y,j)* pow_loc(z,k-1) + - k * cos(M_PI*i*x)*pow_loc(y,j)* pow_loc(z,k-1); } - } - } - } - } - else if (bType_x != LibUtilities::eFourier && - bType_y == LibUtilities::eFourier && - bType_z != LibUtilities::eFourier) - { - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q/2; ++j) { - for(int k = 0; k <= R - i; ++k) { - // sol += pow(x,i)*sin(M_PI*j*y)*pow(z,k) + pow(x,i)*cos(M_PI*j*y)*pow(z,k); - if(dir == 1 && i > 0) { sol += i * pow_loc(x,i-1) * sin(M_PI*j*y) * pow_loc(z,k) + - i * pow_loc(x,i-1) * cos(M_PI*j*y) * pow_loc(z,k) ; } - if(dir == 2 && j > 0) { sol += j * M_PI * pow_loc(x,i) * cos(M_PI*j*y) * pow_loc(z,k) - - j * M_PI * pow_loc(x,i) * sin(M_PI*j*y) * pow_loc(z,k) ; } - if(dir == 3 && k > 0) { sol += k * pow_loc(x,i) * sin(M_PI*j*y) * pow_loc(z,k-1) + - k * pow_loc(x,i) * cos(M_PI*j*y) * pow_loc(z,k-1); } - } - } - } - } - return sol; -} - - - diff --git a/library/Demos/StdRegions/StdProject3D.cpp b/library/Demos/StdRegions/StdProject3D.cpp index d67299a03d7ecfe40c81fd91a2a09316737185d9..382492fc82e8e7317c8635eab34c1277a59124b4 100644 --- a/library/Demos/StdRegions/StdProject3D.cpp +++ b/library/Demos/StdRegions/StdProject3D.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ int main(int argc, char *argv[]){ fprintf(stderr,"Where RegionShape is an integer value which " "dictates the region shape:\n"); fprintf(stderr,"\t Tetrahedron = 5\n"); + fprintf(stderr,"\t Pyramid = 6\n"); fprintf(stderr,"\t Prism = 7\n"); fprintf(stderr,"\t Hexahedron = 8\n"); @@ -81,6 +83,7 @@ int main(int argc, char *argv[]){ // Check to see if 3D region if ((regionshape != LibUtilities::eTetrahedron) + && (regionshape != LibUtilities::ePyramid) && (regionshape != LibUtilities::ePrism) && (regionshape != LibUtilities::eHexahedron)) { @@ -157,6 +160,26 @@ int main(int argc, char *argv[]){ "Ortho_B, Modified_A or Modified_B"); } break; + case LibUtilities::ePyramid: + if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) + || (btype1 == eModified_B) || (btype1 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype2 == eOrtho_B) || (btype2 == eOrtho_C) + || (btype2 == eModified_B) || (btype2 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype3 == eOrtho_A) || (btype3 == eOrtho_B) + || (btype3 == eModified_A) || (btype3 == eModified_B)) + { + NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_A, " + "Ortho_B, Modified_A or Modified_B"); + } + break; case LibUtilities::ePrism: if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) || (btype1 == eModified_B) || (btype1 == eModified_C)) @@ -235,7 +258,8 @@ int main(int argc, char *argv[]){ if(btype3 != LibUtilities::eFourier) { - if (regionshape == LibUtilities::eTetrahedron) + if (regionshape == LibUtilities::eTetrahedron || + regionshape == LibUtilities::ePyramid) { Qtype3 = LibUtilities::eGaussRadauMAlpha2Beta0; } @@ -278,6 +302,7 @@ int main(int argc, char *argv[]){ { E = new StdRegions::StdTetExp(Bkey1,Bkey2,Bkey3); } + E->GetCoords(x,y,z); //---------------------------------------------- @@ -289,6 +314,28 @@ int main(int argc, char *argv[]){ //---------------------------------------------- } break; + case LibUtilities::ePyramid: + { + const LibUtilities::PointsKey Pkey1(nq1,Qtype1); + const LibUtilities::PointsKey Pkey2(nq2,Qtype2); + const LibUtilities::PointsKey Pkey3(nq3,Qtype3); + const LibUtilities::BasisKey Bkey1(btype1,order1,Pkey1); + const LibUtilities::BasisKey Bkey2(btype2,order2,Pkey2); + const LibUtilities::BasisKey Bkey3(btype3,order3,Pkey3); + + StdRegions::StdPyrExp *F = new StdRegions::StdPyrExp(Bkey1,Bkey2,Bkey3); + E = F; + E->GetCoords(x,y,z); + + //---------------------------------------------- + // Define solution to be projected + for(i = 0; i < nq1*nq2*nq3; ++i) + { + sol[i] = Tet_sol(x[i],y[i],z[i],order1,order2,order3); + } + //---------------------------------------------- + } + break; case LibUtilities::ePrism: { const LibUtilities::PointsKey Pkey1(nq1,Qtype1); @@ -374,7 +421,8 @@ int main(int argc, char *argv[]){ t[1] = -0.25; t[2] = -0.3; - if(regionshape == LibUtilities::eTetrahedron) + if(regionshape == LibUtilities::eTetrahedron || + regionshape == LibUtilities::ePyramid) { sol[0] = Tet_sol(t[0], t[1], t[2], order1, order2, order3); } @@ -401,7 +449,7 @@ NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3) { int l,k,m; - NekDouble sol = 0; + NekDouble sol = 0.0; for(k = 0; k < order1; ++k) { @@ -413,10 +461,10 @@ NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, } } } + return sol; } - NekDouble Prism_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3) { diff --git a/library/Demos/StdRegions/StdProject_Diff3D.cpp b/library/Demos/StdRegions/StdProject_Diff3D.cpp index 56350daac4944b42143380851c77aae4a6e2055b..de11439ffe8068befb12f2d8305df573d9e79e22 100644 --- a/library/Demos/StdRegions/StdProject_Diff3D.cpp +++ b/library/Demos/StdRegions/StdProject_Diff3D.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -72,6 +73,7 @@ int main(int argc, char *argv[]){ fprintf(stderr,"Where RegionShape is an integer value which " "dictates the region shape:\n"); fprintf(stderr,"\t Tetrahedron = 5\n"); + fprintf(stderr,"\t Pyramid = 6\n"); fprintf(stderr,"\t Prism = 7\n"); fprintf(stderr,"\t Hexahedron = 8\n"); @@ -99,6 +101,7 @@ int main(int argc, char *argv[]){ // Check to see if 3D region if (regionshape != LibUtilities::eTetrahedron && + regionshape != LibUtilities::ePyramid && regionshape != LibUtilities::ePrism && regionshape != LibUtilities::eHexahedron) { @@ -144,6 +147,26 @@ int main(int argc, char *argv[]){ "Ortho_B, Modified_A or Modified_B"); } break; + case LibUtilities::ePyramid: + if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) + || (btype1 == eModified_B) || (btype1 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype2 == eOrtho_B) || (btype2 == eOrtho_C) + || (btype2 == eModified_B) || (btype2 == eModified_C)) + { + NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_B, " + "Ortho_C, Modified_B or Modified_C"); + } + if((btype3 == eOrtho_A) || (btype3 == eOrtho_B) + || (btype3 == eModified_A) || (btype3 == eModified_B)) + { + NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_A, " + "Ortho_B, Modified_A or Modified_B"); + } + break; case LibUtilities::ePrism: if((btype1 == eOrtho_B) || (btype1 == eOrtho_C) || (btype1 == eModified_B) || (btype1 == eModified_C)) @@ -227,7 +250,8 @@ int main(int argc, char *argv[]){ if(btype3 != LibUtilities::eFourier) { - if (regionshape == LibUtilities::eTetrahedron) + if (regionshape == LibUtilities::eTetrahedron || + regionshape == LibUtilities::ePyramid) { Qtype3 = LibUtilities::eGaussRadauMAlpha2Beta0; } @@ -271,6 +295,27 @@ int main(int argc, char *argv[]){ //---------------------------------------------- } break; + case LibUtilities::ePyramid: + { + const LibUtilities::PointsKey Pkey1(nq1,Qtype1); + const LibUtilities::PointsKey Pkey2(nq2,Qtype2); + const LibUtilities::PointsKey Pkey3(nq3,Qtype3); + const LibUtilities::BasisKey Bkey1(btype1,order1,Pkey1); + const LibUtilities::BasisKey Bkey2(btype2,order2,Pkey2); + const LibUtilities::BasisKey Bkey3(btype3,order3,Pkey3); + + E = new StdRegions::StdPyrExp(Bkey1,Bkey2,Bkey3); + E->GetCoords(x,y,z); + + //---------------------------------------------- + // Define solution to be projected + for(i = 0; i < nq1*nq2*nq3; ++i) + { + sol[i] = Tet_sol(x[i],y[i],z[i],order1,order2,order3); + } + //---------------------------------------------- + } + break; case LibUtilities::ePrism: { const LibUtilities::PointsKey Pkey1(nq1,Qtype1); @@ -344,6 +389,7 @@ int main(int argc, char *argv[]){ switch(regionshape) { case LibUtilities::eTetrahedron: + case LibUtilities::ePyramid: { for(i = 0; i < nq1*nq2*nq3; ++i) { diff --git a/library/Demos/StdRegions/StdPyrExpDemo.cpp b/library/Demos/StdRegions/StdPyrExpDemo.cpp deleted file mode 100644 index 078b5e8f5274693a912ee4245d15083052b6b7b5..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdPyrExpDemo.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -using namespace std; -using namespace Nektar; - - -NekDouble Pyramid_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R); - -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - - -int main(int argc, char *argv[]) { - if( argc != 10 ) { - cerr << "Usage: Pyramid Demo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 1 3 2 2 2 5 5 5" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = ePyramid; - - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - - // Check to see that correct Expansions are used - if(regionShape == LibUtilities::ePyramid ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_z == LibUtilities::eOrtho_A) || (bType_z == LibUtilities::eModified_A) ) { - NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_A or Modified_A"); - } - if( (bType_z == LibUtilities::eOrtho_B) || (bType_z == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_B or Modified_B"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - Array diff_solution( Qx * Qy * Qz ); - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion *sPyrE = NULL; - - if(regionShape == LibUtilities::ePyramid ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 10 ) { - sPyrE = new StdRegions::StdPyrExp( basisKey_x, basisKey_y, basisKey_z ); - } else { - cerr << "Implement the next line!!!!!!" << endl; - //sPyrE = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - sPyrE->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Pyramid_sol( x[n], y[n], z[n], P, Q, R ); - //cout << "Pyramid_solution["<Linf(phys,solution) << endl; - cout << "L 2 error: " << sPyrE->L2 (phys,solution) << endl; - cout << "\n*****************************************************\n " << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.39; - t[1] = -0.25; - t[2] = 0.5; - - if(regionShape == LibUtilities::ePyramid ) { - solution[0] = Pyramid_sol( t[0], t[1], t[2], P, Q, R); - } - - - NekDouble numericSolution = sPyrE->PhysEvaluate(t,phys); - cout << "\n*****************************************************\n " << endl; - cout << "Interpolation difference from actual solution at x = ( " << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - cout << "numericSolution = " << numericSolution << endl; - cout << "exact solution = " << solution[0] << endl; - cout << "\n*****************************************************\n " << endl; - - // Testing the physical evaluate(u_phys): projection on to the polynomial space given by the prismatic basis function - // The result of output should converge to the interpolation solution - Array pyramid_solution( Qx * Qy * Qz, 0.0 ); - cout << setprecision(4); - for(int n = 0; n < Qx * Qy * Qz; ++n) { - pyramid_solution[n] = Pyramid_sol( x[n], y[n], z[n], P, Q, R); -// cout << "pyramid_solution[" << setw(2)<( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::ePyramid ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_z == LibUtilities::eOrtho_A) || (bType_z == LibUtilities::eModified_A) ) { - NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_A or Modified_A"); - } - if( (bType_z == LibUtilities::eOrtho_B) || (bType_z == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 3 cannot be of type Ortho_B or Modified_B"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - Array diff_solution( Qx * Qy * Qz ); - Array diff_solution_x( Qx * Qy * Qz, 0.0 ), diff_solution_y( Qx * Qy * Qz, 0.0 ), diff_solution_z( Qx * Qy * Qz, 0.0 ); - - Array dx(Qx*Qy*Qz,0.0); - Array dy(Qx*Qy*Qz,0.0); - Array dz(Qx*Qy*Qz,0.0); - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion3D *sPyrE = NULL; - - if( regionShape == LibUtilities::ePyramid ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 10 ) { - sPyrE = new StdRegions::StdPyrExp( basisKey_x, basisKey_y, basisKey_z ); - } else { - cerr << "Implement the next line!!!!!!" << endl; - //sPyrE = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - sPyrE->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Pyramid_sol( x[n], y[n], z[n], P, Q, R ); - //cout << "Prism_solution["<Linf(phys,solution) << endl; - cout << "L 2 error: " << sPyrE->L2 (phys,solution) << endl; - cout << "\n*****************************************************\n " << endl; - //-------------------------------------------- - - - //-------------------------------------------- - // Taking the physical derivative and putting them into dx, dy, dz. - sPyrE->PhysDeriv( phys, dx, dy, dz ); - //-------------------------------------------- - - - double error_x = 0, error_y=0, error_z=0; - - for( int n = 0; n < Qx*Qy*Qz; ++n ) { - - error_x += fabs(diff_solution_x[n] - dx[n]); - error_y += fabs(diff_solution_y[n] - dy[n]); - error_z += fabs(diff_solution_z[n] - dz[n]); - cout << "diff_solution_x[n] = " << diff_solution_x[n] << ", dx[n] = " << dx[n] << ", " << - "diff_solution_y[n] = " << diff_solution_y[n] << ", dy[n] = " << dy[n] << ", " << - "diff_solution_z[n] = " << diff_solution_z[n] << ", dz[n] = " << dz[n] << ", " << - endl; - } - - cout << "\n ******************************************** " << endl; - cout << "L 1 error of derivatives X = " << error_x << endl; - cout << "L 1 error of derivatives Y = " << error_y << endl; - cout << "L 1 error of derivatives Z = " << error_z << endl; - cout << "******************************************** \n" << endl; - //------------------------------------------- - - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - - t[0] = -0.19; - t[1] = -0.5; - t[2] = 0.25; - - - if( regionShape == LibUtilities::ePyramid ) - { - diff_solution_x[0] = Pyramid_Diff_Sol( t[0], t[1], t[2], P, Q, R, 1 ); - } - - - return 0; -} - - - -NekDouble Pyramid_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int p = 0; p <= P; ++p) { - for(int q = 0; q <= Q ; ++q) { - for(int r = 0; r <= R - p - q; ++r) { - sol += pow(x,p) * pow(y,q) * pow(z,r); - } - } - } - - return sol; -} - - -NekDouble Pyramid_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, int dir){ - NekDouble sol = 0; - for(int i = 0; i<= P; ++i){ - for(int j = 0; j<= Q; ++j){ - for(int k=0; k <= R - i - j; ++k){ - if(dir == 1 && i > 0) { sol += i * pow_loc(x,i-1)* pow_loc(y,j) * pow_loc(z,k); } - if(dir == 2 && j > 0) { sol += j * pow_loc(x,i) * pow_loc(y,j-1) * pow_loc(z,k); } - if(dir == 3 && k > 0) { sol += k * pow_loc(x,i) * pow_loc(y,j) * pow_loc(z,k-1); } - } - } - } - return sol; -} - - diff --git a/library/Demos/StdRegions/StdTetExpDemo.cpp b/library/Demos/StdRegions/StdTetExpDemo.cpp deleted file mode 100644 index c0825b57f64aa9a57f0dc114398ac8642e0a733c..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdTetExpDemo.cpp +++ /dev/null @@ -1,174 +0,0 @@ - -#include -#include -#include - - -#include -#include -#include -using namespace std; - - -using namespace Nektar; - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3); - -// using namespace boost; -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - - -int main(int argc, char *argv[]) - { - if( argc != 10 ) { - cerr << "Usage: StdTetDemo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Nodal Tet (Electro) = 7 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 2 3 2 2 2 5 5 5" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::eTetrahedron; - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 7) || (bType_y_val == 7) || (bType_z_val == 7) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::eTetrahedron ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - Array solution( Qx * Qy * Qz ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussRadauMAlpha1Beta0; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion *ste = NULL; - - if( regionShape == LibUtilities::eTetrahedron ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 7 ) - { - ste = new StdTetExp( basisKey_x, basisKey_y, basisKey_z ); - } - else { - cerr << "Implement the next line!!!!!!" << endl; - //ste = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - Array x = Array( Qx * Qy * Qz ); - Array y = Array( Qx * Qy * Qz ); - Array z = Array( Qx * Qy * Qz ); - - ste->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Tet_sol( x[n], y[n], z[n], P, Q, R ); - } - //---------------------------------------------- - } - - Array phys (Qx*Qy*Qz); - Array coeffs(xModes*yModes*zModes); - - //--------------------------------------------- - // Project onto Expansion - ste->FwdTrans( solution, coeffs ); - //--------------------------------------------- - - //------------------------------------------- - // Backward Transform Solution to get projected values - ste->BwdTrans(coeffs, phys); - //------------------------------------------- - - //-------------------------------------------- - // Calculate L_p error - cout << "L infinity error: " << ste->Linf(phys,solution) << endl; - cout << "L 2 error: " << ste->L2 (phys,solution) << endl; - //-------------------------------------------- - - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - t[0] = -0.9; - t[1] = -0.75; - t[2] = -0.85; - - solution[0] = Tet_sol( t[0], t[1], t[2], P, Q, R ); - - NekDouble numericSolution = ste->PhysEvaluate(t,phys); - cout << "Interpolation error at x = (" << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q - j; ++j) { - for(int k = 0; k <= R - i - j; ++k) { - sol += pow(x,i) * pow(y,j) * pow(z,k); - } - } - } - - return sol; -} - diff --git a/library/Demos/StdRegions/StdTetExp_Diff3D.cpp b/library/Demos/StdRegions/StdTetExp_Diff3D.cpp deleted file mode 100644 index 9115f09c7ca3dfe860bd8f968b2309729f27f626..0000000000000000000000000000000000000000 --- a/library/Demos/StdRegions/StdTetExp_Diff3D.cpp +++ /dev/null @@ -1,257 +0,0 @@ - -#include -#include -#include -#include - - -#include -#include -#include - -using namespace std; -using namespace Nektar; -using namespace boost; -using namespace Nektar::LibUtilities; -using namespace Nektar::StdRegions; - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int order1, int order2, int order3); -NekDouble Tet_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, int dir); - -// modification to deal with exact solution. Return 1 if integer < 0 -static double pow_loc(const double val, const int i) -{ - return (i < 0)? 1.0: pow(val,i); -} - - - -// This routine projects a polynomial or trigonmetric functions which -// has energy in all mdoes of the expansions and reports and error -int main(int argc, char *argv[]); - -int main(int argc, char *argv[]) { - if( argc != 10 ) { - cerr << "Usage: StdTetExp_Diff3D Demo Type_x Type_y Type_z numModes_x numModes_y numModes_z Qx Qy Qz" << endl; - cerr << "Where type is an interger value which dictates the basis as:" << endl; - cerr << "\t Ortho_A = 1\n"; - cerr << "\t Ortho_B = 2\n"; - cerr << "\t Ortho_C = 3\n"; - cerr << "\t Modified_A = 4\n"; - cerr << "\t Modified_B = 5\n"; - cerr << "\t Modified_C = 6\n"; - cerr << "\t Fourier = 7\n"; - cerr << "\t Lagrange = 8\n"; - cerr << "\t Legendre = 9\n"; - cerr << "\t Chebyshev = 10\n"; - cerr << "\t Nodal Tet (Electro) = 13 (3D Nodal Electrostatic Points on a Tetrahedron)\n"; - cerr << "\n\n" << "Example: " << argv[0] << " 1 2 3 2 2 2 5 5 5" << endl; - cerr << "\n\n" << "Example: " << argv[0] << " 1 2 3 5 5 5 8 8 8" << endl; - cerr << endl; - - exit(1); - } - - LibUtilities::ShapeType regionShape = LibUtilities::eTetrahedron; - - int bType_x_val = atoi(argv[1]); - int bType_y_val = atoi(argv[2]); - int bType_z_val = atoi(argv[3]); - - LibUtilities::BasisType bType_x = static_cast( bType_x_val ); - LibUtilities::BasisType bType_y = static_cast( bType_y_val ); - LibUtilities::BasisType bType_z = static_cast( bType_z_val ); - - if( (bType_x_val == 13) || (bType_y_val == 13) || (bType_z_val == 13) ) - { - bType_x = LibUtilities::eOrtho_A; - bType_y = LibUtilities::eOrtho_B; - bType_z = LibUtilities::eOrtho_C; - } - - - // Check to see that correct Expansions are used - if( regionShape == LibUtilities::eTetrahedron ) - { - if( (bType_x == LibUtilities::eOrtho_B) || (bType_x == LibUtilities::eModified_B) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_B or Modified_B"); - } - if( (bType_x == LibUtilities::eOrtho_C) || (bType_x == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 1 cannot be of type Ortho_C or Modified_C"); - } - if( (bType_y == LibUtilities::eOrtho_C) || (bType_y == LibUtilities::eModified_C) ) { - NEKERROR(ErrorUtil::efatal, "Basis 2 cannot be of type Ortho_C or Modified_C"); - } - } - - int xModes = atoi(argv[4]); - int yModes = atoi(argv[5]); - int zModes = atoi(argv[6]); - int Qx = atoi(argv[7]); - int Qy = atoi(argv[8]); - int Qz = atoi(argv[9]); - int P = xModes - 1, Q = yModes - 1, R = zModes - 1; - - //double *dx, *dy, *dz; - - Array dx(Qx*Qy*Qz,0.0); - Array dy(Qx*Qy*Qz,0.0); - Array dz(Qx*Qy*Qz,0.0); - - Array solution( Qx * Qy * Qz, 0.0 ); - Array diff_solution_x( Qx * Qy * Qz, 0.0 ), diff_solution_y( Qx * Qy * Qz, 0.0 ), diff_solution_z( Qx * Qy * Qz, 0.0 ); - Array derivatives( Qx * Qy * Qz, 0.0 ); - - LibUtilities::PointsType Qtype_x = eGaussLobattoLegendre; - LibUtilities::PointsType Qtype_y = eGaussRadauMAlpha1Beta0; - LibUtilities::PointsType Qtype_z = eGaussRadauMAlpha2Beta0; - - Array x = Array( Qx * Qy * Qz, 0.0 ); - Array y = Array( Qx * Qy * Qz, 0.0 ); - Array z = Array( Qx * Qy * Qz, 0.0 ); - - //----------------------------------------------- - // Define a 3D expansion based on basis definition - - StdRegions::StdExpansion3D *ste = NULL; - - if( regionShape == LibUtilities::eTetrahedron ) - { - const LibUtilities::PointsKey pointsKey_x( Qx, Qtype_x ); - const LibUtilities::PointsKey pointsKey_y( Qy, Qtype_y ); - const LibUtilities::PointsKey pointsKey_z( Qz, Qtype_z ); - - const LibUtilities::BasisKey basisKey_x( bType_x, xModes, pointsKey_x ); - const LibUtilities::BasisKey basisKey_y( bType_y, yModes, pointsKey_y ); - const LibUtilities::BasisKey basisKey_z( bType_z, zModes, pointsKey_z ); - - if( bType_x_val < 10 ) - { - ste = new StdRegions::StdTetExp( basisKey_x, basisKey_y, basisKey_z ); - } else - { - cerr << "Implement the next line!!!!!!" << endl; - //ste = new StdRegions::StdNodalTetExp( basisKey_x, basisKey_y, basisKey_z, NodalType ); - exit(1); - } - - ste->GetCoords(x,y,z); - - //---------------------------------------------- - // Define solution to be projected - for(int n = 0; n < Qx * Qy * Qz; ++n) { - solution[n] = Tet_sol( x[n], y[n], z[n], P, Q, R ); - cout << "tet_solution["<Linf(phys,solution) << endl; - cout << "L 2 error: " << ste->L2 (phys,solution) << endl; - //-------------------------------------------- - - - //-------------------------------------------- - // Taking the physical derivative and putting them into dx, dy, dz. - ste->PhysDeriv(phys, dx, dy, dz ); - //-------------------------------------------- - - - double error_x = 0, error_y=0, error_z=0; - - for( int n = 0; n < Qx*Qy*Qz; ++n ) { - - error_x += fabs(diff_solution_x[n] - dx[n]); - error_y += fabs(diff_solution_y[n] - dy[n]); - error_z += fabs(diff_solution_z[n] - dz[n]); - cout << "diff_solution_x[n] = " << diff_solution_x[n] << ", dx[n] = " << dx[n] << ", " << - "diff_solution_y[n] = " << diff_solution_y[n] << ", dy[n] = " << dy[n] << ", " << - "diff_solution_z[n] = " << diff_solution_z[n] << ", dz[n] = " << dz[n] << ", " << - endl; - - - } - - cout << "\n ******************************************** " << endl; - cout << "L 1 error of derivatives X = " << error_x << endl; - cout << "L 1 error of derivatives Y = " << error_y << endl; - cout << "L 1 error of derivatives Z = " << error_z << endl; - cout << "******************************************** \n" << endl; - //------------------------------------------- - // Evaulate solution at x = y = z = 0 and print error - Array t = Array(3); - t[0] = -0.9; - t[1] = -0.75; - t[2] = -0.85; - - if( regionShape == LibUtilities::eTetrahedron ) { - solution[0] = Tet_sol( t[0], t[1], t[2], P, Q, R ); - } - - NekDouble numericSolution = ste->PhysEvaluate(t,phys); - cout << "Interpolation difference from actual solution at x = ( " << - t[0] << ", " << t[1] << ", " << t[2] << " ): " << numericSolution - solution[0] << endl; - //------------------------------------------- - - return 0; -} - - - - -NekDouble Tet_sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R) { - NekDouble sol = 0; - - for(int i = 0; i <= P; ++i) { - for(int j = 0; j <= Q - i; ++j) { - for(int k = 0; k <= R - i - j; ++k) { - sol += pow_loc(x,i) * pow_loc(y,j) * pow_loc(z,k); - } - } - } - - return sol; -} - -NekDouble Tet_Diff_Sol(NekDouble x, NekDouble y, NekDouble z, int P, int Q, int R, int dir){ - NekDouble sol = 0; - for(int i = 0; i<= P; ++i){ - for(int j = 0; j<= Q-i; ++j){ - for(int k=0; k <= R-i-j; ++k){ - if(dir == 1 && i > 0) { sol += i * pow_loc(x,i-1)* pow_loc(y,j) * pow_loc(z,k); } - if(dir == 2 && j > 0) { sol += j * pow_loc(x,i) * pow_loc(y,j-1) * pow_loc(z,k); } - if(dir == 3 && k > 0) { sol += k * pow_loc(x,i) * pow_loc(y,j) * pow_loc(z,k-1); } - } - } - } - return sol; -} - diff --git a/library/Demos/StdRegions/Tests/StdProject3D_Pyr_Mod_P6_Q7.tst b/library/Demos/StdRegions/Tests/StdProject3D_Pyr_Mod_P6_Q7.tst new file mode 100644 index 0000000000000000000000000000000000000000..7a48e8ebac2afa94ad28f70b4cecb3cfcd4c0bd2 --- /dev/null +++ b/library/Demos/StdRegions/Tests/StdProject3D_Pyr_Mod_P6_Q7.tst @@ -0,0 +1,14 @@ + + + StdProject3D Pyramid Modified basis P=6 Q=7 + StdProject3D + 6 4 4 6 6 6 6 7 7 6 + + + 1.35652e-12 + + + 3.8245e-12 + + + diff --git a/library/Demos/StdRegions/Tests/StdProject_Diff3D_Pyr_Mod_P6_Q7.tst b/library/Demos/StdRegions/Tests/StdProject_Diff3D_Pyr_Mod_P6_Q7.tst new file mode 100644 index 0000000000000000000000000000000000000000..c1de0289c4c0c6b76d2362bccdcd5399e5c0b2a4 --- /dev/null +++ b/library/Demos/StdRegions/Tests/StdProject_Diff3D_Pyr_Mod_P6_Q7.tst @@ -0,0 +1,14 @@ + + + StdProject_Diff3D Pyramid Modified basis P=6 Q=7 + StdProject_Diff3D + 6 4 4 6 6 6 6 7 7 6 + + + 4.99628e-12 + + + 2.5608e-11 + + + diff --git a/library/LibUtilities/BasicUtils/FieldIO.cpp b/library/LibUtilities/BasicUtils/FieldIO.cpp index 53b73281ba23366f70ab0f6d9c647597882a5998..ed35b34104ff3550e275538a99b5cd39679369d7 100644 --- a/library/LibUtilities/BasicUtils/FieldIO.cpp +++ b/library/LibUtilities/BasicUtils/FieldIO.cpp @@ -1128,6 +1128,7 @@ namespace Nektar // serial processing just add ending. if(nprocs == 1) { + cout << "Writing: " << specPath << endl; return LibUtilities::PortablePath(specPath); } diff --git a/library/LibUtilities/BasicUtils/ShapeType.hpp b/library/LibUtilities/BasicUtils/ShapeType.hpp index 5d5500bd6f4ca7c3256bfc2bbb6494d8c8206a42..9a0bf806b3507c5829979484f90a654ea16f1cb2 100644 --- a/library/LibUtilities/BasicUtils/ShapeType.hpp +++ b/library/LibUtilities/BasicUtils/ShapeType.hpp @@ -188,8 +188,8 @@ namespace Nektar ASSERTL2(Na > 1, "Order in 'a' direction must be > 1."); ASSERTL2(Nb > 1, "Order in 'b' direction must be > 1."); ASSERTL2(Nc > 1, "Order in 'c' direction must be > 1."); - ASSERTL1(Na <= Nb, "order in 'a' direction is higher " - "than order in 'b' direction"); + ASSERTL1(Na <= Nc, "order in 'a' direction is higher " + "than order in 'c' direction"); ASSERTL1(Nb <= Nc, "order in 'b' direction is higher " "than order in 'c' direction"); int nCoef = 0; @@ -211,8 +211,8 @@ namespace Nektar ASSERTL2(Na > 1, "Order in 'a' direction must be > 1."); ASSERTL2(Nb > 1, "Order in 'b' direction must be > 1."); ASSERTL2(Nc > 1, "Order in 'c' direction must be > 1."); - ASSERTL1(Na <= Nb, "order in 'a' direction is higher " - "than order in 'b' direction"); + ASSERTL1(Na <= Nc, "order in 'a' direction is higher " + "than order in 'c' direction"); ASSERTL1(Nb <= Nc, "order in 'b' direction is higher " "than order in 'c' direction"); @@ -238,18 +238,29 @@ namespace Nektar "than order in 'c' direction."); ASSERTL1(Nb <= Nc, "Order in 'b' direction is higher " "than order in 'c' direction."); - int nCoef = 0; - for (int c = 0; c < Nc; ++c) + + // Count number of coefficients explicitly. + const int Pi = Na - 2, Qi = Nb - 2, Ri = Nc - 2; + int nCoeff = + 5 + // vertices + Pi * 2 + Qi * 2 + Ri * 4 + // base edges + Pi * Qi + // base quad + Pi * (2*Ri - Pi - 1) + // p-r triangles; + Qi * (2*Ri - Qi - 1); // q-r triangles; + + // Count number of interior tet modes + for (int a = 0; a < Pi - 1; ++a) { - for (int b = 0; b < std::min(Nc-c,Nb); ++b) + for (int b = 0; b < Qi - a - 1; ++b) { - for (int a = 0 ; a < std::min(Nc-c,Na); ++a) + for (int c = 0; c < Ri - a - b -1; ++c) { - ++nCoef; + ++nCoeff; } } } - return nCoef; + + return nCoeff; } inline int getNumberOfBndCoefficients(int Na, int Nb, int Nc) diff --git a/library/LocalRegions/PyrExp.cpp b/library/LocalRegions/PyrExp.cpp index 0e352a7e3957bdfc078abff74186d58523f7db9b..07b0e858d76b8206b94ebfec1b7ca9d8b07e3b7a 100644 --- a/library/LocalRegions/PyrExp.cpp +++ b/library/LocalRegions/PyrExp.cpp @@ -354,6 +354,416 @@ namespace Nektar return m_geom->GetCoordim(); } + StdRegions::Orientation PyrExp::v_GetFaceOrient(int face) + { + return GetGeom3D()->GetFaceOrient(face); + } + + void PyrExp::v_GetFacePhysVals( + const int face, + const StdRegions::StdExpansionSharedPtr &FaceExp, + const Array &inarray, + Array &outarray, + StdRegions::Orientation orient) + { + int nq0 = m_base[0]->GetNumPoints(); + int nq1 = m_base[1]->GetNumPoints(); + int nq2 = m_base[2]->GetNumPoints(); + + Array o_tmp(nq0*nq1*nq2); + + if (orient == StdRegions::eNoOrientation) + { + orient = GetFaceOrient(face); + } + + switch(face) + { + case 0: + if(orient == StdRegions::eDir1FwdDir1_Dir2FwdDir2) + { + //Directions A and B positive + Vmath::Vcopy(nq0*nq1,&(inarray[0]),1,&(o_tmp[0]),1); + } + else if(orient == StdRegions::eDir1BwdDir1_Dir2FwdDir2) + { + //Direction A negative and B positive + for (int j=0; jGetPointsKey(), m_base[1]->GetPointsKey(), o_tmp, + FaceExp->GetBasis(0)->GetPointsKey(),FaceExp->GetBasis(1)->GetPointsKey(),outarray); + break; + + case 1: + { + for (int k = 0; k < nq2; k++) + { + Vmath::Vcopy(nq0,inarray.get()+nq0*nq1*k,1,outarray.get()+k*nq0,1); + } + LibUtilities::Interp2D(m_base[0]->GetPointsKey(), m_base[2]->GetPointsKey(), outarray.get(), + FaceExp->GetBasis(0)->GetPointsKey(),FaceExp->GetBasis(1)->GetPointsKey(),o_tmp.get()); + break; + } + + case 2: + { + Vmath::Vcopy(nq1*nq2,inarray.get()+(nq0-1),nq0,outarray.get(),1); + LibUtilities::Interp2D(m_base[1]->GetPointsKey(), m_base[2]->GetPointsKey(), outarray.get(), + FaceExp->GetBasis(0)->GetPointsKey(),FaceExp->GetBasis(1)->GetPointsKey(),o_tmp.get()); + break; + } + + case 3: + { + for (int k = 0; k < nq2; k++) + { + Vmath::Vcopy(nq0,inarray.get()+nq0*(nq1-1)+nq0*nq1*k,1,outarray.get()+(k*nq0),1); + } + LibUtilities::Interp2D(m_base[0]->GetPointsKey(), m_base[2]->GetPointsKey(), outarray.get(), + FaceExp->GetBasis(0)->GetPointsKey(),FaceExp->GetBasis(1)->GetPointsKey(),o_tmp.get()); + } + + case 4: + { + Vmath::Vcopy(nq1*nq2,inarray.get(),nq0,outarray.get(),1); + LibUtilities::Interp2D(m_base[1]->GetPointsKey(), m_base[2]->GetPointsKey(), outarray.get(), + FaceExp->GetBasis(0)->GetPointsKey(),FaceExp->GetBasis(1)->GetPointsKey(),o_tmp.get()); + break; + } + + default: + ASSERTL0(false,"face value (> 4) is out of range"); + break; + } + + if (face > 0) + { + int fnq1 = FaceExp->GetNumPoints(0); + int fnq2 = FaceExp->GetNumPoints(1); + + if ((int)orient == 7) + { + for (int j = 0; j < fnq2; ++j) + { + Vmath::Vcopy(fnq1, o_tmp.get()+((j+1)*fnq1-1), -1, outarray.get()+j*fnq1, 1); + } + } + else + { + Vmath::Vcopy(fnq1*fnq2, o_tmp.get(), 1, outarray.get(), 1); + } + } + } + + void PyrExp::v_ComputeFaceNormal(const int face) + { + const SpatialDomains::GeomFactorsSharedPtr &geomFactors = + GetGeom()->GetMetricInfo(); + LibUtilities::PointsKeyVector ptsKeys = GetPointsKeys(); + SpatialDomains::GeomType type = geomFactors->GetGtype(); + const Array &df = geomFactors->GetDerivFactors(ptsKeys); + const Array &jac = geomFactors->GetJac(ptsKeys); + + // Number of quadrature points in face expansion. + int nq = m_base[0]->GetNumPoints()*m_base[0]->GetNumPoints(); + int vCoordDim = GetCoordim(); + int i; + + m_faceNormals[face] = Array >(vCoordDim); + Array > &normal = m_faceNormals[face]; + for (i = 0; i < vCoordDim; ++i) + { + normal[i] = Array(nq); + } + + // Regular geometry case + if (type == SpatialDomains::eRegular || + type == SpatialDomains::eMovingRegular) + { + NekDouble fac; + // Set up normals + switch(face) + { + case 0: + { + for(i = 0; i < vCoordDim; ++i) + { + Vmath::Fill(nq,-df[3*i+2][0],normal[i],1); + } + break; + } + case 1: + { + for(i = 0; i < vCoordDim; ++i) + { + Vmath::Fill(nq,-df[3*i+1][0],normal[i],1); + } + break; + } + case 2: + { + for(i = 0; i < vCoordDim; ++i) + { + Vmath::Fill(nq,df[3*i][0]+df[3*i+2][0],normal[i],1); + } + break; + } + case 3: + { + for(i = 0; i < vCoordDim; ++i) + { + Vmath::Fill(nq,df[3*i+1][0]+df[3*i+2][0],normal[i],1); + } + break; + } + case 4: + { + for(i = 0; i < vCoordDim; ++i) + { + Vmath::Fill(nq,-df[3*i][0],normal[i],1); + } + break; + } + default: + ASSERTL0(false,"face is out of range (face < 4)"); + } + + // Normalise resulting vector. + fac = 0.0; + for(i = 0; i < vCoordDim; ++i) + { + fac += normal[i][0]*normal[i][0]; + } + fac = 1.0/sqrt(fac); + for (i = 0; i < vCoordDim; ++i) + { + Vmath::Smul(nq,fac,normal[i],1,normal[i],1); + } + } + else + { + // Set up deformed normals. + int j, k; + + int nq0 = ptsKeys[0].GetNumPoints(); + int nq1 = ptsKeys[1].GetNumPoints(); + int nq2 = ptsKeys[2].GetNumPoints(); + int nq01 = nq0*nq1; + int nqtot; + + // Determine number of quadrature points on the face. + if (face == 0) + { + nqtot = nq0*nq1; + } + else if (face == 1 || face == 3) + { + nqtot = nq0*nq2; + } + else + { + nqtot = nq1*nq2; + } + + LibUtilities::PointsKey points0; + LibUtilities::PointsKey points1; + + Array work (nq, 0.0); + Array normals(vCoordDim*nqtot,0.0); + + // Extract Jacobian along face and recover local derivatives + // (dx/dr) for polynomial interpolation by multiplying m_gmat by + // jacobian + switch(face) + { + case 0: + { + for(j = 0; j < nq01; ++j) + { + normals[j] = -df[2][j]*jac[j]; + normals[nqtot+j] = -df[5][j]*jac[j]; + normals[2*nqtot+j] = -df[8][j]*jac[j]; + } + + points0 = ptsKeys[0]; + points1 = ptsKeys[1]; + break; + } + + case 1: + { + for (j = 0; j < nq0; ++j) + { + for(k = 0; k < nq2; ++k) + { + int tmp = j+nq01*k; + normals[j+k*nq0] = + -df[1][tmp]*jac[tmp]; + normals[nqtot+j+k*nq0] = + -df[4][tmp]*jac[tmp]; + normals[2*nqtot+j+k*nq0] = + -df[7][tmp]*jac[tmp]; + } + } + + points0 = ptsKeys[0]; + points1 = ptsKeys[2]; + break; + } + + case 2: + { + for (j = 0; j < nq1; ++j) + { + for(k = 0; k < nq2; ++k) + { + int tmp = nq0-1+nq0*j+nq01*k; + normals[j+k*nq1] = + (df[0][tmp]+df[2][tmp])*jac[tmp]; + normals[nqtot+j+k*nq1] = + (df[3][tmp]+df[5][tmp])*jac[tmp]; + normals[2*nqtot+j+k*nq1] = + (df[6][tmp]+df[8][tmp])*jac[tmp]; + } + } + + points0 = ptsKeys[1]; + points1 = ptsKeys[2]; + break; + } + + case 3: + { + for (j = 0; j < nq0; ++j) + { + for(k = 0; k < nq2; ++k) + { + int tmp = nq0*(nq1-1) + j + nq01*k; + normals[j+k*nq0] = + (df[1][tmp]+df[2][tmp])*jac[tmp]; + normals[nqtot+j+k*nq0] = + (df[4][tmp]+df[5][tmp])*jac[tmp]; + normals[2*nqtot+j+k*nq0] = + (df[7][tmp]+df[8][tmp])*jac[tmp]; + } + } + + points0 = ptsKeys[0]; + points1 = ptsKeys[2]; + break; + } + + case 4: + { + for (j = 0; j < nq1; ++j) + { + for(k = 0; k < nq2; ++k) + { + int tmp = j*nq0+nq01*k; + normals[j+k*nq1] = + -df[0][tmp]*jac[tmp]; + normals[nqtot+j+k*nq1] = + -df[3][tmp]*jac[tmp]; + normals[2*nqtot+j+k*nq1] = + -df[6][tmp]*jac[tmp]; + } + } + + points0 = ptsKeys[1]; + points1 = ptsKeys[2]; + break; + } + + default: + ASSERTL0(false,"face is out of range (face < 4)"); + } + + // Interpolate Jacobian and invert + LibUtilities::Interp2D(points0, points1, jac, + m_base[0]->GetPointsKey(), + m_base[0]->GetPointsKey(), + work); + Vmath::Sdiv(nq, 1.0, &work[0], 1, &work[0], 1); + + // Interpolate normal and multiply by inverse Jacobian. + for(i = 0; i < vCoordDim; ++i) + { + LibUtilities::Interp2D(points0, points1, + &normals[i*nqtot], + m_base[0]->GetPointsKey(), + m_base[0]->GetPointsKey(), + &normal[i][0]); + Vmath::Vmul(nq,work,1,normal[i],1,normal[i],1); + } + + // Normalise to obtain unit normals. + Vmath::Zero(nq,work,1); + for(i = 0; i < GetCoordim(); ++i) + { + Vmath::Vvtvp(nq,normal[i],1,normal[i],1,work,1,work,1); + } + + Vmath::Vsqrt(nq,work,1,work,1); + Vmath::Sdiv (nq,1.0,work,1,work,1); + + for(i = 0; i < GetCoordim(); ++i) + { + Vmath::Vmul(nq,normal[i],1,work,1,normal[i],1); + } + } + } + //--------------------------------------- // Matrix creation functions //--------------------------------------- @@ -370,10 +780,10 @@ namespace Nektar case StdRegions::eHybridDGLamToQ1: case StdRegions::eHybridDGLamToQ2: case StdRegions::eHybridDGHelmBndLam: - returnval = Expansion3D::GenMatrix(mkey); + returnval = Expansion3D::v_GenMatrix(mkey); break; default: - returnval = StdPyrExp::GenMatrix(mkey); + returnval = StdPyrExp::v_GenMatrix(mkey); } return returnval; @@ -483,7 +893,6 @@ namespace Nektar DNekMat &lap12 = *GetStdMatrix(lap12key); DNekMat &lap22 = *GetStdMatrix(lap22key); - NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0]; Array gmat = m_metricinfo->GetGmat(ptsKeys); @@ -519,10 +928,9 @@ namespace Nektar DNekMatSharedPtr helm = MemoryManager::AllocateSharedPtr(rows, cols); - NekDouble one = 1.0; (*helm) = LapMat + factor*MassMat; - returnval = MemoryManager::AllocateSharedPtr(one, helm); + returnval = MemoryManager::AllocateSharedPtr(1.0, helm); } break; default: @@ -646,5 +1054,227 @@ namespace Nektar return returnval; } + void PyrExp::v_ComputeLaplacianMetric() + { + if (m_metrics.count(MetricQuadrature) == 0) + { + ComputeQuadratureMetric(); + } + + int i, j; + const unsigned int nqtot = GetTotPoints(); + const unsigned int dim = 3; + const MetricType m[3][3] = { + { MetricLaplacian00, MetricLaplacian01, MetricLaplacian02 }, + { MetricLaplacian01, MetricLaplacian11, MetricLaplacian12 }, + { MetricLaplacian02, MetricLaplacian12, MetricLaplacian22 } + }; + + for (unsigned int i = 0; i < dim; ++i) + { + for (unsigned int j = i; j < dim; ++j) + { + m_metrics[m[i][j]] = Array(nqtot); + } + } + + // Define shorthand synonyms for m_metrics storage + Array g0 (m_metrics[m[0][0]]); + Array g1 (m_metrics[m[1][1]]); + Array g2 (m_metrics[m[2][2]]); + Array g3 (m_metrics[m[0][1]]); + Array g4 (m_metrics[m[0][2]]); + Array g5 (m_metrics[m[1][2]]); + + // Allocate temporary storage + Array alloc(9*nqtot,0.0); + Array h0 (nqtot, alloc); + Array h1 (nqtot, alloc+ 1*nqtot); + Array h2 (nqtot, alloc+ 2*nqtot); + Array wsp1 (nqtot, alloc+ 3*nqtot); + Array wsp2 (nqtot, alloc+ 4*nqtot); + Array wsp3 (nqtot, alloc+ 5*nqtot); + Array wsp4 (nqtot, alloc+ 6*nqtot); + Array wsp5 (nqtot, alloc+ 7*nqtot); + Array wsp6 (nqtot, alloc+ 8*nqtot); + + const Array& df = + m_metricinfo->GetDerivFactors(GetPointsKeys()); + const Array& z0 = m_base[0]->GetZ(); + const Array& z1 = m_base[1]->GetZ(); + const Array& z2 = m_base[2]->GetZ(); + const unsigned int nquad0 = m_base[0]->GetNumPoints(); + const unsigned int nquad1 = m_base[1]->GetNumPoints(); + const unsigned int nquad2 = m_base[2]->GetNumPoints(); + + // Populate collapsed coordinate arrays h0, h1 and h2. + for(j = 0; j < nquad2; ++j) + { + for(i = 0; i < nquad1; ++i) + { + Vmath::Fill(nquad0, 2.0/(1.0-z2[j]), &h0[0]+i*nquad0 + j*nquad0*nquad1,1); + Vmath::Fill(nquad0, 1.0/(1.0-z2[j]), &h1[0]+i*nquad0 + j*nquad0*nquad1,1); + Vmath::Fill(nquad0, (1.0+z1[i])/(1.0-z2[j]), &h2[0]+i*nquad0 + j*nquad0*nquad1,1); + } + } + for(i = 0; i < nquad0; i++) + { + Blas::Dscal(nquad1*nquad2, 1+z0[i], &h1[0]+i, nquad0); + } + + // Step 3. Construct combined metric terms for physical space to + // collapsed coordinate system. + // Order of construction optimised to minimise temporary storage + if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed) + { + // f_{1k} + Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &df[2][0], 1, &h1[0], 1, &wsp1[0], 1); + Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &df[5][0], 1, &h1[0], 1, &wsp2[0], 1); + Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &df[8][0], 1, &h1[0], 1, &wsp3[0], 1); + + // g0 + Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0], 1, &g0[0], 1); + Vmath::Vvtvp (nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1); + + // g4 + Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp1[0], 1, &df[5][0], 1, &wsp2[0], 1, &g4[0], 1); + Vmath::Vvtvp (nqtot, &df[8][0], 1, &wsp3[0], 1, &g4[0], 1, &g4[0], 1); + + // f_{2k} + Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h0[0], 1, &df[2][0], 1, &h2[0], 1, &wsp4[0], 1); + Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h0[0], 1, &df[5][0], 1, &h2[0], 1, &wsp5[0], 1); + Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h0[0], 1, &df[8][0], 1, &h2[0], 1, &wsp6[0], 1); + + // g1 + Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0], 1, &g1[0], 1); + Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1); + + // g3 + Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0], 1, &g3[0], 1); + Vmath::Vvtvp (nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1); + + // g5 + Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0], 1, &g5[0], 1); + Vmath::Vvtvp (nqtot, &df[8][0], 1, &wsp6[0], 1, &g5[0], 1, &g5[0], 1); + + // g2 + Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &df[2][0], 1, &df[5][0], 1, &df[5][0], 1, &g2[0], 1); + Vmath::Vvtvp (nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1); + } + else + { + // f_{1k} + Vmath::Svtsvtp(nqtot, df[0][0], &h0[0], 1, df[2][0], &h1[0], 1, &wsp1[0], 1); + Vmath::Svtsvtp(nqtot, df[3][0], &h0[0], 1, df[5][0], &h1[0], 1, &wsp2[0], 1); + Vmath::Svtsvtp(nqtot, df[6][0], &h0[0], 1, df[8][0], &h1[0], 1, &wsp3[0], 1); + + // g0 + Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0], 1, &g0[0], 1); + Vmath::Vvtvp (nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1); + + // g4 + Vmath::Svtsvtp(nqtot, df[2][0], &wsp1[0], 1, df[5][0], &wsp2[0], 1, &g4[0], 1); + Vmath::Svtvp (nqtot, df[8][0], &wsp3[0], 1, &g4[0], 1, &g4[0], 1); + + // f_{2k} + Vmath::Svtsvtp(nqtot, df[1][0], &h0[0], 1, df[2][0], &h2[0], 1, &wsp4[0], 1); + Vmath::Svtsvtp(nqtot, df[4][0], &h0[0], 1, df[5][0], &h2[0], 1, &wsp5[0], 1); + Vmath::Svtsvtp(nqtot, df[7][0], &h0[0], 1, df[8][0], &h2[0], 1, &wsp6[0], 1); + + // g1 + Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0], 1, &g1[0], 1); + Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1); + + // g3 + Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0], 1, &g3[0], 1); + Vmath::Vvtvp (nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1); + + // g5 + Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1, &g5[0], 1); + Vmath::Svtvp (nqtot, df[8][0], &wsp6[0], 1, &g5[0], 1, &g5[0], 1); + + // g2 + Vmath::Fill(nqtot, df[2][0]*df[2][0] + df[5][0]*df[5][0] + df[8][0]*df[8][0], &g2[0], 1); + } + + for (unsigned int i = 0; i < dim; ++i) + { + for (unsigned int j = i; j < dim; ++j) + { + MultiplyByQuadratureMetric(m_metrics[m[i][j]], + m_metrics[m[i][j]]); + + } + } + } + + void PyrExp::v_LaplacianMatrixOp_MatFree_Kernel( + const Array &inarray, + Array &outarray, + Array &wsp) + { + // This implementation is only valid when there are no coefficients + // associated to the Laplacian operator + if (m_metrics.count(MetricLaplacian00) == 0) + { + ComputeLaplacianMetric(); + } + + int nquad0 = m_base[0]->GetNumPoints(); + int nquad1 = m_base[1]->GetNumPoints(); + int nq2 = m_base[2]->GetNumPoints(); + int nqtot = nquad0*nquad1*nq2; + + ASSERTL1(wsp.num_elements() >= 6*nqtot, + "Insufficient workspace size."); + ASSERTL1(m_ncoeffs <= nqtot, + "Workspace not set up for ncoeffs > nqtot"); + + const Array& base0 = m_base[0]->GetBdata(); + const Array& base1 = m_base[1]->GetBdata(); + const Array& base2 = m_base[2]->GetBdata(); + const Array& dbase0 = m_base[0]->GetDbdata(); + const Array& dbase1 = m_base[1]->GetDbdata(); + const Array& dbase2 = m_base[2]->GetDbdata(); + const Array& metric00 = m_metrics[MetricLaplacian00]; + const Array& metric01 = m_metrics[MetricLaplacian01]; + const Array& metric02 = m_metrics[MetricLaplacian02]; + const Array& metric11 = m_metrics[MetricLaplacian11]; + const Array& metric12 = m_metrics[MetricLaplacian12]; + const Array& metric22 = m_metrics[MetricLaplacian22]; + + // Allocate temporary storage + Array wsp0 (2*nqtot, wsp); + Array wsp1 ( nqtot, wsp+1*nqtot); + Array wsp2 ( nqtot, wsp+2*nqtot); + Array wsp3 ( nqtot, wsp+3*nqtot); + Array wsp4 ( nqtot, wsp+4*nqtot); + Array wsp5 ( nqtot, wsp+5*nqtot); + + // LAPLACIAN MATRIX OPERATION + // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u + // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u + // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u + StdExpansion3D::PhysTensorDeriv(inarray,wsp0,wsp1,wsp2); + + // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2 + // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2 + // where g0, g1 and g2 are the metric terms set up in the GeomFactors class + // especially for this purpose + Vmath::Vvtvvtp(nqtot,&metric00[0],1,&wsp0[0],1,&metric01[0],1,&wsp1[0],1,&wsp3[0],1); + Vmath::Vvtvp (nqtot,&metric02[0],1,&wsp2[0],1,&wsp3[0],1,&wsp3[0],1); + Vmath::Vvtvvtp(nqtot,&metric01[0],1,&wsp0[0],1,&metric11[0],1,&wsp1[0],1,&wsp4[0],1); + Vmath::Vvtvp (nqtot,&metric12[0],1,&wsp2[0],1,&wsp4[0],1,&wsp4[0],1); + Vmath::Vvtvvtp(nqtot,&metric02[0],1,&wsp0[0],1,&metric12[0],1,&wsp1[0],1,&wsp5[0],1); + Vmath::Vvtvp (nqtot,&metric22[0],1,&wsp2[0],1,&wsp5[0],1,&wsp5[0],1); + + // outarray = m = (D_xi1 * B)^T * k + // wsp1 = n = (D_xi2 * B)^T * l + IProductWRTBase_SumFacKernel(dbase0,base1,base2,wsp3,outarray,wsp0,false,true,true); + IProductWRTBase_SumFacKernel(base0,dbase1,base2,wsp4,wsp2, wsp0,true,false,true); + Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1); + IProductWRTBase_SumFacKernel(base0,base1,dbase2,wsp5,wsp2, wsp0,true,true,false); + Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1); + } }//end of namespace }//end of namespace diff --git a/library/LocalRegions/PyrExp.h b/library/LocalRegions/PyrExp.h index bb5d92328fbec2c638fdaa54241d2b1aa291297a..7f6aab03ac5d983cf80985846f091c7988de989a 100644 --- a/library/LocalRegions/PyrExp.h +++ b/library/LocalRegions/PyrExp.h @@ -119,7 +119,15 @@ namespace Nektar // Helper functions //--------------------------------------- LOCAL_REGIONS_EXPORT virtual int v_GetCoordim(); - + LOCAL_REGIONS_EXPORT virtual + StdRegions::Orientation v_GetFaceOrient(int face); + LOCAL_REGIONS_EXPORT void v_ComputeFaceNormal(const int face); + LOCAL_REGIONS_EXPORT virtual void v_GetFacePhysVals( + const int face, + const StdRegions::StdExpansionSharedPtr &FaceExp, + const Array &inarray, + Array &outarray, + StdRegions::Orientation orient); //--------------------------------------- // Matrix creation functions @@ -138,13 +146,16 @@ namespace Nektar const MatrixKey &mkey); LOCAL_REGIONS_EXPORT DNekScalBlkMatSharedPtr CreateStaticCondMatrix( const MatrixKey &mkey); - - private: - SpatialDomains::Geometry3DSharedPtr m_geom; - SpatialDomains::GeomFactorsSharedPtr m_metricinfo; + LOCAL_REGIONS_EXPORT virtual void v_ComputeLaplacianMetric(); + private: LibUtilities::NekManager m_matrixManager; LibUtilities::NekManager m_staticCondMatrixManager; + + virtual void v_LaplacianMatrixOp_MatFree_Kernel( + const Array &inarray, + Array &outarray, + Array &wsp); }; // type defines for use of PyrExp in a boost vector diff --git a/library/MultiRegions/DisContField1D.cpp b/library/MultiRegions/DisContField1D.cpp index b8fbbbba519d2e648ae6f6e569ca8267d5b93655..a4f31564b79d558747c5fe94cc1e1a977b2a5bb7 100644 --- a/library/MultiRegions/DisContField1D.cpp +++ b/library/MultiRegions/DisContField1D.cpp @@ -83,7 +83,7 @@ namespace Nektar SpatialDomains::BoundaryConditions bcs(m_session, graph1D); GenerateBoundaryConditionExpansion(graph1D,bcs,variable); - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); ApplyGeomInfo(); map periodicVertices; @@ -102,9 +102,9 @@ namespace Nektar m_trace = boost::dynamic_pointer_cast(trace); m_traceMap = MemoryManager:: - AllocateSharedPtr(pSession,graph1D,trace,*this, - m_bndCondExpansions,m_bndConditions,periodicVertices, - variable); + AllocateSharedPtr(pSession, graph1D, trace, *this, + m_bndCondExpansions, m_bndConditions, + periodicVertices, variable); tmpBndSol = Array (m_traceMap->GetNumLocalBndCoeffs()); @@ -172,7 +172,7 @@ namespace Nektar i); //1. c) Evaluate the boundary conditions - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); //ApplyGeomInfo(); //2. Set up trace information @@ -1230,9 +1230,11 @@ namespace Nektar * @param bndCondExpansions List of boundary expansions. * @param bndConditions Information about the boundary conditions. */ - void DisContField1D::v_EvaluateBoundaryConditions(const NekDouble time, - const NekDouble x2_in, - const NekDouble x3_in) + void DisContField1D::v_EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { int i; @@ -1295,7 +1297,7 @@ namespace Nektar } else { - ASSERTL0(false,"This type of BC not implemented yet"); + ASSERTL0(false, "This type of BC not implemented yet"); } } } diff --git a/library/MultiRegions/DisContField1D.h b/library/MultiRegions/DisContField1D.h index 049a138f242aaf24f90476968d45a2c9856ddc52..a153f75f152b7a1897c6ea239d8873c92d55886b 100644 --- a/library/MultiRegions/DisContField1D.h +++ b/library/MultiRegions/DisContField1D.h @@ -223,9 +223,10 @@ namespace Nektar /// Evaluate all boundary conditions at a given time.. virtual void v_EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); /// Solve the Helmholtz equation. virtual void v_HelmSolve( diff --git a/library/MultiRegions/DisContField2D.cpp b/library/MultiRegions/DisContField2D.cpp index 51027bfa7d9fe8d647048769403fc9e87bd3a4ef..304aba601050d22a051849cceb127813c71f666d 100644 --- a/library/MultiRegions/DisContField2D.cpp +++ b/library/MultiRegions/DisContField2D.cpp @@ -104,7 +104,7 @@ namespace Nektar if (DeclareCoeffPhysArrays) { - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); } // Find periodic edges for this variable. @@ -185,7 +185,7 @@ namespace Nektar if (DeclareCoeffPhysArrays) { - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); } if (!SameTypeOfBoundaryConditions(In)) @@ -2117,9 +2117,11 @@ namespace Nektar * boundary conditions unless time == 0.0 which is the * case when the method is called from the constructor. */ - void DisContField2D::v_EvaluateBoundaryConditions(const NekDouble time, - const NekDouble x2_in, - const NekDouble x3_in) + void DisContField2D::v_EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { int i; int npoints; @@ -2142,7 +2144,7 @@ namespace Nektar // Homogeneous input case for x2. if (x2_in == NekConstants::kNekUnsetDouble) { - locExpList->GetCoords(x0,x1,x2); + locExpList->GetCoords(x0, x1, x2); } else { @@ -2153,39 +2155,13 @@ namespace Nektar if (m_bndConditions[i]->GetBoundaryConditionType() == SpatialDomains::eDirichlet) { - string filebcs = boost::static_pointer_cast< SpatialDomains::DirichletBoundaryCondition>( m_bndConditions[i])->m_filename; if (filebcs != "") { - string varString = filebcs.substr( - 0, filebcs.find_last_of(".")); - int len = varString.length(); - varString = varString.substr(len-1, len); - cout << "Boundary condition from file:" - << filebcs << endl; - - std::vector FieldDef; - std::vector > FieldData; - LibUtilities::FieldIO f(m_session->GetComm()); - f.Import(filebcs, FieldDef, FieldData); - - // copy FieldData into locExpList - locExpList->ExtractDataToCoeffs( - FieldDef[0], FieldData[0], - FieldDef[0]->m_fields[0], - locExpList->UpdateCoeffs()); - - locExpList->BwdTrans_IterPerExp( - locExpList->GetCoeffs(), - locExpList->UpdatePhys()); - - locExpList->FwdTrans_BndConstrained( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); + ExtractFileBCs(filebcs, varName, locExpList); } else { @@ -2197,11 +2173,11 @@ namespace Nektar condition.Evaluate(x0, x1, x2, time, locExpList->UpdatePhys()); - - locExpList->FwdTrans_BndConstrained( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); } + + locExpList->FwdTrans_BndConstrained( + locExpList->GetPhys(), + locExpList->UpdateCoeffs()); } else if (m_bndConditions[i]->GetBoundaryConditionType() == SpatialDomains::eNeumann) @@ -2209,47 +2185,10 @@ namespace Nektar string filebcs = boost::static_pointer_cast< SpatialDomains::NeumannBoundaryCondition>( m_bndConditions[i])->m_filename; - + if (filebcs != "") { - string var = filebcs.substr( - 0, filebcs.find_last_of(".")); - int len=var.length(); - var = var.substr(len-1,len); - - cout << "Boundary condition from file: " - << filebcs << endl; - - std::vector FieldDef; - std::vector > FieldData; - LibUtilities::FieldIO f(m_session->GetComm()); - f.Import(filebcs, FieldDef, FieldData); - - // copy FieldData into locExpList - locExpList->ExtractDataToCoeffs( - FieldDef[0], FieldData[0], - FieldDef[0]->m_fields[0], - locExpList->UpdateCoeffs()); - - locExpList->BwdTrans_IterPerExp( - locExpList->GetCoeffs(), - locExpList->UpdatePhys()); - - /* - Array x(locExpList->GetTotPoints(),0.0); - Array y(locExpList->GetTotPoints(),0.0); - locExpList->GetCoords(x,y); - for(int i=0; i< locExpList->GetTotPoints(); i++) - { - cout<GetPhys()[i]<IProductWRTBase( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); + ExtractFileBCs(filebcs, varName, locExpList); } else { @@ -2260,11 +2199,11 @@ namespace Nektar m_neumannCondition; condition.Evaluate(x0, x1, x2, time, locExpList->UpdatePhys()); - - locExpList->IProductWRTBase( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); } + + locExpList->IProductWRTBase( + locExpList->GetPhys(), + locExpList->UpdateCoeffs()); } else if (m_bndConditions[i]->GetBoundaryConditionType() == SpatialDomains::eRobin) @@ -2275,40 +2214,7 @@ namespace Nektar if (filebcs != "") { - //Never tested!!! - string var = filebcs.substr( - 0, filebcs.find_last_of(".")); - int len = var.length(); - var = var.substr(len-1,len); - - std::vector FieldDef; - std::vector > FieldData; - LibUtilities::FieldIO f(m_session->GetComm()); - f.Import(filebcs, FieldDef, FieldData); - - // copy FieldData into locExpList - locExpList->ExtractDataToCoeffs( - FieldDef[0], FieldData[0], - FieldDef[0]->m_fields[0], - locExpList->UpdateCoeffs()); - locExpList->BwdTrans_IterPerExp( - locExpList->GetCoeffs(), - locExpList->UpdatePhys()); - locExpList->IProductWRTBase( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); - - LibUtilities::Equation coeff = - boost::static_pointer_cast< - SpatialDomains::RobinBoundaryCondition - >(m_bndConditions[i])->m_robinPrimitiveCoeff; - - // Array timeArray(npoints, time); - // put primitive coefficient into the physical space - // storage - coeff.Evaluate(x0,x1,x2,time, - locExpList->UpdatePhys()); + ExtractFileBCs(filebcs, varName, locExpList); } else { @@ -2317,22 +2223,22 @@ namespace Nektar SpatialDomains::RobinBoundaryCondition> (m_bndConditions[i])-> m_robinFunction; - LibUtilities::Equation coeff = - boost::static_pointer_cast< - SpatialDomains::RobinBoundaryCondition> - (m_bndConditions[i])-> - m_robinPrimitiveCoeff; condition.Evaluate(x0, x1, x2, time, locExpList->UpdatePhys()); - locExpList->IProductWRTBase( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); - - // put primitive coefficient into the physical space - // storage - coeff.Evaluate(x0, x1, x2, time, - locExpList->UpdatePhys()); } + + LibUtilities::Equation coeff = + boost::static_pointer_cast< + SpatialDomains::RobinBoundaryCondition>( + m_bndConditions[i])->m_robinPrimitiveCoeff; + locExpList->IProductWRTBase( + locExpList->GetPhys(), + locExpList->UpdateCoeffs()); + + // put primitive coefficient into the physical + // space storage + coeff.Evaluate(x0, x1, x2, time, + locExpList->UpdatePhys()); } else { diff --git a/library/MultiRegions/DisContField2D.h b/library/MultiRegions/DisContField2D.h index 5679850f8847d88e4cd3e88c4221994a44e020f4..c878f65111f9c9878bab264ea2bfd2d5fae70ac1 100644 --- a/library/MultiRegions/DisContField2D.h +++ b/library/MultiRegions/DisContField2D.h @@ -249,9 +249,10 @@ namespace Nektar } virtual void v_EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); virtual map v_GetRobinBCInfo(); }; diff --git a/library/MultiRegions/DisContField3D.cpp b/library/MultiRegions/DisContField3D.cpp index 62007ca3149924437455f4fa3190e5458c9ab6dc..84abba322a12e8c18a4400853fd3d151cd696933 100644 --- a/library/MultiRegions/DisContField3D.cpp +++ b/library/MultiRegions/DisContField3D.cpp @@ -83,12 +83,11 @@ { if(variable.compare("DefaultVar") != 0) // do not set up BCs if default variable { - SpatialDomains::BoundaryConditions bcs(m_session, graph3D); GenerateBoundaryConditionExpansion(graph3D,bcs,variable); - EvaluateBoundaryConditions(); - + EvaluateBoundaryConditions(0.0, variable); + // Find periodic edges for this variable. FindPeriodicFaces(bcs, variable); } @@ -141,7 +140,7 @@ SpatialDomains::BoundaryConditions bcs(m_session, graph3D); GenerateBoundaryConditionExpansion(graph3D,bcs,variable); - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); ApplyGeomInfo(); if(!SameTypeOfBoundaryConditions(In)) @@ -2395,111 +2394,98 @@ * @param bndCondExpansions List of boundary conditions. * @param bndConditions Information about the boundary conditions. */ - void DisContField3D::v_EvaluateBoundaryConditions(const NekDouble time, - const NekDouble x2_in, - const NekDouble x3_in) + void DisContField3D::v_EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { int i; int npoints; int nbnd = m_bndCondExpansions.num_elements(); MultiRegions::ExpListSharedPtr locExpList; - for(i = 0; i < nbnd; ++i) + for (i = 0; i < nbnd; ++i) { - if(time == 0.0 || m_bndConditions[i]->GetUserDefined() == - SpatialDomains::eTimeDependent) + if (time == 0.0 || m_bndConditions[i]->GetUserDefined() == + SpatialDomains::eTimeDependent) { locExpList = m_bndCondExpansions[i]; - npoints = locExpList->GetNpoints(); + npoints = locExpList->GetNpoints(); - Array x0(npoints,0.0); - Array x1(npoints,0.0); - Array x2(npoints,0.0); + Array x0(npoints, 0.0); + Array x1(npoints, 0.0); + Array x2(npoints, 0.0); - locExpList->GetCoords(x0,x1,x2); + locExpList->GetCoords(x0, x1, x2); - if(m_bndConditions[i]->GetBoundaryConditionType() - == SpatialDomains::eDirichlet) + if (m_bndConditions[i]->GetBoundaryConditionType() + == SpatialDomains::eDirichlet) { string filebcs = boost::static_pointer_cast< SpatialDomains::DirichletBoundaryCondition>( m_bndConditions[i])->m_filename; - if(filebcs != "") + if (filebcs != "") { - string varString = filebcs.substr( - 0, filebcs.find_last_of(".")); - int len = varString.length(); - varString = varString.substr(len-1, len); - int varInt = atoi(varString.c_str()); - cout << "Boundary condition from file:" - << filebcs << endl; - - std::vector FieldDef; - std::vector > FieldData; - Import(filebcs, FieldDef, FieldData); - - // copy FieldData into locExpList - locExpList->ExtractDataToCoeffs( - FieldDef[0], FieldData[0], - FieldDef[0]->m_fields[varInt], - locExpList->UpdateCoeffs()); - locExpList->BwdTrans_IterPerExp( - locExpList->GetCoeffs(), - locExpList->UpdatePhys()); - locExpList->FwdTrans_BndConstrained( - locExpList->GetPhys(), - locExpList->UpdateCoeffs()); + ExtractFileBCs(filebcs, varName, locExpList); } else { - LibUtilities::Equation condition = boost::static_pointer_cast< - SpatialDomains::DirichletBoundaryCondition >(m_bndConditions[i])->m_dirichletCondition; + LibUtilities::Equation condition = boost::static_pointer_cast( + m_bndConditions[i])->m_dirichletCondition; - condition.Evaluate(x0,x1,x2,time,locExpList->UpdatePhys()); + condition.Evaluate(x0, x1, x2, time, + locExpList->UpdatePhys()); - locExpList->FwdTrans_BndConstrained(locExpList->GetPhys(), - locExpList->UpdateCoeffs()); + locExpList->FwdTrans_BndConstrained( + locExpList->GetPhys(), + locExpList->UpdateCoeffs()); } } - else if(m_bndConditions[i]->GetBoundaryConditionType() - == SpatialDomains::eNeumann) + else if (m_bndConditions[i]->GetBoundaryConditionType() + == SpatialDomains::eNeumann) { - LibUtilities::Equation condition = boost::static_pointer_cast< - SpatialDomains::NeumannBoundaryCondition - >(m_bndConditions[i])->m_neumannCondition; + LibUtilities::Equation condition = boost:: + static_pointer_cast( + m_bndConditions[i])->m_neumannCondition; - condition.Evaluate(x0,x1,x2,time,locExpList->UpdatePhys()); + condition.Evaluate(x0, x1, x2, time, + locExpList->UpdatePhys()); locExpList->IProductWRTBase(locExpList->GetPhys(), locExpList->UpdateCoeffs()); } - else if(m_bndConditions[i]->GetBoundaryConditionType() - == SpatialDomains::eRobin) + else if (m_bndConditions[i]->GetBoundaryConditionType() + == SpatialDomains::eRobin) { - LibUtilities::Equation condition = boost::static_pointer_cast< - SpatialDomains::RobinBoundaryCondition - >(m_bndConditions[i])->m_robinFunction; + LibUtilities::Equation condition = boost:: + static_pointer_cast( + m_bndConditions[i])->m_robinFunction; - LibUtilities::Equation coeff = - boost::static_pointer_cast< - SpatialDomains::RobinBoundaryCondition - >(m_bndConditions[i])->m_robinPrimitiveCoeff; + LibUtilities::Equation coeff = boost:: + static_pointer_cast( + m_bndConditions[i])->m_robinPrimitiveCoeff; - condition.Evaluate(x0,x1,x2,time,locExpList->UpdatePhys()); + condition.Evaluate(x0, x1, x2, time, + locExpList->UpdatePhys()); locExpList->IProductWRTBase(locExpList->GetPhys(), locExpList->UpdateCoeffs()); - // put primitive coefficient into the physical space - // storage - coeff.Evaluate(x0,x1,x2,time, + // Put primitive coefficient into the physical + // space storage + coeff.Evaluate(x0, x1, x2, time, locExpList->UpdatePhys()); } else { - ASSERTL0(false,"This type of BC not implemented yet"); + ASSERTL0(false, "This type of BC not implemented yet"); } } } diff --git a/library/MultiRegions/DisContField3D.h b/library/MultiRegions/DisContField3D.h index e47e12a3bf055b0d89e7a67760af0e2f0ff83c69..91e123699d1dc9c4eff58fd9e13a95917d5fbf4a 100644 --- a/library/MultiRegions/DisContField3D.h +++ b/library/MultiRegions/DisContField3D.h @@ -237,9 +237,10 @@ namespace Nektar } virtual void v_EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); virtual map v_GetRobinBCInfo(); }; diff --git a/library/MultiRegions/DisContField3DHomogeneous1D.cpp b/library/MultiRegions/DisContField3DHomogeneous1D.cpp index 194ecfbb458325fd265d177e78489eafaeb45177..96d280a6c78fe4ac22904f3000c85f9360fb5a83 100644 --- a/library/MultiRegions/DisContField3DHomogeneous1D.cpp +++ b/library/MultiRegions/DisContField3DHomogeneous1D.cpp @@ -216,11 +216,12 @@ namespace Nektar PlanesBndCondExp); } } - EvaluateBoundaryConditions(); + EvaluateBoundaryConditions(0.0, variable); } void DisContField3DHomogeneous1D::EvaluateBoundaryConditions( - const NekDouble time) + const NekDouble time, + const std::string varName) { int n; const Array z = m_homogeneousBasis->GetZ(); @@ -234,7 +235,7 @@ namespace Nektar for (n = 0; n < m_planes.num_elements(); ++n) { m_planes[n]->EvaluateBoundaryConditions( - time,0.5*m_lhom*(1.0+local_z[n])); + time, varName, 0.5*m_lhom*(1.0+local_z[n])); } // Fourier transform coefficient space boundary values @@ -301,11 +302,12 @@ namespace Nektar } void DisContField3DHomogeneous1D::v_EvaluateBoundaryConditions( - const NekDouble time, - const NekDouble x2_in, - const NekDouble x3_in) + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { - EvaluateBoundaryConditions(time); + EvaluateBoundaryConditions(time, varName); } boost::shared_ptr &DisContField3DHomogeneous1D:: diff --git a/library/MultiRegions/DisContField3DHomogeneous1D.h b/library/MultiRegions/DisContField3DHomogeneous1D.h index dece0550ec481e59cfa81826052295701da02ef6..aa3c2ee61823c38c66a2971f257fd178a6431f36 100644 --- a/library/MultiRegions/DisContField3DHomogeneous1D.h +++ b/library/MultiRegions/DisContField3DHomogeneous1D.h @@ -118,7 +118,8 @@ namespace Nektar * evaluated */ MULTI_REGIONS_EXPORT void EvaluateBoundaryConditions( - const NekDouble time = 0.0); + const NekDouble time = 0.0, + const std::string varName = ""); inline const Array &GetBndCondExpansions(); @@ -270,9 +271,10 @@ namespace Nektar const Array &dirForcing); virtual void v_EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); virtual boost::shared_ptr &v_UpdateBndCondExpansion(int i); diff --git a/library/MultiRegions/DisContField3DHomogeneous2D.cpp b/library/MultiRegions/DisContField3DHomogeneous2D.cpp index 824886af878c1ba8090134bb36f65e415ac3edbc..cf44b7d623468fa96cf621c0884af12598b91fb8 100644 --- a/library/MultiRegions/DisContField3DHomogeneous2D.cpp +++ b/library/MultiRegions/DisContField3DHomogeneous2D.cpp @@ -175,29 +175,33 @@ namespace Nektar EvaluateBoundaryConditions(); } - void DisContField3DHomogeneous2D::EvaluateBoundaryConditions(const NekDouble time) + void DisContField3DHomogeneous2D::EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName) { - int n,m; - + int n, m; const Array y = m_homogeneousBasis_y->GetZ(); const Array z = m_homogeneousBasis_z->GetZ(); - - for(n = 0; n < m_nz; ++n) + for (n = 0; n < m_nz; ++n) { - for(m = 0; m < m_ny; ++m) + for (m = 0; m < m_ny; ++m) { - m_lines[m+(n*m_ny)]->EvaluateBoundaryConditions(time,0.5*m_lhom_y*(1.0+y[m]),0.5*m_lhom_z*(1.0+z[n])); + m_lines[m+(n*m_ny)]->EvaluateBoundaryConditions( + time, varName, 0.5*m_lhom_y*(1.0+y[m]), + 0.5*m_lhom_z*(1.0+z[n])); } } // Fourier transform coefficient space boundary values - for(n = 0; n < m_bndCondExpansions.num_elements(); ++n) + for (n = 0; n < m_bndCondExpansions.num_elements(); ++n) { - if(time == 0.0 || m_bndConditions[n]->GetUserDefined() == - SpatialDomains::eTimeDependent) + if (time == 0.0 || m_bndConditions[n]->GetUserDefined() == + SpatialDomains::eTimeDependent) { - m_bndCondExpansions[n]->HomogeneousFwdTrans(m_bndCondExpansions[n]->GetCoeffs(),m_bndCondExpansions[n]->UpdateCoeffs()); + m_bndCondExpansions[n]->HomogeneousFwdTrans( + m_bndCondExpansions[n]->GetCoeffs(), + m_bndCondExpansions[n]->UpdateCoeffs()); } } } @@ -251,10 +255,14 @@ namespace Nektar } } - void DisContField3DHomogeneous2D::v_EvaluateBoundaryConditions(const NekDouble time,const NekDouble x2_in, const NekDouble x3_in) - { - EvaluateBoundaryConditions(time); - } + void DisContField3DHomogeneous2D::v_EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) + { + EvaluateBoundaryConditions(time, varName); + } const Array > &DisContField3DHomogeneous2D::v_GetBndCondExpansions(void) { diff --git a/library/MultiRegions/DisContField3DHomogeneous2D.h b/library/MultiRegions/DisContField3DHomogeneous2D.h index 5589d5403d7ad030b3bccbb846e33d74d65eb617..6fbdb160e949f54005c49d65bb7d538e5d3c7447 100644 --- a/library/MultiRegions/DisContField3DHomogeneous2D.h +++ b/library/MultiRegions/DisContField3DHomogeneous2D.h @@ -81,7 +81,9 @@ namespace Nektar const NekDouble lhom_z, SpatialDomains::BoundaryConditions &bcs); - MULTI_REGIONS_EXPORT void EvaluateBoundaryConditions(const NekDouble time = 0.0); + MULTI_REGIONS_EXPORT void EvaluateBoundaryConditions( + const NekDouble time = 0.0, + const std::string varName = ""); inline const Array &GetBndCondExpansions(); @@ -130,9 +132,11 @@ namespace Nektar const StdRegions::VarCoeffMap &varcoeff, const Array &dirForcing); - virtual void v_EvaluateBoundaryConditions(const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + virtual void v_EvaluateBoundaryConditions( + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); virtual const Array > &v_GetBndCondExpansions(void); diff --git a/library/MultiRegions/ExpList.cpp b/library/MultiRegions/ExpList.cpp index 80c971b0694ca2efef1d3baae4c3734053fdc28e..fb2ee0b95a61b799d4dc28f331f3227dfba71e84 100644 --- a/library/MultiRegions/ExpList.cpp +++ b/library/MultiRegions/ExpList.cpp @@ -1220,60 +1220,92 @@ namespace Nektar Array &locCoords, NekDouble tol) { - static int start = 0; - NekDouble resid, min_resid = NekConstants::kNekMinResidInit; - int min_elmt; - Array min_locCoords(locCoords.num_elements()); + NekDouble resid; - // start search at previous element or 0 - for (int i = start; i < (*m_exp).size(); ++i) + if (GetNumElmts() == 0) { - if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoords, locCoords, - tol, resid)) + return -1; + } + + // Manifold case (point may match multiple elements) + if (GetExp(0)->GetCoordim() > GetExp(0)->GetShapeDimension()) + { + std::vector > elmtIdDist; + SpatialDomains::PointGeomSharedPtr v; + SpatialDomains::PointGeom w; + NekDouble x, y, z; + + // Scan all elements and store those which may contain the point + for (int i = 0; i < (*m_exp).size(); ++i) { - start = i; - return i; + if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoords, locCoords, + tol, resid)) + { + v = m_graph->GetVertex((*m_exp)[i]->GetGeom()->GetVid(0)); + + w.SetX(gloCoords[0]); + w.SetY(gloCoords[1]); + w.SetZ(gloCoords[2]); + v->GetCoords(x,y,z); + + elmtIdDist.push_back(std::pair(i, v->dist(w))); + } } - else + + // Find nearest element + if (!elmtIdDist.empty()) { - if(resid < min_resid) + NekDouble min_d = elmtIdDist[0].first; + int min_id = elmtIdDist[0].second; + + for (int i = 1; i < elmtIdDist.size(); ++i) { - min_resid = resid; - min_elmt = i; - Vmath::Vcopy(locCoords.num_elements(), locCoords, 1, - min_locCoords,1); + if (elmtIdDist[i].second < min_d) { + min_d = elmtIdDist[i].second; + min_id = elmtIdDist[i].first; + } } + + return min_id; + } + else { + return -1; } } - - for (int i = 0; i < start; ++i) + // non-embedded mesh (point can only match one element) + else { - if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoords, locCoords, - tol,resid)) + static int start = 0; + + // restart search from last found value + for (int i = start; i < (*m_exp).size(); ++i) { - start = i; - return i; + if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoords, locCoords, + tol, resid)) + { + start = i; + return i; + } } - else + + for (int i = 0; i < start; ++i) { - if(resid < min_resid) + if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoords, locCoords, + tol, resid)) { - min_resid = resid; - min_elmt = i; - Vmath::Vcopy(locCoords.num_elements(), locCoords, 1, - min_locCoords,1); + start = i; + return i; } } - } - - std::string msg = "Failed to find point in element to tolerance of " + + std::string msg = "Failed to find point in element to tolerance of " + boost::lexical_cast(resid) + " using nearest point found"; - WARNINGL0(true,msg.c_str()); + WARNINGL0(true,msg.c_str()); - Vmath::Vcopy(locCoords.num_elements(),min_locCoords,1,locCoords,1); + return -1; - return min_elmt; + } } @@ -1748,7 +1780,45 @@ namespace Nektar ASSERTL0(false, "This method is not defined or valid for this class type"); } - + + void ExpList::ExtractFileBCs( + const std::string &fileName, + const std::string &varName, + const boost::shared_ptr locExpList) + { + string varString = fileName.substr(0, fileName.find_last_of(".")); + int j, k, len = varString.length(); + varString = varString.substr(len-1, len); + + std::vector FieldDef; + std::vector > FieldData; + + LibUtilities::FieldIO f(m_session->GetComm()); + f.Import(fileName, FieldDef, FieldData); + + bool found = false; + for (j = 0; j < FieldDef.size(); ++j) + { + for (k = 0; k < FieldDef[j]->m_fields.size(); ++k) + { + if (FieldDef[j]->m_fields[k] == varName) + { + // Copy FieldData into locExpList + locExpList->ExtractDataToCoeffs( + FieldDef[j], FieldData[j], + FieldDef[j]->m_fields[k], + locExpList->UpdateCoeffs()); + found = true; + } + } + } + + ASSERTL0(found, "Could not find variable '"+varName+ + "' in file boundary condition "+fileName); + locExpList->BwdTrans_IterPerExp( + locExpList->GetCoeffs(), + locExpList->UpdatePhys()); + } /** * Given a spectral/hp approximation @@ -2452,7 +2522,7 @@ namespace Nektar { ASSERTL0(false, "This method is not defined or valid for this class type"); - static Array + static Array result; return result; } @@ -2463,14 +2533,17 @@ namespace Nektar { ASSERTL0(false, "This method is not defined or valid for this class type"); - static Array - result; + static Array result; return result; } /** */ - void ExpList::v_EvaluateBoundaryConditions(const NekDouble time, const NekDouble x2_in, const NekDouble x3_in) + void ExpList::v_EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { ASSERTL0(false, "This method is not defined or valid for this class type"); diff --git a/library/MultiRegions/ExpList.h b/library/MultiRegions/ExpList.h index 6fd6af2c4c4ed70b82189d4b1c148c95b057f8f2..85361ea135d844b4dd8b0a5c8e709d9afd99e0d5 100644 --- a/library/MultiRegions/ExpList.h +++ b/library/MultiRegions/ExpList.h @@ -705,10 +705,10 @@ namespace Nektar BoundaryConditionShPtr>& UpdateBndConditions(); inline void EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble = NekConstants::kNekUnsetDouble, - const NekDouble = NekConstants::kNekUnsetDouble); - + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble = NekConstants::kNekUnsetDouble, + const NekDouble = NekConstants::kNekUnsetDouble); // Routines for continous matrix solution /// This function calculates the result of the multiplication of a @@ -1274,7 +1274,11 @@ namespace Nektar const NekDouble scale, const Array &inarray, Array &outarray); - + + void ExtractFileBCs(const std::string &fileName, + const std::string &varName, + const boost::shared_ptr locExpList); + // Utility function for a common case of retrieving a // BoundaryCondition from a boundary condition collection. MULTI_REGIONS_EXPORT @@ -1290,9 +1294,10 @@ namespace Nektar &v_UpdateBndConditions(); virtual void v_EvaluateBoundaryConditions( - const NekDouble time = 0.0, - const NekDouble x2_in = NekConstants::kNekUnsetDouble, - const NekDouble x3_in = NekConstants::kNekUnsetDouble); + const NekDouble time = 0.0, + const std::string varName = "", + const NekDouble x2_in = NekConstants::kNekUnsetDouble, + const NekDouble x3_in = NekConstants::kNekUnsetDouble); virtual map v_GetRobinBCInfo(void); @@ -2047,11 +2052,13 @@ namespace Nektar return v_UpdateBndConditions(); } - inline void ExpList::EvaluateBoundaryConditions(const NekDouble time, - const NekDouble x2_in, - const NekDouble x3_in) + inline void ExpList::EvaluateBoundaryConditions( + const NekDouble time, + const std::string varName, + const NekDouble x2_in, + const NekDouble x3_in) { - v_EvaluateBoundaryConditions(time,x2_in,x3_in); + v_EvaluateBoundaryConditions(time, varName, x2_in, x3_in); } // Routines for continous matrix solution diff --git a/library/SolverUtils/Diffusion/DiffusionLDG.cpp b/library/SolverUtils/Diffusion/DiffusionLDG.cpp index f4acb09630d12febc02715b762e6e328198772c7..a37dbef0d1924769505bf93dd26c093b2e05c07f 100644 --- a/library/SolverUtils/Diffusion/DiffusionLDG.cpp +++ b/library/SolverUtils/Diffusion/DiffusionLDG.cpp @@ -259,7 +259,7 @@ namespace Nektar { // Number of points on the expansion nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); id1 = fields[var]-> GetBndCondExpansions()[i]->GetPhys_Offset(e); @@ -443,7 +443,7 @@ namespace Nektar for (e = 0; e < nBndEdges ; ++e) { nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); id1 = fields[var]-> GetBndCondExpansions()[i]->GetPhys_Offset(e); diff --git a/library/SolverUtils/Diffusion/DiffusionLDGNS.cpp b/library/SolverUtils/Diffusion/DiffusionLDGNS.cpp index 2420a316836da499abf73c7534100ce8e7bb6b96..eeef33515c7d8accdd1407c906b7a7cd83bfea39 100644 --- a/library/SolverUtils/Diffusion/DiffusionLDGNS.cpp +++ b/library/SolverUtils/Diffusion/DiffusionLDGNS.cpp @@ -315,7 +315,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[i+1]-> - GetBndCondExpansions()[j]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints(); id1 = fields[i+1]-> GetBndCondExpansions()[j]->GetPhys_Offset(e); @@ -395,7 +395,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[nScalars]-> - GetBndCondExpansions()[j]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints(); id1 = fields[nScalars]-> GetBndCondExpansions()[j]->GetPhys_Offset(e); @@ -563,7 +563,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); id2 = fields[0]->GetTrace()-> GetPhys_Offset(fields[0]->GetTraceMap()-> diff --git a/library/SolverUtils/Diffusion/DiffusionLFR.cpp b/library/SolverUtils/Diffusion/DiffusionLFR.cpp index bd36d32576b6ef7c8efa481289965d9bd6e56e85..12f964964233a237257c0346d02f7a2a4e63eb5a 100644 --- a/library/SolverUtils/Diffusion/DiffusionLFR.cpp +++ b/library/SolverUtils/Diffusion/DiffusionLFR.cpp @@ -1254,7 +1254,7 @@ namespace Nektar { // Number of points on the expansion nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); // Offset of the boundary expansion id1 = fields[var]-> @@ -1415,7 +1415,7 @@ namespace Nektar for (e = 0; e < nBndEdges ; ++e) { nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); id1 = fields[var]-> GetBndCondExpansions()[i]->GetPhys_Offset(e); diff --git a/library/SolverUtils/Diffusion/DiffusionLFRNS.cpp b/library/SolverUtils/Diffusion/DiffusionLFRNS.cpp index 3f694fe33613da265f962682de1ac016553bd20c..45ff35859741336ddbdd6d7927ce4825442ae53e 100644 --- a/library/SolverUtils/Diffusion/DiffusionLFRNS.cpp +++ b/library/SolverUtils/Diffusion/DiffusionLFRNS.cpp @@ -1330,7 +1330,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[i+1]-> - GetBndCondExpansions()[j]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints(); id1 = fields[i+1]-> GetBndCondExpansions()[j]->GetPhys_Offset(e); @@ -1412,7 +1412,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[nScalars]-> - GetBndCondExpansions()[j]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints(); id1 = fields[nScalars]-> GetBndCondExpansions()[j]->GetPhys_Offset(e); @@ -1580,7 +1580,7 @@ namespace Nektar for (e = 0; e < nBndEdges; ++e) { nBndEdgePts = fields[var]-> - GetBndCondExpansions()[i]->GetExp(e)->GetNumPoints(0); + GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints(); id2 = fields[0]->GetTrace()-> GetPhys_Offset(fields[0]->GetTraceMap()-> diff --git a/library/SolverUtils/EquationSystem.cpp b/library/SolverUtils/EquationSystem.cpp index b7cf29ff76af4e34a664a6f11962e7a38365b5ea..f38c30c3d8cebd709ce73ca9c85634d882b80a6f 100644 --- a/library/SolverUtils/EquationSystem.cpp +++ b/library/SolverUtils/EquationSystem.cpp @@ -857,10 +857,12 @@ namespace Nektar */ void EquationSystem::SetBoundaryConditions(NekDouble time) { + std::string varName; int nvariables = m_fields.num_elements(); for (int i = 0; i < nvariables; ++i) { - m_fields[i]->EvaluateBoundaryConditions(time); + varName = m_session->GetVariable(i); + m_fields[i]->EvaluateBoundaryConditions(time, varName); } } diff --git a/library/SpatialDomains/MeshGraph.cpp b/library/SpatialDomains/MeshGraph.cpp index ddc42e13233b456cab2f7acbc702cb1abe88dd81..1316ff0aa80c046bce138076a841cf6d4271cc00 100644 --- a/library/SpatialDomains/MeshGraph.cpp +++ b/library/SpatialDomains/MeshGraph.cpp @@ -2045,6 +2045,43 @@ namespace Nektar } } break; + case LibUtilities::ePyramid: + { + k = fielddef[i]->m_elementIDs[j]; + ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(), + "Failed to find geometry with same global id"); + geom = m_pyrGeoms[k]; + + for(int b = 0; b < 3; ++b) + { + LibUtilities::PointsKey pkey(nmodes[cnt+b],points[b]); + + if(numPointDef&&pointDef) + { + const LibUtilities::PointsKey pkey2(npoints[cnt+b],points[b]); + pkey = pkey2; + } + else if(!numPointDef&&pointDef) + { + const LibUtilities::PointsKey pkey2(nmodes[cnt+b]+1,points[b]); + pkey = pkey2; + } + else if(numPointDef&&!pointDef) + { + const LibUtilities::PointsKey pkey2(npoints[cnt+b],LibUtilities::eGaussLobattoLegendre); + pkey = pkey2; + } + + LibUtilities::BasisKey bkey(basis[b],nmodes[cnt+b],pkey); + bkeyvec.push_back(bkey); + } + + if(!UniOrder) + { + cnt += 3; + } + } + break; case LibUtilities::eHexahedron: { k = fielddef[i]->m_elementIDs[j]; @@ -2256,6 +2293,26 @@ namespace Nektar } } break; + case LibUtilities::ePyramid: + { + k = fielddef[i]->m_elementIDs[j]; + ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(), + "Failed to find geometry with same global id"); + geom = m_pyrGeoms[k]; + + for(int b = 0; b < 3; ++b) + { + const LibUtilities::PointsKey pkey(nmodes[cnt+b],pointstype[i][b]); + LibUtilities::BasisKey bkey(basis[b],nmodes[cnt+b],pkey); + bkeyvec.push_back(bkey); + } + + if(!UniOrder) + { + cnt += 2; + } + } + break; case LibUtilities::ePrism: { k = fielddef[i]->m_elementIDs[j]; @@ -2476,6 +2533,18 @@ namespace Nektar returnval.push_back(bkey2); } break; + case LibUtilities::ePyramid: + { + const LibUtilities::PointsKey pkey(nummodes+quadoffset, LibUtilities::eGaussLobattoLegendre); + LibUtilities::BasisKey bkey(LibUtilities::eModified_A, nummodes, pkey); + returnval.push_back(bkey); + returnval.push_back(bkey); + + const LibUtilities::PointsKey pkey1(nummodes+quadoffset-1, LibUtilities::eGaussRadauMAlpha2Beta0); + LibUtilities::BasisKey bkey1(LibUtilities::eModified_C, nummodes, pkey1); + returnval.push_back(bkey1); + } + break; case LibUtilities::ePrism: { const LibUtilities::PointsKey pkey(nummodes+quadoffset, LibUtilities::eGaussLobattoLegendre); diff --git a/library/SpatialDomains/PyrGeom.cpp b/library/SpatialDomains/PyrGeom.cpp index 56e01b4d85aa670399b52699b379017bc53a5747..e2a745fe9f7efb110ece993bcb2c7b6c0e9b37ee 100644 --- a/library/SpatialDomains/PyrGeom.cpp +++ b/library/SpatialDomains/PyrGeom.cpp @@ -69,17 +69,100 @@ namespace Nektar SetUpEdgeOrientation(); SetUpFaceOrientation(); - /// TODO: When pyramid is implemented, determine correct order for - /// standard region here. + /// Determine necessary order for standard region. + vector tmp; - const LibUtilities::BasisKey A( - LibUtilities::eModified_A, 2, - LibUtilities::PointsKey(3,LibUtilities::eGaussLobattoLegendre)); + int order0, points0, order1, points1; + + if (m_forient[0] < 9) + { + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(0)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(2)); + order0 = *max_element(tmp.begin(), tmp.end()); + + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(0)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(2)); + points0 = *max_element(tmp.begin(), tmp.end()); + } + else + { + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(1)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(3)); + order0 = *max_element(tmp.begin(), tmp.end()); + + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(1)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(3)); + points0 = *max_element(tmp.begin(), tmp.end()); + } + + if (m_forient[0] < 9) + { + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(1)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(3)); + tmp.push_back(faces[2]->GetXmap()->GetEdgeNcoeffs(2)); + order1 = *max_element(tmp.begin(), tmp.end()); + + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(1)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(3)); + tmp.push_back(faces[2]->GetXmap()->GetEdgeNumPoints(2)); + points1 = *max_element(tmp.begin(), tmp.end()); + } + else + { + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(0)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(2)); + tmp.push_back(faces[2]->GetXmap()->GetEdgeNcoeffs(2)); + order1 = *max_element(tmp.begin(), tmp.end()); + + tmp.clear(); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(0)); + tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(2)); + tmp.push_back(faces[2]->GetXmap()->GetEdgeNumPoints(2)); + points1 = *max_element(tmp.begin(), tmp.end()); + } + + tmp.clear(); + tmp.push_back(order0); + tmp.push_back(order1); + tmp.push_back(faces[1]->GetXmap()->GetEdgeNcoeffs(1)); + tmp.push_back(faces[1]->GetXmap()->GetEdgeNcoeffs(2)); + tmp.push_back(faces[3]->GetXmap()->GetEdgeNcoeffs(1)); + tmp.push_back(faces[3]->GetXmap()->GetEdgeNcoeffs(2)); + int order2 = *max_element(tmp.begin(), tmp.end()); + + tmp.clear(); + tmp.push_back(points0); + tmp.push_back(points1); + tmp.push_back(faces[1]->GetXmap()->GetEdgeNumPoints(1)); + tmp.push_back(faces[1]->GetXmap()->GetEdgeNumPoints(2)); + tmp.push_back(faces[3]->GetXmap()->GetEdgeNumPoints(1)); + tmp.push_back(faces[3]->GetXmap()->GetEdgeNumPoints(2)); + tmp.push_back(faces[1]->GetEdge(1)->GetBasis(0)->GetNumPoints()); + tmp.push_back(faces[1]->GetEdge(2)->GetBasis(0)->GetNumPoints()); + tmp.push_back(faces[3]->GetEdge(1)->GetBasis(0)->GetNumPoints()); + tmp.push_back(faces[3]->GetEdge(2)->GetBasis(0)->GetNumPoints()); + int points2 = *max_element(tmp.begin(), tmp.end()); + + const LibUtilities::BasisKey A1( + LibUtilities::eModified_A, order0, + LibUtilities::PointsKey( + points0, LibUtilities::eGaussLobattoLegendre)); + const LibUtilities::BasisKey A2( + LibUtilities::eModified_A, order1, + LibUtilities::PointsKey( + points1, LibUtilities::eGaussLobattoLegendre)); const LibUtilities::BasisKey C( - LibUtilities::eModified_C, 2, - LibUtilities::PointsKey(3,LibUtilities::eGaussRadauMAlpha2Beta0)); + LibUtilities::eModified_C, order2, + LibUtilities::PointsKey( + points2, LibUtilities::eGaussRadauMAlpha2Beta0)); - m_xmap = MemoryManager::AllocateSharedPtr(A,A,C); + m_xmap = MemoryManager::AllocateSharedPtr( + A1, A2, C); SetUpCoeffs(m_xmap->GetNcoeffs()); } @@ -88,6 +171,50 @@ namespace Nektar } + void PyrGeom::v_GenGeomFactors() + { + if (m_geomFactorsState != ePtsFilled) + { + int i; + GeomType Gtype = eRegular; + + v_FillGeom(); + + // check to see if expansions are linear + for(i = 0; i < m_coordim; ++i) + { + if (m_xmap->GetBasisNumModes(0) != 2 || + m_xmap->GetBasisNumModes(1) != 2 || + m_xmap->GetBasisNumModes(2) != 2 ) + { + Gtype = eDeformed; + } + } + + // check to see if all quadrilateral faces are parallelograms + if(Gtype == eRegular) + { + // Ensure each face is a parallelogram? Check this. + for (i = 0; i < m_coordim; i++) + { + if( fabs( (*m_verts[0])(i) - + (*m_verts[1])(i) + + (*m_verts[2])(i) - + (*m_verts[3])(i) ) + > NekConstants::kNekZeroTol ) + { + Gtype = eDeformed; + break; + } + } + } + + m_geomFactors = MemoryManager::AllocateSharedPtr( + Gtype, m_coordim, m_xmap, m_coeffs); + m_geomFactorsState = ePtsFilled; + } + } + NekDouble PyrGeom::v_GetLocCoords( const Array &coords, Array &Lcoords) @@ -176,15 +303,16 @@ namespace Nektar SegGeomSharedPtr edge; // First set up the 4 bottom edges - int faceConnected; - for(faceConnected = 1; faceConnected < 5 ; faceConnected++) + int f; + for (f = 1; f < 5; f++) { + int nEdges = m_faces[f]->GetNumEdges(); check = 0; - for(i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - for(j = 0; j < 4; j++) + for (j = 0; j < nEdges; j++) { - if( (m_faces[0])->GetEid(i) == (m_faces[faceConnected])->GetEid(j) ) + if (m_faces[0]->GetEid(i) == m_faces[f]->GetEid(j)) { edge = boost::dynamic_pointer_cast((m_faces[0])->GetEdge(i)); m_edges.push_back(edge); @@ -193,27 +321,27 @@ namespace Nektar } } - if( check < 1 ) + if (check < 1) { std::ostringstream errstrm; errstrm << "Connected faces do not share an edge. Faces "; - errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[faceConnected])->GetFid(); + errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[f])->GetFid(); ASSERTL0(false, errstrm.str()); } - else if( check > 1) + else if (check > 1) { std::ostringstream errstrm; errstrm << "Connected faces share more than one edge. Faces "; - errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[faceConnected])->GetFid(); + errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[f])->GetFid(); ASSERTL0(false, errstrm.str()); } } // Then, set up the 4 vertical edges check = 0; - for(i = 0; i < 4; i++) //Set up the vertical edge :face(1) and face(4) + for(i = 0; i < 3; i++) //Set up the vertical edge :face(1) and face(4) { - for(j = 0; j < 4; j++) + for(j = 0; j < 3; j++) { if( (m_faces[1])->GetEid(i) == (m_faces[4])->GetEid(j) ) { @@ -237,17 +365,18 @@ namespace Nektar errstrm << (m_faces[1])->GetFid() << ", " << (m_faces[4])->GetFid(); ASSERTL0(false, errstrm.str()); } + // Set up vertical edges: face(1) through face(4) - for(faceConnected = 1; faceConnected < 4 ; faceConnected++) + for (f = 1; f < 4; f++) { check = 0; - for(i = 0; i < 4; i++) + for(i = 0; i < m_faces[f]->GetNumEdges(); i++) { - for(j = 0; j < 4; j++) + for(j = 0; j < m_faces[f+1]->GetNumEdges(); j++) { - if( (m_faces[faceConnected])->GetEid(i) == (m_faces[faceConnected+1])->GetEid(j) ) + if( (m_faces[f])->GetEid(i) == (m_faces[f+1])->GetEid(j)) { - edge = boost::dynamic_pointer_cast((m_faces[faceConnected])->GetEdge(i)); + edge = boost::dynamic_pointer_cast((m_faces[f])->GetEdge(i)); m_edges.push_back(edge); check++; } @@ -258,33 +387,30 @@ namespace Nektar { std::ostringstream errstrm; errstrm << "Connected faces do not share an edge. Faces "; - errstrm << (m_faces[faceConnected])->GetFid() << ", " << (m_faces[faceConnected+1])->GetFid(); + errstrm << (m_faces[f])->GetFid() << ", " << (m_faces[f+1])->GetFid(); ASSERTL0(false, errstrm.str()); } else if( check > 1) { std::ostringstream errstrm; errstrm << "Connected faces share more than one edge. Faces "; - errstrm << (m_faces[faceConnected])->GetFid() << ", " << (m_faces[faceConnected+1])->GetFid(); + errstrm << (m_faces[f])->GetFid() << ", " << (m_faces[f+1])->GetFid(); ASSERTL0(false, errstrm.str()); } } + } - }; - - - void PyrGeom::SetUpLocalVertices(){ - - + void PyrGeom::SetUpLocalVertices() + { // Set up the first 2 vertices (i.e. vertex 0,1) - if( ( m_edges[0]->GetVid(0) == m_edges[1]->GetVid(0) ) || - ( m_edges[0]->GetVid(0) == m_edges[1]->GetVid(1) ) ) + if (m_edges[0]->GetVid(0) == m_edges[1]->GetVid(0) || + m_edges[0]->GetVid(0) == m_edges[1]->GetVid(1)) { m_verts.push_back(m_edges[0]->GetVertex(1)); m_verts.push_back(m_edges[0]->GetVertex(0)); } - else if( ( m_edges[0]->GetVid(1) == m_edges[1]->GetVid(0) ) || - ( m_edges[0]->GetVid(1) == m_edges[1]->GetVid(1) ) ) + else if (m_edges[0]->GetVid(1) == m_edges[1]->GetVid(0) || + m_edges[0]->GetVid(1) == m_edges[1]->GetVid(1)) { m_verts.push_back(m_edges[0]->GetVertex(0)); m_verts.push_back(m_edges[0]->GetVertex(1)); @@ -300,11 +426,11 @@ namespace Nektar // set up the other bottom vertices (i.e. vertex 2,3) for(int i = 1; i < 3; i++) { - if( m_edges[i]->GetVid(0) == m_verts[i]->GetVid() ) + if (m_edges[i]->GetVid(0) == m_verts[i]->GetVid()) { m_verts.push_back(m_edges[i]->GetVertex(1)); } - else if( m_edges[i]->GetVid(1) == m_verts[i]->GetVid() ) + else if (m_edges[i]->GetVid(1) == m_verts[i]->GetVid()) { m_verts.push_back(m_edges[i]->GetVertex(0)); } @@ -317,34 +443,51 @@ namespace Nektar } } - // set up top vertices - // First, set up top vertice 4 TODO + // set up top vertex + if (m_edges[4]->GetVid(0) == m_verts[0]->GetVid()) + { + m_verts.push_back(m_edges[4]->GetVertex(1)); + } + else + { + m_verts.push_back(m_edges[4]->GetVertex(0)); + } + + int check = 0; + for (int i = 5; i < 8; ++i) + { + if( (m_edges[i]->GetVid(0) == m_verts[i-4]->GetVid() + && m_edges[i]->GetVid(1) == m_verts[4]->GetVid()) + ||(m_edges[i]->GetVid(1) == m_verts[i-4]->GetVid() + && m_edges[i]->GetVid(0) == m_verts[4]->GetVid())) + { + check++; + } + } + if (check != 3) { + std::ostringstream errstrm; + errstrm << "Connected edges do not share a vertex. Edges "; + errstrm << m_edges[3]->GetEid() << ", " << m_edges[2]->GetEid(); + ASSERTL0(false, errstrm.str()); + } } void PyrGeom::SetUpEdgeOrientation() { - // This 2D array holds the local id's of all the vertices - // for every edge. For every edge, they are ordered to what we - // define as being Forwards + // This 2D array holds the local id's of all the vertices for every + // edge. For every edge, they are ordered to what we define as being + // Forwards. const unsigned int edgeVerts[kNedges][2] = - { {0,1} , - {1,2} , - {2,3} , - {3,0} , - {0,4} , - {1,4} , - {2,4} , - {3,4} }; - + { {0,1}, {1,2}, {3,2}, {0,3}, {0,4}, {1,4}, {2,4}, {3,4} }; int i; - for(i = 0; i < kNedges; i++) + for (i = 0; i < kNedges; i++) { - if( m_edges[i]->GetVid(0) == m_verts[ edgeVerts[i][0] ]->GetVid() ) + if (m_edges[i]->GetVid(0) == m_verts[edgeVerts[i][0]]->GetVid()) { m_eorient[i] = StdRegions::eForwards; } - else if( m_edges[i]->GetVid(0) == m_verts[ edgeVerts[i][1] ]->GetVid() ) + else if (m_edges[i]->GetVid(0) == m_verts[edgeVerts[i][1]]->GetVid()) { m_eorient[i] = StdRegions::eBackwards; } @@ -359,12 +502,11 @@ namespace Nektar { int f,i; - // These arrays represent the vector of the A and B - // coordinate of the local elemental coordinate system - // where A corresponds with the coordinate direction xi_i - // with the lowest index i (for that particular face) - // Coordinate 'B' then corresponds to the other local - // coordinate (i.e. with the highest index) + // These arrays represent the vector of the A and B coordinate of + // the local elemental coordinate system where A corresponds with + // the coordinate direction xi_i with the lowest index i (for that + // particular face) Coordinate 'B' then corresponds to the other + // local coordinate (i.e. with the highest index) Array elementAaxis(m_coordim); Array elementBaxis(m_coordim); @@ -375,10 +517,9 @@ namespace Nektar Array faceAaxis(m_coordim); Array faceBaxis(m_coordim); - // This is the base vertex of the face (i.e. the Geometry2D) - // This corresponds to thevertex with local ID 0 of the - // Geometry2D - //unsigned int baseVertex; + // This is the base vertex of the face (i.e. the Geometry2D) This + // corresponds to thevertex with local ID 0 of the Geometry2D + unsigned int baseVertex; // The lenght of the vectors above NekDouble elementAaxis_length; @@ -386,18 +527,16 @@ namespace Nektar NekDouble faceAaxis_length; NekDouble faceBaxis_length; - // This 2D array holds the local id's of all the vertices - // for every face. For every face, they are ordered in such - // a way that the implementation below allows a unified approach - // for all faces. - /* - const unsigned int faceVerts[kNfaces][TriGeom::kNverts] = // TODO must fix this - { {0,1,2} , // {0,1,2,3} , - {0,1,4} , - {1,2,4} , - {3,2,4} , - {0,3,4} }; - */ + // This 2D array holds the local id's of all the vertices for every + // face. For every face, they are ordered in such a way that the + // implementation below allows a unified approach for all faces. + const unsigned int faceVerts[kNfaces][4] = { + {0,1,2,3}, + {0,1,4,0}, // Last four elements are triangles which only + {1,2,4,0}, // require three vertices. + {3,2,4,0}, + {0,3,4,0} + }; NekDouble dotproduct1 = 0.0; NekDouble dotproduct2 = 0.0; @@ -416,60 +555,72 @@ namespace Nektar dotproduct1 = 0.0; dotproduct2 = 0.0; - //baseVertex = m_faces[f]->GetVid(0); + baseVertex = m_faces[f]->GetVid(0); - // We are going to construct the vectors representing the A and B axis - // of every face. These vectors will be constructed as a vector-representation - // of the edges of the face. However, for both coordinate directions, we can - // represent the vectors by two different edges. That's why we need to make sure that - // we pick the edge to which the baseVertex of the Geometry2D-representation of the face - // belongs... + // We are going to construct the vectors representing the A and + // B axis of every face. These vectors will be constructed as a + // vector-representation of the edges of the face. However, for + // both coordinate directions, we can represent the vectors by + // two different edges. That's why we need to make sure that we + // pick the edge to which the baseVertex of the + // Geometry2D-representation of the face belongs... - ASSERTL0(false, "Correct implementation required."); // Compute the length of edges on a base-face -/* if( baseVertex == m_verts[ faceVerts[f][0] ]->GetVid() ) + if (f > 0) { for(i = 0; i < m_coordim; i++) { elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; - elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; } } - else if( baseVertex == m_verts[ faceVerts[f][1] ]->GetVid() ) + else { - for(i = 0; i < m_coordim; i++) + if( baseVertex == m_verts[ faceVerts[f][0] ]->GetVid() ) { - elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; - elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i]; + for(i = 0; i < m_coordim; i++) + { + elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + } } - } - else if( baseVertex == m_verts[ faceVerts[f][2] ]->GetVid() ) - { - for(i = 0; i < m_coordim; i++) + else if( baseVertex == m_verts[ faceVerts[f][1] ]->GetVid() ) + { + for(i = 0; i < m_coordim; i++) + { + elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i]; + } + } + else if( baseVertex == m_verts[ faceVerts[f][2] ]->GetVid() ) { - elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i]; - elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i]; + for(i = 0; i < m_coordim; i++) + { + elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i]; + elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i]; + } } - } - else if( baseVertex == m_verts[ faceVerts[f][3] ]->GetVid() ) - { - for(i = 0; i < m_coordim; i++) + else if( baseVertex == m_verts[ faceVerts[f][3] ]->GetVid() ) { - elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i]; - elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + for(i = 0; i < m_coordim; i++) + { + elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i]; + elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i]; + } + } + else + { + ASSERTL0(false, "Could not find matching vertex for the face"); } } - else - { - ASSERTL0(false, "Could not find matching vertex for the face"); - } -*/ + // Now, construct the edge-vectors of the local coordinates of // the Geometry2D-representation of the face for(i = 0; i < m_coordim; i++) { + int v = m_faces[f]->GetNumVerts()-1; faceAaxis[i] = (*m_faces[f]->GetVertex(1))[i] - (*m_faces[f]->GetVertex(0))[i]; - faceBaxis[i] = (*m_faces[f]->GetVertex(3))[i] - (*m_faces[f]->GetVertex(0))[i]; + faceBaxis[i] = (*m_faces[f]->GetVertex(v))[i] - (*m_faces[f]->GetVertex(0))[i]; elementAaxis_length += pow(elementAaxis[i],2); elementBaxis_length += pow(elementBaxis[i],2); @@ -507,11 +658,6 @@ namespace Nektar dotproduct2 += elementBaxis[i]*faceBaxis[i]; } - // check that both these axis are indeed parallel - ASSERTL1(fabs(elementBaxis_length*faceBaxis_length - fabs(dotproduct2)) < - NekConstants::kNekZeroTol, - "These vectors should be parallel"); - // if the inner product is negative, both B-axis point // in reverse direction if( dotproduct2 < 0.0 ) @@ -533,9 +679,11 @@ namespace Nektar } // check that both these axis are indeed parallel - ASSERTL1(fabs(elementAaxis_length*faceBaxis_length - fabs(dotproduct1)) < - NekConstants::kNekZeroTol, - "These vectors should be parallel"); + if (fabs(elementAaxis_length*faceBaxis_length + - fabs(dotproduct1)) > NekConstants::kNekZeroTol) + { + cout << "Warning: Prism axes not parallel" << endl; + } // if the result is negative, both axis point in reverse // directions @@ -552,9 +700,11 @@ namespace Nektar } // check that both these axis are indeed parallel - ASSERTL1(fabs(elementBaxis_length*faceAaxis_length - fabs(dotproduct2)) < - NekConstants::kNekZeroTol, - "These vectors should be parallel"); + if (fabs(elementBaxis_length*faceAaxis_length + - fabs(dotproduct2)) > NekConstants::kNekZeroTol) + { + cout << "Warning: Prism axes not parallel" << endl; + } if( dotproduct2 < 0.0 ) { @@ -562,7 +712,7 @@ namespace Nektar } } - orientation = orientation + 5; + orientation = orientation + 5; // Fill the m_forient array m_forient[f] = (StdRegions::Orientation) orientation; diff --git a/library/SpatialDomains/PyrGeom.h b/library/SpatialDomains/PyrGeom.h index f5e56eda5b2466456f8d54739e929de20974eee4..235d0fc4418d6e5e782ab85c25a8cec17f43f252 100644 --- a/library/SpatialDomains/PyrGeom.h +++ b/library/SpatialDomains/PyrGeom.h @@ -61,6 +61,7 @@ namespace Nektar SPATIAL_DOMAINS_EXPORT static const std::string XMLElementType; protected: + virtual void v_GenGeomFactors(); virtual NekDouble v_GetLocCoords( const Array &coords, Array &Lcoords); diff --git a/library/StdRegions/StdExpansion3D.cpp b/library/StdRegions/StdExpansion3D.cpp index 916237e1a0ddfbc1ac8ffaa3bb459f50f87e0a01..c14485e7196908e8de553301257a560f6b45c73f 100644 --- a/library/StdRegions/StdExpansion3D.cpp +++ b/library/StdRegions/StdExpansion3D.cpp @@ -321,6 +321,16 @@ namespace Nektar return x->second; } + NekDouble StdExpansion3D::v_Integral( + const Array& inarray) + { + const int nqtot = GetTotPoints(); + Array tmp(GetTotPoints()); + MultiplyByStdQuadratureMetric(inarray, tmp); + return Vmath::Vsum(nqtot, tmp, 1); + } + + void StdExpansion3D::v_NegateFaceNormal(const int face) { m_negatedNormals[face] = true; diff --git a/library/StdRegions/StdExpansion3D.h b/library/StdRegions/StdExpansion3D.h index c373f6ba1d02a8d927e8a7211339eb87b0e7a335..4f228306c48c98fd56444210aa208e3c4717da19 100644 --- a/library/StdRegions/StdExpansion3D.h +++ b/library/StdRegions/StdExpansion3D.h @@ -187,6 +187,8 @@ namespace Nektar Array &outarray, const StdRegions::StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual NekDouble v_Integral( + const Array& inarray); STD_REGIONS_EXPORT virtual void v_NegateFaceNormal( const int face); @@ -213,88 +215,3 @@ namespace Nektar } //end of namespace #endif //STDEXP3D_H - -/** - * $Log: StdExpansion3D.h,v $ - * Revision 1.19 2008/09/16 13:37:03 pvos - * Restructured the LocalToGlobalMap classes - * - * Revision 1.18 2008/07/04 10:18:40 pvos - * Some updates - * - * Revision 1.17 2008/06/06 23:21:13 ehan - * Added doxygen documentation - * - * Revision 1.16 2008/05/30 00:33:49 delisi - * Renamed StdRegions::ShapeType to StdRegions::ExpansionType. - * - * Revision 1.15 2008/05/15 22:39:34 ehan - * Clean up the codes - * - * Revision 1.14 2008/04/06 06:04:15 bnelson - * Changed ConstArray to Array - * - * Revision 1.13 2008/02/12 02:46:33 jfrazier - * Moved typedef to the top of the file. - * - * Revision 1.12 2008/02/12 01:30:07 ehan - * Added typedef StdExpansion3DSharedPtr. - * - * Revision 1.11 2007/11/08 14:27:53 ehan - * Fixed PhysTensorDerivative3D matrix and improved L1 error up to 1e-15. - * - * Revision 1.10 2007/10/29 20:31:04 ehan - * Fixed floating point approximation up to 1-e15 for PhysEvaluate. - * - * Revision 1.9 2007/07/20 02:16:54 bnelson - * Replaced boost::shared_ptr with Nektar::ptr - * - * Revision 1.8 2007/05/15 05:18:23 bnelson - * Updated to use the new Array object. - * - * Revision 1.7 2007/04/10 14:00:45 sherwin - * Update to include SharedArray in all 2D element (including Nodal tris). Have also remvoed all new and double from 2D shapes in StdRegions - * - * Revision 1.6 2007/03/29 19:35:09 bnelson - * Replaced boost::shared_array with SharedArray - * - * Revision 1.5 2007/03/20 16:58:43 sherwin - * Update to use Array storage and NekDouble usage, compiling and executing up to Demos/StdRegions/Project1D - * - * Revision 1.4 2007/01/17 16:05:40 pvos - * updated doxygen documentation - * - * Revision 1.3 2006/07/02 17:16:18 sherwin - * - * Modifications to make MultiRegions work for a connected domain in 2D (Tris) - * - * Revision 1.2 2006/06/13 18:05:02 sherwin - * Modifications to make MultiRegions demo ProjectLoc2D execute properly. - * - * Revision 1.1 2006/05/04 18:58:31 kirby - * *** empty log message *** - * - * Revision 1.12 2006/04/25 20:23:33 jfrazier - * Various fixes to correct bugs, calls to ASSERT, etc. - * - * Revision 1.11 2006/03/12 14:20:44 sherwin - * - * First compiling version of SpatialDomains and associated modifications - * - * Revision 1.10 2006/03/06 17:12:45 sherwin - * - * Updated to properly execute all current StdRegions Demos. - * - * Revision 1.9 2006/03/04 20:26:54 bnelson - * Added comments after #endif. - * - * Revision 1.8 2006/03/01 08:25:03 sherwin - * - * First compiling version of StdRegions - * - * Revision 1.7 2006/02/27 23:47:23 sherwin - * - * Standard coding update upto compilation of StdHexExp.cpp - * - **/ - diff --git a/library/StdRegions/StdHexExp.cpp b/library/StdRegions/StdHexExp.cpp index 17f8825ba8d3f3794c90d0ce15e9b76d6d00de4e..9b93cff7852a991984eff8e43913a57ee2344a0f 100644 --- a/library/StdRegions/StdHexExp.cpp +++ b/library/StdRegions/StdHexExp.cpp @@ -80,194 +80,6 @@ namespace Nektar { } - - ////////////////////////////// - // Integration Methods - ////////////////////////////// - /** - * @param fx ? - * @param gy ? - * @param hz ? - * @param inarray ? - * @param outarray ? - */ - void StdHexExp::TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array & outarray ) - { - - // Using matrix operation, not sum-factorization. - // Regarding the 3D array, inarray[k][j][i], x is changing the - // fastest and z the slowest. Thus, the first x-vector of points - // refers to the first row of the first stack. The first y-vector - // refers to the first column of the first stack. The first z- - // vector refers to the vector of stacks intersecting the first row - // and first column. So in C++, i refers to column, j to row, and k - // to stack. Contrasting this with the usual C++ matrix convention, - // note that i does not refer to a C++ row, nor j to C++ column. - - int nx = fx.num_elements(); - int ny = gy.num_elements(); - int nz = hz.num_elements(); - - // Multiply by integration constants... - // Hadamard multiplication refers to elementwise multiplication of - // two vectors. - - // Hadamard each row with the first vector (x-vector); the index i - // is changing the fastest. - // For each j and k, iterate over each row in all of the stacks at - // once. - for (int jk = 0; jk < ny*nz; ++jk) - { - Vmath::Vmul( - nx, // Size of first weight vector - &inarray[0] + jk*nx, 1, // Offset and stride of each row- - // vector (x is changing fastest) - fx.get(), 1, // First weight vector (with stride - // of 1) - &outarray[0] + jk*nx, 1 // Output has same offset and - // stride as input - ); - } - - // Hadamard each column with the second vector (y-vector) - // For each stack in the 3D-array, do the following... - for (int k = 0; k < nz; ++k) - { - // Iterate over each column in the current stack - for (int i = 0; i < nx; ++i) - { - Vmath::Vmul( - ny, // Size of second weight vector - &outarray[0] + i + nx*ny*k, nx, // Offset and - // stride of each column-vector - gy.get(), 1, // second weight vector (with - // stride of 1) - &outarray[0] + i + nx*ny*k, nx // Output has same - // offset and stride as input - ); - } - } - - // Hadamard each stack-vector with the third vector (z-vector) - // Iterate over each element in the topmost stack - for (int ij = 0; ij < nx*ny; ++ij) - { - Vmath::Vmul( - nz, // Size of third weight vector - &outarray[0] + ij, nx*ny, // Offset and stride of each - // stack-vector - hz.get(), 1, // Third weight vector (with - // stride of 1) - &outarray[0] + ij, nx*ny // Output has same offset and - // stride as input - ); - } - - } - - - /** - * Inner-Product with respect to the weights: i.e., this is the triple - * sum of the product of the four inputs over the Hexahedron - * x-dimension is the row, it is the index that changes the fastest - * y-dimension is the column - * z-dimension is the stack, it is the index that changes the slowest - */ - NekDouble StdHexExp::TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz - ) - { - int Qx = wx.num_elements(); - int Qy = wy.num_elements(); - int Qz = wz.num_elements(); - - if( fxyz.num_elements() != Qx*Qy*Qz ) { - cerr << "TripleTetrahedralInnerProduct expected " - << fxyz.num_elements() - << " quadrature points from the discretized input " - "function but got " - << Qx*Qy*Qz << " instead." << endl; - } - - // Sum-factorizing over the stacks - Array A(Qx*Qy, 0.0); - for( int i = 0; i < Qx; ++i ) { - for( int j = 0; j < Qy; ++j ) { - for( int k = 0; k < Qz; ++k ) { - A[i + Qx*j] += fxyz[i + Qx*(j + Qy*k)] * wz[k]; - } - } - } - - // Sum-factorizing over the columns - Array b(Qx, 0.0); - for( int i = 0; i < Qx; ++i ) { - for( int j = 0; j < Qy; ++j ) { - b[i] += A[i + Qx*j] * wy[j]; - } - } - - // Sum-factorizing over the rows - NekDouble c = 0; - for( int i = 0; i < Qx; ++i ) { - c += b[i] * wx[i]; - } - - return c; - } - - - /** - * @param inarray ? - * @param wx ? - * @param wy ? - * @param wz ? - */ - NekDouble StdHexExp::Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz) - { - return TripleInnerProduct( inarray, wx, wy, wz ); - - } - - - /** - * @param inarray Definition of function to be returned at - * quadrature point of expansion. - * @returns - * \f$\int^1_{-1}\int^1_{-1}\int^1_{-1} u(\xi_1, \xi_2, \xi_3) - * J[i,j,k] d \xi_1 d \xi_2 d \xi_3 \f$ \n - * \f$ = \sum_{i=0}^{Q_1 - 1} \sum_{j=0}^{Q_2 - 1} - * \sum_{k=0}^{Q_3 - 1} u(\xi_{1i}, \xi_{2j},\xi_{3k}) - * w_{i} w_{j} w_{k} \f$ \n - * where \f$inarray[i,j, k] = u(\xi_{1i},\xi_{2j}, \xi_{3k}) \f$ \n - * and \f$ J[i,j,k] \f$ is the Jacobian evaluated at the quadrature - * point. - */ - NekDouble StdHexExp::v_Integral( - const Array& inarray) - { - Array w0, w1, w2; - - w0 = m_base[0]->GetW(); - w1 = m_base[1]->GetW(); - w2 = m_base[2]->GetW(); - - return Integral3D(inarray, w0, w1, w2); - } - - bool StdHexExp::v_IsBoundaryInteriorExpansion() { return (m_base[0]->GetBasisType() == LibUtilities::eModified_A) && diff --git a/library/StdRegions/StdHexExp.h b/library/StdRegions/StdHexExp.h index 00530f5d8bc49dee2dcf0f1ba5a4edcc41586a9e..5a9c7abd4ed10d0dbdd9ab41f485bb07434ba411 100644 --- a/library/StdRegions/StdHexExp.h +++ b/library/StdRegions/StdHexExp.h @@ -65,28 +65,6 @@ namespace Nektar protected: - //------------------------------- - // Integration Methods - //------------------------------- - STD_REGIONS_EXPORT void TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array& outarray ); - STD_REGIONS_EXPORT NekDouble TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT NekDouble Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT virtual NekDouble v_Integral( - const Array& inarray); - //---------------------------- // Differentiation Methods //---------------------------- @@ -227,25 +205,28 @@ namespace Nektar //-------------------------- STD_REGIONS_EXPORT virtual void v_GetFaceToElementMap( const int fid, - const Orientation faceOrient, + const Orientation faceOrient, Array &maparray, Array &signarray, int nummodesA = -1, int nummodesB = -1); - STD_REGIONS_EXPORT virtual int v_GetVertexMap(int localVertexId, - bool useCoeffPacking = false); STD_REGIONS_EXPORT virtual void v_GetEdgeInteriorMap(const int eid, - const Orientation edgeOrient, + STD_REGIONS_EXPORT virtual int v_GetVertexMap( + int localVertexId, + bool useCoeffPacking = false); + STD_REGIONS_EXPORT virtual void v_GetEdgeInteriorMap( + const int eid, + const Orientation edgeOrient, Array &maparray, - Array &signarray); + Array &signarray); STD_REGIONS_EXPORT virtual void v_GetFaceInteriorMap( - const int fid, - const Orientation faceOrient, + const int fid, + const Orientation faceOrient, Array &maparray, Array& signarray); STD_REGIONS_EXPORT virtual void v_GetInteriorMap( - Array& outarray); + Array &outarray); STD_REGIONS_EXPORT virtual void v_GetBoundaryMap( - Array& outarray); + Array &outarray); //--------------------------------------- diff --git a/library/StdRegions/StdPrismExp.cpp b/library/StdRegions/StdPrismExp.cpp index 221e50719fa42812de949efe89f81ac5b45e08bb..0934d6d314d1c689201a310c7fef784fd33af29c 100644 --- a/library/StdRegions/StdPrismExp.cpp +++ b/library/StdRegions/StdPrismExp.cpp @@ -75,196 +75,6 @@ namespace Nektar { } - - //--------------------------------------- - // Integration Methods - //--------------------------------------- - - void StdPrismExp::TripleTensorProduct(const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array& outarray) - { - // Using matrix operation, not sum-factorization. Regarding the - // 3D array, inarray[k][j][i], x is changing the fastest and z the - // slowest. Thus, the first x-vector of points refers to the - // first row of the first stack. The first y-vector refers to the - // first column of the first stack. The first z-vector refers to - // the vector of stacks intersecting the first row and first - // column. So in C++, i refers to column, j to row, and k to - // stack. Contrasting this with the usual C++ matrix convention, - // note that i does not refer to a C++ row, nor j to C++ column. - - int nx = fx.num_elements(); - int ny = gy.num_elements(); - int nz = hz.num_elements(); - - // Multiply by integration constants... Hadamard multiplication - // refers to elementwise multiplication of two vectors. Hadamard - // each row with the first vector (x-vector); the index i is - // changing the fastest. - for (int jk = 0; jk < ny*nz; ++jk) // For each j and k, iterate over each row in all of the stacks at once - { - Vmath::Vmul( - nx, // Size of first weight vector - &inarray[0] + jk*nx, 1, // Offset and stride of each row-vector (x is changing fastest) - fx.get(), 1, // First weight vector (with stride of 1) - &outarray[0] + jk*nx, 1 // Output has same offset and stride as input - ); - } - - // Hadamard each column with the second vector (y-vector) - for (int k = 0; k < nz; ++k) // For each stack in the 3D-array, do the following... - { - for (int i = 0; i < nx; ++i) // Iterate over each column in the current stack - { - Vmath::Vmul( - ny, // Size of second weight vector - &outarray[0] + i + nx*ny*k, nx, // Offset and stride of each column-vector - gy.get(), 1, // second weight vector (with stride of 1) - &outarray[0] + i + nx*ny*k, nx // Output has same offset and stride as input - ); - } - } - - // Hadamard each stack-vector with the third vector (z-vector) - for (int ij = 0; ij < nx*ny; ++ij) // Iterate over each element in the topmost stack - { - Vmath::Vmul( - nz, // Size of third weight vector - &outarray[0] + ij, nx*ny, // Offset and stride of each stack-vector - hz.get(), 1, // Third weight vector (with stride of 1) - &outarray[0] + ij, nx*ny // Output has same offset and stride as input - ); - } - } - - // Inner-Product with respect to the weights: i.e., this is the triple - // sum of the product of the four inputs over the prism. x-dimension - // is the row, it is the index that changes the fastest; y-dimension - // is the column; z-dimension is the stack, it is the index that - // changes the slowest. - NekDouble StdPrismExp::TripleInnerProduct(const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz) - { - int Qx = wx.num_elements(); - int Qy = wy.num_elements(); - int Qz = wz.num_elements(); - - if (fxyz.num_elements() != Qx*Qy*Qz) - { - cerr << "TripleInnerProduct expected " << fxyz.num_elements() - << " quadrature points from the discretized input function but got " - << Qx*Qy*Qz << " instead." << endl; - } - - // Sum-factorizing over the stacks - Array A(Qx*Qy, 0.0); - for (int i = 0; i < Qx; ++i) - { - for (int j = 0; j < Qy; ++j) - { - for (int k = 0; k < Qz; ++k) - { - A[i + Qx*j] += fxyz[i + Qx*(j + Qy*k)] * wz[k]; - } - } - } - - // Sum-factorizing over the columns - Array b(Qx, 0.0); - for (int i = 0; i < Qx; ++i) - { - for (int j = 0; j < Qy; ++j) - { - b[i] += A[i + Qx*j] * wy[j]; - } - } - - // Sum-factorizing over the rows - NekDouble c = 0; - for (int i = 0; i < Qx; ++i) - { - c += b[i] * wx[i]; - } - - return c; - } - - NekDouble StdPrismExp::Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz) - { - return TripleInnerProduct(inarray, wx, wy, wz); - } - - /** - * \brief Integrate the physical point list \a inarray over prismatic - * region and return the value. - * - * Inputs:\n - * - * - \a inarray: definition of function to be returned at quadrature - * point of expansion. - * - * Outputs:\n - * - * - returns \f$\int^1_{-1}\int^1_{-1}\int^1_{-1} u(\bar \eta_1, - * \xi_2, \xi_3) J[i,j,k] d \bar \eta_1 d \xi_2 d \xi_3 \f$ \n \f$ = - * \sum_{i=0}^{Q_1 - 1} \sum_{j=0}^{Q_2 - 1} \sum_{k=0}^{Q_3 - 1} - * u(\bar \eta_{1i}^{0,0}, \xi_{2j}^{0,0},\xi_{3k}^{1,0})w_{i}^{0,0} - * w_{j}^{0,0} \hat w_{k}^{1,0} \f$ \n where \f$ inarray[i,j, k] = - * u(\bar \eta_{1i}^{0,0}, \xi_{2j}^{0,0},\xi_{3k}^{1,0}) \f$, \n - * \f$\hat w_{i}^{1,0} = \frac {w_{j}^{1,0}} {2} \f$ \n and \f$ - * J[i,j,k] \f$ is the Jacobian evaluated at the quadrature point. - */ - NekDouble StdPrismExp::v_Integral( - const Array& inarray) - { - // Using implementation from page 146 of Spencer Sherwin's book. - int Qz = m_base[2]->GetNumPoints(); - - // Get the point distributions: - // * x is assumed to be Gauss-Lobatto-Legendre (incl. -1 and 1) - // * y is assumed to be Gauss-Lobatto-Legendre (incl. -1 and 1) - Array z, wx, wy, wz; - wx = m_base[0]->GetW(); - wy = m_base[1]->GetW(); - m_base[2]->GetZW(z,wz); - - Array wz_hat = Array(Qz, 0.0); - - // Convert wz into wz_hat, which includes the 1/2 scale factor. - // Nothing else need be done if the point distribution is Jacobi - // (1,0) since (1 - xi_z) is already factored into the weights. - // Note by coincidence, xi_y = eta_y, xi_z = eta_z (xi_z = z - // according to our notation) - switch(m_base[2]->GetPointsType()) - { - // Common case - case LibUtilities::eGaussRadauMAlpha1Beta0: // (1,0) Jacobi Inner product - Vmath::Smul(Qz, 0.5, (NekDouble *)wz.get(), 1, wz_hat.get(), 1); - break; - // Assume points are a Legenedre inner product and - // multiply by collapsed coordinate jacobian - default: - for (int k = 0; k < Qz; ++k) - { - wz_hat[k] = 0.5*(1.0 - z[k]) * wz[k]; - } - break; - } - - - return Integral3D(inarray, wx, wy, wz_hat); - } - - //--------------------------------------- // Differentiation Methods //--------------------------------------- diff --git a/library/StdRegions/StdPrismExp.h b/library/StdRegions/StdPrismExp.h index 15a7245c019e6d6068089bc7c2271db0811ac4c2..1d46064f1b0f70422e6b12c2caf70d1cc85af960 100644 --- a/library/StdRegions/StdPrismExp.h +++ b/library/StdRegions/StdPrismExp.h @@ -68,29 +68,6 @@ namespace Nektar STD_REGIONS_EXPORT ~StdPrismExp(); protected: - //--------------------------------------- - // Integration Methods - //--------------------------------------- - STD_REGIONS_EXPORT void TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array& outarray); - STD_REGIONS_EXPORT NekDouble TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT NekDouble Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT virtual NekDouble v_Integral( - const Array& inarray); - - //--------------------------------------- // Differentiation Methods //--------------------------------------- diff --git a/library/StdRegions/StdPyrExp.cpp b/library/StdRegions/StdPyrExp.cpp index 7567071b67322af310c2c319b7dd02dc2acc95d1..14b7d81623fb173946498fd9dc127ce934315925 100644 --- a/library/StdRegions/StdPyrExp.cpp +++ b/library/StdRegions/StdPyrExp.cpp @@ -34,12 +34,13 @@ /////////////////////////////////////////////////////////////////////////////// #include +#include +#include namespace Nektar { namespace StdRegions { - StdPyrExp::StdPyrExp() // Deafult construct of standard expansion directly called. { } @@ -47,16 +48,17 @@ namespace Nektar StdPyrExp::StdPyrExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc) - : StdExpansion (LibUtilities::StdPyrData::getNumberOfCoefficients(Ba.GetNumModes(), - Bb.GetNumModes(), - Bc.GetNumModes()), + : StdExpansion (LibUtilities::StdPyrData::getNumberOfCoefficients( + Ba.GetNumModes(), + Bb.GetNumModes(), + Bc.GetNumModes()), 3, Ba, Bb, Bc), - StdExpansion3D(LibUtilities::StdPyrData::getNumberOfCoefficients(Ba.GetNumModes(), - Bb.GetNumModes(), - Bc.GetNumModes()), + StdExpansion3D(LibUtilities::StdPyrData::getNumberOfCoefficients( + Ba.GetNumModes(), + Bb.GetNumModes(), + Bc.GetNumModes()), Ba, Bb, Bc) { - if (Ba.GetNumModes() > Bc.GetNumModes()) { ASSERTL0(false, "order in 'a' direction is higher " @@ -67,146 +69,167 @@ namespace Nektar ASSERTL0(false, "order in 'b' direction is higher " "than order in 'c' direction"); } - } - StdPyrExp::StdPyrExp(const StdPyrExp &T) - : StdExpansion (T), - StdExpansion3D(T) - { - } + // Set up mode mapping which takes 0\leq i\leq N_coeffs -> (p,q,r) + // of the 3D tensor product + const int P = Ba.GetNumModes() - 1; + const int Q = Bb.GetNumModes() - 1; + const int R = Bc.GetNumModes() - 1; + int cnt = 0; + // Vertices + m_map[Mode(0, 0, 0, 0)] = cnt++; + m_map[Mode(1, 0, 0, 0)] = cnt++; + m_map[Mode(1, 1, 0, 0)] = cnt++; + m_map[Mode(0, 1, 0, 0)] = cnt++; + m_map[Mode(0, 0, 1, 1)] = cnt++; - // Destructor - StdPyrExp::~StdPyrExp() - { - } + // Edge 0 + for (int i = 2; i <= P; ++i) + { + m_map[Mode(i, 0, 0, GetTetMode(i, 0, 0))] = cnt++; + } - //--------------------------------------- - // Integration/public 3D methods - //--------------------------------------- - void StdPyrExp::TripleTensorProduct(const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array & outarray) - { - // Using matrix operation, not sum-factorization. Regarding the - // 3D array, inarray[k][j][i], x is changing the fastest and z the - // slowest. Thus, the first x-vector of points refers to the - // first row of the first stack. The first y-vector refers to the - // first column of the first stack. The first z-vector refers to - // the vector of stacks intersecting the first row and first - // column. So in C++, i refers to column, j to row, and k to - // stack. Contrasting this with the usual C++ matrix convention, - // note that i does not refer to a C++ row, nor j to C++ column. - - int nx = fx.num_elements(); - int ny = gy.num_elements(); - int nz = hz.num_elements(); - - // Multiply by integration constants... Hadamard multiplication - // refers to elementwise multiplication of two vectors. Hadamard - // each row with the first vector (x-vector); the index i is - // changing the fastest. - for (int jk = 0; jk < ny*nz; ++jk) // For each j and k, iterate over each row in all of the stacks at once - { - Vmath::Vmul( - nx, // Size of first weight vector - &inarray[0] + jk*nx, 1, // Offset and stride of each row-vector (x is changing fastest) - fx.get(), 1, // First weight vector (with stride of 1) - &outarray[0] + jk*nx, 1 // Output has same offset and stride as input - ); + // Edge 1 + for (int i = 2; i <= Q; ++i) + { + m_map[Mode(1, i, 0, GetTetMode(0, i, 0))] = cnt++; } - - // Hadamard each column with the second vector (y-vector) - for (int k = 0; k < nz; ++k) // For each stack in the 3D-array, do the following... + + // Edge 2 + for (int i = 2; i <= P; ++i) + { + m_map[Mode(i, 1, 0, GetTetMode(i, 0, 0))] = cnt++; + } + + // Edge 3 + for (int i = 2; i <= Q; ++i) + { + m_map[Mode(0, i, 0, GetTetMode(0, i, 0))] = cnt++; + } + + // Edge 4 + for (int i = 2; i <= R; ++i) + { + m_map[Mode(0, 0, i, i)] = cnt++; + } + + // Edge 5 + for (int i = 2; i <= R; ++i) + { + m_map[Mode(1, 0, i, i)] = cnt++; + } + + // Edge 6 + for (int i = 2; i <= R; ++i) + { + m_map[Mode(1, 1, i, i)] = cnt++; + } + + // Edge 7 + for (int i = 2; i <= R; ++i) + { + m_map[Mode(0, 1, i, i)] = cnt++; + } + + // Face 0 - TODO check this + for (int j = 2; j <= Q; ++j) { - for (int i = 0; i < nx; ++i) // Iterate over each column in the current stack + for (int i = 2; i <= P; ++i) { - Vmath::Vmul( - ny, // Size of second weight vector - &outarray[0] + i + nx*ny*k, nx, // Offset and stride of each column-vector - gy.get(), 1, // second weight vector (with stride of 1) - &outarray[0] + i + nx*ny*k, nx // Output has same offset and stride as input - ); + m_map[Mode(i, j, 0, GetTetMode((i-2+j-2) % (Q-1) + 2, 0, 0))] = cnt++; } } - - // Hadamard each stack-vector with the third vector (z-vector) - for (int ij = 0; ij < nx*ny; ++ij) // Iterate over each element in the topmost stack + + // Face 1 + for (int i = 2; i <= P; ++i) { - Vmath::Vmul( - nz, // Size of third weight vector - &outarray[0] + ij, nx*ny, // Offset and stride of each stack-vector - hz.get(), 1, // Third weight vector (with stride of 1) - &outarray[0] + ij, nx*ny // Output has same offset and stride as input - ); + for (int j = 1; j <= R-i; ++j) + { + m_map[Mode(i, 0, j, GetTetMode(i, 0, j))] = cnt++; + } } - } - - // Inner-Product with respect to the weights: i.e., this is the triple - // sum of the product of the four inputs over the prism. x-dimension - // is the row, it is the index that changes the fastest; y-dimension - // is the column; z-dimension is the stack, it is the index that - // changes the slowest. - NekDouble StdPyrExp::TripleInnerProduct(const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz) - { - int Qx = wx.num_elements(); - int Qy = wy.num_elements(); - int Qz = wz.num_elements(); - if (fxyz.num_elements() != Qx*Qy*Qz) + // Face 2 + for (int i = 2; i <= Q; ++i) { - cerr << "TripleInnerProduct expected " << fxyz.num_elements() - << " quadrature points from the discretized input function but got " - << Qx*Qy*Qz << " instead." << endl; + for (int j = 1; j <= R-i; ++j) + { + m_map[Mode(1, i, j, GetTetMode(0, i, j))] = cnt++; + } } - - // Sum-factorizing over the stacks - Array A(Qx*Qy, 0.0); - for (int i = 0; i < Qx; ++i) + + // Face 3 + for (int i = 2; i <= P; ++i) { - for (int j = 0; j < Qy; ++j) + for (int j = 1; j <= R-i; ++j) { - for (int k = 0; k < Qz; ++k) - { - A[i + Qx*j] += fxyz[i + Qx*(j + Qy*k)] * wz[k]; - } + m_map[Mode(i, 1, j, GetTetMode(i, 0, j))] = cnt++; } } - - // Sum-factorizing over the columns - Array b(Qx, 0.0); - for (int i = 0; i < Qx; ++i) + + // Face 4 + for (int i = 2; i <= Q; ++i) { - for (int j = 0; j < Qy; ++j) + for (int j = 1; j <= R-i; ++j) { - b[i] += A[i + Qx*j] * wy[j]; + m_map[Mode(0, i, j, GetTetMode(0, i, j))] = cnt++; } } - - // Sum-factorizing over the rows - NekDouble c = 0; - for (int i = 0; i < Qx; ++i) + + // Interior (tetrahedral modes) + for (int i = 2; i <= P+1; ++i) { - c += b[i] * wx[i]; + for (int j = 1; j <= Q-i+1; ++j) + { + for (int k = 1; k <= R-i-j+1; ++k) + { + // need to go to j+1-th mode in the 'b' direction to + // select correct modified_a mode + m_map[Mode(i, j+1, k, GetTetMode(i-1, j, k))] = cnt++; + } + } + } + + ASSERTL0(m_map.size() == m_ncoeffs, + "Duplicate coefficient entries in map"); + + map::iterator it; + for (it = m_map.begin(); it != m_map.end(); ++it) + { + const int p = it->first.get<0>(); + const int q = it->first.get<1>(); + const int r = it->first.get<2>(); + const int rp = it->first.get<3>(); + if (m_idxMap.find(p) == m_idxMap.end()) + { + m_idxMap[p] = map > >(); + } + + if (m_idxMap[p].find(q) == m_idxMap[p].end()) + { + m_idxMap[p][q] = map >(); + } + + if (m_idxMap[p][q].find(r) == m_idxMap[p][q].end()) + { + m_idxMap[p][q][r] = pair(it->second, rp); + } } - - return c; } - NekDouble StdPyrExp::Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz) + StdPyrExp::StdPyrExp(const StdPyrExp &T) + : StdExpansion (T), + StdExpansion3D(T) { - return TripleInnerProduct(inarray, wx, wy, wz); } - + + + // Destructor + StdPyrExp::~StdPyrExp() + { + } + //--------------------------------------- // Differentiation/integration Methods @@ -301,7 +324,6 @@ namespace Nektar } } - void StdPyrExp::v_StdPhysDeriv(const Array &inarray, Array &out_d0, Array &out_d1, @@ -309,70 +331,14 @@ namespace Nektar { StdPyrExp::v_PhysDeriv(inarray, out_d0, out_d1, out_d2); } - - /** - * \brief Integrate the physical point list \a inarray over pyramidic - * region and return the value. - * - * Inputs:\n - * - * - \a inarray: definition of function to be returned at quadrature - * point of expansion. - * - * Outputs:\n - * - * - returns \f$\int^1_{-1}\int^1_{-1}\int^1_{-1} u(\bar \eta_1, - * \eta_2, \eta_3) J[i,j,k] d \bar \eta_1 d \eta_2 d \eta_3\f$ \n - * \f$= \sum_{i=0}^{Q_1 - 1} \sum_{j=0}^{Q_2 - 1} \sum_{k=0}^{Q_3 - - * 1} u(\bar \eta_{1i}^{0,0}, - * \eta_{2j}^{0,0},\eta_{3k}^{2,0})w_{i}^{0,0} w_{j}^{0,0} \hat - * w_{k}^{2,0} \f$ \n where \f$inarray[i,j, k] = u(\bar - * \eta_{1i},\eta_{2j}, \eta_{3k}) \f$, \n \f$\hat w_{k}^{2,0} = - * \frac {w^{2,0}} {2} \f$ \n and \f$ J[i,j,k] \f$ is the Jacobian - * evaluated at the quadrature point. - */ - NekDouble StdPyrExp::v_Integral( - const Array& inarray) - { - // Using implementation from page 146 of Spencer Sherwin's book. - int Qz = m_base[2]->GetNumPoints(); - // Get the point distributions: - // * x is assumed to be Gauss-Lobatto-Legendre (incl. -1 and 1) - // * y is assumed to be Gauss-Lobatto-Legendre (incl. -1 and 1) - Array z, wx, wy, wz; - wx = m_base[0]->GetW(); - wy = m_base[1]->GetW(); - m_base[2]->GetZW(z,wz); - - Array wz_hat = Array(Qz, 0.0); - - // Convert wz into wz_hat, which includes the 1/2 scale factor. - // Nothing else need be done if the point distribution is Jacobi - // (2,0) since (1 - xi_z)^2 is already factored into the weights. - // Note by coincidence, xi_y = eta_y, xi_z = eta_z (xi_z = z - // according to our notation). - switch(m_base[2]->GetPointsType()) - { - // Common case - case LibUtilities::eGaussRadauMAlpha2Beta0: // (2,0) Jacobi Inner product - Vmath::Smul(Qz, 0.25, (NekDouble *)wz.get(), 1, wz_hat.get(), 1); - break; - - // Assume points are a Legenedre inner product and - // multiply by collapsed coordinate jacobian - default: - for (int k = 0; k < Qz; ++k) - { - wz_hat[k] = 0.25*(1.0-z[k])*(1.0-z[k]) * wz[k]; - } - break; - } - - return Integral3D(inarray, wx, wy, wz_hat); + void StdPyrExp::v_StdPhysDeriv(const int dir, + const Array& inarray, + Array& outarray) + { + StdPyrExp::v_PhysDeriv(dir, inarray, outarray); } - - + //--------------------------------------- // Transforms //--------------------------------------- @@ -401,92 +367,120 @@ namespace Nektar void StdPyrExp::v_BwdTrans(const Array &inarray, Array &outarray) { - ASSERTL1(m_base[1]->GetBasisType() != LibUtilities::eOrtho_B || - m_base[1]->GetBasisType() != LibUtilities::eModified_B, - "Basis[1] is not a general tensor type"); - - ASSERTL1(m_base[2]->GetBasisType() != LibUtilities::eOrtho_C || - m_base[2]->GetBasisType() != LibUtilities::eModified_C, - "Basis[2] is not a general tensor type"); - - int Qx = m_base[0]->GetNumPoints(); - int Qy = m_base[1]->GetNumPoints(); - int Qz = m_base[2]->GetNumPoints(); - - int P = m_base[0]->GetNumModes() - 1; - int Q = m_base[1]->GetNumModes() - 1; - int R = m_base[2]->GetNumModes() - 1; - - Array bx = m_base[0]->GetBdata(); - Array by = m_base[1]->GetBdata(); - Array bz = m_base[2]->GetBdata(); - - /* - // Create an index map from the hexahedron to the pyramid. - Array pqr = Array( (P+1)*(Q+1)*(R+1), -1 ); - for( int p = 0, mode = 0; p <= P; ++p ) { - for( int q = 0; q <= Q; ++q ) { - for( int r = 0; r <= R - p - q ; ++r, ++mode ) { - pqr[r + (R+1)*(q + (Q+1)*p)] = mode; - } + if (m_base[0]->Collocation() && + m_base[1]->Collocation() && + m_base[2]->Collocation()) + { + Vmath::Vcopy(m_base[0]->GetNumPoints()* + m_base[1]->GetNumPoints()* + m_base[2]->GetNumPoints(), + inarray, 1, outarray, 1); + } + else + { + StdPyrExp::v_BwdTrans_SumFac(inarray,outarray); + } + } + + /** + * Sum-factorisation implementation of the BwdTrans operation. + */ + void StdPyrExp::v_BwdTrans_SumFac( + const Array& inarray, + Array& outarray) + { + Array wsp; + v_BwdTrans_SumFacKernel(m_base[0]->GetBdata(), + m_base[1]->GetBdata(), + m_base[2]->GetBdata(), + inarray,outarray,wsp, + true,true,true); + } + + void StdPyrExp::v_BwdTrans_SumFacKernel( + const Array &base0, + const Array &base1, + const Array &base2, + const Array &inarray, + Array &outarray, + Array &wsp, + bool doCheckCollDir0, + bool doCheckCollDir1, + bool doCheckCollDir2) + { + const int Qx = m_base[0]->GetNumPoints(); + const int Qy = m_base[1]->GetNumPoints(); + const int Qz = m_base[2]->GetNumPoints(); + + const NekDouble *bx = base0.get(); + const NekDouble *by = base1.get(); + const NekDouble *bz = base2.get(); + + // Need to count coeffs for storage... + map > > >::iterator it_p; + map > > ::iterator it_q; + map > ::iterator it_r; + + int pqcnt = 0; + for (it_p = m_idxMap.begin(); it_p != m_idxMap.end(); ++it_p) + { + for (it_q = it_p->second.begin(); it_q != it_p->second.end(); ++it_q) + { + pqcnt++; } } - */ - for (int k = 0; k < Qz; ++k) { - for (int j = 0; j < Qy; ++j) { - for (int i = 0; i < Qx; ++i) { + Array fpq(pqcnt); + Array fp (m_base[0]->GetNumModes()); + int i ,j, k, s = 0, cnt = 0, cnt2 = 0; + + for (k = 0; k < Qz; ++k) + { + NekDouble bz1 = bz[k+Qz]; + + cnt = 0; + for (it_p = m_idxMap.begin(); it_p != m_idxMap.end(); ++it_p) + { + for (it_q = it_p->second.begin(); it_q != it_p->second.end(); ++it_q) + { NekDouble sum = 0.0; - for (int r = 0; r <= R; ++r) { - for (int q = 0; q <= min(R-r,Q); ++q) { - for (int p = 0; p <= min(R-r,P); ++p) { - int mode = GetMode(p,q,r); - sum += inarray[mode]* - bx[i + Qx*p]* - by[j + Qy*q]* - bz[k + Qz*GetTetMode(p,q,r)]; - } - } + for (it_r = it_q->second.begin(); it_r != it_q->second.end(); ++it_r) + { + sum += inarray[it_r->second.first] * bz[k + Qz*it_r->second.second]; } - - // Add in contributions from singular vertices; - // i.e. (p,q,r) = (1,1,1),(0,1,1),(1,0,1) - int m = GetMode(0,0,1); - sum += inarray[m]*bz[k*Qz]*(bx[i+Qx]*by[j+Qy]+ - bx[i ]*by[j+Qy]+ - bx[i+Qx]*by[j ]); - outarray[i + Qx*(j + Qy*k)] = sum; + fpq[cnt++] = sum; } } - } - } - void StdPyrExp::v_BwdTrans_SumFacKernel( - const Array& base0, - const Array& base1, - const Array& base2, - const Array& inarray, - Array &outarray, - Array &wsp, - bool doCheckCollDir0, - bool doCheckCollDir1, - bool doCheckCollDir2) - { - ASSERTL0(false, "BwdTrans_SumFacKernel not yet implemented."); - } + for (j = 0; j < Qy; ++j) + { + NekDouble by0 = bz1*by[j]; + NekDouble by1 = bz1*by[j+Qy]; - void StdPyrExp::v_IProductWRTBase_SumFacKernel( - const Array& base0, - const Array& base1, - const Array& base2, - const Array& inarray, - Array &outarray, - Array &wsp, - bool doCheckCollDir0, - bool doCheckCollDir1, - bool doCheckCollDir2) - { - ASSERTL0(false, "IProductWRTBase_SumFacKernel not yet implemented."); + cnt = cnt2 = 0; + for (it_p = m_idxMap.begin(); it_p != m_idxMap.end(); ++it_p) + { + NekDouble sum = 0.0; + for (it_q = it_p->second.begin(); it_q != it_p->second.end(); ++it_q) + { + sum += by[j + Qy*it_q->first] * fpq[cnt++]; + } + fp[cnt2++] = sum; + } + + for (i = 0; i < Qx; ++i, ++s) + { + cnt2 = 0; + NekDouble sum = 0.0; + for (it_p = m_idxMap.begin(); it_p != m_idxMap.end(); ++it_p) + { + sum += bx[i + Qx*it_p->first] * fp[cnt2++]; + } + sum += inarray[4]*(by1*(bx[i] + bx[i+Qx]) + by0*bx[i+Qx]); + outarray[s] = sum; + } + } + } } /** \brief Forward transform from physical quadrature space @@ -541,172 +535,335 @@ namespace Nektar const Array &inarray, Array &outarray) { - int P = m_base[0]->GetNumModes()-1; - int Q = m_base[1]->GetNumModes()-1; - int R = m_base[2]->GetNumModes()-1; - - int Qx = m_base[0]->GetNumPoints(); - int Qy = m_base[1]->GetNumPoints(); - int Qz = m_base[2]->GetNumPoints(); - - const Array &bx = m_base[0]->GetBdata(); - const Array &by = m_base[1]->GetBdata(); - const Array &bz = m_base[2]->GetBdata(); - - for( int r = 0; r <= R; ++r ) { - for( int q = 0; q <= min(R-r,Q); ++q ) { - for( int p = 0; p <= min(R-r,P); ++p ) { - // Compute tensor product of inarray with the 3 basis functions - Array g_pqr = Array( Qx*Qy*Qz, 0.0 ); - for( int k = 0; k < Qz; ++k ) { - for( int j = 0; j < Qy; ++j ) { - for( int i = 0; i < Qx; ++i ) { - int s = i + Qx*(j + Qy*k); - cout << p << " " << q << " " << r << " " << GetTetMode(p,q,r) << endl; - g_pqr[s] += inarray[s] * - bx[i + Qx*p] * - by[j + Qy*q] * - bz[k + Qz*GetTetMode(p,q,r)]; - - if (p == 0 && q == 0 && r == 1) - { - g_pqr[s] += inarray[s] * bz[k+Qz]*( - bx[i+Qx]*by[j+Qy] + - bx[i+Qx]*by[j ] + - bx[i ]*by[j+Qy]); - } - } - } - } - - outarray[GetMode(p,q,r)] = Integral( g_pqr ); - } - } - } - } - - - //--------------------------------------- - // Evaluation functions - //--------------------------------------- - - void StdPyrExp::v_LocCoordToLocCollapsed(const Array& xi, - Array& eta) - { - if (fabs(xi[2]-1.0) < NekConstants::kNekZeroTol) + if (m_base[0]->Collocation() && + m_base[1]->Collocation() && + m_base[2]->Collocation()) { - // Very top point of the pyramid - eta[0] = -1.0; - eta[1] = -1.0; - eta[2] = xi[2]; + MultiplyByStdQuadratureMetric(inarray, outarray); } - else + else { - // Below the line-singularity -- Common case - eta[2] = xi[2]; // eta_z = xi_z - eta[1] = 2.0*(1.0 + xi[1])/(1.0 - xi[2]) - 1.0; - eta[0] = 2.0*(1.0 + xi[0])/(1.0 - xi[2]) - 1.0; - } + StdPyrExp::v_IProductWRTBase_SumFac(inarray,outarray); + } } - void StdPyrExp::v_GetCoords(Array &xi_x, - Array &xi_y, - Array &xi_z) + void StdPyrExp::v_IProductWRTBase_SumFac( + const Array& inarray, + Array& outarray) { - Array etaBar_x = m_base[0]->GetZ(); - Array eta_y = m_base[1]->GetZ(); - Array eta_z = m_base[2]->GetZ(); - int Qx = GetNumPoints(0); - int Qy = GetNumPoints(1); - int Qz = GetNumPoints(2); + Array tmp(inarray.num_elements()); + Array wsp; - // Convert collapsed coordinates into cartesian coordinates: eta --> xi - for (int k = 0; k < Qz; ++k ) - { - for (int j = 0; j < Qy; ++j) - { - for (int i = 0; i < Qx; ++i) - { - int s = i + Qx*(j + Qy*k); + v_MultiplyByStdQuadratureMetric(inarray, tmp); - xi_z[s] = eta_z[k]; - xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0; - xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0; - } - } - } + v_IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(), + m_base[1]->GetBdata(), + m_base[2]->GetBdata(), + tmp,outarray,wsp, + true,true,true); } - void StdPyrExp::v_FillMode(const int mode, Array &outarray) + void StdPyrExp::v_IProductWRTBase_SumFacKernel( + const Array &base0, + const Array &base1, + const Array &base2, + const Array &inarray, + Array &outarray, + Array &wsp, + bool doCheckCollDir0, + bool doCheckCollDir1, + bool doCheckCollDir2) { + int i, j, k, s; int Qx = m_base[0]->GetNumPoints(); int Qy = m_base[1]->GetNumPoints(); int Qz = m_base[2]->GetNumPoints(); - int P = m_base[0]->GetNumModes() - 1; - int Q = m_base[1]->GetNumModes() - 1; - int R = m_base[2]->GetNumModes() - 1; - - // Create an index map from the hexahedron to the prymaid. - Array mode_pqr = Array( (P+1)*(Q+1)*(R+1), -1 ); - for( int p = 0, m = 0; p <= P; ++p ) { - for( int q = 0; q <= Q; ++q ) { - for( int r = 0; r <= R - p - q ; ++r, ++m ) { - mode_pqr[r + (R+1)*(q + (Q+1)*p)] = m; + + const NekDouble *bx = base0.get(); + const NekDouble *by = base1.get(); + const NekDouble *bz = base2.get(); + + map > > >::iterator it_p; + map > > ::iterator it_q; + map > ::iterator it_r; + + Array f (Qy*Qz); + Array fb(Qz); + + for (it_p = m_idxMap.begin(); it_p != m_idxMap.end(); ++it_p) + { + const int p = it_p->first; + s = 0; + for (k = 0; k < Qz; ++k) + { + for (j = 0; j < Qy; ++j) + { + NekDouble sum = 0.0; + for (i = 0; i < Qx; ++i, ++s) + { + sum += bx[i + Qx*p]*inarray[s]; + } + f[j+Qy*k] = sum; } } - } - // Find the pqr matching the provided mode - int mode_p=0, mode_q=0, mode_r=0; - for( int p = 0, m = 0; p <= P; ++p ) { - for( int q = 0; q <= Q ; ++q ) { - for( int r = 0; r <= R - p - q; ++r, ++m ) { - if( m == mode ) { - mode_p = p; - mode_q = q; - mode_r = r; + for (it_q = it_p->second.begin(); it_q != it_p->second.end(); ++it_q) + { + const int q = it_q->first; + + for (k = 0; k < Qz; ++k) + { + NekDouble sum = 0.0; + for (j = 0; j < Qy; ++j) + { + sum += by[j + Qy*q]*f[j+Qy*k]; + } + fb[k] = sum; + } + + for (it_r = it_q->second.begin(); it_r != it_q->second.end(); ++it_r) + { + const int rpqr = it_r->second.second; + NekDouble sum = 0.0; + for (k = 0; k < Qz; ++k) + { + sum += bz[k + Qz*rpqr]*fb[k]; } + + outarray[it_r->second.first] = sum; } } } - const Array& bx = m_base[0]->GetBdata(); - const Array& by = m_base[1]->GetBdata(); - const Array& bz = m_base[2]->GetBdata(); - - int p = mode_p, q = mode_q, r = mode_r; - - // Determine the index for specifying which mode to use in the basis - int sigma_p = Qx*p; - int sigma_q = Qy*q; - int sigma_pqr = Qz*mode_pqr[r + (R+1)*(q + (Q+1)*p)]; - - - // Compute tensor product of inarray with the 3 basis functions - for( int k = 0; k < Qz; ++k ) { - for( int j = 0; j < Qy; ++j ) { - for( int i = 0; i < Qx; ++i ) { - int s = i + Qx*(j + Qy*(k + Qz*mode)); - outarray[s] = - bx[i + sigma_p] * - by[j + sigma_q] * - bz[k + sigma_pqr]; + // Correct for top mode + s = 0; + for (k = 0; k < Qz; ++k) + { + for (j = 0; j < Qy; ++j) + { + for (i = 0; i < Qx; ++i, ++s) + { + outarray[4] += inarray[s] * bz[k+Qz]*( + bx[i+Qx]*by[j+Qy] + + bx[i+Qx]*by[j ] + + bx[i ]*by[j+Qy]); } } } } - - - //--------------------------------------- - // Helper functions - //--------------------------------------- - int StdPyrExp::v_GetNverts() const + void StdPyrExp::v_IProductWRTDerivBase( + const int dir, + const Array& inarray, + Array& outarray) { - return 5; + StdPyrExp::v_IProductWRTDerivBase_SumFac(dir,inarray,outarray); } - int StdPyrExp::v_GetNedges() const + /** + * @param inarray Function evaluated at physical collocation + * points. + * @param outarray Inner product with respect to each basis + * function over the element. + */ + void StdPyrExp::v_IProductWRTDerivBase_SumFac( + const int dir, + const Array& inarray, + Array& outarray) + { + int i; + int nquad0 = m_base[0]->GetNumPoints(); + int nquad1 = m_base[1]->GetNumPoints(); + int nquad2 = m_base[2]->GetNumPoints(); + int nqtot = nquad0*nquad1*nquad2; + + Array gfac0(nquad0); + Array gfac1(nquad1); + Array gfac2(nquad2); + Array tmp0 (nqtot); + Array wsp; + + const Array& z0 = m_base[0]->GetZ(); + const Array& z1 = m_base[1]->GetZ(); + const Array& z2 = m_base[2]->GetZ(); + + // set up geometric factor: (1+z0)/2 + for(i = 0; i < nquad0; ++i) + { + gfac0[i] = 0.5*(1+z0[i]); + } + + // set up geometric factor: (1+z1)/2 + for(i = 0; i < nquad1; ++i) + { + gfac1[i] = 0.5*(1+z1[i]); + } + + // Set up geometric factor: 2/(1-z2) + for(i = 0; i < nquad2; ++i) + { + gfac2[i] = 2.0/(1-z2[i]); + } + + // Derivative in first/second direction is always scaled as follows + const int nq01 = nquad0*nquad1; + for(i = 0; i < nquad2; ++i) + { + Vmath::Smul(nq01, gfac2[i], + &inarray[0] + i*nq01, 1, + &tmp0 [0] + i*nq01, 1); + } + + MultiplyByStdQuadratureMetric(tmp0, tmp0); + + switch(dir) + { + case 0: + { + IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(), + m_base[1]->GetBdata (), + m_base[2]->GetBdata (), + tmp0, outarray, wsp, + false, true, true); + break; + } + case 1: + { + IProductWRTBase_SumFacKernel(m_base[0]->GetBdata (), + m_base[1]->GetDbdata(), + m_base[2]->GetBdata (), + tmp0, outarray, wsp, + true, false, true); + break; + } + case 2: + { + Array tmp3(m_ncoeffs); + Array tmp4(m_ncoeffs); + + // Scale eta_1 derivative by gfac0 + for(i = 0; i < nquad1*nquad2; ++i) + { + Vmath::Vmul(nquad0, tmp0 .get() + i*nquad0, 1, + gfac0.get(), 1, + tmp0 .get() + i*nquad0, 1); + } + IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(), + m_base[1]->GetBdata(), + m_base[2]->GetBdata(), + tmp0, tmp3, wsp, + false, true, true); + + // Scale eta_2 derivative by gfac1*gfac2 + for(i = 0; i < nquad2; ++i) + { + Vmath::Smul(nq01, gfac2[i], + &inarray[0] + i*nq01, 1, + &tmp0 [0] + i*nq01, 1); + } + for(i = 0; i < nquad1*nquad2; ++i) + { + Vmath::Smul(nquad0, gfac1[i%nquad1], + &tmp0[0] + i*nquad0, 1, + &tmp0[0] + i*nquad0, 1); + } + + MultiplyByStdQuadratureMetric(tmp0, tmp0); + IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(), + m_base[1]->GetDbdata(), + m_base[2]->GetBdata(), + tmp0, tmp4, wsp, + true, false, true); + + MultiplyByStdQuadratureMetric(inarray,tmp0); + IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(), + m_base[1]->GetBdata(), + m_base[2]->GetDbdata(), + tmp0,outarray,wsp, + true, true, false); + + Vmath::Vadd(m_ncoeffs,&tmp3[0],1,&outarray[0],1,&outarray[0],1); + Vmath::Vadd(m_ncoeffs,&tmp4[0],1,&outarray[0],1,&outarray[0],1); + break; + } + default: + { + ASSERTL1(false, "input dir is out of range"); + break; + } + } + } + + //--------------------------------------- + // Evaluation functions + //--------------------------------------- + + void StdPyrExp::v_LocCoordToLocCollapsed( + const Array& xi, + Array& eta) + { + if (fabs(xi[2]-1.0) < NekConstants::kNekZeroTol) + { + // Very top point of the pyramid + eta[0] = -1.0; + eta[1] = -1.0; + eta[2] = xi[2]; + } + else + { + // Below the line-singularity -- Common case + eta[2] = xi[2]; // eta_z = xi_z + eta[1] = 2.0*(1.0 + xi[1])/(1.0 - xi[2]) - 1.0; + eta[0] = 2.0*(1.0 + xi[0])/(1.0 - xi[2]) - 1.0; + } + } + + void StdPyrExp::v_GetCoords(Array &xi_x, + Array &xi_y, + Array &xi_z) + { + Array etaBar_x = m_base[0]->GetZ(); + Array eta_y = m_base[1]->GetZ(); + Array eta_z = m_base[2]->GetZ(); + int Qx = GetNumPoints(0); + int Qy = GetNumPoints(1); + int Qz = GetNumPoints(2); + + // Convert collapsed coordinates into cartesian coordinates: eta --> xi + for (int k = 0; k < Qz; ++k ) + { + for (int j = 0; j < Qy; ++j) + { + for (int i = 0; i < Qx; ++i) + { + int s = i + Qx*(j + Qy*k); + + xi_z[s] = eta_z[k]; + xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0; + xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0; + } + } + } + } + + void StdPyrExp::v_FillMode(const int mode, Array &outarray) + { + Array tmp(m_ncoeffs, 0.0); + tmp[mode] = 1.0; + v_BwdTrans(tmp, outarray); + } + + + //--------------------------------------- + // Helper functions + //--------------------------------------- + + int StdPyrExp::v_GetNverts() const + { + return 5; + } + + int StdPyrExp::v_GetNedges() const { return 8; } @@ -729,7 +886,7 @@ namespace Nektar ASSERTL1(GetBasisType(1) == LibUtilities::eModified_A || GetBasisType(1) == LibUtilities::eGLL_Lagrange, "BasisType is not a boundary interior form"); - ASSERTL1(GetBasisType(2) == LibUtilities::eModified_B || + ASSERTL1(GetBasisType(2) == LibUtilities::eModified_C || GetBasisType(2) == LibUtilities::eGLL_Lagrange, "BasisType is not a boundary interior form"); @@ -769,11 +926,13 @@ namespace Nektar } else if (i == 1 || i == 3) { - return GetBasisNumModes(0)*GetBasisNumModes(2); + int P = GetBasisNumModes(0)-1, Q = GetBasisNumModes(2)-1; + return Q+1 + (P*(1 + 2*Q - P))/2; } else { - return GetBasisNumModes(1)*GetBasisNumModes(2); + int P = GetBasisNumModes(1)-1, Q = GetBasisNumModes(2)-1; + return Q+1 + (P*(1 + 2*Q - P))/2; } } @@ -836,295 +995,777 @@ namespace Nektar void StdPyrExp::v_GetFaceToElementMap( const int fid, - const Orientation faceOrient, + const Orientation faceOrient, Array &maparray, Array &signarray, int nummodesA, int nummodesB) { - int i,j,P,Q; - const int nummodes0 = m_base[0]->GetNumModes(); - const int nummodes1 = m_base[1]->GetNumModes(); - const int nummodes2 = m_base[2]->GetNumModes(); - //int nummodesA, nummodesB, P, Q; - - ASSERTL1( GetEdgeBasisType(0) == GetEdgeBasisType(1), - "Method only implemented if BasisType is indentical in " - "x and y directions"); - ASSERTL1( GetEdgeBasisType(0) == LibUtilities::eModified_A && - GetEdgeBasisType(1) == LibUtilities::eModified_A && - GetEdgeBasisType(4) == LibUtilities::eModified_C, - "Method only implemented for Modified_A BasisType (x " - "and y direction) and Modified_C BasisType (z " - "direction)"); - - bool isQuad = true; - - int nFaceCoeffs = 0; - if( fid == 0 ) // Base quad - { - nummodesA = nummodes0; - nummodesB = nummodes1; - P = nummodesA-1; - Q = nummodesB-1; - nFaceCoeffs = nummodesA*nummodesB; + ASSERTL1(GetEdgeBasisType(0) == GetEdgeBasisType(1), + "Method only implemented if BasisType is identical" + "in x and y directions"); + ASSERTL1(GetEdgeBasisType(0) == LibUtilities::eModified_A && + GetEdgeBasisType(4) == LibUtilities::eModified_C, + "Method only implemented for Modified_A BasisType" + "(x and y direction) and Modified_C BasisType (z " + "direction)"); + + int i, j, p, q, r, nFaceCoeffs; + + int order0 = m_base[0]->GetNumModes(); + int order1 = m_base[1]->GetNumModes(); + int order2 = m_base[2]->GetNumModes(); + + if (nummodesA == -1) + { + switch (fid) + { + case 0: + nummodesA = m_base[0]->GetNumModes(); + nummodesB = m_base[1]->GetNumModes(); + break; + case 1: + case 3: + nummodesA = m_base[0]->GetNumModes(); + nummodesB = m_base[2]->GetNumModes(); + break; + case 2: + case 4: + nummodesA = m_base[1]->GetNumModes(); + nummodesB = m_base[2]->GetNumModes(); + break; + } + nFaceCoeffs = GetFaceNcoeffs(fid); } -// else if((fid == 2) || (fid == 4)) // front and back quad -// { -// nummodesA = nummodes1; -// nummodesB = nummodes2; -// P = nummodesA-1; -// Q = nummodesB-1; -// nFaceCoeffs = nummodesA*nummodesB; -// } - else // left and right triangles + else if (fid > 0) { - nummodesA = nummodes0; - nummodesB = nummodes2; - P = nummodesA-1; - Q = nummodesB-1; - nFaceCoeffs = Q+1 + (P*(1 + 2*Q - P))/2; - isQuad = false; + nFaceCoeffs = nummodesB + (nummodesA-1)*(1+2*(nummodesB-1)-(nummodesA-1))/2; + } + else + { + nFaceCoeffs = nummodesA*nummodesB; } // Allocate the map array and sign array; set sign array to ones (+) - if(maparray.num_elements() != nFaceCoeffs) + if (maparray.num_elements() != nFaceCoeffs) { - maparray = Array(nFaceCoeffs,1); + maparray = Array(nFaceCoeffs); } - if(signarray.num_elements() != nFaceCoeffs) + if (signarray.num_elements() != nFaceCoeffs) { signarray = Array(nFaceCoeffs,1); } else { - fill( signarray.get() , signarray.get()+nFaceCoeffs, 1 ); + fill(signarray.get(), signarray.get() + nFaceCoeffs, 1); } + // Set up an array indexing for quads, since the ordering may need + // to be transposed. + Array arrayindx(nFaceCoeffs,-1); - - Array arrayindex(nFaceCoeffs,-1); - - for(int a = 0; a < nummodesA; ++a) + if (fid == 0) { - for(int b = 0; isQuad ? (b < nummodesB) : (b < nummodesB - a); ++b) + for (i = 0; i < nummodesB; i++) { - if( faceOrient < 9 ) // Not transposed - { - arrayindex[b + nummodesB*a] = b + nummodesB*a; - } - else // Transposed + for (j = 0; j < nummodesA; j++) { - arrayindex[b + nummodesB*a] = a + nummodesA*b; + if (faceOrient < 9) + { + arrayindx[i*nummodesA+j] = i*nummodesA+j; + } + else + { + arrayindx[i*nummodesA+j] = j*nummodesB+i; + } } } } - - int baseCoefficient = 0; - - switch(fid) + // Set up ordering inside each 2D face. Also for triangular faces, + // populate signarray. + int cnt = 0, cnt2; + switch (fid) { + case 0: // Bottom quad - // Base quad - case 0: - for(int a = 0; a < nummodesA; ++a) { - for(int b = 0; b < nummodesB; ++b) { - ASSERTL0(arrayindex[b + nummodesB*a] != -1, "arrayindex is not set up properly."); - maparray[ arrayindex[b + nummodesB*a] ] = b + nummodesB*a; + // Fill in vertices + maparray[arrayindx[0]] = 0; + maparray[arrayindx[1]] = 1; + maparray[arrayindx[nummodesA+1]] = 2; + maparray[arrayindx[nummodesA]] = 3; + + // Edge 0 + cnt = 5; + for (p = 2; p < nummodesA; ++p) + { + maparray[arrayindx[p]] = p-2 + cnt; } - } - break; - - // Rear triangle - case 3: - baseCoefficient = (nummodes1 - 1) * nummodes2; - for(int a = 0; a < nummodesA; ++a) { - for(int b = 0; b < nummodesB - a; ++b) { - ASSERTL0(arrayindex[b + nummodesB*a] != -1, "arrayindex is not set up properly."); - maparray[ arrayindex[b + nummodesB*a] ] = baseCoefficient + b; + + // Edge 1 + cnt += nummodesA-2; + for (q = 2; q < nummodesB; ++q) + { + maparray[arrayindx[q*nummodesA+1]] = q-2 + cnt; } - baseCoefficient += nummodes1*(nummodesB-1 - a) + 1; - } - break; - - // Front triangle - case 1: - for(int a = 0; a < nummodesA; ++a) { - for(int b = 0; b < nummodesB - a; ++b) { - ASSERTL0(arrayindex[b + nummodesB*a] != -1, "arrayindex is not set up properly."); - maparray[ arrayindex[b + nummodesB*a] ] = baseCoefficient + b; + + // Edge 2 + cnt += nummodesB-2; + for (p = 2; p < nummodesA; ++p) + { + maparray[arrayindx[nummodesA+p]] = p-2 + cnt; } - baseCoefficient += nummodes1 * (nummodes2 - a); - } - break; + // Edge 3 + cnt += nummodesA-2; + for (q = 2; q < nummodesB; ++q) + { + maparray[arrayindx[q*nummodesA]] = q-2 + cnt; + } - // Vertical triangle - case 4: - for(int a = 0, n = 0; a < nummodesA; ++a) { - for(int b = 0; b < nummodesB - a; ++b, ++n) { - ASSERTL0(arrayindex[b + nummodesB*a] != -1, "arrayindex is not set up properly."); - maparray[ arrayindex[b + nummodesB*a] ] = n; + // Interior + cnt += nummodesB-2 + 4*(nummodesA-2); + for (q = 2; q < nummodesB; ++q) + { + for (p = 2; p < nummodesA; ++p) + { + maparray[arrayindx[q*nummodesA+p]] = cnt + (q-2)*nummodesA+(p-2); + } } - } - break; - + break; + + case 1: // Left triangle + // Vertices + maparray[0] = 0; + maparray[1] = 4; + maparray[nummodesB] = 1; - // Slanted triangle - case 2: - for(int b = nummodesB-1; b >= 0; --b) { - for(int a = 0; a < nummodesA - b; ++a) { - ASSERTL0(arrayindex[b + nummodesB*a] != -1, "arrayindex is not set up properly."); - maparray[ arrayindex[b + nummodesB*a] ] = baseCoefficient + (a+1)*(b+1) - 1; + // Edge 0 (pyramid edge 0) + cnt = 5; + q = 2*nummodesB-1; + for (p = 2; p < nummodesA; q += nummodesB-p, ++p) + { + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = p % 2 ? -1 : 1; + } + } + + // Edge 1 (pyramid edge 5) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + (order2-2); + for (q = 2; q < nummodesB; ++q) + { + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = q % 2 ? -1 : 1; + } + } + + // Edge 2 (pyramid edge 4) + cnt = 5 + 2*(order0-2) + 2*(order1-2); + for (q = 2; q < nummodesB; ++q) + { + maparray[nummodesB+q-1] = cnt++; + if ((int)faceOrient == 7) + { + signarray[nummodesB+q-1] = q % 2 ? -1 : 1; + } } - baseCoefficient += nummodesA*(b+1); - } - break; - - } - if( (faceOrient==6) || (faceOrient==8) || - (faceOrient==11) || (faceOrient==12) ) - { + // Interior + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 4*(order2-2) + + v_GetFaceIntNcoeffs(0); + cnt2 = 2*nummodesB + 1; + for (p = 2; p < nummodesA; ++p) + { + for (r = 2; r < nummodesB-p; ++r) + { + maparray[cnt2] = cnt++; + if ((int)faceOrient == 7 && p > 1) + { + signarray[cnt2++] = p % 2 ? -1 : 1; + } + } + cnt2++; + } + break; - if(faceOrient<9) - { - for(i = 3; i < nummodesB; i+=2) + case 2: + // Vertices + maparray[0] = 1; + maparray[1] = 4; + maparray[nummodesB] = 2; + + // Edge 0 (pyramid edge 1) + cnt = 5 + (order0-2); + q = 2*nummodesB-1; + for (p = 2; p < nummodesA; q += nummodesB-p, ++p) { - for(j = 0; j < nummodesA; j++) + maparray[q] = cnt++; + if ((int)faceOrient == 7) { - if( arrayindex[i*nummodesA+j] >= 0 ) - signarray[ arrayindex[i*nummodesA+j] ] *= -1; + signarray[q] = p % 2 ? -1 : 1; } } - - for(i = 0; i < nummodesA; i++) + + // Edge 1 (pyramid edge 6) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 2*(order2-2); + for (q = 2; q < nummodesB; ++q) { - swap( maparray[i] , maparray[i+nummodesA] ); - swap( signarray[i] , signarray[i+nummodesA] ); + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = q % 2 ? -1 : 1; + } } - } - else - { - for(i = 0; i < nummodesB; i++) + + // Edge 2 (pyramid edge 5) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + (order2-2); + for (q = 2; q < nummodesB; ++q) { - for(j = 3; j < nummodesA; j+=2) + maparray[nummodesB+q-1] = cnt++; + if ((int)faceOrient == 7) { - if( arrayindex[i*nummodesA+j] >= 0 ) - signarray[ arrayindex[i*nummodesA+j] ] *= -1; + signarray[nummodesB+q-1] = q % 2 ? -1 : 1; } - } - - for(i = 0; i < nummodesB; i++) + } + + // Interior + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 4*(order2-2) + + v_GetFaceIntNcoeffs(0) + v_GetFaceIntNcoeffs(1); + cnt2 = 2*nummodesB + 1; + for (p = 2; p < nummodesA; ++p) + { + for (r = 2; r < nummodesB-p; ++r) + { + maparray[cnt2] = cnt++; + if ((int)faceOrient == 7 && p > 1) + { + signarray[cnt2++] = p % 2 ? -1 : 1; + } + } + cnt2++; + } + break; + + case 3: // Right triangle + // Vertices + maparray[0] = 3; + maparray[1] = 4; + maparray[nummodesB] = 2; + + // Edge 0 (pyramid edge 2) + cnt = 5 + (order0-2) + (order1-2); + q = 2*nummodesB-1; + for (p = 2; p < nummodesA; q += nummodesB-p, ++p) + { + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = p % 2 ? -1 : 1; + } + } + + // Edge 1 (pyramid edge 6) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 2*(order2-2); + for (q = 2; q < nummodesB; ++q) { - swap( maparray[i] , maparray[i+nummodesB] ); - swap( signarray[i] , signarray[i+nummodesB] ); + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = q % 2 ? -1 : 1; + } + } + + // Edge 2 (pyramid edge 7) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 3*(order2-2); + for (q = 2; q < nummodesB; ++q) + { + maparray[nummodesB+q-1] = cnt++; + if ((int)faceOrient == 7) + { + signarray[nummodesB+q-1] = q % 2 ? -1 : 1; + } + } + + // Interior + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 4*(order2-2) + + v_GetFaceIntNcoeffs(0) + v_GetFaceIntNcoeffs(1) + + v_GetFaceIntNcoeffs(2); + cnt2 = 2*nummodesB + 1; + for (p = 2; p < nummodesA; ++p) + { + for (r = 2; r < nummodesB-p; ++r) + { + maparray[cnt2] = cnt++; + if ((int)faceOrient == 7 && p > 1) + { + signarray[cnt2++] = p % 2 ? -1 : 1; + } + } + cnt2++; + } + break; + + case 4: // Rear quad + // Vertices + maparray[0] = 0; + maparray[1] = 4; + maparray[nummodesB] = 3; + + // Edge 0 (pyramid edge 3) + cnt = 5 + 2*(order0-2) + (order1-2); + q = 2*nummodesB-1; + for (p = 2; p < nummodesA; q += nummodesB-p, ++p) + { + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = p % 2 ? -1 : 1; + } + } + + // Edge 1 (pyramid edge 7) + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 3*(order2-2); + for (q = 2; q < nummodesB; ++q) + { + maparray[q] = cnt++; + if ((int)faceOrient == 7) + { + signarray[q] = q % 2 ? -1 : 1; + } + } + + // Edge 2 (pyramid edge 4) + cnt = 5 + 2*(order0-2) + 2*(order1-2); + for (q = 2; q < nummodesB; ++q) + { + maparray[nummodesB+q-1] = cnt++; + if ((int)faceOrient == 7) + { + signarray[nummodesB+q-1] = q % 2 ? -1 : 1; + } + } + + // Interior + cnt = 5 + 2*(order0-2) + 2*(order1-2) + 4*(order2-2) + + v_GetFaceIntNcoeffs(0) + v_GetFaceIntNcoeffs(1) + + v_GetFaceIntNcoeffs(2) + v_GetFaceIntNcoeffs(3); + cnt2 = 2*nummodesB + 1; + for (p = 2; p < nummodesA; ++p) + { + for (r = 2; r < nummodesB-p; ++r) + { + maparray[cnt2] = cnt++; + if ((int)faceOrient == 7 && p > 1) + { + signarray[cnt2++] = p % 2 ? -1 : 1; + } + } + cnt2++; + } + break; + + default: + ASSERTL0(false, "Face to element map unavailable."); + } + + if (fid > 0) + { + // Triangles only have one possible orientation (base + // direction reversed); swap edge modes. + if ((int)faceOrient == 7) + { + swap(maparray[0], maparray[nummodesA]); + for (i = 1; i < nummodesA-1; ++i) + { + swap(maparray[i+1], maparray[nummodesA+i]); } } } - - if( (faceOrient==7) || (faceOrient==8) || - (faceOrient==10) || (faceOrient==12) ) - { - if(faceOrient<9) - { - for(i = 0; i < nummodesB; i++) + else + { + // The code below is exactly the same as that taken from + // StdHexExp and reverses the 'b' and 'a' directions as + // appropriate (1st and 2nd if statements respectively) in + // quadrilateral faces. + if (faceOrient == 6 || faceOrient == 8 || + faceOrient == 11 || faceOrient == 12) + { + if (faceOrient < 9) { - for(j = 3; j < nummodesA; j+=2) + for (i = 3; i < nummodesB; i += 2) { - if( arrayindex[i*nummodesA+j] >= 0 ) - signarray[ arrayindex[i*nummodesA+j] ] *= -1; + for (j = 0; j < nummodesA; j++) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } } - } - for(i = 0; i < nummodesB; i++) + for (i = 0; i < nummodesA; i++) + { + swap(maparray [i], maparray [i+nummodesA]); + swap(signarray[i], signarray[i+nummodesA]); + } + } + else { - swap( maparray[i*nummodesA] , maparray[i*nummodesA+1] ); - swap( signarray[i*nummodesA] , signarray[i*nummodesA+1] ); + for (i = 0; i < nummodesB; i++) + { + for (j = 3; j < nummodesA; j += 2) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } + + for (i = 0; i < nummodesB; i++) + { + swap (maparray [i], maparray [i+nummodesB]); + swap (signarray[i], signarray[i+nummodesB]); + } } } - else - { - for(i = 3; i < nummodesB; i+=2) + + if (faceOrient == 7 || faceOrient == 8 || + faceOrient == 10 || faceOrient == 12) + { + if (faceOrient < 9) { - for(j = 0; j < nummodesA; j++) + for (i = 0; i < nummodesB; i++) { - if( arrayindex[i*nummodesA+j] >= 0 ) - signarray[ arrayindex[i*nummodesA+j] ] *= -1; + for (j = 3; j < nummodesA; j += 2) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } } - } - - for(i = 0; i < nummodesA; i++) + + for(i = 0; i < nummodesB; i++) + { + swap(maparray [i*nummodesA], maparray [i*nummodesA+1]); + swap(signarray[i*nummodesA], signarray[i*nummodesA+1]); + } + } + else { - swap( maparray[i*nummodesB] , maparray[i*nummodesB+1] ); - swap( signarray[i*nummodesB] , signarray[i*nummodesB+1] ); + for (i = 3; i < nummodesB; i += 2) + { + for (j = 0; j < nummodesA; j++) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } + + for (i = 0; i < nummodesA; i++) + { + swap(maparray [i*nummodesB], maparray [i*nummodesB+1]); + swap(signarray[i*nummodesB], signarray[i*nummodesB+1]); + } } } - } - + } } int StdPyrExp::v_GetVertexMap(int vId, bool useCoeffPacking) { ASSERTL0(GetEdgeBasisType(vId) == LibUtilities::eModified_A || GetEdgeBasisType(vId) == LibUtilities::eModified_A || - GetEdgeBasisType(vId) == LibUtilities::eModified_B, + GetEdgeBasisType(vId) == LibUtilities::eModified_C, "Mapping not defined for this type of basis"); + return vId; + } + + void StdPyrExp::v_GetEdgeInteriorMap( + const int eid, + const Orientation edgeOrient, + Array &maparray, + Array &signarray) + { + int i; + bool signChange; + const int P = m_base[0]->GetNumModes() - 2; + const int Q = m_base[1]->GetNumModes() - 2; + const int R = m_base[2]->GetNumModes() - 2; + const int nEdgeIntCoeffs = v_GetEdgeNcoeffs(eid) - 2; - int l = 0; + if (maparray.num_elements() != nEdgeIntCoeffs) + { + maparray = Array(nEdgeIntCoeffs); + } - if(useCoeffPacking == true) // follow packing of coefficients i.e q,r,p + if(signarray.num_elements() != nEdgeIntCoeffs) + { + signarray = Array(nEdgeIntCoeffs,1); + } + else + { + fill(signarray.get(), signarray.get()+nEdgeIntCoeffs, 1); + } + + // If edge is oriented backwards, change sign of modes which have + // degree 2n+1, n >= 1. + signChange = edgeOrient == eBackwards; + + int offset = 5; + + switch (eid) { - switch (vId) - { case 0: - l = GetMode(0,0,0); break; case 1: - l = GetMode(0,0,1); + offset += P; break; case 2: - l = GetMode(0,1,0); + offset += P+Q; break; case 3: - l = GetMode(1,0,0); + offset += 2*P+Q; break; case 4: - l = GetMode(1,1,0); + offset += 2*(P+Q); + break; + case 5: + offset += 2*(P+Q)+R; + break; + case 6: + offset += 2*(P+Q+R); + break; + case 7: + offset += 2*(P+Q)+3*R; break; default: - ASSERTL0(false, "local vertex id must be between 0 and 4"); + ASSERTL0(false, "Edge not defined."); + break; + } + + for (i = 0; i < nEdgeIntCoeffs; ++i) + { + maparray[i] = offset + i; + } + + if (signChange) + { + for (i = 1; i < nEdgeIntCoeffs; i += 2) + { + signarray[i] = -1; } } + } + + void StdPyrExp::v_GetFaceInteriorMap( + const int fid, + const Orientation faceOrient, + Array &maparray, + Array &signarray) + { + const int P = m_base[0]->GetNumModes() - 1; + const int Q = m_base[1]->GetNumModes() - 1; + const int R = m_base[2]->GetNumModes() - 1; + const int nFaceIntCoeffs = v_GetFaceIntNcoeffs(fid); + int p, q, r, idx = 0; + int nummodesA; + int nummodesB; + int i, j; + + if (maparray.num_elements() != nFaceIntCoeffs) + { + maparray = Array(nFaceIntCoeffs); + } + + if (signarray.num_elements() != nFaceIntCoeffs) + { + signarray = Array(nFaceIntCoeffs, 1); + } else { - switch (vId) + fill(signarray.get(), signarray.get()+nFaceIntCoeffs, 1); + } + + // Set up an array indexing for quad faces, since the ordering may + // need to be transposed depending on orientation. + Array arrayindx(nFaceIntCoeffs); + if (fid == 0) + { + nummodesA = P-1; + nummodesB = Q-1; + + for (i = 0; i < nummodesB; i++) { + for (j = 0; j < nummodesA; j++) + { + if (faceOrient < 9) + { + arrayindx[i*nummodesA+j] = i*nummodesA+j; + } + else + { + arrayindx[i*nummodesA+j] = j*nummodesB+i; + } + } + } + } + + int offset = 5 + 2*(P-1) + 2*(Q-1) + 4*(R-1); + + for (i = 0; i < fid; ++i) + { + offset += v_GetFaceIntNcoeffs(i); + } + + switch (fid) + { case 0: - l = GetMode(0,0,0); + for (q = 2; q <= Q; ++q) + { + for (p = 2; p <= P; ++p) + { + maparray[arrayindx[(q-2)*nummodesA+(p-2)]] + = offset + (q-2)*nummodesA+(p-2); + } + } break; + case 1: - l = GetMode(1,0,0); - break; - case 2: - l = GetMode(1,1,0); - break; case 3: - l = GetMode(0,1,0); + for (p = 2; p <= P; ++p) + { + for (r = 1; r <= R-p; ++r, ++idx) + { + if ((int)faceOrient == 7) + { + signarray[idx] = p % 2 ? -1 : 1; + } + maparray[idx] = offset + idx; + } + } break; + + case 2: case 4: - l = GetMode(0,0,1); + for (q = 2; q <= Q; ++q) + { + for (r = 1; r <= R-q; ++r, ++idx) + { + if ((int)faceOrient == 7) + { + signarray[idx] = q % 2 ? -1 : 1; + } + maparray[idx] = offset + idx; + } + } break; + default: - ASSERTL0(false, "local vertex id must be between 0 and 4"); + ASSERTL0(false, "Face interior map not available."); + } + + // Triangular faces are processed in the above switch loop; for + // remaining quad faces, set up orientation if necessary. + if (fid > 0) + { + return; + } + + if (faceOrient == 6 || faceOrient == 8 || + faceOrient == 11 || faceOrient == 12) + { + if (faceOrient < 9) + { + for (i = 1; i < nummodesB; i += 2) + { + for (j = 0; j < nummodesA; j++) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } + } + else + { + for (i = 0; i < nummodesB; i++) + { + for (j = 1; j < nummodesA; j += 2) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } + } + } + + if (faceOrient == 7 || faceOrient == 8 || + faceOrient == 10 || faceOrient == 12) + { + if (faceOrient < 9) + { + for (i = 0; i < nummodesB; i++) + { + for (j = 1; j < nummodesA; j += 2) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } + } + else + { + for (i = 1; i < nummodesB; i += 2) + { + for (j = 0; j < nummodesA; j++) + { + signarray[arrayindx[i*nummodesA+j]] *= -1; + } + } } } - - return l; } - + + void StdPyrExp::v_GetInteriorMap(Array &outarray) + { + ASSERTL1(GetBasisType(0) == LibUtilities::eModified_A || + GetBasisType(0) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + ASSERTL1(GetBasisType(1) == LibUtilities::eModified_A || + GetBasisType(1) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + ASSERTL1(GetBasisType(2) == LibUtilities::eModified_C || + GetBasisType(2) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + + const int nBndCoeffs = v_NumBndryCoeffs(); + const int nIntCoeffs = m_ncoeffs - NumBndryCoeffs(); + + if (outarray.num_elements() != nIntCoeffs) + { + outarray = Array(nIntCoeffs); + } + + // Loop over all interior modes. + int p, idx = 0; + for (p = nBndCoeffs; p < m_ncoeffs; ++p) + { + outarray[idx++] = p; + } + } + + void StdPyrExp::v_GetBoundaryMap(Array &maparray) + { + ASSERTL1(GetBasisType(0) == LibUtilities::eModified_A || + GetBasisType(0) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + ASSERTL1(GetBasisType(1) == LibUtilities::eModified_A || + GetBasisType(1) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + ASSERTL1(GetBasisType(2) == LibUtilities::eModified_C || + GetBasisType(2) == LibUtilities::eGLL_Lagrange, + "BasisType is not a boundary interior form"); + + int idx = 0, nBndry = v_NumBndryCoeffs(); + + for (idx = 0; idx < nBndry; ++idx) + { + maparray[idx] = idx; + } + } //--------------------------------------- // Wrapper functions @@ -1141,77 +1782,32 @@ namespace Nektar } /** - * @brief Compute the local mode number in the expansion for a - * particular tensorial combination. - * - * Modes are numbered with the r index travelling fastest, followed by - * q and then p, with each plane of size (Q+1)*[(Q+2)/2+R-Q-p]. For - * example, with P=3, Q=3, R=4, the indexing inside each q-r plane - * (with r increasing upwards and q to the right) is: - * - * 4 * * * - * 3 8 17 21 * * * * - * 2 7 11 16 20 24 29 32 35 * * * - * 1 6 10 13 15 19 23 26 28 31 34 37 39 41 43 45 - * 0 5 9 12 14 18 22 25 27 30 33 36 38 40 42 44 - * - * Note that in the pyramid, then number of modes needed to perform - * the boundary-interior decomposition is larger than the space of - * polynomials used to represent it. - */ - int StdPyrExp::GetMode(int p, int q, int r) - { - int Q = m_base[1]->GetNumModes() - 1; - int R = m_base[2]->GetNumModes() - 1; - - return p*(Q+1)*((Q+2)/2+(R-Q)) - (p-1)*p*(p+1)/6 + // skip to p-th plane - r+q*(2*(R+1)+1-q)/2 - // normal tri indexing - // account for offset (starred points) - (q > 0 ? p*(p+1)/2 - (q-1 < p ? (p-q+1)*(p-q)/2 : 0) : 0); - } - - /** - * 3 - * 2 6 12 - * 1 5 8 11 14 17 - * 0 4 7 9 10 13 15 16 18 19 + * @brief Number tetrahedral modes in r-direction. Much the same as + * StdTetExp::GetTetMode but slightly simplified since we know that the + * polynomial order is the same in each direction. */ - int StdPyrExp::GetTetMode(const int I, const int J, const int K) { - const int P = m_base[0]->GetNumModes(); - const int Q = m_base[1]->GetNumModes(); const int R = m_base[2]->GetNumModes(); - - int i,j,q_hat,k_hat; - int cnt = 0; - - // Skip along the stacks (K) + int i, j, cnt = 0; for (i = 0; i < I; ++i) { - q_hat = min(Q,P-i); - k_hat = min(R-Q, max(0, R-i)); - cnt += q_hat*(q_hat+1)/2 - k_hat*Q; + cnt += (R-i)*(R-i+1)/2; } - - // Skip across the columns (J) - q_hat = min(Q,P-I); - k_hat = min(R-Q, max(0, R-I)); + + i = R-I; for (j = 0; j < J; ++j) { - cnt += q_hat + k_hat - j; + cnt += i; + i--; } - - // Skip up the columns (K) - cnt += K; - - // Return the final mode number - return cnt; + + return cnt + K; } - void StdPyrExp::MultiplyByQuadratureMetric( + void StdPyrExp::v_MultiplyByStdQuadratureMetric( const Array& inarray, - Array &outarray) + Array& outarray) { int i, j; diff --git a/library/StdRegions/StdPyrExp.h b/library/StdRegions/StdPyrExp.h index 7c8ca23cc2956604919577cf34e9798a1d4f5851..b9bb8d9875f4094119b84d7098521868cfd9c609 100644 --- a/library/StdRegions/StdPyrExp.h +++ b/library/StdRegions/StdPyrExp.h @@ -39,17 +39,49 @@ #include #include +#include namespace Nektar { namespace StdRegions { + typedef boost::tuple< + unsigned int, unsigned int, unsigned int, unsigned int> Mode; + + struct cmpop + { + bool operator()(Mode const &a, Mode const &b) const + { + if (a.get<0>() < b.get<0>()) + { + return true; + } + if (a.get<0>() > b.get<0>()) + { + return false; + } + + if (a.get<1>() < b.get<1>()) + { + return true; + } + if (a.get<1>() > b.get<1>()) + { + return false; + } + + if (a.get<2>() < b.get<2>()) + { + return true; + } + + return false; + } + }; class StdPyrExp : virtual public StdExpansion3D { - public: - STD_REGIONS_EXPORT StdPyrExp(); STD_REGIONS_EXPORT StdPyrExp(const LibUtilities::BasisKey &Ba, @@ -66,116 +98,95 @@ namespace Nektar STD_REGIONS_EXPORT ~StdPyrExp(); - //--------------------------------------- - // Integration/public 3D methods - //--------------------------------------- - STD_REGIONS_EXPORT void TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array & outarray); - - STD_REGIONS_EXPORT NekDouble TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz); - - STD_REGIONS_EXPORT NekDouble Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz); + STD_REGIONS_EXPORT int GetTetMode(int I, int J, int K); protected: //--------------------------------------- // Differentiation/integration Methods //--------------------------------------- - STD_REGIONS_EXPORT virtual void v_PhysDeriv( - const Array& inarray, - Array &out_d0, - Array &out_d1, - Array &out_d2); - + const Array &inarray, + Array &out_d0, + Array &out_d1, + Array &out_d2); STD_REGIONS_EXPORT virtual void v_PhysDeriv( - const int dir, - const Array& inarray, - Array& outarray); - + const int dir, + const Array &inarray, + Array &outarray); STD_REGIONS_EXPORT virtual void v_StdPhysDeriv( - const Array& inarray, - Array &out_d0, - Array &out_d1, - Array &out_d2); - - STD_REGIONS_EXPORT virtual NekDouble v_Integral( - const Array& inarray); - + const Array &inarray, + Array &out_d0, + Array &out_d1, + Array &out_d2); + STD_REGIONS_EXPORT virtual void v_StdPhysDeriv( + const int dir, + const Array &inarray, + Array &outarray); + STD_REGIONS_EXPORT void v_MultiplyByStdQuadratureMetric( + const Array &inarray, + Array &outarray); //--------------------------------------- // Transforms //--------------------------------------- - STD_REGIONS_EXPORT virtual void v_BwdTrans( const Array& inarray, Array &outarray); - + STD_REGIONS_EXPORT virtual void v_BwdTrans_SumFac( + const Array &inarray, + Array &outarray); STD_REGIONS_EXPORT virtual void v_BwdTrans_SumFacKernel( - const Array& base0, - const Array& base1, - const Array& base2, - const Array& inarray, - Array &outarray, - Array &wsp, - bool doCheckCollDir0, - bool doCheckCollDir1, - bool doCheckCollDir2); - + const Array &base0, + const Array &base1, + const Array &base2, + const Array &inarray, + Array &outarray, + Array &wsp, + bool doCheckCollDir0, + bool doCheckCollDir1, + bool doCheckCollDir2); STD_REGIONS_EXPORT virtual void v_FwdTrans( const Array& inarray, Array &outarray); - //--------------------------------------- // Inner product functions //--------------------------------------- STD_REGIONS_EXPORT virtual void v_IProductWRTBase( const Array &inarray, Array &outarray); - + STD_REGIONS_EXPORT virtual void v_IProductWRTBase_SumFac( + const Array &inarray, + Array &outarray); STD_REGIONS_EXPORT virtual void v_IProductWRTBase_SumFacKernel( - const Array& base0, - const Array& base1, - const Array& base2, - const Array& inarray, - Array &outarray, - Array &wsp, - bool doCheckCollDir0, - bool doCheckCollDir1, - bool doCheckCollDir2); - - /* + const Array &base0, + const Array &base1, + const Array &base2, + const Array &inarray, + Array &outarray, + Array &wsp, + bool doCheckCollDir0, + bool doCheckCollDir1, + bool doCheckCollDir2); STD_REGIONS_EXPORT virtual void v_IProductWRTDerivBase( const int dir, - const Array &inarray, - Array &outarray); - */ + const Array& inarray, + Array& outarray); + STD_REGIONS_EXPORT virtual void v_IProductWRTDerivBase_SumFac( + const int dir, + const Array& inarray, + Array& outarray); //--------------------------------------- // Evaluation functions //--------------------------------------- - STD_REGIONS_EXPORT virtual void v_LocCoordToLocCollapsed( - const Array& xi, - Array& eta); - + const Array& xi, + Array& eta); STD_REGIONS_EXPORT virtual void v_GetCoords( Array & xi_x, Array & xi_y, Array & xi_z); - STD_REGIONS_EXPORT virtual void v_FillMode( const int mode, Array &outarray); @@ -202,291 +213,43 @@ namespace Nektar //--------------------------------------- STD_REGIONS_EXPORT virtual void v_GetFaceToElementMap( const int fid, - const Orientation faceOrient, + const Orientation faceOrient, Array &maparray, Array &signarray, int nummodesA=-1, int nummodesB=-1); - STD_REGIONS_EXPORT virtual int v_GetVertexMap(int localVertexId, - bool useCoeffPacking = false); - /* + STD_REGIONS_EXPORT virtual int v_GetVertexMap( + int localVertexId, + bool useCoeffPacking = false); STD_REGIONS_EXPORT virtual void v_GetEdgeInteriorMap( - const int eid, - const Orientation edgeOrient, + const int eid, + const Orientation edgeOrient, Array &maparray, - Array &signarray); + Array &signarray); STD_REGIONS_EXPORT virtual void v_GetFaceInteriorMap( - const int fid, - const Orientation faceOrient, + const int fid, + const Orientation faceOrient, Array &maparray, - Array& signarray); + Array &signarray); STD_REGIONS_EXPORT virtual void v_GetInteriorMap( Array &outarray); STD_REGIONS_EXPORT virtual void v_GetBoundaryMap( - Array& outarray); - */ + Array &outarray); //--------------------------------------- // Wrapper functions //--------------------------------------- - STD_REGIONS_EXPORT virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey); - STD_REGIONS_EXPORT virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual DNekMatSharedPtr v_GenMatrix( + const StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual DNekMatSharedPtr v_CreateStdMatrix( + const StdMatrixKey &mkey); private: //--------------------------------------- // Private helper functions //--------------------------------------- - STD_REGIONS_EXPORT int GetMode(int I, int J, int K); - STD_REGIONS_EXPORT int GetTetMode(int I, int J, int K); - STD_REGIONS_EXPORT void MultiplyByQuadratureMetric( - const Array& inarray, - Array &outarray); - - - /* - // int GetBasisNumModes (const int dir) - - int GetFaceNcoeffs(const int i) const - { - } - - const int GetEdgeNcoeffs(const int i) const - { - - } - - - const LibUtilities::BasisType GetEdgeBasisType(const int i) const - { - ASSERTL2((i >= 0)&&(i <= 7),"edge id is out of range"); - - if((i == 0)||(i == 2)) - { - return GetBasisType(0); - } - else if((i == 1)||(i == 3)) - { - return GetBasisType(1); - } - else - { - return GetBasisType(2); - } - - } - STD_REGIONS_EXPORT NekDouble Integral3D(const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT NekDouble Integral(const Array& inarray); - */ - - /* - STD_REGIONS_EXPORT void PhysDeriv(const Array& u_physical, - Array &out_dxi1, - Array &out_dxi2, - Array &out_dxi3 ); - - void StdPhysDeriv(const Array& inarray, - Array &out_d0, - Array &out_d1, - Array &out_d2) - { - PhysDeriv(inarray, out_d0, out_d1, out_d2); - } - - STD_REGIONS_EXPORT void FillMode(const int mode, Array &outarray); - - */ - /** \brief Backward tranform for triangular elements - * - * \b Note: That 'r' (base[2]) runs fastest in this element - */ - /* - STD_REGIONS_EXPORT void BwdTrans(const Array& inarray, Array &outarray); - STD_REGIONS_EXPORT void FwdTrans(const Array& inarray, Array &outarray); - */ - /** \brief Single Point Evaluation */ - /* - STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array& xi); - STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array& xi, const Array & physvals); - - STD_REGIONS_EXPORT void GetCoords( Array & xi_x, Array & xi_y, Array & xi_z); - - DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey) - { - return StdExpansion::CreateGeneralMatrix(mkey); - } - - - protected: - */ - - /** - \brief Calculate the inner product of inarray with respect to - the basis B=base0*base1*base2 and put into outarray: - - \f$ \begin{array}{rcl} I_{pqr} = (\phi_{pqr}, u)_{\delta} & = & - \sum_{i=0}^{nq_0} \sum_{j=0}^{nq_1} \sum_{k=0}^{nq_2} - \psi_{p}^{a} (\bar \eta_{1i}) \psi_{q}^{a} (\eta_{2j}) \psi_{pqr}^{c} (\eta_{3k}) - w_i w_j w_k u(\bar \eta_{1,i} \eta_{2,j} \eta_{3,k}) - J_{i,j,k}\\ & = & \sum_{i=0}^{nq_0} \psi_p^a(\bar \eta_{1,i}) - \sum_{j=0}^{nq_1} \psi_{q}^a(\eta_{2,j}) \sum_{k=0}^{nq_2} \psi_{pqr}^c u(\bar \eta_{1i},\eta_{2j},\eta_{3k}) - J_{i,j,k} \end{array} \f$ \n - - where - - \f$\phi_{pqr} (\xi_1 , \xi_2 , \xi_3) = \psi_p^a (\bar \eta_1) \psi_{q}^a (\eta_2) \psi_{pqr}^c (\eta_3) \f$ \n - - which can be implemented as \n - \f$f_{pqr} (\xi_{3k}) = \sum_{k=0}^{nq_3} \psi_{pqr}^c u(\bar \eta_{1i},\eta_{2j},\eta_{3k}) - J_{i,j,k} = {\bf B_3 U} \f$ \n - \f$ g_{pq} (\xi_{3k}) = \sum_{j=0}^{nq_1} \psi_{q}^a (\xi_{2j}) f_{pqr} (\xi_{3k}) = {\bf B_2 F} \f$ \n - \f$ (\phi_{pqr}, u)_{\delta} = \sum_{k=0}^{nq_0} \psi_{p}^a (\xi_{3k}) g_{pq} (\xi_{3k}) = {\bf B_1 G} \f$ - - **/ - // Interior pyramid implementation based on Spen's book page 108. 113. and 609. - /* - STD_REGIONS_EXPORT void IProductWRTBase(const Array& bx, - const Array& by, - const Array& bz, - const Array& inarray, - Array & outarray); - */ - /* - private: - - virtual int v_GetNverts() const - { - return 5; - } - - virtual int v_GetNedges() const - { - return 8; - } - - virtual int v_GetNfaces() const - { - return 5; - } - - virtual LibUtilities::ShapeType v_DetShapeType() const - { - return DetShapeType(); - } - - virtual int v_GetFaceNcoeffs(const int i) const - { - return GetFaceNcoeffs(i); - } - - virtual void v_GetBoundaryMap(Array& outarray) - { - GetBoundaryMap(outarray); - } - - virtual void v_GetInteriorMap(Array& outarray) - { - GetInteriorMap(outarray); - } - - virtual int v_GetVertexMap(int localVertexId) - { - return GetVertexMap(localVertexId); - } - - virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, - Array &maparray, - Array &signarray) - { - GetEdgeInteriorMap(eid,edgeOrient,maparray,signarray); - } - - virtual void v_GetFaceToElementMap(const int fid, const Orientation faceOrient, - Array &maparray, - Array& signarray) - { - GetFaceToElementMap(fid,faceOrient,maparray,signarray); - } - - virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) - { - return GenMatrix(mkey); - } - - virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) - { - return GenMatrix(mkey); - } - - virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const - { - return GetEdgeBasisType(i); - } - - virtual void v_GetCoords(Array &coords_x, - Array &coords_y, - Array &coords_z) - { - GetCoords(coords_x, coords_y, coords_z); - } - - virtual NekDouble v_Integral(const Array& inarray ) - { - return Integral(inarray); - } - - virtual void v_IProductWRTBase(const Array& inarray, - Array &outarray) - { - IProductWRTBase(inarray, outarray); - } - - virtual void v_FillMode(const int mode, Array &outarray) - { - return FillMode(mode, outarray); - } - - virtual void v_PhysDeriv(const Array& inarray, - Array &out_d0, - Array &out_d1, - Array &out_d2) - { - PhysDeriv(inarray, out_d0, out_d1, out_d2); - } - - virtual void v_StdPhysDeriv(const Array& inarray, - Array &out_d0, - Array &out_d1, - Array &out_d2) - { - StdPhysDeriv(inarray, out_d0, out_d1, out_d2); - } - - virtual void v_BwdTrans(const Array& inarray, - Array &outarray) - { - BwdTrans(inarray, outarray); - } - - virtual void v_FwdTrans(const Array& inarray, - Array &outarray) - { - FwdTrans(inarray, outarray); - } - - virtual NekDouble v_PhysEvaluate(const Array& Lcoords, const Array & physvals) - { - return PhysEvaluate(Lcoords, physvals); - } - - virtual int v_GetEdgeNcoeffs(const int i) const - { - return GetEdgeNcoeffs(i); - } - - */ + map m_map; + map > > > m_idxMap; }; typedef boost::shared_ptr StdPyrExpSharedPtr; } //end of namespace diff --git a/library/StdRegions/StdTetExp.cpp b/library/StdRegions/StdTetExp.cpp index b6db7a0b41d3ee8de59b16930cd23ae2cb9c629a..221f7f5b40f1398ed6a0eb722cfee7c762b81b88 100644 --- a/library/StdRegions/StdTetExp.cpp +++ b/library/StdRegions/StdTetExp.cpp @@ -83,230 +83,6 @@ namespace Nektar { } - //------------------------------- - // Integration Methods - //------------------------------- - void StdTetExp::TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array & outarray ) - { - // Using matrix operation, not sum-factorization. - // Regarding the 3D array, inarray[k][j][i], x is changing the - // fastest and z the slowest. Thus, the first x-vector of points - // refers to the first row of the first stack. The first y-vector - // refers to the first column of the first stack. The first z- - // vector refers to the vector of stacks intersecting the first row - // and first column. So in C++, i refers to column, j to row, and k - // to stack. Contrasting this with the usual C++ matrix convention, - // note that i does not refer to a C++ row, nor j to C++ column. - - int nx = fx.num_elements(); - int ny = gy.num_elements(); - int nz = hz.num_elements(); - - // Multiply by integration constants... - // Hadamard multiplication refers to elementwise multiplication of - // two vectors. - - // Hadamard each row with the first vector (x-vector); the index i - // is changing the fastest. - // For each j and k, iterate over each row in all of the stacks at - // once - for (int jk = 0; jk < ny*nz; ++jk) - { - Vmath::Vmul( - nx, // Size of first weight vector - &inarray[0] + jk*nx, 1, // Offset and stride of each - // row-vector (x is changing - // fastest) - fx.get(), 1, // First weight vector (with stride - // of 1) - &outarray[0] + jk*nx, 1 // Output has same offset - // and stride as input - ); - } - - // Hadamard each column with the second vector (y-vector) - // For each stack in the 3D-array, do the following... - for (int k = 0; k < nz; ++k) - { - // Iterate over each column in the current stack - for (int i = 0; i < nx; ++i) - { - Vmath::Vmul( - ny, // Size of second weight vector - &outarray[0] + i + nx*ny*k, nx, // Offset and stride of - // each column-vector - gy.get(), 1, // second weight vector (with - // stride of 1) - &outarray[0] + i + nx*ny*k, nx // Output has same - // offset and stride as input - ); - } - } - - // Hadamard each stack-vector with the third vector (z-vector) - // Iterate over each element in the topmost stack - for (int ij = 0; ij < nx*ny; ++ij) - { - Vmath::Vmul( - nz, // Size of third weight vector - &outarray[0] + ij, nx*ny, // Offset and stride of - // each stack-vector - hz.get(), 1, // Third weight vector (with stride - // of 1) - &outarray[0] + ij, nx*ny // Output has same offset - // and stride as input - ); - } - - } - - - /** - * Inner-Product with respect to the weights: i.e., this is the triple - * sum of the product of the four inputs over the Hexahedron. - * x-dimension is the row, it is the index that changes the fastest - * y-dimension is the column - * z-dimension is the stack, it is the index that changes the slowest - */ - NekDouble StdTetExp::TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz) - { - int Qx = wx.num_elements(); - int Qy = wy.num_elements(); - int Qz = wz.num_elements(); - - if( fxyz.num_elements() != Qx*Qy*Qz ) { - cerr << "TripleTetrahedralInnerProduct expected " - << fxyz.num_elements() - << " quadrature points from the discretized input " - "function but got " - << Qx*Qy*Qz << " instead." << endl; - } - - // Sum-factorizing over the stacks - Array A(Qx*Qy, 0.0); - for( int i = 0; i < Qx; ++i ) { - for( int j = 0; j < Qy; ++j ) { - for( int k = 0; k < Qz; ++k ) { - A[i + Qx*j] += fxyz[i + Qx*(j + Qy*k)] * wz[k]; - } - } - } - - // Sum-factorizing over the columns - Array b(Qx, 0.0); - for( int i = 0; i < Qx; ++i ) { - for( int j = 0; j < Qy; ++j ) { - b[i] += A[i + Qx*j] * wy[j]; - } - } - - // Sum-factorizing over the rows - NekDouble c = 0; - for( int i = 0; i < Qx; ++i ) { - c += b[i] * wx[i]; - } - - return c; - } - - - NekDouble StdTetExp::Integral3D( - const Array& inarray, - const Array& wx, - const Array& wy, - const Array& wz) - { - return TripleInnerProduct(inarray, wx, wy, wz); - } - - - - /** - * @param inarray definition of function to be returned at - * quadrature point of expansion. - * @returns \f$\int^1_{-1}\int^1_{-1}\int^1_{-1} - * u(\eta_1, \eta_2, \eta_3) J[i,j,k] d \eta_1 d \eta_2 d \eta_3 \f$ \n - * = \f$\sum_{i=0}^{Q_1 - 1} \sum_{j=0}^{Q_2 - 1} \sum_{k=0}^{Q_3 - 1} - * u(\eta_{1i}^{0,0}, \eta_{2j}^{1,0},\eta_{3k}^{2,0})w_{i}^{1,0} - * \hat w_{j}^{1,0} \hat w_{k}^{2,0} \f$ \n - * where - * \f$inarray[i,j, k] = u(\eta_{1i},\eta_{2j}, \eta_{3k}) \f$, \n - * \f$\hat w_{j}^{1,0} = \frac {w_{j}^{1,0}} {2}, \hat w_{k}^{2,0} - * = \frac{w_{k}^{2,0}} {4} \f$ \n - * and \f$ J[i,j,k] \f$ is the Jacobian evaluated at the quadrature - * point. - */ - NekDouble StdTetExp::v_Integral( - const Array& inarray) - { - // Using implementation from page 145 of Spencer Sherwin's book - int Qy = m_base[1]->GetNumPoints(); - int Qz = m_base[2]->GetNumPoints(); - - // Get the point distributions: - // x is assumed to be Gauss-Lobatto-Legendre (includes -1 and +1) - Array y,z,wx,wy,wz; - wx = m_base[0]->GetW(); - m_base[1]->GetZW(y,wy); - m_base[2]->GetZW(z,wz); - - Array wy_hat = Array(Qy, 0.0); - Array wz_hat = Array(Qz, 0.0); - - // Convert wy into wy_hat, which includes the 1/2 scale factor. - // Nothing else need be done if the point distribution is Jacobi - // (1,0) since (1-eta_y) is aready factored into the weights. - switch(m_base[1]->GetPointsType()) - { - // (1,0) Jacobi Inner product - case LibUtilities::eGaussRadauMAlpha1Beta0: - Vmath::Smul( Qy, 0.5, (NekDouble *)wy.get(), 1, wy_hat.get(), 1 ); - break; - - // Assume points are a Legenedre inner product and - // multiply by collapsed coordinate jacobian - default: - for(int j = 0; j < Qy; ++j) - { - wy_hat[j] = 0.5*(1.0 - y[j]) * wy[j]; - } - break; - } - - // Convert wz into wz_hat, which includes the 1/4 scale factor. - // Nothing else need be done if the point distribution is Jacobi - // (2,0) since (1-eta_z)^2 is aready factored into the weights. - // Note by coincidence, xi_z = eta_z (xi_z = z according to our - // notation) - switch(m_base[2]->GetPointsType()) - { - // (2,0) Jacobi Inner product - case LibUtilities::eGaussRadauMAlpha2Beta0: - Vmath::Smul(Qz, 0.25, (NekDouble *)wz.get(), 1, - wz_hat.get(), 1 ); - break; - // Assume points are a Legenedre inner product and - // multiply by collapsed coordinate jacobian - default: - for(int k = 0; k < Qz; ++k) - { - wz_hat[k] = 0.25*(1.0 - z[k])*(1.0 - z[k]) * wz[k]; - } - break; - } - - return Integral3D(inarray, wx, wy_hat, wz_hat); - } - //---------------------------- // Differentiation Methods //---------------------------- diff --git a/library/StdRegions/StdTetExp.h b/library/StdRegions/StdTetExp.h index c45d349ef1712e6b656654a38839de5c33cc3ec4..df85aad02d4720b0c517d34eb6d487ce5f1ffcce 100644 --- a/library/StdRegions/StdTetExp.h +++ b/library/StdRegions/StdTetExp.h @@ -78,28 +78,6 @@ namespace Nektar protected: - //------------------------------- - // Integration Methods - //------------------------------- - STD_REGIONS_EXPORT void TripleTensorProduct( - const Array& fx, - const Array& gy, - const Array& hz, - const Array& inarray, - Array& outarray); - STD_REGIONS_EXPORT NekDouble TripleInnerProduct( - const Array& fxyz, - const Array& wx, - const Array& wy, - const Array& wz); - STD_REGIONS_EXPORT NekDouble Integral3D( - const Array& inarray, - const Array& w0, - const Array& w1, - const Array& w2); - STD_REGIONS_EXPORT NekDouble v_Integral( - const Array& inarray); - //---------------------------- // Differentiation Methods //---------------------------- diff --git a/solvers/APESolver/EquationSystems/APE.cpp b/solvers/APESolver/EquationSystems/APE.cpp index 35a22202134ab835287666bc43a0bd780ee4eead..378d2bbf07074f4b1abc05b08bed06601428964a 100755 --- a/solvers/APESolver/EquationSystems/APE.cpp +++ b/solvers/APESolver/EquationSystems/APE.cpp @@ -41,7 +41,9 @@ namespace Nektar { - string APE::className = GetEquationSystemFactory().RegisterCreatorFunction("APE", APE::create, "Acoustic perturbation equations in conservative variables."); + string APE::className = GetEquationSystemFactory().RegisterCreatorFunction( + "APE", APE::create, + "Acoustic perturbation equations in conservative variables."); APE::APE( const LibUtilities::SessionReaderSharedPtr& pSession) @@ -224,44 +226,51 @@ namespace Nektar } - //---------------------------------------------------- - void APE::SetBoundaryConditions(Array > &inarray, NekDouble time) + //---------------------------------------------------- + void APE::SetBoundaryConditions( + Array > &inarray, + NekDouble time) { - - int nvariables = m_fields.num_elements(); - int cnt = 0; + std::string varName; + int nvariables = m_fields.num_elements(); + int cnt = 0; - // loop over Boundary Regions - for(int n = 0; n < m_fields[0]->GetBndConditions().num_elements(); ++n) + // Loop over Boundary Regions + for (int n = 0; n < m_fields[0]->GetBndConditions().num_elements(); ++n) { - - // Wall Boundary Condition - if (m_fields[0]->GetBndConditions()[n]->GetUserDefined() == SpatialDomains::eWall) - { - if (m_expdim == 1) - { - WallBoundary1D(n,inarray); - } - else if (m_expdim == 2) - { - WallBoundary2D(n,cnt,inarray); - } - } - - // Time Dependent Boundary Condition (specified in meshfile) - if (m_fields[0]->GetBndConditions()[n]->GetUserDefined() == SpatialDomains::eTimeDependent) - { - for (int i = 0; i < nvariables; ++i) - { - m_fields[i]->EvaluateBoundaryConditions(time); - } - } - cnt +=m_fields[0]->GetBndCondExpansions()[n]->GetExpSize(); + // Wall Boundary Condition + if (m_fields[0]->GetBndConditions()[n]->GetUserDefined() == + SpatialDomains::eWall) + { + if (m_expdim == 1) + { + WallBoundary1D(n, inarray); + } + else if (m_expdim == 2) + { + WallBoundary2D(n, cnt, inarray); + } + } + + // Time Dependent Boundary Condition (specified in meshfile) + if (m_fields[0]->GetBndConditions()[n]->GetUserDefined() == + SpatialDomains::eTimeDependent) + { + for (int i = 0; i < nvariables; ++i) + { + varName = m_session->GetVariable(i); + m_fields[i]->EvaluateBoundaryConditions(time, varName); + } + } + cnt +=m_fields[0]->GetBndCondExpansions()[n]->GetExpSize(); } } //---------------------------------------------------- - void APE::WallBoundary2D(int bcRegion, int cnt, Array > &physarray) + void APE::WallBoundary2D( + int bcRegion, + int cnt, + Array > &physarray) { int i; diff --git a/solvers/CompressibleFlowSolver/CMakeLists.txt b/solvers/CompressibleFlowSolver/CMakeLists.txt index d48d6e10e3b95bda7d54083e346f9cad632f0acc..70cef5053542bafb631cd570db5a13148539aa75 100644 --- a/solvers/CompressibleFlowSolver/CMakeLists.txt +++ b/solvers/CompressibleFlowSolver/CMakeLists.txt @@ -56,26 +56,27 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW ) ADD_NEKTAR_TEST_LENGTHY(CylinderSubsonic_NS_WeakDG_LDG_SEM) ADD_NEKTAR_TEST_LENGTHY(CylinderSubsonic_NS_WeakDG_LDG_GAUSS) ADD_NEKTAR_TEST_LENGTHY(CylinderSubsonic_NS_FRDG_LFRDG_GAUSS) + ADD_NEKTAR_TEST (CylinderSubsonic_NS_WeakDG_LDG_variableMu) + ADD_NEKTAR_TEST (Couette_WeakDG_LDG_SEM_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (CylinderSubsonic_NS_WeakDG_LDG_SEM_3DHomo1D_MVM) + ADD_NEKTAR_TEST (Couette_FRDG_LFRDG_GLL_LAGRANGE_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (CylinderSubsonic_NS_FRDG_LFRDG_GLL_LAGRANGE_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (Couette_FRHU_LFRHU_SEM_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (CylinderSubsonic_NS_FRHU_LFRHU_SEM_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (Couette_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) + ADD_NEKTAR_TEST (CylinderSubsonic_NS_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(Couette_WeakDG_LDG_SEM_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_SEM_3DHomo1D_MVM) - ADD_NEKTAR_TEST(Couette_FRDG_LFRDG_GLL_LAGRANGE_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRDG_LFRDG_GLL_LAGRANGE_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(Couette_FRHU_LFRHU_SEM_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRHU_LFRHU_SEM_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(Couette_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) - - #IF (NEKTAR_USE_MPI) - # ADD_NEKTAR_TEST(Perturbation_M05_square_CBC_par) - # ADD_NEKTAR_TEST(Perturbation_M05_square_CBC_back_par) - # ADD_NEKTAR_TEST(Perturbation_M15_square_CBC_par) - # ADD_NEKTAR_TEST(Perturbation_M15_square_CBC_back_par) - # ADD_NEKTAR_TEST(Perturbation_M05_circle_CBC_back_par) - # ADD_NEKTAR_TEST(Perturbation_M15_circle_CBC_back_par) - # ADD_NEKTAR_TEST(Perturbation_NS_M05_square_CBC_par) - # ADD_NEKTAR_TEST(Perturbation_NS_M15_square_CBC_par) - #ENDIF (NEKTAR_USE_MPI) + IF (NEKTAR_USE_MPI) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_M05_square_CBC_par) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_M05_square_CBC_back_par) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_M15_square_CBC_par) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_M15_square_CBC_back_par) + ADD_NEKTAR_TEST_LENGTHY(Perturbation_M05_circle_CBC_back_par) + ADD_NEKTAR_TEST_LENGTHY(Perturbation_M15_circle_CBC_back_par) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_NS_M05_square_CBC_par) + #ADD_NEKTAR_TEST_LENGTHY(Perturbation_NS_M15_square_CBC_par) + ADD_NEKTAR_TEST(RAE5240_BSF_LE_bcsfromfile_par) + ENDIF (NEKTAR_USE_MPI) IF (NEKTAR_USE_FFTW) ADD_NEKTAR_TEST(Couette_WeakDG_LDG_SEM_3DHOMO1D_FFT) diff --git a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp index 22b30eff7a3a007387afb395833dd8ec28dfa00e..1c0c52f8b1a9443fe5f8d2cc02fa7689b49b163f 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp +++ b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp @@ -1771,19 +1771,21 @@ namespace Nektar Array &soundspeed, Array &mach) { - const int nBCEdgePts = m_fields[0]->GetTotPoints(); - - Vmath::Vmul(nBCEdgePts, physfield[1], 1, physfield[1], 1, mach, 1); - + const int nq = m_fields[0]->GetTotPoints(); + + Vmath::Vmul(nq, physfield[1], 1, physfield[1], 1, mach, 1); + for (int i = 1; i < m_spacedim; ++i) { - Vmath::Vvtvp(nBCEdgePts, physfield[1+i], 1, physfield[1+i], 1, - mach, 1, mach, 1); + Vmath::Vvtvp(nq, physfield[1+i], 1, physfield[1+i], 1, + mach, 1, mach, 1); } - - Vmath::Vdiv(nBCEdgePts, mach, 1, physfield[0], 1, mach, 1); - Vmath::Vdiv(nBCEdgePts, mach, 1, physfield[0], 1, mach, 1); - Vmath::Vdiv(nBCEdgePts, mach, 1, soundspeed, 1, mach, 1); + + Vmath::Vdiv(nq, mach, 1, physfield[0], 1, mach, 1); + Vmath::Vdiv(nq, mach, 1, physfield[0], 1, mach, 1); + Vmath::Vsqrt(nq, mach, 1, mach, 1); + + Vmath::Vdiv(nq, mach, 1, soundspeed, 1, mach, 1); } /** @@ -1807,7 +1809,7 @@ namespace Nektar for (int i = 0; i < nPts; ++i) { ratio = temperature[i] / T_star; - mu[i] = mu_star * pow(ratio, 1.50) * + mu[i] = mu_star * ratio * sqrt(ratio) * (T_star + 110.0) / (temperature[i] + 110.0); } } diff --git a/solvers/CompressibleFlowSolver/EquationSystems/EulerArtificialDiffusionCFE.cpp b/solvers/CompressibleFlowSolver/EquationSystems/EulerArtificialDiffusionCFE.cpp index f019ad2f7b134834ce0504656c70ede1d6988d58..4ac9c8641a8cb01fc25786c2b4d75079fc57c5fc 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/EulerArtificialDiffusionCFE.cpp +++ b/solvers/CompressibleFlowSolver/EquationSystems/EulerArtificialDiffusionCFE.cpp @@ -167,6 +167,7 @@ namespace Nektar Array > &inarray, NekDouble time) { + std::string varName; int nvariables = m_fields.num_elements(); int cnt = 0; @@ -215,7 +216,8 @@ namespace Nektar { for (int i = 0; i < nvariables; ++i) { - m_fields[i]->EvaluateBoundaryConditions(time); + varName = m_session->GetVariable(i); + m_fields[i]->EvaluateBoundaryConditions(time, varName); } } diff --git a/solvers/CompressibleFlowSolver/EquationSystems/EulerCFE.cpp b/solvers/CompressibleFlowSolver/EquationSystems/EulerCFE.cpp index a5cb15841baaafe2f80ce3604f9250b6ccd87822..db078da876e0c1a7b9d322349acfa9aaf7e9b1e1 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/EulerCFE.cpp +++ b/solvers/CompressibleFlowSolver/EquationSystems/EulerCFE.cpp @@ -227,6 +227,7 @@ namespace Nektar Array > &inarray, NekDouble time) { + std::string varName; int nvariables = m_fields.num_elements(); int cnt = 0; @@ -275,7 +276,8 @@ namespace Nektar { for (int i = 0; i < nvariables; ++i) { - m_fields[i]->EvaluateBoundaryConditions(time); + varName = m_session->GetVariable(i); + m_fields[i]->EvaluateBoundaryConditions(time, varName); } } diff --git a/solvers/CompressibleFlowSolver/EquationSystems/NavierStokesCFE.cpp b/solvers/CompressibleFlowSolver/EquationSystems/NavierStokesCFE.cpp index f484c349502fbec87a56cf7257fcbc6c648b21a5..15fd99c2c19a0c969f1d5c28576682eaf14e967c 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/NavierStokesCFE.cpp +++ b/solvers/CompressibleFlowSolver/EquationSystems/NavierStokesCFE.cpp @@ -239,6 +239,7 @@ namespace Nektar Array > &inarray, NekDouble time) { + std::string varName; int nvariables = m_fields.num_elements(); int cnt = 0; @@ -287,7 +288,8 @@ namespace Nektar { for (int i = 0; i < nvariables; ++i) { - m_fields[i]->EvaluateBoundaryConditions(time); + varName = m_session->GetVariable(i); + m_fields[i]->EvaluateBoundaryConditions(time, varName); } } diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.tst b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.tst new file mode 100644 index 0000000000000000000000000000000000000000..0923ac6a7565104832d5f38dc3604b91c1010af1 --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.tst @@ -0,0 +1,25 @@ + + + NS, Subsonic Cylinder, mixed bcs, WeakDG advection and LDG diffusion, variable viscosity + CompressibleFlowSolver + CylinderSubsonic_NS_WeakDG_LDG_variableMu.xml + + CylinderSubsonic_NS_WeakDG_LDG_variableMu.xml + + + + 5.50797 + 2016.24 + 25.8678 + 6.27025e+06 + + + 0.530772 + 92.5589 + 58.1901 + 346993 + + + + + diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.xml b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6a423e9bbbec5a0c6221b0bd976dfd092b1e4dd --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_variableMu.xml @@ -0,0 +1,4156 @@ + + + + + -1.00000000e+01 1.00000000e+01 0.00000000e+00 + -1.00000000e+01 8.40000000e+00 0.00000000e+00 + -8.40000000e+00 8.40000000e+00 0.00000000e+00 + -8.40000000e+00 1.00000000e+01 0.00000000e+00 + -6.80000000e+00 8.40000000e+00 0.00000000e+00 + -6.80000000e+00 1.00000000e+01 0.00000000e+00 + -5.20000000e+00 8.40000000e+00 0.00000000e+00 + -5.20000000e+00 1.00000000e+01 0.00000000e+00 + -3.60000000e+00 8.40000000e+00 0.00000000e+00 + -3.60000000e+00 1.00000000e+01 0.00000000e+00 + -2.00000000e+00 8.40000000e+00 0.00000000e+00 + -2.00000000e+00 1.00000000e+01 0.00000000e+00 + -1.00000000e+01 6.80000000e+00 0.00000000e+00 + -8.40000000e+00 6.80000000e+00 0.00000000e+00 + -6.80000000e+00 6.80000000e+00 0.00000000e+00 + -5.20000000e+00 6.80000000e+00 0.00000000e+00 + -3.60000000e+00 6.80000000e+00 0.00000000e+00 + -2.00000000e+00 6.80000000e+00 0.00000000e+00 + -1.00000000e+01 5.20000000e+00 0.00000000e+00 + -8.40000000e+00 5.20000000e+00 0.00000000e+00 + -6.80000000e+00 5.20000000e+00 0.00000000e+00 + -5.20000000e+00 5.20000000e+00 0.00000000e+00 + -3.60000000e+00 5.20000000e+00 0.00000000e+00 + -2.00000000e+00 5.20000000e+00 0.00000000e+00 + -1.00000000e+01 3.60000000e+00 0.00000000e+00 + -8.40000000e+00 3.60000000e+00 0.00000000e+00 + -6.80000000e+00 3.60000000e+00 0.00000000e+00 + -5.20000000e+00 3.60000000e+00 0.00000000e+00 + -3.60000000e+00 3.60000000e+00 0.00000000e+00 + -2.00000000e+00 3.60000000e+00 0.00000000e+00 + -1.00000000e+01 2.00000000e+00 0.00000000e+00 + -8.40000000e+00 2.00000000e+00 0.00000000e+00 + -6.80000000e+00 2.00000000e+00 0.00000000e+00 + -5.20000000e+00 2.00000000e+00 0.00000000e+00 + -3.60000000e+00 2.00000000e+00 0.00000000e+00 + -2.00000000e+00 2.00000000e+00 0.00000000e+00 + -1.60000000e+00 8.40000000e+00 0.00000000e+00 + -1.60000000e+00 1.00000000e+01 0.00000000e+00 + -1.20000000e+00 8.40000000e+00 0.00000000e+00 + -1.20000000e+00 1.00000000e+01 0.00000000e+00 + -8.00000000e-01 8.40000000e+00 0.00000000e+00 + -8.00000000e-01 1.00000000e+01 0.00000000e+00 + -4.00000000e-01 8.40000000e+00 0.00000000e+00 + -4.00000000e-01 1.00000000e+01 0.00000000e+00 + 0.00000000e+00 8.40000000e+00 0.00000000e+00 + 0.00000000e+00 1.00000000e+01 0.00000000e+00 + -1.60000000e+00 6.80000000e+00 0.00000000e+00 + -1.20000000e+00 6.80000000e+00 0.00000000e+00 + -8.00000000e-01 6.80000000e+00 0.00000000e+00 + -4.00000000e-01 6.80000000e+00 0.00000000e+00 + 0.00000000e+00 6.80000000e+00 0.00000000e+00 + -1.60000000e+00 5.20000000e+00 0.00000000e+00 + -1.20000000e+00 5.20000000e+00 0.00000000e+00 + -8.00000000e-01 5.20000000e+00 0.00000000e+00 + -4.00000000e-01 5.20000000e+00 0.00000000e+00 + 0.00000000e+00 5.20000000e+00 0.00000000e+00 + -1.60000000e+00 3.60000000e+00 0.00000000e+00 + -1.20000000e+00 3.60000000e+00 0.00000000e+00 + -8.00000000e-01 3.60000000e+00 0.00000000e+00 + -4.00000000e-01 3.60000000e+00 0.00000000e+00 + 0.00000000e+00 3.60000000e+00 0.00000000e+00 + -1.60000000e+00 2.00000000e+00 0.00000000e+00 + -1.20000000e+00 2.00000000e+00 0.00000000e+00 + -8.00000000e-01 2.00000000e+00 0.00000000e+00 + -4.00000000e-01 2.00000000e+00 0.00000000e+00 + 0.00000000e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 1.00000000e+01 0.00000000e+00 + 1.60000000e+00 1.00000000e+01 0.00000000e+00 + 1.60000000e+00 8.40000000e+00 0.00000000e+00 + 2.00000000e+00 8.40000000e+00 0.00000000e+00 + 1.60000000e+00 6.80000000e+00 0.00000000e+00 + 2.00000000e+00 6.80000000e+00 0.00000000e+00 + 1.60000000e+00 5.20000000e+00 0.00000000e+00 + 2.00000000e+00 5.20000000e+00 0.00000000e+00 + 1.60000000e+00 3.60000000e+00 0.00000000e+00 + 2.00000000e+00 3.60000000e+00 0.00000000e+00 + 1.60000000e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 2.00000000e+00 0.00000000e+00 + 1.20000000e+00 1.00000000e+01 0.00000000e+00 + 1.20000000e+00 8.40000000e+00 0.00000000e+00 + 1.20000000e+00 6.80000000e+00 0.00000000e+00 + 1.20000000e+00 5.20000000e+00 0.00000000e+00 + 1.20000000e+00 3.60000000e+00 0.00000000e+00 + 1.20000000e+00 2.00000000e+00 0.00000000e+00 + 8.00000000e-01 1.00000000e+01 0.00000000e+00 + 8.00000000e-01 8.40000000e+00 0.00000000e+00 + 8.00000000e-01 6.80000000e+00 0.00000000e+00 + 8.00000000e-01 5.20000000e+00 0.00000000e+00 + 8.00000000e-01 3.60000000e+00 0.00000000e+00 + 8.00000000e-01 2.00000000e+00 0.00000000e+00 + 4.00000000e-01 1.00000000e+01 0.00000000e+00 + 4.00000000e-01 8.40000000e+00 0.00000000e+00 + 4.00000000e-01 6.80000000e+00 0.00000000e+00 + 4.00000000e-01 5.20000000e+00 0.00000000e+00 + 4.00000000e-01 3.60000000e+00 0.00000000e+00 + 4.00000000e-01 2.00000000e+00 0.00000000e+00 + 2.66666667e+00 3.60000000e+00 0.00000000e+00 + 2.66666667e+00 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 3.60000000e+00 0.00000000e+00 + 3.33333333e+00 2.00000000e+00 0.00000000e+00 + 4.00000000e+00 3.60000000e+00 0.00000000e+00 + 4.00000000e+00 2.00000000e+00 0.00000000e+00 + 2.66666667e+00 5.20000000e+00 0.00000000e+00 + 3.33333333e+00 5.20000000e+00 0.00000000e+00 + 4.00000000e+00 5.20000000e+00 0.00000000e+00 + 2.66666667e+00 6.80000000e+00 0.00000000e+00 + 3.33333333e+00 6.80000000e+00 0.00000000e+00 + 4.00000000e+00 6.80000000e+00 0.00000000e+00 + 2.66666667e+00 8.40000000e+00 0.00000000e+00 + 3.33333333e+00 8.40000000e+00 0.00000000e+00 + 4.00000000e+00 8.40000000e+00 0.00000000e+00 + 2.66666667e+00 1.00000000e+01 0.00000000e+00 + 3.33333333e+00 1.00000000e+01 0.00000000e+00 + 4.00000000e+00 1.00000000e+01 0.00000000e+00 + 5.57494171e+00 3.60000000e+00 0.00000000e+00 + 5.57494171e+00 2.00000000e+00 0.00000000e+00 + 7.19713168e+00 3.60000000e+00 0.00000000e+00 + 7.19713168e+00 2.00000000e+00 0.00000000e+00 + 8.86798734e+00 3.60000000e+00 0.00000000e+00 + 8.86798734e+00 2.00000000e+00 0.00000000e+00 + 1.05889687e+01 3.60000000e+00 0.00000000e+00 + 1.05889687e+01 2.00000000e+00 0.00000000e+00 + 1.23615794e+01 3.60000000e+00 0.00000000e+00 + 1.23615794e+01 2.00000000e+00 0.00000000e+00 + 1.41873685e+01 3.60000000e+00 0.00000000e+00 + 1.41873685e+01 2.00000000e+00 0.00000000e+00 + 1.60679313e+01 3.60000000e+00 0.00000000e+00 + 1.60679313e+01 2.00000000e+00 0.00000000e+00 + 1.80049110e+01 3.60000000e+00 0.00000000e+00 + 1.80049110e+01 2.00000000e+00 0.00000000e+00 + 2.00000000e+01 3.60000000e+00 0.00000000e+00 + 2.00000000e+01 2.00000000e+00 0.00000000e+00 + 5.57494171e+00 5.20000000e+00 0.00000000e+00 + 7.19713168e+00 5.20000000e+00 0.00000000e+00 + 8.86798734e+00 5.20000000e+00 0.00000000e+00 + 1.05889687e+01 5.20000000e+00 0.00000000e+00 + 1.23615794e+01 5.20000000e+00 0.00000000e+00 + 1.41873685e+01 5.20000000e+00 0.00000000e+00 + 1.60679313e+01 5.20000000e+00 0.00000000e+00 + 1.80049110e+01 5.20000000e+00 0.00000000e+00 + 2.00000000e+01 5.20000000e+00 0.00000000e+00 + 5.57494171e+00 6.80000000e+00 0.00000000e+00 + 7.19713168e+00 6.80000000e+00 0.00000000e+00 + 8.86798734e+00 6.80000000e+00 0.00000000e+00 + 1.05889687e+01 6.80000000e+00 0.00000000e+00 + 1.23615794e+01 6.80000000e+00 0.00000000e+00 + 1.41873685e+01 6.80000000e+00 0.00000000e+00 + 1.60679313e+01 6.80000000e+00 0.00000000e+00 + 1.80049110e+01 6.80000000e+00 0.00000000e+00 + 2.00000000e+01 6.80000000e+00 0.00000000e+00 + 5.57494171e+00 8.40000000e+00 0.00000000e+00 + 7.19713168e+00 8.40000000e+00 0.00000000e+00 + 8.86798734e+00 8.40000000e+00 0.00000000e+00 + 1.05889687e+01 8.40000000e+00 0.00000000e+00 + 1.23615794e+01 8.40000000e+00 0.00000000e+00 + 1.41873685e+01 8.40000000e+00 0.00000000e+00 + 1.60679313e+01 8.40000000e+00 0.00000000e+00 + 1.80049110e+01 8.40000000e+00 0.00000000e+00 + 2.00000000e+01 8.40000000e+00 0.00000000e+00 + 5.57494171e+00 1.00000000e+01 0.00000000e+00 + 7.19713168e+00 1.00000000e+01 0.00000000e+00 + 8.86798734e+00 1.00000000e+01 0.00000000e+00 + 1.05889687e+01 1.00000000e+01 0.00000000e+00 + 1.23615794e+01 1.00000000e+01 0.00000000e+00 + 1.41873685e+01 1.00000000e+01 0.00000000e+00 + 1.60679313e+01 1.00000000e+01 0.00000000e+00 + 1.80049110e+01 1.00000000e+01 0.00000000e+00 + 2.00000000e+01 1.00000000e+01 0.00000000e+00 + -1.00000000e+01 1.60000000e+00 0.00000000e+00 + -8.40000000e+00 1.60000000e+00 0.00000000e+00 + -6.80000000e+00 1.60000000e+00 0.00000000e+00 + -5.20000000e+00 1.60000000e+00 0.00000000e+00 + -3.60000000e+00 1.60000000e+00 0.00000000e+00 + -2.00000000e+00 1.60000000e+00 0.00000000e+00 + -1.00000000e+01 1.20000000e+00 0.00000000e+00 + -8.40000000e+00 1.20000000e+00 0.00000000e+00 + -6.80000000e+00 1.20000000e+00 0.00000000e+00 + -5.20000000e+00 1.20000000e+00 0.00000000e+00 + -3.60000000e+00 1.20000000e+00 0.00000000e+00 + -2.00000000e+00 1.20000000e+00 0.00000000e+00 + -1.00000000e+01 8.00000000e-01 0.00000000e+00 + -8.40000000e+00 8.00000000e-01 0.00000000e+00 + -6.80000000e+00 8.00000000e-01 0.00000000e+00 + -5.20000000e+00 8.00000000e-01 0.00000000e+00 + -3.60000000e+00 8.00000000e-01 0.00000000e+00 + -2.00000000e+00 8.00000000e-01 0.00000000e+00 + -1.00000000e+01 4.00000000e-01 0.00000000e+00 + -8.40000000e+00 4.00000000e-01 0.00000000e+00 + -6.80000000e+00 4.00000000e-01 0.00000000e+00 + -5.20000000e+00 4.00000000e-01 0.00000000e+00 + -3.60000000e+00 4.00000000e-01 0.00000000e+00 + -2.00000000e+00 4.00000000e-01 0.00000000e+00 + -1.00000000e+01 0.00000000e+00 0.00000000e+00 + -8.40000000e+00 0.00000000e+00 0.00000000e+00 + -6.80000000e+00 0.00000000e+00 0.00000000e+00 + -5.20000000e+00 0.00000000e+00 0.00000000e+00 + -3.60000000e+00 0.00000000e+00 0.00000000e+00 + -2.00000000e+00 0.00000000e+00 0.00000000e+00 + -3.12201802e-01 1.59637318e+00 0.00000000e+00 + 0.00000000e+00 1.59849170e+00 0.00000000e+00 + -6.23740783e-01 1.59006976e+00 0.00000000e+00 + -9.33970440e-01 1.57973665e+00 0.00000000e+00 + -1.24227651e+00 1.56562831e+00 0.00000000e+00 + -1.54809211e+00 1.54809211e+00 0.00000000e+00 + -1.56562831e+00 1.24227651e+00 0.00000000e+00 + -1.57973665e+00 9.33970440e-01 0.00000000e+00 + -1.59006976e+00 6.23740783e-01 0.00000000e+00 + -1.59637318e+00 3.12201802e-01 0.00000000e+00 + -1.59849170e+00 0.00000000e+00 0.00000000e+00 + -2.32385259e-01 1.22943970e+00 0.00000000e+00 + 0.00000000e+00 1.23348416e+00 0.00000000e+00 + -4.63505130e-01 1.21740590e+00 0.00000000e+00 + -6.92125386e-01 1.19767907e+00 0.00000000e+00 + -9.17073345e-01 1.17074495e+00 0.00000000e+00 + -1.13726675e+00 1.13726675e+00 0.00000000e+00 + -1.17074495e+00 9.17073345e-01 0.00000000e+00 + -1.19767907e+00 6.92125386e-01 0.00000000e+00 + -1.21740590e+00 4.63505130e-01 0.00000000e+00 + -1.22943970e+00 2.32385259e-01 0.00000000e+00 + -1.23348416e+00 0.00000000e+00 0.00000000e+00 + -1.59824765e-01 8.95863812e-01 0.00000000e+00 + 0.00000000e+00 9.01659125e-01 0.00000000e+00 + -3.17836356e-01 8.78620570e-01 0.00000000e+00 + -4.72266246e-01 8.50353987e-01 0.00000000e+00 + -6.21434101e-01 8.11760079e-01 0.00000000e+00 + -7.63789156e-01 7.63789156e-01 0.00000000e+00 + -8.11760079e-01 6.21434101e-01 0.00000000e+00 + -8.50353987e-01 4.72266246e-01 0.00000000e+00 + -8.78620570e-01 3.17836356e-01 0.00000000e+00 + -8.95863812e-01 1.59824765e-01 0.00000000e+00 + -9.01659125e-01 0.00000000e+00 0.00000000e+00 + -9.38606790e-02 5.92613004e-01 0.00000000e+00 + 0.00000000e+00 6.00000000e-01 0.00000000e+00 + -1.85410197e-01 5.70633910e-01 0.00000000e+00 + -2.72394300e-01 5.34603915e-01 0.00000000e+00 + -3.52671151e-01 4.85410197e-01 0.00000000e+00 + -4.24264069e-01 4.24264069e-01 0.00000000e+00 + -4.85410197e-01 3.52671151e-01 0.00000000e+00 + -5.34603915e-01 2.72394300e-01 0.00000000e+00 + -5.70633910e-01 1.85410197e-01 0.00000000e+00 + -5.92613004e-01 9.38606790e-02 0.00000000e+00 + -6.00000000e-01 0.00000000e+00 0.00000000e+00 + 2.00000000e+00 0.00000000e+00 0.00000000e+00 + 2.00000000e+00 4.00000000e-01 0.00000000e+00 + 1.59637318e+00 3.12201802e-01 0.00000000e+00 + 1.59849170e+00 0.00000000e+00 0.00000000e+00 + 2.00000000e+00 8.00000000e-01 0.00000000e+00 + 1.59006976e+00 6.23740783e-01 0.00000000e+00 + 2.00000000e+00 1.20000000e+00 0.00000000e+00 + 1.57973665e+00 9.33970440e-01 0.00000000e+00 + 2.00000000e+00 1.60000000e+00 0.00000000e+00 + 1.56562831e+00 1.24227651e+00 0.00000000e+00 + 1.54809211e+00 1.54809211e+00 0.00000000e+00 + 1.24227651e+00 1.56562831e+00 0.00000000e+00 + 9.33970440e-01 1.57973665e+00 0.00000000e+00 + 6.23740783e-01 1.59006976e+00 0.00000000e+00 + 3.12201802e-01 1.59637318e+00 0.00000000e+00 + 1.22943970e+00 2.32385259e-01 0.00000000e+00 + 1.23348416e+00 0.00000000e+00 0.00000000e+00 + 1.21740590e+00 4.63505130e-01 0.00000000e+00 + 1.19767907e+00 6.92125386e-01 0.00000000e+00 + 1.17074495e+00 9.17073345e-01 0.00000000e+00 + 1.13726675e+00 1.13726675e+00 0.00000000e+00 + 9.17073345e-01 1.17074495e+00 0.00000000e+00 + 6.92125386e-01 1.19767907e+00 0.00000000e+00 + 4.63505130e-01 1.21740590e+00 0.00000000e+00 + 2.32385259e-01 1.22943970e+00 0.00000000e+00 + 8.95863812e-01 1.59824765e-01 0.00000000e+00 + 9.01659125e-01 0.00000000e+00 0.00000000e+00 + 8.78620570e-01 3.17836356e-01 0.00000000e+00 + 8.50353987e-01 4.72266246e-01 0.00000000e+00 + 8.11760079e-01 6.21434101e-01 0.00000000e+00 + 7.63789156e-01 7.63789156e-01 0.00000000e+00 + 6.21434101e-01 8.11760079e-01 0.00000000e+00 + 4.72266246e-01 8.50353987e-01 0.00000000e+00 + 3.17836356e-01 8.78620570e-01 0.00000000e+00 + 1.59824765e-01 8.95863812e-01 0.00000000e+00 + 5.92613004e-01 9.38606790e-02 0.00000000e+00 + 6.00000000e-01 0.00000000e+00 0.00000000e+00 + 5.70633910e-01 1.85410197e-01 0.00000000e+00 + 5.34603915e-01 2.72394300e-01 0.00000000e+00 + 4.85410197e-01 3.52671151e-01 0.00000000e+00 + 4.24264069e-01 4.24264069e-01 0.00000000e+00 + 3.52671151e-01 4.85410197e-01 0.00000000e+00 + 2.72394300e-01 5.34603915e-01 0.00000000e+00 + 1.85410197e-01 5.70633910e-01 0.00000000e+00 + 9.38606790e-02 5.92613004e-01 0.00000000e+00 + 0.00000000e+00 -2.00000000e+00 0.00000000e+00 + 0.00000000e+00 -1.59849170e+00 0.00000000e+00 + -3.12201802e-01 -1.59637318e+00 0.00000000e+00 + -4.00000000e-01 -2.00000000e+00 0.00000000e+00 + 0.00000000e+00 -1.23348416e+00 0.00000000e+00 + -2.32385259e-01 -1.22943970e+00 0.00000000e+00 + 0.00000000e+00 -9.01659125e-01 0.00000000e+00 + -1.59824765e-01 -8.95863812e-01 0.00000000e+00 + 0.00000000e+00 -6.00000000e-01 0.00000000e+00 + -9.38606790e-02 -5.92613004e-01 0.00000000e+00 + -6.23740783e-01 -1.59006976e+00 0.00000000e+00 + -8.00000000e-01 -2.00000000e+00 0.00000000e+00 + -4.63505130e-01 -1.21740590e+00 0.00000000e+00 + -3.17836356e-01 -8.78620570e-01 0.00000000e+00 + -1.85410197e-01 -5.70633910e-01 0.00000000e+00 + -9.33970440e-01 -1.57973665e+00 0.00000000e+00 + -1.20000000e+00 -2.00000000e+00 0.00000000e+00 + -6.92125386e-01 -1.19767907e+00 0.00000000e+00 + -4.72266246e-01 -8.50353987e-01 0.00000000e+00 + -2.72394300e-01 -5.34603915e-01 0.00000000e+00 + -1.24227651e+00 -1.56562831e+00 0.00000000e+00 + -1.60000000e+00 -2.00000000e+00 0.00000000e+00 + -9.17073345e-01 -1.17074495e+00 0.00000000e+00 + -6.21434101e-01 -8.11760079e-01 0.00000000e+00 + -3.52671151e-01 -4.85410197e-01 0.00000000e+00 + -1.54809211e+00 -1.54809211e+00 0.00000000e+00 + -2.00000000e+00 -2.00000000e+00 0.00000000e+00 + -1.13726675e+00 -1.13726675e+00 0.00000000e+00 + -7.63789156e-01 -7.63789156e-01 0.00000000e+00 + -4.24264069e-01 -4.24264069e-01 0.00000000e+00 + -1.56562831e+00 -1.24227651e+00 0.00000000e+00 + -2.00000000e+00 -1.60000000e+00 0.00000000e+00 + -1.17074495e+00 -9.17073345e-01 0.00000000e+00 + -8.11760079e-01 -6.21434101e-01 0.00000000e+00 + -4.85410197e-01 -3.52671151e-01 0.00000000e+00 + -1.57973665e+00 -9.33970440e-01 0.00000000e+00 + -2.00000000e+00 -1.20000000e+00 0.00000000e+00 + -1.19767907e+00 -6.92125386e-01 0.00000000e+00 + -8.50353987e-01 -4.72266246e-01 0.00000000e+00 + -5.34603915e-01 -2.72394300e-01 0.00000000e+00 + -1.59006976e+00 -6.23740783e-01 0.00000000e+00 + -2.00000000e+00 -8.00000000e-01 0.00000000e+00 + -1.21740590e+00 -4.63505130e-01 0.00000000e+00 + -8.78620570e-01 -3.17836356e-01 0.00000000e+00 + -5.70633910e-01 -1.85410197e-01 0.00000000e+00 + -1.59637318e+00 -3.12201802e-01 0.00000000e+00 + -2.00000000e+00 -4.00000000e-01 0.00000000e+00 + -1.22943970e+00 -2.32385259e-01 0.00000000e+00 + -8.95863812e-01 -1.59824765e-01 0.00000000e+00 + -5.92613004e-01 -9.38606790e-02 0.00000000e+00 + 4.00000000e-01 -2.00000000e+00 0.00000000e+00 + 3.12201802e-01 -1.59637318e+00 0.00000000e+00 + 8.00000000e-01 -2.00000000e+00 0.00000000e+00 + 6.23740783e-01 -1.59006976e+00 0.00000000e+00 + 1.20000000e+00 -2.00000000e+00 0.00000000e+00 + 9.33970440e-01 -1.57973665e+00 0.00000000e+00 + 1.60000000e+00 -2.00000000e+00 0.00000000e+00 + 1.24227651e+00 -1.56562831e+00 0.00000000e+00 + 2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 1.54809211e+00 -1.54809211e+00 0.00000000e+00 + 2.00000000e+00 -1.60000000e+00 0.00000000e+00 + 1.56562831e+00 -1.24227651e+00 0.00000000e+00 + 2.00000000e+00 -1.20000000e+00 0.00000000e+00 + 1.57973665e+00 -9.33970440e-01 0.00000000e+00 + 2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 1.59006976e+00 -6.23740783e-01 0.00000000e+00 + 2.00000000e+00 -4.00000000e-01 0.00000000e+00 + 1.59637318e+00 -3.12201802e-01 0.00000000e+00 + 2.32385259e-01 -1.22943970e+00 0.00000000e+00 + 4.63505130e-01 -1.21740590e+00 0.00000000e+00 + 6.92125386e-01 -1.19767907e+00 0.00000000e+00 + 9.17073345e-01 -1.17074495e+00 0.00000000e+00 + 1.13726675e+00 -1.13726675e+00 0.00000000e+00 + 1.17074495e+00 -9.17073345e-01 0.00000000e+00 + 1.19767907e+00 -6.92125386e-01 0.00000000e+00 + 1.21740590e+00 -4.63505130e-01 0.00000000e+00 + 1.22943970e+00 -2.32385259e-01 0.00000000e+00 + 1.59824765e-01 -8.95863812e-01 0.00000000e+00 + 3.17836356e-01 -8.78620570e-01 0.00000000e+00 + 4.72266246e-01 -8.50353987e-01 0.00000000e+00 + 6.21434101e-01 -8.11760079e-01 0.00000000e+00 + 7.63789156e-01 -7.63789156e-01 0.00000000e+00 + 8.11760079e-01 -6.21434101e-01 0.00000000e+00 + 8.50353987e-01 -4.72266246e-01 0.00000000e+00 + 8.78620570e-01 -3.17836356e-01 0.00000000e+00 + 8.95863812e-01 -1.59824765e-01 0.00000000e+00 + 9.38606790e-02 -5.92613004e-01 0.00000000e+00 + 1.85410197e-01 -5.70633910e-01 0.00000000e+00 + 2.72394300e-01 -5.34603915e-01 0.00000000e+00 + 3.52671151e-01 -4.85410197e-01 0.00000000e+00 + 4.24264069e-01 -4.24264069e-01 0.00000000e+00 + 4.85410197e-01 -3.52671151e-01 0.00000000e+00 + 5.34603915e-01 -2.72394300e-01 0.00000000e+00 + 5.70633910e-01 -1.85410197e-01 0.00000000e+00 + 5.92613004e-01 -9.38606790e-02 0.00000000e+00 + 2.66666667e+00 4.00000000e-01 0.00000000e+00 + 2.66666667e+00 0.00000000e+00 0.00000000e+00 + 3.33333333e+00 4.00000000e-01 0.00000000e+00 + 3.33333333e+00 0.00000000e+00 0.00000000e+00 + 4.00000000e+00 4.00000000e-01 0.00000000e+00 + 4.00000000e+00 0.00000000e+00 0.00000000e+00 + 2.66666667e+00 8.00000000e-01 0.00000000e+00 + 3.33333333e+00 8.00000000e-01 0.00000000e+00 + 4.00000000e+00 8.00000000e-01 0.00000000e+00 + 2.66666667e+00 1.20000000e+00 0.00000000e+00 + 3.33333333e+00 1.20000000e+00 0.00000000e+00 + 4.00000000e+00 1.20000000e+00 0.00000000e+00 + 2.66666667e+00 1.60000000e+00 0.00000000e+00 + 3.33333333e+00 1.60000000e+00 0.00000000e+00 + 4.00000000e+00 1.60000000e+00 0.00000000e+00 + 2.66666667e+00 -4.00000000e-01 0.00000000e+00 + 2.66666667e+00 -8.00000000e-01 0.00000000e+00 + 2.66666667e+00 -1.20000000e+00 0.00000000e+00 + 2.66666667e+00 -1.60000000e+00 0.00000000e+00 + 2.66666667e+00 -2.00000000e+00 0.00000000e+00 + 3.33333333e+00 -4.00000000e-01 0.00000000e+00 + 3.33333333e+00 -8.00000000e-01 0.00000000e+00 + 3.33333333e+00 -1.20000000e+00 0.00000000e+00 + 3.33333333e+00 -1.60000000e+00 0.00000000e+00 + 3.33333333e+00 -2.00000000e+00 0.00000000e+00 + 4.00000000e+00 -4.00000000e-01 0.00000000e+00 + 4.00000000e+00 -8.00000000e-01 0.00000000e+00 + 4.00000000e+00 -1.20000000e+00 0.00000000e+00 + 4.00000000e+00 -1.60000000e+00 0.00000000e+00 + 4.00000000e+00 -2.00000000e+00 0.00000000e+00 + -3.60000000e+00 -4.00000000e-01 0.00000000e+00 + -3.60000000e+00 -8.00000000e-01 0.00000000e+00 + -3.60000000e+00 -1.20000000e+00 0.00000000e+00 + -3.60000000e+00 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 -2.00000000e+00 0.00000000e+00 + -5.20000000e+00 -4.00000000e-01 0.00000000e+00 + -5.20000000e+00 -8.00000000e-01 0.00000000e+00 + -5.20000000e+00 -1.20000000e+00 0.00000000e+00 + -5.20000000e+00 -1.60000000e+00 0.00000000e+00 + -5.20000000e+00 -2.00000000e+00 0.00000000e+00 + -6.80000000e+00 -4.00000000e-01 0.00000000e+00 + -6.80000000e+00 -8.00000000e-01 0.00000000e+00 + -6.80000000e+00 -1.20000000e+00 0.00000000e+00 + -6.80000000e+00 -1.60000000e+00 0.00000000e+00 + -6.80000000e+00 -2.00000000e+00 0.00000000e+00 + -8.40000000e+00 -4.00000000e-01 0.00000000e+00 + -8.40000000e+00 -8.00000000e-01 0.00000000e+00 + -8.40000000e+00 -1.20000000e+00 0.00000000e+00 + -8.40000000e+00 -1.60000000e+00 0.00000000e+00 + -8.40000000e+00 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 -4.00000000e-01 0.00000000e+00 + -1.00000000e+01 -8.00000000e-01 0.00000000e+00 + -1.00000000e+01 -1.20000000e+00 0.00000000e+00 + -1.00000000e+01 -1.60000000e+00 0.00000000e+00 + -1.00000000e+01 -2.00000000e+00 0.00000000e+00 + 5.57494171e+00 4.00000000e-01 0.00000000e+00 + 5.57494171e+00 0.00000000e+00 0.00000000e+00 + 7.19713168e+00 4.00000000e-01 0.00000000e+00 + 7.19713168e+00 0.00000000e+00 0.00000000e+00 + 8.86798734e+00 4.00000000e-01 0.00000000e+00 + 8.86798734e+00 0.00000000e+00 0.00000000e+00 + 1.05889687e+01 4.00000000e-01 0.00000000e+00 + 1.05889687e+01 0.00000000e+00 0.00000000e+00 + 1.23615794e+01 4.00000000e-01 0.00000000e+00 + 1.23615794e+01 0.00000000e+00 0.00000000e+00 + 1.41873685e+01 4.00000000e-01 0.00000000e+00 + 1.41873685e+01 0.00000000e+00 0.00000000e+00 + 1.60679313e+01 4.00000000e-01 0.00000000e+00 + 1.60679313e+01 0.00000000e+00 0.00000000e+00 + 1.80049110e+01 4.00000000e-01 0.00000000e+00 + 1.80049110e+01 0.00000000e+00 0.00000000e+00 + 2.00000000e+01 4.00000000e-01 0.00000000e+00 + 2.00000000e+01 0.00000000e+00 0.00000000e+00 + 5.57494171e+00 8.00000000e-01 0.00000000e+00 + 7.19713168e+00 8.00000000e-01 0.00000000e+00 + 8.86798734e+00 8.00000000e-01 0.00000000e+00 + 1.05889687e+01 8.00000000e-01 0.00000000e+00 + 1.23615794e+01 8.00000000e-01 0.00000000e+00 + 1.41873685e+01 8.00000000e-01 0.00000000e+00 + 1.60679313e+01 8.00000000e-01 0.00000000e+00 + 1.80049110e+01 8.00000000e-01 0.00000000e+00 + 2.00000000e+01 8.00000000e-01 0.00000000e+00 + 5.57494171e+00 1.20000000e+00 0.00000000e+00 + 7.19713168e+00 1.20000000e+00 0.00000000e+00 + 8.86798734e+00 1.20000000e+00 0.00000000e+00 + 1.05889687e+01 1.20000000e+00 0.00000000e+00 + 1.23615794e+01 1.20000000e+00 0.00000000e+00 + 1.41873685e+01 1.20000000e+00 0.00000000e+00 + 1.60679313e+01 1.20000000e+00 0.00000000e+00 + 1.80049110e+01 1.20000000e+00 0.00000000e+00 + 2.00000000e+01 1.20000000e+00 0.00000000e+00 + 5.57494171e+00 1.60000000e+00 0.00000000e+00 + 7.19713168e+00 1.60000000e+00 0.00000000e+00 + 8.86798734e+00 1.60000000e+00 0.00000000e+00 + 1.05889687e+01 1.60000000e+00 0.00000000e+00 + 1.23615794e+01 1.60000000e+00 0.00000000e+00 + 1.41873685e+01 1.60000000e+00 0.00000000e+00 + 1.60679313e+01 1.60000000e+00 0.00000000e+00 + 1.80049110e+01 1.60000000e+00 0.00000000e+00 + 2.00000000e+01 1.60000000e+00 0.00000000e+00 + 5.57494171e+00 -4.00000000e-01 0.00000000e+00 + 5.57494171e+00 -8.00000000e-01 0.00000000e+00 + 5.57494171e+00 -1.20000000e+00 0.00000000e+00 + 5.57494171e+00 -1.60000000e+00 0.00000000e+00 + 5.57494171e+00 -2.00000000e+00 0.00000000e+00 + 7.19713168e+00 -4.00000000e-01 0.00000000e+00 + 7.19713168e+00 -8.00000000e-01 0.00000000e+00 + 7.19713168e+00 -1.20000000e+00 0.00000000e+00 + 7.19713168e+00 -1.60000000e+00 0.00000000e+00 + 7.19713168e+00 -2.00000000e+00 0.00000000e+00 + 8.86798734e+00 -4.00000000e-01 0.00000000e+00 + 8.86798734e+00 -8.00000000e-01 0.00000000e+00 + 8.86798734e+00 -1.20000000e+00 0.00000000e+00 + 8.86798734e+00 -1.60000000e+00 0.00000000e+00 + 8.86798734e+00 -2.00000000e+00 0.00000000e+00 + 1.05889687e+01 -4.00000000e-01 0.00000000e+00 + 1.05889687e+01 -8.00000000e-01 0.00000000e+00 + 1.05889687e+01 -1.20000000e+00 0.00000000e+00 + 1.05889687e+01 -1.60000000e+00 0.00000000e+00 + 1.05889687e+01 -2.00000000e+00 0.00000000e+00 + 1.23615794e+01 -4.00000000e-01 0.00000000e+00 + 1.23615794e+01 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 -1.20000000e+00 0.00000000e+00 + 1.23615794e+01 -1.60000000e+00 0.00000000e+00 + 1.23615794e+01 -2.00000000e+00 0.00000000e+00 + 1.41873685e+01 -4.00000000e-01 0.00000000e+00 + 1.41873685e+01 -8.00000000e-01 0.00000000e+00 + 1.41873685e+01 -1.20000000e+00 0.00000000e+00 + 1.41873685e+01 -1.60000000e+00 0.00000000e+00 + 1.41873685e+01 -2.00000000e+00 0.00000000e+00 + 1.60679313e+01 -4.00000000e-01 0.00000000e+00 + 1.60679313e+01 -8.00000000e-01 0.00000000e+00 + 1.60679313e+01 -1.20000000e+00 0.00000000e+00 + 1.60679313e+01 -1.60000000e+00 0.00000000e+00 + 1.60679313e+01 -2.00000000e+00 0.00000000e+00 + 1.80049110e+01 -4.00000000e-01 0.00000000e+00 + 1.80049110e+01 -8.00000000e-01 0.00000000e+00 + 1.80049110e+01 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 -1.60000000e+00 0.00000000e+00 + 1.80049110e+01 -2.00000000e+00 0.00000000e+00 + 2.00000000e+01 -4.00000000e-01 0.00000000e+00 + 2.00000000e+01 -8.00000000e-01 0.00000000e+00 + 2.00000000e+01 -1.20000000e+00 0.00000000e+00 + 2.00000000e+01 -1.60000000e+00 0.00000000e+00 + 2.00000000e+01 -2.00000000e+00 0.00000000e+00 + 4.00000000e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e+00 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 -1.00000000e+01 0.00000000e+00 + 7.19713167e+00 -8.40000000e+00 0.00000000e+00 + 7.19713167e+00 -1.00000000e+01 0.00000000e+00 + 8.86798734e+00 -8.40000000e+00 0.00000000e+00 + 8.86798734e+00 -1.00000000e+01 0.00000000e+00 + 1.05889687e+01 -8.40000000e+00 0.00000000e+00 + 1.05889687e+01 -1.00000000e+01 0.00000000e+00 + 1.23615794e+01 -8.40000000e+00 0.00000000e+00 + 1.23615794e+01 -1.00000000e+01 0.00000000e+00 + 1.41873685e+01 -8.40000000e+00 0.00000000e+00 + 1.41873685e+01 -1.00000000e+01 0.00000000e+00 + 1.60679313e+01 -8.40000000e+00 0.00000000e+00 + 1.60679313e+01 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 -8.40000000e+00 0.00000000e+00 + 1.80049110e+01 -1.00000000e+01 0.00000000e+00 + 2.00000000e+01 -8.40000000e+00 0.00000000e+00 + 2.00000000e+01 -1.00000000e+01 0.00000000e+00 + 4.00000000e+00 -6.80000000e+00 0.00000000e+00 + 5.57494171e+00 -6.80000000e+00 0.00000000e+00 + 7.19713167e+00 -6.80000000e+00 0.00000000e+00 + 8.86798734e+00 -6.80000000e+00 0.00000000e+00 + 1.05889687e+01 -6.80000000e+00 0.00000000e+00 + 1.23615794e+01 -6.80000000e+00 0.00000000e+00 + 1.41873685e+01 -6.80000000e+00 0.00000000e+00 + 1.60679313e+01 -6.80000000e+00 0.00000000e+00 + 1.80049110e+01 -6.80000000e+00 0.00000000e+00 + 2.00000000e+01 -6.80000000e+00 0.00000000e+00 + 4.00000000e+00 -5.20000000e+00 0.00000000e+00 + 5.57494171e+00 -5.20000000e+00 0.00000000e+00 + 7.19713167e+00 -5.20000000e+00 0.00000000e+00 + 8.86798734e+00 -5.20000000e+00 0.00000000e+00 + 1.05889687e+01 -5.20000000e+00 0.00000000e+00 + 1.23615794e+01 -5.20000000e+00 0.00000000e+00 + 1.41873685e+01 -5.20000000e+00 0.00000000e+00 + 1.60679313e+01 -5.20000000e+00 0.00000000e+00 + 1.80049110e+01 -5.20000000e+00 0.00000000e+00 + 2.00000000e+01 -5.20000000e+00 0.00000000e+00 + 4.00000000e+00 -3.60000000e+00 0.00000000e+00 + 5.57494171e+00 -3.60000000e+00 0.00000000e+00 + 7.19713168e+00 -3.60000000e+00 0.00000000e+00 + 8.86798734e+00 -3.60000000e+00 0.00000000e+00 + 1.05889687e+01 -3.60000000e+00 0.00000000e+00 + 1.23615794e+01 -3.60000000e+00 0.00000000e+00 + 1.41873685e+01 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -3.60000000e+00 0.00000000e+00 + 1.80049110e+01 -3.60000000e+00 0.00000000e+00 + 2.00000000e+01 -3.60000000e+00 0.00000000e+00 + 2.66666667e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+00 -3.60000000e+00 0.00000000e+00 + 2.66666667e+00 -5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -5.20000000e+00 0.00000000e+00 + 2.66666667e+00 -6.80000000e+00 0.00000000e+00 + 2.00000000e+00 -6.80000000e+00 0.00000000e+00 + 2.66666667e+00 -8.40000000e+00 0.00000000e+00 + 2.00000000e+00 -8.40000000e+00 0.00000000e+00 + 2.66666667e+00 -1.00000000e+01 0.00000000e+00 + 2.00000000e+00 -1.00000000e+01 0.00000000e+00 + 3.33333333e+00 -3.60000000e+00 0.00000000e+00 + 3.33333333e+00 -5.20000000e+00 0.00000000e+00 + 3.33333333e+00 -6.80000000e+00 0.00000000e+00 + 3.33333333e+00 -8.40000000e+00 0.00000000e+00 + 3.33333333e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e-01 -3.60000000e+00 0.00000000e+00 + 0.00000000e+00 -3.60000000e+00 0.00000000e+00 + 4.00000000e-01 -5.20000000e+00 0.00000000e+00 + 0.00000000e+00 -5.20000000e+00 0.00000000e+00 + 4.00000000e-01 -6.80000000e+00 0.00000000e+00 + 0.00000000e+00 -6.80000000e+00 0.00000000e+00 + 4.00000000e-01 -8.40000000e+00 0.00000000e+00 + 0.00000000e+00 -8.40000000e+00 0.00000000e+00 + 4.00000000e-01 -1.00000000e+01 0.00000000e+00 + 0.00000000e+00 -1.00000000e+01 0.00000000e+00 + 8.00000000e-01 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 -5.20000000e+00 0.00000000e+00 + 8.00000000e-01 -6.80000000e+00 0.00000000e+00 + 8.00000000e-01 -8.40000000e+00 0.00000000e+00 + 8.00000000e-01 -1.00000000e+01 0.00000000e+00 + 1.20000000e+00 -3.60000000e+00 0.00000000e+00 + 1.20000000e+00 -5.20000000e+00 0.00000000e+00 + 1.20000000e+00 -6.80000000e+00 0.00000000e+00 + 1.20000000e+00 -8.40000000e+00 0.00000000e+00 + 1.20000000e+00 -1.00000000e+01 0.00000000e+00 + 1.60000000e+00 -3.60000000e+00 0.00000000e+00 + 1.60000000e+00 -5.20000000e+00 0.00000000e+00 + 1.60000000e+00 -6.80000000e+00 0.00000000e+00 + 1.60000000e+00 -8.40000000e+00 0.00000000e+00 + 1.60000000e+00 -1.00000000e+01 0.00000000e+00 + -1.60000000e+00 -3.60000000e+00 0.00000000e+00 + -2.00000000e+00 -3.60000000e+00 0.00000000e+00 + -1.60000000e+00 -5.20000000e+00 0.00000000e+00 + -2.00000000e+00 -5.20000000e+00 0.00000000e+00 + -1.60000000e+00 -6.80000000e+00 0.00000000e+00 + -2.00000000e+00 -6.80000000e+00 0.00000000e+00 + -1.60000000e+00 -8.40000000e+00 0.00000000e+00 + -2.00000000e+00 -8.40000000e+00 0.00000000e+00 + -1.60000000e+00 -1.00000000e+01 0.00000000e+00 + -2.00000000e+00 -1.00000000e+01 0.00000000e+00 + -1.20000000e+00 -3.60000000e+00 0.00000000e+00 + -1.20000000e+00 -5.20000000e+00 0.00000000e+00 + -1.20000000e+00 -6.80000000e+00 0.00000000e+00 + -1.20000000e+00 -8.40000000e+00 0.00000000e+00 + -1.20000000e+00 -1.00000000e+01 0.00000000e+00 + -8.00000000e-01 -3.60000000e+00 0.00000000e+00 + -8.00000000e-01 -5.20000000e+00 0.00000000e+00 + -8.00000000e-01 -6.80000000e+00 0.00000000e+00 + -8.00000000e-01 -8.40000000e+00 0.00000000e+00 + -8.00000000e-01 -1.00000000e+01 0.00000000e+00 + -4.00000000e-01 -3.60000000e+00 0.00000000e+00 + -4.00000000e-01 -5.20000000e+00 0.00000000e+00 + -4.00000000e-01 -6.80000000e+00 0.00000000e+00 + -4.00000000e-01 -8.40000000e+00 0.00000000e+00 + -4.00000000e-01 -1.00000000e+01 0.00000000e+00 + -3.60000000e+00 -3.60000000e+00 0.00000000e+00 + -3.60000000e+00 -5.20000000e+00 0.00000000e+00 + -3.60000000e+00 -6.80000000e+00 0.00000000e+00 + -3.60000000e+00 -8.40000000e+00 0.00000000e+00 + -3.60000000e+00 -1.00000000e+01 0.00000000e+00 + -5.20000000e+00 -3.60000000e+00 0.00000000e+00 + -5.20000000e+00 -5.20000000e+00 0.00000000e+00 + -5.20000000e+00 -6.80000000e+00 0.00000000e+00 + -5.20000000e+00 -8.40000000e+00 0.00000000e+00 + -5.20000000e+00 -1.00000000e+01 0.00000000e+00 + -6.80000000e+00 -3.60000000e+00 0.00000000e+00 + -6.80000000e+00 -5.20000000e+00 0.00000000e+00 + -6.80000000e+00 -6.80000000e+00 0.00000000e+00 + -6.80000000e+00 -8.40000000e+00 0.00000000e+00 + -6.80000000e+00 -1.00000000e+01 0.00000000e+00 + -8.40000000e+00 -3.60000000e+00 0.00000000e+00 + -8.40000000e+00 -5.20000000e+00 0.00000000e+00 + -8.40000000e+00 -6.80000000e+00 0.00000000e+00 + -8.40000000e+00 -8.40000000e+00 0.00000000e+00 + -8.40000000e+00 -1.00000000e+01 0.00000000e+00 + -1.00000000e+01 -3.60000000e+00 0.00000000e+00 + -1.00000000e+01 -5.20000000e+00 0.00000000e+00 + -1.00000000e+01 -6.80000000e+00 0.00000000e+00 + -1.00000000e+01 -8.40000000e+00 0.00000000e+00 + -1.00000000e+01 -1.00000000e+01 0.00000000e+00 + -4.93844170e-01 7.82172325e-02 0.00000000e+00 + -5.00000000e-01 0.00000000e+00 0.00000000e+00 + -4.75528258e-01 1.54508497e-01 0.00000000e+00 + -4.45503262e-01 2.26995250e-01 0.00000000e+00 + -4.04508497e-01 2.93892626e-01 0.00000000e+00 + -3.53553391e-01 3.53553391e-01 0.00000000e+00 + -2.93892626e-01 4.04508497e-01 0.00000000e+00 + -2.26995250e-01 4.45503262e-01 0.00000000e+00 + -1.54508497e-01 4.75528258e-01 0.00000000e+00 + -7.82172325e-02 4.93844170e-01 0.00000000e+00 + 0.00000000e+00 5.00000000e-01 0.00000000e+00 + 7.82172325e-02 4.93844170e-01 0.00000000e+00 + 1.54508497e-01 4.75528258e-01 0.00000000e+00 + 2.26995250e-01 4.45503262e-01 0.00000000e+00 + 2.93892626e-01 4.04508497e-01 0.00000000e+00 + 3.53553391e-01 3.53553391e-01 0.00000000e+00 + 4.04508497e-01 2.93892626e-01 0.00000000e+00 + 4.45503262e-01 2.26995250e-01 0.00000000e+00 + 4.75528258e-01 1.54508497e-01 0.00000000e+00 + 4.93844170e-01 7.82172325e-02 0.00000000e+00 + 5.00000000e-01 0.00000000e+00 0.00000000e+00 + 4.93844170e-01 -7.82172325e-02 0.00000000e+00 + 4.75528258e-01 -1.54508497e-01 0.00000000e+00 + 4.45503262e-01 -2.26995250e-01 0.00000000e+00 + 4.04508497e-01 -2.93892626e-01 0.00000000e+00 + 3.53553391e-01 -3.53553391e-01 0.00000000e+00 + 2.93892626e-01 -4.04508497e-01 0.00000000e+00 + 2.26995250e-01 -4.45503262e-01 0.00000000e+00 + 1.54508497e-01 -4.75528258e-01 0.00000000e+00 + 7.82172325e-02 -4.93844170e-01 0.00000000e+00 + 0.00000000e+00 -5.00000000e-01 0.00000000e+00 + -7.82172325e-02 -4.93844170e-01 0.00000000e+00 + -1.54508497e-01 -4.75528258e-01 0.00000000e+00 + -2.26995250e-01 -4.45503262e-01 0.00000000e+00 + -2.93892626e-01 -4.04508497e-01 0.00000000e+00 + -3.53553391e-01 -3.53553391e-01 0.00000000e+00 + -4.04508497e-01 -2.93892626e-01 0.00000000e+00 + -4.45503262e-01 -2.26995250e-01 0.00000000e+00 + -4.75528258e-01 -1.54508497e-01 0.00000000e+00 + -4.93844170e-01 -7.82172325e-02 0.00000000e+00 + + + 0 1 + 1 2 + 2 3 + 3 0 + 2 4 + 4 5 + 5 3 + 4 6 + 6 7 + 7 5 + 6 8 + 8 9 + 9 7 + 8 10 + 10 11 + 11 9 + 1 12 + 12 13 + 13 2 + 13 14 + 14 4 + 14 15 + 15 6 + 15 16 + 16 8 + 16 17 + 17 10 + 12 18 + 18 19 + 19 13 + 19 20 + 20 14 + 20 21 + 21 15 + 21 22 + 22 16 + 22 23 + 23 17 + 18 24 + 24 25 + 25 19 + 25 26 + 26 20 + 26 27 + 27 21 + 27 28 + 28 22 + 28 29 + 29 23 + 24 30 + 30 31 + 31 25 + 31 32 + 32 26 + 32 33 + 33 27 + 33 34 + 34 28 + 34 35 + 35 29 + 10 36 + 36 37 + 37 11 + 36 38 + 38 39 + 39 37 + 38 40 + 40 41 + 41 39 + 40 42 + 42 43 + 43 41 + 42 44 + 44 45 + 45 43 + 17 46 + 46 36 + 46 47 + 47 38 + 47 48 + 48 40 + 48 49 + 49 42 + 49 50 + 50 44 + 23 51 + 51 46 + 51 52 + 52 47 + 52 53 + 53 48 + 53 54 + 54 49 + 54 55 + 55 50 + 29 56 + 56 51 + 56 57 + 57 52 + 57 58 + 58 53 + 58 59 + 59 54 + 59 60 + 60 55 + 35 61 + 61 56 + 61 62 + 62 57 + 62 63 + 63 58 + 63 64 + 64 59 + 64 65 + 65 60 + 66 67 + 67 68 + 68 69 + 69 66 + 68 70 + 70 71 + 71 69 + 70 72 + 72 73 + 73 71 + 72 74 + 74 75 + 75 73 + 74 76 + 76 77 + 77 75 + 67 78 + 78 79 + 79 68 + 79 80 + 80 70 + 80 81 + 81 72 + 81 82 + 82 74 + 82 83 + 83 76 + 78 84 + 84 85 + 85 79 + 85 86 + 86 80 + 86 87 + 87 81 + 87 88 + 88 82 + 88 89 + 89 83 + 84 90 + 90 91 + 91 85 + 91 92 + 92 86 + 92 93 + 93 87 + 93 94 + 94 88 + 94 95 + 95 89 + 90 45 + 44 91 + 50 92 + 55 93 + 60 94 + 65 95 + 75 96 + 96 97 + 97 77 + 96 98 + 98 99 + 99 97 + 98 100 + 100 101 + 101 99 + 73 102 + 102 96 + 102 103 + 103 98 + 103 104 + 104 100 + 71 105 + 105 102 + 105 106 + 106 103 + 106 107 + 107 104 + 69 108 + 108 105 + 108 109 + 109 106 + 109 110 + 110 107 + 66 111 + 111 108 + 111 112 + 112 109 + 112 113 + 113 110 + 100 114 + 114 115 + 115 101 + 114 116 + 116 117 + 117 115 + 116 118 + 118 119 + 119 117 + 118 120 + 120 121 + 121 119 + 120 122 + 122 123 + 123 121 + 122 124 + 124 125 + 125 123 + 124 126 + 126 127 + 127 125 + 126 128 + 128 129 + 129 127 + 128 130 + 130 131 + 131 129 + 104 132 + 132 114 + 132 133 + 133 116 + 133 134 + 134 118 + 134 135 + 135 120 + 135 136 + 136 122 + 136 137 + 137 124 + 137 138 + 138 126 + 138 139 + 139 128 + 139 140 + 140 130 + 107 141 + 141 132 + 141 142 + 142 133 + 142 143 + 143 134 + 143 144 + 144 135 + 144 145 + 145 136 + 145 146 + 146 137 + 146 147 + 147 138 + 147 148 + 148 139 + 148 149 + 149 140 + 110 150 + 150 141 + 150 151 + 151 142 + 151 152 + 152 143 + 152 153 + 153 144 + 153 154 + 154 145 + 154 155 + 155 146 + 155 156 + 156 147 + 156 157 + 157 148 + 157 158 + 158 149 + 113 159 + 159 150 + 159 160 + 160 151 + 160 161 + 161 152 + 161 162 + 162 153 + 162 163 + 163 154 + 163 164 + 164 155 + 164 165 + 165 156 + 165 166 + 166 157 + 166 167 + 167 158 + 30 168 + 168 169 + 169 31 + 169 170 + 170 32 + 170 171 + 171 33 + 171 172 + 172 34 + 172 173 + 173 35 + 168 174 + 174 175 + 175 169 + 175 176 + 176 170 + 176 177 + 177 171 + 177 178 + 178 172 + 178 179 + 179 173 + 174 180 + 180 181 + 181 175 + 181 182 + 182 176 + 182 183 + 183 177 + 183 184 + 184 178 + 184 185 + 185 179 + 180 186 + 186 187 + 187 181 + 187 188 + 188 182 + 188 189 + 189 183 + 189 190 + 190 184 + 190 191 + 191 185 + 186 192 + 192 193 + 193 187 + 193 194 + 194 188 + 194 195 + 195 189 + 195 196 + 196 190 + 196 197 + 197 191 + 64 198 + 198 199 + 199 65 + 63 200 + 200 198 + 62 201 + 201 200 + 61 202 + 202 201 + 35 203 + 203 202 + 173 204 + 204 203 + 179 205 + 205 204 + 185 206 + 206 205 + 191 207 + 207 206 + 197 208 + 208 207 + 198 209 + 209 210 + 210 199 + 200 211 + 211 209 + 201 212 + 212 211 + 202 213 + 213 212 + 203 214 + 214 213 + 204 215 + 215 214 + 205 216 + 216 215 + 206 217 + 217 216 + 207 218 + 218 217 + 208 219 + 219 218 + 209 220 + 220 221 + 221 210 + 211 222 + 222 220 + 212 223 + 223 222 + 213 224 + 224 223 + 214 225 + 225 224 + 215 226 + 226 225 + 216 227 + 227 226 + 217 228 + 228 227 + 218 229 + 229 228 + 219 230 + 230 229 + 220 231 + 231 232 + 232 221 + 222 233 + 233 231 + 223 234 + 234 233 + 224 235 + 235 234 + 225 236 + 236 235 + 226 237 + 237 236 + 227 238 + 238 237 + 228 239 + 239 238 + 229 240 + 240 239 + 230 241 + 241 240 + 242 243 + 243 244 + 244 245 + 245 242 + 243 246 + 246 247 + 247 244 + 246 248 + 248 249 + 249 247 + 248 250 + 250 251 + 251 249 + 250 77 + 77 252 + 252 251 + 76 253 + 253 252 + 83 254 + 254 253 + 89 255 + 255 254 + 95 256 + 256 255 + 199 256 + 244 257 + 257 258 + 258 245 + 247 259 + 259 257 + 249 260 + 260 259 + 251 261 + 261 260 + 252 262 + 262 261 + 253 263 + 263 262 + 254 264 + 264 263 + 255 265 + 265 264 + 256 266 + 266 265 + 210 266 + 257 267 + 267 268 + 268 258 + 259 269 + 269 267 + 260 270 + 270 269 + 261 271 + 271 270 + 262 272 + 272 271 + 263 273 + 273 272 + 264 274 + 274 273 + 265 275 + 275 274 + 266 276 + 276 275 + 221 276 + 267 277 + 277 278 + 278 268 + 269 279 + 279 277 + 270 280 + 280 279 + 271 281 + 281 280 + 272 282 + 282 281 + 273 283 + 283 282 + 274 284 + 284 283 + 275 285 + 285 284 + 276 286 + 286 285 + 232 286 + 287 288 + 288 289 + 289 290 + 290 287 + 288 291 + 291 292 + 292 289 + 291 293 + 293 294 + 294 292 + 293 295 + 295 296 + 296 294 + 289 297 + 297 298 + 298 290 + 292 299 + 299 297 + 294 300 + 300 299 + 296 301 + 301 300 + 297 302 + 302 303 + 303 298 + 299 304 + 304 302 + 300 305 + 305 304 + 301 306 + 306 305 + 302 307 + 307 308 + 308 303 + 304 309 + 309 307 + 305 310 + 310 309 + 306 311 + 311 310 + 307 312 + 312 313 + 313 308 + 309 314 + 314 312 + 310 315 + 315 314 + 311 316 + 316 315 + 312 317 + 317 318 + 318 313 + 314 319 + 319 317 + 315 320 + 320 319 + 316 321 + 321 320 + 317 322 + 322 323 + 323 318 + 319 324 + 324 322 + 320 325 + 325 324 + 321 326 + 326 325 + 322 327 + 327 328 + 328 323 + 324 329 + 329 327 + 325 330 + 330 329 + 326 331 + 331 330 + 327 332 + 332 333 + 333 328 + 329 334 + 334 332 + 330 335 + 335 334 + 331 336 + 336 335 + 332 208 + 197 333 + 334 219 + 335 230 + 336 241 + 287 337 + 337 338 + 338 288 + 337 339 + 339 340 + 340 338 + 339 341 + 341 342 + 342 340 + 341 343 + 343 344 + 344 342 + 343 345 + 345 346 + 346 344 + 345 347 + 347 348 + 348 346 + 347 349 + 349 350 + 350 348 + 349 351 + 351 352 + 352 350 + 351 353 + 353 354 + 354 352 + 353 242 + 245 354 + 338 355 + 355 291 + 340 356 + 356 355 + 342 357 + 357 356 + 344 358 + 358 357 + 346 359 + 359 358 + 348 360 + 360 359 + 350 361 + 361 360 + 352 362 + 362 361 + 354 363 + 363 362 + 258 363 + 355 364 + 364 293 + 356 365 + 365 364 + 357 366 + 366 365 + 358 367 + 367 366 + 359 368 + 368 367 + 360 369 + 369 368 + 361 370 + 370 369 + 362 371 + 371 370 + 363 372 + 372 371 + 268 372 + 364 373 + 373 295 + 365 374 + 374 373 + 366 375 + 375 374 + 367 376 + 376 375 + 368 377 + 377 376 + 369 378 + 378 377 + 370 379 + 379 378 + 371 380 + 380 379 + 372 381 + 381 380 + 278 381 + 243 382 + 382 383 + 383 242 + 382 384 + 384 385 + 385 383 + 384 386 + 386 387 + 387 385 + 246 388 + 388 382 + 388 389 + 389 384 + 389 390 + 390 386 + 248 391 + 391 388 + 391 392 + 392 389 + 392 393 + 393 390 + 250 394 + 394 391 + 394 395 + 395 392 + 395 396 + 396 393 + 97 394 + 99 395 + 101 396 + 383 397 + 397 353 + 397 398 + 398 351 + 398 399 + 399 349 + 399 400 + 400 347 + 400 401 + 401 345 + 385 402 + 402 397 + 402 403 + 403 398 + 403 404 + 404 399 + 404 405 + 405 400 + 405 406 + 406 401 + 387 407 + 407 402 + 407 408 + 408 403 + 408 409 + 409 404 + 409 410 + 410 405 + 410 411 + 411 406 + 196 412 + 412 333 + 412 413 + 413 328 + 413 414 + 414 323 + 414 415 + 415 318 + 415 416 + 416 313 + 195 417 + 417 412 + 417 418 + 418 413 + 418 419 + 419 414 + 419 420 + 420 415 + 420 421 + 421 416 + 194 422 + 422 417 + 422 423 + 423 418 + 423 424 + 424 419 + 424 425 + 425 420 + 425 426 + 426 421 + 193 427 + 427 422 + 427 428 + 428 423 + 428 429 + 429 424 + 429 430 + 430 425 + 430 431 + 431 426 + 192 432 + 432 427 + 432 433 + 433 428 + 433 434 + 434 429 + 434 435 + 435 430 + 435 436 + 436 431 + 386 437 + 437 438 + 438 387 + 437 439 + 439 440 + 440 438 + 439 441 + 441 442 + 442 440 + 441 443 + 443 444 + 444 442 + 443 445 + 445 446 + 446 444 + 445 447 + 447 448 + 448 446 + 447 449 + 449 450 + 450 448 + 449 451 + 451 452 + 452 450 + 451 453 + 453 454 + 454 452 + 390 455 + 455 437 + 455 456 + 456 439 + 456 457 + 457 441 + 457 458 + 458 443 + 458 459 + 459 445 + 459 460 + 460 447 + 460 461 + 461 449 + 461 462 + 462 451 + 462 463 + 463 453 + 393 464 + 464 455 + 464 465 + 465 456 + 465 466 + 466 457 + 466 467 + 467 458 + 467 468 + 468 459 + 468 469 + 469 460 + 469 470 + 470 461 + 470 471 + 471 462 + 471 472 + 472 463 + 396 473 + 473 464 + 473 474 + 474 465 + 474 475 + 475 466 + 475 476 + 476 467 + 476 477 + 477 468 + 477 478 + 478 469 + 478 479 + 479 470 + 479 480 + 480 471 + 480 481 + 481 472 + 115 473 + 117 474 + 119 475 + 121 476 + 123 477 + 125 478 + 127 479 + 129 480 + 131 481 + 438 482 + 482 407 + 482 483 + 483 408 + 483 484 + 484 409 + 484 485 + 485 410 + 485 486 + 486 411 + 440 487 + 487 482 + 487 488 + 488 483 + 488 489 + 489 484 + 489 490 + 490 485 + 490 491 + 491 486 + 442 492 + 492 487 + 492 493 + 493 488 + 493 494 + 494 489 + 494 495 + 495 490 + 495 496 + 496 491 + 444 497 + 497 492 + 497 498 + 498 493 + 498 499 + 499 494 + 499 500 + 500 495 + 500 501 + 501 496 + 446 502 + 502 497 + 502 503 + 503 498 + 503 504 + 504 499 + 504 505 + 505 500 + 505 506 + 506 501 + 448 507 + 507 502 + 507 508 + 508 503 + 508 509 + 509 504 + 509 510 + 510 505 + 510 511 + 511 506 + 450 512 + 512 507 + 512 513 + 513 508 + 513 514 + 514 509 + 514 515 + 515 510 + 515 516 + 516 511 + 452 517 + 517 512 + 517 518 + 518 513 + 518 519 + 519 514 + 519 520 + 520 515 + 520 521 + 521 516 + 454 522 + 522 517 + 522 523 + 523 518 + 523 524 + 524 519 + 524 525 + 525 520 + 525 526 + 526 521 + 527 528 + 528 529 + 529 530 + 530 527 + 529 531 + 531 532 + 532 530 + 531 533 + 533 534 + 534 532 + 533 535 + 535 536 + 536 534 + 535 537 + 537 538 + 538 536 + 537 539 + 539 540 + 540 538 + 539 541 + 541 542 + 542 540 + 541 543 + 543 544 + 544 542 + 543 545 + 545 546 + 546 544 + 528 547 + 547 548 + 548 529 + 548 549 + 549 531 + 549 550 + 550 533 + 550 551 + 551 535 + 551 552 + 552 537 + 552 553 + 553 539 + 553 554 + 554 541 + 554 555 + 555 543 + 555 556 + 556 545 + 547 557 + 557 558 + 558 548 + 558 559 + 559 549 + 559 560 + 560 550 + 560 561 + 561 551 + 561 562 + 562 552 + 562 563 + 563 553 + 563 564 + 564 554 + 564 565 + 565 555 + 565 566 + 566 556 + 557 567 + 567 568 + 568 558 + 568 569 + 569 559 + 569 570 + 570 560 + 570 571 + 571 561 + 571 572 + 572 562 + 572 573 + 573 563 + 573 574 + 574 564 + 574 575 + 575 565 + 575 576 + 576 566 + 567 411 + 486 568 + 491 569 + 496 570 + 501 571 + 506 572 + 511 573 + 516 574 + 521 575 + 526 576 + 401 577 + 577 578 + 578 345 + 577 579 + 579 580 + 580 578 + 579 581 + 581 582 + 582 580 + 581 583 + 583 584 + 584 582 + 583 585 + 585 586 + 586 584 + 406 587 + 587 577 + 587 588 + 588 579 + 588 589 + 589 581 + 589 590 + 590 583 + 590 591 + 591 585 + 567 587 + 557 588 + 547 589 + 528 590 + 527 591 + 337 592 + 592 593 + 593 287 + 592 594 + 594 595 + 595 593 + 594 596 + 596 597 + 597 595 + 596 598 + 598 599 + 599 597 + 598 600 + 600 601 + 601 599 + 339 602 + 602 592 + 602 603 + 603 594 + 603 604 + 604 596 + 604 605 + 605 598 + 605 606 + 606 600 + 341 607 + 607 602 + 607 608 + 608 603 + 608 609 + 609 604 + 609 610 + 610 605 + 610 611 + 611 606 + 343 612 + 612 607 + 612 613 + 613 608 + 613 614 + 614 609 + 614 615 + 615 610 + 615 616 + 616 611 + 578 612 + 580 613 + 582 614 + 584 615 + 586 616 + 308 617 + 617 618 + 618 313 + 617 619 + 619 620 + 620 618 + 619 621 + 621 622 + 622 620 + 621 623 + 623 624 + 624 622 + 623 625 + 625 626 + 626 624 + 303 627 + 627 617 + 627 628 + 628 619 + 628 629 + 629 621 + 629 630 + 630 623 + 630 631 + 631 625 + 298 632 + 632 627 + 632 633 + 633 628 + 633 634 + 634 629 + 634 635 + 635 630 + 635 636 + 636 631 + 290 637 + 637 632 + 637 638 + 638 633 + 638 639 + 639 634 + 639 640 + 640 635 + 640 641 + 641 636 + 593 637 + 595 638 + 597 639 + 599 640 + 601 641 + 416 642 + 642 618 + 642 643 + 643 620 + 643 644 + 644 622 + 644 645 + 645 624 + 645 646 + 646 626 + 421 647 + 647 642 + 647 648 + 648 643 + 648 649 + 649 644 + 649 650 + 650 645 + 650 651 + 651 646 + 426 652 + 652 647 + 652 653 + 653 648 + 653 654 + 654 649 + 654 655 + 655 650 + 655 656 + 656 651 + 431 657 + 657 652 + 657 658 + 658 653 + 658 659 + 659 654 + 659 660 + 660 655 + 660 661 + 661 656 + 436 662 + 662 657 + 662 663 + 663 658 + 663 664 + 664 659 + 664 665 + 665 660 + 665 666 + 666 661 + 240 667 + 667 668 + 668 241 + 239 669 + 669 667 + 238 670 + 670 669 + 237 671 + 671 670 + 236 672 + 672 671 + 235 673 + 673 672 + 234 674 + 674 673 + 233 675 + 675 674 + 231 676 + 676 675 + 232 677 + 677 676 + 677 678 + 678 286 + 678 679 + 679 285 + 679 680 + 680 284 + 680 681 + 681 283 + 681 682 + 682 282 + 682 683 + 683 281 + 683 684 + 684 280 + 684 685 + 685 279 + 685 686 + 686 277 + 686 687 + 687 278 + 687 688 + 688 381 + 688 689 + 689 380 + 689 690 + 690 379 + 690 691 + 691 378 + 691 692 + 692 377 + 692 693 + 693 376 + 693 694 + 694 375 + 694 695 + 695 374 + 695 696 + 696 373 + 696 697 + 697 295 + 697 698 + 698 296 + 698 699 + 699 301 + 699 700 + 700 306 + 700 701 + 701 311 + 701 702 + 702 316 + 702 703 + 703 321 + 703 704 + 704 326 + 704 705 + 705 331 + 705 706 + 706 336 + 706 668 + + + 0 1 2 3 + 2 4 5 6 + 5 7 8 9 + 8 10 11 12 + 11 13 14 15 + 16 17 18 1 + 18 19 20 4 + 20 21 22 7 + 22 23 24 10 + 24 25 26 13 + 27 28 29 17 + 29 30 31 19 + 31 32 33 21 + 33 34 35 23 + 35 36 37 25 + 38 39 40 28 + 40 41 42 30 + 42 43 44 32 + 44 45 46 34 + 46 47 48 36 + 49 50 51 39 + 51 52 53 41 + 53 54 55 43 + 55 56 57 45 + 57 58 59 47 + 14 60 61 62 + 61 63 64 65 + 64 66 67 68 + 67 69 70 71 + 70 72 73 74 + 26 75 76 60 + 76 77 78 63 + 78 79 80 66 + 80 81 82 69 + 82 83 84 72 + 37 85 86 75 + 86 87 88 77 + 88 89 90 79 + 90 91 92 81 + 92 93 94 83 + 48 95 96 85 + 96 97 98 87 + 98 99 100 89 + 100 101 102 91 + 102 103 104 93 + 59 105 106 95 + 106 107 108 97 + 108 109 110 99 + 110 111 112 101 + 112 113 114 103 + 115 116 117 118 + 117 119 120 121 + 120 122 123 124 + 123 125 126 127 + 126 128 129 130 + 131 132 133 116 + 133 134 135 119 + 135 136 137 122 + 137 138 139 125 + 139 140 141 128 + 142 143 144 132 + 144 145 146 134 + 146 147 148 136 + 148 149 150 138 + 150 151 152 140 + 153 154 155 143 + 155 156 157 145 + 157 158 159 147 + 159 160 161 149 + 161 162 163 151 + 164 73 165 154 + 165 84 166 156 + 166 94 167 158 + 167 104 168 160 + 168 114 169 162 + 172 171 170 130 + 175 174 173 171 + 178 177 176 174 + 170 180 179 127 + 173 182 181 180 + 176 184 183 182 + 179 186 185 124 + 181 188 187 186 + 183 190 189 188 + 185 192 191 121 + 187 194 193 192 + 189 196 195 194 + 191 198 197 118 + 193 200 199 198 + 195 202 201 200 + 205 204 203 177 + 208 207 206 204 + 211 210 209 207 + 214 213 212 210 + 217 216 215 213 + 220 219 218 216 + 223 222 221 219 + 226 225 224 222 + 229 228 227 225 + 203 231 230 184 + 206 233 232 231 + 209 235 234 233 + 212 237 236 235 + 215 239 238 237 + 218 241 240 239 + 221 243 242 241 + 224 245 244 243 + 227 247 246 245 + 230 249 248 190 + 232 251 250 249 + 234 253 252 251 + 236 255 254 253 + 238 257 256 255 + 240 259 258 257 + 242 261 260 259 + 244 263 262 261 + 246 265 264 263 + 248 267 266 196 + 250 269 268 267 + 252 271 270 269 + 254 273 272 271 + 256 275 274 273 + 258 277 276 275 + 260 279 278 277 + 262 281 280 279 + 264 283 282 281 + 266 285 284 202 + 268 287 286 285 + 270 289 288 287 + 272 291 290 289 + 274 293 292 291 + 276 295 294 293 + 278 297 296 295 + 280 299 298 297 + 282 301 300 299 + 302 303 304 50 + 304 305 306 52 + 306 307 308 54 + 308 309 310 56 + 310 311 312 58 + 313 314 315 303 + 315 316 317 305 + 317 318 319 307 + 319 320 321 309 + 321 322 323 311 + 324 325 326 314 + 326 327 328 316 + 328 329 330 318 + 330 331 332 320 + 332 333 334 322 + 335 336 337 325 + 337 338 339 327 + 339 340 341 329 + 341 342 343 331 + 343 344 345 333 + 346 347 348 336 + 348 349 350 338 + 350 351 352 340 + 352 353 354 342 + 354 355 356 344 + 113 357 358 359 + 111 360 361 357 + 109 362 363 360 + 107 364 365 362 + 105 366 367 364 + 312 368 369 366 + 323 370 371 368 + 334 372 373 370 + 345 374 375 372 + 356 376 377 374 + 358 378 379 380 + 361 381 382 378 + 363 383 384 381 + 365 385 386 383 + 367 387 388 385 + 369 389 390 387 + 371 391 392 389 + 373 393 394 391 + 375 395 396 393 + 377 397 398 395 + 379 399 400 401 + 382 402 403 399 + 384 404 405 402 + 386 406 407 404 + 388 408 409 406 + 390 410 411 408 + 392 412 413 410 + 394 414 415 412 + 396 416 417 414 + 398 418 419 416 + 400 420 421 422 + 403 423 424 420 + 405 425 426 423 + 407 427 428 425 + 409 429 430 427 + 411 431 432 429 + 413 433 434 431 + 415 435 436 433 + 417 437 438 435 + 419 439 440 437 + 441 442 443 444 + 445 446 447 442 + 448 449 450 446 + 451 452 453 449 + 454 455 456 452 + 129 457 458 455 + 141 459 460 457 + 152 461 462 459 + 163 463 464 461 + 169 359 465 463 + 443 466 467 468 + 447 469 470 466 + 450 471 472 469 + 453 473 474 471 + 456 475 476 473 + 458 477 478 475 + 460 479 480 477 + 462 481 482 479 + 464 483 484 481 + 465 380 485 483 + 467 486 487 488 + 470 489 490 486 + 472 491 492 489 + 474 493 494 491 + 476 495 496 493 + 478 497 498 495 + 480 499 500 497 + 482 501 502 499 + 484 503 504 501 + 485 401 505 503 + 487 506 507 508 + 490 509 510 506 + 492 511 512 509 + 494 513 514 511 + 496 515 516 513 + 498 517 518 515 + 500 519 520 517 + 502 521 522 519 + 504 523 524 521 + 505 422 525 523 + 526 527 528 529 + 530 531 532 527 + 533 534 535 531 + 536 537 538 534 + 528 539 540 541 + 532 542 543 539 + 535 544 545 542 + 538 546 547 544 + 540 548 549 550 + 543 551 552 548 + 545 553 554 551 + 547 555 556 553 + 549 557 558 559 + 552 560 561 557 + 554 562 563 560 + 556 564 565 562 + 558 566 567 568 + 561 569 570 566 + 563 571 572 569 + 565 573 574 571 + 567 575 576 577 + 570 578 579 575 + 572 580 581 578 + 574 582 583 580 + 576 584 585 586 + 579 587 588 584 + 581 589 590 587 + 583 591 592 589 + 585 593 594 595 + 588 596 597 593 + 590 598 599 596 + 592 600 601 598 + 594 602 603 604 + 597 605 606 602 + 599 607 608 605 + 601 609 610 607 + 603 611 376 612 + 606 613 397 611 + 608 614 418 613 + 610 615 439 614 + 616 617 618 526 + 619 620 621 617 + 622 623 624 620 + 625 626 627 623 + 628 629 630 626 + 631 632 633 629 + 634 635 636 632 + 637 638 639 635 + 640 641 642 638 + 643 444 644 641 + 618 645 646 530 + 621 647 648 645 + 624 649 650 647 + 627 651 652 649 + 630 653 654 651 + 633 655 656 653 + 636 657 658 655 + 639 659 660 657 + 642 661 662 659 + 644 468 663 661 + 646 664 665 533 + 648 666 667 664 + 650 668 669 666 + 652 670 671 668 + 654 672 673 670 + 656 674 675 672 + 658 676 677 674 + 660 678 679 676 + 662 680 681 678 + 663 488 682 680 + 665 683 684 536 + 667 685 686 683 + 669 687 688 685 + 671 689 690 687 + 673 691 692 689 + 675 693 694 691 + 677 695 696 693 + 679 697 698 695 + 681 699 700 697 + 682 508 701 699 + 704 703 702 441 + 707 706 705 703 + 710 709 708 706 + 702 712 711 445 + 705 714 713 712 + 708 716 715 714 + 711 718 717 448 + 713 720 719 718 + 715 722 721 720 + 717 724 723 451 + 719 726 725 724 + 721 728 727 726 + 723 729 172 454 + 725 730 175 729 + 727 731 178 730 + 643 733 732 704 + 640 735 734 733 + 637 737 736 735 + 634 739 738 737 + 631 741 740 739 + 732 743 742 707 + 734 745 744 743 + 736 747 746 745 + 738 749 748 747 + 740 751 750 749 + 742 753 752 710 + 744 755 754 753 + 746 757 756 755 + 748 759 758 757 + 750 761 760 759 + 355 762 763 612 + 763 764 765 604 + 765 766 767 595 + 767 768 769 586 + 769 770 771 577 + 353 772 773 762 + 773 774 775 764 + 775 776 777 766 + 777 778 779 768 + 779 780 781 770 + 351 782 783 772 + 783 784 785 774 + 785 786 787 776 + 787 788 789 778 + 789 790 791 780 + 349 792 793 782 + 793 794 795 784 + 795 796 797 786 + 797 798 799 788 + 799 800 801 790 + 347 802 803 792 + 803 804 805 794 + 805 806 807 796 + 807 808 809 798 + 809 810 811 800 + 814 813 812 709 + 817 816 815 813 + 820 819 818 816 + 823 822 821 819 + 826 825 824 822 + 829 828 827 825 + 832 831 830 828 + 835 834 833 831 + 838 837 836 834 + 812 840 839 716 + 815 842 841 840 + 818 844 843 842 + 821 846 845 844 + 824 848 847 846 + 827 850 849 848 + 830 852 851 850 + 833 854 853 852 + 836 856 855 854 + 839 858 857 722 + 841 860 859 858 + 843 862 861 860 + 845 864 863 862 + 847 866 865 864 + 849 868 867 866 + 851 870 869 868 + 853 872 871 870 + 855 874 873 872 + 857 876 875 728 + 859 878 877 876 + 861 880 879 878 + 863 882 881 880 + 865 884 883 882 + 867 886 885 884 + 869 888 887 886 + 871 890 889 888 + 873 892 891 890 + 875 893 205 731 + 877 894 208 893 + 879 895 211 894 + 881 896 214 895 + 883 897 217 896 + 885 898 220 897 + 887 899 223 898 + 889 900 226 899 + 891 901 229 900 + 752 903 902 814 + 754 905 904 903 + 756 907 906 905 + 758 909 908 907 + 760 911 910 909 + 902 913 912 817 + 904 915 914 913 + 906 917 916 915 + 908 919 918 917 + 910 921 920 919 + 912 923 922 820 + 914 925 924 923 + 916 927 926 925 + 918 929 928 927 + 920 931 930 929 + 922 933 932 823 + 924 935 934 933 + 926 937 936 935 + 928 939 938 937 + 930 941 940 939 + 932 943 942 826 + 934 945 944 943 + 936 947 946 945 + 938 949 948 947 + 940 951 950 949 + 942 953 952 829 + 944 955 954 953 + 946 957 956 955 + 948 959 958 957 + 950 961 960 959 + 952 963 962 832 + 954 965 964 963 + 956 967 966 965 + 958 969 968 967 + 960 971 970 969 + 962 973 972 835 + 964 975 974 973 + 966 977 976 975 + 968 979 978 977 + 970 981 980 979 + 972 983 982 838 + 974 985 984 983 + 976 987 986 985 + 978 989 988 987 + 980 991 990 989 + 995 994 993 992 + 998 997 996 994 + 1001 1000 999 997 + 1004 1003 1002 1000 + 1007 1006 1005 1003 + 1010 1009 1008 1006 + 1013 1012 1011 1009 + 1016 1015 1014 1012 + 1019 1018 1017 1015 + 993 1022 1021 1020 + 996 1024 1023 1022 + 999 1026 1025 1024 + 1002 1028 1027 1026 + 1005 1030 1029 1028 + 1008 1032 1031 1030 + 1011 1034 1033 1032 + 1014 1036 1035 1034 + 1017 1038 1037 1036 + 1021 1041 1040 1039 + 1023 1043 1042 1041 + 1025 1045 1044 1043 + 1027 1047 1046 1045 + 1029 1049 1048 1047 + 1031 1051 1050 1049 + 1033 1053 1052 1051 + 1035 1055 1054 1053 + 1037 1057 1056 1055 + 1040 1060 1059 1058 + 1042 1062 1061 1060 + 1044 1064 1063 1062 + 1046 1066 1065 1064 + 1048 1068 1067 1066 + 1050 1070 1069 1068 + 1052 1072 1071 1070 + 1054 1074 1073 1072 + 1056 1076 1075 1074 + 1059 1078 911 1077 + 1061 1079 921 1078 + 1063 1080 931 1079 + 1065 1081 941 1080 + 1067 1082 951 1081 + 1069 1083 961 1082 + 1071 1084 971 1083 + 1073 1085 981 1084 + 1075 1086 991 1085 + 1089 1088 1087 741 + 1092 1091 1090 1088 + 1095 1094 1093 1091 + 1098 1097 1096 1094 + 1101 1100 1099 1097 + 1087 1103 1102 751 + 1090 1105 1104 1103 + 1093 1107 1106 1105 + 1096 1109 1108 1107 + 1099 1111 1110 1109 + 1102 1112 1077 761 + 1104 1113 1058 1112 + 1106 1114 1039 1113 + 1108 1115 1020 1114 + 1110 1116 992 1115 + 1119 1118 1117 616 + 1122 1121 1120 1118 + 1125 1124 1123 1121 + 1128 1127 1126 1124 + 1131 1130 1129 1127 + 1117 1133 1132 619 + 1120 1135 1134 1133 + 1123 1137 1136 1135 + 1126 1139 1138 1137 + 1129 1141 1140 1139 + 1132 1143 1142 622 + 1134 1145 1144 1143 + 1136 1147 1146 1145 + 1138 1149 1148 1147 + 1140 1151 1150 1149 + 1142 1153 1152 625 + 1144 1155 1154 1153 + 1146 1157 1156 1155 + 1148 1159 1158 1157 + 1150 1161 1160 1159 + 1152 1162 1089 628 + 1154 1163 1092 1162 + 1156 1164 1095 1163 + 1158 1165 1098 1164 + 1160 1166 1101 1165 + 1169 1168 1167 568 + 1172 1171 1170 1168 + 1175 1174 1173 1171 + 1178 1177 1176 1174 + 1181 1180 1179 1177 + 1167 1183 1182 559 + 1170 1185 1184 1183 + 1173 1187 1186 1185 + 1176 1189 1188 1187 + 1179 1191 1190 1189 + 1182 1193 1192 550 + 1184 1195 1194 1193 + 1186 1197 1196 1195 + 1188 1199 1198 1197 + 1190 1201 1200 1199 + 1192 1203 1202 541 + 1194 1205 1204 1203 + 1196 1207 1206 1205 + 1198 1209 1208 1207 + 1200 1211 1210 1209 + 1202 1212 1119 529 + 1204 1213 1122 1212 + 1206 1214 1125 1213 + 1208 1215 1128 1214 + 1210 1216 1131 1215 + 771 1217 1218 1169 + 1218 1219 1220 1172 + 1220 1221 1222 1175 + 1222 1223 1224 1178 + 1224 1225 1226 1181 + 781 1227 1228 1217 + 1228 1229 1230 1219 + 1230 1231 1232 1221 + 1232 1233 1234 1223 + 1234 1235 1236 1225 + 791 1237 1238 1227 + 1238 1239 1240 1229 + 1240 1241 1242 1231 + 1242 1243 1244 1233 + 1244 1245 1246 1235 + 801 1247 1248 1237 + 1248 1249 1250 1239 + 1250 1251 1252 1241 + 1252 1253 1254 1243 + 1254 1255 1256 1245 + 811 1257 1258 1247 + 1258 1259 1260 1249 + 1260 1261 1262 1251 + 1262 1263 1264 1253 + 1264 1265 1266 1255 + 1269 1268 1267 440 + 1267 1271 1270 438 + 1270 1273 1272 436 + 1272 1275 1274 434 + 1274 1277 1276 432 + 1276 1279 1278 430 + 1278 1281 1280 428 + 1280 1283 1282 426 + 1282 1285 1284 424 + 1284 1287 1286 421 + 1286 1288 1289 525 + 1289 1290 1291 524 + 1291 1292 1293 522 + 1293 1294 1295 520 + 1295 1296 1297 518 + 1297 1298 1299 516 + 1299 1300 1301 514 + 1301 1302 1303 512 + 1303 1304 1305 510 + 1305 1306 1307 507 + 1307 1308 1309 701 + 1309 1310 1311 700 + 1311 1312 1313 698 + 1313 1314 1315 696 + 1315 1316 1317 694 + 1317 1318 1319 692 + 1319 1320 1321 690 + 1321 1322 1323 688 + 1323 1324 1325 686 + 1325 1326 1327 684 + 1327 1328 1329 537 + 1329 1330 1331 546 + 1331 1332 1333 555 + 1333 1334 1335 564 + 1335 1336 1337 573 + 1337 1338 1339 582 + 1339 1340 1341 591 + 1341 1342 1343 600 + 1343 1344 1345 609 + 1345 1346 1269 615 + + + -4.75528258e-01 -1.54508497e-01 0.00000000e+00 -4.82962913e-01 -1.29409523e-01 0.00000000e+00 -4.89073800e-01 -1.03955845e-01 0.00000000e+00 -4.93844170e-01 -7.82172325e-02 0.00000000e+00 + -4.04508497e-01 -2.93892626e-01 0.00000000e+00 -4.31475730e-01 -3.13485468e-01 0.00000000e+00 -4.58442963e-01 -3.33078310e-01 0.00000000e+00 -4.85410197e-01 -3.52671151e-01 0.00000000e+00 + -3.53553391e-01 -3.53553391e-01 0.00000000e+00 -3.71572413e-01 -3.34565303e-01 0.00000000e+00 -3.88572981e-01 -3.14660196e-01 0.00000000e+00 -4.04508497e-01 -2.93892626e-01 0.00000000e+00 + -2.93892626e-01 -4.04508497e-01 0.00000000e+00 -3.14660196e-01 -3.88572981e-01 0.00000000e+00 -3.34565303e-01 -3.71572413e-01 0.00000000e+00 -3.53553391e-01 -3.53553391e-01 0.00000000e+00 + -2.26995250e-01 -4.45503262e-01 0.00000000e+00 -2.50000000e-01 -4.33012702e-01 0.00000000e+00 -2.72319518e-01 -4.19335284e-01 0.00000000e+00 -2.93892626e-01 -4.04508497e-01 0.00000000e+00 + -7.82172325e-02 -4.93844170e-01 0.00000000e+00 -1.03955845e-01 -4.89073800e-01 0.00000000e+00 -1.29409523e-01 -4.82962913e-01 0.00000000e+00 -1.54508497e-01 -4.75528258e-01 0.00000000e+00 + -7.82172325e-02 -4.93844170e-01 0.00000000e+00 -8.34317147e-02 -5.26767115e-01 0.00000000e+00 -8.86461969e-02 -5.59690060e-01 0.00000000e+00 -9.38606790e-02 -5.92613004e-01 0.00000000e+00 + 0.00000000e+00 -5.00000000e-01 0.00000000e+00 -2.61679781e-02 -4.99314767e-01 0.00000000e+00 -5.22642316e-02 -4.97260948e-01 0.00000000e+00 -7.82172325e-02 -4.93844170e-01 0.00000000e+00 + 7.82172325e-02 -4.93844170e-01 0.00000000e+00 5.22642316e-02 -4.97260948e-01 0.00000000e+00 2.61679781e-02 -4.99314767e-01 0.00000000e+00 0.00000000e+00 -5.00000000e-01 0.00000000e+00 + 1.54508497e-01 -4.75528258e-01 0.00000000e+00 1.64809064e-01 -5.07230142e-01 0.00000000e+00 1.75109630e-01 -5.38932026e-01 0.00000000e+00 1.85410197e-01 -5.70633910e-01 0.00000000e+00 + 2.26995250e-01 -4.45503262e-01 0.00000000e+00 2.03368322e-01 -4.56772729e-01 0.00000000e+00 1.79183975e-01 -4.66790213e-01 0.00000000e+00 1.54508497e-01 -4.75528258e-01 0.00000000e+00 + 2.26995250e-01 -4.45503262e-01 0.00000000e+00 2.42128267e-01 -4.75203480e-01 0.00000000e+00 2.57261283e-01 -5.04903697e-01 0.00000000e+00 2.72394300e-01 -5.34603915e-01 0.00000000e+00 + 3.53553391e-01 -3.53553391e-01 0.00000000e+00 3.34565303e-01 -3.71572413e-01 0.00000000e+00 3.14660196e-01 -3.88572981e-01 0.00000000e+00 2.93892626e-01 -4.04508497e-01 0.00000000e+00 + 4.04508497e-01 -2.93892626e-01 0.00000000e+00 4.31475730e-01 -3.13485468e-01 0.00000000e+00 4.58442963e-01 -3.33078310e-01 0.00000000e+00 4.85410197e-01 -3.52671151e-01 0.00000000e+00 + 4.75528258e-01 -1.54508497e-01 0.00000000e+00 4.66790213e-01 -1.79183975e-01 0.00000000e+00 4.56772729e-01 -2.03368322e-01 0.00000000e+00 4.45503262e-01 -2.26995250e-01 0.00000000e+00 + 4.93844170e-01 7.82172325e-02 0.00000000e+00 4.97260948e-01 5.22642316e-02 0.00000000e+00 4.99314767e-01 2.61679781e-02 0.00000000e+00 5.00000000e-01 0.00000000e+00 0.00000000e+00 + 4.75528258e-01 1.54508497e-01 0.00000000e+00 5.07230142e-01 1.64809064e-01 0.00000000e+00 5.38932026e-01 1.75109630e-01 0.00000000e+00 5.70633910e-01 1.85410197e-01 0.00000000e+00 + 4.45503262e-01 2.26995250e-01 0.00000000e+00 4.75203480e-01 2.42128267e-01 0.00000000e+00 5.04903697e-01 2.57261283e-01 0.00000000e+00 5.34603915e-01 2.72394300e-01 0.00000000e+00 + 4.04508497e-01 2.93892626e-01 0.00000000e+00 4.19335284e-01 2.72319518e-01 0.00000000e+00 4.33012702e-01 2.50000000e-01 0.00000000e+00 4.45503262e-01 2.26995250e-01 0.00000000e+00 + 2.93892626e-01 4.04508497e-01 0.00000000e+00 3.14660196e-01 3.88572981e-01 0.00000000e+00 3.34565303e-01 3.71572413e-01 0.00000000e+00 3.53553391e-01 3.53553391e-01 0.00000000e+00 + 2.93892626e-01 4.04508497e-01 0.00000000e+00 3.13485468e-01 4.31475730e-01 0.00000000e+00 3.33078310e-01 4.58442963e-01 0.00000000e+00 3.52671151e-01 4.85410197e-01 0.00000000e+00 + 2.26995250e-01 4.45503262e-01 0.00000000e+00 2.50000000e-01 4.33012702e-01 0.00000000e+00 2.72319518e-01 4.19335284e-01 0.00000000e+00 2.93892626e-01 4.04508497e-01 0.00000000e+00 + 2.26995250e-01 4.45503262e-01 0.00000000e+00 2.42128267e-01 4.75203480e-01 0.00000000e+00 2.57261283e-01 5.04903697e-01 0.00000000e+00 2.72394300e-01 5.34603915e-01 0.00000000e+00 + 0.00000000e+00 5.00000000e-01 0.00000000e+00 2.61679781e-02 4.99314767e-01 0.00000000e+00 5.22642316e-02 4.97260948e-01 0.00000000e+00 7.82172325e-02 4.93844170e-01 0.00000000e+00 + 0.00000000e+00 5.00000000e-01 0.00000000e+00 -2.61679781e-02 4.99314767e-01 0.00000000e+00 -5.22642316e-02 4.97260948e-01 0.00000000e+00 -7.82172325e-02 4.93844170e-01 0.00000000e+00 + -7.82172325e-02 4.93844170e-01 0.00000000e+00 -1.03955845e-01 4.89073800e-01 0.00000000e+00 -1.29409523e-01 4.82962913e-01 0.00000000e+00 -1.54508497e-01 4.75528258e-01 0.00000000e+00 + -9.38606790e-02 5.92613004e-01 0.00000000e+00 -8.86461969e-02 5.59690060e-01 0.00000000e+00 -8.34317147e-02 5.26767115e-01 0.00000000e+00 -7.82172325e-02 4.93844170e-01 0.00000000e+00 + -2.26995250e-01 4.45503262e-01 0.00000000e+00 -2.50000000e-01 4.33012702e-01 0.00000000e+00 -2.72319518e-01 4.19335284e-01 0.00000000e+00 -2.93892626e-01 4.04508497e-01 0.00000000e+00 + -2.93892626e-01 4.04508497e-01 0.00000000e+00 -3.14660196e-01 3.88572981e-01 0.00000000e+00 -3.34565303e-01 3.71572413e-01 0.00000000e+00 -3.53553391e-01 3.53553391e-01 0.00000000e+00 + -4.04508497e-01 2.93892626e-01 0.00000000e+00 -4.19335284e-01 2.72319518e-01 0.00000000e+00 -4.33012702e-01 2.50000000e-01 0.00000000e+00 -4.45503262e-01 2.26995250e-01 0.00000000e+00 + -4.75528258e-01 1.54508497e-01 0.00000000e+00 -4.82962913e-01 1.29409523e-01 0.00000000e+00 -4.89073800e-01 1.03955845e-01 0.00000000e+00 -4.93844170e-01 7.82172325e-02 0.00000000e+00 + -5.70633910e-01 1.85410197e-01 0.00000000e+00 -5.38932026e-01 1.75109630e-01 0.00000000e+00 -5.07230142e-01 1.64809064e-01 0.00000000e+00 -4.75528258e-01 1.54508497e-01 0.00000000e+00 + -5.00000000e-01 0.00000000e+00 0.00000000e+00 -5.33333333e-01 0.00000000e+00 0.00000000e+00 -5.66666667e-01 0.00000000e+00 0.00000000e+00 -6.00000000e-01 0.00000000e+00 0.00000000e+00 + -5.92613004e-01 9.38606790e-02 0.00000000e+00 -5.59690060e-01 8.86461969e-02 0.00000000e+00 -5.26767115e-01 8.34317147e-02 0.00000000e+00 -4.93844170e-01 7.82172325e-02 0.00000000e+00 + -1.00000000e+01 -8.40000000e+00 0.00000000e+00 -1.00000000e+01 -8.93333333e+00 0.00000000e+00 -1.00000000e+01 -9.46666667e+00 0.00000000e+00 -1.00000000e+01 -1.00000000e+01 0.00000000e+00 + 2.93892626e-01 -4.04508497e-01 0.00000000e+00 3.13485468e-01 -4.31475730e-01 0.00000000e+00 3.33078310e-01 -4.58442963e-01 0.00000000e+00 3.52671151e-01 -4.85410197e-01 0.00000000e+00 + -1.00000000e+01 -6.80000000e+00 0.00000000e+00 -1.00000000e+01 -7.33333333e+00 0.00000000e+00 -1.00000000e+01 -7.86666667e+00 0.00000000e+00 -1.00000000e+01 -8.40000000e+00 0.00000000e+00 + -1.00000000e+01 -3.60000000e+00 0.00000000e+00 -1.00000000e+01 -4.13333333e+00 0.00000000e+00 -1.00000000e+01 -4.66666667e+00 0.00000000e+00 -1.00000000e+01 -5.20000000e+00 0.00000000e+00 + -8.40000000e+00 -8.40000000e+00 0.00000000e+00 -7.86666667e+00 -8.40000000e+00 0.00000000e+00 -7.33333333e+00 -8.40000000e+00 0.00000000e+00 -6.80000000e+00 -8.40000000e+00 0.00000000e+00 + -8.40000000e+00 -6.80000000e+00 0.00000000e+00 -8.40000000e+00 -7.33333333e+00 0.00000000e+00 -8.40000000e+00 -7.86666667e+00 0.00000000e+00 -8.40000000e+00 -8.40000000e+00 0.00000000e+00 + -8.40000000e+00 -6.80000000e+00 0.00000000e+00 -7.86666667e+00 -6.80000000e+00 0.00000000e+00 -7.33333333e+00 -6.80000000e+00 0.00000000e+00 -6.80000000e+00 -6.80000000e+00 0.00000000e+00 + -8.40000000e+00 -5.20000000e+00 0.00000000e+00 -8.40000000e+00 -5.73333333e+00 0.00000000e+00 -8.40000000e+00 -6.26666667e+00 0.00000000e+00 -8.40000000e+00 -6.80000000e+00 0.00000000e+00 + -8.40000000e+00 -5.20000000e+00 0.00000000e+00 -7.86666667e+00 -5.20000000e+00 0.00000000e+00 -7.33333333e+00 -5.20000000e+00 0.00000000e+00 -6.80000000e+00 -5.20000000e+00 0.00000000e+00 + -8.40000000e+00 -2.00000000e+00 0.00000000e+00 -8.40000000e+00 -2.53333333e+00 0.00000000e+00 -8.40000000e+00 -3.06666667e+00 0.00000000e+00 -8.40000000e+00 -3.60000000e+00 0.00000000e+00 + -6.80000000e+00 -6.80000000e+00 0.00000000e+00 -6.80000000e+00 -7.33333333e+00 0.00000000e+00 -6.80000000e+00 -7.86666667e+00 0.00000000e+00 -6.80000000e+00 -8.40000000e+00 0.00000000e+00 + -6.80000000e+00 -5.20000000e+00 0.00000000e+00 -6.80000000e+00 -5.73333333e+00 0.00000000e+00 -6.80000000e+00 -6.26666667e+00 0.00000000e+00 -6.80000000e+00 -6.80000000e+00 0.00000000e+00 + -6.80000000e+00 -2.00000000e+00 0.00000000e+00 -6.80000000e+00 -2.53333333e+00 0.00000000e+00 -6.80000000e+00 -3.06666667e+00 0.00000000e+00 -6.80000000e+00 -3.60000000e+00 0.00000000e+00 + -5.20000000e+00 -1.00000000e+01 0.00000000e+00 -4.66666667e+00 -1.00000000e+01 0.00000000e+00 -4.13333333e+00 -1.00000000e+01 0.00000000e+00 -3.60000000e+00 -1.00000000e+01 0.00000000e+00 + -5.20000000e+00 -8.40000000e+00 0.00000000e+00 -5.20000000e+00 -8.93333333e+00 0.00000000e+00 -5.20000000e+00 -9.46666667e+00 0.00000000e+00 -5.20000000e+00 -1.00000000e+01 0.00000000e+00 + -5.20000000e+00 -6.80000000e+00 0.00000000e+00 -4.66666667e+00 -6.80000000e+00 0.00000000e+00 -4.13333333e+00 -6.80000000e+00 0.00000000e+00 -3.60000000e+00 -6.80000000e+00 0.00000000e+00 + -5.20000000e+00 -5.20000000e+00 0.00000000e+00 -5.20000000e+00 -5.73333333e+00 0.00000000e+00 -5.20000000e+00 -6.26666667e+00 0.00000000e+00 -5.20000000e+00 -6.80000000e+00 0.00000000e+00 + -5.20000000e+00 -3.60000000e+00 0.00000000e+00 -4.66666667e+00 -3.60000000e+00 0.00000000e+00 -4.13333333e+00 -3.60000000e+00 0.00000000e+00 -3.60000000e+00 -3.60000000e+00 0.00000000e+00 + -3.60000000e+00 -6.80000000e+00 0.00000000e+00 -3.60000000e+00 -7.33333333e+00 0.00000000e+00 -3.60000000e+00 -7.86666667e+00 0.00000000e+00 -3.60000000e+00 -8.40000000e+00 0.00000000e+00 + -3.60000000e+00 -5.20000000e+00 0.00000000e+00 -3.60000000e+00 -5.73333333e+00 0.00000000e+00 -3.60000000e+00 -6.26666667e+00 0.00000000e+00 -3.60000000e+00 -6.80000000e+00 0.00000000e+00 + -3.60000000e+00 -3.60000000e+00 0.00000000e+00 -3.06666667e+00 -3.60000000e+00 0.00000000e+00 -2.53333333e+00 -3.60000000e+00 0.00000000e+00 -2.00000000e+00 -3.60000000e+00 0.00000000e+00 + -3.60000000e+00 -2.00000000e+00 0.00000000e+00 -3.60000000e+00 -2.53333333e+00 0.00000000e+00 -3.60000000e+00 -3.06666667e+00 0.00000000e+00 -3.60000000e+00 -3.60000000e+00 0.00000000e+00 + -8.40000000e+00 -3.60000000e+00 0.00000000e+00 -8.40000000e+00 -4.13333333e+00 0.00000000e+00 -8.40000000e+00 -4.66666667e+00 0.00000000e+00 -8.40000000e+00 -5.20000000e+00 0.00000000e+00 + 0.00000000e+00 -1.00000000e+01 0.00000000e+00 -1.33333333e-01 -1.00000000e+01 0.00000000e+00 -2.66666667e-01 -1.00000000e+01 0.00000000e+00 -4.00000000e-01 -1.00000000e+01 0.00000000e+00 + 0.00000000e+00 -8.40000000e+00 0.00000000e+00 -1.33333333e-01 -8.40000000e+00 0.00000000e+00 -2.66666667e-01 -8.40000000e+00 0.00000000e+00 -4.00000000e-01 -8.40000000e+00 0.00000000e+00 + -4.00000000e-01 -8.40000000e+00 0.00000000e+00 -4.00000000e-01 -8.93333333e+00 0.00000000e+00 -4.00000000e-01 -9.46666667e+00 0.00000000e+00 -4.00000000e-01 -1.00000000e+01 0.00000000e+00 + -4.00000000e-01 -8.40000000e+00 0.00000000e+00 -5.33333333e-01 -8.40000000e+00 0.00000000e+00 -6.66666667e-01 -8.40000000e+00 0.00000000e+00 -8.00000000e-01 -8.40000000e+00 0.00000000e+00 + -4.00000000e-01 -6.80000000e+00 0.00000000e+00 -4.00000000e-01 -7.33333333e+00 0.00000000e+00 -4.00000000e-01 -7.86666667e+00 0.00000000e+00 -4.00000000e-01 -8.40000000e+00 0.00000000e+00 + 3.53553391e-01 -3.53553391e-01 0.00000000e+00 3.77123617e-01 -3.77123617e-01 0.00000000e+00 4.00693843e-01 -4.00693843e-01 0.00000000e+00 4.24264069e-01 -4.24264069e-01 0.00000000e+00 + -4.00000000e-01 -6.80000000e+00 0.00000000e+00 -5.33333333e-01 -6.80000000e+00 0.00000000e+00 -6.66666667e-01 -6.80000000e+00 0.00000000e+00 -8.00000000e-01 -6.80000000e+00 0.00000000e+00 + -6.80000000e+00 -3.60000000e+00 0.00000000e+00 -6.26666667e+00 -3.60000000e+00 0.00000000e+00 -5.73333333e+00 -3.60000000e+00 0.00000000e+00 -5.20000000e+00 -3.60000000e+00 0.00000000e+00 + -4.00000000e-01 -2.00000000e+00 0.00000000e+00 -4.00000000e-01 -2.53333333e+00 0.00000000e+00 -4.00000000e-01 -3.06666667e+00 0.00000000e+00 -4.00000000e-01 -3.60000000e+00 0.00000000e+00 + -8.00000000e-01 -6.80000000e+00 0.00000000e+00 -8.00000000e-01 -7.33333333e+00 0.00000000e+00 -8.00000000e-01 -7.86666667e+00 0.00000000e+00 -8.00000000e-01 -8.40000000e+00 0.00000000e+00 + -8.00000000e-01 -6.80000000e+00 0.00000000e+00 -9.33333333e-01 -6.80000000e+00 0.00000000e+00 -1.06666667e+00 -6.80000000e+00 0.00000000e+00 -1.20000000e+00 -6.80000000e+00 0.00000000e+00 + -8.00000000e-01 -5.20000000e+00 0.00000000e+00 -8.00000000e-01 -5.73333333e+00 0.00000000e+00 -8.00000000e-01 -6.26666667e+00 0.00000000e+00 -8.00000000e-01 -6.80000000e+00 0.00000000e+00 + -8.00000000e-01 -3.60000000e+00 0.00000000e+00 -9.33333333e-01 -3.60000000e+00 0.00000000e+00 -1.06666667e+00 -3.60000000e+00 0.00000000e+00 -1.20000000e+00 -3.60000000e+00 0.00000000e+00 + -1.20000000e+00 -1.00000000e+01 0.00000000e+00 -1.33333333e+00 -1.00000000e+01 0.00000000e+00 -1.46666667e+00 -1.00000000e+01 0.00000000e+00 -1.60000000e+00 -1.00000000e+01 0.00000000e+00 + -1.20000000e+00 -5.20000000e+00 0.00000000e+00 -1.33333333e+00 -5.20000000e+00 0.00000000e+00 -1.46666667e+00 -5.20000000e+00 0.00000000e+00 -1.60000000e+00 -5.20000000e+00 0.00000000e+00 + -2.00000000e+00 -1.00000000e+01 0.00000000e+00 -2.00000000e+00 -9.46666667e+00 0.00000000e+00 -2.00000000e+00 -8.93333333e+00 0.00000000e+00 -2.00000000e+00 -8.40000000e+00 0.00000000e+00 + -1.60000000e+00 -1.00000000e+01 0.00000000e+00 -1.73333333e+00 -1.00000000e+01 0.00000000e+00 -1.86666667e+00 -1.00000000e+01 0.00000000e+00 -2.00000000e+00 -1.00000000e+01 0.00000000e+00 + -1.60000000e+00 -8.40000000e+00 0.00000000e+00 -1.60000000e+00 -8.93333333e+00 0.00000000e+00 -1.60000000e+00 -9.46666667e+00 0.00000000e+00 -1.60000000e+00 -1.00000000e+01 0.00000000e+00 + -1.60000000e+00 -6.80000000e+00 0.00000000e+00 -1.60000000e+00 -7.33333333e+00 0.00000000e+00 -1.60000000e+00 -7.86666667e+00 0.00000000e+00 -1.60000000e+00 -8.40000000e+00 0.00000000e+00 + -2.00000000e+00 -6.80000000e+00 0.00000000e+00 -2.00000000e+00 -6.26666667e+00 0.00000000e+00 -2.00000000e+00 -5.73333333e+00 0.00000000e+00 -2.00000000e+00 -5.20000000e+00 0.00000000e+00 + -1.60000000e+00 -6.80000000e+00 0.00000000e+00 -1.73333333e+00 -6.80000000e+00 0.00000000e+00 -1.86666667e+00 -6.80000000e+00 0.00000000e+00 -2.00000000e+00 -6.80000000e+00 0.00000000e+00 + 1.54508497e-01 -4.75528258e-01 0.00000000e+00 1.29409523e-01 -4.82962913e-01 0.00000000e+00 1.03955845e-01 -4.89073800e-01 0.00000000e+00 7.82172325e-02 -4.93844170e-01 0.00000000e+00 + -1.60000000e+00 -5.20000000e+00 0.00000000e+00 -1.60000000e+00 -5.73333333e+00 0.00000000e+00 -1.60000000e+00 -6.26666667e+00 0.00000000e+00 -1.60000000e+00 -6.80000000e+00 0.00000000e+00 + -1.60000000e+00 -5.20000000e+00 0.00000000e+00 -1.73333333e+00 -5.20000000e+00 0.00000000e+00 -1.86666667e+00 -5.20000000e+00 0.00000000e+00 -2.00000000e+00 -5.20000000e+00 0.00000000e+00 + -1.60000000e+00 -3.60000000e+00 0.00000000e+00 -1.60000000e+00 -4.13333333e+00 0.00000000e+00 -1.60000000e+00 -4.66666667e+00 0.00000000e+00 -1.60000000e+00 -5.20000000e+00 0.00000000e+00 + -2.00000000e+00 -3.60000000e+00 0.00000000e+00 -2.00000000e+00 -3.06666667e+00 0.00000000e+00 -2.00000000e+00 -2.53333333e+00 0.00000000e+00 -2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 2.00000000e+00 -8.40000000e+00 0.00000000e+00 1.86666667e+00 -8.40000000e+00 0.00000000e+00 1.73333333e+00 -8.40000000e+00 0.00000000e+00 1.60000000e+00 -8.40000000e+00 0.00000000e+00 + 2.00000000e+00 -6.80000000e+00 0.00000000e+00 1.86666667e+00 -6.80000000e+00 0.00000000e+00 1.73333333e+00 -6.80000000e+00 0.00000000e+00 1.60000000e+00 -6.80000000e+00 0.00000000e+00 + 2.00000000e+00 -5.20000000e+00 0.00000000e+00 1.86666667e+00 -5.20000000e+00 0.00000000e+00 1.73333333e+00 -5.20000000e+00 0.00000000e+00 1.60000000e+00 -5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -3.60000000e+00 0.00000000e+00 1.86666667e+00 -3.60000000e+00 0.00000000e+00 1.73333333e+00 -3.60000000e+00 0.00000000e+00 1.60000000e+00 -3.60000000e+00 0.00000000e+00 + 1.60000000e+00 -8.40000000e+00 0.00000000e+00 1.46666667e+00 -8.40000000e+00 0.00000000e+00 1.33333333e+00 -8.40000000e+00 0.00000000e+00 1.20000000e+00 -8.40000000e+00 0.00000000e+00 + 1.60000000e+00 -2.00000000e+00 0.00000000e+00 1.60000000e+00 -2.53333333e+00 0.00000000e+00 1.60000000e+00 -3.06666667e+00 0.00000000e+00 1.60000000e+00 -3.60000000e+00 0.00000000e+00 + 1.20000000e+00 -8.40000000e+00 0.00000000e+00 1.20000000e+00 -8.93333333e+00 0.00000000e+00 1.20000000e+00 -9.46666667e+00 0.00000000e+00 1.20000000e+00 -1.00000000e+01 0.00000000e+00 + 1.20000000e+00 -6.80000000e+00 0.00000000e+00 1.06666667e+00 -6.80000000e+00 0.00000000e+00 9.33333333e-01 -6.80000000e+00 0.00000000e+00 8.00000000e-01 -6.80000000e+00 0.00000000e+00 + 1.20000000e+00 -5.20000000e+00 0.00000000e+00 1.06666667e+00 -5.20000000e+00 0.00000000e+00 9.33333333e-01 -5.20000000e+00 0.00000000e+00 8.00000000e-01 -5.20000000e+00 0.00000000e+00 + 1.20000000e+00 -3.60000000e+00 0.00000000e+00 1.20000000e+00 -4.13333333e+00 0.00000000e+00 1.20000000e+00 -4.66666667e+00 0.00000000e+00 1.20000000e+00 -5.20000000e+00 0.00000000e+00 + 1.20000000e+00 -3.60000000e+00 0.00000000e+00 1.06666667e+00 -3.60000000e+00 0.00000000e+00 9.33333333e-01 -3.60000000e+00 0.00000000e+00 8.00000000e-01 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 -1.00000000e+01 0.00000000e+00 6.66666667e-01 -1.00000000e+01 0.00000000e+00 5.33333333e-01 -1.00000000e+01 0.00000000e+00 4.00000000e-01 -1.00000000e+01 0.00000000e+00 + 8.00000000e-01 -8.40000000e+00 0.00000000e+00 8.00000000e-01 -8.93333333e+00 0.00000000e+00 8.00000000e-01 -9.46666667e+00 0.00000000e+00 8.00000000e-01 -1.00000000e+01 0.00000000e+00 + -1.00000000e+01 -2.00000000e+00 0.00000000e+00 -1.00000000e+01 -2.53333333e+00 0.00000000e+00 -1.00000000e+01 -3.06666667e+00 0.00000000e+00 -1.00000000e+01 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 -8.40000000e+00 0.00000000e+00 6.66666667e-01 -8.40000000e+00 0.00000000e+00 5.33333333e-01 -8.40000000e+00 0.00000000e+00 4.00000000e-01 -8.40000000e+00 0.00000000e+00 + 8.00000000e-01 -6.80000000e+00 0.00000000e+00 8.00000000e-01 -7.33333333e+00 0.00000000e+00 8.00000000e-01 -7.86666667e+00 0.00000000e+00 8.00000000e-01 -8.40000000e+00 0.00000000e+00 + 8.00000000e-01 -6.80000000e+00 0.00000000e+00 6.66666667e-01 -6.80000000e+00 0.00000000e+00 5.33333333e-01 -6.80000000e+00 0.00000000e+00 4.00000000e-01 -6.80000000e+00 0.00000000e+00 + 8.00000000e-01 -5.20000000e+00 0.00000000e+00 8.00000000e-01 -5.73333333e+00 0.00000000e+00 8.00000000e-01 -6.26666667e+00 0.00000000e+00 8.00000000e-01 -6.80000000e+00 0.00000000e+00 + 8.00000000e-01 -5.20000000e+00 0.00000000e+00 6.66666667e-01 -5.20000000e+00 0.00000000e+00 5.33333333e-01 -5.20000000e+00 0.00000000e+00 4.00000000e-01 -5.20000000e+00 0.00000000e+00 + 8.00000000e-01 -3.60000000e+00 0.00000000e+00 6.66666667e-01 -3.60000000e+00 0.00000000e+00 5.33333333e-01 -3.60000000e+00 0.00000000e+00 4.00000000e-01 -3.60000000e+00 0.00000000e+00 + 0.00000000e+00 -1.00000000e+01 0.00000000e+00 0.00000000e+00 -9.46666667e+00 0.00000000e+00 0.00000000e+00 -8.93333333e+00 0.00000000e+00 0.00000000e+00 -8.40000000e+00 0.00000000e+00 + 4.00000000e-01 -1.00000000e+01 0.00000000e+00 2.66666667e-01 -1.00000000e+01 0.00000000e+00 1.33333333e-01 -1.00000000e+01 0.00000000e+00 0.00000000e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e-01 -8.40000000e+00 0.00000000e+00 4.00000000e-01 -8.93333333e+00 0.00000000e+00 4.00000000e-01 -9.46666667e+00 0.00000000e+00 4.00000000e-01 -1.00000000e+01 0.00000000e+00 + 0.00000000e+00 -8.40000000e+00 0.00000000e+00 0.00000000e+00 -7.86666667e+00 0.00000000e+00 0.00000000e+00 -7.33333333e+00 0.00000000e+00 0.00000000e+00 -6.80000000e+00 0.00000000e+00 + 0.00000000e+00 -6.80000000e+00 0.00000000e+00 0.00000000e+00 -6.26666667e+00 0.00000000e+00 0.00000000e+00 -5.73333333e+00 0.00000000e+00 0.00000000e+00 -5.20000000e+00 0.00000000e+00 + 4.00000000e-01 -5.20000000e+00 0.00000000e+00 4.00000000e-01 -5.73333333e+00 0.00000000e+00 4.00000000e-01 -6.26666667e+00 0.00000000e+00 4.00000000e-01 -6.80000000e+00 0.00000000e+00 + 0.00000000e+00 -3.60000000e+00 0.00000000e+00 0.00000000e+00 -3.06666667e+00 0.00000000e+00 0.00000000e+00 -2.53333333e+00 0.00000000e+00 0.00000000e+00 -2.00000000e+00 0.00000000e+00 + 4.00000000e-01 -3.60000000e+00 0.00000000e+00 2.66666667e-01 -3.60000000e+00 0.00000000e+00 1.33333333e-01 -3.60000000e+00 0.00000000e+00 0.00000000e+00 -3.60000000e+00 0.00000000e+00 + 4.00000000e-01 -2.00000000e+00 0.00000000e+00 4.00000000e-01 -2.53333333e+00 0.00000000e+00 4.00000000e-01 -3.06666667e+00 0.00000000e+00 4.00000000e-01 -3.60000000e+00 0.00000000e+00 + 4.00000000e+00 -1.00000000e+01 0.00000000e+00 3.77777778e+00 -1.00000000e+01 0.00000000e+00 3.55555556e+00 -1.00000000e+01 0.00000000e+00 3.33333333e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e+00 -6.80000000e+00 0.00000000e+00 3.77777778e+00 -6.80000000e+00 0.00000000e+00 3.55555556e+00 -6.80000000e+00 0.00000000e+00 3.33333333e+00 -6.80000000e+00 0.00000000e+00 + 4.00000000e+00 -5.20000000e+00 0.00000000e+00 3.77777778e+00 -5.20000000e+00 0.00000000e+00 3.55555556e+00 -5.20000000e+00 0.00000000e+00 3.33333333e+00 -5.20000000e+00 0.00000000e+00 + 3.33333333e+00 -6.80000000e+00 0.00000000e+00 3.33333333e+00 -7.33333333e+00 0.00000000e+00 3.33333333e+00 -7.86666667e+00 0.00000000e+00 3.33333333e+00 -8.40000000e+00 0.00000000e+00 + 3.33333333e+00 -6.80000000e+00 0.00000000e+00 3.11111111e+00 -6.80000000e+00 0.00000000e+00 2.88888889e+00 -6.80000000e+00 0.00000000e+00 2.66666667e+00 -6.80000000e+00 0.00000000e+00 + 3.33333333e+00 -5.20000000e+00 0.00000000e+00 3.33333333e+00 -5.73333333e+00 0.00000000e+00 3.33333333e+00 -6.26666667e+00 0.00000000e+00 3.33333333e+00 -6.80000000e+00 0.00000000e+00 + 3.33333333e+00 -3.60000000e+00 0.00000000e+00 3.33333333e+00 -4.13333333e+00 0.00000000e+00 3.33333333e+00 -4.66666667e+00 0.00000000e+00 3.33333333e+00 -5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -8.40000000e+00 0.00000000e+00 2.00000000e+00 -7.86666667e+00 0.00000000e+00 2.00000000e+00 -7.33333333e+00 0.00000000e+00 2.00000000e+00 -6.80000000e+00 0.00000000e+00 + 2.00000000e+00 -5.20000000e+00 0.00000000e+00 2.00000000e+00 -4.66666667e+00 0.00000000e+00 2.00000000e+00 -4.13333333e+00 0.00000000e+00 2.00000000e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+00 -3.60000000e+00 0.00000000e+00 2.00000000e+00 -3.06666667e+00 0.00000000e+00 2.00000000e+00 -2.53333333e+00 0.00000000e+00 2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 2.66666667e+00 -3.60000000e+00 0.00000000e+00 2.44444444e+00 -3.60000000e+00 0.00000000e+00 2.22222222e+00 -3.60000000e+00 0.00000000e+00 2.00000000e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+01 -2.00000000e+00 0.00000000e+00 2.00000000e+01 -2.53333333e+00 0.00000000e+00 2.00000000e+01 -3.06666667e+00 0.00000000e+00 2.00000000e+01 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -2.00000000e+00 0.00000000e+00 1.60679313e+01 -2.53333333e+00 0.00000000e+00 1.60679313e+01 -3.06666667e+00 0.00000000e+00 1.60679313e+01 -3.60000000e+00 0.00000000e+00 + 1.41873685e+01 -2.00000000e+00 0.00000000e+00 1.41873685e+01 -2.53333333e+00 0.00000000e+00 1.41873685e+01 -3.06666667e+00 0.00000000e+00 1.41873685e+01 -3.60000000e+00 0.00000000e+00 + -2.00000000e+00 -5.20000000e+00 0.00000000e+00 -2.00000000e+00 -4.66666667e+00 0.00000000e+00 -2.00000000e+00 -4.13333333e+00 0.00000000e+00 -2.00000000e+00 -3.60000000e+00 0.00000000e+00 + 1.05889687e+01 -2.00000000e+00 0.00000000e+00 1.05889687e+01 -2.53333333e+00 0.00000000e+00 1.05889687e+01 -3.06666667e+00 0.00000000e+00 1.05889687e+01 -3.60000000e+00 0.00000000e+00 + 7.19713168e+00 -2.00000000e+00 0.00000000e+00 7.19713168e+00 -2.53333333e+00 0.00000000e+00 7.19713168e+00 -3.06666667e+00 0.00000000e+00 7.19713168e+00 -3.60000000e+00 0.00000000e+00 + 5.57494171e+00 -2.00000000e+00 0.00000000e+00 5.57494171e+00 -2.53333333e+00 0.00000000e+00 5.57494171e+00 -3.06666667e+00 0.00000000e+00 5.57494171e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+01 -3.60000000e+00 0.00000000e+00 2.00000000e+01 -4.13333333e+00 0.00000000e+00 2.00000000e+01 -4.66666667e+00 0.00000000e+00 2.00000000e+01 -5.20000000e+00 0.00000000e+00 + 1.80049110e+01 -3.60000000e+00 0.00000000e+00 1.86699406e+01 -3.60000000e+00 0.00000000e+00 1.93349703e+01 -3.60000000e+00 0.00000000e+00 2.00000000e+01 -3.60000000e+00 0.00000000e+00 + 1.60000000e+00 -3.60000000e+00 0.00000000e+00 1.46666667e+00 -3.60000000e+00 0.00000000e+00 1.33333333e+00 -3.60000000e+00 0.00000000e+00 1.20000000e+00 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -3.60000000e+00 0.00000000e+00 1.67135912e+01 -3.60000000e+00 0.00000000e+00 1.73592511e+01 -3.60000000e+00 0.00000000e+00 1.80049110e+01 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -3.60000000e+00 0.00000000e+00 1.60679313e+01 -4.13333333e+00 0.00000000e+00 1.60679313e+01 -4.66666667e+00 0.00000000e+00 1.60679313e+01 -5.20000000e+00 0.00000000e+00 + 1.41873685e+01 -3.60000000e+00 0.00000000e+00 1.41873685e+01 -4.13333333e+00 0.00000000e+00 1.41873685e+01 -4.66666667e+00 0.00000000e+00 1.41873685e+01 -5.20000000e+00 0.00000000e+00 + 0.00000000e+00 -5.20000000e+00 0.00000000e+00 -1.33333333e-01 -5.20000000e+00 0.00000000e+00 -2.66666667e-01 -5.20000000e+00 0.00000000e+00 -4.00000000e-01 -5.20000000e+00 0.00000000e+00 + 1.23615794e+01 -3.60000000e+00 0.00000000e+00 1.23615794e+01 -4.13333333e+00 0.00000000e+00 1.23615794e+01 -4.66666667e+00 0.00000000e+00 1.23615794e+01 -5.20000000e+00 0.00000000e+00 + 8.86798734e+00 -3.60000000e+00 0.00000000e+00 9.44164778e+00 -3.60000000e+00 0.00000000e+00 1.00153082e+01 -3.60000000e+00 0.00000000e+00 1.05889687e+01 -3.60000000e+00 0.00000000e+00 + 7.19713168e+00 -3.60000000e+00 0.00000000e+00 7.75408356e+00 -3.60000000e+00 0.00000000e+00 8.31103545e+00 -3.60000000e+00 0.00000000e+00 8.86798734e+00 -3.60000000e+00 0.00000000e+00 + 7.19713168e+00 -3.60000000e+00 0.00000000e+00 7.19713168e+00 -4.13333333e+00 0.00000000e+00 7.19713167e+00 -4.66666667e+00 0.00000000e+00 7.19713167e+00 -5.20000000e+00 0.00000000e+00 + 5.57494171e+00 -3.60000000e+00 0.00000000e+00 6.11567170e+00 -3.60000000e+00 0.00000000e+00 6.65640169e+00 -3.60000000e+00 0.00000000e+00 7.19713168e+00 -3.60000000e+00 0.00000000e+00 + 5.57494171e+00 -3.60000000e+00 0.00000000e+00 5.57494171e+00 -4.13333333e+00 0.00000000e+00 5.57494171e+00 -4.66666667e+00 0.00000000e+00 5.57494171e+00 -5.20000000e+00 0.00000000e+00 + 4.00000000e+00 -3.60000000e+00 0.00000000e+00 4.52498057e+00 -3.60000000e+00 0.00000000e+00 5.04996114e+00 -3.60000000e+00 0.00000000e+00 5.57494171e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+01 -5.20000000e+00 0.00000000e+00 2.00000000e+01 -5.73333333e+00 0.00000000e+00 2.00000000e+01 -6.26666667e+00 0.00000000e+00 2.00000000e+01 -6.80000000e+00 0.00000000e+00 + 1.60679313e+01 -5.20000000e+00 0.00000000e+00 1.67135912e+01 -5.20000000e+00 0.00000000e+00 1.73592511e+01 -5.20000000e+00 0.00000000e+00 1.80049110e+01 -5.20000000e+00 0.00000000e+00 + 1.41873685e+01 -5.20000000e+00 0.00000000e+00 1.41873685e+01 -5.73333333e+00 0.00000000e+00 1.41873685e+01 -6.26666667e+00 0.00000000e+00 1.41873685e+01 -6.80000000e+00 0.00000000e+00 + -3.60000000e+00 -3.60000000e+00 0.00000000e+00 -3.60000000e+00 -4.13333333e+00 0.00000000e+00 -3.60000000e+00 -4.66666667e+00 0.00000000e+00 -3.60000000e+00 -5.20000000e+00 0.00000000e+00 + 1.60679313e+01 -5.20000000e+00 0.00000000e+00 1.60679313e+01 -5.73333333e+00 0.00000000e+00 1.60679313e+01 -6.26666667e+00 0.00000000e+00 1.60679313e+01 -6.80000000e+00 0.00000000e+00 + 1.23615794e+01 -5.20000000e+00 0.00000000e+00 1.29701758e+01 -5.20000000e+00 0.00000000e+00 1.35787722e+01 -5.20000000e+00 0.00000000e+00 1.41873685e+01 -5.20000000e+00 0.00000000e+00 + 1.23615794e+01 -5.20000000e+00 0.00000000e+00 1.23615794e+01 -5.73333333e+00 0.00000000e+00 1.23615794e+01 -6.26666667e+00 0.00000000e+00 1.23615794e+01 -6.80000000e+00 0.00000000e+00 + 2.00000000e+01 -6.80000000e+00 0.00000000e+00 2.00000000e+01 -7.33333333e+00 0.00000000e+00 2.00000000e+01 -7.86666667e+00 0.00000000e+00 2.00000000e+01 -8.40000000e+00 0.00000000e+00 + -6.80000000e+00 -1.00000000e+01 0.00000000e+00 -6.26666667e+00 -1.00000000e+01 0.00000000e+00 -5.73333333e+00 -1.00000000e+01 0.00000000e+00 -5.20000000e+00 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 -6.80000000e+00 0.00000000e+00 1.86699406e+01 -6.80000000e+00 0.00000000e+00 1.93349703e+01 -6.80000000e+00 0.00000000e+00 2.00000000e+01 -6.80000000e+00 0.00000000e+00 + 1.60679313e+01 -6.80000000e+00 0.00000000e+00 1.60679313e+01 -7.33333333e+00 0.00000000e+00 1.60679313e+01 -7.86666667e+00 0.00000000e+00 1.60679313e+01 -8.40000000e+00 0.00000000e+00 + 1.41873685e+01 -6.80000000e+00 0.00000000e+00 1.41873685e+01 -7.33333333e+00 0.00000000e+00 1.41873685e+01 -7.86666667e+00 0.00000000e+00 1.41873685e+01 -8.40000000e+00 0.00000000e+00 + 1.05889687e+01 -6.80000000e+00 0.00000000e+00 1.05889687e+01 -7.33333333e+00 0.00000000e+00 1.05889687e+01 -7.86666667e+00 0.00000000e+00 1.05889687e+01 -8.40000000e+00 0.00000000e+00 + 8.86798734e+00 -6.80000000e+00 0.00000000e+00 9.44164778e+00 -6.80000000e+00 0.00000000e+00 1.00153082e+01 -6.80000000e+00 0.00000000e+00 1.05889687e+01 -6.80000000e+00 0.00000000e+00 + 8.86798734e+00 -6.80000000e+00 0.00000000e+00 8.86798734e+00 -7.33333333e+00 0.00000000e+00 8.86798734e+00 -7.86666667e+00 0.00000000e+00 8.86798734e+00 -8.40000000e+00 0.00000000e+00 + -4.45503262e-01 -2.26995250e-01 0.00000000e+00 -4.75203480e-01 -2.42128267e-01 0.00000000e+00 -5.04903697e-01 -2.57261283e-01 0.00000000e+00 -5.34603915e-01 -2.72394300e-01 0.00000000e+00 + 5.57494171e+00 -6.80000000e+00 0.00000000e+00 6.11567170e+00 -6.80000000e+00 0.00000000e+00 6.65640169e+00 -6.80000000e+00 0.00000000e+00 7.19713167e+00 -6.80000000e+00 0.00000000e+00 + 5.57494171e+00 -6.80000000e+00 0.00000000e+00 5.57494171e+00 -7.33333333e+00 0.00000000e+00 5.57494171e+00 -7.86666667e+00 0.00000000e+00 5.57494171e+00 -8.40000000e+00 0.00000000e+00 + 4.00000000e+00 -6.80000000e+00 0.00000000e+00 4.52498057e+00 -6.80000000e+00 0.00000000e+00 5.04996114e+00 -6.80000000e+00 0.00000000e+00 5.57494171e+00 -6.80000000e+00 0.00000000e+00 + 4.00000000e+00 -8.40000000e+00 0.00000000e+00 4.00000000e+00 -7.86666667e+00 0.00000000e+00 4.00000000e+00 -7.33333333e+00 0.00000000e+00 4.00000000e+00 -6.80000000e+00 0.00000000e+00 + -8.40000000e+00 -8.40000000e+00 0.00000000e+00 -8.40000000e+00 -8.93333333e+00 0.00000000e+00 -8.40000000e+00 -9.46666667e+00 0.00000000e+00 -8.40000000e+00 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 -8.40000000e+00 0.00000000e+00 1.86699406e+01 -8.40000000e+00 0.00000000e+00 1.93349703e+01 -8.40000000e+00 0.00000000e+00 2.00000000e+01 -8.40000000e+00 0.00000000e+00 + 1.80049110e+01 -1.00000000e+01 0.00000000e+00 1.73592511e+01 -1.00000000e+01 0.00000000e+00 1.67135912e+01 -1.00000000e+01 0.00000000e+00 1.60679313e+01 -1.00000000e+01 0.00000000e+00 + 1.60000000e+00 -8.40000000e+00 0.00000000e+00 1.60000000e+00 -8.93333333e+00 0.00000000e+00 1.60000000e+00 -9.46666667e+00 0.00000000e+00 1.60000000e+00 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 -8.40000000e+00 0.00000000e+00 1.80049110e+01 -8.93333333e+00 0.00000000e+00 1.80049110e+01 -9.46666667e+00 0.00000000e+00 1.80049110e+01 -1.00000000e+01 0.00000000e+00 + 1.60679313e+01 -1.00000000e+01 0.00000000e+00 1.54410771e+01 -1.00000000e+01 0.00000000e+00 1.48142228e+01 -1.00000000e+01 0.00000000e+00 1.41873685e+01 -1.00000000e+01 0.00000000e+00 + 1.60679313e+01 -8.40000000e+00 0.00000000e+00 1.60679313e+01 -8.93333333e+00 0.00000000e+00 1.60679313e+01 -9.46666667e+00 0.00000000e+00 1.60679313e+01 -1.00000000e+01 0.00000000e+00 + 1.41873685e+01 -1.00000000e+01 0.00000000e+00 1.35787722e+01 -1.00000000e+01 0.00000000e+00 1.29701758e+01 -1.00000000e+01 0.00000000e+00 1.23615794e+01 -1.00000000e+01 0.00000000e+00 + 1.41873685e+01 -8.40000000e+00 0.00000000e+00 1.41873685e+01 -8.93333333e+00 0.00000000e+00 1.41873685e+01 -9.46666667e+00 0.00000000e+00 1.41873685e+01 -1.00000000e+01 0.00000000e+00 + 2.66666667e+00 -3.60000000e+00 0.00000000e+00 2.66666667e+00 -4.13333333e+00 0.00000000e+00 2.66666667e+00 -4.66666667e+00 0.00000000e+00 2.66666667e+00 -5.20000000e+00 0.00000000e+00 + 1.23615794e+01 -8.40000000e+00 0.00000000e+00 1.23615794e+01 -8.93333333e+00 0.00000000e+00 1.23615794e+01 -9.46666667e+00 0.00000000e+00 1.23615794e+01 -1.00000000e+01 0.00000000e+00 + 1.05889687e+01 -8.40000000e+00 0.00000000e+00 1.11798389e+01 -8.40000000e+00 0.00000000e+00 1.17707092e+01 -8.40000000e+00 0.00000000e+00 1.23615794e+01 -8.40000000e+00 0.00000000e+00 + 8.86798734e+00 -8.40000000e+00 0.00000000e+00 8.86798734e+00 -8.93333333e+00 0.00000000e+00 8.86798734e+00 -9.46666667e+00 0.00000000e+00 8.86798734e+00 -1.00000000e+01 0.00000000e+00 + 7.19713167e+00 -8.40000000e+00 0.00000000e+00 7.75408356e+00 -8.40000000e+00 0.00000000e+00 8.31103545e+00 -8.40000000e+00 0.00000000e+00 8.86798734e+00 -8.40000000e+00 0.00000000e+00 + -1.20000000e+00 -6.80000000e+00 0.00000000e+00 -1.33333333e+00 -6.80000000e+00 0.00000000e+00 -1.46666667e+00 -6.80000000e+00 0.00000000e+00 -1.60000000e+00 -6.80000000e+00 0.00000000e+00 + 7.19713167e+00 -1.00000000e+01 0.00000000e+00 6.65640169e+00 -1.00000000e+01 0.00000000e+00 6.11567170e+00 -1.00000000e+01 0.00000000e+00 5.57494171e+00 -1.00000000e+01 0.00000000e+00 + 5.57494171e+00 -1.00000000e+01 0.00000000e+00 5.04996114e+00 -1.00000000e+01 0.00000000e+00 4.52498057e+00 -1.00000000e+01 0.00000000e+00 4.00000000e+00 -1.00000000e+01 0.00000000e+00 + 5.57494171e+00 -8.40000000e+00 0.00000000e+00 5.57494171e+00 -8.93333333e+00 0.00000000e+00 5.57494171e+00 -9.46666667e+00 0.00000000e+00 5.57494171e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e+00 -8.40000000e+00 0.00000000e+00 4.52498057e+00 -8.40000000e+00 0.00000000e+00 5.04996114e+00 -8.40000000e+00 0.00000000e+00 5.57494171e+00 -8.40000000e+00 0.00000000e+00 + 4.00000000e+00 -1.00000000e+01 0.00000000e+00 4.00000000e+00 -9.46666667e+00 0.00000000e+00 4.00000000e+00 -8.93333333e+00 0.00000000e+00 4.00000000e+00 -8.40000000e+00 0.00000000e+00 + 2.00000000e+01 -2.00000000e+00 0.00000000e+00 1.93349703e+01 -2.00000000e+00 0.00000000e+00 1.86699406e+01 -2.00000000e+00 0.00000000e+00 1.80049110e+01 -2.00000000e+00 0.00000000e+00 + 2.00000000e+01 -1.60000000e+00 0.00000000e+00 2.00000000e+01 -1.73333333e+00 0.00000000e+00 2.00000000e+01 -1.86666667e+00 0.00000000e+00 2.00000000e+01 -2.00000000e+00 0.00000000e+00 + -1.60000000e+00 -8.40000000e+00 0.00000000e+00 -1.73333333e+00 -8.40000000e+00 0.00000000e+00 -1.86666667e+00 -8.40000000e+00 0.00000000e+00 -2.00000000e+00 -8.40000000e+00 0.00000000e+00 + 2.00000000e+01 -1.60000000e+00 0.00000000e+00 1.93349703e+01 -1.60000000e+00 0.00000000e+00 1.86699406e+01 -1.60000000e+00 0.00000000e+00 1.80049110e+01 -1.60000000e+00 0.00000000e+00 + 1.80049110e+01 -1.20000000e+00 0.00000000e+00 1.80049110e+01 -1.33333333e+00 0.00000000e+00 1.80049110e+01 -1.46666667e+00 0.00000000e+00 1.80049110e+01 -1.60000000e+00 0.00000000e+00 + -4.00000000e-01 -1.00000000e+01 0.00000000e+00 -5.33333333e-01 -1.00000000e+01 0.00000000e+00 -6.66666667e-01 -1.00000000e+01 0.00000000e+00 -8.00000000e-01 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 -1.20000000e+00 0.00000000e+00 1.73592511e+01 -1.20000000e+00 0.00000000e+00 1.67135912e+01 -1.20000000e+00 0.00000000e+00 1.60679313e+01 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 -8.00000000e-01 0.00000000e+00 1.80049110e+01 -9.33333333e-01 0.00000000e+00 1.80049110e+01 -1.06666667e+00 0.00000000e+00 1.80049110e+01 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 -8.00000000e-01 0.00000000e+00 1.73592511e+01 -8.00000000e-01 0.00000000e+00 1.67135912e+01 -8.00000000e-01 0.00000000e+00 1.60679313e+01 -8.00000000e-01 0.00000000e+00 + 1.80049110e+01 -4.00000000e-01 0.00000000e+00 1.80049110e+01 -5.33333333e-01 0.00000000e+00 1.80049110e+01 -6.66666667e-01 0.00000000e+00 1.80049110e+01 -8.00000000e-01 0.00000000e+00 + 1.60679313e+01 -2.00000000e+00 0.00000000e+00 1.54410771e+01 -2.00000000e+00 0.00000000e+00 1.48142228e+01 -2.00000000e+00 0.00000000e+00 1.41873685e+01 -2.00000000e+00 0.00000000e+00 + 4.93844170e-01 -7.82172325e-02 0.00000000e+00 4.89073800e-01 -1.03955845e-01 0.00000000e+00 4.82962913e-01 -1.29409523e-01 0.00000000e+00 4.75528258e-01 -1.54508497e-01 0.00000000e+00 + 1.60679313e+01 -1.60000000e+00 0.00000000e+00 1.54410771e+01 -1.60000000e+00 0.00000000e+00 1.48142228e+01 -1.60000000e+00 0.00000000e+00 1.41873685e+01 -1.60000000e+00 0.00000000e+00 + 1.60679313e+01 -1.20000000e+00 0.00000000e+00 1.60679313e+01 -1.33333333e+00 0.00000000e+00 1.60679313e+01 -1.46666667e+00 0.00000000e+00 1.60679313e+01 -1.60000000e+00 0.00000000e+00 + 1.60679313e+01 -1.20000000e+00 0.00000000e+00 1.54410771e+01 -1.20000000e+00 0.00000000e+00 1.48142228e+01 -1.20000000e+00 0.00000000e+00 1.41873685e+01 -1.20000000e+00 0.00000000e+00 + -1.54508497e-01 4.75528258e-01 0.00000000e+00 -1.79183975e-01 4.66790213e-01 0.00000000e+00 -2.03368322e-01 4.56772729e-01 0.00000000e+00 -2.26995250e-01 4.45503262e-01 0.00000000e+00 + 1.60679313e+01 -8.00000000e-01 0.00000000e+00 1.60679313e+01 -9.33333333e-01 0.00000000e+00 1.60679313e+01 -1.06666667e+00 0.00000000e+00 1.60679313e+01 -1.20000000e+00 0.00000000e+00 + 1.60679313e+01 -8.00000000e-01 0.00000000e+00 1.54410771e+01 -8.00000000e-01 0.00000000e+00 1.48142228e+01 -8.00000000e-01 0.00000000e+00 1.41873685e+01 -8.00000000e-01 0.00000000e+00 + 1.60679313e+01 -4.00000000e-01 0.00000000e+00 1.60679313e+01 -5.33333333e-01 0.00000000e+00 1.60679313e+01 -6.66666667e-01 0.00000000e+00 1.60679313e+01 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 -2.00000000e+00 0.00000000e+00 1.23615794e+01 -2.53333333e+00 0.00000000e+00 1.23615794e+01 -3.06666667e+00 0.00000000e+00 1.23615794e+01 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -4.00000000e-01 0.00000000e+00 1.54410771e+01 -4.00000000e-01 0.00000000e+00 1.48142228e+01 -4.00000000e-01 0.00000000e+00 1.41873685e+01 -4.00000000e-01 0.00000000e+00 + 1.60679313e+01 0.00000000e+00 0.00000000e+00 1.60679313e+01 -1.33333333e-01 0.00000000e+00 1.60679313e+01 -2.66666667e-01 0.00000000e+00 1.60679313e+01 -4.00000000e-01 0.00000000e+00 + 1.41873685e+01 -1.60000000e+00 0.00000000e+00 1.41873685e+01 -1.73333333e+00 0.00000000e+00 1.41873685e+01 -1.86666667e+00 0.00000000e+00 1.41873685e+01 -2.00000000e+00 0.00000000e+00 + 7.82172325e-02 4.93844170e-01 0.00000000e+00 1.03955845e-01 4.89073800e-01 0.00000000e+00 1.29409523e-01 4.82962913e-01 0.00000000e+00 1.54508497e-01 4.75528258e-01 0.00000000e+00 + 1.41873685e+01 -1.20000000e+00 0.00000000e+00 1.41873685e+01 -1.33333333e+00 0.00000000e+00 1.41873685e+01 -1.46666667e+00 0.00000000e+00 1.41873685e+01 -1.60000000e+00 0.00000000e+00 + 1.41873685e+01 -8.00000000e-01 0.00000000e+00 1.41873685e+01 -9.33333333e-01 0.00000000e+00 1.41873685e+01 -1.06666667e+00 0.00000000e+00 1.41873685e+01 -1.20000000e+00 0.00000000e+00 + 1.41873685e+01 -4.00000000e-01 0.00000000e+00 1.35787722e+01 -4.00000000e-01 0.00000000e+00 1.29701758e+01 -4.00000000e-01 0.00000000e+00 1.23615794e+01 -4.00000000e-01 0.00000000e+00 + 1.60679313e+01 -8.40000000e+00 0.00000000e+00 1.67135912e+01 -8.40000000e+00 0.00000000e+00 1.73592511e+01 -8.40000000e+00 0.00000000e+00 1.80049110e+01 -8.40000000e+00 0.00000000e+00 + 1.23615794e+01 -2.00000000e+00 0.00000000e+00 1.17707092e+01 -2.00000000e+00 0.00000000e+00 1.11798389e+01 -2.00000000e+00 0.00000000e+00 1.05889687e+01 -2.00000000e+00 0.00000000e+00 + 1.23615794e+01 -1.60000000e+00 0.00000000e+00 1.23615794e+01 -1.73333333e+00 0.00000000e+00 1.23615794e+01 -1.86666667e+00 0.00000000e+00 1.23615794e+01 -2.00000000e+00 0.00000000e+00 + 1.23615794e+01 -1.60000000e+00 0.00000000e+00 1.17707092e+01 -1.60000000e+00 0.00000000e+00 1.11798389e+01 -1.60000000e+00 0.00000000e+00 1.05889687e+01 -1.60000000e+00 0.00000000e+00 + -3.53553391e-01 3.53553391e-01 0.00000000e+00 -3.71572413e-01 3.34565303e-01 0.00000000e+00 -3.88572981e-01 3.14660196e-01 0.00000000e+00 -4.04508497e-01 2.93892626e-01 0.00000000e+00 + 1.23615794e+01 -1.20000000e+00 0.00000000e+00 1.23615794e+01 -1.33333333e+00 0.00000000e+00 1.23615794e+01 -1.46666667e+00 0.00000000e+00 1.23615794e+01 -1.60000000e+00 0.00000000e+00 + 1.23615794e+01 -1.20000000e+00 0.00000000e+00 1.17707092e+01 -1.20000000e+00 0.00000000e+00 1.11798389e+01 -1.20000000e+00 0.00000000e+00 1.05889687e+01 -1.20000000e+00 0.00000000e+00 + 3.33333333e+00 -8.40000000e+00 0.00000000e+00 3.33333333e+00 -8.93333333e+00 0.00000000e+00 3.33333333e+00 -9.46666667e+00 0.00000000e+00 3.33333333e+00 -1.00000000e+01 0.00000000e+00 + 1.23615794e+01 -8.00000000e-01 0.00000000e+00 1.17707092e+01 -8.00000000e-01 0.00000000e+00 1.11798389e+01 -8.00000000e-01 0.00000000e+00 1.05889687e+01 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 -4.00000000e-01 0.00000000e+00 1.23615794e+01 -5.33333333e-01 0.00000000e+00 1.23615794e+01 -6.66666667e-01 0.00000000e+00 1.23615794e+01 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 -4.00000000e-01 0.00000000e+00 1.17707092e+01 -4.00000000e-01 0.00000000e+00 1.11798389e+01 -4.00000000e-01 0.00000000e+00 1.05889687e+01 -4.00000000e-01 0.00000000e+00 + 1.05889687e+01 -2.00000000e+00 0.00000000e+00 1.00153082e+01 -2.00000000e+00 0.00000000e+00 9.44164778e+00 -2.00000000e+00 0.00000000e+00 8.86798734e+00 -2.00000000e+00 0.00000000e+00 + 1.05889687e+01 -1.60000000e+00 0.00000000e+00 1.05889687e+01 -1.73333333e+00 0.00000000e+00 1.05889687e+01 -1.86666667e+00 0.00000000e+00 1.05889687e+01 -2.00000000e+00 0.00000000e+00 + 1.05889687e+01 -1.60000000e+00 0.00000000e+00 1.00153082e+01 -1.60000000e+00 0.00000000e+00 9.44164778e+00 -1.60000000e+00 0.00000000e+00 8.86798734e+00 -1.60000000e+00 0.00000000e+00 + 1.05889687e+01 -1.20000000e+00 0.00000000e+00 1.00153082e+01 -1.20000000e+00 0.00000000e+00 9.44164778e+00 -1.20000000e+00 0.00000000e+00 8.86798734e+00 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 -3.60000000e+00 0.00000000e+00 1.80049110e+01 -4.13333333e+00 0.00000000e+00 1.80049110e+01 -4.66666667e+00 0.00000000e+00 1.80049110e+01 -5.20000000e+00 0.00000000e+00 + 1.05889687e+01 -8.00000000e-01 0.00000000e+00 1.00153082e+01 -8.00000000e-01 0.00000000e+00 9.44164778e+00 -8.00000000e-01 0.00000000e+00 8.86798734e+00 -8.00000000e-01 0.00000000e+00 + 1.05889687e+01 -4.00000000e-01 0.00000000e+00 1.05889687e+01 -5.33333333e-01 0.00000000e+00 1.05889687e+01 -6.66666667e-01 0.00000000e+00 1.05889687e+01 -8.00000000e-01 0.00000000e+00 + 1.05889687e+01 -4.00000000e-01 0.00000000e+00 1.00153082e+01 -4.00000000e-01 0.00000000e+00 9.44164778e+00 -4.00000000e-01 0.00000000e+00 8.86798734e+00 -4.00000000e-01 0.00000000e+00 + 1.05889687e+01 -5.20000000e+00 0.00000000e+00 1.11798389e+01 -5.20000000e+00 0.00000000e+00 1.17707092e+01 -5.20000000e+00 0.00000000e+00 1.23615794e+01 -5.20000000e+00 0.00000000e+00 + 1.05889687e+01 0.00000000e+00 0.00000000e+00 1.05889687e+01 -1.33333333e-01 0.00000000e+00 1.05889687e+01 -2.66666667e-01 0.00000000e+00 1.05889687e+01 -4.00000000e-01 0.00000000e+00 + -8.00000000e-01 -8.40000000e+00 0.00000000e+00 -9.33333333e-01 -8.40000000e+00 0.00000000e+00 -1.06666667e+00 -8.40000000e+00 0.00000000e+00 -1.20000000e+00 -8.40000000e+00 0.00000000e+00 + 8.86798734e+00 -1.60000000e+00 0.00000000e+00 8.31103545e+00 -1.60000000e+00 0.00000000e+00 7.75408356e+00 -1.60000000e+00 0.00000000e+00 7.19713168e+00 -1.60000000e+00 0.00000000e+00 + 8.86798734e+00 -2.00000000e+00 0.00000000e+00 8.86798734e+00 -2.53333333e+00 0.00000000e+00 8.86798734e+00 -3.06666667e+00 0.00000000e+00 8.86798734e+00 -3.60000000e+00 0.00000000e+00 + 8.86798734e+00 -1.20000000e+00 0.00000000e+00 8.31103545e+00 -1.20000000e+00 0.00000000e+00 7.75408356e+00 -1.20000000e+00 0.00000000e+00 7.19713168e+00 -1.20000000e+00 0.00000000e+00 + 8.86798734e+00 -8.00000000e-01 0.00000000e+00 8.86798734e+00 -9.33333333e-01 0.00000000e+00 8.86798734e+00 -1.06666667e+00 0.00000000e+00 8.86798734e+00 -1.20000000e+00 0.00000000e+00 + 8.86798734e+00 -8.00000000e-01 0.00000000e+00 8.31103545e+00 -8.00000000e-01 0.00000000e+00 7.75408356e+00 -8.00000000e-01 0.00000000e+00 7.19713168e+00 -8.00000000e-01 0.00000000e+00 + 8.86798734e+00 -4.00000000e-01 0.00000000e+00 8.86798734e+00 -5.33333333e-01 0.00000000e+00 8.86798734e+00 -6.66666667e-01 0.00000000e+00 8.86798734e+00 -8.00000000e-01 0.00000000e+00 + 8.86798734e+00 -4.00000000e-01 0.00000000e+00 8.31103545e+00 -4.00000000e-01 0.00000000e+00 7.75408356e+00 -4.00000000e-01 0.00000000e+00 7.19713168e+00 -4.00000000e-01 0.00000000e+00 + 7.19713168e+00 -2.00000000e+00 0.00000000e+00 6.65640169e+00 -2.00000000e+00 0.00000000e+00 6.11567170e+00 -2.00000000e+00 0.00000000e+00 5.57494171e+00 -2.00000000e+00 0.00000000e+00 + 7.19713168e+00 -1.60000000e+00 0.00000000e+00 7.19713168e+00 -1.73333333e+00 0.00000000e+00 7.19713168e+00 -1.86666667e+00 0.00000000e+00 7.19713168e+00 -2.00000000e+00 0.00000000e+00 + 7.19713168e+00 -1.20000000e+00 0.00000000e+00 7.19713168e+00 -1.33333333e+00 0.00000000e+00 7.19713168e+00 -1.46666667e+00 0.00000000e+00 7.19713168e+00 -1.60000000e+00 0.00000000e+00 + 7.19713168e+00 -8.00000000e-01 0.00000000e+00 7.19713168e+00 -9.33333333e-01 0.00000000e+00 7.19713168e+00 -1.06666667e+00 0.00000000e+00 7.19713168e+00 -1.20000000e+00 0.00000000e+00 + 7.19713168e+00 -4.00000000e-01 0.00000000e+00 7.19713168e+00 -5.33333333e-01 0.00000000e+00 7.19713168e+00 -6.66666667e-01 0.00000000e+00 7.19713168e+00 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 -1.00000000e+01 0.00000000e+00 1.17707092e+01 -1.00000000e+01 0.00000000e+00 1.11798389e+01 -1.00000000e+01 0.00000000e+00 1.05889687e+01 -1.00000000e+01 0.00000000e+00 + 7.19713168e+00 -4.00000000e-01 0.00000000e+00 6.65640169e+00 -4.00000000e-01 0.00000000e+00 6.11567170e+00 -4.00000000e-01 0.00000000e+00 5.57494171e+00 -4.00000000e-01 0.00000000e+00 + 7.19713168e+00 0.00000000e+00 0.00000000e+00 7.19713168e+00 -1.33333333e-01 0.00000000e+00 7.19713168e+00 -2.66666667e-01 0.00000000e+00 7.19713168e+00 -4.00000000e-01 0.00000000e+00 + 5.57494171e+00 -2.00000000e+00 0.00000000e+00 5.04996114e+00 -2.00000000e+00 0.00000000e+00 4.52498057e+00 -2.00000000e+00 0.00000000e+00 4.00000000e+00 -2.00000000e+00 0.00000000e+00 + 5.57494171e+00 -1.60000000e+00 0.00000000e+00 5.04996114e+00 -1.60000000e+00 0.00000000e+00 4.52498057e+00 -1.60000000e+00 0.00000000e+00 4.00000000e+00 -1.60000000e+00 0.00000000e+00 + 5.57494171e+00 -1.20000000e+00 0.00000000e+00 5.04996114e+00 -1.20000000e+00 0.00000000e+00 4.52498057e+00 -1.20000000e+00 0.00000000e+00 4.00000000e+00 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 -5.20000000e+00 0.00000000e+00 1.80049110e+01 -5.73333333e+00 0.00000000e+00 1.80049110e+01 -6.26666667e+00 0.00000000e+00 1.80049110e+01 -6.80000000e+00 0.00000000e+00 + 5.57494171e+00 -8.00000000e-01 0.00000000e+00 5.57494171e+00 -9.33333333e-01 0.00000000e+00 5.57494171e+00 -1.06666667e+00 0.00000000e+00 5.57494171e+00 -1.20000000e+00 0.00000000e+00 + 5.57494171e+00 -8.00000000e-01 0.00000000e+00 5.04996114e+00 -8.00000000e-01 0.00000000e+00 4.52498057e+00 -8.00000000e-01 0.00000000e+00 4.00000000e+00 -8.00000000e-01 0.00000000e+00 + -6.80000000e+00 -8.40000000e+00 0.00000000e+00 -6.80000000e+00 -8.93333333e+00 0.00000000e+00 -6.80000000e+00 -9.46666667e+00 0.00000000e+00 -6.80000000e+00 -1.00000000e+01 0.00000000e+00 + 5.57494171e+00 0.00000000e+00 0.00000000e+00 5.57494171e+00 -1.33333333e-01 0.00000000e+00 5.57494171e+00 -2.66666667e-01 0.00000000e+00 5.57494171e+00 -4.00000000e-01 0.00000000e+00 + 1.80049110e+01 2.00000000e+00 0.00000000e+00 1.80049110e+01 1.86666667e+00 0.00000000e+00 1.80049110e+01 1.73333333e+00 0.00000000e+00 1.80049110e+01 1.60000000e+00 0.00000000e+00 + 1.41873685e+01 2.00000000e+00 0.00000000e+00 1.41873685e+01 1.86666667e+00 0.00000000e+00 1.41873685e+01 1.73333333e+00 0.00000000e+00 1.41873685e+01 1.60000000e+00 0.00000000e+00 + 1.23615794e+01 2.00000000e+00 0.00000000e+00 1.23615794e+01 1.86666667e+00 0.00000000e+00 1.23615794e+01 1.73333333e+00 0.00000000e+00 1.23615794e+01 1.60000000e+00 0.00000000e+00 + 1.05889687e+01 -8.00000000e-01 0.00000000e+00 1.05889687e+01 -9.33333333e-01 0.00000000e+00 1.05889687e+01 -1.06666667e+00 0.00000000e+00 1.05889687e+01 -1.20000000e+00 0.00000000e+00 + 1.05889687e+01 2.00000000e+00 0.00000000e+00 1.05889687e+01 1.86666667e+00 0.00000000e+00 1.05889687e+01 1.73333333e+00 0.00000000e+00 1.05889687e+01 1.60000000e+00 0.00000000e+00 + -8.00000000e-01 -5.20000000e+00 0.00000000e+00 -9.33333333e-01 -5.20000000e+00 0.00000000e+00 -1.06666667e+00 -5.20000000e+00 0.00000000e+00 -1.20000000e+00 -5.20000000e+00 0.00000000e+00 + 8.86798734e+00 2.00000000e+00 0.00000000e+00 8.86798734e+00 1.86666667e+00 0.00000000e+00 8.86798734e+00 1.73333333e+00 0.00000000e+00 8.86798734e+00 1.60000000e+00 0.00000000e+00 + 2.00000000e+01 1.60000000e+00 0.00000000e+00 2.00000000e+01 1.46666667e+00 0.00000000e+00 2.00000000e+01 1.33333333e+00 0.00000000e+00 2.00000000e+01 1.20000000e+00 0.00000000e+00 + 1.60679313e+01 1.60000000e+00 0.00000000e+00 1.60679313e+01 1.46666667e+00 0.00000000e+00 1.60679313e+01 1.33333333e+00 0.00000000e+00 1.60679313e+01 1.20000000e+00 0.00000000e+00 + 1.23615794e+01 1.60000000e+00 0.00000000e+00 1.29701758e+01 1.60000000e+00 0.00000000e+00 1.35787722e+01 1.60000000e+00 0.00000000e+00 1.41873685e+01 1.60000000e+00 0.00000000e+00 + 1.05889687e+01 1.60000000e+00 0.00000000e+00 1.11798389e+01 1.60000000e+00 0.00000000e+00 1.17707092e+01 1.60000000e+00 0.00000000e+00 1.23615794e+01 1.60000000e+00 0.00000000e+00 + 1.05889687e+01 1.60000000e+00 0.00000000e+00 1.05889687e+01 1.46666667e+00 0.00000000e+00 1.05889687e+01 1.33333333e+00 0.00000000e+00 1.05889687e+01 1.20000000e+00 0.00000000e+00 + 7.19713168e+00 1.60000000e+00 0.00000000e+00 7.19713168e+00 1.46666667e+00 0.00000000e+00 7.19713168e+00 1.33333333e+00 0.00000000e+00 7.19713168e+00 1.20000000e+00 0.00000000e+00 + 5.57494171e+00 1.60000000e+00 0.00000000e+00 5.57494171e+00 1.46666667e+00 0.00000000e+00 5.57494171e+00 1.33333333e+00 0.00000000e+00 5.57494171e+00 1.20000000e+00 0.00000000e+00 + 4.00000000e+00 1.60000000e+00 0.00000000e+00 4.52498057e+00 1.60000000e+00 0.00000000e+00 5.04996114e+00 1.60000000e+00 0.00000000e+00 5.57494171e+00 1.60000000e+00 0.00000000e+00 + 2.00000000e+01 1.20000000e+00 0.00000000e+00 2.00000000e+01 1.06666667e+00 0.00000000e+00 2.00000000e+01 9.33333333e-01 0.00000000e+00 2.00000000e+01 8.00000000e-01 0.00000000e+00 + 1.60679313e+01 1.20000000e+00 0.00000000e+00 1.67135912e+01 1.20000000e+00 0.00000000e+00 1.73592511e+01 1.20000000e+00 0.00000000e+00 1.80049110e+01 1.20000000e+00 0.00000000e+00 + 1.60679313e+01 1.20000000e+00 0.00000000e+00 1.60679313e+01 1.06666667e+00 0.00000000e+00 1.60679313e+01 9.33333333e-01 0.00000000e+00 1.60679313e+01 8.00000000e-01 0.00000000e+00 + 5.00000000e-01 0.00000000e+00 0.00000000e+00 4.99314767e-01 -2.61679781e-02 0.00000000e+00 4.97260948e-01 -5.22642316e-02 0.00000000e+00 4.93844170e-01 -7.82172325e-02 0.00000000e+00 + 1.41873685e+01 1.20000000e+00 0.00000000e+00 1.41873685e+01 1.06666667e+00 0.00000000e+00 1.41873685e+01 9.33333333e-01 0.00000000e+00 1.41873685e+01 8.00000000e-01 0.00000000e+00 + 1.23615794e+01 1.20000000e+00 0.00000000e+00 1.29701758e+01 1.20000000e+00 0.00000000e+00 1.35787722e+01 1.20000000e+00 0.00000000e+00 1.41873685e+01 1.20000000e+00 0.00000000e+00 + 1.23615794e+01 1.20000000e+00 0.00000000e+00 1.23615794e+01 1.06666667e+00 0.00000000e+00 1.23615794e+01 9.33333333e-01 0.00000000e+00 1.23615794e+01 8.00000000e-01 0.00000000e+00 + 1.05889687e+01 1.20000000e+00 0.00000000e+00 1.11798389e+01 1.20000000e+00 0.00000000e+00 1.17707092e+01 1.20000000e+00 0.00000000e+00 1.23615794e+01 1.20000000e+00 0.00000000e+00 + 1.05889687e+01 1.20000000e+00 0.00000000e+00 1.05889687e+01 1.06666667e+00 0.00000000e+00 1.05889687e+01 9.33333333e-01 0.00000000e+00 1.05889687e+01 8.00000000e-01 0.00000000e+00 + 8.86798734e+00 1.20000000e+00 0.00000000e+00 9.44164778e+00 1.20000000e+00 0.00000000e+00 1.00153082e+01 1.20000000e+00 0.00000000e+00 1.05889687e+01 1.20000000e+00 0.00000000e+00 + 8.86798734e+00 1.20000000e+00 0.00000000e+00 8.86798734e+00 1.06666667e+00 0.00000000e+00 8.86798734e+00 9.33333333e-01 0.00000000e+00 8.86798734e+00 8.00000000e-01 0.00000000e+00 + 1.20000000e+00 -2.00000000e+00 0.00000000e+00 1.20000000e+00 -2.53333333e+00 0.00000000e+00 1.20000000e+00 -3.06666667e+00 0.00000000e+00 1.20000000e+00 -3.60000000e+00 0.00000000e+00 + 7.19713168e+00 1.20000000e+00 0.00000000e+00 7.19713168e+00 1.06666667e+00 0.00000000e+00 7.19713168e+00 9.33333333e-01 0.00000000e+00 7.19713168e+00 8.00000000e-01 0.00000000e+00 + 1.05889687e+01 -5.20000000e+00 0.00000000e+00 1.05889687e+01 -5.73333333e+00 0.00000000e+00 1.05889687e+01 -6.26666667e+00 0.00000000e+00 1.05889687e+01 -6.80000000e+00 0.00000000e+00 + 5.57494171e+00 1.20000000e+00 0.00000000e+00 6.11567170e+00 1.20000000e+00 0.00000000e+00 6.65640169e+00 1.20000000e+00 0.00000000e+00 7.19713168e+00 1.20000000e+00 0.00000000e+00 + 4.00000000e+00 1.20000000e+00 0.00000000e+00 4.52498057e+00 1.20000000e+00 0.00000000e+00 5.04996114e+00 1.20000000e+00 0.00000000e+00 5.57494171e+00 1.20000000e+00 0.00000000e+00 + 7.19713167e+00 -8.40000000e+00 0.00000000e+00 7.19713167e+00 -8.93333333e+00 0.00000000e+00 7.19713167e+00 -9.46666667e+00 0.00000000e+00 7.19713167e+00 -1.00000000e+01 0.00000000e+00 + 7.19713168e+00 2.00000000e+00 0.00000000e+00 7.19713168e+00 1.86666667e+00 0.00000000e+00 7.19713168e+00 1.73333333e+00 0.00000000e+00 7.19713168e+00 1.60000000e+00 0.00000000e+00 + 1.80049110e+01 8.00000000e-01 0.00000000e+00 1.80049110e+01 6.66666667e-01 0.00000000e+00 1.80049110e+01 5.33333333e-01 0.00000000e+00 1.80049110e+01 4.00000000e-01 0.00000000e+00 + 1.60679313e+01 8.00000000e-01 0.00000000e+00 1.67135912e+01 8.00000000e-01 0.00000000e+00 1.73592511e+01 8.00000000e-01 0.00000000e+00 1.80049110e+01 8.00000000e-01 0.00000000e+00 + 1.60679313e+01 8.00000000e-01 0.00000000e+00 1.60679313e+01 6.66666667e-01 0.00000000e+00 1.60679313e+01 5.33333333e-01 0.00000000e+00 1.60679313e+01 4.00000000e-01 0.00000000e+00 + 1.41873685e+01 8.00000000e-01 0.00000000e+00 1.48142228e+01 8.00000000e-01 0.00000000e+00 1.54410771e+01 8.00000000e-01 0.00000000e+00 1.60679313e+01 8.00000000e-01 0.00000000e+00 + 1.41873685e+01 8.00000000e-01 0.00000000e+00 1.41873685e+01 6.66666667e-01 0.00000000e+00 1.41873685e+01 5.33333333e-01 0.00000000e+00 1.41873685e+01 4.00000000e-01 0.00000000e+00 + 1.23615794e+01 8.00000000e-01 0.00000000e+00 1.23615794e+01 6.66666667e-01 0.00000000e+00 1.23615794e+01 5.33333333e-01 0.00000000e+00 1.23615794e+01 4.00000000e-01 0.00000000e+00 + 8.86798734e+00 8.00000000e-01 0.00000000e+00 8.86798734e+00 6.66666667e-01 0.00000000e+00 8.86798734e+00 5.33333333e-01 0.00000000e+00 8.86798734e+00 4.00000000e-01 0.00000000e+00 + 7.19713168e+00 8.00000000e-01 0.00000000e+00 7.19713168e+00 6.66666667e-01 0.00000000e+00 7.19713168e+00 5.33333333e-01 0.00000000e+00 7.19713168e+00 4.00000000e-01 0.00000000e+00 + 2.00000000e+01 0.00000000e+00 0.00000000e+00 1.93349703e+01 0.00000000e+00 0.00000000e+00 1.86699406e+01 0.00000000e+00 0.00000000e+00 1.80049110e+01 0.00000000e+00 0.00000000e+00 + -5.34603915e-01 2.72394300e-01 0.00000000e+00 -5.04903697e-01 2.57261283e-01 0.00000000e+00 -4.75203480e-01 2.42128267e-01 0.00000000e+00 -4.45503262e-01 2.26995250e-01 0.00000000e+00 + -8.40000000e+00 -1.00000000e+01 0.00000000e+00 -7.86666667e+00 -1.00000000e+01 0.00000000e+00 -7.33333333e+00 -1.00000000e+01 0.00000000e+00 -6.80000000e+00 -1.00000000e+01 0.00000000e+00 + 1.80049110e+01 4.00000000e-01 0.00000000e+00 1.86699406e+01 4.00000000e-01 0.00000000e+00 1.93349703e+01 4.00000000e-01 0.00000000e+00 2.00000000e+01 4.00000000e-01 0.00000000e+00 + -1.00000000e+01 -6.80000000e+00 0.00000000e+00 -9.46666667e+00 -6.80000000e+00 0.00000000e+00 -8.93333333e+00 -6.80000000e+00 0.00000000e+00 -8.40000000e+00 -6.80000000e+00 0.00000000e+00 + 1.80049110e+01 0.00000000e+00 0.00000000e+00 1.73592511e+01 0.00000000e+00 0.00000000e+00 1.67135912e+01 0.00000000e+00 0.00000000e+00 1.60679313e+01 0.00000000e+00 0.00000000e+00 + 1.60679313e+01 4.00000000e-01 0.00000000e+00 1.67135912e+01 4.00000000e-01 0.00000000e+00 1.73592511e+01 4.00000000e-01 0.00000000e+00 1.80049110e+01 4.00000000e-01 0.00000000e+00 + -1.00000000e+01 -8.40000000e+00 0.00000000e+00 -9.46666667e+00 -8.40000000e+00 0.00000000e+00 -8.93333333e+00 -8.40000000e+00 0.00000000e+00 -8.40000000e+00 -8.40000000e+00 0.00000000e+00 + 1.41873685e+01 4.00000000e-01 0.00000000e+00 1.48142228e+01 4.00000000e-01 0.00000000e+00 1.54410771e+01 4.00000000e-01 0.00000000e+00 1.60679313e+01 4.00000000e-01 0.00000000e+00 + 1.41873685e+01 0.00000000e+00 0.00000000e+00 1.35787722e+01 0.00000000e+00 0.00000000e+00 1.29701758e+01 0.00000000e+00 0.00000000e+00 1.23615794e+01 0.00000000e+00 0.00000000e+00 + 1.23615794e+01 -6.80000000e+00 0.00000000e+00 1.23615794e+01 -7.33333333e+00 0.00000000e+00 1.23615794e+01 -7.86666667e+00 0.00000000e+00 1.23615794e+01 -8.40000000e+00 0.00000000e+00 + 1.23615794e+01 4.00000000e-01 0.00000000e+00 1.29701758e+01 4.00000000e-01 0.00000000e+00 1.35787722e+01 4.00000000e-01 0.00000000e+00 1.41873685e+01 4.00000000e-01 0.00000000e+00 + 1.23615794e+01 4.00000000e-01 0.00000000e+00 1.23615794e+01 2.66666667e-01 0.00000000e+00 1.23615794e+01 1.33333333e-01 0.00000000e+00 1.23615794e+01 0.00000000e+00 0.00000000e+00 + 8.86798734e+00 4.00000000e-01 0.00000000e+00 9.44164778e+00 4.00000000e-01 0.00000000e+00 1.00153082e+01 4.00000000e-01 0.00000000e+00 1.05889687e+01 4.00000000e-01 0.00000000e+00 + 1.80049110e+01 1.20000000e+00 0.00000000e+00 1.80049110e+01 1.06666667e+00 0.00000000e+00 1.80049110e+01 9.33333333e-01 0.00000000e+00 1.80049110e+01 8.00000000e-01 0.00000000e+00 + 8.86798734e+00 4.00000000e-01 0.00000000e+00 8.86798734e+00 2.66666667e-01 0.00000000e+00 8.86798734e+00 1.33333333e-01 0.00000000e+00 8.86798734e+00 0.00000000e+00 0.00000000e+00 + 1.05889687e+01 -6.80000000e+00 0.00000000e+00 1.11798389e+01 -6.80000000e+00 0.00000000e+00 1.17707092e+01 -6.80000000e+00 0.00000000e+00 1.23615794e+01 -6.80000000e+00 0.00000000e+00 + 7.19713168e+00 0.00000000e+00 0.00000000e+00 6.65640169e+00 0.00000000e+00 0.00000000e+00 6.11567170e+00 0.00000000e+00 0.00000000e+00 5.57494171e+00 0.00000000e+00 0.00000000e+00 + 5.57494171e+00 0.00000000e+00 0.00000000e+00 5.04996114e+00 0.00000000e+00 0.00000000e+00 4.52498057e+00 0.00000000e+00 0.00000000e+00 4.00000000e+00 0.00000000e+00 0.00000000e+00 + 4.00000000e+00 4.00000000e-01 0.00000000e+00 4.52498057e+00 4.00000000e-01 0.00000000e+00 5.04996114e+00 4.00000000e-01 0.00000000e+00 5.57494171e+00 4.00000000e-01 0.00000000e+00 + -2.72394300e-01 5.34603915e-01 0.00000000e+00 -2.57261283e-01 5.04903697e-01 0.00000000e+00 -2.42128267e-01 4.75203480e-01 0.00000000e+00 -2.26995250e-01 4.45503262e-01 0.00000000e+00 + -1.00000000e+01 -2.00000000e+00 0.00000000e+00 -9.46666667e+00 -2.00000000e+00 0.00000000e+00 -8.93333333e+00 -2.00000000e+00 0.00000000e+00 -8.40000000e+00 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 -1.60000000e+00 0.00000000e+00 -1.00000000e+01 -1.73333333e+00 0.00000000e+00 -1.00000000e+01 -1.86666667e+00 0.00000000e+00 -1.00000000e+01 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 -1.60000000e+00 0.00000000e+00 -9.46666667e+00 -1.60000000e+00 0.00000000e+00 -8.93333333e+00 -1.60000000e+00 0.00000000e+00 -8.40000000e+00 -1.60000000e+00 0.00000000e+00 + -1.00000000e+01 -1.20000000e+00 0.00000000e+00 -1.00000000e+01 -1.33333333e+00 0.00000000e+00 -1.00000000e+01 -1.46666667e+00 0.00000000e+00 -1.00000000e+01 -1.60000000e+00 0.00000000e+00 + -1.00000000e+01 -8.00000000e-01 0.00000000e+00 -9.46666667e+00 -8.00000000e-01 0.00000000e+00 -8.93333333e+00 -8.00000000e-01 0.00000000e+00 -8.40000000e+00 -8.00000000e-01 0.00000000e+00 + -1.00000000e+01 -4.00000000e-01 0.00000000e+00 -1.00000000e+01 -5.33333333e-01 0.00000000e+00 -1.00000000e+01 -6.66666667e-01 0.00000000e+00 -1.00000000e+01 -8.00000000e-01 0.00000000e+00 + -1.00000000e+01 -4.00000000e-01 0.00000000e+00 -9.46666667e+00 -4.00000000e-01 0.00000000e+00 -8.93333333e+00 -4.00000000e-01 0.00000000e+00 -8.40000000e+00 -4.00000000e-01 0.00000000e+00 + -1.00000000e+01 0.00000000e+00 0.00000000e+00 -1.00000000e+01 -1.33333333e-01 0.00000000e+00 -1.00000000e+01 -2.66666667e-01 0.00000000e+00 -1.00000000e+01 -4.00000000e-01 0.00000000e+00 + -8.40000000e+00 -1.20000000e+00 0.00000000e+00 -8.40000000e+00 -1.33333333e+00 0.00000000e+00 -8.40000000e+00 -1.46666667e+00 0.00000000e+00 -8.40000000e+00 -1.60000000e+00 0.00000000e+00 + 1.41873685e+01 -8.00000000e-01 0.00000000e+00 1.35787722e+01 -8.00000000e-01 0.00000000e+00 1.29701758e+01 -8.00000000e-01 0.00000000e+00 1.23615794e+01 -8.00000000e-01 0.00000000e+00 + -8.40000000e+00 -1.20000000e+00 0.00000000e+00 -7.86666667e+00 -1.20000000e+00 0.00000000e+00 -7.33333333e+00 -1.20000000e+00 0.00000000e+00 -6.80000000e+00 -1.20000000e+00 0.00000000e+00 + -8.40000000e+00 -8.00000000e-01 0.00000000e+00 -8.40000000e+00 -9.33333333e-01 0.00000000e+00 -8.40000000e+00 -1.06666667e+00 0.00000000e+00 -8.40000000e+00 -1.20000000e+00 0.00000000e+00 + -8.40000000e+00 -8.00000000e-01 0.00000000e+00 -7.86666667e+00 -8.00000000e-01 0.00000000e+00 -7.33333333e+00 -8.00000000e-01 0.00000000e+00 -6.80000000e+00 -8.00000000e-01 0.00000000e+00 + -8.40000000e+00 0.00000000e+00 0.00000000e+00 -8.40000000e+00 -1.33333333e-01 0.00000000e+00 -8.40000000e+00 -2.66666667e-01 0.00000000e+00 -8.40000000e+00 -4.00000000e-01 0.00000000e+00 + -3.60000000e+00 -8.40000000e+00 0.00000000e+00 -3.06666667e+00 -8.40000000e+00 0.00000000e+00 -2.53333333e+00 -8.40000000e+00 0.00000000e+00 -2.00000000e+00 -8.40000000e+00 0.00000000e+00 + -6.80000000e+00 -1.60000000e+00 0.00000000e+00 -6.80000000e+00 -1.73333333e+00 0.00000000e+00 -6.80000000e+00 -1.86666667e+00 0.00000000e+00 -6.80000000e+00 -2.00000000e+00 0.00000000e+00 + -6.80000000e+00 -1.60000000e+00 0.00000000e+00 -6.26666667e+00 -1.60000000e+00 0.00000000e+00 -5.73333333e+00 -1.60000000e+00 0.00000000e+00 -5.20000000e+00 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 -6.80000000e+00 0.00000000e+00 -3.06666667e+00 -6.80000000e+00 0.00000000e+00 -2.53333333e+00 -6.80000000e+00 0.00000000e+00 -2.00000000e+00 -6.80000000e+00 0.00000000e+00 + -6.80000000e+00 -8.00000000e-01 0.00000000e+00 -6.80000000e+00 -9.33333333e-01 0.00000000e+00 -6.80000000e+00 -1.06666667e+00 0.00000000e+00 -6.80000000e+00 -1.20000000e+00 0.00000000e+00 + -6.80000000e+00 -4.00000000e-01 0.00000000e+00 -6.80000000e+00 -5.33333333e-01 0.00000000e+00 -6.80000000e+00 -6.66666667e-01 0.00000000e+00 -6.80000000e+00 -8.00000000e-01 0.00000000e+00 + -6.80000000e+00 0.00000000e+00 0.00000000e+00 -6.80000000e+00 -1.33333333e-01 0.00000000e+00 -6.80000000e+00 -2.66666667e-01 0.00000000e+00 -6.80000000e+00 -4.00000000e-01 0.00000000e+00 + -5.20000000e+00 -2.00000000e+00 0.00000000e+00 -4.66666667e+00 -2.00000000e+00 0.00000000e+00 -4.13333333e+00 -2.00000000e+00 0.00000000e+00 -3.60000000e+00 -2.00000000e+00 0.00000000e+00 + -3.60000000e+00 -5.20000000e+00 0.00000000e+00 -3.06666667e+00 -5.20000000e+00 0.00000000e+00 -2.53333333e+00 -5.20000000e+00 0.00000000e+00 -2.00000000e+00 -5.20000000e+00 0.00000000e+00 + -5.20000000e+00 -8.00000000e-01 0.00000000e+00 -4.66666667e+00 -8.00000000e-01 0.00000000e+00 -4.13333333e+00 -8.00000000e-01 0.00000000e+00 -3.60000000e+00 -8.00000000e-01 0.00000000e+00 + -5.20000000e+00 -4.00000000e-01 0.00000000e+00 -4.66666667e+00 -4.00000000e-01 0.00000000e+00 -4.13333333e+00 -4.00000000e-01 0.00000000e+00 -3.60000000e+00 -4.00000000e-01 0.00000000e+00 + -3.60000000e+00 -2.00000000e+00 0.00000000e+00 -3.06666667e+00 -2.00000000e+00 0.00000000e+00 -2.53333333e+00 -2.00000000e+00 0.00000000e+00 -2.00000000e+00 -2.00000000e+00 0.00000000e+00 + -3.60000000e+00 -1.60000000e+00 0.00000000e+00 -3.06666667e+00 -1.60000000e+00 0.00000000e+00 -2.53333333e+00 -1.60000000e+00 0.00000000e+00 -2.00000000e+00 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 -1.20000000e+00 0.00000000e+00 -3.60000000e+00 -1.33333333e+00 0.00000000e+00 -3.60000000e+00 -1.46666667e+00 0.00000000e+00 -3.60000000e+00 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 -1.20000000e+00 0.00000000e+00 -3.06666667e+00 -1.20000000e+00 0.00000000e+00 -2.53333333e+00 -1.20000000e+00 0.00000000e+00 -2.00000000e+00 -1.20000000e+00 0.00000000e+00 + -3.60000000e+00 -8.00000000e-01 0.00000000e+00 -3.60000000e+00 -9.33333333e-01 0.00000000e+00 -3.60000000e+00 -1.06666667e+00 0.00000000e+00 -3.60000000e+00 -1.20000000e+00 0.00000000e+00 + -8.40000000e+00 -1.60000000e+00 0.00000000e+00 -7.86666667e+00 -1.60000000e+00 0.00000000e+00 -7.33333333e+00 -1.60000000e+00 0.00000000e+00 -6.80000000e+00 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 0.00000000e+00 0.00000000e+00 -3.60000000e+00 -1.33333333e-01 0.00000000e+00 -3.60000000e+00 -2.66666667e-01 0.00000000e+00 -3.60000000e+00 -4.00000000e-01 0.00000000e+00 + -2.26995250e-01 -4.45503262e-01 0.00000000e+00 -2.42128267e-01 -4.75203480e-01 0.00000000e+00 -2.57261283e-01 -5.04903697e-01 0.00000000e+00 -2.72394300e-01 -5.34603915e-01 0.00000000e+00 + 0.00000000e+00 -1.59849170e+00 0.00000000e+00 0.00000000e+00 -1.47682252e+00 0.00000000e+00 0.00000000e+00 -1.35515334e+00 0.00000000e+00 0.00000000e+00 -1.23348416e+00 0.00000000e+00 + -6.23740783e-01 -1.59006976e+00 0.00000000e+00 -7.27150668e-01 -1.58662539e+00 0.00000000e+00 -8.30560554e-01 -1.58318102e+00 0.00000000e+00 -9.33970440e-01 -1.57973665e+00 0.00000000e+00 + 4.00000000e+00 -1.60000000e+00 0.00000000e+00 3.77777778e+00 -1.60000000e+00 0.00000000e+00 3.55555556e+00 -1.60000000e+00 0.00000000e+00 3.33333333e+00 -1.60000000e+00 0.00000000e+00 + -1.24227651e+00 -1.56562831e+00 0.00000000e+00 -1.36151768e+00 -1.71041887e+00 0.00000000e+00 -1.48075884e+00 -1.85520944e+00 0.00000000e+00 -1.60000000e+00 -2.00000000e+00 0.00000000e+00 + 4.00000000e+00 -1.20000000e+00 0.00000000e+00 3.77777778e+00 -1.20000000e+00 0.00000000e+00 3.55555556e+00 -1.20000000e+00 0.00000000e+00 3.33333333e+00 -1.20000000e+00 0.00000000e+00 + 1.60000000e+00 -6.80000000e+00 0.00000000e+00 1.60000000e+00 -7.33333333e+00 0.00000000e+00 1.60000000e+00 -7.86666667e+00 0.00000000e+00 1.60000000e+00 -8.40000000e+00 0.00000000e+00 + -1.21740590e+00 -4.63505130e-01 0.00000000e+00 -1.22141716e+00 -3.86465173e-01 0.00000000e+00 -1.22542843e+00 -3.09425216e-01 0.00000000e+00 -1.22943970e+00 -2.32385259e-01 0.00000000e+00 + 4.00000000e+00 -8.00000000e-01 0.00000000e+00 4.00000000e+00 -9.33333333e-01 0.00000000e+00 4.00000000e+00 -1.06666667e+00 0.00000000e+00 4.00000000e+00 -1.20000000e+00 0.00000000e+00 + -3.60000000e+00 -1.00000000e+01 0.00000000e+00 -3.06666667e+00 -1.00000000e+01 0.00000000e+00 -2.53333333e+00 -1.00000000e+01 0.00000000e+00 -2.00000000e+00 -1.00000000e+01 0.00000000e+00 + 4.00000000e+00 -8.00000000e-01 0.00000000e+00 3.77777778e+00 -8.00000000e-01 0.00000000e+00 3.55555556e+00 -8.00000000e-01 0.00000000e+00 3.33333333e+00 -8.00000000e-01 0.00000000e+00 + 4.00000000e+00 0.00000000e+00 0.00000000e+00 4.00000000e+00 -1.33333333e-01 0.00000000e+00 4.00000000e+00 -2.66666667e-01 0.00000000e+00 4.00000000e+00 -4.00000000e-01 0.00000000e+00 + 3.33333333e+00 -2.00000000e+00 0.00000000e+00 3.11111111e+00 -2.00000000e+00 0.00000000e+00 2.88888889e+00 -2.00000000e+00 0.00000000e+00 2.66666667e+00 -2.00000000e+00 0.00000000e+00 + -6.92125386e-01 -1.19767907e+00 0.00000000e+00 -7.67108039e-01 -1.18870103e+00 0.00000000e+00 -8.42090692e-01 -1.17972299e+00 0.00000000e+00 -9.17073345e-01 -1.17074495e+00 0.00000000e+00 + 3.33333333e+00 -1.60000000e+00 0.00000000e+00 3.33333333e+00 -1.73333333e+00 0.00000000e+00 3.33333333e+00 -1.86666667e+00 0.00000000e+00 3.33333333e+00 -2.00000000e+00 0.00000000e+00 + 3.33333333e+00 -1.20000000e+00 0.00000000e+00 3.33333333e+00 -1.33333333e+00 0.00000000e+00 3.33333333e+00 -1.46666667e+00 0.00000000e+00 3.33333333e+00 -1.60000000e+00 0.00000000e+00 + 3.33333333e+00 -8.00000000e-01 0.00000000e+00 3.11111111e+00 -8.00000000e-01 0.00000000e+00 2.88888889e+00 -8.00000000e-01 0.00000000e+00 2.66666667e+00 -8.00000000e-01 0.00000000e+00 + -8.00000000e-01 -3.60000000e+00 0.00000000e+00 -8.00000000e-01 -4.13333333e+00 0.00000000e+00 -8.00000000e-01 -4.66666667e+00 0.00000000e+00 -8.00000000e-01 -5.20000000e+00 0.00000000e+00 + 3.33333333e+00 -4.00000000e-01 0.00000000e+00 3.33333333e+00 -5.33333333e-01 0.00000000e+00 3.33333333e+00 -6.66666667e-01 0.00000000e+00 3.33333333e+00 -8.00000000e-01 0.00000000e+00 + 3.53553391e-01 3.53553391e-01 0.00000000e+00 3.77123617e-01 3.77123617e-01 0.00000000e+00 4.00693843e-01 4.00693843e-01 0.00000000e+00 4.24264069e-01 4.24264069e-01 0.00000000e+00 + 3.33333333e+00 -4.00000000e-01 0.00000000e+00 3.11111111e+00 -4.00000000e-01 0.00000000e+00 2.88888889e+00 -4.00000000e-01 0.00000000e+00 2.66666667e+00 -4.00000000e-01 0.00000000e+00 + -2.00000000e+00 6.80000000e+00 0.00000000e+00 -2.00000000e+00 7.33333333e+00 0.00000000e+00 -2.00000000e+00 7.86666667e+00 0.00000000e+00 -2.00000000e+00 8.40000000e+00 0.00000000e+00 + 5.70633910e-01 1.85410197e-01 0.00000000e+00 5.79555496e-01 1.55291427e-01 0.00000000e+00 5.86888560e-01 1.24747014e-01 0.00000000e+00 5.92613004e-01 9.38606790e-02 0.00000000e+00 + 3.33333333e+00 0.00000000e+00 0.00000000e+00 3.33333333e+00 -1.33333333e-01 0.00000000e+00 3.33333333e+00 -2.66666667e-01 0.00000000e+00 3.33333333e+00 -4.00000000e-01 0.00000000e+00 + 8.50353987e-01 -4.72266246e-01 0.00000000e+00 7.45103963e-01 -4.05642264e-01 0.00000000e+00 6.39853939e-01 -3.39018282e-01 0.00000000e+00 5.34603915e-01 -2.72394300e-01 0.00000000e+00 + 2.66666667e+00 -2.00000000e+00 0.00000000e+00 2.44444444e+00 -2.00000000e+00 0.00000000e+00 2.22222222e+00 -2.00000000e+00 0.00000000e+00 2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 8.86798734e+00 1.00000000e+01 0.00000000e+00 8.86798734e+00 9.46666667e+00 0.00000000e+00 8.86798734e+00 8.93333333e+00 0.00000000e+00 8.86798734e+00 8.40000000e+00 0.00000000e+00 + 2.66666667e+00 -1.60000000e+00 0.00000000e+00 2.44444444e+00 -1.60000000e+00 0.00000000e+00 2.22222222e+00 -1.60000000e+00 0.00000000e+00 2.00000000e+00 -1.60000000e+00 0.00000000e+00 + 2.72394300e-01 -5.34603915e-01 0.00000000e+00 2.44041986e-01 -5.48127275e-01 0.00000000e+00 2.15020770e-01 -5.60148256e-01 0.00000000e+00 1.85410197e-01 -5.70633910e-01 0.00000000e+00 + 2.66666667e+00 -1.20000000e+00 0.00000000e+00 2.44444444e+00 -1.20000000e+00 0.00000000e+00 2.22222222e+00 -1.20000000e+00 0.00000000e+00 2.00000000e+00 -1.20000000e+00 0.00000000e+00 + 2.66666667e+00 -8.00000000e-01 0.00000000e+00 2.66666667e+00 -9.33333333e-01 0.00000000e+00 2.66666667e+00 -1.06666667e+00 0.00000000e+00 2.66666667e+00 -1.20000000e+00 0.00000000e+00 + 2.66666667e+00 -4.00000000e-01 0.00000000e+00 2.66666667e+00 -5.33333333e-01 0.00000000e+00 2.66666667e+00 -6.66666667e-01 0.00000000e+00 2.66666667e+00 -8.00000000e-01 0.00000000e+00 + 1.80049110e+01 -1.60000000e+00 0.00000000e+00 1.80049110e+01 -1.73333333e+00 0.00000000e+00 1.80049110e+01 -1.86666667e+00 0.00000000e+00 1.80049110e+01 -2.00000000e+00 0.00000000e+00 + 3.33333333e+00 2.00000000e+00 0.00000000e+00 3.33333333e+00 1.86666667e+00 0.00000000e+00 3.33333333e+00 1.73333333e+00 0.00000000e+00 3.33333333e+00 1.60000000e+00 0.00000000e+00 + 4.00000000e+00 1.60000000e+00 0.00000000e+00 4.00000000e+00 1.46666667e+00 0.00000000e+00 4.00000000e+00 1.33333333e+00 0.00000000e+00 4.00000000e+00 1.20000000e+00 0.00000000e+00 + 2.66666667e+00 1.60000000e+00 0.00000000e+00 2.88888889e+00 1.60000000e+00 0.00000000e+00 3.11111111e+00 1.60000000e+00 0.00000000e+00 3.33333333e+00 1.60000000e+00 0.00000000e+00 + 2.66666667e+00 1.60000000e+00 0.00000000e+00 2.66666667e+00 1.46666667e+00 0.00000000e+00 2.66666667e+00 1.33333333e+00 0.00000000e+00 2.66666667e+00 1.20000000e+00 0.00000000e+00 + 2.66666667e+00 -1.20000000e+00 0.00000000e+00 2.66666667e+00 -1.33333333e+00 0.00000000e+00 2.66666667e+00 -1.46666667e+00 0.00000000e+00 2.66666667e+00 -1.60000000e+00 0.00000000e+00 + 2.66666667e+00 1.20000000e+00 0.00000000e+00 2.88888889e+00 1.20000000e+00 0.00000000e+00 3.11111111e+00 1.20000000e+00 0.00000000e+00 3.33333333e+00 1.20000000e+00 0.00000000e+00 + 2.66666667e+00 1.20000000e+00 0.00000000e+00 2.66666667e+00 1.06666667e+00 0.00000000e+00 2.66666667e+00 9.33333333e-01 0.00000000e+00 2.66666667e+00 8.00000000e-01 0.00000000e+00 + 3.33333333e+00 -3.60000000e+00 0.00000000e+00 3.11111111e+00 -3.60000000e+00 0.00000000e+00 2.88888889e+00 -3.60000000e+00 0.00000000e+00 2.66666667e+00 -3.60000000e+00 0.00000000e+00 + 1.60679313e+01 -6.80000000e+00 0.00000000e+00 1.67135912e+01 -6.80000000e+00 0.00000000e+00 1.73592511e+01 -6.80000000e+00 0.00000000e+00 1.80049110e+01 -6.80000000e+00 0.00000000e+00 + 3.33333333e+00 8.00000000e-01 0.00000000e+00 3.55555556e+00 8.00000000e-01 0.00000000e+00 3.77777778e+00 8.00000000e-01 0.00000000e+00 4.00000000e+00 8.00000000e-01 0.00000000e+00 + 1.80049110e+01 1.60000000e+00 0.00000000e+00 1.86699406e+01 1.60000000e+00 0.00000000e+00 1.93349703e+01 1.60000000e+00 0.00000000e+00 2.00000000e+01 1.60000000e+00 0.00000000e+00 + 7.19713168e+00 1.20000000e+00 0.00000000e+00 7.75408356e+00 1.20000000e+00 0.00000000e+00 8.31103545e+00 1.20000000e+00 0.00000000e+00 8.86798734e+00 1.20000000e+00 0.00000000e+00 + 1.56562831e+00 -1.24227651e+00 0.00000000e+00 1.55978291e+00 -1.34421505e+00 0.00000000e+00 1.55393751e+00 -1.44615358e+00 0.00000000e+00 1.54809211e+00 -1.54809211e+00 0.00000000e+00 + 3.33333333e+00 8.00000000e-01 0.00000000e+00 3.33333333e+00 6.66666667e-01 0.00000000e+00 3.33333333e+00 5.33333333e-01 0.00000000e+00 3.33333333e+00 4.00000000e-01 0.00000000e+00 + 7.19713168e+00 -1.20000000e+00 0.00000000e+00 6.65640169e+00 -1.20000000e+00 0.00000000e+00 6.11567170e+00 -1.20000000e+00 0.00000000e+00 5.57494171e+00 -1.20000000e+00 0.00000000e+00 + 2.66666667e+00 8.00000000e-01 0.00000000e+00 2.88888889e+00 8.00000000e-01 0.00000000e+00 3.11111111e+00 8.00000000e-01 0.00000000e+00 3.33333333e+00 8.00000000e-01 0.00000000e+00 + 8.86798734e+00 -5.20000000e+00 0.00000000e+00 8.86798734e+00 -5.73333333e+00 0.00000000e+00 8.86798734e+00 -6.26666667e+00 0.00000000e+00 8.86798734e+00 -6.80000000e+00 0.00000000e+00 + 4.00000000e+00 -5.20000000e+00 0.00000000e+00 4.52498057e+00 -5.20000000e+00 0.00000000e+00 5.04996114e+00 -5.20000000e+00 0.00000000e+00 5.57494171e+00 -5.20000000e+00 0.00000000e+00 + 8.86798734e+00 -8.40000000e+00 0.00000000e+00 9.44164778e+00 -8.40000000e+00 0.00000000e+00 1.00153082e+01 -8.40000000e+00 0.00000000e+00 1.05889687e+01 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 2.00000000e+00 0.00000000e+00 5.57494171e+00 1.86666667e+00 0.00000000e+00 5.57494171e+00 1.73333333e+00 0.00000000e+00 5.57494171e+00 1.60000000e+00 0.00000000e+00 + 3.33333333e+00 2.00000000e+00 0.00000000e+00 3.11111111e+00 2.00000000e+00 0.00000000e+00 2.88888889e+00 2.00000000e+00 0.00000000e+00 2.66666667e+00 2.00000000e+00 0.00000000e+00 + 4.00000000e+00 0.00000000e+00 0.00000000e+00 3.77777778e+00 0.00000000e+00 0.00000000e+00 3.55555556e+00 0.00000000e+00 0.00000000e+00 3.33333333e+00 0.00000000e+00 0.00000000e+00 + 1.23615794e+01 2.00000000e+00 0.00000000e+00 1.17707092e+01 2.00000000e+00 0.00000000e+00 1.11798389e+01 2.00000000e+00 0.00000000e+00 1.05889687e+01 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 3.60000000e+00 0.00000000e+00 3.33333333e+00 3.06666667e+00 0.00000000e+00 3.33333333e+00 2.53333333e+00 0.00000000e+00 3.33333333e+00 2.00000000e+00 0.00000000e+00 + 4.00000000e+00 4.00000000e-01 0.00000000e+00 4.00000000e+00 2.66666667e-01 0.00000000e+00 4.00000000e+00 1.33333333e-01 0.00000000e+00 4.00000000e+00 0.00000000e+00 0.00000000e+00 + 5.57494171e+00 -5.20000000e+00 0.00000000e+00 6.11567170e+00 -5.20000000e+00 0.00000000e+00 6.65640169e+00 -5.20000000e+00 0.00000000e+00 7.19713167e+00 -5.20000000e+00 0.00000000e+00 + 2.66666667e+00 3.60000000e+00 0.00000000e+00 2.88888889e+00 3.60000000e+00 0.00000000e+00 3.11111111e+00 3.60000000e+00 0.00000000e+00 3.33333333e+00 3.60000000e+00 0.00000000e+00 + 3.33333333e+00 4.00000000e-01 0.00000000e+00 3.55555556e+00 4.00000000e-01 0.00000000e+00 3.77777778e+00 4.00000000e-01 0.00000000e+00 4.00000000e+00 4.00000000e-01 0.00000000e+00 + 2.00000000e+00 -2.00000000e+00 0.00000000e+00 1.84936404e+00 -1.84936404e+00 0.00000000e+00 1.69872807e+00 -1.69872807e+00 0.00000000e+00 1.54809211e+00 -1.54809211e+00 0.00000000e+00 + 3.33333333e+00 0.00000000e+00 0.00000000e+00 3.11111111e+00 0.00000000e+00 0.00000000e+00 2.88888889e+00 0.00000000e+00 0.00000000e+00 2.66666667e+00 0.00000000e+00 0.00000000e+00 + 2.66666667e+00 4.00000000e-01 0.00000000e+00 2.88888889e+00 4.00000000e-01 0.00000000e+00 3.11111111e+00 4.00000000e-01 0.00000000e+00 3.33333333e+00 4.00000000e-01 0.00000000e+00 + 4.00000000e-01 -6.80000000e+00 0.00000000e+00 4.00000000e-01 -7.33333333e+00 0.00000000e+00 4.00000000e-01 -7.86666667e+00 0.00000000e+00 4.00000000e-01 -8.40000000e+00 0.00000000e+00 + 4.72266246e-01 -8.50353987e-01 0.00000000e+00 4.05642264e-01 -7.45103963e-01 0.00000000e+00 3.39018282e-01 -6.39853939e-01 0.00000000e+00 2.72394300e-01 -5.34603915e-01 0.00000000e+00 + 3.17836356e-01 -8.78620570e-01 0.00000000e+00 2.73694303e-01 -7.75958350e-01 0.00000000e+00 2.29552250e-01 -6.73296130e-01 0.00000000e+00 1.85410197e-01 -5.70633910e-01 0.00000000e+00 + 1.41873685e+01 -6.80000000e+00 0.00000000e+00 1.48142228e+01 -6.80000000e+00 0.00000000e+00 1.54410771e+01 -6.80000000e+00 0.00000000e+00 1.60679313e+01 -6.80000000e+00 0.00000000e+00 + 9.38606790e-02 -5.92613004e-01 0.00000000e+00 6.27170780e-02 -5.96713137e-01 0.00000000e+00 3.14015737e-02 -5.99177721e-01 0.00000000e+00 0.00000000e+00 -6.00000000e-01 0.00000000e+00 + 8.78620570e-01 -3.17836356e-01 0.00000000e+00 8.69198376e-01 -3.69312986e-01 0.00000000e+00 8.59776181e-01 -4.20789616e-01 0.00000000e+00 8.50353987e-01 -4.72266246e-01 0.00000000e+00 + 7.63789156e-01 7.63789156e-01 0.00000000e+00 7.79779464e-01 7.16337471e-01 0.00000000e+00 7.95769772e-01 6.68885786e-01 0.00000000e+00 8.11760079e-01 6.21434101e-01 0.00000000e+00 + 1.21740590e+00 -4.63505130e-01 0.00000000e+00 1.10447745e+00 -4.14948872e-01 0.00000000e+00 9.91549012e-01 -3.66392614e-01 0.00000000e+00 8.78620570e-01 -3.17836356e-01 0.00000000e+00 + -4.63505130e-01 1.21740590e+00 0.00000000e+00 -4.14948872e-01 1.10447745e+00 0.00000000e+00 -3.66392614e-01 9.91549012e-01 0.00000000e+00 -3.17836356e-01 8.78620570e-01 0.00000000e+00 + 8.50353987e-01 -4.72266246e-01 0.00000000e+00 8.37489351e-01 -5.21988864e-01 0.00000000e+00 8.24624715e-01 -5.71711483e-01 0.00000000e+00 8.11760079e-01 -6.21434101e-01 0.00000000e+00 + 1.19767907e+00 -6.92125386e-01 0.00000000e+00 1.08190404e+00 -6.18839006e-01 0.00000000e+00 9.66129014e-01 -5.45552626e-01 0.00000000e+00 8.50353987e-01 -4.72266246e-01 0.00000000e+00 + 7.63789156e-01 -7.63789156e-01 0.00000000e+00 6.50614127e-01 -6.50614127e-01 0.00000000e+00 5.37439098e-01 -5.37439098e-01 0.00000000e+00 4.24264069e-01 -4.24264069e-01 0.00000000e+00 + 4.45503262e-01 -2.26995250e-01 0.00000000e+00 4.75203480e-01 -2.42128267e-01 0.00000000e+00 5.04903697e-01 -2.57261283e-01 0.00000000e+00 5.34603915e-01 -2.72394300e-01 0.00000000e+00 + 1.17074495e+00 -9.17073345e-01 0.00000000e+00 1.05108333e+00 -8.18526931e-01 0.00000000e+00 9.31421703e-01 -7.19980516e-01 0.00000000e+00 8.11760079e-01 -6.21434101e-01 0.00000000e+00 + 9.17073345e-01 -1.17074495e+00 0.00000000e+00 8.18526931e-01 -1.05108333e+00 0.00000000e+00 7.19980516e-01 -9.31421703e-01 0.00000000e+00 6.21434101e-01 -8.11760079e-01 0.00000000e+00 + 4.72266246e-01 -8.50353987e-01 0.00000000e+00 4.20789616e-01 -8.59776181e-01 0.00000000e+00 3.69312986e-01 -8.69198376e-01 0.00000000e+00 3.17836356e-01 -8.78620570e-01 0.00000000e+00 + 6.92125386e-01 -1.19767907e+00 0.00000000e+00 6.18839006e-01 -1.08190404e+00 0.00000000e+00 5.45552626e-01 -9.66129014e-01 0.00000000e+00 4.72266246e-01 -8.50353987e-01 0.00000000e+00 + 4.63505130e-01 -1.21740590e+00 0.00000000e+00 4.14948872e-01 -1.10447745e+00 0.00000000e+00 3.66392614e-01 -9.91549012e-01 0.00000000e+00 3.17836356e-01 -8.78620570e-01 0.00000000e+00 + 2.32385259e-01 -1.22943970e+00 0.00000000e+00 2.08198427e-01 -1.11824774e+00 0.00000000e+00 1.84011596e-01 -1.00705577e+00 0.00000000e+00 1.59824765e-01 -8.95863812e-01 0.00000000e+00 + -1.23348416e+00 0.00000000e+00 0.00000000e+00 -1.23213601e+00 7.74617529e-02 0.00000000e+00 -1.23078785e+00 1.54923506e-01 0.00000000e+00 -1.22943970e+00 2.32385259e-01 0.00000000e+00 + 1.23348416e+00 0.00000000e+00 0.00000000e+00 1.23213601e+00 -7.74617529e-02 0.00000000e+00 1.23078785e+00 -1.54923506e-01 0.00000000e+00 1.22943970e+00 -2.32385259e-01 0.00000000e+00 + 1.22943970e+00 -2.32385259e-01 0.00000000e+00 1.22542843e+00 -3.09425216e-01 0.00000000e+00 1.22141716e+00 -3.86465173e-01 0.00000000e+00 1.21740590e+00 -4.63505130e-01 0.00000000e+00 + 4.75528258e-01 -1.54508497e-01 0.00000000e+00 5.07230142e-01 -1.64809064e-01 0.00000000e+00 5.38932026e-01 -1.75109630e-01 0.00000000e+00 5.70633910e-01 -1.85410197e-01 0.00000000e+00 + 1.21740590e+00 -4.63505130e-01 0.00000000e+00 1.21083029e+00 -5.39711882e-01 0.00000000e+00 1.20425468e+00 -6.15918634e-01 0.00000000e+00 1.19767907e+00 -6.92125386e-01 0.00000000e+00 + 1.57973665e+00 -9.33970440e-01 0.00000000e+00 1.45238412e+00 -8.53355422e-01 0.00000000e+00 1.32503160e+00 -7.72740404e-01 0.00000000e+00 1.19767907e+00 -6.92125386e-01 0.00000000e+00 + -6.80000000e+00 -1.20000000e+00 0.00000000e+00 -6.80000000e+00 -1.33333333e+00 0.00000000e+00 -6.80000000e+00 -1.46666667e+00 0.00000000e+00 -6.80000000e+00 -1.60000000e+00 0.00000000e+00 + 1.59006976e+00 -6.23740783e-01 0.00000000e+00 1.46584847e+00 -5.70328898e-01 0.00000000e+00 1.34162718e+00 -5.16917014e-01 0.00000000e+00 1.21740590e+00 -4.63505130e-01 0.00000000e+00 + 8.78620570e-01 -3.17836356e-01 0.00000000e+00 7.75958350e-01 -2.73694303e-01 0.00000000e+00 6.73296130e-01 -2.29552250e-01 0.00000000e+00 5.70633910e-01 -1.85410197e-01 0.00000000e+00 + 1.56562831e+00 -1.24227651e+00 0.00000000e+00 1.43400052e+00 -1.13387546e+00 0.00000000e+00 1.30237274e+00 -1.02547440e+00 0.00000000e+00 1.17074495e+00 -9.17073345e-01 0.00000000e+00 + 1.60000000e+00 -2.00000000e+00 0.00000000e+00 1.73333333e+00 -2.00000000e+00 0.00000000e+00 1.86666667e+00 -2.00000000e+00 0.00000000e+00 2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 1.13726675e+00 -1.13726675e+00 0.00000000e+00 1.06386895e+00 -1.14842615e+00 0.00000000e+00 9.90471148e-01 -1.15958555e+00 0.00000000e+00 9.17073345e-01 -1.17074495e+00 0.00000000e+00 + -8.40000000e+00 -2.00000000e+00 0.00000000e+00 -7.86666667e+00 -2.00000000e+00 0.00000000e+00 -7.33333333e+00 -2.00000000e+00 0.00000000e+00 -6.80000000e+00 -2.00000000e+00 0.00000000e+00 + 9.17073345e-01 -1.17074495e+00 0.00000000e+00 8.42090692e-01 -1.17972299e+00 0.00000000e+00 7.67108039e-01 -1.18870103e+00 0.00000000e+00 6.92125386e-01 -1.19767907e+00 0.00000000e+00 + 1.23615794e+01 -6.80000000e+00 0.00000000e+00 1.29701758e+01 -6.80000000e+00 0.00000000e+00 1.35787722e+01 -6.80000000e+00 0.00000000e+00 1.41873685e+01 -6.80000000e+00 0.00000000e+00 + -3.60000000e+00 2.00000000e+00 0.00000000e+00 -3.06666667e+00 2.00000000e+00 0.00000000e+00 -2.53333333e+00 2.00000000e+00 0.00000000e+00 -2.00000000e+00 2.00000000e+00 0.00000000e+00 + 2.66666667e+00 0.00000000e+00 0.00000000e+00 2.66666667e+00 -1.33333333e-01 0.00000000e+00 2.66666667e+00 -2.66666667e-01 0.00000000e+00 2.66666667e+00 -4.00000000e-01 0.00000000e+00 + 1.24227651e+00 -1.56562831e+00 0.00000000e+00 1.13387546e+00 -1.43400052e+00 0.00000000e+00 1.02547440e+00 -1.30237274e+00 0.00000000e+00 9.17073345e-01 -1.17074495e+00 0.00000000e+00 + 4.00000000e+00 2.00000000e+00 0.00000000e+00 3.77777778e+00 2.00000000e+00 0.00000000e+00 3.55555556e+00 2.00000000e+00 0.00000000e+00 3.33333333e+00 2.00000000e+00 0.00000000e+00 + 1.23615794e+01 3.60000000e+00 0.00000000e+00 1.29701758e+01 3.60000000e+00 0.00000000e+00 1.35787722e+01 3.60000000e+00 0.00000000e+00 1.41873685e+01 3.60000000e+00 0.00000000e+00 + 6.92125386e-01 -1.19767907e+00 0.00000000e+00 6.15918634e-01 -1.20425468e+00 0.00000000e+00 5.39711882e-01 -1.21083029e+00 0.00000000e+00 4.63505130e-01 -1.21740590e+00 0.00000000e+00 + 4.00000000e+00 -4.00000000e-01 0.00000000e+00 3.77777778e+00 -4.00000000e-01 0.00000000e+00 3.55555556e+00 -4.00000000e-01 0.00000000e+00 3.33333333e+00 -4.00000000e-01 0.00000000e+00 + 9.33970440e-01 -1.57973665e+00 0.00000000e+00 8.53355422e-01 -1.45238412e+00 0.00000000e+00 7.72740404e-01 -1.32503160e+00 0.00000000e+00 6.92125386e-01 -1.19767907e+00 0.00000000e+00 + 3.12201802e-01 -1.59637318e+00 0.00000000e+00 2.85596288e-01 -1.47406202e+00 0.00000000e+00 2.58990773e-01 -1.35175086e+00 0.00000000e+00 2.32385259e-01 -1.22943970e+00 0.00000000e+00 + 7.63789156e-01 -7.63789156e-01 0.00000000e+00 7.16337471e-01 -7.79779464e-01 0.00000000e+00 6.68885786e-01 -7.95769772e-01 0.00000000e+00 6.21434101e-01 -8.11760079e-01 0.00000000e+00 + 1.59849170e+00 0.00000000e+00 0.00000000e+00 1.59778553e+00 -1.04067267e-01 0.00000000e+00 1.59707935e+00 -2.08134535e-01 0.00000000e+00 1.59637318e+00 -3.12201802e-01 0.00000000e+00 + 1.60000000e+00 -6.80000000e+00 0.00000000e+00 1.46666667e+00 -6.80000000e+00 0.00000000e+00 1.33333333e+00 -6.80000000e+00 0.00000000e+00 1.20000000e+00 -6.80000000e+00 0.00000000e+00 + 1.23615794e+01 -3.60000000e+00 0.00000000e+00 1.29701758e+01 -3.60000000e+00 0.00000000e+00 1.35787722e+01 -3.60000000e+00 0.00000000e+00 1.41873685e+01 -3.60000000e+00 0.00000000e+00 + 5.57494171e+00 1.20000000e+00 0.00000000e+00 5.57494171e+00 1.06666667e+00 0.00000000e+00 5.57494171e+00 9.33333333e-01 0.00000000e+00 5.57494171e+00 8.00000000e-01 0.00000000e+00 + 2.00000000e+00 -4.00000000e-01 0.00000000e+00 2.00000000e+00 -2.66666667e-01 0.00000000e+00 2.00000000e+00 -1.33333333e-01 0.00000000e+00 2.00000000e+00 0.00000000e+00 0.00000000e+00 + 2.00000000e+00 1.60000000e+00 0.00000000e+00 2.00000000e+00 1.73333333e+00 0.00000000e+00 2.00000000e+00 1.86666667e+00 0.00000000e+00 2.00000000e+00 2.00000000e+00 0.00000000e+00 + 1.59637318e+00 -3.12201802e-01 0.00000000e+00 1.59427204e+00 -4.16048129e-01 0.00000000e+00 1.59217090e+00 -5.19894456e-01 0.00000000e+00 1.59006976e+00 -6.23740783e-01 0.00000000e+00 + -5.20000000e+00 1.60000000e+00 0.00000000e+00 -5.20000000e+00 1.73333333e+00 0.00000000e+00 -5.20000000e+00 1.86666667e+00 0.00000000e+00 -5.20000000e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 -8.00000000e-01 0.00000000e+00 2.00000000e+00 -6.66666667e-01 0.00000000e+00 2.00000000e+00 -5.33333333e-01 0.00000000e+00 2.00000000e+00 -4.00000000e-01 0.00000000e+00 + -6.80000000e+00 1.20000000e+00 0.00000000e+00 -6.80000000e+00 1.33333333e+00 0.00000000e+00 -6.80000000e+00 1.46666667e+00 0.00000000e+00 -6.80000000e+00 1.60000000e+00 0.00000000e+00 + 2.00000000e+00 -1.20000000e+00 0.00000000e+00 2.00000000e+00 -1.06666667e+00 0.00000000e+00 2.00000000e+00 -9.33333333e-01 0.00000000e+00 2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 1.41873685e+01 -3.60000000e+00 0.00000000e+00 1.48142228e+01 -3.60000000e+00 0.00000000e+00 1.54410771e+01 -3.60000000e+00 0.00000000e+00 1.60679313e+01 -3.60000000e+00 0.00000000e+00 + 2.00000000e+00 -1.60000000e+00 0.00000000e+00 2.00000000e+00 -1.46666667e+00 0.00000000e+00 2.00000000e+00 -1.33333333e+00 0.00000000e+00 2.00000000e+00 -1.20000000e+00 0.00000000e+00 + 4.00000000e+00 -5.20000000e+00 0.00000000e+00 4.00000000e+00 -4.66666667e+00 0.00000000e+00 4.00000000e+00 -4.13333333e+00 0.00000000e+00 4.00000000e+00 -3.60000000e+00 0.00000000e+00 + 7.19713167e+00 -6.80000000e+00 0.00000000e+00 7.75408356e+00 -6.80000000e+00 0.00000000e+00 8.31103545e+00 -6.80000000e+00 0.00000000e+00 8.86798734e+00 -6.80000000e+00 0.00000000e+00 + 2.00000000e+00 -1.60000000e+00 0.00000000e+00 1.85520944e+00 -1.48075884e+00 0.00000000e+00 1.71041887e+00 -1.36151768e+00 0.00000000e+00 1.56562831e+00 -1.24227651e+00 0.00000000e+00 + 1.20000000e+00 -1.00000000e+01 0.00000000e+00 1.06666667e+00 -1.00000000e+01 0.00000000e+00 9.33333333e-01 -1.00000000e+01 0.00000000e+00 8.00000000e-01 -1.00000000e+01 0.00000000e+00 + 7.19713167e+00 -5.20000000e+00 0.00000000e+00 7.75408356e+00 -5.20000000e+00 0.00000000e+00 8.31103545e+00 -5.20000000e+00 0.00000000e+00 8.86798734e+00 -5.20000000e+00 0.00000000e+00 + 8.86798734e+00 6.80000000e+00 0.00000000e+00 8.86798734e+00 6.26666667e+00 0.00000000e+00 8.86798734e+00 5.73333333e+00 0.00000000e+00 8.86798734e+00 5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -2.00000000e+00 0.00000000e+00 2.00000000e+00 -1.86666667e+00 0.00000000e+00 2.00000000e+00 -1.73333333e+00 0.00000000e+00 2.00000000e+00 -1.60000000e+00 0.00000000e+00 + 1.20000000e+00 -2.00000000e+00 0.00000000e+00 1.33333333e+00 -2.00000000e+00 0.00000000e+00 1.46666667e+00 -2.00000000e+00 0.00000000e+00 1.60000000e+00 -2.00000000e+00 0.00000000e+00 + 9.33970440e-01 -1.57973665e+00 0.00000000e+00 8.30560554e-01 -1.58318102e+00 0.00000000e+00 7.27150668e-01 -1.58662539e+00 0.00000000e+00 6.23740783e-01 -1.59006976e+00 0.00000000e+00 + 8.00000000e-01 -2.00000000e+00 0.00000000e+00 7.41246928e-01 -1.86335659e+00 0.00000000e+00 6.82493855e-01 -1.72671317e+00 0.00000000e+00 6.23740783e-01 -1.59006976e+00 0.00000000e+00 + 1.05889687e+01 8.00000000e-01 0.00000000e+00 1.11798389e+01 8.00000000e-01 0.00000000e+00 1.17707092e+01 8.00000000e-01 0.00000000e+00 1.23615794e+01 8.00000000e-01 0.00000000e+00 + 3.12201802e-01 -1.59637318e+00 0.00000000e+00 2.08134535e-01 -1.59707935e+00 0.00000000e+00 1.04067267e-01 -1.59778553e+00 0.00000000e+00 0.00000000e+00 -1.59849170e+00 0.00000000e+00 + 0.00000000e+00 1.59849170e+00 0.00000000e+00 0.00000000e+00 1.73232780e+00 0.00000000e+00 0.00000000e+00 1.86616390e+00 0.00000000e+00 0.00000000e+00 2.00000000e+00 0.00000000e+00 + 0.00000000e+00 -2.00000000e+00 0.00000000e+00 1.33333333e-01 -2.00000000e+00 0.00000000e+00 2.66666667e-01 -2.00000000e+00 0.00000000e+00 4.00000000e-01 -2.00000000e+00 0.00000000e+00 + -8.40000000e+00 -4.00000000e-01 0.00000000e+00 -8.40000000e+00 -5.33333333e-01 0.00000000e+00 -8.40000000e+00 -6.66666667e-01 0.00000000e+00 -8.40000000e+00 -8.00000000e-01 0.00000000e+00 + -5.92613004e-01 -9.38606790e-02 0.00000000e+00 -5.96713137e-01 -6.27170780e-02 0.00000000e+00 -5.99177721e-01 -3.14015737e-02 0.00000000e+00 -6.00000000e-01 0.00000000e+00 0.00000000e+00 + 1.60000000e+00 3.60000000e+00 0.00000000e+00 1.73333333e+00 3.60000000e+00 0.00000000e+00 1.86666667e+00 3.60000000e+00 0.00000000e+00 2.00000000e+00 3.60000000e+00 0.00000000e+00 + -8.95863812e-01 -1.59824765e-01 0.00000000e+00 -8.97795583e-01 -1.06549843e-01 0.00000000e+00 -8.99727354e-01 -5.32749215e-02 0.00000000e+00 -9.01659125e-01 0.00000000e+00 0.00000000e+00 + -1.59637318e+00 -3.12201802e-01 0.00000000e+00 -1.59707935e+00 -2.08134535e-01 0.00000000e+00 -1.59778553e+00 -1.04067267e-01 0.00000000e+00 -1.59849170e+00 0.00000000e+00 0.00000000e+00 + -2.00000000e+00 6.80000000e+00 0.00000000e+00 -1.86666667e+00 6.80000000e+00 0.00000000e+00 -1.73333333e+00 6.80000000e+00 0.00000000e+00 -1.60000000e+00 6.80000000e+00 0.00000000e+00 + -8.78620570e-01 -3.17836356e-01 0.00000000e+00 -8.84368317e-01 -2.65165825e-01 0.00000000e+00 -8.90116065e-01 -2.12495295e-01 0.00000000e+00 -8.95863812e-01 -1.59824765e-01 0.00000000e+00 + -1.22943970e+00 -2.32385259e-01 0.00000000e+00 -1.35175086e+00 -2.58990773e-01 0.00000000e+00 -1.47406202e+00 -2.85596288e-01 0.00000000e+00 -1.59637318e+00 -3.12201802e-01 0.00000000e+00 + 2.00000000e+01 -1.00000000e+01 0.00000000e+00 1.93349703e+01 -1.00000000e+01 0.00000000e+00 1.86699406e+01 -1.00000000e+01 0.00000000e+00 1.80049110e+01 -1.00000000e+01 0.00000000e+00 + -2.00000000e+00 -4.00000000e-01 0.00000000e+00 -2.00000000e+00 -5.33333333e-01 0.00000000e+00 -2.00000000e+00 -6.66666667e-01 0.00000000e+00 -2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 1.80049110e+01 -6.80000000e+00 0.00000000e+00 1.80049110e+01 -7.33333333e+00 0.00000000e+00 1.80049110e+01 -7.86666667e+00 0.00000000e+00 1.80049110e+01 -8.40000000e+00 0.00000000e+00 + -8.11760079e-01 -6.21434101e-01 0.00000000e+00 -9.31421703e-01 -7.19980516e-01 0.00000000e+00 -1.05108333e+00 -8.18526931e-01 0.00000000e+00 -1.17074495e+00 -9.17073345e-01 0.00000000e+00 + -8.78620570e-01 -3.17836356e-01 0.00000000e+00 -9.91549012e-01 -3.66392614e-01 0.00000000e+00 -1.10447745e+00 -4.14948872e-01 0.00000000e+00 -1.21740590e+00 -4.63505130e-01 0.00000000e+00 + 7.82172325e-02 4.93844170e-01 0.00000000e+00 8.34317147e-02 5.26767115e-01 0.00000000e+00 8.86461969e-02 5.59690060e-01 0.00000000e+00 9.38606790e-02 5.92613004e-01 0.00000000e+00 + -1.19767907e+00 -6.92125386e-01 0.00000000e+00 -1.20425468e+00 -6.15918634e-01 0.00000000e+00 -1.21083029e+00 -5.39711882e-01 0.00000000e+00 -1.21740590e+00 -4.63505130e-01 0.00000000e+00 + -1.57973665e+00 -9.33970440e-01 0.00000000e+00 -1.58318102e+00 -8.30560554e-01 0.00000000e+00 -1.58662539e+00 -7.27150668e-01 0.00000000e+00 -1.59006976e+00 -6.23740783e-01 0.00000000e+00 + 0.00000000e+00 6.80000000e+00 0.00000000e+00 0.00000000e+00 7.33333333e+00 0.00000000e+00 0.00000000e+00 7.86666667e+00 0.00000000e+00 0.00000000e+00 8.40000000e+00 0.00000000e+00 + -4.85410197e-01 -3.52671151e-01 0.00000000e+00 -5.03202341e-01 -3.26783421e-01 0.00000000e+00 -5.19615242e-01 -3.00000000e-01 0.00000000e+00 -5.34603915e-01 -2.72394300e-01 0.00000000e+00 + -8.11760079e-01 -6.21434101e-01 0.00000000e+00 -8.24624715e-01 -5.71711483e-01 0.00000000e+00 -8.37489351e-01 -5.21988864e-01 0.00000000e+00 -8.50353987e-01 -4.72266246e-01 0.00000000e+00 + -5.20000000e+00 0.00000000e+00 0.00000000e+00 -5.20000000e+00 -1.33333333e-01 0.00000000e+00 -5.20000000e+00 -2.66666667e-01 0.00000000e+00 -5.20000000e+00 -4.00000000e-01 0.00000000e+00 + -6.80000000e+00 6.80000000e+00 0.00000000e+00 -6.80000000e+00 7.33333333e+00 0.00000000e+00 -6.80000000e+00 7.86666667e+00 0.00000000e+00 -6.80000000e+00 8.40000000e+00 0.00000000e+00 + -1.17074495e+00 -9.17073345e-01 0.00000000e+00 -1.17972299e+00 -8.42090692e-01 0.00000000e+00 -1.18870103e+00 -7.67108039e-01 0.00000000e+00 -1.19767907e+00 -6.92125386e-01 0.00000000e+00 + -2.93892626e-01 -4.04508497e-01 0.00000000e+00 -3.13485468e-01 -4.31475730e-01 0.00000000e+00 -3.33078310e-01 -4.58442963e-01 0.00000000e+00 -3.52671151e-01 -4.85410197e-01 0.00000000e+00 + -1.56562831e+00 -1.24227651e+00 0.00000000e+00 -1.71041887e+00 -1.36151768e+00 0.00000000e+00 -1.85520944e+00 -1.48075884e+00 0.00000000e+00 -2.00000000e+00 -1.60000000e+00 0.00000000e+00 + -3.52671151e-01 -4.85410197e-01 0.00000000e+00 -3.77592235e-01 -4.66287577e-01 0.00000000e+00 -4.01478364e-01 -4.45886895e-01 0.00000000e+00 -4.24264069e-01 -4.24264069e-01 0.00000000e+00 + -5.34603915e-01 -2.72394300e-01 0.00000000e+00 -5.48127275e-01 -2.44041986e-01 0.00000000e+00 -5.60148256e-01 -2.15020770e-01 0.00000000e+00 -5.70633910e-01 -1.85410197e-01 0.00000000e+00 + -9.01659125e-01 0.00000000e+00 0.00000000e+00 -8.01106084e-01 0.00000000e+00 0.00000000e+00 -7.00553042e-01 0.00000000e+00 0.00000000e+00 -6.00000000e-01 0.00000000e+00 0.00000000e+00 + -6.21434101e-01 -8.11760079e-01 0.00000000e+00 -6.68885786e-01 -7.95769772e-01 0.00000000e+00 -7.16337471e-01 -7.79779464e-01 0.00000000e+00 -7.63789156e-01 -7.63789156e-01 0.00000000e+00 + -1.13726675e+00 -1.13726675e+00 0.00000000e+00 -1.27420854e+00 -1.27420854e+00 0.00000000e+00 -1.41115032e+00 -1.41115032e+00 0.00000000e+00 -1.54809211e+00 -1.54809211e+00 0.00000000e+00 + -2.00000000e+00 -2.00000000e+00 0.00000000e+00 -1.86666667e+00 -2.00000000e+00 0.00000000e+00 -1.73333333e+00 -2.00000000e+00 0.00000000e+00 -1.60000000e+00 -2.00000000e+00 0.00000000e+00 + -9.17073345e-01 -1.17074495e+00 0.00000000e+00 -1.02547440e+00 -1.30237274e+00 0.00000000e+00 -1.13387546e+00 -1.43400052e+00 0.00000000e+00 -1.24227651e+00 -1.56562831e+00 0.00000000e+00 + 4.00000000e+00 3.60000000e+00 0.00000000e+00 4.52498057e+00 3.60000000e+00 0.00000000e+00 5.04996114e+00 3.60000000e+00 0.00000000e+00 5.57494171e+00 3.60000000e+00 0.00000000e+00 + -7.63789156e-01 -7.63789156e-01 0.00000000e+00 -8.88281689e-01 -8.88281689e-01 0.00000000e+00 -1.01277422e+00 -1.01277422e+00 0.00000000e+00 -1.13726675e+00 -1.13726675e+00 0.00000000e+00 + -3.52671151e-01 -4.85410197e-01 0.00000000e+00 -4.42258801e-01 -5.94193491e-01 0.00000000e+00 -5.31846451e-01 -7.02976785e-01 0.00000000e+00 -6.21434101e-01 -8.11760079e-01 0.00000000e+00 + 1.54508497e-01 4.75528258e-01 0.00000000e+00 1.79183975e-01 4.66790213e-01 0.00000000e+00 2.03368322e-01 4.56772729e-01 0.00000000e+00 2.26995250e-01 4.45503262e-01 0.00000000e+00 + -9.33970440e-01 -1.57973665e+00 0.00000000e+00 -1.03673913e+00 -1.57503387e+00 0.00000000e+00 -1.13950782e+00 -1.57033109e+00 0.00000000e+00 -1.24227651e+00 -1.56562831e+00 0.00000000e+00 + 5.00000000e-01 0.00000000e+00 0.00000000e+00 5.33333333e-01 0.00000000e+00 0.00000000e+00 5.66666667e-01 0.00000000e+00 0.00000000e+00 6.00000000e-01 0.00000000e+00 0.00000000e+00 + 4.63505130e-01 -1.21740590e+00 0.00000000e+00 3.86465173e-01 -1.22141716e+00 0.00000000e+00 3.09425216e-01 -1.22542843e+00 0.00000000e+00 2.32385259e-01 -1.22943970e+00 0.00000000e+00 + -3.17836356e-01 -8.78620570e-01 0.00000000e+00 -3.69312986e-01 -8.69198376e-01 0.00000000e+00 -4.20789616e-01 -8.59776181e-01 0.00000000e+00 -4.72266246e-01 -8.50353987e-01 0.00000000e+00 + -1.13726675e+00 -1.13726675e+00 0.00000000e+00 -1.14842615e+00 -1.06386895e+00 0.00000000e+00 -1.15958555e+00 -9.90471148e-01 0.00000000e+00 -1.17074495e+00 -9.17073345e-01 0.00000000e+00 + 5.57494171e+00 1.00000000e+01 0.00000000e+00 5.57494171e+00 9.46666667e+00 0.00000000e+00 5.57494171e+00 8.93333333e+00 0.00000000e+00 5.57494171e+00 8.40000000e+00 0.00000000e+00 + -9.33970440e-01 -1.57973665e+00 0.00000000e+00 -1.02264696e+00 -1.71982444e+00 0.00000000e+00 -1.11132348e+00 -1.85991222e+00 0.00000000e+00 -1.20000000e+00 -2.00000000e+00 0.00000000e+00 + -4.85410197e-01 3.52671151e-01 0.00000000e+00 -4.58442963e-01 3.33078310e-01 0.00000000e+00 -4.31475730e-01 3.13485468e-01 0.00000000e+00 -4.04508497e-01 2.93892626e-01 0.00000000e+00 + 5.57494171e+00 8.00000000e-01 0.00000000e+00 6.11567170e+00 8.00000000e-01 0.00000000e+00 6.65640169e+00 8.00000000e-01 0.00000000e+00 7.19713168e+00 8.00000000e-01 0.00000000e+00 + 4.00000000e+00 8.00000000e-01 0.00000000e+00 4.00000000e+00 6.66666667e-01 0.00000000e+00 4.00000000e+00 5.33333333e-01 0.00000000e+00 4.00000000e+00 4.00000000e-01 0.00000000e+00 + -2.00000000e+00 0.00000000e+00 0.00000000e+00 -2.00000000e+00 -1.33333333e-01 0.00000000e+00 -2.00000000e+00 -2.66666667e-01 0.00000000e+00 -2.00000000e+00 -4.00000000e-01 0.00000000e+00 + -1.54508497e-01 -4.75528258e-01 0.00000000e+00 -1.64809064e-01 -5.07230142e-01 0.00000000e+00 -1.75109630e-01 -5.38932026e-01 0.00000000e+00 -1.85410197e-01 -5.70633910e-01 0.00000000e+00 + -8.40000000e+00 1.00000000e+01 0.00000000e+00 -8.93333333e+00 1.00000000e+01 0.00000000e+00 -9.46666667e+00 1.00000000e+01 0.00000000e+00 -1.00000000e+01 1.00000000e+01 0.00000000e+00 + 5.70633910e-01 -1.85410197e-01 0.00000000e+00 5.60148256e-01 -2.15020770e-01 0.00000000e+00 5.48127275e-01 -2.44041986e-01 0.00000000e+00 5.34603915e-01 -2.72394300e-01 0.00000000e+00 + -1.85410197e-01 -5.70633910e-01 0.00000000e+00 -2.29552250e-01 -6.73296130e-01 0.00000000e+00 -2.73694303e-01 -7.75958350e-01 0.00000000e+00 -3.17836356e-01 -8.78620570e-01 0.00000000e+00 + -9.01659125e-01 0.00000000e+00 0.00000000e+00 -8.99727354e-01 5.32749215e-02 0.00000000e+00 -8.97795583e-01 1.06549843e-01 0.00000000e+00 -8.95863812e-01 1.59824765e-01 0.00000000e+00 + -2.00000000e+00 -8.00000000e-01 0.00000000e+00 -2.00000000e+00 -9.33333333e-01 0.00000000e+00 -2.00000000e+00 -1.06666667e+00 0.00000000e+00 -2.00000000e+00 -1.20000000e+00 0.00000000e+00 + -8.95863812e-01 1.59824765e-01 0.00000000e+00 -7.94780209e-01 1.37836736e-01 0.00000000e+00 -6.93696607e-01 1.15848708e-01 0.00000000e+00 -5.92613004e-01 9.38606790e-02 0.00000000e+00 + -1.24227651e+00 -1.56562831e+00 0.00000000e+00 -1.34421505e+00 -1.55978291e+00 0.00000000e+00 -1.44615358e+00 -1.55393751e+00 0.00000000e+00 -1.54809211e+00 -1.54809211e+00 0.00000000e+00 + -6.80000000e+00 1.60000000e+00 0.00000000e+00 -6.80000000e+00 1.73333333e+00 0.00000000e+00 -6.80000000e+00 1.86666667e+00 0.00000000e+00 -6.80000000e+00 2.00000000e+00 0.00000000e+00 + -1.00000000e+01 6.80000000e+00 0.00000000e+00 -1.00000000e+01 6.26666667e+00 0.00000000e+00 -1.00000000e+01 5.73333333e+00 0.00000000e+00 -1.00000000e+01 5.20000000e+00 0.00000000e+00 + -9.38606790e-02 -5.92613004e-01 0.00000000e+00 -1.24747014e-01 -5.86888560e-01 0.00000000e+00 -1.55291427e-01 -5.79555496e-01 0.00000000e+00 -1.85410197e-01 -5.70633910e-01 0.00000000e+00 + -8.50353987e-01 4.72266246e-01 0.00000000e+00 -8.37489351e-01 5.21988864e-01 0.00000000e+00 -8.24624715e-01 5.71711483e-01 0.00000000e+00 -8.11760079e-01 6.21434101e-01 0.00000000e+00 + 5.92613004e-01 -9.38606790e-02 0.00000000e+00 5.86888560e-01 -1.24747014e-01 0.00000000e+00 5.79555496e-01 -1.55291427e-01 0.00000000e+00 5.70633910e-01 -1.85410197e-01 0.00000000e+00 + -2.72394300e-01 -5.34603915e-01 0.00000000e+00 -3.00000000e-01 -5.19615242e-01 0.00000000e+00 -3.26783421e-01 -5.03202341e-01 0.00000000e+00 -3.52671151e-01 -4.85410197e-01 0.00000000e+00 + -2.00000000e+00 8.00000000e-01 0.00000000e+00 -1.86335659e+00 7.41246928e-01 0.00000000e+00 -1.72671317e+00 6.82493855e-01 0.00000000e+00 -1.59006976e+00 6.23740783e-01 0.00000000e+00 + -3.17836356e-01 -8.78620570e-01 0.00000000e+00 -3.66392614e-01 -9.91549012e-01 0.00000000e+00 -4.14948872e-01 -1.10447745e+00 0.00000000e+00 -4.63505130e-01 -1.21740590e+00 0.00000000e+00 + -4.63505130e-01 -1.21740590e+00 0.00000000e+00 -5.16917014e-01 -1.34162718e+00 0.00000000e+00 -5.70328898e-01 -1.46584847e+00 0.00000000e+00 -6.23740783e-01 -1.59006976e+00 0.00000000e+00 + -6.23740783e-01 -1.59006976e+00 0.00000000e+00 -6.82493855e-01 -1.72671317e+00 0.00000000e+00 -7.41246928e-01 -1.86335659e+00 0.00000000e+00 -8.00000000e-01 -2.00000000e+00 0.00000000e+00 + -9.38606790e-02 -5.92613004e-01 0.00000000e+00 -1.15848708e-01 -6.93696607e-01 0.00000000e+00 -1.37836736e-01 -7.94780209e-01 0.00000000e+00 -1.59824765e-01 -8.95863812e-01 0.00000000e+00 + -5.20000000e+00 -5.20000000e+00 0.00000000e+00 -4.66666667e+00 -5.20000000e+00 0.00000000e+00 -4.13333333e+00 -5.20000000e+00 0.00000000e+00 -3.60000000e+00 -5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -8.00000000e-01 0.00000000e+00 1.86335659e+00 -7.41246928e-01 0.00000000e+00 1.72671317e+00 -6.82493855e-01 0.00000000e+00 1.59006976e+00 -6.23740783e-01 0.00000000e+00 + -2.32385259e-01 -1.22943970e+00 0.00000000e+00 -2.58990773e-01 -1.35175086e+00 0.00000000e+00 -2.85596288e-01 -1.47406202e+00 0.00000000e+00 -3.12201802e-01 -1.59637318e+00 0.00000000e+00 + 0.00000000e+00 -2.00000000e+00 0.00000000e+00 0.00000000e+00 -1.86616390e+00 0.00000000e+00 0.00000000e+00 -1.73232780e+00 0.00000000e+00 0.00000000e+00 -1.59849170e+00 0.00000000e+00 + 0.00000000e+00 6.00000000e-01 0.00000000e+00 3.14015737e-02 5.99177721e-01 0.00000000e+00 6.27170780e-02 5.96713137e-01 0.00000000e+00 9.38606790e-02 5.92613004e-01 0.00000000e+00 + -8.40000000e+00 -3.60000000e+00 0.00000000e+00 -7.86666667e+00 -3.60000000e+00 0.00000000e+00 -7.33333333e+00 -3.60000000e+00 0.00000000e+00 -6.80000000e+00 -3.60000000e+00 0.00000000e+00 + 5.34603915e-01 2.72394300e-01 0.00000000e+00 5.48127275e-01 2.44041986e-01 0.00000000e+00 5.60148256e-01 2.15020770e-01 0.00000000e+00 5.70633910e-01 1.85410197e-01 0.00000000e+00 + 0.00000000e+00 -9.01659125e-01 0.00000000e+00 0.00000000e+00 -8.01106084e-01 0.00000000e+00 0.00000000e+00 -7.00553042e-01 0.00000000e+00 0.00000000e+00 -6.00000000e-01 0.00000000e+00 + 1.60000000e+00 8.40000000e+00 0.00000000e+00 1.60000000e+00 7.86666667e+00 0.00000000e+00 1.60000000e+00 7.33333333e+00 0.00000000e+00 1.60000000e+00 6.80000000e+00 0.00000000e+00 + -1.21740590e+00 -4.63505130e-01 0.00000000e+00 -1.34162718e+00 -5.16917014e-01 0.00000000e+00 -1.46584847e+00 -5.70328898e-01 0.00000000e+00 -1.59006976e+00 -6.23740783e-01 0.00000000e+00 + -1.00000000e+01 2.00000000e+00 0.00000000e+00 -1.00000000e+01 1.86666667e+00 0.00000000e+00 -1.00000000e+01 1.73333333e+00 0.00000000e+00 -1.00000000e+01 1.60000000e+00 0.00000000e+00 + 8.78620570e-01 3.17836356e-01 0.00000000e+00 7.75958350e-01 2.73694303e-01 0.00000000e+00 6.73296130e-01 2.29552250e-01 0.00000000e+00 5.70633910e-01 1.85410197e-01 0.00000000e+00 + 0.00000000e+00 -3.60000000e+00 0.00000000e+00 -1.33333333e-01 -3.60000000e+00 0.00000000e+00 -2.66666667e-01 -3.60000000e+00 0.00000000e+00 -4.00000000e-01 -3.60000000e+00 0.00000000e+00 + -2.32385259e-01 -1.22943970e+00 0.00000000e+00 -3.09425216e-01 -1.22542843e+00 0.00000000e+00 -3.86465173e-01 -1.22141716e+00 0.00000000e+00 -4.63505130e-01 -1.21740590e+00 0.00000000e+00 + 0.00000000e+00 9.01659125e-01 0.00000000e+00 5.32749215e-02 8.99727354e-01 0.00000000e+00 1.06549843e-01 8.97795583e-01 0.00000000e+00 1.59824765e-01 8.95863812e-01 0.00000000e+00 + -1.00000000e+01 5.20000000e+00 0.00000000e+00 -1.00000000e+01 4.66666667e+00 0.00000000e+00 -1.00000000e+01 4.13333333e+00 0.00000000e+00 -1.00000000e+01 3.60000000e+00 0.00000000e+00 + 4.00000000e-01 -2.00000000e+00 0.00000000e+00 3.70733934e-01 -1.86545773e+00 0.00000000e+00 3.41467868e-01 -1.73091545e+00 0.00000000e+00 3.12201802e-01 -1.59637318e+00 0.00000000e+00 + -1.20000000e+00 2.00000000e+00 0.00000000e+00 -1.06666667e+00 2.00000000e+00 0.00000000e+00 -9.33333333e-01 2.00000000e+00 0.00000000e+00 -8.00000000e-01 2.00000000e+00 0.00000000e+00 + 1.41873685e+01 1.00000000e+01 0.00000000e+00 1.41873685e+01 9.46666667e+00 0.00000000e+00 1.41873685e+01 8.93333333e+00 0.00000000e+00 1.41873685e+01 8.40000000e+00 0.00000000e+00 + 0.00000000e+00 -1.23348416e+00 0.00000000e+00 -7.74617529e-02 -1.23213601e+00 0.00000000e+00 -1.54923506e-01 -1.23078785e+00 0.00000000e+00 -2.32385259e-01 -1.22943970e+00 0.00000000e+00 + 1.59824765e-01 8.95863812e-01 0.00000000e+00 2.12495295e-01 8.90116065e-01 0.00000000e+00 2.65165825e-01 8.84368317e-01 0.00000000e+00 3.17836356e-01 8.78620570e-01 0.00000000e+00 + 1.60679313e+01 0.00000000e+00 0.00000000e+00 1.54410771e+01 0.00000000e+00 0.00000000e+00 1.48142228e+01 0.00000000e+00 0.00000000e+00 1.41873685e+01 0.00000000e+00 0.00000000e+00 + 4.00000000e+00 -1.20000000e+00 0.00000000e+00 4.00000000e+00 -1.33333333e+00 0.00000000e+00 4.00000000e+00 -1.46666667e+00 0.00000000e+00 4.00000000e+00 -1.60000000e+00 0.00000000e+00 + 2.32385259e-01 1.22943970e+00 0.00000000e+00 2.08198427e-01 1.11824774e+00 0.00000000e+00 1.84011596e-01 1.00705577e+00 0.00000000e+00 1.59824765e-01 8.95863812e-01 0.00000000e+00 + 8.86798734e+00 1.60000000e+00 0.00000000e+00 8.86798734e+00 1.46666667e+00 0.00000000e+00 8.86798734e+00 1.33333333e+00 0.00000000e+00 8.86798734e+00 1.20000000e+00 0.00000000e+00 + 3.17836356e-01 8.78620570e-01 0.00000000e+00 3.69312986e-01 8.69198376e-01 0.00000000e+00 4.20789616e-01 8.59776181e-01 0.00000000e+00 4.72266246e-01 8.50353987e-01 0.00000000e+00 + -2.00000000e+00 -8.40000000e+00 0.00000000e+00 -2.00000000e+00 -7.86666667e+00 0.00000000e+00 -2.00000000e+00 -7.33333333e+00 0.00000000e+00 -2.00000000e+00 -6.80000000e+00 0.00000000e+00 + 4.63505130e-01 1.21740590e+00 0.00000000e+00 4.14948872e-01 1.10447745e+00 0.00000000e+00 3.66392614e-01 9.91549012e-01 0.00000000e+00 3.17836356e-01 8.78620570e-01 0.00000000e+00 + 4.00000000e-01 -8.40000000e+00 0.00000000e+00 2.66666667e-01 -8.40000000e+00 0.00000000e+00 1.33333333e-01 -8.40000000e+00 0.00000000e+00 0.00000000e+00 -8.40000000e+00 0.00000000e+00 + -2.00000000e+00 2.00000000e+00 0.00000000e+00 -1.86666667e+00 2.00000000e+00 0.00000000e+00 -1.73333333e+00 2.00000000e+00 0.00000000e+00 -1.60000000e+00 2.00000000e+00 0.00000000e+00 + 4.72266246e-01 8.50353987e-01 0.00000000e+00 5.21988864e-01 8.37489351e-01 0.00000000e+00 5.71711483e-01 8.24624715e-01 0.00000000e+00 6.21434101e-01 8.11760079e-01 0.00000000e+00 + -1.20000000e+00 -8.40000000e+00 0.00000000e+00 -1.33333333e+00 -8.40000000e+00 0.00000000e+00 -1.46666667e+00 -8.40000000e+00 0.00000000e+00 -1.60000000e+00 -8.40000000e+00 0.00000000e+00 + 8.00000000e-01 6.80000000e+00 0.00000000e+00 9.33333333e-01 6.80000000e+00 0.00000000e+00 1.06666667e+00 6.80000000e+00 0.00000000e+00 1.20000000e+00 6.80000000e+00 0.00000000e+00 + 6.92125386e-01 1.19767907e+00 0.00000000e+00 6.18839006e-01 1.08190404e+00 0.00000000e+00 5.45552626e-01 9.66129014e-01 0.00000000e+00 4.72266246e-01 8.50353987e-01 0.00000000e+00 + 8.00000000e-01 5.20000000e+00 0.00000000e+00 9.33333333e-01 5.20000000e+00 0.00000000e+00 1.06666667e+00 5.20000000e+00 0.00000000e+00 1.20000000e+00 5.20000000e+00 0.00000000e+00 + 9.17073345e-01 1.17074495e+00 0.00000000e+00 8.18526931e-01 1.05108333e+00 0.00000000e+00 7.19980516e-01 9.31421703e-01 0.00000000e+00 6.21434101e-01 8.11760079e-01 0.00000000e+00 + -6.80000000e+00 -6.80000000e+00 0.00000000e+00 -6.26666667e+00 -6.80000000e+00 0.00000000e+00 -5.73333333e+00 -6.80000000e+00 0.00000000e+00 -5.20000000e+00 -6.80000000e+00 0.00000000e+00 + 8.11760079e-01 6.21434101e-01 0.00000000e+00 8.24624715e-01 5.71711483e-01 0.00000000e+00 8.37489351e-01 5.21988864e-01 0.00000000e+00 8.50353987e-01 4.72266246e-01 0.00000000e+00 + -7.63789156e-01 -7.63789156e-01 0.00000000e+00 -7.79779464e-01 -7.16337471e-01 0.00000000e+00 -7.95769772e-01 -6.68885786e-01 0.00000000e+00 -8.11760079e-01 -6.21434101e-01 0.00000000e+00 + 1.17074495e+00 9.17073345e-01 0.00000000e+00 1.05108333e+00 8.18526931e-01 0.00000000e+00 9.31421703e-01 7.19980516e-01 0.00000000e+00 8.11760079e-01 6.21434101e-01 0.00000000e+00 + 1.05889687e+01 8.00000000e-01 0.00000000e+00 1.05889687e+01 6.66666667e-01 0.00000000e+00 1.05889687e+01 5.33333333e-01 0.00000000e+00 1.05889687e+01 4.00000000e-01 0.00000000e+00 + 3.17836356e-01 8.78620570e-01 0.00000000e+00 2.73694303e-01 7.75958350e-01 0.00000000e+00 2.29552250e-01 6.73296130e-01 0.00000000e+00 1.85410197e-01 5.70633910e-01 0.00000000e+00 + 8.50353987e-01 4.72266246e-01 0.00000000e+00 8.59776181e-01 4.20789616e-01 0.00000000e+00 8.69198376e-01 3.69312986e-01 0.00000000e+00 8.78620570e-01 3.17836356e-01 0.00000000e+00 + 1.23615794e+01 6.80000000e+00 0.00000000e+00 1.23615794e+01 6.26666667e+00 0.00000000e+00 1.23615794e+01 5.73333333e+00 0.00000000e+00 1.23615794e+01 5.20000000e+00 0.00000000e+00 + 1.19767907e+00 6.92125386e-01 0.00000000e+00 1.08190404e+00 6.18839006e-01 0.00000000e+00 9.66129014e-01 5.45552626e-01 0.00000000e+00 8.50353987e-01 4.72266246e-01 0.00000000e+00 + -4.45503262e-01 2.26995250e-01 0.00000000e+00 -4.56772729e-01 2.03368322e-01 0.00000000e+00 -4.66790213e-01 1.79183975e-01 0.00000000e+00 -4.75528258e-01 1.54508497e-01 0.00000000e+00 + 2.66666667e+00 -8.00000000e-01 0.00000000e+00 2.44444444e+00 -8.00000000e-01 0.00000000e+00 2.22222222e+00 -8.00000000e-01 0.00000000e+00 2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 2.32385259e-01 1.22943970e+00 0.00000000e+00 3.09425216e-01 1.22542843e+00 0.00000000e+00 3.86465173e-01 1.22141716e+00 0.00000000e+00 4.63505130e-01 1.21740590e+00 0.00000000e+00 + -1.13726675e+00 1.13726675e+00 0.00000000e+00 -1.06386895e+00 1.14842615e+00 0.00000000e+00 -9.90471148e-01 1.15958555e+00 0.00000000e+00 -9.17073345e-01 1.17074495e+00 0.00000000e+00 + 3.12201802e-01 1.59637318e+00 0.00000000e+00 2.85596288e-01 1.47406202e+00 0.00000000e+00 2.58990773e-01 1.35175086e+00 0.00000000e+00 2.32385259e-01 1.22943970e+00 0.00000000e+00 + -4.72266246e-01 -8.50353987e-01 0.00000000e+00 -5.21988864e-01 -8.37489351e-01 0.00000000e+00 -5.71711483e-01 -8.24624715e-01 0.00000000e+00 -6.21434101e-01 -8.11760079e-01 0.00000000e+00 + -9.17073345e-01 1.17074495e+00 0.00000000e+00 -8.42090692e-01 1.17972299e+00 0.00000000e+00 -7.67108039e-01 1.18870103e+00 0.00000000e+00 -6.92125386e-01 1.19767907e+00 0.00000000e+00 + 6.23740783e-01 1.59006976e+00 0.00000000e+00 5.70328898e-01 1.46584847e+00 0.00000000e+00 5.16917014e-01 1.34162718e+00 0.00000000e+00 4.63505130e-01 1.21740590e+00 0.00000000e+00 + -1.20000000e+00 3.60000000e+00 0.00000000e+00 -1.06666667e+00 3.60000000e+00 0.00000000e+00 -9.33333333e-01 3.60000000e+00 0.00000000e+00 -8.00000000e-01 3.60000000e+00 0.00000000e+00 + 6.92125386e-01 1.19767907e+00 0.00000000e+00 7.67108039e-01 1.18870103e+00 0.00000000e+00 8.42090692e-01 1.17972299e+00 0.00000000e+00 9.17073345e-01 1.17074495e+00 0.00000000e+00 + 1.54809211e+00 1.54809211e+00 0.00000000e+00 1.41115032e+00 1.41115032e+00 0.00000000e+00 1.27420854e+00 1.27420854e+00 0.00000000e+00 1.13726675e+00 1.13726675e+00 0.00000000e+00 + 1.41873685e+01 -1.60000000e+00 0.00000000e+00 1.35787722e+01 -1.60000000e+00 0.00000000e+00 1.29701758e+01 -1.60000000e+00 0.00000000e+00 1.23615794e+01 -1.60000000e+00 0.00000000e+00 + 1.19767907e+00 6.92125386e-01 0.00000000e+00 1.20425468e+00 6.15918634e-01 0.00000000e+00 1.21083029e+00 5.39711882e-01 0.00000000e+00 1.21740590e+00 4.63505130e-01 0.00000000e+00 + -4.75528258e-01 -1.54508497e-01 0.00000000e+00 -5.07230142e-01 -1.64809064e-01 0.00000000e+00 -5.38932026e-01 -1.75109630e-01 0.00000000e+00 -5.70633910e-01 -1.85410197e-01 0.00000000e+00 + 1.57973665e+00 9.33970440e-01 0.00000000e+00 1.45238412e+00 8.53355422e-01 0.00000000e+00 1.32503160e+00 7.72740404e-01 0.00000000e+00 1.19767907e+00 6.92125386e-01 0.00000000e+00 + 1.22943970e+00 2.32385259e-01 0.00000000e+00 1.23078785e+00 1.54923506e-01 0.00000000e+00 1.23213601e+00 7.74617529e-02 0.00000000e+00 1.23348416e+00 0.00000000e+00 0.00000000e+00 + 2.66666667e+00 8.00000000e-01 0.00000000e+00 2.66666667e+00 6.66666667e-01 0.00000000e+00 2.66666667e+00 5.33333333e-01 0.00000000e+00 2.66666667e+00 4.00000000e-01 0.00000000e+00 + -4.24264069e-01 -4.24264069e-01 0.00000000e+00 -4.45886895e-01 -4.01478364e-01 0.00000000e+00 -4.66287577e-01 -3.77592235e-01 0.00000000e+00 -4.85410197e-01 -3.52671151e-01 0.00000000e+00 + -1.54809211e+00 -1.54809211e+00 0.00000000e+00 -1.55393751e+00 -1.44615358e+00 0.00000000e+00 -1.55978291e+00 -1.34421505e+00 0.00000000e+00 -1.56562831e+00 -1.24227651e+00 0.00000000e+00 + -5.20000000e+00 -6.80000000e+00 0.00000000e+00 -5.20000000e+00 -7.33333333e+00 0.00000000e+00 -5.20000000e+00 -7.86666667e+00 0.00000000e+00 -5.20000000e+00 -8.40000000e+00 0.00000000e+00 + 1.59637318e+00 3.12201802e-01 0.00000000e+00 1.47406202e+00 2.85596288e-01 0.00000000e+00 1.35175086e+00 2.58990773e-01 0.00000000e+00 1.22943970e+00 2.32385259e-01 0.00000000e+00 + -5.20000000e+00 8.00000000e-01 0.00000000e+00 -5.20000000e+00 9.33333333e-01 0.00000000e+00 -5.20000000e+00 1.06666667e+00 0.00000000e+00 -5.20000000e+00 1.20000000e+00 0.00000000e+00 + 0.00000000e+00 1.59849170e+00 0.00000000e+00 1.04067267e-01 1.59778553e+00 0.00000000e+00 2.08134535e-01 1.59707935e+00 0.00000000e+00 3.12201802e-01 1.59637318e+00 0.00000000e+00 + 2.93892626e-01 -4.04508497e-01 0.00000000e+00 2.72319518e-01 -4.19335284e-01 0.00000000e+00 2.50000000e-01 -4.33012702e-01 0.00000000e+00 2.26995250e-01 -4.45503262e-01 0.00000000e+00 + 1.20000000e+00 -5.20000000e+00 0.00000000e+00 1.20000000e+00 -5.73333333e+00 0.00000000e+00 1.20000000e+00 -6.26666667e+00 0.00000000e+00 1.20000000e+00 -6.80000000e+00 0.00000000e+00 + 9.01659125e-01 0.00000000e+00 0.00000000e+00 8.99727354e-01 -5.32749215e-02 0.00000000e+00 8.97795583e-01 -1.06549843e-01 0.00000000e+00 8.95863812e-01 -1.59824765e-01 0.00000000e+00 + 3.12201802e-01 1.59637318e+00 0.00000000e+00 4.16048129e-01 1.59427204e+00 0.00000000e+00 5.19894456e-01 1.59217090e+00 0.00000000e+00 6.23740783e-01 1.59006976e+00 0.00000000e+00 + 6.23740783e-01 1.59006976e+00 0.00000000e+00 7.27150668e-01 1.58662539e+00 0.00000000e+00 8.30560554e-01 1.58318102e+00 0.00000000e+00 9.33970440e-01 1.57973665e+00 0.00000000e+00 + 1.54809211e+00 1.54809211e+00 0.00000000e+00 1.55393751e+00 1.44615358e+00 0.00000000e+00 1.55978291e+00 1.34421505e+00 0.00000000e+00 1.56562831e+00 1.24227651e+00 0.00000000e+00 + -1.20000000e+00 2.00000000e+00 0.00000000e+00 -1.20000000e+00 2.53333333e+00 0.00000000e+00 -1.20000000e+00 3.06666667e+00 0.00000000e+00 -1.20000000e+00 3.60000000e+00 0.00000000e+00 + -2.00000000e+00 5.20000000e+00 0.00000000e+00 -2.00000000e+00 5.73333333e+00 0.00000000e+00 -2.00000000e+00 6.26666667e+00 0.00000000e+00 -2.00000000e+00 6.80000000e+00 0.00000000e+00 + -2.00000000e+00 -1.20000000e+00 0.00000000e+00 -2.00000000e+00 -1.33333333e+00 0.00000000e+00 -2.00000000e+00 -1.46666667e+00 0.00000000e+00 -2.00000000e+00 -1.60000000e+00 0.00000000e+00 + -8.40000000e+00 -1.60000000e+00 0.00000000e+00 -8.40000000e+00 -1.73333333e+00 0.00000000e+00 -8.40000000e+00 -1.86666667e+00 0.00000000e+00 -8.40000000e+00 -2.00000000e+00 0.00000000e+00 + 9.17073345e-01 1.17074495e+00 0.00000000e+00 9.90471148e-01 1.15958555e+00 0.00000000e+00 1.06386895e+00 1.14842615e+00 0.00000000e+00 1.13726675e+00 1.13726675e+00 0.00000000e+00 + 1.41873685e+01 6.80000000e+00 0.00000000e+00 1.48142228e+01 6.80000000e+00 0.00000000e+00 1.54410771e+01 6.80000000e+00 0.00000000e+00 1.60679313e+01 6.80000000e+00 0.00000000e+00 + 4.72266246e-01 8.50353987e-01 0.00000000e+00 4.05642264e-01 7.45103963e-01 0.00000000e+00 3.39018282e-01 6.39853939e-01 0.00000000e+00 2.72394300e-01 5.34603915e-01 0.00000000e+00 + 2.00000000e+00 1.60000000e+00 0.00000000e+00 1.85520944e+00 1.48075884e+00 0.00000000e+00 1.71041887e+00 1.36151768e+00 0.00000000e+00 1.56562831e+00 1.24227651e+00 0.00000000e+00 + 8.00000000e-01 5.20000000e+00 0.00000000e+00 8.00000000e-01 4.66666667e+00 0.00000000e+00 8.00000000e-01 4.13333333e+00 0.00000000e+00 8.00000000e-01 3.60000000e+00 0.00000000e+00 + 2.00000000e+00 1.20000000e+00 0.00000000e+00 2.00000000e+00 1.33333333e+00 0.00000000e+00 2.00000000e+00 1.46666667e+00 0.00000000e+00 2.00000000e+00 1.60000000e+00 0.00000000e+00 + -1.00000000e+01 -5.20000000e+00 0.00000000e+00 -1.00000000e+01 -5.73333333e+00 0.00000000e+00 -1.00000000e+01 -6.26666667e+00 0.00000000e+00 -1.00000000e+01 -6.80000000e+00 0.00000000e+00 + 2.00000000e+00 8.00000000e-01 0.00000000e+00 2.00000000e+00 9.33333333e-01 0.00000000e+00 2.00000000e+00 1.06666667e+00 0.00000000e+00 2.00000000e+00 1.20000000e+00 0.00000000e+00 + 3.33333333e+00 -1.60000000e+00 0.00000000e+00 3.11111111e+00 -1.60000000e+00 0.00000000e+00 2.88888889e+00 -1.60000000e+00 0.00000000e+00 2.66666667e+00 -1.60000000e+00 0.00000000e+00 + 8.86798734e+00 0.00000000e+00 0.00000000e+00 8.31103545e+00 0.00000000e+00 0.00000000e+00 7.75408356e+00 0.00000000e+00 0.00000000e+00 7.19713168e+00 0.00000000e+00 0.00000000e+00 + 1.59006976e+00 6.23740783e-01 0.00000000e+00 1.59217090e+00 5.19894456e-01 0.00000000e+00 1.59427204e+00 4.16048129e-01 0.00000000e+00 1.59637318e+00 3.12201802e-01 0.00000000e+00 + 2.00000000e+00 8.00000000e-01 0.00000000e+00 1.86335659e+00 7.41246928e-01 0.00000000e+00 1.72671317e+00 6.82493855e-01 0.00000000e+00 1.59006976e+00 6.23740783e-01 0.00000000e+00 + 8.00000000e-01 -2.00000000e+00 0.00000000e+00 8.00000000e-01 -2.53333333e+00 0.00000000e+00 8.00000000e-01 -3.06666667e+00 0.00000000e+00 8.00000000e-01 -3.60000000e+00 0.00000000e+00 + 2.00000000e+00 4.00000000e-01 0.00000000e+00 2.00000000e+00 5.33333333e-01 0.00000000e+00 2.00000000e+00 6.66666667e-01 0.00000000e+00 2.00000000e+00 8.00000000e-01 0.00000000e+00 + -3.60000000e+00 -4.00000000e-01 0.00000000e+00 -3.06666667e+00 -4.00000000e-01 0.00000000e+00 -2.53333333e+00 -4.00000000e-01 0.00000000e+00 -2.00000000e+00 -4.00000000e-01 0.00000000e+00 + -1.21740590e+00 4.63505130e-01 0.00000000e+00 -1.21083029e+00 5.39711882e-01 0.00000000e+00 -1.20425468e+00 6.15918634e-01 0.00000000e+00 -1.19767907e+00 6.92125386e-01 0.00000000e+00 + 1.59849170e+00 0.00000000e+00 0.00000000e+00 1.73232780e+00 0.00000000e+00 0.00000000e+00 1.86616390e+00 0.00000000e+00 0.00000000e+00 2.00000000e+00 0.00000000e+00 0.00000000e+00 + 8.00000000e-01 -3.60000000e+00 0.00000000e+00 8.00000000e-01 -4.13333333e+00 0.00000000e+00 8.00000000e-01 -4.66666667e+00 0.00000000e+00 8.00000000e-01 -5.20000000e+00 0.00000000e+00 + 1.60679313e+01 1.60000000e+00 0.00000000e+00 1.67135912e+01 1.60000000e+00 0.00000000e+00 1.73592511e+01 1.60000000e+00 0.00000000e+00 1.80049110e+01 1.60000000e+00 0.00000000e+00 + 1.59637318e+00 3.12201802e-01 0.00000000e+00 1.59707935e+00 2.08134535e-01 0.00000000e+00 1.59778553e+00 1.04067267e-01 0.00000000e+00 1.59849170e+00 0.00000000e+00 0.00000000e+00 + 2.00000000e+00 4.00000000e-01 0.00000000e+00 1.86545773e+00 3.70733934e-01 0.00000000e+00 1.73091545e+00 3.41467868e-01 0.00000000e+00 1.59637318e+00 3.12201802e-01 0.00000000e+00 + 4.00000000e+00 -8.40000000e+00 0.00000000e+00 3.77777778e+00 -8.40000000e+00 0.00000000e+00 3.55555556e+00 -8.40000000e+00 0.00000000e+00 3.33333333e+00 -8.40000000e+00 0.00000000e+00 + -6.00000000e-01 0.00000000e+00 0.00000000e+00 -5.99177721e-01 3.14015737e-02 0.00000000e+00 -5.96713137e-01 6.27170780e-02 0.00000000e+00 -5.92613004e-01 9.38606790e-02 0.00000000e+00 + 8.86798734e+00 -3.60000000e+00 0.00000000e+00 8.86798734e+00 -4.13333333e+00 0.00000000e+00 8.86798734e+00 -4.66666667e+00 0.00000000e+00 8.86798734e+00 -5.20000000e+00 0.00000000e+00 + 4.00000000e+00 1.20000000e+00 0.00000000e+00 4.00000000e+00 1.06666667e+00 0.00000000e+00 4.00000000e+00 9.33333333e-01 0.00000000e+00 4.00000000e+00 8.00000000e-01 0.00000000e+00 + -9.33970440e-01 1.57973665e+00 0.00000000e+00 -8.53355422e-01 1.45238412e+00 0.00000000e+00 -7.72740404e-01 1.32503160e+00 0.00000000e+00 -6.92125386e-01 1.19767907e+00 0.00000000e+00 + -5.92613004e-01 9.38606790e-02 0.00000000e+00 -5.86888560e-01 1.24747014e-01 0.00000000e+00 -5.79555496e-01 1.55291427e-01 0.00000000e+00 -5.70633910e-01 1.85410197e-01 0.00000000e+00 + 8.78620570e-01 3.17836356e-01 0.00000000e+00 8.84368317e-01 2.65165825e-01 0.00000000e+00 8.90116065e-01 2.12495295e-01 0.00000000e+00 8.95863812e-01 1.59824765e-01 0.00000000e+00 + -5.70633910e-01 1.85410197e-01 0.00000000e+00 -5.60148256e-01 2.15020770e-01 0.00000000e+00 -5.48127275e-01 2.44041986e-01 0.00000000e+00 -5.34603915e-01 2.72394300e-01 0.00000000e+00 + -8.78620570e-01 3.17836356e-01 0.00000000e+00 -7.75958350e-01 2.73694303e-01 0.00000000e+00 -6.73296130e-01 2.29552250e-01 0.00000000e+00 -5.70633910e-01 1.85410197e-01 0.00000000e+00 + -5.34603915e-01 2.72394300e-01 0.00000000e+00 -5.19615242e-01 3.00000000e-01 0.00000000e+00 -5.03202341e-01 3.26783421e-01 0.00000000e+00 -4.85410197e-01 3.52671151e-01 0.00000000e+00 + -1.20000000e+00 5.20000000e+00 0.00000000e+00 -1.20000000e+00 5.73333333e+00 0.00000000e+00 -1.20000000e+00 6.26666667e+00 0.00000000e+00 -1.20000000e+00 6.80000000e+00 0.00000000e+00 + -4.85410197e-01 3.52671151e-01 0.00000000e+00 -4.66287577e-01 3.77592235e-01 0.00000000e+00 -4.45886895e-01 4.01478364e-01 0.00000000e+00 -4.24264069e-01 4.24264069e-01 0.00000000e+00 + -8.11760079e-01 6.21434101e-01 0.00000000e+00 -7.02976785e-01 5.31846451e-01 0.00000000e+00 -5.94193491e-01 4.42258801e-01 0.00000000e+00 -4.85410197e-01 3.52671151e-01 0.00000000e+00 + -4.24264069e-01 4.24264069e-01 0.00000000e+00 -4.01478364e-01 4.45886895e-01 0.00000000e+00 -3.77592235e-01 4.66287577e-01 0.00000000e+00 -3.52671151e-01 4.85410197e-01 0.00000000e+00 + -3.52671151e-01 4.85410197e-01 0.00000000e+00 -3.26783421e-01 5.03202341e-01 0.00000000e+00 -3.00000000e-01 5.19615242e-01 0.00000000e+00 -2.72394300e-01 5.34603915e-01 0.00000000e+00 + -4.00000000e-01 -3.60000000e+00 0.00000000e+00 -4.00000000e-01 -4.13333333e+00 0.00000000e+00 -4.00000000e-01 -4.66666667e+00 0.00000000e+00 -4.00000000e-01 -5.20000000e+00 0.00000000e+00 + 3.33333333e+00 -8.40000000e+00 0.00000000e+00 3.11111111e+00 -8.40000000e+00 0.00000000e+00 2.88888889e+00 -8.40000000e+00 0.00000000e+00 2.66666667e+00 -8.40000000e+00 0.00000000e+00 + 8.86798734e+00 8.40000000e+00 0.00000000e+00 8.86798734e+00 7.86666667e+00 0.00000000e+00 8.86798734e+00 7.33333333e+00 0.00000000e+00 8.86798734e+00 6.80000000e+00 0.00000000e+00 + -2.72394300e-01 5.34603915e-01 0.00000000e+00 -2.44041986e-01 5.48127275e-01 0.00000000e+00 -2.15020770e-01 5.60148256e-01 0.00000000e+00 -1.85410197e-01 5.70633910e-01 0.00000000e+00 + 2.66666667e+00 -6.80000000e+00 0.00000000e+00 2.66666667e+00 -7.33333333e+00 0.00000000e+00 2.66666667e+00 -7.86666667e+00 0.00000000e+00 2.66666667e+00 -8.40000000e+00 0.00000000e+00 + -1.85410197e-01 5.70633910e-01 0.00000000e+00 -1.55291427e-01 5.79555496e-01 0.00000000e+00 -1.24747014e-01 5.86888560e-01 0.00000000e+00 -9.38606790e-02 5.92613004e-01 0.00000000e+00 + -8.00000000e-01 1.00000000e+01 0.00000000e+00 -9.33333333e-01 1.00000000e+01 0.00000000e+00 -1.06666667e+00 1.00000000e+01 0.00000000e+00 -1.20000000e+00 1.00000000e+01 0.00000000e+00 + -3.17836356e-01 8.78620570e-01 0.00000000e+00 -2.73694303e-01 7.75958350e-01 0.00000000e+00 -2.29552250e-01 6.73296130e-01 0.00000000e+00 -1.85410197e-01 5.70633910e-01 0.00000000e+00 + -6.80000000e+00 -2.00000000e+00 0.00000000e+00 -6.26666667e+00 -2.00000000e+00 0.00000000e+00 -5.73333333e+00 -2.00000000e+00 0.00000000e+00 -5.20000000e+00 -2.00000000e+00 0.00000000e+00 + 0.00000000e+00 8.40000000e+00 0.00000000e+00 0.00000000e+00 8.93333333e+00 0.00000000e+00 0.00000000e+00 9.46666667e+00 0.00000000e+00 0.00000000e+00 1.00000000e+01 0.00000000e+00 + 0.00000000e+00 6.00000000e-01 0.00000000e+00 0.00000000e+00 7.00553042e-01 0.00000000e+00 0.00000000e+00 8.01106084e-01 0.00000000e+00 0.00000000e+00 9.01659125e-01 0.00000000e+00 + 0.00000000e+00 1.00000000e+01 0.00000000e+00 -1.33333333e-01 1.00000000e+01 0.00000000e+00 -2.66666667e-01 1.00000000e+01 0.00000000e+00 -4.00000000e-01 1.00000000e+01 0.00000000e+00 + -1.22943970e+00 2.32385259e-01 0.00000000e+00 -1.11824774e+00 2.08198427e-01 0.00000000e+00 -1.00705577e+00 1.84011596e-01 0.00000000e+00 -8.95863812e-01 1.59824765e-01 0.00000000e+00 + -8.78620570e-01 3.17836356e-01 0.00000000e+00 -8.69198376e-01 3.69312986e-01 0.00000000e+00 -8.59776181e-01 4.20789616e-01 0.00000000e+00 -8.50353987e-01 4.72266246e-01 0.00000000e+00 + -1.21740590e+00 4.63505130e-01 0.00000000e+00 -1.10447745e+00 4.14948872e-01 0.00000000e+00 -9.91549012e-01 3.66392614e-01 0.00000000e+00 -8.78620570e-01 3.17836356e-01 0.00000000e+00 + -8.40000000e+00 -4.00000000e-01 0.00000000e+00 -7.86666667e+00 -4.00000000e-01 0.00000000e+00 -7.33333333e+00 -4.00000000e-01 0.00000000e+00 -6.80000000e+00 -4.00000000e-01 0.00000000e+00 + 5.57494171e+00 6.80000000e+00 0.00000000e+00 6.11567170e+00 6.80000000e+00 0.00000000e+00 6.65640169e+00 6.80000000e+00 0.00000000e+00 7.19713168e+00 6.80000000e+00 0.00000000e+00 + 4.24264069e-01 4.24264069e-01 0.00000000e+00 4.45886895e-01 4.01478364e-01 0.00000000e+00 4.66287577e-01 3.77592235e-01 0.00000000e+00 4.85410197e-01 3.52671151e-01 0.00000000e+00 + -1.59824765e-01 8.95863812e-01 0.00000000e+00 -1.37836736e-01 7.94780209e-01 0.00000000e+00 -1.15848708e-01 6.93696607e-01 0.00000000e+00 -9.38606790e-02 5.92613004e-01 0.00000000e+00 + -6.80000000e+00 2.00000000e+00 0.00000000e+00 -6.26666667e+00 2.00000000e+00 0.00000000e+00 -5.73333333e+00 2.00000000e+00 0.00000000e+00 -5.20000000e+00 2.00000000e+00 0.00000000e+00 + 0.00000000e+00 -9.01659125e-01 0.00000000e+00 -5.32749215e-02 -8.99727354e-01 0.00000000e+00 -1.06549843e-01 -8.97795583e-01 0.00000000e+00 -1.59824765e-01 -8.95863812e-01 0.00000000e+00 + -1.19767907e+00 6.92125386e-01 0.00000000e+00 -1.08190404e+00 6.18839006e-01 0.00000000e+00 -9.66129014e-01 5.45552626e-01 0.00000000e+00 -8.50353987e-01 4.72266246e-01 0.00000000e+00 + -6.80000000e+00 -4.00000000e-01 0.00000000e+00 -6.26666667e+00 -4.00000000e-01 0.00000000e+00 -5.73333333e+00 -4.00000000e-01 0.00000000e+00 -5.20000000e+00 -4.00000000e-01 0.00000000e+00 + -8.11760079e-01 6.21434101e-01 0.00000000e+00 -7.95769772e-01 6.68885786e-01 0.00000000e+00 -7.79779464e-01 7.16337471e-01 0.00000000e+00 -7.63789156e-01 7.63789156e-01 0.00000000e+00 + 5.57494171e+00 -1.60000000e+00 0.00000000e+00 5.57494171e+00 -1.73333333e+00 0.00000000e+00 5.57494171e+00 -1.86666667e+00 0.00000000e+00 5.57494171e+00 -2.00000000e+00 0.00000000e+00 + -6.80000000e+00 -8.00000000e-01 0.00000000e+00 -6.26666667e+00 -8.00000000e-01 0.00000000e+00 -5.73333333e+00 -8.00000000e-01 0.00000000e+00 -5.20000000e+00 -8.00000000e-01 0.00000000e+00 + -7.63789156e-01 7.63789156e-01 0.00000000e+00 -7.16337471e-01 7.79779464e-01 0.00000000e+00 -6.68885786e-01 7.95769772e-01 0.00000000e+00 -6.21434101e-01 8.11760079e-01 0.00000000e+00 + -5.20000000e+00 3.60000000e+00 0.00000000e+00 -4.66666667e+00 3.60000000e+00 0.00000000e+00 -4.13333333e+00 3.60000000e+00 0.00000000e+00 -3.60000000e+00 3.60000000e+00 0.00000000e+00 + 4.24264069e-01 -4.24264069e-01 0.00000000e+00 4.01478364e-01 -4.45886895e-01 0.00000000e+00 3.77592235e-01 -4.66287577e-01 0.00000000e+00 3.52671151e-01 -4.85410197e-01 0.00000000e+00 + 1.05889687e+01 2.00000000e+00 0.00000000e+00 1.00153082e+01 2.00000000e+00 0.00000000e+00 9.44164778e+00 2.00000000e+00 0.00000000e+00 8.86798734e+00 2.00000000e+00 0.00000000e+00 + -1.13726675e+00 1.13726675e+00 0.00000000e+00 -1.01277422e+00 1.01277422e+00 0.00000000e+00 -8.88281689e-01 8.88281689e-01 0.00000000e+00 -7.63789156e-01 7.63789156e-01 0.00000000e+00 + 4.00000000e-01 -2.00000000e+00 0.00000000e+00 5.33333333e-01 -2.00000000e+00 0.00000000e+00 6.66666667e-01 -2.00000000e+00 0.00000000e+00 8.00000000e-01 -2.00000000e+00 0.00000000e+00 + -6.80000000e+00 8.40000000e+00 0.00000000e+00 -6.26666667e+00 8.40000000e+00 0.00000000e+00 -5.73333333e+00 8.40000000e+00 0.00000000e+00 -5.20000000e+00 8.40000000e+00 0.00000000e+00 + 2.00000000e+00 2.00000000e+00 0.00000000e+00 1.84936404e+00 1.84936404e+00 0.00000000e+00 1.69872807e+00 1.69872807e+00 0.00000000e+00 1.54809211e+00 1.54809211e+00 0.00000000e+00 + 1.41873685e+01 -8.40000000e+00 0.00000000e+00 1.48142228e+01 -8.40000000e+00 0.00000000e+00 1.54410771e+01 -8.40000000e+00 0.00000000e+00 1.60679313e+01 -8.40000000e+00 0.00000000e+00 + 1.23615794e+01 1.60000000e+00 0.00000000e+00 1.23615794e+01 1.46666667e+00 0.00000000e+00 1.23615794e+01 1.33333333e+00 0.00000000e+00 1.23615794e+01 1.20000000e+00 0.00000000e+00 + -6.21434101e-01 8.11760079e-01 0.00000000e+00 -5.71711483e-01 8.24624715e-01 0.00000000e+00 -5.21988864e-01 8.37489351e-01 0.00000000e+00 -4.72266246e-01 8.50353987e-01 0.00000000e+00 + -9.17073345e-01 1.17074495e+00 0.00000000e+00 -8.18526931e-01 1.05108333e+00 0.00000000e+00 -7.19980516e-01 9.31421703e-01 0.00000000e+00 -6.21434101e-01 8.11760079e-01 0.00000000e+00 + 5.57494171e+00 -1.20000000e+00 0.00000000e+00 5.57494171e+00 -1.33333333e+00 0.00000000e+00 5.57494171e+00 -1.46666667e+00 0.00000000e+00 5.57494171e+00 -1.60000000e+00 0.00000000e+00 + 1.59006976e+00 -6.23740783e-01 0.00000000e+00 1.58662539e+00 -7.27150668e-01 0.00000000e+00 1.58318102e+00 -8.30560554e-01 0.00000000e+00 1.57973665e+00 -9.33970440e-01 0.00000000e+00 + 7.82172325e-02 -4.93844170e-01 0.00000000e+00 8.34317147e-02 -5.26767115e-01 0.00000000e+00 8.86461969e-02 -5.59690060e-01 0.00000000e+00 9.38606790e-02 -5.92613004e-01 0.00000000e+00 + -3.17836356e-01 8.78620570e-01 0.00000000e+00 -2.65165825e-01 8.84368317e-01 0.00000000e+00 -2.12495295e-01 8.90116065e-01 0.00000000e+00 -1.59824765e-01 8.95863812e-01 0.00000000e+00 + -8.00000000e-01 8.40000000e+00 0.00000000e+00 -6.66666667e-01 8.40000000e+00 0.00000000e+00 -5.33333333e-01 8.40000000e+00 0.00000000e+00 -4.00000000e-01 8.40000000e+00 0.00000000e+00 + 2.00000000e+00 1.60000000e+00 0.00000000e+00 2.22222222e+00 1.60000000e+00 0.00000000e+00 2.44444444e+00 1.60000000e+00 0.00000000e+00 2.66666667e+00 1.60000000e+00 0.00000000e+00 + 0.00000000e+00 9.01659125e-01 0.00000000e+00 0.00000000e+00 1.01226747e+00 0.00000000e+00 0.00000000e+00 1.12287582e+00 0.00000000e+00 0.00000000e+00 1.23348416e+00 0.00000000e+00 + -2.32385259e-01 1.22943970e+00 0.00000000e+00 -2.08198427e-01 1.11824774e+00 0.00000000e+00 -1.84011596e-01 1.00705577e+00 0.00000000e+00 -1.59824765e-01 8.95863812e-01 0.00000000e+00 + -4.72266246e-01 8.50353987e-01 0.00000000e+00 -4.20789616e-01 8.59776181e-01 0.00000000e+00 -3.69312986e-01 8.69198376e-01 0.00000000e+00 -3.17836356e-01 8.78620570e-01 0.00000000e+00 + -1.59849170e+00 0.00000000e+00 0.00000000e+00 -1.47682252e+00 0.00000000e+00 0.00000000e+00 -1.35515334e+00 0.00000000e+00 0.00000000e+00 -1.23348416e+00 0.00000000e+00 0.00000000e+00 + -1.00000000e+01 -1.20000000e+00 0.00000000e+00 -9.46666667e+00 -1.20000000e+00 0.00000000e+00 -8.93333333e+00 -1.20000000e+00 0.00000000e+00 -8.40000000e+00 -1.20000000e+00 0.00000000e+00 + 1.60000000e+00 -2.00000000e+00 0.00000000e+00 1.48075884e+00 -1.85520944e+00 0.00000000e+00 1.36151768e+00 -1.71041887e+00 0.00000000e+00 1.24227651e+00 -1.56562831e+00 0.00000000e+00 + 1.80049110e+01 0.00000000e+00 0.00000000e+00 1.80049110e+01 -1.33333333e-01 0.00000000e+00 1.80049110e+01 -2.66666667e-01 0.00000000e+00 1.80049110e+01 -4.00000000e-01 0.00000000e+00 + 2.00000000e+01 4.00000000e-01 0.00000000e+00 2.00000000e+01 2.66666667e-01 0.00000000e+00 2.00000000e+01 1.33333333e-01 0.00000000e+00 2.00000000e+01 0.00000000e+00 0.00000000e+00 + -6.80000000e+00 3.60000000e+00 0.00000000e+00 -6.80000000e+00 4.13333333e+00 0.00000000e+00 -6.80000000e+00 4.66666667e+00 0.00000000e+00 -6.80000000e+00 5.20000000e+00 0.00000000e+00 + -5.92613004e-01 -9.38606790e-02 0.00000000e+00 -6.93696607e-01 -1.15848708e-01 0.00000000e+00 -7.94780209e-01 -1.37836736e-01 0.00000000e+00 -8.95863812e-01 -1.59824765e-01 0.00000000e+00 + -5.20000000e+00 -1.20000000e+00 0.00000000e+00 -4.66666667e+00 -1.20000000e+00 0.00000000e+00 -4.13333333e+00 -1.20000000e+00 0.00000000e+00 -3.60000000e+00 -1.20000000e+00 0.00000000e+00 + 1.21740590e+00 4.63505130e-01 0.00000000e+00 1.10447745e+00 4.14948872e-01 0.00000000e+00 9.91549012e-01 3.66392614e-01 0.00000000e+00 8.78620570e-01 3.17836356e-01 0.00000000e+00 + -1.22943970e+00 2.32385259e-01 0.00000000e+00 -1.22542843e+00 3.09425216e-01 0.00000000e+00 -1.22141716e+00 3.86465173e-01 0.00000000e+00 -1.21740590e+00 4.63505130e-01 0.00000000e+00 + -4.93844170e-01 -7.82172325e-02 0.00000000e+00 -5.26767115e-01 -8.34317147e-02 0.00000000e+00 -5.59690060e-01 -8.86461969e-02 0.00000000e+00 -5.92613004e-01 -9.38606790e-02 0.00000000e+00 + -1.59637318e+00 3.12201802e-01 0.00000000e+00 -1.47406202e+00 2.85596288e-01 0.00000000e+00 -1.35175086e+00 2.58990773e-01 0.00000000e+00 -1.22943970e+00 2.32385259e-01 0.00000000e+00 + -1.59006976e+00 6.23740783e-01 0.00000000e+00 -1.46584847e+00 5.70328898e-01 0.00000000e+00 -1.34162718e+00 5.16917014e-01 0.00000000e+00 -1.21740590e+00 4.63505130e-01 0.00000000e+00 + 3.33333333e+00 1.60000000e+00 0.00000000e+00 3.33333333e+00 1.46666667e+00 0.00000000e+00 3.33333333e+00 1.33333333e+00 0.00000000e+00 3.33333333e+00 1.20000000e+00 0.00000000e+00 + 8.86798734e+00 1.60000000e+00 0.00000000e+00 9.44164778e+00 1.60000000e+00 0.00000000e+00 1.00153082e+01 1.60000000e+00 0.00000000e+00 1.05889687e+01 1.60000000e+00 0.00000000e+00 + 1.41873685e+01 1.00000000e+01 0.00000000e+00 1.48142228e+01 1.00000000e+01 0.00000000e+00 1.54410771e+01 1.00000000e+01 0.00000000e+00 1.60679313e+01 1.00000000e+01 0.00000000e+00 + -1.54809211e+00 -1.54809211e+00 0.00000000e+00 -1.69872807e+00 -1.69872807e+00 0.00000000e+00 -1.84936404e+00 -1.84936404e+00 0.00000000e+00 -2.00000000e+00 -2.00000000e+00 0.00000000e+00 + 1.22943970e+00 2.32385259e-01 0.00000000e+00 1.11824774e+00 2.08198427e-01 0.00000000e+00 1.00705577e+00 1.84011596e-01 0.00000000e+00 8.95863812e-01 1.59824765e-01 0.00000000e+00 + -1.17074495e+00 9.17073345e-01 0.00000000e+00 -1.15958555e+00 9.90471148e-01 0.00000000e+00 -1.14842615e+00 1.06386895e+00 0.00000000e+00 -1.13726675e+00 1.13726675e+00 0.00000000e+00 + -6.92125386e-01 1.19767907e+00 0.00000000e+00 -6.18839006e-01 1.08190404e+00 0.00000000e+00 -5.45552626e-01 9.66129014e-01 0.00000000e+00 -4.72266246e-01 8.50353987e-01 0.00000000e+00 + -1.56562831e+00 1.24227651e+00 0.00000000e+00 -1.43400052e+00 1.13387546e+00 0.00000000e+00 -1.30237274e+00 1.02547440e+00 0.00000000e+00 -1.17074495e+00 9.17073345e-01 0.00000000e+00 + -1.24227651e+00 1.56562831e+00 0.00000000e+00 -1.13387546e+00 1.43400052e+00 0.00000000e+00 -1.02547440e+00 1.30237274e+00 0.00000000e+00 -9.17073345e-01 1.17074495e+00 0.00000000e+00 + 8.86798734e+00 -1.60000000e+00 0.00000000e+00 8.86798734e+00 -1.73333333e+00 0.00000000e+00 8.86798734e+00 -1.86666667e+00 0.00000000e+00 8.86798734e+00 -2.00000000e+00 0.00000000e+00 + 3.33333333e+00 -1.20000000e+00 0.00000000e+00 3.11111111e+00 -1.20000000e+00 0.00000000e+00 2.88888889e+00 -1.20000000e+00 0.00000000e+00 2.66666667e+00 -1.20000000e+00 0.00000000e+00 + 1.20000000e+00 -2.00000000e+00 0.00000000e+00 1.11132348e+00 -1.85991222e+00 0.00000000e+00 1.02264696e+00 -1.71982444e+00 0.00000000e+00 9.33970440e-01 -1.57973665e+00 0.00000000e+00 + -5.20000000e+00 -3.60000000e+00 0.00000000e+00 -5.20000000e+00 -4.13333333e+00 0.00000000e+00 -5.20000000e+00 -4.66666667e+00 0.00000000e+00 -5.20000000e+00 -5.20000000e+00 0.00000000e+00 + -6.92125386e-01 1.19767907e+00 0.00000000e+00 -6.15918634e-01 1.20425468e+00 0.00000000e+00 -5.39711882e-01 1.21083029e+00 0.00000000e+00 -4.63505130e-01 1.21740590e+00 0.00000000e+00 + -6.80000000e+00 -8.40000000e+00 0.00000000e+00 -6.26666667e+00 -8.40000000e+00 0.00000000e+00 -5.73333333e+00 -8.40000000e+00 0.00000000e+00 -5.20000000e+00 -8.40000000e+00 0.00000000e+00 + -6.80000000e+00 6.80000000e+00 0.00000000e+00 -6.26666667e+00 6.80000000e+00 0.00000000e+00 -5.73333333e+00 6.80000000e+00 0.00000000e+00 -5.20000000e+00 6.80000000e+00 0.00000000e+00 + -1.59006976e+00 6.23740783e-01 0.00000000e+00 -1.58662539e+00 7.27150668e-01 0.00000000e+00 -1.58318102e+00 8.30560554e-01 0.00000000e+00 -1.57973665e+00 9.33970440e-01 0.00000000e+00 + 7.19713168e+00 5.20000000e+00 0.00000000e+00 7.19713168e+00 4.66666667e+00 0.00000000e+00 7.19713168e+00 4.13333333e+00 0.00000000e+00 7.19713168e+00 3.60000000e+00 0.00000000e+00 + -6.80000000e+00 5.20000000e+00 0.00000000e+00 -6.80000000e+00 5.73333333e+00 0.00000000e+00 -6.80000000e+00 6.26666667e+00 0.00000000e+00 -6.80000000e+00 6.80000000e+00 0.00000000e+00 + -3.60000000e+00 1.60000000e+00 0.00000000e+00 -3.60000000e+00 1.73333333e+00 0.00000000e+00 -3.60000000e+00 1.86666667e+00 0.00000000e+00 -3.60000000e+00 2.00000000e+00 0.00000000e+00 + 1.41873685e+01 1.60000000e+00 0.00000000e+00 1.48142228e+01 1.60000000e+00 0.00000000e+00 1.54410771e+01 1.60000000e+00 0.00000000e+00 1.60679313e+01 1.60000000e+00 0.00000000e+00 + 8.95863812e-01 -1.59824765e-01 0.00000000e+00 8.90116065e-01 -2.12495295e-01 0.00000000e+00 8.84368317e-01 -2.65165825e-01 0.00000000e+00 8.78620570e-01 -3.17836356e-01 0.00000000e+00 + -4.63505130e-01 1.21740590e+00 0.00000000e+00 -3.86465173e-01 1.22141716e+00 0.00000000e+00 -3.09425216e-01 1.22542843e+00 0.00000000e+00 -2.32385259e-01 1.22943970e+00 0.00000000e+00 + -2.00000000e+00 8.40000000e+00 0.00000000e+00 -2.00000000e+00 8.93333333e+00 0.00000000e+00 -2.00000000e+00 9.46666667e+00 0.00000000e+00 -2.00000000e+00 1.00000000e+01 0.00000000e+00 + -2.32385259e-01 1.22943970e+00 0.00000000e+00 -1.54923506e-01 1.23078785e+00 0.00000000e+00 -7.74617529e-02 1.23213601e+00 0.00000000e+00 0.00000000e+00 1.23348416e+00 0.00000000e+00 + -6.92125386e-01 -1.19767907e+00 0.00000000e+00 -7.72740404e-01 -1.32503160e+00 0.00000000e+00 -8.53355422e-01 -1.45238412e+00 0.00000000e+00 -9.33970440e-01 -1.57973665e+00 0.00000000e+00 + 9.01659125e-01 0.00000000e+00 0.00000000e+00 1.01226747e+00 0.00000000e+00 0.00000000e+00 1.12287582e+00 0.00000000e+00 0.00000000e+00 1.23348416e+00 0.00000000e+00 0.00000000e+00 + -5.20000000e+00 6.80000000e+00 0.00000000e+00 -4.66666667e+00 6.80000000e+00 0.00000000e+00 -4.13333333e+00 6.80000000e+00 0.00000000e+00 -3.60000000e+00 6.80000000e+00 0.00000000e+00 + 1.80049110e+01 -2.00000000e+00 0.00000000e+00 1.73592511e+01 -2.00000000e+00 0.00000000e+00 1.67135912e+01 -2.00000000e+00 0.00000000e+00 1.60679313e+01 -2.00000000e+00 0.00000000e+00 + -5.20000000e+00 -1.20000000e+00 0.00000000e+00 -5.20000000e+00 -1.33333333e+00 0.00000000e+00 -5.20000000e+00 -1.46666667e+00 0.00000000e+00 -5.20000000e+00 -1.60000000e+00 0.00000000e+00 + 1.05889687e+01 1.00000000e+01 0.00000000e+00 1.11798389e+01 1.00000000e+01 0.00000000e+00 1.17707092e+01 1.00000000e+01 0.00000000e+00 1.23615794e+01 1.00000000e+01 0.00000000e+00 + -2.00000000e+00 2.00000000e+00 0.00000000e+00 -2.00000000e+00 2.53333333e+00 0.00000000e+00 -2.00000000e+00 3.06666667e+00 0.00000000e+00 -2.00000000e+00 3.60000000e+00 0.00000000e+00 + 4.00000000e+00 6.80000000e+00 0.00000000e+00 4.52498057e+00 6.80000000e+00 0.00000000e+00 5.04996114e+00 6.80000000e+00 0.00000000e+00 5.57494171e+00 6.80000000e+00 0.00000000e+00 + -9.33970440e-01 1.57973665e+00 0.00000000e+00 -8.30560554e-01 1.58318102e+00 0.00000000e+00 -7.27150668e-01 1.58662539e+00 0.00000000e+00 -6.23740783e-01 1.59006976e+00 0.00000000e+00 + -1.57973665e+00 9.33970440e-01 0.00000000e+00 -1.57503387e+00 1.03673913e+00 0.00000000e+00 -1.57033109e+00 1.13950782e+00 0.00000000e+00 -1.56562831e+00 1.24227651e+00 0.00000000e+00 + -1.00000000e+01 3.60000000e+00 0.00000000e+00 -1.00000000e+01 3.06666667e+00 0.00000000e+00 -1.00000000e+01 2.53333333e+00 0.00000000e+00 -1.00000000e+01 2.00000000e+00 0.00000000e+00 + 2.00000000e+01 -4.00000000e-01 0.00000000e+00 2.00000000e+01 -5.33333333e-01 0.00000000e+00 2.00000000e+01 -6.66666667e-01 0.00000000e+00 2.00000000e+01 -8.00000000e-01 0.00000000e+00 + -2.00000000e+00 1.20000000e+00 0.00000000e+00 -1.85991222e+00 1.11132348e+00 0.00000000e+00 -1.71982444e+00 1.02264696e+00 0.00000000e+00 -1.57973665e+00 9.33970440e-01 0.00000000e+00 + -3.60000000e+00 -4.00000000e-01 0.00000000e+00 -3.60000000e+00 -5.33333333e-01 0.00000000e+00 -3.60000000e+00 -6.66666667e-01 0.00000000e+00 -3.60000000e+00 -8.00000000e-01 0.00000000e+00 + -4.24264069e-01 -4.24264069e-01 0.00000000e+00 -5.37439098e-01 -5.37439098e-01 0.00000000e+00 -6.50614127e-01 -6.50614127e-01 0.00000000e+00 -7.63789156e-01 -7.63789156e-01 0.00000000e+00 + -4.00000000e-01 -2.00000000e+00 0.00000000e+00 -2.66666667e-01 -2.00000000e+00 0.00000000e+00 -1.33333333e-01 -2.00000000e+00 0.00000000e+00 0.00000000e+00 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 6.80000000e+00 0.00000000e+00 -9.46666667e+00 6.80000000e+00 0.00000000e+00 -8.93333333e+00 6.80000000e+00 0.00000000e+00 -8.40000000e+00 6.80000000e+00 0.00000000e+00 + 7.19713168e+00 4.00000000e-01 0.00000000e+00 7.19713168e+00 2.66666667e-01 0.00000000e+00 7.19713168e+00 1.33333333e-01 0.00000000e+00 7.19713168e+00 0.00000000e+00 0.00000000e+00 + -1.56562831e+00 1.24227651e+00 0.00000000e+00 -1.55978291e+00 1.34421505e+00 0.00000000e+00 -1.55393751e+00 1.44615358e+00 0.00000000e+00 -1.54809211e+00 1.54809211e+00 0.00000000e+00 + -2.00000000e+00 1.60000000e+00 0.00000000e+00 -1.85520944e+00 1.48075884e+00 0.00000000e+00 -1.71041887e+00 1.36151768e+00 0.00000000e+00 -1.56562831e+00 1.24227651e+00 0.00000000e+00 + -2.72394300e-01 -5.34603915e-01 0.00000000e+00 -3.39018282e-01 -6.39853939e-01 0.00000000e+00 -4.05642264e-01 -7.45103963e-01 0.00000000e+00 -4.72266246e-01 -8.50353987e-01 0.00000000e+00 + -1.59006976e+00 -6.23740783e-01 0.00000000e+00 -1.72671317e+00 -6.82493855e-01 0.00000000e+00 -1.86335659e+00 -7.41246928e-01 0.00000000e+00 -2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 4.00000000e-01 1.00000000e+01 0.00000000e+00 4.00000000e-01 9.46666667e+00 0.00000000e+00 4.00000000e-01 8.93333333e+00 0.00000000e+00 4.00000000e-01 8.40000000e+00 0.00000000e+00 + -1.24227651e+00 1.56562831e+00 0.00000000e+00 -1.13950782e+00 1.57033109e+00 0.00000000e+00 -1.03673913e+00 1.57503387e+00 0.00000000e+00 -9.33970440e-01 1.57973665e+00 0.00000000e+00 + 7.63789156e-01 7.63789156e-01 0.00000000e+00 6.50614127e-01 6.50614127e-01 0.00000000e+00 5.37439098e-01 5.37439098e-01 0.00000000e+00 4.24264069e-01 4.24264069e-01 0.00000000e+00 + -1.59824765e-01 -8.95863812e-01 0.00000000e+00 -1.84011596e-01 -1.00705577e+00 0.00000000e+00 -2.08198427e-01 -1.11824774e+00 0.00000000e+00 -2.32385259e-01 -1.22943970e+00 0.00000000e+00 + -1.00000000e+01 1.60000000e+00 0.00000000e+00 -9.46666667e+00 1.60000000e+00 0.00000000e+00 -8.93333333e+00 1.60000000e+00 0.00000000e+00 -8.40000000e+00 1.60000000e+00 0.00000000e+00 + 2.00000000e+01 2.00000000e+00 0.00000000e+00 1.93349703e+01 2.00000000e+00 0.00000000e+00 1.86699406e+01 2.00000000e+00 0.00000000e+00 1.80049110e+01 2.00000000e+00 0.00000000e+00 + -1.60000000e+00 2.00000000e+00 0.00000000e+00 -1.48075884e+00 1.85520944e+00 0.00000000e+00 -1.36151768e+00 1.71041887e+00 0.00000000e+00 -1.24227651e+00 1.56562831e+00 0.00000000e+00 + 2.66666667e+00 -1.00000000e+01 0.00000000e+00 2.44444444e+00 -1.00000000e+01 0.00000000e+00 2.22222222e+00 -1.00000000e+01 0.00000000e+00 2.00000000e+00 -1.00000000e+01 0.00000000e+00 + -1.20000000e+00 2.00000000e+00 0.00000000e+00 -1.11132348e+00 1.85991222e+00 0.00000000e+00 -1.02264696e+00 1.71982444e+00 0.00000000e+00 -9.33970440e-01 1.57973665e+00 0.00000000e+00 + 2.00000000e+00 -1.00000000e+01 0.00000000e+00 1.86666667e+00 -1.00000000e+01 0.00000000e+00 1.73333333e+00 -1.00000000e+01 0.00000000e+00 1.60000000e+00 -1.00000000e+01 0.00000000e+00 + -2.00000000e+00 5.20000000e+00 0.00000000e+00 -1.86666667e+00 5.20000000e+00 0.00000000e+00 -1.73333333e+00 5.20000000e+00 0.00000000e+00 -1.60000000e+00 5.20000000e+00 0.00000000e+00 + 1.54508497e-01 4.75528258e-01 0.00000000e+00 1.64809064e-01 5.07230142e-01 0.00000000e+00 1.75109630e-01 5.38932026e-01 0.00000000e+00 1.85410197e-01 5.70633910e-01 0.00000000e+00 + 2.00000000e+01 5.20000000e+00 0.00000000e+00 2.00000000e+01 4.66666667e+00 0.00000000e+00 2.00000000e+01 4.13333333e+00 0.00000000e+00 2.00000000e+01 3.60000000e+00 0.00000000e+00 + -1.20000000e+00 6.80000000e+00 0.00000000e+00 -1.20000000e+00 7.33333333e+00 0.00000000e+00 -1.20000000e+00 7.86666667e+00 0.00000000e+00 -1.20000000e+00 8.40000000e+00 0.00000000e+00 + 1.60679313e+01 8.40000000e+00 0.00000000e+00 1.60679313e+01 7.86666667e+00 0.00000000e+00 1.60679313e+01 7.33333333e+00 0.00000000e+00 1.60679313e+01 6.80000000e+00 0.00000000e+00 + -1.00000000e+01 1.20000000e+00 0.00000000e+00 -1.00000000e+01 1.06666667e+00 0.00000000e+00 -1.00000000e+01 9.33333333e-01 0.00000000e+00 -1.00000000e+01 8.00000000e-01 0.00000000e+00 + -1.00000000e+01 1.20000000e+00 0.00000000e+00 -9.46666667e+00 1.20000000e+00 0.00000000e+00 -8.93333333e+00 1.20000000e+00 0.00000000e+00 -8.40000000e+00 1.20000000e+00 0.00000000e+00 + -6.23740783e-01 1.59006976e+00 0.00000000e+00 -5.19894456e-01 1.59217090e+00 0.00000000e+00 -4.16048129e-01 1.59427204e+00 0.00000000e+00 -3.12201802e-01 1.59637318e+00 0.00000000e+00 + -3.12201802e-01 1.59637318e+00 0.00000000e+00 -2.85596288e-01 1.47406202e+00 0.00000000e+00 -2.58990773e-01 1.35175086e+00 0.00000000e+00 -2.32385259e-01 1.22943970e+00 0.00000000e+00 + -8.00000000e-01 2.00000000e+00 0.00000000e+00 -8.00000000e-01 2.53333333e+00 0.00000000e+00 -8.00000000e-01 3.06666667e+00 0.00000000e+00 -8.00000000e-01 3.60000000e+00 0.00000000e+00 + -6.80000000e+00 8.00000000e-01 0.00000000e+00 -6.26666667e+00 8.00000000e-01 0.00000000e+00 -5.73333333e+00 8.00000000e-01 0.00000000e+00 -5.20000000e+00 8.00000000e-01 0.00000000e+00 + 4.00000000e-01 3.60000000e+00 0.00000000e+00 5.33333333e-01 3.60000000e+00 0.00000000e+00 6.66666667e-01 3.60000000e+00 0.00000000e+00 8.00000000e-01 3.60000000e+00 0.00000000e+00 + -3.12201802e-01 1.59637318e+00 0.00000000e+00 -2.08134535e-01 1.59707935e+00 0.00000000e+00 -1.04067267e-01 1.59778553e+00 0.00000000e+00 0.00000000e+00 1.59849170e+00 0.00000000e+00 + 1.85410197e-01 -5.70633910e-01 0.00000000e+00 1.55291427e-01 -5.79555496e-01 0.00000000e+00 1.24747014e-01 -5.86888560e-01 0.00000000e+00 9.38606790e-02 -5.92613004e-01 0.00000000e+00 + 4.45503262e-01 2.26995250e-01 0.00000000e+00 4.56772729e-01 2.03368322e-01 0.00000000e+00 4.66790213e-01 1.79183975e-01 0.00000000e+00 4.75528258e-01 1.54508497e-01 0.00000000e+00 + -8.00000000e-01 -2.00000000e+00 0.00000000e+00 -8.00000000e-01 -2.53333333e+00 0.00000000e+00 -8.00000000e-01 -3.06666667e+00 0.00000000e+00 -8.00000000e-01 -3.60000000e+00 0.00000000e+00 + -4.00000000e-01 2.00000000e+00 0.00000000e+00 -3.70733934e-01 1.86545773e+00 0.00000000e+00 -3.41467868e-01 1.73091545e+00 0.00000000e+00 -3.12201802e-01 1.59637318e+00 0.00000000e+00 + -1.54508497e-01 -4.75528258e-01 0.00000000e+00 -1.79183975e-01 -4.66790213e-01 0.00000000e+00 -2.03368322e-01 -4.56772729e-01 0.00000000e+00 -2.26995250e-01 -4.45503262e-01 0.00000000e+00 + -3.60000000e+00 0.00000000e+00 0.00000000e+00 -3.60000000e+00 1.33333333e-01 0.00000000e+00 -3.60000000e+00 2.66666667e-01 0.00000000e+00 -3.60000000e+00 4.00000000e-01 0.00000000e+00 + -5.20000000e+00 0.00000000e+00 0.00000000e+00 -5.20000000e+00 1.33333333e-01 0.00000000e+00 -5.20000000e+00 2.66666667e-01 0.00000000e+00 -5.20000000e+00 4.00000000e-01 0.00000000e+00 + 4.00000000e+00 -2.00000000e+00 0.00000000e+00 3.77777778e+00 -2.00000000e+00 0.00000000e+00 3.55555556e+00 -2.00000000e+00 0.00000000e+00 3.33333333e+00 -2.00000000e+00 0.00000000e+00 + -8.50353987e-01 4.72266246e-01 0.00000000e+00 -7.45103963e-01 4.05642264e-01 0.00000000e+00 -6.39853939e-01 3.39018282e-01 0.00000000e+00 -5.34603915e-01 2.72394300e-01 0.00000000e+00 + -6.80000000e+00 0.00000000e+00 0.00000000e+00 -6.80000000e+00 1.33333333e-01 0.00000000e+00 -6.80000000e+00 2.66666667e-01 0.00000000e+00 -6.80000000e+00 4.00000000e-01 0.00000000e+00 + -8.00000000e-01 -2.00000000e+00 0.00000000e+00 -6.66666667e-01 -2.00000000e+00 0.00000000e+00 -5.33333333e-01 -2.00000000e+00 0.00000000e+00 -4.00000000e-01 -2.00000000e+00 0.00000000e+00 + -8.40000000e+00 0.00000000e+00 0.00000000e+00 -7.86666667e+00 0.00000000e+00 0.00000000e+00 -7.33333333e+00 0.00000000e+00 0.00000000e+00 -6.80000000e+00 0.00000000e+00 0.00000000e+00 + 2.66666667e+00 0.00000000e+00 0.00000000e+00 2.44444444e+00 0.00000000e+00 0.00000000e+00 2.22222222e+00 0.00000000e+00 0.00000000e+00 2.00000000e+00 0.00000000e+00 0.00000000e+00 + 8.86798734e+00 -5.20000000e+00 0.00000000e+00 9.44164778e+00 -5.20000000e+00 0.00000000e+00 1.00153082e+01 -5.20000000e+00 0.00000000e+00 1.05889687e+01 -5.20000000e+00 0.00000000e+00 + 1.23615794e+01 8.00000000e-01 0.00000000e+00 1.29701758e+01 8.00000000e-01 0.00000000e+00 1.35787722e+01 8.00000000e-01 0.00000000e+00 1.41873685e+01 8.00000000e-01 0.00000000e+00 + -8.40000000e+00 0.00000000e+00 0.00000000e+00 -8.40000000e+00 1.33333333e-01 0.00000000e+00 -8.40000000e+00 2.66666667e-01 0.00000000e+00 -8.40000000e+00 4.00000000e-01 0.00000000e+00 + 8.86798734e+00 8.00000000e-01 0.00000000e+00 9.44164778e+00 8.00000000e-01 0.00000000e+00 1.00153082e+01 8.00000000e-01 0.00000000e+00 1.05889687e+01 8.00000000e-01 0.00000000e+00 + -5.20000000e+00 4.00000000e-01 0.00000000e+00 -4.66666667e+00 4.00000000e-01 0.00000000e+00 -4.13333333e+00 4.00000000e-01 0.00000000e+00 -3.60000000e+00 4.00000000e-01 0.00000000e+00 + 1.85410197e-01 5.70633910e-01 0.00000000e+00 2.15020770e-01 5.60148256e-01 0.00000000e+00 2.44041986e-01 5.48127275e-01 0.00000000e+00 2.72394300e-01 5.34603915e-01 0.00000000e+00 + -8.40000000e+00 8.00000000e-01 0.00000000e+00 -8.40000000e+00 9.33333333e-01 0.00000000e+00 -8.40000000e+00 1.06666667e+00 0.00000000e+00 -8.40000000e+00 1.20000000e+00 0.00000000e+00 + 2.00000000e+01 -8.00000000e-01 0.00000000e+00 1.93349703e+01 -8.00000000e-01 0.00000000e+00 1.86699406e+01 -8.00000000e-01 0.00000000e+00 1.80049110e+01 -8.00000000e-01 0.00000000e+00 + 7.19713168e+00 1.00000000e+01 0.00000000e+00 7.75408356e+00 1.00000000e+01 0.00000000e+00 8.31103545e+00 1.00000000e+01 0.00000000e+00 8.86798734e+00 1.00000000e+01 0.00000000e+00 + -5.20000000e+00 4.00000000e-01 0.00000000e+00 -5.20000000e+00 5.33333333e-01 0.00000000e+00 -5.20000000e+00 6.66666667e-01 0.00000000e+00 -5.20000000e+00 8.00000000e-01 0.00000000e+00 + -1.20000000e+00 5.20000000e+00 0.00000000e+00 -1.06666667e+00 5.20000000e+00 0.00000000e+00 -9.33333333e-01 5.20000000e+00 0.00000000e+00 -8.00000000e-01 5.20000000e+00 0.00000000e+00 + 5.57494171e+00 6.80000000e+00 0.00000000e+00 5.57494171e+00 6.26666667e+00 0.00000000e+00 5.57494171e+00 5.73333333e+00 0.00000000e+00 5.57494171e+00 5.20000000e+00 0.00000000e+00 + -6.80000000e+00 4.00000000e-01 0.00000000e+00 -6.26666667e+00 4.00000000e-01 0.00000000e+00 -5.73333333e+00 4.00000000e-01 0.00000000e+00 -5.20000000e+00 4.00000000e-01 0.00000000e+00 + 5.57494171e+00 -5.20000000e+00 0.00000000e+00 5.57494171e+00 -5.73333333e+00 0.00000000e+00 5.57494171e+00 -6.26666667e+00 0.00000000e+00 5.57494171e+00 -6.80000000e+00 0.00000000e+00 + -1.59637318e+00 -3.12201802e-01 0.00000000e+00 -1.73091545e+00 -3.41467868e-01 0.00000000e+00 -1.86545773e+00 -3.70733934e-01 0.00000000e+00 -2.00000000e+00 -4.00000000e-01 0.00000000e+00 + 0.00000000e+00 -1.59849170e+00 0.00000000e+00 -1.04067267e-01 -1.59778553e+00 0.00000000e+00 -2.08134535e-01 -1.59707935e+00 0.00000000e+00 -3.12201802e-01 -1.59637318e+00 0.00000000e+00 + 1.20000000e+00 -8.40000000e+00 0.00000000e+00 1.06666667e+00 -8.40000000e+00 0.00000000e+00 9.33333333e-01 -8.40000000e+00 0.00000000e+00 8.00000000e-01 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 -4.00000000e-01 0.00000000e+00 5.57494171e+00 -5.33333333e-01 0.00000000e+00 5.57494171e+00 -6.66666667e-01 0.00000000e+00 5.57494171e+00 -8.00000000e-01 0.00000000e+00 + -1.60000000e+00 1.00000000e+01 0.00000000e+00 -1.73333333e+00 1.00000000e+01 0.00000000e+00 -1.86666667e+00 1.00000000e+01 0.00000000e+00 -2.00000000e+00 1.00000000e+01 0.00000000e+00 + -1.60000000e+00 5.20000000e+00 0.00000000e+00 -1.46666667e+00 5.20000000e+00 0.00000000e+00 -1.33333333e+00 5.20000000e+00 0.00000000e+00 -1.20000000e+00 5.20000000e+00 0.00000000e+00 + 7.19713168e+00 6.80000000e+00 0.00000000e+00 7.19713168e+00 6.26666667e+00 0.00000000e+00 7.19713168e+00 5.73333333e+00 0.00000000e+00 7.19713168e+00 5.20000000e+00 0.00000000e+00 + -8.40000000e+00 4.00000000e-01 0.00000000e+00 -7.86666667e+00 4.00000000e-01 0.00000000e+00 -7.33333333e+00 4.00000000e-01 0.00000000e+00 -6.80000000e+00 4.00000000e-01 0.00000000e+00 + -8.40000000e+00 6.80000000e+00 0.00000000e+00 -8.40000000e+00 7.33333333e+00 0.00000000e+00 -8.40000000e+00 7.86666667e+00 0.00000000e+00 -8.40000000e+00 8.40000000e+00 0.00000000e+00 + 1.20000000e+00 3.60000000e+00 0.00000000e+00 1.20000000e+00 3.06666667e+00 0.00000000e+00 1.20000000e+00 2.53333333e+00 0.00000000e+00 1.20000000e+00 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 8.40000000e+00 0.00000000e+00 3.33333333e+00 7.86666667e+00 0.00000000e+00 3.33333333e+00 7.33333333e+00 0.00000000e+00 3.33333333e+00 6.80000000e+00 0.00000000e+00 + 0.00000000e+00 5.20000000e+00 0.00000000e+00 1.33333333e-01 5.20000000e+00 0.00000000e+00 2.66666667e-01 5.20000000e+00 0.00000000e+00 4.00000000e-01 5.20000000e+00 0.00000000e+00 + -3.60000000e+00 8.00000000e-01 0.00000000e+00 -3.06666667e+00 8.00000000e-01 0.00000000e+00 -2.53333333e+00 8.00000000e-01 0.00000000e+00 -2.00000000e+00 8.00000000e-01 0.00000000e+00 + 2.72394300e-01 5.34603915e-01 0.00000000e+00 3.00000000e-01 5.19615242e-01 0.00000000e+00 3.26783421e-01 5.03202341e-01 0.00000000e+00 3.52671151e-01 4.85410197e-01 0.00000000e+00 + -3.60000000e+00 8.00000000e-01 0.00000000e+00 -3.60000000e+00 9.33333333e-01 0.00000000e+00 -3.60000000e+00 1.06666667e+00 0.00000000e+00 -3.60000000e+00 1.20000000e+00 0.00000000e+00 + -6.80000000e+00 -1.20000000e+00 0.00000000e+00 -6.26666667e+00 -1.20000000e+00 0.00000000e+00 -5.73333333e+00 -1.20000000e+00 0.00000000e+00 -5.20000000e+00 -1.20000000e+00 0.00000000e+00 + 2.00000000e+00 6.80000000e+00 0.00000000e+00 2.00000000e+00 7.33333333e+00 0.00000000e+00 2.00000000e+00 7.86666667e+00 0.00000000e+00 2.00000000e+00 8.40000000e+00 0.00000000e+00 + -1.19767907e+00 -6.92125386e-01 0.00000000e+00 -1.32503160e+00 -7.72740404e-01 0.00000000e+00 -1.45238412e+00 -8.53355422e-01 0.00000000e+00 -1.57973665e+00 -9.33970440e-01 0.00000000e+00 + -1.59824765e-01 -8.95863812e-01 0.00000000e+00 -2.12495295e-01 -8.90116065e-01 0.00000000e+00 -2.65165825e-01 -8.84368317e-01 0.00000000e+00 -3.17836356e-01 -8.78620570e-01 0.00000000e+00 + 8.50353987e-01 4.72266246e-01 0.00000000e+00 7.45103963e-01 4.05642264e-01 0.00000000e+00 6.39853939e-01 3.39018282e-01 0.00000000e+00 5.34603915e-01 2.72394300e-01 0.00000000e+00 + -2.00000000e+00 0.00000000e+00 0.00000000e+00 -1.86616390e+00 0.00000000e+00 0.00000000e+00 -1.73232780e+00 0.00000000e+00 0.00000000e+00 -1.59849170e+00 0.00000000e+00 0.00000000e+00 + -8.40000000e+00 8.00000000e-01 0.00000000e+00 -7.86666667e+00 8.00000000e-01 0.00000000e+00 -7.33333333e+00 8.00000000e-01 0.00000000e+00 -6.80000000e+00 8.00000000e-01 0.00000000e+00 + 1.13726675e+00 1.13726675e+00 0.00000000e+00 1.14842615e+00 1.06386895e+00 0.00000000e+00 1.15958555e+00 9.90471148e-01 0.00000000e+00 1.17074495e+00 9.17073345e-01 0.00000000e+00 + 8.86798734e+00 5.20000000e+00 0.00000000e+00 9.44164778e+00 5.20000000e+00 0.00000000e+00 1.00153082e+01 5.20000000e+00 0.00000000e+00 1.05889687e+01 5.20000000e+00 0.00000000e+00 + 0.00000000e+00 1.23348416e+00 0.00000000e+00 0.00000000e+00 1.35515334e+00 0.00000000e+00 0.00000000e+00 1.47682252e+00 0.00000000e+00 0.00000000e+00 1.59849170e+00 0.00000000e+00 + -3.60000000e+00 1.20000000e+00 0.00000000e+00 -3.06666667e+00 1.20000000e+00 0.00000000e+00 -2.53333333e+00 1.20000000e+00 0.00000000e+00 -2.00000000e+00 1.20000000e+00 0.00000000e+00 + -6.23740783e-01 1.59006976e+00 0.00000000e+00 -5.70328898e-01 1.46584847e+00 0.00000000e+00 -5.16917014e-01 1.34162718e+00 0.00000000e+00 -4.63505130e-01 1.21740590e+00 0.00000000e+00 + -5.20000000e+00 1.20000000e+00 0.00000000e+00 -4.66666667e+00 1.20000000e+00 0.00000000e+00 -4.13333333e+00 1.20000000e+00 0.00000000e+00 -3.60000000e+00 1.20000000e+00 0.00000000e+00 + -1.60000000e+00 3.60000000e+00 0.00000000e+00 -1.60000000e+00 4.13333333e+00 0.00000000e+00 -1.60000000e+00 4.66666667e+00 0.00000000e+00 -1.60000000e+00 5.20000000e+00 0.00000000e+00 + 1.54809211e+00 -1.54809211e+00 0.00000000e+00 1.44615358e+00 -1.55393751e+00 0.00000000e+00 1.34421505e+00 -1.55978291e+00 0.00000000e+00 1.24227651e+00 -1.56562831e+00 0.00000000e+00 + 1.20000000e+00 8.40000000e+00 0.00000000e+00 1.20000000e+00 7.86666667e+00 0.00000000e+00 1.20000000e+00 7.33333333e+00 0.00000000e+00 1.20000000e+00 6.80000000e+00 0.00000000e+00 + 4.00000000e-01 5.20000000e+00 0.00000000e+00 5.33333333e-01 5.20000000e+00 0.00000000e+00 6.66666667e-01 5.20000000e+00 0.00000000e+00 8.00000000e-01 5.20000000e+00 0.00000000e+00 + -5.20000000e+00 0.00000000e+00 0.00000000e+00 -4.66666667e+00 0.00000000e+00 0.00000000e+00 -4.13333333e+00 0.00000000e+00 0.00000000e+00 -3.60000000e+00 0.00000000e+00 0.00000000e+00 + -5.20000000e+00 1.20000000e+00 0.00000000e+00 -5.20000000e+00 1.33333333e+00 0.00000000e+00 -5.20000000e+00 1.46666667e+00 0.00000000e+00 -5.20000000e+00 1.60000000e+00 0.00000000e+00 + 1.23615794e+01 -8.40000000e+00 0.00000000e+00 1.29701758e+01 -8.40000000e+00 0.00000000e+00 1.35787722e+01 -8.40000000e+00 0.00000000e+00 1.41873685e+01 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 5.20000000e+00 0.00000000e+00 6.11567170e+00 5.20000000e+00 0.00000000e+00 6.65640169e+00 5.20000000e+00 0.00000000e+00 7.19713168e+00 5.20000000e+00 0.00000000e+00 + -1.60000000e+00 -3.60000000e+00 0.00000000e+00 -1.73333333e+00 -3.60000000e+00 0.00000000e+00 -1.86666667e+00 -3.60000000e+00 0.00000000e+00 -2.00000000e+00 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 -2.00000000e+00 0.00000000e+00 9.33333333e-01 -2.00000000e+00 0.00000000e+00 1.06666667e+00 -2.00000000e+00 0.00000000e+00 1.20000000e+00 -2.00000000e+00 0.00000000e+00 + -6.80000000e+00 1.20000000e+00 0.00000000e+00 -6.26666667e+00 1.20000000e+00 0.00000000e+00 -5.73333333e+00 1.20000000e+00 0.00000000e+00 -5.20000000e+00 1.20000000e+00 0.00000000e+00 + 2.66666667e+00 -2.00000000e+00 0.00000000e+00 2.66666667e+00 -2.53333333e+00 0.00000000e+00 2.66666667e+00 -3.06666667e+00 0.00000000e+00 2.66666667e+00 -3.60000000e+00 0.00000000e+00 + 4.00000000e-01 8.40000000e+00 0.00000000e+00 4.00000000e-01 7.86666667e+00 0.00000000e+00 4.00000000e-01 7.33333333e+00 0.00000000e+00 4.00000000e-01 6.80000000e+00 0.00000000e+00 + -8.40000000e+00 1.20000000e+00 0.00000000e+00 -7.86666667e+00 1.20000000e+00 0.00000000e+00 -7.33333333e+00 1.20000000e+00 0.00000000e+00 -6.80000000e+00 1.20000000e+00 0.00000000e+00 + -4.00000000e-01 -3.60000000e+00 0.00000000e+00 -5.33333333e-01 -3.60000000e+00 0.00000000e+00 -6.66666667e-01 -3.60000000e+00 0.00000000e+00 -8.00000000e-01 -3.60000000e+00 0.00000000e+00 + -5.20000000e+00 -4.00000000e-01 0.00000000e+00 -5.20000000e+00 -5.33333333e-01 0.00000000e+00 -5.20000000e+00 -6.66666667e-01 0.00000000e+00 -5.20000000e+00 -8.00000000e-01 0.00000000e+00 + -1.00000000e+01 1.60000000e+00 0.00000000e+00 -1.00000000e+01 1.46666667e+00 0.00000000e+00 -1.00000000e+01 1.33333333e+00 0.00000000e+00 -1.00000000e+01 1.20000000e+00 0.00000000e+00 + 1.41873685e+01 -5.20000000e+00 0.00000000e+00 1.48142228e+01 -5.20000000e+00 0.00000000e+00 1.54410771e+01 -5.20000000e+00 0.00000000e+00 1.60679313e+01 -5.20000000e+00 0.00000000e+00 + 1.05889687e+01 4.00000000e-01 0.00000000e+00 1.11798389e+01 4.00000000e-01 0.00000000e+00 1.17707092e+01 4.00000000e-01 0.00000000e+00 1.23615794e+01 4.00000000e-01 0.00000000e+00 + -5.20000000e+00 1.60000000e+00 0.00000000e+00 -4.66666667e+00 1.60000000e+00 0.00000000e+00 -4.13333333e+00 1.60000000e+00 0.00000000e+00 -3.60000000e+00 1.60000000e+00 0.00000000e+00 + 1.59824765e-01 8.95863812e-01 0.00000000e+00 1.37836736e-01 7.94780209e-01 0.00000000e+00 1.15848708e-01 6.93696607e-01 0.00000000e+00 9.38606790e-02 5.92613004e-01 0.00000000e+00 + 1.05889687e+01 6.80000000e+00 0.00000000e+00 1.11798389e+01 6.80000000e+00 0.00000000e+00 1.17707092e+01 6.80000000e+00 0.00000000e+00 1.23615794e+01 6.80000000e+00 0.00000000e+00 + 6.00000000e-01 0.00000000e+00 0.00000000e+00 7.00553042e-01 0.00000000e+00 0.00000000e+00 8.01106084e-01 0.00000000e+00 0.00000000e+00 9.01659125e-01 0.00000000e+00 0.00000000e+00 + -1.00000000e+01 -3.60000000e+00 0.00000000e+00 -9.46666667e+00 -3.60000000e+00 0.00000000e+00 -8.93333333e+00 -3.60000000e+00 0.00000000e+00 -8.40000000e+00 -3.60000000e+00 0.00000000e+00 + -2.00000000e+00 0.00000000e+00 0.00000000e+00 -2.00000000e+00 1.33333333e-01 0.00000000e+00 -2.00000000e+00 2.66666667e-01 0.00000000e+00 -2.00000000e+00 4.00000000e-01 0.00000000e+00 + 1.05889687e+01 0.00000000e+00 0.00000000e+00 1.00153082e+01 0.00000000e+00 0.00000000e+00 9.44164778e+00 0.00000000e+00 0.00000000e+00 8.86798734e+00 0.00000000e+00 0.00000000e+00 + 1.23615794e+01 1.00000000e+01 0.00000000e+00 1.23615794e+01 9.46666667e+00 0.00000000e+00 1.23615794e+01 8.93333333e+00 0.00000000e+00 1.23615794e+01 8.40000000e+00 0.00000000e+00 + 1.41873685e+01 -1.20000000e+00 0.00000000e+00 1.35787722e+01 -1.20000000e+00 0.00000000e+00 1.29701758e+01 -1.20000000e+00 0.00000000e+00 1.23615794e+01 -1.20000000e+00 0.00000000e+00 + 6.23740783e-01 -1.59006976e+00 0.00000000e+00 5.19894456e-01 -1.59217090e+00 0.00000000e+00 4.16048129e-01 -1.59427204e+00 0.00000000e+00 3.12201802e-01 -1.59637318e+00 0.00000000e+00 + -1.00000000e+01 8.40000000e+00 0.00000000e+00 -9.46666667e+00 8.40000000e+00 0.00000000e+00 -8.93333333e+00 8.40000000e+00 0.00000000e+00 -8.40000000e+00 8.40000000e+00 0.00000000e+00 + 2.00000000e+01 1.00000000e+01 0.00000000e+00 2.00000000e+01 9.46666667e+00 0.00000000e+00 2.00000000e+01 8.93333333e+00 0.00000000e+00 2.00000000e+01 8.40000000e+00 0.00000000e+00 + -6.80000000e+00 1.60000000e+00 0.00000000e+00 -6.26666667e+00 1.60000000e+00 0.00000000e+00 -5.73333333e+00 1.60000000e+00 0.00000000e+00 -5.20000000e+00 1.60000000e+00 0.00000000e+00 + -6.80000000e+00 8.00000000e-01 0.00000000e+00 -6.80000000e+00 9.33333333e-01 0.00000000e+00 -6.80000000e+00 1.06666667e+00 0.00000000e+00 -6.80000000e+00 1.20000000e+00 0.00000000e+00 + 4.00000000e+00 -1.60000000e+00 0.00000000e+00 4.00000000e+00 -1.73333333e+00 0.00000000e+00 4.00000000e+00 -1.86666667e+00 0.00000000e+00 4.00000000e+00 -2.00000000e+00 0.00000000e+00 + 1.59006976e+00 6.23740783e-01 0.00000000e+00 1.46584847e+00 5.70328898e-01 0.00000000e+00 1.34162718e+00 5.16917014e-01 0.00000000e+00 1.21740590e+00 4.63505130e-01 0.00000000e+00 + -1.17074495e+00 -9.17073345e-01 0.00000000e+00 -1.30237274e+00 -1.02547440e+00 0.00000000e+00 -1.43400052e+00 -1.13387546e+00 0.00000000e+00 -1.56562831e+00 -1.24227651e+00 0.00000000e+00 + -1.60000000e+00 6.80000000e+00 0.00000000e+00 -1.60000000e+00 7.33333333e+00 0.00000000e+00 -1.60000000e+00 7.86666667e+00 0.00000000e+00 -1.60000000e+00 8.40000000e+00 0.00000000e+00 + -3.12201802e-01 -1.59637318e+00 0.00000000e+00 -4.16048129e-01 -1.59427204e+00 0.00000000e+00 -5.19894456e-01 -1.59217090e+00 0.00000000e+00 -6.23740783e-01 -1.59006976e+00 0.00000000e+00 + 2.00000000e+01 -8.40000000e+00 0.00000000e+00 2.00000000e+01 -8.93333333e+00 0.00000000e+00 2.00000000e+01 -9.46666667e+00 0.00000000e+00 2.00000000e+01 -1.00000000e+01 0.00000000e+00 + 5.57494171e+00 8.00000000e-01 0.00000000e+00 5.57494171e+00 6.66666667e-01 0.00000000e+00 5.57494171e+00 5.33333333e-01 0.00000000e+00 5.57494171e+00 4.00000000e-01 0.00000000e+00 + -3.60000000e+00 1.20000000e+00 0.00000000e+00 -3.60000000e+00 1.33333333e+00 0.00000000e+00 -3.60000000e+00 1.46666667e+00 0.00000000e+00 -3.60000000e+00 1.60000000e+00 0.00000000e+00 + 1.60000000e+00 -3.60000000e+00 0.00000000e+00 1.60000000e+00 -4.13333333e+00 0.00000000e+00 1.60000000e+00 -4.66666667e+00 0.00000000e+00 1.60000000e+00 -5.20000000e+00 0.00000000e+00 + -1.00000000e+01 8.00000000e-01 0.00000000e+00 -1.00000000e+01 6.66666667e-01 0.00000000e+00 -1.00000000e+01 5.33333333e-01 0.00000000e+00 -1.00000000e+01 4.00000000e-01 0.00000000e+00 + 8.95863812e-01 1.59824765e-01 0.00000000e+00 7.94780209e-01 1.37836736e-01 0.00000000e+00 6.93696607e-01 1.15848708e-01 0.00000000e+00 5.92613004e-01 9.38606790e-02 0.00000000e+00 + -8.40000000e+00 1.60000000e+00 0.00000000e+00 -7.86666667e+00 1.60000000e+00 0.00000000e+00 -7.33333333e+00 1.60000000e+00 0.00000000e+00 -6.80000000e+00 1.60000000e+00 0.00000000e+00 + -1.00000000e+01 -1.00000000e+01 0.00000000e+00 -9.46666667e+00 -1.00000000e+01 0.00000000e+00 -8.93333333e+00 -1.00000000e+01 0.00000000e+00 -8.40000000e+00 -1.00000000e+01 0.00000000e+00 + -2.00000000e+00 8.00000000e-01 0.00000000e+00 -2.00000000e+00 9.33333333e-01 0.00000000e+00 -2.00000000e+00 1.06666667e+00 0.00000000e+00 -2.00000000e+00 1.20000000e+00 0.00000000e+00 + -3.60000000e+00 1.60000000e+00 0.00000000e+00 -3.06666667e+00 1.60000000e+00 0.00000000e+00 -2.53333333e+00 1.60000000e+00 0.00000000e+00 -2.00000000e+00 1.60000000e+00 0.00000000e+00 + -5.20000000e+00 -1.60000000e+00 0.00000000e+00 -4.66666667e+00 -1.60000000e+00 0.00000000e+00 -4.13333333e+00 -1.60000000e+00 0.00000000e+00 -3.60000000e+00 -1.60000000e+00 0.00000000e+00 + 5.57494171e+00 8.40000000e+00 0.00000000e+00 6.11567170e+00 8.40000000e+00 0.00000000e+00 6.65640169e+00 8.40000000e+00 0.00000000e+00 7.19713168e+00 8.40000000e+00 0.00000000e+00 + 4.00000000e-01 -3.60000000e+00 0.00000000e+00 4.00000000e-01 -4.13333333e+00 0.00000000e+00 4.00000000e-01 -4.66666667e+00 0.00000000e+00 4.00000000e-01 -5.20000000e+00 0.00000000e+00 + 1.80049110e+01 1.00000000e+01 0.00000000e+00 1.86699406e+01 1.00000000e+01 0.00000000e+00 1.93349703e+01 1.00000000e+01 0.00000000e+00 2.00000000e+01 1.00000000e+01 0.00000000e+00 + 1.80049110e+01 1.00000000e+01 0.00000000e+00 1.80049110e+01 9.46666667e+00 0.00000000e+00 1.80049110e+01 8.93333333e+00 0.00000000e+00 1.80049110e+01 8.40000000e+00 0.00000000e+00 + -8.00000000e-01 -8.40000000e+00 0.00000000e+00 -8.00000000e-01 -8.93333333e+00 0.00000000e+00 -8.00000000e-01 -9.46666667e+00 0.00000000e+00 -8.00000000e-01 -1.00000000e+01 0.00000000e+00 + 1.60679313e+01 1.00000000e+01 0.00000000e+00 1.67135912e+01 1.00000000e+01 0.00000000e+00 1.73592511e+01 1.00000000e+01 0.00000000e+00 1.80049110e+01 1.00000000e+01 0.00000000e+00 + -1.20000000e+00 -2.00000000e+00 0.00000000e+00 -1.20000000e+00 -2.53333333e+00 0.00000000e+00 -1.20000000e+00 -3.06666667e+00 0.00000000e+00 -1.20000000e+00 -3.60000000e+00 0.00000000e+00 + -5.20000000e+00 5.20000000e+00 0.00000000e+00 -5.20000000e+00 5.73333333e+00 0.00000000e+00 -5.20000000e+00 6.26666667e+00 0.00000000e+00 -5.20000000e+00 6.80000000e+00 0.00000000e+00 + 0.00000000e+00 3.60000000e+00 0.00000000e+00 0.00000000e+00 4.13333333e+00 0.00000000e+00 0.00000000e+00 4.66666667e+00 0.00000000e+00 0.00000000e+00 5.20000000e+00 0.00000000e+00 + -8.50353987e-01 -4.72266246e-01 0.00000000e+00 -9.66129014e-01 -5.45552626e-01 0.00000000e+00 -1.08190404e+00 -6.18839006e-01 0.00000000e+00 -1.19767907e+00 -6.92125386e-01 0.00000000e+00 + 1.41873685e+01 -2.00000000e+00 0.00000000e+00 1.35787722e+01 -2.00000000e+00 0.00000000e+00 1.29701758e+01 -2.00000000e+00 0.00000000e+00 1.23615794e+01 -2.00000000e+00 0.00000000e+00 + -4.00000000e-01 2.00000000e+00 0.00000000e+00 -4.00000000e-01 2.53333333e+00 0.00000000e+00 -4.00000000e-01 3.06666667e+00 0.00000000e+00 -4.00000000e-01 3.60000000e+00 0.00000000e+00 + -8.40000000e+00 3.60000000e+00 0.00000000e+00 -8.40000000e+00 4.13333333e+00 0.00000000e+00 -8.40000000e+00 4.66666667e+00 0.00000000e+00 -8.40000000e+00 5.20000000e+00 0.00000000e+00 + 1.60679313e+01 1.00000000e+01 0.00000000e+00 1.60679313e+01 9.46666667e+00 0.00000000e+00 1.60679313e+01 8.93333333e+00 0.00000000e+00 1.60679313e+01 8.40000000e+00 0.00000000e+00 + -3.53553391e-01 -3.53553391e-01 0.00000000e+00 -3.77123617e-01 -3.77123617e-01 0.00000000e+00 -4.00693843e-01 -4.00693843e-01 0.00000000e+00 -4.24264069e-01 -4.24264069e-01 0.00000000e+00 + -1.57973665e+00 -9.33970440e-01 0.00000000e+00 -1.71982444e+00 -1.02264696e+00 0.00000000e+00 -1.85991222e+00 -1.11132348e+00 0.00000000e+00 -2.00000000e+00 -1.20000000e+00 0.00000000e+00 + -1.20000000e+00 -2.00000000e+00 0.00000000e+00 -1.06666667e+00 -2.00000000e+00 0.00000000e+00 -9.33333333e-01 -2.00000000e+00 0.00000000e+00 -8.00000000e-01 -2.00000000e+00 0.00000000e+00 + -2.00000000e+00 1.20000000e+00 0.00000000e+00 -2.00000000e+00 1.33333333e+00 0.00000000e+00 -2.00000000e+00 1.46666667e+00 0.00000000e+00 -2.00000000e+00 1.60000000e+00 0.00000000e+00 + 1.60679313e+01 2.00000000e+00 0.00000000e+00 1.54410771e+01 2.00000000e+00 0.00000000e+00 1.48142228e+01 2.00000000e+00 0.00000000e+00 1.41873685e+01 2.00000000e+00 0.00000000e+00 + 1.80049110e+01 6.80000000e+00 0.00000000e+00 1.86699406e+01 6.80000000e+00 0.00000000e+00 1.93349703e+01 6.80000000e+00 0.00000000e+00 2.00000000e+01 6.80000000e+00 0.00000000e+00 + 8.00000000e-01 2.00000000e+00 0.00000000e+00 7.41246928e-01 1.86335659e+00 0.00000000e+00 6.82493855e-01 1.72671317e+00 0.00000000e+00 6.23740783e-01 1.59006976e+00 0.00000000e+00 + 1.60679313e+01 -1.60000000e+00 0.00000000e+00 1.60679313e+01 -1.73333333e+00 0.00000000e+00 1.60679313e+01 -1.86666667e+00 0.00000000e+00 1.60679313e+01 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 4.00000000e-01 0.00000000e+00 -1.00000000e+01 2.66666667e-01 0.00000000e+00 -1.00000000e+01 1.33333333e-01 0.00000000e+00 -1.00000000e+01 0.00000000e+00 0.00000000e+00 + -4.00000000e-01 5.20000000e+00 0.00000000e+00 -2.66666667e-01 5.20000000e+00 0.00000000e+00 -1.33333333e-01 5.20000000e+00 0.00000000e+00 0.00000000e+00 5.20000000e+00 0.00000000e+00 + 1.23615794e+01 1.00000000e+01 0.00000000e+00 1.29701758e+01 1.00000000e+01 0.00000000e+00 1.35787722e+01 1.00000000e+01 0.00000000e+00 1.41873685e+01 1.00000000e+01 0.00000000e+00 + 6.21434101e-01 -8.11760079e-01 0.00000000e+00 5.31846451e-01 -7.02976785e-01 0.00000000e+00 4.42258801e-01 -5.94193491e-01 0.00000000e+00 3.52671151e-01 -4.85410197e-01 0.00000000e+00 + 1.05889687e+01 -3.60000000e+00 0.00000000e+00 1.05889687e+01 -4.13333333e+00 0.00000000e+00 1.05889687e+01 -4.66666667e+00 0.00000000e+00 1.05889687e+01 -5.20000000e+00 0.00000000e+00 + -1.60000000e+00 8.40000000e+00 0.00000000e+00 -1.46666667e+00 8.40000000e+00 0.00000000e+00 -1.33333333e+00 8.40000000e+00 0.00000000e+00 -1.20000000e+00 8.40000000e+00 0.00000000e+00 + 3.33333333e+00 1.20000000e+00 0.00000000e+00 3.33333333e+00 1.06666667e+00 0.00000000e+00 3.33333333e+00 9.33333333e-01 0.00000000e+00 3.33333333e+00 8.00000000e-01 0.00000000e+00 + 1.56562831e+00 1.24227651e+00 0.00000000e+00 1.43400052e+00 1.13387546e+00 0.00000000e+00 1.30237274e+00 1.02547440e+00 0.00000000e+00 1.17074495e+00 9.17073345e-01 0.00000000e+00 + 1.05889687e+01 1.00000000e+01 0.00000000e+00 1.05889687e+01 9.46666667e+00 0.00000000e+00 1.05889687e+01 8.93333333e+00 0.00000000e+00 1.05889687e+01 8.40000000e+00 0.00000000e+00 + 1.41873685e+01 3.60000000e+00 0.00000000e+00 1.48142228e+01 3.60000000e+00 0.00000000e+00 1.54410771e+01 3.60000000e+00 0.00000000e+00 1.60679313e+01 3.60000000e+00 0.00000000e+00 + -1.59006976e+00 -6.23740783e-01 0.00000000e+00 -1.59217090e+00 -5.19894456e-01 0.00000000e+00 -1.59427204e+00 -4.16048129e-01 0.00000000e+00 -1.59637318e+00 -3.12201802e-01 0.00000000e+00 + 2.00000000e+01 2.00000000e+00 0.00000000e+00 2.00000000e+01 1.86666667e+00 0.00000000e+00 2.00000000e+01 1.73333333e+00 0.00000000e+00 2.00000000e+01 1.60000000e+00 0.00000000e+00 + 1.54809211e+00 -1.54809211e+00 0.00000000e+00 1.41115032e+00 -1.41115032e+00 0.00000000e+00 1.27420854e+00 -1.27420854e+00 0.00000000e+00 1.13726675e+00 -1.13726675e+00 0.00000000e+00 + 5.92613004e-01 9.38606790e-02 0.00000000e+00 5.96713137e-01 6.27170780e-02 0.00000000e+00 5.99177721e-01 3.14015737e-02 0.00000000e+00 6.00000000e-01 0.00000000e+00 0.00000000e+00 + 2.00000000e+01 -1.20000000e+00 0.00000000e+00 1.93349703e+01 -1.20000000e+00 0.00000000e+00 1.86699406e+01 -1.20000000e+00 0.00000000e+00 1.80049110e+01 -1.20000000e+00 0.00000000e+00 + -1.00000000e+01 5.20000000e+00 0.00000000e+00 -9.46666667e+00 5.20000000e+00 0.00000000e+00 -8.93333333e+00 5.20000000e+00 0.00000000e+00 -8.40000000e+00 5.20000000e+00 0.00000000e+00 + 1.60679313e+01 4.00000000e-01 0.00000000e+00 1.60679313e+01 2.66666667e-01 0.00000000e+00 1.60679313e+01 1.33333333e-01 0.00000000e+00 1.60679313e+01 0.00000000e+00 0.00000000e+00 + 8.86798734e+00 1.00000000e+01 0.00000000e+00 9.44164778e+00 1.00000000e+01 0.00000000e+00 1.00153082e+01 1.00000000e+01 0.00000000e+00 1.05889687e+01 1.00000000e+01 0.00000000e+00 + 1.41873685e+01 4.00000000e-01 0.00000000e+00 1.41873685e+01 2.66666667e-01 0.00000000e+00 1.41873685e+01 1.33333333e-01 0.00000000e+00 1.41873685e+01 0.00000000e+00 0.00000000e+00 + 1.20000000e+00 6.80000000e+00 0.00000000e+00 1.20000000e+00 6.26666667e+00 0.00000000e+00 1.20000000e+00 5.73333333e+00 0.00000000e+00 1.20000000e+00 5.20000000e+00 0.00000000e+00 + 5.57494171e+00 1.00000000e+01 0.00000000e+00 6.11567170e+00 1.00000000e+01 0.00000000e+00 6.65640169e+00 1.00000000e+01 0.00000000e+00 7.19713168e+00 1.00000000e+01 0.00000000e+00 + -2.00000000e+00 -1.60000000e+00 0.00000000e+00 -2.00000000e+00 -1.73333333e+00 0.00000000e+00 -2.00000000e+00 -1.86666667e+00 0.00000000e+00 -2.00000000e+00 -2.00000000e+00 0.00000000e+00 + -1.00000000e+01 0.00000000e+00 0.00000000e+00 -9.46666667e+00 0.00000000e+00 0.00000000e+00 -8.93333333e+00 0.00000000e+00 0.00000000e+00 -8.40000000e+00 0.00000000e+00 0.00000000e+00 + 1.60000000e+00 8.40000000e+00 0.00000000e+00 1.73333333e+00 8.40000000e+00 0.00000000e+00 1.86666667e+00 8.40000000e+00 0.00000000e+00 2.00000000e+00 8.40000000e+00 0.00000000e+00 + 2.00000000e+01 8.40000000e+00 0.00000000e+00 2.00000000e+01 7.86666667e+00 0.00000000e+00 2.00000000e+01 7.33333333e+00 0.00000000e+00 2.00000000e+01 6.80000000e+00 0.00000000e+00 + 5.57494171e+00 2.00000000e+00 0.00000000e+00 5.04996114e+00 2.00000000e+00 0.00000000e+00 4.52498057e+00 2.00000000e+00 0.00000000e+00 4.00000000e+00 2.00000000e+00 0.00000000e+00 + 0.00000000e+00 2.00000000e+00 0.00000000e+00 0.00000000e+00 2.53333333e+00 0.00000000e+00 0.00000000e+00 3.06666667e+00 0.00000000e+00 0.00000000e+00 3.60000000e+00 0.00000000e+00 + -5.20000000e+00 6.80000000e+00 0.00000000e+00 -5.20000000e+00 7.33333333e+00 0.00000000e+00 -5.20000000e+00 7.86666667e+00 0.00000000e+00 -5.20000000e+00 8.40000000e+00 0.00000000e+00 + 1.80049110e+01 8.40000000e+00 0.00000000e+00 1.86699406e+01 8.40000000e+00 0.00000000e+00 1.93349703e+01 8.40000000e+00 0.00000000e+00 2.00000000e+01 8.40000000e+00 0.00000000e+00 + 1.60000000e+00 -5.20000000e+00 0.00000000e+00 1.60000000e+00 -5.73333333e+00 0.00000000e+00 1.60000000e+00 -6.26666667e+00 0.00000000e+00 1.60000000e+00 -6.80000000e+00 0.00000000e+00 + -4.00000000e-01 3.60000000e+00 0.00000000e+00 -2.66666667e-01 3.60000000e+00 0.00000000e+00 -1.33333333e-01 3.60000000e+00 0.00000000e+00 0.00000000e+00 3.60000000e+00 0.00000000e+00 + 2.00000000e+00 -6.80000000e+00 0.00000000e+00 2.00000000e+00 -6.26666667e+00 0.00000000e+00 2.00000000e+00 -5.73333333e+00 0.00000000e+00 2.00000000e+00 -5.20000000e+00 0.00000000e+00 + 1.80049110e+01 1.60000000e+00 0.00000000e+00 1.80049110e+01 1.46666667e+00 0.00000000e+00 1.80049110e+01 1.33333333e+00 0.00000000e+00 1.80049110e+01 1.20000000e+00 0.00000000e+00 + 2.00000000e+00 2.00000000e+00 0.00000000e+00 2.00000000e+00 2.53333333e+00 0.00000000e+00 2.00000000e+00 3.06666667e+00 0.00000000e+00 2.00000000e+00 3.60000000e+00 0.00000000e+00 + 1.60679313e+01 8.40000000e+00 0.00000000e+00 1.67135912e+01 8.40000000e+00 0.00000000e+00 1.73592511e+01 8.40000000e+00 0.00000000e+00 1.80049110e+01 8.40000000e+00 0.00000000e+00 + 1.60000000e+00 2.00000000e+00 0.00000000e+00 1.73333333e+00 2.00000000e+00 0.00000000e+00 1.86666667e+00 2.00000000e+00 0.00000000e+00 2.00000000e+00 2.00000000e+00 0.00000000e+00 + 1.41873685e+01 8.40000000e+00 0.00000000e+00 1.48142228e+01 8.40000000e+00 0.00000000e+00 1.54410771e+01 8.40000000e+00 0.00000000e+00 1.60679313e+01 8.40000000e+00 0.00000000e+00 + 4.45503262e-01 -2.26995250e-01 0.00000000e+00 4.33012702e-01 -2.50000000e-01 0.00000000e+00 4.19335284e-01 -2.72319518e-01 0.00000000e+00 4.04508497e-01 -2.93892626e-01 0.00000000e+00 + 1.23615794e+01 8.40000000e+00 0.00000000e+00 1.29701758e+01 8.40000000e+00 0.00000000e+00 1.35787722e+01 8.40000000e+00 0.00000000e+00 1.41873685e+01 8.40000000e+00 0.00000000e+00 + -3.60000000e+00 5.20000000e+00 0.00000000e+00 -3.60000000e+00 5.73333333e+00 0.00000000e+00 -3.60000000e+00 6.26666667e+00 0.00000000e+00 -3.60000000e+00 6.80000000e+00 0.00000000e+00 + -1.56562831e+00 -1.24227651e+00 0.00000000e+00 -1.57033109e+00 -1.13950782e+00 0.00000000e+00 -1.57503387e+00 -1.03673913e+00 0.00000000e+00 -1.57973665e+00 -9.33970440e-01 0.00000000e+00 + 2.00000000e+01 8.00000000e-01 0.00000000e+00 2.00000000e+01 6.66666667e-01 0.00000000e+00 2.00000000e+01 5.33333333e-01 0.00000000e+00 2.00000000e+01 4.00000000e-01 0.00000000e+00 + 1.20000000e+00 2.00000000e+00 0.00000000e+00 1.11132348e+00 1.85991222e+00 0.00000000e+00 1.02264696e+00 1.71982444e+00 0.00000000e+00 9.33970440e-01 1.57973665e+00 0.00000000e+00 + 0.00000000e+00 -5.20000000e+00 0.00000000e+00 0.00000000e+00 -4.66666667e+00 0.00000000e+00 0.00000000e+00 -4.13333333e+00 0.00000000e+00 0.00000000e+00 -3.60000000e+00 0.00000000e+00 + 1.23615794e+01 8.40000000e+00 0.00000000e+00 1.23615794e+01 7.86666667e+00 0.00000000e+00 1.23615794e+01 7.33333333e+00 0.00000000e+00 1.23615794e+01 6.80000000e+00 0.00000000e+00 + 0.00000000e+00 -6.80000000e+00 0.00000000e+00 -1.33333333e-01 -6.80000000e+00 0.00000000e+00 -2.66666667e-01 -6.80000000e+00 0.00000000e+00 -4.00000000e-01 -6.80000000e+00 0.00000000e+00 + 4.85410197e-01 3.52671151e-01 0.00000000e+00 5.03202341e-01 3.26783421e-01 0.00000000e+00 5.19615242e-01 3.00000000e-01 0.00000000e+00 5.34603915e-01 2.72394300e-01 0.00000000e+00 + -8.95863812e-01 1.59824765e-01 0.00000000e+00 -8.90116065e-01 2.12495295e-01 0.00000000e+00 -8.84368317e-01 2.65165825e-01 0.00000000e+00 -8.78620570e-01 3.17836356e-01 0.00000000e+00 + 2.00000000e+00 1.20000000e+00 0.00000000e+00 1.85991222e+00 1.11132348e+00 0.00000000e+00 1.71982444e+00 1.02264696e+00 0.00000000e+00 1.57973665e+00 9.33970440e-01 0.00000000e+00 + 2.66666667e+00 5.20000000e+00 0.00000000e+00 2.88888889e+00 5.20000000e+00 0.00000000e+00 3.11111111e+00 5.20000000e+00 0.00000000e+00 3.33333333e+00 5.20000000e+00 0.00000000e+00 + 4.00000000e-01 -5.20000000e+00 0.00000000e+00 2.66666667e-01 -5.20000000e+00 0.00000000e+00 1.33333333e-01 -5.20000000e+00 0.00000000e+00 0.00000000e+00 -5.20000000e+00 0.00000000e+00 + -2.00000000e+00 3.60000000e+00 0.00000000e+00 -2.00000000e+00 4.13333333e+00 0.00000000e+00 -2.00000000e+00 4.66666667e+00 0.00000000e+00 -2.00000000e+00 5.20000000e+00 0.00000000e+00 + 8.86798734e+00 8.40000000e+00 0.00000000e+00 9.44164778e+00 8.40000000e+00 0.00000000e+00 1.00153082e+01 8.40000000e+00 0.00000000e+00 1.05889687e+01 8.40000000e+00 0.00000000e+00 + 1.13726675e+00 1.13726675e+00 0.00000000e+00 1.01277422e+00 1.01277422e+00 0.00000000e+00 8.88281689e-01 8.88281689e-01 0.00000000e+00 7.63789156e-01 7.63789156e-01 0.00000000e+00 + 2.00000000e+00 -1.00000000e+01 0.00000000e+00 2.00000000e+00 -9.46666667e+00 0.00000000e+00 2.00000000e+00 -8.93333333e+00 0.00000000e+00 2.00000000e+00 -8.40000000e+00 0.00000000e+00 + 5.57494171e+00 1.60000000e+00 0.00000000e+00 6.11567170e+00 1.60000000e+00 0.00000000e+00 6.65640169e+00 1.60000000e+00 0.00000000e+00 7.19713168e+00 1.60000000e+00 0.00000000e+00 + 7.19713168e+00 8.40000000e+00 0.00000000e+00 7.19713168e+00 7.86666667e+00 0.00000000e+00 7.19713168e+00 7.33333333e+00 0.00000000e+00 7.19713168e+00 6.80000000e+00 0.00000000e+00 + 7.19713168e+00 4.00000000e-01 0.00000000e+00 7.75408356e+00 4.00000000e-01 0.00000000e+00 8.31103545e+00 4.00000000e-01 0.00000000e+00 8.86798734e+00 4.00000000e-01 0.00000000e+00 + 4.00000000e+00 8.40000000e+00 0.00000000e+00 4.52498057e+00 8.40000000e+00 0.00000000e+00 5.04996114e+00 8.40000000e+00 0.00000000e+00 5.57494171e+00 8.40000000e+00 0.00000000e+00 + 5.57494171e+00 3.60000000e+00 0.00000000e+00 5.57494171e+00 3.06666667e+00 0.00000000e+00 5.57494171e+00 2.53333333e+00 0.00000000e+00 5.57494171e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+01 6.80000000e+00 0.00000000e+00 2.00000000e+01 6.26666667e+00 0.00000000e+00 2.00000000e+01 5.73333333e+00 0.00000000e+00 2.00000000e+01 5.20000000e+00 0.00000000e+00 + 8.11760079e-01 6.21434101e-01 0.00000000e+00 7.02976785e-01 5.31846451e-01 0.00000000e+00 5.94193491e-01 4.42258801e-01 0.00000000e+00 4.85410197e-01 3.52671151e-01 0.00000000e+00 + -6.80000000e+00 -3.60000000e+00 0.00000000e+00 -6.80000000e+00 -4.13333333e+00 0.00000000e+00 -6.80000000e+00 -4.66666667e+00 0.00000000e+00 -6.80000000e+00 -5.20000000e+00 0.00000000e+00 + 1.21740590e+00 4.63505130e-01 0.00000000e+00 1.22141716e+00 3.86465173e-01 0.00000000e+00 1.22542843e+00 3.09425216e-01 0.00000000e+00 1.22943970e+00 2.32385259e-01 0.00000000e+00 + 2.66666667e+00 -5.20000000e+00 0.00000000e+00 2.66666667e+00 -5.73333333e+00 0.00000000e+00 2.66666667e+00 -6.26666667e+00 0.00000000e+00 2.66666667e+00 -6.80000000e+00 0.00000000e+00 + 8.86798734e+00 0.00000000e+00 0.00000000e+00 8.86798734e+00 -1.33333333e-01 0.00000000e+00 8.86798734e+00 -2.66666667e-01 0.00000000e+00 8.86798734e+00 -4.00000000e-01 0.00000000e+00 + -1.20000000e+00 8.40000000e+00 0.00000000e+00 -1.20000000e+00 8.93333333e+00 0.00000000e+00 -1.20000000e+00 9.46666667e+00 0.00000000e+00 -1.20000000e+00 1.00000000e+01 0.00000000e+00 + 1.60679313e+01 6.80000000e+00 0.00000000e+00 1.67135912e+01 6.80000000e+00 0.00000000e+00 1.73592511e+01 6.80000000e+00 0.00000000e+00 1.80049110e+01 6.80000000e+00 0.00000000e+00 + 7.19713167e+00 -6.80000000e+00 0.00000000e+00 7.19713167e+00 -7.33333333e+00 0.00000000e+00 7.19713167e+00 -7.86666667e+00 0.00000000e+00 7.19713167e+00 -8.40000000e+00 0.00000000e+00 + -1.19767907e+00 6.92125386e-01 0.00000000e+00 -1.18870103e+00 7.67108039e-01 0.00000000e+00 -1.17972299e+00 8.42090692e-01 0.00000000e+00 -1.17074495e+00 9.17073345e-01 0.00000000e+00 + -6.80000000e+00 -5.20000000e+00 0.00000000e+00 -6.26666667e+00 -5.20000000e+00 0.00000000e+00 -5.73333333e+00 -5.20000000e+00 0.00000000e+00 -5.20000000e+00 -5.20000000e+00 0.00000000e+00 + 2.00000000e+00 4.00000000e-01 0.00000000e+00 2.22222222e+00 4.00000000e-01 0.00000000e+00 2.44444444e+00 4.00000000e-01 0.00000000e+00 2.66666667e+00 4.00000000e-01 0.00000000e+00 + -3.60000000e+00 8.40000000e+00 0.00000000e+00 -3.60000000e+00 8.93333333e+00 0.00000000e+00 -3.60000000e+00 9.46666667e+00 0.00000000e+00 -3.60000000e+00 1.00000000e+01 0.00000000e+00 + -1.59849170e+00 0.00000000e+00 0.00000000e+00 -1.59778553e+00 1.04067267e-01 0.00000000e+00 -1.59707935e+00 2.08134535e-01 0.00000000e+00 -1.59637318e+00 3.12201802e-01 0.00000000e+00 + -8.40000000e+00 4.00000000e-01 0.00000000e+00 -8.40000000e+00 5.33333333e-01 0.00000000e+00 -8.40000000e+00 6.66666667e-01 0.00000000e+00 -8.40000000e+00 8.00000000e-01 0.00000000e+00 + 4.00000000e+00 -4.00000000e-01 0.00000000e+00 4.00000000e+00 -5.33333333e-01 0.00000000e+00 4.00000000e+00 -6.66666667e-01 0.00000000e+00 4.00000000e+00 -8.00000000e-01 0.00000000e+00 + -1.23348416e+00 0.00000000e+00 0.00000000e+00 -1.12287582e+00 0.00000000e+00 0.00000000e+00 -1.01226747e+00 0.00000000e+00 0.00000000e+00 -9.01659125e-01 0.00000000e+00 0.00000000e+00 + 7.19713168e+00 6.80000000e+00 0.00000000e+00 7.75408356e+00 6.80000000e+00 0.00000000e+00 8.31103545e+00 6.80000000e+00 0.00000000e+00 8.86798734e+00 6.80000000e+00 0.00000000e+00 + 1.60679313e+01 6.80000000e+00 0.00000000e+00 1.60679313e+01 6.26666667e+00 0.00000000e+00 1.60679313e+01 5.73333333e+00 0.00000000e+00 1.60679313e+01 5.20000000e+00 0.00000000e+00 + 2.00000000e+00 0.00000000e+00 0.00000000e+00 2.00000000e+00 1.33333333e-01 0.00000000e+00 2.00000000e+00 2.66666667e-01 0.00000000e+00 2.00000000e+00 4.00000000e-01 0.00000000e+00 + 1.41873685e+01 6.80000000e+00 0.00000000e+00 1.41873685e+01 6.26666667e+00 0.00000000e+00 1.41873685e+01 5.73333333e+00 0.00000000e+00 1.41873685e+01 5.20000000e+00 0.00000000e+00 + -8.00000000e-01 8.40000000e+00 0.00000000e+00 -8.00000000e-01 8.93333333e+00 0.00000000e+00 -8.00000000e-01 9.46666667e+00 0.00000000e+00 -8.00000000e-01 1.00000000e+01 0.00000000e+00 + -7.63789156e-01 7.63789156e-01 0.00000000e+00 -6.50614127e-01 6.50614127e-01 0.00000000e+00 -5.37439098e-01 5.37439098e-01 0.00000000e+00 -4.24264069e-01 4.24264069e-01 0.00000000e+00 + -1.60000000e+00 -2.00000000e+00 0.00000000e+00 -1.60000000e+00 -2.53333333e+00 0.00000000e+00 -1.60000000e+00 -3.06666667e+00 0.00000000e+00 -1.60000000e+00 -3.60000000e+00 0.00000000e+00 + 1.80049110e+01 -2.00000000e+00 0.00000000e+00 1.80049110e+01 -2.53333333e+00 0.00000000e+00 1.80049110e+01 -3.06666667e+00 0.00000000e+00 1.80049110e+01 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 6.80000000e+00 0.00000000e+00 8.00000000e-01 6.26666667e+00 0.00000000e+00 8.00000000e-01 5.73333333e+00 0.00000000e+00 8.00000000e-01 5.20000000e+00 0.00000000e+00 + 5.57494171e+00 4.00000000e-01 0.00000000e+00 6.11567170e+00 4.00000000e-01 0.00000000e+00 6.65640169e+00 4.00000000e-01 0.00000000e+00 7.19713168e+00 4.00000000e-01 0.00000000e+00 + -5.20000000e+00 8.40000000e+00 0.00000000e+00 -5.20000000e+00 8.93333333e+00 0.00000000e+00 -5.20000000e+00 9.46666667e+00 0.00000000e+00 -5.20000000e+00 1.00000000e+01 0.00000000e+00 + -4.24264069e-01 4.24264069e-01 0.00000000e+00 -4.00693843e-01 4.00693843e-01 0.00000000e+00 -3.77123617e-01 3.77123617e-01 0.00000000e+00 -3.53553391e-01 3.53553391e-01 0.00000000e+00 + -1.00000000e+01 -5.20000000e+00 0.00000000e+00 -9.46666667e+00 -5.20000000e+00 0.00000000e+00 -8.93333333e+00 -5.20000000e+00 0.00000000e+00 -8.40000000e+00 -5.20000000e+00 0.00000000e+00 + -6.80000000e+00 5.20000000e+00 0.00000000e+00 -6.26666667e+00 5.20000000e+00 0.00000000e+00 -5.73333333e+00 5.20000000e+00 0.00000000e+00 -5.20000000e+00 5.20000000e+00 0.00000000e+00 + 1.60679313e+01 5.20000000e+00 0.00000000e+00 1.67135912e+01 5.20000000e+00 0.00000000e+00 1.73592511e+01 5.20000000e+00 0.00000000e+00 1.80049110e+01 5.20000000e+00 0.00000000e+00 + 1.60679313e+01 5.20000000e+00 0.00000000e+00 1.60679313e+01 4.66666667e+00 0.00000000e+00 1.60679313e+01 4.13333333e+00 0.00000000e+00 1.60679313e+01 3.60000000e+00 0.00000000e+00 + 1.41873685e+01 1.60000000e+00 0.00000000e+00 1.41873685e+01 1.46666667e+00 0.00000000e+00 1.41873685e+01 1.33333333e+00 0.00000000e+00 1.41873685e+01 1.20000000e+00 0.00000000e+00 + 4.00000000e-01 5.20000000e+00 0.00000000e+00 4.00000000e-01 4.66666667e+00 0.00000000e+00 4.00000000e-01 4.13333333e+00 0.00000000e+00 4.00000000e-01 3.60000000e+00 0.00000000e+00 + -3.60000000e+00 3.60000000e+00 0.00000000e+00 -3.06666667e+00 3.60000000e+00 0.00000000e+00 -2.53333333e+00 3.60000000e+00 0.00000000e+00 -2.00000000e+00 3.60000000e+00 0.00000000e+00 + -2.00000000e+00 1.00000000e+01 0.00000000e+00 -2.53333333e+00 1.00000000e+01 0.00000000e+00 -3.06666667e+00 1.00000000e+01 0.00000000e+00 -3.60000000e+00 1.00000000e+01 0.00000000e+00 + 1.23615794e+01 5.20000000e+00 0.00000000e+00 1.29701758e+01 5.20000000e+00 0.00000000e+00 1.35787722e+01 5.20000000e+00 0.00000000e+00 1.41873685e+01 5.20000000e+00 0.00000000e+00 + 2.00000000e+00 -4.00000000e-01 0.00000000e+00 1.86545773e+00 -3.70733934e-01 0.00000000e+00 1.73091545e+00 -3.41467868e-01 0.00000000e+00 1.59637318e+00 -3.12201802e-01 0.00000000e+00 + 0.00000000e+00 2.00000000e+00 0.00000000e+00 1.33333333e-01 2.00000000e+00 0.00000000e+00 2.66666667e-01 2.00000000e+00 0.00000000e+00 4.00000000e-01 2.00000000e+00 0.00000000e+00 + 1.80049110e+01 5.20000000e+00 0.00000000e+00 1.86699406e+01 5.20000000e+00 0.00000000e+00 1.93349703e+01 5.20000000e+00 0.00000000e+00 2.00000000e+01 5.20000000e+00 0.00000000e+00 + 1.20000000e+00 3.60000000e+00 0.00000000e+00 1.33333333e+00 3.60000000e+00 0.00000000e+00 1.46666667e+00 3.60000000e+00 0.00000000e+00 1.60000000e+00 3.60000000e+00 0.00000000e+00 + 6.23740783e-01 -1.59006976e+00 0.00000000e+00 5.70328898e-01 -1.46584847e+00 0.00000000e+00 5.16917014e-01 -1.34162718e+00 0.00000000e+00 4.63505130e-01 -1.21740590e+00 0.00000000e+00 + 4.00000000e+00 8.40000000e+00 0.00000000e+00 4.00000000e+00 7.86666667e+00 0.00000000e+00 4.00000000e+00 7.33333333e+00 0.00000000e+00 4.00000000e+00 6.80000000e+00 0.00000000e+00 + 1.05889687e+01 5.20000000e+00 0.00000000e+00 1.11798389e+01 5.20000000e+00 0.00000000e+00 1.17707092e+01 5.20000000e+00 0.00000000e+00 1.23615794e+01 5.20000000e+00 0.00000000e+00 + 7.19713168e+00 1.60000000e+00 0.00000000e+00 7.75408356e+00 1.60000000e+00 0.00000000e+00 8.31103545e+00 1.60000000e+00 0.00000000e+00 8.86798734e+00 1.60000000e+00 0.00000000e+00 + 1.41873685e+01 5.20000000e+00 0.00000000e+00 1.41873685e+01 4.66666667e+00 0.00000000e+00 1.41873685e+01 4.13333333e+00 0.00000000e+00 1.41873685e+01 3.60000000e+00 0.00000000e+00 + 1.13726675e+00 -1.13726675e+00 0.00000000e+00 1.01277422e+00 -1.01277422e+00 0.00000000e+00 8.88281689e-01 -8.88281689e-01 0.00000000e+00 7.63789156e-01 -7.63789156e-01 0.00000000e+00 + -8.00000000e-01 -1.00000000e+01 0.00000000e+00 -9.33333333e-01 -1.00000000e+01 0.00000000e+00 -1.06666667e+00 -1.00000000e+01 0.00000000e+00 -1.20000000e+00 -1.00000000e+01 0.00000000e+00 + 7.19713168e+00 -1.60000000e+00 0.00000000e+00 6.65640169e+00 -1.60000000e+00 0.00000000e+00 6.11567170e+00 -1.60000000e+00 0.00000000e+00 5.57494171e+00 -1.60000000e+00 0.00000000e+00 + -5.20000000e+00 -8.00000000e-01 0.00000000e+00 -5.20000000e+00 -9.33333333e-01 0.00000000e+00 -5.20000000e+00 -1.06666667e+00 0.00000000e+00 -5.20000000e+00 -1.20000000e+00 0.00000000e+00 + 1.80049110e+01 3.60000000e+00 0.00000000e+00 1.80049110e+01 3.06666667e+00 0.00000000e+00 1.80049110e+01 2.53333333e+00 0.00000000e+00 1.80049110e+01 2.00000000e+00 0.00000000e+00 + 9.38606790e-02 5.92613004e-01 0.00000000e+00 1.24747014e-01 5.86888560e-01 0.00000000e+00 1.55291427e-01 5.79555496e-01 0.00000000e+00 1.85410197e-01 5.70633910e-01 0.00000000e+00 + 7.19713167e+00 -5.20000000e+00 0.00000000e+00 7.19713167e+00 -5.73333333e+00 0.00000000e+00 7.19713167e+00 -6.26666667e+00 0.00000000e+00 7.19713167e+00 -6.80000000e+00 0.00000000e+00 + -8.00000000e-01 5.20000000e+00 0.00000000e+00 -8.00000000e-01 5.73333333e+00 0.00000000e+00 -8.00000000e-01 6.26666667e+00 0.00000000e+00 -8.00000000e-01 6.80000000e+00 0.00000000e+00 + 1.60000000e+00 -5.20000000e+00 0.00000000e+00 1.46666667e+00 -5.20000000e+00 0.00000000e+00 1.33333333e+00 -5.20000000e+00 0.00000000e+00 1.20000000e+00 -5.20000000e+00 0.00000000e+00 + 1.80049110e+01 8.00000000e-01 0.00000000e+00 1.86699406e+01 8.00000000e-01 0.00000000e+00 1.93349703e+01 8.00000000e-01 0.00000000e+00 2.00000000e+01 8.00000000e-01 0.00000000e+00 + 1.05889687e+01 5.20000000e+00 0.00000000e+00 1.05889687e+01 4.66666667e+00 0.00000000e+00 1.05889687e+01 4.13333333e+00 0.00000000e+00 1.05889687e+01 3.60000000e+00 0.00000000e+00 + 1.80049110e+01 4.00000000e-01 0.00000000e+00 1.80049110e+01 2.66666667e-01 0.00000000e+00 1.80049110e+01 1.33333333e-01 0.00000000e+00 1.80049110e+01 0.00000000e+00 0.00000000e+00 + -6.80000000e+00 0.00000000e+00 0.00000000e+00 -6.26666667e+00 0.00000000e+00 0.00000000e+00 -5.73333333e+00 0.00000000e+00 0.00000000e+00 -5.20000000e+00 0.00000000e+00 0.00000000e+00 + 1.05889687e+01 4.00000000e-01 0.00000000e+00 1.05889687e+01 2.66666667e-01 0.00000000e+00 1.05889687e+01 1.33333333e-01 0.00000000e+00 1.05889687e+01 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 -1.23348416e+00 0.00000000e+00 0.00000000e+00 -1.12287582e+00 0.00000000e+00 0.00000000e+00 -1.01226747e+00 0.00000000e+00 0.00000000e+00 -9.01659125e-01 0.00000000e+00 + 1.60000000e+00 6.80000000e+00 0.00000000e+00 1.73333333e+00 6.80000000e+00 0.00000000e+00 1.86666667e+00 6.80000000e+00 0.00000000e+00 2.00000000e+00 6.80000000e+00 0.00000000e+00 + -3.12201802e-01 -1.59637318e+00 0.00000000e+00 -3.41467868e-01 -1.73091545e+00 0.00000000e+00 -3.70733934e-01 -1.86545773e+00 0.00000000e+00 -4.00000000e-01 -2.00000000e+00 0.00000000e+00 + 3.52671151e-01 -4.85410197e-01 0.00000000e+00 3.26783421e-01 -5.03202341e-01 0.00000000e+00 3.00000000e-01 -5.19615242e-01 0.00000000e+00 2.72394300e-01 -5.34603915e-01 0.00000000e+00 + 1.41873685e+01 0.00000000e+00 0.00000000e+00 1.41873685e+01 -1.33333333e-01 0.00000000e+00 1.41873685e+01 -2.66666667e-01 0.00000000e+00 1.41873685e+01 -4.00000000e-01 0.00000000e+00 + -5.70633910e-01 -1.85410197e-01 0.00000000e+00 -5.79555496e-01 -1.55291427e-01 0.00000000e+00 -5.86888560e-01 -1.24747014e-01 0.00000000e+00 -5.92613004e-01 -9.38606790e-02 0.00000000e+00 + 3.33333333e+00 -1.00000000e+01 0.00000000e+00 3.11111111e+00 -1.00000000e+01 0.00000000e+00 2.88888889e+00 -1.00000000e+01 0.00000000e+00 2.66666667e+00 -1.00000000e+01 0.00000000e+00 + 1.05889687e+01 8.40000000e+00 0.00000000e+00 1.11798389e+01 8.40000000e+00 0.00000000e+00 1.17707092e+01 8.40000000e+00 0.00000000e+00 1.23615794e+01 8.40000000e+00 0.00000000e+00 + 1.05889687e+01 3.60000000e+00 0.00000000e+00 1.11798389e+01 3.60000000e+00 0.00000000e+00 1.17707092e+01 3.60000000e+00 0.00000000e+00 1.23615794e+01 3.60000000e+00 0.00000000e+00 + 4.93844170e-01 7.82172325e-02 0.00000000e+00 5.26767115e-01 8.34317147e-02 0.00000000e+00 5.59690060e-01 8.86461969e-02 0.00000000e+00 5.92613004e-01 9.38606790e-02 0.00000000e+00 + -4.63505130e-01 -1.21740590e+00 0.00000000e+00 -5.39711882e-01 -1.21083029e+00 0.00000000e+00 -6.15918634e-01 -1.20425468e+00 0.00000000e+00 -6.92125386e-01 -1.19767907e+00 0.00000000e+00 + -4.00000000e-01 3.60000000e+00 0.00000000e+00 -4.00000000e-01 4.13333333e+00 0.00000000e+00 -4.00000000e-01 4.66666667e+00 0.00000000e+00 -4.00000000e-01 5.20000000e+00 0.00000000e+00 + 0.00000000e+00 -5.00000000e-01 0.00000000e+00 0.00000000e+00 -5.33333333e-01 0.00000000e+00 0.00000000e+00 -5.66666667e-01 0.00000000e+00 0.00000000e+00 -6.00000000e-01 0.00000000e+00 + 1.80049110e+01 -5.20000000e+00 0.00000000e+00 1.86699406e+01 -5.20000000e+00 0.00000000e+00 1.93349703e+01 -5.20000000e+00 0.00000000e+00 2.00000000e+01 -5.20000000e+00 0.00000000e+00 + -6.21434101e-01 8.11760079e-01 0.00000000e+00 -5.31846451e-01 7.02976785e-01 0.00000000e+00 -4.42258801e-01 5.94193491e-01 0.00000000e+00 -3.52671151e-01 4.85410197e-01 0.00000000e+00 + 1.23615794e+01 6.80000000e+00 0.00000000e+00 1.29701758e+01 6.80000000e+00 0.00000000e+00 1.35787722e+01 6.80000000e+00 0.00000000e+00 1.41873685e+01 6.80000000e+00 0.00000000e+00 + 2.00000000e+00 5.20000000e+00 0.00000000e+00 2.22222222e+00 5.20000000e+00 0.00000000e+00 2.44444444e+00 5.20000000e+00 0.00000000e+00 2.66666667e+00 5.20000000e+00 0.00000000e+00 + 1.05889687e+01 3.60000000e+00 0.00000000e+00 1.05889687e+01 3.06666667e+00 0.00000000e+00 1.05889687e+01 2.53333333e+00 0.00000000e+00 1.05889687e+01 2.00000000e+00 0.00000000e+00 + 7.19713168e+00 2.00000000e+00 0.00000000e+00 6.65640169e+00 2.00000000e+00 0.00000000e+00 6.11567170e+00 2.00000000e+00 0.00000000e+00 5.57494171e+00 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 8.40000000e+00 0.00000000e+00 3.55555556e+00 8.40000000e+00 0.00000000e+00 3.77777778e+00 8.40000000e+00 0.00000000e+00 4.00000000e+00 8.40000000e+00 0.00000000e+00 + 1.24227651e+00 1.56562831e+00 0.00000000e+00 1.34421505e+00 1.55978291e+00 0.00000000e+00 1.44615358e+00 1.55393751e+00 0.00000000e+00 1.54809211e+00 1.54809211e+00 0.00000000e+00 + 5.34603915e-01 -2.72394300e-01 0.00000000e+00 5.19615242e-01 -3.00000000e-01 0.00000000e+00 5.03202341e-01 -3.26783421e-01 0.00000000e+00 4.85410197e-01 -3.52671151e-01 0.00000000e+00 + 5.57494171e+00 3.60000000e+00 0.00000000e+00 6.11567170e+00 3.60000000e+00 0.00000000e+00 6.65640169e+00 3.60000000e+00 0.00000000e+00 7.19713168e+00 3.60000000e+00 0.00000000e+00 + 1.20000000e+00 5.20000000e+00 0.00000000e+00 1.33333333e+00 5.20000000e+00 0.00000000e+00 1.46666667e+00 5.20000000e+00 0.00000000e+00 1.60000000e+00 5.20000000e+00 0.00000000e+00 + 7.19713168e+00 1.00000000e+01 0.00000000e+00 7.19713168e+00 9.46666667e+00 0.00000000e+00 7.19713168e+00 8.93333333e+00 0.00000000e+00 7.19713168e+00 8.40000000e+00 0.00000000e+00 + 4.00000000e+00 1.00000000e+01 0.00000000e+00 4.00000000e+00 9.46666667e+00 0.00000000e+00 4.00000000e+00 8.93333333e+00 0.00000000e+00 4.00000000e+00 8.40000000e+00 0.00000000e+00 + 8.11760079e-01 -6.21434101e-01 0.00000000e+00 7.95769772e-01 -6.68885786e-01 0.00000000e+00 7.79779464e-01 -7.16337471e-01 0.00000000e+00 7.63789156e-01 -7.63789156e-01 0.00000000e+00 + -8.40000000e+00 1.60000000e+00 0.00000000e+00 -8.40000000e+00 1.73333333e+00 0.00000000e+00 -8.40000000e+00 1.86666667e+00 0.00000000e+00 -8.40000000e+00 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 1.00000000e+01 0.00000000e+00 3.55555556e+00 1.00000000e+01 0.00000000e+00 3.77777778e+00 1.00000000e+01 0.00000000e+00 4.00000000e+00 1.00000000e+01 0.00000000e+00 + 2.00000000e+00 1.00000000e+01 0.00000000e+00 2.22222222e+00 1.00000000e+01 0.00000000e+00 2.44444444e+00 1.00000000e+01 0.00000000e+00 2.66666667e+00 1.00000000e+01 0.00000000e+00 + 4.04508497e-01 2.93892626e-01 0.00000000e+00 4.31475730e-01 3.13485468e-01 0.00000000e+00 4.58442963e-01 3.33078310e-01 0.00000000e+00 4.85410197e-01 3.52671151e-01 0.00000000e+00 + 8.86798734e+00 6.80000000e+00 0.00000000e+00 9.44164778e+00 6.80000000e+00 0.00000000e+00 1.00153082e+01 6.80000000e+00 0.00000000e+00 1.05889687e+01 6.80000000e+00 0.00000000e+00 + 2.66666667e+00 -1.60000000e+00 0.00000000e+00 2.66666667e+00 -1.73333333e+00 0.00000000e+00 2.66666667e+00 -1.86666667e+00 0.00000000e+00 2.66666667e+00 -2.00000000e+00 0.00000000e+00 + -1.20000000e+00 -8.40000000e+00 0.00000000e+00 -1.20000000e+00 -8.93333333e+00 0.00000000e+00 -1.20000000e+00 -9.46666667e+00 0.00000000e+00 -1.20000000e+00 -1.00000000e+01 0.00000000e+00 + 3.33333333e+00 1.20000000e+00 0.00000000e+00 3.55555556e+00 1.20000000e+00 0.00000000e+00 3.77777778e+00 1.20000000e+00 0.00000000e+00 4.00000000e+00 1.20000000e+00 0.00000000e+00 + -5.20000000e+00 8.00000000e-01 0.00000000e+00 -4.66666667e+00 8.00000000e-01 0.00000000e+00 -4.13333333e+00 8.00000000e-01 0.00000000e+00 -3.60000000e+00 8.00000000e-01 0.00000000e+00 + 1.05889687e+01 6.80000000e+00 0.00000000e+00 1.05889687e+01 6.26666667e+00 0.00000000e+00 1.05889687e+01 5.73333333e+00 0.00000000e+00 1.05889687e+01 5.20000000e+00 0.00000000e+00 + 2.66666667e+00 1.00000000e+01 0.00000000e+00 2.88888889e+00 1.00000000e+01 0.00000000e+00 3.11111111e+00 1.00000000e+01 0.00000000e+00 3.33333333e+00 1.00000000e+01 0.00000000e+00 + 1.20000000e+00 2.00000000e+00 0.00000000e+00 1.33333333e+00 2.00000000e+00 0.00000000e+00 1.46666667e+00 2.00000000e+00 0.00000000e+00 1.60000000e+00 2.00000000e+00 0.00000000e+00 + 1.41873685e+01 5.20000000e+00 0.00000000e+00 1.48142228e+01 5.20000000e+00 0.00000000e+00 1.54410771e+01 5.20000000e+00 0.00000000e+00 1.60679313e+01 5.20000000e+00 0.00000000e+00 + 4.00000000e-01 6.80000000e+00 0.00000000e+00 4.00000000e-01 6.26666667e+00 0.00000000e+00 4.00000000e-01 5.73333333e+00 0.00000000e+00 4.00000000e-01 5.20000000e+00 0.00000000e+00 + 1.05889687e+01 -1.20000000e+00 0.00000000e+00 1.05889687e+01 -1.33333333e+00 0.00000000e+00 1.05889687e+01 -1.46666667e+00 0.00000000e+00 1.05889687e+01 -1.60000000e+00 0.00000000e+00 + 2.66666667e+00 8.40000000e+00 0.00000000e+00 2.88888889e+00 8.40000000e+00 0.00000000e+00 3.11111111e+00 8.40000000e+00 0.00000000e+00 3.33333333e+00 8.40000000e+00 0.00000000e+00 + 1.60679313e+01 3.60000000e+00 0.00000000e+00 1.60679313e+01 3.06666667e+00 0.00000000e+00 1.60679313e+01 2.53333333e+00 0.00000000e+00 1.60679313e+01 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 8.40000000e+00 0.00000000e+00 2.00000000e+00 8.93333333e+00 0.00000000e+00 2.00000000e+00 9.46666667e+00 0.00000000e+00 2.00000000e+00 1.00000000e+01 0.00000000e+00 + 7.19713168e+00 8.40000000e+00 0.00000000e+00 7.75408356e+00 8.40000000e+00 0.00000000e+00 8.31103545e+00 8.40000000e+00 0.00000000e+00 8.86798734e+00 8.40000000e+00 0.00000000e+00 + 1.60000000e+00 5.20000000e+00 0.00000000e+00 1.73333333e+00 5.20000000e+00 0.00000000e+00 1.86666667e+00 5.20000000e+00 0.00000000e+00 2.00000000e+00 5.20000000e+00 0.00000000e+00 + -1.60000000e+00 6.80000000e+00 0.00000000e+00 -1.46666667e+00 6.80000000e+00 0.00000000e+00 -1.33333333e+00 6.80000000e+00 0.00000000e+00 -1.20000000e+00 6.80000000e+00 0.00000000e+00 + 2.66666667e+00 8.40000000e+00 0.00000000e+00 2.66666667e+00 7.86666667e+00 0.00000000e+00 2.66666667e+00 7.33333333e+00 0.00000000e+00 2.66666667e+00 6.80000000e+00 0.00000000e+00 + 1.23348416e+00 0.00000000e+00 0.00000000e+00 1.35515334e+00 0.00000000e+00 0.00000000e+00 1.47682252e+00 0.00000000e+00 0.00000000e+00 1.59849170e+00 0.00000000e+00 0.00000000e+00 + 1.05889687e+01 -3.60000000e+00 0.00000000e+00 1.11798389e+01 -3.60000000e+00 0.00000000e+00 1.17707092e+01 -3.60000000e+00 0.00000000e+00 1.23615794e+01 -3.60000000e+00 0.00000000e+00 + -1.00000000e+01 4.00000000e-01 0.00000000e+00 -9.46666667e+00 4.00000000e-01 0.00000000e+00 -8.93333333e+00 4.00000000e-01 0.00000000e+00 -8.40000000e+00 4.00000000e-01 0.00000000e+00 + -3.60000000e+00 -8.40000000e+00 0.00000000e+00 -3.60000000e+00 -8.93333333e+00 0.00000000e+00 -3.60000000e+00 -9.46666667e+00 0.00000000e+00 -3.60000000e+00 -1.00000000e+01 0.00000000e+00 + -3.60000000e+00 4.00000000e-01 0.00000000e+00 -3.06666667e+00 4.00000000e-01 0.00000000e+00 -2.53333333e+00 4.00000000e-01 0.00000000e+00 -2.00000000e+00 4.00000000e-01 0.00000000e+00 + -1.20000000e+00 -3.60000000e+00 0.00000000e+00 -1.20000000e+00 -4.13333333e+00 0.00000000e+00 -1.20000000e+00 -4.66666667e+00 0.00000000e+00 -1.20000000e+00 -5.20000000e+00 0.00000000e+00 + 8.00000000e-01 1.00000000e+01 0.00000000e+00 6.66666667e-01 1.00000000e+01 0.00000000e+00 5.33333333e-01 1.00000000e+01 0.00000000e+00 4.00000000e-01 1.00000000e+01 0.00000000e+00 + 2.66666667e+00 1.00000000e+01 0.00000000e+00 2.66666667e+00 9.46666667e+00 0.00000000e+00 2.66666667e+00 8.93333333e+00 0.00000000e+00 2.66666667e+00 8.40000000e+00 0.00000000e+00 + 8.86798734e+00 -2.00000000e+00 0.00000000e+00 8.31103545e+00 -2.00000000e+00 0.00000000e+00 7.75408356e+00 -2.00000000e+00 0.00000000e+00 7.19713168e+00 -2.00000000e+00 0.00000000e+00 + 3.33333333e+00 1.60000000e+00 0.00000000e+00 3.55555556e+00 1.60000000e+00 0.00000000e+00 3.77777778e+00 1.60000000e+00 0.00000000e+00 4.00000000e+00 1.60000000e+00 0.00000000e+00 + 2.00000000e+00 8.40000000e+00 0.00000000e+00 2.22222222e+00 8.40000000e+00 0.00000000e+00 2.44444444e+00 8.40000000e+00 0.00000000e+00 2.66666667e+00 8.40000000e+00 0.00000000e+00 + 1.41873685e+01 1.20000000e+00 0.00000000e+00 1.48142228e+01 1.20000000e+00 0.00000000e+00 1.54410771e+01 1.20000000e+00 0.00000000e+00 1.60679313e+01 1.20000000e+00 0.00000000e+00 + -2.00000000e+00 2.00000000e+00 0.00000000e+00 -1.84936404e+00 1.84936404e+00 0.00000000e+00 -1.69872807e+00 1.69872807e+00 0.00000000e+00 -1.54809211e+00 1.54809211e+00 0.00000000e+00 + 2.66666667e+00 -6.80000000e+00 0.00000000e+00 2.44444444e+00 -6.80000000e+00 0.00000000e+00 2.22222222e+00 -6.80000000e+00 0.00000000e+00 2.00000000e+00 -6.80000000e+00 0.00000000e+00 + -9.38606790e-02 5.92613004e-01 0.00000000e+00 -6.27170780e-02 5.96713137e-01 0.00000000e+00 -3.14015737e-02 5.99177721e-01 0.00000000e+00 0.00000000e+00 6.00000000e-01 0.00000000e+00 + 4.00000000e+00 1.00000000e+01 0.00000000e+00 4.52498057e+00 1.00000000e+01 0.00000000e+00 5.04996114e+00 1.00000000e+01 0.00000000e+00 5.57494171e+00 1.00000000e+01 0.00000000e+00 + 3.17836356e-01 -8.78620570e-01 0.00000000e+00 2.65165825e-01 -8.84368317e-01 0.00000000e+00 2.12495295e-01 -8.90116065e-01 0.00000000e+00 1.59824765e-01 -8.95863812e-01 0.00000000e+00 + -6.80000000e+00 4.00000000e-01 0.00000000e+00 -6.80000000e+00 5.33333333e-01 0.00000000e+00 -6.80000000e+00 6.66666667e-01 0.00000000e+00 -6.80000000e+00 8.00000000e-01 0.00000000e+00 + 4.00000000e+00 6.80000000e+00 0.00000000e+00 4.00000000e+00 6.26666667e+00 0.00000000e+00 4.00000000e+00 5.73333333e+00 0.00000000e+00 4.00000000e+00 5.20000000e+00 0.00000000e+00 + -1.20000000e+00 -3.60000000e+00 0.00000000e+00 -1.33333333e+00 -3.60000000e+00 0.00000000e+00 -1.46666667e+00 -3.60000000e+00 0.00000000e+00 -1.60000000e+00 -3.60000000e+00 0.00000000e+00 + 3.33333333e+00 6.80000000e+00 0.00000000e+00 3.55555556e+00 6.80000000e+00 0.00000000e+00 3.77777778e+00 6.80000000e+00 0.00000000e+00 4.00000000e+00 6.80000000e+00 0.00000000e+00 + 1.60000000e+00 2.00000000e+00 0.00000000e+00 1.48075884e+00 1.85520944e+00 0.00000000e+00 1.36151768e+00 1.71041887e+00 0.00000000e+00 1.24227651e+00 1.56562831e+00 0.00000000e+00 + 1.05889687e+01 8.40000000e+00 0.00000000e+00 1.05889687e+01 7.86666667e+00 0.00000000e+00 1.05889687e+01 7.33333333e+00 0.00000000e+00 1.05889687e+01 6.80000000e+00 0.00000000e+00 + 3.33333333e+00 6.80000000e+00 0.00000000e+00 3.33333333e+00 6.26666667e+00 0.00000000e+00 3.33333333e+00 5.73333333e+00 0.00000000e+00 3.33333333e+00 5.20000000e+00 0.00000000e+00 + 8.95863812e-01 -1.59824765e-01 0.00000000e+00 7.94780209e-01 -1.37836736e-01 0.00000000e+00 6.93696607e-01 -1.15848708e-01 0.00000000e+00 5.92613004e-01 -9.38606790e-02 0.00000000e+00 + 1.23615794e+01 0.00000000e+00 0.00000000e+00 1.23615794e+01 -1.33333333e-01 0.00000000e+00 1.23615794e+01 -2.66666667e-01 0.00000000e+00 1.23615794e+01 -4.00000000e-01 0.00000000e+00 + 4.63505130e-01 1.21740590e+00 0.00000000e+00 5.39711882e-01 1.21083029e+00 0.00000000e+00 6.15918634e-01 1.20425468e+00 0.00000000e+00 6.92125386e-01 1.19767907e+00 0.00000000e+00 + -6.80000000e+00 2.00000000e+00 0.00000000e+00 -6.80000000e+00 2.53333333e+00 0.00000000e+00 -6.80000000e+00 3.06666667e+00 0.00000000e+00 -6.80000000e+00 3.60000000e+00 0.00000000e+00 + 4.00000000e+00 -3.60000000e+00 0.00000000e+00 3.77777778e+00 -3.60000000e+00 0.00000000e+00 3.55555556e+00 -3.60000000e+00 0.00000000e+00 3.33333333e+00 -3.60000000e+00 0.00000000e+00 + 2.00000000e+00 6.80000000e+00 0.00000000e+00 2.22222222e+00 6.80000000e+00 0.00000000e+00 2.44444444e+00 6.80000000e+00 0.00000000e+00 2.66666667e+00 6.80000000e+00 0.00000000e+00 + 2.66666667e+00 -4.00000000e-01 0.00000000e+00 2.44444444e+00 -4.00000000e-01 0.00000000e+00 2.22222222e+00 -4.00000000e-01 0.00000000e+00 2.00000000e+00 -4.00000000e-01 0.00000000e+00 + 2.66666667e+00 6.80000000e+00 0.00000000e+00 2.88888889e+00 6.80000000e+00 0.00000000e+00 3.11111111e+00 6.80000000e+00 0.00000000e+00 3.33333333e+00 6.80000000e+00 0.00000000e+00 + 1.19767907e+00 -6.92125386e-01 0.00000000e+00 1.18870103e+00 -7.67108039e-01 0.00000000e+00 1.17972299e+00 -8.42090692e-01 0.00000000e+00 1.17074495e+00 -9.17073345e-01 0.00000000e+00 + -1.85410197e-01 5.70633910e-01 0.00000000e+00 -1.75109630e-01 5.38932026e-01 0.00000000e+00 -1.64809064e-01 5.07230142e-01 0.00000000e+00 -1.54508497e-01 4.75528258e-01 0.00000000e+00 + 2.66666667e+00 6.80000000e+00 0.00000000e+00 2.66666667e+00 6.26666667e+00 0.00000000e+00 2.66666667e+00 5.73333333e+00 0.00000000e+00 2.66666667e+00 5.20000000e+00 0.00000000e+00 + -4.00000000e-01 8.40000000e+00 0.00000000e+00 -4.00000000e-01 8.93333333e+00 0.00000000e+00 -4.00000000e-01 9.46666667e+00 0.00000000e+00 -4.00000000e-01 1.00000000e+01 0.00000000e+00 + -5.20000000e+00 1.00000000e+01 0.00000000e+00 -5.73333333e+00 1.00000000e+01 0.00000000e+00 -6.26666667e+00 1.00000000e+01 0.00000000e+00 -6.80000000e+00 1.00000000e+01 0.00000000e+00 + 4.00000000e+00 5.20000000e+00 0.00000000e+00 4.00000000e+00 4.66666667e+00 0.00000000e+00 4.00000000e+00 4.13333333e+00 0.00000000e+00 4.00000000e+00 3.60000000e+00 0.00000000e+00 + 1.60000000e+00 6.80000000e+00 0.00000000e+00 1.60000000e+00 6.26666667e+00 0.00000000e+00 1.60000000e+00 5.73333333e+00 0.00000000e+00 1.60000000e+00 5.20000000e+00 0.00000000e+00 + -1.54809211e+00 1.54809211e+00 0.00000000e+00 -1.41115032e+00 1.41115032e+00 0.00000000e+00 -1.27420854e+00 1.27420854e+00 0.00000000e+00 -1.13726675e+00 1.13726675e+00 0.00000000e+00 + -2.00000000e+00 4.00000000e-01 0.00000000e+00 -2.00000000e+00 5.33333333e-01 0.00000000e+00 -2.00000000e+00 6.66666667e-01 0.00000000e+00 -2.00000000e+00 8.00000000e-01 0.00000000e+00 + 3.33333333e+00 5.20000000e+00 0.00000000e+00 3.55555556e+00 5.20000000e+00 0.00000000e+00 3.77777778e+00 5.20000000e+00 0.00000000e+00 4.00000000e+00 5.20000000e+00 0.00000000e+00 + 1.80049110e+01 8.40000000e+00 0.00000000e+00 1.80049110e+01 7.86666667e+00 0.00000000e+00 1.80049110e+01 7.33333333e+00 0.00000000e+00 1.80049110e+01 6.80000000e+00 0.00000000e+00 + 1.60000000e+00 1.00000000e+01 0.00000000e+00 1.60000000e+00 9.46666667e+00 0.00000000e+00 1.60000000e+00 8.93333333e+00 0.00000000e+00 1.60000000e+00 8.40000000e+00 0.00000000e+00 + 3.33333333e+00 5.20000000e+00 0.00000000e+00 3.33333333e+00 4.66666667e+00 0.00000000e+00 3.33333333e+00 4.13333333e+00 0.00000000e+00 3.33333333e+00 3.60000000e+00 0.00000000e+00 + 4.00000000e+00 5.20000000e+00 0.00000000e+00 4.52498057e+00 5.20000000e+00 0.00000000e+00 5.04996114e+00 5.20000000e+00 0.00000000e+00 5.57494171e+00 5.20000000e+00 0.00000000e+00 + 1.59637318e+00 -3.12201802e-01 0.00000000e+00 1.47406202e+00 -2.85596288e-01 0.00000000e+00 1.35175086e+00 -2.58990773e-01 0.00000000e+00 1.22943970e+00 -2.32385259e-01 0.00000000e+00 + -4.93844170e-01 7.82172325e-02 0.00000000e+00 -4.97260948e-01 5.22642316e-02 0.00000000e+00 -4.99314767e-01 2.61679781e-02 0.00000000e+00 -5.00000000e-01 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 3.60000000e+00 0.00000000e+00 1.33333333e-01 3.60000000e+00 0.00000000e+00 2.66666667e-01 3.60000000e+00 0.00000000e+00 4.00000000e-01 3.60000000e+00 0.00000000e+00 + 2.00000000e+01 -8.00000000e-01 0.00000000e+00 2.00000000e+01 -9.33333333e-01 0.00000000e+00 2.00000000e+01 -1.06666667e+00 0.00000000e+00 2.00000000e+01 -1.20000000e+00 0.00000000e+00 + 2.66666667e+00 2.00000000e+00 0.00000000e+00 2.44444444e+00 2.00000000e+00 0.00000000e+00 2.22222222e+00 2.00000000e+00 0.00000000e+00 2.00000000e+00 2.00000000e+00 0.00000000e+00 + -4.72266246e-01 -8.50353987e-01 0.00000000e+00 -5.45552626e-01 -9.66129014e-01 0.00000000e+00 -6.18839006e-01 -1.08190404e+00 0.00000000e+00 -6.92125386e-01 -1.19767907e+00 0.00000000e+00 + 1.17074495e+00 9.17073345e-01 0.00000000e+00 1.17972299e+00 8.42090692e-01 0.00000000e+00 1.18870103e+00 7.67108039e-01 0.00000000e+00 1.19767907e+00 6.92125386e-01 0.00000000e+00 + 7.19713168e+00 5.20000000e+00 0.00000000e+00 7.75408356e+00 5.20000000e+00 0.00000000e+00 8.31103545e+00 5.20000000e+00 0.00000000e+00 8.86798734e+00 5.20000000e+00 0.00000000e+00 + 0.00000000e+00 1.23348416e+00 0.00000000e+00 7.74617529e-02 1.23213601e+00 0.00000000e+00 1.54923506e-01 1.23078785e+00 0.00000000e+00 2.32385259e-01 1.22943970e+00 0.00000000e+00 + 8.11760079e-01 -6.21434101e-01 0.00000000e+00 7.02976785e-01 -5.31846451e-01 0.00000000e+00 5.94193491e-01 -4.42258801e-01 0.00000000e+00 4.85410197e-01 -3.52671151e-01 0.00000000e+00 + 4.00000000e+00 3.60000000e+00 0.00000000e+00 4.00000000e+00 3.06666667e+00 0.00000000e+00 4.00000000e+00 2.53333333e+00 0.00000000e+00 4.00000000e+00 2.00000000e+00 0.00000000e+00 + -4.00000000e-01 1.00000000e+01 0.00000000e+00 -5.33333333e-01 1.00000000e+01 0.00000000e+00 -6.66666667e-01 1.00000000e+01 0.00000000e+00 -8.00000000e-01 1.00000000e+01 0.00000000e+00 + 1.80049110e+01 3.60000000e+00 0.00000000e+00 1.86699406e+01 3.60000000e+00 0.00000000e+00 1.93349703e+01 3.60000000e+00 0.00000000e+00 2.00000000e+01 3.60000000e+00 0.00000000e+00 + 6.21434101e-01 8.11760079e-01 0.00000000e+00 5.31846451e-01 7.02976785e-01 0.00000000e+00 4.42258801e-01 5.94193491e-01 0.00000000e+00 3.52671151e-01 4.85410197e-01 0.00000000e+00 + 2.66666667e+00 -5.20000000e+00 0.00000000e+00 2.44444444e+00 -5.20000000e+00 0.00000000e+00 2.22222222e+00 -5.20000000e+00 0.00000000e+00 2.00000000e+00 -5.20000000e+00 0.00000000e+00 + -1.20000000e+00 8.40000000e+00 0.00000000e+00 -1.06666667e+00 8.40000000e+00 0.00000000e+00 -9.33333333e-01 8.40000000e+00 0.00000000e+00 -8.00000000e-01 8.40000000e+00 0.00000000e+00 + 2.00000000e+01 -4.00000000e-01 0.00000000e+00 1.93349703e+01 -4.00000000e-01 0.00000000e+00 1.86699406e+01 -4.00000000e-01 0.00000000e+00 1.80049110e+01 -4.00000000e-01 0.00000000e+00 + -1.00000000e+01 -8.00000000e-01 0.00000000e+00 -1.00000000e+01 -9.33333333e-01 0.00000000e+00 -1.00000000e+01 -1.06666667e+00 0.00000000e+00 -1.00000000e+01 -1.20000000e+00 0.00000000e+00 + -3.60000000e+00 4.00000000e-01 0.00000000e+00 -3.60000000e+00 5.33333333e-01 0.00000000e+00 -3.60000000e+00 6.66666667e-01 0.00000000e+00 -3.60000000e+00 8.00000000e-01 0.00000000e+00 + 1.60000000e+00 3.60000000e+00 0.00000000e+00 1.60000000e+00 3.06666667e+00 0.00000000e+00 1.60000000e+00 2.53333333e+00 0.00000000e+00 1.60000000e+00 2.00000000e+00 0.00000000e+00 + 5.57494171e+00 4.00000000e-01 0.00000000e+00 5.57494171e+00 2.66666667e-01 0.00000000e+00 5.57494171e+00 1.33333333e-01 0.00000000e+00 5.57494171e+00 0.00000000e+00 0.00000000e+00 + -5.20000000e+00 8.40000000e+00 0.00000000e+00 -4.66666667e+00 8.40000000e+00 0.00000000e+00 -4.13333333e+00 8.40000000e+00 0.00000000e+00 -3.60000000e+00 8.40000000e+00 0.00000000e+00 + 7.19713168e+00 3.60000000e+00 0.00000000e+00 7.75408356e+00 3.60000000e+00 0.00000000e+00 8.31103545e+00 3.60000000e+00 0.00000000e+00 8.86798734e+00 3.60000000e+00 0.00000000e+00 + 6.21434101e-01 -8.11760079e-01 0.00000000e+00 5.71711483e-01 -8.24624715e-01 0.00000000e+00 5.21988864e-01 -8.37489351e-01 0.00000000e+00 4.72266246e-01 -8.50353987e-01 0.00000000e+00 + 8.95863812e-01 1.59824765e-01 0.00000000e+00 8.97795583e-01 1.06549843e-01 0.00000000e+00 8.99727354e-01 5.32749215e-02 0.00000000e+00 9.01659125e-01 0.00000000e+00 0.00000000e+00 + 4.00000000e+00 -3.60000000e+00 0.00000000e+00 4.00000000e+00 -3.06666667e+00 0.00000000e+00 4.00000000e+00 -2.53333333e+00 0.00000000e+00 4.00000000e+00 -2.00000000e+00 0.00000000e+00 + 4.00000000e-01 8.40000000e+00 0.00000000e+00 5.33333333e-01 8.40000000e+00 0.00000000e+00 6.66666667e-01 8.40000000e+00 0.00000000e+00 8.00000000e-01 8.40000000e+00 0.00000000e+00 + -8.40000000e+00 2.00000000e+00 0.00000000e+00 -8.40000000e+00 2.53333333e+00 0.00000000e+00 -8.40000000e+00 3.06666667e+00 0.00000000e+00 -8.40000000e+00 3.60000000e+00 0.00000000e+00 + 3.33333333e+00 -2.00000000e+00 0.00000000e+00 3.33333333e+00 -2.53333333e+00 0.00000000e+00 3.33333333e+00 -3.06666667e+00 0.00000000e+00 3.33333333e+00 -3.60000000e+00 0.00000000e+00 + 4.00000000e+00 2.00000000e+00 0.00000000e+00 4.00000000e+00 1.86666667e+00 0.00000000e+00 4.00000000e+00 1.73333333e+00 0.00000000e+00 4.00000000e+00 1.60000000e+00 0.00000000e+00 + 8.86798734e+00 3.60000000e+00 0.00000000e+00 9.44164778e+00 3.60000000e+00 0.00000000e+00 1.00153082e+01 3.60000000e+00 0.00000000e+00 1.05889687e+01 3.60000000e+00 0.00000000e+00 + 2.66666667e+00 3.60000000e+00 0.00000000e+00 2.66666667e+00 3.06666667e+00 0.00000000e+00 2.66666667e+00 2.53333333e+00 0.00000000e+00 2.66666667e+00 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 4.00000000e-01 0.00000000e+00 3.33333333e+00 2.66666667e-01 0.00000000e+00 3.33333333e+00 1.33333333e-01 0.00000000e+00 3.33333333e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 -6.00000000e-01 0.00000000e+00 -3.14015737e-02 -5.99177721e-01 0.00000000e+00 -6.27170780e-02 -5.96713137e-01 0.00000000e+00 -9.38606790e-02 -5.92613004e-01 0.00000000e+00 + 1.23615794e+01 0.00000000e+00 0.00000000e+00 1.17707092e+01 0.00000000e+00 0.00000000e+00 1.11798389e+01 0.00000000e+00 0.00000000e+00 1.05889687e+01 0.00000000e+00 0.00000000e+00 + -8.40000000e+00 6.80000000e+00 0.00000000e+00 -7.86666667e+00 6.80000000e+00 0.00000000e+00 -7.33333333e+00 6.80000000e+00 0.00000000e+00 -6.80000000e+00 6.80000000e+00 0.00000000e+00 + -1.59637318e+00 3.12201802e-01 0.00000000e+00 -1.59427204e+00 4.16048129e-01 0.00000000e+00 -1.59217090e+00 5.19894456e-01 0.00000000e+00 -1.59006976e+00 6.23740783e-01 0.00000000e+00 + 1.60000000e+00 1.00000000e+01 0.00000000e+00 1.46666667e+00 1.00000000e+01 0.00000000e+00 1.33333333e+00 1.00000000e+01 0.00000000e+00 1.20000000e+00 1.00000000e+01 0.00000000e+00 + 2.66666667e+00 4.00000000e-01 0.00000000e+00 2.66666667e+00 2.66666667e-01 0.00000000e+00 2.66666667e+00 1.33333333e-01 0.00000000e+00 2.66666667e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 6.80000000e+00 0.00000000e+00 1.33333333e-01 6.80000000e+00 0.00000000e+00 2.66666667e-01 6.80000000e+00 0.00000000e+00 4.00000000e-01 6.80000000e+00 0.00000000e+00 + -8.50353987e-01 -4.72266246e-01 0.00000000e+00 -8.59776181e-01 -4.20789616e-01 0.00000000e+00 -8.69198376e-01 -3.69312986e-01 0.00000000e+00 -8.78620570e-01 -3.17836356e-01 0.00000000e+00 + -9.17073345e-01 -1.17074495e+00 0.00000000e+00 -9.90471148e-01 -1.15958555e+00 0.00000000e+00 -1.06386895e+00 -1.14842615e+00 0.00000000e+00 -1.13726675e+00 -1.13726675e+00 0.00000000e+00 + 4.00000000e-01 2.00000000e+00 0.00000000e+00 3.70733934e-01 1.86545773e+00 0.00000000e+00 3.41467868e-01 1.73091545e+00 0.00000000e+00 3.12201802e-01 1.59637318e+00 0.00000000e+00 + 0.00000000e+00 8.40000000e+00 0.00000000e+00 1.33333333e-01 8.40000000e+00 0.00000000e+00 2.66666667e-01 8.40000000e+00 0.00000000e+00 4.00000000e-01 8.40000000e+00 0.00000000e+00 + 1.80049110e+01 6.80000000e+00 0.00000000e+00 1.80049110e+01 6.26666667e+00 0.00000000e+00 1.80049110e+01 5.73333333e+00 0.00000000e+00 1.80049110e+01 5.20000000e+00 0.00000000e+00 + 4.00000000e-01 1.00000000e+01 0.00000000e+00 2.66666667e-01 1.00000000e+01 0.00000000e+00 1.33333333e-01 1.00000000e+01 0.00000000e+00 0.00000000e+00 1.00000000e+01 0.00000000e+00 + 1.20000000e+00 5.20000000e+00 0.00000000e+00 1.20000000e+00 4.66666667e+00 0.00000000e+00 1.20000000e+00 4.13333333e+00 0.00000000e+00 1.20000000e+00 3.60000000e+00 0.00000000e+00 + 4.00000000e-01 2.00000000e+00 0.00000000e+00 5.33333333e-01 2.00000000e+00 0.00000000e+00 6.66666667e-01 2.00000000e+00 0.00000000e+00 8.00000000e-01 2.00000000e+00 0.00000000e+00 + 1.56562831e+00 1.24227651e+00 0.00000000e+00 1.57033109e+00 1.13950782e+00 0.00000000e+00 1.57503387e+00 1.03673913e+00 0.00000000e+00 1.57973665e+00 9.33970440e-01 0.00000000e+00 + -3.60000000e+00 6.80000000e+00 0.00000000e+00 -3.60000000e+00 7.33333333e+00 0.00000000e+00 -3.60000000e+00 7.86666667e+00 0.00000000e+00 -3.60000000e+00 8.40000000e+00 0.00000000e+00 + 4.00000000e+00 8.00000000e-01 0.00000000e+00 4.52498057e+00 8.00000000e-01 0.00000000e+00 5.04996114e+00 8.00000000e-01 0.00000000e+00 5.57494171e+00 8.00000000e-01 0.00000000e+00 + 1.60679313e+01 3.60000000e+00 0.00000000e+00 1.67135912e+01 3.60000000e+00 0.00000000e+00 1.73592511e+01 3.60000000e+00 0.00000000e+00 1.80049110e+01 3.60000000e+00 0.00000000e+00 + 4.00000000e-01 3.60000000e+00 0.00000000e+00 4.00000000e-01 3.06666667e+00 0.00000000e+00 4.00000000e-01 2.53333333e+00 0.00000000e+00 4.00000000e-01 2.00000000e+00 0.00000000e+00 + -4.93844170e-01 -7.82172325e-02 0.00000000e+00 -4.97260948e-01 -5.22642316e-02 0.00000000e+00 -4.99314767e-01 -2.61679781e-02 0.00000000e+00 -5.00000000e-01 0.00000000e+00 0.00000000e+00 + 2.66666667e+00 2.00000000e+00 0.00000000e+00 2.66666667e+00 1.86666667e+00 0.00000000e+00 2.66666667e+00 1.73333333e+00 0.00000000e+00 2.66666667e+00 1.60000000e+00 0.00000000e+00 + 4.00000000e-01 6.80000000e+00 0.00000000e+00 5.33333333e-01 6.80000000e+00 0.00000000e+00 6.66666667e-01 6.80000000e+00 0.00000000e+00 8.00000000e-01 6.80000000e+00 0.00000000e+00 + -5.20000000e+00 -2.00000000e+00 0.00000000e+00 -5.20000000e+00 -2.53333333e+00 0.00000000e+00 -5.20000000e+00 -3.06666667e+00 0.00000000e+00 -5.20000000e+00 -3.60000000e+00 0.00000000e+00 + 8.00000000e-01 3.60000000e+00 0.00000000e+00 9.33333333e-01 3.60000000e+00 0.00000000e+00 1.06666667e+00 3.60000000e+00 0.00000000e+00 1.20000000e+00 3.60000000e+00 0.00000000e+00 + 8.86798734e+00 -1.00000000e+01 0.00000000e+00 8.31103545e+00 -1.00000000e+01 0.00000000e+00 7.75408356e+00 -1.00000000e+01 0.00000000e+00 7.19713167e+00 -1.00000000e+01 0.00000000e+00 + -2.00000000e+00 4.00000000e-01 0.00000000e+00 -1.86545773e+00 3.70733934e-01 0.00000000e+00 -1.73091545e+00 3.41467868e-01 0.00000000e+00 -1.59637318e+00 3.12201802e-01 0.00000000e+00 + 1.41873685e+01 8.40000000e+00 0.00000000e+00 1.41873685e+01 7.86666667e+00 0.00000000e+00 1.41873685e+01 7.33333333e+00 0.00000000e+00 1.41873685e+01 6.80000000e+00 0.00000000e+00 + 2.66666667e+00 -8.40000000e+00 0.00000000e+00 2.44444444e+00 -8.40000000e+00 0.00000000e+00 2.22222222e+00 -8.40000000e+00 0.00000000e+00 2.00000000e+00 -8.40000000e+00 0.00000000e+00 + -4.00000000e-01 6.80000000e+00 0.00000000e+00 -4.00000000e-01 7.33333333e+00 0.00000000e+00 -4.00000000e-01 7.86666667e+00 0.00000000e+00 -4.00000000e-01 8.40000000e+00 0.00000000e+00 + -1.00000000e+01 2.00000000e+00 0.00000000e+00 -9.46666667e+00 2.00000000e+00 0.00000000e+00 -8.93333333e+00 2.00000000e+00 0.00000000e+00 -8.40000000e+00 2.00000000e+00 0.00000000e+00 + 1.23615794e+01 5.20000000e+00 0.00000000e+00 1.23615794e+01 4.66666667e+00 0.00000000e+00 1.23615794e+01 4.13333333e+00 0.00000000e+00 1.23615794e+01 3.60000000e+00 0.00000000e+00 + -1.60000000e+00 5.20000000e+00 0.00000000e+00 -1.60000000e+00 5.73333333e+00 0.00000000e+00 -1.60000000e+00 6.26666667e+00 0.00000000e+00 -1.60000000e+00 6.80000000e+00 0.00000000e+00 + 4.00000000e-01 -6.80000000e+00 0.00000000e+00 2.66666667e-01 -6.80000000e+00 0.00000000e+00 1.33333333e-01 -6.80000000e+00 0.00000000e+00 0.00000000e+00 -6.80000000e+00 0.00000000e+00 + 8.86798734e+00 2.00000000e+00 0.00000000e+00 8.31103545e+00 2.00000000e+00 0.00000000e+00 7.75408356e+00 2.00000000e+00 0.00000000e+00 7.19713168e+00 2.00000000e+00 0.00000000e+00 + 8.86798734e+00 3.60000000e+00 0.00000000e+00 8.86798734e+00 3.06666667e+00 0.00000000e+00 8.86798734e+00 2.53333333e+00 0.00000000e+00 8.86798734e+00 2.00000000e+00 0.00000000e+00 + 8.00000000e-01 8.40000000e+00 0.00000000e+00 8.00000000e-01 7.86666667e+00 0.00000000e+00 8.00000000e-01 7.33333333e+00 0.00000000e+00 8.00000000e-01 6.80000000e+00 0.00000000e+00 + 8.00000000e-01 2.00000000e+00 0.00000000e+00 9.33333333e-01 2.00000000e+00 0.00000000e+00 1.06666667e+00 2.00000000e+00 0.00000000e+00 1.20000000e+00 2.00000000e+00 0.00000000e+00 + 5.57494171e+00 -8.40000000e+00 0.00000000e+00 6.11567170e+00 -8.40000000e+00 0.00000000e+00 6.65640169e+00 -8.40000000e+00 0.00000000e+00 7.19713167e+00 -8.40000000e+00 0.00000000e+00 + 8.00000000e-01 8.40000000e+00 0.00000000e+00 9.33333333e-01 8.40000000e+00 0.00000000e+00 1.06666667e+00 8.40000000e+00 0.00000000e+00 1.20000000e+00 8.40000000e+00 0.00000000e+00 + -1.00000000e+01 1.00000000e+01 0.00000000e+00 -1.00000000e+01 9.46666667e+00 0.00000000e+00 -1.00000000e+01 8.93333333e+00 0.00000000e+00 -1.00000000e+01 8.40000000e+00 0.00000000e+00 + 7.19713168e+00 3.60000000e+00 0.00000000e+00 7.19713168e+00 3.06666667e+00 0.00000000e+00 7.19713168e+00 2.53333333e+00 0.00000000e+00 7.19713168e+00 2.00000000e+00 0.00000000e+00 + 8.00000000e-01 1.00000000e+01 0.00000000e+00 8.00000000e-01 9.46666667e+00 0.00000000e+00 8.00000000e-01 8.93333333e+00 0.00000000e+00 8.00000000e-01 8.40000000e+00 0.00000000e+00 + 1.20000000e+00 1.00000000e+01 0.00000000e+00 1.06666667e+00 1.00000000e+01 0.00000000e+00 9.33333333e-01 1.00000000e+01 0.00000000e+00 8.00000000e-01 1.00000000e+01 0.00000000e+00 + 2.00000000e+00 8.00000000e-01 0.00000000e+00 2.22222222e+00 8.00000000e-01 0.00000000e+00 2.44444444e+00 8.00000000e-01 0.00000000e+00 2.66666667e+00 8.00000000e-01 0.00000000e+00 + -4.85410197e-01 -3.52671151e-01 0.00000000e+00 -5.94193491e-01 -4.42258801e-01 0.00000000e+00 -7.02976785e-01 -5.31846451e-01 0.00000000e+00 -8.11760079e-01 -6.21434101e-01 0.00000000e+00 + 3.33333333e+00 -8.00000000e-01 0.00000000e+00 3.33333333e+00 -9.33333333e-01 0.00000000e+00 3.33333333e+00 -1.06666667e+00 0.00000000e+00 3.33333333e+00 -1.20000000e+00 0.00000000e+00 + 6.21434101e-01 8.11760079e-01 0.00000000e+00 6.68885786e-01 7.95769772e-01 0.00000000e+00 7.16337471e-01 7.79779464e-01 0.00000000e+00 7.63789156e-01 7.63789156e-01 0.00000000e+00 + 2.00000000e+00 1.20000000e+00 0.00000000e+00 2.22222222e+00 1.20000000e+00 0.00000000e+00 2.44444444e+00 1.20000000e+00 0.00000000e+00 2.66666667e+00 1.20000000e+00 0.00000000e+00 + -1.20000000e+00 1.00000000e+01 0.00000000e+00 -1.33333333e+00 1.00000000e+01 0.00000000e+00 -1.46666667e+00 1.00000000e+01 0.00000000e+00 -1.60000000e+00 1.00000000e+01 0.00000000e+00 + -4.72266246e-01 8.50353987e-01 0.00000000e+00 -4.05642264e-01 7.45103963e-01 0.00000000e+00 -3.39018282e-01 6.39853939e-01 0.00000000e+00 -2.72394300e-01 5.34603915e-01 0.00000000e+00 + 1.41873685e+01 3.60000000e+00 0.00000000e+00 1.41873685e+01 3.06666667e+00 0.00000000e+00 1.41873685e+01 2.53333333e+00 0.00000000e+00 1.41873685e+01 2.00000000e+00 0.00000000e+00 + -3.60000000e+00 5.20000000e+00 0.00000000e+00 -3.06666667e+00 5.20000000e+00 0.00000000e+00 -2.53333333e+00 5.20000000e+00 0.00000000e+00 -2.00000000e+00 5.20000000e+00 0.00000000e+00 + 5.57494171e+00 -4.00000000e-01 0.00000000e+00 5.04996114e+00 -4.00000000e-01 0.00000000e+00 4.52498057e+00 -4.00000000e-01 0.00000000e+00 4.00000000e+00 -4.00000000e-01 0.00000000e+00 + 8.00000000e-01 3.60000000e+00 0.00000000e+00 8.00000000e-01 3.06666667e+00 0.00000000e+00 8.00000000e-01 2.53333333e+00 0.00000000e+00 8.00000000e-01 2.00000000e+00 0.00000000e+00 + -3.60000000e+00 0.00000000e+00 0.00000000e+00 -3.06666667e+00 0.00000000e+00 0.00000000e+00 -2.53333333e+00 0.00000000e+00 0.00000000e+00 -2.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.17074495e+00 -9.17073345e-01 0.00000000e+00 1.15958555e+00 -9.90471148e-01 0.00000000e+00 1.14842615e+00 -1.06386895e+00 0.00000000e+00 1.13726675e+00 -1.13726675e+00 0.00000000e+00 + 1.20000000e+00 8.40000000e+00 0.00000000e+00 1.33333333e+00 8.40000000e+00 0.00000000e+00 1.46666667e+00 8.40000000e+00 0.00000000e+00 1.60000000e+00 8.40000000e+00 0.00000000e+00 + 0.00000000e+00 6.00000000e-01 0.00000000e+00 0.00000000e+00 5.66666667e-01 0.00000000e+00 0.00000000e+00 5.33333333e-01 0.00000000e+00 0.00000000e+00 5.00000000e-01 0.00000000e+00 + 1.57973665e+00 9.33970440e-01 0.00000000e+00 1.58318102e+00 8.30560554e-01 0.00000000e+00 1.58662539e+00 7.27150668e-01 0.00000000e+00 1.59006976e+00 6.23740783e-01 0.00000000e+00 + 1.20000000e+00 1.00000000e+01 0.00000000e+00 1.20000000e+00 9.46666667e+00 0.00000000e+00 1.20000000e+00 8.93333333e+00 0.00000000e+00 1.20000000e+00 8.40000000e+00 0.00000000e+00 + -3.60000000e+00 -1.60000000e+00 0.00000000e+00 -3.60000000e+00 -1.73333333e+00 0.00000000e+00 -3.60000000e+00 -1.86666667e+00 0.00000000e+00 -3.60000000e+00 -2.00000000e+00 0.00000000e+00 + 2.00000000e+00 3.60000000e+00 0.00000000e+00 2.00000000e+00 4.13333333e+00 0.00000000e+00 2.00000000e+00 4.66666667e+00 0.00000000e+00 2.00000000e+00 5.20000000e+00 0.00000000e+00 + -5.70633910e-01 -1.85410197e-01 0.00000000e+00 -6.73296130e-01 -2.29552250e-01 0.00000000e+00 -7.75958350e-01 -2.73694303e-01 0.00000000e+00 -8.78620570e-01 -3.17836356e-01 0.00000000e+00 + -4.00000000e-01 8.40000000e+00 0.00000000e+00 -2.66666667e-01 8.40000000e+00 0.00000000e+00 -1.33333333e-01 8.40000000e+00 0.00000000e+00 0.00000000e+00 8.40000000e+00 0.00000000e+00 + 1.80049110e+01 2.00000000e+00 0.00000000e+00 1.73592511e+01 2.00000000e+00 0.00000000e+00 1.67135912e+01 2.00000000e+00 0.00000000e+00 1.60679313e+01 2.00000000e+00 0.00000000e+00 + 3.33333333e+00 1.00000000e+01 0.00000000e+00 3.33333333e+00 9.46666667e+00 0.00000000e+00 3.33333333e+00 8.93333333e+00 0.00000000e+00 3.33333333e+00 8.40000000e+00 0.00000000e+00 + -1.54809211e+00 1.54809211e+00 0.00000000e+00 -1.44615358e+00 1.55393751e+00 0.00000000e+00 -1.34421505e+00 1.55978291e+00 0.00000000e+00 -1.24227651e+00 1.56562831e+00 0.00000000e+00 + -8.00000000e-01 6.80000000e+00 0.00000000e+00 -6.66666667e-01 6.80000000e+00 0.00000000e+00 -5.33333333e-01 6.80000000e+00 0.00000000e+00 -4.00000000e-01 6.80000000e+00 0.00000000e+00 + 1.59824765e-01 -8.95863812e-01 0.00000000e+00 1.06549843e-01 -8.97795583e-01 0.00000000e+00 5.32749215e-02 -8.99727354e-01 0.00000000e+00 0.00000000e+00 -9.01659125e-01 0.00000000e+00 + -8.40000000e+00 1.20000000e+00 0.00000000e+00 -8.40000000e+00 1.33333333e+00 0.00000000e+00 -8.40000000e+00 1.46666667e+00 0.00000000e+00 -8.40000000e+00 1.60000000e+00 0.00000000e+00 + -6.80000000e+00 3.60000000e+00 0.00000000e+00 -6.26666667e+00 3.60000000e+00 0.00000000e+00 -5.73333333e+00 3.60000000e+00 0.00000000e+00 -5.20000000e+00 3.60000000e+00 0.00000000e+00 + -8.40000000e+00 8.40000000e+00 0.00000000e+00 -8.40000000e+00 8.93333333e+00 0.00000000e+00 -8.40000000e+00 9.46666667e+00 0.00000000e+00 -8.40000000e+00 1.00000000e+01 0.00000000e+00 + 1.60679313e+01 2.00000000e+00 0.00000000e+00 1.60679313e+01 1.86666667e+00 0.00000000e+00 1.60679313e+01 1.73333333e+00 0.00000000e+00 1.60679313e+01 1.60000000e+00 0.00000000e+00 + -1.60000000e+00 8.40000000e+00 0.00000000e+00 -1.60000000e+00 8.93333333e+00 0.00000000e+00 -1.60000000e+00 9.46666667e+00 0.00000000e+00 -1.60000000e+00 1.00000000e+01 0.00000000e+00 + -1.20000000e+00 -6.80000000e+00 0.00000000e+00 -1.20000000e+00 -7.33333333e+00 0.00000000e+00 -1.20000000e+00 -7.86666667e+00 0.00000000e+00 -1.20000000e+00 -8.40000000e+00 0.00000000e+00 + -1.22943970e+00 -2.32385259e-01 0.00000000e+00 -1.23078785e+00 -1.54923506e-01 0.00000000e+00 -1.23213601e+00 -7.74617529e-02 0.00000000e+00 -1.23348416e+00 0.00000000e+00 0.00000000e+00 + -5.34603915e-01 -2.72394300e-01 0.00000000e+00 -6.39853939e-01 -3.39018282e-01 0.00000000e+00 -7.45103963e-01 -4.05642264e-01 0.00000000e+00 -8.50353987e-01 -4.72266246e-01 0.00000000e+00 + -4.00000000e-01 2.00000000e+00 0.00000000e+00 -2.66666667e-01 2.00000000e+00 0.00000000e+00 -1.33333333e-01 2.00000000e+00 0.00000000e+00 0.00000000e+00 2.00000000e+00 0.00000000e+00 + -8.00000000e-01 2.00000000e+00 0.00000000e+00 -6.66666667e-01 2.00000000e+00 0.00000000e+00 -5.33333333e-01 2.00000000e+00 0.00000000e+00 -4.00000000e-01 2.00000000e+00 0.00000000e+00 + 4.00000000e+00 -6.80000000e+00 0.00000000e+00 4.00000000e+00 -6.26666667e+00 0.00000000e+00 4.00000000e+00 -5.73333333e+00 0.00000000e+00 4.00000000e+00 -5.20000000e+00 0.00000000e+00 + 1.41873685e+01 -4.00000000e-01 0.00000000e+00 1.41873685e+01 -5.33333333e-01 0.00000000e+00 1.41873685e+01 -6.66666667e-01 0.00000000e+00 1.41873685e+01 -8.00000000e-01 0.00000000e+00 + 1.23615794e+01 3.60000000e+00 0.00000000e+00 1.23615794e+01 3.06666667e+00 0.00000000e+00 1.23615794e+01 2.53333333e+00 0.00000000e+00 1.23615794e+01 2.00000000e+00 0.00000000e+00 + 5.57494171e+00 5.20000000e+00 0.00000000e+00 5.57494171e+00 4.66666667e+00 0.00000000e+00 5.57494171e+00 4.13333333e+00 0.00000000e+00 5.57494171e+00 3.60000000e+00 0.00000000e+00 + -1.60000000e+00 3.60000000e+00 0.00000000e+00 -1.46666667e+00 3.60000000e+00 0.00000000e+00 -1.33333333e+00 3.60000000e+00 0.00000000e+00 -1.20000000e+00 3.60000000e+00 0.00000000e+00 + -1.20000000e+00 3.60000000e+00 0.00000000e+00 -1.20000000e+00 4.13333333e+00 0.00000000e+00 -1.20000000e+00 4.66666667e+00 0.00000000e+00 -1.20000000e+00 5.20000000e+00 0.00000000e+00 + -3.60000000e+00 3.60000000e+00 0.00000000e+00 -3.60000000e+00 4.13333333e+00 0.00000000e+00 -3.60000000e+00 4.66666667e+00 0.00000000e+00 -3.60000000e+00 5.20000000e+00 0.00000000e+00 + 1.24227651e+00 1.56562831e+00 0.00000000e+00 1.13387546e+00 1.43400052e+00 0.00000000e+00 1.02547440e+00 1.30237274e+00 0.00000000e+00 9.17073345e-01 1.17074495e+00 0.00000000e+00 + 2.00000000e+00 1.00000000e+01 0.00000000e+00 1.86666667e+00 1.00000000e+01 0.00000000e+00 1.73333333e+00 1.00000000e+01 0.00000000e+00 1.60000000e+00 1.00000000e+01 0.00000000e+00 + -8.00000000e-01 2.00000000e+00 0.00000000e+00 -7.41246928e-01 1.86335659e+00 0.00000000e+00 -6.82493855e-01 1.72671317e+00 0.00000000e+00 -6.23740783e-01 1.59006976e+00 0.00000000e+00 + 1.22943970e+00 -2.32385259e-01 0.00000000e+00 1.11824774e+00 -2.08198427e-01 0.00000000e+00 1.00705577e+00 -1.84011596e-01 0.00000000e+00 8.95863812e-01 -1.59824765e-01 0.00000000e+00 + -1.57973665e+00 9.33970440e-01 0.00000000e+00 -1.45238412e+00 8.53355422e-01 0.00000000e+00 -1.32503160e+00 7.72740404e-01 0.00000000e+00 -1.19767907e+00 6.92125386e-01 0.00000000e+00 + -1.60000000e+00 2.00000000e+00 0.00000000e+00 -1.60000000e+00 2.53333333e+00 0.00000000e+00 -1.60000000e+00 3.06666667e+00 0.00000000e+00 -1.60000000e+00 3.60000000e+00 0.00000000e+00 + -4.45503262e-01 -2.26995250e-01 0.00000000e+00 -4.56772729e-01 -2.03368322e-01 0.00000000e+00 -4.66790213e-01 -1.79183975e-01 0.00000000e+00 -4.75528258e-01 -1.54508497e-01 0.00000000e+00 + -1.20000000e+00 6.80000000e+00 0.00000000e+00 -1.06666667e+00 6.80000000e+00 0.00000000e+00 -9.33333333e-01 6.80000000e+00 0.00000000e+00 -8.00000000e-01 6.80000000e+00 0.00000000e+00 + 1.20000000e+00 -6.80000000e+00 0.00000000e+00 1.20000000e+00 -7.33333333e+00 0.00000000e+00 1.20000000e+00 -7.86666667e+00 0.00000000e+00 1.20000000e+00 -8.40000000e+00 0.00000000e+00 + -8.40000000e+00 2.00000000e+00 0.00000000e+00 -7.86666667e+00 2.00000000e+00 0.00000000e+00 -7.33333333e+00 2.00000000e+00 0.00000000e+00 -6.80000000e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 5.20000000e+00 0.00000000e+00 2.00000000e+00 5.73333333e+00 0.00000000e+00 2.00000000e+00 6.26666667e+00 0.00000000e+00 2.00000000e+00 6.80000000e+00 0.00000000e+00 + 4.04508497e-01 -2.93892626e-01 0.00000000e+00 3.88572981e-01 -3.14660196e-01 0.00000000e+00 3.71572413e-01 -3.34565303e-01 0.00000000e+00 3.53553391e-01 -3.53553391e-01 0.00000000e+00 + 1.05889687e+01 -8.40000000e+00 0.00000000e+00 1.05889687e+01 -8.93333333e+00 0.00000000e+00 1.05889687e+01 -9.46666667e+00 0.00000000e+00 1.05889687e+01 -1.00000000e+01 0.00000000e+00 + 7.19713168e+00 8.00000000e-01 0.00000000e+00 7.75408356e+00 8.00000000e-01 0.00000000e+00 8.31103545e+00 8.00000000e-01 0.00000000e+00 8.86798734e+00 8.00000000e-01 0.00000000e+00 + -2.00000000e+00 8.40000000e+00 0.00000000e+00 -1.86666667e+00 8.40000000e+00 0.00000000e+00 -1.73333333e+00 8.40000000e+00 0.00000000e+00 -1.60000000e+00 8.40000000e+00 0.00000000e+00 + 1.24227651e+00 -1.56562831e+00 0.00000000e+00 1.13950782e+00 -1.57033109e+00 0.00000000e+00 1.03673913e+00 -1.57503387e+00 0.00000000e+00 9.33970440e-01 -1.57973665e+00 0.00000000e+00 + 1.05889687e+01 -1.00000000e+01 0.00000000e+00 1.00153082e+01 -1.00000000e+01 0.00000000e+00 9.44164778e+00 -1.00000000e+01 0.00000000e+00 8.86798734e+00 -1.00000000e+01 0.00000000e+00 + -5.20000000e+00 2.00000000e+00 0.00000000e+00 -4.66666667e+00 2.00000000e+00 0.00000000e+00 -4.13333333e+00 2.00000000e+00 0.00000000e+00 -3.60000000e+00 2.00000000e+00 0.00000000e+00 + -8.00000000e-01 3.60000000e+00 0.00000000e+00 -8.00000000e-01 4.13333333e+00 0.00000000e+00 -8.00000000e-01 4.66666667e+00 0.00000000e+00 -8.00000000e-01 5.20000000e+00 0.00000000e+00 + 1.60000000e+00 -1.00000000e+01 0.00000000e+00 1.46666667e+00 -1.00000000e+01 0.00000000e+00 1.33333333e+00 -1.00000000e+01 0.00000000e+00 1.20000000e+00 -1.00000000e+01 0.00000000e+00 + -5.20000000e+00 3.60000000e+00 0.00000000e+00 -5.20000000e+00 4.13333333e+00 0.00000000e+00 -5.20000000e+00 4.66666667e+00 0.00000000e+00 -5.20000000e+00 5.20000000e+00 0.00000000e+00 + -1.60000000e+00 2.00000000e+00 0.00000000e+00 -1.46666667e+00 2.00000000e+00 0.00000000e+00 -1.33333333e+00 2.00000000e+00 0.00000000e+00 -1.20000000e+00 2.00000000e+00 0.00000000e+00 + 2.00000000e+00 3.60000000e+00 0.00000000e+00 2.22222222e+00 3.60000000e+00 0.00000000e+00 2.44444444e+00 3.60000000e+00 0.00000000e+00 2.66666667e+00 3.60000000e+00 0.00000000e+00 + 1.23615794e+01 -8.00000000e-01 0.00000000e+00 1.23615794e+01 -9.33333333e-01 0.00000000e+00 1.23615794e+01 -1.06666667e+00 0.00000000e+00 1.23615794e+01 -1.20000000e+00 0.00000000e+00 + -3.60000000e+00 -8.00000000e-01 0.00000000e+00 -3.06666667e+00 -8.00000000e-01 0.00000000e+00 -2.53333333e+00 -8.00000000e-01 0.00000000e+00 -2.00000000e+00 -8.00000000e-01 0.00000000e+00 + 1.60000000e+00 5.20000000e+00 0.00000000e+00 1.60000000e+00 4.66666667e+00 0.00000000e+00 1.60000000e+00 4.13333333e+00 0.00000000e+00 1.60000000e+00 3.60000000e+00 0.00000000e+00 + -8.40000000e+00 5.20000000e+00 0.00000000e+00 -7.86666667e+00 5.20000000e+00 0.00000000e+00 -7.33333333e+00 5.20000000e+00 0.00000000e+00 -6.80000000e+00 5.20000000e+00 0.00000000e+00 + -3.60000000e+00 2.00000000e+00 0.00000000e+00 -3.60000000e+00 2.53333333e+00 0.00000000e+00 -3.60000000e+00 3.06666667e+00 0.00000000e+00 -3.60000000e+00 3.60000000e+00 0.00000000e+00 + -5.20000000e+00 -8.40000000e+00 0.00000000e+00 -4.66666667e+00 -8.40000000e+00 0.00000000e+00 -4.13333333e+00 -8.40000000e+00 0.00000000e+00 -3.60000000e+00 -8.40000000e+00 0.00000000e+00 + 2.00000000e+01 0.00000000e+00 0.00000000e+00 2.00000000e+01 -1.33333333e-01 0.00000000e+00 2.00000000e+01 -2.66666667e-01 0.00000000e+00 2.00000000e+01 -4.00000000e-01 0.00000000e+00 + 0.00000000e+00 5.20000000e+00 0.00000000e+00 0.00000000e+00 5.73333333e+00 0.00000000e+00 0.00000000e+00 6.26666667e+00 0.00000000e+00 0.00000000e+00 6.80000000e+00 0.00000000e+00 + -8.00000000e-01 3.60000000e+00 0.00000000e+00 -6.66666667e-01 3.60000000e+00 0.00000000e+00 -5.33333333e-01 3.60000000e+00 0.00000000e+00 -4.00000000e-01 3.60000000e+00 0.00000000e+00 + 6.00000000e-01 0.00000000e+00 0.00000000e+00 5.99177721e-01 -3.14015737e-02 0.00000000e+00 5.96713137e-01 -6.27170780e-02 0.00000000e+00 5.92613004e-01 -9.38606790e-02 0.00000000e+00 + -6.21434101e-01 -8.11760079e-01 0.00000000e+00 -7.19980516e-01 -9.31421703e-01 0.00000000e+00 -8.18526931e-01 -1.05108333e+00 0.00000000e+00 -9.17073345e-01 -1.17074495e+00 0.00000000e+00 + -1.85410197e-01 -5.70633910e-01 0.00000000e+00 -2.15020770e-01 -5.60148256e-01 0.00000000e+00 -2.44041986e-01 -5.48127275e-01 0.00000000e+00 -2.72394300e-01 -5.34603915e-01 0.00000000e+00 + -1.20000000e+00 -5.20000000e+00 0.00000000e+00 -1.20000000e+00 -5.73333333e+00 0.00000000e+00 -1.20000000e+00 -6.26666667e+00 0.00000000e+00 -1.20000000e+00 -6.80000000e+00 0.00000000e+00 + -2.00000000e+00 3.60000000e+00 0.00000000e+00 -1.86666667e+00 3.60000000e+00 0.00000000e+00 -1.73333333e+00 3.60000000e+00 0.00000000e+00 -1.60000000e+00 3.60000000e+00 0.00000000e+00 + 4.75528258e-01 1.54508497e-01 0.00000000e+00 4.82962913e-01 1.29409523e-01 0.00000000e+00 4.89073800e-01 1.03955845e-01 0.00000000e+00 4.93844170e-01 7.82172325e-02 0.00000000e+00 + -1.00000000e+01 3.60000000e+00 0.00000000e+00 -9.46666667e+00 3.60000000e+00 0.00000000e+00 -8.93333333e+00 3.60000000e+00 0.00000000e+00 -8.40000000e+00 3.60000000e+00 0.00000000e+00 + -8.00000000e-01 6.80000000e+00 0.00000000e+00 -8.00000000e-01 7.33333333e+00 0.00000000e+00 -8.00000000e-01 7.86666667e+00 0.00000000e+00 -8.00000000e-01 8.40000000e+00 0.00000000e+00 + -3.52671151e-01 4.85410197e-01 0.00000000e+00 -3.33078310e-01 4.58442963e-01 0.00000000e+00 -3.13485468e-01 4.31475730e-01 0.00000000e+00 -2.93892626e-01 4.04508497e-01 0.00000000e+00 + 1.41873685e+01 2.00000000e+00 0.00000000e+00 1.35787722e+01 2.00000000e+00 0.00000000e+00 1.29701758e+01 2.00000000e+00 0.00000000e+00 1.23615794e+01 2.00000000e+00 0.00000000e+00 + -5.20000000e+00 5.20000000e+00 0.00000000e+00 -4.66666667e+00 5.20000000e+00 0.00000000e+00 -4.13333333e+00 5.20000000e+00 0.00000000e+00 -3.60000000e+00 5.20000000e+00 0.00000000e+00 + -8.00000000e-01 5.20000000e+00 0.00000000e+00 -6.66666667e-01 5.20000000e+00 0.00000000e+00 -5.33333333e-01 5.20000000e+00 0.00000000e+00 -4.00000000e-01 5.20000000e+00 0.00000000e+00 + -1.00000000e+01 8.00000000e-01 0.00000000e+00 -9.46666667e+00 8.00000000e-01 0.00000000e+00 -8.93333333e+00 8.00000000e-01 0.00000000e+00 -8.40000000e+00 8.00000000e-01 0.00000000e+00 + 2.66666667e+00 5.20000000e+00 0.00000000e+00 2.66666667e+00 4.66666667e+00 0.00000000e+00 2.66666667e+00 4.13333333e+00 0.00000000e+00 2.66666667e+00 3.60000000e+00 0.00000000e+00 + -4.00000000e-01 5.20000000e+00 0.00000000e+00 -4.00000000e-01 5.73333333e+00 0.00000000e+00 -4.00000000e-01 6.26666667e+00 0.00000000e+00 -4.00000000e-01 6.80000000e+00 0.00000000e+00 + -6.80000000e+00 8.40000000e+00 0.00000000e+00 -6.80000000e+00 8.93333333e+00 0.00000000e+00 -6.80000000e+00 9.46666667e+00 0.00000000e+00 -6.80000000e+00 1.00000000e+01 0.00000000e+00 + 4.93844170e-01 -7.82172325e-02 0.00000000e+00 5.26767115e-01 -8.34317147e-02 0.00000000e+00 5.59690060e-01 -8.86461969e-02 0.00000000e+00 5.92613004e-01 -9.38606790e-02 0.00000000e+00 + -4.00000000e-01 6.80000000e+00 0.00000000e+00 -2.66666667e-01 6.80000000e+00 0.00000000e+00 -1.33333333e-01 6.80000000e+00 0.00000000e+00 0.00000000e+00 6.80000000e+00 0.00000000e+00 + -8.40000000e+00 8.40000000e+00 0.00000000e+00 -7.86666667e+00 8.40000000e+00 0.00000000e+00 -7.33333333e+00 8.40000000e+00 0.00000000e+00 -6.80000000e+00 8.40000000e+00 0.00000000e+00 + 4.85410197e-01 -3.52671151e-01 0.00000000e+00 4.66287577e-01 -3.77592235e-01 0.00000000e+00 4.45886895e-01 -4.01478364e-01 0.00000000e+00 4.24264069e-01 -4.24264069e-01 0.00000000e+00 + -5.20000000e+00 2.00000000e+00 0.00000000e+00 -5.20000000e+00 2.53333333e+00 0.00000000e+00 -5.20000000e+00 3.06666667e+00 0.00000000e+00 -5.20000000e+00 3.60000000e+00 0.00000000e+00 + -8.95863812e-01 -1.59824765e-01 0.00000000e+00 -1.00705577e+00 -1.84011596e-01 0.00000000e+00 -1.11824774e+00 -2.08198427e-01 0.00000000e+00 -1.22943970e+00 -2.32385259e-01 0.00000000e+00 + 1.80049110e+01 5.20000000e+00 0.00000000e+00 1.80049110e+01 4.66666667e+00 0.00000000e+00 1.80049110e+01 4.13333333e+00 0.00000000e+00 1.80049110e+01 3.60000000e+00 0.00000000e+00 + -1.59824765e-01 8.95863812e-01 0.00000000e+00 -1.06549843e-01 8.97795583e-01 0.00000000e+00 -5.32749215e-02 8.99727354e-01 0.00000000e+00 0.00000000e+00 9.01659125e-01 0.00000000e+00 + -3.60000000e+00 8.40000000e+00 0.00000000e+00 -3.06666667e+00 8.40000000e+00 0.00000000e+00 -2.53333333e+00 8.40000000e+00 0.00000000e+00 -2.00000000e+00 8.40000000e+00 0.00000000e+00 + 2.00000000e+01 -1.20000000e+00 0.00000000e+00 2.00000000e+01 -1.33333333e+00 0.00000000e+00 2.00000000e+01 -1.46666667e+00 0.00000000e+00 2.00000000e+01 -1.60000000e+00 0.00000000e+00 + -3.60000000e+00 1.00000000e+01 0.00000000e+00 -4.13333333e+00 1.00000000e+01 0.00000000e+00 -4.66666667e+00 1.00000000e+01 0.00000000e+00 -5.20000000e+00 1.00000000e+01 0.00000000e+00 + 2.00000000e+00 -1.20000000e+00 0.00000000e+00 1.85991222e+00 -1.11132348e+00 0.00000000e+00 1.71982444e+00 -1.02264696e+00 0.00000000e+00 1.57973665e+00 -9.33970440e-01 0.00000000e+00 + 9.33970440e-01 1.57973665e+00 0.00000000e+00 1.03673913e+00 1.57503387e+00 0.00000000e+00 1.13950782e+00 1.57033109e+00 0.00000000e+00 1.24227651e+00 1.56562831e+00 0.00000000e+00 + 2.66666667e+00 -8.40000000e+00 0.00000000e+00 2.66666667e+00 -8.93333333e+00 0.00000000e+00 2.66666667e+00 -9.46666667e+00 0.00000000e+00 2.66666667e+00 -1.00000000e+01 0.00000000e+00 + -1.60000000e+00 -2.00000000e+00 0.00000000e+00 -1.46666667e+00 -2.00000000e+00 0.00000000e+00 -1.33333333e+00 -2.00000000e+00 0.00000000e+00 -1.20000000e+00 -2.00000000e+00 0.00000000e+00 + 1.80049110e+01 -1.60000000e+00 0.00000000e+00 1.73592511e+01 -1.60000000e+00 0.00000000e+00 1.67135912e+01 -1.60000000e+00 0.00000000e+00 1.60679313e+01 -1.60000000e+00 0.00000000e+00 + -5.20000000e+00 -1.60000000e+00 0.00000000e+00 -5.20000000e+00 -1.73333333e+00 0.00000000e+00 -5.20000000e+00 -1.86666667e+00 0.00000000e+00 -5.20000000e+00 -2.00000000e+00 0.00000000e+00 + 1.20000000e+00 6.80000000e+00 0.00000000e+00 1.33333333e+00 6.80000000e+00 0.00000000e+00 1.46666667e+00 6.80000000e+00 0.00000000e+00 1.60000000e+00 6.80000000e+00 0.00000000e+00 + 9.33970440e-01 1.57973665e+00 0.00000000e+00 8.53355422e-01 1.45238412e+00 0.00000000e+00 7.72740404e-01 1.32503160e+00 0.00000000e+00 6.92125386e-01 1.19767907e+00 0.00000000e+00 + -2.00000000e+00 1.60000000e+00 0.00000000e+00 -2.00000000e+00 1.73333333e+00 0.00000000e+00 -2.00000000e+00 1.86666667e+00 0.00000000e+00 -2.00000000e+00 2.00000000e+00 0.00000000e+00 + -4.00000000e-01 -5.20000000e+00 0.00000000e+00 -5.33333333e-01 -5.20000000e+00 0.00000000e+00 -6.66666667e-01 -5.20000000e+00 0.00000000e+00 -8.00000000e-01 -5.20000000e+00 0.00000000e+00 + 3.33333333e+00 -5.20000000e+00 0.00000000e+00 3.11111111e+00 -5.20000000e+00 0.00000000e+00 2.88888889e+00 -5.20000000e+00 0.00000000e+00 2.66666667e+00 -5.20000000e+00 0.00000000e+00 + 7.19713168e+00 -8.00000000e-01 0.00000000e+00 6.65640169e+00 -8.00000000e-01 0.00000000e+00 6.11567170e+00 -8.00000000e-01 0.00000000e+00 5.57494171e+00 -8.00000000e-01 0.00000000e+00 + 2.00000000e+01 3.60000000e+00 0.00000000e+00 2.00000000e+01 3.06666667e+00 0.00000000e+00 2.00000000e+01 2.53333333e+00 0.00000000e+00 2.00000000e+01 2.00000000e+00 0.00000000e+00 + -4.04508497e-01 -2.93892626e-01 0.00000000e+00 -4.19335284e-01 -2.72319518e-01 0.00000000e+00 -4.33012702e-01 -2.50000000e-01 0.00000000e+00 -4.45503262e-01 -2.26995250e-01 0.00000000e+00 + -1.17074495e+00 9.17073345e-01 0.00000000e+00 -1.05108333e+00 8.18526931e-01 0.00000000e+00 -9.31421703e-01 7.19980516e-01 0.00000000e+00 -8.11760079e-01 6.21434101e-01 0.00000000e+00 + 8.86798734e+00 -1.20000000e+00 0.00000000e+00 8.86798734e+00 -1.33333333e+00 0.00000000e+00 8.86798734e+00 -1.46666667e+00 0.00000000e+00 8.86798734e+00 -1.60000000e+00 0.00000000e+00 + 1.59824765e-01 -8.95863812e-01 0.00000000e+00 1.37836736e-01 -7.94780209e-01 0.00000000e+00 1.15848708e-01 -6.93696607e-01 0.00000000e+00 9.38606790e-02 -5.92613004e-01 0.00000000e+00 + -4.00000000e-01 -5.20000000e+00 0.00000000e+00 -4.00000000e-01 -5.73333333e+00 0.00000000e+00 -4.00000000e-01 -6.26666667e+00 0.00000000e+00 -4.00000000e-01 -6.80000000e+00 0.00000000e+00 + 1.80049110e+01 -4.00000000e-01 0.00000000e+00 1.73592511e+01 -4.00000000e-01 0.00000000e+00 1.67135912e+01 -4.00000000e-01 0.00000000e+00 1.60679313e+01 -4.00000000e-01 0.00000000e+00 + -8.40000000e+00 3.60000000e+00 0.00000000e+00 -7.86666667e+00 3.60000000e+00 0.00000000e+00 -7.33333333e+00 3.60000000e+00 0.00000000e+00 -6.80000000e+00 3.60000000e+00 0.00000000e+00 + -8.40000000e+00 5.20000000e+00 0.00000000e+00 -8.40000000e+00 5.73333333e+00 0.00000000e+00 -8.40000000e+00 6.26666667e+00 0.00000000e+00 -8.40000000e+00 6.80000000e+00 0.00000000e+00 + 3.52671151e-01 4.85410197e-01 0.00000000e+00 3.77592235e-01 4.66287577e-01 0.00000000e+00 4.01478364e-01 4.45886895e-01 0.00000000e+00 4.24264069e-01 4.24264069e-01 0.00000000e+00 + -1.00000000e+01 8.40000000e+00 0.00000000e+00 -1.00000000e+01 7.86666667e+00 0.00000000e+00 -1.00000000e+01 7.33333333e+00 0.00000000e+00 -1.00000000e+01 6.80000000e+00 0.00000000e+00 + -3.60000000e+00 6.80000000e+00 0.00000000e+00 -3.06666667e+00 6.80000000e+00 0.00000000e+00 -2.53333333e+00 6.80000000e+00 0.00000000e+00 -2.00000000e+00 6.80000000e+00 0.00000000e+00 + 3.53553391e-01 3.53553391e-01 0.00000000e+00 3.71572413e-01 3.34565303e-01 0.00000000e+00 3.88572981e-01 3.14660196e-01 0.00000000e+00 4.04508497e-01 2.93892626e-01 0.00000000e+00 + 5.57494171e+00 8.40000000e+00 0.00000000e+00 5.57494171e+00 7.86666667e+00 0.00000000e+00 5.57494171e+00 7.33333333e+00 0.00000000e+00 5.57494171e+00 6.80000000e+00 0.00000000e+00 + 1.57973665e+00 -9.33970440e-01 0.00000000e+00 1.57503387e+00 -1.03673913e+00 0.00000000e+00 1.57033109e+00 -1.13950782e+00 0.00000000e+00 1.56562831e+00 -1.24227651e+00 0.00000000e+00 + 1.80049110e+01 1.20000000e+00 0.00000000e+00 1.86699406e+01 1.20000000e+00 0.00000000e+00 1.93349703e+01 1.20000000e+00 0.00000000e+00 2.00000000e+01 1.20000000e+00 0.00000000e+00 + 2.32385259e-01 -1.22943970e+00 0.00000000e+00 1.54923506e-01 -1.23078785e+00 0.00000000e+00 7.74617529e-02 -1.23213601e+00 0.00000000e+00 0.00000000e+00 -1.23348416e+00 0.00000000e+00 + 3.33333333e+00 3.60000000e+00 0.00000000e+00 3.55555556e+00 3.60000000e+00 0.00000000e+00 3.77777778e+00 3.60000000e+00 0.00000000e+00 4.00000000e+00 3.60000000e+00 0.00000000e+00 + -6.80000000e+00 1.00000000e+01 0.00000000e+00 -7.33333333e+00 1.00000000e+01 0.00000000e+00 -7.86666667e+00 1.00000000e+01 0.00000000e+00 -8.40000000e+00 1.00000000e+01 0.00000000e+00 + 8.86798734e+00 5.20000000e+00 0.00000000e+00 8.86798734e+00 4.66666667e+00 0.00000000e+00 8.86798734e+00 4.13333333e+00 0.00000000e+00 8.86798734e+00 3.60000000e+00 0.00000000e+00 + + + E[1268,1271,1273,1275,1277,1279,1281,1283,1285,1287-1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346] + E[3,6,9,12,15,62,65,68,71,74,115,131,142,153,164,197,199,201,284,286,288,290,292,294,296,298,300,995,998,1001,1004,1007,1010,1013,1016,1019,1100,1111,1116,1130,1141,1151,1161,1166,1180,1191,1201,1211,1216,1226,1236,1246,1256,1266] + E[0,16,27,38,49,302,313,324,335,346,802,804,806,808,810,1257,1259,1261,1263,1265] + E[228,247,265,283,301,837,856,874,892,901,982,984,986,988,990,1018,1038,1057,1076,1086] + Q[0-639] + + C[0] + + + + + + + + +

TimeStep = 0.00001

+

NumSteps = 10

+

FinTime = 0

+

IO_CheckSteps = 500000

+

IO_InfoSteps = 500000

+

GasConstant = 287.058

+

Gamma = 1.4

+

pInf = 101325

+

rhoInf = 1.225

+

uInf