/* ------------------------------------------------- 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) ; }
/* ---------------------------------------------------------------- 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 ; }
/* ---------------------------- 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 ; }