From 131f0f6f7217513068367fb1305c655c3195a45d Mon Sep 17 00:00:00 2001 From: Tomas Sobotik <sobotto4@fjfi.cvut.cz> Date: Wed, 4 Mar 2015 08:15:40 +0100 Subject: [PATCH] separation of synchronization cycles and few other changes --- .../tnlParallelEikonalSolver.h | 2 +- .../tnlParallelEikonalSolver_impl.h | 399 ++++++++++-------- .../parallelGodunovEikonal2D_impl.h | 19 +- 3 files changed, 249 insertions(+), 171 deletions(-) diff --git a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h index 58babd8ce2..992335a929 100644 --- a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h +++ b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h @@ -70,7 +70,7 @@ private: void insertSubgrid( VectorType u, const int i ); - VectorType runSubgrid( int boundaryCondition, VectorType u); + VectorType runSubgrid( int boundaryCondition, VectorType u, int subGridID); VectorType u0, work_u; diff --git a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h index fb1c810503..07435e3629 100644 --- a/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h +++ b/examples/hamilton-jacobi-parallel/tnlParallelEikonalSolver_impl.h @@ -30,26 +30,11 @@ 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> @@ -68,7 +53,6 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara this->subMesh.save("submesh.tnl"); - const tnlString& initialCondition = parameters.GetParameter <tnlString>("initial-condition"); this->u0.load( initialCondition ); @@ -88,8 +72,8 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara cout << "Setting CFL to " << this->cflCondition << endl; stretchGrid(); - //this->stopTime /= (double)(this->gridCols); - //this->stopTime *= (1.0+1.0/((double)(this->n) - 1.0)); + this->stopTime /= (double)(this->gridCols); + this->stopTime *= 2.0*(1.0+1.0/((double)(this->n) - 1.0)); cout << "Setting stopping time to " << this->stopTime << endl; cout << "Initializating scheme..." << endl; @@ -125,7 +109,7 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara if(containsCurve) { //cout << "Computing initial SDF on subgrid " << i << "." << endl; - insertSubgrid(runSubgrid(0, tmp[i]), i); + insertSubgrid(runSubgrid(0, tmp[i],i), i); setSubgridValue(i, 4); //cout << "Computed initial SDF on subgrid " << i << "." << endl; } @@ -136,39 +120,46 @@ bool tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::init( const tnlPara this->currentStep = 1; synchronize(); cout << "Solver initialized." << endl; + return true; } template< typename Scheme > void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::run() { - while (this->boundaryConditions.max() > 0 && this->currentStep < 3.0*this->gridCols) + bool end = false; + while ((this->boundaryConditions.max() > 0 ) || !end) { + if(this->boundaryConditions.max() == 0 ) + end=true; + else + end=false; for(int i = 0; i < this->subgridValues.getSize(); i++) { if(getSubgridValue(i) != INT_MAX) { + //cout << "subMesh: " << i << ", BC: " << getBoundaryCondition(i) << endl; if(getBoundaryCondition(i) & 1) { - insertSubgrid( runSubgrid(1, getSubgrid(i)), i); + insertSubgrid( runSubgrid(1, getSubgrid(i),i), i); } if(getBoundaryCondition(i) & 2) { - insertSubgrid( runSubgrid(2, getSubgrid(i)), i); + insertSubgrid( runSubgrid(2, getSubgrid(i),i), i); } if(getBoundaryCondition(i) & 4) { - insertSubgrid( runSubgrid(4, getSubgrid(i)), i); + insertSubgrid( runSubgrid(4, getSubgrid(i),i), i); } if(getBoundaryCondition(i) & 8) { - insertSubgrid( runSubgrid(8, getSubgrid(i)), i); + insertSubgrid( runSubgrid(8, getSubgrid(i),i), i); } /*if(getBoundaryCondition(i)) { - insertSubgrid( runSubgrid(15, getSubgrid(i)), i); + insertSubgrid( runSubgrid(15, getSubgrid(i),i), i); }*/ setBoundaryCondition(i, 0); @@ -195,75 +186,83 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::synchronize() //nee int tmp1, tmp2; int grid1, grid2; - for(int j = 0; j < this->gridRows - 1; j++) + if(this->currentStep & 1) { - for (int i = 0; i < this->gridCols*this->n; i++) + for(int j = 0; j < this->gridRows - 1; j++) { - tmp1 = this->gridCols*this->n*((this->n-1)+j*this->n) + i; - tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i; - 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)) + for (int i = 0; i < this->gridCols*this->n; i++) { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) + tmp1 = this->gridCols*this->n*((this->n-1)+j*this->n) + i; + tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i; + grid1 = getSubgridValue(getOwner(tmp1)); + grid2 = getSubgridValue(getOwner(tmp2)); + if(getOwner(tmp1)==getOwner(tmp2)) + cout << "i, j" << i << "," << j << endl; + 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)) { - setSubgridValue(getOwner(tmp2), -INT_MAX); + this->work_u[tmp2] = this->work_u[tmp1]; + this->unusedCell[tmp2] = 0; + if(grid2 == INT_MAX) + { + setSubgridValue(getOwner(tmp2), -INT_MAX); + } + if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) + setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); } - if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); - } - 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]; - this->unusedCell[tmp1] = 0; - if(grid1 == 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)) { - setSubgridValue(getOwner(tmp1), -INT_MAX); + this->work_u[tmp1] = this->work_u[tmp2]; + this->unusedCell[tmp1] = 0; + if(grid1 == INT_MAX) + { + setSubgridValue(getOwner(tmp1), -INT_MAX); + } + if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) + setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); } - if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); } } } - - - for(int i = 1; i < this->gridCols; i++) + else { - for (int j = 0; j < this->gridRows*this->n; j++) + for(int i = 1; i < this->gridCols; i++) { - 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)) + for (int j = 0; j < this->gridRows*this->n; j++) { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == 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(getOwner(tmp1)==getOwner(tmp2)) + cout << "i, j" << i << "," << j << endl; + 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)) { - setSubgridValue(getOwner(tmp2), -INT_MAX); + this->work_u[tmp2] = this->work_u[tmp1]; + this->unusedCell[tmp2] = 0; + if(grid2 == INT_MAX) + { + setSubgridValue(getOwner(tmp2), -INT_MAX); + } + if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) + setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); } - if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); - } - 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]; - this->unusedCell[tmp1] = 0; - if(grid1 == 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)) { - setSubgridValue(getOwner(tmp1), -INT_MAX); + this->work_u[tmp1] = this->work_u[tmp2]; + this->unusedCell[tmp1] = 0; + if(grid1 == INT_MAX) + { + setSubgridValue(getOwner(tmp1), -INT_MAX); + } + if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) + setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); } - if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); } } - } + this->currentStep++; int stepValue = this->currentStep + 4; for (int i = 0; i < this->subgridValues.getSize(); i++) @@ -314,8 +313,11 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::stretchGrid() cout << "Stretching grid..." << endl; - 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)) ); + //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)) ); + + this->gridCols = (this->mesh.getDimensions().x()-1) / (this->n-1) ; + this->gridRows = (this->mesh.getDimensions().y()-1) / (this->n-1) ; cout << "Setting gridCols to " << this->gridCols << "." << endl; cout << "Setting gridRows to " << this->gridRows << "." << endl; @@ -336,11 +338,11 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::stretchGrid() if(!this->unusedCell.setSize(stretchedSize)) cerr << "Could not allocate memory for supporting stretched grid." << endl; - for(int i = 0; i < stretchedSize; i++) { 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)); + //cout << "i = " << i << " : i-k = " << i-k << endl; /*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)) ; @@ -354,6 +356,7 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::stretchGrid() 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 << (i-k) <<endl; } @@ -417,7 +420,7 @@ void tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::insertSubgrid( Vect template< typename Scheme > typename tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::VectorType -tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundaryCondition, VectorType u) +tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundaryCondition, VectorType u, int subGridID) { VectorType fu; @@ -429,123 +432,189 @@ tnlParallelEikonalSolver<Scheme, double, tnlHost, int>::runSubgrid( int boundary * Insert Euler-Solver Here */ + /**/ + + /*for(int i = 0; i < u.getSize(); i++) + { + int x = this->subMesh.getCellCoordinates(i).x(); + int y = this->subMesh.getCellCoordinates(i).y(); + + if(x == 0 && (boundaryCondition & 4) && y ==0) + { + if((u[subMesh.getCellYSuccessor( i )] - u[i])/subMesh.getHy() > 1.0) + { + //cout << "x = 0; y = 0" << endl; + u[i] = u[subMesh.getCellYSuccessor( i )] - subMesh.getHy(); + } + } + else if(x == 0 && (boundaryCondition & 4) && y == subMesh.getDimensions().y() - 1) + { + if((u[subMesh.getCellYPredecessor( i )] - u[i])/subMesh.getHy() > 1.0) + { + //cout << "x = 0; y = n" << endl; + u[i] = u[subMesh.getCellYPredecessor( i )] - subMesh.getHy(); + } + } + + + else if(x == subMesh.getDimensions().x() - 1 && (boundaryCondition & 2) && y ==0) + { + if((u[subMesh.getCellYSuccessor( i )] - u[i])/subMesh.getHy() > 1.0) + { + //cout << "x = n; y = 0" << endl; + u[i] = u[subMesh.getCellYSuccessor( i )] - subMesh.getHy(); + } + } + else if(x == subMesh.getDimensions().x() - 1 && (boundaryCondition & 2) && y == subMesh.getDimensions().y() - 1) + { + if((u[subMesh.getCellYPredecessor( i )] - u[i])/subMesh.getHy() > 1.0) + { + //cout << "x = n; y = n" << endl; + u[i] = u[subMesh.getCellYPredecessor( i )] - subMesh.getHy(); + } + } + + + else if(y == 0 && (boundaryCondition & 8) && x ==0) + { + if((u[subMesh.getCellXSuccessor( i )] - u[i])/subMesh.getHx() > 1.0) + { + //cout << "y = 0; x = 0" << endl; + u[i] = u[subMesh.getCellXSuccessor( i )] - subMesh.getHx(); + } + } + else if(y == 0 && (boundaryCondition & 8) && x == subMesh.getDimensions().x() - 1) + { + if((u[subMesh.getCellXPredecessor( i )] - u[i])/subMesh.getHx() > 1.0) + { + //cout << "y = 0; x = n" << endl; + u[i] = u[subMesh.getCellXPredecessor( i )] - subMesh.getHx(); + } + } + + + else if(y == subMesh.getDimensions().y() - 1 && (boundaryCondition & 1) && x ==0) + { + if((u[subMesh.getCellXSuccessor( i )] - u[i])/subMesh.getHx() > 1.0) { + //cout << "y = n; x = 0" << endl; + u[i] = u[subMesh.getCellXSuccessor( i )] - subMesh.getHx(); + } + } + else if(y == subMesh.getDimensions().y() - 1 && (boundaryCondition & 1) && x == subMesh.getDimensions().x() - 1) + { + if((u[subMesh.getCellXPredecessor( i )] - u[i])/subMesh.getHx() > 1.0) + { + //cout << "y = n; x = n" << endl; + u[i] = u[subMesh.getCellXPredecessor( i )] - subMesh.getHx(); + } + } + }*/ + + /**/ + + + bool tmp = false; + for(int i = 0; i < u.getSize(); i++) + { + if(u[0]*u[i] <= 0.0) + tmp=true; + } + + + if(tmp) + {} + else if(boundaryCondition == 4) + { + for(int i = 0; i < u.getSize(); i=subMesh.getCellYSuccessor(i)) + { + for(int j = i; j < subMesh.getDimensions().x(); j=subMesh.getCellXSuccessor(j)) + { + u[j] = u[i]; + } + } + } + else if(boundaryCondition == 8) + { + for(int i = 0; i < subMesh.getDimensions().x(); i=subMesh.getCellXSuccessor(i)) + { + for(int j = i; j < u.getSize(); j=subMesh.getCellYSuccessor(j)) + { + u[j] = u[i]; + } + } + } + else if(boundaryCondition == 2) + { + for(int i = subMesh.getDimensions().x() - 1; i < u.getSize(); i=subMesh.getCellYSuccessor(i)) + { + for(int j = i; j > (i-1)*subMesh.getDimensions().x(); j=subMesh.getCellXPredecessor(j)) + { + u[j] = u[i]; + } + } + } + else if(boundaryCondition == 1) + { + for(int i = (subMesh.getDimensions().y() - 1)*subMesh.getDimensions().x(); i < u.getSize(); i=subMesh.getCellXSuccessor(i)) + { + for(int j = i; j > 0; j=subMesh.getCellYPredecessor(j)) + { + u[j] = u[i]; + } + } + } + + /**/ + + /*if (u.max() > 0.0) + this->stopTime *=(double) this->gridCols;*/ + + 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 ); + double finalTime = this->stopTime;// + 3.0*(u.max() - u.min()); + if( time + currentTau > finalTime ) currentTau = finalTime - time; - this -> refreshSolverMonitor();*/ - - /**** - * Start the main loop - */ - //cout << time << flush; double maxResidue( 0.0 ); - while( time < this->stopTime/* || maxResidue > (10.0* this -> cflCondition)*/) + while( time < finalTime) { /**** * Compute the RHS */ - //this->problem->getExplicitRHS( time, currentTau, u, fu ); for( int i = 0; i < fu.getSize(); i ++ ) { fu[ i ] = scheme.getValue( this->subMesh, i, this->subMesh.getCellCoordinates(i), u, time, boundaryCondition ); } + maxResidue = fu. absMax(); - //RealType lastResidue = this->getResidue(); + if( this -> cflCondition * maxResidue != 0.0) + currentTau = this -> cflCondition / maxResidue; - 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 ) - { - //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; + if( time + currentTau > finalTime ) currentTau = finalTime - 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; + if((u[i]+currentTau * fu[ i ])*u[i] < 0.0 && fu[i] != 0.0 && u[i] != 0.0 ) 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 ] += currentTau * fu[ i ]; - //localResidue += fabs( add ); + double add = u[i] + currentTau * fu[ i ]; + //if( fabs(u[i]) < fabs(add) or (this->subgridValues[subGridID] == this->currentStep +4) ) + u[ i ] = add; } - - //this->setResidue( newResidue ); - - /**** - * When time is close to stopTime the new residue - * may be inaccurate significantly. - */ - //if( currentTau + time == this -> stopTime ) this->setResidue( lastResidue ); time += currentTau; - /*if( ! this->nextIteration() ) - return false;*/ - - /**** - * Compute the new time step. - */ - /*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 -// } - //else this -> tau = currentTau; - - //this -> refreshSolverMonitor(); - - /**** - * Check stop conditions. - */ - /*if( time >= this->getStopTime() || - ( this -> getConvergenceResidue() != 0.0 && this->getResidue() < this -> getConvergenceResidue() ) ) - { - //this -> refreshSolverMonitor(); - return true; - }*/ - // cout << '\r' << flush; - // cout << maxResidue << flush; + //cout << '\r' << flush; + //cout << maxResidue << " " << currentTau << " @ " << time << flush; } + /*if (u.max() > 0.0) + this->stopTime /=(double) this->gridCols;*/ VectorType solution; solution.setLike(u); @@ -553,10 +622,6 @@ 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 22078dd728..489e0a2ad1 100644 --- a/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h +++ b/src/implementation/operators/godunov-eikonal/parallelGodunovEikonal2D_impl.h @@ -130,18 +130,28 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re const IndexType boundaryCondition ) const { - if ( (coordinates.x() == 0 && (boundaryCondition & 4)) or + 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)) ) + (coordinates.y() == mesh.getDimensions().y() - 1 && (boundaryCondition & 1))) + /*and + !( (coordinates.y() == 0 or coordinates.y() == mesh.getDimensions().y() - 1) + and + ( coordinates.x() == 0 or coordinates.x() == mesh.getDimensions().x() - 1) + )*/ + ) { return 0.0; } + RealType acc = hx*hy*hx*hy; + RealType nabla, xb, xf, yb, yf, signui; signui = sign(u[cellIndex],epsilon); + if(fabs(u[cellIndex]) < acc) return 0.0; + if(signui > 0.0) { /**/ /* if(boundaryCondition & 2) @@ -191,7 +201,8 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re yb = 0.0; nabla = sqrt (xf*xf + xb*xb + yf*yf + yb*yb ); - + if(fabs(1.0-nabla) < acc) + return 0.0; return signui*(1.0 - nabla); } else if (signui < 0.0) @@ -246,6 +257,8 @@ Real parallelGodunovEikonalScheme< tnlGrid< 2, MeshReal, Device, MeshIndex >, Re nabla = sqrt (xf*xf + xb*xb + yf*yf + yb*yb ); + if(fabs(1.0-nabla) < acc) + return 0.0; return signui*(1.0 - nabla); } else -- GitLab