Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include <df1b2fun.h>
00012
00017 df1b2variable operator - (const df1b2variable& _x, const df1b2variable& _y)
00018 {
00019 ADUNCONST(df1b2variable,x)
00020 ADUNCONST(df1b2variable,y)
00021 df1b2variable z;
00022 double * xd=x.get_u_dot();
00023 double * yd=y.get_u_dot();
00024 double * zd=z.get_u_dot();
00025 *z.get_u()=*x.get_u()-*y.get_u();
00026 for (unsigned int i=0;i<df1b2variable::nvar;i++)
00027 {
00028 *zd++ = *xd++ - *yd++;
00029 }
00030
00031
00032 if (!df1b2_gradlist::no_derivatives)
00033 f1b2gradlist->write_pass1_minus(&x,&y,&z);
00034 return z;
00035 }
00036
00037 void ad_read_pass2_minus(void);
00038
00043 int df1b2_gradlist::write_pass1_minus(const df1b2variable * _px,
00044 const df1b2variable * _py,df1b2variable * pz)
00045 {
00046 ADUNCONST(df1b2variable*,px)
00047 ADUNCONST(df1b2variable*,py)
00048 ncount++;
00049 #if defined(CHECK_COUNT)
00050 if (ncount >= ncount_check)
00051 cout << ncount << endl;
00052 #endif
00053
00054 size_t total_bytes=3*sizeof(df1b2_header);
00055
00056 #if defined(SAFE_ALL)
00057 char ids[]="TU";
00058 int slen=strlen(ids);
00059 total_bytes+=slen;
00060 #endif
00061 list.check_buffer_size(total_bytes);
00062 void * tmpptr=list.bptr;
00063 #if defined(SAFE_ALL)
00064 memcpy(list,ids,slen);
00065 #endif
00066
00067
00068 memcpy(list,(df1b2_header*)(px),sizeof(df1b2_header));
00069 memcpy(list,(df1b2_header*)(py),sizeof(df1b2_header));
00070 memcpy(list,(df1b2_header*)(pz),sizeof(df1b2_header));
00071
00072 nlist.bptr->numbytes=adptr_diff(list.bptr,tmpptr);
00073 nlist.bptr->pf=(ADrfptr)(&ad_read_pass2_minus);
00074 ++nlist;
00075 return 0;
00076 }
00077
00078
00079 void read_pass2_1_minus(void);
00080 void read_pass2_2_minus(void);
00081 void read_pass2_3_minus(void);
00082
00087 void ad_read_pass2_minus(void)
00088 {
00089 switch(df1b2variable::passnumber)
00090 {
00091 case 1:
00092 read_pass2_1_minus();
00093 break;
00094 case 2:
00095 read_pass2_2_minus();
00096 break;
00097 case 3:
00098 read_pass2_3_minus();
00099 break;
00100 default:
00101 cerr << "illegal value for df1b2variable::pass = "
00102 << df1b2variable::passnumber << endl;
00103 exit(1);
00104 }
00105 }
00106
00111 void read_pass2_1_minus(void)
00112 {
00113
00114
00115
00116
00117 unsigned int nvar=df1b2variable::nvar;
00118 test_smartlist& list=f1b2gradlist->list;
00119 int num_bytes=f1b2gradlist->nlist.bptr->numbytes;
00120 list-=num_bytes;
00121 list.saveposition();
00122
00123
00124 #if defined(SAFE_ALL)
00125 checkidentiferstring("TU",f1b2gradlist->list);
00126 #endif
00127 char * bptr=f1b2gradlist->list.bptr;
00128 df1b2_header * px=(df1b2_header *) bptr;
00129 bptr+=sizeof(df1b2_header);
00130 df1b2_header * py=(df1b2_header *) bptr;
00131 bptr+=sizeof(df1b2_header);
00132 df1b2_header * pz=(df1b2_header *) bptr;
00133
00134 list.restoreposition();
00135
00136
00137
00138
00139
00140
00141
00142
00143 for (unsigned int i=0;i<nvar;i++)
00144 {
00145 px->u_bar[i]+=pz->u_bar[i];
00146 }
00147 for (unsigned int i=0;i<nvar;i++)
00148 {
00149 py->u_bar[i]-=pz->u_bar[i];
00150 }
00151 for (unsigned int i=0;i<nvar;i++)
00152 {
00153 px->u_dot_bar[i]+=pz->u_dot_bar[i];
00154 }
00155 for (unsigned int i=0;i<nvar;i++)
00156 {
00157 py->u_dot_bar[i]-=pz->u_dot_bar[i];
00158 }
00159
00160
00161 for (unsigned int i=0;i<nvar;i++)
00162 {
00163 pz->u_bar[i]=0;
00164 }
00165 for (unsigned int i=0;i<nvar;i++)
00166 {
00167 pz->u_dot_bar[i]=0;
00168 }
00169 }
00170
00175 void read_pass2_2_minus(void)
00176 {
00177
00178
00179
00180
00181
00182 unsigned int nvar=df1b2variable::nvar;
00183 test_smartlist & list=f1b2gradlist->list;
00184
00185 size_t total_bytes=3*sizeof(df1b2_header);
00186
00187 #if defined(SAFE_ALL)
00188 char ids[]="BY";
00189 int slen=strlen(ids);
00190 total_bytes+=slen;
00191 #endif
00192 list.check_buffer_size(total_bytes);
00193
00194
00195 list.saveposition();
00196 fixed_smartlist & nlist=f1b2gradlist->nlist;
00197
00198 int num_bytes=nlist.bptr->numbytes;
00199
00200 #if defined(SAFE_ALL)
00201 checkidentiferstring("TU",list);
00202 #endif
00203 df1b2_header * px=(df1b2_header *) list.bptr;
00204 list.bptr+=sizeof(df1b2_header);
00205 df1b2_header * py=(df1b2_header *) list.bptr;
00206 list.bptr+=sizeof(df1b2_header);
00207 df1b2_header * pz=(df1b2_header *) list.bptr;
00208 list.restoreposition(num_bytes);
00209
00210 double * x_bar_tilde=px->get_u_bar_tilde();
00211 double * x_dot_bar_tilde=px->get_u_dot_bar_tilde();
00212 double * y_bar_tilde=py->get_u_bar_tilde();
00213 double * y_dot_bar_tilde=py->get_u_dot_bar_tilde();
00214 double * z_bar_tilde=pz->get_u_bar_tilde();
00215 double * z_dot_bar_tilde=pz->get_u_dot_bar_tilde();
00216
00217
00218 for (unsigned int i=0;i<nvar;i++)
00219 {
00220 z_bar_tilde[i]=0;
00221 z_dot_bar_tilde[i]=0;
00222 }
00223
00224
00225 for (unsigned int i=0;i<nvar;i++)
00226 {
00227 z_bar_tilde[i]+=x_bar_tilde[i];
00228 }
00229
00230 for (unsigned int i=0;i<nvar;i++)
00231 {
00232 z_dot_bar_tilde[i]+=x_dot_bar_tilde[i];
00233 }
00234
00235
00236 for (unsigned int i=0;i<nvar;i++)
00237 {
00238 z_bar_tilde[i]-=y_bar_tilde[i];
00239 }
00240
00241 for (unsigned int i=0;i<nvar;i++)
00242 {
00243 z_dot_bar_tilde[i]-=y_dot_bar_tilde[i];
00244 }
00245 }
00246
00251 void read_pass2_3_minus(void)
00252 {
00253
00254
00255
00256 unsigned int nvar=df1b2variable::nvar;
00257 fixed_smartlist & nlist=f1b2gradlist->nlist;
00258 test_smartlist& list=f1b2gradlist->list;
00259
00260
00261 int num_bytes=nlist.bptr->numbytes;
00262
00263 list-=num_bytes;
00264 list.saveposition();
00265
00266
00267
00268
00269
00270 #if defined(SAFE_ALL)
00271 checkidentiferstring("TU",list);
00272 #endif
00273 df1b2_header * px=(df1b2_header *) list.bptr;
00274 list.bptr+=sizeof(df1b2_header);
00275 df1b2_header * py=(df1b2_header *) list.bptr;
00276 list.bptr+=sizeof(df1b2_header);
00277 df1b2_header * pz=(df1b2_header *) list.bptr;
00278 list.bptr+=sizeof(df1b2_header);
00279
00280 list.restoreposition();
00281
00282 *(px->u_tilde)+=*(pz->u_tilde);
00283 *(py->u_tilde)-=*(pz->u_tilde);
00284 for (unsigned int i=0;i<nvar;i++)
00285 {
00286 px->u_dot_tilde[i]+=pz->u_dot_tilde[i];
00287 py->u_dot_tilde[i]-=pz->u_dot_tilde[i];
00288 }
00289 *(pz->u_tilde)=0;
00290 for (unsigned int i=0;i<nvar;i++)
00291 {
00292 pz->u_dot_tilde[i]=0;
00293 }
00294 }