00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _REALVECT_H_
00012 #define _REALVECT_H_
00013
00014 #include <cstddef>
00015 #include <cstdlib>
00016 #include <cstring>
00017 #include <iostream>
00018
00019 #include "SPACE.H"
00020 #include "Misc.H"
00021 #include "REAL.H"
00022 #include "SPACE.H"
00023 #include "IntVect.H"
00024 #include "Vector.H"
00025 #include "SPMD.H"
00026 #include "IndexTM.H"
00027 #include "NamespaceHeader.H"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 class RealVect
00042 {
00043 public:
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 RealVect ();
00055
00056 explicit RealVect (const Vector<Real>&);
00057
00058
00059
00060
00061
00062
00063
00064 RealVect (D_DECL6(Real i, Real j, Real k,
00065 Real l, Real m, Real n));
00066
00067
00068
00069
00070
00071 RealVect (const RealVect& rhs);
00072
00073
00074
00075
00076
00077 RealVect(const IndexTM<Real,CH_SPACEDIM>& a_tm);
00078
00079
00080
00081
00082
00083
00084 RealVect (const IntVect & iv)
00085 {
00086 for (int d=0 ; d<SpaceDim ; ++d)
00087 {
00088 vect[d] = (Real)iv[d];
00089 }
00090 }
00091
00092
00093
00094
00095
00096 RealVect& operator= (const RealVect& rhs);
00097
00098
00099
00100
00101
00102
00103 inline
00104 Real& operator[] (int i);
00105
00106
00107
00108
00109
00110 inline
00111 const Real& operator[] (int i) const;
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 bool operator== (const RealVect& p) const;
00126
00127
00128
00129
00130
00131
00132 bool operator!= (const RealVect& p) const;
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 bool operator< (const RealVect& p) const;
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 bool operator<= (const RealVect& p) const;
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 bool operator> (const RealVect& p) const;
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 bool operator>= (const RealVect& p) const;
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 RealVect& operator+= (Real s);
00187
00188
00189
00190
00191
00192
00193 RealVect operator+ (Real s) const;
00194
00195
00196
00197
00198
00199 RealVect& operator+= (const RealVect& p);
00200
00201
00202
00203
00204
00205
00206 RealVect& operator-= (Real s);
00207
00208
00209
00210
00211
00212 RealVect& operator-= (const RealVect& p);
00213
00214
00215
00216
00217
00218
00219 RealVect operator- (Real s) const;
00220
00221
00222
00223
00224
00225 RealVect& operator*= (Real s);
00226
00227
00228
00229
00230
00231 Real dotProduct(const RealVect& a_rhs) const;
00232
00233
00234
00235
00236
00237 RealVect& operator*= (const RealVect& p);
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 RealVect operator* (Real s) const;
00251
00252
00253
00254
00255
00256 RealVect& operator/= (Real s);
00257
00258
00259
00260
00261
00262 RealVect& operator/= (const RealVect& p);
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 RealVect operator/ (Real s) const;
00276
00277
00278
00279
00280
00281 RealVect& scale (Real s);
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 RealVect& min (const RealVect& p);
00296
00297
00298
00299
00300
00301
00302 friend inline RealVect min (const RealVect& p1,
00303 const RealVect& p2);
00304
00305
00306
00307
00308
00309
00310 RealVect& max (const RealVect& p);
00311
00312
00313
00314
00315
00316
00317 friend inline RealVect max (const RealVect& p1,
00318 const RealVect& p2);
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 RealVect operator+ () const;
00332
00333
00334
00335
00336
00337 RealVect operator- () const;
00338
00339
00340
00341
00342
00343 Real sum () const;
00344
00345
00346
00347
00348
00349 Real vectorLength() const;
00350
00351
00352
00353
00354
00355 Real radSquared() const;
00356
00357
00358
00359
00360
00361 Real product () const;
00362
00363
00364
00365
00366
00367
00368 int minDir(const bool& a_doAbs) const;
00369
00370
00371
00372
00373
00374
00375 int maxDir(const bool& a_doAbs) const;
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 const Real* dataPtr() const;
00389
00390
00391
00392
00393
00394 Real* dataPtr() ;
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415 friend RealVect BASISREALV(int dir);
00416
00417
00418
00419
00420
00421 static const RealVect Zero;
00422
00423
00424
00425
00426
00427 static const RealVect Unit;
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 friend RealVect operator+ (Real s,
00442 const RealVect& p);
00443
00444
00445
00446
00447
00448 friend RealVect operator- (Real s,
00449 const RealVect& p);
00450
00451
00452
00453
00454
00455
00456 friend RealVect operator* (Real s,
00457 const RealVect& p);
00458
00459
00460
00461
00462
00463 friend RealVect operator/ (Real s,
00464 const RealVect& p);
00465
00466
00467
00468
00469
00470 friend RealVect operator+ (const RealVect& s,
00471 const RealVect& p);
00472
00473
00474
00475
00476
00477 friend RealVect operator- (const RealVect& s,
00478 const RealVect& p);
00479
00480
00481
00482
00483
00484 friend RealVect operator* (const RealVect& s,
00485 const RealVect& p);
00486
00487
00488
00489
00490 friend RealVect operator/ (const RealVect& s,
00491 const RealVect& p);
00492
00493
00494
00495
00496
00497
00498 friend inline RealVect scale (const RealVect& p,
00499 Real s);
00500
00501
00502
00503
00504
00505
00506
00507 friend std::ostream& operator<< (std::ostream& ostr,
00508 const RealVect& p);
00509
00510 friend class HDF5Handle;
00511
00512 static size_t io_offset;
00513
00514 protected:
00515
00516
00517
00518
00519 Real vect[SpaceDim];
00520
00521 };
00522
00523 #include "NamespaceFooter.H"
00524
00525 #include "BaseNamespaceHeader.H"
00526
00527 #include "NamespaceVar.H"
00528
00529
00530 template < >
00531 int linearSize(const CH_XDIR::RealVect& vindex);
00532
00533
00534 template < >
00535 void linearIn(CH_XDIR::RealVect& a_outputT, const void* const inBuf);
00536
00537
00538 template < >
00539 void linearOut(void* const a_outBuf, const CH_XDIR::RealVect& a_inputT);
00540
00541
00542 template < >
00543 int linearSize(const Vector<CH_XDIR::RealVect>& a_input);
00544 template < >
00545 void linearIn(Vector<CH_XDIR::RealVect>& a_outputT, const void* const inBuf);
00546 template < >
00547 void linearOut(void* const a_outBuf, const Vector<CH_XDIR::RealVect>& a_inputT);
00548
00549
00550 template < >
00551 int linearSize(const Vector<Vector<CH_XDIR::RealVect> >& a_input);
00552 template < >
00553 void linearIn(Vector<Vector<CH_XDIR::RealVect> >& a_outputT, const void* const inBuf);
00554 template < >
00555 void linearOut(void* const a_outBuf, const Vector<Vector<CH_XDIR::RealVect> >& a_inputT);
00556
00557 #include "BaseNamespaceFooter.H"
00558
00559 #include "NamespaceHeader.H"
00560
00561 inline Real& RealVect::operator[] (int i)
00562 {
00563 CH_assert(i>=0 && i < SpaceDim);
00564 return vect[i];
00565 }
00566
00567 inline const Real& RealVect::operator[] (int i) const
00568 {
00569 CH_assert(i>=0 && i < SpaceDim);
00570 return vect[i];
00571 }
00572
00573 inline RealVect::RealVect (const RealVect &iv)
00574 {
00575 D_EXPR6(vect[0]=iv.vect[0], vect[1]=iv.vect[1], vect[2]=iv.vect[2],
00576 vect[3]=iv.vect[3], vect[4]=iv.vect[4], vect[5]=iv.vect[5]);
00577 }
00578
00579 inline
00580 RealVect&
00581 RealVect::operator-= (Real s)
00582 {
00583 D_EXPR6(vect[0] -= s, vect[1] -= s, vect[2] -= s,
00584 vect[3] -= s, vect[4] -= s, vect[5] -= s);
00585 return *this;
00586 }
00587
00588 inline
00589 RealVect&
00590 RealVect::operator-= (const RealVect& p)
00591 {
00592 D_EXPR6(vect[0] -= p[0], vect[1] -= p[1], vect[2] -= p[2],
00593 vect[3] -= p[3], vect[4] -= p[4], vect[5] -= p[5]);
00594 return *this;
00595 }
00596
00597 inline
00598 RealVect
00599 RealVect::operator+ () const
00600 {
00601 return RealVect(*this);
00602 }
00603
00604 inline
00605 RealVect
00606 RealVect::operator- () const
00607 {
00608 return RealVect(D_DECL6(-vect[0], -vect[1], -vect[2],
00609 -vect[3], -vect[4], -vect[5] ));
00610 }
00611
00612 inline
00613 RealVect&
00614 RealVect::scale (Real s)
00615 {
00616 D_EXPR6(vect[0] *= s, vect[1] *= s, vect[2] *= s,
00617 vect[3] *= s, vect[4] *= s, vect[5] *= s);
00618 return *this;
00619 }
00620
00621 inline
00622 Real
00623 RealVect::sum () const
00624 {
00625 return D_TERM6(vect[0], + vect[1], + vect[2], +
00626 vect[3], + vect[4], + vect[5]);
00627 }
00628
00629 inline
00630 Real
00631 RealVect::vectorLength () const
00632 {
00633 Real len = this->radSquared();
00634 len = sqrt(len);
00635
00636 return len;
00637 }
00638
00639 inline
00640 Real
00641 RealVect::radSquared() const
00642 {
00643 Real len = 0;
00644 for (int idir = 0; idir < SpaceDim; idir++)
00645 {
00646 len = len + vect[idir]*vect[idir];
00647 }
00648
00649 return len;
00650 }
00651
00652 inline
00653 Real
00654 RealVect::product () const
00655 {
00656 return D_TERM6(vect[0], * vect[1], * vect[2], *
00657 vect[3], * vect[4], * vect[5]);
00658 }
00659
00660 inline
00661 RealVect
00662 scale (const RealVect& p,
00663 Real s)
00664 {
00665 return RealVect(D_DECL6(s * p[0], s * p[1], s * p[2],
00666 s * p[3], s * p[4], s * p[5]));
00667 }
00668
00669 inline
00670 bool
00671 RealVect::operator< (const RealVect& p) const
00672 {
00673 return D_TERM6(vect[0] < p[0], && vect[1] < p[1], && vect[2] < p[2],
00674 && vect[3] < p[3], && vect[4] < p[4], && vect[5] < p[5]);
00675 }
00676
00677 inline
00678 bool
00679 RealVect::operator<= (const RealVect& p) const
00680 {
00681 return D_TERM6(vect[0] <= p[0], && vect[1] <= p[1], && vect[2] <= p[2],
00682 && vect[3] <= p[3], && vect[4] <= p[4], && vect[5] <= p[5]);
00683 }
00684
00685 inline
00686 bool
00687 RealVect::operator> (const RealVect& p) const
00688 {
00689 return D_TERM6(vect[0] > p[0], && vect[1] > p[1], && vect[2] > p[2],
00690 && vect[3] > p[3], && vect[4] > p[4], && vect[5] > p[5]);
00691 }
00692
00693 inline
00694 bool
00695 RealVect::operator>= (const RealVect& p) const
00696 {
00697 return D_TERM6(vect[0] >= p[0], && vect[1] >= p[1], && vect[2] >= p[2],
00698 && vect[3] >= p[3], && vect[4] >= p[4], && vect[5] >= p[5]);
00699 }
00700
00701 inline
00702 RealVect&
00703 RealVect::min (const RealVect& p)
00704 {
00705 D_EXPR6(vect[0] = Min(vect[0], p.vect[0]),
00706 vect[1] = Min(vect[1], p.vect[1]),
00707 vect[2] = Min(vect[2], p.vect[2]),
00708 vect[3] = Min(vect[3], p.vect[3]),
00709 vect[4] = Min(vect[4], p.vect[4]),
00710 vect[5] = Min(vect[5], p.vect[5]));
00711 return *this;
00712 }
00713
00714 inline
00715 RealVect&
00716 RealVect::max (const RealVect& p)
00717 {
00718 D_EXPR6(vect[0] = Max(vect[0], p.vect[0]),
00719 vect[1] = Max(vect[1], p.vect[1]),
00720 vect[2] = Max(vect[2], p.vect[2]),
00721 vect[3] = Max(vect[3], p.vect[3]),
00722 vect[4] = Max(vect[4], p.vect[4]),
00723 vect[5] = Max(vect[5], p.vect[5]));
00724 return *this;
00725 }
00726
00727 inline
00728 RealVect
00729 min (const RealVect& p1,
00730 const RealVect& p2)
00731 {
00732 RealVect p(p1);
00733 return p.min(p2);
00734 }
00735
00736 inline
00737 RealVect
00738 max (const RealVect& p1,
00739 const RealVect& p2)
00740 {
00741 RealVect p(p1);
00742 return p.max(p2);
00743 }
00744
00745 extern RealVect BASISREALV(int idir);
00746
00747 #include "NamespaceFooter.H"
00748
00749 #endif