PetscErrorCode PostStep(TS ts) { PetscErrorCode ierr; Vec X; AppCtx *user; PetscReal t; PetscScalar asum; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); /* if (t >= .2) { ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); ierr = VecView(X,PETSC_VIEWER_BINARY_WORLD);CHKERRQ(ierr); exit(0); results in initial conditions after fault in binaryoutput }*/ if ((t > user->tf) && (t < user->tcl)) user->Pmax = 0.0; /* A short-circuit that drives the electrical power output (Pmax*sin(delta)) to zero */ else user->Pmax = user->Pmax_s; ierr = VecSum(X,&asum);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"sum(p) at t = %f = %f\n",(double)t,(double)(asum));CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode _preStage(TS ts, PetscReal stage_time) { PetscTimeStepper *ths; PetscErrorCode ierr; PetscReal stepsize; int step; ierr = TSGetApplicationContext(ts,&ths);CHKERRQ(ierr); ierr = TSGetTimeStep(ts,&stepsize);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&step);CHKERRQ(ierr); ths->preStage(stage_time,step+1,stepsize); return 0; }
PetscErrorCode EvalMisfit(TS ts) { PetscErrorCode ierr; Userctx *user; Vec X; PetscReal t; Vec Xgen,Xnet; PetscScalar *xnet, *proj_vec; PetscInt obs_len,i,idx; PetscReal step_num; PetscScalar *mat; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); //!t = t - user->tdisturb; t = t - user->trestore; step_num = round(t / user->data_dt); if(fabs(step_num - t/user->data_dt)<= 1e-6*user->dt) { ierr = VecGetArray(user->proj,&proj_vec);CHKERRQ(ierr); ierr = VecGetSize(user->proj, &obs_len);CHKERRQ(ierr); idx = 2*obs_len*(PetscInt) step_num; ierr = DMCompositeGetLocalVectors(user->dmpgrid,&Xgen,&Xnet);CHKERRQ(ierr); ierr = DMCompositeScatter(user->dmpgrid,X,Xgen,Xnet);CHKERRQ(ierr); ierr = VecGetArray(Xnet,&xnet);CHKERRQ(ierr); ierr = MatDenseGetArray(user->obs,&mat);CHKERRQ(ierr); for(i=0;i<obs_len; i++) { user->misfit += 0.5*pow(xnet[2*((int)proj_vec[i])] - mat[idx+2*i], 2) / pow(user->data_stddev[i], 2); // obs[2*i, num_obs] user->misfit += 0.5*pow(xnet[2*((int)proj_vec[i])+1] - mat[idx+2*i+1],2) / pow(user->data_stddev[i+1], 2);// obs[2*i+1, num_obs] } //printf("evm %g %g idx=%d\n", xnet[0], mat[idx], idx); ierr = MatDenseRestoreArray(user->obs,&mat);CHKERRQ(ierr); ierr = VecRestoreArray(Xnet,&xnet);CHKERRQ(ierr); ierr = DMCompositeRestoreLocalVectors(user->dmpgrid,&Xgen,&Xnet);CHKERRQ(ierr); ierr = VecRestoreArray(user->proj,&proj_vec);CHKERRQ(ierr); } user->stepnum++; PetscFunctionReturn(0); }
PetscErrorCode PostStep(TS ts) { PetscErrorCode ierr; Vec X; AppCtx *user; PetscScalar sum; PetscReal t; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); ierr = VecSum(X,&sum);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"sum(p)*dw*dtheta at t = %3.2f = %3.6f\n",t,sum*user->dx*user->dy);CHKERRQ(ierr); PetscFunctionReturn(0); }
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); }
PetscErrorCode DomainErrorFunction(TS ts, PetscReal t, Vec Y, PetscBool *accept) { AppCtx *user; PetscReal dt; PetscErrorCode ierr; const PetscScalar *x; PetscInt nb_cells, i; ierr = TSGetApplicationContext(ts, &user);CHKERRQ(ierr); nb_cells = user->nb_cells; ierr = VecGetArrayRead(Y, &x);CHKERRQ(ierr); for(i = 0 ; i < 2*nb_cells ; ++i) { if(PetscRealPart(x[i]) < 0) { ierr = TSGetTimeStep(ts, &dt);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD, " ** Domain Error at time %g\n", (double)t);CHKERRQ(ierr); *accept = PETSC_FALSE; break; } } ierr = VecRestoreArrayRead(Y, &x);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode SaveSolution(TS ts) { PetscErrorCode ierr; Userctx *user; Vec X; PetscScalar *x,*mat; PetscInt idx; PetscReal t; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); idx = user->stepnum*(user->neqs_pgrid+1); ierr = MatDenseGetArray(user->Sol,&mat);CHKERRQ(ierr); ierr = VecGetArray(X,&x);CHKERRQ(ierr); mat[idx] = t; ierr = PetscMemcpy(mat+idx+1,x,user->neqs_pgrid*sizeof(PetscScalar));CHKERRQ(ierr); ierr = MatDenseRestoreArray(user->Sol,&mat);CHKERRQ(ierr); ierr = VecRestoreArray(X,&x);CHKERRQ(ierr); user->stepnum++; PetscFunctionReturn(0); }
PetscErrorCode PostStep(TS ts) { PetscErrorCode ierr; Vec X,gc; AppCtx *user; PetscScalar sum = 0,asum; PetscReal t,**p; DMDACoor2d **coors; DM cda; PetscInt i,j,xs,ys,xm,ym; PetscFunctionBegin; ierr = TSGetApplicationContext(ts,&user);CHKERRQ(ierr); ierr = TSGetTime(ts,&t);CHKERRQ(ierr); ierr = TSGetSolution(ts,&X);CHKERRQ(ierr); ierr = DMGetCoordinateDM(user->da,&cda);CHKERRQ(ierr); ierr = DMDAGetCorners(cda,&xs,&ys,0,&xm,&ym,0);CHKERRQ(ierr); ierr = DMGetCoordinates(user->da,&gc);CHKERRQ(ierr); ierr = DMDAVecGetArray(cda,gc,&coors);CHKERRQ(ierr); ierr = DMDAVecGetArray(user->da,X,&p);CHKERRQ(ierr); for (i=xs; i < xs+xm; i++) { for (j=ys; j < ys+ym; j++) { // printf("i %d j %d y %g %g\n",i,j,coors[j][i].y,p[j][i]); if (coors[j][i].y < 5) sum += p[j][i]; } } ierr = DMDAVecRestoreArray(cda,gc,&coors);CHKERRQ(ierr); ierr = DMDAVecRestoreArray(user->da,X,&p);CHKERRQ(ierr); ierr = MPI_Allreduce(&sum,&asum,1,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)ts));CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"sum(p)*dw*dtheta at t = %f = %f\n",(double)t,(double)(asum));CHKERRQ(ierr); if (sum < 1.0e-2) { ierr = TSSetConvergedReason(ts,TS_CONVERGED_USER);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Exiting TS as the integral of PDF is almost zero\n");CHKERRQ(ierr); } PetscFunctionReturn(0); }
void PETSC_STDCALL tsgetapplicationcontext_(TS ts,void*usrP, int *__ierr ){ *__ierr = TSGetApplicationContext( (TS)PetscToPointer((ts) ),usrP); }