static PetscErrorCode PCSetFromOptions_Composite(PC pc) { PC_Composite *jac = (PC_Composite*)pc->data; PetscErrorCode ierr; PetscInt nmax = 8,i; PC_CompositeLink next; char *pcs[8]; PetscBool flg; PetscFunctionBegin; ierr = PetscOptionsHead("Composite preconditioner options");CHKERRQ(ierr); ierr = PetscOptionsEnum("-pc_composite_type","Type of composition","PCCompositeSetType",PCCompositeTypes,(PetscEnum)jac->type,(PetscEnum*)&jac->type,&flg);CHKERRQ(ierr); if (flg) { ierr = PCCompositeSetType(pc,jac->type);CHKERRQ(ierr); } ierr = PetscOptionsStringArray("-pc_composite_pcs","List of composite solvers","PCCompositeAddPC",pcs,&nmax,&flg);CHKERRQ(ierr); if (flg) { for (i=0; i<nmax; i++) { ierr = PCCompositeAddPC(pc,pcs[i]);CHKERRQ(ierr); ierr = PetscFree(pcs[i]);CHKERRQ(ierr); /* deallocate string pcs[i], which is allocated in PetscOptionsStringArray() */ } } ierr = PetscOptionsTail();CHKERRQ(ierr); next = jac->head; while (next) { ierr = PCSetFromOptions(next->pc);CHKERRQ(ierr); next = next->next; } PetscFunctionReturn(0); }
static PetscErrorCode SNESSetFromOptions_Composite(PetscOptionItems *PetscOptionsObject,SNES snes) { SNES_Composite *jac = (SNES_Composite*)snes->data; PetscErrorCode ierr; PetscInt nmax = 8,i; SNES_CompositeLink next; char *sneses[8]; PetscReal dmps[8]; PetscBool flg; PetscFunctionBegin; ierr = PetscOptionsHead(PetscOptionsObject,"Composite preconditioner options");CHKERRQ(ierr); ierr = PetscOptionsEnum("-snes_composite_type","Type of composition","SNESCompositeSetType",SNESCompositeTypes,(PetscEnum)jac->type,(PetscEnum*)&jac->type,&flg);CHKERRQ(ierr); if (flg) { ierr = SNESCompositeSetType(snes,jac->type);CHKERRQ(ierr); } ierr = PetscOptionsStringArray("-snes_composite_sneses","List of composite solvers","SNESCompositeAddSNES",sneses,&nmax,&flg);CHKERRQ(ierr); if (flg) { for (i=0; i<nmax; i++) { ierr = SNESCompositeAddSNES(snes,sneses[i]);CHKERRQ(ierr); ierr = PetscFree(sneses[i]);CHKERRQ(ierr); /* deallocate string sneses[i], which is allocated in PetscOptionsStringArray() */ } } ierr = PetscOptionsRealArray("-snes_composite_damping","Damping of the additive composite solvers","SNESCompositeSetDamping",dmps,&nmax,&flg);CHKERRQ(ierr); if (flg) { for (i=0; i<nmax; i++) { ierr = SNESCompositeSetDamping(snes,i,dmps[i]);CHKERRQ(ierr); } } ierr = PetscOptionsReal("-snes_composite_stol","Step tolerance for restart on the additive composite solvers","",jac->stol,&jac->stol,NULL);CHKERRQ(ierr); ierr = PetscOptionsReal("-snes_composite_rtol","Residual tolerance for the additive composite solvers","",jac->rtol,&jac->rtol,NULL);CHKERRQ(ierr); ierr = PetscOptionsTail();CHKERRQ(ierr); next = jac->head; while (next) { ierr = SNESSetFromOptions(next->snes);CHKERRQ(ierr); next = next->next; } PetscFunctionReturn(0); }