@@ -232,9 +232,9 @@ void polympo_setMPLatLonRotatedFlag_f(MPMesh_ptr p_mpmesh, const int isRotateFla
232232
233233template <polyMPO::MaterialPointSlice mpSlice>
234234void setMPData (MPMesh_ptr p_mpmesh,
235- const int nComps,
236- const int numMPs,
237- const double * mpDataIn){
235+ const int nComps,
236+ const int numMPs,
237+ const double * mpDataIn){
238238 Kokkos::Timer timer;
239239 checkMPMeshValid (p_mpmesh);
240240 auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
@@ -264,6 +264,31 @@ void setMPData(MPMesh_ptr p_mpmesh,
264264 pumipic::RecordTime (" PolyMPO_setMPData" , timer.seconds ());
265265}
266266
267+ template <polyMPO::MaterialPointSlice mpSlice>
268+ void getMPData (MPMesh_ptr p_mpmesh,
269+ const int nComps,
270+ const int numMPs,
271+ double * mpDataHost){
272+ checkMPMeshValid (p_mpmesh);
273+ auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
274+ PMT_ALWAYS_ASSERT (nComps == polyMPO::mpSliceToNumEntries<mpSlice>());
275+ PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getCount ());
276+ PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getMaxAppID ());
277+
278+ auto mpData = p_MPs->getData <mpSlice>();
279+ auto mpAppID = p_MPs->getData <polyMPO::MPF_MP_APP_ID>();
280+ Kokkos::View<double **> mpDataCopy (" mpDataCopy" ,nComps,numMPs);
281+ auto getData = PS_LAMBDA (const int &, const int & mp, const int & mask){
282+ if (mask){
283+ for (int i=0 ; i<nComps; i++)
284+ mpDataCopy (i,mpAppID (mp)) = mpData (mp,i);
285+ }
286+ };
287+ p_MPs->parallel_for (getData, " getMPData" );
288+ kkDbl2dViewHostU arrayHost (mpDataHost,nComps,numMPs);
289+ Kokkos::deep_copy (arrayHost, mpDataCopy);
290+ }
291+
267292using setMPFunc = void (*)(MPMesh_ptr, const int , const int , const double *);
268293std::map<polyMPO::MaterialPointSlice, setMPFunc> setMPMap = {
269294 {polyMPO::MPF_Cur_Pos_Rot_Lat_Lon, setMPData<polyMPO::MPF_Cur_Pos_Rot_Lat_Lon>},
@@ -277,157 +302,49 @@ std::map<polyMPO::MaterialPointSlice, setMPFunc> setMPMap = {
277302 {polyMPO::MPF_Stress, setMPData<polyMPO::MPF_Stress>}
278303};
279304
280- void polympo_setMPData_f (MPMesh_ptr p_mpmesh,
281- const int nComps,
282- const int numMPs,
283- const double * mpDataIn,
284- const int mpDataType){
305+ void polympo_setMPData_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpDataIn, const int mpDataType){
285306 polyMPO::MaterialPointSlice type = static_cast <polyMPO::MaterialPointSlice>(mpDataType);
286307 (*setMPMap[type])(p_mpmesh, nComps, numMPs, mpDataIn);
287308}
288309
289- void polympo_setMPPositions_f (MPMesh_ptr p_mpmesh,
290- const int nComps,
291- const int numMPs,
292- const double * mpPositionsIn){
310+ void polympo_setMPPositions_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpPositionsIn){
293311 setMPData<polyMPO::MPF_Cur_Pos_XYZ>(p_mpmesh, nComps, numMPs, mpPositionsIn);
294312}
295-
296- void polympo_getMPPositions_f (MPMesh_ptr p_mpmesh,
297- const int nComps,
298- const int numMPs,
299- double * mpPositionsHost){
300- checkMPMeshValid (p_mpmesh);
301- auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
302- PMT_ALWAYS_ASSERT (nComps == vec3d_nEntries);
303- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getCount ());
304- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getMaxAppID ());
305-
306- auto mpPositions = p_MPs->getData <polyMPO::MPF_Cur_Pos_XYZ>();
307- auto mpAppID = p_MPs->getData <polyMPO::MPF_MP_APP_ID>();
308- Kokkos::View<double **> mpPositionsCopy (" mpPositionsCopy" ,vec3d_nEntries,numMPs);
309- auto getPos = PS_LAMBDA (const int &, const int & mp, const int & mask){
310- if (mask){
311- mpPositionsCopy (0 ,mpAppID (mp)) = mpPositions (mp,0 );
312- mpPositionsCopy (1 ,mpAppID (mp)) = mpPositions (mp,1 );
313- mpPositionsCopy (2 ,mpAppID (mp)) = mpPositions (mp,2 );
314- }
315- };
316- p_MPs->parallel_for (getPos, " getMPPositions" );
317- kkDbl2dViewHostU arrayHost (mpPositionsHost,nComps,numMPs);
318- Kokkos::deep_copy (arrayHost, mpPositionsCopy);
313+ void polympo_getMPPositions_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpPositionsHost){
314+ getMPData<polyMPO::MPF_Cur_Pos_XYZ>(p_mpmesh, nComps, numMPs, mpPositionsHost);
319315}
320-
321- void polympo_setMPRotLatLon_f (MPMesh_ptr p_mpmesh,
322- const int nComps,
323- const int numMPs,
324- const double * mpRotLatLonIn){
316+ void polympo_setMPRotLatLon_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpRotLatLonIn){
325317 static int callCount = 0 ;
326318 PMT_ALWAYS_ASSERT (callCount == 0 );
327319 setMPData<polyMPO::MPF_Cur_Pos_Rot_Lat_Lon>(p_mpmesh, nComps, numMPs, mpRotLatLonIn);
328320 callCount++;
329321}
330-
331- void polympo_getMPRotLatLon_f (MPMesh_ptr p_mpmesh,
332- const int nComps,
333- const int numMPs,
334- double * mpRotLatLonHost){
335- checkMPMeshValid (p_mpmesh);
336- auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
337- PMT_ALWAYS_ASSERT (nComps == vec2d_nEntries);
338- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getCount ());
339- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getMaxAppID ());
340-
341- auto mpRotLatLon = p_MPs->getData <polyMPO::MPF_Cur_Pos_Rot_Lat_Lon>();
342- auto mpAppID = p_MPs->getData <polyMPO::MPF_MP_APP_ID>();
343- Kokkos::View<double **> mpRotLatLonCopy (" mpRotLatLonCopy" ,vec2d_nEntries,numMPs);
344- auto getPos = PS_LAMBDA (const int & elm, const int & mp, const int & mask){
345- if (mask){
346- mpRotLatLonCopy (0 ,mpAppID (mp)) = mpRotLatLon (mp,0 );
347- mpRotLatLonCopy (1 ,mpAppID (mp)) = mpRotLatLon (mp,1 );
348- }
349- };
350- p_MPs->parallel_for (getPos, " getMPRotLatLon" );
351- kkDbl2dViewHostU arrayHost (mpRotLatLonHost,nComps,numMPs);
352- Kokkos::deep_copy (arrayHost, mpRotLatLonCopy);
322+ void polympo_getMPRotLatLon_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpRotLatLonHost){
323+ getMPData<polyMPO::MPF_Cur_Pos_Rot_Lat_Lon>(p_mpmesh, nComps, numMPs, mpRotLatLonHost);
353324}
354-
355325void polympo_setMPMass_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpMassIn) {
356326 setMPData<polyMPO::MPF_Mass>(p_mpmesh, nComps, numMPs, mpMassIn);
357327}
358-
359328void polympo_getMPMass_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpMassHost) {
360- Kokkos::Timer timer;
361- checkMPMeshValid (p_mpmesh);
362- auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
363- PMT_ALWAYS_ASSERT (nComps == 1 ); // TODO mp_sclr_t
364- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getCount ());
365- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getMaxAppID ());
366-
367- auto mpMass = p_MPs->getData <polyMPO::MPF_Mass>();
368- auto mpAppID = p_MPs->getData <polyMPO::MPF_MP_APP_ID>();
369- Kokkos::View<double **> mpMassCopy (" mpMassCopy" ,nComps,numMPs);
370- auto getMPMass = PS_LAMBDA (const int & elm, const int & mp, const int & mask){
371- if (mask){
372- mpMassCopy (0 ,mpAppID (mp)) = mpMass (mp,0 );
373- }
374- };
375- p_MPs->parallel_for (getMPMass, " getMPMass" );
376- kkDbl2dViewHostU arrayHost (mpMassHost,nComps,numMPs);
377- Kokkos::deep_copy (arrayHost, mpMassCopy);
378- pumipic::RecordTime (" PolyMPO_getMPMass" , timer.seconds ());
329+ getMPData<polyMPO::MPF_Mass>(p_mpmesh, nComps, numMPs, mpMassHost);
379330}
380-
381331void polympo_setMPVel_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpVelIn) {
382332 setMPData<polyMPO::MPF_Vel>(p_mpmesh, nComps, numMPs, mpVelIn);
383333}
384-
385334void polympo_getMPVel_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpVelHost) {
386- Kokkos::Timer timer;
387- checkMPMeshValid (p_mpmesh);
388- auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
389- PMT_ALWAYS_ASSERT (nComps == vec2d_nEntries);
390- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getCount ());
391- PMT_ALWAYS_ASSERT (numMPs >= p_MPs->getMaxAppID ());
392-
393- auto mpVel = p_MPs->getData <polyMPO::MPF_Vel>();
394- auto mpAppID = p_MPs->getData <polyMPO::MPF_MP_APP_ID>();
395- Kokkos::View<double **> mpVelCopy (" mpVelCopy" ,vec2d_nEntries,numMPs);
396- auto getMPVel = PS_LAMBDA (const int & elm, const int & mp, const int & mask){
397- if (mask){
398- mpVelCopy (0 ,mpAppID (mp)) = mpVel (mp,0 );
399- mpVelCopy (1 ,mpAppID (mp)) = mpVel (mp,1 );
400- }
401- };
402- p_MPs->parallel_for (getMPVel, " getMPVel" );
403- kkDbl2dViewHostU arrayHost (mpVelHost,nComps,numMPs);
404- Kokkos::deep_copy (arrayHost, mpVelCopy);
405- pumipic::RecordTime (" PolyMPO_getMPVel" , timer.seconds ());
335+ getMPData<polyMPO::MPF_Vel>(p_mpmesh, nComps, numMPs, mpVelHost);
406336}
407-
408337void polympo_setMPStrainRate_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpStrainRateIn){
409338 setMPData<polyMPO::MPF_Strain_Rate>(p_mpmesh, nComps, numMPs, mpStrainRateIn);
410339}
411340void polympo_getMPStrainRate_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpStrainRateHost){
412- checkMPMeshValid (p_mpmesh);
413- std::cerr << " Error: This routine is not implemented yet\n " ;
414- exit (1 );
415- (void )p_mpmesh;
416- (void )nComps;
417- (void )numMPs;
418- (void )mpStrainRateHost;
341+ getMPData<polyMPO::MPF_Strain_Rate>(p_mpmesh, nComps, numMPs, mpStrainRateHost);
419342}
420343void polympo_setMPStress_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, const double * mpStressIn){
421344 setMPData<polyMPO::MPF_Stress>(p_mpmesh, nComps, numMPs, mpStressIn);
422345}
423346void polympo_getMPStress_f (MPMesh_ptr p_mpmesh, const int nComps, const int numMPs, double * mpStressHost){
424- checkMPMeshValid (p_mpmesh);
425- std::cerr << " Error: This routine is not implemented yet\n " ;
426- exit (1 );
427- (void )p_mpmesh;
428- (void )nComps;
429- (void )numMPs;
430- (void )mpStressHost;
347+ getMPData<polyMPO::MPF_Stress>(p_mpmesh, nComps, numMPs, mpStressHost);
431348}
432349
433350void polympo_startMeshFill_f (MPMesh_ptr p_mpmesh){
0 commit comments