void FixWallGran::post_force_mesh(int vflag) { // contact properties double force_old[3],force_wall[3],v_wall[3],bary[3]; double delta[3],deltan; double *c_history = 0; MultiVectorContainer<double,3,3> *vMeshC; double ***vMesh; int nlocal = atom->nlocal; int nTriAll, iPart; for(int iMesh = 0; iMesh < n_FixMesh_; iMesh++) { TriMesh *mesh = FixMesh_list_[iMesh]->triMesh(); nTriAll = mesh->sizeLocal() + mesh->sizeGhost(); FixContactHistory *fix_contact = FixMesh_list_[iMesh]->contactHistory(); // mark all contacts for delettion at this point if(fix_contact) fix_contact->markAllContacts(); int *neighborList = 0, *numNeigh = 0; // get neighborList and numNeigh FixMesh_list_[iMesh]->meshNeighlist()->getPointers(neighborList, numNeigh); vectorZeroize3D(v_wall); vMeshC = mesh->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v"); atom_type_wall_ = FixMesh_list_[iMesh]->atomTypeWall(); // moving mesh if(vMeshC) { vMesh = vMeshC->begin(); // loop owned and ghost triangles for(int iTri = 0; iTri < nTriAll; iTri++) { for(int iCont = 0; iCont < numNeigh[iTri]; iCont++,neighborList++) { int iPart = *neighborList; // do not need to handle ghost particles if(iPart >= nlocal) continue; int idTri = mesh->id(iTri); deltan = mesh->resolveTriSphereContactBary(iTri,radius_ ? radius_[iPart]:r0_ ,x_[iPart],delta,bary); if(deltan > 0.) { } else { if(fix_contact && ! fix_contact->handleContact(iPart,idTri,c_history)) continue; for(int i = 0; i < 3; i++) v_wall[i] = (bary[0]*vMesh[iTri][0][i] + bary[1]*vMesh[iTri][1][i] + bary[2]*vMesh[iTri][2][i]); post_force_eval_contact(iPart,deltan,delta,v_wall,c_history,iMesh,FixMesh_list_[iMesh],mesh,iTri); } } } } // non-moving mesh - do not calculate v_wall, use standard distance function else { // loop owned and ghost particles for(int iTri = 0; iTri < nTriAll; iTri++) { for(int iCont = 0; iCont < numNeigh[iTri]; iCont++,neighborList++) { int iPart = *neighborList; // do not need to handle ghost particles if(iPart >= nlocal) continue; int idTri = mesh->id(iTri); deltan = mesh->resolveTriSphereContact(iTri,radius_ ? radius_[iPart]:r0_,x_[iPart],delta); if(deltan > 0.) { } else { if(fix_contact && ! fix_contact->handleContact(iPart,idTri,c_history)) continue; post_force_eval_contact(iPart,deltan,delta,v_wall,c_history,iMesh,FixMesh_list_[iMesh],mesh,iTri); } } } } // clean-up contacts if(fix_contact) fix_contact->cleanUpContacts(); } }
void FixWallGran::post_force_mesh(int vflag) { // contact properties double force_old[3],force_wall[3],v_wall[3],bary[3]; double delta[3],deltan; MultiVectorContainer<double,3,3> *vMeshC; double ***vMesh; int nlocal = atom->nlocal; int nTriAll, iPart; CollisionData cdata; cdata.is_wall = true; for(int iMesh = 0; iMesh < n_FixMesh_; iMesh++) { TriMesh *mesh = FixMesh_list_[iMesh]->triMesh(); nTriAll = mesh->sizeLocal() + mesh->sizeGhost(); FixContactHistoryMesh *fix_contact = FixMesh_list_[iMesh]->contactHistory(); // mark all contacts for delettion at this point if(fix_contact) fix_contact->markAllContacts(); // get neighborList and numNeigh FixNeighlistMesh * meshNeighlist = FixMesh_list_[iMesh]->meshNeighlist(); vectorZeroize3D(v_wall); vMeshC = mesh->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v"); atom_type_wall_ = FixMesh_list_[iMesh]->atomTypeWall(); // moving mesh if(vMeshC) { vMesh = vMeshC->begin(); // loop owned and ghost triangles for(int iTri = 0; iTri < nTriAll; iTri++) { const std::vector<int> & neighborList = meshNeighlist->get_contact_list(iTri); const int numneigh = neighborList.size(); for(int iCont = 0; iCont < numneigh; iCont++) { const int iPart = neighborList[iCont]; // do not need to handle ghost particles if(iPart >= nlocal) continue; int idTri = mesh->id(iTri); deltan = mesh->resolveTriSphereContactBary(iPart,iTri,radius_ ? radius_[iPart]:r0_ ,x_[iPart],delta,bary); if(deltan > skinDistance_) //allow force calculation away from the wall { } else { if(fix_contact && ! fix_contact->handleContact(iPart,idTri,cdata.contact_history)) continue; for(int i = 0; i < 3; i++) v_wall[i] = (bary[0]*vMesh[iTri][0][i] + bary[1]*vMesh[iTri][1][i] + bary[2]*vMesh[iTri][2][i]); cdata.i = iPart; cdata.deltan = -deltan; cdata.delta[0] = -delta[0]; cdata.delta[1] = -delta[1]; cdata.delta[2] = -delta[2]; post_force_eval_contact(cdata, v_wall,iMesh,FixMesh_list_[iMesh],mesh,iTri); } } } } // non-moving mesh - do not calculate v_wall, use standard distance function else { // loop owned and ghost particles for(int iTri = 0; iTri < nTriAll; iTri++) { const std::vector<int> & neighborList = meshNeighlist->get_contact_list(iTri); const int numneigh = neighborList.size(); for(int iCont = 0; iCont < numneigh; iCont++) { const int iPart = neighborList[iCont]; // do not need to handle ghost particles if(iPart >= nlocal) continue; int idTri = mesh->id(iTri); deltan = mesh->resolveTriSphereContact(iPart,iTri,radius_ ? radius_[iPart]:r0_,x_[iPart],delta); if(deltan > skinDistance_) //allow force calculation away from the wall { } else { if(fix_contact && ! fix_contact->handleContact(iPart,idTri,cdata.contact_history)) continue; cdata.i = iPart; cdata.deltan = -deltan; cdata.delta[0] = -delta[0]; cdata.delta[1] = -delta[1]; cdata.delta[2] = -delta[2]; post_force_eval_contact(cdata, v_wall,iMesh,FixMesh_list_[iMesh],mesh,iTri); } } } } // clean-up contacts if(fix_contact) fix_contact->cleanUpContacts(); } }