void FixMoveMesh::initial_integrate(int dummy) { MultiVectorContainer<double,3,3> *v; double dt = update->dt; time_ += update->dt; time_since_setup_ += update->dt; if(move_->isFirst()) { v = mesh_->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v"); v->setAll(0.); } // integration move_->initial_integrate(time_,time_since_setup_,dt); }
void FixMoveMesh::pre_delete(bool unfixflag) { // check if another fix move operates on the same mesh // which came after me in the imput script // if so, it is illegal to delete this command // without first deleting the other if(unfixflag) { int nmove = modify->n_fixes_style("move/mesh"); for(int imove = 0; imove < nmove; imove++) { FixMoveMesh* fix_move_mesh = static_cast<FixMoveMesh*>(modify->find_fix_style("move/mesh",imove)); if(fix_move_mesh != this && fix_move_mesh->fixMesh() == fixMesh() && move_->isFirst()) error->all(FLERR,"Illegal deletion of a fix move/mesh. There is another fix move/mesh command active on the same mesh. " "Superposed fix move/mesh commands must be unfixed in reverse order of creation"); } move_->pre_delete(); // do not delete property v, as a dump command may still refer to it // set velocity to zero MultiVectorContainer<double,3,3> *v; v = mesh_->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v"); if(v) v->setAll(0.); // remove reference point if have one char refpt_id[200]; sprintf(refpt_id, "REFPT_%s",id); if(mesh_->prop().getGlobalProperty< VectorContainer<double,3> >(refpt_id)) mesh_->prop().removeGlobalProperty(refpt_id); } delete move_; }
void FixMoveMesh::setup(int vflag) { time_since_setup_ = 0.; reset_reference_point(); if(!mesh_->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v")) { mesh_->prop().addElementProperty<MultiVectorContainer<double,3,3> >("v","comm_exchange_borders","frame_invariant","restart_no"); } move_->setup(); // do set-up in case velocity is dumped (called via set-up) if(move_->isFirst()) { MultiVectorContainer<double,3,3> *v; v = mesh_->prop().getElementProperty<MultiVectorContainer<double,3,3> >("v"); v->setAll(0.); } }
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(); } }