ADMB Documentation  11.1.1017
 All Classes Files Functions Variables Typedefs Friends Defines
df32fun1.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df32fun1.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  */
00011 #include <df1b2fun.h>
00012 
00013 void myderkludge(void);
00014 
00015 void ad_read_pass2_dvdv(void);
00016 
00021  int df1b2_gradlist::write_pass1(const df1b2variable * _px, 
00022    const df1b2variable * _py,df1b2variable * pz,double df_x,
00023    double df_y,
00024    double df_xx,
00025    double df_xy,
00026    double df_yy,
00027    double df_xxx,
00028    double df_xxy,
00029    double df_xyy,
00030    double df_yyy)
00031  {
00032    ADUNCONST(df1b2variable*,px)
00033    ADUNCONST(df1b2variable*,py)
00034    ncount++;
00035 #if defined(CHECK_COUNT)
00036   if (ncount >= ncount_check)
00037     ncount_checker(ncount,ncount_check);
00038 #endif
00039    int nvar=df1b2variable::nvar;
00040 
00041    int total_bytes=3*sizeof(df1b2_header)+sizeof(char*)
00042      +(2*nvar+11)*sizeof(double);
00043 
00044 // string identifier debug stuff
00045 #if defined(SAFE_ALL)
00046   char ids[]="UZ";
00047   int slen=strlen(ids);
00048   total_bytes+=slen;
00049 #endif
00050   list.check_buffer_size(total_bytes);
00051   void * tmpptr=list.bptr;
00052 #if defined(SAFE_ALL)
00053   memcpy(list,ids,slen);
00054 #endif
00055 // end of string identifier debug stuff
00056 
00057    memcpy(list,(df1b2_header*)(px),sizeof(df1b2_header));
00058    memcpy(list,(df1b2_header*)(py),sizeof(df1b2_header));
00059    memcpy(list,(df1b2_header*)(pz),sizeof(df1b2_header));
00060    //memcpy(list,&pf,sizeof(char *));
00061    //*(char**)(list.bptr)=(char*)pf;
00062 
00063    memcpy(list,&df_x,sizeof(double));
00064    memcpy(list,&df_y,sizeof(double));
00065    memcpy(list,&df_xx,sizeof(double));
00066    memcpy(list,&df_xy,sizeof(double));
00067    memcpy(list,&df_yy,sizeof(double));
00068    memcpy(list,&df_xxx,sizeof(double));
00069    memcpy(list,&df_xxy,sizeof(double));
00070    memcpy(list,&df_xyy,sizeof(double));
00071    memcpy(list,&df_yyy,sizeof(double));
00072 
00073    memcpy(list,px->get_u(),sizeof(double));
00074    memcpy(list,py->get_u(),sizeof(double));
00075    memcpy(list,px->get_u_dot(),nvar*sizeof(double));
00076    memcpy(list,py->get_u_dot(),nvar*sizeof(double));
00077    // ***** write  record size
00078    nlist.bptr->numbytes=adptr_diff(list.bptr,tmpptr);
00079    nlist.bptr->pf=(ADrfptr)(&ad_read_pass2_dvdv);
00080    ++nlist;
00081    return 0;
00082  }
00083 
00084 
00085 void read_pass2_1_dvdv(void);
00086 void read_pass2_2_dvdv(void);
00087 void read_pass2_3_dvdv(void);
00088 
00093 void ad_read_pass2_dvdv(void)
00094 {
00095   switch(df1b2variable::passnumber)
00096   {
00097   case 1:
00098     read_pass2_1_dvdv();
00099     break;
00100   case 2:
00101     read_pass2_2_dvdv();
00102     break;
00103   case 3:
00104     read_pass2_3_dvdv();
00105     break;
00106   default:
00107     cerr << "illegal value for df1b2variable::pass = " 
00108          << df1b2variable::passnumber << endl;
00109     exit(1);
00110   }
00111 }
00112 
00117 void read_pass2_1_dvdv(void)
00118 {
00119   // We are going backword for bptr and nbptr
00120   // and  forward for bptr2 and nbptr2
00121   // the current entry+2 in bptr is the size of the record i.e
00122   // points to the next record
00123   //char * bptr=f1b2gradlist->bptr; 
00124   //char * bptr2=f1b2gradlist2->bptr; 
00125   int nvar=df1b2variable::nvar;
00126   test_smartlist& list=f1b2gradlist->list; 
00127   //f1b2gradlist->nlist-=sizeof(int);
00128   int num_bytes=f1b2gradlist->nlist.bptr->numbytes;
00129   list-=num_bytes;
00130   list.saveposition(); // save pointer to beginning of record;
00131   double xu,yu;
00132   //ad_dstar xdot,ydot;
00133   //df1b2function2 * pf;
00134 
00135   // get info from tape1
00136 #if defined(SAFE_ARRAYS)
00137   checkidentiferstring("UZ",f1b2gradlist->list);
00138 #endif
00139   char * bptr=f1b2gradlist->list.bptr;
00140   df1b2_header * px=(df1b2_header *) bptr;
00141   bptr+=sizeof(df1b2_header);
00142   df1b2_header * py=(df1b2_header *) bptr;
00143   bptr+=sizeof(df1b2_header);
00144   df1b2_header * pz=(df1b2_header *) bptr;
00145   bptr+=sizeof(df1b2_header);
00146   //pf=*(df1b2function2 **) bptr;
00147   //bptr+=sizeof(char*);
00148 
00149   double df1=*(double*) bptr;
00150   bptr+=sizeof(double);
00151 
00152   double df2=*(double*) bptr;
00153   bptr+=sizeof(double);
00154 
00155   double d2f11=*(double*) bptr;
00156   bptr+=sizeof(double);
00157 
00158   double d2f12=*(double*) bptr;
00159   bptr+=sizeof(double);
00160 
00161   double d2f22=*(double*) bptr;
00162   bptr+=sizeof(double);
00163 
00164 #if defined(PRINT_DERS)
00165   double d3f111=*(double*) bptr;
00166 #endif
00167   bptr+=sizeof(double);
00168 
00169 #if defined(PRINT_DERS)
00170   double d3f112=*(double*) bptr;
00171 #endif
00172   bptr+=sizeof(double);
00173 
00174 #if defined(PRINT_DERS)
00175   double d3f122=*(double*) bptr;
00176 #endif
00177   bptr+=sizeof(double);
00178 
00179 #if defined(PRINT_DERS)
00180   double d3f222=*(double*) bptr;
00181 #endif
00182   bptr+=sizeof(double);
00183 
00184   memcpy(&xu,bptr,sizeof(double));
00185   bptr+=sizeof(double);
00186   memcpy(&yu,bptr,sizeof(double));
00187   bptr+=sizeof(double);
00188   double * xdot=(double*)bptr;
00189   bptr+=nvar*sizeof(double);
00190   double * ydot=(double*)bptr;
00191 
00192   list.restoreposition(); // save pointer to beginning of record;
00193  
00194   // ****************************************************************
00195   // turn this off if no third derivatives are calculated
00196   // if (!no_third_derivatives)
00197   // {
00198   // save for second reverse pass
00199   // save identifier 1
00200      test_smartlist & list2 = f1b2gradlist->list2;
00201 
00202 
00203    int total_bytes=2*nvar*sizeof(double);
00204 // string identifier debug stuff
00205 #if defined(SAFE_ALL)
00206   char ids[]="FW";
00207   int slen=strlen(ids);
00208   total_bytes+=slen;
00209 #endif
00210   list2.check_buffer_size(total_bytes);
00211   void * tmpptr=list2.bptr;
00212 #if defined(SAFE_ALL)
00213   memcpy(list2,ids,slen);
00214 #endif
00215 
00216      fixed_smartlist2 & nlist2 = f1b2gradlist->nlist2;
00217      memcpy(list2,pz->get_u_bar(),nvar*sizeof(double));
00218      memcpy(list2,pz->get_u_dot_bar(),nvar*sizeof(double));
00219      *nlist2.bptr=adptr_diff(list2.bptr,tmpptr);
00220      ++nlist2;
00221   // }
00222   //
00223   // ****************************************************************
00224 #if defined(PRINT_DERS)
00225  print_derivatives(funname,(f),(df1),
00226   (df2),(d2f11),(d2f12),(d2f22),
00227   (d3f111),(d3f112),(d3f122),
00228   (d3f222),1);
00229  print_derivatives(pz,"z"); 
00230  print_derivatives(px,"x"); 
00231  print_derivatives(py,"y"); 
00232 #endif
00233 #if defined(__DERCHECK__)
00234   if (derchecker)
00235   if (derchecker->node_number)
00236   {
00237     if (derchecker->counter == derchecker->node_number)
00238     {
00239       myderkludge();
00240       switch (derchecker->pass_number) // increment the variable of interest
00241       {
00242       case 2:
00243         switch(derchecker->vartype)
00244         {
00245         case 1:
00246           if (!derchecker->dotflag)
00247             px->u_bar[derchecker->index-1]+=derchecker->delta;
00248           else 
00249             px->u_dot_bar[derchecker->index-1]+=derchecker->delta;
00250           break;
00251         case 2:
00252           if (!derchecker->dotflag)
00253             py->u_bar[derchecker->index-1]+=derchecker->delta;
00254           else
00255             py->u_dot_bar[derchecker->index-1]+=derchecker->delta;
00256           break;
00257         case 3:
00258           if (!derchecker->dotflag)
00259             pz->u_bar[derchecker->index-1]+=derchecker->delta;
00260           else
00261             pz->u_dot_bar[derchecker->index-1]+=derchecker->delta;
00262           break;
00263         default:
00264           cerr << "Invalid index value for dercheck_index was " 
00265                << derchecker->index << endl;
00266           break;
00267         }
00268         break;
00269       case 3:
00270         switch(derchecker->vartype)
00271         {
00272         case 1:
00273           if (!derchecker->dotflag)
00274             px->u_bar[derchecker->index-1]-=derchecker->delta;
00275           else 
00276             px->u_dot_bar[derchecker->index-1]-=derchecker->delta;
00277           break;
00278         case 2:
00279           if (!derchecker->dotflag)
00280             py->u_bar[derchecker->index-1]-=derchecker->delta;
00281           else
00282             py->u_dot_bar[derchecker->index-1]-=derchecker->delta;
00283           break;
00284         case 3:
00285           if (!derchecker->dotflag)
00286             pz->u_bar[derchecker->index-1]-=derchecker->delta;
00287           else
00288             pz->u_dot_bar[derchecker->index-1]-=derchecker->delta;
00289           break;
00290         default:
00291           cerr << "Invalid index value for dercheck_index was " 
00292                << derchecker->index << endl;
00293           break;
00294         }
00295         break;
00296       }
00297     }  
00298   }
00299 #endif
00300 
00301   // Do first reverse pass calculations
00302   int i;
00303   for (i=0;i<nvar;i++)
00304   {
00305     px->u_bar[i]+=(df1)*pz->u_bar[i];
00306   }
00307   for (i=0;i<nvar;i++)
00308   {
00309     py->u_bar[i]+=(df2)*pz->u_bar[i];
00310   }
00311   for (i=0;i<nvar;i++)
00312   {
00313     px->u_bar[i]+=(d2f11)*xdot[i]*pz->u_dot_bar[i];
00314     px->u_bar[i]+=(d2f12)*ydot[i]*pz->u_dot_bar[i];
00315 #if defined(ADDEBUG_PRINT)
00316     cout << px->u_bar[i] << " " << pz->u_dot_bar[i] << " " << addebug_count << endl;
00317 #endif
00318   }
00319   for (i=0;i<nvar;i++)
00320   {
00321     //py->u_bar[i]+=(d2f22)(*(px->u),*(py->u))*ydot[i]*pz->u_dot_bar[i];
00322     //py->u_bar[i]+=(d2f12)(*(px->u),*(py->u))*xdot[i]*pz->u_dot_bar[i];
00323     py->u_bar[i]+=(d2f22)*ydot[i]*pz->u_dot_bar[i];
00324     py->u_bar[i]+=(d2f12)*xdot[i]*pz->u_dot_bar[i];
00325 #if defined(ADDEBUG_PRINT)
00326     cout << py->u_bar[i] << " " << pz->u_dot_bar[i] << " " << addebug_count << endl;
00327 #endif
00328   }
00329   for (i=0;i<nvar;i++)
00330   {
00331     //px->u_dot_bar[i]+=(df1)(*(px->u),*(py->u))*pz->u_dot_bar[i];
00332     px->u_dot_bar[i]+=(df1)*pz->u_dot_bar[i];
00333 #if defined(ADDEBUG_PRINT)
00334     cout << px->u_dot_bar[i] << " " << addebug_count << endl;
00335     cout << pz->u_dot_bar[i] << " " << addebug_count << endl;
00336 #endif
00337   }
00338   for (i=0;i<nvar;i++)
00339   {
00340     py->u_dot_bar[i]+=(df2)*pz->u_dot_bar[i];
00341 #if defined(ADDEBUG_PRINT)
00342     cout << py->u_dot_bar[i] << " " << addebug_count << endl;
00343     cout << pz->u_dot_bar[i] << " " << addebug_count << endl;
00344 #endif
00345   }
00346   
00347 
00348 
00349   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00350   for (i=0;i<nvar;i++)
00351   {
00352     pz->u_bar[i]=0;
00353   }
00354   for (i=0;i<nvar;i++)
00355   {
00356     pz->u_dot_bar[i]=0;
00357   }
00358   
00359 #if defined(PRINT_DERS)
00360  print_derivatives(pz,"z"); 
00361  print_derivatives(px,"x"); 
00362  print_derivatives(py,"y"); 
00363 #endif
00364 }
00365 
00370 void read_pass2_2_dvdv(void)
00371 {
00372   //const int nlist_record_size=sizeof(int)+sizeof(char*);
00373   // We are going forward for bptr and backword for bptr2
00374   //
00375   // list 1
00376   //
00377   int nvar=df1b2variable::nvar;
00378   test_smartlist & list=f1b2gradlist->list; 
00379 
00380   // !!!!!!!!!!!!!!!!!!!!!! change here
00381   int total_bytes=3*sizeof(df1b2_header)+sizeof(char*)
00382      +(2*nvar+11)*sizeof(double);
00383   //int total_bytes=3*sizeof(df1b2_header)+sizeof(char*)
00384    // +2*(nvar+1)*sizeof(double);
00385 // string identifier debug stuff
00386 #if defined(SAFE_ALL)
00387   char ids[]="UZ";
00388   int slen=strlen(ids);
00389   total_bytes+=slen;
00390 #endif
00391   list.check_buffer_size(total_bytes);
00392 // end of string identifier debug stuff
00393 
00394   list.saveposition(); // save pointer to beginning of record;
00395   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00396    // nlist-=sizeof(int);
00397   // get record size
00398   int num_bytes=nlist.bptr->numbytes;
00399     // nlist+=nlist_record_size;
00400   //
00401   // list 2
00402   //
00403   test_smartlist & list2=f1b2gradlist->list2; 
00404   fixed_smartlist2 & nlist2=f1b2gradlist->nlist2; 
00405   // get record size
00406   int num_bytes2=*nlist2.bptr;
00407   --nlist2;
00408   // backup the size of the record
00409   list2-=num_bytes2;
00410   list2.saveposition(); // save pointer to beginning of record;
00411   // save the pointer to the beginning of the record
00412   // bptr and bptr2 now both point to the beginning of their records
00413 
00414   double xu,yu;
00415   //df1b2_header x,z;
00416   //df1b2function2 * pf;
00417 
00418   // get info from tape1
00419   // get info from tape1
00420 #if defined(SAFE_ARRAYS)
00421   checkidentiferstring("UZ",list);
00422   checkidentiferstring("FW",list2);
00423 #endif
00424   /*
00425   df1b2_header * px=(df1b2_header *) list.bptr;
00426   list.bptr+=sizeof(df1b2_header);
00427   df1b2_header * py=(df1b2_header *) list.bptr;
00428   list.bptr+=sizeof(df1b2_header);
00429   df1b2_header * pz=(df1b2_header *) list.bptr;
00430   list.bptr+=sizeof(df1b2_header);
00431   pf=*(df1b2function2 **) list.bptr;
00432   list.bptr+=sizeof(char*);
00433   memcpy(&xu,list.bptr,sizeof(double));
00434   list.bptr+=sizeof(double);
00435   memcpy(&yu,list.bptr,sizeof(double));
00436   list.bptr+=sizeof(double);
00437   xdot=(double*)list.bptr;
00438   list.bptr+=nvar*sizeof(double);
00439   ydot=(double*)list.bptr;
00440   */
00441   //char * bptr=f1b2gradlist->list.bptr;
00442   df1b2_header * px=(df1b2_header *) list.bptr;
00443   list.bptr+=sizeof(df1b2_header);
00444   df1b2_header * py=(df1b2_header *) list.bptr;
00445   list.bptr+=sizeof(df1b2_header);
00446   df1b2_header * pz=(df1b2_header *) list.bptr;
00447   list.bptr+=sizeof(df1b2_header);
00448   //pf=*(df1b2function2 **) list.bptr;
00449   //list.bptr+=sizeof(char*);
00450 
00451   double df1=*(double*) list.bptr;
00452   list.bptr+=sizeof(double);
00453 
00454   double df2=*(double*) list.bptr;
00455   list.bptr+=sizeof(double);
00456 
00457   double d2f11=*(double*) list.bptr;
00458   list.bptr+=sizeof(double);
00459 
00460   double d2f12=*(double*) list.bptr;
00461   list.bptr+=sizeof(double);
00462 
00463   double d2f22=*(double*) list.bptr;
00464   list.bptr+=sizeof(double);
00465 
00466   double d3f111=*(double*) list.bptr;
00467   list.bptr+=sizeof(double);
00468 
00469   double d3f112=*(double*) list.bptr;
00470   list.bptr+=sizeof(double);
00471 
00472   double d3f122=*(double*) list.bptr;
00473   list.bptr+=sizeof(double);
00474 
00475   double d3f222=*(double*) list.bptr;
00476   list.bptr+=sizeof(double);
00477 
00478   memcpy(&xu,list.bptr,sizeof(double));
00479   list.bptr+=sizeof(double);
00480   memcpy(&yu,list.bptr,sizeof(double));
00481   list.bptr+=sizeof(double);
00482   double * xdot=(double*)list.bptr;
00483   list.bptr+=nvar*sizeof(double);
00484   double * ydot=(double*)list.bptr;
00485 
00486   list.restoreposition(num_bytes); // save pointer to beginning of record;
00487   
00488   double * zbar;
00489   double * zdotbar;
00490 
00491 
00492   zbar=(double*)list2.bptr;
00493   zdotbar=(double*)(list2.bptr+nvar*sizeof(double));
00494   list2.restoreposition(); // save pointer to beginning of record;
00495 
00496   double * x_tilde=px->get_u_tilde();
00497   double * x_dot_tilde=px->get_u_dot_tilde();
00498   double * x_bar_tilde=px->get_u_bar_tilde();
00499   double * x_dot_bar_tilde=px->get_u_dot_bar_tilde();
00500   double * y_tilde=py->get_u_tilde();
00501   double * y_dot_tilde=py->get_u_dot_tilde();
00502   double * y_bar_tilde=py->get_u_bar_tilde();
00503   double * y_dot_bar_tilde=py->get_u_dot_bar_tilde();
00504   double * z_bar_tilde=pz->get_u_bar_tilde();
00505   double * z_dot_bar_tilde=pz->get_u_dot_bar_tilde();
00506   // Do second "reverse-reverse" pass calculations
00507 #if defined(PRINT_DERS)
00508  print_derivatives(funname,(f),(df1),
00509   (df2),(d2f11),(d2f12),(d2f22),
00510   (d3f111),(d3f112),(d3f122),
00511   (d3f222),1);
00512  print_derivatives(pz,"z"); 
00513  print_derivatives(px,"x"); 
00514  print_derivatives(py,"y"); 
00515 #endif
00516 
00517   int i;
00518   
00519   for (i=0;i<nvar;i++)
00520   {
00521     z_bar_tilde[i]=0;
00522     z_dot_bar_tilde[i]=0;
00523   }
00524   
00525   // start with x and add y
00526   for (i=0;i<nvar;i++)
00527   {
00528     *x_tilde+=(d2f11)*zbar[i]*x_bar_tilde[i];
00529     z_bar_tilde[i]+=(df1)*x_bar_tilde[i];
00530     *y_tilde+=(d2f12)*zbar[i]*x_bar_tilde[i];
00531   }
00532 
00533   for (i=0;i<nvar;i++)
00534   {
00535     *x_tilde+=(d2f11)*zdotbar[i]*x_dot_bar_tilde[i];
00536     *y_tilde+=(d2f12)*zdotbar[i]*x_dot_bar_tilde[i];
00537     z_dot_bar_tilde[i]+=(df1)*x_dot_bar_tilde[i];
00538   }
00539 
00540   for (i=0;i<nvar;i++)
00541   {
00542     x_dot_tilde[i]+=(d2f11)*zdotbar[i]*x_bar_tilde[i];
00543     z_dot_bar_tilde[i]+=(d2f11)*xdot[i]*x_bar_tilde[i];
00544     *x_tilde+=(d3f111)*xdot[i]*zdotbar[i]*x_bar_tilde[i];
00545     *y_tilde+=(d3f112)*xdot[i]*zdotbar[i]*x_bar_tilde[i];
00546   }
00547   // start with y and add x
00548   for (i=0;i<nvar;i++)
00549   {
00550     *y_tilde+=(d2f22)*zbar[i]*y_bar_tilde[i];
00551     *x_tilde+=(d2f12)*zbar[i]*y_bar_tilde[i];
00552     z_bar_tilde[i]+=(df2)*y_bar_tilde[i];
00553   }
00554 
00555   for (i=0;i<nvar;i++)
00556   {
00557     *y_tilde+=(d2f22)*zdotbar[i]*y_dot_bar_tilde[i];
00558     *x_tilde+=(d2f12)*zdotbar[i]*y_dot_bar_tilde[i];
00559     z_dot_bar_tilde[i]+=(df2)*y_dot_bar_tilde[i];
00560   }
00561 
00562   for (i=0;i<nvar;i++)
00563   {
00564     y_dot_tilde[i]+=(d2f22)*zdotbar[i]*y_bar_tilde[i];
00565     z_dot_bar_tilde[i]+=(d2f22)*ydot[i]*y_bar_tilde[i];
00566     *y_tilde+=(d3f222)*ydot[i]*zdotbar[i]*y_bar_tilde[i];
00567     *x_tilde+=(d3f122)*ydot[i]*zdotbar[i]*y_bar_tilde[i];
00568   }
00569   for (i=0;i<nvar;i++)
00570   {
00571     *x_tilde+=(d3f112)*ydot[i]*zdotbar[i]*x_bar_tilde[i];
00572     *y_tilde+=(d3f122)*ydot[i]*zdotbar[i]*x_bar_tilde[i];
00573     y_dot_tilde[i]+=(d2f12)*zdotbar[i]*x_bar_tilde[i];
00574     z_dot_bar_tilde[i]+=(d2f12)*ydot[i]*x_bar_tilde[i];
00575   }
00576   for (i=0;i<nvar;i++)
00577   {
00578     *x_tilde+=(d3f112)*xdot[i]*zdotbar[i]*y_bar_tilde[i];
00579     *y_tilde+=(d3f122)*xdot[i]*zdotbar[i]*y_bar_tilde[i];
00580     x_dot_tilde[i]+=(d2f12)*zdotbar[i]*y_bar_tilde[i];
00581     z_dot_bar_tilde[i]+=(d2f12)*xdot[i]*y_bar_tilde[i];
00582   }
00583 #if defined(__DERCHECK__)
00584   if (derchecker->node_number)
00585   {
00586     if (derchecker->counter == derchecker->node_number)
00587     {
00588       myderkludge();
00589       if (derchecker->pass_number==1) // increment the variable of interest
00590       {
00591         switch(derchecker->vartype)
00592         {
00593         case 1:
00594           if (!derchecker->dotflag)
00595             derchecker->der_value=
00596               px->u_bar_tilde[derchecker->index-1];
00597           else
00598             derchecker->der_value=
00599               px->u_dot_bar_tilde[derchecker->index-1];
00600           break;
00601         case 2:
00602           if (!derchecker->dotflag)
00603             derchecker->der_value=
00604               py->u_bar_tilde[derchecker->index-1];
00605           else
00606             derchecker->der_value=
00607               py->u_dot_bar_tilde[derchecker->index-1];
00608           break;
00609         case 3:
00610           if (!derchecker->dotflag)
00611             derchecker->der_value=
00612               pz->u_bar_tilde[derchecker->index-1];
00613           else
00614             derchecker->der_value=
00615               pz->u_dot_bar_tilde[derchecker->index-1];
00616           break;
00617         default:
00618           cerr << "Invalid index value for dercheck_index was " 
00619                << derchecker->index << endl;
00620         }
00621       }
00622     }  
00623   }
00624 #endif
00625 #if defined(PRINT_DERS)
00626  print_derivatives(pz,"z"); 
00627  print_derivatives(px,"x"); 
00628  print_derivatives(py,"y"); 
00629 #endif
00630 }
00631 
00636 void read_pass2_3_dvdv(void)
00637 {
00638   // We are going backword for bptr and forward for bptr2
00639   // the current entry+2 in bptr is the size of the record i.e
00640   // points to the next record
00641   int nvar=df1b2variable::nvar;
00642   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00643   test_smartlist& list=f1b2gradlist->list; 
00644    // nlist-=sizeof(int);
00645   // get record size
00646   int num_bytes=nlist.bptr->numbytes;
00647   // backup the size of the record
00648   list-=num_bytes;
00649   list.saveposition(); // save pointer to beginning of record;
00650   // save the pointer to the beginning of the record
00651   double xu;
00652   double yu;
00653   //df1b2_header x,z;
00654   //df1b2function2 * pf;
00655 
00656   // get info from tape1
00657   // get info from tape1
00658 #if defined(SAFE_ARRAYS)
00659   checkidentiferstring("UZ",list);
00660 #endif
00661  /*
00662   df1b2_header * px=(df1b2_header *) list.bptr;
00663   list.bptr+=sizeof(df1b2_header);
00664   df1b2_header * py=(df1b2_header *) list.bptr;
00665   list.bptr+=sizeof(df1b2_header);
00666   df1b2_header * pz=(df1b2_header *) list.bptr;
00667   list.bptr+=sizeof(df1b2_header);
00668   pf=*(df1b2function2 **) list.bptr;
00669   list.bptr+=sizeof(char*);
00670   memcpy(&xu,list.bptr,sizeof(double));
00671   list.bptr+=sizeof(double);
00672   memcpy(&yu,list.bptr,sizeof(double));
00673   list.bptr+=sizeof(double);
00674   xdot=(double*)list.bptr;
00675   list.bptr+=nvar*sizeof(double);
00676   ydot=(double*)list.bptr;
00677  */
00678   df1b2_header * px=(df1b2_header *) list.bptr;
00679   list.bptr+=sizeof(df1b2_header);
00680   df1b2_header * py=(df1b2_header *) list.bptr;
00681   list.bptr+=sizeof(df1b2_header);
00682   df1b2_header * pz=(df1b2_header *) list.bptr;
00683   list.bptr+=sizeof(df1b2_header);
00684   //pf=*(df1b2function2 **) list.bptr;
00685   //list.bptr+=sizeof(char*);
00686 
00687   double df1=*(double*) list.bptr;
00688   list.bptr+=sizeof(double);
00689 
00690   double df2=*(double*) list.bptr;
00691   list.bptr+=sizeof(double);
00692 
00693   double d2f11=*(double*) list.bptr;
00694   list.bptr+=sizeof(double);
00695 
00696   double d2f12=*(double*) list.bptr;
00697   list.bptr+=sizeof(double);
00698 
00699   double d2f22=*(double*) list.bptr;
00700   list.bptr+=sizeof(double);
00701 
00702 #if defined(PRINT_DERS)
00703   double d3f111=*(double*) list.bptr;
00704 #endif
00705   list.bptr+=sizeof(double);
00706 
00707 #if defined(PRINT_DERS)
00708   double d3f112=*(double*) list.bptr;
00709 #endif
00710   list.bptr+=sizeof(double);
00711 
00712 #if defined(PRINT_DERS)
00713   double d3f122=*(double*) list.bptr;
00714 #endif
00715   list.bptr+=sizeof(double);
00716 
00717 #if defined(PRINT_DERS)
00718   double d3f222=*(double*) list.bptr;
00719 #endif
00720   list.bptr+=sizeof(double);
00721 
00722   memcpy(&xu,list.bptr,sizeof(double));
00723   list.bptr+=sizeof(double);
00724   memcpy(&yu,list.bptr,sizeof(double));
00725   list.bptr+=sizeof(double);
00726   double * xdot=(double*)list.bptr;
00727   list.bptr+=nvar*sizeof(double);
00728   double * ydot=(double*)list.bptr;
00729 
00730   list.restoreposition(); // save pointer to beginning of record;
00731   int i;
00732 #if defined(PRINT_DERS)
00733  print_derivatives(funname,(f),(df1),
00734   (df2),(d2f11),(d2f12),(d2f22),
00735   (d3f111),(d3f112),(d3f122),
00736   (d3f222),1);
00737  print_derivatives(pz,"z"); 
00738  print_derivatives(px,"x"); 
00739  print_derivatives(py,"y"); 
00740 #endif
00741   
00742   *(px->u_tilde)+=(df1)* *(pz->u_tilde);
00743   *(py->u_tilde)+=(df2)* *(pz->u_tilde);
00744   for (i=0;i<nvar;i++)
00745   {
00746     *(px->u_tilde)+=(d2f11)*xdot[i]*pz->u_dot_tilde[i];
00747     *(py->u_tilde)+=(d2f12)*xdot[i]*pz->u_dot_tilde[i];
00748     *(py->u_tilde)+=(d2f22)*ydot[i]*pz->u_dot_tilde[i];
00749     *(px->u_tilde)+=(d2f12)*ydot[i]*pz->u_dot_tilde[i];
00750   }
00751   for (i=0;i<nvar;i++)
00752   {
00753     px->u_dot_tilde[i]+=(df1)*pz->u_dot_tilde[i];
00754     py->u_dot_tilde[i]+=(df2)*pz->u_dot_tilde[i];
00755   }
00756   *(pz->u_tilde)=0;
00757   for (i=0;i<nvar;i++)
00758   {
00759     pz->u_dot_tilde[i]=0;
00760   }
00761 #if defined(PRINT_DERS)
00762  print_derivatives(pz,"z"); 
00763  print_derivatives(px,"x"); 
00764  print_derivatives(py,"y"); 
00765 #endif
00766 }