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 #ifndef __PROCESS_HPP
00032 #define __PROCESS_HPP
00033
00034 #include <boost/mem_fn.hpp>
00035 #include <boost/functional.hpp>
00036
00037 #include "AssocVector.h"
00038
00039 #include "libecs.hpp"
00040 #include "Entity.hpp"
00041 #include "VariableReference.hpp"
00042
00043 namespace libecs
00044 {
00045
00046
00047
00048
00049
00050
00051
00052
00053 DECLARE_ASSOCVECTOR( String, VariableReference, std::less< const String >,
00054 VariableReferenceMap );
00055
00056 DECLARE_VECTOR( VariableReference, VariableReferenceVector );
00057
00058
00059
00060
00061
00062
00063
00064 LIBECS_DM_CLASS( Process, Entity )
00065 {
00066
00067 public:
00068
00069 LIBECS_DM_BASECLASS( Process );
00070
00071 LIBECS_DM_OBJECT_ABSTRACT( Process )
00072 {
00073 INHERIT_PROPERTIES( Entity );
00074
00075 PROPERTYSLOT_LOAD_SAVE( Polymorph, VariableReferenceList,
00076 &Process::setVariableReferenceList,
00077 &Process::getVariableReferenceList,
00078 &Process::setVariableReferenceList,
00079 &Process::saveVariableReferenceList );
00080
00081 PROPERTYSLOT_SET_GET( Integer, Priority );
00082 PROPERTYSLOT_SET_GET( String, StepperID );
00083
00084 PROPERTYSLOT_SET_GET_NO_LOAD_SAVE( Real, Activity );
00085 PROPERTYSLOT_GET_NO_LOAD_SAVE( Real, MolarActivity );
00086
00087 PROPERTYSLOT_GET_NO_LOAD_SAVE( Integer, IsContinuous );
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 class PriorityCompare
00097 {
00098 public:
00099 bool operator()( ProcessPtr aLhs, ProcessPtr aRhs ) const
00100 {
00101 return compare( aLhs->getPriority(), aRhs->getPriority() );
00102 }
00103
00104 bool operator()( ProcessPtr aLhs, IntegerParam aRhs ) const
00105 {
00106 return compare( aLhs->getPriority(), aRhs );
00107 }
00108
00109 bool operator()( IntegerParam aLhs, ProcessPtr aRhs ) const
00110 {
00111 return compare( aLhs, aRhs->getPriority() );
00112 }
00113
00114 private:
00115
00116
00117 inline static bool compare( IntegerParam aLhs, IntegerParam aRhs )
00118 {
00119 if( aLhs > aRhs )
00120 {
00121 return true;
00122 }
00123 else
00124 {
00125 return false;
00126 }
00127 }
00128
00129
00130 };
00131
00132
00133 public:
00134
00135 ECELL_API Process();
00136 ECELL_API virtual ~Process();
00137
00138 virtual const EntityType getEntityType() const
00139 {
00140 return EntityType( EntityType::PROCESS );
00141 }
00142
00143 ECELL_API virtual void initialize();
00144
00145 virtual void fire() = 0;
00146
00147 virtual GET_METHOD( Real, StepInterval )
00148 {
00149 return INF;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158 virtual const bool isContinuous() const
00159 {
00160 return false;
00161 }
00162
00163 GET_METHOD( Integer, IsContinuous )
00164 {
00165 return isContinuous();
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 SET_METHOD( Real, Activity )
00183 {
00184 theActivity = value;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194 GET_METHOD( Real, Activity )
00195 {
00196 return theActivity;
00197 }
00198
00199 ECELL_API SET_METHOD( Polymorph, VariableReferenceList );
00200 ECELL_API GET_METHOD( Polymorph, VariableReferenceList );
00201 ECELL_API SAVE_METHOD( Polymorph, VariableReferenceList );
00202
00203
00204 GET_METHOD( Real, MolarActivity )
00205 {
00206 return theActivity / ( getSuperSystem()->getSize() * N_A );
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 SET_METHOD( Integer, Priority )
00221 {
00222 thePriority = value;
00223 }
00224
00225
00226
00227
00228
00229 GET_METHOD( Integer, Priority )
00230 {
00231 return thePriority;
00232 }
00233
00234
00235
00236
00237
00238
00239
00240 ECELL_API SET_METHOD( String, StepperID );
00241
00242
00243
00244
00245
00246
00247
00248 ECELL_API GET_METHOD( String, StepperID );
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 void setVariableReference( PolymorphVectorCref aValue );
00267
00268 void removeVariableReference( StringCref aName );
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 void registerVariableReference( StringCref aName,
00283 VariablePtr aVariable,
00284 IntegerParam aCoefficient,
00285 const bool isAccessor = true );
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 ECELL_API VariableReferenceCref getVariableReference( StringCref aVariableReferenceName );
00296
00297
00298
00299
00300
00301 VariableReferenceVectorCref getVariableReferenceVector() const
00302 {
00303 return theVariableReferenceVector;
00304 }
00305
00306 VariableReferenceVector::size_type getZeroVariableReferenceOffset() const
00307 {
00308 return theZeroVariableReferenceIterator -
00309 getVariableReferenceVector().begin();
00310 }
00311
00312 VariableReferenceVector::size_type
00313 getPositiveVariableReferenceOffset() const
00314 {
00315 return thePositiveVariableReferenceIterator -
00316 getVariableReferenceVector().begin();
00317 }
00318
00319
00320
00321
00322 void setStepper( StepperPtr const aStepper );
00323
00324
00325
00326
00327
00328
00329
00330
00331 StepperPtr getStepper() const
00332 {
00333 return theStepper;
00334 }
00335
00336 ModelPtr getModel() const
00337 {
00338 return getSuperSystem()->getModel();
00339 }
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355 void addValue( RealParam aValue )
00356 {
00357 setActivity( aValue );
00358
00359
00360 std::for_each( theVariableReferenceVector.begin(),
00361 theZeroVariableReferenceIterator,
00362 boost::bind2nd
00363 ( boost::mem_fun_ref
00364 ( &VariableReference::addValue ), aValue ) );
00365
00366 std::for_each( thePositiveVariableReferenceIterator,
00367 theVariableReferenceVector.end(),
00368 boost::bind2nd
00369 ( boost::mem_fun_ref
00370 ( &VariableReference::addValue ), aValue ) );
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 void setFlux( RealParam aVelocity )
00385 {
00386 setActivity( aVelocity );
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 ECELL_API void declareUnidirectional();
00405
00406
00407
00408
00409
00410
00411
00412
00413 const bool isDependentOn( const ProcessCptr aProcessPtr ) const;
00414
00415
00416 protected:
00417
00418 ECELL_API VariableReferenceVectorIterator findVariableReference( StringCref aName );
00419
00420 void updateVariableReferenceVector();
00421
00422
00423
00424
00425
00426
00427
00428
00429 protected:
00430
00431 VariableReferenceVector theVariableReferenceVector;
00432
00433 VariableReferenceVectorIterator theZeroVariableReferenceIterator;
00434 VariableReferenceVectorIterator thePositiveVariableReferenceIterator;
00435
00436 private:
00437
00438 StepperPtr theStepper;
00439
00440 Real theActivity;
00441 Integer thePriority;
00442
00443 };
00444
00445
00446
00447
00448 }
00449
00450 #endif
00451
00452
00453
00454
00455
00456
00457
00458