Ok, I managed to compile and link rk.c to my fortran program, I forgot
that in C you need a ; in the end of every statement. (stupid mistake
;) )
I have just added one line to see if it works.
/* computing new dt */
dt = dt * dt_fac;
/* Start Nisse stuff */
ierr = PetscPrintf(PETSC_COMM_WORLD,"Nisse prints dt: %f\n",dt);
/* End nisse stuff */
if(ts->ptime+dt > ts->max_time){
dt = ts->max_time - ts->ptime;
}
I just try to print the current timestep, however this is never
printed. And I'm not really sure that it is the timestep that is
causing the problems.
I have used call TSGetTimeStep(ts,timestep,ierr) to monitor what
timestep TS uses and it seem ok. However after the first iteration of
FormFunction everything seems ok, but in start of the second iteration
all values are really strange.
I see the same thing when using SNES and my back euler implementation,
it iterate many more times however, but all of a sudden the all "in"
values are in the range 0.2-0.7 (for all 7 equations) and my code
bombs because of the strange values.
When using TS and running with -snes_mf -ts_type beuler -ksp_rtol
1.e-10 this is what printed just before producing strange values:
KSP Object:
type: gmres
GMRES: restart=30, using Classical (unmodified) Gram-Schmidt
Orthogonalization with no iterative refinement
GMRES: happy breakdown tolerance 1e-30
maximum iterations=10000, initial guess is zero
tolerances: relative=1e-10, absolute=1e-50, divergence=10000
left preconditioning
PC Object:
type: none
linear system matrix = precond matrix:
Matrix Object:
type=mffd, rows=70000, cols=70000
SNES matrix-free approximation:
err=1e-07 (relative error in function evaluation)
Using wp compute h routine
Computes normA
And just to make sure that I havent misunderstood how SNES and TS work:
If the original 3-stage RK uses (my numbering):
1. RO0(L)=RO(L)
Get_DRO(RO(L))
RO(L)=RO0(L)+CFL*DRO(L)
2. RO0(L)=.5*(RO0(L)+RO(L))
Get_DRO(RO(L))
RO(L)=RO0(L)+.5*CFL*DRO(L)
3. Get_DRO(RO(L))
RO(L)=RO0(L)+.5*CFL*DRO(L)
Then this should be in TS which should return du/dt which is DRO:
RO(L)=xx(1,L)
Get_DRO(RO(L))
ff(1,L) = DRO(L)
And in SNES with back euler:
(Old RO from previous iteration ORO(L)
RO(L)=xx(1,L)
Get_DRO(RO(L))
ff(1,L)= RO(L)-OLD(1,L)-TSF(L)*DRO(L)
This became a long mail, I hope this shows if I missed something vital.
/nisse
On 3/16/06, Nils Erik Svangård <nilserik@gmail.com> wrote:
Barry,
the problem is making the objectfile, but I'll try again when I have
the code. I will check the makefile for the c-examples.
/nisse
On 3/16/06, Barry Smith <bsmith@mcs.anl.gov> wrote:
Nisse,
Just list it in your makefile with all your other object
files (that come from Fortran). Send the output if this fails.
Barry
On Thu, 16 Mar 2006, Nils Erik Svangård wrote:
I havent managed to get rk.c compiled with changes. how do I compile
it in my working directory to get a object file. I just realised that
I probably forgot to link it against $TSLIB but should I need to that
when I dont do any linking, the linking is done when linking the
fortran and the c code?
Or what am I doing wrong (I not that good with C++ and linking).
/nisse
On 3/15/06, Barry Smith <bsmith@mcs.anl.gov> wrote:
Both
On Wed, 15 Mar 2006, Nils Erik Svangård wrote:
Sorry, I forgot. Is the linear solver converging? If not, then that
is the problem? Use a tolerance like -ksp_rtol 1.e-10 and see if the
nonlinear solver converges.
I'll try that when I have access to the code. I havent checked if the
linear solver converges is thera a -kspmonitor or -kspconvergedreason
I should use?
/nisse
--
Nils-Erik Svangård
E-Mail: nilserik@gmail.com
MSN: schweingaard@hotmail.com
Skype: schweingaard
Mobil: +46-(0)70-3612178
--
Nils-Erik Svangård
E-Mail: nilserik@gmail.com
MSN: schweingaard@hotmail.com
Skype: schweingaard
Mobil: +46-(0)70-3612178
--
Nils-Erik Svangård
E-Mail: nilserik@gmail.com
MSN: schweingaard@hotmail.com
Skype: schweingaard
Mobil: +46-(0)70-3612178