1
1
/*BHEADER**********************************************************************
2
* Copyright (c) 2006 The Regents of the University of California.
2
* Copyright (c) 2008, Lawrence Livermore National Security, LLC.
3
3
* Produced at the Lawrence Livermore National Laboratory.
4
* Written by the HYPRE team. UCRL-CODE-222953.
7
* This file is part of HYPRE (see http://www.llnl.gov/CASC/hypre/).
8
* Please see the COPYRIGHT_and_LICENSE file for the copyright notice,
9
* disclaimer, contact information and the GNU Lesser General Public License.
11
* HYPRE is free software; you can redistribute it and/or modify it under the
12
* terms of the GNU General Public License (as published by the Free Software
13
* Foundation) version 2.1 dated February 1999.
15
* HYPRE is distributed in the hope that it will be useful, but WITHOUT ANY
16
* WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or FITNESS
17
* FOR A PARTICULAR PURPOSE. See the terms and conditions of the GNU General
18
* Public License for more details.
20
* You should have received a copy of the GNU Lesser General Public License
21
* along with this program; if not, write to the Free Software Foundation,
22
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4
* This file is part of HYPRE. See file COPYRIGHT for details.
6
* HYPRE is free software; you can redistribute it and/or modify it under the
7
* terms of the GNU Lesser General Public License (as published by the Free
8
* Software Foundation) version 2.1 dated February 1999.
25
11
***********************************************************************EHEADER*/
29
16
/******************************************************************************
31
18
* Member functions for hypre_CSRBlockMatrix class.
376
363
/*--------------------------------------------------------------------------
364
* hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign
365
*only add elements of sign*i1 that are negative (sign is size block_size)
367
* (diag(o) = diag(i1) + diag(o))
368
*--------------------------------------------------------------------------*/
370
hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(double* i1, double* o, int block_size, double *sign)
375
for (i = 0; i < block_size; i++)
378
tmp = i1[i*block_size+i]*sign[i];
380
o[i*block_size+i] += i1[i*block_size+i];
386
/*--------------------------------------------------------------------------
387
* hypre_CSRBlockMatrixComputeSign
390
*--------------------------------------------------------------------------*/
392
int hypre_CSRBlockMatrixComputeSign(double *i1, double *o, int block_size)
398
for (i = 0; i < block_size; i++)
400
if (i1[i*block_size+i] < 0)
411
/*--------------------------------------------------------------------------
377
412
* hypre_CSRBlockMatrixBlockSetScalar
378
413
* (each entry in block o is set to beta )
379
414
*--------------------------------------------------------------------------*/
661
704
/*--------------------------------------------------------------------------
705
* hypre_CSRBlockMatrixBlockMultAddDiagCheckSign
707
* only mult elements if sign*diag(i2) is negative
708
*(diag(o) = diag(i1) * diag(i2) + beta * diag(o))
709
*--------------------------------------------------------------------------*/
711
hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(double* i1, double* i2, double beta,
712
double* o, int block_size, double *sign)
720
for (i = 0; i < block_size; i++)
722
tmp = i2[i*block_size+i]*sign[i];
724
o[i*block_size + i] = i1[i*block_size + i] * i2[i*block_size + i];
727
else if (beta == 1.0)
729
for(i = 0; i < block_size; i++)
731
tmp = i2[i*block_size+i]*sign[i];
733
o[i*block_size + i] = o[i*block_size + i] + i1[i*block_size + i] * i2[i*block_size + i];
738
for(i = 0; i < block_size; i++)
740
tmp = i2[i*block_size+i]*sign[i];
742
o[i*block_size + i] = beta* o[i*block_size + i] + i1[i*block_size + i] * i2[i*block_size + i];
750
/*--------------------------------------------------------------------------
751
* hypre_CSRBlockMatrixBlockMultAddDiag2 (scales cols of il by diag of i2)
752
* ((o) = (i1) * diag(i2) + beta * (o))
753
*--------------------------------------------------------------------------*/
755
hypre_CSRBlockMatrixBlockMultAddDiag2(double* i1, double* i2, double beta,
756
double* o, int block_size)
763
for (i = 0; i < block_size; i++)
765
for (j = 0; j < block_size; j++)
767
o[i*block_size + j] = i1[i*block_size + j] * i2[j*block_size + j];
772
else if (beta == 1.0)
774
for (i = 0; i < block_size; i++)
776
for (j = 0; j < block_size; j++)
778
o[i*block_size + j] = o[i*block_size + j] + i1[i*block_size + j] * i2[j*block_size + j];
787
for (i = 0; i < block_size; i++)
789
for (j = 0; j < block_size; j++)
791
o[i*block_size + j] = beta * o[i*block_size + j] + i1[i*block_size + j] * i2[j*block_size + j];
798
/*--------------------------------------------------------------------------
799
* hypre_CSRBlockMatrixBlockMultAddDiag3 (scales cols of il by i2 -
800
whose diag elements are row sums)
801
* ((o) = (i1) * diag(i2) + beta * (o))
802
*--------------------------------------------------------------------------*/
804
hypre_CSRBlockMatrixBlockMultAddDiag3(double* i1, double* i2, double beta,
805
double* o, int block_size)
811
row_sum = hypre_CTAlloc(double, block_size);
812
for (i = 0; i < block_size; i++)
814
for (j = 0; j < block_size; j++)
816
row_sum[i] += i2[i*block_size + j];
822
for (i = 0; i < block_size; i++)
824
for (j = 0; j < block_size; j++)
826
o[i*block_size + j] = i1[i*block_size + j] * row_sum[j];
831
else if (beta == 1.0)
833
for (i = 0; i < block_size; i++)
835
for (j = 0; j < block_size; j++)
837
o[i*block_size + j] = o[i*block_size + j] + i1[i*block_size + j] * row_sum[j];
846
for (i = 0; i < block_size; i++)
848
for (j = 0; j < block_size; j++)
850
o[i*block_size + j] = beta * o[i*block_size + j] + i1[i*block_size + j] * row_sum[j];
856
hypre_TFree(row_sum);
860
/*--------------------------------------------------------------------------
662
861
* hypre_CSRBlockMatrixBlockMatvec
663
862
* (ov = alpha* mat * v + beta * ov)
664
863
* mat is the matrix - size is block_size^2
1478
/*--------------------------------------------------------------------------
1479
* hypre_CSRBlockMatrixBlockInvMultDiag2
1480
* (o = (i1)* diag(i2)^-1) - so this scales the cols of il by
1481
the diag entries in i2
1482
*--------------------------------------------------------------------------*/
1484
hypre_CSRBlockMatrixBlockInvMultDiag2(double* i1, double* i2, double* o, int block_size)
1494
for (i = 0; i < block_size; i++)
1496
if (fabs(i2[i*block_size + i]) > eps)
1498
tmp = 1 / i2[i*block_size + i];
1504
for (j=0; j< block_size; j++) /* this should be re-written to access by row (not col)! */
1506
o[j*block_size + i] = i1[j*block_size + i] *tmp;
1514
/*--------------------------------------------------------------------------
1515
* hypre_CSRBlockMatrixBlockInvMultDiag3
1516
* (o = (i1)* diag(i2)^-1) - so this scales the cols of il by
1517
the i2 whose diags are row sums
1518
*--------------------------------------------------------------------------*/
1520
hypre_CSRBlockMatrixBlockInvMultDiag3(double* i1, double* i2, double* o, int block_size)
1525
double eps, tmp, row_sum;
1529
for (i = 0; i < block_size; i++)
1531
/* get row sum of i2, row i */
1533
for (j=0; j< block_size; j++)
1535
row_sum += i2[i*block_size + j];
1539
if (fabs(row_sum) > eps)
1547
/* scale col of i1 */
1548
for (j=0; j< block_size; j++) /* this should be re-written to access by row (not col)! */
1550
o[j*block_size + i] = i1[j*block_size + i] *tmp;
1281
1560
/*--------------------------------------------------------------------------