Sundials CVODE: y vector values "lost"/corrupted after first call to RHSfunction

View: New views
2 Messages — Rating Filter:   Alert me  

Sundials CVODE: y vector values "lost"/corrupted after first call to RHSfunction

by bowens1 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello,

I am currently implementing CVODE into an in-house FEA code written in C++
that makes thorough use of object oriented programming. Within a particular
method of a class I am trying to implement CVODE. I have made my RHS
function a static function outside the class as I have seen done in the
examples. I am having some problem in that at the second call to the
RHSfunction the values passed in under "N_vector y" seem clearly incorrect.
For example my IVP for  the problem is [0.79 0 0] and the second call to RHS
function has the y vector as [-5.0784477968231915e+057
-5.0784477968231915e+057 -5.0784477968231915e+057]. It seems as though the y
vector is being corrupted some where in the main CVODE function.


To test out sundials I wrote a smaller matlab code that is not nearly as
robust as the C++ implementation. The matlab implementation worked with
great success. I am using the same settings in both C++ and matlab
implementations. Also the two implementations are giving identical output
during the first call to the RHS function, the  C++ code gives erroneous
results after this.

If needed here is my RHS function:

DiffusionModel is a class and user_data points to an object of this class
that I later assign to dmod. The method "solve_for_qdot()" solves for qdot
and assigns it to some data object "udot" local to the DiffusionModel class.
//==============================================================
static int RHSfunction(realtype t, N_Vector y, N_Vector ydot, void
*user_data)
{
       DiffusionModel* dmod;
       dmod =(DiffusionModel*)user_data;

       double *qdot;
       double *q;
       q = NV_DATA_S(y);
       dmod->solve_for_qdot(t,q);

       qdot = dmod->udot;
       ydot = N_VMake_Serial(dmod->totalNumDof,qdot);

       int flag=0;
       return flag;
}
//==============================================================

I greatly appreciate any help in this matter, and I'll be glad to provide
anymore details as needed.

Thanks,
Brian

Re: Sundials CVODE: y vector values "lost"/corrupted after first call to RHSfunction

by bowens1 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I have looked into the problem ore and determined this is more likely a problem with how "ydot" is being handled. I checked my assignment to ydot within the RHS function and the contents are correct. However, after adding a print statement in the CVODE code after the call to

retval = f(tn, zn[0], zn[1], user_data);

The values of "ydot" or "zn[1]" are much different than those that should to be output (based off what I am setting in the RHS function).

Based on what I've read from the documentation it seems that my definition of ydot in the RHS function should be adequate but perhaps I am missing something.

Thanks,
Brian


bowens1 wrote:
Hello,

I am currently implementing CVODE into an in-house FEA code written in C++
that makes thorough use of object oriented programming. Within a particular
method of a class I am trying to implement CVODE. I have made my RHS
function a static function outside the class as I have seen done in the
examples. I am having some problem in that at the second call to the
RHSfunction the values passed in under "N_vector y" seem clearly incorrect.
For example my IVP for  the problem is [0.79 0 0] and the second call to RHS
function has the y vector as [-5.0784477968231915e+057
-5.0784477968231915e+057 -5.0784477968231915e+057]. It seems as though the y
vector is being corrupted some where in the main CVODE function.


To test out sundials I wrote a smaller matlab code that is not nearly as
robust as the C++ implementation. The matlab implementation worked with
great success. I am using the same settings in both C++ and matlab
implementations. Also the two implementations are giving identical output
during the first call to the RHS function, the  C++ code gives erroneous
results after this.

If needed here is my RHS function:

DiffusionModel is a class and user_data points to an object of this class
that I later assign to dmod. The method "solve_for_qdot()" solves for qdot
and assigns it to some data object "udot" local to the DiffusionModel class.
//==============================================================
static int RHSfunction(realtype t, N_Vector y, N_Vector ydot, void
*user_data)
{
       DiffusionModel* dmod;
       dmod =(DiffusionModel*)user_data;

       double *qdot;
       double *q;
       q = NV_DATA_S(y);
       dmod->solve_for_qdot(t,q);

       qdot = dmod->udot;
       ydot = N_VMake_Serial(dmod->totalNumDof,qdot);

       int flag=0;
       return flag;
}
//==============================================================

I greatly appreciate any help in this matter, and I'll be glad to provide
anymore details as needed.

Thanks,
Brian