Changeset 2094

Show
Ignore:
Timestamp:
05/28/08 14:24:08 (6 months ago)
Author:
rjrw
Message:

Fix for problems in

pdr_coolbb.in -- step control in newton_step.cpp

blr_nf84.in -- have to switch off NeH+ chemistry

Location:
branches/newmole/source
Files:
2 modified

Legend:

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

    r2077 r2094  
    229229        sp = newspecies("ClO+  ",MOLECULE,MOLE_ACTIVE,NULL, 1158.0f); 
    230230        sp = newspecies("ArH+  ",MOLECULE,MOLE_ACTIVE,NULL, 0.0f)/* Binding Energy ?? */; 
    231         sp = newspecies("NeH+  ",MOLECULE,MOLE_ACTIVE,NULL, 0.0f)/* Binding Energy ?? */; 
     231        if (0) // Including NeH+ breaks blr_nf84.in ??? 
     232                sp = newspecies("NeH+  ",MOLECULE,MOLE_ACTIVE,NULL, 0.0f)/* Binding Energy ?? */; 
    232233        if(gv.lgDustOn && mole.lgGrain_mole_deplete ) 
    233234        {                
  • branches/newmole/source/newton_step.cpp

    r2086 r2094  
    4242                error1, 
    4343                error0, 
    44                 grad; 
     44                grad, 
     45                pred; 
    4546 
    4647        valarray<double>  
     
    5859        } 
    5960 
    60         error0 = error2 = grad = f1 = f2 = 0.; 
     61        pred = error0 = error2 = grad = f1 = f2 = 0.; 
    6162 
    6263        for (loop=0;loop<40;loop++)  
     
    7778                { 
    7879                        /* Smooth the error mode tailoff */ 
    79                         etmp = ervals[i]/((ERRLIM+fabs(b0vec[i]))*(ERRLIM+fabs(escale[i]))); 
     80                        etmp = ervals[i]/(1e-24+fabs(b0vec[i]*escale[i])); 
    8081                        etmp *= etmp; 
    8182                        if (etmp > emax) 
     
    9394                                b1vec[i] = ervals[i]; 
    9495                        } 
    95                         //fprintf(ioQQQ,"Chem "); 
    9696                        merror = solve_system(amat,b1vec,n); 
    9797                        error0 = error1; 
    9898                        grad = -2*error0; 
    9999                        f1 = 1.0; 
    100  
     100                        if (error0 > 1e20) // Limit step for really bad initial conditions 
     101                                f1 = 1e-3; 
     102                        if (0) 
     103                                for ( i=0; i < n; i++ ) 
     104                                { 
     105                                        if (b2vec[i] > 0. && f1*fabs(b1vec[i]) > 0.1*b2vec[i]) 
     106                                        { 
     107                                                f1 = 0.1*b2vec[i]/fabs(b1vec[i]); 
     108                                        } 
     109                                } 
     110                         
    101111                        if (0) 
    102112                        { 
     
    144154                        } 
    145155                } else { 
    146                         //fprintf(ioQQQ,"Newt %ld stp %11.4g err %11.4g grd %11.4g fdg %11.4g e0 %11.4g de %11.4g\n", 
    147                         //                              loop,f1,error1,grad,(error1-error0)/f1,error0,error1-error0); 
     156                        //fprintf(ioQQQ,"Newt %ld stp %11.4g err %11.4g grd %11.4g fdg %11.4g e0 %11.4g de %11.4g pred %11.4g\n", 
     157                        //                              loop,f1,error1,grad,(error1-error0)/f1,error0,error1-error0,pred); 
    148158                        if (error1 < (1-2e-4*f1)*error0 || error1 < 1e-20) 
    149159                        { 
     
    154164                        { 
    155165                                f2 = f1; 
    156                                 f1 = -0.5*f1*grad/SDIV(error1-error0-f1*grad); 
     166                                f1 *= -0.5*f1*grad/(error1-error0-f1*grad); 
     167                                pred = error0+0.5*grad*f1; 
    157168                        } 
    158169                        else 
     
    163174                                double b = (-f2*a1/(f1*f1)+f1*b1/(f2*f2)); 
    164175                                double ft = f1; 
    165                                 f1 = (-b+sqrt(b*b-3.*a*grad*(f1-f2)))/(3.*a); 
     176                                //fprintf(ioQQQ,"Pred 1 %g %g\n",error1,error0+ft*(grad+ft/(ft-f2)*(b+a*ft))); 
     177                                //fprintf(ioQQQ,"Pred 2 %g %g\n",error2,error0+f2*(grad+f2/(ft-f2)*(b+a*f2)));                           
     178                                //f1 = (-b+sqrt(b*b-3.*a*grad*(ft-f2)))/(3.*a); 
     179                                //fprintf(ioQQQ,"Pred x %g %g\n",f1,error0+f1*(grad+f1/(ft-f2)*(b+a*f1))); 
     180                                f1 = 1.-3.*(a/b)*(grad/b)*(ft-f2); 
     181                                if (f1 > 0.)  
     182                                        f1 = b/(3.*a)*(-1.-sqrt(f1)); 
     183                                else 
     184                                        f1 = -b/(3.*a); 
     185                                //fprintf(ioQQQ,"Pred n %g %g\n",f1,error0+f1*(grad+f1/(ft-f2)*(b+a*f1)));                               
     186                                pred = error0+f1*(grad+f1/(ft-f2)*(b+a*f1)); 
    166187                                f2 = ft; 
    167188                        }