LR-splines  0.5
Diagonal.cpp
Go to the documentation of this file.
00001 
00002 #include <cstdio>
00003 #include <cmath>
00004 #include <cstdlib>
00005 #include <iostream>
00006 #include <fstream>
00007 #include <cstring>
00008 #include "LRSpline/LRSplineSurface.h"
00009 #include "LRSpline/LRSplineVolume.h"
00010 #include "LRSpline/Element.h"
00011 #include "LRSpline/Basisfunction.h"
00012 
00013 using namespace Go;
00014 using namespace LR;
00015 using namespace std;
00016 
00017 int main(int argc, char **argv) {
00018 
00019         // set default parameter values
00020         int p         = 3;
00021         int N         = 6;
00022         int m         = 1;
00023         int scheme    = 0;
00024         bool dumpfile = false;
00025         bool vol       = false;
00026         string parameters(" parameters: \n" \
00027                           "   -p      <n> polynomial DEGREE (order-1) of the basis\n" \
00028                           "   -n      <n> number of iterations\n" \
00029                           "   -m      <n> knot multiplicity\n" \
00030                           "   -dumpfile   create .eps and .m files of the meshes\n" \
00031                           "   -vol        enforce a volumetric test case\n"\
00032                           "   -scheme <n> refinement scheme (0=FULLSPAN, 1=MINSPAN, 2=STRUCT)\n" \
00033                           "   -help    display (this) help information\n");
00034         
00035         // read input
00036         for(int i=1; i<argc; i++) {
00037                 if(strcmp(argv[i], "-p") == 0)
00038                         p = atoi(argv[++i]);
00039                 else if(strcmp(argv[i], "-scheme") == 0)
00040                         scheme = atoi(argv[++i]);
00041                 else if(strcmp(argv[i], "-n") == 0)
00042                         N = atoi(argv[++i]);
00043                 else if(strcmp(argv[i], "-m") == 0)
00044                         m = atoi(argv[++i]);
00045                 else if(strcmp(argv[i], "-dumpfile") == 0)
00046                         dumpfile = true;
00047                 else if(strcmp(argv[i], "-vol") == 0)
00048                         vol = true;
00049                 else if(strcmp(argv[i], "-help") == 0) {
00050                         cout << "usage: " << argv[0] << endl << parameters;
00051                         exit(0);
00052                 } else {
00053                         cout << "usage: " << argv[0] << endl << parameters;
00054                         exit(1);
00055                 }
00056         }
00057 
00058         // do some error testing on input
00059         if(m > p )
00060                 m = p;
00061         if(scheme > 2)
00062                 scheme = 2;
00063 
00064         // clear previous result from file
00065         if(dumpfile) {
00066                 ofstream clear_out;
00067                 clear_out.open("dof.m");
00068                 clear_out.close();
00069                 clear_out.open("elements.m");
00070                 clear_out.close();
00071         }
00072 
00073 
00074 
00075         // make two identical splines
00076         LRSplineSurface *lrs;
00077         LRSplineVolume  *lrv;
00078         if(vol) {
00079                 lrv = new LRSplineVolume(p+1, p+1, p+1, p+1, p+1, p+1);
00080         } else {
00081                 lrs = new LRSplineSurface(p+1, p+1, p+1, p+1);
00082         }
00083 
00084         // setup refinement parameters
00085         enum refinementStrategy strat;
00086         if(scheme == 0)
00087                 strat = LR_FULLSPAN;
00088         else if(scheme == 1)
00089                 strat = LR_MINSPAN;
00090         else if(scheme == 2)
00091                 strat = LR_STRUCTURED_MESH;
00092         if(vol) {
00093                 lrv->setRefMultiplicity(m);
00094                 lrv->setRefStrat(strat);
00095         } else {
00096                 lrs->setRefMultiplicity(m);
00097                 lrs->setRefStrat(strat);
00098         }
00099 
00100         // for all iterations
00101         for(int n=0; n<N; n++) {
00102                 vector<int> indices;
00103 
00104                 if(scheme < 2) {
00105                         if(vol) {
00106                                 lrv->generateIDs();
00107                                 lrv->getDiagonalElements(indices);
00108                                 lrv->refineElement(indices);
00109                         } else {
00110                                 lrs->generateIDs();
00111                                 lrs->getDiagonalElements(indices);
00112                                 lrs->refineElement(indices);
00113                         }
00114                 } else if(scheme == 2) {
00115                         if(vol) {
00116                                 // lrv->generateIDs();
00117                                 // lrv->getDiagonalBasisfunctions(indices);
00118                                 // lrv->refineBasisFunction(indices);
00119                         } else {
00120                                 lrs->generateIDs();
00121                                 lrs->getDiagonalBasisfunctions(indices);
00122                                 lrs->refineBasisFunction(indices);
00123                         }
00124                 }
00125 
00126                 // draw result files (with next refinement-step-diagonal shaded)
00127                 if(dumpfile && !vol) {
00128                         vector<int> diagElms, diagFuncs;
00129                         lrs->getDiagonalElements(diagElms);
00130                         lrs->getDiagonalBasisfunctions(diagFuncs);
00131                         char filename[128];
00132 
00133                         sprintf(filename, "index_%02d.eps", n+1);
00134                         ofstream out;
00135                         out.open(filename);
00136                         if(scheme < 2)
00137                                 lrs->writePostscriptMesh(out, true, &diagElms);
00138                         else
00139                                 lrs->writePostscriptMesh(out);
00140                         out.close();
00141 
00142                         sprintf(filename, "parameter_%02d.eps", n+1);
00143                         out.open(filename);
00144                         if(scheme < 2)
00145                                 lrs->writePostscriptElements(out, 2,2, true, &diagElms);
00146                         else 
00147                                 lrs->writePostscriptElements(out, 2,2, true);
00148                         out.close();
00149 
00150                         sprintf(filename, "func_%02d.eps", n+1);
00151                         out.open(filename);
00152                         if(scheme == 2)
00153                                 lrs->writePostscriptFunctionSpace(out, &diagFuncs);
00154                         else
00155                                 lrs->writePostscriptFunctionSpace(out);
00156                         out.close();
00157                         
00158                         out.open("dof.m", ios::app);
00159                         out << lrs->nBasisFunctions() << endl;
00160                         out.close();
00161 
00162                         out.open("elements.m", ios::app);
00163                         out << lrs->nElements() << endl;
00164                         out.close();
00165                 }
00166         }
00167         
00168         vector<int> overloadedBasis;
00169         vector<int> overloadedElements;
00170         vector<int> multipleOverloadedElements;
00171 
00172         // harvest some statistics and display these results
00173         int nBasis      = 0;
00174         int nElements   = 0;
00175         int nMeshlines  = 0;
00176         if(vol) lrv->generateIDs();
00177         else    lrs->generateIDs();
00178         double avgBasisToElement = 0;
00179         double avgBasisToLine    = 0;
00180         int maxBasisToElement    = -1;
00181         int minBasisToElement    = 9999999;
00182         int nOverloadedElms      = 0;
00183         int nOverloadedBasis     = 0;
00184         if(vol) {
00185                 nBasis     = lrv->nBasisFunctions();
00186                 nElements  = lrv->nElements();
00187                 nMeshlines = lrv->nMeshRectangles();
00188         } else {
00189                 nBasis     = lrs->nBasisFunctions();
00190                 nElements  = lrs->nElements();
00191                 nMeshlines = lrs->nMeshlines();
00192         }
00193         HashSet<Basisfunction*> basis    = (vol) ? lrv->getAllBasisfunctions() : lrs->getAllBasisfunctions();
00194         vector<Element*>        elements = (vol) ? lrv->getAllElements()       : lrs->getAllElements();
00195         for(Basisfunction* b : basis) {
00196                 int nE = b->nSupportedElements();
00197                 maxBasisToElement = (maxBasisToElement > nE) ? maxBasisToElement : nE;
00198                 minBasisToElement = (minBasisToElement < nE) ? minBasisToElement : nE;
00199                 avgBasisToElement += nE;
00200                 if(b->isOverloaded()) {
00201                         nOverloadedBasis++;
00202                         overloadedBasis.push_back(b->getId());
00203                 }
00204         }
00205         avgBasisToElement /= nBasis;
00206         avgBasisToLine    /= nBasis;
00207 
00208         double avgElementToBasis       = 0;
00209         double avgSquareElementToBasis = 0;
00210         double hashCodePercentage      = ((double)basis.uniqueHashCodes())/nBasis;
00211         int maxElementToBasis          = -1;
00212         int minElementToBasis          = 9999999;
00213         for(Element *e : elements) {
00214                 int nB = e->nBasisFunctions();
00215                 maxElementToBasis       = (maxElementToBasis > nB) ? maxElementToBasis : nB;
00216                 minElementToBasis       = (minElementToBasis < nB) ? minElementToBasis : nB;
00217                 avgElementToBasis       += nB;
00218                 avgSquareElementToBasis += nB*nB;
00219                 if(e->isOverloaded()) {
00220                         nOverloadedElms++;
00221                         overloadedElements.push_back(e->getId());
00222                 }
00223         }
00224         avgElementToBasis /= nElements;
00225         avgSquareElementToBasis /= nElements;
00226         
00227         cout << "Some statistics: " << endl;
00228         cout << "-------------------------------------------------------------" << endl;
00229         cout << "Number of basisfunctions: " << nBasis           << endl;
00230         cout << "Number of elements      : " << nElements        << endl;
00231         cout << "Number of meshlines     : " << nMeshlines       << endl;
00232         cout << "-------------------------------------------------------------" << endl;
00233         cout << "Min number of Basisfuntion -> Element: " << minBasisToElement << endl;
00234         cout << "Max number of Basisfuntion -> Element: " << maxBasisToElement << endl;
00235         cout << "Avg number of Basisfuntion -> Element: " << avgBasisToElement << endl;
00236         cout << endl;
00237         cout << "Min number of        Element -> Basisfunction: " << minElementToBasis  << endl;
00238         cout << "Max number of        Element -> Basisfunction: " << maxElementToBasis  << endl;
00239         cout << "Avg number of        Element -> Basisfunction: " << avgElementToBasis  << endl;
00240         cout << "Avg square number of Element -> Basisfunction: " << avgSquareElementToBasis
00241              << " (" << sqrt(avgSquareElementToBasis) << ")" << endl;
00242         cout << endl;
00243         cout << "Number of overloaded Basisfunctions : " << nOverloadedBasis  << endl;
00244         cout << "Number of overloaded Elements       : " << nOverloadedElms   << endl;
00245         cout << endl;
00246         cout << "Number of unique hashcodes          : " << basis.uniqueHashCodes() ;
00247         cout <<                                      " (" << hashCodePercentage*100 << " %)"  << endl;
00248         cout << "-------------------------------------------------------------" << endl;
00249         if(nBasis < 1300 && !vol) {
00250         cout << "Is linearly independent : " << ((lrs->isLinearIndepByMappingMatrix(false) )? "True":"False") << endl;
00251         cout << "-------------------------------------------------------------" << endl;
00252         }
00253 
00254 
00255         if(dumpfile) {
00256                 cout << endl;
00257                 cout << "Written";
00258                 if(!vol) {
00259                         ofstream meshfile;
00260                         meshfile.open("mesh.eps");
00261                         lrs->writePostscriptMesh(meshfile);
00262                         meshfile.close();
00263                         cout << " mesh to mesh.eps and";
00264                 }
00265                 
00266                 ofstream lrfile;
00267                 lrfile.open("diagonal.lr");
00268                 if(vol) lrfile << *lrv << endl;
00269                 else    lrfile << *lrs << endl;
00270                 lrfile.close();
00271                 
00272                 cout << " diagonal.lr\n";
00273         }
00274 }
00275