/** * Implicit part of the method - Poisson + nConv*Helmholtz */ void VelocityCorrectionScheme::SolveUnsteadyStokesSystem( const Array<OneD, const Array<OneD, NekDouble> > &inarray, Array<OneD, Array<OneD, NekDouble> > &outarray, const NekDouble time, const NekDouble aii_Dt) { int i; int phystot = m_fields[0]->GetTotPoints(); Array<OneD, Array< OneD, NekDouble> > F(m_nConvectiveFields); for(i = 0; i < m_nConvectiveFields; ++i) { F[i] = Array<OneD, NekDouble> (phystot, 0.0); } // Enforcing boundary conditions on all fields SetBoundaryConditions(time); // Substep the pressure boundary condition if using substepping m_extrapolation->SubStepSetPressureBCs(inarray,aii_Dt,m_kinvis); // Set up forcing term for pressure Poisson equation SetUpPressureForcing(inarray, F, aii_Dt); // Solve Pressure System SolvePressure (F[0]); // Set up forcing term for Helmholtz problems SetUpViscousForcing(inarray, F, aii_Dt); // Solve velocity system SolveViscous( F, outarray, aii_Dt); }
PetscErrorCode PressurePoisson( UserContext *uc ) { Mat A; Vec b, px, py, p, u, v, ss, c; KSP ksp; PetscErrorCode ierr; PetscFunctionBegin; PetscLogEventBegin(EVENT_PressurePoisson,0,0,0,0); PetscLogEventRegister(&EVENT_PressurePoisson,"PressurePoisson", 0); /* Assemble and Solve for pressure */ ierr = PetscPrintf(PETSC_COMM_WORLD, "***********************\nPRESSURE\n"); CHKERRQ(ierr); ierr = AssemblePressureMatrx( uc ); CHKERRQ(ierr); ierr = AssemblePressureRHS( uc ); CHKERRQ(ierr); ierr = SolvePressure( uc ); CHKERRQ(ierr); ierr = WriteResult( uc, uc->p, "p_pressure" ); CHKERRQ(ierr); /* Assemble and Solve for Velocity */ ierr = PetscPrintf(PETSC_COMM_WORLD, "***********************\nVELOCITY\n"); CHKERRQ(ierr); ierr = AssembleVelocityRHS( uc ); CHKERRQ(ierr); ierr = AssembleVelocityMatrix( uc ); CHKERRQ(ierr); ierr = KSPSetOperators(uc->ksp,uc->A, uc->A, SAME_PRECONDITIONER); CHKERRQ(ierr); ierr = KSPSolve(uc->ksp,uc->px,uc->u);CHKERRQ(ierr); ierr = KSPSolve(uc->ksp,uc->py,uc->v);CHKERRQ(ierr); ierr = WriteResult( uc, uc->u, "u_velocity" ); CHKERRQ(ierr); ierr = WriteResult( uc, uc->v, "v_velocity" ); CHKERRQ(ierr); ierr = ComputeShearStress(uc); CHKERRQ(ierr); ierr = WriteResult( uc, uc->ss,"shear_stress" ); CHKERRQ(ierr); ierr = ConservationTest(uc); CHKERRQ(ierr); /* Output indexing */ PetscReal *idx; VecGetArray(uc->b,&idx); for( int i = 0; i < uc->numNodes; i++) idx[i] = i; VecRestoreArray(uc->b,&idx); WriteResult(uc, uc->b, "indexes"); VecSet(uc->b, 0.); ierr = VecDestroy(uc->c); CHKERRQ(ierr); ierr = VecDestroy(uc->ss); CHKERRQ(ierr); ierr = MatDestroy(uc->A); CHKERRQ(ierr); ierr = KSPDestroy(uc->ksp); CHKERRQ(ierr); ierr = VecDestroy(uc->b); CHKERRQ(ierr); ierr = VecDestroy(uc->p); CHKERRQ(ierr); ierr = VecDestroy(uc->px); CHKERRQ(ierr); ierr = VecDestroy(uc->py); CHKERRQ(ierr); ierr = VecDestroy(uc->u); CHKERRQ(ierr); ierr = VecDestroy(uc->v); CHKERRQ(ierr); PetscLogEventEnd(EVENT_PressurePoisson,0,0,0,0); PetscFunctionReturn(0); }