A python library for generating PDF XDSM diagrams.
Switch branches/tags
Nothing to show
Clone or download
Latest commit 46ddc64 Oct 22, 2018



A python library for generating publication quality PDF XDSM diagrams. This library is a thin wrapper that uses the TIKZ library and LaTeX to build the PDFs.


Clone this repo or download the zip and unzip it.

cd pyxdsm
pip install .


What is XDSM?

The eXtended Design Struture Matrix (XDSM) is a graphical language for describing the movement of data and the execution sequence for a multidisciplinary optimization problem. You can read the paper by Lambe and Martins for all the details. If you would like a citation for XDSM, here is the bibtex for that paper:

@article {Lambe2012,
title = {Extensions to the Design Structure Matrix for the Description of Multidisciplinary Design, Analysis, and Optimization Processes},
journal = {Structural and Multidisciplinary Optimization},
volume = {46},
year = {2012},
pages = {273-284},
doi = {10.1007/s00158-012-0763-y},
author = {Andrew B. Lambe and Joaquim R. R. A. Martins}

TIKZ and LaTeX?

You need to install these libraries for pyXDSM to work. See the install guide for your platform

How do I use it?

Here is a simple example. There are some other more advanced things you can do as well. Check out the examples folder

from pyxdsm.XDSM import XDSM

opt = 'Optimization'
solver = 'MDA'
comp = 'Analysis'
group = 'Metamodel'
func = 'Function'

x = XDSM()

x.add_system('opt', opt, r'\text{Optimizer}')
x.add_system('solver', solver, r'\text{Newton}')
x.add_system('D1', comp, r'D_1')
x.add_system('D2', comp, r'D_2')
x.add_system('F', func, r'F')
x.add_system('G', func, r'G')

x.connect('opt', 'D1', r'x, z')
x.connect('opt', 'D2', r'z')
x.connect('opt', 'F', r'x, z')
x.connect('solver', 'D1', r'y_2')
x.connect('solver', 'D2', r'y_1')
x.connect('D1', 'solver', r'\mathcal{R}(y_1)')
x.connect('solver', 'F', r'y_1, y_2')
x.connect('D2', 'solver', r'\mathcal{R}(y_2)')
x.connect('solver', 'G', r'y_1, y_2')

x.connect('F', 'opt', r'f')
x.connect('G', 'opt', r'g')

x.add_output('opt', r'x^*, z^*', side='left')
x.add_output('D1', r'y_1^*', side='left')
x.add_output('D2', r'y_2^*', side='left')
x.add_output('F', r'f^*', side='left')
x.add_output('G', r'g^*', side='left')


This will output mdf.tex, a standalone tex document that (by default) is also compiled to mdf.pdf.

More complicated example

Here is an example that uses a whole bunch of the more advanced features in pyXDSM. Its mostly just a reference for all the customizations you can do. The code for this is in the examples folder

XDSM of With all the bells and whistles

Embedding the diagram directly in LaTeX

In addition, the file, mdf.tikz, can be embedded in another tex file using the \input command:

  \caption{Example of an MDF XDSM.}

The following is required to be in the preamble of the document: