physics.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "physics.hpp"
  2. //------------------------
  3. // Brooks and Corey model
  4. //------------------------
  5. double Physics::g;
  6. double Physics::rho;
  7. double Physics::phi;
  8. double Physics::k0;
  9. double Physics::nivrivsat;
  10. double Physics::Psec;
  11. Physics::Model Physics::model;
  12. double (*Physics::s)(double);
  13. double (*Physics::ds)(double);
  14. void (*Physics::s_ds)(double,double&,double&);
  15. double (*Physics::s_inv)(double);
  16. double (*Physics::kr)(double);
  17. double (*Physics::dkr)(double);
  18. void (*Physics::kr_dkr)(double,double&,double&);
  19. double Physics::model_data[6];
  20. #define sres Physics::model_data[1]
  21. #define lambda Physics::model_data[2]
  22. #define alpha Physics::model_data[3]
  23. void Physics::setModel(Model m){
  24. model=m;
  25. switch(model){
  26. case BrooksCorey:
  27. cout<<"Set model BC"<<endl;
  28. s=&s_BC;
  29. ds=&ds_BC;
  30. s_ds=&s_ds_BC;
  31. s_inv=&s_inv_BC;
  32. kr=&kr_BC;
  33. dkr=&dkr_BC;
  34. cout<<"dkr : "<<&dkr<<endl;
  35. kr_dkr=&kr_dkr_BC;
  36. break;
  37. default:
  38. assert(false);
  39. };
  40. }
  41. double
  42. Physics::s_BC(double P){
  43. if(P>=Psat) return 1;
  44. return sres+(1-sres)*pow(Psat/P,lambda);
  45. }
  46. double
  47. Physics::ds_BC(double P){
  48. if(P>=Psat) return 0;
  49. return ((sres-1)*lambda*pow(Psat/P,lambda))/P;
  50. }
  51. void
  52. Physics::s_ds_BC(double P,double& v,double& dv){
  53. if(P>=Psat){
  54. v=1;
  55. dv=0;
  56. }
  57. else{
  58. double t=(1-sres)*pow(Psat/P,lambda);
  59. v=sres+t;
  60. dv=-(lambda*t)/P;
  61. }
  62. }
  63. double
  64. Physics::s_inv_BC(double S){
  65. return pow((S-sres)/(1-sres),-1/lambda)*Psat;
  66. }
  67. double
  68. Physics::kr_BC(double P){
  69. if(P>=Psat) return 1;
  70. return pow(Psat/P,alpha);
  71. }
  72. double
  73. Physics::dkr_BC(double P){
  74. if(P>=Psat) return 0;
  75. return -alpha*pow(Psat/P,alpha)/P;
  76. }
  77. void
  78. Physics::kr_dkr_BC(double P,double& v,double& dv){
  79. if(P>=Psat){
  80. v=1;
  81. dv=0;
  82. }
  83. else{
  84. double t=pow(Psat/P,alpha);
  85. v=t;
  86. dv=-(alpha*t)/P;
  87. }
  88. }
  89. void
  90. Physics::save(fstream& file){
  91. file.write((char*)&g,sizeof(double));
  92. file.write((char*)&rho,sizeof(double));
  93. file.write((char*)&phi,sizeof(double));
  94. file.write((char*)&k0,sizeof(double));
  95. file.write((char*)&Psec,sizeof(double));
  96. file.write((char*)&nivrivsat,sizeof(double));
  97. file.write((char*)&model,sizeof(Model));
  98. for(size_t i=0;i<max_model_parameters;++i){
  99. file.write((char*)&model_data[i],sizeof(double));
  100. }
  101. }
  102. void
  103. Physics::load(fstream& file){
  104. file.read((char*)&g,sizeof(double));
  105. file.read((char*)&rho,sizeof(double));
  106. file.read((char*)&phi,sizeof(double));
  107. file.read((char*)&k0,sizeof(double));
  108. file.read((char*)&Psec,sizeof(double));
  109. file.read((char*)&nivrivsat,sizeof(double));
  110. Model m;
  111. file.read((char*)&m,sizeof(Model));
  112. setModel(m);
  113. for(size_t i=0;i<max_model_parameters;++i){
  114. file.read((char*)&model_data[i],sizeof(double));
  115. }
  116. }
  117. double
  118. Physics::Psol(double hsoil,double hov){
  119. double a=Psat-rho*g*nivrivsat;
  120. return rho*g*(hov-hsoil)+a*nivrivsat/(hov-hsoil);
  121. }
  122. double
  123. Physics::dPsol(double hsoil,double hov){
  124. double a=Psat-rho*g*nivrivsat;
  125. double b=hov-hsoil;
  126. return rho*g-a*nivrivsat/(b*b);
  127. }
  128. double
  129. Physics::invPsol(double hsoil,double Psol){
  130. double a=Psat-rho*g*nivrivsat;
  131. double b=a*nivrivsat;
  132. return hsoil+(Psol+sqrt(Psol*Psol-4*rho*g*b))/(2*rho*g);
  133. }