geometry.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "geometry.hpp"
  2. double inf = numeric_limits<double>::infinity();
  3. Geometry::Geometry(){
  4. lX=0;
  5. nX=0;
  6. dX=0;
  7. hsoil=nullptr;
  8. dhsoil=nullptr;
  9. hbot=nullptr;
  10. dhbot=nullptr;
  11. nZ=nullptr;
  12. dZ=nullptr;
  13. Z=nullptr;
  14. }
  15. // Obsolete, we must add hsat
  16. Geometry::Geometry(double _lX,size_t _nX,size_t _nZ,Func _hsoil,Func _dhsoil,Func _hbot,Func _dhbot){
  17. lX=_lX;
  18. nX=_nX;
  19. dX=lX/nX;
  20. hsoil=new double[nX];
  21. dhsoil=new double[nX];
  22. hbot=new double[nX];
  23. dhbot=new double[nX];
  24. double hs_max=-inf,hb_min=inf;
  25. double v;
  26. for(size_t k=0;k<nX;++k){
  27. double x=k*dX;
  28. v=hsoil[k]=_hsoil(x);
  29. hs_max=max(v,hs_max);
  30. dhsoil[k]=_dhsoil(x);
  31. v=hbot[k]=_hbot(x);
  32. hb_min=min(v,hb_min);
  33. dhbot[k]=_dhbot(x);
  34. }
  35. double dZ_avg=(hs_max-hb_min)/_nZ;
  36. initZ(dZ_avg);
  37. }
  38. /*Geometry::Geometry(double _lX,size_t _nX,double depth,size_t _nZ,Spline& Ssoil,Spline& Sbot){
  39. lX=_lX;
  40. nX=_nX;
  41. dX=lX/nX;
  42. hsoil=new double[nX];
  43. dhsoil=new double[nX];
  44. hbot=new double[nX];
  45. dhbot=new double[nX];
  46. double hs_max=-inf,hb_min=inf;
  47. double v;
  48. for(size_t k=0;k<nX;++k){
  49. double x=k*dX/lX;
  50. v=hsoil[k]=1-Ssoil(x);
  51. hs_max=max(v,hs_max);
  52. dhsoil[k]=-Ssoil.derivate(x);
  53. v=hbot[k]=1-Sbot(x);
  54. hb_min=min(v,hb_min);
  55. dhbot[k]=-Sbot.derivate(x);
  56. }
  57. double dZ_avg=(hs_max-hb_min)/_nZ;
  58. initZ(dZ_avg);
  59. }*/
  60. void
  61. Geometry::initZ(double dZ_avg){
  62. nZ=new size_t[nX];
  63. dZ=new double[nX];
  64. Z=new double*[nX];
  65. for(size_t k=0;k<nX;++k){
  66. double d=hsoil[k]-hbot[k];
  67. size_t n=d/dZ_avg;
  68. double dz=d/n;
  69. dZ[k]=dz;
  70. nZ[k]=n;
  71. Z[k]=new double[n];
  72. for(size_t j=0;j<n;++j){
  73. Z[k][j]=hbot[k]+j*dz;
  74. }
  75. }
  76. }
  77. void
  78. Geometry::initDefault(){
  79. lX=20;
  80. nX=100;
  81. dX=lX/(nX-1);
  82. hsoil=new double[nX];
  83. dhsoil=new double[nX];
  84. hbot=new double[nX];
  85. dhbot=new double[nX];
  86. for(size_t i=0;i<nX;++i){
  87. hsoil[i]=0.7;
  88. hbot[i]=0.3;
  89. dhsoil[i]=0;
  90. dhbot[i]=0;
  91. }
  92. depth=0.7-0.3;
  93. nZ_max=100;
  94. initZ(depth/nZ_max);
  95. }
  96. void
  97. Geometry::update(double _lX,size_t _nX,double _depth,size_t _nZ_max){
  98. lX=_lX;
  99. depth=_depth;
  100. if(_nX!=nX or _nZ_max!=nZ_max){
  101. delete[] hsoil;
  102. delete[] dhsoil;
  103. delete[] hbot;
  104. delete[] dhbot;
  105. delete[] nZ;
  106. delete[] dZ;
  107. for(size_t i=0;i<nX;++i) delete[] Z[i];
  108. delete[] Z;
  109. nX=_nX;
  110. nZ_max=_nZ_max;
  111. hsoil=new double[nX];
  112. dhsoil=new double[nX];
  113. hbot=new double[nX];
  114. dhbot=new double[nX];
  115. initZ(depth/nZ_max);
  116. }
  117. }