Ifpack Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
az_ifpack_precon.c
Go to the documentation of this file.
1
2/*@HEADER
3// ***********************************************************************
4//
5// Ifpack: Object-Oriented Algebraic Preconditioner Package
6// Copyright (2002) Sandia Corporation
7//
8// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9// license for use of this work by or on behalf of the U.S. Government.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ***********************************************************************
41//@HEADER
42*/
43
44/*******************************************************************************
45 * MATRIX FREE matrix vector multiplication
46 ******************************************************************************/
47
48#include <stdio.h>
49#include <stdlib.h>
50#include <math.h>
51#include "az_aztec.h"
52#include "az_ifpack.h"
53
54void AZ_ifpack_precon(double x[], int options[],
55 int proc_config[], double params[], AZ_MATRIX *Amat,
56 AZ_PRECOND *Prec)
57
58
59/******************************************************************************/
60/*
61 * A bogus preconditioning subroutine which simply smooths x[]
62 * in the interior of each local grid by taking averages with
63 * neighboring grid points.
64 *
65 * Parameters:
66 * =========
67 * x On input, a vector. On output, x[] is
68 * smoothed by taking averages with neighbors.
69 *
70 * prec On input, prec->Pmat->aux_ptr points to
71 * that data_structure 'pass_data' which contains
72 * the local grid size (nx,ny) on this processor.
73 *
74 * Amat, input_options, Not used.
75 * proc_config, Amat,
76 * input_params
77 *
78 */
79
80
81{
82 int i, len;
83 void *precon;
84 AZ_IFPACK *Prec_pass_data;
85 int nr, nc;
86 double *input_vector;
87 /* Data passing structure. This user- */
88 /* defined data structure is used to pass */
89 /* information through Aztec and back into*/
90 /* the user's subroutines. */
91
92 /*-------------------------------------------------------------------------*/
93 /* Extract necessary data from pass_data */
94
95 Prec_pass_data = (AZ_IFPACK *) Prec->Pmat->aux_ptr;
96 precon = (void *) Prec_pass_data->precon;
97 nr = Prec_pass_data->nr;
98 nc = Prec_pass_data->nc;
99 if (nc != 1) abort();
100 /* input_vector = (double *) Prec_pass_data->input_vector; */
101 input_vector = (double *) malloc (nr * sizeof(double));
102 len = nr*nc;
103 /* dcopy_(&len, x, &ione, input_vector, &ione); */
104
105 for (i=0; i<len; i++) input_vector[i] = x[i];
106
107 ifp_apply(precon, nr, nc, input_vector, nr, x, nr);
108 free((void *) input_vector);
109}
void AZ_ifpack_precon(double x[], int options[], int proc_config[], double params[], AZ_MATRIX *Amat, AZ_PRECOND *Prec)