00001
00002
00003
00004
00005
00006
00011 #include <admodel.h>
00012 #include <df1b2fun.h>
00013 #include "f1b2locl.h"
00014 #include <adrndeff.h>
00015
00016 static void xxx(double*,double*){;}
00017
00018
00023 static void begin_local_calculations(int& nap)
00024 {
00025 df1b2_gradlist::set_no_derivatives();
00026 local_init_var::allocate_all();
00027 local_dep_var::allocate_all();
00028 nap=local_init_var::num_active_parameters;
00029 }
00030
00031 int write_pass1(const df1b2variable * _px,
00032 const df1b2variable * _py,
00033 const df1b2variable * _pz,int nap);
00034
00039 df1b2variable plocal_tester(int i,const df1b2variable& x ,
00040 const df1b2variable& y)
00041 {
00042 df1b2variable z;
00043 z=square(x+2.0*y+2.5);
00044 return z;
00045 }
00046
00051 df1b2variable local_tester(int i,local_init_df1b2variable x ,
00052 local_init_df1b2variable y)
00053 {
00054 int nap;
00055 local_dep_df1b2variable z;
00056 {
00057 begin_local_calculations(nap);
00058 z=square(x+2.0*y+2.5);
00059 local_init_var::end_local_calculations();
00060
00061 }
00062 if (!df1b2_gradlist::no_derivatives)
00063 {
00064 write_pass1(x.p,y.p,z.p,nap);
00065
00066 }
00067 return *(z.p);
00068 }
00069 void ad_read_xxx(void);
00070
00075 int write_pass1(const df1b2variable * px,
00076 const df1b2variable * py,
00077 const df1b2variable * pz,int nap)
00078 {
00079
00080 #if defined(CHECK_COUNT)
00081 if (ncount >= ncount_check)
00082 cout << ncount << endl;
00083 #endif
00084 int nvar=df1b2variable::nvar;
00085
00086
00087
00088 int total_bytes=3*sizeof(df1b2_header)
00089 +2*(nvar+1)*sizeof(double);
00090
00091 #if defined(SAFE_ALL)
00092 char ids[]="DL";
00093 int slen=strlen(ids);
00094 total_bytes+=2*slen;
00095 #endif
00096 f1b2gradlist->list.check_buffer_size(total_bytes);
00097 void * tmpptr=f1b2gradlist->list.bptr;
00098 #if defined(SAFE_ALL)
00099 memcpy(f1b2gradlist->list,ids,slen);
00100 #endif
00101
00102 df1b2_header& tmphead1=(df1b2_header&)(*px);
00103 df1b2_header& tmphead2=(df1b2_header&)(*py);
00104 df1b2_header& dephead1=(df1b2_header&)(*pz);
00105
00106
00107 memcpy(f1b2gradlist->list,&tmphead1,sizeof(df1b2_header));
00108 memcpy(f1b2gradlist->list,&tmphead2,sizeof(df1b2_header));
00109 memcpy(f1b2gradlist->list,&dephead1,sizeof(df1b2_header));
00110
00111
00112 memcpy(f1b2gradlist->list,px->get_u(),sizeof(double));
00113 memcpy(f1b2gradlist->list,py->get_u(),sizeof(double));
00114 memcpy(f1b2gradlist->list,pz->get_u(),sizeof(double));
00115
00116
00117 int gnv=((twointsandptr*)(px->ptr))->nvar;
00118 memcpy(f1b2gradlist->list,&gnv,sizeof(int));
00119 memcpy(f1b2gradlist->list,&nap,sizeof(int));
00120 memcpy(f1b2gradlist->list,px->get_u_dot(),gnv*sizeof(double));
00121 memcpy(f1b2gradlist->list,py->get_u_dot(),gnv*sizeof(double));
00122 memcpy(f1b2gradlist->list,pz->get_u_dot(),gnv*sizeof(double));
00123
00124 #if defined(SAFE_ALL)
00125 char ids2[]="EL";
00126 int slen2=strlen(ids2);
00127 memcpy(f1b2gradlist->list,ids2,slen2);
00128 #endif
00129
00130 f1b2gradlist->nlist.bptr->numbytes=
00131 adptr_diff(f1b2gradlist->list.bptr,tmpptr);
00132 f1b2gradlist->nlist.bptr->pf=(ADrfptr)(&ad_read_xxx);
00133 ++(f1b2gradlist->nlist);
00134 return 0;
00135 }
00136
00141 void read_xxx_1(void)
00142 {
00143
00144
00145
00146
00147 fixed_smartlist & nlist=f1b2gradlist->nlist;
00148 test_smartlist& list=f1b2gradlist->list;
00149
00150
00151 int num_bytes=nlist.bptr->numbytes;
00152
00153 list-=num_bytes;
00154 list.saveposition();
00155
00156 #if defined(SAFE_ARRAYS)
00157 checkidentiferstring("DL",list);
00158 #endif
00159 df1b2_header * px=(df1b2_header *) list.bptr;
00160 list.bptr+=sizeof(df1b2_header);
00161 df1b2_header * py=(df1b2_header *) list.bptr;
00162 list.bptr+=sizeof(df1b2_header);
00163 df1b2_header * pz=(df1b2_header *) list.bptr;
00164 list.bptr+=sizeof(df1b2_header);
00165
00166 double xu,yu,zu;
00167 memcpy(&xu,list.bptr,sizeof(double));
00168 list.bptr+=sizeof(double);
00169
00170 memcpy(&yu,list.bptr,sizeof(double));
00171 list.bptr+=sizeof(double);
00172
00173 memcpy(&zu,list.bptr,sizeof(double));
00174 list.bptr+=sizeof(double);
00175
00176 int nvx;
00177 int nap;
00178 double *xudot,*yudot,*zudot;
00179 memcpy(&nvx,list.bptr,sizeof(int));
00180 list.bptr+=sizeof(int);
00181 memcpy(&nap,list.bptr,sizeof(int));
00182 list.bptr+=sizeof(int);
00183 xudot = (double*) list.bptr;
00184 list.bptr+=nvx*sizeof(double);
00185 yudot = (double*) list.bptr;
00186 list.bptr+=nvx*sizeof(double);
00187 zudot = (double*) list.bptr;
00188 list.bptr+=nvx*sizeof(double);
00189 #if defined(SAFE_ARRAYS)
00190 checkidentiferstring("EL",list);
00191 #endif
00192 xxx(xudot,yudot);
00193 xxx(zudot,yudot);
00194
00195 list.restoreposition();
00196
00197 f1b2gradlist=localf1b2gradlist;
00198 df1b2variable::save_adpool_pointer();
00199
00200
00201 adpool * tmppool=df1b2variable::pool;
00202 if (tmppool)
00203 {
00204
00205
00206 if (tmppool->nvar != nap)
00207 {
00208
00209 int found_pool_flag=0;
00210 for (int i=0;i<df1b2variable::adpool_counter;i++)
00211 {
00212 if (df1b2variable::adpool_vector[i]->nvar == nap)
00213 {
00214 adpool * tmp = df1b2variable::pool;
00215 df1b2variable::pool=df1b2variable::adpool_vector[i];
00216 df1b2variable::nvar=nap;
00217 if (!tmp->on_adpool_vector())
00218 {
00219 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=tmp;
00220 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00221 tmp->nvar;
00222
00223 df1b2variable::increment_adpool_counter();
00224 tmp->on_adpool_vector()=1;
00225 }
00226 found_pool_flag=1;
00227 break;
00228 }
00229 }
00230 if (!found_pool_flag)
00231 {
00232 cerr << "coudn't find right sized pool -- this can't happen"
00233 << endl;
00234 ad_exit(1);
00235 }
00236 }
00237 }
00238
00239 df1b2_gradlist::set_yes_derivatives();
00240
00241
00242 local_init_pass1_df1b2variable x(xu,xudot);
00243 local_init_pass1_df1b2variable y(yu,yudot);
00244
00245
00246 local_init_pass1_var::set_dot_all();
00247
00248
00249 local_dep_df1b2variable z;
00250
00251
00252 z=square(x+2.0*y+2.5);
00253
00254 df1b2_gradlist::set_no_derivatives();
00255
00256 set_dependent_variable(z);
00257 df1b2variable::passnumber=1;
00258 df1b2_gradcalc1();
00259 df1b2variable::restore_adpool_pointer();
00260 f1b2gradlist=globalf1b2gradlist;
00261
00262 double * zprime=z.get_u_dot();
00263 double * pxubar=px->get_u_bar();
00264 double * pyubar=py->get_u_bar();
00265 double * pzubar=pz->get_u_bar();
00266 double * xudotbar=px->get_u_dot_bar();
00267 double * yudotbar=py->get_u_dot_bar();
00268 double * pzudotbar=pz->get_u_dot_bar();
00269
00270
00271 {
00272 for (int i=0;i<nvx;i++)
00273 {
00274
00275
00276
00277 xudotbar[i]+=zprime[0]*pzudotbar[i];
00278 yudotbar[i]+=zprime[1]*pzudotbar[i];
00279
00280 pxubar[i]+=(x.u_bar[0]*xudot[i]+x.u_bar[1]*yudot[i])*pzudotbar[i];
00281 pyubar[i]+=(y.u_bar[0]*xudot[i]+y.u_bar[1]*yudot[i])*pzudotbar[i];
00282
00283 pxubar[i]+=zprime[0]*pzubar[i];
00284 pyubar[i]+=zprime[1]*pzubar[i];
00285
00286 }
00287 }
00288 }
00289
00290 void read_xxx_2(void);
00291 void read_xxx_3(void){;}
00292
00297 void ad_read_xxx(void)
00298 {
00299 switch(df1b2variable::passnumber)
00300 {
00301 case 1:
00302 read_xxx_1();
00303 break;
00304 case 2:
00305 read_xxx_2();
00306 break;
00307 case 3:
00308 read_xxx_3();
00309 break;
00310 default:
00311 cerr << "illegal value for df1b2variable::pass = "
00312 << df1b2variable::passnumber << endl;
00313 exit(1);
00314 }
00315 }
00316
00321 void read_xxx_2(void)
00322 {
00323
00324
00325
00326 int nvar=df1b2variable::nvar;
00327
00328 test_smartlist& list=f1b2gradlist->list;
00329 int total_bytes=3*sizeof(df1b2_header)
00330 +2*(nvar+1)*sizeof(double);
00331
00332 f1b2gradlist->list.check_buffer_size(total_bytes);
00333 list.saveposition();
00334
00335 #if defined(SAFE_ARRAYS)
00336 checkidentiferstring("DL",list);
00337 #endif
00338
00339 list.bptr+=sizeof(df1b2_header);
00340
00341 list.bptr+=sizeof(df1b2_header);
00342
00343 list.bptr+=sizeof(df1b2_header);
00344
00345 double xu,yu,zu;
00346 memcpy(&xu,list.bptr,sizeof(double));
00347 list.bptr+=sizeof(double);
00348
00349 memcpy(&yu,list.bptr,sizeof(double));
00350 list.bptr+=sizeof(double);
00351
00352 memcpy(&zu,list.bptr,sizeof(double));
00353 list.bptr+=sizeof(double);
00354
00355 int nvx;
00356 int nap;
00357 double *xudot,*yudot,*zudot;
00358 memcpy(&nvx,list.bptr,sizeof(int));
00359 list.bptr+=sizeof(int);
00360 memcpy(&nap,list.bptr,sizeof(int));
00361 list.bptr+=sizeof(int);
00362 xudot = (double*) list.bptr;
00363 list.bptr+=nvx*sizeof(double);
00364 yudot = (double*) list.bptr;
00365 list.bptr+=nvx*sizeof(double);
00366 zudot = (double*) list.bptr;
00367 list.bptr+=nvx*sizeof(double);
00368 #if defined(SAFE_ARRAYS)
00369 checkidentiferstring("EL",list);
00370 #endif
00371 xxx(xudot,yudot);
00372 xxx(zudot,yudot);
00373
00374 list.restoreposition();
00375
00376 f1b2gradlist=localf1b2gradlist;
00377 f1b2gradlist->reset();
00378 df1b2variable::save_adpool_pointer();
00379
00380
00381 adpool * tmppool=df1b2variable::pool;
00382 if (tmppool)
00383 {
00384
00385
00386 if (tmppool->nvar != nap)
00387 {
00388
00389 int found_pool_flag=0;
00390 for (int i=0;i<df1b2variable::adpool_counter;i++)
00391 {
00392 if (df1b2variable::adpool_vector[i]->nvar == nap)
00393 {
00394 adpool * tmp = df1b2variable::pool;
00395 df1b2variable::pool=df1b2variable::adpool_vector[i];
00396 df1b2variable::nvar=nap;
00397 if (!tmp->on_adpool_vector())
00398 {
00399 df1b2variable::adpool_vector[df1b2variable::adpool_counter]=tmp;
00400 df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00401 tmp->nvar;
00402
00403 df1b2variable::increment_adpool_counter();
00404 tmp->on_adpool_vector()=1;
00405 }
00406 found_pool_flag=1;
00407 break;
00408 }
00409 }
00410 if (!found_pool_flag)
00411 {
00412 cerr << "coudn't find right sized pool -- this can't happen"
00413 << endl;
00414 ad_exit(1);
00415 }
00416 }
00417 }
00418
00419 df1b2_gradlist::set_yes_derivatives();
00420
00421
00422 local_init_pass1_df1b2variable x(xu,xudot);
00423 local_init_pass1_df1b2variable y(yu,yudot);
00424
00425
00426 local_init_pass1_var::set_dot_all();
00427
00428
00429 local_dep_df1b2variable z;
00430
00431
00432 z=square(x+2.0*y+2.5);
00433
00434 df1b2_gradlist::set_no_derivatives();
00435
00436 set_dependent_variable(z);
00437 df1b2variable::passnumber=1;
00438 df1b2_gradcalc1();
00439
00440 x.get_u_bar_tilde()[0]=1;
00441 x.get_u_bar_tilde()[1]=0;
00442 y.get_u_bar_tilde()[0]=0;
00443 y.get_u_bar_tilde()[1]=0;
00444
00445 df1b2variable::passnumber=2;
00446 df1b2_gradcalc1();
00447
00448 df1b2variable::passnumber=3;
00449 df1b2_gradcalc1();
00450
00451 x.get_u_bar_tilde()[0]=0;
00452 x.get_u_bar_tilde()[1]=1;
00453 y.get_u_bar_tilde()[0]=0;
00454 y.get_u_bar_tilde()[1]=0;
00455
00456 df1b2variable::passnumber=2;
00457 df1b2_gradcalc1();
00458
00459 df1b2variable::passnumber=3;
00460 df1b2_gradcalc1();
00461
00462 }