all_vertical_richards.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. size_t i_left,i_middle,i_right;
  21. if(Debug::level>0) cout<<" [AllVerticalRichards::run] start"<<endl;
  22. for(size_t ix=0;ix<geometry->nX;++ix){
  23. if(indice_x_Richards[ix]){
  24. RichardsEvolutiveTime& r=richards_evolutive_time[ix];
  25. r.dt=dt;
  26. r.init_P=init_P[ix];
  27. r.previous_P=previous_P[ix];
  28. r.P=P[ix];
  29. if(ix==0){
  30. i_left=0;
  31. i_middle=1;
  32. i_right=2;
  33. }
  34. else if(ix==geometry->nX-1){
  35. i_left=geometry->nX-3;
  36. i_middle=geometry->nX-2;
  37. i_right=geometry->nX-1;
  38. }
  39. else{
  40. i_left=ix-1;
  41. i_middle=ix;
  42. i_right=ix+1;
  43. }
  44. r.hydr_left=hydr[i_left];
  45. r.l_left=l[i_left];
  46. r.Pl_left=Pl[i_left];
  47. r.hydr_middle=hydr[i_middle];
  48. r.l_middle=l[i_middle];
  49. r.Pl_middle=Pl[i_middle];
  50. r.hydr_right=hydr[i_right];
  51. r.l_right=l[i_right];
  52. r.Pl_right=Pl[i_right];
  53. r.run();
  54. P[ix]=r.P;
  55. }
  56. }
  57. //[If Paraller wait for sync]
  58. has_converged=true;
  59. for(size_t ix=0;ix<geometry->nX;++ix){
  60. if(!richards_evolutive_time[ix].has_converged){
  61. has_converged=false;
  62. }
  63. }
  64. if(has_converged) compute_hsat();
  65. if(Debug::level>0){
  66. cout<<" [AllVerticalRichards::run] ";
  67. if(not has_converged) cout<<"not";
  68. cout<<"converge"<<endl<<" [AllVerticalRichards::run] end"<<endl;
  69. }
  70. }
  71. void
  72. AllVerticalRichards::compute_hsat(){
  73. for(size_t ix=0;ix<geometry->nX;++ix){
  74. double* Px=previous_P[ix];
  75. size_t iz=0;
  76. for(;iz<geometry->nZ[ix] and Px[iz]>Psat;++iz);
  77. if(iz>0 and Px[iz]<=Psat){
  78. hsat[ix]=(Psat-Px[iz-1])*geometry->dZ[ix]/(Px[iz]-Px[iz-1])+geometry->Z[ix][iz-1];
  79. }
  80. else{
  81. hsat[ix]=(iz==0)?geometry->hbot[ix]:geometry->hsoil[ix];
  82. }
  83. }
  84. }
  85. }