NGSolve
4.9
|
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