Actual source code: xmonitor.c

  1: #include "tao.h"
  2: #include "petscdraw.h"

  4: typedef struct{
  5:   PetscLogDouble t0;
  6:   PetscDraw Draw1,Draw2;
  7:   PetscDrawLG LG1,LG2;
  8:   TAO_SOLVER tao;
  9: }TaoXMonitor;

 11: int TaoPetscXMonitor(TAO_SOLVER, void *);
 12: int DestroyTaoPetscXMonitor(void *);


 15: int TaoSetPetscXMonitor(TAO_SOLVER tao){
 16:   int info;
 17:   TaoXMonitor *mctx;
 19:   PetscNew(TaoXMonitor,&mctx);
 20:   mctx->tao=tao;
 21:   info=TaoSetMonitor(tao,TaoPetscXMonitor,(void*)mctx); CHKERRQ(info);
 22:   info=TaoSetDestroyRoutine(tao,DestroyTaoPetscXMonitor,(void*)mctx); CHKERRQ(info);
 23:   return(0);
 24: }

 26: int TaoPetscXMonitor(TAO_SOLVER ttao, void *mctx){
 27:   TaoXMonitor *mntr = (TaoXMonitor*) mctx;
 28:   TAO_SOLVER  tao= mntr->tao;
 29:   int info,iter,rank=0;
 30:   char display[51];
 31:   PetscLogDouble t1;
 32:   PetscReal t2,fff;
 33:   double ff,Norm1,norm2,norm3;
 34:   TaoTerminateReason reason;
 35:   PetscTruth flag;


 39:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 40: 
 41:   if (rank){
 42:     return(0);
 43:   }


 46:   info = TaoGetSolutionStatus(tao,&iter,&ff,&Norm1,&norm2,&norm3,&reason);CHKERRQ(info);

 48:   if (iter==0){
 49:     info = PetscOptionsGetenv(PETSC_COMM_WORLD,"DISPLAY",display,50,&flag);
 50:     CHKERRQ(info);
 51:     info = PetscDrawCreate(PETSC_COMM_WORLD,display,
 52:                       "Function Value",
 53:                       0,0,500,150,&mntr->Draw1);CHKERRQ(info);
 54:     info = PetscDrawCreate(PETSC_COMM_WORLD,display,
 55:                       "Residual of Optimality Conditions",
 56:                       0,175,500,150,&mntr->Draw2);CHKERRQ(info);
 57:     info = PetscDrawSetFromOptions(mntr->Draw1); CHKERRQ(info);
 58:     info = PetscDrawSetFromOptions(mntr->Draw2); CHKERRQ(info);
 59:     info = PetscDrawLGCreate(mntr->Draw1,1,&mntr->LG1); CHKERRQ(info);
 60:     info = PetscDrawLGCreate(mntr->Draw2,1,&mntr->LG2); CHKERRQ(info);
 61:     info = PetscGetCPUTime(&mntr->t0); CHKERRQ(info);
 62:   }

 64:   info = PetscGetCPUTime(&t1); CHKERRQ(info);
 65:   t1 = t1 - mntr->t0;
 66:   t2=t1;
 67:   fff=ff;
 68:   info = PetscDrawLGAddPoint(mntr->LG1,&t2,&fff); CHKERRQ(info);
 69:   info = PetscDrawLGDraw(mntr->LG1); CHKERRQ(info);
 70:   fff=Norm1;
 71:   info = PetscDrawLGAddPoint(mntr->LG2,&t2,&fff); CHKERRQ(info);
 72:   info = PetscDrawLGDraw(mntr->LG2); CHKERRQ(info);

 74:   return(0);
 75: }

 79: int DestroyTaoPetscXMonitor(void *ctx){

 81:   TaoXMonitor * mntr = (TaoXMonitor *) ctx;
 82:   int info;

 85:   info = PetscSleep(-1); CHKERRQ(info);
 86:   info =  PetscDrawLGDestroy(mntr->LG1); CHKERRQ(info);
 87:   info =  PetscDrawLGDestroy(mntr->LG2); CHKERRQ(info);
 88:   info =  PetscDrawDestroy(mntr->Draw1); CHKERRQ(info);
 89:   info =  PetscDrawDestroy(mntr->Draw2); CHKERRQ(info);
 90:   info = PetscFree(ctx); CHKERRQ(info);
 91:   return(0);
 92: }