Changeset 2538


Ignore:
Timestamp:
07/24/23 11:55:12 (10 months ago)
Author:
jderouillat
Message:

Backport 2506 : limitation of number of vertex max in remaper

Location:
XIOS3/trunk/extern/remap/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/extern/remap/src/elt.hpp

    r1614 r2538  
    33#include <list> 
    44#include "triple.hpp" 
     5#include <vector> 
    56 
    6 #define NMAX 10 /**< maximum number of vertices for polygons */ 
     7#define NMAX 0 /**< maximum number of vertices for polygons */ 
    78 
    89#define NOT_FOUND -1 
     
    5859        { 
    5960                int k = 0; 
     61                vertex.resize(max_num_vert) ; 
    6062                vertex[k++] = xyz(bounds_lon[0], bounds_lat[0]); 
    6163                for (int i = 1; i < max_num_vert; i++) 
     
    7274                } 
    7375                n = k; 
    74                 x = barycentre(vertex, n); 
     76    vertex.resize(n) ; 
     77    vertex.shrink_to_fit(); 
     78          allocate() ; 
     79 
     80                x = barycentre(vertex.data(), n); 
    7581        } 
    76  
     82  void allocate(void) 
     83  { 
     84    vertex.resize(n) ; 
     85    neighbour.resize(n) ; 
     86    d.resize(n) ; 
     87    edge.resize(n) ; 
     88    gradNeigh.resize(n) ; 
     89    neighId.resize(n) ; 
     90  } 
    7791        Elt& operator=(const Elt& rhs) 
    7892        { 
     
    87101                is   = rhs.is; 
    88102 
    89                 for(int i = 0; i < NMAX; i++) 
    90                 { 
    91                         neighbour[i] = rhs.neighbour[i]; 
    92                         d[i]         = rhs.d[i]; 
    93                         edge[i]      = rhs.edge[i]; 
    94                         vertex[i]    = rhs.vertex[i]; 
    95                         gradNeigh[i] = rhs.gradNeigh[i]; 
    96                 } 
     103                neighbour = rhs.neighbour; 
     104                d         = rhs.d; 
     105                edge      = rhs.edge; 
     106                vertex    = rhs.vertex; 
     107                gradNeigh = rhs.gradNeigh; 
    97108                return *this; 
    98109        } 
     
    109120  void insert_vertex(int i, const Coord& v) 
    110121  { 
     122    vertex.resize(n+1) ; 
     123    edge.resize(n+1) ; 
     124    d.resize(n+1) ; 
     125    neighbour.resize(n+1) ; 
     126    gradNeigh.resize(n+1) ; 
     127    neighId.resize(n+1) ; 
     128 
    111129    for(int j=n; j > i ; j--) 
    112130    { 
     
    120138  } 
    121139   
    122         int neighbour[NMAX]; 
    123         double d[NMAX]; /**< distance of centre of small circle to origin, zero if great circle */ 
     140        std::vector<int> neighbour; 
     141        std::vector<double> d; /**< distance of centre of small circle to origin, zero if great circle */ 
    124142        double val;     /**< value (sample if src element, interpolated if dest element) */ 
    125         Coord vertex[NMAX]; 
    126         Coord edge[NMAX]; /**< edge normals: if great circle tangential to sphere, if small circle parallel to pole */ 
     143        std::vector<Coord> vertex; 
     144        std::vector<Coord> edge; /**< edge normals: if great circle tangential to sphere, if small circle parallel to pole */ 
    127145        Coord grad;    /**< gradient of the reconstructed linear function over this element */ 
    128         Coord gradNeigh[NMAX]; /**< for weight computation: gradients for val=1 at individual neighbours */ 
    129         struct GloId neighId[NMAX]; /**< weight computation needs to know global IDs for all sources with "link" */ 
     146        std::vector<Coord> gradNeigh; /**< for weight computation: gradients for val=1 at individual neighbours */ 
     147        std::vector<struct GloId> neighId; /**< weight computation needs to know global IDs for all sources with "link" */ 
    130148        std::list<Polyg*> is; /**< intersections */ 
    131149}; 
  • XIOS3/trunk/extern/remap/src/intersection_ym.cpp

    r2269 r2538  
    4747  Coord *b_gno   = new Coord[nb]; 
    4848 
    49   Coord OC=barycentre(a->vertex,a->n) ; 
     49  Coord OC=barycentre(a->vertex.data(),a->n) ; 
    5050  Coord Oz=OC ; 
    5151  Coord Ox=crossprod(Coord(0,0,1),Oz) ; 
  • XIOS3/trunk/extern/remap/src/libmapper.cpp

    r1639 r2538  
    138138extern "C" void remap_get_weights(double* weights, int* src_indices, int* dst_indices) 
    139139{ 
    140         memcpy(weights, mapper->remapMatrix, mapper->nWeights*sizeof(double)); 
    141         memcpy(src_indices, mapper->srcAddress, mapper->nWeights*sizeof(int)); 
    142         memcpy(dst_indices, mapper->dstAddress, mapper->nWeights*sizeof(int)); 
     140        memcpy(weights, mapper->remapMatrix.data(), mapper->nWeights*sizeof(double)); 
     141        memcpy(src_indices, mapper->srcAddress.data(), mapper->nWeights*sizeof(int)); 
     142        memcpy(dst_indices, mapper->dstAddress.data(), mapper->nWeights*sizeof(int)); 
    143143        delete mapper; 
    144144} 
  • XIOS3/trunk/extern/remap/src/mapper.cpp

    r2269 r2538  
    154154      nIntersections++; 
    155155  } 
     156 
    156157  /* overallocate for NMAX neighbours for each elements */ 
     158/* 
    157159  remapMatrix = new double[nIntersections*NMAX]; 
    158160  srcAddress = new int[nIntersections*NMAX]; 
     
    161163  sourceWeightId =new long[nIntersections*NMAX]; 
    162164  targetWeightId =new long[nIntersections*NMAX]; 
    163  
     165*/ 
    164166 
    165167  if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; 
     
    195197 
    196198  int *nbSendElement = new int[mpiSize]; 
     199  int *nbSendVertex = new int[mpiSize]; 
    197200  int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 
    198201  double **recvValue = new double*[mpiSize]; 
    199202  double **recvArea = new double*[mpiSize]; 
    200203  double **recvGivenArea = new double*[mpiSize]; 
     204  int **recvVertexOffset = new int*[mpiSize]; 
    201205  Coord **recvGrad = new Coord*[mpiSize]; 
    202206  GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ 
     
    219223    { 
    220224      sendElement[rank] = new int[nbSendElement[rank]]; 
    221       recvValue[rank]   = new double[nbSendElement[rank]]; 
    222       recvArea[rank]    = new double[nbSendElement[rank]]; 
    223       recvGivenArea[rank] = new double[nbSendElement[rank]]; 
    224       if (order == 2) 
    225       { 
    226         recvNeighIds[rank] = new GloId[nbSendElement[rank]*(NMAX+1)]; 
    227         recvGrad[rank]    = new Coord[nbSendElement[rank]*(NMAX+1)]; 
    228       } 
    229       else 
    230         recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
    231  
    232225      last = -1; 
    233226      index = -1; 
     
    244237  /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 
    245238  int *nbRecvElement = new int[mpiSize]; 
     239  int *nbRecvVertex = new int[mpiSize]; 
    246240  MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 
    247241 
     
    253247  double **sendArea = new double*[mpiSize]; 
    254248  double **sendGivenArea = new double*[mpiSize]; 
     249  int    **sendVertexOffset = new int*[mpiSize]; 
    255250  Coord **sendGrad = new Coord*[mpiSize]; 
    256251  GloId **sendNeighIds = new GloId*[mpiSize]; 
    257   MPI_Request *sendRequest = new MPI_Request[5*mpiSize]; 
    258   MPI_Request *recvRequest = new MPI_Request[5*mpiSize]; 
     252  MPI_Request *sendRequest = new MPI_Request[6*mpiSize]; 
     253  MPI_Request *recvRequest = new MPI_Request[6*mpiSize]; 
    259254  for (int rank = 0; rank < mpiSize; rank++) 
    260255  { 
     
    268263    { 
    269264      recvElement[rank] = new int[nbRecvElement[rank]]; 
     265      MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     266      nbRecvRequest++; 
     267    } 
     268  } 
     269  MPI_Status *status = new MPI_Status[6*mpiSize]; 
     270   
     271  MPI_Waitall(nbSendRequest, sendRequest, status); 
     272  MPI_Waitall(nbRecvRequest, recvRequest, status); 
     273 
     274  nbSendRequest = 0; 
     275  nbRecvRequest = 0; 
     276 
     277  for (int rank = 0; rank < mpiSize; rank++) 
     278  { 
     279    if (nbRecvElement[rank] > 0) 
     280    { 
     281      nbRecvVertex[rank]=0 ; 
     282      for (int j = 0; j < nbRecvElement[rank]; j++) nbRecvVertex[rank]+=sstree.localElements[recvElement[rank][j]].n+1; 
     283      MPI_Issend(&nbRecvVertex[rank], 1, MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     284      nbSendRequest++; 
     285    } 
     286   
     287    if (nbSendElement[rank] > 0) 
     288    { 
     289      MPI_Irecv(&nbSendVertex[rank], 1, MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     290      nbRecvRequest++; 
     291    } 
     292  } 
     293   
     294  MPI_Waitall(nbSendRequest, sendRequest, status); 
     295  MPI_Waitall(nbRecvRequest, recvRequest, status); 
     296 
     297 
     298  /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
     299  nbSendRequest = 0; 
     300  nbRecvRequest = 0; 
     301  for (int rank = 0; rank < mpiSize; rank++) 
     302  { 
     303    if (nbRecvElement[rank] > 0) 
     304    { 
    270305      sendValue[rank]   = new double[nbRecvElement[rank]]; 
    271306      sendArea[rank]   = new double[nbRecvElement[rank]]; 
    272307      sendGivenArea[rank] = new double[nbRecvElement[rank]]; 
     308      sendVertexOffset[rank] = new int[nbRecvElement[rank]]; 
     309 
    273310      if (order == 2) 
    274311      { 
    275         sendNeighIds[rank] = new GloId[nbRecvElement[rank]*(NMAX+1)]; 
    276         sendGrad[rank]    = new Coord[nbRecvElement[rank]*(NMAX+1)]; 
    277       } 
    278       else 
    279       { 
    280         sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
    281       } 
    282       MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    283       nbRecvRequest++; 
    284     } 
    285   } 
    286   MPI_Status *status = new MPI_Status[5*mpiSize]; 
    287    
    288   MPI_Waitall(nbSendRequest, sendRequest, status); 
    289         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    290  
    291   /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
    292   nbSendRequest = 0; 
    293   nbRecvRequest = 0; 
    294   for (int rank = 0; rank < mpiSize; rank++) 
    295   { 
    296     if (nbRecvElement[rank] > 0) 
    297     { 
     312        sendNeighIds[rank] = new GloId[nbRecvVertex[rank]]; 
     313        sendGrad[rank]    = new Coord[nbRecvVertex[rank]]; 
     314      } 
     315      else sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
     316 
    298317      int jj = 0; // jj == j if no weight writing 
     318      sendVertexOffset[rank][0]=0 ; 
    299319      for (int j = 0; j < nbRecvElement[rank]; j++) 
    300320      { 
     
    302322        sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 
    303323        sendGivenArea[rank][j] = sstree.localElements[recvElement[rank][j]].given_area; 
     324         
     325        if (j==0)  
     326        { 
     327          if (order==2) sendVertexOffset[rank][j]=sstree.localElements[recvElement[rank][j]].n+1 ; 
     328          else sendVertexOffset[rank][j]=1 ; 
     329        } 
     330        else  
     331        { 
     332          if (order == 2) sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+sstree.localElements[recvElement[rank][j]].n+1 ; 
     333          else sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+1 ; 
     334        } 
     335 
    304336        if (order == 2) 
    305337        { 
     
    308340          sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 
    309341          jj++; 
    310           for (int i = 0; i < NMAX; i++) 
     342          for (int i = 0; i <  sstree.localElements[recvElement[rank][j]].n ; i++) 
    311343          { 
    312344            sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; 
     
    325357      MPI_Issend(sendGivenArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    326358      nbSendRequest++; 
     359      MPI_Issend(sendVertexOffset[rank],  nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     360      nbSendRequest++; 
     361 
    327362      if (order == 2) 
    328363      { 
    329         MPI_Issend(sendGrad[rank], 3*nbRecvElement[rank]*(NMAX+1), MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     364        MPI_Issend(sendGrad[rank], 3*nbRecvVertex[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    330365        nbSendRequest++; 
    331         MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     366        MPI_Issend(sendNeighIds[rank], 4*nbRecvVertex[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    332367//ym  --> attention taille GloId 
    333368        nbSendRequest++; 
     
    342377    if (nbSendElement[rank] > 0) 
    343378    { 
     379      recvValue[rank]   = new double[nbSendElement[rank]]; 
     380      recvArea[rank]    = new double[nbSendElement[rank]]; 
     381      recvGivenArea[rank] = new double[nbSendElement[rank]]; 
     382      recvVertexOffset[rank] = new int[nbSendElement[rank]]; 
     383 
     384      if (order == 2) 
     385      { 
     386        recvNeighIds[rank] = new GloId[nbSendVertex[rank]]; 
     387        recvGrad[rank]     = new Coord[nbSendVertex[rank]]; 
     388      } 
     389      else recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
     390 
     391 
    344392      MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    345393      nbRecvRequest++; 
     
    348396      MPI_Irecv(recvGivenArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    349397      nbRecvRequest++; 
     398      MPI_Irecv(recvVertexOffset[rank],  nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     399      nbRecvRequest++; 
     400 
    350401      if (order == 2) 
    351402      { 
    352         MPI_Irecv(recvGrad[rank], 3*nbSendElement[rank]*(NMAX+1), 
    353             MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     403        MPI_Irecv(recvGrad[rank], 3*nbSendVertex[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    354404        nbRecvRequest++; 
    355         MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     405        MPI_Irecv(recvNeighIds[rank], 4*nbSendVertex[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    356406//ym  --> attention taille GloId 
    357407        nbRecvRequest++; 
     
    366416  } 
    367417         
    368         MPI_Waitall(nbSendRequest, sendRequest, status); 
     418  MPI_Waitall(nbSendRequest, sendRequest, status); 
    369419  MPI_Waitall(nbRecvRequest, recvRequest, status); 
    370420   
     
    397447 
    398448      /* first order: src value times weight (weight = supermesh area), later divide by target area */ 
    399       int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
    400       GloId neighID = recvNeighIds[rank][kk]; 
     449//      int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
     450      int offset ; 
     451      int nvertex ; 
     452      if (n1==0)  
     453      { 
     454        offset=0 ; 
     455        nvertex=recvVertexOffset[rank][0] ; 
     456      } 
     457      else  
     458      { 
     459        offset = recvVertexOffset[rank][n1-1]; 
     460        nvertex = recvVertexOffset[rank][n1]-recvVertexOffset[rank][n1-1]; 
     461      } 
     462 
     463      GloId neighID = recvNeighIds[rank][offset]; 
    401464      wgt_map[neighID] += w; 
    402465 
    403466      if (order == 2) 
    404467      { 
    405         for (int k = 0; k < NMAX+1; k++) 
     468        for (int k = 0; k < nvertex; k++) 
    406469        { 
    407           int kk = n1 * (NMAX + 1) + k; 
     470          int kk = offset + k; 
    408471          GloId neighID = recvNeighIds[rank][kk]; 
    409472          if (neighID.ind != -1)  wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); 
     
    423486    for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 
    424487    { 
    425       if (quantity)  this->remapMatrix[i] = (it->second ) / renorm; 
    426       else this->remapMatrix[i] = (it->second / e.area) / renorm; 
    427       this->srcAddress[i] = it->first.ind; 
    428       this->srcRank[i] = it->first.rank; 
    429       this->dstAddress[i] = j; 
    430       this->sourceWeightId[i]= it->first.globalId ; 
    431       this->targetWeightId[i]= targetGlobalId[j] ; 
     488      if (quantity)  this->remapMatrix.push_back((it->second ) / renorm); 
     489      else this->remapMatrix.push_back((it->second / e.area) / renorm); 
     490      this->srcAddress.push_back(it->first.ind); 
     491      this->srcRank.push_back(it->first.rank); 
     492      this->dstAddress.push_back(j); 
     493      this->sourceWeightId.push_back(it->first.globalId) ; 
     494      this->targetWeightId.push_back(targetGlobalId[j]) ; 
    432495      i++; 
    433496    } 
     
    443506      delete[] recvArea[rank]; 
    444507      delete[] recvGivenArea[rank]; 
     508      delete[] recvVertexOffset[rank]; 
    445509      if (order == 2) 
    446510      { 
     
    455519      delete[] sendArea[rank]; 
    456520      delete[] sendGivenArea[rank]; 
     521      delete[] sendVertexOffset[rank]; 
    457522      if (order == 2) 
    458523        delete[] sendGrad[rank]; 
     
    466531  delete[] nbSendElement; 
    467532  delete[] nbRecvElement; 
     533  delete[] nbSendVertex; 
     534  delete[] nbRecvVertex; 
    468535  delete[] sendElement; 
    469536  delete[] recvElement; 
     
    9561023Mapper::~Mapper() 
    9571024{ 
    958   delete [] remapMatrix; 
    959   delete [] srcAddress; 
    960   delete [] srcRank; 
    961   delete [] dstAddress; 
    962   delete [] sourceWeightId ; 
    963   delete [] targetWeightId ; 
    964   if (neighbourElements) delete [] neighbourElements; 
     1025  //delete [] remapMatrix; 
     1026  //delete [] srcAddress; 
     1027  //delete [] srcRank; 
     1028  //delete [] dstAddress; 
     1029  //delete [] sourceWeightId ; 
     1030  //delete [] targetWeightId ; 
     1031  //if (neighbourElements) delete [] neighbourElements; 
    9651032  CTimer::release() ; 
    9661033 } 
  • XIOS3/trunk/extern/remap/src/mapper.hpp

    r2269 r2538  
    4242*/ 
    4343       /* where weights are returned after call to `computeWeights` */ 
    44        double *remapMatrix; 
    45        int *srcAddress; 
    46        int *srcRank; 
    47        int *dstAddress; 
     44       std::vector<double> remapMatrix; 
     45       std::vector<int> srcAddress; 
     46       std::vector<int> srcRank; 
     47       std::vector<int> dstAddress; 
    4848       int nWeights; 
    49        long int* sourceWeightId ; 
    50        long int* targetWeightId ; 
     49       std::vector<long int> sourceWeightId ; 
     50       std::vector<long int> targetWeightId ; 
    5151 
    5252private: 
  • XIOS3/trunk/extern/remap/src/meshutil.cpp

    r2534 r2538  
    2424  Coord *a_gno   = new Coord[na]; 
    2525   
    26   Coord OC=barycentre(a.vertex,a.n) ; 
     26  Coord OC=barycentre(a.vertex.data(),a.n) ; 
    2727  Coord Oz=OC ; 
    2828  Coord Ox=crossprod(Coord(0,0,1),Oz) ; 
     
    6767  { 
    6868    bary = bary * (-1.) ; 
    69     switchOrientation(a.n, a.vertex,a.edge,a.d) ; 
     69    switchOrientation(a.n, a.vertex.data(),a.edge.data(),a.d.data()) ; 
    7070  } 
    7171   
     
    7979void cptEltGeom(Elt& elt, const Coord &pole) 
    8080{ 
    81    orient(elt.n, elt.vertex, elt.edge, elt.d, elt.x); 
     81   orient(elt.n, elt.vertex.data(), elt.edge.data(), elt.d.data(), elt.x); 
    8282   normals(elt, pole); 
    8383//  Coord gg; 
     
    205205    elts[j]->val = 0; 
    206206 
    207   Elt *neighbours[NMAX]; 
     207//  Elt *neighbours[NMAX]; 
    208208  for (int j = 0; j < N; j++) 
    209209  { 
     210    vector<Elt*> neighbours(elts[j]->n) ; 
     211 
    210212    for (int i = 0; i < elts[j]->n; i++)  
    211213      if ( elts[j]->neighbour[i]== NOT_FOUND) neighbours[i]=NULL ; // no neighbour 
     
    223225        /* for weight computation all values are always kept zero and only set to one when used .. */ 
    224226        neighbours[i]->val = 1; 
    225         elts[j]->gradNeigh[i] = gradient(*(elts[j]), neighbours); 
     227        elts[j]->gradNeigh[i] = gradient(*(elts[j]), neighbours.data()); 
    226228        /* .. and right after zeroed again */ 
    227229        neighbours[i]->val = 0; 
     
    234236    } 
    235237 
     238/*  not needed anymore 
    236239    for(int i = elts[j]->n ; i < NMAX; i++) 
    237240    { 
     
    239242      elts[j]->neighId[i].ind = -1; // mark end 
    240243    } 
     244*/ 
    241245    /* For the most naive algorithm the case where the element itself is one must also be considered. 
    242246       Thomas says this can later be optimized out. */ 
    243247    elts[j]->val = 1; 
    244     elts[j]->grad = gradient(*(elts[j]), neighbours); 
     248    elts[j]->grad = gradient(*(elts[j]), neighbours.data()); 
    245249    elts[j]->val = 0; 
    246250  } 
  • XIOS3/trunk/extern/remap/src/polyg.cpp

    r2537 r2538  
    304304  e.n = *((int *) & (buffer[pos])); 
    305305  pos += sizeof(int); 
    306  
     306   
     307  e.allocate() ; 
     308   
    307309  for (int i = 0; i < e.n; i++) 
    308310  { 
Note: See TracChangeset for help on using the changeset viewer.