The PUMI flow solver has been developed at CIMNE in order to address the need for fast solutions of the flow field around complex geometries. Nowadays calculations involving a number of cells on the order of tens of millions are performed routinely. PUMI was created to deal with this kind of large-scale problem using modest hardware, therefore special emphasis was placed on the computational efficiency of the code. Design guidelines where minimum memory requirement, very fast single-threaded performance as well as satisfactory parallel scaling up to a moderate number of threads (as found on current entry-level SMP workstations). In order to simplify the mesh generation activities an unstructured finite element formulation was selected. This paper describes the theoretical basis of the algorithm as well as details of the implementation that increase the robustness and efficiency of the code.