@@ -7,10 +7,76 @@ namespace polyMPO{
77
88void printVTP_mesh (MPMesh& mpMesh, int printVTPIndex=-1 );
99
10+ void MPMesh::calculateStrain (){
11+ auto MPsPosition = p_MPs->getPositions ();
12+ auto MPsBasis = p_MPs->getData <MPF_Basis_Vals>();
13+ auto MPsAppID = p_MPs->getData <MPF_MP_APP_ID>();
14+
15+ // Mesh Fields
16+ auto tanLatVertexRotatedOverRadius = p_mesh->getMeshField <MeshF_TanLatVertexRotatedOverRadius>();
17+ auto gnomProjVtx = p_mesh->getMeshField <MeshF_VtxGnomProj>();
18+ auto gnomProjElmCenter = p_mesh->getMeshField <MeshF_ElmCenterGnomProj>();
19+ auto elm2VtxConn = p_mesh->getElm2VtxConn ();
20+ auto velField = p_mesh->getMeshField <MeshF_Vel>();
21+ bool isRotated = p_mesh->getRotatedFlag ();
22+
23+ auto setMPStrainRate = PS_LAMBDA (const int & elm, const int & mp, const int & mask){
24+ if (mask){
25+ int numVtx = elm2VtxConn (elm,0 );
26+
27+ Vec3d position3d (MPsPosition (mp,0 ),MPsPosition (mp,1 ),MPsPosition (mp,2 ));
28+ if (isRotated){
29+ position3d[0 ] = -MPsPosition (mp, 2 );
30+ position3d[2 ] = MPsPosition (mp, 0 );
31+ }
32+ auto gnomProjElmCenter_sub = Kokkos::subview (gnomProjElmCenter, elm, Kokkos::ALL);
33+ double mpProjX, mpProjY;
34+
35+ computeGnomonicProjectionAtPoint (position3d, gnomProjElmCenter_sub, mpProjX, mpProjY);
36+
37+ auto gnom_vtx_subview = Kokkos::subview (gnomProjVtx, elm, Kokkos::ALL, Kokkos::ALL);
38+
39+ double basisByArea[maxVtxsPerElm] = {0.0 };
40+ initArray (basisByArea,maxVtxsPerElm,0.0 );
41+ double gradBasisByArea[2 *maxVtxsPerElm] = {0.0 };
42+ initArray (gradBasisByArea,maxVtxsPerElm,0.0 );
43+
44+ compute2DplanarTriangleArea (numVtx, gnom_vtx_subview, mpProjX, mpProjY, basisByArea);
45+ wachpress_weights_grads_2D (numVtx, gnom_vtx_subview, mpProjX, mpProjY, gradBasisByArea);
46+
47+ double v11 = 0.0 ;
48+ double v12 = 0.0 ;
49+ double v21 = 0.0 ;
50+ double v22 = 0.0 ;
51+ double uTanOverR = 0.0 ;
52+ double vTanOverR = 0.0 ;
53+ for (int i = 0 ; i < numVtx; i++){
54+ int iVertex = elm2VtxConn (elm, i+1 )-1 ;
55+ v11 = v11 + gradBasisByArea[i*2 + 0 ] * velField (iVertex, 0 );
56+ v12 = v12 + gradBasisByArea[i*2 + 1 ] * velField (iVertex, 0 );
57+ v21 = v21 + gradBasisByArea[i*2 + 0 ] * velField (iVertex, 1 );
58+ v22 = v22 + gradBasisByArea[i*2 + 1 ] * velField (iVertex, 1 );
59+ uTanOverR = uTanOverR + basisByArea[i] * tanLatVertexRotatedOverRadius (iVertex, 0 ) * velField (iVertex, 0 );
60+ vTanOverR = vTanOverR + basisByArea[i] * tanLatVertexRotatedOverRadius (iVertex, 0 ) * velField (iVertex, 1 );
61+
62+ if (MPsAppID (mp)==0 ){
63+ // printf("i %d Vtx %d Velocity %.15e %.15e \n", i, elm2VtxConn(elm,i+1)-1, velField(elm2VtxConn(elm,i+1)-1, 0), velField(elm2VtxConn(elm,i+1)-1, 1));
64+ // printf("Grads %.15e %.15e \n", gradBasisByArea[i*2 + 0], gradBasisByArea[i*2 + 1]);
65+ printf (" Vs %.15e %.15e %.15e %.15e \n " ,v11, v12, v21, v22);
66+ printf (" uvTan %.15e %.15e \n " , uTanOverR, vTanOverR);
67+ }
68+ }
69+ }
70+ };
71+ p_MPs->parallel_for (setMPStrainRate, " setMPStrainRate" );
72+ }
73+
1074void MPMesh::calcBasis (bool use3DArea) {
1175 assert (p_mesh->getGeomType () == geom_spherical_surf);
76+
1277 auto MPsPosition = p_MPs->getPositions ();
13- auto mp_basis_field = p_MPs->getData <MPF_Basis_Vals>(); // we can implement MPs->getBasisVals() like MPs->getPositions()
78+ auto MPsBasis = p_MPs->getData <MPF_Basis_Vals>();
79+ auto MPsAppID = p_MPs->getData <MPF_MP_APP_ID>();
1480
1581 auto elm2VtxConn = p_mesh->getElm2VtxConn ();
1682 auto vtxCoords = p_mesh->getMeshField <MeshF_VtxCoords>();
@@ -38,6 +104,9 @@ void MPMesh::calcBasis(bool use3DArea) {
38104
39105 double basisByArea[maxVtxsPerElm] = {0.0 };
40106 initArray (basisByArea,maxVtxsPerElm,0.0 );
107+ double gradBasisByArea[2 *maxVtxsPerElm] = {0.0 };
108+ initArray (gradBasisByArea,maxVtxsPerElm,0.0 );
109+
41110
42111 if (!use3DArea){
43112 double mpProjX, mpProjY;
@@ -55,7 +124,7 @@ void MPMesh::calcBasis(bool use3DArea) {
55124 }
56125 // fill step
57126 for (int i=0 ; i<= numVtx; i++){
58- mp_basis_field (mp,i) = basisByArea[i];
127+ MPsBasis (mp,i) = basisByArea[i];
59128 }
60129 }
61130 };
0 commit comments