Ice Sheet System Model  4.18
Code documentation
Functions
InterpFromMeshToMesh2dx.cpp File Reference
#include "./InterpFromMeshToMesh2dx.h"
#include "../../shared/shared.h"
#include "../../toolkits/toolkits.h"
#include "../../classes/classes.h"

Go to the source code of this file.

Functions

int InterpFromMeshToMesh2dx (double **pdata_interp, int *index_data, double *x_data, double *y_data, int nods_data, int nels_data, double *data, int M_data, int N_data, double *x_interp, double *y_interp, int N_interp, Options *options)
 

Function Documentation

◆ InterpFromMeshToMesh2dx()

int InterpFromMeshToMesh2dx ( double **  pdata_interp,
int *  index_data,
double *  x_data,
double *  y_data,
int  nods_data,
int  nels_data,
double *  data,
int  M_data,
int  N_data,
double *  x_interp,
double *  y_interp,
int  N_interp,
Options options 
)

Definition at line 16 of file InterpFromMeshToMesh2dx.cpp.

17  {
18 
19  #ifdef _HAVE_BAMG_
20 
21  /*Output*/
22  double* data_interp=NULL;
23 
24  /*Intermediary*/
25  double xmin,xmax,ymin,ymax;
26  bool isdefault;
27  double defaultvalue;
28  R2 r;
29  I2 I;
30  int i,j,k;
31  int it;
32  int i0,i1,i2;
33  double areacoord[3];
34  double aa,bb;
35  long long dete[3];
36  BamgOpts* bamgopts=new BamgOpts();//if necessary debug bamg::Mesh, set bamgopts->verbose>5
37 
38  /*Checks*/
39  if (M_data!=nods_data && M_data!=nels_data){
40  _error_("data provided should have either " << nods_data << " or " << nels_data << " lines (not " << M_data << ")");
41  }
42 
43  /*Get default*/
44  isdefault = false;
45  if(options){
46  if(options->GetOption("default")){
47  isdefault=true;
48  options->Get(&defaultvalue,"default");
49  }
50  }
51 
52  /*Initialize output*/
53  data_interp=xNew<double>(N_interp*N_data);
54 
55  /*read background mesh*/
56  bamgopts->verbose=0;
57  Mesh* Th=new Mesh(index_data,x_data,y_data,nods_data,nels_data,bamgopts);
58 
59  /*Get reference number (for subdomains)*/
60  long* reft = xNew<long>(Th->nbt);
61  Th->TriangleReferenceList(reft);
63 
64  /*Get domain boundaries*/
65  xmin=x_data[0]; ymin=y_data[0];
66  xmax=x_data[0]; ymax=y_data[0];
67  for(i=1;i<nods_data;i++){
68  if(x_data[i]<xmin) xmin=x_data[i];
69  if(x_data[i]>xmax) xmax=x_data[i];
70  if(y_data[i]<ymin) ymin=y_data[i];
71  if(y_data[i]>ymax) ymax=y_data[i];
72  }
73 
74  /*Create Single vertex to element connectivity*/
75  int* connectivity = xNew<int>(nods_data);
76  for(i=0;i<nels_data;i++){
77  for(j=0;j<3;j++){
78  k = index_data[i*3+j]-1;
79  _assert_(k>=0 & k<nods_data);
80  connectivity[k]=i;
81  }
82  }
83 
84  /*Loop over output nodes*/
85  for(i=0;i<N_interp;i++){
86  //if(i%100==0) _printf_("\r interpolation progress: "<<setw(6)<<setprecision(2)<<double(i)/double(N_interp)*100.<<"% ");
87 
88  if(isdefault){
89  if(x_interp[i]<xmin || x_interp[i]>xmax || y_interp[i]<ymin || y_interp[i]>ymax){
90  for(j=0;j<N_data;j++) data_interp[i*N_data+j]=defaultvalue;
91  continue;
92  }
93  }
94 
95  /*Get current point coordinates*/
96  r.x=x_interp[i]; r.y=y_interp[i];
97  I2 I=Th->R2ToI2(r);
98 
99  /*Find triangle holding r/I*/
100  Triangle &tb=*Th->TriangleFindFromCoord(I,dete);
101 
102  /*point inside convex*/
103  if (tb.det>0){
104 
105  /*Area coordinates*/
106  areacoord[0]= reCast<double>(dete[0])/reCast<double>(tb.det);
107  areacoord[1]= reCast<double>(dete[1])/reCast<double>(tb.det);
108  areacoord[2]= reCast<double>(dete[2])/reCast<double>(tb.det);
109  /*3 vertices of the triangle*/
110  i0=Th->GetId(tb[0]);
111  i1=Th->GetId(tb[1]);
112  i2=Th->GetId(tb[2]);
113  /*triangle number*/
114  it=Th->GetId(tb);
115 
116  /*Inside convex but outside mesh*/
117  if (reft[it]<0 && isdefault){
118  for(j=0;j<N_data;j++) data_interp[i*N_data+j]=defaultvalue;
119  continue;
120  }
121  }
122  //external point
123  else{
124  if(isdefault){
125  for(j=0;j<N_data;j++) data_interp[i*N_data+j]=defaultvalue;
126  continue;
127  }
128  else{
129  //Get closest adjacent triangle (inside the mesh)
130  AdjacentTriangle ta=CloseBoundaryEdge(I,&tb,aa,bb).Adj();
131  int k=ta;
132  Triangle &tc=*(Triangle*)ta;
133  //Area coordinate
134  areacoord[VerticesOfTriangularEdge[k][1]] = aa;
135  areacoord[VerticesOfTriangularEdge[k][0]] = bb;
136  areacoord[OppositeVertex[k]] = 1 - aa -bb;
137  //3 vertices of the triangle
138  i0=Th->GetId(tc[0]);
139  i1=Th->GetId(tc[1]);
140  i2=Th->GetId(tc[2]);
141  //triangle number
142  it=Th->GetId(tc);
143  }
144  }
145 
146  if (M_data==nods_data){
147  for (j=0;j<N_data;j++){
148  data_interp[i*N_data+j]=areacoord[0]*data[N_data*i0+j]+areacoord[1]*data[N_data*i1+j]+areacoord[2]*data[N_data*i2+j];
149  }
150  }
151  else{
152  /*For the P0 implementation*/
153  /*If we fall outside of the convex or outside of the mesh, return NaN*/
154  if(tb.det<0 || reft[it]<0){
155  _assert_(i0>=0 & i0<nods_data);
156  it=connectivity[i0]; //or i1 or i2
157  _assert_(it>=0 && it<nels_data);
158  for(j=0;j<N_data;j++) data_interp[i*N_data+j]=data[N_data*it+j];
159  }
160  else{
161  /*Inside the mesh!*/
162  if(it<0 || it>=nels_data){
163  _error_("Triangle number " << it << " not in [0 " << nels_data
164  << "], report bug to developers (interpolation point: " <<x_interp[i]<<" "<<y_interp[i]<<")");
165  }
166  for (j=0;j<N_data;j++) data_interp[i*N_data+j]=data[N_data*it+j];
167  }
168  }
169  }
170  //if(N_interp>=100) _printf_("\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<"% \n");
171 
172  /*clean-up and return*/
173  delete Th;
174  delete bamgopts;
175  xDelete<long>(reft);
176  xDelete<int>(connectivity);
177  *pdata_interp=data_interp;
178 
179  #else
180  _error_("Cannot interpolate without bamg support");
181  #endif
182  return 1;
183 }
bamg::Mesh::GetId
long GetId(const Triangle &t) const
Definition: Mesh.cpp:2608
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
BamgOpts::verbose
int verbose
Definition: BamgOpts.h:26
bamg::AdjacentTriangle::Adj
AdjacentTriangle Adj() const
Definition: AdjacentTriangle.cpp:28
bamg::Triangle
Definition: Triangle.h:13
bamg::AdjacentTriangle
Definition: AdjacentTriangle.h:12
bamg::Mesh::CreateSingleVertexToTriangleConnectivity
void CreateSingleVertexToTriangleConnectivity()
Definition: Mesh.h:121
BamgOpts
Definition: BamgOpts.h:8
bamg::Mesh::nbt
long nbt
Definition: Mesh.h:35
Options::Get
void Get(OptionType *pvalue, const char *name)
Definition: Options.h:21
bamg::Mesh
Definition: Mesh.h:21
Options::GetOption
Option * GetOption(const char *name)
Definition: Options.cpp:67
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
bamg::Triangle::det
long long det
Definition: Triangle.h:23
bamg::CloseBoundaryEdge
AdjacentTriangle CloseBoundaryEdge(I2 A, Triangle *t, double &a, double &b)
Definition: Mesh.cpp:4927
bamg::VerticesOfTriangularEdge
static const short VerticesOfTriangularEdge[3][2]
Definition: macros.h:13
bamg::Mesh::R2ToI2
I2 R2ToI2(const R2 &P) const
Definition: Mesh.cpp:3937
bamg::P2::x
R x
Definition: R2.h:15
bamg::Mesh::TriangleReferenceList
long TriangleReferenceList(long *) const
Definition: Mesh.cpp:4046
bamg::P2::y
R y
Definition: R2.h:15
bamg::P2< double, double >
bamg::Mesh::TriangleFindFromCoord
Triangle * TriangleFindFromCoord(const I2 &, long long[3], Triangle *tstart=0)
Definition: Mesh.cpp:3945
bamg::OppositeVertex
static const short OppositeVertex[3]
Definition: macros.h:15