horizontal_problem.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "horizontal_problem.hpp"
  2. #include "debug.hpp"
  3. namespace Kernel{
  4. void
  5. HorizontalProblem::init(const Geometry* geometry_){
  6. geometry=geometry_;
  7. sub_M=new double[geometry->nX-1];
  8. diag_M=new double[geometry->nX];
  9. sup_M=new double[geometry->nX-1];
  10. F=new double[geometry->nX];
  11. hydr=new double[geometry->nX];
  12. }
  13. void
  14. HorizontalProblem::compute_error(){
  15. total_error=0;
  16. for(size_t ix=0;ix<geometry->nX;++ix){
  17. double e=abs(previous_hydr[ix]-hydr[ix])/n1_init_hydr;
  18. error_x[ix]=e;
  19. total_error+=e;
  20. }
  21. }
  22. void
  23. HorizontalProblem::run(){
  24. #ifdef MYDEBUG
  25. cout<<" [HorizontalProblem::run] start"<<endl;
  26. #endif
  27. /*for(size_t ix=0;ix<geometry->nX;++ix){
  28. hydr[ix]=previous_hydr[ix];
  29. }*/
  30. solve_system();
  31. compute_error();
  32. #ifdef MYDEBUG
  33. cout<<" [HorizontalProblem::run] end"<<endl;
  34. #endif
  35. }
  36. void
  37. HorizontalProblem::solve_system(){
  38. for(size_t ix=1;ix<geometry->nX-1;++ix){
  39. double dx=geometry->dX;
  40. double hbot=geometry->hbot[ix];
  41. double lx=l[ix];
  42. double a=-Physics::tilde_a(lx,hbot)*Physics::k0/(dx*dx);
  43. double c=Physics::tilde_c(lx,hbot)*Physics::k0/dx;
  44. double dhbot=geometry->dhbot[ix];
  45. sub_M[ix-1]=a-(dhbot*c)/2;
  46. diag_M[ix]=1-2*a;
  47. sup_M[ix]=a+(dhbot*c)/2;
  48. F[ix]=Pl[ix]/(Physics::rho*Physics::g)+lx;
  49. }
  50. diag_M[0]=1;
  51. sup_M[0]=-1;
  52. F[0]=0;
  53. diag_M[geometry->nX-1]=1;
  54. sub_M[geometry->nX-2]=-1;
  55. F[geometry->nX-1]=0;
  56. Thomas(geometry->nX,sub_M,diag_M,sup_M,F,hydr);
  57. }
  58. }