Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

vfwithbump.h

00001 /***************************************************************************
00002                           vfwithbump.h  -  description
00003                              -------------------
00004     begin                : Fri May 12 2000
00005     copyright            : (C) 2000 by Michael Peeters
00006     email                : Michael.Peeters@vub.ac.be
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #ifndef VFWITHBUMP_H
00019 #define VFWITHBUMP_H
00020 
00021 #include "vectorfunction.h"
00022 #include "newtonroot.h"
00023 #include <vector>
00024 
00025 namespace MODEL {
00030   // Prev: template <integer dims, class NT = NumericTraits<number,dims> >
00031   template<integer dims, typename nelem=number, class NT = NumericTraits<nelem,dims> >
00032   class VFwithBump : public VectorFunction<dims,nelem,NT>
00033   {
00034   public:
00037         VFwithBump(vf& func,bool own=false)
00038           : f((own)?func.clone():&func), owned(own) {}
00039         
00041         VFwithBump(vf& func,const vect& position,bool own=false)
00042           : f((own)?func.clone():&func), owned(own) { AddBump(position);}
00043         ~VFwithBump() {if(owned)delete f;}
00044         
00046         void    AddBump(const vect& position) {p.push_back(position);}  
00047                 
00049         VFwithBump(const VFwithBump& vfb) : f(vfb.f), owned(false), p(vfb.p){}
00051         const VFwithBump& operator=(const VFwithBump& vfb)
00052         { if (this!=&vfb){f=vfb.f;owned=false;p=vfb.p;} return *this;}
00053                 
00055         virtual VFwithBump* clone () const {return new VFwithBump(*this);}
00056         
00061         virtual const vect& function(vect& fu,const vect& u)
00062         {                       
00063           // Here we have to iterate over all p's
00064           vector<vect>::iterator        runner(p.begin());
00065 
00066           // if we have no bumps, nothing should happen
00067           if(runner==p.end()) {return f->function(fu,u); }
00068           
00069           // Otherwise
00070           nelem factor=1.;
00071           while(runner!=p.end())
00072                 {
00073                   // if we have a point,
00074                   
00075                   // Calculate delta u
00076                   vect bump(u);
00077                   bump-=(*runner);
00078                   
00079                   // Calculate how far we are from the point and add a
00080                   // hypersphere of zeroes
00083                   number distance=abs(length(bump)-1.5*NewtonRoot<dims,nelem,NT>::tolerancex)/length(bump);   
00084                                                         
00085                   factor /= distance; // close to zero goes to zero
00086                   ++runner;
00087                 }       
00088           f->function(fu,u);
00089           fu*=(1+factor);
00090 
00091           return fu;
00092         }       
00093                 
00094   private:
00095         vf*             f;
00096         bool    owned;
00097         vector<vect>    p;      // not just one position
00098   };
00099 
00100 } // end namespace
00101 #endif
00102 
00103 /*********************************************************************
00104 $Id: vfwithbump.h,v 1.2 2001/07/26 12:08:28 mpeeters Exp $
00105 **********************************************************************
00106 
00107 $Log: vfwithbump.h,v $
00108 Revision 1.2  2001/07/26 12:08:28  mpeeters
00109 Removed a nasty error where the size of the hypersphere used to cut the zero out of existence would be absolute instead of relative. A better (relative) solution was found, but an even better one exists (see todo note).
00110 
00111 Revision 1.1  2001/05/22 10:54:55  mpeeters
00112 Moved sources and headers for libModel to model/ subdirectory, in an attempt to rationalize the source tree. This should make things "netter".
00113 
00114 Revision 1.2  2000/09/15 10:26:31  mpeeters
00115 Cleaned out header and added CVS tails to files, removed superfuous
00116 @author comments, inserted dates
00117 
00118 *********************************************************************/

To get the sources or tarballs, please go to SourceForge or you can use the CVS repository.

More Info? Michael Peeters. Also, check our research website: www.alna.vub.ac.be

Last update: June 2002.


Looking for Open Source? Check out SourceForge Logo !