output_view.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include "qt/output/output_view.hpp"
  2. QtOutputView::QtOutputView(QtKernel* k){
  3. kernel=k;
  4. nX=kernel->geometry.nX;
  5. dX=kernel->geometry.dX;
  6. lX=kernel->geometry.lX;
  7. factor=kernel->factor;
  8. };
  9. void
  10. QtOutputView::initializeGL(){
  11. glClearColor(1,1,1,1);
  12. glEnable(GL_DEPTH_TEST);
  13. glEnable(GL_LIGHT0);
  14. glEnable(GL_LIGHTING);
  15. glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  16. glEnable(GL_COLOR_MATERIAL);
  17. }
  18. void
  19. QtOutputView::paintGL(){
  20. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  21. if(step>kernel->step) return;
  22. double h=height();
  23. double w=width();
  24. glBegin(GL_TRIANGLES);
  25. for(size_t i=0;i<nX-1;++i){
  26. size_t max_left=kernel->nZ(i);
  27. size_t max_right=kernel->nZ(i+1);
  28. size_t left=0;
  29. size_t right=0;
  30. while(left<max_left-1 and right<max_right-1){
  31. if(kernel->Z(i,left+1)<=kernel->Z(i+1,right+1)){
  32. drawTriangle(i,left,i+1,right,i,left+1);
  33. ++left;
  34. }
  35. else{
  36. drawTriangle(i,left,i+1,right,i+1,right+1);
  37. ++right;
  38. }
  39. }
  40. if(left==max_left-1){
  41. while(right<max_right-1){
  42. drawTriangle(i,left,i+1,right,i+1,right+1);
  43. ++right;
  44. }
  45. }
  46. if(right==max_right-1){
  47. while(left<max_left-1){
  48. drawTriangle(i,left,i+1,right,i,left+1);
  49. ++left;
  50. }
  51. }
  52. }
  53. glEnd();
  54. //Draw area under hbot
  55. glColor3f(0.6,0.6,0.6);
  56. glLineWidth(3);
  57. glBegin(GL_QUADS);
  58. for(size_t ix=0;ix<nX-1;ix+=1){
  59. double x=ix*dX;
  60. glVertex3f(x,0,1);
  61. glVertex3f(x,kernel->geometry.hbot[ix],0);
  62. glVertex3f(x+dX,kernel->geometry.hbot[ix+1],0);
  63. glVertex3f(x+dX,0,0);
  64. }
  65. glEnd();
  66. //Draw hsoil
  67. glColor3f(0.6,0.3,0);
  68. glLineWidth(1);
  69. glBegin(GL_LINE_STRIP);
  70. for(size_t ix=0;ix<nX;ix+=1){
  71. double x=ix*dX;
  72. glVertex3f(x,kernel->geometry.hsoil[ix],0.8);
  73. }
  74. glEnd();
  75. //Draw hydr
  76. glColor3f(1,0,0);
  77. glLineWidth(3);
  78. glBegin(GL_LINE_STRIP);
  79. for(size_t ix=0;ix<nX;ix+=1){
  80. double x=ix*dX;
  81. glVertex3f(x,kernel->solution[step]->hydr[ix]-Psat/(Physics::rho*Physics::g),1);
  82. }
  83. glEnd();
  84. //Draw hov
  85. glColor3f(0,0,0);
  86. glLineWidth(1);
  87. glBegin(GL_LINE_STRIP);
  88. for(size_t ix=0;ix<nX;ix+=1){
  89. double x=ix*dX;
  90. double y=kernel->solution[step]->hov[ix];
  91. glVertex3f(x,y,1);
  92. }
  93. glEnd();
  94. drawVectors();
  95. }
  96. void
  97. QtOutputView::resizeGL(int w,int h){
  98. glViewport(0,0,w,h);
  99. glMatrixMode(GL_PROJECTION);
  100. glLoadIdentity();
  101. gluOrtho2D(0,lX,0,factor);
  102. glMatrixMode(GL_MODELVIEW);
  103. glLoadIdentity();
  104. }
  105. void
  106. QtOutputView::drawTriangle(size_t ix1,size_t iz1,size_t ix2,size_t iz2,size_t ix3,size_t iz3){
  107. double factor_inv=1;//1/kernel->solution.factor;
  108. double h=height();
  109. double w=width();
  110. double x1=ix1*dX;
  111. double x2=ix2*dX;
  112. double x3=ix3*dX;
  113. double y1=kernel->Z(ix1,iz1)*factor_inv;;
  114. double y2=kernel->Z(ix2,iz2)*factor_inv;;
  115. double y3=kernel->Z(ix3,iz3)*factor_inv;;
  116. setColor(ix1,iz1);
  117. glVertex3f(x1,y1,0);
  118. setColor(ix2,iz2);
  119. glVertex3f(x2,y2,0);
  120. setColor(ix3,iz3);
  121. glVertex3f(x3,y3,0);
  122. }
  123. void
  124. QtOutputView::draw(size_t _step){
  125. step=_step;
  126. update();
  127. }
  128. void
  129. QtOutputView::mousePressEvent(QMouseEvent* event){
  130. double x=double(event->x())/width()*lX;
  131. double y=1-(double(event->y())/height());
  132. displayInfos(x,y*factor);
  133. }
  134. void
  135. QtOutputView::setColor(size_t ix,size_t iz){
  136. double p=getP(ix,iz);
  137. double s=Physics::s(p);
  138. double r=(1-s);
  139. double g=0.7*(1-s);
  140. double b=0.8*s+0.4*(1-s);
  141. glColor3f(r,g,b);
  142. }
  143. void
  144. QtOutputView::drawVector(size_t ix,size_t iz,double u,double v){
  145. double x1=ix*dX;
  146. double y1=kernel->Z(ix,iz);
  147. double x2=x1+u;
  148. double y2=y1+v;
  149. double x3=x2+(-0.866*u+0.5*v)*scale_arrow_head*lX;
  150. double y3=y2+(-0.5*u-0.866*v)*scale_arrow_head*factor;
  151. double x4=x2+(-0.866*u-0.5*v)*scale_arrow_head*lX;
  152. double y4=y2+(0.5*u-0.866*v)*scale_arrow_head*factor;
  153. glColor3f(1,1,0);
  154. glBegin(GL_LINE_STRIP);
  155. glVertex3f(x1,y1,0.8);
  156. glVertex3f(x2,y2,0.8);
  157. glEnd();
  158. glBegin(GL_LINE_STRIP);
  159. glVertex3f(x3,y3,0.8);
  160. glVertex3f(x2,y2,0.8);
  161. glVertex3f(x4,y4,0.8);
  162. glEnd();
  163. }
  164. void
  165. QtOutputView::drawVectors(){
  166. for(size_t ix=1;ix<nX-1;ix+=arrow_step_x){
  167. //Case iz=0
  168. double p1=getP(ix,0);
  169. double p2=getP(ix,1);
  170. double u=-Physics::k0*Physics::kr(getPl(ix)+Physics::rho*Physics::g*(getl(ix)-kernel->Z(ix,0)))*(getHydr(ix+1)-getHydr(ix-1))/(2*dX);
  171. double v=-Physics::k0*Physics::kr(p1)*((p2-p1)/(Physics::rho*Physics::g*kernel->geometry.dZ[ix])+1);
  172. drawVector(ix,0,scale_arrow*u,scale_arrow*v);
  173. for(size_t iz=arrow_step_z;iz<kernel->nZ(ix)-1;iz+=arrow_step_z){
  174. double p0=getP(ix,iz-1);
  175. double p1=getP(ix,iz);
  176. double p2=getP(ix,iz+1);
  177. double u=-Physics::k0*Physics::kr(getPl(ix)+Physics::rho*Physics::g*(getl(ix)-kernel->Z(ix,iz)))*(getHydr(ix+1)-getHydr(ix-1))/(2*dX);
  178. double v=-Physics::k0*Physics::kr(p1)*((p2-p0)/(2*Physics::rho*Physics::g*kernel->geometry.dZ[ix])+1);
  179. drawVector(ix,iz,scale_arrow*u,scale_arrow*v);
  180. }
  181. }
  182. }
  183. void
  184. QtOutputView::displayInfos(double x,double z){
  185. cout<<"---------------------------------"<<endl;
  186. cout<<"x = "<<x<<endl;
  187. cout<<"z = "<<z<<endl;
  188. size_t ix=floor(x/dX+0.5);
  189. if(ix==nX) --ix;
  190. cout<<"ix = "<<ix<<endl;
  191. double hbot=kernel->geometry.hbot[ix];
  192. cout<<"hbot = "<<hbot<<endl;
  193. double hsoil=kernel->geometry.hsoil[ix];
  194. cout<<"hsoil = "<<hsoil<<endl;
  195. cout<<"l = "<<getl(ix)<<endl;
  196. if(z>hbot and z<hsoil){
  197. double dZ=kernel->geometry.dZ[ix];
  198. cout<<"dZ = "<<dZ<<endl;
  199. size_t nz=kernel->geometry.nZ[ix];
  200. cout<<"nZ = "<<nz<<endl;
  201. size_t iz=floor((z-hbot)/dZ+0.5);
  202. if(iz==nz) --iz;
  203. cout<<"iz = "<<iz<<endl;
  204. cout<<"P = "<<getP(ix,iz)<<endl;
  205. }
  206. }