Ice Sheet System Model  4.18
Code documentation
Main.cpp
Go to the documentation of this file.
1 #include "../../c/main/issm.h"
2 #include <cstddef>
3 #include <stdio.h>
4 
5 //Android specific header includes:
6 #include <jni.h>
7 #include <android/log.h>
8 #include <android/log.h>
9 
10 //iOS specific header includes:
11 
13 {
14  /*Global variables{{{*/
16  double* xyz; /*keep vertices information here*/
17  /*}}}*/
18  jint Initialize(JNIEnv *env, jclass clazz, jstring jsolution_type, jstring jabsfile, jstring jrelfile) /*{{{*/
19  {
20 
21  /*arguments to constructor: */
22  int argc; //arguments to constructor.
23  char** argv = NULL;
24  const char* issmname = "issm.exe";
25  char *solution_type = NULL;
26  char *absfile = NULL;
27  char *relfile = NULL;
28  ISSM_MPI_Comm comm=1;
29 
30  /*log:*/
31  __android_log_print(ANDROID_LOG_INFO, "Native","Initializing FemModel");
32 
33  /*retrieve from java machine: */
34  solution_type = (char*)env->GetStringUTFChars(jsolution_type,0);
35  absfile = (char*)env->GetStringUTFChars(jabsfile,0);
36  relfile = (char*)env->GetStringUTFChars(jrelfile,0);
37 
38  /*creat arguments to call constructor for FemModel: */
39  argc=4;
40  argv=(char**)malloc(argc*sizeof(char*));
41  argv[0]=(char*)issmname;
42  argv[1]=solution_type;
43  argv[2]=absfile;
44  argv[3]=relfile;
45 
46  /*call Model constructor passing in infile as File Descriptor parameter.*/
47  fm = new FemModel(argc,argv,comm);
48 
49  /*we'll need the toolkits activated right away to use matrices: */
50  ToolkitsOptionsFromAnalysis(fm->parameters,NoneAnalysisEnum);
51 
52  /*release strings: */
53  env->ReleaseStringUTFChars(jsolution_type, solution_type); //must realease the char*
54  env->ReleaseStringUTFChars(jabsfile, absfile); //must realease the char*
55  env->ReleaseStringUTFChars(jrelfile, relfile); //must realease the char*
56 
57  /*figure out size of solution: */
58  __android_log_print(ANDROID_LOG_INFO, "Native","Number of elements");
59  jint size = (jint) fm->elements->NumberOfElements();
60 
61  /*retrieve vertices x,y and z coordinates: */
62  __android_log_print(ANDROID_LOG_INFO, "Native","Retrieving vertices");
63  xyz=fm->vertices->ToXYZ();
64 
65  /*log: */
66  __android_log_print(ANDROID_LOG_INFO, "Native","Done Initializing FemModel");
67 
68  return size;
69 
70  }
71  /*}}}*/
72  void Solve(JNIEnv *env, jclass clazz , jdouble alpha, jobject buf){ /*{{{*/
73 
74  int i,count;
75  double x1,y1,z1,vel1;
76  double x2,y2,z2,vel2;
77  double x3,y3,z3,vel3;
78  int v1,v2,v3,eid;
79  Patch* patch=NULL;
80 
81  /*log:*/
82  __android_log_print(ANDROID_LOG_INFO, "Native","Solving ");
83 
84  /*retrieve buffer: */
85  jdouble *dBuf = (jdouble *)env->GetDirectBufferAddress(buf);
86 
87  /*reset basal friction to what it was before: */
88  __android_log_print(ANDROID_LOG_INFO, "Native","alpha %g ",alpha);
89 
90  __android_log_print(ANDROID_LOG_INFO, "Native","ok-1");
91 
93  __android_log_print(ANDROID_LOG_INFO, "Native","ok0");
94 
95  /*now scale friction by alpha: */
97  __android_log_print(ANDROID_LOG_INFO, "Native","ok1");
98 
99  /*solve: */
100  fm -> Solve();
101  __android_log_print(ANDROID_LOG_INFO, "Native","ok2");
102 
103  /*retrieve results: */
104  __android_log_print(ANDROID_LOG_INFO, "Native","Retrieving results ");
105  //fm->elements->ProcessResultsUnits(); we are now in SI units
106  patch=fm->elements->ResultsToPatch();
107 
108  /*sort out the velocities: */
109  for(i=0;i<patch->numrows;i++){
110  if ((patch->values[i*patch->numcols+0])==VelEnum){
111 
112  /*Each row of the Patch object is made of the following information:
113  - the result enum_type,
114  - the step and time,
115  - the id of the element,
116  - the interpolation type,
117  - the vertices ids,
118  - and the values at the nodes (could be different from the vertices)
119  */
120  eid=(int)patch->values[i*patch->numcols+3]-1;
121  v1=(int)patch->values[i*patch->numcols+5];
122  x1=xyz[3*(v1-1)+0]; y1=xyz[3*(v1-1)+1]; z1=xyz[3*(v1-1)+2];
123 
124  v2=(int)patch->values[i*patch->numcols+6];
125  x2=xyz[3*(v2-1)+0]; y2=xyz[3*(v2-1)+1]; z2=xyz[3*(v2-1)+2];
126 
127  v3=(int)patch->values[i*patch->numcols+7];
128  x3=xyz[3*(v3-1)+0]; y3=xyz[3*(v3-1)+1]; z3=xyz[3*(v3-1)+2];
129 
130  vel1=patch->values[i*patch->numcols+8];
131  vel2=patch->values[i*patch->numcols+9];
132  vel3=patch->values[i*patch->numcols+10];
133 
134  /*plug into dBuf: */
135  /*vertex 1: */
136  dBuf[12*eid+0]=x1;
137  dBuf[12*eid+1]=y1;
138  dBuf[12*eid+2]=z1;
139 
140  /*vertex 2: */
141  dBuf[12*eid+3]=x2;
142  dBuf[12*eid+4]=y2;
143  dBuf[12*eid+5]=z2;
144 
145  /*vertex 3: */
146  dBuf[12*eid+6]=x3;
147  dBuf[12*eid+7]=y3;
148  dBuf[12*eid+8]=z3;
149 
150  /*values at 3 vertices: */
151  dBuf[12*eid+9]=vel1;
152  dBuf[12*eid+10]=vel2;
153  dBuf[12*eid+11]=vel3;
154 
155  }
156  }
157 
158  /*for(i=0;i<148;i++){
159  __android_log_print(ANDROID_LOG_INFO, "Native","%g %g %g | %g %g %g | %g %g %g | %g %g %g\n",
160  dBuf[12*i+0],dBuf[12*i+1],dBuf[12*i+2],
161  dBuf[12*i+3],dBuf[12*i+4],dBuf[12*i+5],
162  dBuf[12*i+6],dBuf[12*i+7],dBuf[12*i+8],
163  dBuf[12*i+9],dBuf[12*i+10],dBuf[12*i+11]);
164  }*/
165 
166  /*delete temporary data:*/
167  delete patch;
168 
169  }/*}}}*/
170  static JNINativeMethod method_table[] = /*{{{*/
171  {
172  {"createISSMModel" ,"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I" , (void *) Initialize},
173  {"solveISSMModel", "(DLjava/nio/DoubleBuffer;)V", (void *) Solve}
174  };
175  /*}}}*/
176 }
177 
178 using namespace gov_nasa_jpl_issm;
179 extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) /*{{{*/
180 {
181  JNIEnv* env;
182  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
183  return -1;
184  }
185  else
186  {
187  jclass clazz = env->FindClass("gov/nasa/jpl/issm/IssmJni");
188  if(clazz)
189  {
190  env->RegisterNatives(clazz, method_table, 3);
191  env->DeleteLocalRef(clazz);
192  return JNI_VERSION_1_6;
193  }
194  else return -1;
195  }
196 }
197 /*}}}*/
FrictionCoefficientEnum
@ FrictionCoefficientEnum
Definition: EnumDefinitions.h:574
FemModel::vertices
Vertices * vertices
Definition: FemModel.h:49
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
ToolkitsOptionsFromAnalysis
void ToolkitsOptionsFromAnalysis(Parameters *parameters, int analysis_type)
gov_nasa_jpl_issm::xyz
double * xyz
Definition: Main.cpp:16
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
FemModel::materials
Materials * materials
Definition: FemModel.h:45
alpha
IssmDouble alpha(IssmDouble x, IssmDouble y, IssmDouble z, int testid)
Definition: fsanalyticals.cpp:221
InputDuplicatex
void InputDuplicatex(FemModel *femmodel, int original_enum, int new_enum)
Definition: InputDuplicatex.cpp:10
FemModel::loads
Loads * loads
Definition: FemModel.h:54
FemModel::elements
Elements * elements
Definition: FemModel.h:44
FemModel
Definition: FemModel.h:31
AndroidFrictionCoefficientEnum
@ AndroidFrictionCoefficientEnum
Definition: EnumDefinitions.h:976
gov_nasa_jpl_issm::Solve
void Solve(JNIEnv *env, jclass clazz, jdouble alpha, jobject buf)
Definition: Main.cpp:72
gov_nasa_jpl_issm
Definition: Main.cpp:13
ISSM_MPI_Comm
int ISSM_MPI_Comm
Definition: issmmpi.h:118
gov_nasa_jpl_issm::method_table
static JNINativeMethod method_table[]
Definition: Main.cpp:170
VelEnum
@ VelEnum
Definition: EnumDefinitions.h:844
Elements::NumberOfElements
int NumberOfElements(void)
Definition: Elements.cpp:67
gov_nasa_jpl_issm::fm
FemModel * fm
Definition: Main.cpp:15
JNI_OnLoad
jint JNI_OnLoad(JavaVM *vm, void *reserved)
Definition: Main.cpp:179
gov_nasa_jpl_issm::Initialize
jint Initialize(JNIEnv *env, jclass clazz, jstring jsolution_type, jstring jabsfile, jstring jrelfile)
Definition: Main.cpp:18