本文整理汇总了C++中PetscInfo函数的典型用法代码示例。如果您正苦于以下问题:C++ PetscInfo函数的具体用法?C++ PetscInfo怎么用?C++ PetscInfo使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PetscInfo函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: KSPFischerGuessUpdate_Method2
PetscErrorCode KSPFischerGuessUpdate_Method2(KSPFischerGuess_Method2 *itg,Vec x)
{
PetscScalar norm;
PetscErrorCode ierr;
int curl = itg->curl,i;
PetscFunctionBegin;
PetscValidHeaderSpecific(x,VEC_CLASSID,2);
PetscValidPointer(itg,3);
if (curl == itg->maxl) {
ierr = KSP_MatMult(itg->ksp,itg->mat,x,itg->Ax);CHKERRQ(ierr); /* norm = sqrt(x'Ax) */
ierr = VecDot(x,itg->Ax,&norm);CHKERRQ(ierr);
ierr = VecCopy(x,itg->xtilde[0]);CHKERRQ(ierr);
ierr = VecScale(itg->xtilde[0],1.0/PetscSqrtScalar(norm));CHKERRQ(ierr);
itg->curl = 1;
} else {
if (!curl) {
ierr = VecCopy(x,itg->xtilde[curl]);CHKERRQ(ierr);
} else {
ierr = VecWAXPY(itg->xtilde[curl],-1.0,itg->guess,x);CHKERRQ(ierr);
}
ierr = KSP_MatMult(itg->ksp,itg->mat,itg->xtilde[curl],itg->Ax);CHKERRQ(ierr);
ierr = VecMDot(itg->Ax,curl,itg->xtilde,itg->alpha);CHKERRQ(ierr);
for (i=0; i<curl; i++) itg->alpha[i] = -itg->alpha[i];
ierr = VecMAXPY(itg->xtilde[curl],curl,itg->alpha,itg->xtilde);CHKERRQ(ierr);
ierr = KSP_MatMult(itg->ksp,itg->mat,itg->xtilde[curl],itg->Ax);CHKERRQ(ierr); /* norm = sqrt(xtilde[curl]'Axtilde[curl]) */
ierr = VecDot(itg->xtilde[curl],itg->Ax,&norm);CHKERRQ(ierr);
if (PetscAbsScalar(norm) != 0.0) {
ierr = VecScale(itg->xtilde[curl],1.0/PetscSqrtScalar(norm));CHKERRQ(ierr);
itg->curl++;
} else {
ierr = PetscInfo(itg->ksp,"Not increasing dimension of Fischer space because new direction is identical to previous\n");CHKERRQ(ierr);
}
}
PetscFunctionReturn(0);
}
开发者ID:fengyuqi,项目名称:petsc,代码行数:37,代码来源:iguess.c
示例2: PetscSFCreate_Window
PETSC_EXTERN PetscErrorCode PetscSFCreate_Window(PetscSF sf)
{
PetscSF_Window *w = (PetscSF_Window*)sf->data;
PetscErrorCode ierr;
PetscFunctionBegin;
sf->ops->SetUp = PetscSFSetUp_Window;
sf->ops->SetFromOptions = PetscSFSetFromOptions_Window;
sf->ops->Reset = PetscSFReset_Window;
sf->ops->Destroy = PetscSFDestroy_Window;
sf->ops->View = PetscSFView_Window;
sf->ops->Duplicate = PetscSFDuplicate_Window;
sf->ops->BcastBegin = PetscSFBcastBegin_Window;
sf->ops->BcastEnd = PetscSFBcastEnd_Window;
sf->ops->ReduceBegin = PetscSFReduceBegin_Window;
sf->ops->ReduceEnd = PetscSFReduceEnd_Window;
sf->ops->FetchAndOpBegin = PetscSFFetchAndOpBegin_Window;
sf->ops->FetchAndOpEnd = PetscSFFetchAndOpEnd_Window;
ierr = PetscNewLog(sf,&w);CHKERRQ(ierr);
sf->data = (void*)w;
w->sync = PETSCSF_WINDOW_SYNC_FENCE;
ierr = PetscObjectComposeFunction((PetscObject)sf,"PetscSFWindowSetSyncType_C",PetscSFWindowSetSyncType_Window);CHKERRQ(ierr);
ierr = PetscObjectComposeFunction((PetscObject)sf,"PetscSFWindowGetSyncType_C",PetscSFWindowGetSyncType_Window);CHKERRQ(ierr);
#if defined(OMPI_MAJOR_VERSION) && (OMPI_MAJOR_VERSION < 1 || (OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION <= 6))
{
PetscBool ackbug = PETSC_FALSE;
ierr = PetscOptionsGetBool(NULL,NULL,"-acknowledge_ompi_onesided_bug",&ackbug,NULL);CHKERRQ(ierr);
if (ackbug) {
ierr = PetscInfo(sf,"Acknowledged Open MPI bug, proceeding anyway. Expect memory corruption.\n");CHKERRQ(ierr);
} else SETERRQ(PetscObjectComm((PetscObject)sf),PETSC_ERR_LIB,"Open MPI is known to be buggy (https://svn.open-mpi.org/trac/ompi/ticket/1905 and 2656), use -acknowledge_ompi_onesided_bug to proceed");
}
#endif
PetscFunctionReturn(0);
}
开发者ID:masa-ito,项目名称:PETScToPoisson,代码行数:37,代码来源:sfwindow.c
示例3: matrix
/*@C
TaoDefaultComputeHessian - Computes the Hessian using finite differences.
Collective on Tao
Input Parameters:
+ tao - the Tao context
. V - compute Hessian at this point
- dummy - not used
Output Parameters:
+ H - Hessian matrix (not altered in this routine)
- B - newly computed Hessian matrix to use with preconditioner (generally the same as H)
Options Database Key:
. -tao_fd_hessian - activates TaoDefaultComputeHessian()
Level: advanced
Notes:
This routine is slow and expensive, and is not currently optimized
to take advantage of sparsity in the problem. Although
TaoDefaultComputeHessian() is not recommended for general use
in large-scale applications, It can be useful in checking the
correctness of a user-provided Hessian.
.seealso: TaoSetHessianRoutine(), TaoDefaultComputeHessianColor(), SNESComputeJacobianDefault(), TaoSetGradientRoutine(), TaoDefaultComputeGradient()
@*/
PetscErrorCode TaoDefaultComputeHessian(Tao tao,Vec V,Mat H,Mat B,void *dummy)
{
PetscErrorCode ierr;
Vec G;
SNES snes;
DM dm;
PetscFunctionBegin;
ierr = VecDuplicate(V,&G);CHKERRQ(ierr);
ierr = PetscInfo(tao,"TAO Using finite differences w/o coloring to compute Hessian matrix\n");CHKERRQ(ierr);
ierr = TaoComputeGradient(tao,V,G);CHKERRQ(ierr);
ierr = SNESCreate(PetscObjectComm((PetscObject)H),&snes);CHKERRQ(ierr);
ierr = SNESSetFunction(snes,G,Fsnes,tao);CHKERRQ(ierr);
ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
ierr = DMShellSetGlobalVector(dm,V);CHKERRQ(ierr);
ierr = SNESSetUp(snes);CHKERRQ(ierr);
if (H) {
PetscInt n,N;
ierr = VecGetSize(V,&N);CHKERRQ(ierr);
ierr = VecGetLocalSize(V,&n);CHKERRQ(ierr);
ierr = MatSetSizes(H,n,n,N,N);CHKERRQ(ierr);
ierr = MatSetUp(H);CHKERRQ(ierr);
}
if (B && B != H) {
PetscInt n,N;
ierr = VecGetSize(V,&N);CHKERRQ(ierr);
ierr = VecGetLocalSize(V,&n);CHKERRQ(ierr);
ierr = MatSetSizes(B,n,n,N,N);CHKERRQ(ierr);
ierr = MatSetUp(B);CHKERRQ(ierr);
}
ierr = SNESComputeJacobianDefault(snes,V,H,B,NULL);CHKERRQ(ierr);
ierr = SNESDestroy(&snes);CHKERRQ(ierr);
ierr = VecDestroy(&G);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:firedrakeproject,项目名称:petsc,代码行数:65,代码来源:fdiff.c
示例4: PetscDrawSetUpColormap_Shared
PetscErrorCode PetscDrawSetUpColormap_Shared(Display *display,int screen,Visual *visual,Colormap colormap)
{
XColor colordef,ecolordef;
unsigned char *red,*green,*blue;
int i,ncolors;
PetscErrorCode ierr;
PetscBool fast = PETSC_FALSE;
PetscFunctionBegin;
if (colormap) gColormap = colormap;
else gColormap = DefaultColormap(display,screen);
/* set the basic colors into the color map */
for (i=0; i<PETSC_DRAW_BASIC_COLORS; i++) {
XAllocNamedColor(display,gColormap,colornames[i],&colordef,&ecolordef);
gCmapping[i] = colordef.pixel;
}
/* set the uniform hue colors into the color map */
ncolors = 256-PETSC_DRAW_BASIC_COLORS;
ierr = PetscMalloc3(ncolors,&red,ncolors,&green,ncolors,&blue);CHKERRQ(ierr);
ierr = PetscDrawUtilitySetCmapHue(red,green,blue,ncolors);CHKERRQ(ierr);
ierr = PetscOptionsGetBool(NULL,NULL,"-draw_fast",&fast,NULL);CHKERRQ(ierr);
if (!fast) {
for (i=PETSC_DRAW_BASIC_COLORS; i<ncolors+PETSC_DRAW_BASIC_COLORS; i++) {
colordef.red = ((int)red[i-PETSC_DRAW_BASIC_COLORS] * 65535) / 255;
colordef.green = ((int)green[i-PETSC_DRAW_BASIC_COLORS] * 65535) / 255;
colordef.blue = ((int)blue[i-PETSC_DRAW_BASIC_COLORS] * 65535) / 255;
colordef.flags = DoRed | DoGreen | DoBlue;
XAllocColor(display,gColormap,&colordef);
gCmapping[i] = colordef.pixel;
}
}
ierr = PetscFree3(red,green,blue);CHKERRQ(ierr);
ierr = PetscInfo(0,"Successfully allocated colors\n");CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:wgapl,项目名称:petsc,代码行数:37,代码来源:xcolor.c
示例5: PetscPythonLoadLibrary
static PetscErrorCode PetscPythonLoadLibrary(const char pythonlib[])
{
PetscErrorCode ierr;
PetscFunctionBegin;
/* open the Python dynamic library */
ierr = PetscDLPyLibOpen(pythonlib);CHKERRQ(ierr);
ierr = PetscInfo1(0,"Python: loaded dynamic library %s\n", pythonlib);CHKERRQ(ierr);
/* look required symbols from the Python C-API */
ierr = PetscDLPyLibSym("_Py_NoneStruct" , &Py_None );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_GetVersion" , &Py_GetVersion );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_IsInitialized" , &Py_IsInitialized );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_InitializeEx" , &Py_InitializeEx );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_Finalize" , &Py_Finalize );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PySys_GetObject" , &PySys_GetObject );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PySys_SetArgv" , &PySys_SetArgv );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyObject_CallMethod" , &PyObject_CallMethod );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyImport_ImportModule" , &PyImport_ImportModule );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_IncRef" , &Py_IncRef );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("Py_DecRef" , &Py_DecRef );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_Clear" , &PyErr_Clear );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_Occurred" , &PyErr_Occurred );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_Fetch" , &PyErr_Fetch );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_NormalizeException", &PyErr_NormalizeException);CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_Display", &PyErr_Display );CHKERRQ(ierr);
ierr = PetscDLPyLibSym("PyErr_Restore", &PyErr_Restore );CHKERRQ(ierr);
/* XXX TODO: check that ALL symbols were there !!! */
if (!Py_None) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library");
if (!Py_GetVersion) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library");
if (!Py_IsInitialized) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library");
if (!Py_InitializeEx) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library");
if (!Py_Finalize) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library");
ierr = PetscInfo(0,"Python: all required symbols loaded from Python dynamic library\n");CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:erdc-cm,项目名称:petsc-dev,代码行数:36,代码来源:pythonsys.c
示例6: matrix
/*@C
TaoDefaultComputeHessian - Computes the Hessian using finite differences.
Collective on Tao
Input Parameters:
+ tao - the Tao context
. V - compute Hessian at this point
- dummy - not used
Output Parameters:
+ H - Hessian matrix (not altered in this routine)
- B - newly computed Hessian matrix to use with preconditioner (generally the same as H)
Options Database Key:
+ -tao_fd - Activates TaoDefaultComputeHessian()
- -tao_view_hessian - view the hessian after each evaluation using PETSC_VIEWER_STDOUT_WORLD
Level: advanced
Notes:
This routine is slow and expensive, and is not currently optimized
to take advantage of sparsity in the problem. Although
TaoDefaultComputeHessian() is not recommended for general use
in large-scale applications, It can be useful in checking the
correctness of a user-provided Hessian.
.seealso: TaoSetHessianRoutine(), TaoDefaultComputeHessianColor(), SNESComputeJacobianDefault(), TaoSetGradientRoutine(), TaoDefaultComputeGradient()
@*/
PetscErrorCode TaoDefaultComputeHessian(Tao tao,Vec V,Mat H,Mat B,void *dummy)
{
PetscErrorCode ierr;
MPI_Comm comm;
Vec G;
SNES snes;
PetscFunctionBegin;
PetscValidHeaderSpecific(V,VEC_CLASSID,2);
ierr = VecDuplicate(V,&G);CHKERRQ(ierr);
ierr = PetscInfo(tao,"TAO Using finite differences w/o coloring to compute Hessian matrix\n");CHKERRQ(ierr);
ierr = TaoComputeGradient(tao,V,G);CHKERRQ(ierr);
ierr = PetscObjectGetComm((PetscObject)H,&comm);CHKERRQ(ierr);
ierr = SNESCreate(comm,&snes);CHKERRQ(ierr);
ierr = SNESSetFunction(snes,G,Fsnes,tao);CHKERRQ(ierr);
ierr = SNESComputeJacobianDefault(snes,V,H,B,tao);CHKERRQ(ierr);
ierr = SNESDestroy(&snes);CHKERRQ(ierr);
ierr = VecDestroy(&G);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:haubentaucher,项目名称:petsc,代码行数:54,代码来源:fdiff.c
示例7: equations
/*@C
SNESDefaultConverged - Convergence test of the solvers for
systems of nonlinear equations (default).
Collective on SNES
Input Parameters:
+ snes - the SNES context
. it - the iteration (0 indicates before any Newton steps)
. xnorm - 2-norm of current iterate
. snorm - 2-norm of current step
. fnorm - 2-norm of function at current iterate
- dummy - unused context
Output Parameter:
. reason - one of
$ SNES_CONVERGED_FNORM_ABS - (fnorm < abstol),
$ SNES_CONVERGED_SNORM_RELATIVE - (snorm < stol*xnorm),
$ SNES_CONVERGED_FNORM_RELATIVE - (fnorm < rtol*fnorm0),
$ SNES_DIVERGED_FUNCTION_COUNT - (nfct > maxf),
$ SNES_DIVERGED_FNORM_NAN - (fnorm == NaN),
$ SNES_CONVERGED_ITERATING - (otherwise),
where
+ maxf - maximum number of function evaluations,
set with SNESSetTolerances()
. nfct - number of function evaluations,
. abstol - absolute function norm tolerance,
set with SNESSetTolerances()
- rtol - relative function norm tolerance, set with SNESSetTolerances()
Level: intermediate
.keywords: SNES, nonlinear, default, converged, convergence
.seealso: SNESSetConvergenceTest()
@*/
PetscErrorCode SNESDefaultConverged(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
{
PetscErrorCode ierr;
PetscFunctionBegin;
PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
PetscValidPointer(reason,6);
*reason = SNES_CONVERGED_ITERATING;
if (!it) {
/* set parameter for default relative tolerance convergence test */
snes->ttol = fnorm*snes->rtol;
}
if (PetscIsInfOrNanReal(fnorm)) {
ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
*reason = SNES_DIVERGED_FNORM_NAN;
} else if (fnorm < snes->abstol) {
ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e\n",(double)fnorm,(double)snes->abstol);CHKERRQ(ierr);
*reason = SNES_CONVERGED_FNORM_ABS;
} else if (snes->nfuncs >= snes->max_funcs) {
ierr = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr);
*reason = SNES_DIVERGED_FUNCTION_COUNT;
}
if (it && !*reason) {
if (fnorm <= snes->ttol) {
ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e (relative tolerance)\n",(double)fnorm,(double)snes->ttol);CHKERRQ(ierr);
*reason = SNES_CONVERGED_FNORM_RELATIVE;
} else if (snorm < snes->stol*xnorm) {
ierr = PetscInfo3(snes,"Converged due to small update length: %14.12e < %14.12e * %14.12e\n",(double)snorm,(double)snes->stol,(double)xnorm);CHKERRQ(ierr);
*reason = SNES_CONVERGED_SNORM_RELATIVE;
}
}
PetscFunctionReturn(0);
}
开发者ID:erdc-cm,项目名称:petsc-dev,代码行数:73,代码来源:snesut.c
示例8: KSPPGMRESCycle
static PetscErrorCode KSPPGMRESCycle(PetscInt *itcount,KSP ksp)
{
KSP_PGMRES *pgmres = (KSP_PGMRES*)(ksp->data);
PetscReal res_norm,res,newnorm;
PetscErrorCode ierr;
PetscInt it = 0,j,k;
PetscBool hapend = PETSC_FALSE;
PetscFunctionBegin;
if (itcount) *itcount = 0;
ierr = VecNormalize(VEC_VV(0),&res_norm);CHKERRQ(ierr);
res = res_norm;
*RS(0) = res_norm;
/* check for the convergence */
ierr = PetscObjectAMSTakeAccess((PetscObject)ksp);CHKERRQ(ierr);
ksp->rnorm = res;
ierr = PetscObjectAMSGrantAccess((PetscObject)ksp);CHKERRQ(ierr);
pgmres->it = it-2;
ierr = KSPLogResidualHistory(ksp,res);CHKERRQ(ierr);
ierr = KSPMonitor(ksp,ksp->its,res);CHKERRQ(ierr);
if (!res) {
ksp->reason = KSP_CONVERGED_ATOL;
ierr = PetscInfo(ksp,"Converged due to zero residual norm on entry\n");CHKERRQ(ierr);
PetscFunctionReturn(0);
}
ierr = (*ksp->converged)(ksp,ksp->its,res,&ksp->reason,ksp->cnvP);CHKERRQ(ierr);
for (; !ksp->reason; it++) {
Vec Zcur,Znext;
if (pgmres->vv_allocated <= it + VEC_OFFSET + 1) {
ierr = KSPGMRESGetNewVectors(ksp,it+1);CHKERRQ(ierr);
}
/* VEC_VV(it-1) is orthogonal, it will be normalized once the VecNorm arrives. */
Zcur = VEC_VV(it); /* Zcur is not yet orthogonal, but the VecMDot to orthogonalize it has been started. */
Znext = VEC_VV(it+1); /* This iteration will compute Znext, update with a deferred correction once we know how
* Zcur relates to the previous vectors, and start the reduction to orthogonalize it. */
if (it < pgmres->max_k+1 && ksp->its+1 < PetscMax(2,ksp->max_it)) { /* We don't know whether what we have computed is enough, so apply the matrix. */
ierr = KSP_PCApplyBAorAB(ksp,Zcur,Znext,VEC_TEMP_MATOP);CHKERRQ(ierr);
}
if (it > 1) { /* Complete the pending reduction */
ierr = VecNormEnd(VEC_VV(it-1),NORM_2,&newnorm);CHKERRQ(ierr);
*HH(it-1,it-2) = newnorm;
}
if (it > 0) { /* Finish the reduction computing the latest column of H */
ierr = VecMDotEnd(Zcur,it,&(VEC_VV(0)),HH(0,it-1));CHKERRQ(ierr);
}
if (it > 1) {
/* normalize the base vector from two iterations ago, basis is complete up to here */
ierr = VecScale(VEC_VV(it-1),1./ *HH(it-1,it-2));CHKERRQ(ierr);
ierr = KSPPGMRESUpdateHessenberg(ksp,it-2,&hapend,&res);CHKERRQ(ierr);
pgmres->it = it-2;
ksp->its++;
ksp->rnorm = res;
ierr = (*ksp->converged)(ksp,ksp->its,res,&ksp->reason,ksp->cnvP);CHKERRQ(ierr);
if (it < pgmres->max_k+1 || ksp->reason || ksp->its == ksp->max_it) { /* Monitor if we are done or still iterating, but not before a restart. */
ierr = KSPLogResidualHistory(ksp,res);CHKERRQ(ierr);
ierr = KSPMonitor(ksp,ksp->its,res);CHKERRQ(ierr);
}
if (ksp->reason) break;
/* Catch error in happy breakdown and signal convergence and break from loop */
if (hapend) {
if (ksp->errorifnotconverged) SETERRQ1(PetscObjectComm((PetscObject)ksp),PETSC_ERR_NOT_CONVERGED,"You reached the happy break down, but convergence was not indicated. Residual norm = %G",res);
else {
ksp->reason = KSP_DIVERGED_BREAKDOWN;
break;
}
}
if (!(it < pgmres->max_k+1 && ksp->its < ksp->max_it)) break;
/* The it-2 column of H was not scaled when we computed Zcur, apply correction */
ierr = VecScale(Zcur,1./ *HH(it-1,it-2));CHKERRQ(ierr);
/* And Znext computed in this iteration was computed using the under-scaled Zcur */
ierr = VecScale(Znext,1./ *HH(it-1,it-2));CHKERRQ(ierr);
/* In the previous iteration, we projected an unnormalized Zcur against the Krylov basis, so we need to fix the column of H resulting from that projection. */
for (k=0; k<it; k++) *HH(k,it-1) /= *HH(it-1,it-2);
/* When Zcur was projected against the Krylov basis, VV(it-1) was still not normalized, so fix that too. This
* column is complete except for HH(it,it-1) which we won't know until the next iteration. */
*HH(it-1,it-1) /= *HH(it-1,it-2);
}
if (it > 0) {
PetscScalar *work;
if (!pgmres->orthogwork) {ierr = PetscMalloc((pgmres->max_k + 2)*sizeof(PetscScalar),&pgmres->orthogwork);CHKERRQ(ierr);}
work = pgmres->orthogwork;
/* Apply correction computed by the VecMDot in the last iteration to Znext. The original form is
*
* Znext -= sum_{j=0}^{i-1} Z[j+1] * H[j,i-1]
*
* where
*
* Z[j] = sum_{k=0}^j V[k] * H[k,j-1]
*
//.........这里部分代码省略.........
开发者ID:feelpp,项目名称:debian-petsc,代码行数:101,代码来源:pgmres.c
示例9: petscNonlinearConverged
PetscErrorCode petscNonlinearConverged(SNES snes, PetscInt it, PetscReal xnorm, PetscReal snorm, PetscReal fnorm, SNESConvergedReason * reason, void * ctx)
{
FEProblem & problem = *static_cast<FEProblem *>(ctx);
NonlinearSystem & system = problem.getNonlinearSystem();
// Let's be nice and always check PETSc error codes.
PetscErrorCode ierr = 0;
// Temporary variables to store SNES tolerances. Usual C-style would be to declare
// but not initialize these... but it bothers me to leave anything uninitialized.
PetscReal atol = 0.; // absolute convergence tolerance
PetscReal rtol = 0.; // relative convergence tolerance
PetscReal stol = 0.; // convergence (step) tolerance in terms of the norm of the change in the solution between steps
PetscInt maxit = 0; // maximum number of iterations
PetscInt maxf = 0; // maximum number of function evaluations
// Ask the SNES object about its tolerances.
ierr = SNESGetTolerances(snes,
&atol,
&rtol,
&stol,
&maxit,
&maxf);
CHKERRABORT(problem.comm().get(),ierr);
// Get current number of function evaluations done by SNES.
PetscInt nfuncs = 0;
ierr = SNESGetNumberFunctionEvals(snes, &nfuncs);
CHKERRABORT(problem.comm().get(),ierr);
// See if SNESSetFunctionDomainError() has been called. Note:
// SNESSetFunctionDomainError() and SNESGetFunctionDomainError()
// were added in different releases of PETSc.
#if !PETSC_VERSION_LESS_THAN(3,3,0)
PetscBool domainerror;
ierr = SNESGetFunctionDomainError(snes, &domainerror);
CHKERRABORT(problem.comm().get(),ierr);
if (domainerror)
{
*reason = SNES_DIVERGED_FUNCTION_DOMAIN;
return 0;
}
#endif
// Error message that will be set by the FEProblem.
std::string msg;
// xnorm: 2-norm of current iterate
// snorm: 2-norm of current step
// fnorm: 2-norm of function at current iterate
MooseNonlinearConvergenceReason moose_reason = problem.checkNonlinearConvergence(msg,
it,
xnorm,
snorm,
fnorm,
rtol,
stol,
atol,
nfuncs,
maxf,
system._initial_residual_before_preset_bcs,
/*div_threshold=*/(1.0/rtol)*system._initial_residual_before_preset_bcs);
if (msg.length() > 0)
PetscInfo(snes, msg.c_str());
switch (moose_reason)
{
case MOOSE_NONLINEAR_ITERATING:
*reason = SNES_CONVERGED_ITERATING;
break;
case MOOSE_CONVERGED_FNORM_ABS:
*reason = SNES_CONVERGED_FNORM_ABS;
break;
case MOOSE_CONVERGED_FNORM_RELATIVE:
*reason = SNES_CONVERGED_FNORM_RELATIVE;
break;
case MOOSE_CONVERGED_SNORM_RELATIVE:
#if PETSC_VERSION_LESS_THAN(3,3,0)
*reason = SNES_CONVERGED_PNORM_RELATIVE;
#else
*reason = SNES_CONVERGED_SNORM_RELATIVE;
#endif
break;
case MOOSE_DIVERGED_FUNCTION_COUNT:
*reason = SNES_DIVERGED_FUNCTION_COUNT;
break;
case MOOSE_DIVERGED_FNORM_NAN:
*reason = SNES_DIVERGED_FNORM_NAN;
break;
case MOOSE_DIVERGED_LINE_SEARCH:
#if PETSC_VERSION_LESS_THAN(3,2,0)
*reason = SNES_DIVERGED_LS_FAILURE;
#else
//.........这里部分代码省略.........
开发者ID:architagar,项目名称:moose,代码行数:101,代码来源:PetscSupport.C
示例10: TaoSolve_NM
static PetscErrorCode TaoSolve_NM(Tao tao)
{
PetscErrorCode ierr;
TAO_NelderMead *nm = (TAO_NelderMead*)tao->data;
TaoConvergedReason reason;
PetscReal *x;
PetscInt i;
Vec Xmur=nm->Xmur, Xmue=nm->Xmue, Xmuc=nm->Xmuc, Xbar=nm->Xbar;
PetscReal fr,fe,fc;
PetscInt shrink;
PetscInt low,high;
PetscFunctionBegin;
nm->nshrink = 0;
nm->nreflect = 0;
nm->nincontract = 0;
nm->noutcontract = 0;
nm->nexpand = 0;
if (tao->XL || tao->XU || tao->ops->computebounds) {
ierr = PetscPrintf(((PetscObject)tao)->comm,"WARNING: Variable bounds have been set but will be ignored by NelderMead algorithm\n");CHKERRQ(ierr);
}
ierr = VecCopy(tao->solution,nm->simplex[0]);CHKERRQ(ierr);
ierr = TaoComputeObjective(tao,nm->simplex[0],&nm->f_values[0]);CHKERRQ(ierr);
nm->indices[0]=0;
for (i=1;i<nm->N+1;i++){
ierr = VecCopy(tao->solution,nm->simplex[i]);CHKERRQ(ierr);
ierr = VecGetOwnershipRange(nm->simplex[i],&low,&high);CHKERRQ(ierr);
if (i-1 >= low && i-1 < high) {
ierr = VecGetArray(nm->simplex[i],&x);CHKERRQ(ierr);
x[i-1-low] += nm->lamda;
ierr = VecRestoreArray(nm->simplex[i],&x);CHKERRQ(ierr);
}
ierr = TaoComputeObjective(tao,nm->simplex[i],&nm->f_values[i]);CHKERRQ(ierr);
nm->indices[i] = i;
}
/* Xbar = (Sum of all simplex vectors - worst vector)/N */
ierr = NelderMeadSort(nm);CHKERRQ(ierr);
ierr = VecSet(Xbar,0.0);CHKERRQ(ierr);
for (i=0;i<nm->N;i++) {
ierr = VecAXPY(Xbar,1.0,nm->simplex[nm->indices[i]]);CHKERRQ(ierr);
}
ierr = VecScale(Xbar,nm->oneOverN);CHKERRQ(ierr);
reason = TAO_CONTINUE_ITERATING;
while (1) {
shrink = 0;
ierr = VecCopy(nm->simplex[nm->indices[0]],tao->solution);CHKERRQ(ierr);
ierr = TaoMonitor(tao,tao->niter++,nm->f_values[nm->indices[0]],nm->f_values[nm->indices[nm->N]]-nm->f_values[nm->indices[0]],0.0,1.0,&reason);CHKERRQ(ierr);
if (reason != TAO_CONTINUE_ITERATING) break;
/* x(mu) = (1 + mu)Xbar - mu*X_N+1 */
ierr = VecAXPBYPCZ(Xmur,1+nm->mu_r,-nm->mu_r,0,Xbar,nm->simplex[nm->indices[nm->N]]);CHKERRQ(ierr);
ierr = TaoComputeObjective(tao,Xmur,&fr);CHKERRQ(ierr);
if (nm->f_values[nm->indices[0]] <= fr && fr < nm->f_values[nm->indices[nm->N-1]]) {
/* reflect */
nm->nreflect++;
ierr = PetscInfo(0,"Reflect\n");CHKERRQ(ierr);
ierr = NelderMeadReplace(nm,nm->indices[nm->N],Xmur,fr);CHKERRQ(ierr);
} else if (fr < nm->f_values[nm->indices[0]]) {
/* expand */
nm->nexpand++;
ierr = PetscInfo(0,"Expand\n");CHKERRQ(ierr);
ierr = VecAXPBYPCZ(Xmue,1+nm->mu_e,-nm->mu_e,0,Xbar,nm->simplex[nm->indices[nm->N]]);CHKERRQ(ierr);
ierr = TaoComputeObjective(tao,Xmue,&fe);CHKERRQ(ierr);
if (fe < fr) {
ierr = NelderMeadReplace(nm,nm->indices[nm->N],Xmue,fe);CHKERRQ(ierr);
} else {
ierr = NelderMeadReplace(nm,nm->indices[nm->N],Xmur,fr);CHKERRQ(ierr);
}
} else if (nm->f_values[nm->indices[nm->N-1]] <= fr && fr < nm->f_values[nm->indices[nm->N]]) {
/* outside contraction */
nm->noutcontract++;
ierr = PetscInfo(0,"Outside Contraction\n");CHKERRQ(ierr);
ierr = VecAXPBYPCZ(Xmuc,1+nm->mu_oc,-nm->mu_oc,0,Xbar,nm->simplex[nm->indices[nm->N]]);CHKERRQ(ierr);
ierr = TaoComputeObjective(tao,Xmuc,&fc);CHKERRQ(ierr);
if (fc <= fr) {
ierr = NelderMeadReplace(nm,nm->indices[nm->N],Xmuc,fc);CHKERRQ(ierr);
} else shrink=1;
} else {
/* inside contraction */
nm->nincontract++;
ierr = PetscInfo(0,"Inside Contraction\n");CHKERRQ(ierr);
ierr = VecAXPBYPCZ(Xmuc,1+nm->mu_ic,-nm->mu_ic,0,Xbar,nm->simplex[nm->indices[nm->N]]);CHKERRQ(ierr);
ierr = TaoComputeObjective(tao,Xmuc,&fc);CHKERRQ(ierr);
if (fc < nm->f_values[nm->indices[nm->N]]) {
ierr = NelderMeadReplace(nm,nm->indices[nm->N],Xmuc,fc);CHKERRQ(ierr);
} else shrink = 1;
}
if (shrink) {
nm->nshrink++;
ierr = PetscInfo(0,"Shrink\n");CHKERRQ(ierr);
for (i=1;i<nm->N+1;i++) {
ierr = VecAXPBY(nm->simplex[nm->indices[i]],1.5,-0.5,nm->simplex[nm->indices[0]]);CHKERRQ(ierr);
//.........这里部分代码省略.........
开发者ID:tom-klotz,项目名称:petsc,代码行数:101,代码来源:neldermead.c
示例11: SNESSolve_NEWTONTR
/*
SNESSolve_NEWTONTR - Implements Newton's Method with a very simple trust
region approach for solving systems of nonlinear equations.
*/
static PetscErrorCode SNESSolve_NEWTONTR(SNES snes)
{
SNES_NEWTONTR *neP = (SNES_NEWTONTR*)snes->data;
Vec X,F,Y,G,Ytmp;
PetscErrorCode ierr;
PetscInt maxits,i,lits;
PetscReal rho,fnorm,gnorm,gpnorm,xnorm=0,delta,nrm,ynorm,norm1;
PetscScalar cnorm;
KSP ksp;
SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
PetscBool conv = PETSC_FALSE,breakout = PETSC_FALSE;
PetscFunctionBegin;
if (snes->xl || snes->xu || snes->ops->computevariablebounds) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_WRONGSTATE, "SNES solver %s does not support bounds", ((PetscObject)snes)->type_name);
maxits = snes->max_its; /* maximum number of iterations */
X = snes->vec_sol; /* solution vector */
F = snes->vec_func; /* residual vector */
Y = snes->work[0]; /* work vectors */
G = snes->work[1];
Ytmp = snes->work[2];
ierr = PetscObjectSAWsTakeAccess((PetscObject)snes);CHKERRQ(ierr);
snes->iter = 0;
ierr = PetscObjectSAWsGrantAccess((PetscObject)snes);CHKERRQ(ierr);
if (!snes->vec_func_init_set) {
ierr = SNESComputeFunction(snes,X,F);CHKERRQ(ierr); /* F(X) */
} else snes->vec_func_init_set = PETSC_FALSE;
ierr = VecNorm(F,NORM_2,&fnorm);CHKERRQ(ierr); /* fnorm <- || F || */
SNESCheckFunctionNorm(snes,fnorm);
ierr = VecNorm(X,NORM_2,&xnorm);CHKERRQ(ierr); /* fnorm <- || F || */
ierr = PetscObjectSAWsTakeAccess((PetscObject)snes);CHKERRQ(ierr);
snes->norm = fnorm;
ierr = PetscObjectSAWsGrantAccess((PetscObject)snes);CHKERRQ(ierr);
delta = xnorm ? neP->delta0*xnorm : neP->delta0;
neP->delta = delta;
ierr = SNESLogConvergenceHistory(snes,fnorm,0);CHKERRQ(ierr);
ierr = SNESMonitor(snes,0,fnorm);CHKERRQ(ierr);
/* test convergence */
ierr = (*snes->ops->converged)(snes,snes->iter,0.0,0.0,fnorm,&snes->reason,snes->cnvP);CHKERRQ(ierr);
if (snes->reason) PetscFunctionReturn(0);
/* Set the stopping criteria to use the More' trick. */
ierr = PetscOptionsGetBool(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-snes_tr_ksp_regular_convergence_test",&conv,NULL);CHKERRQ(ierr);
if (!conv) {
SNES_TR_KSPConverged_Ctx *ctx;
ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
ierr = PetscNew(&ctx);CHKERRQ(ierr);
ctx->snes = snes;
ierr = KSPConvergedDefaultCreate(&ctx->ctx);CHKERRQ(ierr);
ierr = KSPSetConvergenceTest(ksp,SNESTR_KSPConverged_Private,ctx,SNESTR_KSPConverged_Destroy);CHKERRQ(ierr);
ierr = PetscInfo(snes,"Using Krylov convergence test SNESTR_KSPConverged_Private\n");CHKERRQ(ierr);
}
for (i=0; i<maxits; i++) {
/* Call general purpose update function */
if (snes->ops->update) {
ierr = (*snes->ops->update)(snes, snes->iter);CHKERRQ(ierr);
}
/* Solve J Y = F, where J is Jacobian matrix */
ierr = SNESComputeJacobian(snes,X,snes->jacobian,snes->jacobian_pre);CHKERRQ(ierr);
SNESCheckJacobianDomainerror(snes);
ierr = KSPSetOperators(snes->ksp,snes->jacobian,snes->jacobian_pre);CHKERRQ(ierr);
ierr = KSPSolve(snes->ksp,F,Ytmp);CHKERRQ(ierr);
ierr = KSPGetIterationNumber(snes->ksp,&lits);CHKERRQ(ierr);
snes->linear_its += lits;
ierr = PetscInfo2(snes,"iter=%D, linear solve iterations=%D\n",snes->iter,lits);CHKERRQ(ierr);
ierr = VecNorm(Ytmp,NORM_2,&nrm);CHKERRQ(ierr);
norm1 = nrm;
while (1) {
ierr = VecCopy(Ytmp,Y);CHKERRQ(ierr);
nrm = norm1;
/* Scale Y if need be and predict new value of F norm */
if (nrm >= delta) {
nrm = delta/nrm;
gpnorm = (1.0 - nrm)*fnorm;
cnorm = nrm;
ierr = PetscInfo1(snes,"Scaling direction by %g\n",(double)nrm);CHKERRQ(ierr);
ierr = VecScale(Y,cnorm);CHKERRQ(ierr);
nrm = gpnorm;
ynorm = delta;
} else {
gpnorm = 0.0;
ierr = PetscInfo(snes,"Direction is in Trust Region\n");CHKERRQ(ierr);
ynorm = nrm;
}
//.........这里部分代码省略.........
开发者ID:firedrakeproject,项目名称:petsc,代码行数:101,代码来源:tr.c
示例12: MatSeqBAIJSetNumericFactorization_inplace
PetscErrorCode MatSeqBAIJSetNumericFactorization_inplace(Mat inA,PetscBool natural)
{
PetscFunctionBegin;
if (natural) {
switch (inA->rmap->bs) {
case 1:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_1_inplace;
break;
case 2:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_2_NaturalOrdering_inplace;
break;
case 3:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_3_NaturalOrdering_inplace;
break;
case 4:
#if defined(PETSC_USE_REAL_MAT_SINGLE)
{
PetscBool sse_enabled_local;
PetscErrorCode ierr;
ierr = PetscSSEIsEnabled(inA->comm,&sse_enabled_local,NULL);CHKERRQ(ierr);
if (sse_enabled_local) {
# if defined(PETSC_HAVE_SSE)
int i,*AJ=a->j,nz=a->nz,n=a->mbs;
if (n==(unsigned short)n) {
unsigned short *aj=(unsigned short*)AJ;
for (i=0; i<nz; i++) aj[i] = (unsigned short)AJ[i];
inA->ops->setunfactored = MatSetUnfactored_SeqBAIJ_4_NaturalOrdering_SSE_usj;
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_4_NaturalOrdering_SSE_usj;
ierr = PetscInfo(inA,"Using special SSE, in-place natural ordering, ushort j index factor BS=4\n");CHKERRQ(ierr);
} else {
/* Scale the column indices for easier indexing in MatSolve. */
/* for (i=0;i<nz;i++) { */
/* AJ[i] = AJ[i]*4; */
/* } */
inA->ops->setunfactored = MatSetUnfactored_SeqBAIJ_4_NaturalOrdering_SSE;
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_4_NaturalOrdering_SSE;
ierr = PetscInfo(inA,"Using special SSE, in-place natural ordering, int j index factor BS=4\n");CHKERRQ(ierr);
}
# else
/* This should never be reached. If so, problem in PetscSSEIsEnabled. */
SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"SSE Hardware unavailable");
# endif
} else {
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_4_NaturalOrdering_inplace;
}
}
#else
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_4_NaturalOrdering_inplace;
#endif
break;
case 5:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_5_NaturalOrdering_inplace;
break;
case 6:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_6_NaturalOrdering_inplace;
break;
case 7:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_7_NaturalOrdering_inplace;
break;
default:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_N_inplace;
break;
}
} else {
switch (inA->rmap->bs) {
case 1:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_1_inplace;
break;
case 2:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_2_inplace;
break;
case 3:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_3_inplace;
break;
case 4:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_4_inplace;
break;
case 5:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_5_inplace;
break;
case 6:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_6_inplace;
break;
case 7:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_7_inplace;
break;
default:
inA->ops->lufactornumeric = MatLUFactorNumeric_SeqBAIJ_N_inplace;
break;
}
}
PetscFunctionReturn(0);
}
开发者ID:masa-ito,项目名称:PETScToPoisson,代码行数:96,代码来源:baijfact3.c
示例13: iterate
/* @
TaoApply_BoundLineSearch - This routine performs a line search algorithm.
Input Parameters:
+ tao - TAO_SOLVER context
. X - current iterate (on output X contains new iterate, X + step*S)
. S - search direction
. f - objective function evaluated at X
. G - gradient evaluated at X
. W - work vector
- step - initial estimate of step length
Output parameters:
+ f - objective function evaluated at new iterate, X + step*S
. G - gradient evaluated at new iterate, X + step*S
. X - new iterate
. gnorm - 2-norm of G
- step - final step length
Info is set to one of:
+ 0 - the line search succeeds; the sufficient decrease
condition and the directional derivative condition hold
negative number if an input parameter is invalid
. -1 - step < 0
. -2 - ftol < 0
. -3 - rtol < 0
. -4 - gtol < 0
. -5 - stepmin < 0
. -6 - stepmax < stepmin
- -7 - maxfev < 0
positive number > 1 if the line search otherwise terminates
+ 2 - Relative width of the interval of uncertainty is
at most rtol.
. 3 - Maximum number of function evaluations (maxfev) has
been reached.
. 4 - Step is at the lower bound, stepmin.
. 5 - Step is at the upper bound, stepmax.
. 6 - Rounding errors may prevent further progress.
There may not be a step that satisfies the
sufficient decrease and curvature conditions.
Tolerances may be too small.
- 7 - Search direction is not a descent direction.
Notes:
This algorithm is is a modification of the algorithm by More' and
Thuente. The modifications concern bounds. This algorithm steps
in the direction passed into this routine. This point get
projected back into the feasible set. In the context of bound
constrained optimization, there may not be a point in the piecewise
linear path that satisfies the Wolfe conditions. When the active
set is changing, decrease in the objective function may be
sufficient to terminate this line search.
Note: Much of this coded is identical to the More' Thuente line search.
Variations to the code are commented.
Notes:
This routine is used within the following TAO bound constrained minimization
solvers: Newton linesearch (tao_tron) and limited memory variable metric
(tao_blmvm).
Level: advanced
.keywords: TAO_SOLVER, linesearch
@ */
static int TaoApply_BoundLineSearch(TAO_SOLVER tao,TaoVec* X,TaoVec* G,TaoVec* S,TaoVec* W,double *f, double *f_full,
double *step,TaoInt *info2,void*ctx)
{
TAO_LINESEARCH *neP = (TAO_LINESEARCH *) tao->linectx;
TaoVec *XL,*XU;
double xtrapf = 4.0;
double finit, width, width1, dginit, fm, fxm, fym, dgm, dgxm, dgym;
double dgx, dgy, dg, fx, fy, stx, sty, dgtest, ftest1=0.0, ftest2=0.0;
double bstepmin1, bstepmin2, bstepmax;
double dg1, dg2;
int info;
int need_gradient=0;
TaoInt i, stage1;
#if defined(PETSC_USE_COMPLEX)
PetscScalar cdginit, cdg, cstep = 0.0;
#endif
TaoFunctionBegin;
/* neP->stepmin - lower bound for step */
/* neP->stepmax - upper bound for step */
/* neP->rtol - relative tolerance for an acceptable step */
/* neP->ftol - tolerance for sufficient decrease condition */
/* neP->gtol - tolerance for curvature condition */
/* neP->nfev - number of function evaluations */
/* neP->maxfev - maximum number of function evaluations */
/* Check input parameters for errors */
if (*step < 0.0) {
info = PetscInfo1(tao,"TaoApply_BoundLineSearch:Line search error: step (%g) < 0\n",*step); CHKERRQ(info);
*info2 = -1; TaoFunctionReturn(0);
}
//.........这里部分代码省略.........
开发者ID:fuentesdt,项目名称:tao-1.10.1-p3,代码行数:101,代码来源:morethuente.c
示例14: MatLUFactorSymbolic_SeqBAIJ_inplace
PetscErrorCode MatLUFactorSymbolic_SeqBAIJ_inplace(Mat B,Mat A,IS isrow,IS iscol,const MatFactorInfo *info)
{
Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data,*b;
PetscInt n =a->mbs,bs = A->rmap->bs,bs2=a->bs2;
PetscBool row_identity,col_identity,both_identity;
IS isicol;
PetscErrorCode ierr;
const PetscInt *r,*ic;
PetscInt i,*ai=a->i,*aj=a->j;
PetscInt *bi,*bj,*ajtmp;
PetscInt *bdiag,row,nnz,nzi,reallocs=0,nzbd,*im;
PetscReal f;
PetscInt nlnk,*lnk,k,**bi_ptr;
PetscFreeSpaceList free_space=NULL,current_space=NULL;
PetscBT lnkbt;
PetscBool missing;
PetscFunctionBegin;
if (A->rmap->N != A->cmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"matrix must be square");
ierr = MatMissingDiagonal(A,&missing,&i);CHKERRQ(ierr);
if (missing) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix is missing diagonal entry %D",i);
ierr = ISInvertPermutation(iscol,PETSC_DECIDE,&isicol);CHKERRQ(ierr);
ierr = ISGetIndices(isrow,&r);CHKERRQ(ierr);
ierr = ISGetIndices(isicol,&ic);CHKERRQ(ierr);
/* get new row and diagonal pointers, must be allocated separately because they will be given to the Mat_SeqAIJ and freed separately */
ierr = PetscMalloc1(n+1,&bi);CHKERRQ(ierr);
ierr = PetscMalloc1(n+1,&bdiag);CHKERRQ(ierr);
bi[0] = bdiag[0] = 0;
/* linked list for storing column indices of the active row */
nlnk = n + 1;
ierr = PetscLLCreate(n,n,nlnk,lnk,lnkbt);CHKERRQ(ierr);
ierr = PetscMalloc2(n+1,&bi_ptr,n+1,&im);CHKERRQ(ierr);
/* initial FreeSpace size is f*(ai[n]+1) */
f = info->fill;
ierr = PetscFreeSpaceGet(PetscRealIntMultTruncate(f,ai[n]+1),&free_space);CHKERRQ(ierr);
current_space = free_space;
for (i=0; i<n; i++) {
/* copy previous fill into linked list */
nzi = 0;
nnz = ai[r[i]+1] - ai[r[i]];
ajtmp = aj + ai[r[i]];
ierr = PetscLLAddPerm(nnz,ajtmp,ic,n,nlnk,lnk,lnkbt);CHKERRQ(ierr);
nzi += nlnk;
/* add pivot rows into linked list */
row = lnk[n];
while (row < i) {
nzbd = bdiag[row] - bi[row] + 1; /* num of entries in the row with column index <= row */
ajtmp = bi_ptr[row] + nzbd; /* points to the entry next to the diagonal */
ierr = PetscLLAddSortedLU(ajtmp,row,nlnk,lnk,lnkbt,i,nzbd,im);CHKERRQ(ierr);
nzi += nlnk;
row = lnk[row];
}
bi[i+1] = bi[i] + nzi;
im[i] = nzi;
/* mark bdiag */
nzbd = 0;
nnz = nzi;
k = lnk[n];
while (nnz-- && k < i) {
nzbd++;
k = lnk[k];
}
bdiag[i] = bi[i] + nzbd;
/* if free space is not available, make more free space */
if (current_space->local_remaining<nzi) {
nnz = PetscIntMultTruncate(n - i,nzi); /* estimated and max additional space needed */
ierr = PetscFreeSpaceGet(nnz,¤t_space);CHKERRQ(ierr);
reallocs++;
}
/* copy data into free space, then initialize lnk */
ierr = PetscLLClean(n,n,nzi,lnk,current_space->array,lnkbt);CHKERRQ(ierr);
bi_ptr[i] = current_space->array;
current_space->array += nzi;
current_space->local_used += nzi;
current_space->local_remaining -= nzi;
}
#if defined(PETSC_USE_INFO)
if (ai[n] != 0) {
PetscReal af = ((PetscReal)bi[n])/((PetscReal)ai[n]);
ierr = PetscInfo3(A,"Reallocs %D Fill ratio:given %g needed %g\n",
|
请发表评论