PetscErrorCode PetscStackViewAMS(void) { AMS_Comm acomm; PetscErrorCode ierr; AMS_Memory mem; PetscStack* petscstackp; petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr); PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem)); PetscStackCallAMS(AMS_Memory_take_access,(mem)); PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); PetscStackCallAMS(AMS_Memory_publish,(mem)); PetscStackCallAMS(AMS_Memory_grant_access,(mem)); amsmemstack = mem; return 0; }
/*@C KSPMonitorAMS - monitor solution using AMS Logically Collective on KSP Input Parameters: + ksp - iterative context . n - iteration number . rnorm - 2-norm (preconditioned) residual value (may be estimated). - ctx - PetscViewer of type AMS Level: advanced .keywords: KSP, CG, monitor, AMS, singular values .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerAMSOpen() @*/ PetscErrorCode KSPMonitorAMS(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx) { #if defined(PETSC_HAVE_AMS) PetscErrorCode ierr; KSPMonitor_AMS *mon = (KSPMonitor_AMS*)ctx; PetscViewer viewer = mon->viewer; PetscReal emax,emin;; AMS_Comm acomm; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); ierr = KSPComputeExtremeSingularValues(ksp,&emax,&emin);CHKERRQ(ierr); /* UnPublish */ if (mon->amem != -1) {ierr = AMS_Memory_destroy(mon->amem);CHKERRQ(ierr);} mon->amem = -1; ierr = PetscFree(mon->eigr);CHKERRQ(ierr); ierr = PetscMalloc(2*n*sizeof(PetscReal),&mon->eigr);CHKERRQ(ierr); mon->eigi = mon->eigr + n; if (n) {ierr = KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);CHKERRQ(ierr);} ierr = PetscViewerAMSGetAMSComm(viewer,&acomm);CHKERRQ(ierr); ierr = AMS_Memory_create(acomm,"ksp_monitor_ams",&mon->amem);CHKERRQ(ierr); ierr = AMS_Memory_take_access(mon->amem);CHKERRQ(ierr); ierr = AMS_Memory_add_field(mon->amem,"rnorm",&ksp->rnorm,1,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); ierr = AMS_Memory_add_field(mon->amem,"neigs",&mon->neigs,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); if (mon->neigs > 0) { ierr = AMS_Memory_add_field(mon->amem,"eigr",&mon->eigr,mon->neigs,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); ierr = AMS_Memory_add_field(mon->amem,"eigi",&mon->eigr,mon->neigs,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); } ierr = AMS_Memory_publish(mon->amem);CHKERRQ(ierr); ierr = AMS_Memory_grant_access(mon->amem);CHKERRQ(ierr); ierr = PetscInfo2(ksp,"KSP extreme singular values min=%G max=%G\n",emin,emax);CHKERRQ(ierr); PetscFunctionReturn(0); #else PetscFunctionBegin; SETERRQ(((PetscObject)ksp)->comm,PETSC_ERR_SUP,"Missing package AMS"); PetscFunctionReturn(0); #endif }