00001 /* 00002 * Copyright (c) 2007 Regents of the SIGNET lab, University of Padova. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University of Padova (SIGNET lab) nor the 00014 * names of its contributors may be used to endorse or promote products 00015 * derived from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00018 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00019 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00020 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 00021 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00022 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00023 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00024 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00025 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00026 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00027 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #ifndef _GROUPMOBMODEL_ 00031 #define _GROUPMOBMODEL_ 00032 00033 #include "node-core.h" 00034 00035 00036 #define sgn(x) ( ((x)==0.0) ? 0.0 : ((x)/fabs(x)) ) 00037 #define pi (4*atan(1.0)) 00038 00039 00045 typedef enum BoundType 00046 { 00047 SPHERIC, 00048 THOROIDAL, 00049 HARDWALL, 00050 REBOUNCE 00051 }; 00052 00053 class GroupMobPosition; 00054 00059 class UpdatePosTimer : public TimerHandler 00060 { 00061 public: 00062 UpdatePosTimer(GroupMobPosition *m) : TimerHandler() { module = m; } 00063 00064 protected: 00065 virtual void expire(Event *e); 00066 GroupMobPosition* module; 00067 }; 00068 00069 00070 00081 class GroupMobPosition : public Position 00082 { 00083 friend class UpdatePosTimer; 00084 00085 public: 00089 GroupMobPosition(); 00093 virtual ~GroupMobPosition(); 00099 virtual double getX(); 00105 virtual double getY(); 00106 virtual double getCharge() {return (charge_);}; 00107 00124 virtual int command(int argc, const char*const* argv); 00125 private: 00130 void update(double now); 00135 double Gaussian(); 00136 double distance(Position* pos1, Position* pos2); 00137 double mirror_posx(double xnode, double xleader); 00138 double mirror_posy(double ynode, double yleader); 00139 double MobGaussian(double avrg, double sigma); 00140 00141 00142 double xFieldWidth_; 00143 double yFieldWidth_; 00144 double xprec_; 00145 double yprec_; 00146 double speedMean_; 00147 00148 double sigmaSpeed_; 00149 double speedM_; 00150 double speedS_; 00151 double eta_; 00152 double alpha_; 00153 double charge_; 00154 unsigned long int steps_; 00155 BoundType bound_; 00156 00157 00158 00159 00160 00161 double updateTime_; 00162 UpdatePosTimer updateTmr_; 00163 double speed_; 00164 double gammaOld_; 00165 double memoryM_; 00166 double memoryS_; 00167 double thetaMax_; 00168 int debug_; 00169 Position* leader_; 00170 }; 00171 00172 #endif // _GAUSSMARKOVMOBMODEL_