From 08a9c8bf9be781952f23ea02a4d5c1e3d006ee96 Mon Sep 17 00:00:00 2001 From: Tomas Sobotik <sobotto4@fjfi.cvut.cz> Date: Wed, 18 Feb 2015 08:26:24 +0100 Subject: [PATCH] minor changes --- examples/hamilton-jacobi-parallel/Makefile | 2 +- examples/hamilton-jacobi-parallel/main.cpp | 1 - .../tnlParallelEikonalSolver.h | 5 +- .../tnlParallelEikonalSolver_impl.h | 237 ++++++++++++------ .../parallelGodunovEikonal2D_impl.h | 63 +++-- 5 files changed, 220 insertions(+), 88 deletions(-) diff --git a/examples/hamilton-jacobi-parallel/Makefile b/examples/hamilton-jacobi-parallel/Makefile index 6b0e04e313..bfdc1ef236 100644 --- a/examples/hamilton-jacobi-parallel/Makefile +++ b/examples/hamilton-jacobi-parallel/Makefile @@ -8,7 +8,7 @@ INSTALL_DIR = ${HOME}/local CXX = g++ CUDA_CXX = nvcc OMP_FLAGS = -DHAVE_OPENMP -fopenmp -CXX_FLAGS = -std=gnu++0x -I$(TNL_INCLUDE_DIR) -O3 $(OMP_FLAGS) +CXX_FLAGS = -std=gnu++0x -I$(TNL_INCLUDE_DIR) -O3 $(OMP_FLAGS) -DDEBUG LD_FLAGS = -L$(TNL_INSTALL_DIR) -ltnl-0.1 -lgomp SOURCES = main.cpp diff --git a/examples/hamilton-jacobi-parallel/main.cpp b/examples/hamilton-jacobi-parallel/main.cpp index 1561662b30..685da76169 100644 --- a/examples/hamilton-jacobi-parallel/main.cpp +++ b/examples/hamilton-jacobi-parallel/main.cpp @@ -44,7 +44,6 @@ int main( int argc, char* argv[] ) cout << "-------------------------------------------------------------" << endl; cout << "Starting solver loop..." << endl; solver.run(); - cout << "a" <<endl; // } return EXIT_SUCCESS; diff --git a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h index 5278e8e800..58babd8ce2 100644 --- a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h +++ b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h @@ -45,8 +45,11 @@ public: bool init( const tnlParameterContainer& parameters ); void run(); + void test(); + private: + void synchronize(); int getOwner( int i) const; @@ -71,7 +74,7 @@ private: VectorType u0, work_u; - IntVectorType subgridValues, boundaryConditions; + IntVectorType subgridValues, boundaryConditions, unusedCell; MeshType mesh, subMesh; Scheme scheme; double delta, tau0, stopTime,cflCondition; diff --git a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h index f6e0b4a1a7..fb1c810503 100644 --- a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h +++ b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h @@ -19,12 +19,39 @@ #include "tnlParallelEikonalSolver.h" +#include <core/mfilename.h> template< typename Scheme> tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::tnlParallelEikonalSolver() { } +template< typename Scheme> +void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::test() +{ +/* + VectorType savedMesh; + savedMesh.setSize(this->work_u.getSize()); + savedMesh = this->work_u; + for(int i =0; i < this->subgridValues.getSize(); i++ ) + { + insertSubgrid(getSubgrid(i), i); + for(int j = 0; j < this->work_u.getSize(); j++) + { + if(savedMesh[j] != this->work_u[j]) + cout << "Error on subMesh " << i << " : " << j << endl; + } + this->work_u = savedMesh; + } +*/ + +/* + contractGrid(); + this->u0.save("u-00000.tnl"); + stretchGrid(); +*/ +} + template< typename Scheme> bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlParameterContainer& parameters ) { @@ -33,25 +60,37 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara this->mesh.load( meshLocation ); this->n = parameters.GetParameter <int>("subgrid-size"); + cout << "Setting N to " << this->n << endl; this->subMesh.setDimensions( this->n, this->n ); this->subMesh.setDomain( tnlStaticVector<2,double>(0.0, 0.0), tnlStaticVector<2,double>(this->mesh.getHx()*(double)(this->n), this->mesh.getHy()*(double)(this->n)) ); + this->subMesh.save("submesh.tnl"); + const tnlString& initialCondition = parameters.GetParameter <tnlString>("initial-condition"); this->u0.load( initialCondition ); + //cout << this->mesh.getCellCenter(0) << endl; + this->delta = parameters.GetParameter <double>("delta"); this->delta *= sqrt(this->mesh.getHx()*this->mesh.getHx() + this->mesh.getHy()*this->mesh.getHy()); + cout << "Setting delta to " << this->delta << endl; + this->tau0 = parameters.GetParameter <double>("initial-tau"); + cout << "Setting initial tau to " << this->tau0 << endl; this->stopTime = parameters.GetParameter <double>("stop-time"); this->cflCondition = parameters.GetParameter <double>("cfl-condition"); + this -> cflCondition *= sqrt(this->mesh.getHx()*this->mesh.getHy()); + cout << "Setting CFL to " << this->cflCondition << endl; stretchGrid(); - this->stopTime /= (double)(this->gridCols); + //this->stopTime /= (double)(this->gridCols); + //this->stopTime *= (1.0+1.0/((double)(this->n) - 1.0)); + cout << "Setting stopping time to " << this->stopTime << endl; cout << "Initializating scheme..." << endl; if(!this->scheme.init(parameters)) @@ -61,6 +100,7 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara } cout << "Scheme initialized." << endl; + test(); VectorType* tmp = new VectorType[subgridValues.getSize()]; bool containsCurve = false; @@ -78,7 +118,6 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara if(tmp[i][0]*tmp[i][j] <= 0.0) { containsCurve = true; - //cout << tmp[i][0] << ":" << tmp[i][j] << endl; j=tmp[i].getSize(); } @@ -103,49 +142,54 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara template< typename Scheme > void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::run() { - while (this->subgridValues.max() > 0) + while (this->boundaryConditions.max() > 0 && this->currentStep < 3.0*this->gridCols) { for(int i = 0; i < this->subgridValues.getSize(); i++) { - if(getSubgridValue(i) != INT_MAX && getSubgridValue(i) > 0) + if(getSubgridValue(i) != INT_MAX) { + if(getBoundaryCondition(i) & 1) { insertSubgrid( runSubgrid(1, getSubgrid(i)), i); - setBoundaryCondition(i, getBoundaryCondition(i) - 1); } if(getBoundaryCondition(i) & 2) { insertSubgrid( runSubgrid(2, getSubgrid(i)), i); - setBoundaryCondition(i, getBoundaryCondition(i) - 2); } if(getBoundaryCondition(i) & 4) { insertSubgrid( runSubgrid(4, getSubgrid(i)), i); - setBoundaryCondition(i, getBoundaryCondition(i) - 4); } if(getBoundaryCondition(i) & 8) { insertSubgrid( runSubgrid(8, getSubgrid(i)), i); - setBoundaryCondition(i, getBoundaryCondition(i) - 8); } + /*if(getBoundaryCondition(i)) + { + insertSubgrid( runSubgrid(15, getSubgrid(i)), i); + }*/ + + setBoundaryCondition(i, 0); setSubgridValue(i, getSubgridValue(i)-1); + } } - synchronize(); } + contractGrid(); this->u0.save("u-00001.tnl"); cout << "Solver finished" << endl; } + //north - 1, east - 2, west - 4, south - 8 template< typename Scheme > -void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::synchronize() +void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::synchronize() //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now { cout << "Synchronizig..." << endl; int tmp1, tmp2; @@ -159,35 +203,28 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::synchronize() tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i; grid1 = getSubgridValue(getOwner(tmp1)); grid2 = getSubgridValue(getOwner(tmp2)); - if ((this->work_u[tmp1] < this->work_u[tmp2] - this->delta || grid2 == INT_MAX|| grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) + if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) { this->work_u[tmp2] = this->work_u[tmp1]; - if(getSubgridValue(getOwner(tmp2)) == INT_MAX) + this->unusedCell[tmp2] = 0; + if(grid2 == INT_MAX) { setSubgridValue(getOwner(tmp2), -INT_MAX); } - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+1); + if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) + setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); } - else if ((this->work_u[tmp1] > this->work_u[tmp2] + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) + else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) { this->work_u[tmp1] = this->work_u[tmp2]; - if(getSubgridValue(getOwner(tmp1)) == INT_MAX) + this->unusedCell[tmp1] = 0; + if(grid1 == INT_MAX) { setSubgridValue(getOwner(tmp1), -INT_MAX); } - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+8); + if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) + setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); } - /*else if ( (grid1 != INT_MAX && grid1 != -INT_MAX) || (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - if(getSubgridValue(getOwner(tmp2)) == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - else if(getSubgridValue(getOwner(tmp1)) == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - }*/ } } @@ -197,43 +234,38 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::synchronize() { for (int j = 0; j < this->gridRows*this->n; j++) { - tmp1 = this->gridCols*this->n*j + i*this->n; - tmp2 = this->gridCols*this->n*j + i*this->n + 1; - if ((this->work_u[tmp1] < this->work_u[tmp2] - this->delta || grid2 == INT_MAX|| grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) + tmp1 = this->gridCols*this->n*j + i*this->n - 1; + tmp2 = this->gridCols*this->n*j + i*this->n ; + grid1 = getSubgridValue(getOwner(tmp1)); + grid2 = getSubgridValue(getOwner(tmp2)); + if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) { this->work_u[tmp2] = this->work_u[tmp1]; - if(getSubgridValue(getOwner(tmp2)) == INT_MAX) + this->unusedCell[tmp2] = 0; + if(grid2 == INT_MAX) { setSubgridValue(getOwner(tmp2), -INT_MAX); } - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+2); + if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) + setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); } - else if ((this->work_u[tmp1] > this->work_u[tmp2] + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) + else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) { this->work_u[tmp1] = this->work_u[tmp2]; - if(getSubgridValue(getOwner(tmp1)) == INT_MAX) + this->unusedCell[tmp1] = 0; + if(grid1 == INT_MAX) { setSubgridValue(getOwner(tmp1), -INT_MAX); } - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+4); + if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) + setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); } - /*else if ( (grid1 != INT_MAX && grid1 != -INT_MAX) || (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - if(getSubgridValue(getOwner(tmp2)) == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - else if(getSubgridValue(getOwner(tmp1)) == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - }*/ } } - int stepValue = this->currentStep + 3; this->currentStep++; + int stepValue = this->currentStep + 4; for (int i = 0; i < this->subgridValues.getSize(); i++) { if( getSubgridValue(i) == -INT_MAX ) @@ -282,8 +314,11 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::stretchGrid() cout << "Stretching grid..." << endl; - this->gridCols = ceil((double)(this->mesh.getDimensions().x())/(double)(this->n)); - this->gridRows = ceil((double)(this->mesh.getDimensions().y())/(double)(this->n)); + this->gridCols = ceil( ((double)(this->mesh.getDimensions().x()-1)) / ((double)(this->n-1)) ); + this->gridRows = ceil( ((double)(this->mesh.getDimensions().y()-1)) / ((double)(this->n-1)) ); + + cout << "Setting gridCols to " << this->gridCols << "." << endl; + cout << "Setting gridRows to " << this->gridRows << "." << endl; this->subgridValues.setSize(this->gridCols*this->gridRows); this->boundaryConditions.setSize(this->gridCols*this->gridRows); @@ -298,19 +333,30 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::stretchGrid() if(!this->work_u.setSize(stretchedSize)) cerr << "Could not allocate memory for stretched grid." << endl; + if(!this->unusedCell.setSize(stretchedSize)) + cerr << "Could not allocate memory for supporting stretched grid." << endl; for(int i = 0; i < stretchedSize; i++) { - int k = i/this->n - i/(this->n*this->gridCols) + this->n*this->gridCols*(i/(this->n*this->n*this->gridCols)); - int j=(i % (this->n*this->gridCols)) - ( (this->mesh.getDimensions().x() - this->n)/(this->n - 1) + this->mesh.getDimensions().x()); + this->unusedCell[i] = 1; + int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)); + /*int j=(i % (this->n*this->gridCols)) - ( (this->mesh.getDimensions().x() - this->n)/(this->n - 1) + this->mesh.getDimensions().x() - 1) + + (this->n*this->gridCols - this->mesh.getDimensions().x())*(i/(this->n*this->n*this->gridCols)) ; if(j > 0) k += j; + int l = i-k - (this->u0.getSize() - 1); + int m = (l % this->mesh.getDimensions().x()); + + if(l>0) + k+= l + ( (l / this->mesh.getDimensions().x()) + 1 )*this->mesh.getDimensions().x() - (l % this->mesh.getDimensions().x());*/ + this->work_u[i] = this->u0[i-k]; } + cout << "Grid stretched." << endl; } @@ -322,14 +368,16 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::contractGrid() for(int i = 0; i < stretchedSize; i++) { - int k = i/this->n - i/(this->n*this->gridCols) + this->n*this->gridCols*(i/(this->n*this->n*this->gridCols)); - int j=(i % (this->n*this->gridCols)) - ((this->mesh.getDimensions().x() - this->n)/(this->n - 1) + this->mesh.getDimensions().x()); + int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)); + /*int j=(i % (this->n*this->gridCols)) - ( (this->mesh.getDimensions().x() - this->n)/(this->n - 1) + this->mesh.getDimensions().x() - 1) + + (this->n*this->gridCols - this->mesh.getDimensions().x())*(i/(this->n*this->n*this->gridCols)) ; + int l = i-k - (this->u0.getSize() - 1); - if(!(j > 0)) + if(!(j > 0) && !(l>0))*/ this->u0[i-k] = this->work_u[i]; + } - //MISSING FILL FOR BOTTOM cout << "Grid contracted" << endl; } @@ -340,9 +388,12 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::getSubgrid( const int i VectorType u; u.setSize(this->n*this->n); - for( int j = 0; j < this->n*this->n; j++) + for( int j = 0; j < u.getSize(); j++) { - u[j] = this->work_u[(i / this->gridCols)*this->n*this->n*this->gridCols + (i % this->gridCols)*this->n + (j/this->n)*this->n*this->gridCols + (j % this->n)]; + u[j] = this->work_u[ (i / this->gridCols) * this->n*this->n*this->gridCols + + (i % this->gridCols) * this->n + + (j/this->n) * this->n*this->gridCols + + (j % this->n) ]; } return u; } @@ -350,12 +401,16 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::getSubgrid( const int i template< typename Scheme > void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::insertSubgrid( VectorType u, const int i ) { + for( int j = 0; j < this->n*this->n; j++) { int index = (i / this->gridCols)*this->n*this->n*this->gridCols + (i % this->gridCols)*this->n + (j/this->n)*this->n*this->gridCols + (j % this->n); //OMP LOCK index - if(this->work_u[index] > u[j]) + if( (fabs(this->work_u[index]) > fabs(u[j])) || (this->unusedCell[index] == 1) ) + { this->work_u[index] = u[j]; + this->unusedCell[index] = 0; + } //OMP UNLOCK index } } @@ -364,6 +419,7 @@ template< typename Scheme > typename tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::VectorType tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundaryCondition, VectorType u) { + VectorType fu; fu.setLike(u); @@ -375,6 +431,7 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary double time = 0.0; double currentTau = this->tau0; + //bool skip = false; if( time + currentTau > this -> stopTime ) currentTau = this -> stopTime - time; /*this->resetIterations(); this->setResidue( this->getConvergenceResidue() + 1.0 ); @@ -384,7 +441,9 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary /**** * Start the main loop */ - while( time < this->stopTime ) + //cout << time << flush; + double maxResidue( 0.0 ); + while( time < this->stopTime/* || maxResidue > (10.0* this -> cflCondition)*/) { /**** * Compute the RHS @@ -398,25 +457,56 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary //RealType lastResidue = this->getResidue(); - double maxResidue( 0.0 ); + + maxResidue = fu. absMax(); //cout << fu. absMax() << endl; + + if( this -> cflCondition != 0.0 /*&& currentTau*maxResidue > this -> cflCondition*/) + currentTau = this -> cflCondition / maxResidue; + //cout << "\b\b\b\b\b\b\b\b\b\b\b\b\r" << currentTau << flush; + /* if( this -> cflCondition != 0.0 ) { maxResidue = fu. absMax(); if( currentTau * maxResidue > this -> cflCondition ) { - currentTau *= 0.9; - continue; + //cout << '\r' << "For " << currentTau * maxResidue << " : " << currentTau << " --> "; + currentTau = 0.95 * this -> cflCondition / maxResidue; + //cout << currentTau << " at " << this -> cflCondition << flush; + //currentTau *= 0.9; +// continue; } - } + }*/ + //RealType newResidue( 0.0 ); //computeNewTimeLevel( u, currentTau, newResidue ); + + //skip = false; + if( time + currentTau > this -> stopTime ) + currentTau = this -> stopTime - time; + for( int i = 0; i < fu.getSize(); i ++ ) + { + if((u[i]+currentTau * fu[ i ])*Sign(u[i]) < 0.0 && fu[i] != 0.0 && u[i] != 0.0 ) + { +// skip = true; + currentTau = fabs(u[i]/(2.0*fu[i])); + //currentTau *= 0.9; +// i=fu.getSize(); + } + } + + // if(skip) + //{ + // continue; + //} + for( int i = 0; i < fu.getSize(); i ++ ) { - double add = currentTau * fu[ i ]; - u[ i ] += add; + //double add = currentTau * fu[ i ]; + u[ i ] += currentTau * fu[ i ]; //localResidue += fabs( add ); } + //this->setResidue( newResidue ); /**** @@ -432,11 +522,13 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary /**** * Compute the new time step. */ - if( this -> cflCondition != 0.0 ) - currentTau /= 0.95; + /*if( this -> cflCondition != 0.0 ) + currentTau *= 1.1;*/ - if( time + currentTau > this -> stopTime ) - currentTau = this -> stopTime - time; //we don't want to keep such tau +// if( time + currentTau > this -> stopTime ) +// { +// currentTau = this -> stopTime - time; //we don't want to keep such tau +// } //else this -> tau = currentTau; //this -> refreshSolverMonitor(); @@ -450,8 +542,8 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary //this -> refreshSolverMonitor(); return true; }*/ - - + // cout << '\r' << flush; + // cout << maxResidue << flush; } @@ -462,6 +554,9 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary solution[i]=u[i]; } + cout << '\r' << flush; + + //cout << "RES: " << maxResidue << " @ " << time << endl; return solution; } diff --git a/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h b/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h index ba64ea36fb..22078dd728 100644 --- a/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h +++ b/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h @@ -90,8 +90,7 @@ bool parallelGodunovEikonalScheme< tnlGrid< 2,MeshReal, Device, MeshIndex >, Rea epsilon = parameters. GetParameter< double >( "epsilon" ); - if(epsilon != 0.0) - epsilon *=sqrt( hx*hx + hy*hy ); + epsilon *=sqrt( hx*hx + hy*hy ); // dofVector. setSize( this->mesh.getDofs() ); @@ -131,11 +130,13 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re const IndexType boundaryCondition ) const { - if ( (coordinates.x() == 0 && boundaryCondition == 4) || - (coordinates.x() == mesh.getDimensions().x() - 1 && boundaryCondition == 2) || - (coordinates.y() == 0 && boundaryCondition == 1) || - (coordinates.y() == mesh.getDimensions().y() - 1 && boundaryCondition == 8) ) + if ( (coordinates.x() == 0 && (boundaryCondition & 4)) or + (coordinates.x() == mesh.getDimensions().x() - 1 && (boundaryCondition & 2)) or + (coordinates.y() == 0 && (boundaryCondition & 8)) or + (coordinates.y() == mesh.getDimensions().y() - 1 && (boundaryCondition & 1)) ) + { return 0.0; + } RealType nabla, xb, xf, yb, yf, signui; @@ -143,22 +144,38 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re if(signui > 0.0) { - if(coordinates.x() == mesh.getDimensions().x() - 1) + /**/ /* if(boundaryCondition & 2) + xf = (u[mesh.getCellXSuccessor( cellIndex )] - u[cellIndex])/hx; + else *//*if(boundaryCondition & 4) + xf = 0.0; + else /**/if(coordinates.x() == mesh.getDimensions().x() - 1) xf = negativePart((u[mesh.getCellXPredecessor( cellIndex )] - u[cellIndex])/hx); else xf = negativePart((u[mesh.getCellXSuccessor( cellIndex )] - u[cellIndex])/hx); - if(coordinates.x() == 0) + /**/ /* if(boundaryCondition & 4) + xb = (u[cellIndex] - u[mesh.getCellXPredecessor( cellIndex )])/hx; + else *//*if(boundaryCondition & 2) + xb = 0.0; + else /**/if(coordinates.x() == 0) xb = positivePart((u[cellIndex] - u[mesh.getCellXSuccessor( cellIndex )])/hx); else xb = positivePart((u[cellIndex] - u[mesh.getCellXPredecessor( cellIndex )])/hx); - if(coordinates.y() == mesh.getDimensions().y() - 1) + /**/ /* if(boundaryCondition & 1) + yf = (u[mesh.getCellYSuccessor( cellIndex )] - u[cellIndex])/hy; + else *//*if(boundaryCondition & 8) + yf = 0.0; + else /**/if(coordinates.y() == mesh.getDimensions().y() - 1) yf = negativePart((u[mesh.getCellYPredecessor( cellIndex )] - u[cellIndex])/hy); else yf = negativePart((u[mesh.getCellYSuccessor( cellIndex )] - u[cellIndex])/hy); - if(coordinates.y() == 0) + /**/ /* if(boundaryCondition & 8) + yb = (u[cellIndex] - u[mesh.getCellYPredecessor( cellIndex )])/hy; + else *//*if(boundaryCondition & 1) + yb = 0.0; + else /**/if(coordinates.y() == 0) yb = positivePart((u[cellIndex] - u[mesh.getCellYSuccessor( cellIndex )])/hy); else yb = positivePart((u[cellIndex] - u[mesh.getCellYPredecessor( cellIndex )])/hy); @@ -179,26 +196,44 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re } else if (signui < 0.0) { - if(coordinates.x() == mesh.getDimensions().x() - 1) + + /**/ /* if(boundaryCondition & 2) + xf = (u[mesh.getCellXSuccessor( cellIndex )] - u[cellIndex])/hx; + else*//* if(boundaryCondition & 4) + xf = 0.0; + else /**/if(coordinates.x() == mesh.getDimensions().x() - 1) xf = positivePart((u[mesh.getCellXPredecessor( cellIndex )] - u[cellIndex])/hx); else xf = positivePart((u[mesh.getCellXSuccessor( cellIndex )] - u[cellIndex])/hx); - if(coordinates.x() == 0) + /**/ /* if(boundaryCondition & 4) + xb = (u[cellIndex] - u[mesh.getCellXPredecessor( cellIndex )])/hx; + else*//* if(boundaryCondition & 2) + xb = 0.0; + else /**/if(coordinates.x() == 0) xb = negativePart((u[cellIndex] - u[mesh.getCellXSuccessor( cellIndex )])/hx); else xb = negativePart((u[cellIndex] - u[mesh.getCellXPredecessor( cellIndex )])/hx); - if(coordinates.y() == mesh.getDimensions().y() - 1) + /**/ /* if(boundaryCondition & 1) + yf = (u[mesh.getCellYSuccessor( cellIndex )] - u[cellIndex])/hy; + else *//*if(boundaryCondition & 8) + yf = 0.0; + else /**/if(coordinates.y() == mesh.getDimensions().y() - 1) yf = positivePart((u[mesh.getCellYPredecessor( cellIndex )] - u[cellIndex])/hy); else yf = positivePart((u[mesh.getCellYSuccessor( cellIndex )] - u[cellIndex])/hy); - if(coordinates.y() == 0) + /**/ /* if(boundaryCondition & 8) + yb = (u[cellIndex] - u[mesh.getCellYPredecessor( cellIndex )])/hy; + else*//* if(boundaryCondition & 1) + yb = 0.0; + else /**/if(coordinates.y() == 0) yb = negativePart((u[cellIndex] - u[mesh.getCellYSuccessor( cellIndex )])/hy); else yb = negativePart((u[cellIndex] - u[mesh.getCellYPredecessor( cellIndex )])/hy); + if(xb + xf > 0.0) xb = 0.0; else -- GitLab