@@ -328,12 +328,14 @@ int initKinsol(KINODE *kinOde)
328328 KDATAODE * kData = kinOde -> kData ;
329329 NLPODE * nlp = kinOde -> nlp ;
330330 double * derx ;
331- double tmp ,tmp1 , h ;
331+ double tmp ,h ;
332332 double * xeq = NV_DATA_S (kData -> x );
333+
333334 nlp -> currentStep = & kinOde -> solverInfo -> currentStepSize ;
334- kinOde -> nlp -> derx = data -> localData [0 ]-> realVars + nStates ;
335- kinOde -> nlp -> x0 = data -> localData [1 ]-> realVars ;
336- kinOde -> nlp -> t0 = data -> localData [1 ]-> timeValue ;
335+ nlp -> derx = data -> localData [0 ]-> realVars + nStates ;
336+ nlp -> x0 = data -> localData [1 ]-> realVars ;
337+ nlp -> f0 = data -> localData [1 ]-> realVars + nStates ;
338+ nlp -> t0 = data -> localData [1 ]-> timeValue ;
337339 derx = nlp -> derx ;
338340
339341 xlow = xeq + N * nStates ;
@@ -349,45 +351,44 @@ int initKinsol(KINODE *kinOde)
349351 KINInit (kData -> kmem , radau5Res , kinOde -> kData -> x );
350352 break ;
351353 case 7 :
352- nlp -> dt = * (kinOde -> nlp -> currentStep );
353- KINInit (kinOde -> kData -> kmem , radau3Res , kinOde -> kData -> x );
354+ nlp -> dt = * (nlp -> currentStep );
355+ KINInit (kData -> kmem , radau3Res , kinOde -> kData -> x );
354356 break ;
355357 case 8 :
356- nlp -> dt = * (kinOde -> nlp -> currentStep );
357- KINInit (kinOde -> kData -> kmem , radau1Res , kinOde -> kData -> x );
358+ nlp -> dt = * (nlp -> currentStep );
359+ KINInit (kData -> kmem , radau1Res , kinOde -> kData -> x );
358360 break ;
359361 case 9 :
360- nlp -> dt = * (kinOde -> nlp -> currentStep );
361- KINInit (kinOde -> kData -> kmem , lobatto2Res , kinOde -> kData -> x );
362+ nlp -> dt = * (nlp -> currentStep );
363+ KINInit (kData -> kmem , lobatto2Res , kinOde -> kData -> x );
362364 break ;
363365 case 10 :
364- nlp -> dt = * (kinOde -> nlp -> currentStep );
365- KINInit (kinOde -> kData -> kmem , lobatto4Res , kinOde -> kData -> x );
366+ nlp -> dt = * (nlp -> currentStep );
367+ KINInit (kData -> kmem , lobatto4Res , kinOde -> kData -> x );
366368 break ;
367369 case 11 :
368- nlp -> dt = * (kinOde -> nlp -> currentStep );
369- KINInit (kinOde -> kData -> kmem , lobatto6Res , kinOde -> kData -> x );
370+ nlp -> dt = * (nlp -> currentStep );
371+ KINInit (kData -> kmem , lobatto6Res , kinOde -> kData -> x );
370372 break ;
371373
372374 default :
373375 assert (0 );
374376 }
377+
375378 h = nlp -> dt ;
379+
376380 for (j = 0 ,k = 0 ;j < N ;j ++ )
377381 {
378382 for (i = 0 ;i < nStates ;i ++ ,k ++ )
379383 {
380- tmp1 = fabs (derx [i ])* h ;
381- tmp = tmp1 > 1e-6 ? 1.0 /(tmp1 ) : 1e6 ;
382384 if (nlp -> a != NULL )
383- {
384- tmp /= nlp -> a [j ] > 0 ? nlp -> a [j ] : 1.0 ;
385- xeq [k ] = nlp -> x0 [i ] + nlp -> a [j ]* derx [i ]* h ;
386- }
385+ xeq [k ] = nlp -> x0 [i ] + nlp -> a [j ]* nlp -> f0 [i ]* h ;
387386 else
388- xeq [k ] = nlp -> x0 [i ] + derx [i ]* h ;
387+ xeq [k ] = nlp -> x0 [i ] + nlp -> f0 [i ]* h ;
388+
389389 xlow [k ] = xeq [k ] - nlp -> min [i ];
390390 xup [k ] = xeq [k ] - nlp -> max [i ];
391+ tmp = 1.0 /(fabs (nlp -> x0 [i ] - xeq [k ]) + 1e-6 );
391392 seq [k ] = tmp ;
392393 slow [k ] = tmp ;
393394 sup [k ] = tmp ;
@@ -560,7 +561,6 @@ int radau1Res(N_Vector x, N_Vector f, void* user_data)
560561 int n = nlp -> nStates ;
561562 double * xlow , * xup ;
562563 double * derx = nlp -> derx ;
563- double * a = nlp -> a ;
564564 double * flow , * fup ;
565565
566566 N = kinOde -> N ;
@@ -597,30 +597,27 @@ int lobatto2Res(N_Vector x, N_Vector f, void* user_data)
597597 double * lb = nlp -> min ;
598598 double * ub = nlp -> max ;
599599
600- double * x0 ,* x1 ;
600+ double * x0 ,* x1 , * f0 ;
601601 int n = nlp -> nStates ;
602602 double * xlow , * xup ;
603603 double * derx = nlp -> derx ;
604- double * a = nlp -> a ;
605604 double * flow , * fup ;
606605
607606 N = kinOde -> N ;
608607
609- flow = feq + N * n ;
610- fup = flow + N * n ;
608+ flow = feq + n ;
609+ fup = flow + n ;
611610
612611 x0 = nlp -> x0 ;
612+ f0 = nlp -> f0 ;
613613 x1 = NV_DATA_S (x );
614614 xlow = x1 + n ;
615- xup = xlow + N * n ;
616-
617- for (i = 0 ;i < n ;i ++ )
618- feq [i ] = derx [i ];
615+ xup = xlow + n ;
619616
620617 refreshModell (data , x1 ,t0 + h );
621618 for (i = 0 ;i < n ;i ++ )
622619 {
623- feq [i ] = x0 [i ] - x1 [i ] + 0.5 * h * (derx [i ]+ feq [i ]);
620+ feq [i ] = x0 [i ] - x1 [i ] + 0.5 * h * (f0 [i ]+ derx [i ]);
624621 flow [i ] = xlow [i ] - x1 [i ] + lb [i ];
625622 fup [i ] = xup [i ] - x1 [i ] + ub [i ];
626623 }
@@ -641,7 +638,7 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
641638 double * lb = nlp -> min ;
642639 double * ub = nlp -> max ;
643640
644- double * x0 , * x1 , * x2 ;
641+ double * x0 , * x1 , * x2 , * f0 ;
645642 int n = nlp -> nStates ;
646643 double * xlow , * xup ;
647644 double * derx = nlp -> derx ;
@@ -653,21 +650,17 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
653650 flow = feq + N * n ;
654651 fup = flow + N * n ;
655652
653+ f0 = nlp -> f0 ;
656654 x0 = nlp -> x0 ;
657655 x1 = NV_DATA_S (x );
658656 x2 = x1 + n ;
659657 xlow = x2 + n ;
660658 xup = xlow + N * n ;
661- for (i = 0 ;i < n ;i ++ )
662- {
663- feq [i ] = derx [i ];
664- feq [i + n ] = derx [i ];
665- }
666659
667660 refreshModell (data , x1 ,t0 + 0.5 * h );
668661 for (i = 0 ;i < n ;i ++ )
669662 {
670- feq [i ] = (h * (2.0 * derx [i ] + feq [i ]) + 5.0 * x0 [i ]) - (4 * x1 [i ] + x2 [i ]);
663+ feq [i ] = (h * (2.0 * derx [i ] + f0 [i ]) + 5.0 * x0 [i ]) - (4 * x1 [i ] + x2 [i ]);
671664 flow [i ] = xlow [i ] - x1 [i ] + lb [i ];
672665 fup [i ] = xup [i ] - x1 [i ] + ub [i ];
673666 }
@@ -676,7 +669,7 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
676669 for (i = 0 ;i < n ;i ++ )
677670 {
678671 sub2 = i + n ;
679- feq [sub2 ] = (2.0 * h * derx [i ] + 16.0 * x1 [i ]) - (8.0 * (x0 [i ] + x2 [i ]) + 2.0 * h * feq [ sub2 ]);
672+ feq [sub2 ] = (2.0 * h * derx [i ] + 16.0 * x1 [i ]) - (8.0 * (x0 [i ] + x2 [i ]) + 2.0 * h * f0 [ i ]);
680673 flow [sub2 ] = xlow [sub2 ] - x2 [i ] + lb [i ];
681674 fup [sub2 ] = xup [sub2 ] - x2 [i ] + ub [i ];
682675 }
@@ -697,7 +690,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
697690 double * lb = nlp -> min ;
698691 double * ub = nlp -> max ;
699692
700- double * x0 , * x1 , * x2 , * x3 ;
693+ double * x0 , * x1 , * x2 , * x3 , * f0 ;
701694 int n = nlp -> nStates ;
702695 double * xlow , * xup ;
703696 double * derx = nlp -> derx ;
@@ -709,24 +702,19 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
709702 flow = feq + N * n ;
710703 fup = flow + N * n ;
711704
705+ f0 = nlp -> f0 ;
712706 x0 = nlp -> x0 ;
713707 x1 = NV_DATA_S (x );
714708 x2 = x1 + n ;
715709 x3 = x2 + n ;
716710
717711 xlow = x3 + n ;
718712 xup = xlow + N * n ;
719- for (i = 0 ;i < n ;i ++ )
720- {
721- feq [i ] = derx [i ];
722- feq [i + n ] = derx [i ];
723- feq [i + 2 * n ] = derx [i ];
724- }
725713
726714 refreshModell (data , x1 ,t0 + nlp -> a [0 ]* h );
727715 for (i = 0 ;i < n ;i ++ )
728716 {
729- feq [i ] = (h * (derx [i ] + nlp -> c [0 ][4 ]* feq [i ]) + nlp -> c [0 ][0 ]* x0 [i ] + nlp -> c [0 ][3 ]* x3 [i ]) - (nlp -> c [0 ][1 ]* x1 [i ] + nlp -> c [0 ][3 ]* x3 [i ]);
717+ feq [i ] = (h * (derx [i ] + nlp -> c [0 ][4 ]* f0 [i ]) + nlp -> c [0 ][0 ]* x0 [i ] + nlp -> c [0 ][3 ]* x3 [i ]) - (nlp -> c [0 ][1 ]* x1 [i ] + nlp -> c [0 ][3 ]* x3 [i ]);
730718 flow [i ] = xlow [i ] - x1 [i ] + lb [i ];
731719 fup [i ] = xup [i ] - x1 [i ] + ub [i ];
732720 }
@@ -735,7 +723,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
735723 for (i = 0 ;i < n ;i ++ )
736724 {
737725 sub2 = i + n ;
738- feq [sub2 ] = (h * derx [i ] + nlp -> c [1 ][1 ]* x1 [i ]) - (h * nlp -> c [1 ][4 ]* feq [ sub2 ] + nlp -> c [1 ][0 ]* x0 [i ] + nlp -> c [1 ][2 ]* x2 [i ] + nlp -> c [1 ][3 ]* x3 [i ]);
726+ feq [sub2 ] = (h * derx [i ] + nlp -> c [1 ][1 ]* x1 [i ]) - (h * nlp -> c [1 ][4 ]* f0 [ i ] + nlp -> c [1 ][0 ]* x0 [i ] + nlp -> c [1 ][2 ]* x2 [i ] + nlp -> c [1 ][3 ]* x3 [i ]);
739727 flow [sub2 ] = xlow [sub2 ] - x2 [i ] + lb [i ];
740728 fup [sub2 ] = xup [sub2 ] - x2 [i ] + ub [i ];
741729 }
@@ -744,7 +732,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
744732 for (i = 0 ;i < n ;i ++ )
745733 {
746734 sub2 = i + 2 * n ;
747- feq [sub2 ] = (h * (feq [ sub2 ] + derx [i ]) + nlp -> c [2 ][0 ]* x0 [i ] + nlp -> c [2 ][2 ]* x2 [i ]) - (nlp -> c [2 ][1 ]* x1 [i ] + nlp -> c [2 ][3 ]* x3 [i ]);
735+ feq [sub2 ] = (h * (f0 [ i ] + derx [i ]) + nlp -> c [2 ][0 ]* x0 [i ] + nlp -> c [2 ][2 ]* x2 [i ]) - (nlp -> c [2 ][1 ]* x1 [i ] + nlp -> c [2 ][3 ]* x3 [i ]);
748736 flow [sub2 ] = xlow [sub2 ] - x3 [i ] + lb [i ];
749737 fup [sub2 ] = xup [sub2 ] - x3 [i ] + ub [i ];
750738 }
@@ -755,7 +743,6 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
755743
756744int kinsolOde (void * ode )
757745{
758- int retValue ;
759746 KINODE * kinOde = (KINODE * ) ode ;
760747 KDATAODE * kData = kinOde -> kData ;
761748 NLPODE * nlp = kinOde -> nlp ;
@@ -773,10 +760,9 @@ int kinsolOde(void* ode)
773760 kData -> glstr , /* global stragegy choice */
774761 kData -> sVars , /* scaling vector, for the variable cc */
775762 kData -> sEqns );
776- retValue = kData -> error_code ;
777- }while (retValue < 0 && (++ kData -> glstr ) <= KIN_LINESEARCH );
763+ }while (kData -> error_code < 0 && (++ kData -> glstr ) <= KIN_LINESEARCH );
778764 refreshModell (kinOde -> data , NV_DATA_S (kData -> x ) + (N - 1 )* nlp -> nStates , nlp -> t0 + (nlp -> dt ));
779- return retValue ;
765+ return kData -> error_code ;
780766}
781767#else
782768
0 commit comments