00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _CUTCELLMOMENTSIMPLEM_H_
00012 #define _CUTCELLMOMENTSIMPLEM_H_
00013
00014 #if defined(CH_Darwin) && defined(__GNUC__) && ( __GNUC__ == 3 )
00015
00016 #include <unistd.h>
00017 #define _GLIBCPP_USE_C99 1
00018 #endif
00019
00020 #include <cmath>
00021 #include <cstdio>
00022 #include <cstdlib>
00023 #include <fstream>
00024 #include <iostream>
00025 #include <iomanip>
00026 #include <string>
00027
00028 #include "MayDay.H"
00029
00030 #include "LSProblem.H"
00031
00032 #include "NamespaceHeader.H"
00033
00034
00035 template <int dim> CutCellMoments<dim>::CutCellMoments()
00036 {
00037 }
00038
00039
00040 template <int dim> CutCellMoments<dim>::CutCellMoments(const CutCellMoments<dim>& a_cutCellMoments)
00041 :m_moments (a_cutCellMoments.m_moments),
00042 m_EBmoments (a_cutCellMoments.m_EBmoments),
00043 m_bdCutCellMoments(a_cutCellMoments.m_bdCutCellMoments),
00044 m_IFData (a_cutCellMoments.m_IFData),
00045 m_bdCCOn (a_cutCellMoments.m_bdCCOn),
00046 m_residual (a_cutCellMoments.m_residual),
00047 m_numActiveBounds (a_cutCellMoments.m_numActiveBounds),
00048 m_badNormal (a_cutCellMoments.m_badNormal)
00049 {
00050 }
00051
00052
00053 template <int dim> CutCellMoments<dim>::CutCellMoments(const IFData<dim>& a_info)
00054 :m_IFData(a_info),
00055 m_numActiveBounds(0)
00056 {
00057 m_bdCCOn = false;
00058 m_badNormal = false;
00059
00060 for (int hilo = 0; hilo < 2; ++hilo)
00061 {
00062 for (int idir = 0; idir < dim; ++idir)
00063 {
00064
00065 Iv2 bdId;
00066 bdId[BDID_DIR] = idir;
00067 bdId[BDID_HILO] = hilo;
00068
00069 IFData<dim-1> reducedInfo(a_info,a_info.m_maxOrder+1,idir,hilo);
00070 CutCellMoments<dim-1>bdCutCellMoments(reducedInfo);
00071
00072 m_bdCutCellMoments[bdId] = bdCutCellMoments;
00073
00074
00075
00076 if (reducedInfo.m_allVerticesOn)
00077 {
00078 m_bdCCOn = true;
00079 }
00080
00081
00082 if (reducedInfo.m_badNormal)
00083 {
00084 m_badNormal = true;
00085 }
00086
00087 }
00088 }
00089 }
00090
00091
00092 template <int dim> CutCellMoments<dim>::~CutCellMoments()
00093 {
00094 }
00095
00096 template <int dim> const CutCellMoments<dim - 1> CutCellMoments<dim>::getBdCutCellMoments(const Iv2 & a_bdId) const
00097 {
00098 typename BdCutCellMoments::const_iterator it = m_bdCutCellMoments.find(a_bdId);
00099
00100 if (it == m_bdCutCellMoments.end())
00101 {
00102 MayDay::Abort("Can't find this bdId in m_bdCutCellMoments");
00103 }
00104
00105 return it->second;
00106 }
00107
00108
00109
00110
00111
00112 template <int dim> void CutCellMoments<dim>::addBdMoments(CutCellMoments<dim> & a_coarseBdCutCell,
00113 const IFData<dim+1> & a_IFData,
00114 const int & a_degreePmax,
00115 const bool & a_useConstraints,
00116 const IndexTM<Real,dim> & a_refinedCenterDelta,
00117 const IndexTM<int,dim> & a_hilo)
00118 {
00119 typedef map<IvDim,int > PthMomentLoc;
00120
00121 if (a_IFData.m_allVerticesIn)
00122 {
00123
00124
00125
00126 PthMoment fullCellMap;
00127
00128 for (int iDegree = a_degreePmax; iDegree > 0; iDegree--)
00129 {
00130
00131
00132 LSProblem<dim> lsp(iDegree,a_useConstraints);
00133 const PthMomentLoc& momMap = lsp.getMonomialLocMapDegreePLess1();
00134
00135 for (typename PthMomentLoc::const_iterator it = momMap.begin(); it != momMap.end(); ++it)
00136 {
00137
00138 fullCellMap[it->first] = fullCellQuadrature(it->first,m_IFData.m_cellCenterCoord);
00139 }
00140 }
00141
00142 for (int iDegree = a_degreePmax; iDegree > 0; iDegree--)
00143 {
00144 LSProblem<dim> lsp(iDegree,a_useConstraints);
00145
00146
00147
00148
00149 const PthMomentLoc& momMap = lsp.getMonomialLocMapDegreePLess1();
00150
00151 for (typename PthMomentLoc::const_iterator it = momMap.begin(); it != momMap.end(); ++it)
00152 {
00153 Real bdMoment = getBdMoment(it->first,a_IFData,a_refinedCenterDelta,fullCellMap);
00154 a_coarseBdCutCell.m_moments[it->first] += bdMoment;
00155 }
00156 }
00157 }
00158 else
00159 {
00160 for (int iDegree = a_degreePmax; iDegree > 0; iDegree--)
00161 {
00162 LSProblem<dim> lsp(iDegree,a_useConstraints);
00163
00164
00165
00166
00167 const PthMomentLoc& momMap = lsp.getMonomialLocMapDegreePLess1();
00168
00169 for (typename PthMomentLoc::const_iterator it = momMap.begin(); it != momMap.end(); ++it)
00170 {
00171 Real bdMoment = getBdMoment(it->first,a_IFData,a_refinedCenterDelta);
00172 a_coarseBdCutCell.m_moments[it->first] += bdMoment;
00173 }
00174 }
00175 }
00176
00177 for (int iDegree = a_degreePmax; iDegree >= 0; iDegree--)
00178 {
00179 LSProblem<dim> lsp(iDegree,a_useConstraints);
00180
00181
00182
00183 const PthMomentLoc& momMapP = lsp.getMonomialLocMapDegreeP();
00184
00185 for (typename PthMomentLoc::const_iterator it = momMapP.begin(); it != momMapP.end(); ++it)
00186 {
00187 Real bdEBMoment = getBdEBMoment(it->first,a_IFData,a_refinedCenterDelta);
00188 a_coarseBdCutCell.m_EBmoments[it->first] += bdEBMoment;
00189 }
00190 }
00191
00192 IndexTM<int,2> bdId;
00193
00194 for (int idir = 0; idir < dim; idir++)
00195 {
00196 bdId[0] = idir;
00197
00198
00199
00200
00201 IndexTM<Real,dim-1> localRefinedCellCenter;
00202 IndexTM<int,dim-1> localHilo;
00203
00204 for (int jdir = 0; jdir < dim; jdir++)
00205 {
00206 if (jdir < idir)
00207 {
00208 localRefinedCellCenter[jdir] = a_refinedCenterDelta[jdir];
00209 localHilo[jdir] = a_hilo[jdir];
00210 }
00211 else if (jdir > idir)
00212 {
00213 localRefinedCellCenter[jdir-1] = a_refinedCenterDelta[jdir];
00214 localHilo[jdir-1] = a_hilo[jdir];
00215 }
00216 }
00217
00218 if (a_hilo[idir] != LARGEINTVAL)
00219 {
00220 bdId[1] = a_hilo[idir];
00221
00222
00223
00224 (m_bdCutCellMoments[bdId]).addBdMoments(a_coarseBdCutCell.m_bdCutCellMoments[bdId],m_IFData,a_degreePmax+1,a_useConstraints,localRefinedCellCenter,localHilo);
00225 }
00226 else
00227 {
00228 for (int side = 0; side < 2; side++)
00229 {
00230 bdId[1]=side;
00231 (m_bdCutCellMoments[bdId]).addBdMoments(a_coarseBdCutCell.m_bdCutCellMoments[bdId],m_IFData,a_degreePmax,a_useConstraints,localRefinedCellCenter,localHilo);
00232 }
00233 }
00234 }
00235 }
00236
00237 template <int dim> Real CutCellMoments<dim>::fullCellQuadrature(const IndexTM<int,dim> & a_mono,
00238 const CoordinateSystem<dim> & a_coord)
00239 {
00240 Real moment = 1.0;
00241
00242 for (int idir = 0; idir < dim; ++idir)
00243 {
00244 Real loPt = a_coord.convertDir(-0.5*m_IFData.m_cellCenterCoord.m_dx[idir],
00245 m_IFData.m_cellCenterCoord,
00246 idir);
00247
00248 Real hiPt = a_coord.convertDir(0.5*m_IFData.m_cellCenterCoord.m_dx[idir],
00249 m_IFData.m_cellCenterCoord,
00250 idir);
00251
00252 Real idirInt = pow(hiPt,a_mono[idir] + 1) - pow(loPt,a_mono[idir] + 1);
00253
00254 idirInt /= (a_mono[idir] + 1);
00255 moment *= idirInt;
00256 }
00257
00258 return moment;
00259 }
00260
00261 template <int dim> Real CutCellMoments<dim>::changeMomentCoordinates(PthMoment & a_refinedMomentMap,
00262 const IndexTM<int,dim> & a_monomial,
00263 const IndexTM<Real,dim> & a_refinedCenterDelta)
00264 {
00265
00266
00267
00268
00269
00270 Real moment = 0.0;
00271
00272
00273 int degree = 0;
00274
00275 for (int i = 0; i < dim; i++)
00276 {
00277 degree += a_monomial[i];
00278 }
00279
00280
00281
00282
00283 for (int r = 0; r <= degree; r++)
00284 {
00285 if (r >= 0)
00286 {
00287
00288 IndexTM<int,dim> derivative;
00289
00290 for (int idir = 0; idir < dim; ++idir)
00291 {
00292 derivative[idir] = 0;
00293 }
00294
00295 while (true)
00296 {
00297 for (int j = 1; j < dim-1; ++j)
00298 {
00299 int t = r;
00300 for (int k = j+1; k < dim; ++k)
00301 {
00302 t -= derivative[k];
00303 }
00304
00305 if (derivative[j] > t)
00306 {
00307 derivative[j+1] += 1;
00308 derivative[j ] = 0;
00309 }
00310 else
00311 {
00312 break;
00313 }
00314 }
00315
00316 if (derivative[dim-1] > r)
00317 {
00318 break;
00319 }
00320
00321 derivative[0] = r;
00322
00323 for (int j = 1; j < dim; ++j)
00324 {
00325 derivative[0] -= derivative[j];
00326 }
00327
00328
00329 Real coeff = 1.0;
00330 Real factorial = 1.0;
00331
00332 for (int idir = 0; idir < dim; idir++)
00333 {
00334 for (int j = 0; j < derivative[idir]; j++)
00335 {
00336 coeff *= a_monomial[idir] - j;
00337 factorial *= j+1;
00338 }
00339
00340
00341
00342 if (a_monomial[idir]-derivative[idir] < 0)
00343 {
00344 if (coeff != 0)
00345 {
00346 MayDay::Abort("Coeff should be zero when the derivative has higher coefficient than the monomial");
00347 }
00348 }
00349 else
00350 {
00351 coeff *= pow(a_refinedCenterDelta[idir],a_monomial[idir]-derivative[idir]);
00352 }
00353 }
00354
00355
00356 moment += coeff * a_refinedMomentMap[derivative] / factorial;
00357
00358
00359 derivative[1] += 1;
00360 }
00361 }
00362 }
00363
00364 return moment;
00365 }
00366
00367 template <int dim> void CutCellMoments<dim>::changeMomentCoordinatesToCellCenter()
00368 {
00369
00370 IndexTM<Real,dim> delta = m_IFData.m_cellCenterCoord.m_origin;
00371 delta -= m_IFData.m_parentCoord .m_origin;
00372
00373 PthMoment copyMoments = m_moments;
00374 for (typename PthMoment::const_iterator it = copyMoments.begin();
00375 it != copyMoments.end(); ++it)
00376 {
00377 IvDim mono = it->first;
00378 m_moments[mono] = changeMomentCoordinates(copyMoments, mono, delta);
00379 }
00380
00381 PthMoment copyEBMoments = m_EBmoments;
00382 for (typename PthMoment::const_iterator it = copyEBMoments.begin(); it != copyEBMoments.end(); ++it)
00383 {
00384 IvDim mono = it->first;
00385 m_EBmoments[mono] = changeMomentCoordinates(copyEBMoments, mono, delta);
00386 }
00387 }
00388
00389 template <int dim> void CutCellMoments<dim>::changeMomentCoordinatesToParentCenter()
00390 {
00391
00392 IndexTM<Real,dim> delta = m_IFData.m_parentCoord .m_origin;
00393 delta -= m_IFData.m_cellCenterCoord.m_origin;
00394
00395 PthMoment copyMoments = m_moments;
00396 for (typename PthMoment::const_iterator it = copyMoments.begin();
00397 it != copyMoments.end(); ++it)
00398 {
00399 IvDim mono = it->first;
00400 m_moments[mono] = changeMomentCoordinates(copyMoments, mono, delta);
00401 }
00402
00403 PthMoment copyEBMoments = m_EBmoments;
00404 for (typename PthMoment::const_iterator it = copyEBMoments.begin(); it != copyEBMoments.end(); ++it)
00405 {
00406 IvDim mono = it->first;
00407 m_EBmoments[mono] = changeMomentCoordinates(copyEBMoments, mono, delta);
00408 }
00409 }
00410
00411 template <int dim> void CutCellMoments<dim>::initialize(CutCellMoments<dim> & a_refinedCutCell)
00412 {
00413
00414
00415 initializeMap(m_EBmoments,a_refinedCutCell.m_EBmoments);
00416 initializeMap(m_moments,a_refinedCutCell.m_moments);
00417
00418
00419 IndexTM<int,2> bdId;
00420
00421 for (int idir = 0; idir < dim; idir++)
00422 {
00423 bdId[0] = idir;
00424
00425 for (int hilo = 0; hilo < 2; hilo++)
00426 {
00427 bdId[1] = hilo;
00428 CutCellMoments<dim-1> refinedBdCutCell = a_refinedCutCell.getBdCutCellMoments(bdId);
00429
00430 m_bdCutCellMoments[bdId].initialize(refinedBdCutCell);
00431 }
00432 }
00433 }
00434
00435 template <int dim> void CutCellMoments<dim>::initializeMap(PthMomentLesserDimension & a_map1,
00436 PthMomentLesserDimension & a_map2)
00437 {
00438 for (typename PthMomentLesserDimension::const_iterator it = a_map2.begin(); it != a_map2.end(); ++it)
00439 {
00440 a_map1[it->first] = 0.0;
00441 }
00442 }
00443
00444 template <int dim> void CutCellMoments<dim>::initializeMap(PthMoment & a_map1,
00445 PthMoment & a_map2)
00446 {
00447 for (typename PthMoment::const_iterator it = a_map2.begin(); it != a_map2.end(); ++it)
00448 {
00449 a_map1[it->first] = 0.0;
00450 }
00451 }
00452
00453
00454 template <int dim> Real CutCellMoments<dim>::getBdMoment(const IvDim & a_mono,
00455 const IFData<dim+1> & a_IFData,
00456 const IndexTM<Real,dim> & a_refinedCenterDelta,
00457 PthMoment a_fullCellMap)
00458 {
00459
00460
00461
00462 Real moment = LARGEREALVAL;
00463
00464 if (a_IFData.m_allVerticesOut)
00465 {
00466 moment = 0.0;
00467 }
00468 else if (a_IFData.m_allVerticesIn)
00469 {
00470 moment = changeMomentCoordinates(a_fullCellMap,a_mono,a_refinedCenterDelta);
00471 }
00472 else
00473 {
00474 moment = changeMomentCoordinates(m_moments,a_mono,a_refinedCenterDelta);
00475 }
00476
00477 return moment;
00478 }
00479
00480 template <int dim> Real CutCellMoments<dim>::getBdEBMoment(const IvDim & a_mono,
00481 const IFData<dim+1> & a_IFData,
00482 const IndexTM<Real,dim> & a_refinedCenterDelta)
00483 {
00484
00485
00486 Real EBmoment = LARGEREALVAL;
00487
00488 if (a_IFData.m_allVerticesOut || a_IFData.m_allVerticesIn)
00489 {
00490 EBmoment = 0.0;
00491 }
00492 else
00493 {
00494 EBmoment = changeMomentCoordinates(m_EBmoments,a_mono,a_refinedCenterDelta);
00495 }
00496
00497 return EBmoment;
00498 }
00499
00500
00501 template <int dim> Real CutCellMoments<dim>::getMoment(const IvDim & a_mono,
00502 const EBorVol & a_EBorVol) const
00503 {
00504 Real moment = LARGEREALVAL;
00505
00506 if (a_EBorVol == VolMoment)
00507 {
00508
00509 typename PthMoment::const_iterator it = m_moments.find(a_mono);
00510
00511 if (it != m_moments.end())
00512 {
00513 moment = it->second;
00514 }
00515 else
00516 {
00517 MayDay::Abort("No volume moment in m_moments");
00518 }
00519 }
00520 else if (a_EBorVol == EBMoment)
00521 {
00522
00523 typename PthMoment::const_iterator it = m_EBmoments.find(a_mono);
00524
00525 if (it != m_EBmoments.end())
00526 {
00527 moment = it->second;
00528 }
00529 else
00530 {
00531 MayDay::Abort("No volume moment in m_bdMoments");
00532 }
00533 }
00534 else
00535 {
00536 MayDay::Abort("Must ask for EBMoment or VolMoment");
00537 }
00538
00539 return moment;
00540 }
00541
00542 template <int dim> Real CutCellMoments<dim>::getVol(const EBorVol& a_EBorVol) const
00543 {
00544 Real volume;
00545
00546
00547 IvDim zeroIv = IvDim::Zero;
00548 volume = getMoment(zeroIv,a_EBorVol);
00549
00550 return volume;
00551 }
00552
00553 template <int dim> IndexTM<Real,dim> CutCellMoments<dim>::getCentroid(const EBorVol& a_EBorVol) const
00554 {
00555
00556 Real volume = getVol(a_EBorVol);
00557
00558 RvDim centroid;
00559
00560
00561 for (int idir = 0; idir < dim; ++idir)
00562 {
00563 IvDim mono = BASISV_TM<int,dim>(idir);
00564 centroid[idir] = getMoment(mono,a_EBorVol);
00565
00566 if (volume < 0.0)
00567 {
00568 MayDay::Warning("CutCellMoments::getCentroid: Volume fraction is negative");
00569 }
00570 else if (volume == 0.0)
00571 {
00572
00573 }
00574
00575 centroid[idir] /= volume;
00576 }
00577
00578 return centroid;
00579 }
00580
00581 template <int dim> Real CutCellMoments<dim>::getResidual(const int & a_iDegree,
00582 const int & a_normJ) const
00583 {
00584 Real retval;
00585 if (isCovered() || isRegular())
00586 {
00587 retval = 0.0;
00588 }
00589 else
00590 {
00591 retval = m_residual[a_iDegree][a_normJ];
00592 }
00593
00594 return retval;
00595 }
00596
00597 template <int dim> void CutCellMoments<dim>::setResidual(const Real& a_value,
00598 const int & a_iDegree,
00599 const int & a_normJ)
00600 {
00601 if (isCovered() || isRegular())
00602 {
00603 MayDay::Abort("Invalid assignment to m_residual in covered or full cell");
00604 }
00605 else
00606 {
00607 m_residual[a_iDegree][a_normJ] = a_value;
00608 }
00609 }
00610
00611 template <int dim> Vector<Real> CutCellMoments<dim>::sliceResidual(const int & a_iDegree) const
00612 {
00613 if (isCovered() || isRegular())
00614 {
00615 pout()<<"Dim = "<< dim << endl;
00616 MayDay::Abort("Invalid attemtp to slice of m_residual in a covered or full CCM");
00617 }
00618 else
00619 {
00620 return m_residual[a_iDegree];
00621 }
00622 }
00623
00624 template <int dim> bool CutCellMoments<dim>::isCovered() const
00625 {
00626 return m_IFData.m_allVerticesOut;
00627 }
00628
00629 template <int dim> bool CutCellMoments<dim>::isRegular() const
00630 {
00631 return (m_IFData.m_allVerticesIn && (!m_bdCCOn));
00632 }
00633
00634 template <int dim> void CutCellMoments<dim>::print(ostream& a_out) const
00635 {
00636 string padding = " ";
00637 for (int i = 0; i < GLOBALDIM - dim; i++)
00638 {
00639 padding += " ";
00640 }
00641
00642 a_out << padding << "Dim = " << dim << "\n";
00643 a_out << padding << "\n";
00644
00645 for (typename PthMoment::const_iterator it = m_moments.begin(); it != m_moments.end(); ++it)
00646 {
00647 std::ios::fmtflags origFlags = a_out.flags();
00648 int origWidth = a_out.width();
00649 int origPrecision = a_out.precision();
00650
00651 a_out << padding << "Integral "
00652 << it->first
00653 << " = "
00654 << setw(23)
00655 << setprecision(16)
00656 << setiosflags(ios::showpoint)
00657 << setiosflags(ios::scientific)
00658 << it->second
00659 << "\n";
00660
00661 a_out.flags(origFlags);
00662 a_out.width(origWidth);
00663 a_out.precision(origPrecision);
00664 }
00665
00666 if (m_moments.size() > 0)
00667 {
00668 a_out << padding << "\n";
00669 }
00670
00671 for (typename PthMoment::const_iterator it = m_EBmoments.begin(); it != m_EBmoments.end(); ++it)
00672 {
00673 std::ios::fmtflags origFlags = a_out.flags();
00674 int origWidth = a_out.width();
00675 int origPrecision = a_out.precision();
00676
00677 a_out << padding << "EBIntegral "
00678 << it->first
00679 << " = "
00680 << setw(23)
00681 << setprecision(16)
00682 << setiosflags(ios::showpoint)
00683 << setiosflags(ios::scientific)
00684 << it->second
00685 << "\n";
00686
00687 a_out.flags(origFlags);
00688 a_out.width(origWidth);
00689 a_out.precision(origPrecision);
00690 }
00691
00692 if (m_EBmoments.size() > 0)
00693 {
00694 a_out << padding << "\n";
00695 }
00696
00697 a_out << padding << "Residuals:" << "\n";
00698 for (int i = 0; i < m_residual.size(); i++)
00699 {
00700 a_out << padding << " " << i << ":";
00701
00702 std::ios::fmtflags origFlags = a_out.flags();
00703 int origWidth = a_out.width();
00704 int origPrecision = a_out.precision();
00705
00706 for (int j = 0; j < m_residual[i].size(); j++)
00707 {
00708
00709 a_out << " "
00710 << setw(23)
00711 << setprecision(16)
00712 << setiosflags(ios::showpoint)
00713 << setiosflags(ios::scientific)
00714 << m_residual[i][j];
00715 }
00716
00717 a_out.flags(origFlags);
00718 a_out.width(origWidth);
00719 a_out.precision(origPrecision);
00720
00721 a_out << padding << "\n";
00722 }
00723 a_out << padding << "\n";
00724
00725 a_out << padding << "IFData:" << "\n";
00726 a_out << padding << "\n";
00727 a_out << m_IFData;
00728
00729 a_out << padding << "Number of bdCutCellMoments = "
00730 << m_bdCutCellMoments.size()
00731 << "\n";
00732 a_out << padding << "\n";
00733
00734 for (typename BdCutCellMoments::const_iterator it = m_bdCutCellMoments.begin(); it != m_bdCutCellMoments.end(); ++it)
00735 {
00736 a_out << padding << "BdId = " << it->first << "\n";
00737 a_out << it->second;
00738 }
00739 }
00740
00741 template <int dim> void CutCellMoments<dim>::dump() const
00742 {
00743 print(pout());
00744 }
00745
00746
00747 template <int dim> void CutCellMoments<dim>::operator=(const CutCellMoments<dim> & a_cutCellMoments)
00748 {
00749
00750 if (this != &a_cutCellMoments)
00751 {
00752 m_moments = a_cutCellMoments.m_moments;
00753 m_EBmoments = a_cutCellMoments.m_EBmoments;
00754 m_bdCutCellMoments = a_cutCellMoments.m_bdCutCellMoments;
00755 m_IFData = a_cutCellMoments.m_IFData;
00756 m_bdCCOn = a_cutCellMoments.m_bdCCOn;
00757 m_residual = a_cutCellMoments.m_residual;
00758 m_numActiveBounds = a_cutCellMoments.m_numActiveBounds;
00759 m_badNormal = a_cutCellMoments.m_badNormal;
00760 }
00761 }
00762
00763 template <int dim> ostream& operator<<(ostream & a_out,
00764 const CutCellMoments<dim> & a_cutCellMoments)
00765 {
00766 a_cutCellMoments.print(a_out);
00767 return a_out;
00768 }
00769
00770 #include "NamespaceFooter.H"
00771
00772 #endif