Esempio n. 1
0
  int Ng_GetSolidList (ClientData clientData,
		       Tcl_Interp * interp,
		       int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.get());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }

    tcl_const char * valuevar = argv[1];
    int i;

    stringstream vst;

    for (i = 1; i <= geometry->GetNSolids(); i++)
      {
	const Solid * sol = geometry->GetSolid(i);
	if (!sol->GetPrimitive())
	  vst << sol->Name() << " ";
      }

    cout << "solnames = " << vst.str() << endl;

    Tcl_SetVar  (interp, valuevar, (char*)vst.str().c_str(), 0);

    return TCL_OK;
  }
Esempio n. 2
0
  int Ng_SetPrimitiveData (ClientData clientData,
			   Tcl_Interp * interp,
			   int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.get());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }


    tcl_const char * name = argv[1];
    tcl_const char * value = argv[2];

    Array<double> coeffs;


    cout << "Set primitive data, name = " << name
	 << ", value = " << value  << endl;


    istringstream vst (value);
    double val;
    while (!vst.eof())
      {
	vst >> val;
	coeffs.Append (val);
      }

    ((Primitive*)
     geometry->GetSolid (name)->GetPrimitive())->SetPrimitiveData (coeffs);

    return TCL_OK;
  }
Esempio n. 3
0
  int Ng_GetSolidData (ClientData clientData,
		       Tcl_Interp * interp,
		       int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.Ptr());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }

    tcl_const char * name = argv[1];
    tcl_const char * valuevar = argv[2];

    ostringstream vst;

    const Solid * sol = geometry->GetSolid (name);
    sol->GetSolidData (vst);

    cout << "GetSolidData, name = " << name << ", data = " << vst.str() << endl;

    Tcl_SetVar  (interp, valuevar, (char*)vst.str().c_str(), 0);

    return TCL_OK;
  }
Esempio n. 4
0
  int Ng_SetSolidData (ClientData clientData,
		       Tcl_Interp * interp,
		       int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.Ptr());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }


    tcl_const char * name = argv[1];
    tcl_const char * val = argv[2];

    cout << "Set Solid Data, name = " << name
	 << ", value = " << val << endl;

    istringstream vst (val);

    Solid * nsol = Solid::CreateSolid (vst, geometry->GetSolids());
    geometry->SetSolid (name, nsol);

    return TCL_OK;
  }
Esempio n. 5
0
  int Ng_CreatePrimitive (ClientData clientData,
			  Tcl_Interp * interp,
			  int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.Ptr());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }


    tcl_const char * classname = argv[1];
    tcl_const char * name = argv[2];

    cout << "Create primitive, class = " << classname
	 << ", name = " << name << endl;

    Primitive * nprim = Primitive::CreatePrimitive (classname);
    Solid * nsol = new Solid (nprim);

    char sname[100];
    for (int j = 1; j <= nprim->GetNSurfaces(); j++)
      {
	sprintf (sname, "%s,%d", name, j);
	geometry -> AddSurface (sname, &nprim->GetSurface(j));
	nprim -> SetSurfaceId (j, geometry->GetNSurf());
      }

    geometry->SetSolid (name, nsol);

    return TCL_OK;
  }
