Exemple #1
0
void
MMO_Expression_::_addAlgebriacDeps (Index algIndex, MMO_Equation equation,
				    Index equationIndex, Index derivativeIndex,
				    Dependencies derivativeDeps,
				    map<Index, Index> *states,
				    map<Index, Index> *discretes,
				    Index variableChange, int value)
{
  stringstream buffer;
  string indent;
  string variableString = equation->lhs ().variable (algIndex, "i");
  Dependencies deps = equation->exp ()->deps ();
  map<Index, Index> &stateVariables = *states;
  Index eqIndex = equationIndex;
  for (Index *idx = deps->begin (DEP_STATE); !deps->end (DEP_STATE);
      idx = deps->next (DEP_STATE))
    {
      if (stateVariables.find (*idx) == stateVariables.end ()
	  || equation->lhs ().variableChange (algIndex))
	{
	  Index stateIndex = Index (
	      idx->applyVariableChange (
		  equation->lhs ().variableIndex (algIndex)));
	  stateVariables[*idx] = *idx;
	  eqIndex.setOffset (_equationIndex++);
	  if (idx->hasRange () && eqIndex.hasRange ())
	    {
	      // X[i] = B[i];
	      derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE);
	    }
	  else if (!idx->hasRange () && eqIndex.hasRange ())
	    {
	      // X[i] = B[N];
	      derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE);
	    }
	  else if (idx->hasRange () && !eqIndex.hasRange ())
	    {
	      // X[N] = B[i];
	      if (derivativeIndex.hasRange ())
		{
		  Index newEqIndex = eqIndex;
		  newEqIndex.setRange ();
		  newEqIndex.setLow (derivativeIndex.low ());
		  newEqIndex.setHi (derivativeIndex.hi ());
		  derivativeDeps->insert (
		      stateIndex.indexValue (
			  stateIndex.value (algIndex.constant ())),
		      newEqIndex, DEP_ALGEBRAIC_STATE);
		}
	      else
		{
		  derivativeDeps->insert (
		      stateIndex.indexValue (
			  stateIndex.value (algIndex.constant ())),
		      eqIndex, DEP_ALGEBRAIC_STATE);
		}
	    }
	  else if (!idx->hasRange () && !eqIndex.hasRange ())
	    {
	      // X[N] = B[N];
	      if (derivativeIndex.hasRange () && !algIndex.isArray())
	     	{
	     	  Index newEqIndex = eqIndex;
	     	  newEqIndex.setRange ();
	     	  newEqIndex.setLow (derivativeIndex.low ());
	     	  newEqIndex.setHi (derivativeIndex.hi ());
	     	  derivativeDeps->insert (stateIndex,
	     	      newEqIndex, DEP_ALGEBRAIC_STATE);
	     	}
	      else
	     	{
	          derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE);
	     	}

	    }
	}
    }
  map<Index, Index> &discreteVariables = *discretes;
  for (Index *idx = deps->begin (DEP_DISCRETE); !deps->end (DEP_DISCRETE); idx =
      deps->next (DEP_DISCRETE))
    {
      if (discreteVariables.find (*idx) == discreteVariables.end ()
	  || equation->lhs ().variableChange (algIndex))
	{
	  Index discreteIndex = Index (
	      idx->applyVariableChange (
		  equation->lhs ().variableIndex (algIndex)));
	  discreteVariables[*idx] = *idx;
	  eqIndex.setOffset (_equationIndex++);
	  if (idx->hasRange () && eqIndex.hasRange ())
	    {
	      // X[i] = B[i];
	      derivativeDeps->insert (discreteIndex, eqIndex,
				      DEP_ALGEBRAIC_DISCRETE);
	    }
	  else if (!idx->hasRange () && eqIndex.hasRange ())
	    {
	      // X[i] = B[N];
	      derivativeDeps->insert (discreteIndex, eqIndex,
				      DEP_ALGEBRAIC_DISCRETE);
	    }
	  else if (idx->hasRange () && !eqIndex.hasRange ())
	    {
	      // X[N] = B[i];
	      derivativeDeps->insert (
		  discreteIndex.indexValue (
		      discreteIndex.value (discreteIndex.constant ())),
		  eqIndex, DEP_ALGEBRAIC_DISCRETE);
	    }
	  else if (!idx->hasRange () && !eqIndex.hasRange ())
	    {
	      // X[N] = B[N];
	      derivativeDeps->insert (discreteIndex, eqIndex,
				      DEP_ALGEBRAIC_DISCRETE);
	    }
	}
    }
  for (Index *idx = deps->begin (DEP_STATE_VECTOR);
      !deps->end (DEP_STATE_VECTOR); idx = deps->next (DEP_STATE_VECTOR))
    {
      derivativeDeps->insert (*idx, DEP_STATE_VECTOR);
    }
  for (Index *idx = deps->begin (DEP_DISCRETE_VECTOR);
      !deps->end (DEP_DISCRETE_VECTOR); idx = deps->next (DEP_DISCRETE_VECTOR))
    {
      derivativeDeps->insert (*idx, DEP_DISCRETE_VECTOR);
    }
  _traverseAlgebraics (deps, derivativeIndex, derivativeDeps, states, discretes,
		       variableChange, DEP_ALGEBRAIC_DEF, value);
  _traverseAlgebraics (deps, derivativeIndex, derivativeDeps, states, discretes,
		       variableChange, DEP_ALGEBRAIC_VECTOR_DEF, value);
}