Skip to content

Commit 14519cf

Browse files
committed
RP changes1_v0
1 parent 9507b84 commit 14519cf

File tree

9 files changed

+149
-99
lines changed

9 files changed

+149
-99
lines changed

src/pmpo_MPMesh.cpp

Lines changed: 76 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ void MPMesh::CVTTrackingElmCenterBased(const int printVTPIndex){
115115
int numVtxs = p_mesh->getNumVertices();
116116
int numElms = p_mesh->getNumElements();
117117
auto numMPs = p_MPs->getCount();
118-
118+
119119
const auto elmCenter = p_mesh->getMeshField<polyMPO::MeshF_ElmCenterXYZ>();
120120

121121
auto elm2VtxConn = p_mesh->getElm2VtxConn();
@@ -128,12 +128,15 @@ void MPMesh::CVTTrackingElmCenterBased(const int printVTPIndex){
128128
auto elm2Process = p_mesh->getElm2Process();
129129
auto elm2global = p_mesh->getElmGlobal();
130130

131-
static int count_mesh_print=0;
132-
if(printVTPIndex>=0 && count_mesh_print==0) {
131+
if(printVTPIndex>=0) {
133132
printVTP_mesh(printVTPIndex);
134-
count_mesh_print += 1;
135133
}
136-
134+
135+
Vec3dView history("positionHistory",numMPs);
136+
Vec3dView resultLeft("positionResult",numMPs);
137+
Vec3dView resultRight("positionResult",numMPs);
138+
Vec3dView mpTgtPosArray("positionTarget",numMPs);
139+
137140
auto CVTElmCalc = PS_LAMBDA(const int& elm, const int& mp, const int&mask){
138141
Vec3d MP(mpPositions(mp,0),mpPositions(mp,1),mpPositions(mp,2));
139142
if(mask){
@@ -152,7 +155,8 @@ void MPMesh::CVTTrackingElmCenterBased(const int printVTPIndex){
152155
for(int i=1; i<=numConnElms; i++){
153156
int elmID = elm2ElmConn(iElm,i)-1;
154157

155-
Vec3d center(elmCenter(elmID, 0), elmCenter(elmID, 1), elmCenter(elmID, 2));
158+
//New delta
159+
Vec3d center(elmCenter(elmID, 0), elmCenter(elmID, 1), elmCenter(elmID, 2));
156160
delta = MPnew - center;
157161

158162
double neighborDistSq = delta[0]*delta[0] + delta[1]*delta[1] + delta[2]*delta[2];
@@ -163,16 +167,69 @@ void MPMesh::CVTTrackingElmCenterBased(const int printVTPIndex){
163167
}
164168
if(closestElm<0){
165169
MPs2Elm(mp) = iElm;
166-
if(elm2Process.size()>0) MPs2Proc(mp) = elm2Process(iElm);
170+
if (elm2Process.size() > 0)
171+
MPs2Proc(mp) = elm2Process(iElm);
167172
break;
168173
}else{
169174
iElm = closestElm;
170175
}
171176
}
177+
if(printVTPIndex>=0 && numMPs>0){
178+
double d1 = dx[0];
179+
double d2 = dx[2];
180+
double d3 = dx[3];
181+
double m1 = MP[0];
182+
double m2 = MP[1];
183+
double m3 = MP[2];
184+
Vec3d MParrow = MP + dx*0.7;
185+
Vec3d r = MPnew * (1.0/MPnew.magnitude());
186+
Vec3d shift = dx.cross(r) * ((1.0-0.7)*dx.magnitude()/(dx.cross(r)).magnitude());
187+
Vec3d MPLeft = MParrow + shift;
188+
Vec3d MPRight = MParrow - shift;
189+
history(mp) = MP;
190+
resultLeft(mp) = MPLeft;
191+
resultRight(mp) = MPRight;
192+
mpTgtPosArray(mp) = MPnew;
193+
}
172194
}
173195
};
174196
p_MPs->parallel_for(CVTElmCalc,"CVTTrackingElmCenterBasedCalc");
175-
197+
198+
if(printVTPIndex>=0){
199+
Vec3dView::HostMirror h_history = Kokkos::create_mirror_view(history);
200+
Vec3dView::HostMirror h_resultLeft = Kokkos::create_mirror_view(resultLeft);
201+
Vec3dView::HostMirror h_resultRight = Kokkos::create_mirror_view(resultRight);
202+
Vec3dView::HostMirror h_mpTgtPos = Kokkos::create_mirror_view(mpTgtPosArray);
203+
204+
Kokkos::deep_copy(h_history, history);
205+
Kokkos::deep_copy(h_resultLeft, resultLeft);
206+
Kokkos::deep_copy(h_resultRight, resultRight);
207+
Kokkos::deep_copy(h_mpTgtPos, mpTgtPosArray);
208+
// printVTP file
209+
char* fileOutput = (char *)malloc(sizeof(char) * 256);
210+
sprintf(fileOutput, "polyMPOCVTTrackingElmCenter_MPtracks_%d.vtp", printVTPIndex);
211+
FILE * pFile = fopen(fileOutput,"w");
212+
free(fileOutput);
213+
fprintf(pFile, "<VTKFile type=\"PolyData\" version=\"1.0\" byte_order=\"LittleEndian\" header_type=\"UInt64\">\n <PolyData>\n <Piece NumberOfPoints=\"%d\" NumberOfVerts=\"0\" NumberOfLines=\"%d\" NumberOfStrips=\"0\" NumberOfPolys=\"0\">\n <Points>\n <DataArray type=\"Float32\" Name=\"Points\" NumberOfComponents=\"3\" format=\"ascii\">\n",numMPs*4,numMPs*2);
214+
for(int i=0; i<numMPs; i++){
215+
fprintf(pFile," %f %f %f\n %f %f %f\n %f %f %f\n %f %f %f\n",
216+
h_history(i)[0],h_history(i)[1],h_history(i)[2],
217+
h_mpTgtPos(i)[0],h_mpTgtPos(i)[1],h_mpTgtPos(i)[2],
218+
h_resultLeft(i)[0],h_resultLeft(i)[1],h_resultLeft(i)[2],
219+
h_resultRight(i)[0],h_resultRight(i)[1],h_resultRight(i)[2]);
220+
}
221+
fprintf(pFile," </DataArray>\n </Points>\n <Lines>\n <DataArray type=\"Int64\" Name=\"connectivity\" format=\"ascii\">\n");
222+
for(int i=0; i<numMPs*4; i+=4){
223+
fprintf(pFile," %d %d\n %d %d %d\n",i,i+1,i+2,i+1,i+3);
224+
}
225+
fprintf(pFile," </DataArray>\n <DataArray type=\"Int64\" Name=\"offsets\" format=\"ascii\">\n");
226+
for(int i=0; i<numMPs*5; i+=5){
227+
fprintf(pFile," %d\n %d\n",i+2,i+5);
228+
}
229+
fprintf(pFile," </DataArray>\n </Lines>\n </Piece>\n </PolyData>\n</VTKFile>\n");
230+
fclose(pFile);
231+
}
232+
176233
pumipic::RecordTime("PolyMPO_CVTTrackingElmCenterBased", timer.seconds());
177234
}
178235

@@ -265,53 +322,44 @@ bool getAnyIsMigrating(MaterialPoints* p_MPs, bool isMigrating) {
265322
return anyIsMigrating;
266323
}
267324

268-
//Spehrical Interpolation and Push
269325
void MPMesh::push_ahead(){
270326
Kokkos::Timer timer;
271327
//Latitude Longitude increment at mesh vertices and interpolate to particle position
272-
p_mesh->computeRotLatLonIncr();
273-
274-
/*
275-
sphericalInterpolation<MeshF_RotLatLonIncr>(*this);
276-
Kokkos::fence();
277-
sphericalInterpolation<MeshF_OnSurfVeloIncr>(*this);
278-
*/
328+
p_mesh->computeRotLatLonIncr();
279329

280-
//The current spherical interpolation accepts just one template but for multiple
281-
//fields the same weights can be used, maybe pass parameter list. Temporarily,
282-
//application specific the following function
330+
//Interpolates latitude longitude increments and mesh velocity increments to
331+
//MP positions
283332
sphericalInterpolation1(*this);
284333

285-
//Move the MPs
334+
//Push the MPs
286335
p_MPs->updateRotLatLonAndXYZ2Tgt(p_mesh->getSphereRadius());
287336
pumipic::RecordTime("PolyMPO_interpolateAndPush", timer.seconds());
288337
}
289338

290-
//MP Tracking and migration check
291339
bool MPMesh::push1P(){
292340
Kokkos::Timer timer;
293341
//Given target location find the new element or the last element in a partioned mesh
294-
//for the MP. Also the owning process for that element.
342+
//and the process it belongs to so that migration can be checked
295343
CVTTrackingElmCenterBased();
296-
//From the above check if any particle needs to be migrated
344+
//From the above two inputs find if any particle needs to be migrated
297345
bool anyIsMigrating = getAnyIsMigrating(p_MPs, p_MPs->check_migrate());
298346
pumipic::RecordTime("PolyMPO_trackAndCheckMigrate", timer.seconds());
299347
return anyIsMigrating;
300348
}
301349

302-
//Current elm becomes the target elm, target elm becomes -1
303350
void MPMesh::push_swap(){
351+
//current becomes target, target becomes -1
304352
p_MPs->updateMPElmID();
305353
}
306354

307-
//Current becomes the target, target becomes -1
308-
//Make read for next push_ahead
309355
void MPMesh::push_swap_pos(){
356+
//current becomes target, target becomes -1
357+
//Making read for next push_ahead
310358
p_MPs->updateMPSlice<MPF_Cur_Pos_XYZ, MPF_Tgt_Pos_XYZ>();
311359
p_MPs->updateMPSlice<MPF_Cur_Pos_Rot_Lat_Lon, MPF_Tgt_Pos_Rot_Lat_Lon>();
312360
}
313361

314-
//Push routine where migration is carried out using polyMPO
362+
315363
void MPMesh::push(){
316364

317365
Kokkos::Timer timer;
@@ -341,7 +389,7 @@ void MPMesh::push(){
341389
reconstructSlices();
342390
}
343391
while (anyIsMigrating);
344-
392+
345393
pumipic::RecordTime("PolyMPO_push", timer.seconds());
346394
}
347395

src/pmpo_MPMesh.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class MPMesh{
6666
template <MeshFieldIndex meshFieldIndex>
6767
void assemblyVtx1();
6868
template <MeshFieldIndex meshFieldIndex>
69-
void subAssemblyVtx1(int size1, int size2, double* array, int comp);
69+
void subAssemblyVtx1(int size1, int size2, int comp, double* array);
7070

7171
void subAssemblyCoeffs(int dim1, int dim2, double* m11, double* m12, double* m13, double* m14,
7272
double* m22, double* m23, double* m24,

src/pmpo_MPMesh_assembly.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ void MPMesh::solveMatrixAndRegularize(int dim1, double* m11, double* m12, double
378378

379379
//Method2
380380
template <MeshFieldIndex meshFieldIndex>
381-
void MPMesh::subAssemblyVtx1(int size1, int size2, double* array, int comp) {
381+
void MPMesh::subAssemblyVtx1(int size1, int size2, int comp, double* array) {
382382
Kokkos::Timer timer;
383383

384384
auto VtxCoeffs=this->precomputedVtxCoeffs;

src/pmpo_c.cpp

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ void polympo_createMPs_f(MPMesh_ptr p_mpmesh,
110110
fprintf(stderr,"The minElmID is incorrect! Offset is wrong!\n");
111111
exit(1);
112112
}
113-
printf("Offset %d \n", offset);
114113

115114
std::vector<int> active_mpIDs(numMPs);
116115
std::vector<int> active_mp2Elm(numMPs);
@@ -126,7 +125,7 @@ void polympo_createMPs_f(MPMesh_ptr p_mpmesh,
126125
auto mpsPerElm_d = create_mirror_view_and_copy(mpsPerElm, numElms);
127126
auto active_mp2Elm_d = create_mirror_view_and_copy(active_mp2Elm.data(), numActiveMPs);
128127
auto active_mpIDs_d = create_mirror_view_and_copy(active_mpIDs.data(), numActiveMPs);
129-
128+
130129
delete ((polyMPO::MPMesh*)p_mpmesh)->p_MPs;
131130
((polyMPO::MPMesh*)p_mpmesh)->p_MPs =
132131
new polyMPO::MaterialPoints(numElms, numActiveMPs, mpsPerElm_d, active_mp2Elm_d, active_mpIDs_d, elm2global);
@@ -198,7 +197,7 @@ void polympo_startRebuildMPs_f(MPMesh_ptr p_mpmesh,
198197
}
199198
}
200199

201-
void polympo_startRebuildMPs_f2(MPMesh_ptr p_mpmesh,
200+
void polympo_startRebuildMPs2_f(MPMesh_ptr p_mpmesh,
202201
const int sizeMP2elm,
203202
const int* elem_ids,
204203
const int nMPs_delete,
@@ -235,7 +234,7 @@ void polympo_startRebuildMPs_f2(MPMesh_ptr p_mpmesh,
235234
int numDeletedMPs = pumipic::getLastValue(numDeletedMPs_d);
236235
assert(nMPs_delete==numDeletedMPs);
237236
p_MPs->startRebuild(mp2Elm, nMPs_add, recvMPs_elm_d, recvMPs_ids_d);
238-
pumipic::RecordTime("polympo_startRebuildMPs_f2", timer.seconds());
237+
pumipic::RecordTime("polympo_startRebuildMPs2_f", timer.seconds());
239238
}
240239

241240

@@ -297,7 +296,7 @@ void polympo_getMPCurElmID_f(MPMesh_ptr p_mpmesh,
297296

298297
auto getElmId = PS_LAMBDA(const int&, const int& mp, const int& mask){
299298
if(mask){
300-
mpCurElmIDCopy(mpAppID(mp)) = mpCurElmID(mp)+elmIDoffset;
299+
mpCurElmIDCopy(mpAppID(mp)) = mpCurElmID(mp)+elmIDoffset;
301300
}
302301
};
303302
p_MPs->parallel_for(getElmId, "get mpCurElmID");
@@ -380,7 +379,6 @@ void polympo_setMPTgtPositions_f(MPMesh_ptr p_mpmesh,
380379
auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs;
381380
PMT_ALWAYS_ASSERT(nComps == vec3d_nEntries);
382381
PMT_ALWAYS_ASSERT(numMPs >= p_MPs->getCount());
383-
//printf("NumMPs %d %d \n", numMPs, p_MPs->getCount());
384382
//PMT_ALWAYS_ASSERT(numMPs >= p_MPs->getMaxAppID());
385383
kkViewHostU<const double**> mpPositionsIn_h(mpPositionsIn,nComps,numMPs);
386384

@@ -950,9 +948,6 @@ void polympo_setMeshDualTriangleArea_f(MPMesh_ptr p_mpmesh, const int nVertices,
950948
checkMPMeshValid(p_mpmesh);
951949
auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh;
952950

953-
//check the size
954-
PMT_ALWAYS_ASSERT(p_mesh->getNumVertices()==nVertices);
955-
956951
//copy the host array to the device
957952
auto dualArea = p_mesh->getMeshField<polyMPO::MeshF_DualTriangleArea>();
958953
auto h_dualArea = Kokkos::create_mirror_view(dualArea);
@@ -968,9 +963,6 @@ void polympo_getMeshDualTriangleArea_f(MPMesh_ptr p_mpmesh, const int nVertices,
968963
checkMPMeshValid(p_mpmesh);
969964
auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh;
970965

971-
//check the size
972-
PMT_ALWAYS_ASSERT(p_mesh->getNumVertices()==nVertices);
973-
974966
//copy the device to host
975967
auto dualArea = p_mesh->getMeshField<polyMPO::MeshF_DualTriangleArea>();
976968
auto h_dualArea = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), dualArea);
@@ -1183,28 +1175,28 @@ void polympo_getMeshVtxOnSurfDispIncr_f(MPMesh_ptr p_mpmesh, const int nComps, c
11831175

11841176
bool polympo_push1P_f(MPMesh_ptr p_mpmesh){
11851177
checkMPMeshValid(p_mpmesh);
1186-
bool is_migrating=((polyMPO::MPMesh*)p_mpmesh) ->push1P();
1178+
bool is_migrating=((polyMPO::MPMesh*)p_mpmesh)->push1P();
11871179
return is_migrating;
11881180
}
11891181

11901182
void polympo_push_ahead_f(MPMesh_ptr p_mpmesh){
11911183
checkMPMeshValid(p_mpmesh);
1192-
((polyMPO::MPMesh*)p_mpmesh) ->push_ahead();
1184+
((polyMPO::MPMesh*)p_mpmesh)->push_ahead();
11931185
}
11941186

11951187
void polympo_push_swap_f(MPMesh_ptr p_mpmesh){
11961188
checkMPMeshValid(p_mpmesh);
1197-
((polyMPO::MPMesh*)p_mpmesh) ->push_swap();
1189+
((polyMPO::MPMesh*)p_mpmesh)->push_swap();
11981190
}
11991191

12001192
void polympo_push_swap_pos_f(MPMesh_ptr p_mpmesh){
12011193
checkMPMeshValid(p_mpmesh);
1202-
((polyMPO::MPMesh*)p_mpmesh) ->push_swap_pos();
1194+
((polyMPO::MPMesh*)p_mpmesh)->push_swap_pos();
12031195
}
12041196

12051197
void polympo_push_f(MPMesh_ptr p_mpmesh){
12061198
checkMPMeshValid(p_mpmesh);
1207-
((polyMPO::MPMesh*)p_mpmesh) ->push();
1199+
((polyMPO::MPMesh*)p_mpmesh)->push();
12081200
}
12091201

12101202
//TODO skeleton of reconstruction functions
@@ -1248,21 +1240,34 @@ void polympo_setReconstructionOfStress_f(MPMesh_ptr p_mpmesh, const int order, c
12481240

12491241

12501242
//With MPI communication done via MPAS
1251-
void polympo_vtxSubAssemblyIceArea_f(MPMesh_ptr p_mpmesh, int size1, int size2, double* array, int comp){
1243+
void polympo_vtxSubAssemblyIceArea_f(MPMesh_ptr p_mpmesh, int size1, int size2, int comp, double* array){
12521244
checkMPMeshValid(p_mpmesh);
12531245
auto mpmesh = ((polyMPO::MPMesh*)p_mpmesh);
1254-
mpmesh->subAssemblyVtx1<polyMPO::MeshF_VtxMass>(size1, size2, array, comp);
1246+
auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh;
1247+
PMT_ALWAYS_ASSERT(size1 <= maxVtxsPerElm);
1248+
PMT_ALWAYS_ASSERT(size2 == p_mesh->getNumElements()+1);
1249+
PMT_ALWAYS_ASSERT(comp == 0 || comp== 1);
1250+
mpmesh->subAssemblyVtx1<polyMPO::MeshF_VtxMass>(size1, size2, comp, array);
12551251
}
1256-
void polympo_vtxSubAssemblyVelocity_f(MPMesh_ptr p_mpmesh, int size1, int size2, double* array, int comp){
1252+
1253+
void polympo_vtxSubAssemblyVelocity_f(MPMesh_ptr p_mpmesh, int size1, int size2, int comp, double* array){
12571254
checkMPMeshValid(p_mpmesh);
12581255
auto mpmesh = ((polyMPO::MPMesh*)p_mpmesh);
1259-
mpmesh->subAssemblyVtx1<polyMPO::MeshF_Vel>(size1, size2, array, comp);
1256+
auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh;
1257+
PMT_ALWAYS_ASSERT(size1 <= maxVtxsPerElm);
1258+
PMT_ALWAYS_ASSERT(size2 == p_mesh->getNumElements()+1);
1259+
PMT_ALWAYS_ASSERT(comp == 0 || comp== 1);
1260+
mpmesh->subAssemblyVtx1<polyMPO::MeshF_Vel>(size1, size2, comp, array);
12601261
}
1262+
12611263
void polympo_subAssemblyCoeffs_f(MPMesh_ptr p_mpmesh, int dim1, int dim2, double* m11, double* m12, double* m13, double* m14,
12621264
double* m22, double* m23, double* m24,
12631265
double* m33, double* m34,
12641266
double* m44){
12651267
checkMPMeshValid(p_mpmesh);
1268+
auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh;
1269+
PMT_ALWAYS_ASSERT(dim1 <= maxVtxsPerElm);
1270+
PMT_ALWAYS_ASSERT(dim2 == p_mesh->getNumElements()+1);
12661271
auto mpmesh = ((polyMPO::MPMesh*)p_mpmesh);
12671272
mpmesh->subAssemblyCoeffs(dim1, dim2, m11, m12, m13, m14, m22, m23, m24, m33, m34, m44);
12681273
}
@@ -1321,8 +1326,6 @@ void polympo_setVtxGlobal_f(MPMesh_ptr p_mpmesh, const int nVertices, const int*
13211326
for (int i = 0; i < nVertices; i++) {
13221327
arrayHost(i) = array[i] - 1; // TODO right now elmID offset is set after MPs initialized
13231328
}
1324-
//check the size
1325-
//PMT_ALWAYS_ASSERT(nVertices == p_mesh->getNumVertices());
13261329

13271330
Kokkos::View<int*> vtxGlobal("vtxGlobal",nVertices);
13281331
Kokkos::deep_copy(vtxGlobal, arrayHost);
@@ -1331,7 +1334,7 @@ void polympo_setVtxGlobal_f(MPMesh_ptr p_mpmesh, const int nVertices, const int*
13311334

13321335
int polympo_getMPCount_f(MPMesh_ptr p_mpmesh) {
13331336
auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs;
1334-
return p_MPs->getCount(); // This returns the int you're after
1337+
return p_MPs->getCount();
13351338
}
13361339

13371340
void polympo_enableTiming_f(){

src/pmpo_c.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void polympo_setMPICommunicator_f(MPMesh_ptr p_mpmesh, MPI_Fint fcomm);
2121
//MP info
2222
void polympo_createMPs_f(MPMesh_ptr p_mpmesh, const int numElms, const int numMPs, int* mpsPerElm, const int* mp2Elm, const int* isMPActive);
2323
void polympo_startRebuildMPs_f(MPMesh_ptr p_mpmesh, const int numMPs, const int* allTgtMpElmIn, const int* addedMPMask);
24-
void polympo_startRebuildMPs_f2(MPMesh_ptr p_mpmesh, const int size1, const int* arg1, const int size2, const int size3, int* arg2, int* arg3);
24+
void polympo_startRebuildMPs2_f(MPMesh_ptr p_mpmesh, const int size1, const int* arg1, const int size2, const int size3, int* arg2, int* arg3);
2525

2626
int polympo_getMPCount_f(MPMesh_ptr p_mpmesh);
2727

@@ -113,8 +113,8 @@ void polympo_setReconstructionOfStress_f(MPMesh_ptr p_mpmesh, const int order, c
113113
void polympo_applyReconstruction_f(MPMesh_ptr p_mpmesh);
114114

115115
//Reconstruction using MPAS
116-
void polympo_vtxSubAssemblyIceArea_f(MPMesh_ptr p_mpmesh, int size1, int size2, double* array, int comp);
117-
void polympo_vtxSubAssemblyVelocity_f(MPMesh_ptr p_mpmesh, int size1, int size2, double* array, int comp);
116+
void polympo_vtxSubAssemblyIceArea_f(MPMesh_ptr p_mpmesh, int size1, int size2, int comp, double* array);
117+
void polympo_vtxSubAssemblyVelocity_f(MPMesh_ptr p_mpmesh, int size1, int size2, int comp, double* array);
118118
void polympo_subAssemblyCoeffs_f(MPMesh_ptr p_mpmesh, int dim1, int dim2, double* m11, double* m12, double* m13, double* m14,
119119
double* m22, double* m23, double* m24,
120120
double* m33, double* m34,

0 commit comments

Comments
 (0)