Tutorial Title


  • This file will describe the basic steps/pathway that happens after hitting the compile button on a Constitutive model which includes a dynamic variable tied to an Active Tension model.

The Compile Button

  • You want to compile the Constitutive model, after submitting the corresponding Active Tension (AT) model.
  • The compile button is at: pcty/client/forms/MatModelForm.py, when hit, it runs the generateCode method within the same file.


  • This is the controlling method that handles source code generation, the steps it takes are:
    • Parses equation meta data file, after moving it to a temp directory, for the Constitutive model and assigns the variables and equations to individual lists. (parse_table_file from sympy_to_c.py handles the parsing). We then have the following lists: scalar, vector, tensor, dynamic_vars, rpars, and equations.
    • The variable name mapping is as follows:
      • Eqn Editor Name(s)

        List Name



        Dependent and tensor


        Dynamic or time_dependent





        vector - currently hard coded as: ['rpar_mat', 'rpar_at', 'y']

    • If we find any dynamic variables within the Constitutive model, we then get the other model's variables and equations, which is handled in the GenDynamics class, found in pcty/client/biomechanicsCommands.py, and add them to the appropriate list

      • updateVariables or stateVariables or rparDynamicVariables

    • Once we have all the variables and equations, generate the C code, done via generate_c method, found in src/csrc/strain_energy/sympy_to_c.py

  • The end result of all of this is that we now have a file: src/csrc/strain_energy/strain_energy.cpp, that has 3 main functions:
    • cpu_advance_be_mech1 - which is the partial update model code based on the AT model (i.e., does not contain the update vars)
    • p_strain_energy -
    • p_strain_energy_output -


  • This class (found in pcty/client/biomechanicsCommands.py), handles getting the variables and equations from the currently submitted Active Tension (AT) model and getting the AT model code ready to be included with the Constitutive model.
    • Get the currently submitted AT model, and it's variables (as defined from it's meta file)
    • Pass the variables to EPSympyGenerator class in pcty/client/forms/EPSympyGenerator.py, which creates the header, constants and equations from the variable meta data file, basically turns the meta file into python code.

    • Calls rawCompileDynamics method from pcty/server/utils/IonicBuildSympy.c, which removes and then re-creates the dynamicData.pickle file and the helper and update code (i.e., ode_model_model_pert_delta_tweak_cpu_mech.c and odecusingle.so, respectively)


  • This method will assure that the dynamic model build will start from scratch and be re-initialized to be ready for use, the steps it takes are:
    • It writes out the dynamic model code (which is passed into it) to a local file named: src/ode_cuda/justmodel.py
    • Removes the old version of /src/ode_cuda/ode_model_model_pert_delta_tweak_cpu_mech.c
    • Then does the following:
      • Runs gen_sympy_model.py to generate a new dynamicData.pickle file containing dynamic variables (e.g., T_Active), and dynamic state variables (e.g., Lsi and Con). Reads in the sympy mode code (justmodel.py) and write out the model in C code (model_from_sympy.c).

      • Runs buildAndShow.py --norun --nobuild --dynamics to generate a new ode_model_model_pert_delta_tweak_cpu_mech.c file

      • Runs builsAndShow.py --norun again, and this time creates odecusingle.so, which will be used for the full update


  • Used for CUDA code generation and building of ODE models, there are various command line flags for this program
  • Creates a build_settings.py file which sets the build settings, not surprisingly
  • If the --dynamics flag is supplied when run (and it is for the first time from rawCompileDynamics) it generates code that is a partial update model, without the flag it generates code that is a full update model (e.g., the variable dSL_dt is only found in the full update model)


  • This is the main method used for converting sympy to C code, the steps it takes are:
    • Ensures there is some dynamic code available: src/ode_cuda/ode_model_model_pert_delta_tweak_cpu_mech.c (which is the partial update model generated by buildAndShow).
    • Calls gen_c_helper with list of variables and equations, which will handle changing the sympy code into C code, it calls it once when genOutputs = True and once when genOutputs = False.