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 #include "headcpp.h"
00074
00075
00076 #include <stdlib.h>
00077 #include <assert.h>
00078
00079
00080
00081
00082
00083
00084
00085
00086 template<typename TyT>
00087 Evolution_std<TyT>::Evolution_std(const TyT& initial_value, int nstored,
00088 int initial_j, double initial_time)
00089 : Evolution<TyT>(initial_value, initial_j, initial_time, nstored)
00090 { }
00091
00092
00093 template<typename TyT>
00094 Evolution_std<TyT>::Evolution_std(int nstored)
00095 : Evolution<TyT>(nstored)
00096 { }
00097
00098
00099 template<typename TyT>
00100 Evolution_std<TyT>::Evolution_std(const Evolution_std<TyT>& evo)
00101 : Evolution<TyT>(evo)
00102 { }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 template<typename TyT>
00113 Evolution_std<TyT>::~Evolution_std(){ }
00114
00115
00116
00117
00118
00119
00120
00121
00122 template<typename TyT>
00123 void Evolution_std<TyT>::operator=(const Evolution_std<TyT>& evo) {
00124
00125 size = evo.size ;
00126 pos_jtop = evo.pos_jtop ;
00127
00128 for (int j=0; j<size; j++) {
00129 step[j] = evo.step[j] ;
00130 }
00131
00132 for (int j=0; j<size; j++) {
00133 the_time[j] = evo.the_time[j] ;
00134 }
00135
00136
00137 for (int j=0; j<size; j++) {
00138 if (val[j] != 0x0) {
00139 delete val[j] ;
00140 val[j] = 0x0 ;
00141 }
00142 }
00143
00144 for (int j=0; j<size; j++) {
00145 if (evo.val[j] != 0x0) {
00146 val[j] = new TyT( *(evo.val[j]) ) ;
00147 }
00148 else {
00149 val[j] = 0x0 ;
00150 }
00151 }
00152 }
00153
00154 template<typename TyT>
00155 void Evolution_std<TyT>::operator=(const Evolution<TyT>& ) {
00156
00157 cerr << "void Evolution_std<TyT>::operator= : not implemented yet ! \n" ;
00158 abort() ;
00159
00160 }
00161
00162
00163
00164 template<typename TyT>
00165 void Evolution_std<TyT>::update(const TyT& new_value, int j, double time_j) {
00166
00167
00168 if (is_known(j)) {
00169
00170 int pos = position(j) ;
00171 assert( fabs(the_time[pos] - time_j) < 1.e-14 ) ;
00172 assert( val[pos] != &new_value ) ;
00173 delete val[pos] ;
00174 val[pos] = new TyT(new_value) ;
00175 }
00176 else {
00177
00178
00179 if ( (pos_jtop != -1) && (j < step[pos_jtop]) ) {
00180 cerr <<
00181 "Evolution_std<TyT>::update : the time step j = "
00182 << j << " must be in the future\n"
00183 << " of the last stored time step (" << step[pos_jtop] << ") !"
00184 << endl ;
00185 abort() ;
00186 }
00187
00188 pos_jtop++ ;
00189
00190 if (pos_jtop == size) {
00191
00192
00193 if ( val[0] != 0x0 ) delete val[0] ;
00194
00195 for (int i=0; i<size-1; i++) {
00196 step[i] = step[i+1] ;
00197 the_time[i] = the_time[i+1] ;
00198 val[i] = val[i+1] ;
00199 }
00200
00201 pos_jtop-- ;
00202
00203 }
00204 else {
00205 assert( pos_jtop < size ) ;
00206 assert( val[pos_jtop] == 0x0 ) ;
00207 }
00208
00209 step[pos_jtop] = j ;
00210 the_time[pos_jtop] = time_j ;
00211 val[pos_jtop] = new TyT( new_value ) ;
00212 }
00213
00214 }
00215
00216
00217