void stop_trace(int locations, int flag) { int tape_stats[statSize]; int i,sizer; int loc_ptr; /* int op_cnt,loc_cnt,val_cnt,access_ptr; */ loc_ptr = locations; put_op(end_of_tape); /* Mark end of tape. */ tape_stats[0] = ind_ptr; tape_stats[1] = dep_ptr; tape_stats[2] = loc_ptr; tape_stats[3] = vs_ptr; tape_stats[4] = BUFSIZE; close_tape(tape_stats,flag); /** closes the tape, files up stats, and writes the tape stats to the integer tape. **/ sizer = sizeof(revreal)*(vs_ptr); if (revalso) taylor_close(sizer/(1+sizer/TBUFSIZE),dep_ptr,ind_ptr); for (i=0; i<statSize; i++) stats[tag][i]=tape_stats[i]; }
void start_trace( short tnum, int revals ) { int kk; double** dum = 0; int degree = 0; revalso = revals; tag = tnum; /* Set buffer size to be the default in usrparms.h */ set_buf_size(BUFSIZE); get_fstr(op_file_name,tag,FNAME); get_fstr(int_file_name,tag,FNAME1); get_fstr(val_file_name,tag,FNAME2); get_fstr(vs_file_name,tag,FNAME3); init_stat_space(tag); /* Return old memory ... if used */ if(op_tape[tag]) free((char*)op_tape[tag]); if(int_tape[tag]) free((char*)int_tape[tag]); if(val_tape[tag]) free((char*)val_tape[tag]); if(stats[tag]) free((char*)stats[tag]); op_tape[tag] = (unsigned char *)malloc(BUFSIZE*sizeof(unsigned char)); int_tape[tag] = (locint *)malloc(BUFSIZE*sizeof(locint)); val_tape[tag] = (double *)malloc(BUFSIZE*sizeof(double)); stats[tag] = (int*)malloc(statSize*sizeof(int)); if ((op_tape[tag] == NULL) || (int_tape[tag] == NULL) || (val_tape[tag] == NULL) || (stats[tag] == NULL)) { fprintf(DIAG_OUT,"ADOL-C error: cannot allocate tape buffers!\n"); exit (-1); } ind_ptr = 0; dep_ptr = 0; vs_ptr = 0; /* Initialize Tapes */ set_buffers(op_file_name,op_tape[tag], int_file_name,int_tape[tag], val_file_name,val_tape[tag]); /* Put operation denoting the start_of_the tape */ put_op(start_of_tape); /* Leave space for the stats */ /* olvo 980914 unique size of stats block */ for (kk=0; kk<sizeof(int)/sizeof(locint)*statSpace; kk++) put_locint(0); if (revalso) taylor_begin(tag,TBUFSIZE,dum,degree); }
int call_ext_fct(ext_diff_fct *edfct, int n, double *xp, adouble *xa, int m, double *yp, adouble *ya) { int i = 0, ret; locint firstVal, numVals; double *vals; ADOLC_OPENMP_THREAD_NUMBER; ADOLC_OPENMP_GET_THREAD_NUMBER; if (edfct==NULL) fail(ADOLC_EXT_DIFF_NULLPOINTER_STRUCT); if (ADOLC_CURRENT_TAPE_INFOS.traceFlag) { put_op(ext_diff); ADOLC_PUT_LOCINT(edfct->index); ADOLC_PUT_LOCINT(n); ADOLC_PUT_LOCINT(m); ADOLC_PUT_LOCINT(xa[i].loc()); ADOLC_PUT_LOCINT(ya[i].loc()); ADOLC_PUT_LOCINT(0); /* keep space for checkpointing index */ oldTraceFlag=ADOLC_CURRENT_TAPE_INFOS.traceFlag; ADOLC_CURRENT_TAPE_INFOS.traceFlag=0; } else oldTraceFlag=0; #if defined(ADOLC_SAFE_EXTERN) firstVal = 0; #else updateLocs(); firstVal = ADOLC_GLOBAL_TAPE_VARS.locMinUnused; #endif numVals = ADOLC_GLOBAL_TAPE_VARS.numMaxAlive - firstVal; vals = new double[numVals]; memcpy(vals, ADOLC_GLOBAL_TAPE_VARS.store + firstVal, numVals * sizeof(double)); for (i=0; i<n; ++i) xp[i]=xa[i].getValue(); for (i=0; i<m; ++i) yp[i]=ya[i].getValue(); ret=edfct->function(n, xp, m, yp); memcpy(ADOLC_GLOBAL_TAPE_VARS.store + firstVal, vals, numVals * sizeof(double)); delete[] vals; /* update taylor buffer if keep != 0 ; possible double counting as in * adouble.cpp => correction in taping.c */ if (oldTraceFlag != 0) { ADOLC_CURRENT_TAPE_INFOS.numTays_Tape += n; ADOLC_CURRENT_TAPE_INFOS.numTays_Tape += m; if (ADOLC_CURRENT_TAPE_INFOS.keepTaylors) { for (i=0; i<n; ++i) ADOLC_WRITE_SCAYLOR(xa[i].getValue()); for (i=0; i<m; ++i) ADOLC_WRITE_SCAYLOR(ya[i].getValue()); } } /* write back */ for (i=0; i<n; ++i) xa[i].setValue(xp[i]); for (i=0; i<m; ++i) ya[i].setValue(yp[i]); ADOLC_CURRENT_TAPE_INFOS.traceFlag=oldTraceFlag; return ret; }