Пример #1
0
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);
}
Пример #2
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);
}
Пример #4
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);
}
Пример #6
0
Файл: ex42.c Проект: wgapl/petsc
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);
}
Пример #7
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);
}
Пример #8
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);
}
Пример #9
0
Файл: tsf.c Проект: Kun-Qu/petsc
void PETSC_STDCALL  tsgetapplicationcontext_(TS ts,void*usrP, int *__ierr ){
*__ierr = TSGetApplicationContext(
	(TS)PetscToPointer((ts) ),usrP);
}