| Line 136... |
Line 136... |
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
break;
|
break;
|
default:
|
default:
|
if (st->sigma != 0.0) {
|
if (st->sigma != 0.0) {
|
ierr = MatDuplicate(st->A,MAT_COPY_VALUES,&st->mat);CHKERRQ(ierr);
|
ierr = MatDuplicate(st->A,MAT_COPY_VALUES,&st->mat);CHKERRQ(ierr);
|
if (st->B) {
|
if (st->B) { ierr = MatAXPY(st->mat,-st->sigma,st->B,st->str);CHKERRQ(ierr); }
|
ierr = MatAXPY(st->mat,-st->sigma,st->B,st->str);CHKERRQ(ierr);
|
else { ierr = MatShift(st->mat,-st->sigma);CHKERRQ(ierr); }
|
} else {
|
|
ierr = MatShift(st->mat,-st->sigma);CHKERRQ(ierr);
|
|
}
|
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
} else {
|
} else {
|
st->mat = PETSC_NULL;
|
st->mat = PETSC_NULL;
|
ierr = KSPSetOperators(st->ksp,st->A,st->A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->A,st->A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
}
|
}
|
}
|
}
|
|
|
ierr = KSPSetUp(st->ksp);CHKERRQ(ierr);
|
ierr = KSPSetUp(st->ksp);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
| Line 162... |
Line 158... |
MatStructure flg;
|
MatStructure flg;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
/* Nothing to be done if STSetUp has not been called yet */
|
/* Nothing to be done if STSetUp has not been called yet */
|
if (!st->setupcalled) PetscFunctionReturn(0);
|
if (!st->setupcalled) PetscFunctionReturn(0);
|
|
|
/* Check if the new KSP matrix has the same zero structure */
|
/* Check if the new KSP matrix has the same zero structure */
|
if (st->B && st->str == DIFFERENT_NONZERO_PATTERN && (st->sigma == 0.0 || newshift == 0.0)) {
|
if (st->B && st->str == DIFFERENT_NONZERO_PATTERN && (st->sigma == 0.0 || newshift == 0.0)) {
|
flg = DIFFERENT_NONZERO_PATTERN;
|
flg = DIFFERENT_NONZERO_PATTERN;
|
} else {
|
} else {
|
flg = SAME_NONZERO_PATTERN;
|
flg = SAME_NONZERO_PATTERN;
|
| Line 191... |
Line 187... |
}
|
}
|
}
|
}
|
ierr = KSPSetOperators(st->ksp,st->A,st->A,flg);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->A,st->A,flg);CHKERRQ(ierr);
|
break;
|
break;
|
case ST_MATMODE_SHELL:
|
case ST_MATMODE_SHELL:
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
break;
|
break;
|
default:
|
default:
|
if (st->mat) {
|
if (st->mat) {
|
ierr = MatCopy(st->A,st->mat,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr);
|
ierr = MatCopy(st->A,st->mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
|
} else {
|
} else {
|
ierr = MatDuplicate(st->A,MAT_COPY_VALUES,&st->mat);CHKERRQ(ierr);
|
ierr = MatDuplicate(st->A,MAT_COPY_VALUES,&st->mat);CHKERRQ(ierr);
|
}
|
}
|
if (newshift != 0.0) {
|
if (newshift != 0.0) {
|
if (st->B) {
|
if (st->B) { ierr = MatAXPY(st->mat,-newshift,st->B,st->str);CHKERRQ(ierr); }
|
ierr = MatAXPY(st->mat,-newshift,st->B,st->str);CHKERRQ(ierr);
|
else { ierr = MatShift(st->mat,-newshift);CHKERRQ(ierr); }
|
} else {
|
|
ierr = MatShift(st->mat,-newshift);CHKERRQ(ierr);
|
|
}
|
|
}
|
}
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,flg);CHKERRQ(ierr);
|
ierr = KSPSetOperators(st->ksp,st->mat,st->mat,flg);CHKERRQ(ierr);
|
}
|
}
|
st->sigma = newshift;
|
st->sigma = newshift;
|
ierr = KSPSetUp(st->ksp);CHKERRQ(ierr);
|
ierr = KSPSetUp(st->ksp);CHKERRQ(ierr);
|