ADMB Documentation  11.1.1015
 All Classes Files Functions Variables Typedefs Friends Defines
df3fun.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df3fun.cpp 542 2012-07-10 21:04:06Z johnoel $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California 
00006  */
00007 
00008 #include <df1b2fun.h>
00009 //#include "df3fun.h"
00010   df1b2variable * df3_one_variable::ind_var=0;
00011 
00012   df3_one_variable::df3_one_variable(const df3_one_variable& x)
00013   {
00014     v[0]=x.v[0];
00015     v[1]=x.v[1];
00016     v[2]=x.v[2];
00017     v[3]=x.v[3];
00018   }
00019 
00020  df3_one_vector::df3_one_vector(const df3_one_vector& m2)
00021  {
00022    index_min=m2.index_min;
00023    index_max=m2.index_max;
00024    shape=m2.shape;
00025    if (shape)
00026    {
00027      (shape->ncopies)++;
00028    }
00029    v = m2.v;
00030  }
00031 
00032  df3_one_vector::~df3_one_vector()
00033  {
00034    deallocate();
00035  }
00036 
00037  void df3_one_vector::deallocate(void)
00038  {
00039    if(shape)
00040    {
00041      if (shape->ncopies)
00042      {
00043        (shape->ncopies)--;
00044      }
00045      else
00046      {
00047        v = (df3_one_variable*) (shape->trueptr);
00048        delete [] v;
00049        v = NULL;
00050        delete shape;
00051        shape=0;
00052      }
00053    }
00054  }
00055 
00056  dvector value(const df3_one_vector& v)
00057  {
00058    
00059    int mmin=v.indexmin();
00060    int mmax=v.indexmax();
00061    dvector cv(mmin,mmax);
00062    for (int i=mmin;i<=mmax;i++)
00063    {
00064      cv(i)=value(v(i));
00065    }
00066    return cv;
00067  }
00068    
00069  dvector first_derivatives(const df3_one_vector& v)
00070  {
00071    
00072    int mmin=v.indexmin();
00073    int mmax=v.indexmax();
00074    dvector cv(mmin,mmax);
00075    for (int i=mmin;i<=mmax;i++)
00076    {
00077      cv(i)=*(v(i).get_udot());
00078    }
00079    return cv;
00080  }
00081    
00082 
00083  dvector second_derivatives(const df3_one_vector& v)
00084  {
00085    
00086    int mmin=v.indexmin();
00087    int mmax=v.indexmax();
00088    dvector cv(mmin,mmax);
00089    for (int i=mmin;i<=mmax;i++)
00090    {
00091      cv(i)=*(v(i).get_udot2());
00092    }
00093    return cv;
00094  }
00095    
00096  dvector third_derivatives(const df3_one_vector& v)
00097  {
00098    
00099    int mmin=v.indexmin();
00100    int mmax=v.indexmax();
00101    dvector cv(mmin,mmax);
00102    for (int i=mmin;i<=mmax;i++)
00103    {
00104      cv(i)=*(v(i).get_udot3());
00105    }
00106    return cv;
00107  }
00108    
00109 
00110   void df3_one_vector::initialize(void)
00111   {
00112     int mmin=indexmin();
00113     int mmax=indexmax();
00114     for (int i=mmin;i<=mmax;i++)
00115     {
00116       (*this)(i)=0.0;
00117     }
00118   }
00119 
00120   df3_one_vector::df3_one_vector(void)
00121   {
00122     allocate();
00123   }
00124 
00125   df3_one_vector::df3_one_vector(int min,int max)
00126   {
00127     allocate(min,max);
00128   }
00129 
00130   void df3_one_vector::allocate(int min,int max)
00131   {
00132     index_min=min;
00133     index_max=max;
00134     v=new df3_one_variable[max-min+1];
00135     if (v==0)
00136     {
00137       cerr << "error allocating memory in df3_one_vector" << endl;
00138       ad_exit(1);
00139     }
00140     if ( (shape=new vector_shapex(min,max,v)) == NULL)
00141     {
00142       cerr << "Error trying to allocate memory for df3_one_vector" 
00143            << endl;;
00144       ad_exit(1);
00145     }
00146     v-=min;
00147   }
00148   
00149   void df3_one_vector::allocate(void)
00150   {
00151     index_min=0;
00152     index_max=-1;
00153     v=0;
00154     shape=0;
00155   }
00156     
00157 
00158  dmatrix value(const df3_one_matrix& v)
00159  {
00160    
00161    int rmin=v.indexmin();
00162    int rmax=v.indexmax();
00163    dmatrix cm(rmin,rmax);
00164    for (int i=rmin;i<=rmax;i++)
00165    {
00166      int cmin=v(i).indexmin();
00167      int cmax=v(i).indexmax();
00168      cm(i).allocate(cmin,cmax); 
00169      for (int j=cmin;j<=cmax;j++)
00170      {
00171        cm(i,j)=value(v(i,j));
00172      }
00173    }
00174    return cm;
00175  }
00176    
00177  dmatrix first_derivatives(const df3_one_matrix& v)
00178  {
00179    
00180    int rmin=v.indexmin();
00181    int rmax=v.indexmax();
00182    dmatrix cm(rmin,rmax);
00183    for (int i=rmin;i<=rmax;i++)
00184    {
00185      int cmin=v(i).indexmin();
00186      int cmax=v(i).indexmax();
00187      cm(i).allocate(cmin,cmax); 
00188      cm(i)=first_derivatives(v(i));
00189    }
00190    return cm;
00191  }
00192    
00193 
00194  dmatrix second_derivatives(const df3_one_matrix& v)
00195  {
00196    int rmin=v.indexmin();
00197    int rmax=v.indexmax();
00198    dmatrix cm(rmin,rmax);
00199    for (int i=rmin;i<=rmax;i++)
00200    {
00201      int cmin=v(i).indexmin();
00202      int cmax=v(i).indexmax();
00203      cm(i).allocate(cmin,cmax); 
00204      cm(i)=second_derivatives(v(i));
00205    }
00206    return cm;
00207  }
00208    
00209  dmatrix third_derivatives(const df3_one_matrix& v)
00210  {
00211    int rmin=v.indexmin();
00212    int rmax=v.indexmax();
00213    dmatrix cm(rmin,rmax);
00214    for (int i=rmin;i<=rmax;i++)
00215    {
00216      int cmin=v(i).indexmin();
00217      int cmax=v(i).indexmax();
00218      cm(i).allocate(cmin,cmax); 
00219      cm(i)=third_derivatives(v(i));
00220    }
00221    return cm;
00222  }
00223    
00224 
00225  df3_one_matrix::df3_one_matrix(const df3_one_matrix& m2)
00226  {
00227    index_min=m2.index_min;
00228    index_max=m2.index_max;
00229    shape=m2.shape;
00230    if (shape)
00231    {
00232      (shape->ncopies)++;
00233    }
00234    v = m2.v;
00235  }
00236 
00237  df3_one_matrix::~df3_one_matrix()
00238  {
00239    deallocate();
00240  }
00241 
00242  void df3_one_matrix::deallocate(void)
00243  {
00244    if (shape)
00245    {
00246      if (shape->ncopies)
00247      {
00248        (shape->ncopies)--;
00249      }
00250      else
00251      {
00252        v = (df3_one_vector*) (shape->get_pointer());
00253        delete [] v;
00254        v=0;
00255        delete shape;
00256        shape=0;
00257      }
00258    }
00259  }
00260 
00261 
00262   void df3_one_matrix::initialize(void)
00263   {
00264     int mmin=indexmin();
00265     int mmax=indexmax();
00266     for (int i=mmin;i<=mmax;i++)
00267     {
00268       (*this)(i).initialize();
00269     }
00270   }
00271 
00272 
00273   df3_one_matrix::df3_one_matrix(int rmin,int rmax,int cmin,int cmax)
00274   {
00275     index_min=rmin;
00276     index_max=rmax;
00277     v=new df3_one_vector[rmax-rmin+1];
00278     if (v==0)
00279     {
00280       cerr << "error allocating memory in df3_one_matrix" << endl;
00281       ad_exit(1);
00282     }
00283     if ( (shape=new mat_shapex(v)) == NULL)
00284     {
00285       cerr << "Error trying to allocate memory for df3_one_vector" 
00286            << endl;;
00287     }
00288     v-=rmin;
00289     
00290     for (int i=rmin;i<=rmax;i++)
00291     {
00292       v[i].allocate(cmin,cmax);
00293     }
00294   }
00295     
00296 /*
00297   df3_one_variable operator F(const df3_one_variable& x)
00298   {
00299     df3_one_variable z;
00300 
00301     *z.get_u() = ::F(*x.get_u());
00302 
00303     *z.get_udot() = ::D1F(*x.get_u())* *x.get_udot();
00304 
00305     *z.get_udot2() = ::D2F(*x.get_u())* square(*x.get_udot())
00306                    + ::D1F(*x.get_u())* *x.get_udot2();
00307 
00308     *z.get_udot3() = ::D3F(*x.get_u()) * cube(*x.get_udot())
00309                    + 3.0 * ::D2F(*x.get_u()) * *x.get_udot() * *x.get_udot2()
00310                    + ::D1F(*x.get_u()) * *x.get_udot3();
00311     return z;
00312   }
00313 
00314 */
00315 
00316   df3_one_variable& df3_one_variable::operator -= (double v)
00317   {
00318     *get_u() -= v;
00319     return *this;
00320   }
00321 
00322 
00323   df3_one_variable& df3_one_variable::operator -= (const df3_one_variable& v)
00324   {
00325     *get_u() -= *v.get_u();
00326 
00327     *get_udot() -= *v.get_udot();
00328     *get_udot2() -= *v.get_udot2();
00329     *get_udot3() -= *v.get_udot3();
00330     return *this;
00331   }
00332 
00333   df3_one_variable operator - (const df3_one_variable& v)
00334   {
00335     df3_one_variable z;
00336     *z.get_u() =- *v.get_u();
00337 
00338     *z.get_udot() =- *v.get_udot();
00339     *z.get_udot2() =- *v.get_udot2();
00340     *z.get_udot3() =- *v.get_udot3();
00341     return z;
00342   }
00343 
00344   df3_one_variable& df3_one_variable::operator += (const df3_one_variable& v)
00345   {
00346     *get_u() += *v.get_u();
00347 
00348     *get_udot() += *v.get_udot();
00349     *get_udot2() += *v.get_udot2();
00350     *get_udot3() += *v.get_udot3();
00351     return *this;
00352   }
00353 
00354   df3_one_variable sqrt(const df3_one_variable& x)
00355   {
00356     df3_one_variable z;
00357     double u=::sqrt(*x.get_u());
00358     double xinv=1.0/(*x.get_u());
00359     double zp=0.5/u;
00360     double zp2=-0.5*zp*xinv;
00361     double zp3=-1.5*zp2*xinv;
00362 
00363     *z.get_u() = u;
00364 
00365     *z.get_udot() = zp* *x.get_udot();
00366 
00367     *z.get_udot2() = zp2 * square(*x.get_udot())
00368                    + zp * *x.get_udot2();
00369 
00370     *z.get_udot3() = zp3 * cube(*x.get_udot())
00371                    + 3.0 * zp2 * *x.get_udot() * *x.get_udot2()
00372                    + zp * *x.get_udot3();
00373 
00374     return z;
00375   }
00376 
00377 
00378 
00379   df3_one_variable exp(const df3_one_variable& x)
00380   {
00381     df3_one_variable z;
00382 
00383     *z.get_u() = ::exp(*x.get_u());
00384 
00385     *z.get_udot() = ::exp(*x.get_u())* *x.get_udot();
00386 
00387     *z.get_udot2() = ::exp(*x.get_u())* square(*x.get_udot())
00388                    + ::exp(*x.get_u())* *x.get_udot2();
00389 
00390     *z.get_udot3() = ::exp(*x.get_u()) * cube(*x.get_udot())
00391                    + 3.0 * ::exp(*x.get_u()) * *x.get_udot() * *x.get_udot2();
00392                    + ::exp(*x.get_u()) * *x.get_udot3();
00393     return z;
00394   }
00395 
00396   df3_one_variable log(const df3_one_variable& x)
00397   {
00398     df3_one_variable z;
00399 
00400     double xp=1.0/(*x.get_u());
00401     double xp2=-square(xp);
00402     double xp3=-2.0*xp*xp2;
00403 
00404     *z.get_u() = ::log(*x.get_u());
00405 
00406     *z.get_udot() = xp * *x.get_udot();
00407 
00408     *z.get_udot2() = xp2* square(*x.get_udot())
00409                    + xp * *x.get_udot2();
00410 
00411     *z.get_udot3() = xp3 * cube(*x.get_udot())
00412                    + 3.0 * xp2 * *x.get_udot() * *x.get_udot2();
00413                    + xp * *x.get_udot3();
00414     return z;
00415   }
00416 
00417   df3_one_variable inv(const df3_one_variable& x)
00418   {
00419     df3_one_variable z;
00420     double xinv=1.0/(*x.get_u());
00421     double zp=-xinv*xinv;
00422     double zp2=-2.0*zp*xinv;
00423     double zp3=-3.0*zp2*xinv;
00424 
00425     *z.get_u() = xinv;
00426     *z.get_udot() = zp * *x.get_udot();
00427 
00428     *z.get_udot2() = zp2 * square(*x.get_udot())
00429                    + zp * *x.get_udot2();
00430 
00431     *z.get_udot3() = zp3 * cube(*x.get_udot())
00432                    + 3.0 * zp2 * *x.get_udot() * *x.get_udot2()
00433                    + zp * *x.get_udot3();
00434 
00435     return z;
00436   }
00437 
00438   df3_one_variable& df3_one_variable::operator = (const df3_one_variable& x)
00439   {
00440     *get_u() = *x.get_u();
00441     *get_udot() = *x.get_udot();
00442     *get_udot2() = *x.get_udot2();
00443     *get_udot3() = *x.get_udot3();
00444     return *this;
00445   }
00446 
00447   df3_one_variable& df3_one_variable::operator = (double x)
00448   {
00449     *get_u() = x;
00450     *get_udot() = 0.0;
00451     *get_udot2() = 0.0;
00452     *get_udot3() = 0.0;
00453     return *this;
00454   }
00455 
00456 
00457   df3_one_variable operator * (const df3_one_variable& x,
00458     const df3_one_variable& y)
00459   {
00460     df3_one_variable z;
00461     *z.get_u() = *x.get_u() *  *y.get_u();
00462     *z.get_udot() = *x.get_u() * *y.get_udot()
00463                  + *x.get_udot() * *y.get_u();
00464 
00465     *z.get_udot2() = *x.get_udot2() * *y.get_u()
00466                    + 2.0 * *x.get_udot() * *y.get_udot()
00467                    +  *x.get_u() * *y.get_udot2();
00468     
00469     *z.get_udot3() = *x.get_udot3() * *y.get_u()
00470                    + 3.0 * *x.get_udot2() * *y.get_udot()
00471                    + 3.0 * *x.get_udot() * *y.get_udot2()
00472                    +  *x.get_u() * *y.get_udot3();
00473     return z;
00474   }
00475 
00476   df3_one_variable operator * (double x,
00477     const df3_one_variable& y)
00478   {
00479     df3_one_variable z;
00480     *z.get_u() = x *  *y.get_u();
00481     *z.get_udot() = x * *y.get_udot();
00482 
00483     *z.get_udot2() = x * *y.get_udot2();
00484     
00485     *z.get_udot3() = x * *y.get_udot3();
00486     return z;
00487   }
00488 
00489   df3_one_variable operator * (const df3_one_variable& x,
00490     double y)
00491   {
00492     df3_one_variable z;
00493     *z.get_u() = *x.get_u() *  y;
00494     *z.get_udot() =  *x.get_udot() * y;
00495 
00496     *z.get_udot2() = *x.get_udot2() * y;
00497     
00498     *z.get_udot3() = *x.get_udot3() * y;
00499     return z;
00500   }
00501 
00502 
00503   df3_one_variable operator / (const df3_one_variable& x,
00504     const df3_one_variable& y)
00505   {
00506     df3_one_variable u=inv(y);
00507     return x*u;
00508   }
00509 
00510   df3_one_variable operator / (double x,
00511     const df3_one_variable& y)
00512   {
00513     df3_one_variable u=inv(y);
00514     return x*u;
00515   }
00516 
00517   df3_one_variable operator + (double x,const df3_one_variable& y)
00518   {
00519     df3_one_variable z;
00520     *z.get_u() =  x + *y.get_u();
00521     *z.get_udot() =  *y.get_udot();
00522     *z.get_udot2() = *y.get_udot2();
00523     *z.get_udot3() = *y.get_udot3();
00524     return z;
00525   }
00526 
00527  //  
00528  //   df3_one_variable operator / (const df3_one_variable& x,
00529  //     const df3_one_variable& y)
00530  //   {
00531  //     df3_one_variable z;
00532  //     double yinv =  1.0 / (*y.get_u());
00533  //     double yinv2 = yinv * yinv; 
00534  //     double yinv3 = yinv * yinv2; 
00535  //     doubl yd = *y.get_udot();
00536  // 
00537  //     //*z.get_u() = *x.get_u() /  *y.get_u();
00538  //     *z.get_u() = *x.get_u() * yinv;
00539  // 
00540  //     *z.get_udot() =  - (*x.get_u()) * yinv2 * yd
00541  //                   + *x.get_udot() * yinv;
00542  // 
00543  //     *z.get_udot2() = *x.get_udot2() * yinv
00544  //                    - 2.0 * *x.get_udot() * yd * yinv2
00545  //                    + 2.0 * *x.get_u() * yinv3  * yd *yd
00546  //                    -  *x.get_u() * yinv2 * y.get_udot2();
00547  //     
00548  //     *z.get_udot3() = *x.get_udot3() * yinv
00549  //                    + 3.0 * *x.get_udot2() * *y.get_udot()
00550  //                    + 3.0 * *x.get_udot() * *y.get_udot2()
00551  //                    +  *x.get_u() * *y.get_udot3();
00552  //   }
00553  //  
00554 
00555 
00556   df3_one_variable operator + (const df3_one_variable& y,
00557     const double x)
00558   {
00559     df3_one_variable z;
00560     *z.get_u() =   x + *y.get_u();
00561     *z.get_udot() =  *y.get_udot();
00562     *z.get_udot2() = *y.get_udot2();
00563     *z.get_udot3() = *y.get_udot3();
00564     return z;
00565   }
00566 
00567   df3_one_variable operator + (const df3_one_variable& x,
00568     const df3_one_variable& y)
00569   {
00570     df3_one_variable z;
00571     *z.get_u() = *x.get_u() + *y.get_u();
00572     *z.get_udot() = *x.get_udot() + *y.get_udot();
00573     *z.get_udot2() = *x.get_udot2() + *y.get_udot2();
00574     *z.get_udot3() = *x.get_udot3() + *y.get_udot3();
00575     return z;
00576   }
00577 
00578   df3_one_variable operator - (const df3_one_variable& x,
00579     const df3_one_variable& y)
00580   {
00581     df3_one_variable z;
00582     *z.get_u() = *x.get_u() - *y.get_u();
00583     *z.get_udot() = *x.get_udot() - *y.get_udot();
00584     *z.get_udot2() = *x.get_udot2() - *y.get_udot2();
00585     *z.get_udot3() = *x.get_udot3() - *y.get_udot3();
00586     return z;
00587   }
00588 
00589   df3_one_variable operator - (const df3_one_variable& x,
00590     double y)
00591   {
00592     df3_one_variable z;
00593     *z.get_u() = *x.get_u() - y;
00594     *z.get_udot() = *x.get_udot();
00595     *z.get_udot2() = *x.get_udot2();
00596     *z.get_udot3() = *x.get_udot3();
00597     return z;
00598   }
00599 
00600   df3_one_variable operator - (const df3_one_variable& x,
00601     const df3_one_variable& y);
00602   df3_one_variable operator / (const df3_one_variable& x,
00603     const df3_one_variable& y);
00604   df3_one_variable operator * (const df3_one_variable& x,
00605     const df3_one_variable& y);
00606 
00607 
00608   init_df3_one_variable::init_df3_one_variable(const df1b2variable& _v)
00609   {
00610     ADUNCONST(df1b2variable,v)
00611    /*
00612     if (num_ind_var>0)
00613     {
00614       cerr << "can only have 1 independent_variables in df3_one_variable"
00615        " function" << endl;
00616       ad_exit(1);
00617    }
00618    */
00619    ind_var=&v;
00620     *get_u() =  *v.get_u();
00621     *get_udot() = 1.0;
00622     *get_udot2() = 0.0;
00623     *get_udot3() = 0.0;
00624   }
00625 
00626   init_df3_one_variable::init_df3_one_variable(double v)
00627   {
00628     *get_u() =  v;
00629     *get_udot() = 1.0;
00630     *get_udot2() = 0.0;
00631     *get_udot3() = 0.0;
00632   }
00633 
00634   df3_one_variable::df3_one_variable(void)
00635   {
00636      
00637 
00638   }
00639 
00640 
00641 df3_one_matrix choleski_decomp(const df3_one_matrix& MM)
00642 {
00643   // kludge to deal with constantness
00644   df3_one_matrix & M= (df3_one_matrix &) MM;
00645   int rmin=M.indexmin();
00646   int cmin=M(rmin).indexmin();
00647   int rmax=M.indexmax();
00648   int cmax=M(rmin).indexmax();
00649   if (rmin !=1 || cmin !=1)
00650   {
00651     cerr << "minimum row and column inidices must equal 1 in "
00652       "df1b2matrix choleski_decomp(const df3_one_atrix& MM)"
00653          << endl;
00654     ad_exit(1);
00655   }
00656   if (rmax !=cmax)
00657   {
00658     cerr << "Error in df1b2matrix choleski_decomp(const df3_one_matrix& MM)"
00659       " Matrix not square" << endl;
00660     ad_exit(1);
00661   }
00662 
00663   int n=rmax-rmin+1;
00664   df3_one_matrix L(1,n,1,n);
00665 #ifndef SAFE_INITIALIZE
00666     L.initialize();
00667 #endif
00668 
00669   int i,j,k;
00670   df3_one_variable tmp;
00671    
00672     if (value(M(1,1))<=0)
00673     {
00674       cerr << "Error matrix not positive definite in choleski_decomp"
00675         <<endl;
00676       ad_exit(1);
00677     }
00678    
00679   L(1,1)=sqrt(M(1,1));
00680   for (i=2;i<=n;i++)
00681   {
00682     L(i,1)=M(i,1)/L(1,1);
00683   }
00684 
00685   for (i=2;i<=n;i++)
00686   {
00687     for (j=2;j<=i-1;j++)
00688     {
00689       tmp=M(i,j);
00690       for (k=1;k<=j-1;k++)
00691       {
00692         tmp-=L(i,k)*L(j,k);
00693       }
00694       L(i,j)=tmp/L(j,j);
00695     }
00696     tmp=M(i,i);
00697     for (k=1;k<=i-1;k++)
00698     {
00699       tmp-=L(i,k)*L(i,k);
00700     }
00701    
00702     if (value(tmp)<=0)
00703     {
00704       cerr << "Error matrix not positive definite in choleski_decomp"
00705         <<endl;
00706       ad_exit(1);
00707     }
00708    
00709     L(i,i)=sqrt(tmp);
00710   }
00711 
00712   return L;
00713 }
00714 
00715 df1b2matrix& df1b2matrix::operator = (const df3_one_matrix& M)
00716 {
00717   int rmin=M.indexmin();
00718   int rmax=M.indexmax();
00719   if (rmin != indexmin() || rmax != indexmax())
00720   {
00721     cerr << "unequal shape in "
00722      "df1b2matrix& df1b2matrix::operator = (const df3_one_matrix& M)"
00723       << endl;
00724     ad_exit(1);
00725   }
00726 
00727   for (int i=rmin;i<=rmax;i++)
00728   {
00729     (*this)(i)=M(i);
00730   }
00731   return *this;
00732 }
00733     
00734 
00735 df1b2vector& df1b2vector::operator = (const df3_one_vector& M)
00736 {
00737   int rmin=M.indexmin();
00738   int rmax=M.indexmax();
00739   if (rmin != indexmin() || rmax != indexmax())
00740   {
00741     cerr << "unequal shape in "
00742      "df1b2vector& df1b2vector::operator = (const df3_one_vector& M)"
00743       << endl;
00744     ad_exit(1);
00745   }
00746 
00747   for (int i=rmin;i<=rmax;i++)
00748   {
00749     (*this)(i)=M(i);
00750   }
00751   return *this;
00752 }
00753     
00754 
00755 df1b2variable& df1b2variable::operator = (const df3_one_variable& v)
00756 {
00757   df1b2variable * px=df3_one_variable::ind_var;
00758   //df3_one_variable::ind_var=0;
00759   //df1b2variable * px=0;
00760   double  df= *v.get_udot();
00761   double * xd=px->get_u_dot();
00762   double * zd=get_u_dot();
00763   *get_u()=*v.get_u();
00764   for (int i=0;i<df1b2variable::nvar;i++)
00765   {
00766     *zd++ = df * *xd++;
00767   }
00768       
00769  /*
00770   cout << *v.get_u()  << " ";
00771   cout << *v.get_udot()  << " ";
00772   cout << *v.get_udot2()  << " ";
00773   cout << *v.get_udot3()  << endl;
00774   */
00775   f1b2gradlist->write_pass1(px,this,*v.get_udot(),*v.get_udot2(),
00776 
00777     *v.get_udot3()); 
00778   return *this;
00779 }
00780 
00781 
00782 df1b2variable cumd_norm(const df1b2variable& _x)
00783 {
00784   df1b2variable z;
00785   init_df3_one_variable x(_x);
00786 
00787   const double b1=0.319381530;
00788   const double b2=-0.356563782;
00789   const double b3=1.781477937;
00790   const double b4=-1.821255978;
00791   const double b5=1.330274429;
00792   const double p=.2316419;
00793   
00794   if (value(x)>=0)
00795   {
00796     df3_one_variable u1=p*x;
00797     df3_one_variable u2=1.+p*x;
00798     df3_one_variable u=1./(1.+p*x);
00799     df3_one_variable y=  ((((b5*u+b4)*u+b3)*u+b2)*u+b1)*u;
00800     df3_one_variable tmp1=-0.3989422804*exp(-.5*x*x);
00801     z=1.0+tmp1*y;
00802   }
00803   else
00804   {
00805     df3_one_variable w=-x;
00806     df3_one_variable u=1./(1+p*w);
00807     df3_one_variable y=  ((((b5*u+b4)*u+b3)*u+b2)*u+b1)*u;
00808     df3_one_variable tmp1=0.3989422804*exp(-.5*x*x);
00809     z=tmp1*y;
00810   }
00811   return z;
00812 }
00813 
00814 df1b2variable bounded_cumd_norm(const df1b2variable& _x, double beta)
00815 {
00816   df1b2variable z;
00817   init_df3_one_variable x(_x);
00818 
00819   const double b1=0.319381530;
00820   const double b2=-0.356563782;
00821   const double b3=1.781477937;
00822   const double b4=-1.821255978;
00823   const double b5=1.330274429;
00824   const double p=.2316419;
00825   
00826   if (value(x)>=0)
00827   {
00828     df3_one_variable u1=p*x;
00829     df3_one_variable u2=1.+p*x;
00830     df3_one_variable u=1./(1.+p*x);
00831     df3_one_variable y=  ((((b5*u+b4)*u+b3)*u+b2)*u+b1)*u;
00832     df3_one_variable tmp1=-0.3989422804*exp(-.5*x*x);
00833     z=1.0+tmp1*y;
00834   }
00835   else
00836   {
00837     df3_one_variable w=-x;
00838     df3_one_variable u=1./(1+p*w);
00839     df3_one_variable y=  ((((b5*u+b4)*u+b3)*u+b2)*u+b1)*u;
00840     df3_one_variable tmp1=0.3989422804*exp(-.5*x*x);
00841     z=tmp1*y;
00842   }
00843   z=beta*(z-0.5)+0.5;
00844   return z;
00845 }
00846 
00847