Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ Attemp = "Attemp"
attemp = "attemp"
# Ficks Law
Ficks = "Ficks"
# inh == inherent
inh = "inh"
# scaling - ue
ue = "ue"
# Nd in Atom
Expand Down
2 changes: 1 addition & 1 deletion idaes/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ def _new_idaes_config_block():
"scale_model",
pyomo.common.config.ConfigValue(
domain=Bool,
default=False, # TODO: Change to true once transition complete
default=True,
description="Whether to apply model scaling in writer",
),
)
Expand Down
93 changes: 93 additions & 0 deletions idaes/core/base/control_volume0d.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

# Import Pyomo libraries
from pyomo.environ import Constraint, Reals, units as pyunits, Var, value
from pyomo.common.collections import ComponentMap
from pyomo.dae import DerivativeVar
from pyomo.common.deprecation import deprecation_warning

Expand All @@ -43,13 +44,103 @@
from idaes.core.util.tables import create_stream_table_dataframe
from idaes.core.util import scaling as iscale
import idaes.logger as idaeslog
from idaes.core.base.control_volume_base import ControlVolumeScalerBase

from idaes.core.scaling import DefaultScalingRecommendation

_log = idaeslog.getLogger(__name__)

# TODO : Custom terms in material balances, other types of material balances
# TODO : Improve flexibility for get_material_flow_terms and associated


class ControlVolume0DScaler(ControlVolumeScalerBase):
"""
Scaler object for the ControlVolume0D
"""

DEFAULT_SCALING_FACTORS = {
# We could scale volume by magnitude if it were being fixed
# by the user, but we often have the volume given by an
# equality constraint involving geometry in the parent
# unit model.
"volume": DefaultScalingRecommendation.userInputRequired,
"phase_fraction": 10, # May have already been created by property package
}

def variable_scaling_routine(
self, model, overwrite: bool = False, submodel_scalers: ComponentMap = None
):
"""
Routine to apply scaling factors to variables in model.

Derived classes must overload this method.

Args:
model: model to be scaled
overwrite: whether to overwrite existing scaling factors
submodel_scalers: ComponentMap of Scalers to use for sub-models

Returns:
None
"""
self.call_submodel_scaler_method(
submodel=model.properties_in,
submodel_scalers=submodel_scalers,
method="variable_scaling_routine",
overwrite=overwrite,
)
self.propagate_state_scaling(
target_state=model.properties_out,
source_state=model.properties_in,
overwrite=overwrite,
)
self.call_submodel_scaler_method(
submodel=model.properties_out,
submodel_scalers=submodel_scalers,
method="variable_scaling_routine",
overwrite=overwrite,
)
if hasattr(model, "volume"):
for v in model.volume.values():
self.scale_variable_by_default(v, overwrite=overwrite)
if hasattr(model, "phase_fraction"):
for v in model.phase_fraction.values():
self.scale_variable_by_default(v, overwrite=overwrite)

super().variable_scaling_routine(
model, overwrite=overwrite, submodel_scalers=submodel_scalers
)

def constraint_scaling_routine(
self, model, overwrite: bool = False, submodel_scalers: ComponentMap = None
):
"""
Routine to apply scaling factors to constraints in model.

Derived classes must overload this method.

Args:
model: model to be scaled
overwrite: whether to overwrite existing scaling factors
submodel_scalers: ComponentMap of Scalers to use for sub-models

Returns:
None
"""
for props in [model.properties_in, model.properties_out]:
self.call_submodel_scaler_method(
submodel=props,
submodel_scalers=submodel_scalers,
method="constraint_scaling_routine",
overwrite=overwrite,
)

super().constraint_scaling_routine(
model, overwrite=overwrite, submodel_scalers=submodel_scalers
)


@declare_process_block_class(
"ControlVolume0DBlock",
doc="""
Expand All @@ -71,6 +162,8 @@ class ControlVolume0DBlockData(ControlVolumeBlockData):
specified in the chosen property package.
"""

default_scaler = ControlVolume0DScaler

def add_geometry(self):
"""
Method to create volume Var in ControlVolume.
Expand Down
Loading
Loading