horizontal_problem.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. }
  12. void
  13. HorizontalProblem::run(){
  14. #ifdef MYDEBUG
  15. cout<<" [HorizontalProblem::run] start"<<endl;
  16. #endif
  17. /*for(size_t ix=0;ix<geometry->nX;++ix){
  18. hydr[ix]=previous_hydr[ix];
  19. }*/
  20. solve_system();
  21. error=error2(previous_hydr,hydr,geometry->nX);
  22. #ifdef MYDEBUG
  23. cout<<" [HorizontalProblem::run] end"<<endl;
  24. #endif
  25. }
  26. void
  27. HorizontalProblem::solve_system(){
  28. for(size_t ix=1;ix<geometry->nX-1;++ix){
  29. double dx=geometry->dX;
  30. double hbot=geometry->hbot[ix];
  31. double lx=l[ix];
  32. double a=-Physics::tilde_a(lx,hbot)*Physics::k0/(dx*dx);
  33. double c=Physics::tilde_c(lx,hbot)*Physics::k0/dx;
  34. double dhbot=geometry->dhbot[ix];
  35. sub_M[ix-1]=a-(dhbot*c)/2;
  36. diag_M[ix]=1-2*a;
  37. sup_M[ix]=a+(dhbot*c)/2;
  38. F[ix]=Pl[ix]/(Physics::rho*Physics::g)+lx;
  39. }
  40. diag_M[0]=1;
  41. sup_M[0]=-1;
  42. F[0]=0;
  43. diag_M[geometry->nX-1]=1;
  44. sub_M[geometry->nX-2]=-1;
  45. F[geometry->nX-1]=0;
  46. Thomas(geometry->nX,sub_M,diag_M,sup_M,F,hydr);
  47. }
  48. }