int main(int argc,char **argv) /*-----------------------------------------------------------------------*/ { DMMG *dmmg; /* multilevel grid structure */ AppCtx *user; /* user-defined work context */ Parameter *param; GridInfo grid; int ierr,result; MPI_Comm comm; DA da; PetscInitialize(&argc,&argv,(char *)0,help); comm = PETSC_COMM_WORLD; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set up the problem parameters. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = PetscMalloc(sizeof(AppCtx),&user); CHKERRQ(ierr); ierr = PetscBagCreate(comm,sizeof(Parameter),&(user->bag)); CHKERRQ(ierr); user->grid = &grid; ierr = SetParams(user); CHKERRQ(ierr); ierr = ReportParams(user); CHKERRQ(ierr); ierr = PetscBagGetData(user->bag,(void**)¶m); CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create distributed array multigrid object (DMMG) to manage parallel grid and vectors for principal unknowns (x) and governing residuals (f) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DMMGCreate(comm,grid.mglevels,user,&dmmg); CHKERRQ(ierr); ierr = DACreate2d(comm,grid.periodic,grid.stencil,grid.ni,grid.nj,PETSC_DECIDE,PETSC_DECIDE,grid.dof,grid.stencil_width,0,0,&da); CHKERRQ(ierr); ierr = DMMGSetDM(dmmg,(DM)da); CHKERRQ(ierr); ierr = DADestroy(da); CHKERRQ(ierr); ierr = DAGetInfo(da,PETSC_NULL,PETSC_NULL,PETSC_NULL,PETSC_NULL,&(param->pi),&(param->pj),PETSC_NULL,PETSC_NULL,PETSC_NULL,PETSC_NULL,PETSC_NULL); CHKERRQ(ierr); REG_INTG(user->bag,¶m->pi,param->pi ,"procs_x","<DO NOT SET> Processors in the x-direction"); REG_INTG(user->bag,¶m->pj,param->pj ,"procs_y","<DO NOT SET> Processors in the y-direction"); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create user context, set problem data, create vector data structures. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DAGetGlobalVector(da, &(user->Xold)); CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialize and solve the nonlinear system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = Initialize(dmmg); CHKERRQ(ierr); ierr = DoSolve(dmmg); CHKERRQ(ierr); if (param->verify) result = param->verify_result; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Free work space. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DARestoreGlobalVector(da, &(user->Xold)); CHKERRQ(ierr); ierr = PetscBagDestroy(user->bag); CHKERRQ(ierr); ierr = PetscFree(user); CHKERRQ(ierr); ierr = DMMGDestroy(dmmg); CHKERRQ(ierr); ierr = PetscFinalize(); CHKERRQ(ierr); return result; }
void PETSC_STDCALL darestoreglobalvector_(DM dm,Vec* g, int *__ierr ){ *__ierr = DARestoreGlobalVector( (DM)PetscToPointer((dm) ),g); }
int DoSolve(DMMG *dmmg) /* ------------------------------------------------------------------- */ { AppCtx *user = (AppCtx*)dmmg[0]->user; Parameter *param; PetscReal t_output = 0.0; int ierr, n_plot = 0, Ncomponents, components[3]; DA da = DMMGGetDA(dmmg); Vec Xstar; Characteristic c; ierr = PetscBagGetData(user->bag,(void**)¶m); CHKERRQ(ierr); ierr = DAGetGlobalVector(da, &Xstar); CHKERRQ(ierr); /*------------ BEGIN CHARACTERISTIC SETUP ---------------*/ ierr = CharacteristicCreate(PETSC_COMM_WORLD, &c); CHKERRQ(ierr); /* set up the velocity interpolation system */ Ncomponents = 2; components[0] = 0; components[1] = 1; ierr = CharacteristicSetVelocityInterpolationLocal(c, da, DMMGGetx(dmmg), user->Xold, Ncomponents, components, InterpVelocity2D, user); CHKERRQ(ierr); /* set up the fields interpolation system */ Ncomponents = 1; components[0] = 2; ierr = CharacteristicSetFieldInterpolationLocal(c, da, user->Xold, Ncomponents, components, InterpFields2D, user); CHKERRQ(ierr); /*------------ END CHARACTERISTIC SETUP ----------------*/ /* output initial data */ PetscPrintf(PETSC_COMM_WORLD," Initialization, Time: %5.4g\n", param->t); if (param->verify) { ierr = DoVerification(dmmg,user); CHKERRQ(ierr); } ierr = DoOutput(dmmg,n_plot); CHKERRQ(ierr); t_output += param->t_output_interval; n_plot++; /* timestep loop */ for (param->t=param->dt; param->t<=param->t_max; param->t+=param->dt) { if (param->n > param->N_steps) { PetscPrintf(PETSC_COMM_WORLD,"EXCEEDED MAX NUMBER OF TIMESTEPS! EXITING SOLVE!\n"); return 0; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve at time t & copy solution into solution vector. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Copy in the velocities to Xstar */ ierr = VecCopy(DMMGGetx(dmmg), Xstar); CHKERRQ(ierr); /* Put \phi_* into Xstar */ ierr = CharacteristicSolve(c, param->dt, Xstar); CHKERRQ(ierr); /* Copy the advected field into the solution \phi_t = \phi_* */ ierr = VecCopy(Xstar, DMMGGetx(dmmg)); CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copy new solution to old solution in prep for the next timestep. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = VecCopy(DMMGGetx(dmmg), user->Xold); CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Timestep complete, report and update counter. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ PetscPrintf(PETSC_COMM_WORLD," Step: %d, Time: %5.4g\n", param->n, param->t); param->n++; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Verify and make output. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if (param->verify) { ierr = DoVerification(dmmg,user); CHKERRQ(ierr); } if (param->t >= t_output) { ierr = DoOutput(dmmg,n_plot); CHKERRQ(ierr); t_output += param->t_output_interval; n_plot++; } } ierr = DARestoreGlobalVector(da, &Xstar); CHKERRQ(ierr); ierr = CharacteristicDestroy(c); CHKERRQ(ierr); return 0; }