183a0a5c3SToby Isaac #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/ 283a0a5c3SToby Isaac 383a0a5c3SToby Isaac typedef struct _n_TaoShell Tao_Shell; 483a0a5c3SToby Isaac 59371c9d4SSatish Balay struct _n_TaoShell { 683a0a5c3SToby Isaac PetscErrorCode (*solve)(Tao); 783a0a5c3SToby Isaac void *ctx; 883a0a5c3SToby Isaac }; 983a0a5c3SToby Isaac 1083a0a5c3SToby Isaac /*@C 1183a0a5c3SToby Isaac TaoShellSetSolve - Sets routine to apply as solver 1283a0a5c3SToby Isaac 13*c3339decSBarry Smith Logically Collective 1483a0a5c3SToby Isaac 1583a0a5c3SToby Isaac Input Parameters: 1683a0a5c3SToby Isaac + tao - the nonlinear solver context 1783a0a5c3SToby Isaac - solve - the application-provided solver routine 1883a0a5c3SToby Isaac 1983a0a5c3SToby Isaac Calling sequence of solve: 2083a0a5c3SToby Isaac .vb 2183a0a5c3SToby Isaac PetscErrorCode solve (Tao tao) 2283a0a5c3SToby Isaac .ve 2383a0a5c3SToby Isaac 2483a0a5c3SToby Isaac . tao - the optimizer, get the application context with TaoShellGetContext() 2583a0a5c3SToby Isaac 2683a0a5c3SToby Isaac Notes: 2783a0a5c3SToby Isaac the function MUST return an error code of 0 on success and nonzero on failure. 2883a0a5c3SToby Isaac 2983a0a5c3SToby Isaac Level: advanced 3083a0a5c3SToby Isaac 31db781477SPatrick Sanan .seealso: `TAOSHELL`, `TaoShellSetContext()`, `TaoShellGetContext()` 3283a0a5c3SToby Isaac @*/ 33d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoShellSetSolve(Tao tao, PetscErrorCode (*solve)(Tao)) 34d71ae5a4SJacob Faibussowitsch { 3583a0a5c3SToby Isaac Tao_Shell *shell = (Tao_Shell *)tao->data; 3683a0a5c3SToby Isaac 3783a0a5c3SToby Isaac PetscFunctionBegin; 3883a0a5c3SToby Isaac PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3983a0a5c3SToby Isaac shell->solve = solve; 4083a0a5c3SToby Isaac PetscFunctionReturn(0); 4183a0a5c3SToby Isaac } 4283a0a5c3SToby Isaac 4383a0a5c3SToby Isaac /*@ 4483a0a5c3SToby Isaac TaoShellGetContext - Returns the user-provided context associated with a shell Tao 4583a0a5c3SToby Isaac 4683a0a5c3SToby Isaac Not Collective 4783a0a5c3SToby Isaac 4883a0a5c3SToby Isaac Input Parameter: 4983a0a5c3SToby Isaac . tao - should have been created with TaoSetType(tao,TAOSHELL); 5083a0a5c3SToby Isaac 5183a0a5c3SToby Isaac Output Parameter: 5283a0a5c3SToby Isaac . ctx - the user provided context 5383a0a5c3SToby Isaac 5483a0a5c3SToby Isaac Level: advanced 5583a0a5c3SToby Isaac 5683a0a5c3SToby Isaac Notes: 5783a0a5c3SToby Isaac This routine is intended for use within various shell routines 5883a0a5c3SToby Isaac 59db781477SPatrick Sanan .seealso: `TaoCreateShell()`, `TaoShellSetContext()` 6083a0a5c3SToby Isaac @*/ 61d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoShellGetContext(Tao tao, void *ctx) 62d71ae5a4SJacob Faibussowitsch { 6383a0a5c3SToby Isaac PetscBool flg; 6483a0a5c3SToby Isaac 6583a0a5c3SToby Isaac PetscFunctionBegin; 6683a0a5c3SToby Isaac PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 6783a0a5c3SToby Isaac PetscValidPointer(ctx, 2); 689566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOSHELL, &flg)); 693ec1f749SStefano Zampini if (!flg) *(void **)ctx = NULL; 703ec1f749SStefano Zampini else *(void **)ctx = ((Tao_Shell *)(tao->data))->ctx; 7183a0a5c3SToby Isaac PetscFunctionReturn(0); 7283a0a5c3SToby Isaac } 7383a0a5c3SToby Isaac 7483a0a5c3SToby Isaac /*@ 7583a0a5c3SToby Isaac TaoShellSetContext - sets the context for a shell Tao 7683a0a5c3SToby Isaac 77*c3339decSBarry Smith Logically Collective 7883a0a5c3SToby Isaac 7983a0a5c3SToby Isaac Input Parameters: 8083a0a5c3SToby Isaac + tao - the shell Tao 8183a0a5c3SToby Isaac - ctx - the context 8283a0a5c3SToby Isaac 8383a0a5c3SToby Isaac Level: advanced 8483a0a5c3SToby Isaac 8583a0a5c3SToby Isaac Fortran Notes: 8683a0a5c3SToby Isaac The context can only be an integer or a PetscObject 8783a0a5c3SToby Isaac unfortunately it cannot be a Fortran array or derived type. 8883a0a5c3SToby Isaac 89db781477SPatrick Sanan .seealso: `TaoCreateShell()`, `TaoShellGetContext()` 9083a0a5c3SToby Isaac @*/ 91d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoShellSetContext(Tao tao, void *ctx) 92d71ae5a4SJacob Faibussowitsch { 9383a0a5c3SToby Isaac Tao_Shell *shell = (Tao_Shell *)tao->data; 9483a0a5c3SToby Isaac PetscBool flg; 9583a0a5c3SToby Isaac 9683a0a5c3SToby Isaac PetscFunctionBegin; 9783a0a5c3SToby Isaac PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 989566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOSHELL, &flg)); 9983a0a5c3SToby Isaac if (flg) shell->ctx = ctx; 10083a0a5c3SToby Isaac PetscFunctionReturn(0); 10183a0a5c3SToby Isaac } 10283a0a5c3SToby Isaac 103d71ae5a4SJacob Faibussowitsch static PetscErrorCode TaoSolve_Shell(Tao tao) 104d71ae5a4SJacob Faibussowitsch { 10583a0a5c3SToby Isaac Tao_Shell *shell = (Tao_Shell *)tao->data; 10683a0a5c3SToby Isaac 10783a0a5c3SToby Isaac PetscFunctionBegin; 1083c859ba3SBarry Smith PetscCheck(shell->solve, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Must call TaoShellSetSolve() first"); 10983a0a5c3SToby Isaac tao->reason = TAO_CONVERGED_USER; 1109566063dSJacob Faibussowitsch PetscCall((*(shell->solve))(tao)); 11183a0a5c3SToby Isaac PetscFunctionReturn(0); 11283a0a5c3SToby Isaac } 11383a0a5c3SToby Isaac 114d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoDestroy_Shell(Tao tao) 115d71ae5a4SJacob Faibussowitsch { 11683a0a5c3SToby Isaac PetscFunctionBegin; 1179566063dSJacob Faibussowitsch PetscCall(PetscFree(tao->data)); 11883a0a5c3SToby Isaac PetscFunctionReturn(0); 11983a0a5c3SToby Isaac } 12083a0a5c3SToby Isaac 121d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetUp_Shell(Tao tao) 122d71ae5a4SJacob Faibussowitsch { 12383a0a5c3SToby Isaac PetscFunctionBegin; 12483a0a5c3SToby Isaac PetscFunctionReturn(0); 12583a0a5c3SToby Isaac } 12683a0a5c3SToby Isaac 127d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetFromOptions_Shell(Tao tao, PetscOptionItems *PetscOptionsObject) 128d71ae5a4SJacob Faibussowitsch { 12983a0a5c3SToby Isaac PetscFunctionBegin; 13083a0a5c3SToby Isaac PetscFunctionReturn(0); 13183a0a5c3SToby Isaac } 13283a0a5c3SToby Isaac 133d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoView_Shell(Tao tao, PetscViewer viewer) 134d71ae5a4SJacob Faibussowitsch { 13583a0a5c3SToby Isaac PetscFunctionBegin; 13683a0a5c3SToby Isaac PetscFunctionReturn(0); 13783a0a5c3SToby Isaac } 13883a0a5c3SToby Isaac 13983a0a5c3SToby Isaac /*MC 14083a0a5c3SToby Isaac TAOSHELL - a user provided nonlinear solver 14183a0a5c3SToby Isaac 14283a0a5c3SToby Isaac Level: advanced 14383a0a5c3SToby Isaac 144db781477SPatrick Sanan .seealso: `TaoCreate()`, `Tao`, `TaoSetType()`, `TaoType` 14583a0a5c3SToby Isaac M*/ 146d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TaoCreate_Shell(Tao tao) 147d71ae5a4SJacob Faibussowitsch { 14883a0a5c3SToby Isaac Tao_Shell *shell; 14983a0a5c3SToby Isaac 15083a0a5c3SToby Isaac PetscFunctionBegin; 15183a0a5c3SToby Isaac tao->ops->destroy = TaoDestroy_Shell; 15283a0a5c3SToby Isaac tao->ops->setup = TaoSetUp_Shell; 15383a0a5c3SToby Isaac tao->ops->setfromoptions = TaoSetFromOptions_Shell; 15483a0a5c3SToby Isaac tao->ops->view = TaoView_Shell; 15583a0a5c3SToby Isaac tao->ops->solve = TaoSolve_Shell; 15683a0a5c3SToby Isaac 1574dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&shell)); 15883a0a5c3SToby Isaac tao->data = (void *)shell; 15983a0a5c3SToby Isaac PetscFunctionReturn(0); 16083a0a5c3SToby Isaac } 161