static PetscErrorCode VecMaxPointwiseDivide_Nest(Vec x,Vec y,PetscReal *max) { Vec_Nest *bx = (Vec_Nest*)x->data; Vec_Nest *by = (Vec_Nest*)y->data; PetscInt i,nr; PetscReal local_max,m; PetscErrorCode ierr; PetscFunctionBegin; VecNestCheckCompatible2(x,1,y,2); nr = bx->nb; m = 0.0; for (i=0; i<nr; i++) { ierr = VecMaxPointwiseDivide(bx->v[i],by->v[i],&local_max);CHKERRQ(ierr); if (local_max > m) m = local_max; } *max = m; PetscFunctionReturn(0); }
PetscErrorCode VecMaxPointwiseDivide_MultiVec(Vec x, Vec y, PetscScalar* max) { #if !defined(NDEBUG) TBOX_ASSERT(x); TBOX_ASSERT(y); #endif Vec_MultiVec* mx = static_cast<Vec_MultiVec*>(x->data); Vec_MultiVec* my = static_cast<Vec_MultiVec*>(y->data); #if !defined(NDEBUG) TBOX_ASSERT(mx); TBOX_ASSERT(my); TBOX_ASSERT(mx->n == my->n); #endif PetscErrorCode ierr; *max = PETSC_MIN_REAL; for (PetscInt k = 0; k < mx->n; ++k) { PetscScalar component_max; ierr = VecMaxPointwiseDivide(mx->array[k], my->array[k], &component_max); CHKERRQ(ierr); *max = std::max(*max, component_max); } PetscFunctionReturn(0); } // VecMaxPointwiseDivide_MultiVec