The UPIC (UCLA Parallel PIC) Framework was developed about 15 years ago to provide trusted components for the rapid construction of new parallel PIC codes. The Idea was to provide libraries as well as reference PIC applications which illustrate their use and users would then enhance and customize these components (You-Pick) to build new codes. The focus was on high accuracy spectral methods. Message-passing was the primary parallelization method, but multi-tasking with pthreads was also supported.
Both electrostatic and electromagnetic codes were supported in 1d, 2d, and 3d, as well as some Darwin codes, with a variety of numerical methods and boundary conditions. The codes QuickPIC, QPIC, UPIC-Emma and others were built from these components. The software design was layered with the lowest layer in Fortran77. Higher layers in Fortran95 could either be procedural, using using wrappers, or object-based for more complex projects.
Since then, parallel programming has become increasingly complex, with 3 levels of parallelism required to obtain optimal performance on advanced architectures. Since most of the time is spent processing particles, it was important to solidify the data structures and algorithms needed for optimal particle processing before implementing a new framework. A variety of small skeleton PIC applications were developed to experiment with different levels of parallelism and programming models while maintaining portability as much as possible. In addition, Fortran2003 has many useful features for high performance scientific computing, including complete support for object-oriented programming and interoperability with C. We plan to expand beyond spectral methods and increasingly support mixed language programming. As the new data structures and algorithms converge, a new UPIC Framework is evolving for the 21st century.
The 2D and 3D components of the UPIC 2.0 framework are open source. They may be accessed on the public GitHub repository.
The latest version is UPIC 2.0.4. The major new features here are support for vectorization and Python. These codes can now be run with 3 levels of parallelism (Vector/MPI/OpenMP) or some subset. Python only supports Vector/OpenMP. UPIC 2.0.4 may be directly downloaded here: mpbeps2_204.tar.gz (2D) and mpbeps3_204.tar.gz (3D).
The 3rd version (UPIC 2.0.3) included the major new features of restart capabilities and particle diagnostics. Codes in this version and earlier can be compiled to run with 2 levels of parallelism (MPI/OpenMP) or OpenMP only. UPIC 2.0.3 may be directly downloaded here: mpbeps2_203.tar.gz (2D) and mpbeps3_203.tar.gz (3D).
The 2nd version (UPIC 2.0.2) included the major new features of namelist inputs, a full set of field diagnostics, and initialization with non-uniform densities. UPIC 2.0.2 may be directly downloaded here: mpbeps2_202.tar.gz (2D) and mpbeps3_202.tar.gz (3D).
The first version (UPIC 2.0.1) contained only the basic particle loop and field solvers, with a uniform plasma and no diagnostics except energy. UPIC 2.0.1 may be directly downloaded here: mpbeps2_201.tar.gz (2D) and mpbeps3_201.tar.gz (3D).