physics.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "physics.hpp"
  2. //------------------------
  3. // Brooks and Corey model
  4. //------------------------
  5. namespace Physics{
  6. double g=9.81;
  7. double rho=1000;
  8. double phi=0.3;
  9. double k0=3e-5;
  10. double nivrivsat=0.01;
  11. double (*s)(double)=&s_BC;
  12. double (*ds)(double)=&ds_BC;
  13. void (*s_ds)(double,double&,double&)=&s_ds_BC;
  14. double (*kr)(double)=&kr_BC;
  15. double (*dkr)(double)=&dkr_BC;
  16. void (*kr_dkr)(double,double&,double&)=&kr_dkr_BC;
  17. double model_data[6]={-2000,0,3,11,0,0};
  18. #define Psat model_data[0]
  19. #define sres model_data[1]
  20. #define lambda model_data[2]
  21. #define alpha model_data[3]
  22. void setModel(Model model){
  23. switch(model){
  24. case BrooksCorey:
  25. s=&s_BC;
  26. ds=&ds_BC;
  27. s_ds=&s_ds_BC;
  28. kr=&kr_BC;
  29. dkr=&dkr_BC;
  30. kr_dkr=&kr_dkr_BC;
  31. Psat=-2000;
  32. sres=0;
  33. lambda=3;
  34. alpha=11;
  35. break;
  36. default:
  37. assert(false);
  38. };
  39. }
  40. double
  41. s_BC(double P){
  42. if(P>=Psat) return 1;
  43. return sres+(1-sres)*pow(Psat/P,lambda);
  44. }
  45. double
  46. ds_BC(double P){
  47. if(P>=Psat) return 0;
  48. return ((sres-1)*lambda*pow(Psat/P,lambda))/P;
  49. }
  50. void
  51. s_ds_BC(double P,double& v,double& dv){
  52. if(P>=Psat){
  53. v=1;
  54. dv=0;
  55. }
  56. else{
  57. double t=(1-sres)*pow(Psat/P,lambda);
  58. v=sres+t;
  59. dv=-(lambda*t)/P;
  60. }
  61. }
  62. double
  63. kr_BC(double P){
  64. if(P>=Psat) return 1;
  65. return pow(Psat/P,alpha);
  66. }
  67. double
  68. dkr_BC(double P){
  69. if(P>=Psat) return 0;
  70. return -alpha*pow(Psat/P,alpha)/P;
  71. }
  72. void
  73. kr_dkr_BC(double P,double& v,double& dv){
  74. if(P>=Psat){
  75. v=1;
  76. dv=0;
  77. }
  78. else{
  79. double t=pow(Psat/P,alpha);
  80. v=t;
  81. dv=-(alpha*t)/P;
  82. }
  83. }
  84. }