SALSA Analysis Modules
Functions
iprs.c File Reference

Quantities used in the UKY `Intelligent Preconditioner Recommendation System'. More...

#include <stdlib.h>
#include "anamod.h"
#include "anamatrix.h"
#include "anamodsalsamodules.h"
#include "petscerror.h"
#include "petscmat.h"
Include dependency graph for iprs.c:

Go to the source code of this file.

Functions

static PetscErrorCode computennz (Mat A)
static PetscErrorCode NnzUp (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode NnzLow (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode NnzDia (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode Nnz (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode RelSymm (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode LoBand (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode UpBand (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode AvgNnzpRow (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode AvgDistFromDiag (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode NDiags (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode AvgDiagDist (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
static PetscErrorCode SigmaDiagDist (AnaModNumericalProblem prob, AnalysisItem *rv, int *lv, PetscTruth *flg)
PetscErrorCode RegisterIprsModules (void)
PetscErrorCode DeRegisterIprsModules (void)

Detailed Description

Quantities used in the UKY `Intelligent Preconditioner Recommendation System'.

Intelligent Preconditioner Recommendation System

The University of Kentucky `Intelligent Preconditioner Recommendation System' (Xu[2003]) uses a number of structural properties of the matrix that go beyond the properties in our own Structural properties module.

Usage

Activate this module with

PetscErrorCode RegisterIprsModules();

Compute these elements with

ComputeQuantity("iprs",<element>,A,(AnalysisItem*)&res,&reslen,&flg);

Available elements are:

References

@techreport{Zhang:interim,
author = {Shu{T}ing Xu and Eun-Joo Lee and Jun Zhang},
title = {An Interim Analysis Report on Preconditioners and Matrices},
institution = {University of Kentucky, Lexington; Department of 
    Computer Science},
number = {388-03},
year = {2003}
}

Definition in file iprs.c.


Function Documentation

static PetscErrorCode AvgDiagDist ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 477 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, id, and AnalysisItem::r.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  PetscReal v=0.; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","avg-diag-dist",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetReal
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->r = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetReal
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->r = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode AvgDistFromDiag ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 429 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","avgdistfromdiag",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode AvgNnzpRow ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 405 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","avgnnzprow",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode computennz ( Mat  A) [static]

This is the computational routine for all IPRS modules. Lots of pointer chasing.

Definition at line 61 of file iprs.c.

References GetDataID(), HasQuantity(), HASTOEXIST, AnalysisItem::i, id, and MatrixComputeQuantity().

Referenced by AvgDiagDist(), AvgDistFromDiag(), AvgNnzpRow(), LoBand(), NDiags(), Nnz(), NnzDia(), NnzLow(), NnzUp(), SigmaDiagDist(), and UpBand().

{
  MPI_Comm comm;
  int first,last,M,row,id,max_rowlen,*cols_tmp,
    nnzl,gnnzl,nnzu,gnnzu,nnzd,gnnzd, nnz,gnnz,avg, dist,gdist,
    p,gp, q,gq;
  IS colis,colsis=NULL;
  PetscTruth has; PetscErrorCode ierr;
  PetscFunctionBegin;

  ierr = PetscObjectGetComm((PetscObject)A,&comm); CHKERRQ(ierr);
  ierr = MatGetSize(A,&M,PETSC_NULL); CHKERRQ(ierr);
  ierr = MatGetOwnershipRange(A,&first,&last); CHKERRQ(ierr);
  ierr = HasQuantity
    (A,"structure","max-nnzeros-per-row",&has); CHKERRQ(ierr);
  if (has) {
    AnalysisItem r;
    ierr = MatrixComputeQuantity
      (A,"structure","max-nnzeros-per-row",&r,PETSC_NULL,PETSC_NULL); CHKERRQ(ierr);
    max_rowlen = r.i;
  } else {
    ierr = MatGetSize(A,PETSC_NULL,&max_rowlen); CHKERRQ(ierr);
  }
  ierr = PetscMalloc(max_rowlen*sizeof(int),&cols_tmp); CHKERRQ(ierr);
  dist = nnz = nnzl = nnzd = nnzu = p = q = 0;
  for (row=first; row<last; row++) {
    int ncols,icol; const int *cols;
    ierr = MatGetRow(A,row,&ncols,&cols,PETSC_NULL); CHKERRQ(ierr);
    ierr = PetscMemcpy(cols_tmp,cols,ncols*sizeof(int)); CHKERRQ(ierr);
    nnz += ncols;
    /* left and right bandwidth */
    if (cols[0]<row && row-cols[0]>p) p = row-cols[0];
    if (cols[ncols-1]>row && cols[ncols-1]-row>q) q = cols[ncols-1]-row;
    /* distance from diagonal, count elements in L,U */
    for (icol=0; icol<ncols; icol++) {
      if (cols[icol]<row) {
        dist += row-cols[icol]; nnzl++;
      } else if (cols[icol]>row) {
        dist += cols[icol]-row; nnzu++;
      } else nnzd++;
    }
    /* analyze diagonals */
    for (icol=0; icol<ncols; icol++) cols_tmp[icol]-=row;
    if (!colsis) {
      ierr = ISCreateGeneral
        (PETSC_COMM_SELF,ncols,cols_tmp,&colsis); CHKERRQ(ierr);
    } else {
      IS tmpis;
      ierr = ISCreateGeneralWithArray
        (PETSC_COMM_SELF,ncols,cols_tmp,&colis); CHKERRQ(ierr);
      ierr = ISSum(colsis,colis,&tmpis); CHKERRQ(ierr);
      ierr = ISDestroy(colsis); CHKERRQ(ierr);
      ierr = ISDestroy(colis); CHKERRQ(ierr);
      colsis = tmpis;
    }
    for (icol=0; icol<ncols; icol++) cols_tmp[icol]+=row;
    ierr = MatRestoreRow(A,row,&ncols,&cols,PETSC_NULL); CHKERRQ(ierr);
  }
  ierr = PetscFree(cols_tmp); CHKERRQ(ierr);
  MPI_Allreduce((void*)&nnzl,(void*)&gnnzl,1,MPI_INT,MPI_SUM,comm);
  MPI_Allreduce((void*)&nnzu,(void*)&gnnzu,1,MPI_INT,MPI_SUM,comm);
  MPI_Allreduce((void*)&nnzd,(void*)&gnnzd,1,MPI_INT,MPI_SUM,comm);
  MPI_Allreduce((void*)&nnz,(void*)&gnnz,1,MPI_INT,MPI_SUM,comm);
  if (gnnz!=(gnnzl+gnnzd+gnnzu))
    SETERRQ1(1,"We missed %d elements",gnnz-(gnnzl+gnnzd+gnnzu));
  MPI_Allreduce((void*)&dist,(void*)&gdist,1,MPI_INT,MPI_SUM,comm);
  MPI_Allreduce((void*)&p,(void*)&gp,1,MPI_INT,MPI_MAX,comm);
  MPI_Allreduce((void*)&q,(void*)&gq,1,MPI_INT,MPI_MAX,comm);

  ierr = GetDataID("iprs","nnzlow",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,gnnzl); CHKERRQ(ierr);
  ierr = GetDataID("iprs","nnzup",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,gnnzu); CHKERRQ(ierr);
  ierr = GetDataID("iprs","nnzdia",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,gnnzd); CHKERRQ(ierr);
  ierr = GetDataID("iprs","nnz",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,gnnz); CHKERRQ(ierr);

  avg = nnz/M;
  ierr = GetDataID("iprs","avgnnzprow",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,avg); CHKERRQ(ierr);
  dist = gdist/M;
  ierr = GetDataID("iprs","avgdistfromdiag",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt
    ((PetscObject)A,id,dist); CHKERRQ(ierr);

  ierr = GetDataID("iprs","loband",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt((PetscObject)A,id,gp); CHKERRQ(ierr);
  ierr = GetDataID("iprs","upband",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataSetInt((PetscObject)A,id,gq); CHKERRQ(ierr);

  {
    int nd,i; const PetscInt *d; PetscReal avgdist,sigmadist;
    ierr = ISGetLocalSize(colsis,&nd); CHKERRQ(ierr);
    ierr = GetDataID("iprs","n-nonzero-diags",&id,&has); CHKERRQ(ierr);
    HASTOEXIST(has);
    ierr = PetscObjectComposedDataSetInt((PetscObject)A,id,nd); CHKERRQ(ierr);
    ierr = ISGetIndices(colsis,&d); CHKERRQ(ierr);

    avgdist = 0.;
    for (i=0; i<nd; i++) avgdist += PetscAbsScalar(d[i]);
    avgdist /= nd;
    ierr = GetDataID("iprs","avg-diag-dist",&id,&has); CHKERRQ(ierr);
    HASTOEXIST(has);
    ierr = PetscObjectComposedDataSetReal
      ((PetscObject)A,id,avgdist); CHKERRQ(ierr);

    sigmadist = 0.;
    for (i=0; i<nd; i++) sigmadist += (d[i]-avgdist)*(d[i]-avgdist);
    sigmadist /= nd;
    ierr = GetDataID("iprs","sigma-diag-dist",&id,&has); CHKERRQ(ierr);
    HASTOEXIST(has);
    ierr = PetscObjectComposedDataSetReal
      ((PetscObject)A,id,sigmadist); CHKERRQ(ierr);

    ierr = ISRestoreIndices(colsis,&d); CHKERRQ(ierr);
    ierr = ISDestroy(colsis); CHKERRQ(ierr);
  }
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

PetscErrorCode DeRegisterIprsModules ( void  )

Definition at line 563 of file iprs.c.

{
  PetscFunctionBegin;
  PetscFunctionReturn(0);
}
static PetscErrorCode LoBand ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 331 of file iprs.c.

References computennz(), ComputeQuantity(), GetDataID(), HasComputeModule(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id,ql; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","loband",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    AnalysisItem q;
    ierr = HasComputeModule("structure","left-bandwidth",flg); CHKERRQ(ierr);
    if (*flg) {
      ierr = ComputeQuantity
        (prob,"structure","left-bandwidth",&q,&ql,flg); CHKERRQ(ierr);
      if (*flg) {
        v = q.i;
        ierr = PetscObjectComposedDataSetInt
          ((PetscObject)A,id,v); CHKERRQ(ierr);
        rv->i = v;
      }
    } else {
      ierr = computennz(A); CHKERRQ(ierr);
      ierr = PetscObjectComposedDataGetInt
        ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
      if (*flg) rv->i = v;
    }
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode NDiags ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 453 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","n-nonzero-diags",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode Nnz ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 273 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","nnz",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode NnzDia ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 249 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","nnzdia",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode NnzLow ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 225 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","nnzlow",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode NnzUp ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Compute the number of nonzeroes in the upper triangle of the matrix

Definition at line 201 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","nnzup",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetInt
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->i = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

PetscErrorCode RegisterIprsModules ( void  )

Definition at line 524 of file iprs.c.

References ANALYSISDOUBLE, ANALYSISINTEGER, AvgDiagDist(), AvgNnzpRow(), LoBand(), NDiags(), Nnz(), NnzDia(), NnzLow(), NnzUp(), RegisterModule(), RelSymm(), SigmaDiagDist(), and UpBand().

Referenced by AnaModRegisterSalsaModules(), and AnaModRegisterStandardModules().

{
  PetscErrorCode ierr;
  PetscFunctionBegin;

  ierr = RegisterModule
    ("iprs","nnzup",ANALYSISINTEGER,&NnzUp); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","nnzlow",ANALYSISINTEGER,&NnzLow); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","nnzdia",ANALYSISINTEGER,&NnzDia); CHKERRQ(ierr);

  ierr = RegisterModule
    ("iprs","nnz",ANALYSISINTEGER,&Nnz); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","avgnnzprow",ANALYSISINTEGER,&AvgNnzpRow); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","avgdistfromdiag",ANALYSISINTEGER,&AvgNnzpRow); CHKERRQ(ierr);

  ierr = RegisterModule
    ("iprs","relsymm",ANALYSISDOUBLE,&RelSymm); CHKERRQ(ierr);

  ierr = RegisterModule
    ("iprs","upband",ANALYSISINTEGER,&UpBand); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","loband",ANALYSISINTEGER,&LoBand); CHKERRQ(ierr);

  ierr = RegisterModule
    ("iprs","n-nonzero-diags",ANALYSISINTEGER,&NDiags); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","avg-diag-dist",ANALYSISDOUBLE,&AvgDiagDist); CHKERRQ(ierr);
  ierr = RegisterModule
    ("iprs","sigma-diag-dist",ANALYSISDOUBLE,&SigmaDiagDist); CHKERRQ(ierr);

  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode RelSymm ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 297 of file iprs.c.

References ComputeQuantity(), GetDataID(), HASTOEXIST, AnalysisItem::i, id, and AnalysisItem::r.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  PetscReal v=0.; PetscTruth has; int id,ql; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","relsymm",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetReal
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->r = v;
  else {
    AnalysisItem q; int nnz,nnu;
    ierr = ComputeQuantity
      (prob,"structure","nnzeros",&q,&ql,flg); CHKERRQ(ierr);
    if (*flg) {
      nnz = q.i;
      ierr = ComputeQuantity
        (prob,"structure","n-struct-unsymm",&q,&ql,flg); CHKERRQ(ierr);
      if (*flg) {
        nnu = q.i;
        v = (nnz-nnu)/(1.*nnz);
        ierr = PetscObjectComposedDataSetReal
          ((PetscObject)A,id,v); CHKERRQ(ierr);
        rv->r = v;
      }
    }
  }
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode SigmaDiagDist ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 501 of file iprs.c.

References computennz(), GetDataID(), HASTOEXIST, id, and AnalysisItem::r.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  PetscReal v=0.; PetscTruth has; int id; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","sigma-diag-dist",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetReal
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->r = v;
  else {
    ierr = computennz(A); CHKERRQ(ierr);
    ierr = PetscObjectComposedDataGetReal
      ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
    if (*flg) rv->r = v;
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function:

static PetscErrorCode UpBand ( AnaModNumericalProblem  prob,
AnalysisItem rv,
int *  lv,
PetscTruth *  flg 
) [static]

Definition at line 368 of file iprs.c.

References computennz(), ComputeQuantity(), GetDataID(), HasComputeModule(), HASTOEXIST, AnalysisItem::i, and id.

Referenced by RegisterIprsModules().

{
  Mat A = (Mat)prob;
  int v=0; PetscTruth has; int id,ql; PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = GetDataID("iprs","upband",&id,&has); CHKERRQ(ierr);
  HASTOEXIST(has);
  ierr = PetscObjectComposedDataGetInt
    ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
  if (lv) *lv = 1;
  if (*flg) rv->i = v;
  else {
    ierr = HasComputeModule("structure","right-bandwidth",flg); CHKERRQ(ierr);
    if (*flg) {
      AnalysisItem q;
      ierr = ComputeQuantity
        (prob,"structure","right-bandwidth",&q,&ql,flg); CHKERRQ(ierr);
      if (*flg) {
        v = q.i;
        ierr = PetscObjectComposedDataSetInt
          ((PetscObject)A,id,v); CHKERRQ(ierr);
        rv->i = v;
      }
    } else {
      ierr = computennz(A); CHKERRQ(ierr);
      ierr = PetscObjectComposedDataGetInt
        ((PetscObject)A,id,v,*flg); CHKERRQ(ierr);
      if (*flg) rv->i = v;
    }
  }
  
  PetscFunctionReturn(0);
}

Here is the call graph for this function: