Ejemplo n.º 1
0
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;
    }
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 4
0
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;
    }
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
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);
	}
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}