# Build a discipline from a simple Python function¶

Let’s consider a simple Python function, e.g.:

def f(x=0., y=0.):
"""A simple Python function"""
z = x + 2*y
return z


Then, we can consider the AutoPyDiscipline to convert it into an MDODiscipline.

## Create and instantiate the discipline¶

For that, we can use the create_discipline() API function with AutoPyDiscipline as first argument:

from gemseo.api import create_discipline
from numpy import array

disc = create_discipline('AutoPyDiscipline', py_func=f)


The original Python function may or may not include default values for input arguments, however, if the resulting AutoPyDiscipline is going to be placed inside an MDF, a BiLevel formulation or an MDA with strong couplings, then the Python function must assign default values for its input arguments.

## Execute the discipline¶

Then, we can execute it easily, even considering default inputs:

print(disc.execute())


which results in:

{'y': array([ 0.]), 'x': array([ 0.]), 'z': array([ 0.])}


or using new inputs:

print(disc.execute({'x': array([1.]), 'y':array([-3.2])}))


which results in:

{'y': array([-3.2]), 'x': array([ 1.]), 'z': array([-5.4])}


## Optional arguments¶

Optional arguments are:

• py_jac=None: The Python function to compute the Jacobian which must return a 2D numpy array,

• use_arrays=False: if True, the function is expected to take arrays as inputs and give outputs as arrays,

• grammar_type=MDODiscipline.JSON_GRAMMAR_TYPE: The type of grammar to be used.

Here is an example of Jacobian function, returning a 2D matrix. The rows of the matrix correspond to the derivatives of the outputs, the columns correspond to the variables with respect to the outputs are derived.

def dzdxy(x=0., y=0.):
"""Jacobian function of z=f(x,y)"""
jac = array((1,2))
jac[0, 0] = 1.
jac[0, 1] = 2.
return jac