geometry.cpp 874 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "geometry.hpp"
  2. double inf = numeric_limits<double>::infinity();
  3. Geometry::Geometry(double _lX,size_t _nX,size_t _nZ,Func _hsoil,Func _dhsoil,Func _hbot,Func _dhbot){
  4. lX=_lX;
  5. nX=_nX;
  6. dX=lX/nX;
  7. hsoil=new double[nX];
  8. dhsoil=new double[nX];
  9. hbot=new double[nX];
  10. dhbot=new double[nX];
  11. double hs_max=-inf,hb_min=inf;
  12. double v;
  13. for(size_t k=0;k<nX;++k){
  14. double x=k*dX;
  15. v=hsoil[k]=_hsoil(x);
  16. hs_max=max(v,hs_max);
  17. dhsoil[k]=_dhsoil(x);
  18. v=hbot[k]=_hbot(x);
  19. hb_min=min(v,hb_min);
  20. dhbot[k]=_dhbot(x);
  21. }
  22. double dZ_avg=(hs_max-hb_min)/_nZ;
  23. nZ=new size_t[nX];
  24. dZ=new double[nX];
  25. Z=new double*[nX];
  26. for(size_t k=0;k<nX;++k){
  27. double d=hsoil[k]-hbot[k];
  28. size_t n=d/dZ_avg;
  29. double dz=d/n;
  30. dZ[k]=dz;
  31. nZ[k]=n;
  32. Z[k]=new double[n];
  33. for(size_t j=0;j<n;++j){
  34. Z[k][j]=hbot[k]+j*dz;
  35. }
  36. }
  37. }