1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------------
4
5# This file is part of Code_Saturne, a general-purpose CFD tool.
6#
7# Copyright (C) 1998-2021 EDF S.A.
8#
9# This program is free software; you can redistribute it and/or modify it under
10# the terms of the GNU General Public License as published by the Free Software
11# Foundation; either version 2 of the License, or (at your option) any later
12# version.
13#
14# This program is distributed in the hope that it will be useful, but WITHOUT
15# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17# details.
18#
19# You should have received a copy of the GNU General Public License along with
20# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
21# Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
23#-------------------------------------------------------------------------------
24
25"""
26This module defines the 'Interfacial area' page.
27
28This module contains the following classes:
29- InterfacialAreaView
30"""
31
32#-------------------------------------------------------------------------------
33# Library modules import
34#-------------------------------------------------------------------------------
35
36import os, sys, string, types
37import logging
38
39#-------------------------------------------------------------------------------
40# Third-party modules
41#-------------------------------------------------------------------------------
42
43from code_saturne.Base.QtCore    import *
44from code_saturne.Base.QtGui     import *
45from code_saturne.Base.QtWidgets import *
46
47#-------------------------------------------------------------------------------
48# Application modules import
49#-------------------------------------------------------------------------------
50
51from code_saturne.model.Common import GuiParam
52from code_saturne.Base.QtPage import ComboModel, DoubleValidator, from_qvariant
53from code_saturne.Pages.InterfacialArea import Ui_InterfacialArea
54from code_saturne.model.InterfacialAreaModel import InterfacialAreaModel
55from code_saturne.model.MainFieldsModel import MainFieldsModel
56from code_saturne.model.InterfacialForcesModel import InterfacialForcesModel
57#-------------------------------------------------------------------------------
58# log config
59#-------------------------------------------------------------------------------
60
61logging.basicConfig()
62log = logging.getLogger("InterfacialAreaView")
63log.setLevel(GuiParam.DEBUG)
64
65
66#-------------------------------------------------------------------------------
67# SolidView class
68#-------------------------------------------------------------------------------
69
70class InterfacialAreaView(QWidget, Ui_InterfacialArea):
71    """
72    InterfacialAreaView layout.
73    """
74    def __init__(self, parent, case):
75        """
76        Constructor
77        """
78        QWidget.__init__(self, parent)
79
80        Ui_InterfacialArea.__init__(self)
81        self.setupUi(self)
82
83        self.case = case
84        self.case.undoStopGlobal()
85        self.mdl = InterfacialAreaModel(self.case)
86
87        dispersed_fields = self.mdl.getDispersedFieldList() + InterfacialForcesModel(self.case).getGLIMfields()
88
89        if dispersed_fields == []:
90            self.groupBoxField.hide()
91            self.groupBoxMinMaxDiameter.hide()
92            self.groupBoxModel.hide()
93            self.labelNoDispersedPhase.show()
94            self.mdl.remove()
95            return
96
97        # Combo box models
98        id_to_set = -1
99        self.modelField = ComboModel(self.comboBoxField, 1, 1)
100
101        # For consistency with the previous pages, the second phase of the
102        # Large Interface Model is set before the dispersed fields
103
104        for fieldId in dispersed_fields:
105            label = self.mdl.getLabel(fieldId)
106            name = str(fieldId)
107            self.modelField.addItem(self.tr(label), name)
108
109        if len(dispersed_fields) > 0 and id_to_set == -1:
110            id_to_set = dispersed_fields[0]
111            self.modelField.setItem(str_model=id_to_set)
112
113        # case no field
114        self.currentid = id_to_set
115
116        self.modelModel = ComboModel(self.comboBoxModel, 2, 1)
117        self.modelModel.addItem(self.tr("constant"), "constant")
118        self.modelModel.addItem(self.tr("interfacial area transport"), "interfacial_area_transport")
119
120        self.modelSourceTerm = ComboModel(self.comboBoxSourceTerm, 4, 1)
121
122        self.modelSourceTerm.addItem(self.tr("No coalescence, no fragmentation"),"no_coalescence_no_fragmentation")
123        self.modelSourceTerm.addItem(self.tr("Yao & Morel"),"wei_yao")
124        self.modelSourceTerm.addItem(self.tr("Kamp & Colin"),"kamp_colin")
125        self.modelSourceTerm.addItem(self.tr("Ruyer & Seiler"), "ruyer_seiler")
126        self.modelSourceTerm.disableItem(2)  # Why ?
127
128        # Validators
129        validatorDefDiam = DoubleValidator(self.lineEditDefaultDiameter, min = 0.0)
130        validatorMinDiam = DoubleValidator(self.lineEditMinDiameter, min = 0.0)
131        validatorMaxDiam = DoubleValidator(self.lineEditMaxDiameter, min = 0.0)
132
133        validatorDefDiam.setExclusiveMin(True)
134        validatorMinDiam.setExclusiveMin(True)
135        validatorMaxDiam.setExclusiveMin(True)
136
137        self.lineEditDefaultDiameter.setValidator(validatorDefDiam)
138        self.lineEditMinDiameter.setValidator(validatorMinDiam)
139        self.lineEditMaxDiameter.setValidator(validatorMaxDiam)
140
141        # Connect signals to slots
142        self.comboBoxField.activated[str].connect(self.slotField)
143        self.comboBoxModel.activated[str].connect(self.slotModel)
144        self.comboBoxSourceTerm.activated[str].connect(self.slotSourceTerm)
145        self.lineEditDefaultDiameter.textChanged[str].connect(self.slotDefaultDiameter)
146        self.lineEditMinDiameter.textChanged[str].connect(self.slotMinDiameter)
147        self.lineEditMaxDiameter.textChanged[str].connect(self.slotMaxDiameter)
148
149        # Initialize widget
150        self.initializeVariables(self.currentid)
151
152        self.case.undoStartGlobal()
153
154
155    @pyqtSlot(str)
156    def slotField(self, text):
157        """
158        INPUT label for choice of field
159        """
160        self.currentid = self.modelField.dicoV2M[text]
161        self.initializeVariables(self.currentid)
162
163        if self.mdl.getFieldNature(self.currentid) == "gas" :
164            self.modelSourceTerm.enableItem(0)
165        else :
166            self.modelSourceTerm.disableItem(0)
167
168
169    @pyqtSlot(str)
170    def slotModel(self, text):
171        """
172        INPUT type for choice of model
173        """
174        model = self.modelModel.dicoV2M[text]
175        self.mdl.setAreaModel(self.currentid, model)
176        self.initializeVariables(self.currentid)
177
178
179    @pyqtSlot(str)
180    def slotSourceTerm(self, text):
181        """
182        INPUT type for choice of model source term
183        """
184        model = self.modelSourceTerm.dicoV2M[text]
185        self.mdl.setSourceTerm(self.currentid, model)
186
187
188    @pyqtSlot(str)
189    def slotDefaultDiameter(self, var):
190        """
191        """
192        if self.lineEditDefaultDiameter.validator().state == QValidator.Acceptable:
193            value = from_qvariant(var, float)
194            self.mdl.setInitialDiameter(self.currentid, value)
195
196
197    @pyqtSlot(str)
198    def slotMinDiameter(self, var):
199        """
200        """
201        if self.lineEditMinDiameter.validator().state == QValidator.Acceptable:
202            value = from_qvariant(var, float)
203            self.mdl.setMinDiameter(self.currentid, value)
204
205
206    @pyqtSlot(str)
207    def slotMaxDiameter(self, var):
208        """
209        """
210        if self.lineEditMaxDiameter.validator().state == QValidator.Acceptable:
211            value = from_qvariant(var, float)
212            self.mdl.setMaxDiameter(self.currentid, value)
213
214
215    def initializeVariables(self, fieldId):
216        """
217        Initialize variables when a new fieldId is choosen
218        """
219        self.labelNoDispersedPhase.hide()
220        model = self.mdl.getAreaModel(fieldId)
221        self.modelModel.setItem(str_model = model)
222
223        value = self.mdl.getInitialDiameter(self.currentid)
224        self.lineEditDefaultDiameter.setText(str(value))
225
226        if self.mdl.getAreaModel(fieldId) == "constant" :
227            self.groupBoxAreaTransport.hide()
228            self.groupBoxMinMaxDiameter.hide()
229        else :
230            self.groupBoxAreaTransport.show()
231            model = self.mdl.getSourceTerm(fieldId)
232            self.modelSourceTerm.setItem(str_model = model)
233
234            self.groupBoxMinMaxDiameter.show()
235
236            value = self.mdl.getMinDiameter(self.currentid)
237            self.lineEditMinDiameter.setText(str(value))
238
239            value = self.mdl.getMaxDiameter(self.currentid)
240            self.lineEditMaxDiameter.setText(str(value))
241
242            if MainFieldsModel(self.case).getFieldNature(fieldId) != 'gas' :
243                self.modelSourceTerm.disableItem(1)
244                self.modelSourceTerm.disableItem(2)
245                self.modelSourceTerm.disableItem(3)
246            else:
247                if MainFieldsModel(self.case).getPredefinedFlow() == "multiregime":
248                    self.modelSourceTerm.disableItem(1)
249                    self.modelSourceTerm.disableItem(2)
250                    self.modelSourceTerm.enableItem(3)
251                else:
252                    self.modelSourceTerm.enableItem(1)
253                    self.modelSourceTerm.enableItem(2)
254                    self.modelSourceTerm.enableItem(3)
255