コード例 #1
0
ファイル: backend.cpp プロジェクト: LLNL/DysectAPI
DysectAPI::DysectErrorCode Backend::bindStream(int tag, Stream* stream) {
  int index = Domain::tagToId(tag);
  map<tag_t, Domain*> domainMap = Domain::getDomainMap();
  map<tag_t, Domain*>::iterator domainIter = domainMap.find(index);

  if(domainIter == domainMap.end()) {
    return Err::warn(StreamError,  "tag unknown");
  }

  Domain* dom = domainIter->second;
  if(!dom) {
    return Err::warn(Error, "NULL domain");
  }

  dom->setStream(stream);
  
  missingBindings.erase(index);

  Err::verbose(true, "Domain %x bound to stream %lx", dom->getId(), (long)stream);

  if(missingBindings.size() == 0) {

    if(controlStream != 0) {
      // XXX: Will always tell that everything went well (val = 0)
      Err::verbose("All domains bound to streams - send ack");
      ackBindings();
    } else {
      streamBindAckSent = false;  
    }

    state = ready;
  }

  return OK; 
}
コード例 #2
0
ファイル: backend.cpp プロジェクト: SteveXiSong/STAT
DysectAPI::DysectErrorCode Backend::handleTimerActions() {
  pthread_mutex_lock(&probesPendingActionMutex);
  if (probesPendingAction.size() > 0) {
    DYSECTVERBOSE(true, "Handle timer actions");
    vector<Probe*>::iterator probeIter = probesPendingAction.begin();
    for(;probeIter != probesPendingAction.end(); probeIter++) {
      Probe* probe = *probeIter;
      Domain* dom = probe->getDomain();

      DYSECTVERBOSE(true, "Sending enqueued actions for timed probe: %x", dom->getId());
      probe->sendEnqueuedActions();

      if(probe->numWaitingProcs() > 0) {
        ProcessSet::ptr lprocset = probe->getWaitingProcs();
        probe->enableChildren(lprocset);
        if(probe->getLifeSpan() == fireOnce)
          probe->disable(lprocset);
        lprocset->continueProcs();
        probe->releaseWaitingProcs();
      }
    }
    probesPendingAction.clear();
  }
  pthread_mutex_unlock(&probesPendingActionMutex);
  return OK;
}
コード例 #3
0
ファイル: backend.cpp プロジェクト: LLNL/DysectAPI
DysectAPI::DysectErrorCode Backend::handleTimerEvents() {
  if(SafeTimer::anySyncReady()) {
    Err::verbose(true, "Handle timer events");
    vector<Probe*> readyProbes = SafeTimer::getAndClearSyncReady();
    vector<Probe*>::iterator probeIter = readyProbes.begin();

    for(;probeIter != readyProbes.end(); probeIter++) {
      Probe* probe = *probeIter;
      Domain* dom = probe->getDomain();
      
      Err::verbose(true, "Sending enqueued notifications for timed probe: %x", dom->getId());

      probe->sendEnqueuedNotifications();
      probe->sendEnqueuedActions();
    }
  }

  return OK;
}
コード例 #4
0
ファイル: backend.cpp プロジェクト: SteveXiSong/STAT
DysectAPI::DysectErrorCode Backend::handleTimerEvents() {
  if(SafeTimer::anySyncReady()) {
    DYSECTVERBOSE(true, "Handle timer notifications");
    vector<Probe*> readyProbes = SafeTimer::getAndClearSyncReady();
    vector<Probe*>::iterator probeIter = readyProbes.begin();

    for(;probeIter != readyProbes.end(); probeIter++) {
      Probe* probe = *probeIter;
      Domain* dom = probe->getDomain();

      DYSECTVERBOSE(true, "Sending enqueued notifications for timed probe: %x", dom->getId());

      probe->sendEnqueuedNotifications();
      pthread_mutex_lock(&probesPendingActionMutex);
      probesPendingAction.push_back(probe);
      pthread_mutex_unlock(&probesPendingActionMutex);
    }
  }

  return OK;
}
コード例 #5
0
ファイル: frontend.cpp プロジェクト: LLNL/DysectAPI
DysectAPI::DysectErrorCode Frontend::listen() {
  int ret;
  int idle = 0;

  // Install handler for (ctrl-c) abort
  // signal(SIGINT, Frontend::interrupt);
  //

  printf("Waiting for events (! denotes captured event)\n");
  printf("Hit <enter> to stop session\n");
  fflush(stdout);

  {
  do {
    // select() overwrites fd_set with ready fd's
    // Copy fd_set structure
    fd_set fdRead = Domain::getFdSet();

    if(breakOnEnter)
      FD_SET(0, &fdRead); //STDIN

    struct timeval timeout;
    timeout.tv_sec =  Frontend::selectTimeout;
    timeout.tv_usec = 0;

    ret = select(Domain::getMaxFd() + 1, &fdRead, NULL, NULL, &timeout);
    
    if(ret < 0) {
      //return Err::warn(DysectAPI::Error, "select() failed to listen on file descriptor set.");
      return DysectAPI::OK;
    }

    if(FD_ISSET(0, &fdRead) && breakOnEnter) {
      Err::info(true, "Stopping session - enter key was hit");
      break;
    }

    // Look for owners
    vector<Domain*> doms = Domain::getFdsFromSet(fdRead);

    if(doms.size() == 0) {
      if(Frontend::breakOnTimeout && (--Frontend::numEvents < 0)) {
        Err::info(true, "Stopping session - increase numEvents for longer sessions");
        break;
      }

    } else {
      printf("\n");
      fflush(stdout);
    }

    for(int i = 0; i < doms.size(); i++) {
      Domain* dom = doms[i];
      
      PacketPtr packet;
      int tag;

      if(!dom->getStream()) {
        return Err::warn(Error, "Stream not available for domain %x", dom->getId());
      }

      do {
        ret = dom->getStream()->recv(&tag, packet, false);
        if(ret == -1) {
          return Err::warn(Error, "Receive error");

        } else if(ret == 0) {
          break;
        }

        int count;
        char *payload;
        int len;

        if(packet->unpack("%d %auc", &count, &payload, &len) == -1) {
          return Err::warn(Error, "Unpack error");
        }

        if(Domain::isProbeEnabledTag(tag)) {
          Domain* dom = 0;

          if(!Domain::getDomainFromTag(dom, tag)) {
            Err::warn(false, "Could not get domain from tag %x", tag);
          } else {
            //Err::info(true, "[%d] Probe %x enabled (payload size %d)", count, dom->getId(), len);
            //Err::info(true, "[%d] Probe %x enabled", count, dom->getId());
          }

          Probe* probe = dom->owner;
          if(!probe) {
            Err::warn(false, "Probe object not found for %x", dom->getId());
          } else {
            probe->handleActions(count, payload, len);
          }

          // Empty bodied probe
          // Check wether backends are waiting for releasing processes
          if(dom->isBlocking()) {
            dom->sendContinue();
          }
        }
        
      } while(1);

      dom->getStream()->clear_DataNotificationFd();
    }
  } while(running);
  }
}
コード例 #6
0
ファイル: backend.cpp プロジェクト: LLNL/DysectAPI
Process::cb_ret_t Backend::handleEvent(Dyninst::ProcControlAPI::Process::const_ptr curProcess,
                                 Dyninst::ProcControlAPI::Thread::const_ptr curThread,
                                 DysectAPI::Event* dysectEvent) {

  Process::cb_ret_t retState = Process::cbDefault;

  // Let event know that it was triggered.
  // Used for event composition
  Walker* proc = (Walker*)curProcess->getData();

  if(!proc) {
    Err::warn(true, "Missing payload in process object: could not get walker");
  } else {
    dysectEvent->triggered(curProcess, curThread);

    // Find owning probe
    Probe* probe = dysectEvent->getOwner();


    if(!probe) {
      Err::warn(true, "Probe could not be found for event object");
    } else {
      // If enqueued disabled - stop and await
      //if(probe->isDisabled(curProcess)) {
      //  probe->addWaitingProc(curProcess);

      //  return Process::cbProcStop;
      //  //return Process::cbDefault;
      //}

      // Composed events might require several events being triggered
      if(probe->wasTriggered(curProcess, curThread)) {
        // Required events indeed triggered
        // Evaluate conditions
        ConditionResult result;
        
        Err::verbose(true, "Evaluate condition!");
        if(probe->evaluateConditions(result, curProcess, curThread) == DysectAPI::OK) {

          if(result == ResolvedTrue) { 
            Err::verbose(true, "Condition satisfied");
            
            Domain* dom = probe->getDomain();
            assert(dom != 0);

            if(dom->getWaitTime() == Wait::inf) {

              // Block strictly, until all processes have shown up
              Err::verbose(true, "Enqueuing notification for static domain");
              probe->enqueueNotifyPacket();
              probe->enqueueAction(curProcess, curThread);

            } else if(dom->getWaitTime() != Wait::NoWait) {
              if(!DysectAPI::SafeTimer::syncTimerRunning(probe)) {
                Err::verbose(true, "Start timer and enqueue: %x", dom->getId());
                DysectAPI::SafeTimer::startSyncTimer(probe);
              } else {
                Err::verbose(true, "Timer already running - just enqueue");
              }
              
              if(probe->doNotify()) {
                probe->enqueueNotifyPacket();
              }

              probe->enqueueAction(curProcess, curThread);

            } else { // No-wait probe

              if(probe->doNotify()) {
                probe->notifyTriggered();
              }

              probe->triggerAction(curProcess, curThread);

            }
            
            if(probe->waitForOthers()) {
              Err::verbose(true, "Wait for group members");
              probe->addWaitingProc(curProcess);

              if((dom->getWaitTime() == Wait::inf) && (probe->staticGroupWaiting())) {
                Err::verbose(true, "Sending enqueued notifications");
                
                if(probe->doNotify()) {
                  probe->sendEnqueuedNotifications();
                }
  
                probe->sendEnqueuedActions();
              }
            
              retState = Process::cbThreadStop;
            
            } else {
              Err::verbose(true, "Enable children for probe %x", dom->getId());
              probe->enqueueEnable(curProcess);

              //Err::verbose(true, "Stopping thread in process %d", curProcess->getPid());
              probe->addWaitingProc(curProcess);
              //retState = Process::cbThreadStop;
              retState = Process::cbProcStop;
            }

            if(probe->getLifeSpan() == fireOnce) {
              Err::verbose(true, "Requesting disablement of probe");
              probe->enqueueDisable(curProcess);

              //Err::verbose(true, "Stopping thread in process %d", curProcess->getPid());
              probe->addWaitingProc(curProcess);
              //retState = Process::cbThreadStop;
              retState = Process::cbProcStop;
            }
#if 0 
          } else if(result == CollectiveResolvable) {
            // Block process and await resolution of collective operations
            
            //probe->addWaitingCond(curProcess, curThread);
            Err::warn(false, "Condition stalls not yet supported");
            
            Err::verbose(true, "Stopping thread in process %d", curProcess->getPid());
            retState = Process::cbProcStop;

            //retState = Process::cbThreadStop;
#endif
          } else if(result == ResolvedFalse) {
              if(probe->getLifeSpan() == fireOnce) {
                Err::verbose(true, "Requesting disablement of probe");
                // Get out of the way
                probe->enqueueDisable(curProcess);
                retState = Process::cbProcStop;

              } else {

                retState = Process::cbProcContinue;
                //probe->addWaitingProc(curProcess);
              }

              // probe->addWaitingProc(curProcess);
          }

        } else {
          Err::warn(false, "Could not evaluate conditions for probe");
        }
      }

    }
  }

  return retState;
}
コード例 #7
0
ファイル: example1.cpp プロジェクト: kirichoi/roadrunner
void readSpatialSBML() {
	SBMLDocument *document2 = readSBML("spatial_example2.xml");
  
	Model *model2 = document2->getModel();
	Compartment *comp;
	SpatialCompartmentPlugin* cplugin;
	for (unsigned int i = 0; i < model2->getNumCompartments(); i++) {
		comp = model2->getCompartment(i);
		cout << "Compartment" << i << ": "  << comp->getId() << endl;
		cplugin = static_cast<SpatialCompartmentPlugin*>(comp->getPlugin("spatial"));
		if (cplugin->getCompartmentMapping()->isSetId()) {
			cout << "Comp" << i << "  CMSpId: "  << cplugin->getCompartmentMapping()->getId() << endl;
			cout << "Comp" << i << "  CM_DType: "  << cplugin->getCompartmentMapping()->getDomainType() << endl;
			cout << "Comp" << i << "  CM_UnitSz: "  << cplugin->getCompartmentMapping()->getUnitSize() << endl;
		}
	}

	Species *sp;
	SpatialSpeciesPlugin* srplugin;
	for (unsigned int i = 0; i < model2->getNumSpecies(); i++) {
		sp = model2->getSpecies(i);
		cout << "Species" << i << ": "      << sp->getId()      << endl;
		srplugin = static_cast<SpatialSpeciesPlugin*>(sp->getPlugin("spatial"));
		if (srplugin->getIsSpatial()) {
			cout << "species" << i << "  isSpatial: "  << srplugin->getIsSpatial() << endl;
		}
	}

	Parameter *param;
	SpatialParameterPlugin* pplugin;
	for (unsigned int i = 0; i < model2->getNumParameters(); i++) {
		param = model2->getParameter(i);
		cout << "Parameter" << i << ": "  << param->getId() << endl;
		pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
		if (pplugin->isSetSpatialSymbolReference()) {
			cout << "Parameter" << i << "  SpRefId: "  << pplugin->getSpatialSymbolReference()->getSpatialRef() << endl;
		}
		if (pplugin->isSetDiffusionCoefficient()) {
			cout << "Diff_" << i << "  SpeciesVarId: "  << pplugin->getDiffusionCoefficient()->getVariable() << endl;
			cout << "Diff_" << i << "  Type: "  << DiffusionKind_toString(pplugin->getDiffusionCoefficient()->getType()) << endl;
      for (unsigned int j = 0; j < pplugin->getDiffusionCoefficient()->getNumCoordinateReferences(); ++j)
        cout << "Diff_" << i << "  SpCoordIndex  " << j << " : " << CoordinateKind_toString(pplugin->getDiffusionCoefficient()->getCoordinateReference(j) ->getCoordinate()) << endl;
		}
		if (pplugin->isSetAdvectionCoefficient()) {
			cout << "Adv_" << i << "  SpeciesVarId: "  << pplugin->getAdvectionCoefficient()->getVariable() << endl;
			cout << "Adv_" << i << "  SpCoordIndex: "  << CoordinateKind_toString(pplugin->getAdvectionCoefficient()->getCoordinate()) << endl;
		}
		if (pplugin->isSetBoundaryCondition()) {
			cout << "BC_" << i << "  SpeciesVarId: "  << pplugin->getBoundaryCondition()->getVariable() << endl;
			cout << "BC_" << i << "  SpCoordBoundary: "  << pplugin->getBoundaryCondition()->getCoordinateBoundary() << endl;
			cout << "BC_" << i << "  SpBoundaryType: "  << pplugin->getBoundaryCondition()->getType() << endl;
		}
	}

	Reaction *rxn;
	SpatialReactionPlugin* rplugin;
	for (unsigned int i = 0; i < model2->getNumReactions(); i++) {
		rxn = model2->getReaction(i);
		cout << "Reaction" << i << ": "      << rxn->getId()      << endl;
		rplugin = static_cast<SpatialReactionPlugin*>(rxn->getPlugin("spatial"));
		if (rplugin->getIsLocal()) {
			cout << "rxn" << i << "  isLocal: "  << rplugin->getIsLocal() << endl;
		}
	}

	Rule *rule;
	for (unsigned int i = 0; i < model2->getNumRules(); i++) {
		rule = model2->getRule(i);
		cout << "Rule" << i << ": "      << rule->getVariable()      << endl;
	}

	//
	// Get a SpatialModelPlugin object plugged in the model object.
	//
	// The type of the returned value of SBase::getPlugin() function is 
	// SBasePlugin*, and thus the value needs to be cast for the 
	// corresponding derived class.
	//
	SpatialModelPlugin* mplugin2;
	mplugin2 = static_cast<SpatialModelPlugin*>(model2->getPlugin("spatial"));
	cout << "URI: "      << mplugin2->getURI()      << endl;
	cout << "prefix: "      << mplugin2->getPrefix()      << endl;

	// get a Geometry object via SpatialModelPlugin object.
	Geometry* geometry2 = mplugin2->getGeometry();
	cout << "Geometry coordSystem: "      << geometry2->getCoordinateSystem()      << endl;
    
	// get a CoordComponent object via the Geometry object.	
	CoordinateComponent* coordComp = geometry2->getCoordinateComponent(0);
	std::cout << "CoordComponent Id: " << coordComp->getId() << std::endl;
  std::cout << "CoordComponent type: " << CoordinateKind_toString( coordComp->getType()) << std::endl;
	std::cout << "CoordComponent sbmlUnit: " << coordComp->getUnit() << std::endl;
  if (coordComp->isSetBoundaryMin())
  {
  Boundary* minX = coordComp->getBoundaryMin();
	std::cout << "minX name: " << minX->getId() << std::endl;
	std::cout << "minX value: " << minX->getValue() << std::endl;
  }
  if (coordComp->isSetBoundaryMax())
  {
	Boundary* maxX = coordComp->getBoundaryMax();
	std::cout << "maxX name: " << maxX->getId() << std::endl;
	std::cout << "maxX value: " << maxX->getValue() << std::endl;
  }

	// get a DomainType object via the Geometry object.	
	DomainType* domainType2 = geometry2->getDomainType(0);
	std::cout << "DomainType Id: " << domainType2->getId() << std::endl;
	std::cout << "DomainType spatialDim: " << domainType2->getSpatialDimension() << std::endl;

	// get a Domain object via the Geometry object.	
	Domain* domain = geometry2->getDomain(0);
	std::cout << "Domain1 Id: " << domain->getId() << std::endl;
	std::cout << "Domain1 domainType: " << domain->getDomainType() << std::endl;
	// get an internal point via the domain object
	InteriorPoint* internalPt = domain->getInteriorPoint(0);
	std::cout << "InternalPt_1 coord1: " << internalPt->getCoord1() << std::endl;

	// get a Domain object via the Geometry object.	
	domain = geometry2->getDomain(1);
	std::cout << "Domain2 Id: " << domain->getId() << std::endl;
	std::cout << "Domain2 domainType: " << domain->getDomainType() << std::endl;
	// get an internal point via the domain object
	internalPt = domain->getInteriorPoint(0);
	std::cout << "InternalPt_2 coord1: " << internalPt->getCoord1() << std::endl;

	// get an AdjacentDomains object via the Geometry object.	
	AdjacentDomains* adjDomain = geometry2->getAdjacentDomains(0);
	std::cout << "AdjDomain Id: " << adjDomain->getId() << std::endl;
	std::cout << "AdjDomain domain1: " << adjDomain->getDomain1() << std::endl;
	std::cout << "AdjDomain domain2: " << adjDomain->getDomain2() << std::endl;

	// get an AnalyticGeometry object via the Geometry object.
	GeometryDefinition* gd;
	for (unsigned int i = 0; i < geometry2->getNumGeometryDefinitions(); i++) {
		gd = geometry2->getGeometryDefinition(i);
		if (gd->isAnalyticGeometry()) {
			AnalyticGeometry* analyticalGeom = static_cast<AnalyticGeometry*>(gd);
			std::cout << "AnalGeom Id: " << analyticalGeom->getId() << std::endl;

			// analVol from analGeom.
			AnalyticVolume* av = analyticalGeom->getAnalyticVolume(0);
			std::cout << "AnalVol Id: " << av->getId() << std::endl;
			std::cout << "AnalVol domainType: " << av->getDomainType() << std::endl;
			std::cout << "AnalVol funcType: " << av->getFunctionType() << std::endl;
			std::cout << "AnalVol ordinal: " << av->getOrdinal() << std::endl;
			const ASTNode* mathNode = av->getMath();
			char* mathStr = writeMathMLToString(mathNode);
			std::cout << "AnalVol math: " << mathStr << std::endl;
		}
		if (gd->isSampledFieldGeometry()) {
			SampledFieldGeometry* sfGeom = static_cast<SampledFieldGeometry*>(gd);
			std::cout << "SampledFieldGeom Id: " << sfGeom->getId() << std::endl;
			
			// sampledField from sfGeom
			SampledField* sf = sfGeom->getSampledField();
			std::cout << "SampledField Id: " << sf->getId() << std::endl;
			std::cout << "SampledField dataType: " << sf->getDataType() << std::endl;
			std::cout << "SampledField interpolation: " << sf->getInterpolationType() << std::endl;
			std::cout << "SampledField encoding: " << sf->getEncoding() << std::endl;
			std::cout << "SampledField numSamples1: " << sf->getNumSamples1() << std::endl;
			std::cout << "SampledField numSamples2: " << sf->getNumSamples2() << std::endl;
			std::cout << "SampledField numSamples3: " << sf->getNumSamples3() << std::endl;
			const ImageData* id = sf->getImageData();
			int* samples = new int[id->getSamplesLength()];
			id->getSamples(samples);
			std::cout << "ImageData samples[0]: " << samples[0] << std::endl;
			std::cout << "ImageData dtype: " << id->getDataType() << std::endl;
			std::cout << "ImageData samplesLen: " << id->getSamplesLength() << std::endl;
      
			// sampledVolVol from sfGeom.
			SampledVolume* sv = sfGeom->getSampledVolume(0);
			std::cout << "SampledVol Id: " << sv->getId() << std::endl;
			std::cout << "SampledVol domainType: " << sv->getDomainType() << std::endl;
			std::cout << "SampledVol sampledVal: " << sv->getSampledValue() << std::endl;
			std::cout << "SampledVol min: " << sv->getMinValue() << std::endl;
			std::cout << "SampledVol max: " << sv->getMaxValue() << std::endl;
		}
	}

	delete document2;
}
コード例 #8
0
END_TEST


START_TEST (test_SpatialExtension_read_L3V1V1_defaultNS)
{
    string file = TestDataDirectory;
    file += "/read_L3V1V1_defaultNS.xml";

    SBMLDocument *document = readSBMLFromFile(file.c_str());
    string sbmlDoc = writeSBMLToStdString(document);
    Model *model = document->getModel();

    //document->printErrors();

    fail_unless(model != NULL);
    //fail_unless(document->getNumErrors() == 0);

    // model : compartment
    fail_unless(model->getNumCompartments() == 1);

    Compartment *comp = model->getCompartment(0);

    // compartment : compartmentMapping
    SpatialCompartmentPlugin* cplugin = static_cast<SpatialCompartmentPlugin*>(comp->getPlugin("spatial"));
    fail_unless(cplugin != NULL);

    CompartmentMapping *cMapping = cplugin->getCompartmentMapping();
    if (cMapping->isSetId()) {
        fail_unless(cMapping->getId()		 == "compMap1");
        fail_unless(cMapping->getDomainType()	 == "dtype1");
        fail_unless(cMapping->getUnitSize()		 == 1);
    }

    // model : species 1
    fail_unless(model->getNumSpecies() == 2);

    Species *sp = model->getSpecies(0);

    SpatialSpeciesPlugin* srplugin = static_cast<SpatialSpeciesPlugin*>(sp->getPlugin("spatial"));
    fail_unless(srplugin != NULL);
    fail_unless(srplugin->getIsSpatial() == true);

    // model : species 2
    sp = model->getSpecies(1);
    srplugin = static_cast<SpatialSpeciesPlugin*>(sp->getPlugin("spatial"));
    fail_unless(srplugin != NULL);
    fail_unless(srplugin->getIsSpatial() == true);

    // model : parameters (species diffusion, advection coeffs, species boundary conditions, coordinate components from Geometry
    fail_unless(model->getNumParameters() == 5);



    // parameter 0 : diffusionCoefficient
    Parameter *param = model->getParameter(0);
    SpatialParameterPlugin* pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
    fail_unless(pplugin != NULL);
    fail_unless(pplugin->isSpatialParameter() == true);
    fail_unless(pplugin->getType() == SBML_SPATIAL_DIFFUSIONCOEFFICIENT);
    DiffusionCoefficient *diffCoeff = pplugin->getDiffusionCoefficient();
    fail_unless(diffCoeff->getVariable()		== "ATPc");
    fail_unless(diffCoeff->isSetCoordinateReference1());
    fail_unless(diffCoeff->getCoordinateReference1() == SPATIAL_COORDINATEKIND_CARTESIAN_X);

    // parameter 1 : advectionCoefficient
    param = model->getParameter(1);
    pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
    fail_unless(pplugin != NULL);
    fail_unless(pplugin->isSpatialParameter() == true);
    fail_unless(pplugin->getType() == SBML_SPATIAL_ADVECTIONCOEFFICIENT);
    AdvectionCoefficient *advCoeff = pplugin->getAdvectionCoefficient();
    fail_unless(advCoeff->getVariable()		== "ATPc");
    fail_unless(advCoeff->getCoordinate() == SPATIAL_COORDINATEKIND_CARTESIAN_X);

    // parameter 2 : boundaryCondition X
    param = model->getParameter(2);
    pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
    fail_unless(pplugin != NULL);
    fail_unless(pplugin->isSpatialParameter() == true);
    fail_unless(pplugin->getType() == SBML_SPATIAL_BOUNDARYCONDITION);
    BoundaryCondition *bc = pplugin->getBoundaryCondition();
    fail_unless(bc->getVariable()		   == "ATPc");
    fail_unless(bc->getCoordinateBoundary() == "Xmin");
    fail_unless(bc->getType() == SPATIAL_BOUNDARYKIND_DIRICHLET);

    // parameter 3 : SpatialSymbolReference (coordinateComponent from geometry)
    param = model->getParameter(3);
    pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
    fail_unless(pplugin != NULL);
    SpatialSymbolReference *spSymRef = pplugin->getSpatialSymbolReference();
    fail_unless(spSymRef->getSpatialRef() == "coordComp1");

    // model : reaction
    fail_unless(model->getNumReactions() == 1);

    Reaction *rxn = model->getReaction(0);
    SpatialReactionPlugin* rplugin = static_cast<SpatialReactionPlugin*>(rxn->getPlugin("spatial"));
    fail_unless(rplugin != NULL);
    fail_unless(rplugin->getIsLocal() == true);

    // get the Geometry
    SpatialModelPlugin* mplugin = static_cast<SpatialModelPlugin*>(model->getPlugin("spatial"));
    fail_unless(mplugin != NULL);

    Geometry *geometry = mplugin->getGeometry();
    fail_unless(geometry != NULL);
    fail_unless(geometry->getPackageName()		== "spatial");
    fail_unless(geometry->getCoordinateSystem()	== SPATIAL_GEOMETRYKIND_CARTESIAN);

    // geometry coordinateComponent
    fail_unless(geometry->getNumCoordinateComponents() == 1);
    fail_unless(geometry->getListOfCoordinateComponents()->getPackageName() == "spatial");

    CoordinateComponent* coordComp = geometry->getCoordinateComponent(0);
    fail_unless(coordComp->getId()        == "coordComp1");
    fail_unless(coordComp->getType()	== SPATIAL_COORDINATEKIND_CARTESIAN_X);
    fail_unless(coordComp->getUnit()			== "umeter");
    fail_unless(coordComp->getPackageName()		== "spatial");

    // boundaryMin and boundayMax within coordinateComponent
    Boundary *minX = coordComp->getBoundaryMin();
    fail_unless(minX->getId()	  == "Xmin");
    fail_unless(minX->getValue()		  == 0);
    fail_unless(minX->getPackageName() == "spatial");

    Boundary *maxX = coordComp->getBoundaryMax();
    fail_unless(maxX->getId()   == "Xmax");
    fail_unless(maxX->getValue()		  == 10);
    fail_unless(maxX->getPackageName() == "spatial");

    // geometry domainType
    fail_unless(geometry->getNumDomainTypes() == 1);
    fail_unless(geometry->getListOfDomainTypes()->getPackageName() == "spatial");

    DomainType *domainType = geometry->getDomainType(0);
    fail_unless(domainType->getId()         == "dtype1");
    fail_unless(domainType->getSpatialDimensions() == 3);
    fail_unless(domainType->getPackageName()		  == "spatial");

    // geometry domains
    fail_unless(geometry->getNumDomains() == 2);
    fail_unless(geometry->getListOfDomains()->getPackageName() == "spatial");

    Domain* domain = geometry->getDomain(0);
    fail_unless(domain->getId()   == "domain1");
    fail_unless(domain->getDomainType() == "dtype1");
    //fail_unless(domain->getImplicit()    == false);
    //fail_unless(domain->getShapeId()     == "circle");
    fail_unless(domain->getPackageName() == "spatial");

    // interiorPoints in Domain
    fail_unless(domain->getNumInteriorPoints() == 1);
    fail_unless(domain->getListOfInteriorPoints()->getPackageName() == "spatial");

    InteriorPoint* interiorPt = domain->getInteriorPoint(0);
    fail_unless(interiorPt->getCoord1()		== 1);
    fail_unless(interiorPt->getPackageName() == "spatial");

    // second domain in geometry
    domain = geometry->getDomain(1);
    fail_unless(domain->getId()   == "domain2");
    fail_unless(domain->getDomainType() == "dtype1");
    //fail_unless(domain->getImplicit()    == false);
    //fail_unless(domain->getShapeId()     == "square");
    fail_unless(domain->getPackageName() == "spatial");

    // Domain : interiorPoints
    fail_unless(domain->getNumInteriorPoints() == 1);
    fail_unless(domain->getListOfInteriorPoints()->getPackageName() == "spatial");

    interiorPt = domain->getInteriorPoint(0);
    fail_unless(interiorPt->getCoord1()		== 5);
    fail_unless(interiorPt->getPackageName() == "spatial");

    // geometry adjacentDomains
    fail_unless(geometry->getNumAdjacentDomains() == 1);
    fail_unless(geometry->getListOfAdjacentDomains()->getPackageName() == "spatial");

    AdjacentDomains* adjDomain = geometry->getAdjacentDomains(0);
    fail_unless(adjDomain->getId()   == "adjDomain1");
    fail_unless(adjDomain->getDomain1()     == "domain1");
    fail_unless(adjDomain->getDomain2()     == "domain2");
    fail_unless(adjDomain->getPackageName() == "spatial");

    // geometry : geometryDefinitions
    fail_unless(geometry->getNumGeometryDefinitions() == 2);
    fail_unless(geometry->getListOfGeometryDefinitions()->getPackageName() == "spatial");

    GeometryDefinition *gd = geometry->getGeometryDefinition(0);
    AnalyticGeometry *analyticGeom = static_cast<AnalyticGeometry*>(gd);
    fail_unless(analyticGeom->getId()   == "analyticGeom1");
    fail_unless(analyticGeom->getPackageName() == "spatial");

    // AnalyticGeometry : analyticVolumes
    fail_unless(analyticGeom->getNumAnalyticVolumes() == 1);
    fail_unless(analyticGeom->getListOfAnalyticVolumes()->getPackageName() == "spatial");

    AnalyticVolume* av = analyticGeom->getAnalyticVolume(0);
    fail_unless(av->getId()    == "analyticVol1");
    fail_unless(av->getDomainType()   == "dtype1");
    fail_unless(av->getFunctionType() == SPATIAL_FUNCTIONKIND_LAYERED);
    fail_unless(av->getOrdinal()      == 1);
    fail_unless(av->getPackageName()  == "spatial");
    // ??????Math????

    // geometry : sampledFieldGeometry
    gd = geometry->getGeometryDefinition(1);
    SampledFieldGeometry* sfGeom = static_cast<SampledFieldGeometry*>(gd);
    fail_unless(sfGeom->getId()   == "sampledFieldGeom1");
    fail_unless(sfGeom->getPackageName() == "spatial");

    // sampledFieldGeometry : SampledVolumes
    fail_unless(sfGeom->getNumSampledVolumes() == 1);
    fail_unless(sfGeom->getListOfSampledVolumes()->getPackageName() == "spatial");

    SampledVolume* sv = sfGeom->getSampledVolume(0);
    fail_unless(sv->getId()    == "sv_1");
    fail_unless(sv->getDomainType()   == "dtype1");
    fail_unless(sv->getSampledValue() == 128);
    fail_unless(sv->getMinValue()     == 0);
    fail_unless(sv->getMaxValue()     == 255);
    fail_unless(sv->getPackageName()  == "spatial");

    // sampledFieldGeometry : SampledField
    SampledField* sf = geometry->getSampledField( sfGeom->getSampledField() );
    fail_unless(sf->getId()		  == "sampledField1");
    fail_unless(sf->getDataType()		  == SPATIAL_DATAKIND_UINT8);
    fail_unless(sf->getInterpolationType() == SPATIAL_INTERPOLATIONKIND_LINEAR);
    fail_unless(sf->getCompression()          == SPATIAL_COMPRESSIONKIND_UNCOMPRESSED);
    fail_unless(sf->getNumSamples1()       == 4);
    fail_unless(sf->getNumSamples2()       == 4);
    fail_unless(sf->getNumSamples3()       == 2);
    fail_unless(sf->getPackageName()		  == "spatial");

    // sampledField : ImageData
    fail_unless(sf->getSamplesLength()  == 32);
    int* samples = new int[sf->getSamplesLength()];
    sf->getSamples(samples);
    fail_unless(samples[0] == 0);

    string s2 = writeSBMLToStdString(document);

    fail_unless(sbmlDoc==s2);

    delete document;
    delete[] samples;
}