simplifies the load-balancing, data movement, unstructured-communica- tion, and memory usage difficulties that arise in dynamic applications such as adaptive finite-element methods, parti- cle methods, and crash simulations. Zoltan’s data-structure-neutral design also lets a wide range of applications use it without imposing restrictions on ap- plication data structures. Its object- based interface provides a simple and inexpensive way for application devel- opers to use the library and researchers to make new capabilities available under a common interface. Zoltan provides tools that help appli- cation developers without imposing strict requirements on them. For exam- ple, it includes a suite of parallel parti- tioning algorithms and data migration tools that redistribute data to reflect, say, changing processor workloads. Zoltan also includes distributed data di- rectories and unstructured communica- tion services that let applications per- form complicated communication using only a few simple primitives. To simplify debugging of dynamic memory usage, Zoltan provides dynamic memory man- agement tools that enhance common memory allocation functions. In this ar- ticle, we describe Zoltan’s features and ways to use it in dynamic applications. Zoltan software design Our design of the Zoltan library does not restrict it to any particular type of application. Rather, Zoltan operates on uniquely identifiable data items that we call objects. For example, in finite-ele- ment applications, objects might be el- ements or nodes of the mesh. In parti- cle applications, objects might be particles. In linear solvers, objects might be matrix rows. Each object must have a unique global identifier (ID) represented as an array of un- signed integers. Common choices in- clude global numbers for elements (nodes, rows, particles, and so on) that already exist in many applications, or a structure consisting of an owning processor number and the object’s lo- cal-memory index. Objects might also have local (to a processor) IDs that do not have to be unique globally. Local IDs such as addresses or local-array in- dices of objects can improve the per- formance (and convenience) of Zoltan’s interface to applications. To make Zoltan easy to use, we do not impose any particular data struc- ture on an application, nor do we re- quire an application to build a particu- lar data structure for Zoltan. Instead, Zoltan uses a callback function inter- face in which the tool queries the ap- plication for needed data. The applica- tion must provide simple functions that answer these queries. For example, Figure 1 shows how Zoltan’s callback function interface works for performing dynamic load bal- ancing in an application. An application starts Zoltan (Zoltan_Initialize) and allocates the memory it needs (Zoltan_Create). Through calls to Zoltan_Set_Fn, the application passes pointers to its callback functions to Zoltan. It also selects a partitioning method (Zoltan_LB_Set_Method) and sets appropriate parameters for load balancing(Zoltan_LB_Set_Param). Then, within the main computation loop, the application calls Zoltan_LB_ Balance to compute a new partition of its data. As a first step in Zoltan_LB_Bal- ance, Zoltan must build the data struc- tures needed for the particular parti- tioning method selected. It calls the 90 1521-9615/02/$17.00 © 2002 COMPUTING IN SCIENCE & ENGINEERING ZOLTAN DATA MANAGEMENT SERVICES FOR P ARALLEL DYNAMIC APPLICATIONS By Karen Devine, Erik Boman, Robert Heaphy, Bruce Hendrickson, and Courtenay Vaughan T HE ZOLTAN LIBRARY IS A COLLECTION OF DATA MANAGE- MENT SERVICES FOR PARALLEL, UNSTRUCTURED, ADAP- TIVE, AND DYNAMIC APPLICATIONS THAT IS AVAILABLE AS OPEN- SOURCE SOFTWARE FROM WWW.CS.SANDIA.GOV/ZOLTAN. IT Editor: Paul F. Dubois, paul@pfdubois.com PROGRAMMING S CIENTIFIC P ROGRAMMING Zoltan Details The Zoltan library’s toolkit includes parallel partitioning algorithms, data migration tools, distributed directo- ries, and unstructured communica- tion and memory management packages. It has many key features for developers: Its source code is freely available at www.cs.sandia.gov/Zoltan. It’s callable from C, C++, and F90 (but is implemented in C). It uses MPI communication.