Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

samtut-0.1.7/samrai_supplement/computeNormsX.C.sed

Go to the documentation of this file.
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     Compute error on all levels, all patches.
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         Get information about the patch geometry.
00039       */
00040       // tbox_Pointer<geom_CartesianPatchGeometryX> patch_geom
00041         // = patch->getPatchGeometry();
00042 
00043       /*
00044         Get the patch data.
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 }

Generated on Wed Apr 17 12:51:45 2002 for samtut by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001