// Default constructor // Square is white and blank. Square::Square() : m_col(-1), m_row(-1), m_flag(FLAG_CLEAR), m_number(), m_red(255), m_green(255), m_blue(255) { SetText(puzT("")); SetSolution(puzT("")); // These will be filled in by the grid m_next.clear(); }
//Beware - FindSolution works only for 4x4 game!!! void Fifteen::FindSolution() { CopyTGameArray(GameArray, GameStartArray); points = 0; Set* nothing; Set* closedSet = new Set(); Set* openSet = new Set(); Set* best = NULL; openSet->add(openSet, 0, GameArray, openSet, nothing); while (!openSet->empty()) { openSet->best(openSet, best); closedSet->add(closedSet, best->G, best->move, best->prev, best); openSet->remove(openSet, best->move); CopyTGameArray(GameArray, best->move); if(best->H < 1) { SetSolution(best); ShowSolution(); closedSet->DeleteAll(closedSet); openSet->DeleteAll(openSet); return; } int zeroX; int zeroY; FindZero(zeroX, zeroY, best->move); for (int i = 0; i < 4; i++) { int dx = (-1) * ((zeroX > 0) && (i == 0)) + ((zeroX < SIZE - 1) && (i == 1)); int dy = (-1) * ((zeroY > 0) && (i == 2)) + ((zeroY < SIZE - 1) && (i == 3)); TGameArray newArray; CopyTGameArray(newArray, best->move); newArray[zeroX][zeroY] = best->move[zeroX+dx][zeroY+dy]; newArray[zeroX+dx][zeroY+dy] = 0; if(!closedSet->isAlready(closedSet, newArray)) { openSet->add(openSet, best->G + 1, newArray, best, nothing); } } } }
PetscErrorCode SaveObservation(TS ts) { PetscErrorCode ierr; Userctx *user; Vec X; PetscReal t; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); ierr = SetObservation(user,t,X);CHKERRQ(ierr); ierr = SetSolution(user,t,X);CHKERRQ(ierr); user->stepnum++; PetscFunctionReturn(0); }
TPZErrorIndicator::TPZErrorIndicator(int nstate, TPZVec<int>& dimstate, TPZVec<int>& statetoanalyse, TPZVec<REAL> &sol, TPZCompMesh *cmesh ){ if (cmesh) SetMesh(cmesh); else fMesh = 0; SetSolution (sol,nstate,dimstate,statetoanalyse); }
PetscErrorCode InitializeData(const PetscScalar* P, void *ctx0, double noise, PetscScalar data_dt) { TS ts; SNES snes_alg; PetscErrorCode ierr; Userctx *ctx = (Userctx*)ctx0; Vec X; Mat J; Vec F_alg; Vec Xdot; PetscInt i,j,m,n; PetscReal *mat; //PetscReal temp; PetscViewer obsView; PetscFunctionBegin; H[0] = P[0]; H[1] = P[1]; H[2] = P[2]; printf("InitializeData: x=[%.14f, %.14f, %.14f], obs_noise=%5.3f Nt = %4.2f, Nobs=%4.2f\n", H[0], H[1], H[2], noise, ((ctx->tfinal-ctx->t0)/ctx->dt)+1, ((ctx->tfinal-ctx->trestore)/ctx->data_dt)+1); if(ctx->t0 > ctx->tdisturb) { printf("t0 cannot be greater than tdisturb\n"); PetscFunctionReturn(-1); } if( (ctx->tdisturb >= ctx->trestore-1.0e-8) || (ctx->tdisturb >= ctx->tfinal-1.0e-8) ) { printf("tdisturb should be less than trestore and tfinal\n"); PetscFunctionReturn(-1); } //use the reference PD0 from t0 to t_disturb to ensure steady state for(i=0; i<3; i++) PD0[i] = PD0_ref[i]; ctx->stepnum = 0; ierr = DMCreateGlobalVector(ctx->dmpgrid,&X);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&J);CHKERRQ(ierr); ierr = MatSetSizes(J,PETSC_DECIDE,PETSC_DECIDE,ctx->neqs_pgrid,ctx->neqs_pgrid);CHKERRQ(ierr); ierr = MatSetFromOptions(J);CHKERRQ(ierr); ierr = PreallocateJacobian(J,ctx);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create timestepping solver context - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSSetType(ts,TSCN);CHKERRQ(ierr); ierr = TSSetIFunction(ts,NULL,(TSIFunction) IFunction,ctx);CHKERRQ(ierr); ierr = TSSetIJacobian(ts,J,J,(TSIJacobian)IJacobian,ctx);CHKERRQ(ierr); ierr = TSSetApplicationContext(ts,ctx);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set initial conditions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = SetInitialGuess(X,ctx);CHKERRQ(ierr); ierr = VecDuplicate(X,&F_alg);CHKERRQ(ierr); ierr = SNESCreate(PETSC_COMM_WORLD,&snes_alg);CHKERRQ(ierr); ierr = SNESSetFunction(snes_alg,F_alg,AlgFunction,ctx);CHKERRQ(ierr); ierr = MatZeroEntries(J);CHKERRQ(ierr); ierr = SNESSetJacobian(snes_alg,J,J,AlgJacobian,ctx);CHKERRQ(ierr); ierr = SNESSetOptionsPrefix(snes_alg,"alg_");CHKERRQ(ierr); ierr = SNESSetFromOptions(snes_alg);CHKERRQ(ierr); /* Solve the algebraic equations */ ierr = SNESSolve(snes_alg,NULL,X);CHKERRQ(ierr); ierr = SetSolution(ctx, ctx->t0, X); CHKERRQ(ierr); ierr = SetObservation(ctx, ctx->t0, X); CHKERRQ(ierr); /* Just to set up the Jacobian structure */ ierr = VecDuplicate(X,&Xdot);CHKERRQ(ierr); ierr = IJacobian(ts,ctx->t0,X,Xdot,0.0,J,J,ctx);CHKERRQ(ierr); ierr = VecDestroy(&Xdot);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve from on [t0,tdisturb] (steady state) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetDuration(ts,1000000,ctx->tdisturb);CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,ctx->t0,ctx->dt);CHKERRQ(ierr); ierr = TSSetFromOptions(ts);CHKERRQ(ierr); ierr = TSSetPostStep(ts,SaveObservation);CHKERRQ(ierr); /* Solve (from t0 to tdisturb) */ ierr = TSSolve(ts,X);CHKERRQ(ierr); /* set X at tdisturb as IC for the optimization/estimation */ /*ierr = VecDuplicate(X, &ctx->X0_disturb);CHKERRQ(ierr);*/ /*ierr = VecCopy(X, ctx->X0_disturb);CHKERRQ(ierr);*/ /* Continue integrating the DAE only if observations file is not specified */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve from on [tdisturb, trestore] (disturbance part of the transient) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Induce a load perturbation at t=tdisturb */ for(i=0; i<3; i++) PD0[i] = PD0_disturb[i]; printf("Generate data - initiated a bump in load: new PD0[0]=%g\n", PD0[0]); printf("Running with: tfinal=%.12f dt=%.12f data_dt=%.12f data_noise=%.12f prior_noise=%.12f load_disturb=%.12f\n", ctx->tfinal, ctx->dt, ctx->data_dt, ctx->data_noise, ctx->prior_noise, PD0[0]); /* Solve the algebraic equations */ ierr = SNESSolve(snes_alg,NULL,X);CHKERRQ(ierr); ierr = TSSetDuration(ts,100000,fmin(ctx->trestore,ctx->tfinal));CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,ctx->tdisturb,ctx->dt);CHKERRQ(ierr); /* Solve (from tdisturb to trestore) */ ierr = TSSolve(ts,X);CHKERRQ(ierr); /* set X at trestore as IC for the optimization/estimation */ ierr = VecDuplicate(X, &ctx->X0_disturb);CHKERRQ(ierr); ierr = VecCopy(X, ctx->X0_disturb);CHKERRQ(ierr); if(0==strlen(ctx->loadObsFile)) { /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve from on [trestore, tfinal] (post-disturbance transient) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if(ctx->tfinal>=ctx->trestore+1.0e-8) { //restore load at trestore for(i=0; i<3; i++) PD0[i] = PD0_ref[i]; printf("In generate data: Restore load to PD0[0]=%g\n", PD0[0]); /* Solve the algebraic equations */ ierr = SNESSolve(snes_alg,NULL,X);CHKERRQ(ierr); ierr = TSSetDuration(ts,100000,ctx->tfinal);CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,ctx->trestore,ctx->dt);CHKERRQ(ierr); /* Solve (from trestore to tfinal) */ ierr = TSSolve(ts,X);CHKERRQ(ierr); } else { printf("Ignoring trestore since tfinal is less than it.\n"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Generate noise at level 'noise' percent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = MatGetSize(ctx->obs, &m, &n);CHKERRQ(ierr); /* allocate std dev for data */ ierr = PetscMalloc(m*sizeof(PetscReal),&ctx->data_stddev);CHKERRQ(ierr); ierr = MatDenseGetArray(ctx->obs,&mat);CHKERRQ(ierr); for(i=0;i<m;i++) ctx->data_stddev[i] = ctx->data_noise; /* for(i=0; i<m; i++) { temp = 0.0; for(j=0; j<n; j++) { temp += mat[i*n+j]*mat[i*n+j]; } ctx->data_stddev[i] = ctx->data_noise*sqrt(temp); } */ for(i=0; i<m; i++) { for(j=0; j<n; j++) { mat[i*n+j] += ctx->data_stddev[i]*nrand(); } } ierr = MatDenseRestoreArray(ctx->obs,&mat);CHKERRQ(ierr); } else { /* observations are in an external file */ printf("Loading observations from %s.\n", ctx->loadObsFile); ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,ctx->loadObsFile,FILE_MODE_READ, &obsView);CHKERRQ(ierr); ierr = MatLoad(ctx->obs, obsView);CHKERRQ(ierr); ierr = PetscViewerDestroy(&obsView);CHKERRQ(ierr); ierr = MatGetSize(ctx->obs, &m, &n);CHKERRQ(ierr); ierr = PetscMalloc(m*sizeof(PetscReal),&ctx->data_stddev);CHKERRQ(ierr); for(i=0;i<m;i++) ctx->data_stddev[i] = ctx->data_noise; } ierr = SNESDestroy(&snes_alg);CHKERRQ(ierr); ierr = VecDestroy(&F_alg);CHKERRQ(ierr); ierr = MatDestroy(&J);CHKERRQ(ierr); ierr = VecDestroy(&X);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); PetscFunctionReturn(0); }