MOOCHO (Single Doxygen Collection) Version of the Day
RTOp_apply_op_serial.c
Go to the documentation of this file.
00001 /*
00002 // @HEADER
00003 // ***********************************************************************
00004 // 
00005 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
00006 //                  Copyright (2003) Sandia Corporation
00007 // 
00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009 // license for use of this work by or on behalf of the U.S. Government.
00010 // 
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 
00039 // 
00040 // ***********************************************************************
00041 // @HEADER
00042 */
00043 
00044 /* ////////////////////////////////////////////////////////////// */
00045 /* RTOp_apply_op_serial.c */
00046 
00047 #include "RTOp_apply_op_serial.h"
00048 
00049 #include <stdlib.h>
00050 
00051 int RTOp_apply_op_serial(
00052   RTOp_index_type full_dim
00053   ,const int      num_vecs,  const RTOp_value_type*      vec_ptrs[],  const ptrdiff_t      vec_strides[]
00054   ,const int num_targ_vecs,  RTOp_value_type*       targ_vec_ptrs[],  const ptrdiff_t targ_vec_strides[]
00055   ,const RTOp_index_type first_ele_in, const RTOp_index_type sub_dim_in, const RTOp_index_type global_offset_in
00056   ,const struct RTOp_RTOp* op
00057   ,RTOp_ReductTarget reduct_obj
00058   )
00059 {
00060   int                          err            = 0;
00061   RTOp_index_type              sub_dim        = 0;
00062   struct RTOp_SubVector        *sub_vecs      = NULL;
00063   struct RTOp_MutableSubVector *targ_sub_vecs = NULL;
00064   int                          k;
00065   /* Sort out the input and get the number of vector elements to operator over */
00066 #ifdef RTOp_DEBUG
00067   assert( num_vecs || num_targ_vecs );
00068   if(num_vecs)
00069     assert( vec_ptrs != NULL );
00070   if(num_targ_vecs)
00071     assert( targ_vec_ptrs != NULL );
00072   assert( 0 <= sub_dim_in && sub_dim_in <= full_dim );
00073 #endif
00074   sub_dim = sub_dim_in ? sub_dim_in : full_dim - (first_ele_in - 1); /* Dimension of logical vectors */
00075   /* Create the sub-vector data structures */
00076   if(num_vecs) {
00077     sub_vecs = malloc( sizeof(struct RTOp_SubVector) * num_vecs );
00078     for( k = 0; k < num_vecs; ++k ) {
00079 #ifdef RTOp_DEBUG
00080       assert( vec_ptrs[k] != NULL );
00081 #endif
00082       RTOp_sub_vector(
00083         global_offset_in
00084         ,sub_dim
00085         ,vec_ptrs[k] + (first_ele_in -1) * vec_strides[k]
00086         ,vec_strides[k]
00087         ,&sub_vecs[k]
00088         );
00089     }
00090   }
00091   if(num_targ_vecs) {
00092     targ_sub_vecs = malloc( sizeof(struct RTOp_MutableSubVector) * num_targ_vecs );
00093     for( k = 0; k < num_targ_vecs; ++k ) {
00094 #ifdef RTOp_DEBUG
00095       assert( targ_vec_ptrs[k] != NULL );
00096 #endif
00097       RTOp_mutable_sub_vector(
00098         global_offset_in
00099         ,sub_dim
00100         ,targ_vec_ptrs[k] + (first_ele_in -1) * targ_vec_strides[k]
00101         ,targ_vec_strides[k]
00102         ,&targ_sub_vecs[k]
00103         );
00104     }
00105   }
00106   /* Apply the reduction/transformation operator in one chunk */
00107   err = RTOp_apply_op( op, num_vecs, sub_vecs, num_targ_vecs, targ_sub_vecs, reduct_obj );
00108   /* Free the sub-vector data structures */
00109   if(      sub_vecs ) free(      sub_vecs );
00110   if( targ_sub_vecs ) free( targ_sub_vecs );
00111 
00112   return err;  /* This could be an error code! */
00113 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines