/**
  Sets up the species and the source compartment. We use the pre-defined
  drift-diffusion method gpgmp::DT_ORNSTEIN_UHLENBECK and set the kernel
  parameters accordingly.

  \see setComputeDriftDiffusivityMethod
  \see setParameter
  */
OrnsteinUhlenbeckProblem::OrnsteinUhlenbeckProblem(Real length, int dx, int dy,
                                                   Real diffusivityX, Real diffusivityY,
                                                   Real gxx, Real gxy, Real gyx, Real gyy,
                                                   int numMolecules)
    : DiffusionModel(length, dx, dy)
{
    // one species
    Species *speciesA = addSpecies("A", 1.);

    // set boundary mask
    const cl_int4 boundaryMask = {{1, 1, 1, 1}};
    const cl_int4 sourceMask   = {{0, 0, 0, 0}};
    setBoundaryMasks(boundaryMask, sourceMask);

    // add source compartment
    Compartment *compartmentSource = new Compartment("TrueSource", dx/4,dy/4, dx/4, dy/4);
    compartmentSource->setInitialAmount(speciesA, numMolecules, gpgmp::HomogeneousDistribution);
    addCompartment(compartmentSource);

    // add user parameters for kernel
    setParameter("diffX", diffusivityX);
    setParameter("diffY", diffusivityY);
    setParameter("gammaXX", gxx);
    setParameter("gammaXY", gxy);
    setParameter("gammaYX", gyx);
    setParameter("gammaYY", gyy);

    // set OU method
    setComputeDriftDiffusivityMethod(gpgmp::DT_ORNSTEIN_UHLENBECK);
}
Esempio n. 2
0
bool CModelExpansion::SetOfModelElements::addObject(const CCopasiObject* x)
{
  if (dynamic_cast<const CCompartment*>(x))
    {
      addCompartment(dynamic_cast<const CCompartment*>(x));
      return true;
    }

  if (dynamic_cast<const CMetab*>(x))
    {
      addMetab(dynamic_cast<const CMetab*>(x));
      return true;
    }

  if (dynamic_cast<const CReaction*>(x))
    {
      addReaction(dynamic_cast<const CReaction*>(x));
      return true;
    }

  if (dynamic_cast<const CModelValue*>(x))
    {
      addGlobalQuantity(dynamic_cast<const CModelValue*>(x));
      return true;
    }

  if (dynamic_cast<const CEvent*>(x))
    {
      addEvent(dynamic_cast<const CEvent*>(x));
      return true;
    }

  return false;
}
Esempio n. 3
0
void CModelExpansion::SetOfModelElements::fillComplete(const CModel* pModel)
{
  if (!pModel)
    return;

  size_t i;

  for (i = 0; i < pModel->getCompartments().size(); ++i)
    addCompartment(pModel->getCompartments()[i]);

  for (i = 0; i < pModel->getMetabolites().size(); ++i)
    addMetab(pModel->getMetabolites()[i]);

  for (i = 0; i < pModel->getReactions().size(); ++i)
    addReaction(pModel->getReactions()[i]);

  for (i = 0; i < pModel->getModelValues().size(); ++i)
    addGlobalQuantity(pModel->getModelValues()[i]);

  for (i = 0; i < pModel->getEvents().size(); ++i)
    addEvent(pModel->getEvents()[i]);
}
Esempio n. 4
0
// FIXME: check for memory leaks
JSONcontext* Network::readJSON(const char* file){
   JsonParser *parser;
   JsonObject *obj;
   JsonArray *jnodes;
   JsonArray *jedges;
   int i,k;
   JSONcontext* ctx=new JSONcontext();
   GError *error;
   g_type_init ();
   parser = json_parser_new ();
   
   error = NULL;
   json_parser_load_from_file (parser, file, &error);
   if (error)
   {
      g_print ("Unable to parse `%s': %s\n", file, error->message);
      g_error_free (error);
      g_object_unref (parser);
      abort();
   }
   addCompartment(0,"unknown"); // add dummy compartment, may be overwritten by compartment from json
   ctx->root = json_node_copy(json_parser_get_root(parser)); // needs to be copied ??
   obj=json_node_get_object (ctx->root);
   jnodes=json_object_get_array_member(obj,"nodes");
   jedges=json_object_get_array_member(obj,"edges");
   g_print ("%i nodes\n",json_array_get_length(jnodes));
   for (i=0;i<json_array_get_length(jnodes);i++){
      JsonObject *n=json_array_get_object_element(jnodes,i);
      JsonObject *data=json_object_get_object_member(n,"data");
      const char* type=json_object_get_string_member(n,"type");
      const char* id=json_object_get_string_member(n,"id");
      if (json_object_has_member(n,"is_abstract") && (json_object_get_boolean_member(n,"is_abstract") || json_object_get_int_member(n,"is_abstract"))){
         continue;
      }
      if (!json_object_has_member(n,"index")){
         g_print ("no index defined for %s %s\n",type,id);
         abort();
      }
      int idx=json_object_get_int_member(n,"index");
      g_print ("node %d %s id %s\n",idx,type,id);
      if(strcmp(type,"Compartment")==0){
         addCompartment(idx,id);
      } else {
         double x=json_object_get_double_member(data,"x");
         double y=json_object_get_double_member(data,"y");
         double w=json_object_get_double_member(data,"width");
         double h=json_object_get_double_member(data,"height");
         double d=json_object_get_double_member(data,"dir");
         int c=json_object_get_int_member(data,"compartmentidx");
         for(k=0;k<7;k++){
            if(strcmp(jnodetypes[k],type)==0)break;
         }
         if (k==7){
            g_print ("unknown node type %s\n",type);
            abort();
         }
         addNode(idx,inodetypes[k],id,w,h,x,y,d,c);
         if (idx>=ctx->nodeidx->size()) ctx->nodeidx->resize(idx+1);
         (*(ctx->nodeidx))[idx]=i;
      }
   }
   g_print ("%i edges\n",json_array_get_length(jedges));
   for (i=0;i<json_array_get_length(jedges);i++){
      JsonObject *e=json_array_get_object_element(jedges,i);
      const char* type=json_object_get_string_member(e,"type");
      if ((!json_object_has_member(e,"sourceidx")) || (!json_object_has_member(e,"targetidx"))){
         g_print ("no source/targetindex defined for edge %s %i",type,i);
         abort;
      }
      for(k=0;k<7;k++){
         if(strcmp(edgetypes[k],type)==0)break;
      }
      int from=json_object_get_int_member(e,"sourceidx");
      int to=json_object_get_int_member(e,"targetidx");
      addEdge(from,to,(Edgetype)k);
      g_print ("edge %s %i -> %i\n",edgetypes[k],from,to);
   }
   g_object_unref(parser);
   return ctx;
}
Esempio n. 5
0
void Network::read(const char* file){
   try {
      int numc,ci,i,n,m,p,q,k,_index;
      int ret;
      Nodetype _type;
      char s[100],t[100];
      float _x,_y, _width, _height,_dir;
      FILE* old_stdin=stdin;
      printf("importing network\n");
      if (file) freopen(file,"r",stdin);
      ret=1;
      while (ret>0){ret=scanf(" #%[^\n]",s);}; // remove comment lines
      if (ret<0) throw "error reading input";
      MSCANF(" %d\n",&numc); // num compartments
      if (numc>2000){
         fprintf(stderr,"too many compartments %d",numc);
         abort();
      }
      printf("number of compartments: %d\n",numc);
      for(i=0;i<numc;i++){
         MSCANF2(" %d %s\n",&_index,t);
         if (_index>numc+1){ // not starting at zero
            fprintf(stderr,"compartment index out of bound %d",_index);
            abort();
         }
         addCompartment(_index,t);
      }  
      addCompartment(0,"unknown");
      numc++;
      MSCANF(" %s\n",s); // "///"  
      MSCANF(" %d",&n); //number of nodes
      printf("number of nodes: %d\n",n);
      if (n>10000){
         fprintf(stderr,"too many nodes %d",n);
         abort();
      }
      for(i=0;i<n;i++){
         MSCANF(" %d\n",&_index);
         if (_index>=n){
            fprintf(stderr,"node index out of bound %d",_index);
            abort();
         }
         MSCANF(" %s\n",t);
         if(strcmp(t,"Compound")==0)_type=compound;
         else if(strcmp(t,"Reaction")==0)_type=reaction;
         else if(strcmp(t,"Other")==0)_type=other;
         else _type=none;
         MSCANF("%s\n",s);
         MSCANF("%d\n",&ci); 
         MSCANF2("%f%f",& _x,& _y);
         MSCANF3("%f%f%f",& _width,& _height,& _dir);      
         addNode(_index, _type, s, _width, _height, _x, _y, _dir,ci);
         printf("added %s %s %i\n",t,s,_index);
      }
      MSCANF(" %s\n",s); // "///"
      MSCANF(" %d\n",&m); // numer of edges
      printf("number of edges: %d\n",m);
      if (m>40000){
         fprintf(stderr,"too many edges %d",m);
         abort();
      }
      fflush(stdout);
      for(i=0;i<m;i++){
         MSCANF3("%s %d %d\n",s,&p,&q);
         if (p>=n){
            fprintf(stderr,"edge node index out of bound %d",p);
            abort();
         }
         if (q>=n){
            fprintf(stderr,"edge node index out of bound %d",q);
            abort();
         }
         for(k=0;k<7;k++){
            if(strcmp(edgetypes[k],s)==0)break;
         }
         addEdge(p,q,(Edgetype)k);
      }
   } catch (char* err){
      cout << err <<endl;
      abort();
   }
}
Esempio n. 6
0
void CModelExpansion::SetOfModelElements::fillDependencies(const CModel* pModel)
{
  if (!pModel) return;

  //create a combined set of all elements we know are to be copied
  std::set< const CCopasiObject * > combinedSet;

  std::set<const CCompartment*>::const_iterator itComp;

  for (itComp = mCompartments.begin(); itComp != mCompartments.end(); ++itComp)
    {
      std::set< const CCopasiObject * > tmp = (*itComp)->getDeletedObjects();
      combinedSet.insert(tmp.begin(), tmp.end());
    }

  std::set<const CMetab*>::const_iterator itMetab;

  for (itMetab = mMetabs.begin(); itMetab != mMetabs.end(); ++itMetab)
    {
      std::set< const CCopasiObject * > tmp = (*itMetab)->getDeletedObjects();
      combinedSet.insert(tmp.begin(), tmp.end());
    }

  std::set<const CReaction*>::const_iterator itReac;

  for (itReac = mReactions.begin(); itReac != mReactions.end(); ++itReac)
    {
      std::set< const CCopasiObject * > tmp = (*itReac)->getDeletedObjects();
      combinedSet.insert(tmp.begin(), tmp.end());
    }

  std::set<const CModelValue*>::const_iterator itQuant;

  for (itQuant = mGlobalQuantities.begin(); itQuant != mGlobalQuantities.end(); ++itQuant)
    {
      std::set< const CCopasiObject * > tmp = (*itQuant)->getDeletedObjects();
      combinedSet.insert(tmp.begin(), tmp.end());
    }

  /* Events do not contain any relevant objects.
  std::set<const CEvent*>::const_iterator itEvent;

  for (itEvent = mEvents.begin(); itEvent != mEvents.end(); ++itEvent)
    {
      std::set< const CCopasiObject * > tmp = (*itEvent)->getDeletedObjects();
      combinedSet.insert(tmp.begin(), tmp.end());
    }
  */

  //ask the model for the dependencies

  std::set< const CCopasiObject * > reacs, metabs, comps, values, events;
  pModel->appendDependentModelObjects(combinedSet, reacs, metabs, comps, values, events);

  //incorporate the results into the local sets
  std::set< const CCopasiObject * >::const_iterator it;

  for (it = reacs.begin(); it != reacs.end(); ++it)
    addReaction(dynamic_cast<const CReaction*>(*it));

  for (it = metabs.begin(); it != metabs.end(); ++it)
    addMetab(dynamic_cast<const CMetab*>(*it));

  for (it = comps.begin(); it != comps.end(); ++it)
    addCompartment(dynamic_cast<const CCompartment*>(*it));

  for (it = values.begin(); it != values.end(); ++it)
    addGlobalQuantity(dynamic_cast<const CModelValue*>(*it));

  for (it = events.begin(); it != events.end(); ++it)
    addEvent(dynamic_cast<const CEvent*>(*it));
}