geometry_spline.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "geometry_spline.hpp"
  2. void
  3. GeometrySpline::initDefault(){
  4. lX=10;
  5. nX=100;
  6. nX_max=nmax_Qt;
  7. dX=lX/(nX-1);
  8. hsoil=new double[nmax_Qt];
  9. dhsoil=new double[nmax_Qt];
  10. hbot=new double[nmax_Qt];
  11. dhbot=new double[nmax_Qt];
  12. nZ=new size_t[nmax_Qt];
  13. dZ=new double[nmax_Qt];
  14. Z=new double*[nmax_Qt];
  15. for(size_t i=0;i<nmax_Qt;++i){
  16. Z[i]=new double[nmax_Qt];
  17. }
  18. for(size_t i=0;i<nX;++i){
  19. hsoil[i]=0.8;
  20. hbot[i]=0.2;
  21. dhsoil[i]=0;
  22. dhbot[i]=0;
  23. }
  24. depth=5;
  25. nZ_max=100;
  26. factor=5/0.6;
  27. initZ(depth/nZ_max,false);
  28. }
  29. void
  30. GeometrySpline::update(double _lX,size_t _nX,double _depth,size_t _nZ_max,Spline& Ssoil,Spline& Sbot){
  31. lX=_lX;
  32. depth=_depth;
  33. nX=_nX;
  34. nZ_max=_nZ_max;
  35. dX=lX/(nX-1);
  36. double hs_max=-inf,hb_min=inf;
  37. double v;
  38. for(size_t k=0;k<nX;++k){
  39. double x=k*dX/lX;
  40. v=hsoil[k]=Ssoil(x);
  41. hs_max=max(v,hs_max);
  42. dhsoil[k]=Ssoil.derivate(x);
  43. v=hbot[k]=Sbot(x);
  44. hb_min=min(v,hb_min);
  45. dhbot[k]=Sbot.derivate(x);
  46. }
  47. double dZ_avg=depth/_nZ_max;
  48. factor=depth/(hs_max-hb_min);
  49. for(size_t k=0;k<nX;++k){
  50. hsoil[k]*=factor;
  51. hbot[k]*=factor;
  52. }
  53. initZ(dZ_avg,false);
  54. }
  55. GeometrySpline::~GeometrySpline(){
  56. if(hsoil!=nullptr){
  57. delete[] hsoil;
  58. delete[] dhsoil;
  59. delete[] hbot;
  60. delete[] dhbot;
  61. delete[] dZ;
  62. delete[] nZ;
  63. for(size_t i=0;i<nX_max;++i){
  64. delete[] Z[i];
  65. }
  66. delete[] Z;
  67. }
  68. hsoil=nullptr;
  69. }