Path: blob/devel/ElmerGUI/netgen/libsrc/interface/nginterface.cpp
3206 views
#include <mystdlib.h>123#include <meshing.hpp>4#include <csg.hpp>5#include <geometry2d.hpp>6#include <stlgeom.hpp>789#ifdef OCCGEOMETRY10#include <occgeom.hpp>11#endif1213#ifdef ACIS14#include <acisgeom.hpp>15#endif1617#ifdef SOCKETS18#include "../sockets/sockets.hpp"19#endif2021#ifndef NOTCL22#include <visual.hpp>23#endif242526#include "nginterface.h"2728// #include <FlexLexer.h>293031// #include <mystdlib.h>323334namespace netgen35{36#include "writeuser.hpp"3738extern AutoPtr<Mesh> mesh;39#ifndef NOTCL40extern VisualSceneMesh vsmesh;41extern Tcl_Interp * tcl_interp;42#endif4344extern AutoPtr<SplineGeometry2d> geometry2d;45extern AutoPtr<CSGeometry> geometry;46extern STLGeometry * stlgeometry;4748#ifdef OCCGEOMETRY49extern OCCGeometry * occgeometry;50#endif51#ifdef ACIS52extern ACISGeometry * acisgeometry;53#endif5455#ifdef OPENGL56extern VisualSceneSolution vssolution;57#endif58extern CSGeometry * ParseCSG (istream & istr);5960#ifdef SOCKETS61extern AutoPtr<ClientSocket> clientsocket;62//extern ARRAY< AutoPtr < ServerInfo > > servers;63extern ARRAY< ServerInfo* > servers;64#endif65}666768using namespace netgen;6970/*71extern void * operator new (size_t s);72extern void * operator new [] (size_t s);73extern void operator delete (void * p);74extern void operator delete [] (void * p);75*/7677// extern FlexLexer * lexer;78798081void Ng_LoadGeometry (const char * filename)82{838485if (printmessage_importance>0)86cout << "CALLED NG LOAD GEOMETRY" << endl;8788geometry.Reset (new CSGeometry ());89geometry2d.Reset ();9091#ifdef OCCGEOMETRY92delete occgeometry;93occgeometry = 0;94#endif95#ifdef ACIS96delete acisgeometry;97acisgeometry = 0;98#endif99100// he: if filename is empty, return101// can be used to reset geometry102if (strcmp(filename,"")==0)103return;104105ifstream infile (filename);106107if ((strcmp (&filename[strlen(filename)-3], "geo") == 0) ||108(strcmp (&filename[strlen(filename)-3], "GEO") == 0) ||109(strcmp (&filename[strlen(filename)-3], "Geo") == 0))110{111112113geometry.Reset( netgen::ParseCSG(infile) );114115if (!geometry)116{117geometry.Reset (new CSGeometry ());118//throw NgException ("input file not found");119cerr << "Error: input file \"" << filename << "\" not found" << endl;120}121122geometry -> FindIdenticSurfaces(1e-6);123124#ifdef PARALLEL125int id, rc, ntasks;126MPI_Comm_size(MPI_COMM_WORLD, &ntasks);127MPI_Comm_rank(MPI_COMM_WORLD, &id);128if ( id > 0 )129{130geometry->CalcTriangleApproximation ( geometry->BoundingBox(), 0.001, 20 );131return;132}133#endif134135Box<3> box (geometry->BoundingBox());136#ifdef NOTCL137double detail = 0.001;138double facets = 20;139geometry->CalcTriangleApproximation(box, detail, facets);140141#else142double detail = atof (Tcl_GetVar (tcl_interp, "::geooptions.detail", 0));143double facets = atof (Tcl_GetVar (tcl_interp, "::geooptions.facets", 0));144145if (atoi (Tcl_GetVar (tcl_interp, "::geooptions.drawcsg", 0)))146geometry->CalcTriangleApproximation(box, detail, facets);147#endif148}149150else if (strcmp (&filename[strlen(filename)-4], "in2d") == 0)151{152geometry2d.Reset (new SplineGeometry2d());153geometry2d -> Load (filename);154}155156else if ((strcmp (&filename[strlen(filename)-3], "stl") == 0) ||157(strcmp (&filename[strlen(filename)-3], "STL") == 0) ||158(strcmp (&filename[strlen(filename)-3], "Stl") == 0))159{160stlgeometry = STLGeometry :: Load (infile);161stlgeometry->edgesfound = 0;162Mesh meshdummy;163stlgeometry->Clear();164stlgeometry->BuildEdges();165stlgeometry->MakeAtlas(meshdummy);166stlgeometry->CalcFaceNums();167stlgeometry->AddFaceEdges();168stlgeometry->LinkEdges();169}170171#ifdef OCCGEOMETRY172else if ((strcmp (&filename[strlen(filename)-4], "iges") == 0) ||173(strcmp (&filename[strlen(filename)-3], "igs") == 0) ||174(strcmp (&filename[strlen(filename)-3], "IGS") == 0) ||175(strcmp (&filename[strlen(filename)-4], "IGES") == 0))176{177PrintMessage (1, "Load IGES geometry file ", filename);178occgeometry = LoadOCC_IGES (filename);179}180else if ((strcmp (&filename[strlen(filename)-4], "step") == 0) ||181(strcmp (&filename[strlen(filename)-3], "stp") == 0) ||182(strcmp (&filename[strlen(filename)-3], "STP") == 0) ||183(strcmp (&filename[strlen(filename)-4], "STEP") == 0))184{185PrintMessage (1, "Load STEP geometry file ", filename);186occgeometry = LoadOCC_STEP (filename);187}188#endif189190#ifdef ACIS191else if (192strcmp (&filename[strlen(filename)-3], "sat") == 0 ||193( strlen(filename) >= 7 && strcmp ( &filename[ strlen( filename)-7 ], "sat.tet" ) == 0 )194)195{196PrintMessage (1, "Load ACIS geometry file ", filename);197acisgeometry = LoadACIS_SAT (filename);198}199#endif200else201{202//throw NgException("Unknown geometry extension");203cerr << "Error: Unknown geometry extension \"" << filename[strlen(filename)-3] << "\"" << endl;204}205206207}208209210void Ng_LoadMeshFromStream ( istream & input )211{212mesh.Reset (new Mesh());213mesh -> Load(input);214if(input.good())215{216string auxstring;217input >> auxstring;218if(auxstring == "csgsurfaces")219{220if (geometry)221{222geometry.Reset (new CSGeometry (""));223}224if (stlgeometry)225{226delete stlgeometry;227stlgeometry = NULL;228}229#ifdef OCCGEOMETRY230if (occgeometry)231{232delete occgeometry;233occgeometry = NULL;234}235#endif236#ifdef ACIS237if (acisgeometry)238{239delete acisgeometry;240acisgeometry = NULL;241}242#endif243geometry2d.Reset (0);244245geometry -> LoadSurfaces(input);246}247}248249}250251252void Ng_LoadMesh (const char * filename)253{254if ( (strlen (filename) > 4) &&255strcmp (filename + (strlen (filename)-4), ".vol") != 0 )256{257mesh.Reset (new Mesh());258ReadFile(*mesh,filename);259260//mesh->SetGlobalH (mparam.maxh);261//mesh->CalcLocalH();262return;263}264265ifstream infile(filename);266Ng_LoadMeshFromStream(infile);267}268269void Ng_LoadMeshFromString (char * mesh_as_string)270{271istringstream instream(mesh_as_string);272Ng_LoadMeshFromStream(instream);273}274275276277278int Ng_GetDimension ()279{280return (mesh) ? mesh->GetDimension() : -1;281}282283int Ng_GetNP ()284{285return (mesh) ? mesh->GetNP() : 0;286}287288int Ng_GetNV ()289{290return (mesh) ? mesh->GetNV() : 0;291}292293int Ng_GetNE ()294{295if(!mesh) return 0;296if (mesh->GetDimension() == 3)297return mesh->GetNE();298else299return mesh->GetNSE();300}301302int Ng_GetNSE ()303{304if(!mesh) return 0;305if (mesh->GetDimension() == 3)306return mesh->GetNSE();307else308return mesh->GetNSeg();309}310311void Ng_GetPoint (int pi, double * p)312{313if (pi < 1 || pi > mesh->GetNP())314{315if (printmessage_importance>0)316cout << "Ng_GetPoint: illegal point " << pi << endl;317return;318}319320const Point3d & hp = mesh->Point (pi);321p[0] = hp.X();322p[1] = hp.Y();323if (mesh->GetDimension() == 3)324p[2] = hp.Z();325}326327328NG_ELEMENT_TYPE Ng_GetElement (int ei, int * epi, int * np)329{330if (mesh->GetDimension() == 3)331{332int i;333const Element & el = mesh->VolumeElement (ei);334for (i = 0; i < el.GetNP(); i++)335epi[i] = el.PNum(i+1);336337if (np)338*np = el.GetNP();339340if (el.GetType() == PRISM)341{342// degenerated prism, (should be obsolete)343const int map1[] = { 3, 2, 5, 6, 1 };344const int map2[] = { 1, 3, 6, 4, 2 };345const int map3[] = { 2, 1, 4, 5, 3 };346347const int * map = NULL;348int deg1 = 0, deg2 = 0, deg3 = 0;349//int deg = 0;350if (el.PNum(1) == el.PNum(4)) { map = map1; deg1 = 1; }351if (el.PNum(2) == el.PNum(5)) { map = map2; deg2 = 1; }352if (el.PNum(3) == el.PNum(6)) { map = map3; deg3 = 1; }353354switch (deg1+deg2+deg3)355{356{357case 1:358if (printmessage_importance>0)359cout << "degenerated prism found, deg = 1" << endl;360for (i = 0; i < 5; i++)361epi[i] = el.PNum (map[i]);362363if (np) *np = 5;364return NG_PYRAMID;365break;366}367case 2:368{369if (printmessage_importance>0)370cout << "degenerated prism found, deg = 2" << endl;371if (!deg1) epi[3] = el.PNum(4);372if (!deg2) epi[3] = el.PNum(5);373if (!deg3) epi[3] = el.PNum(6);374375if (np) *np = 4;376return NG_TET;377break;378}379default:380;381}382383}384385return NG_ELEMENT_TYPE (el.GetType());386}387else388{389int i;390const Element2d & el = mesh->SurfaceElement (ei);391for (i = 0; i < el.GetNP(); i++)392epi[i] = el.PNum(i+1);393394if (np) *np = el.GetNP();395return NG_ELEMENT_TYPE (el.GetType());396/*397switch (el.GetNP())398{399case 3: return NG_TRIG;400case 4: return NG_QUAD;401case 6: return NG_TRIG6;402}403*/404}405406// should not occur407return NG_TET;408}409410411NG_ELEMENT_TYPE Ng_GetElementType (int ei)412{413if (mesh->GetDimension() == 3)414{415return NG_ELEMENT_TYPE (mesh->VolumeElement (ei).GetType());416}417else418{419const Element2d & el = mesh->SurfaceElement (ei);420switch (el.GetNP())421{422case 3: return NG_TRIG;423case 4: return NG_QUAD;424case 6: return NG_TRIG6;425}426}427428// should not occur429return NG_TET;430}431432433434int Ng_GetElementIndex (int ei)435{436if (mesh->GetDimension() == 3)437return mesh->VolumeElement(ei).GetIndex();438else439{440int ind = mesh->SurfaceElement(ei).GetIndex();441ind = mesh->GetFaceDescriptor(ind).BCProperty();442return ind;443}444}445446void Ng_SetElementIndex(const int ei, const int index)447{448mesh->VolumeElement(ei).SetIndex(index);449}450451char * Ng_GetElementMaterial (int ei)452{453static char empty[] = "";454if (mesh->GetDimension() == 3)455{456int ind = mesh->VolumeElement(ei).GetIndex();457// cout << "ind = " << ind << endl;458const char * mat = mesh->GetMaterial (ind);459if (mat)460return const_cast<char*> (mat);461else462return empty;463}464// add astrid465else466{467int ind = mesh->SurfaceElement(ei).GetIndex();468ind = mesh->GetFaceDescriptor(ind).BCProperty();469const char * mat = mesh->GetMaterial ( ind );470if (mat)471return const_cast<char*> (mat);472else473return empty;474}475return 0;476}477478char * Ng_GetDomainMaterial (int dom)479{480static char empty[] = "";481// astrid482if ( 1 ) // mesh->GetDimension() == 3)483{484const char * mat = mesh->GetMaterial(dom);485if (mat)486return const_cast<char*> (mat);487else488return empty;489}490491return 0;492}493494495NG_ELEMENT_TYPE Ng_GetSurfaceElement (int ei, int * epi, int * np)496{497if (mesh->GetDimension() == 3)498{499const Element2d & el = mesh->SurfaceElement (ei);500for (int i = 0; i < el.GetNP(); i++)501epi[i] = el[i];502503if (np) *np = el.GetNP();504505return NG_ELEMENT_TYPE (el.GetType());506}507else508{509const Segment & seg = mesh->LineSegment (ei);510511if (seg.pmid < 0)512{513epi[0] = seg.p1;514epi[1] = seg.p2;515516if (np) *np = 2;517return NG_SEGM;518}519else520{521epi[0] = seg.p1;522epi[1] = seg.p2;523epi[2] = seg.pmid;524525if (np) *np = 3;526return NG_SEGM3;527}528}529530return NG_TRIG;531}532533int Ng_GetSurfaceElementIndex (int ei)534{535if (mesh->GetDimension() == 3)536return mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).BCProperty();537else538return mesh->LineSegment(ei).si;539}540541int Ng_GetSurfaceElementSurfaceNumber (int ei)542{543if (mesh->GetDimension() == 3)544return mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).SurfNr();545else546return mesh->LineSegment(ei).si;547}548int Ng_GetSurfaceElementFDNumber (int ei)549{550if (mesh->GetDimension() == 3)551return mesh->SurfaceElement(ei).GetIndex();552else553return -1;554}555556557char * Ng_GetSurfaceElementBCName (int ei)558{559if ( mesh->GetDimension() == 3 )560return const_cast<char *>(mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).GetBCName().c_str());561else562return const_cast<char *>(mesh->LineSegment(ei).GetBCName().c_str());563}564565566// Inefficient (but maybe safer) version:567//void Ng_GetSurfaceElementBCName (int ei, char * name)568//{569// if ( mesh->GetDimension() == 3 )570// strcpy(name,mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).GetBCName().c_str());571// else572// strcpy(name,mesh->LineSegment(ei).GetBCName().c_str());573//}574575char * Ng_GetBCNumBCName (int bcnr)576{577return const_cast<char *>(mesh->GetBCName(bcnr).c_str());578}579580581// Inefficient (but maybe safer) version:582//void Ng_GetBCNumBCName (int bcnr, char * name)583//{584// strcpy(name,mesh->GetBCName(bcnr).c_str());585//}586587void Ng_GetNormalVector (int sei, int locpi, double * nv)588{589nv[0] = 0;590nv[1] = 0;591nv[2] = 1;592593(*testout) << "Ng_GetNormalVector (sei = " << sei << ", locpi = " << locpi << ")" << endl;594595if (mesh->GetDimension() == 3)596{597Vec<3> n;598Point<3> p;599p = mesh->Point (mesh->SurfaceElement(sei).PNum(locpi));600601int surfi = mesh->GetFaceDescriptor(mesh->SurfaceElement(sei).GetIndex()).SurfNr();602603(*testout) << "surfi = " << surfi << endl;604#ifdef OCCGEOMETRY605if (occgeometry)606{607PointGeomInfo gi = mesh->SurfaceElement(sei).GeomInfoPi(locpi);608occgeometry->GetSurface (surfi).GetNormalVector(p, gi, n);609nv[0] = n(0);610nv[1] = n(1);611nv[2] = n(2);612}613else614#endif615if (geometry)616{617(*testout) << "geometry defined" << endl;618n = geometry->GetSurface (surfi) -> GetNormalVector(p);619(*testout) << "aus is" << endl;620nv[0] = n(0);621nv[1] = n(1);622nv[2] = n(2);623}624}625}626627628629void Ng_SetPointSearchStartElement(const int el)630{631mesh->SetPointSearchStartElement(el);632}633634635int Ng_FindElementOfPoint (double * p, double * lami, int build_searchtree,636const int * const indices, const int numind)637638{639ARRAY<int> * dummy(NULL);640int ind = -1;641642if(indices != NULL)643{644dummy = new ARRAY<int>(numind);645for(int i=0; i<numind; i++) (*dummy)[i] = indices[i];646}647648if (mesh->GetDimension() == 3)649{650Point3d p3d(p[0], p[1], p[2]);651ind =652mesh->GetElementOfPoint(p3d, lami, dummy, build_searchtree != 0);653}654else655{656double lam3[3];657Point3d p2d(p[0], p[1], 0);658ind =659mesh->GetElementOfPoint(p2d, lam3, dummy, build_searchtree != 0);660661662if(mesh->SurfaceElement(ind).GetType()==QUAD)663{664lami[0] = lam3[0];665lami[1] = lam3[1];666}667else668{669lami[0] = 1-lam3[0]-lam3[1];670lami[1] = lam3[0];671}672}673674delete dummy;675676return ind;677}678679int Ng_FindSurfaceElementOfPoint (double * p, double * lami, int build_searchtree,680const int * const indices, const int numind)681682{683ARRAY<int> * dummy(NULL);684int ind = -1;685686if(indices != NULL)687{688dummy = new ARRAY<int>(numind);689for(int i=0; i<numind; i++) (*dummy)[i] = indices[i];690}691692if (mesh->GetDimension() == 3)693{694Point3d p3d(p[0], p[1], p[2]);695ind =696mesh->GetSurfaceElementOfPoint(p3d, lami, dummy, build_searchtree != 0);697}698else699{700//throw NgException("FindSurfaceElementOfPoint for 2D meshes not yet implemented");701cerr << "FindSurfaceElementOfPoint for 2D meshes not yet implemented" << endl;702}703704delete dummy;705706return ind;707}708709710int Ng_IsElementCurved (int ei)711{712if (mesh->GetDimension() == 2)713return mesh->GetCurvedElements().IsSurfaceElementCurved (ei-1);714else715return mesh->GetCurvedElements().IsElementCurved (ei-1);716}717718719int Ng_IsSurfaceElementCurved (int sei)720{721if (mesh->GetDimension() == 2)722return mesh->GetCurvedElements().IsSegmentCurved (sei-1);723else724return mesh->GetCurvedElements().IsSurfaceElementCurved (sei-1);725}726727728729730void Ng_GetElementTransformation (int ei, const double * xi,731double * x, double * dxdxi)732{733if (mesh->GetDimension() == 2)734{735Point<2> xl(xi[0], xi[1]);736Point<3> xg;737Mat<3,2> dx;738739mesh->GetCurvedElements().CalcSurfaceTransformation (xl, ei-1, xg, dx);740741if (x)742{743for (int i = 0; i < 2; i++)744x[i] = xg(i);745}746747if (dxdxi)748{749for (int i=0; i<2; i++)750{751dxdxi[2*i] = dx(i,0);752dxdxi[2*i+1] = dx(i,1);753}754}755}756else757{758Point<3> xl(xi[0], xi[1], xi[2]);759Point<3> xg;760Mat<3,3> dx;761762mesh->GetCurvedElements().CalcElementTransformation (xl, ei-1, xg, dx);763764// still 1-based arrays765if (x)766{767for (int i = 0; i < 3; i++)768x[i] = xg(i);769}770771if (dxdxi)772{773for (int i=0; i<3; i++)774{775dxdxi[3*i] = dx(i,0);776dxdxi[3*i+1] = dx(i,1);777dxdxi[3*i+2] = dx(i,2);778}779}780}781}782783784785void Ng_GetBufferedElementTransformation (int ei, const double * xi,786double * x, double * dxdxi,787void * buffer, int buffervalid)788{789// buffer = 0;790// buffervalid = 0;791if (mesh->GetDimension() == 2)792{793return Ng_GetElementTransformation (ei, xi, x, dxdxi);794}795else796{797mesh->GetCurvedElements().CalcElementTransformation (reinterpret_cast<const Point<3> &> (*xi),798ei-1,799reinterpret_cast<Point<3> &> (*x),800reinterpret_cast<Mat<3,3> &> (*dxdxi),801buffer, (buffervalid != 0));802803/*804Point<3> xl(xi[0], xi[1], xi[2]);805Point<3> xg;806Mat<3,3> dx;807// buffervalid = 0;808mesh->GetCurvedElements().CalcElementTransformation (xl, ei-1, xg, dx, buffer, buffervalid);809810// still 1-based arrays811if (x)812{813for (int i = 0; i < 3; i++)814x[i] = xg(i);815}816817if (dxdxi)818{819for (int i=0; i<3; i++)820{821dxdxi[3*i] = dx(i,0);822dxdxi[3*i+1] = dx(i,1);823dxdxi[3*i+2] = dx(i,2);824}825}826*/827}828}829830831832833834835836837void Ng_GetMultiElementTransformation (int ei, int n,838const double * xi, int sxi,839double * x, int sx,840double * dxdxi, int sdxdxi)841{842if (mesh->GetDimension() == 2)843{844for (int i = 0; i < n; i++)845{846Point<2> xl(xi[i*sxi], xi[i*sxi+1]);847Point<3> xg;848Mat<3,2> dx;849850mesh->GetCurvedElements().CalcSurfaceTransformation (xl, ei-1, xg, dx);851852if (x)853{854x[i*sx ] = xg(0);855x[i*sx+1] = xg(1);856}857858if (dxdxi)859{860dxdxi[i*sdxdxi ] = dx(0,0);861dxdxi[i*sdxdxi+1] = dx(0,1);862dxdxi[i*sdxdxi+2] = dx(1,0);863dxdxi[i*sdxdxi+3] = dx(1,1);864}865}866}867else868{869mesh->GetCurvedElements().CalcMultiPointElementTransformation (ei-1, n, xi, sxi, x, sx, dxdxi, sdxdxi);870}871}872873874875876877878879880void Ng_GetSurfaceElementTransformation (int sei, const double * xi,881double * x, double * dxdxi)882{883if (mesh->GetDimension() == 2)884{885Point<3> xg;886Vec<3> dx;887888mesh->GetCurvedElements().CalcSegmentTransformation (xi[0], sei-1, xg, dx);889890if (x)891for (int i = 0; i < 2; i++)892x[i] = xg(i);893894if (dxdxi)895for (int i=0; i<2; i++)896dxdxi[i] = dx(i);897898}899else900{901Point<2> xl(xi[0], xi[1]);902Point<3> xg;903Mat<3,2> dx;904905mesh->GetCurvedElements().CalcSurfaceTransformation (xl, sei-1, xg, dx);906907for (int i=0; i<3; i++)908{909if (x)910x[i] = xg(i);911if (dxdxi)912{913dxdxi[2*i] = dx(i,0);914dxdxi[2*i+1] = dx(i,1);915}916}917}918}919920921922void Ng_GetSurfaceElementNeighbouringDomains(const int selnr, int & in, int & out)923{924if ( mesh->GetDimension() == 3 )925{926in = mesh->GetFaceDescriptor(mesh->SurfaceElement(selnr).GetIndex()).DomainIn();927out = mesh->GetFaceDescriptor(mesh->SurfaceElement(selnr).GetIndex()).DomainOut();928}929else930{931in = mesh -> LineSegment(selnr) . domin;932out = mesh -> LineSegment(selnr) . domout;933}934}935936937#ifdef PARALLEL938// Is Element ei an element of this processor ??939bool Ng_IsGhostEl (int ei)940{941if ( mesh->GetDimension() == 3 )942return mesh->VolumeElement(ei).IsGhost();943else944return false;945}946947void Ng_SetGhostEl(const int ei, const bool aisghost )948{949if ( mesh -> GetDimension () == 3 )950mesh -> VolumeElement(ei).SetGhost (aisghost);951}952953bool Ng_IsGhostSEl (int ei)954{955if ( mesh -> GetDimension () == 3 )956return mesh->SurfaceElement(ei).IsGhost();957else958return false;959}960961void Ng_SetGhostSEl(const int ei, const bool aisghost )962{963if ( mesh -> GetDimension () == 3 )964mesh -> SurfaceElement(ei).SetGhost (aisghost);965}966967968bool Ng_IsGhostVert ( int pnum )969{970return mesh -> Point ( pnum ).IsGhost() ;971}972bool Ng_IsGhostEdge ( int ednum )973{974return mesh -> GetParallelTopology() . IsGhostEdge ( ednum );975}976977bool Ng_IsGhostFace ( int fanum )978{979return mesh -> GetParallelTopology() . IsGhostFace ( fanum );980}981982// void Ng_SetGhostVert ( const int pnum, const bool aisghost );983// void Ng_SetGhostEdge ( const int ednum, const bool aisghost );984// void Ng_SetGhostFace ( const int fanum, const bool aisghost );985986987bool Ng_IsExchangeEl ( int elnum )988{ return mesh -> GetParallelTopology() . IsExchangeElement ( elnum ); }989990bool Ng_IsExchangeSEl ( int selnum )991{ return mesh -> GetParallelTopology() . IsExchangeSEl ( selnum ); }992993void Ng_UpdateOverlap()994{ mesh->UpdateOverlap(); }995996int Ng_Overlap ()997{ return mesh->GetParallelTopology() . Overlap(); }998999#endif10001001void Ng_SetRefinementFlag (int ei, int flag)1002{1003if (mesh->GetDimension() == 3)1004{1005mesh->VolumeElement(ei).SetRefinementFlag (flag != 0);1006mesh->VolumeElement(ei).SetStrongRefinementFlag (flag >= 10);1007}1008else1009{1010mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);1011mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);1012}1013}10141015void Ng_SetSurfaceRefinementFlag (int ei, int flag)1016{1017if (mesh->GetDimension() == 3)1018{1019mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);1020mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);1021}1022}102310241025void Ng_Refine (NG_REFINEMENT_TYPE reftype)1026{1027NgLock meshlock (mesh->MajorMutex(), 1);10281029BisectionOptions biopt;1030biopt.usemarkedelements = 1;1031biopt.refine_p = 0;1032biopt.refine_hp = 0;1033if (reftype == NG_REFINE_P)1034biopt.refine_p = 1;1035if (reftype == NG_REFINE_HP)1036biopt.refine_hp = 1;1037Refinement * ref;1038MeshOptimize2d * opt = NULL;10391040if (geometry2d)1041ref = new Refinement2d(*geometry2d);1042else if (stlgeometry)1043ref = new RefinementSTLGeometry(*stlgeometry);1044#ifdef OCCGEOMETRY1045else if (occgeometry)1046ref = new OCCRefinementSurfaces (*occgeometry);1047#endif1048#ifdef ACIS1049else if (acisgeometry)1050{1051ref = new ACISRefinementSurfaces (*acisgeometry);1052opt = new ACISMeshOptimize2dSurfaces(*acisgeometry);1053ref->Set2dOptimizer(opt);1054}1055#endif1056else if (geometry && mesh->GetDimension() == 3)1057{1058ref = new RefinementSurfaces(*geometry);1059opt = new MeshOptimize2dSurfaces(*geometry);1060ref->Set2dOptimizer(opt);1061}1062else1063{1064ref = new Refinement();1065}106610671068ref -> Bisect (*mesh, biopt);10691070mesh -> UpdateTopology();10711072// mesh -> GetCurvedElements().BuildCurvedElements (ref, mparam.elementorder);1073delete ref;1074delete opt;1075}10761077void Ng_SecondOrder ()1078{1079if (stlgeometry)1080{1081RefinementSTLGeometry ref (*stlgeometry);1082ref.MakeSecondOrder (*mesh);1083}10841085else if (geometry2d)1086{1087Refinement2d ref (*geometry2d);1088ref.MakeSecondOrder (*mesh);1089}10901091else if (geometry && mesh->GetDimension() == 3)10921093{1094RefinementSurfaces ref (*geometry);1095ref.MakeSecondOrder (*mesh);1096}1097else1098{1099if (printmessage_importance>0)1100cout << "no geom" << endl;1101Refinement ref;1102ref.MakeSecondOrder (*mesh);1103}11041105mesh -> UpdateTopology();1106}11071108/*1109void Ng_HPRefinement (int levels)1110{1111Refinement * ref;11121113if (stlgeometry)1114ref = new RefinementSTLGeometry (*stlgeometry);1115else if (geometry2d)1116ref = new Refinement2d (*geometry2d);1117else1118ref = new RefinementSurfaces (*geometry);111911201121HPRefinement (*mesh, ref, levels);1122}11231124void Ng_HPRefinement (int levels, double parameter)1125{1126Refinement * ref;11271128if (stlgeometry)1129ref = new RefinementSTLGeometry (*stlgeometry);1130else if (geometry2d)1131ref = new Refinement2d (*geometry2d);1132else1133ref = new RefinementSurfaces (*geometry);113411351136HPRefinement (*mesh, ref, levels, parameter);1137}1138*/11391140void Ng_HPRefinement (int levels, double parameter, bool setorders,1141bool ref_level)1142{1143Refinement * ref;11441145if (stlgeometry)1146ref = new RefinementSTLGeometry (*stlgeometry);1147else if (geometry2d)1148ref = new Refinement2d (*geometry2d);1149else1150ref = new RefinementSurfaces (*geometry);115111521153HPRefinement (*mesh, ref, levels, parameter, setorders, ref_level);1154}115511561157void Ng_HighOrder (int order, bool rational)1158{1159NgLock meshlock (mesh->MajorMutex(), true);11601161Refinement * ref;11621163if (stlgeometry)1164ref = new RefinementSTLGeometry (*stlgeometry);1165#ifdef OCCGEOMETRY1166else if (occgeometry)1167ref = new OCCRefinementSurfaces (*occgeometry);1168#endif1169#ifdef ACIS1170else if (acisgeometry)1171{1172ref = new ACISRefinementSurfaces (*acisgeometry);1173}1174#endif1175else if (geometry2d)1176ref = new Refinement2d (*geometry2d);1177else1178{1179ref = new RefinementSurfaces (*geometry);1180}11811182// cout << "parameter 1: " << argv[1] << " (conversion to int = " << atoi(argv[1]) << ")" << endl;118311841185mesh -> GetCurvedElements().BuildCurvedElements (ref, order, rational);118611871188/*1189if(mesh)1190mesh -> GetCurvedElements().BuildCurvedElements (ref, order, rational);1191*/11921193delete ref;1194}1195119611971198119912001201120212031204120512061207int Ng_ME_GetNVertices (NG_ELEMENT_TYPE et)1208{1209switch (et)1210{1211case NG_SEGM:1212case NG_SEGM3:1213return 2;12141215case NG_TRIG:1216case NG_TRIG6:1217return 3;12181219case NG_QUAD:1220return 4;12211222case NG_TET:1223case NG_TET10:1224return 4;12251226case NG_PYRAMID:1227return 5;12281229case NG_PRISM:1230case NG_PRISM12:1231return 6;12321233case NG_HEX:1234return 8;12351236default:1237cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;1238}1239return 0;1240}12411242int Ng_ME_GetNEdges (NG_ELEMENT_TYPE et)1243{1244switch (et)1245{1246case NG_SEGM:1247case NG_SEGM3:1248return 1;12491250case NG_TRIG:1251case NG_TRIG6:1252return 3;12531254case NG_QUAD:1255return 4;12561257case NG_TET:1258case NG_TET10:1259return 6;12601261case NG_PYRAMID:1262return 8;12631264case NG_PRISM:1265case NG_PRISM12:1266return 9;12671268case NG_HEX:1269return 12;12701271default:1272cerr << "Ng_ME_GetNEdges, illegal element type " << et << endl;1273}1274return 0;1275}127612771278int Ng_ME_GetNFaces (NG_ELEMENT_TYPE et)1279{1280switch (et)1281{1282case NG_SEGM:1283case NG_SEGM3:1284return 0;12851286case NG_TRIG:1287case NG_TRIG6:1288return 1;12891290case NG_QUAD:1291case NG_QUAD6:1292return 1;12931294case NG_TET:1295case NG_TET10:1296return 4;12971298case NG_PYRAMID:1299return 5;13001301case NG_PRISM:1302case NG_PRISM12:1303return 5;13041305case NG_HEX:1306return 6;13071308default:1309cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;1310}1311return 0;1312}131313141315const NG_POINT * Ng_ME_GetVertices (NG_ELEMENT_TYPE et)1316{1317static double segm_points [][3] =1318{ { 1, 0, 0 },1319{ 0, 0, 0 } };13201321static double trig_points [][3] =1322{ { 1, 0, 0 },1323{ 0, 1, 0 },1324{ 0, 0, 0 } };13251326static double quad_points [][3] =1327{ { 0, 0, 0 },1328{ 1, 0, 0 },1329{ 1, 1, 0 },1330{ 0, 1, 0 } };13311332static double tet_points [][3] =1333{ { 1, 0, 0 },1334{ 0, 1, 0 },1335{ 0, 0, 1 },1336{ 0, 0, 0 } };13371338static double pyramid_points [][3] =1339{1340{ 0, 0, 0 },1341{ 1, 0, 0 },1342{ 1, 1, 0 },1343{ 0, 1, 0 },1344{ 0, 0, 1-1e-7 },1345};13461347static double prism_points[][3] =1348{1349{ 1, 0, 0 },1350{ 0, 1, 0 },1351{ 0, 0, 0 },1352{ 1, 0, 1 },1353{ 0, 1, 1 },1354{ 0, 0, 1 }1355};13561357switch (et)1358{1359case NG_SEGM:1360case NG_SEGM3:1361return segm_points;13621363case NG_TRIG:1364case NG_TRIG6:1365return trig_points;13661367case NG_QUAD:1368case NG_QUAD6:1369return quad_points;13701371case NG_TET:1372case NG_TET10:1373return tet_points;13741375case NG_PYRAMID:1376return pyramid_points;13771378case NG_PRISM:1379case NG_PRISM12:1380return prism_points;13811382case NG_HEX:1383default:1384cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;1385}1386return 0;1387}1388138913901391const NG_EDGE * Ng_ME_GetEdges (NG_ELEMENT_TYPE et)1392{1393static int segm_edges[1][2] =1394{ { 1, 2 }};13951396static int trig_edges[3][2] =1397{ { 3, 1 },1398{ 3, 2 },1399{ 1, 2 }};14001401static int quad_edges[4][2] =1402{ { 1, 2 },1403{ 4, 3 },1404{ 1, 4 },1405{ 2, 3 }};140614071408static int tet_edges[6][2] =1409{ { 4, 1 },1410{ 4, 2 },1411{ 4, 3 },1412{ 1, 2 },1413{ 1, 3 },1414{ 2, 3 }};14151416static int prism_edges[9][2] =1417{ { 3, 1 },1418{ 1, 2 },1419{ 3, 2 },1420{ 6, 4 },1421{ 4, 5 },1422{ 6, 5 },1423{ 3, 6 },1424{ 1, 4 },1425{ 2, 5 }};14261427static int pyramid_edges[8][2] =1428{ { 1, 2 },1429{ 2, 3 },1430{ 1, 4 },1431{ 4, 3 },1432{ 1, 5 },1433{ 2, 5 },1434{ 3, 5 },1435{ 4, 5 }};1436143714381439switch (et)1440{1441case NG_SEGM:1442case NG_SEGM3:1443return segm_edges;14441445case NG_TRIG:1446case NG_TRIG6:1447return trig_edges;14481449case NG_QUAD:1450case NG_QUAD6:1451return quad_edges;14521453case NG_TET:1454case NG_TET10:1455return tet_edges;14561457case NG_PYRAMID:1458return pyramid_edges;14591460case NG_PRISM:1461case NG_PRISM12:1462return prism_edges;14631464case NG_HEX:1465default:1466cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;1467}1468return 0;1469}147014711472const NG_FACE * Ng_ME_GetFaces (NG_ELEMENT_TYPE et)1473{1474static int tet_faces[4][4] =1475{ { 4, 2, 3, 0 },1476{ 4, 1, 3, 0 },1477{ 4, 1, 2, 0 },1478{ 1, 2, 3, 0 } };14791480static int prism_faces[5][4] =1481{1482{ 1, 2, 3, 0 },1483{ 4, 5, 6, 0 },1484{ 3, 1, 4, 6 },1485{ 1, 2, 5, 4 },1486{ 2, 3, 6, 5 }1487};14881489static int pyramid_faces[5][4] =1490{1491{ 1, 2, 5, 0 },1492{ 2, 3, 5, 0 },1493{ 3, 4, 5, 0 },1494{ 4, 1, 5, 0 },1495{ 1, 2, 3, 4 }1496};14971498static int trig_faces[1][4] =1499{1500{ 1, 2, 3, 0 },1501};15021503switch (et)1504{1505case NG_TET:1506case NG_TET10:1507return tet_faces;15081509case NG_PRISM:1510case NG_PRISM12:1511return prism_faces;15121513case NG_PYRAMID:1514return pyramid_faces;151515161517case NG_SEGM:1518case NG_SEGM3:15191520case NG_TRIG:1521case NG_TRIG6:1522return trig_faces;1523case NG_QUAD:152415251526case NG_HEX:15271528default:1529cerr << "Ng_ME_GetFaces, illegal element type " << et << endl;1530}1531return 0;1532}153315341535int Ng_GetNEdges()1536{1537return mesh->GetTopology().GetNEdges();1538}1539int Ng_GetNFaces()1540{1541return mesh->GetTopology().GetNFaces();1542}1543154415451546int Ng_GetElement_Edges (int elnr, int * edges, int * orient)1547{1548const MeshTopology & topology = mesh->GetTopology();1549if (mesh->GetDimension() == 3)1550return topology.GetElementEdges (elnr, edges, orient);1551else1552return topology.GetSurfaceElementEdges (elnr, edges, orient);1553}15541555int Ng_GetElement_Faces (int elnr, int * faces, int * orient)1556{1557const MeshTopology & topology = mesh->GetTopology();1558if (mesh->GetDimension() == 3)1559return topology.GetElementFaces (elnr, faces, orient);1560else1561{1562faces[0] = elnr;1563if (orient) orient[0] = 0;1564return 1;1565}1566}15671568int Ng_GetSurfaceElement_Edges (int elnr, int * edges, int * orient)1569{1570const MeshTopology & topology = mesh->GetTopology();1571if (mesh->GetDimension() == 3)1572return topology.GetSurfaceElementEdges (elnr, edges, orient);1573else1574{1575if (orient)1576topology.GetSegmentEdge(elnr, edges[0], orient[0]);1577else1578edges[0] = topology.GetSegmentEdge(elnr);1579}1580return 1;1581/*1582int i, ned;1583const MeshTopology & topology = mesh->GetTopology();1584ARRAY<int> ia;1585topology.GetSurfaceElementEdges (elnr, ia);1586ned = ia.Size();1587for (i = 1; i <= ned; i++)1588edges[i-1] = ia.Get(i);15891590if (orient)1591{1592topology.GetSurfaceElementEdgeOrientations (elnr, ia);1593for (i = 1; i <= ned; i++)1594orient[i-1] = ia.Get(i);1595}1596return ned;1597*/1598}15991600int Ng_GetSurfaceElement_Face (int selnr, int * orient)1601{1602if (mesh->GetDimension() == 3)1603{1604const MeshTopology & topology = mesh->GetTopology();1605if (orient)1606*orient = topology.GetSurfaceElementFaceOrientation (selnr);1607return topology.GetSurfaceElementFace (selnr);1608}1609return -1;1610}16111612int Ng_GetFace_Vertices (int fnr, int * vert)1613{1614const MeshTopology & topology = mesh->GetTopology();1615ArrayMem<int,4> ia;1616topology.GetFaceVertices (fnr, ia);1617for (int i = 0; i < ia.Size(); i++)1618vert[i] = ia[i];1619// cout << "face verts = " << ia << endl;1620return ia.Size();1621}162216231624int Ng_GetFace_Edges (int fnr, int * edge)1625{1626const MeshTopology & topology = mesh->GetTopology();1627ArrayMem<int,4> ia;1628topology.GetFaceEdges (fnr, ia);1629for (int i = 0; i < ia.Size(); i++)1630edge[i] = ia[i];1631return ia.Size();1632}16331634void Ng_GetEdge_Vertices (int ednr, int * vert)1635{1636const MeshTopology & topology = mesh->GetTopology();1637topology.GetEdgeVertices (ednr, vert[0], vert[1]);1638}163916401641int Ng_GetNVertexElements (int vnr)1642{1643if (mesh->GetDimension() == 3)1644return mesh->GetTopology().GetVertexElements(vnr).Size();1645else1646return mesh->GetTopology().GetVertexSurfaceElements(vnr).Size();1647}16481649void Ng_GetVertexElements (int vnr, int * els)1650{1651FlatArray<int> ia(0,0);1652if (mesh->GetDimension() == 3)1653ia = mesh->GetTopology().GetVertexElements(vnr);1654else1655ia = mesh->GetTopology().GetVertexSurfaceElements(vnr);1656for (int i = 0; i < ia.Size(); i++)1657els[i] = ia[i];1658}165916601661int Ng_GetElementOrder (int enr)1662{1663if (mesh->GetDimension() == 3)1664return mesh->VolumeElement(enr).GetOrder();1665else1666return mesh->SurfaceElement(enr).GetOrder();1667}16681669void Ng_GetElementOrders (int enr, int * ox, int * oy, int * oz)1670{1671if (mesh->GetDimension() == 3)1672mesh->VolumeElement(enr).GetOrder(*ox, *oy, *oz);1673else1674mesh->SurfaceElement(enr).GetOrder(*ox, *oy, *oz);1675}16761677void Ng_SetElementOrder (int enr, int order)1678{1679if (mesh->GetDimension() == 3)1680return mesh->VolumeElement(enr).SetOrder(order);1681else1682return mesh->SurfaceElement(enr).SetOrder(order);1683}16841685void Ng_SetElementOrders (int enr, int ox, int oy, int oz)1686{1687if (mesh->GetDimension() == 3)1688mesh->VolumeElement(enr).SetOrder(ox, oy, oz);1689else1690mesh->SurfaceElement(enr).SetOrder(ox, oy);1691}169216931694int Ng_GetSurfaceElementOrder (int enr)1695{1696return mesh->SurfaceElement(enr).GetOrder();1697}16981699//HERBERT: falsche Anzahl von Argumenten1700//void Ng_GetSurfaceElementOrders (int enr, int * ox, int * oy, int * oz)1701void Ng_GetSurfaceElementOrders (int enr, int * ox, int * oy)1702{1703int d;1704mesh->SurfaceElement(enr).GetOrder(*ox, *oy, d);1705}17061707void Ng_SetSurfaceElementOrder (int enr, int order)1708{1709return mesh->SurfaceElement(enr).SetOrder(order);1710}17111712void Ng_SetSurfaceElementOrders (int enr, int ox, int oy)1713{1714mesh->SurfaceElement(enr).SetOrder(ox, oy);1715}171617171718int Ng_GetNLevels ()1719{1720return (mesh) ? mesh->mglevels : 0;1721}172217231724void Ng_GetParentNodes (int ni, int * parents)1725{1726if (ni <= mesh->mlbetweennodes.Size())1727{1728parents[0] = mesh->mlbetweennodes.Get(ni).I1();1729parents[1] = mesh->mlbetweennodes.Get(ni).I2();1730}1731else1732parents[0] = parents[1] = 0;1733}173417351736int Ng_GetParentElement (int ei)1737{1738if (mesh->GetDimension() == 3)1739{1740if (ei <= mesh->mlparentelement.Size())1741return mesh->mlparentelement.Get(ei);1742}1743else1744{1745if (ei <= mesh->mlparentsurfaceelement.Size())1746return mesh->mlparentsurfaceelement.Get(ei);1747}1748return 0;1749}175017511752int Ng_GetParentSElement (int ei)1753{1754if (mesh->GetDimension() == 3)1755{1756if (ei <= mesh->mlparentsurfaceelement.Size())1757return mesh->mlparentsurfaceelement.Get(ei);1758}1759else1760{1761return 0;1762}1763return 0;1764}176517661767176817691770int Ng_GetClusterRepVertex (int pi)1771{1772return mesh->GetClusters().GetVertexRepresentant(pi);1773}17741775int Ng_GetClusterRepEdge (int pi)1776{1777return mesh->GetClusters().GetEdgeRepresentant(pi);1778}17791780int Ng_GetClusterRepFace (int pi)1781{1782return mesh->GetClusters().GetFaceRepresentant(pi);1783}17841785int Ng_GetClusterRepElement (int pi)1786{1787return mesh->GetClusters().GetElementRepresentant(pi);1788}1789179017911792179317941795void Ng_InitSolutionData (Ng_SolutionData * soldata)1796{1797soldata -> name = NULL;1798soldata -> data = NULL;1799soldata -> components = 1;1800soldata -> dist = 1;1801soldata -> order = 1;1802soldata -> iscomplex = 0;1803soldata -> draw_surface = 1;1804soldata -> draw_volume = 1;1805soldata -> soltype = NG_SOLUTION_NODAL;1806soldata -> solclass = 0;1807}18081809void Ng_SetSolutionData (Ng_SolutionData * soldata)1810{1811#ifdef OPENGL1812// vssolution.ClearSolutionData ();1813VisualSceneSolution::SolData * vss = new VisualSceneSolution::SolData;18141815// cout << "Add solution " << soldata->name << ", type = " << soldata->soltype << endl;18161817vss->name = new char[strlen (soldata->name)+1];1818strcpy (vss->name, soldata->name);18191820vss->data = soldata->data;1821vss->components = soldata->components;1822vss->dist = soldata->dist;1823vss->order = soldata->order;1824vss->iscomplex = bool(soldata->iscomplex);1825vss->draw_surface = soldata->draw_surface;1826vss->draw_volume = soldata->draw_volume;1827vss->soltype = VisualSceneSolution::SolType (soldata->soltype);1828vss->solclass = soldata->solclass;1829vssolution.AddSolutionData (vss);1830#endif1831}18321833void Ng_ClearSolutionData ()1834{1835#ifdef OPENGL1836vssolution.ClearSolutionData();1837#endif1838}1839184018411842void Ng_Redraw ()1843{1844#ifdef OPENGL1845extern bool nodisplay; // he: global in ngappinit.cpp1846if (!nodisplay)1847{1848vssolution.UpdateSolutionTimeStamp();1849Render();1850}1851#endif1852}185318541855void Ng_SetVisualizationParameter (const char * name, const char * value)1856{1857#ifdef OPENGL1858#ifndef NOTCL1859char buf[100];1860sprintf (buf, "visoptions.%s", name);1861if (printmessage_importance>0)1862{1863cout << "name = " << name << ", value = " << value << endl;1864cout << "set tcl-variable " << buf << " to " << value << endl;1865}1866Tcl_SetVar (tcl_interp, buf, const_cast<char*> (value), 0);1867Tcl_Eval (tcl_interp, "Ng_Vis_Set parameters;");1868#endif1869#endif1870}18711872187318741875int firsttime = 1;1876int animcnt = 0;1877void PlayAnimFile(const char* name, int speed, int maxcnt)1878{1879//extern Mesh * mesh;18801881/*1882if (mesh.Ptr()) mesh->DeleteMesh();1883if (!mesh.Ptr()) mesh = new Mesh();1884*/1885mesh.Reset (new Mesh());18861887int ne, np, i;18881889char str[80];1890char str2[80];18911892//int tend = 5000;1893// for (ti = 1; ti <= tend; ti++)1894//{1895int rti = (animcnt%(maxcnt-1)) + 1;1896animcnt+=speed;18971898sprintf(str2,"%05i.sol",rti);1899strcpy(str,"mbssol/");1900strcat(str,name);1901strcat(str,str2);19021903if (printmessage_importance>0)1904cout << "read file '" << str << "'" << endl;19051906ifstream infile(str);1907infile >> ne;1908for (i = 1; i <= ne; i++)1909{1910int j;1911Element2d tri(TRIG);1912tri.SetIndex(1); //faceind19131914for (j = 1; j <= 3; j++)1915infile >> tri.PNum(j);19161917infile >> np;1918for (i = 1; i <= np; i++)1919{1920Point3d p;1921infile >> p.X() >> p.Y() >> p.Z();1922if (firsttime)1923mesh->AddPoint (p);1924else1925mesh->Point(i) = Point<3> (p);1926}19271928//firsttime = 0;1929Ng_Redraw();1930}1931}193219331934int Ng_GetNPeriodicVertices (int idnr)1935{1936ARRAY<INDEX_2> apairs;1937mesh->GetIdentifications().GetPairs (idnr, apairs);1938return apairs.Size();1939}194019411942// pairs should be an integer array of 2*npairs1943void Ng_GetPeriodicVertices (int idnr, int * pairs)1944{1945ARRAY<INDEX_2> apairs;1946mesh->GetIdentifications().GetPairs (idnr, apairs);1947for (int i = 0; i < apairs.Size(); i++)1948{1949pairs[2*i] = apairs[i].I1();1950pairs[2*i+1] = apairs[i].I2();1951}19521953}1954195519561957int Ng_GetNPeriodicEdges (int idnr)1958{1959ARRAY<INDEX,PointIndex::BASE> map;1960//const MeshTopology & top = mesh->GetTopology();1961int nse = mesh->GetNSeg();19621963int cnt = 0;1964// for (int id = 1; id <= mesh->GetIdentifications().GetMaxNr(); id++)1965{1966mesh->GetIdentifications().GetMap(idnr, map);1967//(*testout) << "ident-map " << id << ":" << endl << map << endl;19681969for (SegmentIndex si = 0; si < nse; si++)1970{1971PointIndex other1 = map[(*mesh)[si].p1];1972PointIndex other2 = map[(*mesh)[si].p2];1973// (*testout) << "seg = " << (*mesh)[si] << "; other = "1974// << other1 << "-" << other2 << endl;1975if (other1 && other2 && mesh->IsSegment (other1, other2))1976{1977cnt++;1978}1979}1980}1981return cnt;1982}19831984void Ng_GetPeriodicEdges (int idnr, int * pairs)1985{1986ARRAY<INDEX,PointIndex::BASE> map;1987const MeshTopology & top = mesh->GetTopology();1988int nse = mesh->GetNSeg();19891990int cnt = 0;1991// for (int id = 1; id <= mesh->GetIdentifications().GetMaxNr(); id++)1992{1993mesh->GetIdentifications().GetMap(idnr, map);19941995//(*testout) << "map = " << map << endl;19961997for (SegmentIndex si = 0; si < nse; si++)1998{1999PointIndex other1 = map[(*mesh)[si].p1];2000PointIndex other2 = map[(*mesh)[si].p2];2001if (other1 && other2 && mesh->IsSegment (other1, other2))2002{2003SegmentIndex otherseg = mesh->SegmentNr (other1, other2);2004pairs[cnt++] = top.GetSegmentEdge (si+1);2005pairs[cnt++] = top.GetSegmentEdge (otherseg+1);2006}2007}2008}2009}2010201120122013void Ng_PushStatus (const char * str)2014{2015PushStatus (MyStr (str));2016}20172018void Ng_PopStatus ()2019{2020PopStatus ();2021}20222023void Ng_SetThreadPercentage (double percent)2024{2025SetThreadPercent (percent);2026}20272028void Ng_GetStatus (char ** str, double & percent)2029{2030MyStr s;2031GetStatus(s,percent);2032*str = new char[s.Length()+1];2033strcpy(*str,s.c_str());2034}203520362037void Ng_SetTerminate(void)2038{2039multithread.terminate = 1;2040}2041void Ng_UnSetTerminate(void)2042{2043multithread.terminate = 0;2044}20452046int Ng_ShouldTerminate(void)2047{2048return multithread.terminate;2049}20502051///// Added by Roman Stainko ....2052int Ng_GetVertex_Elements( int vnr, int* elems )2053{2054const MeshTopology& topology = mesh->GetTopology();2055ArrayMem<int,4> indexArray;2056topology.GetVertexElements( vnr, indexArray );20572058for( int i=0; i<indexArray.Size(); i++ )2059elems[i] = indexArray[i];20602061return indexArray.Size();2062}20632064///// Added by Roman Stainko ....2065int Ng_GetVertex_SurfaceElements( int vnr, int* elems )2066{2067const MeshTopology& topology = mesh->GetTopology();2068ArrayMem<int,4> indexArray;2069topology.GetVertexSurfaceElements( vnr, indexArray );20702071for( int i=0; i<indexArray.Size(); i++ )2072elems[i] = indexArray[i];20732074return indexArray.Size();2075}20762077///// Added by Roman Stainko ....2078int Ng_GetVertex_NElements( int vnr )2079{2080const MeshTopology& topology = mesh->GetTopology();2081ArrayMem<int,4> indexArray;2082topology.GetVertexElements( vnr, indexArray );20832084return indexArray.Size();2085}20862087///// Added by Roman Stainko ....2088int Ng_GetVertex_NSurfaceElements( int vnr )2089{2090const MeshTopology& topology = mesh->GetTopology();2091ArrayMem<int,4> indexArray;2092topology.GetVertexSurfaceElements( vnr, indexArray );20932094return indexArray.Size();2095}2096209720982099#ifdef SOCKETS2100int Ng_SocketClientOpen( const int port, const char * host )2101{2102try2103{2104if(host)2105clientsocket.Reset(new ClientSocket(port,host));2106else2107clientsocket.Reset(new ClientSocket(port));2108}2109catch( SocketException e)2110{2111cerr << e.Description() << endl;2112return 0;2113}2114return 1;2115}21162117void Ng_SocketClientWrite( const char * write, char** reply)2118{2119string output = write;2120(*clientsocket) << output;2121string sreply;2122(*clientsocket) >> sreply;2123*reply = new char[sreply.size()+1];2124strcpy(*reply,sreply.c_str());2125}212621272128void Ng_SocketClientClose ( void )2129{2130clientsocket.Reset(NULL);2131}213221332134void Ng_SocketClientGetServerHost ( const int number, char ** host )2135{2136*host = new char[servers[number]->host.size()+1];2137strcpy(*host,servers[number]->host.c_str());2138}21392140void Ng_SocketClientGetServerPort ( const int number, int * port )2141{2142*port = servers[number]->port;2143}21442145void Ng_SocketClientGetServerClientID ( const int number, int * id )2146{2147*id = servers[number]->clientid;2148}21492150#endif // SOCKETS21512152215321542155#ifdef PARALLEL2156void Ng_SetElementPartition ( const int elnr, const int part )2157{2158mesh->VolumeElement(elnr+1).SetPartition(part);21592160}2161int Ng_GetElementPartition ( const int elnr )2162{2163return mesh->VolumeElement(elnr+1).GetPartition();2164}2165#endif216621672168void Ng_InitPointCurve(double red, double green, double blue)2169{2170mesh->InitPointCurve(red, green, blue);2171}21722173void Ng_AddPointCurvePoint(const double * point)2174{2175Point3d pt;2176pt.X() = point[0];2177pt.Y() = point[1];2178pt.Z() = point[2];2179mesh->AddPointCurvePoint(pt);2180}218121822183void Ng_SaveMesh ( const char * meshfile )2184{2185mesh -> Save(string(meshfile));2186}218721882189int Ng_Bisect_WithInfo ( const char * refinementfile, double ** qualityloss, int * qualityloss_size )2190{2191BisectionOptions biopt;2192biopt.outfilename = NULL; // "ngfepp.vol";2193biopt.femcode = "fepp";2194biopt.refinementfilename = refinementfile;21952196Refinement * ref;2197MeshOptimize2d * opt = NULL;2198if (stlgeometry)2199ref = new RefinementSTLGeometry(*stlgeometry);2200#ifdef OCCGEOMETRY2201else if (occgeometry)2202ref = new OCCRefinementSurfaces (*occgeometry);2203#endif2204#ifdef ACIS2205else if (acisgeometry)2206{2207ref = new ACISRefinementSurfaces(*acisgeometry);2208opt = new ACISMeshOptimize2dSurfaces(*acisgeometry);2209ref->Set2dOptimizer(opt);2210}2211#endif2212else2213{2214ref = new RefinementSurfaces(*geometry);2215opt = new MeshOptimize2dSurfaces(*geometry);2216ref->Set2dOptimizer(opt);2217}22182219if(!mesh->LocalHFunctionGenerated())2220mesh->CalcLocalH();22212222mesh->LocalHFunction().SetGrading (mparam.grading);22232224ARRAY<double> * qualityloss_arr = NULL;2225if(qualityloss != NULL)2226qualityloss_arr = new ARRAY<double>;22272228ref -> Bisect (*mesh, biopt, qualityloss_arr);22292230int retval = 0;22312232if(qualityloss != NULL)2233{2234*qualityloss = new double[qualityloss_arr->Size()+1];22352236for(int i = 0; i<qualityloss_arr->Size(); i++)2237(*qualityloss)[i+1] = (*qualityloss_arr)[i];22382239retval = qualityloss_arr->Size();22402241delete qualityloss_arr;2242}22432244mesh -> UpdateTopology();2245mesh -> GetCurvedElements().BuildCurvedElements (ref, mparam.elementorder);22462247multithread.running = 0;2248delete ref;2249delete opt;22502251return retval;2252}22532254void Ng_Bisect ( const char * refinementfile )2255{2256Ng_Bisect_WithInfo( refinementfile, NULL, NULL );2257}225822592260226122622263/*2264number of nodes of type nt2265nt = 0 is Vertex2266nt = 1 is Edge2267nt = 2 is Face2268nt = 3 is Cell2269*/2270int Ng_GetNNodes (int nt)2271{2272switch (nt)2273{2274case 0: return mesh -> GetNV();2275case 1: return mesh->GetTopology().GetNEdges();2276case 2: return mesh->GetTopology().GetNFaces();2277case 3: return mesh -> GetNE();2278}2279return -1;2280}228122822283int Ng_GetClosureNodes (int nt, int nodenr, int nodeset, int * nodes)2284{2285switch (nt)2286{2287case 3: // The closure of a cell2288{2289int cnt = 0;2290if (nodeset & 1) // Vertices2291{2292const Element & el = (*mesh)[ElementIndex(nodenr)];2293for (int i = 0; i < el.GetNP(); i++)2294{2295nodes[cnt++] = 0;2296nodes[cnt++] = el[i] - PointIndex::BASE;2297}2298}22992300if (nodeset & 2) // Edges2301{2302int edges[12];2303int ned;2304ned = mesh->GetTopology().GetElementEdges (nodenr+1, edges, 0);2305for (int i = 0; i < ned; i++)2306{2307nodes[cnt++] = 1;2308nodes[cnt++] = edges[i]-1;2309}2310}23112312if (nodeset & 4) // Faces2313{2314int faces[12];2315int nfa;2316nfa = mesh->GetTopology().GetElementFaces (nodenr+1, faces, 0);2317for (int i = 0; i < nfa; i++)2318{2319nodes[cnt++] = 2;2320nodes[cnt++] = faces[i]-1;2321}2322}23232324if (nodeset & 8) // Cell2325{2326nodes[cnt++] = 3;2327nodes[cnt++] = nodenr;2328}23292330return cnt/2;2331}2332default:2333{2334cerr << "GetClosureNodes not implemented for Nodetype " << nt << endl;2335}2336}2337return 0;2338}2339234023412342int Ng_GetNElements (int dim)2343{2344switch (dim)2345{2346case 0: return mesh -> GetNV();2347case 1: return mesh -> GetNSeg();2348case 2: return mesh -> GetNSE();2349case 3: return mesh -> GetNE();2350}2351return -1;2352}2353235423552356/*2357closure nodes of element2358nodeset is bit-coded, bit 0 includes Vertices, bit 1 edges, etc2359E.g., nodeset = 6 includes edge and face nodes2360nodes is pair of integers (nodetype, nodenr)2361return value is number of nodes2362*/2363int Ng_GetElementClosureNodes (int dim, int elementnr, int nodeset, int * nodes)2364{2365switch (dim)2366{2367case 3: // The closure of a volume element = CELL2368{2369return Ng_GetClosureNodes (3, elementnr, nodeset, nodes);2370}2371case 2:2372{2373int cnt = 0;2374if (nodeset & 1) // Vertices2375{2376const Element2d & el = (*mesh)[SurfaceElementIndex(elementnr)];2377for (int i = 0; i < el.GetNP(); i++)2378{2379nodes[cnt++] = 0;2380nodes[cnt++] = el[i] - PointIndex::BASE;2381}2382}23832384if (nodeset & 2) // Edges2385{2386int edges[12];2387int ned;2388ned = mesh->GetTopology().GetSurfaceElementEdges (elementnr+1, edges, 0);2389for (int i = 0; i < ned; i++)2390{2391nodes[cnt++] = 1;2392nodes[cnt++] = edges[i]-1;2393}2394}23952396if (nodeset & 4) // Faces2397{2398int face = mesh->GetTopology().GetSurfaceElementFace (elementnr+1);2399nodes[cnt++] = 2;2400nodes[cnt++] = face-1;2401}24022403return cnt/2;2404}2405default:2406{2407cerr << "GetClosureNodes not implemented for Element of dimension " << dim << endl;2408}2409}2410return 0;2411}241224132414