Esempio n. 6
0
CSGeometry* NGInterface::loadCSG(string data)
{
    strstream in;
    CSGeometry *geom;
    Point<3> pmin(minX,minY,minZ),
             pmax(maxX,maxY,maxZ);
    Box<3> box(pmin,pmax);

    in << data;
    try
    {
        geom = ParseCSG(in);
    }
    catch(...)
    {
        cerr << "Problem in CSG-file!" << endl;
        return NULL;
    }

    if (!geom)
    {
        cout << "geo-file should start with 'algebraic3d'" << endl;
        return NULL;
    }
    else
        geom->FindIdenticSurfaces(1e-8*geom->MaxSize());
    geom->SetBoundingBox(box);
    geom->CalcTriangleApproximation(detail,facets);
    return (CSGeometry*)(geometry = geom);
}
int main()
{
  std::ifstream geometry_file;
  geometry_file.open("../data/half-trigate.geo");

  CSGeometry * geom = ParseCSG( geometry_file );


  geom->FindIdenticSurfaces(1e-8 * geom->MaxSize());

  Mesh * netgen_mesh = new Mesh();
  netgen::MeshingParameters mparams;

  geom->GenerateMesh(netgen_mesh, mparams, 1, 5);


  {
    typedef viennagrid::tetrahedral_3d_mesh MeshType;
    typedef viennagrid::tetrahedral_3d_segmentation SegmentationType;

    MeshType mesh;
    SegmentationType segmentation(mesh);


    typedef viennagrid::result_of::point<MeshType>::type PointType;
    typedef viennagrid::result_of::vertex_handle<MeshType>::type VertexHandleType;
    typedef SegmentationType::segment_handle_type SegmentType;


    int num_points = netgen_mesh->GetNP();
    int num_tets = netgen_mesh->GetNE();

    std::cout << "Num Points: " << num_points << std::endl;
    std::cout << "Num Tets: " << num_tets << std::endl;

    std::vector<VertexHandleType> vertex_handles( num_points );

    for (int i = 1; i <= num_points; ++i)
    {
      PointType vgrid_point(netgen_mesh->Point(i)[0], netgen_mesh->Point(i)[1], netgen_mesh->Point(i)[2]);
      vertex_handles[i-1] = viennagrid::make_vertex( mesh, vgrid_point );
    }


    for (int i = 0; i < num_tets; ++i)
    {
        ElementIndex ei = i;
        SegmentType segment = segmentation.get_make_segment( (*netgen_mesh)[ei].GetIndex() );
        viennagrid::make_tetrahedron( segment, vertex_handles[(*netgen_mesh)[ei][0]-1], vertex_handles[(*netgen_mesh)[ei][1]-1],
              vertex_handles[(*netgen_mesh)[ei][2]-1], vertex_handles[(*netgen_mesh)[ei][3]-1]);
    }


    viennagrid::io::vtk_writer<MeshType, SegmentationType> writer;
    writer(mesh, segmentation, "out");
  }


}
Esempio n. 8
0
  int Ng_GeometryOptions (ClientData clientData,
			  Tcl_Interp * interp,
			  int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.get());


    const char * command = argv[1];

    if (strcmp (command, "get") == 0)
      {
	if (geometry)
	  {
	    char buf[20];
	    Point3d pmin = geometry->BoundingBox ().PMin();
	    Point3d pmax = geometry->BoundingBox ().PMax();
	    
	    sprintf (buf, "%5.1lf", pmin.X());
	    Tcl_SetVar (interp, "::geooptions.minx", buf, 0);
	    sprintf (buf, "%5.1lf", pmin.Y());
	    Tcl_SetVar (interp, "::geooptions.miny", buf, 0);
	    sprintf (buf, "%5.1lf", pmin.Z());
	    Tcl_SetVar (interp, "::geooptions.minz", buf, 0);
	    
	    sprintf (buf, "%5.1lf", pmax.X());
	    Tcl_SetVar (interp, "::geooptions.maxx", buf, 0);
	    sprintf (buf, "%5.1lf", pmax.Y());
	    Tcl_SetVar (interp, "::geooptions.maxy", buf, 0);
	    sprintf (buf, "%5.1lf", pmax.Z());
	    Tcl_SetVar (interp, "::geooptions.maxz", buf, 0);
	  }
      }
    else if (strcmp (command, "set") == 0)
      {
        Point<3> pmin (atof (Tcl_GetVar (interp, "::geooptions.minx", 0)),
                       atof (Tcl_GetVar (interp, "::geooptions.miny", 0)),
                       atof (Tcl_GetVar (interp, "::geooptions.minz", 0)));
        Point<3> pmax (atof (Tcl_GetVar (interp, "::geooptions.maxx", 0)),
                       atof (Tcl_GetVar (interp, "::geooptions.maxy", 0)),
                       atof (Tcl_GetVar (interp, "::geooptions.maxz", 0)));
	Box<3> box (pmin, pmax);
	if (geometry)
	  geometry -> SetBoundingBox (box);
	CSGeometry::SetDefaultBoundingBox (box);
      }

    return TCL_OK;
  }
Esempio n. 9
0
  void SaveVolumeMesh (const Mesh & mesh, 
		       const CSGeometry & geometry,
		       char * filename)
  {
    INDEX i;

    ofstream outfile(filename);
    outfile << "volumemesh" << endl;

    outfile << mesh.GetNSE() << endl;
    for (i = 1; i <= mesh.GetNSE(); i++)
      {
	if (mesh.SurfaceElement(i).GetIndex())
	  outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).SurfNr()
		  << "\t";
	else
	  outfile << "0" << "\t";
	outfile << mesh.SurfaceElement(i)[0] << " "
		<< mesh.SurfaceElement(i)[1] << " "
		<< mesh.SurfaceElement(i)[2] << endl;
      }
    outfile << mesh.GetNE() << endl;
    for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
      outfile << mesh[ei].GetIndex() << "\t"
	      << mesh[ei][0] << " " << mesh[ei][1] << " "
	      << mesh[ei][2] << " " << mesh[ei][3] << endl;

    outfile << mesh.GetNP() << endl;
    for (i = 1; i <= mesh.GetNP(); i++)
      outfile << mesh.Point(i)(0) << " "
	      << mesh.Point(i)(1) << " "
	      << mesh.Point(i)(2) << endl;

#ifdef SOLIDGEOM
    outfile << geometry.GetNSurf() << endl;
    for (i = 1; i <= geometry.GetNSurf(); i++)
      geometry.GetSurface(i) -> Print (outfile);
#endif
  }
Esempio n. 10
0
  int Ng_GetPrimitiveData (ClientData clientData,
			   Tcl_Interp * interp,
			   int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.get());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }


    tcl_const char * name = argv[1];
    tcl_const char * classnamevar = argv[2];
    tcl_const char * valuevar = argv[3];

    const char * classname;

    Array<double> coeffs;

    geometry->GetSolid (name)->GetPrimitive()->GetPrimitiveData (classname, coeffs);

    ostringstream vst;
    for (int i = 1; i <= coeffs.Size(); i++)
      vst << coeffs.Get(i) << " ";

    cout << "GetPrimitiveData, name = " << name
	 << ", classnamevar = " << classnamevar
	 << ", classname = " << classname << endl
	 << " valuevar = " << valuevar
	 << ", values = " << vst.str() << endl;

    Tcl_SetVar  (interp, classnamevar, (char*)classname, 0);
    Tcl_SetVar  (interp, valuevar, (char*)vst.str().c_str(), 0);

    return TCL_OK;
  }
Esempio n. 11
0
/*
 * FEPP .. a finite element package developed at University Linz, Austria
 */
