Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include <df1b2fun.h>
00012 void read_pass1_plus_eq_1(void);
00013 void read_pass1_plus_eq_2(void);
00014 void read_pass1_plus_eq_3(void);
00015
00016 #if defined(ADDEBUG_PRINT)
00017 extern int addebug_count;
00018 #endif
00019
00020
00021
00022 #if defined(PRINT_DERS)
00023
00027 void print_derivatives(const adstring& s, double f, double df,
00028 double d2f,double d3f,int bflag)
00029 {
00030 ostream * derout;
00031 derout=&cout;
00032 if (bflag)
00033 {
00034 *derout << " ---------------------------------------- " << endl;
00035 }
00036 *derout << "Function: " << s << " " << "f = " << f
00037 << " df = " << df << " d2f = " << d2f << " d3f = " << d3f << endl;
00038 }
00039
00044 void print_derivatives(const adstring& s, double f, double df1,
00045 double df2,double df11,double df12, double df22,
00046 double df111, double df112, double df122, double df222,int bflag)
00047 {
00048 ostream * derout;
00049 derout=&cout;
00050 if (bflag)
00051 {
00052 *derout << endl << " --------------------------------- " << endl;
00053 }
00054 *derout << "Function: " << s << " " << "f = " << f
00055 << " df1 = " << df1
00056 << " df2 = " << df2
00057 << " df11 = " << df11
00058 << " df12 = " << df12
00059 << " df22 = " << df22
00060 << " df111 = " << df111
00061 << " df112 = " << df112
00062 << " df122 = " << df122
00063 << " df222 = " << df222 << endl;
00064 }
00065
00070 void print_derivatives(df1b2_header * px,const char * s,
00071 int bflag)
00072 {
00073 int i;
00074 ostream * derout;
00075 derout=&cout;
00076
00077 if (bflag)
00078 {
00079 *derout << endl << " --------------------------------- " << endl;
00080 }
00081 *derout << "pass " << df1b2variable::passnumber;
00082 *derout << " variable " << s << " address "
00083 << int(px->u) << endl;
00084 *derout << "u\t\t = " << *px->u << " ";
00085 *derout << endl;
00086
00087 *derout << "udot\t\t = ";
00088 for (i=0;i<df1b2variable::nvar;i++)
00089 *derout << px->u_dot[i] << " ";
00090 *derout << endl;
00091
00092 *derout << "u_bar\t\t = ";
00093 for (i=0;i<df1b2variable::nvar;i++)
00094 *derout << px->u_bar[i] << " ";
00095 *derout << endl;
00096
00097 *derout << "u_dot_bar\t = ";
00098 for (i=0;i<df1b2variable::nvar;i++)
00099 *derout << px->u_dot_bar[i] << " ";
00100 *derout << endl;
00101
00102 if (df1b2variable::passnumber>1)
00103 {
00104 *derout << "u_tilde\t\t = " << *px->u_tilde << " ";
00105 *derout << endl;
00106
00107 *derout << "u_dot_tilde\t = ";
00108 for (i=0;i<df1b2variable::nvar;i++)
00109 *derout << px->u_dot_tilde[i] << " ";
00110 *derout << endl;
00111
00112 *derout << "u_bar_tilde\t = ";
00113 for (i=0;i<df1b2variable::nvar;i++)
00114 *derout << px->u_bar_tilde[i] << " ";
00115 *derout << endl;
00116
00117 *derout << "u_dot_bar_tilde\t = ";
00118 for (i=0;i<df1b2variable::nvar;i++)
00119 *derout << px->u_dot_bar_tilde[i] << " ";
00120 *derout << endl;
00121 }
00122 *derout << endl;
00123
00124 }
00125 #endif
00126
00131 df1b2variable& df1b2variable::operator += (const df1b2variable& _x)
00132 {
00133 ADUNCONST(df1b2variable,x)
00134 double * xd=x.get_u_dot();
00135 double * zd=get_u_dot();
00136 *get_u()+=*x.get_u();
00137 for (int i=0;i<df1b2variable::nvar;i++)
00138 {
00139 *zd++ += *xd++;
00140 }
00141
00142
00143
00144
00145
00146 if (!df1b2_gradlist::no_derivatives)
00147 f1b2gradlist->write_pass1_pluseq(&x,this);
00148 return *this;
00149 }
00150 void ad_read_pass1_plus_eq(void);
00151
00156 int df1b2_gradlist::write_pass1_pluseq(const df1b2variable * _px,
00157 df1b2variable * pz)
00158 {
00159 ncount++;
00160 #if defined(CHECK_COUNT)
00161 if (ncount >= ncount_check)
00162 ncount_checker(ncount,ncount_check);
00163 #endif
00164
00165 ADUNCONST(df1b2variable*,px)
00166 fixed_smartlist & nlist=f1b2gradlist->nlist;
00167 test_smartlist& list=f1b2gradlist->list;
00168
00169 int total_bytes=sizeof(df1b2_header)+sizeof(df1b2_header);
00170 #if defined(SAFE_ALL)
00171 char ids[]="JK";
00172 int slen=strlen(ids);
00173 total_bytes+=slen;
00174 #endif
00175 list.check_buffer_size(total_bytes);
00176 void * tmpptr=list.bptr;
00177 #if defined(SAFE_ALL)
00178 memcpy(list,ids,slen);
00179 #endif
00180
00181 memcpy(list,(df1b2_header*)(px),sizeof(df1b2_header));
00182 memcpy(list,(df1b2_header*)(pz),sizeof(df1b2_header));
00183
00184
00185 nlist.bptr->numbytes=adptr_diff(list.bptr,tmpptr);
00186 nlist.bptr->pf=(ADrfptr)(&ad_read_pass1_plus_eq);
00187 ++nlist;
00188 return 0;
00189 }
00190
00195 void ad_read_pass1_plus_eq(void)
00196 {
00197 switch(df1b2variable::passnumber)
00198 {
00199 case 1:
00200 read_pass1_plus_eq_1();
00201 break;
00202 case 2:
00203 read_pass1_plus_eq_2();
00204 break;
00205 case 3:
00206 read_pass1_plus_eq_3();
00207 break;
00208 default:
00209 cerr << "illegal value for df1b2variable::pass = "
00210 << df1b2variable::passnumber << endl;
00211 exit(1);
00212 }
00213 }
00214
00219 void read_pass1_plus_eq_1(void)
00220 {
00221
00222
00223
00224 int nvar=df1b2variable::nvar;
00225 fixed_smartlist & nlist=f1b2gradlist->nlist;
00226 test_smartlist& list=f1b2gradlist->list;
00227
00228
00229 int num_bytes=nlist.bptr->numbytes;
00230
00231 list-=num_bytes;
00232 list.saveposition();
00233
00234 #if defined(SAFE_ARRAYS)
00235 checkidentiferstring("JK",list);
00236 #endif
00237
00238
00239 df1b2_header * px=(df1b2_header *) list.bptr;
00240 list.bptr+=sizeof(df1b2_header);
00241 df1b2_header * pz=(df1b2_header *) list.bptr;
00242
00243 list.restoreposition();
00244 int i;
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 #if defined(SAFE_ALL)
00258
00259
00260
00261 #endif
00262
00263
00264 #if defined(SAFE_ALL)
00265
00266 #endif
00267
00268
00269
00270
00271
00272
00273
00274 #if defined(PRINT_DERS)
00275 print_derivatives(px,"x");
00276 print_derivatives(pz,"z");
00277 #endif
00278
00279 for (i=0;i<nvar;i++)
00280 {
00281 px->u_bar[i]+=pz->u_bar[i];
00282 }
00283 for (i=0;i<nvar;i++)
00284 {
00285 px->u_dot_bar[i]+=pz->u_dot_bar[i];
00286 }
00287 #if defined(PRINT_DERS)
00288 print_derivatives(px,"x");
00289 print_derivatives(pz,"z");
00290 #endif
00291 }
00292
00297 void read_pass1_plus_eq_2(void)
00298 {
00299
00300
00301
00302
00303
00304 int nvar=df1b2variable::nvar;
00305 test_smartlist & list=f1b2gradlist->list;
00306
00307 int total_bytes=sizeof(df1b2_header)+sizeof(df1b2_header);
00308 #if defined(SAFE_ALL)
00309 char ids[]="JK";
00310 int slen=strlen(ids);
00311 total_bytes+=slen;
00312 #endif
00313 list.check_buffer_size(total_bytes);
00314
00315 list.saveposition();
00316 fixed_smartlist & nlist=f1b2gradlist->nlist;
00317
00318
00319 int num_bytes=nlist.bptr->numbytes;
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 #if defined(SAFE_ARRAYS)
00335 checkidentiferstring("JK",list);
00336
00337 #endif
00338
00339
00340
00341 df1b2_header * px=(df1b2_header *) list.bptr;
00342 list.bptr+=sizeof(df1b2_header);
00343 df1b2_header * pz=(df1b2_header *) list.bptr;
00344
00345 list.restoreposition(num_bytes);
00346
00347
00348
00349
00350
00351 double * x_bar_tilde=px->get_u_bar_tilde();
00352 double * x_dot_bar_tilde=px->get_u_dot_bar_tilde();
00353 double * z_bar_tilde=pz->get_u_bar_tilde();
00354 double * z_dot_bar_tilde=pz->get_u_dot_bar_tilde();
00355
00356 int i;
00357 for (i=0;i<nvar;i++)
00358 {
00359 z_bar_tilde[i]+=x_bar_tilde[i];
00360 }
00361
00362 for (i=0;i<nvar;i++)
00363 {
00364 z_dot_bar_tilde[i]+=x_dot_bar_tilde[i];
00365 }
00366
00367 #if defined(PRINT_DERS)
00368 print_derivatives(px,"x");
00369 print_derivatives(pz,"z");
00370 #endif
00371 }
00372
00377 void read_pass1_plus_eq_3(void)
00378 {
00379
00380
00381
00382 int nvar=df1b2variable::nvar;
00383 fixed_smartlist & nlist=f1b2gradlist->nlist;
00384 test_smartlist& list=f1b2gradlist->list;
00385
00386
00387 int num_bytes=nlist.bptr->numbytes;
00388
00389 list-=num_bytes;
00390 list.saveposition();
00391
00392
00393 #if defined(SAFE_ARRAYS)
00394 checkidentiferstring("JK",list);
00395 #endif
00396
00397 df1b2_header * px=(df1b2_header *) list.bptr;
00398 list.bptr+=sizeof(df1b2_header);
00399 df1b2_header * pz=(df1b2_header *) list.bptr;
00400
00401 list.restoreposition();
00402
00403 int i;
00404 *(px->u_tilde)+=*pz->u_tilde;
00405 for (i=0;i<nvar;i++)
00406 {
00407 px->u_dot_tilde[i]+=pz->u_dot_tilde[i];
00408 }
00409 #if defined(PRINT_DERS)
00410 print_derivatives(px,"x");
00411 print_derivatives(pz,"z");
00412 #endif
00413 }
00414
00419 df1b2variable fabs(const df1b2variable& x)
00420 {
00421 if (value(x)>=0.0)
00422 return x;
00423 else
00424 return -x;
00425 }
00426
00431 df1b2vector fabs(const df1b2vector& t1)
00432 {
00433 df1b2vector tmp(t1.indexmin(),t1.indexmax());
00434 for (int i=t1.indexmin(); i<=t1.indexmax(); i++)
00435 {
00436 tmp(i)=fabs(t1(i));
00437 }
00438
00439 return(tmp);
00440 }
00441
00446 df1b2variable max(const df1b2vector& t1)
00447 {
00448 df1b2variable tmp;
00449 int mmin=t1.indexmin();
00450 int mmax=t1.indexmax();
00451 tmp=t1(mmin);
00452 for (int i=mmin+1; i<=mmax; i++)
00453 {
00454 if (value(tmp)<value(t1(i))) tmp=t1(i);
00455 }
00456 return(tmp);
00457 }