From 303779e59cb3eca2d0303531053b13a424f26209 Mon Sep 17 00:00:00 2001 From: rifki sadikin Date: Thu, 8 Nov 2018 13:28:45 +0700 Subject: [PATCH] Final test --- PETUNJUKPENGGUNAAN.md | 81 ++++++++++- README.md | 4 +- example/PoissonSolver3DGPUTest.cpp | 152 +++++++++----------- example/PoissonSolver3DGPUTest.h | 2 +- interface/PoissonSolver3DCylindricalGPU.cxx | 4 +- interface/PoissonSolver3DCylindricalGPU.h | 5 +- 6 files changed, 156 insertions(+), 92 deletions(-) diff --git a/PETUNJUKPENGGUNAAN.md b/PETUNJUKPENGGUNAAN.md index a3b895b..a7cb557 100644 --- a/PETUNJUKPENGGUNAAN.md +++ b/PETUNJUKPENGGUNAAN.md @@ -192,7 +192,24 @@ add_executable(${TARGET_NAME} target_link_libraries(${TARGET_NAME} ${PSLIB} ${LIBCUDA_SO_PATH}) ``` -2. Buat folder terpisah untuk mebangun proyek yang menggunakan pustaka misal **buildexamplepoissonsolver** lalu jalankan **cmake** dengan flag spesial yaitu **-DCMAKE_PREFIX_PATH** yang ditetapkan dengan absolute path tempat direktori PoissonSolver3DCylindricalGPU dibangun. +2. Pada kode sumber include header file sehingga definisi fungsi dan kelas dapat dipanggil di badan kode. + + +```c++ +#include "PoissonSolver3DCylindricalGPU.h" + +... +// create poissonSolver +PoissonSolver3DCylindricalGPU *poissonSolver = new PoissonSolver3DCylindricalGPU(); +PoissonSolver3DCylindricalGPU::fgConvergenceError = 1e-8; +poissonSolver->SetExactSolution(VPotentialExact,kRows,kColumns, kPhiSlices); +poissonSolver->SetStrategy(PoissonSolver3DCylindricalGPU::kMultiGrid); +poissonSolver->SetCycleType(PoissonSolver3DCylindricalGPU::kFCycle); +poissonSolver->PoissonSolver3D(VPotential,RhoCharge,kRows,kColumns,kPhiSlices, kIterations,kSymmetry) ; +``` + + +3. Buat folder terpisah untuk mebangun proyek yang menggunakan pustaka misal **buildexamplepoissonsolver** lalu jalankan **cmake** dengan flag spesial yaitu **-DCMAKE_PREFIX_PATH** yang ditetapkan dengan absolute path tempat direktori PoissonSolver3DCylindricalGPU dibangun. ```console $ mkdir buildexamplepoissonsolver @@ -205,7 +222,7 @@ $ cmake ../PoissonSolver3D/example/ -DCMAKE_PREFIX_PATH=/home/usertest/trypoisso -- Generating done -- Build files have been written to: /home/usertest/trypoissonsolver/buildexamplepoissonsolver ``` -3. Jalankan **make** untuk membuat *executable file* +4. Jalankan **make** untuk membuat *executable file* ```console $ make @@ -217,3 +234,63 @@ $ make [ 50%] Linking CXX executable poissonsolvergputest [100%] Built target poissonsolvergputest ``` +5. Hasil dari **make** adalah program yang dapat dieksekusi yang berjalan di GPU card +6. +```console +$ ./poissonsolvergputest +Poisson Solver 3D Cylindrical GPU test +Ukuran grid (r,phi,z) = (17,17,18) +Waktu komputasi: 0.55 s +Jumlah iterasi siklus multigrid: 5 +Iterasi Error Convergen Error Absolut +[0]: 8.362587e-01 2.430797e-03 +[1]: 5.126660e-02 4.434380e-04 +[2]: 9.490424e-03 1.892288e-04 +[3]: 2.084086e-03 1.314385e-04 +[4]: 1.141812e-03 1.217592e-04 + +Poisson Solver 3D Cylindrical GPU test +Ukuran grid (r,phi,z) = (33,33,36) +Waktu komputasi: 1.000000e-02 s +Jumlah iterasi siklus multigrid: 10 +Iterasi Error Convergen Error Absolut +[0]: 1.724319e-03 1.315177e-04 +[1]: 8.652242e-05 1.266415e-04 +[2]: 5.450314e-05 1.256187e-04 +[3]: 5.081671e-05 1.249848e-04 +[4]: 4.951065e-05 1.244460e-04 +[5]: 4.904093e-05 1.241379e-04 +[6]: 4.890266e-05 1.239894e-04 +[7]: 4.885175e-05 1.239208e-04 +[8]: 4.883604e-05 1.238959e-04 +[9]: 4.883501e-05 1.238844e-04 + +Poisson Solver 3D Cylindrical GPU test +Ukuran grid (r,phi,z) = (65,65,72) +Waktu komputasi: 5.000000e-02 s +Jumlah iterasi siklus multigrid: 3 +Iterasi Error Convergen Error Absolut +[0]: 1.084726e-04 1.291784e-04 +[1]: 5.680057e-06 1.283386e-04 +[2]: 1.501479e-06 1.278558e-04 + +Poisson Solver 3D Cylindrical GPU test +Ukuran grid (r,phi,z) = (129,129,144) +Waktu komputasi: 1.200000e-01 s +Jumlah iterasi siklus multigrid: 3 +Iterasi Error Convergen Error Absolut +[0]: 1.373293e-05 1.302576e-04 +[1]: 2.154564e-06 1.299626e-04 +[2]: 1.048384e-06 1.297261e-04 + +Poisson Solver 3D Cylindrical GPU test +Ukuran grid (r,phi,z) = (257,257,288) +Waktu komputasi: 6.900000e-01 s +Jumlah iterasi siklus multigrid: 5 +Iterasi Error Convergen Error Absolut +[0]: 5.469890e-06 1.388922e-04 +[1]: 1.783695e-06 1.384964e-04 +[2]: 1.345343e-06 1.381199e-04 +[3]: 1.156555e-06 1.377524e-04 +[4]: 1.050234e-06 1.373983e-04 +``` diff --git a/README.md b/README.md index 34a8582..9898f56 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PoissonSolver3D +# PoissonSolver3DCylindricalGPU PoissonSolver3D adalah pustaka yang dikembangkan untuk menyelesaikan persamaan Poisson 3 dimensi dalam sistem koordinat silinder. Persamaan Poisson secara umum berbentuk $$\nabla^{2}(r,\phi,z) = \rho(r,\phi,z)$$ dengan diketahui nilai tepi pada potensial $$\mathbf{V}$$ dan distribusi buatan $$\rho$$. Untuk menyelesaikan persamaan tersebut digunakan metode multigrid yang diimplementasikan pada akselerator GPU. @@ -9,7 +9,7 @@ Pustaka ini dikembangkan oleh Kelompok Penelitian Komputasi Kinerja Tinggi, Pusa - Rifki Sadikin (rifki.sadikin@lipi.go.id), koordinator - I Wayan Aditya Swardiana (i.wayan.aditya.swardiana@lipi.go.id), anggota - Taufiq Wirahman (taufiq.wirahman@lipi.go.id), anggota - +- Arnida L. Latifah (arnida.lailatul.lattifah@lipigo.id), anggota ## Kontak Untuk pertanyaan, komentar atau diskusi dapat menghubungi tim pengembang di atas atau mengunjungi situs kami di: diff --git a/example/PoissonSolver3DGPUTest.cpp b/example/PoissonSolver3DGPUTest.cpp index ece4dcb..18cedee 100644 --- a/example/PoissonSolver3DGPUTest.cpp +++ b/example/PoissonSolver3DGPUTest.cpp @@ -1,10 +1,17 @@ #include #include + +#include +#include +#include + #include "PoissonSolver3DGPUTest.h" -#include "PoissonSolver3DGPU.h" /// /// DoPoissonSolverExperiments /// +/// dibuat oleh: Rifki Sadikin (rifki.sadikin@lipi.go.id) +/// tanggal: 7 November 2018 + void DoPoissonSolverExperiment(const int kRows, const int kColumns, const int kPhiSlices, const int kIterations, const int kSymmetry) { @@ -26,6 +33,7 @@ void DoPoissonSolverExperiment(const int kRows, const int kColumns, const int kP InitVoltandCharge3D(VPotentialExact,VPotential,RhoCharge,kRows,kColumns,kPhiSlices,gridSizeR,gridSizeZ,gridSizePhi); + /** const float ratioPhi = gridSizeR*gridSizeR / (gridSizePhi*gridSizePhi) ; // ratio_{phi} = gridsize_{r} / gridsize_{phi} const float ratioZ = gridSizeR*gridSizeR / (gridSizeZ*gridSizeZ) ; // ratio_{Z} = gridsize_{r} / gridsize_{z} const float convErr = fgConvergenceError; @@ -59,95 +67,65 @@ void DoPoissonSolverExperiment(const int kRows, const int kColumns, const int kP // VCycle PoissonMultigrid3DSemiCoarseningGPUError(VPotential, RhoCharge, kRows, kColumns ,kPhiSlices, 0 , fparam, iparam, true, errorConv,errorExact, VPotentialExact); // Call poisson solver - - - for (int k=0;kSetExactSolution(arrayofArrayVExact,kRows,kColumns, kPhiSlices); + poissonSolver->SetExactSolution(VPotentialExact,kRows,kColumns, kPhiSlices); // Case 1. Set the strategy as multigrid, fullmultigrid, and full 3d - poissonSolver->SetStrategy(kMultiGrid); - poissonSolver->SetCycleType(kFCycle); + poissonSolver->SetStrategy(PoissonSolver3DCylindricalGPU::kMultiGrid); + poissonSolver->SetCycleType(PoissonSolver3DCylindricalGPU::kFCycle); - TStopwatch w; - w.Start(); - poissonSolver->PoissonSolver3D(arrayofArrayVGrid,arrayofChargeGrid,kRows,kColumns,kPhiSlices, kIterations,kSymmetry) ; - w.Stop(); - - TMatrixD vError(kRows,kColumns); - arrayofArrayVGrid[0]->Print(); - - - ::Info("testAliTPCPoissonSolverMem3D_Consistency",Form("Time Poisson Multigrid F-Cycle 3D: = %f \n",w.CpuTime())); + // TStopwatch w; + std::clock_t start,stop; + double duration; + start = std::clock(); + + //w.Start(); + poissonSolver->PoissonSolver3D(VPotential,RhoCharge,kRows,kColumns,kPhiSlices, kIterations,kSymmetry) ; + //w.Stop(); + stop = std::clock(); + /** + for (int k=0;k<1;k++) { + for (int i=0;ifIterations << '\n'; + std::cout<<"Iterasi\tError Convergen\t\tError Absolut \n"; + std::cout<< std::scientific; + for (int i=0;ifIterations;i++) { + std::cout<<"[" << i << "]:\t" << poissonSolver->GetErrorConv(i) << "\t" << poissonSolver->GetErrorExact(i) << '\n' << std::scientific; + } delete poissonSolver; - - for ( int k = 0 ; k < kPhiSlices ; k++ ) { - delete arrayofArrayV[k]; - delete arrayofArrayVExact[k]; - delete arrayofCharge[k]; - delete arrayofArrayVGrid[k]; - delete arrayofChargeGrid[k]; - } - **/ delete VPotential; delete VPotentialExact; delete RhoCharge; - delete[] iparam; - delete[] fparam; } @@ -155,17 +133,15 @@ void DoPoissonSolverExperiment(const int kRows, const int kColumns, const int kP // set init void InitVoltandCharge3D(float * VPotentialExact,float *VPotential,float * RhoCharge,const int kRows, const int kColumns,const int kPhiSlices,float gridSizeR,float gridSizeZ,float gridSizePhi) { + //TFormula vTestFunction1("f1", "[0]*(x^4 - 338.0 *x^3 + 21250.75 * x^2)*cos([1]* y)^2*exp(-1* [2] * z^2)"); + //TFormula rhoTestFunction1("ff1", "[0]*(((16.0 * x^2 - 9.0 * 338.0 * x + 4.0*21250.75) *cos([1] * y)^2 * exp(-1 *[2]*z^2)) - ((x^2 - 338.0 * x + 21250.75) * 2 * [1]^2 * cos(2 * [1] * y) * exp(-1 *[2]*z^2)) + ((x^4 - 338.0 * x^3 + 21250.75 * x^2) * cos([1] * y)^2 * (4*[2]^2*z^2 - 2 * [2]) * exp(-1 *[2]*z^2)))"); double rlist[kRows], zedlist[kColumns] , philist[kPhiSlices]; float phi0,radius0,z0; double a,b,c; - a = fgkOFCRadius*fgkOFCRadius; - a*= (fgkOFCRadius - fgkIFCRadius); - a*= (fgkOFCRadius - fgkIFCRadius); - a = (100.0/a); - b = 0.5; - c = M_E / (fgkTPCZ0 * fgkTPCZ0 ); - +a = 1e-7; +b = 0.5; +c = 1e-4; int index; // list points on grid in cm for ( int k = 0 ; k < kPhiSlices ; k++ ) @@ -186,7 +162,7 @@ void InitVoltandCharge3D(float * VPotentialExact,float *VPotential,float * RhoCh z0 = zedlist[j]; VPotentialExact[index] = TestFunction1PotentialEval(a,b,c,radius0,phi0,z0); - RhoCharge[index] = TestFunction1ChargeEval(a,b,c,radius0,phi0,z0); + RhoCharge[index] = -1 * TestFunction1ChargeEval(a,b,c,radius0,phi0,z0); if (j == 0) VPotential[index] = VPotentialExact[index]; else if (j == kColumns-1) VPotential[index] = VPotentialExact[index]; @@ -203,9 +179,8 @@ void InitVoltandCharge3D(float * VPotentialExact,float *VPotential,float * RhoCh // float TestFunction1PotentialEval(double a, double b, double c, float radius0,float phi0,float z0) { - float ret = a * (pow(radius0,4) - 338.0 * pow(radius0,3) + 21250.75 * pow(radius0,2)); - ret *= cos(b*phi0); - ret *= exp ( -1 * c * z0*z0); + //TFormula vTestFunction1("f1", "[0]*(x^4 - 338.0 *x^3 + 21250.75 * x^2)*cos([1]* y)^2*exp(-1* [2] * z^2)"); + float ret = a * (pow(radius0,4) - 338.0 * pow(radius0,3) + 21250.75 * pow(radius0,2)) * pow(cos(b*phi0),2) * exp ( -1 * c * z0*z0); return ret; @@ -213,17 +188,26 @@ float TestFunction1PotentialEval(double a, double b, double c, float radius0,fl // float TestFunction1ChargeEval(double a, double b, double c, float radius0,float phi0,float z0) { + //TFormula rhoTestFunction1("ff1", "[0]*(((16.0 * x^2 - 9.0 * 338.0 * x + 4.0*21250.75) *cos([1] * y)^2 * exp(-1 *[2]*z^2)) - ((x^2 - 338.0 * x + 21250.75) * 2 * [1]^2 * cos(2 * [1] * y) * exp(-1 *[2]*z^2)) + ((x^4 - 338.0 * x^3 + 21250.75 * x^2) * cos([1] * y)^2 * (4*[2]^2*z^2 - 2 * [2]) * exp(-1 *[2]*z^2)))"); - float ret = a * (((16.0 * pow(radius0,2) - 9.0 * 338.0 * radius0 + 4.0*21250.75 ) * pow(cos (b * phi0),2.0) *exp(-1 * c * z0 * z0) ) - ((pow(radius0,2.0) - 338.0 * radius0 + 21250.75) *2 * b*b* cos(2 * b * phi0) * exp(-1 * c *z0 * z0) ) + ((pow(radius0,4.0) - 338.0 * pow(radius0,3.0) + 21250.75 * pow(radius0,2.0)) * pow(cos(b * phi0),2.0) * (4 *c*c *z0*z0 - 2 *c) * exp(-1 * c * z0 * z0))) ; + float ret = a * (((16.0 * pow(radius0,2) - 9.0 * 338.0 * radius0 + 4.0*21250.75 ) * pow(cos (b * phi0),2) *exp(-1 * c * z0 * z0) ) - ((pow(radius0,2) - 338.0 * radius0 + 21250.75) *2 * b*b* cos(2 * b * phi0) * exp(-1 * c *z0 * z0) ) + ((pow(radius0,4) - 338.0 * pow(radius0,3) + 21250.75 * pow(radius0,2)) * pow(cos(b * phi0),2) * (4.0 *c*c *z0*z0 - 2 *c) * exp(-1 * c * z0 * z0))) ; return ret; } - - +// testing int main() { DoPoissonSolverExperiment(17, 17, 18, 200, 0); + std::cout << "\n"; + DoPoissonSolverExperiment(33, 33, 36, 200, 0); + std::cout << "\n"; + DoPoissonSolverExperiment(65, 65, 72, 200, 0); + std::cout << "\n"; + DoPoissonSolverExperiment(129, 129, 144, 200, 0); + std::cout << "\n"; + DoPoissonSolverExperiment(257, 257, 288, 200, 0); + std::cout << "\n"; return 0; } diff --git a/example/PoissonSolver3DGPUTest.h b/example/PoissonSolver3DGPUTest.h index 2acd4ff..4b92067 100644 --- a/example/PoissonSolver3DGPUTest.h +++ b/example/PoissonSolver3DGPUTest.h @@ -2,7 +2,7 @@ #define POISSONSOLVERGPU3DGPUTEST_H #include -#include "PoissonSolver3DGPU.h" +#include "PoissonSolver3DCylindricalGPU.h" const double fgkTPCZ0 = 249.7; ///< nominal gating grid position const double fgkIFCRadius = 83.5; ///< radius which renders the "18 rod manifold" best -> compare calc. of Jim Thomas diff --git a/interface/PoissonSolver3DCylindricalGPU.cxx b/interface/PoissonSolver3DCylindricalGPU.cxx index d537b53..14f9b32 100644 --- a/interface/PoissonSolver3DCylindricalGPU.cxx +++ b/interface/PoissonSolver3DCylindricalGPU.cxx @@ -90,7 +90,7 @@ void PoissonSolver3DCylindricalGPU::PoissonMultiGrid3D2D(float *VPotential, floa if (fMgParameters.cycleType == kFCycle) { - if (fExactPresent == true) { + if (fExactPresent == true) { PoissonMultigrid3DSemiCoarseningGPUErrorFCycle(VPotential, RhoChargeDensities,nRRow, nZColumn,phiSlice,symmetry, fparam, iparam, fExactPresent, fErrorConvF, fErrorExactF, fExactSolutionF); } else { PoissonMultigrid3DSemiCoarseningGPUErrorFCycle(VPotential, RhoChargeDensities,nRRow, nZColumn,phiSlice,symmetry, fparam, iparam, fExactPresent, fErrorConvF, fErrorExactF, NULL); @@ -118,7 +118,7 @@ void PoissonSolver3DCylindricalGPU::SetExactSolution(float*exactSolution,int nRR fNRRow = nRRow; fNZColumn = nZColumn; fPhiSlice = phiSlice; - fExactSolutionF = new float[fNRRow * fPhiSlice,fNZColumn]; + fExactSolutionF = new float[fNRRow * fPhiSlice * fNZColumn]; fExactPresent = true; fMaxExact = 0.0;; for (int i=0;i