Path: blob/devel/ElmerGUI/netgen/libsrc/geom2d/genmesh2d.cpp
3206 views
#include <mystdlib.h>1#include <csg.hpp>2#include <geometry2d.hpp>3#include "meshing.hpp"45namespace netgen6{78// static ARRAY<Point<2> > points2;9// static ARRAY<int> lp1, lp2;101112extern void Optimize2d (Mesh & mesh, MeshingParameters & mp);1314151617181920void MeshFromSpline2D (SplineGeometry2d & geometry,21Mesh *& mesh,22MeshingParameters & mp)23{24PrintMessage (1, "Generate Mesh from spline geometry");2526double h = mp.maxh;2728Box<2> bbox = geometry.GetBoundingBox ();2930if (bbox.Diam() < h)31{32h = bbox.Diam();33mp.maxh = h;34}3536mesh = new Mesh;37mesh->SetDimension (2);3839geometry.PartitionBoundary (h, *mesh);4041// marks mesh points for hp-refinement42for (int i = 0; i < geometry.GetNP(); i++)43if (geometry.GetPoint(i).hpref)44{45double mindist = 1e99;46PointIndex mpi(0);47Point<2> gp = geometry.GetPoint(i);48Point<3> gp3(gp(0), gp(1), 0);49for (PointIndex pi = PointIndex::BASE;50pi < mesh->GetNP()+PointIndex::BASE; pi++)51if (Dist2(gp3, (*mesh)[pi]) < mindist)52{53mpi = pi;54mindist = Dist2(gp3, (*mesh)[pi]);55}56(*mesh)[mpi].Singularity(1.);57}585960int maxdomnr = 0;61for (SegmentIndex si = 0; si < mesh->GetNSeg(); si++)62{63if ( (*mesh)[si].domin > maxdomnr) maxdomnr = (*mesh)[si].domin;64if ( (*mesh)[si].domout > maxdomnr) maxdomnr = (*mesh)[si].domout;65}6667mesh->ClearFaceDescriptors();68for (int i = 1; i <= maxdomnr; i++)69mesh->AddFaceDescriptor (FaceDescriptor (i, 0, 0, i));7071// set ARRAY<string*> bcnames...72// number of bcnames73int maxsegmentindex = 0;74for (SegmentIndex si = 0; si < mesh->GetNSeg(); si++)75{76if ( (*mesh)[si].si > maxsegmentindex) maxsegmentindex = (*mesh)[si].si;77}7879mesh->SetNBCNames(maxsegmentindex);8081for ( int sindex = 0; sindex < maxsegmentindex; sindex++ )82{83mesh->SetBCName ( sindex, geometry.GetBCName( sindex+1 ) );84}8586for (SegmentIndex si = 0; si < mesh->GetNSeg(); si++)87{88(*mesh)[si].SetBCName ( (*mesh).GetBCNamePtr( (*mesh)[si].si-1 ) );89}90Point3d pmin(bbox.PMin()(0), bbox.PMin()(1), -bbox.Diam());91Point3d pmax(bbox.PMax()(0), bbox.PMax()(1), bbox.Diam());9293mesh->SetLocalH (pmin, pmax, mparam.grading);94mesh->SetGlobalH (h);9596mesh->CalcLocalH();9798int bnp = mesh->GetNP(); // boundary points99100int hquad = mparam.quad;101102103for (int domnr = 1; domnr <= maxdomnr; domnr++)104if (geometry.GetDomainTensorMeshing (domnr))105{ // tensor product mesh106107ARRAY<PointIndex, PointIndex::BASE> nextpi(bnp);108ARRAY<int, PointIndex::BASE> si1(bnp), si2(bnp);109PointIndex firstpi;110111nextpi = -1;112si1 = -1;113si2 = -1;114for (SegmentIndex si = 0; si < mesh->GetNSeg(); si++)115{116int p1 = -1, p2 = -2;117118if ( (*mesh)[si].domin == domnr)119{ p1 = (*mesh)[si].p1; p2 = (*mesh)[si].p2; }120if ( (*mesh)[si].domout == domnr)121{ p1 = (*mesh)[si].p2; p2 = (*mesh)[si].p1; }122123if (p1 == -1) continue;124125nextpi[p1] = p2; // counter-clockwise126127int index = (*mesh)[si].si;128if (si1[p1] != index && si2[p1] != index)129{ si2[p1] = si1[p1]; si1[p1] = index; }130if (si1[p2] != index && si2[p2] != index)131{ si2[p2] = si1[p2]; si1[p2] = index; }132}133134PointIndex c1(0), c2, c3, c4; // 4 corner points135int nex = 1, ney = 1;136137for (PointIndex pi = 1; pi <= si2.Size(); pi++)138if (si2[pi] != -1)139{ c1 = pi; break; }140141for (c2 = nextpi[c1]; si2[c2] == -1; c2 = nextpi[c2], nex++);142for (c3 = nextpi[c2]; si2[c3] == -1; c3 = nextpi[c3], ney++);143for (c4 = nextpi[c3]; si2[c4] == -1; c4 = nextpi[c4]);144145146147ARRAY<PointIndex> pts ( (nex+1) * (ney+1) ); // x ... inner loop148pts = -1;149150for (PointIndex pi = c1, i = 0; pi != c2; pi = nextpi[pi], i++)151pts[i] = pi;152for (PointIndex pi = c2, i = 0; pi != c3; pi = nextpi[pi], i++)153pts[(nex+1)*i+nex] = pi;154for (PointIndex pi = c3, i = 0; pi != c4; pi = nextpi[pi], i++)155pts[(nex+1)*(ney+1)-i-1] = pi;156for (PointIndex pi = c4, i = 0; pi != c1; pi = nextpi[pi], i++)157pts[(nex+1)*(ney-i)] = pi;158159160for (PointIndex pix = nextpi[c1], ix = 0; pix != c2; pix = nextpi[pix], ix++)161for (PointIndex piy = nextpi[c2], iy = 0; piy != c3; piy = nextpi[piy], iy++)162{163Point<3> p = (*mesh)[pix] + ( (*mesh)[piy] - (*mesh)[c2] );164pts[(nex+1)*(iy+1) + ix+1] = mesh -> AddPoint (p , 1, FIXEDPOINT);165}166167for (int i = 0; i < ney; i++)168for (int j = 0; j < nex; j++)169{170Element2d el(QUAD);171el[0] = pts[i*(nex+1)+j];172el[1] = pts[i*(nex+1)+j+1];173el[2] = pts[(i+1)*(nex+1)+j+1];174el[3] = pts[(i+1)*(nex+1)+j];175el.SetIndex (domnr);176177mesh -> AddSurfaceElement (el);178}179}180181182183184for (int domnr = 1; domnr <= maxdomnr; domnr++)185{186if (geometry.GetDomainTensorMeshing (domnr)) continue;187188if ( geometry.GetDomainMaxh ( domnr ) > 0 )189h = geometry.GetDomainMaxh(domnr);190191192PrintMessage (3, "Meshing domain ", domnr, " / ", maxdomnr);193194int oldnf = mesh->GetNSE();195196mparam.quad = hquad || geometry.GetDomainQuadMeshing (domnr);197198Meshing2 meshing (Box<3> (pmin, pmax));199200for (PointIndex pi = PointIndex::BASE; pi < bnp+PointIndex::BASE; pi++)201meshing.AddPoint ( (*mesh)[pi], pi);202203204PointGeomInfo gi;205gi.trignum = 1;206for (SegmentIndex si = 0; si < mesh->GetNSeg(); si++)207{208if ( (*mesh)[si].domin == domnr)209meshing.AddBoundaryElement ( (*mesh)[si].p1 + 1 - PointIndex::BASE,210(*mesh)[si].p2 + 1 - PointIndex::BASE, gi, gi);211if ( (*mesh)[si].domout == domnr)212meshing.AddBoundaryElement ( (*mesh)[si].p2 + 1 - PointIndex::BASE,213(*mesh)[si].p1 + 1 - PointIndex::BASE, gi, gi);214}215216217mparam.checkoverlap = 0;218219meshing.GenerateMesh (*mesh, h, domnr);220221for (SurfaceElementIndex sei = oldnf; sei < mesh->GetNSE(); sei++)222(*mesh)[sei].SetIndex (domnr);223224225// astrid226char * material;227geometry.GetMaterial( domnr, material );228if ( material )229{230(*mesh).SetMaterial ( domnr, material );231}232233}234235mparam.quad = hquad;236237238239int hsteps = mp.optsteps2d;240241mp.optimize2d = "smcm";242mp.optsteps2d = hsteps/2;243Optimize2d (*mesh, mp);244245mp.optimize2d = "Smcm";246mp.optsteps2d = (hsteps+1)/2;247Optimize2d (*mesh, mp);248249mp.optsteps2d = hsteps;250251mesh->Compress();252mesh -> SetNextMajorTimeStamp();253254255#ifdef OPENGL256extern void Render();257Render();258#endif259260}261262263264265266267268269}270271272