00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #include "headcpp.h"
00075
00076
00077 #include <stdlib.h>
00078 #include <assert.h>
00079
00080
00081
00082
00083
00084
00085
00086
00087 template<typename TyT>
00088 Evolution_full<TyT>::Evolution_full(const TyT& initial_value, int initial_j,
00089 double initial_time, int fact_resize_i)
00090 : Evolution<TyT>(initial_value, initial_j, initial_time, 100),
00091 fact_resize(fact_resize_i)
00092 { }
00093
00094
00095 template<typename TyT>
00096 Evolution_full<TyT>::Evolution_full(int fact_resize_i)
00097 : Evolution<TyT>(100),
00098 fact_resize(fact_resize_i)
00099 { }
00100
00101
00102 template<typename TyT>
00103 Evolution_full<TyT>::Evolution_full(const Evolution_full<TyT>& evo)
00104 : Evolution<TyT>(evo),
00105 fact_resize(evo.fact_resize)
00106 { }
00107
00108
00109
00110
00111
00112
00113
00114
00115 template<typename TyT>
00116 Evolution_full<TyT>::~Evolution_full(){ }
00117
00118
00119
00120
00121
00122
00123
00124 template<typename TyT>
00125 void Evolution_full<TyT>::operator=(const Evolution_full<TyT>& evo) {
00126
00127 size = evo.size ;
00128 pos_jtop = evo.pos_jtop ;
00129
00130 for (int j=0; j<size; j++) {
00131 step[j] = evo.step[j] ;
00132 }
00133
00134 for (int j=0; j<size; j++) {
00135 the_time[j] = evo.the_time[j] ;
00136 }
00137
00138
00139 for (int j=0; j<size; j++) {
00140 if (val[j] != 0x0) {
00141 delete val[j] ;
00142 val[j] = 0x0 ;
00143 }
00144 }
00145
00146 for (int j=0; j<size; j++) {
00147 if (evo.val[j] != 0x0) {
00148 val[j] = new TyT( *(evo.val[j]) ) ;
00149 }
00150 else {
00151 val[j] = 0x0 ;
00152 }
00153 }
00154
00155 fact_resize = evo.fact_resize ;
00156 }
00157
00158 template<typename TyT>
00159 void Evolution_full<TyT>::operator=(const Evolution<TyT>& ) {
00160
00161 cerr << "void Evolution_full<TyT>::operator= : not implemented yet ! \n" ;
00162 abort() ;
00163
00164 }
00165
00166
00167
00168 template<typename TyT>
00169 void Evolution_full<TyT>::update(const TyT& new_value, int j,
00170 double time_j) {
00171
00172
00173 if (is_known(j)) {
00174
00175 int pos = position(j) ;
00176 assert( fabs(the_time[pos] - time_j) < 1.e-14 ) ;
00177 assert( val[pos] != &new_value ) ;
00178 delete val[pos] ;
00179 val[pos] = new TyT(new_value) ;
00180 }
00181 else {
00182
00183 if ( (pos_jtop != -1) && (j < step[pos_jtop]) ) {
00184 cerr <<
00185 "Evolution_full<TyT>::update : the time step j = "
00186 << j << " must be in the future\n"
00187 << " of the last stored time step (" << step[pos_jtop] << ") !"
00188 << endl ;
00189 abort() ;
00190 }
00191
00192 pos_jtop++ ;
00193
00194 if (pos_jtop == size) {
00195
00196
00197 int size_new = fact_resize * size ;
00198
00199 int* step_new = new int[size_new] ;
00200 for (int i=0; i<size; i++) {
00201 step_new[i] = step[i] ;
00202 }
00203 for (int i=size; i<size_new; i++) {
00204 step_new[i] = UNDEF_STEP ;
00205 }
00206
00207 double* the_time_new = new double[size_new] ;
00208 for (int i=0; i<size; i++) {
00209 the_time_new[i] = the_time[i] ;
00210 }
00211 for (int i=size; i<size_new; i++) {
00212 the_time_new[i] = -1e20 ;
00213 }
00214
00215 TyT** val_new = new TyT*[size_new] ;
00216 for (int i=0; i<size; i++) {
00217 val_new[i] = val[i] ;
00218 }
00219 for (int i=size; i<size_new; i++) {
00220 val_new[i] = 0x0 ;
00221 }
00222
00223 size = size_new ;
00224 delete [] step ;
00225 step = step_new ;
00226 delete [] the_time ;
00227 the_time = the_time_new ;
00228 delete [] val ;
00229 val = val_new ;
00230
00231 }
00232 else {
00233 assert( pos_jtop < size ) ;
00234 assert( val[pos_jtop] == 0x0 ) ;
00235 }
00236
00237 step[pos_jtop] = j ;
00238 the_time[pos_jtop] = time_j ;
00239 val[pos_jtop] = new TyT( new_value ) ;
00240 }
00241 }
00242
00243
00244
00245
00246