RTOpPack: Extra C/C++ Code for Vector Reduction/Transformation Operators Version of the Day
RTOp_TOp_axpy.c
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 // This library is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Lesser General Public License as
00013 // published by the Free Software Foundation; either version 2.1 of the
00014 // License, or (at your option) any later version.
00015 //  
00016 // This library is distributed in the hope that it will be useful, but
00017 // WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 // Lesser General Public License for more details.
00020 //  
00021 // You should have received a copy of the GNU Lesser General Public
00022 // License along with this library; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00024 // USA
00025 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 
00026 // 
00027 // ***********************************************************************
00028 // @HEADER
00029 */
00030 
00031 #include "RTOp_TOp_axpy.h"
00032 #include "RTOp_obj_value_vtbl.h"
00033 #include "RTOp_obj_null_vtbl.h"
00034 
00035 /* Implementation functions for RTOp_RTOp */
00036 
00037 static int RTOp_TOp_axpy_apply_op(
00038   const struct RTOp_RTOp_vtbl_t* vtbl, const void* obj_data
00039   , const int num_vecs, const struct RTOp_SubVector vecs[]
00040   , const int num_targ_vecs, const struct RTOp_MutableSubVector targ_vecs[]
00041   , RTOp_ReductTarget targ_obj )
00042 {
00043   RTOp_value_type alpha;
00044   RTOp_index_type        z_sub_dim;
00045   RTOp_value_type        *z_val;
00046   ptrdiff_t              z_val_s;
00047   RTOp_index_type        v0_sub_dim;
00048   const RTOp_value_type  *v0_val;
00049   ptrdiff_t              v0_val_s;
00050   register RTOp_index_type k;
00051   RTOp_value_type *z_val_tmp = NULL;
00052 #ifdef RTOp_DEBUG
00053   RTOp_index_type i;
00054 #endif
00055 
00056   /* */
00057   /* Validate the input */
00058   /* */
00059   if( num_vecs != 1 || vecs == NULL )
00060     return RTOp_ERR_INVALID_NUM_VECS;
00061   if( num_targ_vecs != 1 || targ_vecs == NULL )
00062     return RTOp_ERR_INVALID_NUM_TARG_VECS;
00063   if( targ_vecs[0].sub_dim != vecs[0].sub_dim )
00064     return RTOp_ERR_INCOMPATIBLE_VECS;
00065 
00066   /* */
00067   /* Get pointers to data */
00068   /* */
00069 
00070   /* alpha */
00071   alpha = *((RTOp_value_type*)obj_data);
00072 
00073   /* z */
00074   z_sub_dim      = targ_vecs[0].sub_dim;
00075   z_val          = targ_vecs[0].values;
00076   z_val_s        = targ_vecs[0].values_stride;
00077 
00078   /* v1 */
00079   v0_sub_dim     = vecs[0].sub_dim;
00080   v0_val         = vecs[0].values;
00081   v0_val_s       = vecs[0].values_stride;
00082 
00083   z_val_tmp = z_val;
00084 
00085   /* */
00086   /* Perform the operation */
00087   /* */
00088 
00089   /* Dense vector v[0] */
00090   if( z_val_s == 1 && v0_val_s == 1 ) {
00091     /* Slightly faster loop for unit stride vectors */
00092     for( k = 0; k < z_sub_dim; ++k )
00093       *z_val++ += alpha * (*v0_val++);
00094   }
00095   else {
00096     /* More general implementation for one or both non-unit strides */
00097     for( k = 0; k < z_sub_dim; ++k, z_val += z_val_s, v0_val += v0_val_s )
00098       *z_val += alpha * (*v0_val);
00099   }
00100 
00101   return 0; /* success? */
00102 }
00103 
00104 /* Virtual function table */
00105 const struct RTOp_RTOp_vtbl_t RTOp_TOp_axpy_vtbl =
00106 {
00107   &RTOp_obj_value_vtbl /* use simple scalar value type for object instance data */
00108   ,&RTOp_obj_null_vtbl /* use null type for target object */
00109   ,"TOp_axpy"
00110   ,NULL /* use default from reduct_vtbl */
00111   ,RTOp_TOp_axpy_apply_op
00112   ,NULL
00113   ,NULL
00114 };
00115 
00116 /* Class specific functions */
00117 
00118 int RTOp_TOp_axpy_construct( RTOp_value_type alpha, struct RTOp_RTOp* op )
00119 {
00120   op->vtbl = &RTOp_TOp_axpy_vtbl;
00121   op->vtbl->obj_data_vtbl->obj_create(NULL,NULL,&op->obj_data);
00122   *((RTOp_value_type*)op->obj_data) = alpha;
00123   return 0; /* success? */
00124 }
00125 
00126 int RTOp_TOp_axpy_destroy( struct RTOp_RTOp* op )
00127 {
00128   op->vtbl->obj_data_vtbl->obj_free(NULL,NULL,&op->obj_data);
00129   op->vtbl      = NULL;
00130   return 0; /* success? */
00131 }
00132 
00133 int RTOp_TOp_axpy_set_alpha( RTOp_value_type alpha, struct RTOp_RTOp* op )
00134 {
00135   *((RTOp_value_type*)op->obj_data) = alpha;
00136   return 0; /* success? */
00137 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends