physics.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "physics.hpp"
  2. double Physics::model_datas[6];
  3. //-------------
  4. // Constructor
  5. //-------------
  6. Physics::Physics(PhysicModel model){
  7. switch(model){
  8. case BrooksCorey:
  9. s=&s_BC;
  10. ds=&ds_BC;
  11. s_ds=&s_ds_BC;
  12. kr=&kr_BC;
  13. dkr=&dkr_BC;
  14. kr_dkr=&kr_dkr_BC;
  15. break;
  16. default:
  17. assert(false);
  18. };
  19. }
  20. //------------------------
  21. // Brooks and Corey model
  22. //------------------------
  23. #define Psat model_datas[0]
  24. #define sres model_datas[1]
  25. #define lambda model_datas[2]
  26. #define alpha model_datas[3]
  27. double
  28. Physics::s_BC(double P){
  29. if(P>=Psat) return 1;
  30. return sres+(1-sres)*pow(Psat/P,lambda);
  31. }
  32. double
  33. Physics::ds_BC(double P){
  34. if(P>=Psat) return 0;
  35. return ((sres-1)*lambda*pow(Psat/P,lambda))/P;
  36. }
  37. void
  38. Physics::s_ds_BC(double P,double& v,double& dv){
  39. if(P>=Psat){
  40. v=1;
  41. dv=0;
  42. }
  43. else{
  44. double t=(1-sres)*pow(Psat/P,lambda);
  45. v=sres+t;
  46. dv=-(lambda*t)/P;
  47. }
  48. }
  49. double
  50. Physics::kr_BC(double P){
  51. if(P>=Psat) return 1;
  52. return pow(Psat/P,alpha);
  53. }
  54. double
  55. Physics::dkr_BC(double P){
  56. if(P>=Psat) return 0;
  57. return -alpha*pow(Psat/P,alpha)/P;
  58. }
  59. void
  60. Physics::kr_dkr_BC(double P,double& v,double& dv){
  61. if(P>=Psat){
  62. v=1;
  63. dv=0;
  64. }
  65. else{
  66. double t=pow(Psat/P,alpha);
  67. v=t;
  68. dv=-(alpha*t)/P;
  69. }
  70. }