Show
Ignore:
Timestamp:
06/22/08 10:51:55 (5 months ago)
Author:
rjrw
Message:

Use internal timestep limiting (...in an attempt...) to improve
robustness of molecular solver.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/newmole/source/newton_step.cpp

    r2094 r2118  
    3636        double  
    3737                etmp, 
     38                etmpeq, 
    3839                emax, 
    3940                f1, 
     
    4243                error1, 
    4344                error0, 
     45                erroreq, 
    4446                grad, 
    45                 pred; 
     47                pred, 
     48                errstp; 
    4649 
    4750        valarray<double>  
     
    4952                b1vec(n), 
    5053                escale(n), 
    51                 ervals(n); 
     54                ervals(n), 
     55                ervals1(n); 
    5256        int32 merror; 
    5357 
     
    5963        } 
    6064 
    61         pred = error0 = error2 = grad = f1 = f2 = 0.; 
     65        pred = error0 = error2 = erroreq = grad = f1 = f2 = 0.; 
     66        errstp = 0.0; 
    6267 
    6368        for (loop=0;loop<40;loop++)  
     
    6772                if (loop == 0)  
    6873                { 
     74                        // Limit timestep to value where linearizations are reasonable 
     75                        iworst = -1; 
    6976                        for( i=0; i < n; i++ ) 
    7077                        { 
    7178                                escale[i] = MAT(amat,i,i); 
    72                         } 
    73                 } 
    74  
     79                                if (b0vec[i] > 0 && errstp*b0vec[i] < fabs(ervals[i])) 
     80                                { 
     81                                        errstp = fabs(ervals[i])/(1e-24+b0vec[i]); 
     82                                        iworst = i; 
     83                                } 
     84                        } 
     85                        errstp *= 3.; 
     86                        for (i=0; i < n; i++) 
     87                        {  
     88                                MAT(amat,i,i) -= errstp; 
     89                        } 
     90                        //if (iworst != -1) 
     91                        //      fprintf(stdout,"Timescale %g rate %g worst %s %g %g %g\n", 
     92                        //                                      1./SDIV(errstp),errstp,groupspecies[iworst]->label, 
     93                        //                                      ervals[iworst],b0vec[iworst],escale[iworst]); 
     94                } 
     95 
     96                // Error from fully relaxed equilibrium solution 
     97                erroreq = 0.; 
     98                for( i=0; i < n; i++ ) 
     99                { 
     100                        etmpeq = ervals[i];//(1e-24+fabs(b0vec[i]*escale[i])); 
     101                        erroreq += etmpeq*etmpeq; 
     102                } 
     103 
     104                // Error from timestep-limited solution 
     105                for (i=0; i < n; i++) 
     106                { 
     107                        ervals1[i] = ervals[i]-errstp*(b2vec[i]-b0vec[i]); 
     108                } 
    75109                error1 = emax = 0.; 
    76110                iworst = -1; 
     
    78112                { 
    79113                        /* Smooth the error mode tailoff */ 
    80                         etmp = ervals[i]/(1e-24+fabs(b0vec[i]*escale[i])); 
     114                        etmp = ervals1[i];//(1e-24+fabs(b0vec[i]*escale[i])); 
    81115                        etmp *= etmp; 
    82116                        if (etmp > emax) 
     
    92126                        for( i=0; i < n; i++ ) 
    93127                        { 
    94                                 b1vec[i] = ervals[i]; 
     128                                b1vec[i] = ervals1[i]; 
    95129                        } 
    96130                        merror = solve_system(amat,b1vec,n); 
     
    230264                                b1vec[j] = b0vec[j]; 
    231265                        } 
    232                         jacobn(b1vec,&ervals[0],&amat[0],false); 
     266                        jacobn(b1vec,&ervals1[0],&amat[0],false); 
    233267                        for( i=0; i < n; i++ ) 
    234268                        { 
     
    244278                                { 
    245279                                        double e1 = MAT(amat,i,j); 
    246                                         double e2 = (escale[j]-ervals[j])/db; 
     280                                        double e2 = (escale[j]-ervals1[j])/db; 
    247281                                        if (fabs(e1-e2) > 0.01*fabs(e1+e2)) 
    248282                                                fprintf(ioQQQ,"%7s %7s %11.4g %11.4g %11.4g\n", 
    249283                                                                                groupspecies[i]->label,groupspecies[j]->label,e1,e2, 
    250                                                                                 ervals[j]/db); 
     284                                                                                ervals1[j]/db); 
    251285                                } 
    252286                        } 
     
    255289        } 
    256290 
    257         *error = (realnum) MIN2(error1,1e30); 
     291        *error = (realnum) MIN2(erroreq,1e30); 
    258292 
    259293        return;