Exemple #1
0
/*
   -------------------------------------------------
   purpose -- to create and return a Chv object that
              holds the update matrix for front J

   created -- 98may25, cca
   -------------------------------------------------
*/
Chv *
FrontMtx_QR_storeUpdate (
   FrontMtx     *frontmtx,
   int          J,
   A2           *frontJ,
   ChvManager   *chvmanager,
   int          msglvl,
   FILE         *msgFile
) {
A2       tempJ ;
Chv      *chvJ ;
double   *updent ;
int      nbytes, ncolJ, ncolupd, nD, nent, nrowJ, nrowupd ;
int      *colindJ, *updind ;
/*
   -----------------------------------------------
   compute the number of rows in the update matrix
   -----------------------------------------------
*/
nD = FrontMtx_frontSize(frontmtx, J) ;
FrontMtx_columnIndices(frontmtx, J, &ncolJ, &colindJ) ;
nrowJ = A2_nrow(frontJ) ;
nrowupd = ((nrowJ >= ncolJ) ? ncolJ : nrowJ) - nD ;
ncolupd = ncolJ - nD ;
if ( msglvl > 3 ) {
   fprintf(msgFile, "\n\n inside FrontMtx_QR_storeUpdate(%d)", J) ;
   fprintf(msgFile, "\n nD %d, nrowJ %d, nrowupd %d, ncolupd %d",
           nD, nrowJ, nrowupd, ncolupd) ;
   fflush(msgFile) ;
}
if ( nrowupd > 0 && ncolupd > 0 ) {
   if ( FRONTMTX_IS_REAL(frontmtx) ) {
      nbytes = Chv_nbytesNeeded(nrowupd, 0, ncolupd - nrowupd, 
                                SPOOLES_REAL, SPOOLES_SYMMETRIC) ;
   } else if ( FRONTMTX_IS_COMPLEX(frontmtx) ) {
      nbytes = Chv_nbytesNeeded(nrowupd, 0, ncolupd - nrowupd, 
                                SPOOLES_COMPLEX, SPOOLES_HERMITIAN) ;
   }
   chvJ = ChvManager_newObjectOfSizeNbytes(chvmanager, nbytes) ;
   if ( FRONTMTX_IS_REAL(frontmtx) ) {
       Chv_init(chvJ, J, nrowupd, 0, ncolupd - nrowupd, 
                SPOOLES_REAL, SPOOLES_SYMMETRIC) ;
   } else if ( FRONTMTX_IS_COMPLEX(frontmtx) ) {
       Chv_init(chvJ, J, nrowupd, 0, ncolupd - nrowupd, 
                SPOOLES_COMPLEX, SPOOLES_HERMITIAN) ;
   }
   Chv_columnIndices(chvJ, &ncolupd, &updind) ;
   IVcopy(ncolupd, updind, colindJ + nD) ;
   nent   = Chv_nent(chvJ) ;
   updent = Chv_entries(chvJ) ;
   A2_setDefaultFields(&tempJ) ;
   A2_subA2(&tempJ, frontJ, nD, nrowJ - 1, nD, ncolJ - 1) ;
   A2_copyEntriesToVector(&tempJ, nent, updent, A2_UPPER, A2_BY_ROWS) ;
   if ( msglvl > 3 ) {
      fprintf(msgFile, "\n update matrix %d", J) ;
      Chv_writeForHumanEye(chvJ, msgFile) ;
      fflush(msgFile) ;
   }
} else {
   chvJ = NULL ;
}
return(chvJ) ; }
Exemple #2
0
/*
   ----------------------------------------------------------------
   simple method to return the dimensions of front J and the number 
   of bytes necessary for the Chv object to hold the front.

   created -- 98may04, cca
   ----------------------------------------------------------------
*/
void
FrontMtx_initialFrontDimensions (
   FrontMtx   *frontmtx,
   int         J,
   int         *pnD,
   int         *pnL,
   int         *pnU,
   int         *pnbytes
) {
int   nbytes, nD, nL, nU ;
/*
   ---------------
   check the input
   ---------------
*/
if (  frontmtx == NULL || J < 0 || J >= frontmtx->nfront
   || pnD == NULL || pnL == NULL || pnU == NULL || pnbytes == NULL ) {
   fprintf(stderr, 
           "\n fatal error in FrontMtx_initialFrontDimensions()"
           "\n frontmtx = %p, J = %d, pnD = %p, "
           "pnL = %p, pnU = %p, pnbytes = %p",
           frontmtx, J, pnD, pnL, pnU, pnbytes) ;
   spoolesFatal();
}
switch ( frontmtx->type ) {
case SPOOLES_REAL :
   switch ( frontmtx->symmetryflag ) {
   case SPOOLES_SYMMETRIC :
   case SPOOLES_NONSYMMETRIC :
      break ;
   default :
      fprintf(stderr, 
              "\n fatal error in FrontMtx_initialFrontDimensions()"
              "\n real type, must be symmetric or nonsymmetric\n") ;
      spoolesFatal();
      break ;
   }
  break ;
case SPOOLES_COMPLEX :
   switch ( frontmtx->symmetryflag ) {
   case SPOOLES_SYMMETRIC :
   case SPOOLES_HERMITIAN :
   case SPOOLES_NONSYMMETRIC :
      break ;
      fprintf(stderr, 
              "\n fatal error in FrontMtx_initialFrontDimensions()"
              "\n complex type, must be symmetric,"
              "\n hermitian or nonsymmetric\n") ;
      spoolesFatal();
      break ;
   }
   break ;
default :
   fprintf(stderr, 
           "\n fatal error in FrontMtx_initialFrontDimensions()"
           "\n bad type, must be real or complex") ;
   spoolesFatal();
   break ;
}
nD = frontmtx->frontETree->nodwghtsIV->vec[J] ;
nL = nU = frontmtx->frontETree->bndwghtsIV->vec[J] ;
nbytes = Chv_nbytesNeeded(nD, nL, nU, 
                          frontmtx->type, frontmtx->symmetryflag) ;
*pnD = nD ;
*pnL = nL ;
*pnU = nU ;
*pnbytes = nbytes ;

return ; }
Exemple #3
0
/*
   ----------------------------
   purpose -- basic initializer

   created -- 98apr30, cca
   ----------------------------
*/
void
Chv_init (
   Chv     *chv,
   int      id,
   int      nD,
   int      nL,
   int      nU,
   int      type,
   int      symflag
) {
int      nbytes ;
/*
   ---------------
   check the input
   ---------------
*/
if (  chv == NULL || nD <= 0 || nL < 0 || nU < 0 ) {
   fprintf(stderr, 
           "\n fatal error in Chv_init()"
           "\n bad input, chv %p, nD %d, nL %d, nU %d\n", 
           chv, nD, nL, nU) ;
   exit(-1) ;
}
switch ( type ) {
case SPOOLES_REAL :
   switch ( symflag ) {
   case SPOOLES_SYMMETRIC :
   case SPOOLES_NONSYMMETRIC :
      break ;
   default :
      fprintf(stderr, 
           "\n fatal error in Chv_init()"
           "\n type = SPOOLES_REAL, symflag = %d"
           "\n must be SPOOLES_SYMMETRIC or SPOOLES_NONSYMMETRIC\n", 
           symflag) ;
      exit(-1) ;
   }
   break ;
case SPOOLES_COMPLEX :
   switch ( symflag ) {
   case SPOOLES_SYMMETRIC :
   case SPOOLES_HERMITIAN :
   case SPOOLES_NONSYMMETRIC :
      break ;
   default :
      fprintf(stderr, 
              "\n fatal error in Chv_init()"
              "\n type = SPOOLES_COMPLEX, symflag = %d"
              "\n must be SPOOLES_SYMMETRIC, SPOOLES_HERMITIAN"
              "\n or SPOOLES_NONSYMMETRIC\n",
              symflag) ;
      exit(-1) ;
   }
   break ;
default :
   fprintf(stderr, 
           "\n fatal error in Chv_init()"
           "\n type = %d"
           "\n must be SPOOLES_REAL or SPOOLES_COMPLEX\n",
           type) ;
   exit(-1) ;
} 
/*
   -------------------------------------------------------
   get and set the number of bytes needed in the workspace
   -------------------------------------------------------
*/
nbytes = Chv_nbytesNeeded(nD, nL, nU, type, symflag) ;
Chv_setNbytesInWorkspace(chv, nbytes) ;
/*
   --------------
   set the fields
   --------------
*/
Chv_setFields(chv, id, nD, nL, nU, type, symflag) ;

return ; }