source.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #include "source.hpp"
  2. Pump::Pump(){
  3. amplitude_init=1.e-4;
  4. left_init=0.45;
  5. right_init=0.55;
  6. bottom_init=0.45;
  7. top_init=0.55;
  8. delta_left_init=0.05;
  9. delta_right_init=0.05;
  10. delta_top_init=0.05;
  11. delta_bottom_init=0.05;
  12. amplitude_final=1.e-4;
  13. left_final=0.45;
  14. right_final=0.55;
  15. bottom_final=0.45;
  16. top_final=0.55;
  17. delta_left_final=0.05;
  18. delta_right_final=0.05;
  19. delta_top_final=0.05;
  20. delta_bottom_final=0.05;
  21. }
  22. void
  23. Pump::save(fstream& file){
  24. file.write((char*)&amplitude_init,sizeof(double));
  25. file.write((char*)&left_init,sizeof(double));
  26. file.write((char*)&right_init,sizeof(double));
  27. file.write((char*)&bottom_init,sizeof(double));
  28. file.write((char*)&top_init,sizeof(double));
  29. file.write((char*)&delta_left_init,sizeof(double));
  30. file.write((char*)&delta_right_init,sizeof(double));
  31. file.write((char*)&delta_bottom_init,sizeof(double));
  32. file.write((char*)&delta_top_init,sizeof(double));
  33. file.write((char*)&amplitude_final,sizeof(double));
  34. file.write((char*)&left_final,sizeof(double));
  35. file.write((char*)&right_final,sizeof(double));
  36. file.write((char*)&bottom_final,sizeof(double));
  37. file.write((char*)&top_final,sizeof(double));
  38. file.write((char*)&delta_left_final,sizeof(double));
  39. file.write((char*)&delta_right_final,sizeof(double));
  40. file.write((char*)&delta_bottom_final,sizeof(double));
  41. file.write((char*)&delta_top_final,sizeof(double));
  42. }
  43. void
  44. Pump::load(fstream& file){
  45. file.read((char*)&amplitude_init,sizeof(double));
  46. file.read((char*)&left_init,sizeof(double));
  47. file.read((char*)&right_init,sizeof(double));
  48. file.read((char*)&bottom_init,sizeof(double));
  49. file.read((char*)&top_init,sizeof(double));
  50. file.read((char*)&delta_left_init,sizeof(double));
  51. file.read((char*)&delta_right_init,sizeof(double));
  52. file.read((char*)&delta_bottom_init,sizeof(double));
  53. file.read((char*)&delta_top_init,sizeof(double));
  54. file.read((char*)&amplitude_final,sizeof(double));
  55. file.read((char*)&left_final,sizeof(double));
  56. file.read((char*)&right_final,sizeof(double));
  57. file.read((char*)&bottom_final,sizeof(double));
  58. file.read((char*)&top_final,sizeof(double));
  59. file.read((char*)&delta_left_final,sizeof(double));
  60. file.read((char*)&delta_right_final,sizeof(double));
  61. file.read((char*)&delta_bottom_final,sizeof(double));
  62. file.read((char*)&delta_top_final,sizeof(double));
  63. }
  64. double
  65. Pump::get_amplitude(double t){
  66. return (1-t)*amplitude_init+t*amplitude_final;
  67. }
  68. double
  69. Pump::get_left(double t){
  70. return (1-t)*left_init+t*left_final;
  71. }
  72. double
  73. Pump::get_right(double t){
  74. return (1-t)*right_init+t*right_final;
  75. }
  76. double
  77. Pump::get_top(double t){
  78. return (1-t)*top_init+t*top_final;
  79. }
  80. double
  81. Pump::get_bottom(double t){
  82. return (1-t)*bottom_init+t*bottom_final;
  83. }
  84. double
  85. Pump::get_left_delta(double t){
  86. return (1-t)*delta_left_init+t*delta_left_final;
  87. }
  88. double
  89. Pump::get_right_delta(double t){
  90. return (1-t)*delta_right_init+t*delta_right_final;
  91. }
  92. double
  93. Pump::get_top_delta(double t){
  94. return (1-t)*delta_top_init+t*delta_top_final;
  95. }
  96. double
  97. Pump::get_bottom_delta(double t){
  98. return (1-t)*delta_bottom_init+t*delta_bottom_final;
  99. }
  100. double
  101. Pump::value(double x,double z,double t){
  102. double amplitude=interpol(amplitude_init,amplitude_final,t);
  103. double delta_left=interpol(delta_left_init,delta_left_final,t);
  104. double left=interpol(left_init,left_final,t);
  105. double delta_right=interpol(delta_right_init,delta_right_final,t);
  106. double right=interpol(right_init,right_final,t);
  107. double delta_top=interpol(delta_top_init,delta_top_final,t);
  108. double top=interpol(top_init,top_final,t);
  109. double delta_bottom=interpol(delta_bottom_init,delta_bottom_final,t);
  110. double bottom=interpol(bottom_init,bottom_final,t);
  111. double fx=bump(x,delta_left,left,delta_right,right);
  112. double fz=bump(z,delta_bottom,bottom,delta_top,top);
  113. return amplitude*fx*fz;
  114. }
  115. Cloud::Cloud(){
  116. amplitude_init=1.e-4;
  117. left_init=0.45;
  118. right_init=0.55;
  119. delta_left_init=0.05;
  120. delta_right_init=0.05;
  121. amplitude_final=1.e-4;
  122. left_final=0.45;
  123. right_final=0.55;
  124. delta_left_final=0.05;
  125. delta_right_final=0.05;
  126. }
  127. void
  128. Cloud::save(fstream& file){
  129. file.write((char*)&amplitude_init,sizeof(double));
  130. file.write((char*)&left_init,sizeof(double));
  131. file.write((char*)&right_init,sizeof(double));
  132. file.write((char*)&delta_left_init,sizeof(double));
  133. file.write((char*)&delta_right_init,sizeof(double));
  134. file.write((char*)&amplitude_final,sizeof(double));
  135. file.write((char*)&left_final,sizeof(double));
  136. file.write((char*)&right_final,sizeof(double));
  137. file.write((char*)&delta_left_final,sizeof(double));
  138. file.write((char*)&delta_right_final,sizeof(double));
  139. }
  140. void
  141. Cloud::load(fstream& file){
  142. file.read((char*)&amplitude_init,sizeof(double));
  143. file.read((char*)&left_init,sizeof(double));
  144. file.read((char*)&right_init,sizeof(double));
  145. file.read((char*)&delta_left_init,sizeof(double));
  146. file.read((char*)&delta_right_init,sizeof(double));
  147. file.read((char*)&amplitude_final,sizeof(double));
  148. file.read((char*)&left_final,sizeof(double));
  149. file.read((char*)&right_final,sizeof(double));
  150. file.read((char*)&delta_left_final,sizeof(double));
  151. file.read((char*)&delta_right_final,sizeof(double));
  152. }
  153. double
  154. Cloud::get_amplitude(double t){
  155. return (1-t)*amplitude_init+t*amplitude_final;
  156. }
  157. double
  158. Cloud::get_amplitude_max(){
  159. return max(amplitude_init,amplitude_final);
  160. }
  161. double
  162. Cloud::get_left(double t){
  163. return (1-t)*left_init+t*left_final;
  164. }
  165. double
  166. Cloud::get_right(double t){
  167. return (1-t)*right_init+t*right_final;
  168. }
  169. double
  170. Cloud::get_left_delta(double t){
  171. return (1-t)*delta_left_init+t*delta_left_final;
  172. }
  173. double
  174. Cloud::get_right_delta(double t){
  175. return (1-t)*delta_right_init+t*delta_right_final;
  176. }
  177. Source::~Source(){
  178. for(auto it=pumps.begin();it!=pumps.end();++it){
  179. delete *it;
  180. }
  181. for(auto it=clouds.begin();it!=clouds.end();++it){
  182. delete *it;
  183. }
  184. }
  185. Pump*
  186. Source::addPump(){
  187. Pump* pump=new Pump;
  188. pumps.push_back(pump);
  189. return pump;
  190. }
  191. void
  192. Source::removePump(Pump* pump){
  193. for(auto it=pumps.begin();it!=pumps.end();++it){
  194. if(*it==pump){
  195. delete *it;
  196. pumps.erase(it);
  197. return;
  198. }
  199. }
  200. }
  201. Cloud*
  202. Source::addCloud(){
  203. Cloud* cloud=new Cloud;
  204. clouds.push_back(cloud);
  205. return cloud;
  206. }
  207. void
  208. Source::removeCloud(Cloud* cloud){
  209. for(auto it=clouds.begin();it!=clouds.end();++it){
  210. if(*it==cloud){
  211. delete *it;
  212. clouds.erase(it);
  213. return;
  214. }
  215. }
  216. }
  217. void
  218. Source::save(fstream& file){
  219. size_t n=pumps.size();
  220. file.write((char*)&n,sizeof(double));
  221. for(auto it=pumps.begin();it!=pumps.end();++it){
  222. (*it)->save(file);
  223. }
  224. n=clouds.size();
  225. file.write((char*)&n,sizeof(double));
  226. for(auto it=clouds.begin();it!=clouds.end();++it){
  227. (*it)->save(file);
  228. }
  229. }
  230. void
  231. Source::load(fstream& file){
  232. size_t n;
  233. file.read((char*)&n,sizeof(size_t));
  234. for(size_t i=0;i<n;++i){
  235. Pump* pump=addPump();
  236. pump->load(file);
  237. }
  238. file.read((char*)&n,sizeof(size_t));
  239. for(size_t i=0;i<n;++i){
  240. Cloud* cloud=addCloud();
  241. cloud->load(file);
  242. }
  243. }