void WriteFEPPFormat (const Mesh & mesh,
                      const CSGeometry & geom,
                      const string & filename)
{

    ofstream outfile (filename.c_str());

    if (mesh.GetDimension() == 3)

    {

        // output for FEPP

        int np = mesh.GetNP();
        int ne = mesh.GetNE();
        int nse = mesh.GetNSE();
        int ns = mesh.GetNFD();
        int i, j;

        outfile.precision(5);
        outfile.setf (ios::fixed, ios::floatfield);
        outfile.setf (ios::showpoint);

        outfile << "volumemesh4" << endl;
        outfile << nse << endl;
        for (i = 1; i <= nse; i++)
        {
            const Element2d & el = mesh.SurfaceElement(i);

            //	  int facenr = mesh.facedecoding.Get(el.GetIndex()).surfnr;
            outfile.width(4);
            outfile << el.GetIndex() << " ";
            outfile.width(4);
            //	  outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
            outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
            outfile.width(4);
            outfile << el.GetNP() << "    ";
            for (j = 1; j <= el.GetNP(); j++)
            {
                outfile.width(8);
                outfile << el.PNum(j);
            }
            outfile << "\n";
        }


        outfile << ne << "\n";
        for (i = 1; i <= ne; i++)
        {
            const Element & el = mesh.VolumeElement(i);
            outfile.width(4);
            outfile << el.GetIndex() << " ";
            outfile.width(4);
            outfile << el.GetNP() << " ";
            for (j = 1; j <= el.GetNP(); j++)
            {
                outfile.width(8);
                outfile << el.PNum(j);
            }
            outfile << "\n";
        }

        outfile << np << "\n";
        for (i = 1; i <= np; i++)
        {
            const Point3d & p = mesh.Point(i);

            outfile.width(10);
            outfile << p.X() << " ";
            outfile.width(9);
            outfile << p.Y() << " ";
            outfile.width(9);
            outfile << p.Z() << "\n";
        }

        /*
        if (typ == WRITE_FEPPML)
        {
          int nbn =  mesh.mlbetweennodes.Size();
          outfile << nbn << "\n";
          for (i = 1; i <= nbn; i++)
            outfile << mesh.mlbetweennodes.Get(i).I1() << " "
        	    << mesh.mlbetweennodes.Get(i).I2() << "\n";


          //	  int ncon = mesh.connectedtonode.Size();
          //	  outfile << ncon << "\n";
          //	  for (i = 1; i <= ncon; i++)
          //	    outfile << i << " " << mesh.connectedtonode.Get(i) << endl;
        }
             */


        // write CSG surfaces
        if (&geom && geom.GetNSurf() >= ns)
        {
            outfile << ns << endl;
            for (i = 1; i <= ns; i++)
                geom.GetSurface(mesh.GetFaceDescriptor(i).SurfNr())->Print(outfile);
        }
        else
            outfile << "0" << endl;
    }


    else

    {   // 2D fepp format

        ;
        /*
        extern SplineGeometry2d * geometry2d;
        if (geometry2d)
        Save2DMesh (mesh, &geometry2d->GetSplines(), outfile);
             else
        Save2DMesh (mesh, 0, outfile);
             */
    }
}
Esempio n. 12
0
void readSpatialSBML() {
	SBMLDocument *document2 = readSBML("spatial_example0.xml");
  
	Model *model2 = document2->getModel();
	Compartment *comp;
	SpatialCompartmentPlugin* cplugin;
	RequiredElementsSBasePlugin* reqplugin;
	for (unsigned int i = 0; i < model2->getNumCompartments(); i++) {
		comp = model2->getCompartment(i);
		cout << "Compartment" << i << ": "  << comp->getId() << endl;
		reqplugin = static_cast<RequiredElementsSBasePlugin*>(comp->getPlugin("req"));
		if (!reqplugin->getMathOverridden().empty()) {
			cout << "Comp" << i << "  req mathOverridden: "  << reqplugin->getMathOverridden() << endl;
		}
		cplugin = static_cast<SpatialCompartmentPlugin*>(comp->getPlugin("spatial"));
		if (cplugin->getCompartmentMapping()->isSetSpatialId()) {
			cout << "Comp" << i << "  CMSpId: "  << cplugin->getCompartmentMapping()->getSpatialId() << endl;
			cout << "Comp" << i << "  CM_Comp: "  << cplugin->getCompartmentMapping()->getCompartment() << endl;
			cout << "Comp" << i << "  CM_DType: "  << cplugin->getCompartmentMapping()->getDomainType() << endl;
			cout << "Comp" << i << "  CM_UnitSz: "  << cplugin->getCompartmentMapping()->getUnitSize() << endl;
		}
	}

	Species *sp;
	SpatialSpeciesRxnPlugin* srplugin;
	for (unsigned int i = 0; i < model2->getNumSpecies(); i++) {
		sp = model2->getSpecies(i);
		cout << "Species" << i << ": "      << sp->getId()      << endl;
		srplugin = static_cast<SpatialSpeciesRxnPlugin*>(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;
		reqplugin = static_cast<RequiredElementsSBasePlugin*>(param->getPlugin("req"));
		if (!reqplugin->getMathOverridden().empty()) {
			cout << "Parameter" << i << "  req mathOverridden: "  << reqplugin->getMathOverridden() << endl;
		}
		pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial"));
		if (pplugin->getSpatialSymbolReference()->isSetSpatialId()) {
			cout << "Parameter" << i << "  SpRefId: "  << pplugin->getSpatialSymbolReference()->getSpatialId() << endl;
			cout << "Parameter" << i << "  SpRefType: "  << pplugin->getSpatialSymbolReference()->getType() << endl;
		}
		if (pplugin->getDiffusionCoefficient()->isSetVariable()) {
			cout << "Diff_" << i << "  SpeciesVarId: "  << pplugin->getDiffusionCoefficient()->getVariable() << endl;
			cout << "Diff_" << i << "  SpCoordIndex: "  << pplugin->getDiffusionCoefficient()->getCoordinateIndex() << endl;
		}
		if (pplugin->getAdvectionCoefficient()->isSetVariable()) {
			cout << "Adv_" << i << "  SpeciesVarId: "  << pplugin->getAdvectionCoefficient()->getVariable() << endl;
			cout << "Adv_" << i << "  SpCoordIndex: "  << pplugin->getAdvectionCoefficient()->getCoordinateIndex() << endl;
		}
		if (pplugin->getBoundaryCondition()->isSetVariable()) {
			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;
	for (unsigned int i = 0; i < model2->getNumReactions(); i++) {
		rxn = model2->getReaction(i);
		cout << "Reaction" << i << ": "      << rxn->getId()      << endl;
		srplugin = static_cast<SpatialSpeciesRxnPlugin*>(rxn->getPlugin("spatial"));
		if (srplugin->getIsLocal()) {
			cout << "rxn" << i << "  isLocal: "  << srplugin->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 spatialId: " << coordComp->getSpatialId() << std::endl;
	std::cout << "CoordComponent compType: " << coordComp->getComponentType() << std::endl;
	std::cout << "CoordComponent sbmlUnit: " << coordComp->getSbmlUnit() << std::endl;
	std::cout << "CoordComponent index: " << coordComp->getIndex() << std::endl;
	BoundaryMin* minX = coordComp->getBoundaryMin();
	std::cout << "minX name: " << minX->getSpatialId() << std::endl;
	std::cout << "minX value: " << minX->getValue() << std::endl;
	BoundaryMax* maxX = coordComp->getBoundaryMax();
	std::cout << "maxX name: " << maxX->getSpatialId() << 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 spatialId: " << domainType2->getSpatialId() << std::endl;
	std::cout << "DomainType spatialDim: " << domainType2->getSpatialDimensions() << std::endl;

	// get a Domain object via the Geometry object.	
	Domain* domain = geometry2->getDomain(0);
	std::cout << "Domain1 spatialId: " << domain->getSpatialId() << std::endl;
	std::cout << "Domain1 implicit: " << domain->getImplicit() << std::endl;
	std::cout << "Domain1 domainType: " << domain->getDomainType() << std::endl;
	std::cout << "Domain1 Shape: " << domain->getShapeId() << 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 spatialId: " << domain->getSpatialId() << std::endl;
	std::cout << "Domain2 implicit: " << domain->getImplicit() << std::endl;
	std::cout << "Domain2 domainType: " << domain->getDomainType() << std::endl;
	std::cout << "Domain2 Shape: " << domain->getShapeId() << 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 spatialId: " << adjDomain->getSpatialId() << std::endl;
	std::cout << "AdjDomain domain1: " << adjDomain->getDomain1() << std::endl;
	std::cout << "AdjDomain domain2: " << adjDomain->getDomain2() << std::endl;

	// get the different GeometryDefinition objects 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 spatialId: " << analyticalGeom->getSpatialId() << std::endl;

			// analVol from analGeom.
			AnalyticVolume* av = analyticalGeom->getAnalyticVolume(0);
			std::cout << "AnalVol spatialId: " << av->getSpatialId() << 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 spatialId: " << sfGeom->getSpatialId() << std::endl;
			
			// sampledField from sfGeom
			SampledField* sf = sfGeom->getSampledField();
			std::cout << "SampledField spatialId: " << sf->getSpatialId() << 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 samplesLen: " << id->getSamplesLength() << std::endl;
			std::cout << "ImageData dataType: " << id->getDataType() << std::endl;

			// sampledVolVol from sfGeom.
			SampledVolume* sv = sfGeom->getSampledVolume(0);
			std::cout << "SampledVol spatialId: " << sv->getSpatialId() << 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;
		}
		if (gd->isParametricGeometry()) {
			ParametricGeometry* pGeom = static_cast<ParametricGeometry*>(gd);
			std::cout << "ParametricGeometry spatialId: " << pGeom->getSpatialId() << std::endl;
			
			// parametricObject from pGeom
			ParametricObject* pObj = pGeom->getParametricObject(0);
			std::cout << "ParametricObj spatialId: " << pObj->getSpatialId() << std::endl;
			std::cout << "ParametricObj domain: " << pObj->getDomain() << std::endl;
			std::cout << "ParametricObj polygonType: " << pObj->getPolygonType() << std::endl;
			const PolygonObject* po = pObj->getPolygonObject();
			int* ptInd = new int[po->getIndicesLength()];
			po->getPointIndices(ptInd);
			std::cout << "PolygonObj ptIndices[0]: " << ptInd[0] << std::endl;
			std::cout << "PolygonObj indLen: " << po->getIndicesLength() << std::endl;

			// SpatialPoint from pGeom.
			SpatialPoint* sp = pGeom->getSpatialPoint(0);
			std::cout << "SpatialPt spatialId: " << sp->getSpatialId() << std::endl;
			std::cout << "SpatialPt domain: " << sp->getDomain() << std::endl;
			std::cout << "SpatialPt coord1: " << sp->getCoord1() << std::endl;
			std::cout << "SpatialPt coord2: " << sp->getCoord2() << std::endl;
			std::cout << "SpatialPt coord3: " << sp->getCoord3() << std::endl;
		}
		if (gd->isCSGeometry()) {
			CSGeometry* csGeom = static_cast<CSGeometry*>(gd);
			std::cout << "CSGeometry spatialId: " << csGeom->getSpatialId() << std::endl;
			
			// CSGObject-CSGOperator from csGeom
			CSGObject* csgo;
			for (unsigned int i = 0; i < csGeom->getNumCSGObjects(); i++) {
				csgo = csGeom->getCSGObject(i);
				std::cout << "CSGObject spatialId: " << csgo->getSpatialId() << std::endl;
				std::cout << "CSGObject domainType: " << csgo->getDomainType() << std::endl;
				const CSGNode* csgnode = csgo->getCSGNodeRoot();
				if (csgnode->isCSGTransformation()) {
					CSGTransformation* transf = (CSGTransformation*)csgnode;
					if (transf->isCSGScale()) {
						CSGScale* scale = static_cast<CSGScale*>(transf);
						std::cout << "CSGScale scaleX: " << scale->getScaleX() << std::endl;
						std::cout << "CSGScale scaleY: " << scale->getScaleY() << std::endl;
						std::cout << "CSGScale scaleZ: " << scale->getScaleZ() << std::endl;
						const CSGNode* scaleChild = scale->getChild();
						if (scaleChild->isCSGPrimitive()) {
							CSGPrimitive* prim = (CSGPrimitive*)scaleChild;
							std::cout << "CSGPrimitive primitiveType: " << prim->getPrimitiveType() << std::endl;
						}
					}
				}
				if (csgnode->isCSGSetOperator()) {
					CSGSetOperator* setop = (CSGSetOperator*)(csgnode);
					std::cout << "CSGSetOperator opType: " << setop->getOperationType() << std::endl;
					for (unsigned int k = 0; k < setop->getNumCSGNodeChildren(); k++) {
						CSGNode* csgNode = setop->getCSGNodeChild(k);
						std::cout << "CSGNode type: " << csgNode->getTypeCode() << std::endl;
					}
				}
			}
		}
	}

	delete document2;
}
Esempio n. 13
0
void writeSpatialSBML() {
  
/*
  // SBMLNamespaces of SBML Level 3 Version 1 with Spatial Version 1
  SBMLNamespaces sbmlns(3,1,"spatial",1);
  // SpatialPkgNamespaces spatialns(3,1,1);

  // add Required Elements package namespace
  sbmlns.addPkgNamespace("req", 1);
*/

  // SBMLNamespaces of SBML Level 3 Version 1 with 'req' Version 1
  // then add 'spatial' package namespace.
  RequiredElementsPkgNamespaces sbmlns(3,1,1);
  sbmlns.addPkgNamespace("spatial",1);

  // create the L3V1 document with spatial package
  SBMLDocument document(&sbmlns);	


  // set 'required' attribute on document for 'spatial' and 'req' packages to 'T'??
  SBMLDocumentPlugin* dplugin;
  dplugin = static_cast<SBMLDocumentPlugin*>(document.getPlugin("spatial"));
  dplugin->setRequired(true);
  dplugin = static_cast<SBMLDocumentPlugin*>(document.getPlugin("req"));
  dplugin->setRequired(true);

  // create the Model 
  Model *model = document.createModel();
  model-> setId("trial_spatial");
  model-> setName("trial_spatial");

  // create the Compartments
  Compartment* compartment = model->createCompartment();
  compartment->setId("cytosol");
  compartment->setConstant(true);

  // create the Species
  Species* species1 = model->createSpecies();
  species1->setId("ATPc");
  species1->setCompartment("cytosol");
  species1->setInitialConcentration(1.0);
  species1->setHasOnlySubstanceUnits(false);
  species1->setBoundaryCondition(false);
  species1->setConstant(false);
  // spatial package extension to species.
  // required elements package extention to parameter
  RequiredElementsSBasePlugin* reqplugin;
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(species1->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  SpatialSpeciesRxnPlugin* srplugin;
  srplugin = static_cast<SpatialSpeciesRxnPlugin*>(species1->getPlugin("spatial"));
  srplugin->setIsSpatial(true);

  // add parameter for diff coeff of species1
  Parameter* paramSp = model->createParameter();
  paramSp->setId(species1->getId()+"_dc");
  paramSp->setValue(1.0);
  // required elements package extention to parameter
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(paramSp->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  // spatial package extension to parameter.
  SpatialParameterPlugin* pplugin;
  pplugin = static_cast<SpatialParameterPlugin*>(paramSp->getPlugin("spatial"));
  DiffusionCoefficient* diffCoeff = pplugin->getDiffusionCoefficient();
  diffCoeff->setVariable(species1->getId());
  diffCoeff->setCoordinateIndex(0);
  // add parameter for adv coeff of species1
  paramSp = model->createParameter();
  paramSp->setId(species1->getId()+"_ac");
  paramSp->setValue(1.5);
  // required elements package extention to parameter
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(paramSp->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  // spatial package extension to parameter.
  pplugin = static_cast<SpatialParameterPlugin*>(paramSp->getPlugin("spatial"));
  AdvectionCoefficient* advCoeff = pplugin->getAdvectionCoefficient();
  advCoeff->setVariable(species1->getId());
  advCoeff->setCoordinateIndex(0);
  // add parameter for boundary condition of species1
  paramSp = model->createParameter();
  paramSp->setId(species1->getId()+"_bc");
  paramSp->setValue(2.0);
  // required elements package extention to parameter
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(paramSp->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  // spatial package extension to parameter.
  pplugin = static_cast<SpatialParameterPlugin*>(paramSp->getPlugin("spatial"));
  BoundaryCondition* boundCon = pplugin->getBoundaryCondition();
  boundCon->setVariable(species1->getId());
  boundCon->setType("value");
  boundCon->setCoordinateBoundary("Xmin");

  Species* species2 = model->createSpecies();
  species2->setId("ADPc");
  species2->setCompartment("cytosol");
  species2->setInitialConcentration(1);
  species2->setHasOnlySubstanceUnits(false);
  species2->setBoundaryCondition(false);
  species2->setConstant(false);
  srplugin = static_cast<SpatialSpeciesRxnPlugin*>(species2->getPlugin("spatial"));
  srplugin->setIsSpatial(true);

/*  // create a parameter
  Parameter* param = model->createParameter();
  param->setId("k_1");
  param->setValue(0.24);
  param->setConstant(true);

  // create an assignment rule
  AssignmentRule* assignRule = model->createAssignmentRule();
  assignRule->setVariable(species1->getId());
  assignRule->setFormula("species2+k_1");
*/
  /*
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(assignRule->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(false);
  */

  Reaction* reaction = model->createReaction();
  reaction->setId("rxn1");
  reaction->setReversible(false);
  reaction->setFast(false);
  reaction->setCompartment("cytosol");
  srplugin = static_cast<SpatialSpeciesRxnPlugin*>(reaction->getPlugin("spatial"));
  srplugin->setIsLocal(true);

  //
  // 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 casted for the 
  // corresponding derived class.
  //
  SpatialModelPlugin* mplugin;
  mplugin = static_cast<SpatialModelPlugin*>(model->getPlugin("spatial"));

  //
  // Creates a geometry object via SpatialModelPlugin object.
  //
  Geometry* geometry = mplugin->getGeometry();
  geometry->setCoordinateSystem("XYZ");

  CoordinateComponent* coordX = geometry->createCoordinateComponent();
  coordX->setSpatialId("coordComp1");
  coordX->setComponentType("cartesian");
  coordX->setSbmlUnit("umeter");
  coordX->setIndex(1);
  BoundaryMin* minX = coordX->createBoundaryMin();
  minX->setSpatialId("Xmin");
  minX->setValue(0.0);
  BoundaryMax* maxX = coordX->createBoundaryMax();
  maxX->setSpatialId("Xmax");
  maxX->setValue(10.0);

  Parameter* paramX = model->createParameter();
  paramX->setId("x");
  paramX->setValue(8.0);
  // required elements package extention to parameter
  // RequiredElementsSBasePlugin* reqplugin;
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(paramX->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  // spatial package extension to parameter.
  // SpatialParameterPlugin* pplugin;
  pplugin = static_cast<SpatialParameterPlugin*>(paramX->getPlugin("spatial"));
  SpatialSymbolReference* spSymRef = pplugin->getSpatialSymbolReference();
  spSymRef->setSpatialId(coordX->getSpatialId());
  spSymRef->setType(coordX->getElementName());

  DomainType* domainType = geometry->createDomainType();
  domainType->setSpatialId("dtype1");
  domainType->setSpatialDimensions(3);

  // Spatial package extension to compartment (mapping compartment with domainType)
  // required elements package extention to compartment
  reqplugin = static_cast<RequiredElementsSBasePlugin*>(compartment->getPlugin("req"));
  reqplugin->setMathOverridden("spatial");
  reqplugin->setCoreHasAlternateMath(true);
  SpatialCompartmentPlugin* cplugin;
  cplugin = static_cast<SpatialCompartmentPlugin*>(compartment->getPlugin("spatial"));
  CompartmentMapping* compMapping = cplugin->getCompartmentMapping();
  compMapping->setSpatialId("compMap1");
  compMapping->setCompartment(compartment->getId());
  compMapping->setDomainType(domainType->getSpatialId());
  compMapping->setUnitSize(1.0);
  
  Domain* domain = geometry->createDomain();
  domain->setSpatialId("domain1");
  domain->setDomainType("dtype1");
  domain->setImplicit(false);
  domain->setShapeId("circle");
  InteriorPoint* internalPt1 = domain->createInteriorPoint();
  internalPt1->setCoord1(1.0);

  domain = geometry->createDomain();
  domain->setSpatialId("domain2");
  domain->setDomainType("dtype1");
  domain->setImplicit(false);
  domain->setShapeId("square");
  InteriorPoint* internalPt2 = domain->createInteriorPoint();
  internalPt2->setCoord1(5.0);

  AdjacentDomains* adjDomain = geometry->createAdjacentDomains();
  adjDomain->setSpatialId("adjDomain1");
  adjDomain->setDomain1("domain1");
  adjDomain->setDomain2("domain2");

  AnalyticGeometry* analyticGeom = geometry->createAnalyticGeometry();
  analyticGeom->setSpatialId("analyticGeom1");
  AnalyticVolume* analyticVol = analyticGeom->createAnalyticVolume();
  analyticVol->setSpatialId("analyticVol1");
  analyticVol->setDomainType(domainType->getSpatialId());
  analyticVol->setFunctionType("squareFn");
  analyticVol->setOrdinal(1);
  const char* mathMLStr = "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"><apply xmlns=\"\"><plus /><apply><times /><ci>x</ci><ci>x</ci></apply><apply><minus /><cn>1.0</cn></apply></apply></math>";
  ASTNode* mathNode = readMathMLFromString(mathMLStr);
  analyticVol->setMath(mathNode);

  SampledFieldGeometry* sfg = geometry->createSampledFieldGeometry();
  sfg->setSpatialId("sampledFieldGeom1");
  SampledField* sampledField = sfg->createSampledField();
  sampledField->setSpatialId("sampledField1");
  sampledField->setNumSamples1(4);
  sampledField->setNumSamples2(4);
  sampledField->setNumSamples3(2);
  sampledField->setDataType("double");
  sampledField->setInterpolationType("linear");
  sampledField->setEncoding("encoding1");
  //int samples[5] = {1, 2, 3, 4, 5};
  int samples[32] = {
	                 // z=0
	                 0,0,0,0,
	                 0,1,1,0,
					 0,1,1,0,
					 0,0,0,0,
					 // z=1
					 0,0,0,0,
					 0,1,1,0,
					 0,1,1,0,
					 0,0,0,0
  };
  ImageData* id = sampledField->createImageData();
  id->setDataType("compressed");
  id->setSamples(samples, 32);
  SampledVolume* sampledVol = sfg->createSampledVolume();
  sampledVol->setSpatialId("sv_1");
  sampledVol->setDomainType(domainType->getSpatialId());
  sampledVol->setSampledValue(128.0);
  sampledVol->setMinValue(0.0);
  sampledVol->setMaxValue(255.0);
  
  ParametricGeometry* pg = geometry->createParametricGeometry();
  pg->setSpatialId("parametricGeom1");
  ParametricObject* paramObj = pg->createParametricObject();
  paramObj->setSpatialId("po_1");
  paramObj->setDomain(domain->getSpatialId());
  paramObj->setPolygonType("hexagon");
  int ptIndices[5] = {1, 2, 3, 4, 5};
  PolygonObject* po = paramObj->createPolygonObject();
  po->setPointIndices(ptIndices, 5);
  SpatialPoint* spPt = pg->createSpatialPoint();
  spPt->setSpatialId("sp_1");
  spPt->setDomain(domain->getSpatialId());
  spPt->setCoord1(1);
  spPt->setCoord2(2);
  spPt->setCoord3(3);

  CSGeometry* csg = geometry->createCSGeometry();
  csg->setSpatialId("csGeom1");
  CSGObject* csgObj = csg->createCSGObject();
  csgObj->setSpatialId("csg_csgo_1");
  csgObj->setDomainType(domainType->getSpatialId());
  csgObj->setOrdinal(1);
  CSGScale* scale = csgObj->createCSGScale();
  scale->setScaleX(2.0);
  scale->setScaleY(3.0);
  scale->setScaleZ(4.0);
  CSGPrimitive* prim1 = scale->createCSGPrimitive();
  prim1->setPrimitiveType("SOLID_SPHERE");

  csgObj = csg->createCSGObject();
  csgObj->setSpatialId("csg_csgo_2");
  csgObj->setDomainType(domainType->getSpatialId());
  CSGSetOperator* setUnion = csgObj->createCSGSetOperator();
  setUnion->setOperationType("UNION");
/*  CSGPrimitive* prim = setUnion->createCSGPrimitive();
  prim->setPrimitiveType("SOLID_SPHERE");
  CSGPrimitive* prim2 = setUnion->createCSGPrimitive();
  prim2->setPrimitiveType("SOLID_CONE");
*/
  CSGPrimitive* prim2 = new CSGPrimitive(3,1,1);
  prim2->setSpatialId("cone0");
  prim2->setPrimitiveType("SOLID_CONE");
  CSGTranslation* translatedCone = new CSGTranslation(3,1,1);
  translatedCone->setSpatialId("translation0");
  translatedCone->setTranslateX(2.0);
  translatedCone->setTranslateY(2.0);
  translatedCone->setTranslateZ(2.0);
  translatedCone->setChild(prim2);
  int n = setUnion->addCSGNodeChild(translatedCone);
  CSGPrimitive* prim3 = new CSGPrimitive(3,1,1);
  prim3->setSpatialId("sphere0");
  prim3->setPrimitiveType("SOLID_SPHERE");
  n = setUnion->addCSGNodeChild(prim3);

  writeSBML(&document, "spatial_example0.xml");

}
Esempio n. 14
0
  int Ng_TopLevel (ClientData clientData,
		   Tcl_Interp * interp,
		   int argc, tcl_const char *argv[])
  {
    CSGeometry * geometry = dynamic_cast<CSGeometry*> (ng_geometry.get());
    if (!geometry)
      {
	Tcl_SetResult (interp, err_needscsgeometry, TCL_STATIC);
	return TCL_ERROR;
      }


    int i;
    /*
      for (i = 0; i < argc; i++)
      cout << argv[i] << ", ";
      cout << endl;
    */

    if (strcmp (argv[1], "getlist") == 0)
      {
	stringstream vst;

	for (i = 0; i < geometry->GetNTopLevelObjects(); i++)
	  {
	    const Solid * sol;
	    const Surface * surf;
	    geometry->GetTopLevelObject (i, sol, surf);

	    if (!surf)
	      vst << "{ " << sol->Name() << " } ";
	    else
	      vst << "{ " << sol->Name() << " " << surf->Name() << " } ";
	  }

	tcl_const char * valuevar = argv[2];
	Tcl_SetVar  (interp, valuevar, (char*)vst.str().c_str(), 0);
      }

    if (strcmp (argv[1], "set") == 0)
      {
	tcl_const char * solname = argv[2];
	tcl_const char * surfname = argv[3];
	Solid * sol = (Solid*)geometry->GetSolid (solname);
	Surface * surf = (Surface*)geometry->GetSurface (surfname);
	geometry->SetTopLevelObject (sol, surf);
      }

    if (strcmp (argv[1], "remove") == 0)
      {
	tcl_const char * solname = argv[2];
	tcl_const char * surfname = argv[3];
	Solid * sol = (Solid*)geometry->GetSolid (solname);
	Surface * surf = (Surface*)geometry->GetSurface (surfname);
	geometry->RemoveTopLevelObject (sol, surf);
      }

    if (strcmp (argv[1], "setprop") == 0)
      {
	tcl_const char * solname = argv[2];
	tcl_const char * surfname = argv[3];
	tcl_const char * propvar = argv[4];
	Solid * sol = (Solid*)geometry->GetSolid (solname);
	Surface * surf = (Surface*)geometry->GetSurface (surfname);
	TopLevelObject * tlo = geometry->GetTopLevelObject (sol, surf);

	if (!tlo) return TCL_OK;

	char varname[50];
	sprintf (varname, "%s(red)", propvar);
	double red = atof (Tcl_GetVar (interp, varname, 0));
	sprintf (varname, "%s(blue)", propvar);
	double blue = atof (Tcl_GetVar (interp, varname, 0));
	sprintf (varname, "%s(green)", propvar);
	double green = atof (Tcl_GetVar (interp, varname, 0));
	tlo -> SetRGB (red, green, blue);

	sprintf (varname, "%s(visible)", propvar);
	tlo -> SetVisible (bool(atoi (Tcl_GetVar (interp, varname, 0))));
	sprintf (varname, "%s(transp)", propvar);
	tlo -> SetTransparent (bool(atoi (Tcl_GetVar (interp, varname, 0))));
      }

    if (strcmp (argv[1], "getprop") == 0)
      {
	tcl_const char * solname = argv[2];
	tcl_const char * surfname = argv[3];
	tcl_const char * propvar = argv[4];

	Solid * sol = (Solid*)geometry->GetSolid (solname);
	Surface * surf = (Surface*)geometry->GetSurface (surfname);
	TopLevelObject * tlo = geometry->GetTopLevelObject (sol, surf);

	if (!tlo) return TCL_OK;

	char varname[50], varval[10];

	sprintf (varname, "%s(red)", propvar);
	sprintf (varval, "%lf", tlo->GetRed());
	Tcl_SetVar (interp, varname, varval, 0);

	sprintf (varname, "%s(green)", propvar);
	sprintf (varval, "%lf", tlo->GetGreen());
	Tcl_SetVar (interp, varname, varval, 0);

	sprintf (varname, "%s(blue)", propvar);
	sprintf (varval, "%lf", tlo->GetBlue());
	Tcl_SetVar (interp, varname, varval, 0);

	sprintf (varname, "%s(visible)", propvar);
	sprintf (varval, "%d", tlo->GetVisible());
	Tcl_SetVar (interp, varname, varval, 0);

	sprintf (varname, "%s(transp)", propvar);
	sprintf (varval, "%d", tlo->GetTransparent());
	Tcl_SetVar (interp, varname, varval, 0);
      }


    return TCL_OK;
  }
Esempio n. 15
0
void WriteTecPlotFormat (const Mesh & mesh,
			 const CSGeometry & geom,
			 const string & filename)
{
  INDEX i;
  int j, k, e, z;
  Vec<3> n;
  
  INDEX np = mesh.GetNP();
  INDEX ne = mesh.GetNE();
  INDEX nse = mesh.GetNSE();
  
  ARRAY<int> sn(np);
  ofstream outfile(filename.c_str());
  
  outfile << "TITLE=\" " << filename << "\"" << endl;

  // fill hashtable

  INDEX_3_HASHTABLE<int> face2volelement(ne);

  for (i = 1; i <= ne; i++)
    {
      const Element & el = mesh.VolumeElement(i);
      INDEX_3 i3;
      int l;
      for (j = 1; j <= 4; j++)   // loop over faces of tet
	{
	  l = 0;
	  for (k = 1; k <= 4; k++)
	    if (k != j)
	      {
		l++;
		i3.I(l) = el.PNum(k);
	      }
	  i3.Sort();
	  face2volelement.Set (i3, i);
	}
    }
      
      
  for (j = 1; j <= geom.GetNSurf(); j++)       /* Flaeche Nummer j */
    {
      for (i = 1; i <= np; i++)
	sn.Elem(i) = 0;

      e = 0;
       
      for (i = 1; i <= nse; i++)
	{
	  const Element2d & el = mesh.SurfaceElement(i);
	  if (j ==  mesh.GetFaceDescriptor (el.GetIndex ()).SurfNr())
	    {
	      for (k = 1; k <= 3; k++)
		sn.Elem(el.PNum(k)) = 1;
	      e++;                     /* e= Anzahl der neuen Elemente */
	    }
	}

      z = 0;
      for (i = 1; i <= np; i++)
	if (sn.Elem(i) == 1)
	  sn.Elem(i) = ++z;

      outfile << "ZONE T=\" Surface " << j << " \", N=" << z
	      << ", E=" << e << ", ET=TRIANGLE, F=FEPOINT" << endl;

      for (i = 1; i <= np; i++)
	if (sn.Elem(i) != 0)
	  {
	    n = geom.GetSurface(j) -> GetNormalVector ( mesh.Point(i) );
		
	    outfile << mesh.Point(i)(0) << " " /* Knoten Koordinaten */
		    << mesh.Point(i)(1) << " "
		    << mesh.Point(i)(2) << " "
		    << n(0) << " "
		    << n(1) << " "
		    << n(2) << " "
		    << i     << endl;
	  }
	  

      for (i = 1; i <= nse; i++)
	{
	  const Element2d & el = mesh.SurfaceElement(i);
	  if (j ==  mesh.GetFaceDescriptor(el.GetIndex ()).SurfNr())
	    /* FlaechenKnoten (3) */
	    outfile << sn.Get(el.PNum(1)) << " " 
		    << sn.Get(el.PNum(2)) << " "
		    << sn.Get(el.PNum(3)) << endl;
	      
	  /// Hier soll noch die Ausgabe der Nummer des angrenzenden
	      /// Vol.elements erfolgen !

	      for (k = 1; k <= nse; k++)
		{
		  const Element2d & sel = mesh.SurfaceElement(k);
		  INDEX_3 i3;
		  for (j = 1; j <= 3; j++)
		    i3.I(j) = sel.PNum(j);
		  i3.Sort();
		  
		  //int elind = face2volelement.Get(i3);
		}
	}
    }
}