all_vertical_richards.cpp 2.6 KB

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