Ignore:
Timestamp:
05/12/23 11:34:43 (14 months ago)
Author:
ymipsl
Message:

Modification in remaper to fix problems with non convex cells.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS2/trunk/extern/remap/src/meshutil.cpp

    r2398 r2500  
    1111using namespace std; 
    1212 
    13 double computePolygoneArea(Elt& a, const Coord &pole) 
     13void computePolygonGeometry(Elt& a, const Coord &pole, double& area, Coord& bary) 
    1414{ 
    1515  using N = uint32_t; 
     
    4949  vector<N> indices_a_gno = mapbox::earcut<N>(polyline); 
    5050   
    51   double area_a_gno=0 ; 
     51  area=0 ; 
    5252  for(int i=0;i<indices_a_gno.size()/3;++i) 
    5353    { 
     
    5555      Coord x1 = Ox * polyline[0][indices_a_gno[3*i+1]][0] + Oy* polyline[0][indices_a_gno[3*i+1]][1] + Oz ; 
    5656      Coord x2 = Ox * polyline[0][indices_a_gno[3*i+2]][0] + Oy* polyline[0][indices_a_gno[3*i+2]][1] + Oz ; 
    57       area_a_gno+=triarea(x0 * (1./norm(x0)),x1* (1./norm(x1)), x2* (1./norm(x2))) ; 
    58     } 
    59  
     57      area+=triarea(x0 * (1./norm(x0)),x1* (1./norm(x1)), x2* (1./norm(x2))) ; 
     58    } 
     59 
     60 
     61  bary = exact_barycentre(dstPolygon.data(),na) ; 
     62   
     63  // check signed area 
     64  double signedArea = 0 ; 
     65  for(int n=0; n<na;n++) signedArea+= a_gno[n].x*a_gno[(n+1)%na].y-a_gno[(n+1)%na].x*a_gno[n].y ; 
     66  if (signedArea<0)  
     67  { 
     68    bary = bary * (-1.) ; 
     69    switchOrientation(a.n, a.vertex,a.edge,a.d) ; 
     70  } 
     71   
    6072  vect_points.clear(); 
    6173  polyline.clear(); 
    6274  indices_a_gno.clear(); 
    63   return area_a_gno ; 
     75 
    6476} 
    6577 
     
    6779void cptEltGeom(Elt& elt, const Coord &pole) 
    6880{ 
    69   orient(elt.n, elt.vertex, elt.edge, elt.d, elt.x); 
    70   normals(elt, pole); 
    71   Coord gg; 
    72   elt.area = airbar(elt.n, elt.vertex, elt.edge, elt.d, pole, gg); 
    73   elt.x = gg; 
     81   orient(elt.n, elt.vertex, elt.edge, elt.d, elt.x); 
     82   normals(elt, pole); 
     83//  Coord gg; 
     84//  elt.area = airbar(elt.n, elt.vertex, elt.edge, elt.d, pole, gg); 
     85//  elt.x = gg; 
    7486// overwrite area computation  
    7587 
    76   elt.area =  computePolygoneArea(elt, pole) ; 
     88   computePolygonGeometry(elt, pole, elt.area, elt.x) ; 
     89   normals(elt, pole); 
     90 
    7791} 
    7892 
Note: See TracChangeset for help on using the changeset viewer.