virtual TimeStepperStatus step(Real *ftime) { PetscErrorCode ierr; TSConvergedReason reason; ierr = TSStep(_ts); CHKERRABORT(libMesh::COMM_WORLD,ierr); ierr = TSGetConvergedReason(_ts,&reason); CHKERRABORT(libMesh::COMM_WORLD,ierr); ierr = TSGetTime(_ts,ftime); CHKERRABORT(libMesh::COMM_WORLD,ierr); return (TimeStepperStatus)reason; }
double TimeIntegration_PETSc::solveTimeStep(Vlasov *vlasov, Fields *fields, TestParticles *particles, Timing &timing) { if(timeIntegrationScheme == "Implicit_RK4") { PETScMatrixVector pMV(vlasov, fields); TSSetTimeStep(ts, dt); TSStep(ts); // Get Solution Vec Vec_F1; cmplxd *x_F1; TSGetSolution(ts, &Vec_F1); VecGetArray(Vec_F1, &x_F1); // copy whole phase space function (waste but starting point) (important due to bounday conditions // we can built wrapper around this and directly pass it for(int x = NxLlD, n = 0; x <= NxLuD; x++) { for(int y_k = NkyLlD; y_k <= NkyLuD; y_k++) { for(int z = NzLlD; z <= NzLuD; z++) { for(int v = NvLlD ; v <= NvLuD; v++) { for(int m = NmLlD ; m <= NmLuD ; m++ ) { for(int s = NsLlD; s <= NsLuD; s++) { vlasov->fs(x,y_k,z,v,m,s) = x_F1[n]; vlasov->f(x,y_k,z,v,m,s) = x_F1[n++]; }}} }}} fields->solve(vlasov->f0, vlasov->f); VecRestoreArray (Vec_F1, &x_F1); timing.time += dt; timing.step++; writeTimeStep(timing, maxTiming, dt); } else TimeIntegration::solveTimeStep(vlasov, fields, particles, timing); return dt; }
void PETSC_STDCALL tsstep_(TS ts, int *__ierr ){ *__ierr = TSStep( (TS)PetscToPointer((ts) )); }