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,rank=0;
 30:   PetscInt iter;
 31:   char display[51];
 32:   PetscLogDouble t1;
 33:   PetscReal t2,fff;
 34:   double ff,Norm1,norm2,norm3;
 35:   TaoTerminateReason reason;
 36:   PetscTruth flag;


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


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

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

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

 75:   return(0);
 76: }

 80: int DestroyTaoPetscXMonitor(void *ctx){

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

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