bool spring::update( pReal ) { // vector between two springs vector3 force = ( secondary().position() - primary().position() ); // distance between particles pReal length( force.length() ); // magnitude of force, equal to displacement from rest length * spring constant pReal magnitude = ( length - restLength() ) * material().constant( force.length() / _initialRestLength, springMaterial::Loading ); // normal of force direction vector3 forceNorm = force.normalise(); // the actual force to exert on both particles ( negated one way ) vector3 exert = magnitude * forceNorm - material().springDamping() * ( primary().velocity() - secondary().velocity() ); // adjust the rest legnth if we are plastically deforming if( !jLib::math::fcmp( _oldLength, length ) && fabs( _oldLength - restLength() ) > fabs( length - restLength() ) ) { restLength( material().calculatePlasticLength( length, restLength() ) ); } // apply the forces secondary().applyForce( exert.negate() ); primary().applyForce( exert ); _oldLength = length; // tear if over the plastic limit if( fabs( length - restLength() ) > material().ultimateTensileStress() ) { return TRUE; } return FALSE; }
void spring::divideDeformationsAndReset( spring &in ) { // find current spring lengths pReal aLen( ( secondary().position() - primary().position() ).length() ); pReal bLen( ( in.secondary().position() - in.primary().position() ).length() ); // find the total length pReal totalLength( aLen + bLen ); //Initial Rest Length { // find the length we are aiming at pReal aimLength( _initialRestLength ); pReal totalLength( aLen + bLen ); // divide the length between them _initialRestLength = ( aimLength / totalLength ) * aLen; in._initialRestLength = ( aimLength / totalLength ) * bLen; } //Rest Length { pReal aimLength( restLength() ); // divide the length between them restLength( ( aimLength / totalLength ) * aLen ); in.restLength( ( aimLength / totalLength ) * bLen ); } }
TEST( secondary, examples_of_syntax ) { Symbol s1("*"); Language* primary = 0; Empty e2; Concatenation c3(&s1, primary); Alternation subsecondary(&c3, &e2); Concatenation secondary(primary, &subsecondary); }
BEGIN_PHYSICAL_NAMESPACE spring::spring( particle &inA, particle &inB, const springMaterial &mat ) : _primary( &inA ), _secondary( &inB ), _restLength( ( primary().position() - secondary().position() ).length() ), _material( &mat ) { _oldLength = _initialRestLength = _restLength; _oldMode = springMaterial::Rest; _internal = FALSE; }
int main(int argc, char* argv[]) { printf("Spawning threads\n"); boost::thread primary(primary_thread); boost::thread secondary(secondary_thread); printf("Joining threads\n"); primary.join(); secondary.join(); printf("Done\n"); return 0; }
void SimpleFileChannel::open() { FastMutex::ScopedLock lock(_mutex); if (!_pFile) { File primary(_path); File secondary(_secondaryPath); Timestamp pt = primary.exists() ? primary.getLastModified() : 0; Timestamp st = secondary.exists() ? secondary.getLastModified() : 0; std::string path; if (pt >= st) path = _path; else path = _secondaryPath; _pFile = new LogFile(path); } }
bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_location& loc, const unit* u2) const { if (!vcfg["name"].blank() && vcfg["name"].t_str() != u.name()) { return false; } if (!vcfg["id"].empty()) { std::vector<std::string> id_list = utils::split(vcfg["id"]); if (std::find(id_list.begin(), id_list.end(), u.id()) == id_list.end()) { return false; } } // Allow 'speaker' as an alternative to id, since people use it so often if (!vcfg["speaker"].blank() && vcfg["speaker"].str() != u.id()) { return false; } if (vcfg.has_child("filter_location")) { if (vcfg.count_children("filter_location") > 1) { FAIL("Encountered multiple [filter_location] children of a standard unit filter. " "This is not currently supported and in all versions of wesnoth would have " "resulted in the later children being ignored. You must use [and] or similar " "to achieve the desired result."); } terrain_filter filt(vcfg.child("filter_location"), &fc_, use_flat_tod_); if (!filt.match(loc)) { return false; } } if(vcfg.has_child("filter_side")) { if (vcfg.count_children("filter_side") > 1) { FAIL("Encountered multiple [filter_side] children of a standard unit filter. " "This is not currently supported and in all versions of wesnoth would have " "resulted in the later children being ignored. You must use [and] or similar " "to achieve the desired result."); } side_filter filt(vcfg.child("filter_side"), &fc_); if(!filt.match(u.side())) return false; } // Also allow filtering on location ranges outside of the location filter if (!vcfg["x"].blank() || !vcfg["y"].blank()){ if(vcfg["x"] == "recall" && vcfg["y"] == "recall") { //locations on the map are considered to not be on a recall list if (fc_.get_disp_context().map().on_board(loc)) { return false; } } else if(vcfg["x"].empty() && vcfg["y"].empty()) { return false; } else if(!loc.matches_range(vcfg["x"], vcfg["y"])) { return false; } } // The type could be a comma separated list of types if (!vcfg["type"].empty()) { std::vector<std::string> types = utils::split(vcfg["type"]); if (std::find(types.begin(), types.end(), u.type_id()) == types.end()) { return false; } } // Shorthand for all advancements of a given type if (!vcfg["type_tree"].empty()) { std::set<std::string> types; for(const std::string type : utils::split(vcfg["type_tree"])) { if(types.count(type)) { continue; } if(const unit_type* ut = unit_types.find(type)) { const auto& tree = ut->advancement_tree(); types.insert(tree.begin(), tree.end()); types.insert(type); } } if(types.find(u.type_id()) == types.end()) { return false; } } // The variation_type could be a comma separated list of types if (!vcfg["variation"].empty()) { std::vector<std::string> types = utils::split(vcfg["variation"]); if (std::find(types.begin(), types.end(), u.variation()) == types.end()) { return false; } } // The has_variation_type could be a comma separated list of types if (!vcfg["has_variation"].empty()) { bool match = false; // If this unit is a variation itself then search in the base unit's variations. const unit_type* const type = u.variation().empty() ? &u.type() : unit_types.find(u.type().base_id()); assert(type); for (const std::string& variation_id : utils::split(vcfg["has_variation"])) { if (type->has_variation(variation_id)) { match = true; break; } } if (!match) return false; } if (!vcfg["ability"].empty()) { bool match = false; for (const std::string& ability_id : utils::split(vcfg["ability"])) { if (u.has_ability_by_id(ability_id)) { match = true; break; } } if (!match) return false; } if (!vcfg["race"].empty()) { std::vector<std::string> races = utils::split(vcfg["race"]); if (std::find(races.begin(), races.end(), u.race()->id()) == races.end()) { return false; } } if (!vcfg["gender"].blank() && string_gender(vcfg["gender"]) != u.gender()) { return false; } if (!vcfg["side"].empty() && vcfg["side"].to_int(-999) != u.side()) { std::vector<std::string> sides = utils::split(vcfg["side"]); const std::string u_side = std::to_string(u.side()); if (std::find(sides.begin(), sides.end(), u_side) == sides.end()) { return false; } } // handle statuses list if (!vcfg["status"].empty()) { bool status_found = false; for (const std::string status : utils::split(vcfg["status"])) { if(u.get_state(status)) { status_found = true; break; } } if(!status_found) { return false; } } if (vcfg.has_child("has_attack")) { const vconfig& weap_filter = vcfg.child("has_attack"); bool has_weapon = false; for(const attack_type& a : u.attacks()) { if(a.matches_filter(weap_filter.get_parsed_config())) { has_weapon = true; break; } } if(!has_weapon) { return false; } } else if (!vcfg["has_weapon"].blank()) { std::string weapon = vcfg["has_weapon"]; bool has_weapon = false; for(const attack_type& a : u.attacks()) { if(a.id() == weapon) { has_weapon = true; break; } } if(!has_weapon) { return false; } } if (!vcfg["role"].blank() && vcfg["role"].str() != u.get_role()) { return false; } if (!vcfg["ai_special"].blank() && ((vcfg["ai_special"].str() == "guardian") != u.get_state(unit::STATE_GUARDIAN))) { return false; } if (!vcfg["canrecruit"].blank() && vcfg["canrecruit"].to_bool() != u.can_recruit()) { return false; } if (!vcfg["recall_cost"].blank() && vcfg["recall_cost"].to_int(-1) != u.recall_cost()) { return false; } if (!vcfg["level"].blank() && vcfg["level"].to_int(-1) != u.level()) { return false; } if (!vcfg["defense"].blank() && vcfg["defense"].to_int(-1) != u.defense_modifier(fc_.get_disp_context().map().get_terrain(loc))) { return false; } if (!vcfg["movement_cost"].blank() && vcfg["movement_cost"].to_int(-1) != u.movement_cost(fc_.get_disp_context().map().get_terrain(loc))) { return false; } // Now start with the new WML based comparison. // If a key is in the unit and in the filter, they should match // filter only => not for us // unit only => not filtered config unit_cfg; // No point in serializing the unit once for each [filter_wml]! for (const vconfig& wmlcfg : vcfg.get_children("filter_wml")) { config fwml = wmlcfg.get_parsed_config(); /* Check if the filter only cares about variables. If so, no need to serialize the whole unit. */ config::all_children_itors ci = fwml.all_children_range(); if (fwml.all_children_count() == 1 && fwml.attribute_count() == 1 && ci.front().key == "variables") { if (!u.variables().matches(ci.front().cfg)) return false; } else { if (unit_cfg.empty()) u.write(unit_cfg); if (!unit_cfg.matches(fwml)) return false; } } for (const vconfig& vision : vcfg.get_children("filter_vision")) { std::set<int> viewers; // Use standard side filter side_filter ssf(vision, &fc_); std::vector<int> sides = ssf.get_teams(); viewers.insert(sides.begin(), sides.end()); bool found = false; for (const int viewer : viewers) { bool fogged = fc_.get_disp_context().teams()[viewer - 1].fogged(loc); bool hiding = u.invisible(loc, fc_.get_disp_context()); bool unit_hidden = fogged || hiding; if (vision["visible"].to_bool(true) != unit_hidden) { found = true; break; } } if (!found) {return false;} } if (vcfg.has_child("filter_adjacent")) { const unit_map& units = fc_.get_disp_context().units(); map_location adjacent[6]; get_adjacent_tiles(loc, adjacent); for (const vconfig& adj_cfg : vcfg.get_children("filter_adjacent")) { int match_count=0; unit_filter filt(adj_cfg, &fc_, use_flat_tod_); config::attribute_value i_adjacent = adj_cfg["adjacent"]; std::vector<map_location::DIRECTION> dirs; if (i_adjacent.blank()) { dirs = map_location::default_dirs(); } else { dirs = map_location::parse_directions(i_adjacent); } std::vector<map_location::DIRECTION>::const_iterator j, j_end = dirs.end(); for (j = dirs.begin(); j != j_end; ++j) { unit_map::const_iterator unit_itor = units.find(adjacent[*j]); if (unit_itor == units.end() || !filt(*unit_itor, u)) { continue; } boost::optional<bool> is_enemy; if (!adj_cfg["is_enemy"].blank()) { is_enemy = adj_cfg["is_enemy"].to_bool(); } if (!is_enemy || *is_enemy == fc_.get_disp_context().teams()[u.side() - 1].is_enemy(unit_itor->side())) { ++match_count; } } static std::vector<std::pair<int,int> > default_counts = utils::parse_ranges("1-6"); config::attribute_value i_count = adj_cfg["count"]; if(!in_ranges(match_count, !i_count.blank() ? utils::parse_ranges(i_count) : default_counts)) { return false; } } } if (!vcfg["find_in"].blank()) { // Allow filtering by searching a stored variable of units if (const game_data * gd = fc_.get_game_data()) { try { variable_access_const vi = gd->get_variable_access_read(vcfg["find_in"]); bool found_id = false; for (const config& c : vi.as_array()) { if(c["id"] == u.id()) found_id = true; } if(!found_id) { return false; } } catch(const invalid_variablename_exception&) { return false; } } } if (!vcfg["formula"].blank()) { try { const unit_callable main(loc,u); game_logic::map_formula_callable callable(&main); if (u2) { std::shared_ptr<unit_callable> secondary(new unit_callable(*u2)); callable.add("other", variant(secondary.get())); // It's not destroyed upon scope exit because the variant holds a reference } const game_logic::formula form(vcfg["formula"]); if(!form.evaluate(callable).as_bool()) { return false; } return true; } catch(game_logic::formula_error& e) { lg::wml_error() << "Formula error in unit filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; // Formulae with syntax errors match nothing return false; } } if (!vcfg["lua_function"].blank()) { if (game_lua_kernel * lk = fc_.get_lua_kernel()) { bool b = lk->run_filter(vcfg["lua_function"].str().c_str(), u); if (!b) return false; } } return true; }
double PIC::shift_xyz(double dt, double boundary, double delta_max, double Emax, double E0, long *d1) { long j; int ref=0, sec=0; double gamma, u2, r2; double T0=2.0, phi_emit=0.0, energy=0.0; double ut=clight*sqrt(pow(fabs(charge_p)*T0/(mass_p*clight*clight)+1.0,2)-1.0); vector<Particle> part_new; for(j=0; j<part.size(); j++) { u2=pow(part[j].uy,2)+pow(part[j].ux,2)+pow(part[j].uz,2); gamma=sqrt(1.0+u2/pow(clight,2)); part[j].x+=part[j].ux*dt/gamma; part[j].y+=part[j].uy*dt/gamma; r2=pow(part[j].y,2)+pow(part[j].x,2); if ( sqrt(r2) > boundary ) { ref=reflection(get_energy(j),E0,d1); if (delta_max > 0.0) sec=secondary(get_energy(j),delta_max,Emax,d1); if ( ref == 1) { //phi_emit=0.5*PI*(2.0*ran1(d1)-1.0); //part[j].ux=-ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part[j].uy=-ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); //part[j].ux=-part[j].ux; //part[j].uy=-part[j].uy; reflection_circular(part[j].ux,part[j].uy,part[j].x,part[j].y); part[j].x=0.99*boundary*part[j].x/sqrt(r2); part[j].y=0.99*boundary*part[j].y/sqrt(r2); } else { if (sec == 0) { energy+=get_energy(j); part.erase(part.begin()+j); } else if (sec == 1) { energy+=get_energy(j); phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part[j].ux,part[j].uy,part[j].x,part[j].y,phi_emit,ut); //part[j].ux=-ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part[j].uy=-ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); part[j].x=0.99*boundary*part[j].x/sqrt(r2); part[j].y=0.99*boundary*part[j].y/sqrt(r2); } else if (sec == 2) { energy+=get_energy(j); Particle part_inj; phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part[j].ux,part[j].uy,part[j].x,part[j].y,phi_emit,ut); //part[j].ux=-ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part[j].uy=-ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part_inj.ux,part_inj.uy,part[j].x,part[j].y,phi_emit,ut); //part_inj.ux = -ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part_inj.uy = -ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); part_inj.uz = 0.0; part[j].x=0.99*boundary*part[j].x/sqrt(r2); part[j].y=0.99*boundary*part[j].y/sqrt(r2); part_inj.x = part[j].x; part_inj.y = part[j].y; part_inj.z = part[j].z; part_new.push_back(part_inj); } else if (sec == 3) { energy+=get_energy(j); Particle part_inj, part_inj_2; phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part[j].ux,part[j].uy,part[j].x,part[j].y,phi_emit,ut); //part[j].ux=-ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part[j].uy=-ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part_inj.ux,part_inj.uy,part[j].x,part[j].y,phi_emit,ut); //part_inj.ux = -ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part_inj.uy = -ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); part_inj.uz = 0.0; phi_emit=0.1*PI*(2.0*ran1(d1)-1.0); emission_circular(part_inj_2.ux,part_inj_2.uy,part[j].x,part[j].y,phi_emit,ut); //part_inj_2.ux = -ut*(cos(phi_emit)*part[j].x/sqrt(r2)-sin(phi_emit)*part[j].y/sqrt(r2)); //part_inj_2.uy = -ut*(sin(phi_emit)*part[j].y/sqrt(r2)+cos(phi_emit)*part[j].y/sqrt(r2)); part_inj_2.uz = 0.0; part[j].x=0.99*boundary*part[j].x/sqrt(r2); part[j].y=0.99*boundary*part[j].y/sqrt(r2); part_inj.x = part[j].x; part_inj.y = part[j].y; part_inj.z = part[j].z; part_inj_2.x = part[j].x; part_inj_2.y = part[j].y; part_inj_2.z = part[j].z; part_new.push_back(part_inj); part_new.push_back(part_inj_2); } else {cout << "shift_xyz: n>4" << endl; exit(0);} } } } for(j=0; j<part_new.size(); j++) part.push_back(part_new[j]); return macroN*energy; }