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