Ice Sheet System Model  4.18
Code documentation
Data Structures | Functions
DistanceToMaskBoundaryx.h File Reference
#include "../../shared/shared.h"
#include "../../classes/classes.h"

Go to the source code of this file.

Data Structures

struct  DistanceToMaskBoundaryxThreadStruct
 

Functions

int DistanceToMaskBoundaryx (IssmDouble **pdistance, IssmDouble *x, IssmDouble *y, IssmDouble *mask, int nods)
 
void * DistanceToMaskBoundaryxt (void *vDistanceToMaskBoundaryxThreadStruct)
 

Function Documentation

◆ DistanceToMaskBoundaryx()

int DistanceToMaskBoundaryx ( IssmDouble **  pdistance,
IssmDouble x,
IssmDouble y,
IssmDouble mask,
int  nods 
)

Definition at line 12 of file DistanceToMaskBoundaryx.cpp.

12  {
13 
14  /*output: */
15  IssmDouble* distance;
16 
17  /*initialize: */
18  distance=xNew<IssmDouble>(nods);
19 
20  /*initialize thread parameters: */
22  gate.distance = distance;
23  gate.x = x;
24  gate.y = y;
25  gate.mask = mask;
26  gate.nods = nods;
27 
28  /*launch the thread manager with DistanceToMaskBoundaryxt as a core: */
29  LaunchThread(DistanceToMaskBoundaryxt,(void*)&gate,_NUMTHREADS_);
30 
31  /*Assign output pointers: */
32  *pdistance=distance;
33 
34  return 1;
35 }

◆ DistanceToMaskBoundaryxt()

void* DistanceToMaskBoundaryxt ( void *  vDistanceToMaskBoundaryxThreadStruct)

Definition at line 13 of file DistanceToMaskBoundaryxt.cpp.

13  {
14 
15  /*gate variables :*/
17  pthread_handle *handle = NULL;
18  int i,j,i0,i1;
19 
20  /*recover handle and gate: */
21  handle = (pthread_handle*)vpthread_handle;
23  int my_thread = handle->id;
24  int num_threads = handle->num;
25 
26  /*recover parameters :*/
27  int nods = gate->nods;
28  IssmDouble *distance = gate->distance;
29  IssmDouble *x = gate->x;
30  IssmDouble *y = gate->y;
31  IssmDouble *mask = gate->mask;
32 
33  /*distribute indices across threads :*/
34  PartitionRange(&i0,&i1,nods,num_threads,my_thread);
35 
36  /*Loop through vertices: */
37  for(i=i0;i<i1;i++){
38 
39  IssmDouble d0=1.e+10;
40  IssmDouble xi,yi;
41 
42  //recover vertex position:
43  xi=x[i]; yi=y[i];
44 
45  //figure out if we are inside the mask, or outside:
46  if(mask[i]==1){
47  //we are inside, look for nearest vertex that is outside the mask:
48  for(j=0;j<nods;j++){
49  if(j==i)continue;
50  if (mask[j]==0){
51  IssmDouble xj,yj,deltaphi,deltalambda,d;
52  xj=x[j]; yj=y[j];
53  /*figure out the distance to xi,yi in lat,long mode, using the greatest circle distance:*/
54  deltaphi=fabs(xj-xi); deltalambda=fabs(yj-yi);
55  d=2*asin(sqrt(pow(sin(deltaphi/2),2)+cos(xi)*cos(xj)*pow(sin(deltalambda/2),2)));
56  if(d<d0)d0=d;
57  }
58  }
59  distance[i]=d0;
60  }
61  else{
62  //we are outside, look for nearest vertex that is inside the mask:
63  for(j=0;j<nods;j++){
64  if(j==i)continue;
65  if (mask[j]==1){
66  IssmDouble xj,yj,deltaphi,deltalambda,d;
67  xj=x[j]; yj=y[j];
68  /*figure out the distance to xi,yi in lat,long mode, using the greatest circle distance:*/
69  deltaphi=fabs(xj-xi); deltalambda=fabs(yj-yi);
70  d=2*asin(sqrt(pow(sin(deltaphi/2),2)+cos(xi)*cos(xj)*pow(sin(deltalambda/2),2)));
71  if(d<d0)d0=d;
72  }
73  }
74  distance[i]=d0;
75  }
76  }
77 
78  return NULL;
79 }
IssmDouble
double IssmDouble
Definition: types.h:37
pthread_handle::id
int id
Definition: issm_threads.h:12
LaunchThread
void LaunchThread(void *function(void *), void *gate, int num_threads)
Definition: LaunchThread.cpp:25
pthread_handle::num
int num
Definition: issm_threads.h:13
DistanceToMaskBoundaryxt
void * DistanceToMaskBoundaryxt(void *vDistanceToMaskBoundaryxThreadStruct)
Definition: DistanceToMaskBoundaryxt.cpp:13
DistanceToMaskBoundaryxThreadStruct::y
IssmDouble * y
Definition: DistanceToMaskBoundaryx.h:17
DistanceToMaskBoundaryxThreadStruct::distance
IssmDouble * distance
Definition: DistanceToMaskBoundaryx.h:15
DistanceToMaskBoundaryxThreadStruct::mask
IssmDouble * mask
Definition: DistanceToMaskBoundaryx.h:18
pthread_handle
Definition: issm_threads.h:10
DistanceToMaskBoundaryxThreadStruct::nods
int nods
Definition: DistanceToMaskBoundaryx.h:14
PartitionRange
void PartitionRange(int *pi0, int *pi1, int num_el, int num_threads, int my_thread)
Definition: PartitionRange.cpp:13
DistanceToMaskBoundaryxThreadStruct::x
IssmDouble * x
Definition: DistanceToMaskBoundaryx.h:16
pthread_handle::gate
void * gate
Definition: issm_threads.h:11
DistanceToMaskBoundaryxThreadStruct
Definition: DistanceToMaskBoundaryx.h:12