all_vertical_richards.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "all_vertical_richards.hpp"
  2. namespace Kernel{
  3. void
  4. AllVerticalRichards::init(const Geometry* geometry_){
  5. geometry=geometry_;
  6. indice_x_Richards=new bool[geometry->nX];
  7. richards_evolutive_time=new RichardsEvolutiveTime[geometry->nX];
  8. for(size_t ix=0;ix<geometry->nX;++ix){
  9. richards_evolutive_time[ix].init(ix,geometry);
  10. }
  11. }
  12. void
  13. AllVerticalRichards::init_indice_x_Richards(){
  14. for(size_t x=0;x<geometry->nX;++x){
  15. indice_x_Richards[x]=true;
  16. }
  17. }
  18. void
  19. AllVerticalRichards::run(){
  20. Debug::debug_Thomas=false;
  21. size_t i_left,i_middle,i_right;
  22. #ifdef MYDEBUG
  23. cout<<" [AllVerticalRichards::run] start"<<endl;
  24. #endif
  25. for(size_t ix=0;ix<geometry->nX;++ix){
  26. if(indice_x_Richards[ix]){
  27. RichardsEvolutiveTime& r=richards_evolutive_time[ix];
  28. r.dt=dt;
  29. r.init_P=init_P[ix];
  30. r.previous_P=previous_P[ix];
  31. r.P=P[ix];
  32. if(ix==0){
  33. i_left=0;
  34. i_middle=1;
  35. i_right=2;
  36. }
  37. else if(ix==geometry->nX-1){
  38. i_left=geometry->nX-3;
  39. i_middle=geometry->nX-2;
  40. i_right=geometry->nX-1;
  41. }
  42. else{
  43. i_left=ix-1;
  44. i_middle=ix;
  45. i_right=ix+1;
  46. }
  47. r.hydr_left=hydr[i_left];
  48. r.l_left=l[i_left];
  49. r.Pl_left=Pl[i_left];
  50. r.hydr_middle=hydr[i_middle];
  51. r.l_middle=l[i_middle];
  52. r.Pl_middle=Pl[i_middle];
  53. r.hydr_right=hydr[i_right];
  54. r.l_right=l[i_right];
  55. r.Pl_right=Pl[i_right];
  56. r.run();
  57. P[ix]=r.P;
  58. }
  59. }
  60. //[If Paraller wait for sync]
  61. has_converged=true;
  62. for(size_t ix=0;ix<geometry->nX;++ix){
  63. if(!richards_evolutive_time[ix].has_converged){
  64. has_converged=false;
  65. }
  66. }
  67. if(has_converged) compute_hsat();
  68. #ifdef MYDEBUG
  69. cout<<" [AllVerticalRichards::run] ";
  70. if(not has_converged) cout<<"not";
  71. cout<<"converge"<<endl<<" [AllVerticalRichards::run] end"<<endl;
  72. #endif
  73. }
  74. void
  75. AllVerticalRichards::compute_hsat(){
  76. for(size_t ix=0;ix<geometry->nX;++ix){
  77. double* Px=previous_P[ix];
  78. size_t iz=0;
  79. for(;iz<geometry->nZ[ix] and Px[iz]>Psat;++iz);
  80. if(iz>0 and Px[iz]<=Psat){
  81. hsat[ix]=(Psat-Px[iz-1])*geometry->dZ[ix]/(Px[iz]-Px[iz-1])+geometry->Z[ix][iz-1];
  82. }
  83. else{
  84. hsat[ix]=(iz==0)?geometry->hbot[ix]:geometry->hsoil[ix];
  85. }
  86. }
  87. }
  88. }