You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
11 KiB
228 lines
11 KiB
2 years ago
|
<!-------- @HEADER
|
||
|
!
|
||
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
|
!
|
||
|
! Zoltan Toolkit for Load-balancing, Partitioning, Ordering and Coloring
|
||
|
! Copyright 2012 Sandia Corporation
|
||
|
!
|
||
|
! Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||
|
! the U.S. Government retains certain rights in this software.
|
||
|
!
|
||
|
! Redistribution and use in source and binary forms, with or without
|
||
|
! modification, are permitted provided that the following conditions are
|
||
|
! met:
|
||
|
!
|
||
|
! 1. Redistributions of source code must retain the above copyright
|
||
|
! notice, this list of conditions and the following disclaimer.
|
||
|
!
|
||
|
! 2. Redistributions in binary form must reproduce the above copyright
|
||
|
! notice, this list of conditions and the following disclaimer in the
|
||
|
! documentation and/or other materials provided with the distribution.
|
||
|
!
|
||
|
! 3. Neither the name of the Corporation nor the names of the
|
||
|
! contributors may be used to endorse or promote products derived from
|
||
|
! this software without specific prior written permission.
|
||
|
!
|
||
|
! THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
|
||
|
! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
|
! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
|
||
|
! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
|
! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||
|
! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||
|
! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
!
|
||
|
! Questions? Contact Karen Devine kddevin@sandia.gov
|
||
|
! Erik Boman egboman@sandia.gov
|
||
|
!
|
||
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
|
!
|
||
|
! @HEADER
|
||
|
------->
|
||
|
|
||
|
<HTML>
|
||
|
<HEAD>
|
||
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||
|
<META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (X11; U; SunOS 4.1.3_U1 sun4m) [Netscape]">
|
||
|
<META NAME="sandia.approved" CONTENT="SAND99-1376">
|
||
|
<META NAME="author" CONTENT="lee ann fisk, lafisk@sandia.gov">
|
||
|
|
||
|
<TITLE> Zoltan Developer's Guide: C++ Interface</TITLE>
|
||
|
</HEAD>
|
||
|
<BODY BGCOLOR="#FFFFFF">
|
||
|
|
||
|
<div ALIGN=right><b><i><a href="dev.html">Zoltan Developer's Guide</a> | <a href="dev_refs.html">Next</a> | <a href="dev_fortran.html">Previous</a></i></b></div>
|
||
|
|
||
|
|
||
|
<H2>
|
||
|
<A NAME="cpp dev"></A>C++ Interface</H2>
|
||
|
As with the Fortran interface just described, any change to the user
|
||
|
API of Zoltan should be reflected in the C++ interface. This section
|
||
|
explains the conventions used in the C++ interface, which you will want
|
||
|
to follow when you modify or expand it.
|
||
|
|
||
|
<UL><A HREF="#cpp dev classes">Classes</A><BR>
|
||
|
<A HREF="#cpp dev conventions">Programming Conventions</A>
|
||
|
<UL>
|
||
|
<A HREF="#cpp dev namespaces"><I>Namespaces</I></A><BR>
|
||
|
<A HREF="#cpp dev cnames"><I>Class names</I></A><BR>
|
||
|
<A HREF="#cpp dev mnames"><I>Method names</I></A><BR>
|
||
|
<A HREF="#cpp dev constmethods"><I>Const methods</I></A><BR>
|
||
|
<A HREF="#cpp dev parameters"><I>Declaration of method parameters</I></A><BR>
|
||
|
<A HREF="#cpp dev copy"><I>Copy constructor, copy operator</I></A>
|
||
|
</UL>
|
||
|
<A HREF="#cpp dev updating">Keeping the C++ interface up-to-date</A><BR>
|
||
|
</UL>
|
||
|
|
||
|
<H3> <A NAME="cpp dev classes"></A>Classes</H3>
|
||
|
The C language Zoltan library already observes the principles of
|
||
|
object oriented program design. Each sub function of Zoltan (load
|
||
|
balancing, timing, etc.) has a data structure
|
||
|
associated with it. This data structure maintains all the state required
|
||
|
for one instance of that sub function. Each request of the library for
|
||
|
some operation requires that data structure.
|
||
|
|
||
|
<P>The classes in the Zoltan C++ library follow the structure just described.
|
||
|
Each class is defined in a header
|
||
|
file and encapsulates a Zoltan data structure and the functions that
|
||
|
operate on that structure. A C++ application wishing to use a
|
||
|
feature of Zoltan, would include the feature's header file in it's source, and
|
||
|
link with the Zoltan C library.
|
||
|
|
||
|
<P>The C language load balancing data stucture
|
||
|
(<B><A HREF="dev_lb_structs.html#Zoltan_Struct">Zoltan_Struct</A></B>)
|
||
|
and the C functions that operate on it are accessed
|
||
|
through the C++ <B>Zoltan</B> class, defined in <I>zoltan_cpp.h</I>.
|
||
|
|
||
|
<P>The communication package is encapsulated the <B>Zoltan_Comm</B> class
|
||
|
defined in <I>zoltan_comm_cpp.h</I>.
|
||
|
Again, to use the communication utility of Zoltan from a C++ program,
|
||
|
include <I>zoltan_comm_cpp.h</I> and use the C++ methods defined there.
|
||
|
|
||
|
<P>The C++ Zoltan timer class is called <B>Zoltan_Timer_Object</B> and
|
||
|
is defined in <I>zoltan_timer_cpp.h</I>.
|
||
|
|
||
|
<P>The distributed directory utility of Zoltan is encapsulated in the
|
||
|
class <B>Zoltan_DD</B> defined in <I>zoltan_dd_cpp.h</I>
|
||
|
|
||
|
<H3> <A NAME="cpp dev conventions"></A>Programming Conventions</H3>
|
||
|
When modifying the interface to Zoltan , you will want to modify
|
||
|
the appropriate C++ header file accordingly. This section describes the
|
||
|
conventions to follow to maintain a consistent and correct library interface
|
||
|
for the C++ user of Zoltan.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev namespaces">Namespaces</A></I></H4>
|
||
|
In order to maintain portability across platforms, there is no Zoltan
|
||
|
namespace. Many C++ compilers do not support namespaces at this time.
|
||
|
The name of each Zoltan class begins with <B>Zoltan_</B>, and hopefully
|
||
|
this will never clash with another namespace.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev cnames">Class names</A></I></H4>
|
||
|
Class names are <B>Zoltan_</B> followed by text indicating the sub
|
||
|
function of Zoltan that is encapsulated by the class.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev mnames">Method names</A></I></H4>
|
||
|
Method names are derived from the C library function names in such a
|
||
|
way that the name will be obvious to a person familiar with the C library.
|
||
|
We remove the beginning of the C library name, the part that identifies
|
||
|
the subset of the Zoltan library that the function is part of, and keep
|
||
|
the last part of the C library name, the part that describes what the
|
||
|
function does. For example the C function <B>Zoltan_LB_Partition</B> becomes
|
||
|
the C++ method <B>LB_Partition</B> in the class <B>Zoltan</B> and
|
||
|
C function <B>Zoltan_Comm_Create</B> becomes the C++ method
|
||
|
<B>Create</B> in the class <B>Zoltan_Comm</B>.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev constmethods">Const methods</A></I></H4>
|
||
|
All class methods which can be declared <B>const</B>, because they
|
||
|
do not modify the object, should be declared <B>const</B>. This allows
|
||
|
C++ programmers to call these methods on their <B>const</B> objects.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev parameters">Declaration of method parameters</A></I></H4>
|
||
|
|
||
|
Parameters that are not changed in the method should be declared <B>const</B>.
|
||
|
This can get complicated, but it helps to read declarations from right to
|
||
|
left. <B>const int * & p</B> says <I>p is a reference to a pointer to
|
||
|
a const int</I> and means the method will not change the value pointed
|
||
|
to by <I>p</I>. On the other hand <B>int * const & p</B> says that
|
||
|
<I>p is a reference to a const pointer to int</I> so the method will
|
||
|
not change the pointer.
|
||
|
|
||
|
<P>Variables that are passed by value in a C function will be passed by
|
||
|
const reference in the C++ method. This is semantically the same, but
|
||
|
it is more efficient, and it will work with temporary variables created
|
||
|
by a compiler.
|
||
|
|
||
|
<P>If a C function takes a pointer to a single built-in type (not an aggregate
|
||
|
type), the associated C++ method will take a reference variable.
|
||
|
If a C function takes a pointer to a pointer, the C++ function will take
|
||
|
a pointer reference. The references are more efficient, and it is
|
||
|
the behavior a C++ programmer expects.
|
||
|
A pointer to an array remains a pointer to an array.
|
||
|
|
||
|
<P><TABLE rules=cols,rows frame=box align=center cellpadding=5>
|
||
|
<TR> <TH>C function parameter</TH> <TH>C++ method parameter</TH> <TH> method's const behavior</TR>
|
||
|
<TR> <TD>int val</TD>
|
||
|
<TD>const int &val</TD>
|
||
|
<TD>won't change value</TD></TR>
|
||
|
<TR> <TD>int *singlep</TD>
|
||
|
<TD>int &singlep <br> const int &singlep</TD>
|
||
|
<TD>may change value <br> won't change value</TD></TR>
|
||
|
<TR> <TD>int **singlep</TD>
|
||
|
<TD>int *&singlep <br> const int * &p <br> int *const &p <br> const int * const &p</TD>
|
||
|
<TD>may change pointer or value<br>won't change value<br>won't change pointer to value<br>won't change anything</TD></TR>
|
||
|
<TR> <TD>int *arrayp</TD>
|
||
|
<TD>int *arrayp <br> const int * arrayp</TD>
|
||
|
<TD>may change array contents <br> won't change array contents</TD> </TR>
|
||
|
</TABLE>
|
||
|
|
||
|
<P>If a C function takes a pointer to an array of <I>char</I>, the
|
||
|
associated C++ method will take a <I>string</I> object.
|
||
|
|
||
|
<P><TABLE rules=cols,rows frame=box align=center cellpadding=5>
|
||
|
<TR> <TH>C function parameter</TH> <TH>C++ method parameter</TH> </TR>
|
||
|
<TR> <TD>char *fname</TD> <TD>std::string &fname</TD> </TR>
|
||
|
</TABLE>
|
||
|
|
||
|
<P> In all honesty, it is tedious to carefully apply const'ness in
|
||
|
parameter declarations, and we did not do it consistently throughout the
|
||
|
C++ wrapping of Zoltan. Please feel free to add <I>const</I> declarations
|
||
|
where they belong, and try to use them correctly if you add or modify Zoltan
|
||
|
C++ methods.
|
||
|
|
||
|
<H4><I><A NAME="cpp dev copy">Copy constructor, copy operator</A></I></H4>
|
||
|
Each class should have a copy constructor and a copy operator.
|
||
|
|
||
|
|
||
|
<H3> <A NAME="cpp dev updating"></A>Keeping the C++ interface up-to-date</H3>
|
||
|
Here we provide a checklist of things to be done when the C interface to
|
||
|
the Zoltan library is changed:
|
||
|
|
||
|
<UL>
|
||
|
<LI>If a new major component is added to Zoltan, create a C++ class for
|
||
|
that component in a new header file, using the programming conventions
|
||
|
described above. </LI>
|
||
|
<LI>If functions are added or removed, or their parameter lists are
|
||
|
changed, then update the header file defining the class that contains
|
||
|
those functions.</LI>
|
||
|
<LI>When Zoltan data structures are changed, be sure to change the C functions
|
||
|
that copy the data structure. (They contain <B>Copy</B> in their name.)
|
||
|
Correct copying is more important in C++,
|
||
|
where the compiler may generate new temporary objects, than it is in C.</LI>
|
||
|
<LI>If you change the C++ API, be sure to change:
|
||
|
<UL>
|
||
|
<LI><B>zCPPdrive</B>, the test program for the Zoltan C++ library</LI>
|
||
|
<LI>the C++ examples in the <B>Examples</B> directory</LI>
|
||
|
<LI>the method prototypes in the <A HREF="../ug_html/ug.html">Zoltan User's Guide</A>.</LI>
|
||
|
</UL>
|
||
|
</UL>
|
||
|
|
||
|
<HR WIDTH="100%">
|
||
|
<BR>[<A HREF="dev.html">Table of Contents</A> | <A HREF="dev_refs.html">Next:
|
||
|
References</A> | <A HREF="dev_fortran.html">Previous:
|
||
|
FORTRAN Interface</A> | <a href="https://www.sandia.gov/general/privacy-security/index.html">Privacy and Security</a>]
|
||
|
</BODY>
|
||
|
</HTML>
|