DualFanDualDuctSteadyStateJunction
HVAC and building model that stalls during the simulation.
The original model Buildings.Examples.DualFanDualDuct.ClosedLoop works
with OPTIMICA, but the parameter assignments that remove the mixing volume at the flow
junctions cause the solver to stall.
Therefore, we recommend our users to add these mixing volumes, but the drawback is
that they introduce fast dynamics and additional state variables.
| Model | DualFanDualDuctSteadyStateJunction |
| Tool | OPTIMICA OCT-dev-r26446_JM-r14295 |
| OS | Linux Ubuntu 20.04 |
| Status | open |
| Setup |
git clone git@github.com:lbl-srg/modelica-buildings.git git checkout d538de534a6f6c19311d70efb664ffdf6f5ca6a6 |
| Command |
cd modelica-buildings
echo "model DualFanDualDuctSteadyStateJunction
extends Buildings.Examples.DualFanDualDuct.ClosedLoop(
splRetRoo1(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splRetSou(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splRetEas(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splRetNor(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupNorCol(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupEasCol(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupSouCol(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupRoo1Col(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupRoo1Hot(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupSouHot(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupEasHot(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splSupNorHot(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splHotColDec(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splCol2(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState),
splCol1(energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState));
annotation (experiment(
StopTime=172800,
Tolerance=1e-06));
end DualFanDualDuctSteadyStateJunction;" > DualFanDualDuctSteadyStateJunction.mo
jm_ipython.sh run.py DualFanDualDuctSteadyStateJunction.mo
|
| Files |
run.py
#!/usr/bin/env python3
##########################################################################
# Script to simulate Modelica models with JModelica.
#
##########################################################################
# Import the function for compilation of models and the load_fmu method
from pymodelica import compile_fmu
import traceback
import logging
import math
from pyfmi import load_fmu
import pymodelica
import os
import shutil
import sys
import matplotlib.pyplot as plt
import pprint
debug_solver = False
model="Buildings.Utilities.Psychrometrics.Examples.DewPointTemperature"
generate_plot = False
final_time = float("NaN") # Set to float("NaN") to use stopTime from .mo file
#final_time = 10E4
# Overwrite model with command line argument if specified
if len(sys.argv) > 1:
# If the argument is a file, then parse it to a model name
if os.path.isfile(sys.argv[1]):
model = sys.argv[1].replace(os.path.sep, '.')[:-3]
else:
model=sys.argv[1]
print("*** Compiling {}".format(model))
# Increase memory
pymodelica.environ['JVM_ARGS'] = '-Xmx4096m'
sys.stdout.flush()
######################################################################
# Compile fmu
import time
start = time.time()
fmu_name = compile_fmu(model,
version="2.0",
compiler_log_level='warning', #'info', 'warning',
compiler_options = {"generate_html_diagnostics" : False,
"event_output_vars": True,
"generate_ode_jacobian": False, # default is False
"nle_solver_tol_factor": 1e-2}) # 1e-2 is the default
print(f"Compiled {fmu_name}")
end = time.time()
print(f"Translation time: {end - start}")
#sys.exit(0)
######################################################################
# Copy style sheets.
# This is a hack to get the css and js files to render the html diagnostics.
htm_dir = os.path.splitext(os.path.basename(fmu_name))[0] + "_html_diagnostics"
if os.path.exists(htm_dir):
for fil in ["scripts.js", "style.css", "zepto.min.js"]:
src = os.path.join(".jmodelica_html", fil)
if os.path.exists(src):
des = os.path.join(htm_dir, fil)
shutil.copyfile(src, des)
######################################################################
# Load model
mod = load_fmu(fmu_name, log_level=4) # default setting is 3
mod.set_max_log_size(2073741824) # = 2*1024^3 (about 2GB)
######################################################################
# Print derivatives
import re
print("Derivatives:")
for d in mod.get_derivatives_list().keys():
print(f" {d}")
print("")
######################################################################
# Retrieve and set solver options
x_nominal = mod.nominal_continuous_states
opts = mod.simulate_options() #Retrieve the default options
opts['solver'] = 'CVode' #'Radau5ODE' #CVode
opts['ncp'] = 500
# Set user-specified tolerance if it is smaller than the tolerance in the .mo file
rtol = 1.0e-6
x_nominal = mod.nominal_continuous_states
if len(x_nominal) > 0:
atol = rtol*x_nominal
else:
atol = rtol
opts[f"{opts['solver']}_options"]['rtol'] = rtol
opts[f"{opts['solver']}_options"]['atol'] = atol
if opts['solver'].lower() == 'cvode':
opts['CVode_options']['external_event_detection'] = False
opts['CVode_options']['maxh'] = (mod.get_default_experiment_stop_time()-mod.get_default_experiment_start_time())/float (opts['ncp'])
opts['CVode_options']['iter'] = 'Newton'
opts['CVode_options']['discr'] = 'BDF'
opts['CVode_options']['store_event_points'] = True # True is default, set to false if many events
if debug_solver:
opts['CVode_options']['clock_step'] = True
if debug_solver:
opts["logging"] = True #<- Turn on solver debug logging
mod.set("_log_level", 4)
######################################################################
# Simulate
if opts['solver'].lower() != 'cvode' or abs(rtol-1E-6) > 1E-12:
print(f"Solver is {opts['solver']}, {rtol}")
if math.isnan(final_time):
res = mod.simulate(options=opts)
else:
res = mod.simulate(options=opts, final_time=final_time)
|
| Log message |
...
der(pumPreHea.filter.s[2])
der(conFanSupCol.con.I.y)
der(conPreHeatCoi.preHeaCoiCon.I.y)
der(conTMix.I.y)
Integrator time: 2.020292e+04
|