ADMB Documentation  11.1.1015
 All Classes Files Functions Variables Typedefs Friends Defines
df1b2min3.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df1b2min3.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 
00014   df1b2variable operator - (const df1b2variable& _y,double x)
00015   {
00016     ADUNCONST(df1b2variable,y)
00017     df1b2variable z;
00018     double * yd=y.get_u_dot();
00019     double * zd=z.get_u_dot();
00020     *z.get_u()=*y.get_u()-x;
00021     for (int i=0;i<df1b2variable::nvar;i++)
00022     {
00023       *zd++ = *yd++;
00024     }
00025     
00026     // WRITE WHATEVER ON TAPE
00027     if (!df1b2_gradlist::no_derivatives)
00028       f1b2gradlist->write_pass1_minusvc(&y,&z);
00029     return z;
00030   }
00031 
00032 void ad_read_pass2_minusvc(void);
00033 
00034  int df1b2_gradlist::write_pass1_minusvc(const df1b2variable * _py,
00035    df1b2variable * pz)
00036  {
00037    ADUNCONST(df1b2variable*,py)
00038    ncount++;
00039 #if defined(CHECK_COUNT)
00040   if (ncount >= ncount_check)
00041     cout << ncount << endl;
00042 #endif
00043    int nvar=df1b2variable::nvar;
00044 
00045    int total_bytes=2*sizeof(df1b2_header);
00046 // string identifier debug stuff
00047 #if defined(SAFE_ALL)
00048   char ids[]="LK";
00049   int slen=strlen(ids);
00050   total_bytes+=slen;
00051 #endif
00052   list.check_buffer_size(total_bytes);
00053   void * tmpptr=list.bptr;
00054 #if defined(SAFE_ALL)
00055   memcpy(list,ids,slen);
00056 #endif
00057 // end of string identifier debug stuff
00058 
00059    memcpy(list,(df1b2_header*)(py),sizeof(df1b2_header));
00060    memcpy(list,(df1b2_header*)(pz),sizeof(df1b2_header));
00061    // ***** write  record size
00062    nlist.bptr->numbytes=adptr_diff(list.bptr,tmpptr);
00063    nlist.bptr->pf=(ADrfptr)(&ad_read_pass2_minusvc);
00064       ++nlist;
00065    return 0;
00066  }
00067 
00068 
00069 void read_pass2_1_minusvc(void);
00070 void read_pass2_2_minusvc(void);
00071 void read_pass2_3_minusvc(void);
00072   
00073 void ad_read_pass2_minusvc(void)
00074 {
00075   switch(df1b2variable::passnumber)
00076   {
00077   case 1:
00078     read_pass2_1_minusvc();
00079     break;
00080   case 2:
00081     read_pass2_2_minusvc();
00082     break;
00083   case 3:
00084     read_pass2_3_minusvc();
00085     break;
00086   default:
00087     cerr << "illegal value for df1b2variable::pass = " 
00088          << df1b2variable::passnumber << endl;
00089     exit(1);
00090   }
00091 }
00092 
00093 void read_pass2_1_minusvc(void)
00094 {
00095   // We are going backword for bptr and nbptr
00096   // and  forward for bptr2 and nbptr2
00097   // the current entry+2 in bptr is the size of the record i.e
00098   // points to the next record
00099   int nvar=df1b2variable::nvar;
00100   test_smartlist& list=f1b2gradlist->list; 
00101   int num_bytes=f1b2gradlist->nlist.bptr->numbytes;
00102   list-=num_bytes;
00103   list.saveposition(); // save pointer to beginning of record;
00104 
00105   // get info from tape1
00106 #if defined(SAFE_ARRAYS)
00107   checkidentiferstring("LK",f1b2gradlist->list);
00108 #endif
00109   char * bptr=f1b2gradlist->list.bptr;
00110   df1b2_header * py=(df1b2_header *) bptr;
00111   bptr+=sizeof(df1b2_header);
00112   df1b2_header * pz=(df1b2_header *) bptr;
00113 
00114   list.restoreposition(); // save pointer to beginning of record;
00115  
00116   // ****************************************************************
00117   // turn this off if no third derivatives are calculated
00118   // if (!no_third_derivatives)
00119   // {
00120   // save for second reverse pass
00121   // save identifier 1
00122 
00123   int i;
00124   for (i=0;i<nvar;i++)
00125   {
00126     py->u_bar[i]+=pz->u_bar[i];
00127   }
00128   for (i=0;i<nvar;i++)
00129   {
00130     py->u_dot_bar[i]+=pz->u_dot_bar[i];
00131   }
00132   
00133   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00134   for (i=0;i<nvar;i++)
00135   {
00136     pz->u_bar[i]=0;
00137   }
00138   for (i=0;i<nvar;i++)
00139   {
00140     pz->u_dot_bar[i]=0;
00141   }
00142 }
00143 
00144 void read_pass2_2_minusvc(void)
00145 {
00146   const int nlist_record_size=sizeof(int)+sizeof(char*);
00147   // We are going forward for bptr and backword for bptr2
00148   //
00149   // list 1
00150   //
00151   int nvar=df1b2variable::nvar;
00152   test_smartlist & list=f1b2gradlist->list; 
00153 
00154   int total_bytes=2*sizeof(df1b2_header);
00155 // string identifier debug stuff
00156 #if defined(SAFE_ALL)
00157   char ids[]="BY";
00158   int slen=strlen(ids);
00159   total_bytes+=slen;
00160 #endif
00161   list.check_buffer_size(total_bytes);
00162 // end of string identifier debug stuff
00163 
00164   list.saveposition(); // save pointer to beginning of record;
00165   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00166   // get record size
00167   int num_bytes=nlist.bptr->numbytes;
00168   // get info from tape1
00169 #if defined(SAFE_ARRAYS)
00170   checkidentiferstring("LK",list);
00171 #endif
00172   df1b2_header * py=(df1b2_header *) list.bptr;
00173   list.bptr+=sizeof(df1b2_header);
00174   df1b2_header * pz=(df1b2_header *) list.bptr;
00175   list.restoreposition(num_bytes); // save pointer to beginning of record;
00176   
00177   double * y_bar_tilde=py->get_u_bar_tilde();
00178   double * y_dot_bar_tilde=py->get_u_dot_bar_tilde();
00179   double * z_bar_tilde=pz->get_u_bar_tilde();
00180   double * z_dot_bar_tilde=pz->get_u_dot_bar_tilde();
00181   // Do second "reverse-reverse" pass calculations
00182   int i;
00183   
00184   for (i=0;i<nvar;i++)
00185   {
00186     z_bar_tilde[i]=0;
00187     z_dot_bar_tilde[i]=0;
00188   }
00189   
00190 
00191   // start with y and add x
00192   for (i=0;i<nvar;i++)
00193   {
00194     z_bar_tilde[i]+=y_bar_tilde[i];
00195   }
00196 
00197   for (i=0;i<nvar;i++)
00198   {
00199     z_dot_bar_tilde[i]+=y_dot_bar_tilde[i];
00200   }
00201 }
00202 
00203 void read_pass2_3_minusvc(void)
00204 {
00205   // We are going backword for bptr and forward for bptr2
00206   // the current entry+2 in bptr is the size of the record i.e
00207   // points to the next record
00208   int nvar=df1b2variable::nvar;
00209   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00210   test_smartlist& list=f1b2gradlist->list; 
00211    // nlist-=sizeof(int);
00212   // get record size
00213   int num_bytes=nlist.bptr->numbytes;
00214   // backup the size of the record
00215   list-=num_bytes;
00216   list.saveposition(); // save pointer to beginning of record;
00217   // save the pointer to the beginning of the record
00218   df1b2_header x,z;
00219 
00220   // get info from tape1
00221   // get info from tape1
00222 #if defined(SAFE_ARRAYS)
00223   checkidentiferstring("LK",list);
00224 #endif
00225   df1b2_header * py=(df1b2_header *) list.bptr;
00226   list.bptr+=sizeof(df1b2_header);
00227   df1b2_header * pz=(df1b2_header *) list.bptr;
00228   list.bptr+=sizeof(df1b2_header);
00229 
00230   list.restoreposition(); // save pointer to beginning of record;
00231   int i;
00232   
00233   // !!!!! changed sign DF feb 7 2010
00234   //*(py->u_tilde)-=*(pz->u_tilde);
00235   *(py->u_tilde)+=*(pz->u_tilde);
00236   for (i=0;i<nvar;i++)
00237   {
00238     py->u_dot_tilde[i]+=pz->u_dot_tilde[i];
00239   }
00240   *(pz->u_tilde)=0;
00241   for (i=0;i<nvar;i++)
00242   {
00243     pz->u_dot_tilde[i]=0;
00244   }
00245 }