Projects
The research projects I worked on, and what I did in each. Below, the software that came out of them and my own work; each entry links to the one it grew out of.
Research projects
European and regional R&D projects I worked on, and what I did in each.

DiMAT 2023–2025 · Horizon Europe · participation from AMS
Digital modelling, simulation and optimisation tools for advanced materials.

HortiMED 2021–2022 · PRIMA (Horizon 2020) · University of Deusto
Greenhouses and aquaponics in the Mediterranean. My part: the modelling platform (climate, tomato crop, aquaponic and hydroponic systems) and predictive-control tasks.

AGRO-SOFC 2021–2022 · University of Deusto
Simulation of energy systems coupled to greenhouse models, with analyses of control parameters and consumption.
- CONVADP
CONVADP 2020–2021 · ELKARTEK · Chair of Computational Mathematics, Deusto
Selective harmonic modulation for multilevel converters using optimal-control methods, with a co-authored scientific publication.

DyCon 2018–2020 · ERC Advanced Grant · Chair of Computational Mathematics, University of Deusto
Control of dynamical systems, led by Enrique Zuazua. My part: the project's optimal-control software and its tutorials.
- PIBA-BLUE
PIBA-BLUE 2018–2019 · PIBA, Basque Government · DeustoTech Mobility
Indoor localisation. My part: the simulation platform used to evaluate the algorithms.
Software
Named tools I designed and built within those projects.

DyCon Toolbox
Grew out of DyCon (ERC Advanced Grant)
A MATLAB toolbox from the ERC DyCon project for nonlinear optimal control: derivatives by automatic differentiation (CasADi), the direct method with IPOPT and the indirect one with the adjoint. Documented, with published tutorials such as discrete waves on non-uniform meshes.
MATLAB · CasADi · IPOPT
HORTISIM
Grew out of HortiMED (PRIMA (Horizon 2020))
A Simulink library to assemble a greenhouse model from pieces: climate with energy, vapour and CO₂ balances, windows, screen, heating, fogging, tomato crop, substrate and irrigation, and aquaponic tanks.
MATLAB · Simulink
Own work
Simulations I build on my own, in the open, with an article, code and an in-browser viewer.

Inside a solid oxide fuel cell
Grew out of AGRO-SOFC
A 30-cell solid oxide fuel cell stack running on biogas, simulated in the browser: where its voltage comes from, what limits it and how much electricity and heat it delivers. Calibrated against public measurements, with its geometry in 3D.
JavaScript · React · Three.js · Python

Herding: from a heuristic to optimal control
Three dogs and 200 sheep as particle dynamics. The heuristic rule is compared with the trajectory obtained by minimising a cost with CasADi and IPOPT, side by side and on the same model: the optimum gets there with ten times less effort.
Python · CasADi · IPOPT · LAMMPS

A greenhouse built from pieces
Grew out of HORTISIM
The idea behind HORTISIM in the browser: cover, air, crop and soil as energy, vapour and CO₂ balances joined by flows, in a live diagram. The model is ported and validated against the original, with HortiMED weather data.
JavaScript · React Flow · Python

Harmonics on demand
Grew out of CONVADP (ELKARTEK)
Selective harmonic elimination as convex optimal control, solved in the browser, and the exact set of harmonics a staircase wave can reach. A continuation of the CONVADP line of work.
JavaScript · Python · Optimización convexa

Copper nanowire: from LAMMPS to the browser
A molecular dynamics tensile test up to fracture, with the EAM potential validated before measuring anything. Python exports the trajectory to a custom binary and a three.js viewer draws it live: 5780 atoms and 80 frames in 793 KiB.
LAMMPS · Python · three.js

A crane, face by face
An origami crane folded in the browser from a single sheet of 88 rigid faces, with the closure error of every step checked. It became Grullu, this site’s mascot.
TypeScript · Three.js · Geometría

A crack running through a crystal
Brittle fracture in a 2D Lennard-Jones crystal. Before breaking anything, the elastic constants are checked against the Born formula; afterwards, the tip speed against the Rayleigh speed. A 2D canvas viewer for ten thousand atoms per frame.
LAMMPS · Python · Canvas 2D
