diff options
Diffstat (limited to 'src/Norm2Functions.c')
-rw-r--r-- | src/Norm2Functions.c | 822 |
1 files changed, 584 insertions, 238 deletions
diff --git a/src/Norm2Functions.c b/src/Norm2Functions.c index f5bc8b4..ef5a9b3 100644 --- a/src/Norm2Functions.c +++ b/src/Norm2Functions.c @@ -18,13 +18,18 @@ extern "C" { #endif -int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_BYTE(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -36,6 +41,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -43,51 +49,52 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -111,10 +118,12 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -126,6 +135,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -133,6 +143,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -155,10 +166,12 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -170,6 +183,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -178,6 +192,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -200,11 +215,14 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -216,6 +234,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -224,6 +243,7 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -246,11 +266,13 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_BYTE, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -262,21 +284,29 @@ int LocalReduce_Norm2_BYTE(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } -int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_INT(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -288,6 +318,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -295,51 +326,52 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -362,10 +394,12 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -377,6 +411,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -384,6 +419,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -406,10 +442,12 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -421,6 +459,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -429,6 +468,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -451,10 +491,13 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -466,6 +509,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -474,6 +518,7 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -496,10 +541,12 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -511,22 +558,30 @@ int LocalReduce_Norm2_INT(int i, int mask_on, CCTK_INT * input_array_offsets, in #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #ifdef CCTK_INT1 -int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_INT1(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -538,6 +593,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -545,51 +601,52 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT11 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT12 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT14 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT18 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -612,10 +669,12 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -627,6 +686,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -634,6 +694,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -656,10 +717,12 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -671,6 +734,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -679,6 +743,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -701,11 +766,14 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -717,6 +785,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -725,6 +794,7 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -747,11 +817,13 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT1, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -763,23 +835,31 @@ int LocalReduce_Norm2_INT1(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_INT2 -int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_INT2(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -791,6 +871,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -798,51 +879,52 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT21 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT22 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT24 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT28 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -865,10 +947,12 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -880,6 +964,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -887,6 +972,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -909,10 +995,12 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -924,6 +1012,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -932,6 +1021,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -954,11 +1044,14 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -970,6 +1063,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -978,6 +1072,7 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1000,11 +1095,13 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT2, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1016,23 +1113,31 @@ int LocalReduce_Norm2_INT2(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_INT4 -int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_INT4(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1044,6 +1149,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1051,51 +1157,52 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1118,10 +1225,12 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1133,6 +1242,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1140,6 +1250,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1162,10 +1273,12 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1177,6 +1290,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1185,6 +1299,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1207,11 +1322,14 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1223,6 +1341,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1231,6 +1350,7 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1253,11 +1373,13 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT4, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1269,23 +1391,31 @@ int LocalReduce_Norm2_INT4(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_INT8 -int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_INT8(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1297,6 +1427,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1304,51 +1435,52 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1371,10 +1503,12 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1386,6 +1520,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1393,6 +1528,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1415,10 +1551,12 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1430,6 +1568,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1438,6 +1577,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1460,11 +1600,14 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1476,6 +1619,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1484,6 +1628,7 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1506,11 +1651,13 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_INT8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1522,22 +1669,30 @@ int LocalReduce_Norm2_INT8(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif -int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_REAL(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1549,6 +1704,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1556,51 +1712,52 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1623,10 +1780,12 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1638,6 +1797,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1645,6 +1805,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1667,10 +1828,12 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1682,6 +1845,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1690,6 +1854,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1712,11 +1877,14 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1728,6 +1896,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1736,6 +1905,7 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1758,11 +1928,13 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1774,22 +1946,30 @@ int LocalReduce_Norm2_REAL(int i, int mask_on, CCTK_INT * input_array_offsets, i #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #ifdef CCTK_REAL4 -int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_REAL4(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1801,6 +1981,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1808,51 +1989,52 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1875,10 +2057,12 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1890,6 +2074,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1897,6 +2082,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1919,10 +2105,12 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1934,6 +2122,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1942,6 +2131,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1964,11 +2154,14 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -1980,6 +2173,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -1988,6 +2182,7 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2010,11 +2205,13 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL4, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2026,23 +2223,31 @@ int LocalReduce_Norm2_REAL4(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_REAL8 -int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_REAL8(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2054,6 +2259,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2061,51 +2267,52 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2128,10 +2335,12 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2143,6 +2352,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2150,6 +2360,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2172,10 +2383,12 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2187,6 +2400,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2195,6 +2409,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2217,11 +2432,14 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2233,6 +2451,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2241,6 +2460,7 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2263,11 +2483,13 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2280,23 +2502,31 @@ int LocalReduce_Norm2_REAL8(int i, int mask_on, CCTK_INT * input_array_offsets, inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_REAL16 -int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_REAL16(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2308,6 +2538,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2315,51 +2546,52 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2382,10 +2614,12 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2397,6 +2631,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2404,6 +2639,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2426,10 +2662,12 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2441,6 +2679,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2449,6 +2688,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2471,11 +2711,14 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2487,6 +2730,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2495,6 +2739,7 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2517,11 +2762,13 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, inval.Re = (CCTK_REAL16) typed_vdata[sum_indices]; #endif #define REDUCTION_OPERATION(Norm2, scalar) (scalar).Re = SQR((scalar).Re); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) (scalar).Re = SQR((scalar).Re*weight); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_REAL16, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #undef REDUCTION_PREOP_CAST @@ -2533,22 +2780,30 @@ int LocalReduce_Norm2_REAL16(int i, int mask_on, CCTK_INT * input_array_offsets, #define REDUCTION_PREOP_CAST(inval, typed_vdata,sum_indices, out_type) \ inval = (out_type) typed_vdata[sum_indices]; #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif -int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_COMPLEX(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2571,6 +2826,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2578,51 +2834,52 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2635,10 +2892,12 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets (inval).Re = (CCTK_REAL) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2661,6 +2920,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2668,6 +2928,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2680,10 +2941,12 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets (inval).Re = (CCTK_REAL4) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL4) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2706,6 +2969,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2714,6 +2978,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2726,11 +2991,13 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets (inval).Re = (CCTK_REAL8) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL8) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2753,6 +3020,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2761,6 +3029,7 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2773,11 +3042,13 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets (inval).Re = (CCTK_REAL16) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL16) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2800,23 +3071,31 @@ int LocalReduce_Norm2_COMPLEX(int i, int mask_on, CCTK_INT * input_array_offsets #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #ifdef CCTK_COMPLEX8 -int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_COMPLEX8(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2839,6 +3118,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2846,51 +3126,52 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2903,10 +3184,12 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset (inval).Re = (CCTK_REAL) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2929,6 +3212,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2936,6 +3220,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2948,10 +3233,12 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset (inval).Re = (CCTK_REAL4) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL4) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2974,6 +3261,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -2982,6 +3270,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -2994,11 +3283,13 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset (inval).Re = (CCTK_REAL8) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL8) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3021,6 +3312,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3029,6 +3321,7 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3041,11 +3334,13 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset (inval).Re = (CCTK_REAL16) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL16) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX8, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3068,23 +3363,31 @@ int LocalReduce_Norm2_COMPLEX8(int i, int mask_on, CCTK_INT * input_array_offset #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_COMPLEX16 -int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_COMPLEX16(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3107,6 +3410,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3114,51 +3418,52 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_BYTE, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_BYTE, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3171,10 +3476,12 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3197,6 +3504,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3204,6 +3512,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3216,10 +3525,12 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL4) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL4) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3242,6 +3553,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3250,6 +3562,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3262,11 +3575,13 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL8) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL8) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3289,6 +3604,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3297,6 +3613,7 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3309,11 +3626,13 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL16) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL16) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX16, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3336,23 +3655,31 @@ int LocalReduce_Norm2_COMPLEX16(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif #ifdef CCTK_COMPLEX32 -int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[]) +int LocalReduce_Norm2_COMPLEX32(int i, int weight_on, const void * const weight, CCTK_INT * input_array_offsets, int * indices, int max_iter, int * actual_indices, CCTK_INT * input_array_strides, CCTK_INT * input_array_min_subscripts,const CCTK_INT * input_array_dims, int num_points, int * actual_iters_per_dim, int * iters_per_dim, int N_dims, const void *const input_arrays[], const CCTK_INT output_number_type_codes[], void * const output_numbers[], int param_table_handle) { int iter = 0; int sum_indices = 0; - int flag, product, j, k; + int flag, product, j, k, ierr; + + /* Weight variables */ + CCTK_REAL weight_sum = 0.0; + CCTK_REAL weight_value = 1.0; #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3375,6 +3702,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3382,51 +3710,52 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse { /* out values type switches*/ case CCTK_VARIABLE_BYTE: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; case CCTK_VARIABLE_INT: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_INT1 case CCTK_VARIABLE_INT1: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT1, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT1, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT2, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT2, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_INT8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_REAL: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL4, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL4, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_REAL16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) break; #endif case CCTK_VARIABLE_COMPLEX: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3439,10 +3768,12 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul(scalar,scalar); Norm2 = CCTK_CmplxAdd( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3465,6 +3796,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3472,6 +3804,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX8 case CCTK_VARIABLE_COMPLEX8: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3484,10 +3817,12 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL4) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL4) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re=scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul8(scalar,scalar);Norm2 = CCTK_CmplxAdd8( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX8, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3510,6 +3845,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3518,6 +3854,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX16 case CCTK_VARIABLE_COMPLEX16: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3530,11 +3867,13 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL8) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL8) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul16(scalar,scalar); Norm2 = CCTK_CmplxAdd16( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX16, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3557,6 +3896,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) @@ -3565,6 +3905,7 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #ifdef CCTK_COMPLEX32 case CCTK_VARIABLE_COMPLEX32: #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3577,11 +3918,13 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse (inval).Re = (CCTK_REAL16) (typed_vdata[sum_indices]).Re; (inval).Im = (CCTK_REAL16) (typed_vdata[sum_indices]).Im; #define REDUCTION_OPERATION(Norm2, scalar) scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) scalar.Re= scalar.Re*weight; scalar.Im=scalar.Im*weight; scalar = CCTK_CmplxMul32(scalar,scalar); Norm2 = CCTK_CmplxAdd32( Norm2, scalar); #define REDUCTION_INITIAL(num) (num).Re = 0.0; (num).Im = 0.0; #define EXTRA_STEP(a, b) - ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], mask_on, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) + ITERATE_ON_ARRAY(i,CCTK_COMPLEX32, input_arrays[i], CCTK_COMPLEX32, output_numbers[i], weight_on, weight, input_array_offsets[i], indices, sum_indices, max_iter, iter, flag, actual_indices,input_array_strides, input_array_min_subscripts,input_array_dims,product) #undef REDUCTION_OPERATION +#undef WEIGHTED_REDUCTION_OPERATION #undef REDUCTION_INITIAL #undef EXTRA_STEP #ifdef SQR @@ -3604,12 +3947,15 @@ int LocalReduce_Norm2_COMPLEX32(int i, int mask_on, CCTK_INT * input_array_offse #endif #define REDUCTION_OPERATION(Norm2, scalar) Norm2 = Norm2 + SQR(scalar); +#define WEIGHTED_REDUCTION_OPERATION(Norm2, scalar, weight) Norm2 = Norm2 + SQR(scalar*weight); #define REDUCTION_INITIAL(num) num = 0; #define EXTRA_STEP(a, b) break; #endif } - return num_points; + ierr = Util_TableSetInt(param_table_handle, num_points, "num_points"); + ierr = Util_TableSetReal(param_table_handle, weight_sum, "weight_sum"); + return 0; } #endif |