IFPACK  Development
 All Classes Files Functions Variables Enumerations Friends
Timer_dh.h
00001 /*@HEADER
00002 // ***********************************************************************
00003 //
00004 //       Ifpack: Object-Oriented Algebraic Preconditioner Package
00005 //                 Copyright (2002) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 //@HEADER
00041 */
00042 
00043 #ifndef TIMER_DH_H
00044 #define TIMER_DH_H
00045 
00046 #include "euclid_common.h"
00047 
00048 /*--------------------------------------------------------------*/
00049 /* Stuff in this block isn't really needed for multi-processor
00050  * runs, since recording CPU time probably isn't useful.
00051  * if EUCLID_TIMING is defined in $PCPACK_DIR/bmake_XXX/common,
00052  * the times() function is used;
00053  * then MPI_Wtime() is used in preference to times().
00054  *
00055  * You may need to fiddle with some of these includes, depending
00056  * on your system.  Make sure and check the logFile to ensure
00057  * that CLK_TCK was properly defined.  See Timer_dhCreate()
00058  * for additional details. 
00059  *
00060  * if "JUNK_TIMING" is defined during compilation, timing functions
00061  * either do nothing, or return -1.0; this is primarily for debugging.
00062  */
00063 
00064 #ifdef EUCLID_TIMING
00065 #include <sys/times.h>
00066 #include <sys/types.h>
00067 #if HAVE_UNISTD_H
00068 #  include <unistd.h>
00069 #endif /* HAVE_UNISTD_H */
00070 
00071 #elif !defined(JUNK_TIMING)
00072 /* #include <sys/types.h> 
00073 #include <sys/sysconfig.h>
00074 */
00075 #ifdef WIN32
00076 #  include <time.h>
00077 #endif
00078 #if HAVE_UNISTD_H
00079 #  include <unistd.h>       /* needed for sysconf(_SC_CLK_TCK) */
00080 #endif /* HAVE_UNISTD_H */
00081 #endif
00082 
00083 
00084 /* 
00085    ??? may be needed for some compilers/platforms?
00086 #include <limits.h>
00087 #include <time.h>
00088 #include <sys/resource.h>
00089 */
00090 
00091 /*--------------------------------------------------------------*/
00092 
00093 #ifdef __cplusplus
00094 extern "C"
00095 {
00096 #endif
00097 
00098   struct _timer_dh
00099   {
00100     bool isRunning;
00101     long int sc_clk_tck;
00102     double begin_wall;
00103     double end_wall;
00104 
00105 #ifdef EUCLID_TIMING
00106     struct tms begin_cpu;
00107     struct tms end_cpu;
00108 #endif
00109 
00110   };
00111 
00112   extern void Timer_dhCreate (Timer_dh * t);
00113   extern void Timer_dhDestroy (Timer_dh t);
00114   extern void Timer_dhStart (Timer_dh t);
00115   extern void Timer_dhStop (Timer_dh t);
00116   extern double Timer_dhReadCPU (Timer_dh t);
00117   extern double Timer_dhReadWall (Timer_dh t);
00118   extern double Timer_dhReadUsage (Timer_dh t);
00119 
00120 /* notes:
00121     (1)  unless compiled with EUCLID_TIMING defined, readCPU 
00122          and readUseage return -1.0.
00123     (2)  whenever start() is called, the timer is reset; you
00124          don't need to call stop() first.
00125     (3)  if stop() HAS been called, the readXX functions return
00126          timings between start() and stop(); , if start()
00127          was called but not stop(), they sample the time then
00128          return; if start() was never called, they return junk.
00129 */
00130 
00131 #ifdef __cplusplus
00132 }
00133 #endif
00134 
00135 #endif
 All Classes Files Functions Variables Enumerations Friends