horizontal_problem.cpp 1.3 KB

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