Ice Sheet System Model  4.18
Code documentation
WritePythonData.cpp
Go to the documentation of this file.
1 /* \file WriteData.c:
2  * \brief: general interface for writing data
3  */
4 
5 #ifdef HAVE_CONFIG_H
6  #include <config.h>
7 #else
8 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9 #endif
10 
11 #define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol
12 #define NO_IMPORT
13 
14 #include "./pythonio.h"
15 #include "../../c/shared/shared.h"
16 
17 /*Primitive data types*/
18 /*FUNCTION WriteData(PyObject* py_tuple,int index,int integer){{{*/
19 void WriteData(PyObject* py_tuple, int index, int integer){
20 
21  #if _PYTHON_MAJOR_ >= 3
22  PyTuple_SetItem(py_tuple, index, PyLong_FromSsize_t((Py_ssize_t)integer));
23  #else
24  PyTuple_SetItem(py_tuple, index, PyInt_FromSsize_t((Py_ssize_t)integer));
25  #endif
26 
27 }/*}}}*/
28 /*FUNCTION WriteData(PyObject* py_tuple,int index,char* string){{{*/
29 void WriteData(PyObject* py_tuple, int index, char* string){
30 
31  PyTuple_SetItem(py_tuple, index, PyUnicode_FromString(string));
32 
33 }/*}}}*/
34 /*FUNCTION WriteData(PyObject* py_tuple,int index, double* matrix, int M, int N){{{*/
35 void WriteData(PyObject* tuple, int index, double* matrix, int M,int N){
36 
37  npy_intp dims[2]={0,0};
38  PyObject* array=NULL;
39 
40  /*copy matrix: */
41  double* matrix_python=xNew<double>(M*N);
42  memcpy(matrix_python,matrix,M*N*sizeof(double));
43 
44  dims[0]=(npy_intp)M;
45  dims[1]=(npy_intp)N;
46  array=PyArray_SimpleNewFromData(2,dims,NPY_DOUBLE,matrix_python);
47 
48  PyTuple_SetItem(tuple, index, array);
49 }/*}}}*/
50 /*FUNCTION WriteData(PyObject* py_tuple,int index, int* matrix, int M, int N){{{*/
51 void WriteData(PyObject* tuple, int index, int* matrix, int M,int N){
52 
53  npy_intp dims[2]={0,0};
54  PyObject* array=NULL;
55 
56  /*transform into long matrix: */
57  long* lmatrix=xNew<long>(M*N);
58  for(int i=0;i<M*N;i++)lmatrix[i]=(long)matrix[i];
59 
60  dims[0]=(npy_intp)M;
61  dims[1]=(npy_intp)N;
62  array=PyArray_SimpleNewFromData(2,dims,NPY_INT64,lmatrix);
63 
64  PyTuple_SetItem(tuple, index, array);
65 }/*}}}*/
66 /*FUNCTION WriteData(PyObject* py_tuple,int index, bool* matrix, int M, int N){{{*/
67 void WriteData(PyObject* tuple, int index, bool* matrix, int M,int N){
68 
69  npy_intp dims[2]={0,0};
70  PyObject* array=NULL;
71 
72  /*copy matrix: */
73  bool* matrix_python=xNew<bool>(M*N);
74  memcpy(matrix_python,matrix,M*N*sizeof(bool));
75 
76  dims[0]=(npy_intp)M;
77  dims[1]=(npy_intp)N;
78  array=PyArray_SimpleNewFromData(2,dims,NPY_BOOL,matrix_python);
79 
80  PyTuple_SetItem(tuple, index, array);
81 }/*}}}*/
82 /*FUNCTION WriteData(PyObject* py_tuple,int index, double* vector, int M){{{*/
83 void WriteData(PyObject* py_tuple, int index, double* vector, int M){
84 
85  npy_intp dim = 10;
86  PyObject *array = NULL;
87 
88 
89  /*copy vector: */
90  double* vector_python=xNew<double>(M);
91  memcpy(vector_python,vector,M*sizeof(double));
92 
93  dim=(npy_intp)M;
94  array=PyArray_SimpleNewFromData(1,&dim,NPY_DOUBLE,vector_python);
95 
96  PyTuple_SetItem(py_tuple, index, array);
97 
98 }/*}}}*/
99 /*FUNCTION WriteData(PyObject* py_tuple,int index, short* vector, int M){{{*/
100 void WriteData(PyObject* py_tuple, int index,short* vector, int M){
101 
102  long* lvector=NULL;
103  npy_intp dim=10;
104  PyObject* array=NULL;
105 
106  /*transform into long matrix: */
107  lvector=xNew<long>(M);
108  for(int i=0;i<M;i++)lvector[i]=(long)vector[i];
109 
110  dim=(npy_intp)M;
111  array=PyArray_SimpleNewFromData(1,&dim,NPY_INT64,lvector);
112 
113  PyTuple_SetItem(py_tuple, index, array);
114 
115 }/*}}}*/
116 /*FUNCTION WriteData(PyObject* py_tuple,int index, int* vector, int M){{{*/
117 void WriteData(PyObject* py_tuple, int index, int* vector, int M){
118 
119  long* lvector=NULL;
120  npy_intp dim=10;
121  PyObject* array=NULL;
122 
123  /*transform into long matrix: */
124  lvector=xNew<long>(M);
125  for(int i=0;i<M;i++)lvector[i]=(long)vector[i];
126 
127  dim=(npy_intp)M;
128  array=PyArray_SimpleNewFromData(1,&dim,NPY_INT64,lvector);
129 
130  PyTuple_SetItem(py_tuple, index, array);
131 
132 }/*}}}*/
133 /*FUNCTION WriteData(PyObject* py_tuple,int index){{{*/
134 void WriteData(PyObject* py_tuple, int index){
135 
136  PyTuple_SetItem(py_tuple, index, Py_None);
137 
138 }/*}}}*/
139 
140 /*ISSM objects*/
141 /*FUNCTION WriteData(PyObject* py_tuple,int index,BamgGeom* bamggeom){{{*/
142 void WriteData(PyObject* py_tuple,int index,BamgGeom* bamggeom){
143 
144  PyObject* dict=NULL;
145 
146  dict=PyDict_New();
147 
148  PyDict_SetItemString(dict,"Vertices",PyArrayFromCopiedData(bamggeom->VerticesSize,bamggeom->Vertices));
149  PyDict_SetItemString(dict,"Edges",PyArrayFromCopiedData(bamggeom->EdgesSize,bamggeom->Edges));
150  PyDict_SetItemString(dict,"TangentAtEdges",PyArrayFromCopiedData(bamggeom->TangentAtEdgesSize,bamggeom->TangentAtEdges));
151  PyDict_SetItemString(dict,"Corners",PyArrayFromCopiedData(bamggeom->CornersSize,bamggeom->Corners));
152  PyDict_SetItemString(dict,"RequiredVertices",PyArrayFromCopiedData(bamggeom->RequiredVerticesSize,bamggeom->RequiredVertices));
153  PyDict_SetItemString(dict,"RequiredEdges",PyArrayFromCopiedData(bamggeom->RequiredEdgesSize,bamggeom->RequiredEdges));
154  PyDict_SetItemString(dict,"CrackedEdges",PyArrayFromCopiedData(bamggeom->CrackedEdgesSize,bamggeom->CrackedEdges));
155  PyDict_SetItemString(dict,"SubDomains",PyArrayFromCopiedData(bamggeom->SubDomainsSize,bamggeom->SubDomains));
156 
157  PyTuple_SetItem(py_tuple, index, dict);
158 }
159 /*}}}*/
160 /*FUNCTION WriteData(PyObject* py_tuple,int index,BamgMesh* bamgmesh){{{*/
161 void WriteData(PyObject* py_tuple,int index,BamgMesh* bamgmesh){
162 
163  PyObject* dict=NULL;
164 
165  dict=PyDict_New();
166 
167  PyDict_SetItemString(dict,"Vertices",PyArrayFromCopiedData(bamgmesh->VerticesSize,bamgmesh->Vertices));
168  PyDict_SetItemString(dict,"Edges",PyArrayFromCopiedData(bamgmesh->EdgesSize,bamgmesh->Edges));
169  PyDict_SetItemString(dict,"Triangles",PyArrayFromCopiedData(bamgmesh->TrianglesSize,bamgmesh->Triangles));
170  PyDict_SetItemString(dict,"IssmEdges",PyArrayFromCopiedData(bamgmesh->IssmEdgesSize,bamgmesh->IssmEdges));
171  PyDict_SetItemString(dict,"IssmSegments",PyArrayFromCopiedData(bamgmesh->IssmSegmentsSize,bamgmesh->IssmSegments));
172  PyDict_SetItemString(dict,"VerticesOnGeomVertex",PyArrayFromCopiedData(bamgmesh->VerticesOnGeomVertexSize,bamgmesh->VerticesOnGeomVertex));
173  PyDict_SetItemString(dict,"VerticesOnGeomEdge",PyArrayFromCopiedData(bamgmesh->VerticesOnGeomEdgeSize,bamgmesh->VerticesOnGeomEdge));
174  PyDict_SetItemString(dict,"EdgesOnGeomEdge",PyArrayFromCopiedData(bamgmesh->EdgesOnGeomEdgeSize,bamgmesh->EdgesOnGeomEdge));
175  PyDict_SetItemString(dict,"SubDomains",PyArrayFromCopiedData(bamgmesh->SubDomainsSize,bamgmesh->SubDomains));
176  PyDict_SetItemString(dict,"SubDomainsFromGeom",PyArrayFromCopiedData(bamgmesh->SubDomainsFromGeomSize,bamgmesh->SubDomainsFromGeom));
177  PyDict_SetItemString(dict,"ElementConnectivity",PyArrayFromCopiedData(bamgmesh->ElementConnectivitySize,bamgmesh->ElementConnectivity));
178  PyDict_SetItemString(dict,"NodalConnectivity",PyArrayFromCopiedData(bamgmesh->NodalConnectivitySize,bamgmesh->NodalConnectivity));
179  PyDict_SetItemString(dict,"NodalElementConnectivity",PyArrayFromCopiedData(bamgmesh->NodalElementConnectivitySize,bamgmesh->NodalElementConnectivity));
180  PyDict_SetItemString(dict,"CrackedVertices",PyArrayFromCopiedData(bamgmesh->CrackedVerticesSize,bamgmesh->CrackedVertices));
181  PyDict_SetItemString(dict,"CrackedEdges",PyArrayFromCopiedData(bamgmesh->CrackedEdgesSize,bamgmesh->CrackedEdges));
182 
183  PyTuple_SetItem(py_tuple, index, dict);
184 }
185 /*}}}*/
186 /*FUNCTION WriteData(PyObject* py_tuple,int index,IssmDenseMat<double>* matrix){{{*/
187 void WriteData(PyObject* py_tuple,int index,IssmDenseMat<double>* matrix){
188 
189  int M,N;
190  double* buffer=NULL;
191  npy_intp dims[2]={0,0};
192  PyObject* array=NULL;
193 
194  matrix->GetSize(&M,&N);
195  buffer=matrix->ToSerial();
196 
197  dims[0]=(npy_intp)M;
198  dims[1]=(npy_intp)N;
199  array=PyArray_SimpleNewFromData(2,dims,NPY_DOUBLE,buffer);
200 
201  PyTuple_SetItem(py_tuple, index, array);
202 
203 }/*}}}*/
204 /*FUNCTION WriteData(PyObject* py_tuple,int index,IssmSeqVec<double>* vector){{{*/
205 void WriteData(PyObject* py_tuple,int index,IssmSeqVec<double>* vector){
206 
207  int M;
208  double* buffer=NULL;
209  npy_intp dim=10;
210  PyObject* array=NULL;
211 
212  vector->GetSize(&M);
213  buffer=vector->ToMPISerial();
214 
215  dim=(npy_intp)M;
216  array=PyArray_SimpleNewFromData(1,&dim,NPY_DOUBLE,buffer);
217 
218  PyTuple_SetItem(py_tuple, index, array);
219 }
220 /*}}}*/
221 /*FUNCTION WriteData(PyObject* py_tuple,int index,RiftStruct* riftstruct){{{*/
222 void WriteData(PyObject* py_tuple,int index,RiftStruct* riftstruct){
223 
224  int i;
225  PyObject* list=NULL;
226  PyObject* dict=NULL;
227 
228  list=PyList_New((Py_ssize_t)0);
229 
230  for (i=0; i<riftstruct->numrifts; i++) {
231  dict=PyDict_New();
232 
233  #if _PYTHON_MAJOR_ >= 3
234  PyDict_SetItemString(dict,"numsegs" ,PyLong_FromSsize_t((Py_ssize_t)riftstruct->riftsnumsegments[i]));
235  PyDict_SetItemString(dict,"fill" ,PyUnicode_FromString("Ice"));
236  PyDict_SetItemString(dict,"friction" ,PyLong_FromSsize_t((Py_ssize_t)0));
237  #else
238  PyDict_SetItemString(dict,"numsegs" ,PyInt_FromSsize_t((Py_ssize_t)riftstruct->riftsnumsegments[i]));
239  PyDict_SetItemString(dict,"fill" ,PyString_FromString("Ice"));
240  PyDict_SetItemString(dict,"friction" ,PyInt_FromSsize_t((Py_ssize_t)0));
241  #endif
242 
243  PyDict_SetItemString(dict,"segments" ,PyArrayFromCopiedData(riftstruct->riftsnumsegments[i] ,3,riftstruct->riftssegments[i]));
244  PyDict_SetItemString(dict,"pairs" ,PyArrayFromCopiedData(riftstruct->riftsnumpairs[i] ,2,riftstruct->riftspairs[i]));
245  PyDict_SetItemString(dict,"tips" ,PyArrayFromCopiedData(1 ,2,&riftstruct->riftstips[2*i]));
246  PyDict_SetItemString(dict,"penaltypairs" ,PyArrayFromCopiedData(riftstruct->riftsnumpenaltypairs[i],7,riftstruct->riftspenaltypairs[i]));
247  PyDict_SetItemString(dict,"fraction" ,PyFloat_FromDouble(0.));
248  PyDict_SetItemString(dict,"fractionincrement",PyFloat_FromDouble(0.1));
249  PyDict_SetItemString(dict,"state" ,PyArrayFromCopiedData(riftstruct->riftsnumpenaltypairs[i],1,riftstruct->state[i]));
250 
251  PyList_Append(list, dict);
252  }
253 
254  PyTuple_SetItem(py_tuple, index, list);
255 }
256 /*}}}*/
257 
258 /*Utils*/
259 /*FUNCTION PyArrayFromCopiedData(int dims[2],double* data){{{*/
260 PyObject* PyArrayFromCopiedData(int dims[2],double* data){
261 
262  double* pydata;
263  npy_intp pydims[2]={0,0};
264 
265  /* note that PyArray_SimpleNewFromData does not copy the data, so that when the original
266  object (e.g. bamggeom,bamgmesh) is deleted, the data is gone. */
267 
268  pydims[0]=(npy_intp)dims[0];
269  pydims[1]=(npy_intp)dims[1];
270  pydata=xNew<IssmDouble>(dims[0]*dims[1]);
271  memcpy(pydata,data,dims[0]*dims[1]*sizeof(double));
272  return PyArray_SimpleNewFromData(2,pydims,NPY_DOUBLE,pydata);
273 }
274 /*}}}*/
275 /*FUNCTION PyArrayFromCopiedData(int dimi,int dimj,double* data){{{*/
276 PyObject* PyArrayFromCopiedData(int dimi,int dimj,double* data){
277 
278  double* pydata;
279  npy_intp pydims[2]={0,0};
280 
281  /* note that PyArray_SimpleNewFromData does not copy the data, so that when the original
282  object (e.g. bamggeom,bamgmesh) is deleted, the data is gone. */
283 
284  pydims[0]=(npy_intp)dimi;
285  pydims[1]=(npy_intp)dimj;
286  pydata=xNew<IssmDouble>(dimi*dimj);
287  memcpy(pydata,data,dimi*dimj*sizeof(double));
288  return PyArray_SimpleNewFromData(2,pydims,NPY_DOUBLE,pydata);
289 }
290 /*}}}*/
291 /*FUNCTION PyArrayFromCopiedData(int dimi,int dimj,int* data){{{*/
292 PyObject* PyArrayFromCopiedData(int dimi,int dimj,int* data){
293 
294  long* pydata;
295  npy_intp pydims[2]={0,0};
296 
297  /* note that PyArray_SimpleNewFromData does not copy the data, so that when the original
298  object (e.g. bamggeom,bamgmesh) is deleted, the data is gone. */
299 
300  pydims[0]=(npy_intp)dimi;
301  pydims[1]=(npy_intp)dimj;
302  pydata=xNew<long>(dimi*dimj);
303  for(int i=0;i<dimi*dimj;i++) pydata[i]=(long)data[i];
304  return PyArray_SimpleNewFromData(2,pydims,NPY_INT64,pydata);
305 }
306 /*}}}*/
307 /*FUNCTION PyArrayFromCopiedData(int dimi,int dimj,bool* data){{{*/
308 PyObject* PyArrayFromCopiedData(int dimi,int dimj,bool* data){
309 
310  bool* pydata;
311  npy_intp pydims[2]={0,0};
312 
313  /* note that PyArray_SimpleNewFromData does not copy the data, so that when the original
314  object (e.g. bamggeom,bamgmesh) is deleted, the data is gone. */
315 
316  pydims[0]=(npy_intp)dimi;
317  pydims[1]=(npy_intp)dimj;
318  pydata=xNew<bool>(dimi*dimj);
319  memcpy(pydata,data,dimi*dimj*sizeof(bool));
320  return PyArray_SimpleNewFromData(2,pydims,NPY_BOOL,pydata);
321 }
322 /*}}}*/
BamgGeom::RequiredVertices
double * RequiredVertices
Definition: BamgGeom.h:19
BamgGeom::Edges
double * Edges
Definition: BamgGeom.h:13
RiftStruct::riftsnumpairs
int * riftsnumpairs
Definition: RiftStruct.h:14
BamgGeom::CrackedEdges
double * CrackedEdges
Definition: BamgGeom.h:23
BamgGeom::CornersSize
int CornersSize[2]
Definition: BamgGeom.h:16
IssmSeqVec::ToMPISerial
doubletype * ToMPISerial(void)
Definition: IssmSeqVec.h:207
BamgMesh::VerticesOnGeomVertexSize
int VerticesOnGeomVertexSize[2]
Definition: BamgMesh.h:19
RiftStruct::riftsnumpenaltypairs
int * riftsnumpenaltypairs
Definition: RiftStruct.h:15
RiftStruct::riftstips
int * riftstips
Definition: RiftStruct.h:18
BamgMesh::EdgesOnGeomEdge
double * EdgesOnGeomEdge
Definition: BamgMesh.h:24
BamgMesh::NodalConnectivitySize
int NodalConnectivitySize[2]
Definition: BamgMesh.h:42
BamgMesh::NodalElementConnectivity
double * NodalElementConnectivity
Definition: BamgMesh.h:45
IssmDenseMat::ToSerial
doubletype * ToSerial(void)
Definition: IssmDenseMat.h:215
BamgGeom::Corners
double * Corners
Definition: BamgGeom.h:17
IssmDenseMat
Definition: IssmDenseMat.h:39
BamgMesh::VerticesOnGeomEdgeSize
int VerticesOnGeomEdgeSize[2]
Definition: BamgMesh.h:21
BamgGeom::TangentAtEdgesSize
int TangentAtEdgesSize[2]
Definition: BamgGeom.h:14
BamgGeom::RequiredEdgesSize
int RequiredEdgesSize[2]
Definition: BamgGeom.h:20
BamgMesh::NodalConnectivity
double * NodalConnectivity
Definition: BamgMesh.h:43
BamgMesh::Vertices
double * Vertices
Definition: BamgMesh.h:12
IssmSeqVec
Definition: IssmSeqVec.h:31
BamgMesh::SubDomainsSize
int SubDomainsSize[2]
Definition: BamgMesh.h:26
BamgMesh
Definition: BamgMesh.h:7
BamgGeom::SubDomainsSize
int SubDomainsSize[2]
Definition: BamgGeom.h:24
RiftStruct::state
double ** state
Definition: RiftStruct.h:19
BamgMesh::CrackedVertices
double * CrackedVertices
Definition: BamgMesh.h:31
BamgMesh::ElementConnectivity
double * ElementConnectivity
Definition: BamgMesh.h:41
IssmDenseMat::GetSize
void GetSize(int *pM, int *pN)
Definition: IssmDenseMat.h:165
BamgGeom::SubDomains
double * SubDomains
Definition: BamgGeom.h:25
BamgMesh::SubDomains
double * SubDomains
Definition: BamgMesh.h:27
BamgMesh::EdgesOnGeomEdgeSize
int EdgesOnGeomEdgeSize[2]
Definition: BamgMesh.h:23
BamgMesh::VerticesSize
int VerticesSize[2]
Definition: BamgMesh.h:11
BamgMesh::CrackedVerticesSize
int CrackedVerticesSize[2]
Definition: BamgMesh.h:30
BamgGeom::CrackedEdgesSize
int CrackedEdgesSize[2]
Definition: BamgGeom.h:22
BamgMesh::VerticesOnGeomEdge
double * VerticesOnGeomEdge
Definition: BamgMesh.h:22
BamgGeom::TangentAtEdges
double * TangentAtEdges
Definition: BamgGeom.h:15
BamgMesh::EdgesSize
int EdgesSize[2]
Definition: BamgMesh.h:14
RiftStruct::riftsnumsegments
int * riftsnumsegments
Definition: RiftStruct.h:16
BamgMesh::SubDomainsFromGeom
double * SubDomainsFromGeom
Definition: BamgMesh.h:29
BamgGeom::RequiredVerticesSize
int RequiredVerticesSize[2]
Definition: BamgGeom.h:18
IssmSeqVec::GetSize
void GetSize(int *pM)
Definition: IssmSeqVec.h:136
BamgMesh::Edges
double * Edges
Definition: BamgMesh.h:15
RiftStruct::riftssegments
int ** riftssegments
Definition: RiftStruct.h:17
RiftStruct::riftspenaltypairs
double ** riftspenaltypairs
Definition: RiftStruct.h:13
pythonio.h
BamgMesh::SubDomainsFromGeomSize
int SubDomainsFromGeomSize[2]
Definition: BamgMesh.h:28
BamgMesh::IssmSegmentsSize
int IssmSegmentsSize[2]
Definition: BamgMesh.h:38
RiftStruct::numrifts
int numrifts
Definition: RiftStruct.h:11
BamgGeom::VerticesSize
int VerticesSize[2]
Definition: BamgGeom.h:10
BamgMesh::TrianglesSize
int TrianglesSize[2]
Definition: BamgMesh.h:16
BamgGeom::EdgesSize
int EdgesSize[2]
Definition: BamgGeom.h:12
BamgGeom
Definition: BamgGeom.h:7
BamgMesh::VerticesOnGeomVertex
double * VerticesOnGeomVertex
Definition: BamgMesh.h:20
RiftStruct::riftspairs
int ** riftspairs
Definition: RiftStruct.h:12
BamgMesh::IssmEdgesSize
int IssmEdgesSize[2]
Definition: BamgMesh.h:36
WriteData
void WriteData(PyObject *py_tuple, int index, int integer)
Definition: WritePythonData.cpp:19
BamgGeom::Vertices
double * Vertices
Definition: BamgGeom.h:11
BamgMesh::NodalElementConnectivitySize
int NodalElementConnectivitySize[2]
Definition: BamgMesh.h:44
BamgGeom::RequiredEdges
double * RequiredEdges
Definition: BamgGeom.h:21
BamgMesh::IssmSegments
double * IssmSegments
Definition: BamgMesh.h:39
PyArrayFromCopiedData
PyObject * PyArrayFromCopiedData(int dims[2], double *data)
Definition: WritePythonData.cpp:260
BamgMesh::ElementConnectivitySize
int ElementConnectivitySize[2]
Definition: BamgMesh.h:40
BamgMesh::CrackedEdges
double * CrackedEdges
Definition: BamgMesh.h:33
BamgMesh::Triangles
double * Triangles
Definition: BamgMesh.h:17
BamgMesh::IssmEdges
double * IssmEdges
Definition: BamgMesh.h:37
BamgMesh::CrackedEdgesSize
int CrackedEdgesSize[2]
Definition: BamgMesh.h:32
RiftStruct
Definition: RiftStruct.h:8