NGSolve  4.9
comp/ngsobject.hpp
00001 #ifndef FILE_NGSOBJECT
00002 #define FILE_NGSOBJECT
00003 
00004 /*********************************************************************/
00005 /* File:   ngsobject.hh                                              */
00006 /* Author: Joachim Schoeberl                                         */
00007 /* Date:   2. Aug. 2000                                              */
00008 /*********************************************************************/
00009 
00010 namespace ngcomp
00011 {
00012 
00016 class NGS_DLL_HEADER NGS_Object
00017 {
00018 protected:
00020   string name;
00021 
00023   Flags flaglist; 
00024 
00026   const MeshAccess & ma;
00027 
00028   // double time;
00029 
00031   // int timer;
00032   Timer timer;
00033 
00035   bool skipCleanUp; 
00036 
00037 public:
00038 
00040   NGS_Object (const MeshAccess & ama, const string & aname = "noname", 
00041               bool checkflags = false)
00042     : name(aname), ma(ama), /* time(0), */ timer(aname), skipCleanUp(0)
00043   { 
00044     // timer = NgProfiler::CreateTimer (aname);
00045   }
00046   
00048   NGS_Object (const NGS_Object& obj)
00049   : name(obj.name), flaglist(obj.flaglist), ma(obj.ma), 
00050     /* time(obj.time), */ timer(obj.timer), skipCleanUp(obj.skipCleanUp)
00051   { ; }
00052 
00054   virtual ~NGS_Object () { ; }
00055 
00057   void SetName (const string & aname)
00058   { 
00059     name = aname; 
00060 #ifndef VTRACE
00061     NgProfiler::SetName (timer, name); 
00062 #endif
00063   }
00064 
00066   const string & GetName () const
00067   {
00068     return name; 
00069   }
00070 
00072   const MeshAccess & GetMeshAccess() const
00073   { 
00074     return ma; 
00075   }
00076 
00077   virtual string GetClassName () const
00078   {
00079     return typeid(*this).name();
00080   }
00081 
00082   virtual void PrintReport (ostream & ost)
00083   {
00084     ost << typeid(*this).name();
00085   }
00086 
00087   virtual void MemoryUsage (Array<MemoryUsageStruct*> & mu) const
00088   {
00089     cout << "MemoryUsage not implemented for class " << GetClassName() << endl;
00090   }
00091 
00092   // double GetTime () const { return time; }
00093   // void SetTime (double t) { time = t; }
00094 
00095   Timer & GetTimer () { return timer; }
00096   const Timer & GetTimer () const { return timer; }
00097 
00098   bool SkipCleanUp () { return skipCleanUp; }
00099 
00100 protected:
00101   void DefineStringFlag (const char* s); // , const char* val="");
00102   void DefineNumFlag (const char* s); // , double val=0);
00103   void DefineDefineFlag (const char* s);
00104   void DefineStringListFlag (const char* s);
00105   void DefineNumListFlag (const char* s);
00106   int CheckFlags (const Flags& flags); 
00107 };
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 template <template <class T> class Object, class Base, class SCAL, class ARG, int ACTDIM>
00116 class TCreateVecObjectS {
00117   Base * Create (int dim, ARG & arg)
00118   {
00119     if (dim == ACTDIM) return new Object<Vec<ACTDIM,SCAL> > (arg);
00120     else return TCreateVecObjectS<Object, Base, SCAL, ARG, ACTDIM-1>::Create(dim, arg);
00121   }
00122 };
00123 
00124 template <template <class T> class Object, class Base, class SCAL, class ARG>
00125 class TCreateVecObjectS<Object, Base, SCAL, ARG, 1> {
00126   Base * Create (int dim, ARG & arg)
00127   { 
00128     if (dim == 1) return new Object<SCAL> (arg);
00129     throw Exception ("illegal CreateVecObject, dim = "
00130                      + ToString(dim) + '\n');
00131   }
00132 };
00133 
00134 template <template <class T> class Object, class Base, class ARG>
00135 Base * CreateVecObject (int dim, bool iscomplex, ARG & arg)
00136 {
00137   if (!iscomplex)
00138     return TCreateVecObjectS<Object, Base, double, ARG, 12>::Create (dim, arg);
00139   else
00140     return TCreateVecObjectS<Object, Base, Complex, ARG, 12>::Create (dim, arg);
00141 }
00142 
00143 
00144 
00145 
00146 
00147 
00148 template <template <class T> class Object, class Base, class SCAL, 
00149           class ARG, class ARG2, class ARG3, int ACTDIM>
00150 class TCreateVecObject3S { 
00151 public:
00152   static Base * Create (int dim, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00153   {
00154     if (dim == ACTDIM) return new Object<Vec<ACTDIM,SCAL> > (arg, arg2, arg3);
00155     else return TCreateVecObject3S<Object, Base, SCAL, ARG, ARG2, ARG3, ACTDIM-1>::Create(dim, arg, arg2, arg3);
00156   }
00157 };
00158 
00159 template <template <class T> class Object, class Base, class SCAL, 
00160           class ARG, class ARG2, class ARG3>
00161 class TCreateVecObject3S<Object, Base, SCAL, ARG, ARG2, ARG3, 1> {
00162 public:
00163   static Base * Create (int dim, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00164   { 
00165     if (dim == 1) return new Object<SCAL> (arg, arg2, arg3);
00166     throw Exception ("illegal CreateVecObject3, dim = "
00167                      + ToString(dim) + '\n');
00168   }
00169 };
00170 
00171 template <template <class T> class Object, class Base, class ARG, class ARG2, class ARG3>
00172 Base * CreateVecObject (int dim, bool iscomplex, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00173 {
00174   if (!iscomplex)
00175     return TCreateVecObject3S<Object, Base, double, ARG, ARG2, ARG3, 8>::Create (dim, arg, arg2, arg3);
00176   else
00177     return TCreateVecObject3S<Object, Base, Complex, ARG, ARG2, ARG3, 8>::Create (dim, arg, arg2, arg3);
00178 }
00179 
00180 
00181 
00182 
00183 template <template <class T, class TV> class Object, class Base, class SCAL, 
00184           class ARG, class ARG2, class ARG3, int ACTDIM>
00185 class TCreateSymMatObject3S { 
00186 public:
00187   static Base * Create (int dim, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00188   {
00189     if (dim == ACTDIM) return new Object<Mat<ACTDIM,ACTDIM,SCAL>,Vec<ACTDIM,SCAL> > (arg, arg2, arg3);
00190     else return TCreateSymMatObject3S<Object, Base, SCAL, ARG, ARG2, ARG3, ACTDIM-1>::Create(dim, arg, arg2, arg3);
00191   }
00192 };
00193 
00194 template <template <class T, class TV> class Object, class Base, class SCAL, 
00195           class ARG, class ARG2, class ARG3>
00196           class TCreateSymMatObject3S<Object, Base, SCAL, ARG, ARG2, ARG3, 1> {
00197 public:
00198   static Base * Create (int dim, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00199   { 
00200     if (dim == 1) return new Object<SCAL,SCAL> (arg, arg2, arg3);
00201     throw Exception ("illegal CreateMatObject3, dim = "
00202                      + ToString(dim) + '\n');
00203   }
00204 };
00205 
00206 template <template <class T, class TV> class Object, class Base, class ARG, class ARG2, class ARG3>
00207 Base * CreateSymMatObject (int dim, bool iscomplex, ARG & arg, ARG2 & arg2, ARG3 & arg3)
00208 {
00209   if (!iscomplex)
00210     return TCreateSymMatObject3S<Object, Base, double, ARG, ARG2, ARG3, MAX_SYS_DIM>::Create (dim, arg, arg2, arg3);
00211   else
00212     return TCreateSymMatObject3S<Object, Base, Complex, ARG, ARG2, ARG3, MAX_SYS_DIM>::Create (dim, arg, arg2, arg3);
00213 }
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222   /*
00223 
00224 
00225 template <template <class T> class Object, class Base, class ARG, class ARG2>
00226 Base * CreateVecObject (int dim, bool iscomplex, ARG & arg, ARG2 & arg2)
00227 {
00228   if (!iscomplex)
00229     {
00230       switch (dim)
00231         {
00232         case 1: return new Object<double> (arg,arg2);
00233         case 2: return new Object<ngbla::Vec<2> > (arg,arg2);
00234         case 3: return new Object<ngbla::Vec<3> > (arg,arg2);
00235         case 4: return new Object<ngbla::Vec<4> > (arg,arg2);
00236         case 5: return new Object<ngbla::Vec<5> > (arg,arg2);
00237         case 6: return new Object<ngbla::Vec<6> > (arg,arg2);
00238         case 7: return new Object<ngbla::Vec<7> > (arg,arg2);
00239         case 8: return new Object<ngbla::Vec<8> > (arg,arg2);
00240         case 9: return new Object<ngbla::Vec<9> > (arg,arg2);
00241         case 10: return new Object<ngbla::Vec<10> > (arg,arg2);
00242         case 11: return new Object<ngbla::Vec<11> > (arg,arg2);
00243         case 12: return new Object<ngbla::Vec<12> > (arg,arg2);
00244         case 18: return new Object<ngbla::Vec<18> > (arg,arg2);
00245         case 24: return new Object<ngbla::Vec<24> > (arg,arg2);
00246         }
00247     }
00248   else
00249     {
00250       switch (dim)
00251         {
00252         case 1: return new Object<Complex> (arg,arg2);
00253         case 2: return new Object<ngbla::Vec<2,Complex> > (arg,arg2);
00254         case 3: return new Object<ngbla::Vec<3,Complex> > (arg,arg2);
00255         case 4: return new Object<ngbla::Vec<4,Complex> > (arg,arg2);
00256         case 5: return new Object<ngbla::Vec<5,Complex> > (arg,arg2);
00257         case 6: return new Object<ngbla::Vec<6,Complex> > (arg,arg2);
00258         case 7: return new Object<ngbla::Vec<7,Complex> > (arg,arg2);
00259         case 8: return new Object<ngbla::Vec<8,Complex> > (arg,arg2);
00260         case 9: return new Object<ngbla::Vec<9,Complex> > (arg,arg2);
00261         case 10: return new Object<ngbla::Vec<10,Complex> > (arg,arg2);
00262         case 11: return new Object<ngbla::Vec<11,Complex> > (arg,arg2);
00263         case 12: return new Object<ngbla::Vec<12,Complex> > (arg,arg2);
00264         case 18: return new Object<ngbla::Vec<18,Complex> > (arg,arg2);
00265         case 24: return new Object<ngbla::Vec<24,Complex> > (arg,arg2);
00266         }
00267     }
00268 
00269   throw Exception ("illegal CreateVecObject, dim = " + ToString(dim) + "\n");
00270 }
00271   */
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 #if MAX_SYS_DIM <= 1
00280 
00281 #define CreateMatObject2S(dest, Object, dim1, dim2, SCAL, arg, arg2) \
00282 switch (dim1) {  \
00283  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00284 } 
00285 
00286 #endif
00287 
00288 #if MAX_SYS_DIM == 2
00289 
00290 #define CreateMatObject2S(dest, Object, dim1, dim2, SCAL, arg, arg2) \
00291 switch (dim1) {  \
00292  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00293  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00294 } 
00295 
00296 #endif
00297 
00298 
00299 #if MAX_SYS_DIM == 3
00300 
00301 #define CreateMatObject2S(dest, Object, dim1, dim2, SCAL, arg, arg2) \
00302 switch (dim1) {  \
00303  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00304  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00305  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00306 } 
00307 
00308 #endif
00309 
00310 
00311 
00312 #if MAX_SYS_DIM == 4
00313 
00314 #define CreateMatObject2S(dest, Object, dim1, dim2, SCAL, arg, arg2) \
00315 switch (dim1) {  \
00316  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00317  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00318  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00319  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2); break;  \
00320 } 
00321 
00322 #endif
00323 
00324 
00325 
00326 #if MAX_SYS_DIM >= 5
00327 
00328 #define CreateMatObject2S(dest, Object, dim1, dim2, SCAL, arg, arg2) \
00329 switch (dim1) {  \
00330  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00331  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00332  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00333  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2); break;  \
00334  case 5: dest = new Object<Mat<5,5,SCAL> >(arg, arg2); break;  \
00335  case 6: dest = new Object<Mat<6,6,SCAL> >(arg, arg2); break;  \
00336  case 7: dest = new Object<Mat<7,7,SCAL> >(arg, arg2); break;  \
00337  case 8: dest = new Object<Mat<8,8,SCAL> >(arg, arg2); break;  \
00338 } 
00339 
00340 #endif
00341 
00342 
00343 #define CreateMatObject2(dest, Object, dim1, dim2, iscomplex, arg, arg2) \
00344 if (iscomplex) \
00345   CreateMatObject2S (dest, Object, dim1, dim2, Complex, arg, arg2) \
00346 else \
00347  CreateMatObject2S (dest, Object, dim1, dim2, double, arg, arg2);
00348 
00349 
00350 
00351 #if MAX_SYS_DIM <= 1
00352 
00353 #define CreateSymMatObject2S(dest, Object, dim1, SCAL, arg, arg2) \
00354 switch (dim1) {  \
00355  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00356 } 
00357 
00358 #endif
00359 
00360 #if MAX_SYS_DIM == 2
00361 
00362 #define CreateSymMatObject2S(dest, Object, dim1, SCAL, arg, arg2) \
00363 switch (dim1) {  \
00364  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00365  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00366 } 
00367 
00368 #endif
00369 
00370 #if MAX_SYS_DIM == 3
00371 
00372 #define CreateSymMatObject2S(dest, Object, dim1, SCAL, arg, arg2) \
00373 switch (dim1) {  \
00374  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00375  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00376  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00377 } 
00378 
00379 #endif
00380 
00381 #if MAX_SYS_DIM == 4
00382 
00383 #define CreateSymMatObject2S(dest, Object, dim1, SCAL, arg, arg2) \
00384 switch (dim1) {  \
00385  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00386  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00387  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00388  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2); break;  \
00389 } 
00390 
00391 #endif
00392 
00393 
00394 #if MAX_SYS_DIM >= 5
00395 
00396 #define CreateSymMatObject2S(dest, Object, dim1, SCAL, arg, arg2) \
00397 switch (dim1) {  \
00398  case 1: dest = new Object<SCAL>(arg, arg2); break; \
00399  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2); break; \
00400  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2); break;  \
00401  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2); break;  \
00402  case 5: dest = new Object<Mat<5,5,SCAL> >(arg, arg2); break;  \
00403  case 6: dest = new Object<Mat<6,6,SCAL> >(arg, arg2); break;  \
00404  case 7: dest = new Object<Mat<7,7,SCAL> >(arg, arg2); break;  \
00405  case 8: dest = new Object<Mat<8,8,SCAL> >(arg, arg2); break;  \
00406 } 
00407 
00408 #endif
00409 
00410 
00411 
00412 #define CreateSymMatObject2(dest, Object, dim, iscomplex, arg, arg2) \
00413 if (iscomplex) \
00414   CreateSymMatObject2S (dest, Object, dim, Complex, arg, arg2) \
00415 else \
00416  CreateSymMatObject2S (dest, Object, dim, double, arg, arg2);
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 #if MAX_SYS_DIM <= 1
00439 
00440 #define CreateMatObject3S(dest, Object, dim1, dim2, SCAL, arg, arg2, arg3) \
00441 switch (dim1) {  \
00442  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00443 } 
00444 
00445 #endif
00446 
00447 #if MAX_SYS_DIM == 2
00448 
00449 #define CreateMatObject3S(dest, Object, dim1, dim2, SCAL, arg, arg2, arg3) \
00450 switch (dim1) {  \
00451  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00452  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00453 } 
00454 
00455 #endif
00456 
00457 
00458 #if MAX_SYS_DIM == 3
00459 
00460 #define CreateMatObject3S(dest, Object, dim1, dim2, SCAL, arg, arg2, arg3) \
00461 switch (dim1) {  \
00462  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00463  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00464  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00465 } 
00466 
00467 #endif
00468 
00469 
00470 
00471 #if MAX_SYS_DIM == 4
00472 
00473 #define CreateMatObject3S(dest, Object, dim1, dim2, SCAL, arg, arg2, arg3) \
00474 switch (dim1) {  \
00475  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00476  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00477  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00478  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2, arg3); break;  \
00479 } 
00480 
00481 #endif
00482 
00483 
00484 
00485 #if MAX_SYS_DIM >= 5
00486 
00487 #define CreateMatObject3S(dest, Object, dim1, dim2, SCAL, arg, arg2, arg3) \
00488 switch (dim1) {  \
00489  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00490  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00491  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00492  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2, arg3); break;  \
00493  case 5: dest = new Object<Mat<5,5,SCAL> >(arg, arg2, arg3); break;  \
00494  case 6: dest = new Object<Mat<6,6,SCAL> >(arg, arg2, arg3); break;  \
00495  case 7: dest = new Object<Mat<7,7,SCAL> >(arg, arg2, arg3); break;  \
00496  case 8: dest = new Object<Mat<8,8,SCAL> >(arg, arg2, arg3); break;  \
00497 } 
00498 
00499 #endif
00500 
00501 
00502 #define CreateMatObject3(dest, Object, dim1, dim2, iscomplex, arg, arg2, arg3) \
00503 if (iscomplex) \
00504   CreateMatObject3S (dest, Object, dim1, dim2, Complex, arg, arg2, arg3) \
00505 else \
00506  CreateMatObject3S (dest, Object, dim1, dim2, double, arg, arg2, arg3);
00507 
00508 
00509 
00510 #if MAX_SYS_DIM <= 1
00511 
00512 #define CreateSymMatObject3S(dest, Object, dim1, SCAL, arg, arg2, arg3) \
00513 switch (dim1) {  \
00514  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00515 } 
00516 
00517 #endif
00518 
00519 #if MAX_SYS_DIM == 2
00520 
00521 #define CreateSymMatObject3S(dest, Object, dim1, SCAL, arg, arg2, arg3) \
00522 switch (dim1) {  \
00523  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00524  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00525 } 
00526 
00527 #endif
00528 
00529 #if MAX_SYS_DIM == 3
00530 
00531 #define CreateSymMatObject3S(dest, Object, dim1, SCAL, arg, arg2, arg3) \
00532 switch (dim1) {  \
00533  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00534  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00535  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00536 } 
00537 
00538 #endif
00539 
00540 #if MAX_SYS_DIM == 4
00541 
00542 #define CreateSymMatObject3S(dest, Object, dim1, SCAL, arg, arg2, arg3) \
00543 switch (dim1) {  \
00544  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00545  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00546  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00547  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2, arg3); break;  \
00548 } 
00549 
00550 #endif
00551 
00552 
00553 #if MAX_SYS_DIM >= 5
00554 
00555 #define CreateSymMatObject3S(dest, Object, dim1, SCAL, arg, arg2, arg3) \
00556 switch (dim1) {  \
00557  case 1: dest = new Object<SCAL>(arg, arg2, arg3); break; \
00558  case 2: dest = new Object<Mat<2,2,SCAL> >(arg, arg2, arg3); break; \
00559  case 3: dest = new Object<Mat<3,3,SCAL> >(arg, arg2, arg3); break;  \
00560  case 4: dest = new Object<Mat<4,4,SCAL> >(arg, arg2, arg3); break;  \
00561  case 5: dest = new Object<Mat<5,5,SCAL> >(arg, arg2, arg3); break;  \
00562  case 6: dest = new Object<Mat<6,6,SCAL> >(arg, arg2, arg3); break;  \
00563  case 7: dest = new Object<Mat<7,7,SCAL> >(arg, arg2, arg3); break;  \
00564  case 8: dest = new Object<Mat<8,8,SCAL> >(arg, arg2, arg3); break;  \
00565 } 
00566 
00567 #endif
00568 
00569 
00570 
00571 
00572 #if MAX_CACHEBLOCKS < 2
00573 
00574 #define CreateSymMatObject4S(dest, Object, dim1, blocksize, SCAL, arg, arg2, arg3) \
00575 switch (dim1) { \
00576  case 1: \
00577    switch (blocksize) { \
00578    case 1: \
00579      dest = new Object<SCAL>(arg, arg2, arg3); break; \
00580    } \
00581    break; \
00582 }
00583 
00584 
00585 #else
00586 
00587 #if MAX_CACHEBLOCKS < 3
00588 
00589 #define CreateSymMatObject4S(dest, Object, dim1, blocksize, SCAL, arg, arg2, arg3) \
00590 switch (dim1) { \
00591  case 1: \
00592    switch (blocksize) { \
00593    case 1: \
00594      dest = new Object<SCAL>(arg, arg2, arg3); break; \
00595    case 2: \
00596      dest = new Object<SCAL, Vec<2,SCAL> >(arg, arg2, arg3); break; \
00597    } \
00598    break; \
00599 }
00600 
00601 
00602 #else
00603 #if MAX_CACHEBLOCKS < 5
00604 
00605 #define CreateSymMatObject4S(dest, Object, dim1, blocksize, SCAL, arg, arg2, arg3) \
00606 switch (dim1) { \
00607  case 1: \
00608    switch (blocksize) { \
00609    case 1: \
00610      dest = new Object<SCAL>(arg, arg2, arg3); break; \
00611    case 2: \
00612      dest = new Object<SCAL, Vec<2,SCAL> >(arg, arg2, arg3); break; \
00613    case 3: \
00614      dest = new Object<SCAL, Vec<3,SCAL> >(arg, arg2, arg3); break; \
00615    case 4: \
00616      dest = new Object<SCAL, Vec<4,SCAL> >(arg, arg2, arg3); break; \
00617    } \
00618    break; \
00619 }
00620 
00621 
00622 #else
00623 
00624 #define CreateSymMatObject4S(dest, Object, dim1, blocksize, SCAL, arg, arg2, arg3) \
00625 switch (dim1) { \
00626  case 1: \
00627    switch (blocksize) { \
00628    case 1: \
00629      dest = new Object<SCAL>(arg, arg2, arg3); break; \
00630    case 2: \
00631      dest = new Object<SCAL, Vec<2,SCAL> >(arg, arg2, arg3); break; \
00632    case 3: \
00633      dest = new Object<SCAL, Vec<3,SCAL> >(arg, arg2, arg3); break; \
00634    case 4: \
00635      dest = new Object<SCAL, Vec<4,SCAL> >(arg, arg2, arg3); break; \
00636    case 5: \
00637      dest = new Object<SCAL, Vec<5,SCAL> >(arg, arg2, arg3); break; \
00638    case 6: \
00639      dest = new Object<SCAL, Vec<6,SCAL> >(arg, arg2, arg3); break; \
00640    case 7: \
00641      dest = new Object<SCAL, Vec<7,SCAL> >(arg, arg2, arg3); break; \
00642    case 8: \
00643      dest = new Object<SCAL, Vec<8,SCAL> >(arg, arg2, arg3); break; \
00644    case 9: \
00645      dest = new Object<SCAL, Vec<9,SCAL> >(arg, arg2, arg3); break; \
00646    case 10: \
00647      dest = new Object<SCAL, Vec<10,SCAL> >(arg, arg2, arg3); break; \
00648    case 11: \
00649      dest = new Object<SCAL, Vec<11,SCAL> >(arg, arg2, arg3); break; \
00650    case 12: \
00651      dest = new Object<SCAL, Vec<12,SCAL> >(arg, arg2, arg3); break; \
00652    case 13: \
00653      dest = new Object<SCAL, Vec<13,SCAL> >(arg, arg2, arg3); break; \
00654    case 14: \
00655      dest = new Object<SCAL, Vec<14,SCAL> >(arg, arg2, arg3); break; \
00656    case 15: \
00657      dest = new Object<SCAL, Vec<15,SCAL> >(arg, arg2, arg3); break; \
00658    } \
00659    break; \
00660 }
00661 
00662 #endif
00663 #endif
00664 #endif
00665 
00666 
00667 
00668 
00669 
00670 #define CreateSymMatObject3(dest, Object, dim, iscomplex, arg, arg2, arg3) \
00671 if (iscomplex) \
00672   CreateSymMatObject3S (dest, Object, dim, Complex, arg, arg2, arg3) \
00673 else \
00674  CreateSymMatObject3S (dest, Object, dim, double, arg, arg2, arg3);
00675 
00676 
00677 
00678 #define CreateSymMatObject4(dest, Object, dim, blocksize, iscomplex, arg, arg2, arg3) \
00679 if (iscomplex)                                                  \
00680   CreateSymMatObject4S (dest, Object, dim, blocksize, Complex, arg, arg2, arg3) \
00681 else \
00682   CreateSymMatObject4S (dest, Object, dim, blocksize, double, arg, arg2, arg3);
00683 
00684 
00685 
00686 
00687 
00688 }
00689 
00690 
00691 
00692 #endif