00001
00002
00003 #include "computeNormsX.h"
00004 #include "arrayConversionX.h"
00005
00006 #include <tbox_Pointer.h>
00007
00008 #include <hier_PatchX.h>
00009 #include <hier_PatchLevelX.h>
00010 #include <hier_PatchHierarchyX.h>
00011 #include <pdat_CellDataX.h>
00012
00013 #include <MultiDimArrayAccess.h>
00014
00015 using namespace SAMRAI;
00016
00017 int computeNormsX(
00018 const tbox_Pointer< SAMRAI::hier_PatchHierarchyX > hierarchy
00019 , int id1
00020 , int id2
00021 , int idw
00022 , double *l2norm
00023 , double *linorm
00024 ) {
00025
00026
00027
00028 double diff=0, difflinf=0, diffl2=0, weightsum=0;
00029 for ( int ln = hierarchy->getFinestLevelNumber(); ln >= 0; ln -- ) {
00030
00031 tbox_Pointer<hier_PatchLevelX> level = hierarchy->getPatchLevel(ln);
00032
00033 for ( hier_PatchLevelX::Iterator p(level); p; p++ ) {
00034
00035 tbox_Pointer<hier_PatchX> patch = level->getPatch(p());
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 tbox_Pointer<pdat_CellDataX<double> > data1 = patch->getPatchData(id1);
00047 tbox_Pointer<pdat_CellDataX<double> > data2 = patch->getPatchData(id2);
00048 tbox_Pointer<pdat_CellDataX<double> > weight = patch->getPatchData(idw);
00049
00050 {
00051 MultiDimArrayAccess<double,NDIM> ex =
00052 arrayData2ArrayAccess( data2->getArrayData() );
00053 ConstMultiDimArrayAccess<double,NDIM> co =
00054 arrayData2ArrayAccess( data1->getArrayData() );
00055 ConstMultiDimArrayAccess<double,NDIM> wt =
00056 arrayData2ArrayAccess( weight->getArrayData() );
00057 const int *lower = data1->getBox().lower();
00058 const int *upper = data1->getBox().upper();
00059 #if NDIM == 1
00060 for ( int i=lower[0]; i<=upper[0]; ++i ) {
00061 diff = fabs( co(i) - ex(i) );
00062 if ( difflinf < diff ) difflinf = diff;
00063 diffl2 += wt(i)*diff*diff;
00064 weightsum += wt(i);
00065 }
00066 #elif NDIM == 2
00067 for ( int j=lower[1]; j<=upper[1]; ++j ) {
00068 for ( int i=lower[0]; i<=upper[0]; ++i ) {
00069 diff = fabs( co(j,i) - ex(j,i) );
00070 if ( difflinf < diff ) difflinf = diff;
00071 diffl2 += wt(j,i)*diff*diff;
00072 weightsum += wt(j,i);
00073 }
00074 }
00075 #elif NDIM == 3
00076 for ( int k=lower[1]; k<=upper[1]; ++k ) {
00077 for ( int j=lower[1]; j<=upper[1]; ++j ) {
00078 for ( int i=lower[0]; i<=upper[0]; ++i ) {
00079 diff = fabs( co(k,j,i) - ex(k,j,i) );
00080 if ( difflinf < diff ) difflinf = diff;
00081 diffl2 += wt(k,j,i)*diff*diff;
00082 weightsum += wt(k,j,i);
00083 }
00084 }
00085 }
00086 #endif
00087 }
00088
00089 }
00090
00091 }
00092 diffl2 = sqrt( diffl2/weightsum );
00093
00094 return 0;
00095 }