Exemple #1
0
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**)&param);
    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,&param->pi,param->pi ,"procs_x","<DO NOT SET> Processors in the x-direction");
    REG_INTG(user->bag,&param->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;
}
Exemple #2
0
void PETSC_STDCALL  darestoreglobalvector_(DM dm,Vec* g, int *__ierr ){
*__ierr = DARestoreGlobalVector(
	(DM)PetscToPointer((dm) ),g);
}
Exemple #3
0
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**)&param);
    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;
}