physics.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "qt/input/physics.hpp"
  2. QtInputPhysics::QtInputPhysics():QWidget(){
  3. g_label=new QLabel("Gravity (g) : ");
  4. rho_label=new QLabel("Fluid density (ρ) : ");
  5. phi_label=new QLabel("Porosity of the soil (φ) : ");
  6. k0_label=new QLabel("Conductivity of the saturated soil (k<sub>0</sub>) : ");
  7. nivrivsat_label=new QLabel("Water pressure at the bottom of overland water (nivrivsat) : ");
  8. g_input=new QLineEdit();
  9. rho_input=new QLineEdit();
  10. phi_input=new QLineEdit();
  11. k0_input=new QLineEdit();
  12. nivrivsat_input=new QLineEdit();
  13. for(size_t i=0;i<Physics::max_model_parameters;++i){
  14. model_label[i]=new QLabel(this);
  15. model_input[i]=new QLineEdit(this);
  16. }
  17. //Text format
  18. rho_label->setTextFormat(Qt::RichText);
  19. phi_label->setTextFormat(Qt::RichText);
  20. k0_label->setTextFormat(Qt::RichText);
  21. for(size_t i=0;i<Physics::max_model_parameters;++i){
  22. model_label[i]->setTextFormat(Qt::RichText);
  23. }
  24. //Hide model parameters
  25. for(size_t i=0;i<Physics::max_model_parameters;++i){
  26. model_label[i]->hide();
  27. model_input[i]->hide();
  28. }
  29. //QLocal
  30. //Input validators
  31. double_validator=new QDoubleValidator;
  32. double_validator->setLocale(QLocale("en_US"));
  33. positive_double_validator=new QDoubleValidator;
  34. positive_double_validator->setBottom(0);
  35. g_input->setValidator(positive_double_validator);
  36. rho_input->setValidator(double_validator);
  37. phi_input->setValidator(double_validator);
  38. k0_input->setValidator(double_validator);
  39. nivrivsat_input->setValidator(double_validator);
  40. //Boxes
  41. phy_common_box=new QGroupBox("Common parameters");
  42. phy_model_box=new QGroupBox("Model parameters");
  43. phy_model_selection_box=new QComboBox;
  44. phy_model_selection_box->addItem("Brooks and Corey");
  45. //Button
  46. refresh_button=new QPushButton("Refresh");
  47. //Widget
  48. phy_base_widget=new QWidget;
  49. //Layouts
  50. main_layout=new QVBoxLayout;
  51. phy_base_layout=new QHBoxLayout;
  52. phy_common_layout=new QVBoxLayout;
  53. phy_model_layout=new QVBoxLayout;
  54. //Phy commont layout
  55. int vspace=20;
  56. phy_common_layout->addWidget(g_label);
  57. phy_common_layout->addWidget(g_input);
  58. phy_common_layout->addSpacing(vspace);
  59. phy_common_layout->addWidget(rho_label);
  60. phy_common_layout->addWidget(rho_input);
  61. phy_common_layout->addSpacing(vspace);
  62. phy_common_layout->addWidget(phi_label);
  63. phy_common_layout->addWidget(phi_input);
  64. phy_common_layout->addSpacing(vspace);
  65. phy_common_layout->addWidget(k0_label);
  66. phy_common_layout->addWidget(k0_input);
  67. phy_common_layout->addSpacing(vspace);
  68. phy_common_layout->addWidget(nivrivsat_label);
  69. phy_common_layout->addWidget(nivrivsat_input);
  70. phy_common_layout->addStretch();
  71. //Phy model layout
  72. phy_model_layout->addWidget(phy_model_selection_box);
  73. for(size_t i=0;i<Physics::max_model_parameters;++i){
  74. phy_model_layout->addSpacing(vspace);
  75. phy_model_layout->addWidget(model_label[i]);
  76. phy_model_layout->addWidget(model_input[i]);
  77. }
  78. phy_model_layout->addStretch();
  79. //Boxes
  80. phy_common_box->setLayout(phy_common_layout);
  81. phy_model_box->setLayout(phy_model_layout);
  82. //Base widget
  83. phy_base_layout->addWidget(phy_common_box);
  84. phy_base_layout->addWidget(phy_model_box);
  85. phy_base_widget->setLayout(phy_base_layout);
  86. //Main_lyaout
  87. main_layout->addWidget(phy_base_widget);
  88. main_layout->addWidget(refresh_button);
  89. setLayout(main_layout);
  90. //Conections
  91. connect(phy_model_selection_box,QOverload<int>::of(&QComboBox::activated),this,&QtInputPhysics::modelChoosed);
  92. //Display model specific interface
  93. nb_model_parameters=0;
  94. modelChoosed(phy_model_selection_box->currentIndex());
  95. connect(refresh_button,&QPushButton::clicked,this,&QtInputPhysics::emitPhysicsChanged);
  96. getPhysics();
  97. }
  98. void
  99. QtInputPhysics::modelChoosed(int index){
  100. for(size_t i=0;i<Physics::max_model_parameters;++i){
  101. model_label[i]->hide();
  102. model_input[i]->hide();
  103. }
  104. switch(index){
  105. case 0:
  106. //Brooks and Corey
  107. Physics::setModel(Physics::BrooksCorey);
  108. nb_model_parameters=4;
  109. model_label[0]->setText("Minimal pressure p<sub>sat</sub> such that s(p<sub>sat</sub>)=1");
  110. model_input[0]->setValidator(double_validator);
  111. model_input[0]->setText(QString::number(Physics::model_data[0]));
  112. model_label[1]->setText("Minimal residual pressure (s<sub>res</sub>)");
  113. model_input[1]->setValidator(double_validator);
  114. model_input[1]->setText(QString::number(Physics::model_data[1]));
  115. model_label[2]->setText("&lambda; exponent");
  116. model_input[2]->setValidator(double_validator);
  117. model_input[2]->setText(QString::number(Physics::model_data[2]));
  118. model_label[3]->setText("&alpha; exponent");
  119. model_input[3]->setValidator(double_validator);
  120. model_input[3]->setText(QString::number(Physics::model_data[3]));
  121. break;
  122. default:
  123. break;
  124. };
  125. for(size_t i=0;i<nb_model_parameters;++i){
  126. model_label[i]->show();
  127. model_input[i]->show();
  128. }
  129. }
  130. QWidget*
  131. QtInputPhysics::validate(){
  132. if(not g_input->hasAcceptableInput()) return g_input;
  133. if(not rho_input->hasAcceptableInput()) return rho_input;
  134. if(not phi_input->hasAcceptableInput()) return phi_input;
  135. if(not k0_input->hasAcceptableInput()) return k0_input;
  136. if(not nivrivsat_input->hasAcceptableInput()) return nivrivsat_input;
  137. for(size_t i=0;i<nb_model_parameters;++i){
  138. if(not model_input[i]->hasAcceptableInput()) return model_input[i];
  139. }
  140. return nullptr;
  141. }
  142. void
  143. QtInputPhysics::getPhysics(){
  144. g_input->setText(QString::number(Physics::g));
  145. rho_input->setText(QString::number(Physics::rho));
  146. phi_input->setText(QString::number(Physics::phi));
  147. k0_input->setText(QString::number(Physics::k0));
  148. nivrivsat_input->setText(QString::number(Physics::nivrivsat));
  149. phy_model_selection_box->setCurrentIndex(Physics::model);
  150. for(size_t i=0;i<Physics::max_model_parameters;++i){
  151. model_input[i]->setText(QString::number(Physics::model_data[i]));
  152. }
  153. }
  154. void
  155. QtInputPhysics::setPhysics(){
  156. Physics::g=g_input->text().toDouble();
  157. Physics::rho=rho_input->text().toDouble();
  158. Physics::phi=phi_input->text().toDouble();
  159. Physics::k0=k0_input->text().toDouble();
  160. Physics::nivrivsat=nivrivsat_input->text().toDouble();
  161. //Model must be already assigned by QtInputPhysics::modelChoosed
  162. for(size_t i=0;i<Physics::max_model_parameters;++i){
  163. Physics::model_data[i]=model_input[i]->text().toDouble();
  164. }
  165. }
  166. void
  167. QtInputPhysics::emitPhysicsChanged(){
  168. QWidget* widget=validate();
  169. if(widget!=nullptr){
  170. QMessageBox msgBox;
  171. msgBox.setText("Incorrect geometry entry");
  172. msgBox.exec();
  173. widget->setFocus();
  174. }
  175. else{
  176. setPhysics();
  177. emit physicsChanged();
  178. }
  179. }