[petsc-users] Solving a very simple time step problem:

Andrew Spott andrew.spott at gmail.com
Tue May 1 13:27:24 CDT 2012


This is actually what I figured, but I haven't seen the jacobian used in this context before, and wanted to make sure before I bugged you guys with a more complicated problem.

I am attempting to do a very basic linear time stepping problem:

u_t = H(t) u

Where H(t) = H0 + a(t) * H'

Where a(t) is just a scalar function of time, and H' has nothing on the diagonal (but is symmetric) and H0 is diagonal

I'm following ex4.c because my problem is very similar to that one, using a linear rhs.

I create my time step context, and the matrix to use:

    //creating wave function, creating 

    MatCreate(world, &A);
    MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,evalues.size(),evalues.size());
    MatSetType(A,MATMPIAIJ);
    MatSetFromOptions(A);
    MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);     // I don't know why I need these lines, but when I don't have them, the program complains about the matrix being in the wrong state.
    MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);

    TSCreate(world, &timeStepContext);
    TSSetProblemType(timeStepContext,TS_LINEAR);
    TSMonitorSet(timeStepContext,Monitor,&cntx,PETSC_NULL);
    TSSetType(timeStepContext,TSCN);

    TSSetRHSFunction(timeStepContext,PETSC_NULL,TSComputeRHSFunctionLinear,&cntx);
    TSSetRHSJacobian(timeStepContext,A,A,*Hamiltonian,&cntx);
    TSSetInitialTimeStep(timeStepContext,0.0,cntx.params->dt());
    TSSetSolution(timeStepContext,wavefunction);

Then, my hamiltonian function is:

PetscErrorCode Hamiltonian(TS timeStepContext, PetscReal t, Vec u, Mat *A, Mat *B, MatStructure *flag, void* context)
{
    Mat h = *A;
    PetscErrorCode  err;
    Context         *cntx = (Context*)context;
    PetscScalar     ef = eField(t, cntx->params);
    
    
    MatDuplicate(cntx->energy_eigenstates,MAT_COPY_VALUES,&h);
    MatAXPY(h, ef, cntx->dipole_matrix, DIFFERENT_NONZERO_PATTERN);
    
    MatAssemblyBegin(h, MAT_FINAL_ASSEMBLY);
    MatAssemblyEnd(h, MAT_FINAL_ASSEMBLY);

    //If I test the matrix 'h' here, against a vector (1,0,0….), I get the correct results that I would expect.
}
 

But this doesn't work.  my "Monitor" function writes the wave function to disk, but it remains (1,0,0,0…,0,0)

When I do a test on h inside the Hamiltonian function, (create a vector that is (1,0,0,0…0,0), and multiply it by h), I get the expected results, so the matrices are correct, and h is being created, but when I write out the vector as it is time stepped, (in the monitor function), nothing changes (I get (1,0,0,0…,0,0) for each time step)

My monitor code for reference:

PetscErrorCode Monitor(TS ts, PetscInt step, PetscReal t, Vec u, void *cntx)
{
    Context         *context = (Context*) cntx;
    PetscErrorCode  ierr;
    PetscScalar     ef = eField(t, context->params);
    if (step < 30)
    {
        std::stringstream s("");
        s << step;
        ierr = PetscViewerASCIIOpen(context->world, context->params->getWaveFunctionFilename().append(s.str()).append(".dat").c_str(),&context->view);
        ierr = PetscViewerSetFormat(context->view,	 PETSC_VIEWER_ASCII_SYMMODU);
        ierr = VecView(u, context->view);
    }
    return ierr;
}

I'm sorry to bug you guys with this, but I'm a little lost on where even to start looking for an error…

Thanks as always for the help,

-Andrew


On May 1, 2012, at 8:36 AM, Matthew Knepley wrote:

> On Tue, May 1, 2012 at 10:24 AM, Hong Zhang <hzhang at mcs.anl.gov> wrote:
> Andrew :
> We have TS examples under
> ~/src/ts/examples/tutorials/
> /src/ts/examples/tests
> 
> Hong
> I want to solve a very simple equation:
> 
> u_t = F(t) u
> 
> Where F(t) = H_0 + a(t) H' (H_0 and H' are constant matrices, and a(t) is a time dependent scalar).
> 
> But I'm not sure how to go about doing this using the TS context.
> 
> I don't have a Jacobian that I need to be worried about, so should I be doing:
> 
> I am not sure I understand what you mean. Your Jacobian above is F(t), so it does change. You can
> of course do this MF since it will be exact, just probably more expensive.
> 
>    Matt
>  
> TSSetRHSFunction(ts,PETSC_NULL,myRHSFunction,&appctx);
> TSSetRHSJacobian(ts,A,A,TSComputeRHSJacobianConstant,&appctx);
> 
> Where:
> myRHSFunction(TS ts,PetscReal t,Vec u,Vec F,void *ctx)
> {
>        //Create temporary matrix A = H_0 + a(t) H'
>        //then do F = A u
> }
> 
> Or should I be doing something else?
> 
> Thanks for the help, unfortunately, it looks like the documentation on TS in the manual isn't accurate.
> 
> -Andrew
> 
> 
> 
> 
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> -- Norbert Wiener

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120501/f4a4adca/attachment.htm>


More information about the petsc-users mailing list