Zoltan2
ErrorHandlingForTests.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Zoltan2: A package of combinatorial algorithms for scientific computing
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Karen Devine (kddevin@sandia.gov)
39 // Erik Boman (egboman@sandia.gov)
40 // Siva Rajamanickam (srajama@sandia.gov)
41 //
42 // ***********************************************************************
43 //
44 // @HEADER
45 
46 #ifndef ERRORHANDLINGFORTESTS_HPP
47 #define ERRORHANDLINGFORTESTS_HPP
48 
49 #include <Zoltan2_config.h>
50 #include <iostream>
51 #include <string>
52 #include <exception>
53 
54 #include <Teuchos_RCP.hpp>
55 #include <Teuchos_Comm.hpp>
56 #include <Teuchos_CommHelpers.hpp>
57 
58 using Teuchos::RCP;
59 using Teuchos::Comm;
60 using Teuchos::reduceAll;
61 
62 #ifdef HAVE_ZOLTAN2_MPI
63 
64 #define TEST_FAIL_AND_THROW(comm, ok, s){ \
65 int gval, lval=( (ok) ? 0 : 1); \
66 reduceAll<int,int>(comm, Teuchos::REDUCE_SUM, 1, &lval, &gval);\
67 if (gval){ \
68  throw std::runtime_error(std::string(s)); \
69 } \
70 }
71 
72 #define TEST_FAIL_AND_EXIT(comm, ok, s, code){ \
73 int gval, lval=( (ok) ? 0 : 1); \
74 reduceAll<int,int>(comm, Teuchos::REDUCE_SUM, 1, &lval, &gval);\
75 if (gval){ \
76  if ((comm).getRank() == 0){\
77  std::cerr << "Error: " << s << std::endl;\
78  std::cout << "Error: " << s << std::endl;\
79  std::cout << "FAIL" << std::endl;\
80  } \
81  exit(code);\
82 } \
83 }
84 
85 #define TEST_FAIL_AND_RETURN(comm, ok, s){ \
86 int gval, lval=( (ok) ? 0 : 1); \
87 reduceAll<int,int>(comm, Teuchos::REDUCE_SUM, 1, &lval, &gval);\
88 if (gval){ \
89  if ((comm).getRank() == 0){\
90  std::cerr << "Error: " << s << std::endl;\
91  std::cout << "Error: " << s << std::endl;\
92  std::cout << "FAIL" << std::endl;\
93  } \
94  return; \
95 } \
96 }
97 
98 #define TEST_FAIL_AND_RETURN_VALUE(comm, ok, s, rc){ \
99 int gval, lval=( (ok) ? 0 : 1); \
100 reduceAll<int,int>(comm, Teuchos::REDUCE_SUM, 1, &lval, &gval);\
101 if (gval){ \
102  if ((comm).getRank() == 0){\
103  std::cerr << "Error: " << s << std::endl;\
104  std::cout << "Error: " << s << std::endl;\
105  std::cout << "FAIL" << std::endl;\
106  } \
107  return (rc); \
108 } \
109 }
110 
111 #else
112 
113 #define TEST_FAIL_AND_THROW(comm, ok, s) \
114 if (!(ok)){ \
115  throw std::runtime_error(std::string(s)); \
116 }
117 
118 #define TEST_FAIL_AND_EXIT(comm, ok, s, code) \
119 if (!(ok)){ \
120  std::cerr << "Error: " << s << std::endl;\
121  std::cout << "Error: " << s << std::endl;\
122  std::cout << "FAIL" << std::endl;\
123  exit(code);\
124 }
125 
126 #define TEST_FAIL_AND_RETURN(comm, ok, s) \
127 if (!(ok)){ \
128  std::cerr << "Error: " << s << std::endl;\
129  std::cout << "Error: " << s << std::endl;\
130  std::cout << "FAIL" << std::endl;\
131  return;\
132 }
133 
134 #define TEST_FAIL_AND_RETURN_VALUE(comm, ok, s, rc) \
135 if (!(ok)){ \
136  std::cerr << "Error: " << s << std::endl;\
137  std::cout << "Error: " << s << std::endl;\
138  std::cout << "FAIL" << std::endl;\
139  return (rc);\
140 }
141 #endif
142 
143 int globalFail(const RCP<const Comm<int> > &comm, int fail)
144 {
145  int gfail=0;
146  reduceAll<int,int>(*comm, Teuchos::REDUCE_SUM, 1, &fail, &gfail);
147  return gfail;
148 }
149 
150 void printFailureCode(const RCP<const Comm<int> > &comm, int fail)
151 {
152  int rank = comm->getRank();
153  int nprocs = comm->getSize();
154  comm->barrier();
155  for (int p=0; p < nprocs; p++){
156  if (p == rank)
157  std::cout << rank << ": " << fail << std::endl;
158  comm->barrier();
159  }
160  comm->barrier();
161  if (rank==0) std::cout << "FAIL" << std::endl;
162  exit(1);
163 }
164 
165 #endif
int globalFail(const RCP< const Comm< int > > &comm, int fail)
void printFailureCode(const RCP< const Comm< int > > &comm, int fail)