Path: blob/devel/ElmerGUI/netgen/libsrc/csg/genmesh.cpp
3206 views
#include <mystdlib.h>123#include <myadt.hpp>45#include <linalg.hpp>6#include <csg.hpp>7#include <meshing.hpp>8910namespace netgen11{12ARRAY<SpecialPoint> specpoints;13static ARRAY<MeshPoint> spoints;1415#define TCL_OK 016#define TCL_ERROR 117181920static void FindPoints (CSGeometry & geom, Mesh & mesh)21{22PrintMessage (1, "Start Findpoints");2324const char * savetask = multithread.task;25multithread.task = "Find points";2627for (int i = 0; i < geom.GetNUserPoints(); i++)28{29mesh.AddPoint(geom.GetUserPoint (i));30mesh.Points().Last().Singularity (geom.GetUserPointRefFactor(i));31mesh.AddLockedPoint (PointIndex (i+1));32}3334SpecialPointCalculation spc;3536spc.SetIdEps(geom.GetIdEps());3738if (spoints.Size() == 0)39spc.CalcSpecialPoints (geom, spoints);4041PrintMessage (2, "Analyze spec points");42spc.AnalyzeSpecialPoints (geom, spoints, specpoints);4344PrintMessage (5, "done");4546(*testout) << specpoints.Size() << " special points:" << endl;47for (int i = 0; i < specpoints.Size(); i++)48specpoints[i].Print (*testout);4950/*51for (int i = 1; i <= geom.identifications.Size(); i++)52geom.identifications.Elem(i)->IdentifySpecialPoints (specpoints);53*/54multithread.task = savetask;55}56575859606162static void FindEdges (CSGeometry & geom, Mesh & mesh, const bool setmeshsize = false)63{64EdgeCalculation ec (geom, specpoints);65ec.SetIdEps(geom.GetIdEps());66ec.Calc (mparam.maxh, mesh);6768for (int i = 0; i < geom.singedges.Size(); i++)69{70geom.singedges[i]->FindPointsOnEdge (mesh);71if(setmeshsize)72geom.singedges[i]->SetMeshSize(mesh,10.*geom.BoundingBox().Diam());73}74for (int i = 0; i < geom.singpoints.Size(); i++)75geom.singpoints[i]->FindPoints (mesh);7677for (int i = 1; i <= mesh.GetNSeg(); i++)78{79//(*testout) << "segment " << mesh.LineSegment(i) << endl;80int ok = 0;81for (int k = 1; k <= mesh.GetNFD(); k++)82if (mesh.GetFaceDescriptor(k).SegmentFits (mesh.LineSegment(i)))83{84ok = k;85//(*testout) << "fits to " << k << endl;86}8788if (!ok)89{90ok = mesh.AddFaceDescriptor (FaceDescriptor (mesh.LineSegment(i)));91//(*testout) << "did not find, now " << ok << endl;92}9394//(*testout) << "change from " << mesh.LineSegment(i).si;95mesh.LineSegment(i).si = ok;96//(*testout) << " to " << mesh.LineSegment(i).si << endl;97}9899if (geom.identifications.Size())100{101PrintMessage (3, "Find Identifications");102for (int i = 0; i < geom.identifications.Size(); i++)103{104geom.identifications[i]->IdentifyPoints (mesh);105//(*testout) << "identification " << i << " is "106// << *geom.identifications[i] << endl;107108}109for (int i = 0; i < geom.identifications.Size(); i++)110geom.identifications[i]->IdentifyFaces (mesh);111}112113114// find intersecting segments115PrintMessage (3, "Check intersecting edges");116117Point3d pmin, pmax;118mesh.GetBox (pmin, pmax);119Box3dTree segtree (pmin, pmax);120121for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++)122{123if (mesh[si].seginfo)124{125Box<3> hbox;126hbox.Set (mesh[mesh[si].p1]);127hbox.Add (mesh[mesh[si].p2]);128segtree.Insert (hbox.PMin(), hbox.PMax(), si);129}130}131132ARRAY<int> loc;133if (!ec.point_on_edge_problem)134for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++)135{136if (!mesh[si].seginfo) continue;137138Box<3> hbox;139hbox.Set (mesh[mesh[si].p1]);140hbox.Add (mesh[mesh[si].p2]);141hbox.Increase (1e-6);142segtree.GetIntersecting (hbox.PMin(), hbox.PMax(), loc);143144// for (SegmentIndex sj = 0; sj < si; sj++)145for (int j = 0; j < loc.Size(); j++)146{147SegmentIndex sj = loc[j];148if (sj >= si) continue;149if (!mesh[si].seginfo || !mesh[sj].seginfo) continue;150if (mesh[mesh[si].p1].GetLayer() != mesh[mesh[sj].p2].GetLayer()) continue;151152Point<3> pi1 = mesh[mesh[si].p1];153Point<3> pi2 = mesh[mesh[si].p2];154Point<3> pj1 = mesh[mesh[sj].p1];155Point<3> pj2 = mesh[mesh[sj].p2];156Vec<3> vi = pi2 - pi1;157Vec<3> vj = pj2 - pj1;158159if (sqr (vi * vj) > (1.-1e-6) * Abs2 (vi) * Abs2 (vj)) continue;160161// pi1 + vi t = pj1 + vj s162Mat<3,2> mat;163Vec<3> rhs;164Vec<2> sol;165166for (int jj = 0; jj < 3; jj++)167{168mat(jj,0) = vi(jj);169mat(jj,1) = -vj(jj);170rhs(jj) = pj1(jj)-pi1(jj);171}172173mat.Solve (rhs, sol);174175//(*testout) << "mat " << mat << endl << "rhs " << rhs << endl << "sol " << sol << endl;176177if (sol(0) > 1e-6 && sol(0) < 1-1e-6 &&178sol(1) > 1e-6 && sol(1) < 1-1e-6 &&179Abs (rhs - mat*sol) < 1e-6)180{181Point<3> ip = pi1 + sol(0) * vi;182183//(*testout) << "ip " << ip << endl;184185Point<3> pip = ip;186ProjectToEdge (geom.GetSurface (mesh[si].surfnr1),187geom.GetSurface (mesh[si].surfnr2), pip);188189//(*testout) << "Dist (ip, pip_si) " << Dist (ip, pip) << endl;190if (Dist (ip, pip) > 1e-6*geom.MaxSize()) continue;191pip = ip;192ProjectToEdge (geom.GetSurface (mesh[sj].surfnr1),193geom.GetSurface (mesh[sj].surfnr2), pip);194195//(*testout) << "Dist (ip, pip_sj) " << Dist (ip, pip) << endl;196if (Dist (ip, pip) > 1e-6*geom.MaxSize()) continue;197198199200cout << "Intersection at " << ip << endl;201202geom.AddUserPoint (ip);203spoints.Append (MeshPoint (ip, mesh[mesh[si].p1].GetLayer()));204mesh.AddPoint (ip);205206(*testout) << "found intersection at " << ip << endl;207(*testout) << "sol = " << sol << endl;208(*testout) << "res = " << (rhs - mat*sol) << endl;209(*testout) << "segs = " << pi1 << " - " << pi2 << endl;210(*testout) << "and = " << pj1 << " - " << pj2 << endl << endl;211}212}213}214}215216217218219220221static void MeshSurface (CSGeometry & geom, Mesh & mesh)222{223const char * savetask = multithread.task;224multithread.task = "Surface meshing";225226ARRAY<Segment> segments;227int noldp = mesh.GetNP();228229double starttime = GetTime();230231// find master faces from identified232ARRAY<int> masterface(mesh.GetNFD());233for (int i = 1; i <= mesh.GetNFD(); i++)234masterface.Elem(i) = i;235236ARRAY<INDEX_2> fpairs;237bool changed;238do239{240changed = 0;241for (int i = 0; i < geom.identifications.Size(); i++)242{243geom.identifications[i]->GetIdentifiedFaces (fpairs);244245for (int j = 0; j < fpairs.Size(); j++)246{247if (masterface.Get(fpairs[j].I1()) <248masterface.Get(fpairs[j].I2()))249{250changed = 1;251masterface.Elem(fpairs[j].I2()) =252masterface.Elem(fpairs[j].I1());253}254if (masterface.Get(fpairs[j].I2()) <255masterface.Get(fpairs[j].I1()))256{257changed = 1;258masterface.Elem(fpairs[j].I1()) =259masterface.Elem(fpairs[j].I2());260}261}262}263}264while (changed);265266267int bccnt=0;268for (int k = 0; k < geom.GetNSurf(); k++)269bccnt = max2 (bccnt, geom.GetSurface(k)->GetBCProperty());270271for (int k = 1; k <= mesh.GetNFD(); k++)272{273bool increased = false;274275FaceDescriptor & fd = mesh.GetFaceDescriptor(k);276const Surface * surf = geom.GetSurface(fd.SurfNr());277278if (fd.TLOSurface() &&279geom.GetTopLevelObject(fd.TLOSurface()-1) -> GetBCProp() > 0)280fd.SetBCProperty (geom.GetTopLevelObject(fd.TLOSurface()-1) -> GetBCProp());281else if (surf -> GetBCProperty() != -1)282fd.SetBCProperty (surf->GetBCProperty());283else284{285bccnt++;286fd.SetBCProperty (bccnt);287increased = true;288}289290for (int l = 0; l < geom.bcmodifications.Size(); l++)291{292if (geom.GetSurfaceClassRepresentant (fd.SurfNr()) ==293geom.GetSurfaceClassRepresentant (geom.bcmodifications[l].si) &&294(fd.DomainIn() == geom.bcmodifications[l].tlonr+1 ||295fd.DomainOut() == geom.bcmodifications[l].tlonr+1))296{297if(geom.bcmodifications[l].bcname == NULL)298fd.SetBCProperty (geom.bcmodifications[l].bcnr);299else300{301if(!increased)302{303bccnt++;304fd.SetBCProperty (bccnt);305increased = true;306}307}308}309}310}311312mesh.SetNBCNames( bccnt );313314for (int k = 1; k <= mesh.GetNFD(); k++)315{316FaceDescriptor & fd = mesh.GetFaceDescriptor(k);317const Surface * surf = geom.GetSurface(fd.SurfNr());318if (fd.TLOSurface() )319{320int bcp = fd.BCProperty();321string nextbcname = geom.GetTopLevelObject(fd.TLOSurface()-1) -> GetBCName();322if ( nextbcname != "default" )323mesh.SetBCName ( bcp - 1 , nextbcname );324}325else // if (surf -> GetBCProperty() != -1)326{327int bcp = fd.BCProperty();328string nextbcname = surf->GetBCName();329if ( nextbcname != "default" )330mesh.SetBCName ( bcp - 1, nextbcname );331}332}333334for (int k = 1; k <= mesh.GetNFD(); k++)335{336FaceDescriptor & fd = mesh.GetFaceDescriptor(k);337fd.SetBCName ( mesh.GetBCNamePtr ( fd.BCProperty() - 1 ) );338}339340341//!!342343for (int k = 1; k <= mesh.GetNFD(); k++)344{345FaceDescriptor & fd = mesh.GetFaceDescriptor(k);346//const Surface * surf = geom.GetSurface(fd.SurfNr());347348for (int l = 0; l < geom.bcmodifications.Size(); l++)349{350if (geom.GetSurfaceClassRepresentant (fd.SurfNr()) ==351geom.GetSurfaceClassRepresentant (geom.bcmodifications[l].si) &&352(fd.DomainIn() == geom.bcmodifications[l].tlonr+1 ||353fd.DomainOut() == geom.bcmodifications[l].tlonr+1) &&354geom.bcmodifications[l].bcname != NULL355)356{357int bcp = fd.BCProperty();358mesh.SetBCName ( bcp - 1, *(geom.bcmodifications[l].bcname) );359fd.SetBCName ( mesh.GetBCNamePtr ( bcp - 1) );360}361}362}363364for(int k = 0; k<geom.bcmodifications.Size(); k++)365{366delete geom.bcmodifications[k].bcname;367geom.bcmodifications[k].bcname = NULL;368}369370//!!371372373for (int j = 0; j < geom.singfaces.Size(); j++)374{375ARRAY<int> surfs;376geom.GetIndependentSurfaceIndices (geom.singfaces[j]->GetSolid(),377geom.BoundingBox(), surfs);378for (int k = 1; k <= mesh.GetNFD(); k++)379{380FaceDescriptor & fd = mesh.GetFaceDescriptor(k);381for (int l = 0; l < surfs.Size(); l++)382if (surfs[l] == fd.SurfNr())383{384if (geom.singfaces[j]->GetDomainNr() == fd.DomainIn())385fd.domin_singular = 1;386if (geom.singfaces[j]->GetDomainNr() == fd.DomainOut())387fd.domout_singular = 1;388}389}390}391392393// assemble edge hash-table394mesh.CalcSurfacesOfNode();395396for (int k = 1; k <= mesh.GetNFD(); k++)397{398multithread.percent = 100.0 * k / (mesh.GetNFD()+1e-10);399400if (masterface.Get(k) != k)401continue;402403FaceDescriptor & fd = mesh.GetFaceDescriptor(k);404405(*testout) << "Surface " << k << endl;406(*testout) << "Face Descriptor: " << fd << endl;407PrintMessage (1, "Surface ", k, " / ", mesh.GetNFD());408409int oldnf = mesh.GetNSE();410411const Surface * surf =412geom.GetSurface((mesh.GetFaceDescriptor(k).SurfNr()));413414415Meshing2Surfaces meshing(*surf, geom.BoundingBox());416meshing.SetStartTime (starttime);417418419for (PointIndex pi = PointIndex::BASE; pi < noldp+PointIndex::BASE; pi++)420{421//if(surf->PointOnSurface(mesh[pi]))422meshing.AddPoint (mesh[pi], pi, NULL,423(surf->PointOnSurface(mesh[pi])!=0));424}425426segments.SetSize (0);427428for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++)429if (mesh[si].si == k)430{431segments.Append (mesh[si]);432(*testout) << "appending segment " << mesh[si] << endl;433//<< " from " << mesh[mesh[si][0]]434// << " to " <<mesh[mesh[si][1]]<< endl;435}436437(*testout) << "num-segments " << segments.Size() << endl;438439for (int i = 1; i <= geom.identifications.Size(); i++)440{441geom.identifications.Get(i)->442BuildSurfaceElements(segments, mesh, surf);443}444445for (int si = 0; si < segments.Size(); si++)446{447PointGeomInfo gi;448gi.trignum = k;449meshing.AddBoundaryElement (segments[si].p1 + 1 - PointIndex::BASE,450segments[si].p2 + 1 - PointIndex::BASE,451gi, gi);452}453454double maxh = mparam.maxh;455if (fd.DomainIn() != 0)456{457const Solid * s1 =458geom.GetTopLevelObject(fd.DomainIn()-1) -> GetSolid();459if (s1->GetMaxH() < maxh)460maxh = s1->GetMaxH();461maxh = min2(maxh, geom.GetTopLevelObject(fd.DomainIn()-1)->GetMaxH());462}463if (fd.DomainOut() != 0)464{465const Solid * s1 =466geom.GetTopLevelObject(fd.DomainOut()-1) -> GetSolid();467if (s1->GetMaxH() < maxh)468maxh = s1->GetMaxH();469maxh = min2(maxh, geom.GetTopLevelObject(fd.DomainOut()-1)->GetMaxH());470}471if (fd.TLOSurface() != 0)472{473double hi = geom.GetTopLevelObject(fd.TLOSurface()-1) -> GetMaxH();474if (hi < maxh) maxh = hi;475}476477(*testout) << "domin = " << fd.DomainIn() << ", domout = " << fd.DomainOut()478<< ", tlo-surf = " << fd.TLOSurface()479<< " mpram.maxh = " << mparam.maxh << ", maxh = " << maxh << endl;480481mparam.checkoverlap = 0;482483MESHING2_RESULT res =484meshing.GenerateMesh (mesh, maxh, k);485486if (res != MESHING2_OK)487{488PrintError ("Problem in Surface mesh generation");489throw NgException ("Problem in Surface mesh generation");490}491492if (multithread.terminate) return;493494for (int i = oldnf+1; i <= mesh.GetNSE(); i++)495mesh.SurfaceElement(i).SetIndex (k);496497498// mesh.CalcSurfacesOfNode();499500if (segments.Size())501{502// surface was meshed, not copied503PrintMessage (2, "Optimize Surface");504for (int i = 1; i <= mparam.optsteps2d; i++)505{506if (multithread.terminate) return;507508{509MeshOptimize2dSurfaces meshopt(geom);510meshopt.SetFaceIndex (k);511meshopt.SetImproveEdges (0);512meshopt.SetMetricWeight (mparam.elsizeweight);513meshopt.SetWriteStatus (0);514515meshopt.EdgeSwapping (mesh, (i > mparam.optsteps2d/2));516}517518if (multithread.terminate) return;519{520// mesh.CalcSurfacesOfNode();521522MeshOptimize2dSurfaces meshopt(geom);523meshopt.SetFaceIndex (k);524meshopt.SetImproveEdges (0);525meshopt.SetMetricWeight (mparam.elsizeweight);526meshopt.SetWriteStatus (0);527528meshopt.ImproveMesh (mesh);529}530531{532MeshOptimize2dSurfaces meshopt(geom);533meshopt.SetFaceIndex (k);534meshopt.SetImproveEdges (0);535meshopt.SetMetricWeight (mparam.elsizeweight);536meshopt.SetWriteStatus (0);537538meshopt.CombineImprove (mesh);539// mesh.CalcSurfacesOfNode();540}541542if (multithread.terminate) return;543{544MeshOptimize2dSurfaces meshopt(geom);545meshopt.SetFaceIndex (k);546meshopt.SetImproveEdges (0);547meshopt.SetMetricWeight (mparam.elsizeweight);548meshopt.SetWriteStatus (0);549550meshopt.ImproveMesh (mesh);551}552}553}554555556PrintMessage (3, (mesh.GetNSE() - oldnf), " elements, ", mesh.GetNP(), " points");557558#ifdef OPENGL559extern void Render();560Render();561#endif562}563564mesh.Compress();565566do567{568changed = 0;569for (int k = 1; k <= mesh.GetNFD(); k++)570{571multithread.percent = 100.0 * k / (mesh.GetNFD()+1e-10);572573if (masterface.Get(k) == k)574continue;575576FaceDescriptor & fd = mesh.GetFaceDescriptor(k);577578(*testout) << "Surface " << k << endl;579(*testout) << "Face Descriptor: " << fd << endl;580PrintMessage (2, "Surface ", k);581582int oldnf = mesh.GetNSE();583584const Surface * surf =585geom.GetSurface((mesh.GetFaceDescriptor(k).SurfNr()));586587/*588if (surf -> GetBCProperty() != -1)589fd.SetBCProperty (surf->GetBCProperty());590else591{592bccnt++;593fd.SetBCProperty (bccnt);594}595*/596597segments.SetSize (0);598for (int i = 1; i <= mesh.GetNSeg(); i++)599{600Segment * seg = &mesh.LineSegment(i);601if (seg->si == k)602segments.Append (*seg);603}604605for (int i = 1; i <= geom.identifications.Size(); i++)606{607geom.identifications.Elem(i)->GetIdentifiedFaces (fpairs);608int found = 0;609for (int j = 1; j <= fpairs.Size(); j++)610if (fpairs.Get(j).I1() == k || fpairs.Get(j).I2() == k)611found = 1;612613if (!found)614continue;615616geom.identifications.Get(i)->617BuildSurfaceElements(segments, mesh, surf);618if (!segments.Size())619break;620}621622623if (multithread.terminate) return;624625for (int i = oldnf+1; i <= mesh.GetNSE(); i++)626mesh.SurfaceElement(i).SetIndex (k);627628629if (!segments.Size())630{631masterface.Elem(k) = k;632changed = 1;633}634635PrintMessage (3, (mesh.GetNSE() - oldnf), " elements, ", mesh.GetNP(), " points");636}637638#ifdef OPENGL639extern void Render();640Render();641#endif642}643while (changed);644645646mesh.SplitSeparatedFaces();647mesh.CalcSurfacesOfNode();648649multithread.task = savetask;650}651652653654655656657658int GenerateMesh (CSGeometry & geom,659Mesh *& mesh,660int perfstepsstart, int perfstepsend,661const char * optstr)662{663664if (mesh && mesh->GetNSE() &&665!geom.GetNSolids())666{667if (perfstepsstart < MESHCONST_MESHVOLUME)668perfstepsstart = MESHCONST_MESHVOLUME;669}670671672673if (perfstepsstart <= MESHCONST_ANALYSE)674{675delete mesh;676mesh = new Mesh();677678mesh->SetGlobalH (mparam.maxh);679mesh->SetMinimalH (mparam.minh);680681ARRAY<double> maxhdom(geom.GetNTopLevelObjects());682for (int i = 0; i < maxhdom.Size(); i++)683maxhdom[i] = geom.GetTopLevelObject(i)->GetMaxH();684685mesh->SetMaxHDomain (maxhdom);686687if (mparam.uselocalh)688{689double maxsize = geom.MaxSize();690mesh->SetLocalH (Point<3>(-maxsize, -maxsize, -maxsize),691Point<3>(maxsize, maxsize, maxsize),692mparam.grading);693694mesh -> LoadLocalMeshSize (mparam.meshsizefilename);695}696697spoints.SetSize(0);698FindPoints (geom, *mesh);699700PrintMessage (5, "find points done");701702#ifdef LOG_STREAM703(*logout) << "Special points found" << endl704<< "time = " << GetTime() << " sec" << endl705<< "points: " << mesh->GetNP() << endl << endl;706#endif707}708709710if (multithread.terminate || perfstepsend <= MESHCONST_ANALYSE)711return TCL_OK;712713714if (perfstepsstart <= MESHCONST_MESHEDGES)715{716FindEdges (geom, *mesh, true);717if (multithread.terminate) return TCL_OK;718#ifdef LOG_STREAM719(*logout) << "Edges meshed" << endl720<< "time = " << GetTime() << " sec" << endl721<< "points: " << mesh->GetNP() << endl;722#endif723724725if (multithread.terminate)726return TCL_OK;727728if (mparam.uselocalh)729{730mesh->CalcLocalH();731mesh->DeleteMesh();732733FindPoints (geom, *mesh);734if (multithread.terminate) return TCL_OK;735FindEdges (geom, *mesh, true);736if (multithread.terminate) return TCL_OK;737738mesh->DeleteMesh();739740FindPoints (geom, *mesh);741if (multithread.terminate) return TCL_OK;742FindEdges (geom, *mesh);743if (multithread.terminate) return TCL_OK;744}745}746747if (multithread.terminate || perfstepsend <= MESHCONST_MESHEDGES)748return TCL_OK;749750751if (perfstepsstart <= MESHCONST_MESHSURFACE)752{753MeshSurface (geom, *mesh);754if (multithread.terminate) return TCL_OK;755756#ifdef LOG_STREAM757(*logout) << "Surfaces meshed" << endl758<< "time = " << GetTime() << " sec" << endl759<< "points: " << mesh->GetNP() << endl;760#endif761762if (mparam.uselocalh && 0)763{764mesh->CalcLocalH();765mesh->DeleteMesh();766767FindPoints (geom, *mesh);768if (multithread.terminate) return TCL_OK;769FindEdges (geom, *mesh);770if (multithread.terminate) return TCL_OK;771772MeshSurface (geom, *mesh);773if (multithread.terminate) return TCL_OK;774}775776#ifdef LOG_STREAM777(*logout) << "Surfaces remeshed" << endl778<< "time = " << GetTime() << " sec" << endl779<< "points: " << mesh->GetNP() << endl;780#endif781782#ifdef STAT_STREAM783(*statout) << mesh->GetNSeg() << " & "784<< mesh->GetNSE() << " & - &"785<< GetTime() << " & " << endl;786#endif787788MeshQuality2d (*mesh);789mesh->CalcSurfacesOfNode();790}791792if (multithread.terminate || perfstepsend <= MESHCONST_OPTSURFACE)793return TCL_OK;794795796if (perfstepsstart <= MESHCONST_MESHVOLUME)797{798multithread.task = "Volume meshing";799800MESHING3_RESULT res =801MeshVolume (mparam, *mesh);802803if (res != MESHING3_OK) return TCL_ERROR;804805if (multithread.terminate) return TCL_OK;806807RemoveIllegalElements (*mesh);808if (multithread.terminate) return TCL_OK;809810MeshQuality3d (*mesh);811812for (int i = 0; i < geom.GetNTopLevelObjects(); i++)813mesh->SetMaterial (i+1, geom.GetTopLevelObject(i)->GetMaterial().c_str());814815816#ifdef STAT_STREAM817(*statout) << GetTime() << " & ";818#endif819820#ifdef LOG_STREAM821(*logout) << "Volume meshed" << endl822<< "time = " << GetTime() << " sec" << endl823<< "points: " << mesh->GetNP() << endl;824#endif825}826827if (multithread.terminate || perfstepsend <= MESHCONST_MESHVOLUME)828return TCL_OK;829830831if (perfstepsstart <= MESHCONST_OPTVOLUME)832{833multithread.task = "Volume optimization";834835OptimizeVolume (mparam, *mesh);836if (multithread.terminate) return TCL_OK;837838#ifdef STAT_STREAM839(*statout) << GetTime() << " & "840<< mesh->GetNE() << " & "841<< mesh->GetNP() << " " << '\\' << '\\' << " \\" << "hline" << endl;842#endif843844#ifdef LOG_STREAM845(*logout) << "Volume optimized" << endl846<< "time = " << GetTime() << " sec" << endl847<< "points: " << mesh->GetNP() << endl;848#endif849}850851return TCL_OK;852}853}854855856