00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _REDUCTIONOPS_H_
00012 #define _REDUCTIONOPS_H_
00013
00014 #include "BoxLayoutData.H"
00015 #include "FArrayBox.H"
00016 #include "FluxBox.H"
00017
00018 #include "NamespaceHeader.H"
00019
00020 void computeFaceReductionWeights(LevelData<FluxBox>& a_weights);
00021
00022
00023
00024
00025
00026
00027
00028 class SumOp : public LDOperator<FArrayBox>
00029 {
00030 public:
00031 Real scale;
00032 Vector<int> m_summingDir;
00033 SumOp();
00034
00035
00036 SumOp(int a_summingDir);
00037
00038
00039 SumOp(const Vector<int>& a_summingDir);
00040
00041 virtual void linearOut(const FArrayBox& arg, void* buf, const Box& R,
00042 const Interval& comps) const;
00043
00044 virtual void linearIn(FArrayBox& arg, void* buf, const Box& R,
00045 const Interval& comps) const;
00046 void op(FArrayBox& dest,
00047 const Box& RegionFrom,
00048 const Interval& Cdest,
00049 const Box& RegionTo,
00050 const FArrayBox& src,
00051 const Interval& Csrc) const;
00052
00053 };
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 class FaceSumOp: public LDOperator<FluxBox>
00064 {
00065 public:
00066
00067 FaceSumOp();
00068 FaceSumOp(const int& a_summingDir);
00069
00070 virtual ~FaceSumOp()
00071 {
00072 }
00073
00074 void setDir (const int& a_sumDir);
00075 void setScale(const Real& a_scale );
00076
00077 void op(FluxBox & dataTo ,
00078 const Box & RegionFrom ,
00079 const Interval& Cdest ,
00080 const Box & RegionTo ,
00081 const FluxBox & src ,
00082 const Interval& Csrc ) const;
00083
00084
00085
00086 virtual void linearIn(FluxBox & a_arg ,
00087 void* a_buf ,
00088 const Box & a_R ,
00089 const Interval& a_comps) const;
00090
00091
00092 virtual void linearOut(const FluxBox & a_arg ,
00093 void* a_buf ,
00094 const Box & a_R ,
00095 const Interval& a_comps) const;
00096
00097 int size(const FluxBox & a_fluxBox,
00098 const Box & a_bx ,
00099 const Interval& a_comps ) const;
00100
00101
00102 Real m_scale ;
00103 int m_summingDir;
00104
00105 };
00106
00107
00108
00109
00110
00111
00112
00113
00114 class SpreadingOp : public LDOperator<FArrayBox>
00115 {
00116 public:
00117 Real scale;
00118 Vector<int> m_spreadingDir;
00119 SpreadingOp();
00120
00121
00122 SpreadingOp(int a_spreadingDir);
00123
00124 SpreadingOp(const Vector<int>& a_spreadingDir);
00125
00126 virtual void linearIn(FArrayBox& arg, void* buf, const Box& R,
00127 const Interval& comps) const;
00128 void op(FArrayBox& dest,
00129 const Box& RegionFrom,
00130 const Interval& Cdest,
00131 const Box& RegionTo,
00132 const FArrayBox& src,
00133 const Interval& Csrc) const;
00134
00135 void applyOp(FArrayBox& dest,
00136 const Box& RegionFrom,
00137 const Interval& Cdest,
00138 const Box& RegionTo,
00139 const FArrayBox& src,
00140 const Interval& Csrc,
00141 Real a_scale) const;
00142
00143 };
00144
00145
00146
00147
00148
00149
00150
00151
00152 class FaceSpreadingOp : public LDOperator<FluxBox>
00153 {
00154 public:
00155 Real scale;
00156 Vector<int> m_spreadingDir;
00157 FaceSpreadingOp();
00158
00159
00160 FaceSpreadingOp(int a_spreadingDir);
00161
00162
00163 FaceSpreadingOp(const Vector<int>& a_spreadingDir);
00164
00165 virtual void linearIn(FluxBox& arg, void* buf, const Box& R,
00166 const Interval& comps) const;
00167 void op(FluxBox& dest,
00168 const Box& RegionFrom,
00169 const Interval& Cdest,
00170 const Box& RegionTo,
00171 const FluxBox& src,
00172 const Interval& Csrc) const;
00173
00174 void applyOp(FluxBox& dest,
00175 const Box& RegionFrom,
00176 const Interval& Cdest,
00177 const Box& RegionTo,
00178 const FluxBox& src,
00179 const Interval& Csrc,
00180 Real a_scale) const;
00181
00182 };
00183
00184 #include "NamespaceFooter.H"
00185
00186 #endif