initial_state.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "initial_state.hpp"
  2. Tank::Tank(){
  3. saturation=0.8;
  4. left=0.4;right=0.6;
  5. bottom=0.6;top=0.7;
  6. delta_left=0.05;
  7. delta_right=0.05;
  8. delta_bottom=0.05;
  9. delta_top=0.05;
  10. }
  11. void
  12. Tank::save(fstream& file){
  13. file.write((char*)&saturation,sizeof(double));
  14. file.write((char*)&left,sizeof(double));
  15. file.write((char*)&right,sizeof(double));
  16. file.write((char*)&bottom,sizeof(double));
  17. file.write((char*)&top,sizeof(double));
  18. file.write((char*)&delta_left,sizeof(double));
  19. file.write((char*)&delta_right,sizeof(double));
  20. file.write((char*)&delta_bottom,sizeof(double));
  21. file.write((char*)&delta_top,sizeof(double));
  22. }
  23. void
  24. Tank::load(fstream& file){
  25. file.read((char*)&saturation,sizeof(double));
  26. file.read((char*)&left,sizeof(double));
  27. file.read((char*)&right,sizeof(double));
  28. file.read((char*)&bottom,sizeof(double));
  29. file.read((char*)&top,sizeof(double));
  30. file.read((char*)&delta_left,sizeof(double));
  31. file.read((char*)&delta_right,sizeof(double));
  32. file.read((char*)&delta_bottom,sizeof(double));
  33. file.read((char*)&delta_top,sizeof(double));
  34. }
  35. InitialState::InitialState(){
  36. geometry=nullptr;
  37. hsat=nullptr;
  38. Pinit=nullptr;
  39. }
  40. InitialState::InitialState(Geometry* _geometry){
  41. geometry=_geometry;
  42. hsat=nullptr;
  43. Pinit=nullptr;
  44. }
  45. Tank*
  46. InitialState::addTank(){
  47. Tank* tank=new Tank;
  48. tanks.push_back(tank);
  49. //updatePressure();
  50. return tank;
  51. }
  52. void
  53. InitialState::removeTank(Tank* tank){
  54. for(auto it=tanks.begin();it!=tanks.end();++it){
  55. if(*it==tank){
  56. delete *it;
  57. tanks.erase(it);
  58. return;
  59. }
  60. }
  61. //updatePressure();
  62. }
  63. InitialState::~InitialState(){
  64. if(hsat!=nullptr){
  65. delete[] hsat;
  66. for(size_t i=0;i<geometry->nX;++i){
  67. delete[] Pinit[i];
  68. }
  69. delete[] Pinit;
  70. for(auto it=tanks.begin();it!=tanks.end();++it){
  71. delete(*it);
  72. }
  73. }
  74. }
  75. void
  76. InitialState::updatePressure(){
  77. for(size_t i=0;i<geometry->nX;++i){
  78. double x=double(i)/(geometry->nX-1);
  79. size_t nZ=geometry->nZ[i];
  80. double temp=hsat[i]+Psat/(Physics::g*Physics::rho); //TODO : replace Physics::model_data[0] by Psat in future
  81. //cout<<i<<" -> "<<nZ<<endl;
  82. for(size_t j=0;j<nZ;++j){
  83. double z=geometry->Z[i][j];
  84. Pinit[i][j]=Physics::rho*Physics::g*(temp-z);
  85. for(auto it=tanks.begin();it!=tanks.end();++it){
  86. Tank* tank=*it;
  87. double S=tank->saturation;
  88. double l=tank->left;
  89. double r=tank->right;
  90. double t=tank->top;
  91. double b=tank->bottom;
  92. double dl=tank->delta_left;
  93. double dr=tank->delta_right;
  94. double dt=tank->delta_top;
  95. double db=tank->delta_bottom;
  96. double Ps=Physics::s_inv(S);
  97. double Px,Pz;
  98. if(x<=l){
  99. Px=(Ps-Physics::Psec)*(x-l)/dl+Ps;
  100. }
  101. else if(x>=r){
  102. Px=(Physics::Psec-Ps)*(x-r)/dr+Ps;
  103. }
  104. else{
  105. Px=Ps;
  106. }
  107. if(z<=b){
  108. Pz=(Ps-Physics::Psec)*(z-b)/db+Ps;
  109. }
  110. else if(z>=t){
  111. Pz=(Physics::Psec-Ps)*(z-t)/dt+Ps;
  112. }
  113. else{
  114. Pz=Ps;
  115. }
  116. Pinit[i][j]=max(max(min(Px,Pz),Pinit[i][j]),Physics::Psec);
  117. }
  118. //TODO : voir considrer max avec psec
  119. }
  120. }
  121. }
  122. void
  123. InitialState::save(fstream& file){
  124. file.write((char*)hsat,geometry->nX*sizeof(double));
  125. file.write((char*)hov,geometry->nX*sizeof(double));
  126. for(size_t i=0;i<geometry->nX;++i){
  127. file.write((char*)Pinit[i],geometry->nZ[i]*sizeof(double));
  128. }
  129. size_t nt=tanks.size();
  130. file.write((char*)&nt,sizeof(double));
  131. for(auto it=tanks.begin();it!=tanks.end();++it){
  132. (*it)->save(file);
  133. }
  134. }
  135. void
  136. InitialState::load(fstream& file,bool init){
  137. if(init){
  138. hsat=new double[geometry->nX];
  139. hov=new double[geometry->nX];
  140. Pinit=new double*[geometry->nX];
  141. }
  142. file.read((char*)hsat,geometry->nX*sizeof(double));
  143. file.read((char*)hov,geometry->nX*sizeof(double));
  144. for(size_t i=0;i<geometry->nX;++i){
  145. if(init) Pinit[i]=new double[geometry->nZ[i]];
  146. file.read((char*)Pinit[i],geometry->nZ[i]*sizeof(double));
  147. }
  148. size_t nt;
  149. file.read((char*)&nt,sizeof(size_t));
  150. for(size_t i=0;i<nt;++i){
  151. Tank* tank=addTank();
  152. tank->load(file);
  153. }
  154. }