FixContactPropertyAtomWall::FixContactPropertyAtomWall(LAMMPS *lmp, int narg, char **arg) : FixContactPropertyAtom(lmp, narg, arg), fix_mesh_surface_(0), fix_nneighs_(0), primitive_wall_(0) { // read style: primitive or mesh if(narg-iarg_ < 2) error->fix_error(FLERR,this,"not enough parameters"); // parse further args if (strcmp(arg[iarg_],"primitive") == 0) { iarg_++; FixWallGran *fwg = static_cast<FixWallGran*>(modify->find_fix_id(arg[iarg_++])); if(!fwg) error->fix_error(FLERR,this,"illegal FixWallGran id"); primitive_wall_ = fwg->primitiveWall(); } else if (strcmp(arg[iarg_],"mesh") == 0) { iarg_++; fix_mesh_surface_ = static_cast<FixMeshSurface*>(modify->find_fix_id(arg[iarg_++])); if(!fix_mesh_surface_) error->fix_error(FLERR,this,"illegal FixMeshSurface id"); fix_nneighs_ = fix_mesh_surface_->meshNeighlist()->fix_nneighs(); } else error->fix_error(FLERR,this,"expecting 'primitive' or 'mesh'"); }
void FixContinuumWeighted::init() { pairgran_ = (PairGran*)force->pair_match("gran",0); // contact forces between a pair fix_contact_forces_ = static_cast<FixContactPropertyAtom*>(modify->find_fix_id("contactforces_stress_")); if(!fix_contact_forces_) error->fix_error(FLERR,this,"Internal error: need fix contactforces_stress_"); // contact forces between particle & walls: fix_wall_contact_forces_vector_.clear(); int nwalls = modify->n_fixes_style("wall/gran"); for(int iwall = 0; iwall < nwalls; iwall++) { FixWallGran *fwg = static_cast<FixWallGran*>(modify->find_fix_style("wall/gran",iwall)); if(!fwg->store_force_contact_stress()) error->fix_error(FLERR,this,"Internal error: contact forces for stress computation are not stored (make sure this fix is added before the wall fixes or use the explicit store_force_contact_stress option in those fixes)"); if(fwg->is_mesh_wall()) { int n_meshes = fwg->n_meshes(); for(int imesh = 0; imesh < n_meshes; imesh++) { char fixid[200]; sprintf(fixid,"contactforces_stress_%s",(fwg->mesh_list())[imesh]->id); FixContactPropertyAtomWall *fix_contact_wall = static_cast<FixContactPropertyAtomWall*>(modify->find_fix_id(fixid)); if(!fix_contact_wall) error->fix_error(FLERR,this,"Internal error: need fix contactforces"); fix_wall_contact_forces_vector_.push_back(fix_contact_wall); } } else { char fixid[200]; sprintf(fixid,"contactforces_stress_%s",fwg->id); FixContactPropertyAtomWall *fix_contact_wall = static_cast<FixContactPropertyAtomWall*>(modify->find_fix_id(fixid)); if(!fix_contact_wall) error->fix_error(FLERR,this,"Internal error: need fix contactforces"); fix_wall_contact_forces_vector_.push_back(fix_contact_wall); } } }
void ComputePairGranLocal::init_cpgl(bool requestflag) { int ifix, n_wall_fixes; FixWallGran *fwg; newton_pair = force->newton_pair; if (idflag && atom->tag_enable == 0) error->all(FLERR,"Compute pair/gran/local requested to compute IDs, this requires atoms have IDs."); // if available from previous run, unregister if(pairgran && reference_exists) pairgran->unregister_compute_pair_local(this); if(fixwall && reference_exists) fixwall->unregister_compute_wall_local(this); if(fixheat && reference_exists) fixheat->unregister_compute_pair_local(this); fixwall = NULL; fixheat = NULL; pairgran = NULL; // register heat transfer fix for pair data if(wall == 0) { if (force->pair == NULL) error->all(FLERR,"No pair style is defined for compute pair/gran/local"); pairgran = (PairGran*)force->pair_match("gran",0); if (pairgran == NULL) error->all(FLERR,"No valid granular pair style found for use with compute pair/gran/local"); if (pairgran->cplenable() == 0) error->all(FLERR,"Pair style does not support compute pair/gran/local"); pairgran->register_compute_pair_local(this,dnum); if(requestflag) { int irequest = neighbor->request((void *) this); neighbor->requests[irequest]->pair = 0; neighbor->requests[irequest]->compute = 1; neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->gran = 1; //neighbor->requests[irequest]->granhistory = 1; neighbor->requests[irequest]->occasional = 1; } // register heat transfer fix if applicable if(hfflag) { for(ifix = 0; ifix < modify->nfix; ifix++) { if(strcmp(modify->fix[ifix]->style,"heat/gran/conduction") == 0) { fixheat = static_cast<FixHeatGranCond*>(modify->fix[ifix]); } } if(!fixheat) error->warning(FLERR,"Compute pair/gran/local can not calculate heat flux values since no fix heat/gran/conduction not compute them"); // group of this compute and heat transfer fix must be same so same number of pairs is computed if(groupbit != fixheat->groupbit) error->all(FLERR,"Compute pair/gran/local group and fix heat/gran/conduction group cannot be different"); fixheat->register_compute_pair_local(this); } } // register with granular wall, only accept mesh walls else { if(fixwall) fixwall->unregister_compute_wall_local(this); fixwall = NULL; n_wall_fixes = modify->n_fixes_style("wall/gran"); for(ifix = 0; ifix < n_wall_fixes; ifix++) { fwg = static_cast<FixWallGran*>(modify->find_fix_style("wall/gran",ifix)); if(fwg->is_mesh_wall()) fixwall = fwg; } if(!fixwall) error->all(FLERR,"Compute wall/gran/local requires a fix of type wall/gran using one or more mesh walls. This fix has come before the compute in the script"); fixwall->register_compute_wall_local(this,dnum); } // at this point we know that ptr is valid reference_exists = 1; if(hflag && dnum == 0) error->all(FLERR,"Compute pair/gran/local or wall/gran/local can not calculate history values since pair or wall style does not compute them"); // standard values: pos1,pos2,id1,id2,extra id for mesh wall,force,torque,contact area nvalues = posflag*6 + velflag*6 + idflag*3 + fflag*3 + tflag*3 + hflag*dnum + aflag + hfflag; size_local_cols = nvalues; }