Example: Building a Simulation Process Flow

This example is built to perform a Monte Carlo exploration of a design space, but the Monte Carlo simulation process flow is empty (no components exist to evaluate design points). These are created by model customization. Each line of the root file parameter, Spring Formulae, is an equation. This example uses the file DynamicComps.zmf.

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.