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: }