input_physics.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "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<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<max_model_parameters;++i){
  22. model_label[i]->setTextFormat(Qt::RichText);
  23. }
  24. //Hide model parameters
  25. for(size_t i=0;i<max_model_parameters;++i){
  26. model_label[i]->hide();
  27. model_input[i]->hide();
  28. }
  29. //Input validators
  30. double_validator=new QDoubleValidator;
  31. positive_double_validator=new QDoubleValidator;
  32. positive_double_validator->setBottom(0);
  33. g_input->setValidator(positive_double_validator);
  34. rho_input->setValidator(double_validator);
  35. phi_input->setValidator(double_validator);
  36. k0_input->setValidator(double_validator);
  37. nivrivsat_input->setValidator(double_validator);
  38. //Boxes
  39. phy_common_box=new QGroupBox("Common parameters");
  40. phy_model_box=new QGroupBox("Model parameters");
  41. phy_model_selection_box=new QComboBox;
  42. phy_model_selection_box->addItem("Brooks and Corey");
  43. //Layouts
  44. base_layout=new QHBoxLayout;
  45. phy_common_layout=new QVBoxLayout;
  46. phy_model_layout=new QVBoxLayout;
  47. //Phy commont layout
  48. int vspace=20;
  49. phy_common_layout->addWidget(g_label);
  50. phy_common_layout->addWidget(g_input);
  51. phy_common_layout->addSpacing(vspace);
  52. phy_common_layout->addWidget(rho_label);
  53. phy_common_layout->addWidget(rho_input);
  54. phy_common_layout->addSpacing(vspace);
  55. phy_common_layout->addWidget(phi_label);
  56. phy_common_layout->addWidget(phi_input);
  57. phy_common_layout->addSpacing(vspace);
  58. phy_common_layout->addWidget(k0_label);
  59. phy_common_layout->addWidget(k0_input);
  60. phy_common_layout->addSpacing(vspace);
  61. phy_common_layout->addWidget(nivrivsat_label);
  62. phy_common_layout->addWidget(nivrivsat_input);
  63. phy_common_layout->addStretch();
  64. //Phy model layout
  65. phy_model_layout->addWidget(phy_model_selection_box);
  66. for(size_t i=0;i<max_model_parameters;++i){
  67. phy_model_layout->addSpacing(vspace);
  68. phy_model_layout->addWidget(model_label[i]);
  69. phy_model_layout->addWidget(model_input[i]);
  70. }
  71. phy_model_layout->addStretch();
  72. //Boxes
  73. phy_common_box->setLayout(phy_common_layout);
  74. phy_model_box->setLayout(phy_model_layout);
  75. //Base widget
  76. base_layout->addWidget(phy_common_box);
  77. base_layout->addWidget(phy_model_box);
  78. setLayout(base_layout);
  79. //Conections
  80. connect(phy_model_selection_box,QOverload<int>::of(&QComboBox::activated),this,&QtInputPhysics::modelChoosed);
  81. //Display model specific interface
  82. nb_model_parameters=0;
  83. modelChoosed(phy_model_selection_box->currentIndex());
  84. loadData();
  85. }
  86. QtInputPhysics::~QtInputPhysics(){
  87. }
  88. void
  89. QtInputPhysics::modelChoosed(int index){
  90. for(size_t i=0;i<nb_model_parameters;++i){
  91. model_label[i]->hide();
  92. model_input[i]->hide();
  93. }
  94. switch(index){
  95. case 0:
  96. //Brooks and Corey
  97. Physics::setModel(Physics::BrooksCorey);
  98. nb_model_parameters=4;
  99. model_label[0]->setText("Minimal pressure p<sub>sat</sub> such that s(p<sub>sat</sub>)=1");
  100. model_input[0]->setValidator(double_validator);
  101. model_input[0]->setText(QString::number(Physics::model_data[0]));
  102. model_label[1]->setText("Minimal residual pressure (s<sub>res</sub>)");
  103. model_input[1]->setValidator(double_validator);
  104. model_input[1]->setText(QString::number(Physics::model_data[1]));
  105. model_label[2]->setText("&lambda; exponent");
  106. model_input[2]->setValidator(double_validator);
  107. model_input[2]->setText(QString::number(Physics::model_data[2]));
  108. model_label[3]->setText("&alpha; exponent");
  109. model_input[3]->setValidator(double_validator);
  110. model_input[3]->setText(QString::number(Physics::model_data[3]));
  111. break;
  112. default:
  113. break;
  114. };
  115. for(size_t i=0;i<nb_model_parameters;++i){
  116. model_label[i]->show();
  117. model_input[i]->show();
  118. }
  119. }
  120. QWidget*
  121. QtInputPhysics::validate(){
  122. if(not g_input->hasAcceptableInput()) return g_input;
  123. if(not rho_input->hasAcceptableInput()) return rho_input;
  124. if(not phi_input->hasAcceptableInput()) return phi_input;
  125. if(not k0_input->hasAcceptableInput()) return k0_input;
  126. if(not nivrivsat_input->hasAcceptableInput()) return nivrivsat_input;
  127. for(size_t i=0;i<nb_model_parameters;++i){
  128. if(not model_input[i]->hasAcceptableInput()) return model_input[i];
  129. }
  130. return nullptr;
  131. }
  132. void
  133. QtInputPhysics::save(fstream& file){
  134. double d;
  135. size_t s;
  136. d=g_input->text().toDouble();
  137. file.write((char*)&d,sizeof(double));
  138. d=rho_input->text().toDouble();
  139. file.write((char*)&d,sizeof(double));
  140. d=phi_input->text().toDouble();
  141. file.write((char*)&d,sizeof(double));
  142. d=k0_input->text().toDouble();
  143. file.write((char*)&d,sizeof(double));
  144. d=nivrivsat_input->text().toDouble();
  145. file.write((char*)&d,sizeof(double));
  146. s=phy_model_selection_box->currentIndex();
  147. file.write((char*)&s,sizeof(size_t));
  148. s=nb_model_parameters;
  149. file.write((char*)&s,sizeof(size_t));
  150. for(size_t i=0;i<nb_model_parameters;++i){
  151. d=model_input[i]->text().toDouble();
  152. file.write((char*)&d,sizeof(double));
  153. }
  154. }
  155. void
  156. QtInputPhysics::load(fstream& file){
  157. double d;
  158. size_t s;
  159. file.read((char*)&d,sizeof(double));
  160. g_input->setText(QString::number(d));
  161. file.read((char*)&d,sizeof(double));
  162. rho_input->setText(QString::number(d));
  163. file.read((char*)&d,sizeof(double));
  164. phi_input->setText(QString::number(d));
  165. file.read((char*)&d,sizeof(double));
  166. k0_input->setText(QString::number(d));
  167. file.read((char*)&d,sizeof(double));
  168. nivrivsat_input->setText(QString::number(d));
  169. file.read((char*)&s,sizeof(size_t));
  170. phy_model_selection_box->setCurrentIndex(s);
  171. file.read((char*)&s,sizeof(size_t));
  172. for(size_t i=0;i<s;++i){
  173. file.read((char*)&d,sizeof(double));
  174. model_input[i]->setText(QString::number(d));
  175. }
  176. }
  177. void
  178. QtInputPhysics::loadData(){
  179. g_input->setText(QString::number(Physics::g));
  180. rho_input->setText(QString::number(Physics::rho));
  181. phi_input->setText(QString::number(Physics::phi));
  182. k0_input->setText(QString::number(Physics::k0));
  183. nivrivsat_input->setText(QString::number(Physics::nivrivsat));
  184. }