The following customization script creates calculations (Calculator components) for these equations and integrates them into the simulation process flow:
# CREATE CALCULATOR COMPONENTS FOR ALL EQUATIONS:
#----------------------------------------------------------------
---------------
# PREPARATIONS:
# [make some short aliases for various constants]
type = EsiTypes.REAL
role = Variable.ROLE_PARAMETER
imode = Variable.MODE_INPUT
omode = Variable.MODE_OUTPUT
calcMMName = "com.engineous.component.Calculator"
# Initially this MonteCarlo component has random variables but no
responses.
# Get the random variables before creating responses so they can
be cloned in
# all of the Calculations created for the workflow:
# [Note: Component also has an output: MonteCarlo Results. Must
filter]
inputsList = []
for var in component.getParameterList():
if var.getMode() == Variable.MODE_INOUT:
inputsList.append(var)
# [The API supplies a scratch Plan object which must be stored
when done:
component_api.initialize(component)
plan = component_api.getMonteCarloPlan()
#----------------------------------------------------------------
---------------
# READ THE EQUATIONS FROM THE FORMULAE FILE PARAMETER:
from java.io import InputStreamReader
from java.io import BufferedReader
problemDef =
VariableUtil.openFileVariableInputStream(data.get("Spring
Formulae"))
lineReader = BufferedReader(InputStreamReader(problemDef))
nresp = 0
while lineReader.ready():
# GET THE NEXT FORMULA:
formula = lineReader.readLine().lstrip()
if formula is None: break
if formula == "" or formula.strip().find('#') == 0: continue
# ADD THE RHS VAR OF THE FORMULA AS AN MCS RESPONSE:
assert formula.find('=') > 1, "Not an assignment : " +
formula
respName = (formula.split('='))[0].strip()
response =
DtModelManager.createScalarVariable(respName,type,role,omode,
None,None)
component.addParameter(response)
plan.addResponse(VariableReference(response))
# INSERT A CALCULATION FOR THIS FORMULA IN THE WORKFLOW:
calcName = "Calculate " + respName
calcComp =
DtModelManager.createComponent(calcMMName,calcName)
component.addComponent(calcComp)
component.addControlFlow(DtModelManager.createControlFlow(None,ca
lcComp))
component.addControlFlow(DtModelManager.createControlFlow(calcCom
p,None))
# FINISH DEFINING THE CALCULATION FROM THE FORMULA:
for randVar in inputsList:
calcInput = randVar.clone()
calcInput.setMode(imode)
calcComp.addParameter(calcInput)
component.addDataFlow(DtModelManager.createDataFlow(randVar,calcI
nput))
calcOutput = response.clone()
calcComp.addParameter(calcOutput)
component.addDataFlow(DtModelManager.createDataFlow(calcOutput,re
sponse))
calcComp.getProperty("expression").getValueObj().setValue(formula
)
nresp += 1
lineReader.close()
assert nresp > 0, "Customization file Spring Formulae was empty"
# THE MCS PLAN IS NOT CONFIGURED UNTIL THIS CALL IS MADE:
component_api.apply()
The Monte Carlo script results are shown below.
The script also gets the named outputs from the equations and creates output parameters of those names, marking them as MonteCarlo Responses (for simplicity, all input parameters are predefined). Note: Since there are no dependencies between the equations, it is easiest to construct a parallel simulation process flow. | |||||||