@@ -92,6 +92,7 @@ void MPMesh::calculateStress(){
9292 MPsStress (mp, m) = stress[m];
9393 // Debugging
9494 if (MPsAppID (mp)==0 ){
95+ printf (" Strain in GPU: %.15e %.15e %.15e\n " , MPsStrainRate (mp, 0 ), MPsStrainRate (mp, 1 ), MPsStrainRate (mp, 2 ));
9596 printf (" Stress in GPU: %.15e %.15e %.15e\n " , MPsStress (mp, 0 ), MPsStress (mp, 1 ), MPsStress (mp, 2 ));
9697 }
9798 }
@@ -107,7 +108,8 @@ void MPMesh::calculateStressDivergence(){
107108 auto vtxCoords = p_mesh->getMeshField <polyMPO::MeshF_VtxCoords>();
108109 int numVertices = p_mesh->getNumVertices ();
109110 auto tanLatVertexRotatedOverRadius = p_mesh->getMeshField <MeshF_TanLatVertexRotatedOverRadius>();
110-
111+ auto interiorVertex = p_mesh->getMeshField <MeshF_InteriorVertex>();
112+
111113 // Material Points
112114 auto MPsAppID = p_MPs->getData <MPF_MP_APP_ID>();
113115 auto weight = p_MPs->getData <MPF_Basis_Vals>();
@@ -116,20 +118,22 @@ void MPMesh::calculateStressDivergence(){
116118 auto MPsStress = p_MPs->getData <MPF_Stress>();
117119 auto mpPositions = p_MPs->getData <MPF_Cur_Pos_XYZ>();
118120
119- auto VtxCoeffs_new = this ->precomputedVtxCoeffs_new ;
121+ auto VtxCoeffs_new = this ->precomputedVtxCoeffs_new ;
122+ auto vtxMatrixMass_l = this ->vtxMatrixMass ;
123+ auto nearAnEdge_l = this ->nearAnEdge ;
120124
121125 // Earth Radius
122126 double radius = 1.0 ;
123127 if (p_mesh->getGeomType () == geom_spherical_surf)
124128 radius=p_mesh->getSphereRadius ();
125129
126130 // Reconstructed the stress
127- Kokkos::View<double *[3 ]> stress_rec (" stress_rec" , p_mesh->getNumVertices ());
128131 Kokkos::View<double *> stress_divU (" stress_divu" , p_mesh->getNumVertices ());
129132 Kokkos::View<double *> stress_divV (" stress_divv" , p_mesh->getNumVertices ());
130- Kokkos::View<double *> dSdX (" dSdX" , p_mesh->getNumVertices ());
131- Kokkos::View<double *> dSdY (" dSdY" , p_mesh->getNumVertices ());
132-
133+
134+ Kokkos::View<double *> divU_edge (" divUedge" , p_mesh->getNumVertices ());
135+ Kokkos::View<double *> divV_edge (" divVedge" , p_mesh->getNumVertices ());
136+
133137 // Assemble fields for Stress Divergence
134138 auto stress_div = PS_LAMBDA (const int & elm, const int & mp, const int & mask) {
135139 if (mask) { // if material point is 'active'/'enabled'
@@ -152,16 +156,17 @@ void MPMesh::calculateStressDivergence(){
152156 VtxCoeffs_new (vID,2 , 2 )*CoordDiffs[2 ] +
153157 VtxCoeffs_new (vID,2 , 3 )*CoordDiffs[3 ]);
154158
155- for (int k=0 ; k<3 ; k++){
156- auto val = factor*MPsStress (mp,k);
157- Kokkos::atomic_add (&stress_rec (vID,k), val);
158- }
159159 Kokkos::atomic_add (&stress_divU (vID), factor1 * MPsStress (mp, 0 ) + factor2 * MPsStress (mp, 2 ) -
160160 2 * tanLatVertexRotatedOverRadius (vID, 0 ) * factor * MPsStress (mp, 2 ));
161161 Kokkos::atomic_add (&stress_divV (vID), factor2 * MPsStress (mp, 1 ) + factor1*MPsStress (mp, 2 ) +
162162 factor * tanLatVertexRotatedOverRadius (vID, 0 ) * (MPsStress (mp, 0 )-MPsStress (mp, 1 )));
163- Kokkos::atomic_add (&dSdX (vID), -factor * weight_grads (mp, i*2 + 0 ));
164- Kokkos::atomic_add (&dSdY (vID), -factor * weight_grads (mp, i*2 + 1 ));
163+
164+
165+ Kokkos::atomic_add (&divU_edge (vID), - weight_grads (mp, i*2 + 0 ) * MPsStress (mp, 0 ) - weight_grads (mp, i*2 + 1 ) * MPsStress (mp, 2 ) -
166+ 2 * tanLatVertexRotatedOverRadius (vID, 0 ) * w_vtx * MPsStress (mp, 2 ));
167+ Kokkos::atomic_add (&divV_edge (vID), - weight_grads (mp, i*2 + 1 ) * MPsStress (mp, 1 ) - weight_grads (mp, i*2 + 0 ) * MPsStress (mp, 2 ) +
168+ w_vtx * tanLatVertexRotatedOverRadius (vID, 0 ) * (MPsStress (mp, 0 )- MPsStress (mp, 1 )));
169+
165170 }
166171 }
167172 };
@@ -171,22 +176,17 @@ void MPMesh::calculateStressDivergence(){
171176 // COMMUNICATE THE VERTEX FIELDS
172177
173178 // TODO put as mesh field
174- Kokkos::View<doubleSclr_t*> stressDivergence (" stressDivergence" , p_mesh->getNumVertices ());
175- auto areaVertex = p_mesh->getMeshField <MeshF_DualTriangleArea>();
179+ Kokkos::View<vec2d_t *> stressDivergence (" stressDivergence" , p_mesh->getNumVertices ());
176180
177181 Kokkos::parallel_for (" calculate_divergence" , numVtx, KOKKOS_LAMBDA (const int vtx){
178- double threshold = 0.15 / Kokkos::sqrt (areaVertex (vtx, 0 ));
179- double valX = Kokkos::max (Kokkos::abs (dSdX (vtx)) - threshold, 0.0 );
180- double dSdX_filtered = Kokkos::copysign (valX, dSdX (vtx));
181- double valY = Kokkos::max (Kokkos::abs (dSdY (vtx)) - threshold, 0.0 );
182- double dSdY_filtered = Kokkos::copysign (valY, dSdY (vtx));
183182
184- stressDivergence (vtx, 0 ) = stress_divU (vtx) + dSdX_filtered * stress_rec (vtx, 0 ) + dSdY_filtered * stress_rec (vtx, 2 ) ;
185- stressDivergence (vtx, 1 ) = stress_divV (vtx) + dSdY_filtered * stress_rec (vtx, 1 ) + dSdX_filtered * stress_rec (vtx, 2 );
183+ stressDivergence (vtx, 0 ) = stress_divU (vtx);
184+ stressDivergence (vtx, 1 ) = stress_divV (vtx);
186185 // Debugging
187186 if (vtx >= 10 && vtx <= 11 ) {
188- printf (" Vtx %d Area %.15e ds: %.15e %.15e \n " , vtx, areaVertex (vtx, 0 ), dSdX_filtered, dSdY_filtered);
189- printf (" Vtx %d Divergence %.15e %.15e \n " , vtx, stressDivergence (vtx, 0 ), stressDivergence (vtx, 1 ));
187+ printf (" Vtx %d Divergence %.15e %.15e %.15e %.15e %.15e %.15e \n " , vtx, nearAnEdge_l (vtx), vtxMatrixMass_l (vtx),
188+ stress_divU (vtx), stress_divV (vtx),
189+ divU_edge (vtx), divV_edge (vtx));
190190 }
191191 });
192192
0 commit comments