Files
phasicFlow/thirdParty/Zoltan/src/lb/lb_set_method.c
2025-05-15 21:58:43 +03:30

300 lines
11 KiB
C

/*
* @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
*/
#ifdef __cplusplus
/* if C++, define the rest of this header file as extern C */
extern "C" {
#endif
#include "zz_const.h"
#include "zz_util_const.h"
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*
* This file contains routines to set the load-balancing method.
*/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
int Zoltan_LB_Set_LB_Method(ZZ *zz, char *method_name)
{
/*
* Function to set the load balancing method to be used.
* Input:
* zz -- The Zoltan structure to which this method
* applies.
* method_name -- String specifying the desired method.
*
* Output:
* zz->LB.* -- Appropriate fields set to designated values.
*/
char *yo = "Zoltan_LB_Set_LB_Method";
char msg[256];
char *method_upper;
int error = ZOLTAN_OK;
/*
* Compare method_name string with standard strings for methods.
* If a match is found, set zz->LB.Method and other pointers.
* But first free any left-over data from the previous method.
*/
if (zz->LB.Free_Structure != NULL)
zz->LB.Free_Structure(zz);
/*
* Convert method_name to all upper case.
* Do not change the original string.
*/
error = Zoltan_Clean_String(method_name, &method_upper);
if (error) {
ZOLTAN_PRINT_ERROR(zz->Proc, yo,
"Error returned from Zoltan_Clean_String; No method set.");
goto End;
}
strcpy(zz->LB.Method_Name, method_upper);
if (strcmp(method_upper, "BLOCK") == 0) {
zz->LB.Method = BLOCK;
zz->LB.LB_Fn = Zoltan_Block;
zz->LB.Free_Structure = NULL;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
}
else if (strcmp(method_upper, "CYCLIC") == 0) {
zz->LB.Method = CYCLIC;
zz->LB.LB_Fn = Zoltan_Cyclic;
zz->LB.Free_Structure = NULL;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
}
else if (strcmp(method_upper, "RANDOM") == 0) {
zz->LB.Method = RANDOM;
zz->LB.LB_Fn = Zoltan_Random;
zz->LB.Free_Structure = NULL;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
}
else if (strcmp(method_upper, "RCB") == 0) {
zz->LB.Method = RCB;
zz->LB.LB_Fn = Zoltan_RCB;
zz->LB.Free_Structure = Zoltan_RCB_Free_Structure;
zz->LB.Copy_Structure = Zoltan_RCB_Copy_Structure;
zz->LB.Serialize_Structure_Size = Zoltan_RCB_Serialize_Structure_Size;
zz->LB.Serialize_Structure = Zoltan_RCB_Serialize_Structure;
zz->LB.Deserialize_Structure = Zoltan_RCB_Deserialize_Structure;
zz->LB.Point_Assign = Zoltan_RB_Point_Assign;
zz->LB.Box_Assign = Zoltan_RB_Box_Assign;
}
else if (strcmp(method_upper, "OCTPART") == 0) {
ZOLTAN_PRINT_ERROR(zz->Proc, yo,
"OCTPART method is no longer supported in Zoltan; "
"Try LB_METHOD=HSFC for similar results.");
error = ZOLTAN_FATAL;
goto End;
}
else if (strcmp(method_upper, "GRAPH") == 0){
zz->LB.Method = GRAPH;
zz->LB.LB_Fn = Zoltan_Graph;
/* Next two are useful only when using PHG */
zz->LB.Free_Structure = Zoltan_PHG_Free_Structure;
zz->LB.Copy_Structure = Zoltan_PHG_Copy_Structure;
zz->LB.Serialize_Structure_Size =
Zoltan_Serialize_Structure_Size_Not_Implemented; /* TODO */
zz->LB.Serialize_Structure =
Zoltan_Serialize_Structure_Not_Implemented; /* TODO */
zz->LB.Deserialize_Structure =
Zoltan_Deserialize_Structure_Not_Implemented; /* TODO */
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
}
/* PARMETIS is here for backward compatibility.
* New way: LB_METHOD = GRAPH
* GRAPH_PACKAGE = PARMETIS or SCOTCH or PHG
*/
else if (strcmp(method_upper, "PARMETIS") == 0){
#ifdef ZOLTAN_PARMETIS
zz->LB.Method = GRAPH;
zz->LB.LB_Fn = Zoltan_ParMetis;
zz->LB.Free_Structure = NULL;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
#else
ZOLTAN_PRINT_ERROR(zz->Proc, yo,
"ParMETIS method selected but "
"ParMETIS not compiled into Zoltan.");
error = ZOLTAN_FATAL;
goto End;
#endif
}
else if (strcmp(method_upper, "REFTREE") == 0) {
zz->LB.Method = REFTREE;
zz->LB.LB_Fn = Zoltan_Reftree_Part;
zz->LB.Free_Structure = Zoltan_Reftree_Free_Structure;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
}
else if (strcmp(method_upper, "RIB") == 0) {
zz->LB.Method = RIB;
zz->LB.LB_Fn = Zoltan_RIB;
zz->LB.Free_Structure = Zoltan_RIB_Free_Structure;
zz->LB.Copy_Structure = Zoltan_RIB_Copy_Structure;
zz->LB.Serialize_Structure_Size =
Zoltan_Serialize_Structure_Size_Not_Implemented; /* TODO */
zz->LB.Serialize_Structure =
Zoltan_Serialize_Structure_Not_Implemented; /* TODO */
zz->LB.Deserialize_Structure =
Zoltan_Deserialize_Structure_Not_Implemented; /* TODO */
zz->LB.Point_Assign = Zoltan_RB_Point_Assign;
zz->LB.Box_Assign = Zoltan_RB_Box_Assign;
}
else if (strcmp(method_upper, "HSFC") == 0) {
zz->LB.Method = HSFC;
zz->LB.LB_Fn = Zoltan_HSFC;
zz->LB.Free_Structure = Zoltan_HSFC_Free_Structure;
zz->LB.Copy_Structure = Zoltan_HSFC_Copy_Structure;
zz->LB.Serialize_Structure_Size =
Zoltan_Serialize_Structure_Size_Not_Implemented; /* TODO */
zz->LB.Serialize_Structure =
Zoltan_Serialize_Structure_Not_Implemented; /* TODO */
zz->LB.Deserialize_Structure =
Zoltan_Deserialize_Structure_Not_Implemented; /* TODO */
zz->LB.Point_Assign = Zoltan_HSFC_Point_Assign;
zz->LB.Box_Assign = Zoltan_HSFC_Box_Assign;
}
else if ((strcmp(method_upper, "HYPERGRAPH") == 0)
|| (strcmp(method_upper, "PHG") == 0)){
/* HYPERGRAPH is a family of methods. */
/* PHG is Zoltan's standard parallel hypergraph partitioner. */
zz->LB.Method = HYPERGRAPH;
zz->LB.LB_Fn = Zoltan_PHG;
zz->LB.Free_Structure = Zoltan_PHG_Free_Structure;
zz->LB.Copy_Structure = Zoltan_PHG_Copy_Structure;
zz->LB.Serialize_Structure_Size =
Zoltan_Serialize_Structure_Size_Not_Implemented; /* TODO */
zz->LB.Serialize_Structure =
Zoltan_Serialize_Structure_Not_Implemented; /* TODO */
zz->LB.Deserialize_Structure =
Zoltan_Deserialize_Structure_Not_Implemented; /* TODO */
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
}
else if (strcmp(method_upper, "HIER") == 0) {
zz->LB.Method = HIER;
zz->LB.LB_Fn = Zoltan_Hier;
zz->LB.Free_Structure = Zoltan_Hier_Free_Structure;
zz->LB.Copy_Structure = Zoltan_Hier_Copy_Structure;
zz->LB.Serialize_Structure_Size =
Zoltan_Serialize_Structure_Size_Not_Implemented; /* TODO */
zz->LB.Serialize_Structure =
Zoltan_Serialize_Structure_Not_Implemented; /* TODO */
zz->LB.Deserialize_Structure =
Zoltan_Deserialize_Structure_Not_Implemented; /* TODO */
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
}
else if (strcmp(method_upper, "NONE") == 0) {
zz->LB.Method = NONE;
zz->LB.LB_Fn = NULL;
zz->LB.Free_Structure = NULL;
zz->LB.Copy_Structure = NULL;
zz->LB.Serialize_Structure_Size = NULL;
zz->LB.Serialize_Structure = NULL; /* Nothing to serialize in this method */
zz->LB.Deserialize_Structure = NULL;
zz->LB.Point_Assign = NULL;
zz->LB.Box_Assign = NULL;
}
/*
* SET OTHER METHODS HERE!!
*/
else {
sprintf(msg, "Invalid LB method specified: %s\n", method_name);
ZOLTAN_PRINT_ERROR(zz->Proc, yo, msg);
error = ZOLTAN_FATAL;
goto End;
}
if (zz->Proc == zz->Debug_Proc && zz->Debug_Level >= ZOLTAN_DEBUG_PARAMS) {
printf("ZOLTAN Load balancing method = %d (%s)\n",
zz->LB.Method, method_name);
}
End:
ZOLTAN_FREE(&method_upper);
return (error);
}
#ifdef __cplusplus
} /* closing bracket for extern "C" */
#endif