From 9aa8d2f3d4644401bdac327e81b99d48f0174eb3 Mon Sep 17 00:00:00 2001 From: Akash Anand <akasha@iitk.ac.in> Date: Tue, 7 Aug 2007 21:58:51 +0000 Subject: [PATCH] moving FourierModel to its new home :-) --- contrib/FourierModel/BlendOperator.cpp | 453 -------- contrib/FourierModel/BlendOperator.h | 60 -- contrib/FourierModel/BlendedPatch.cpp | 880 ---------------- contrib/FourierModel/BlendedPatch.h | 104 -- contrib/FourierModel/ContinuationPatch.cpp | 933 ----------------- contrib/FourierModel/ContinuationPatch.h | 77 -- contrib/FourierModel/Curve.cpp | 13 - contrib/FourierModel/Curve.h | 27 - .../CylindricalProjectionSurface.cpp | 274 ----- .../CylindricalProjectionSurface.h | 88 -- contrib/FourierModel/ExactPatch.cpp | 76 -- contrib/FourierModel/ExactPatch.h | 36 - contrib/FourierModel/FCurve.cpp | 96 -- contrib/FourierModel/FCurve.h | 64 -- contrib/FourierModel/FM_Edge.cpp | 124 --- contrib/FourierModel/FM_Edge.h | 52 - contrib/FourierModel/FM_Face.cpp | 161 --- contrib/FourierModel/FM_Face.h | 50 - contrib/FourierModel/FM_Info.cpp | 28 - contrib/FourierModel/FM_Info.h | 65 -- contrib/FourierModel/FM_Reader.cpp | 171 --- contrib/FourierModel/FM_Reader.h | 49 - contrib/FourierModel/FM_Vertex.cpp | 2 - contrib/FourierModel/FM_Vertex.h | 30 - contrib/FourierModel/FPatch.cpp | 979 ------------------ contrib/FourierModel/FPatch.h | 96 -- contrib/FourierModel/IntersectionCurve.cpp | 367 ------- contrib/FourierModel/IntersectionCurve.h | 44 - contrib/FourierModel/Main.cpp | 117 --- contrib/FourierModel/Makefile | 91 -- contrib/FourierModel/Message.cpp | 163 --- contrib/FourierModel/Message.h | 40 - .../ParaboloidProjectionSurface.cpp | 209 ---- .../ParaboloidProjectionSurface.h | 66 -- contrib/FourierModel/PartitionOfUnity.cpp | 1 - contrib/FourierModel/PartitionOfUnity.h | 140 --- contrib/FourierModel/Patch.cpp | 85 -- contrib/FourierModel/Patch.h | 120 --- .../FourierModel/PlaneProjectionSurface.cpp | 183 ---- contrib/FourierModel/PlaneProjectionSurface.h | 77 -- contrib/FourierModel/ProjectionSurface.cpp | 357 ------- contrib/FourierModel/ProjectionSurface.h | 150 --- .../RevolvedParabolaProjectionSurface.cpp | 267 ----- .../RevolvedParabolaProjectionSurface.h | 74 -- contrib/FourierModel/Utils.cpp | 345 ------ contrib/FourierModel/Utils.h | 18 - 46 files changed, 7902 deletions(-) delete mode 100755 contrib/FourierModel/BlendOperator.cpp delete mode 100755 contrib/FourierModel/BlendOperator.h delete mode 100755 contrib/FourierModel/BlendedPatch.cpp delete mode 100755 contrib/FourierModel/BlendedPatch.h delete mode 100644 contrib/FourierModel/ContinuationPatch.cpp delete mode 100644 contrib/FourierModel/ContinuationPatch.h delete mode 100644 contrib/FourierModel/Curve.cpp delete mode 100644 contrib/FourierModel/Curve.h delete mode 100755 contrib/FourierModel/CylindricalProjectionSurface.cpp delete mode 100755 contrib/FourierModel/CylindricalProjectionSurface.h delete mode 100644 contrib/FourierModel/ExactPatch.cpp delete mode 100644 contrib/FourierModel/ExactPatch.h delete mode 100644 contrib/FourierModel/FCurve.cpp delete mode 100644 contrib/FourierModel/FCurve.h delete mode 100644 contrib/FourierModel/FM_Edge.cpp delete mode 100644 contrib/FourierModel/FM_Edge.h delete mode 100644 contrib/FourierModel/FM_Face.cpp delete mode 100644 contrib/FourierModel/FM_Face.h delete mode 100644 contrib/FourierModel/FM_Info.cpp delete mode 100644 contrib/FourierModel/FM_Info.h delete mode 100644 contrib/FourierModel/FM_Reader.cpp delete mode 100644 contrib/FourierModel/FM_Reader.h delete mode 100644 contrib/FourierModel/FM_Vertex.cpp delete mode 100644 contrib/FourierModel/FM_Vertex.h delete mode 100644 contrib/FourierModel/FPatch.cpp delete mode 100644 contrib/FourierModel/FPatch.h delete mode 100644 contrib/FourierModel/IntersectionCurve.cpp delete mode 100644 contrib/FourierModel/IntersectionCurve.h delete mode 100644 contrib/FourierModel/Main.cpp delete mode 100644 contrib/FourierModel/Makefile delete mode 100644 contrib/FourierModel/Message.cpp delete mode 100644 contrib/FourierModel/Message.h delete mode 100755 contrib/FourierModel/ParaboloidProjectionSurface.cpp delete mode 100755 contrib/FourierModel/ParaboloidProjectionSurface.h delete mode 100755 contrib/FourierModel/PartitionOfUnity.cpp delete mode 100755 contrib/FourierModel/PartitionOfUnity.h delete mode 100644 contrib/FourierModel/Patch.cpp delete mode 100644 contrib/FourierModel/Patch.h delete mode 100755 contrib/FourierModel/PlaneProjectionSurface.cpp delete mode 100755 contrib/FourierModel/PlaneProjectionSurface.h delete mode 100755 contrib/FourierModel/ProjectionSurface.cpp delete mode 100755 contrib/FourierModel/ProjectionSurface.h delete mode 100755 contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp delete mode 100755 contrib/FourierModel/RevolvedParabolaProjectionSurface.h delete mode 100755 contrib/FourierModel/Utils.cpp delete mode 100755 contrib/FourierModel/Utils.h diff --git a/contrib/FourierModel/BlendOperator.cpp b/contrib/FourierModel/BlendOperator.cpp deleted file mode 100755 index a29c52dfd3..0000000000 --- a/contrib/FourierModel/BlendOperator.cpp +++ /dev/null @@ -1,453 +0,0 @@ -#include "BlendOperator.h" - -using namespace FM; - -bool BlendOperator::GetPointOnPatch_ -(int i, double u, double v, int j, double &x, double &y, double &z) -{ - double h = 1.e-8; - double tol = 1.e-12; - - u = GetPatch(i)->RescaleU(u); - v = GetPatch(i)->RescaleV(v); - - double P[3], d[3]; - GetPatch(i)->GetProjectionSurface()->F(u,v,P[0],P[1],P[2]); - GetPatch(i)->GetProjectionSurface()->GetUnitNormal(u,v,d[0],d[1],d[2]); - - u = GetPatch(i)->UnscaleU(u); - v = GetPatch(i)->UnscaleV(v); - - double e1[3],e2[3]; - - if (std::abs(1.-std::abs(d[0])) < tol) { - e1[0] = 0.; - e1[1] = 1.; - e1[2] = 0.; - } - else if (std::abs(1.-std::abs(d[1])) < tol) { - e1[0] = 0.; - e1[1] = 0.; - e1[2] = 1.; - } - else if (std::abs(1.-std::abs(d[2])) < tol) { - e1[0] = 1.; - e1[1] = 0.; - e1[2] = 0.; - } - else { - e1[0] = - d[1] * d[2]; - e1[1] = 2 * d[2] * d[0]; - e1[2] = - d[0] * d[1]; - } - double value = 0.; - for (int l=0;l<3;l++) - value += e1[l] * e1[l]; - value = sqrt(value); - for (int l=0;l<3;l++) - e1[l] /= value; - - e2[0] = d[1] * e1[2] - d[2] * e1[1]; - e2[1] = d[2] * e1[0] - d[0] * e1[2]; - e2[2] = d[0] * e1[1] - d[1] * e1[0]; - - bool converged = false; - - double R[3]; - GetPatch(i)->F(u,v,R[0],R[1],R[2]); - - double Qu,Qv; - GetPatch(j)->GetProjectionSurface()-> - OrthoProjectionOnSurface(R[0],R[1],R[2],Qu,Qv); - - Qu = GetPatch(j)->UnscaleU(Qu); - Qv = GetPatch(j)->UnscaleV(Qv); - - double Q[3]; - GetPatch(j)->F(Qu,Qv,Q[0],Q[1],Q[2]); - - int maxTotalIteration = 10; - int totalIterationCounter = 0; - - while ((!converged) && (totalIterationCounter < maxTotalIteration)) { - totalIterationCounter++; - double QminusP[3]; - for (int l=0;l<3;l++) - QminusP[l] = Q[l] - P[l]; - - double f[2]; - f[0] = (QminusP[0] * e1[0] + QminusP[1] * e1[1] + QminusP[2] * e1[2]); - f[1] = (QminusP[0] * e2[0] + QminusP[1] * e2[1] + QminusP[2] * e2[2]); - - //printf("(%g,%g) :: f = (%g,%g)\n",u,v,f[0],f[1]); - - if ((std::abs(f[0]) < tol) && (std::abs(f[1]) < tol)) { - //bool IsGood = true; - - bool IsGood = GetPatch(i)->GetProjectionSurface()-> - OrthoProjectionOnSurface(Q[0],Q[1],Q[2],u,v); - if (IsGood) { - double RR[3]; - //printf("(u,v) = (%g,%g); (Qu,Qv) = (%g,%g)\n",u,v,Qu,Qv); - u = GetPatch(i)->UnscaleU(u); - v = GetPatch(i)->UnscaleV(v); - GetPatch(i)->F(u,v,RR[0],RR[1],RR[2]); - double dist = 0.; - for (int l=0;l<3;l++) - dist += (RR[l] - R[l]) * (RR[l] - R[l]); - dist = sqrt(dist); - if (dist > 1.e-2) - break; - else { - //printf("R = (%g,%g,%g); RR = (%g,%g,%g)\n\n", - // R[0],R[1],R[2],RR[0],RR[1],RR[2]); - converged = true; - x = Q[0]; y = Q[1]; z = Q[2]; - } - converged = true; - x = Q[0]; y = Q[1]; z = Q[2]; - } - else - break; - } - else { - double QuPlus = Qu + h; - double QvPlus = Qv + h; - if (GetPatch(j)->IsUPeriodic()) - QuPlus -= std::floor(QuPlus); - if (GetPatch(j)->IsVPeriodic()) - QvPlus -= std::floor(QvPlus); - - double QplusU[3], QplusV[3]; - GetPatch(j)->F(QuPlus,Qv,QplusU[0],QplusU[1],QplusU[2]); - GetPatch(j)->F(Qu,QvPlus,QplusV[0],QplusV[1],QplusV[2]); - - double QplusUminusP[3], QplusVminusP[3]; - for (int l=0;l<3;l++) { - QplusUminusP[l] = QplusU[l] - P[l]; - QplusVminusP[l] = QplusV[l] - P[l]; - } - - double fuPlus[2], fvPlus[2]; - fuPlus[0] = (QplusUminusP[0] * e1[0] + QplusUminusP[1] * e1[1] + - QplusUminusP[2] * e1[2]); - fuPlus[1] = (QplusUminusP[0] * e2[0] + QplusUminusP[1] * e2[1] + - QplusUminusP[2] * e2[2]); - fvPlus[0] = (QplusVminusP[0] * e1[0] + QplusVminusP[1] * e1[1] + - QplusVminusP[2] * e1[2]); - fvPlus[1] = (QplusVminusP[0] * e2[0] + QplusVminusP[1] * e2[1] + - QplusVminusP[2] * e2[2]); - - double D[2][2]; - D[0][0] = (fuPlus[0] - f[0]) / h; - D[0][1] = (fvPlus[0] - f[0]) / h; - D[1][0] = (fuPlus[1] - f[1]) / h; - D[1][1] = (fvPlus[1] - f[1]) / h; - - double det = D[0][0] * D[1][1] - D[0][1] * D[1][0]; - double update[2]; - update[0] = (D[1][1] * f[0] - D[0][1] * f[1]) / det; - update[1] = (D[0][0] * f[1] - D[1][0] * f[0]) / det; - - //printf("update = (%g,%g)\n",update[0],update[1]); - - Qu -= update[0]; - Qv -= update[1]; - - //printf("Q1 = (%g,%g)\n",Qu,Qv); - - if (GetPatch(j)->IsUPeriodic()) - Qu -= std::floor(Qu); - if (GetPatch(j)->IsVPeriodic()) - Qv -= std::floor(Qv); - - //printf("Q2 = (%g,%g)\n",Qu,Qv); - - GetPatch(j)->F(Qu,Qv,Q[0],Q[1],Q[2]); - } - } - - return converged; -} - -bool BlendOperator::E -(int i, int j, double u, double v, double &x, double &y, double &z) -{ - bool found = false; - - if (DoPatchesOverlap(i,j)) { - GetPatch(i)->F(u,v,x,y,z); - //if (1) { - if (IsPointInIntersectionBoundingBox(i,j,x,y,z)) { - if (GetPatch(i)->GetProjectionSurface()->GetTag() == - GetPatch(j)->GetProjectionSurface()->GetTag()) { - found = GetPatch(j)->Inverse(x,y,z,u,v); - } - else { - int tag = GetProjectionSurfaceTagForOverlap(i,j); - if (GetPatch(i)->GetProjectionSurface()->GetTag() == tag) { - found = GetPointOnPatch_(i,u,v,j,x,y,z); - if (!GetPatch(j)->Inverse(x,y,z,u,v)) - found = false; - } - else if (GetPatch(j)->GetProjectionSurface()->GetTag() == tag) { - found = GetPatch(j)->GetProjectionSurface()-> - OrthoProjectionOnSurface(x,y,z,u,v); - if (found) { - u = GetPatch(j)->UnscaleU(u); - v = GetPatch(j)->UnscaleV(v); - double tol = 1.e-12; - if ((u > - tol)&&(u < 1. + tol)&&(v > - tol)&&(v < 1. + tol)) { - found = true; - GetPatch(j)->F(u,v,x,y,z); - } - else - found = false; - } - } - else { - found = E(i,tag,u,v,x,y,z); - if (found) { - found = GetPatch(tag)->Inverse(x,y,z,u,v); - if (found) - found = E(tag,j,u,v,x,y,z); - } - } - } - } - } - return found; -} - -double BlendOperator::GetBlendingPou -(int patchTag, double u, double v) -{ - double x,y,z; - double pouNumerator = GetPatch(patchTag)->GetPou(u,v); - - double pouDenominator = 0.; - for (int otherPatchTag = 0;otherPatchTag < patch_.size();otherPatchTag++) { - if (E(patchTag,otherPatchTag,u,v,x,y,z)) { - double uu,vv; - GetPatch(otherPatchTag)->Inverse(x,y,z,uu,vv); - if (GetPatch(otherPatchTag)->Inverse(x,y,z,uu,vv)) { - pouDenominator += GetPatch(otherPatchTag)->GetPou(uu,vv); - } - } - } - if (pouDenominator) - return pouNumerator / pouDenominator; - else { - printf("%d(%g,%g) :: %g %g\n",patchTag,u,v,pouNumerator,pouDenominator); - return 1.; - } -} - -Patch* BlendOperator::GetPatch -(int tag) { - for (int i=0;i<patch_.size();i++) { - if (patch_[i]->GetTag() == tag) - return patch_[i]; - } -} - -ProjectionSurface* BlendOperator::GetProjectionSurface -(int tag) { - for (int i=0;i<ps_.size();i++) { - if (ps_[i]->GetTag() == tag) - return ps_[i]; - } -} - -bool BlendOperator::DoPatchesOverlap -(int patchTag1, int patchTag2) { - bool result; - if (overlapChart_[patchTag1][patchTag2]->doesIntersect) - result = true; - else - result = false; - - return result; -} - -int BlendOperator::GetProjectionSurfaceTagForOverlap -(int patchTag1, int patchTag2) { - return overlapChart_[patchTag1][patchTag2]->psTag; -} - -bool BlendOperator::IsPointInIntersectionBoundingBox -(int patchTag1, int patchTag2, double x, double y, double z) { - bool result = true; - double tol = 1.e-2; - double xMin = overlapChart_[patchTag1][patchTag2]->xMin - tol; - double xMax = overlapChart_[patchTag1][patchTag2]->xMax + tol; - double yMin = overlapChart_[patchTag1][patchTag2]->yMin - tol; - double yMax = overlapChart_[patchTag1][patchTag2]->yMax + tol; - double zMin = overlapChart_[patchTag1][patchTag2]->zMin - tol; - double zMax = overlapChart_[patchTag1][patchTag2]->zMax + tol; - - //printf("%d %d :: %g %g %g :: %g %g %g :: %g %g %g\n", - // patchTag1,patchTag2, xMin,x,xMax,yMin,y,yMax,zMin,z,zMax); - - if ((x < xMin)||(x > xMax)||(y < yMin)||(y > yMax)||(z < zMin)||(z > zMax)) - result = false; - - return result; -} - -int BlendOperator::GetNumPatches -() { - return patch_.size(); -} - -bool BlendOperator::GetPointOnPatch -(int patchTag, double d[3], double &x, double &y, double &z) -{ - double h = 1.e-6; - double tol = 1.e-12; - - double P[3], R[3]; - P[0] = R[0] = x; - P[1] = R[1] = y; - P[2] = R[2] = z; - - double e1[3],e2[3]; - - if (std::abs(1.-std::abs(d[0])) < tol) { - e1[0] = 0.; - e1[1] = 1.; - e1[2] = 0.; - } - else if (std::abs(1.-std::abs(d[1])) < tol) { - e1[0] = 0.; - e1[1] = 0.; - e1[2] = 1.; - } - else if (std::abs(1.-std::abs(d[2])) < tol) { - e1[0] = 1.; - e1[1] = 0.; - e1[2] = 0.; - } - else { - e1[0] = - d[1] * d[2]; - e1[1] = 2 * d[2] * d[0]; - e1[2] = - d[0] * d[1]; - } - double value = 0.; - for (int l=0;l<3;l++) - value += e1[l] * e1[l]; - value = sqrt(value); - for (int l=0;l<3;l++) - e1[l] /= value; - - e2[0] = d[1] * e1[2] - d[2] * e1[1]; - e2[1] = d[2] * e1[0] - d[0] * e1[2]; - e2[2] = d[0] * e1[1] - d[1] * e1[0]; - - bool converged = false; - - double Qu,Qv; - GetPatch(patchTag)->GetProjectionSurface()-> - OrthoProjectionOnSurface(P[0],P[1],P[2],Qu,Qv); - - - //printf("Q1 = (%g,%g)\n",Qu,Qv); - - Qu = GetPatch(patchTag)->UnscaleU(Qu); - Qv = GetPatch(patchTag)->UnscaleV(Qv); - - if (Qu < 0.) - Qu = 0.; - if (Qu > 1.) - Qu = 1.; - - if (Qv < 0.) - Qv = 0.; - if (Qv > 1.) - Qv = 1.; - - double Q[3]; - GetPatch(patchTag)->F(Qu,Qv,Q[0],Q[1],Q[2]); - - int maxTotalIteration = 10; - int totalIterationCounter = 0; - - while ((!converged) && (totalIterationCounter < maxTotalIteration)) { - totalIterationCounter++; - double QminusP[3]; - for (int l=0;l<3;l++) - QminusP[l] = Q[l] - P[l]; - - double f[2]; - f[0] = (QminusP[0] * e1[0] + QminusP[1] * e1[1] + QminusP[2] * e1[2]); - f[1] = (QminusP[0] * e2[0] + QminusP[1] * e2[1] + QminusP[2] * e2[2]); - - //printf("Q2 = (%g,%g) -> %g -> %g\n",Qu,Qv,f[0],f[1]); - - if ((std::abs(f[0]) < tol) && (std::abs(f[1]) < tol)) { - //printf("here too\n"); - converged = true; - for (int l=0;l<3;l++) - R[l] = Q[l]; - } - else { - double QuPlus = Qu + h; - double QvPlus = Qv + h; - if (GetPatch(patchTag)->IsUPeriodic()) - QuPlus -= std::floor(QuPlus); - if (GetPatch(patchTag)->IsVPeriodic()) - QvPlus -= std::floor(QvPlus); - - double QplusU[3], QplusV[3]; - GetPatch(patchTag)->F(QuPlus,Qv,QplusU[0],QplusU[1],QplusU[2]); - GetPatch(patchTag)->F(Qu,QvPlus,QplusV[0],QplusV[1],QplusV[2]); - - double QplusUminusP[3], QplusVminusP[3]; - for (int l=0;l<3;l++) { - QplusUminusP[l] = QplusU[l] - P[l]; - QplusVminusP[l] = QplusV[l] - P[l]; - } - - double fuPlus[2], fvPlus[2]; - fuPlus[0] = (QplusUminusP[0] * e1[0] + QplusUminusP[1] * e1[1] + - QplusUminusP[2] * e1[2]); - fuPlus[1] = (QplusUminusP[0] * e2[0] + QplusUminusP[1] * e2[1] + - QplusUminusP[2] * e2[2]); - fvPlus[0] = (QplusVminusP[0] * e1[0] + QplusVminusP[1] * e1[1] + - QplusVminusP[2] * e1[2]); - fvPlus[1] = (QplusVminusP[0] * e2[0] + QplusVminusP[1] * e2[1] + - QplusVminusP[2] * e2[2]); - - double D[2][2]; - D[0][0] = (fuPlus[0] - f[0]) / h; - D[0][1] = (fvPlus[0] - f[0]) / h; - D[1][0] = (fuPlus[1] - f[1]) / h; - D[1][1] = (fvPlus[1] - f[1]) / h; - - double det = D[0][0] * D[1][1] - D[0][1] * D[1][0]; - double update[2]; - update[0] = (D[1][1] * f[0] - D[0][1] * f[1]) / det; - update[1] = (D[0][0] * f[1] - D[1][0] * f[0]) / det; - - //printf("update = (%g,%g)\n",update[0],update[1]); - - Qu -= update[0]; - Qv -= update[1]; - - //printf("Q1 = (%g,%g)\n",Qu,Qv); - - //if (GetPatch(patchTag)->_PI->periodic[0] == 1) - //Qu -= std::floor(Qu); - //if (GetPatch(patchTag)->_PI->periodic[1] == 1) - //Qv -= std::floor(Qv); - - //printf("Q2 = (%g,%g)\n",Qu,Qv); - - GetPatch(patchTag)->F(Qu,Qv,Q[0],Q[1],Q[2]); - } - } - x = R[0]; - y = R[1]; - z = R[2]; - return converged; -} diff --git a/contrib/FourierModel/BlendOperator.h b/contrib/FourierModel/BlendOperator.h deleted file mode 100755 index ff8aa33509..0000000000 --- a/contrib/FourierModel/BlendOperator.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _BLEND_OPERATOR_H_ -#define _BLEND_OPERATOR_H_ - -#include <vector> -#include "FM_Info.h" -#include "Patch.h" -#include "ProjectionSurface.h" - -namespace FM { - -class BlendOperator { - private: - std::vector<Patch*> patch_; - std::vector<ProjectionSurface*> ps_; - std::vector<std::vector<OverlapInfo*> > overlapChart_; - - bool GetPointOnPatch_ - (int i, double u, double v, int j, double &x, double &y, double &z); - - protected: - - public: - BlendOperator - (std::vector<Patch*> patch,std::vector<ProjectionSurface*> ps, - std::vector<std::vector<OverlapInfo*> > overlapChart) : - patch_(patch), ps_(ps), overlapChart_(overlapChart) {} - - ~BlendOperator() {} - - int GetNumPatches - (); - - Patch* GetPatch - (int tag); - - ProjectionSurface* GetProjectionSurface - (int tag); - - bool DoPatchesOverlap - (int patchTag1, int patchTag2); - - int GetProjectionSurfaceTagForOverlap - (int patchTag1, int patchTag2); - - bool IsPointInIntersectionBoundingBox - (int patchTag1, int patchTag2, double x, double y, double z); - - bool E - (int i, int j, double u, double v, double &x, double &y, double &z); - - double GetBlendingPou - (int patchTag, double u, double v); - - bool GetPointOnPatch - (int patchTag, double d[3], double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/BlendedPatch.cpp b/contrib/FourierModel/BlendedPatch.cpp deleted file mode 100755 index 9a4cb6b207..0000000000 --- a/contrib/FourierModel/BlendedPatch.cpp +++ /dev/null @@ -1,880 +0,0 @@ -#include "BlendedPatch.h" - -using namespace FM; - -BlendedPatch::BlendedPatch -(Patch* patch, BlendOperator* blendOp) - : _coeffData(0),_coeffDerivU(0),_coeffDerivV(0), - _coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0) -{ - patch_ = patch; - blendOp_ = blendOp; - - patchTag_ = patch_->GetTag(); - nPatches_ = blendOp_->GetNumPatches(); - - _derivative = patch_->GetDerivativeBitField(); - - //_uM = patch_->GetUModes(); - //_vM = patch_->GetVModes(); - - _periodU = patch_->IsUPeriodic() ? 1. : 2.; - _periodV = patch_->IsVPeriodic() ? 1. : 2.; - - IsUPeriodic = false; - IsVPeriodic = false; - - _uM = 32; - _vM = 32; - - //printf("%d %d\n",_uM,_vM); - - if (IsUPeriodic) { - if ((_uM % 2) == 0) { - _uMLower = - _uM/2; - _uMUpper = _uM/2 - 1; - } - else { - _uMLower = - (_uM - 1)/2; - _uMUpper = (_uM - 1)/2; - } - } - else { - _uMLower = 0; - _uMUpper = _uM; - } - if (IsVPeriodic) { - if ((_vM % 2) == 0) { - _vMLower = - _vM/2; - _vMUpper = _vM/2 - 1; - } - else { - _vMLower = - (_vM - 1)/2; - _vMUpper = (_vM - 1)/2; - } - } - else { - _vMLower = 0; - _vMUpper = _vM; - } - - if (_derivative) - _ProcessSeriesCoeff(); - - /* - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) - printf("%g ",_coeffData[j][k].real()); - printf("\n\n"); - } - printf("\n"); - */ - - // Check if we need to interpolate the derivative(s) - if(_derivative){ - // Initialize _fineDeriv and _fineDeriv2 to zero - if(_derivative & 1){ - _coeffDerivU = new std::complex<double>*[_uM]; - _coeffDerivV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivU[j] = new std::complex<double>[_vM]; - _coeffDerivV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivU[j][k] = 0.; - _coeffDerivV[j][k] = 0.; - } - } - } - - if(_derivative & 2){ - _coeffDerivUU = new std::complex<double>*[_uM]; - _coeffDerivVV = new std::complex<double>*[_uM]; - _coeffDerivUV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivUU[j] = new std::complex<double>[_vM]; - _coeffDerivVV[j] = new std::complex<double>[_vM]; - _coeffDerivUV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivUU[j][k] = 0.; - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - } - } - - // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2 - std::complex<double> I(0., 1.); - for(int j = _uM - 1; j >= 0; j--){ - for(int k = _vM - 1; k >= 0; k--){ - if(_derivative & 1){ - if (IsUPeriodic) { - int J = j+_uMLower; - _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffData[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivU[j][k] = 2. * (double)(j + 1) * _coeffData[j + 1][k]; - else - _coeffDerivU[j][k] = _coeffDerivU[j + 2][k] + - 2. * (double)(j + 1) * _coeffData[j + 1][k]; - //if (j != 0) - //_coeffDerivU[j][k] *= 2.; - } - if (IsVPeriodic) { - int K = k+_vMLower; - _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffData[j][k]; - } - else { - if (k == _vM - 1) - _coeffDerivV[j][k] = 0.; - else if (k == _vM - 2) - _coeffDerivV[j][k] = 2. * (double)(k + 1) * _coeffData[j][k + 1]; - else - _coeffDerivV[j][k] = _coeffDerivV[j][k + 2] + - 2. * (double)(k + 1) * _coeffData[j][k + 1]; - //if (k != 0) - //_coeffDerivV[j][k] *= 2.; - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 1) { - if (!IsUPeriodic) { - if (j != 0) { - _coeffDerivU[j][k] *= 2.; - } - } - if (!IsVPeriodic) { - if (k != 0) { - _coeffDerivV[j][k] *= 2.; - } - } - } - } - } - for(int j = _uM - 1; j >= 0; j--) { - for(int k = _vM - 1; k >= 0; k--) { - if(_derivative & 2) { - if (IsUPeriodic) { - int J = j+_uMLower; - _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffDerivU[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivUU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivUU[j][k] = 2. * (double)(j + 1) * - _coeffDerivU[j + 1][k]; - else - _coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] + - 2. * (double)(j + 1) * _coeffDerivU[j + 1][k]; - //if (j != 0) - //_coeffDerivUU[j][k] *= 2.; - } - if (IsVPeriodic) { - int K = k+_vMLower; - _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivV[j][k]; - _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivU[j][k]; - } - else { - if (k == _vM - 1) { - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - else if (k == _vM - 2) { - _coeffDerivVV[j][k] = 2. * (double)(k + 1) * - _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = 2. * (double)(k + 1) * - _coeffDerivU[j][k + 1]; - } - else { - _coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivU[j][k + 1]; - //if (k != 0) { - //_coeffDerivVV[j][k] *= 2.; - //_coeffDerivUV[j][k] *= 2.; - //} - } - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 2) { - if (!IsUPeriodic && IsVPeriodic) { - if (j != 0) { - _coeffDerivUU[j][k] *= 2.; - } - } - if (IsUPeriodic && !IsVPeriodic) { - if (k != 0) { - _coeffDerivVV[j][k] *= 2.; - _coeffDerivUV[j][k] *= 2.; - } - } - } - } - } - } - // Initialize interpolation variables - _tmpCoeff = std::vector< std::complex<double> >(_vM); - _tmpInterp = std::vector< std::complex<double> >(_uM); -} - -BlendedPatch::~BlendedPatch() -{ - for(int j = 0; j < _uM; j++) - delete [] _coeffData[j]; - delete [] _coeffData; - - if(_coeffDerivU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivU[j]; - delete [] _coeffDerivU; - } - if(_coeffDerivV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivV[j]; - delete [] _coeffDerivV; - } - if(_coeffDerivUU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUU[j]; - delete [] _coeffDerivUU; - } - if(_coeffDerivVV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivVV[j]; - delete [] _coeffDerivVV; - } - if(_coeffDerivUV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUV[j]; - delete [] _coeffDerivUV; - } -} - -int BlendedPatch::_forwardSize = 0; -int BlendedPatch::_backwardSize = 0; -fftw_plan BlendedPatch::_forwardPlan; -fftw_plan BlendedPatch::_backwardPlan; -fftw_complex *BlendedPatch::_forwardData = 0; -fftw_complex *BlendedPatch::_backwardData = 0; - -void BlendedPatch::_SetForwardPlan(int n) -{ - if(n != _forwardSize){ - if(_forwardSize){ - fftw_destroy_plan(_forwardPlan); - fftw_free(_forwardData); - } - _forwardSize = n; - _forwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize); - _forwardPlan = - fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData, - FFTW_FORWARD, FFTW_ESTIMATE); - } -} - -void BlendedPatch::_SetBackwardPlan(int n) -{ - if(n != _backwardSize){ - if(_backwardSize){ - fftw_destroy_plan(_backwardPlan); - fftw_free(_backwardData); - } - _backwardSize = n; - _backwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize); - _backwardPlan = - fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData, - FFTW_BACKWARD, FFTW_ESTIMATE); - } -} - -void BlendedPatch::_ForwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring the last element of - // fftData, which should just be the periodic extension) - _SetForwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _forwardData[i][0] = fftData[i].real(); - _forwardData[i][1] = fftData[i].imag(); - } - - // Perform forward FFT - fftw_execute(_forwardPlan); - - // Copy data back into fftData and scale by 1/(n - 1) - double s = 1. / (double)(n - 1); - for(int i = 0; i < n - 1; i++) - fftData[i] = - s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]); -} - -void BlendedPatch::_BackwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring last element of fftData) - _SetBackwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _backwardData[i][0] = fftData[i].real(); - _backwardData[i][1] = fftData[i].imag(); - } - - // Perform backward FFT - fftw_execute(_backwardPlan); - - // Copy data back into fftData - for(int i = 0; i < n - 1; i++) - fftData[i] = - std::complex<double>(_backwardData[i][0], _backwardData[i][1]); - - // Fill in last element with copy of first element - fftData[n - 1] = fftData[0]; -} - -void BlendedPatch::_ProcessSeriesCoeff() -{ - _coeffData = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++) { - _coeffData[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++) - _coeffData[j][k] = 0.; - } - if (IsUPeriodic) { - std::vector<double> u(_uM), v(_vM + 1); - for (int j = 0; j < _uM; j++) - u[j] = (double)j / (double)(_uM-1); - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [_uM]; - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM - 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - - double X,Y,Z,pX,pY,pZ,nX,nY,nZ; - F(u[j],0.5 * cos(M_PI * v[k]) + 0.5,X,Y,Z); - patch_->GetProjectionSurface()-> - F(patch_->RescaleU(u[j]), - patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),pX,pY,pZ); - patch_->GetProjectionSurface()->GetUnitNormal - (patch_->RescaleU(u[j]), - patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ); - dataV[k] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ; - - //dataV[k] = (0.5 * cos(M_PI * u[j]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5); - } - - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM -k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - - for (int k = 0; k < _vM; k++) { - dataU[k][_uM - 1] = dataU[k][0]; - _ForwardFft(_uM, dataU[k]); - } - - for (int j = _uMLower; j <= _uMUpper; j++) { - for (int k = 0; k < _vM; k++) - if ((j == _uMLower) || (j == _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.; - else if ((j >= 0) && (j < _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][j]; - else - _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1]; - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } - else if (IsVPeriodic) { - std::vector<double> u(_uM + 1), v(_vM); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM; j++) - v[j] = (double)j / (double)(_vM-1); - - std::complex<double> **dataV = new std::complex<double> *[_uM]; - for (int j = 0; j < _uM; j++) - dataV[j] = new std::complex<double> [_vM]; - std::complex<double> *dataU = new std::complex<double>[2*_uM + 1]; - for (int k = 0; k < _vM - 1; k++) { - for (int j = 0; j < _uM + 1; j++) { - double X,Y,Z,pX,pY,pZ,nX,nY,nZ; - F(0.5 * cos(M_PI * u[j]) + 0.5,v[k],X,Y,Z); - patch_->GetProjectionSurface()-> - F(patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5), - patch_->RescaleV(v[k]),pX,pY,pZ); - patch_->GetProjectionSurface()->GetUnitNormal - (patch_->RescaleU(u[j]), - patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ); - dataU[j] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ; - } - for (int j = 1; j < _uM+1; j++) - dataU[_uM + j] = dataU[_uM -j]; - _BackwardFft(2*_uM + 1, dataU); - dataV[0][k] = 0.5 * dataU[0] / (double)_uM; - for (int j=1; j<_uM-1; j++) - dataV[j][k] = dataU[j] / (double)_uM; - dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM; - } - for (int j = 0; j < _uM; j++) { - dataV[j][_uM - 1] = dataV[j][0]; - _ForwardFft(_vM, dataV[j]); - } - for (int k = _vMLower; k <= _vMUpper; k++) { - //for (int j = 0; j < _uM - 1; j++) { - for (int j = 0; j < _uM; j++) - if ((k == _vMLower) || (k == _vMUpper)) - _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.; - else if ((j >= 0) && (j < _vMUpper)) - _coeffData[j][_uMUpper + k] = dataV[j][k]; - else - _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1]; - } - for (int j = 0; j < _uM; j++) - delete [] dataV[j]; - delete [] dataV; - delete [] dataU; - } - else { - std::vector<double> u(_uM + 1), v(_vM + 1); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [2*_uM + 1]; - - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM + 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - /* - double X,Y,Z,pX,pY,pZ,nX,nY,nZ; - _F(0.5 * cos(M_PI * u[j]) + 0.5,0.5 * cos(M_PI * v[k]) + 0.5,X,Y,Z); - patch_->GetProjectionSurface()-> - F(patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5), - patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),pX,pY,pZ); - patch_->GetProjectionSurface()->GetUnitNormal - (patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5), - patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ); - dataV[k] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ; - */ - //dataV[k] = (0.5 * cos(M_PI * u[j]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5); - dataV[k] = (0.5 * cos(M_PI * v[k]) + 0.5); - } - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM - k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - - /* - for (int k = 0; k < _vM; k++) - for (int j = 0; j < _uM + 1; j++) - printf("%d %d -> %g %g\n",k,j,dataU[k][j].real(),dataU[k][j].imag()); - */ - - for (int k = 0; k < _vM; k++) { - for (int j = 1; j < _uM+1; j++) { - dataU[k][_uM + j] = dataU[k][_uM - k]; - } - _BackwardFft(2*_uM + 1, dataU[k]); - } - - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if ((j == 0) || (j == _uM - 1)) - _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM; - else - _coeffData[j][k] = dataU[k][j]/ (double)_uM; - } - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } -} - -std::complex<double> BlendedPatch:: -_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x) -{ - int _polyOrder = _coeff.size()-1; - std::complex<double> out = 0.; - - out = x * _coeff[_polyOrder]; - for (int i = _polyOrder - 1; i > 0; i--) - out = x * (out + _coeff[i]); - out = out + _coeff[0]; - - return out; -} - -std::complex<double> BlendedPatch:: - _Interpolate(double u, double v, int uDer, int vDer) -{ - //Msg::Info("%d %d %d",uDer,vDer,_derivative); - if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) || - ((uDer==1 || vDer==1) && !(_derivative & 1)) || - (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) { - Msg::Error("Derivative data not available: check contructor call %d %d %d", - uDer,vDer,_derivative); - return 0.; - } - - double epsilon = 1e-12; - if (u < 0. - epsilon || u > 1. + epsilon) { - Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) " - "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); - } - std::vector<double> uT(_uM,0.); - std::vector<double> vT(_vM,0.); - if (!IsUPeriodic) { - for (int j = 0; j < _uM; j++) - if (j == 0) - uT[j] = 1.; - else if (j == 1) - uT[j] = 2. * u - 1; - else - uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2]; - } - if (!IsVPeriodic) { - for (int k = 0; k < _vM; k++) - if (k == 0) - vT[k] = 1.; - else if (k == 1) - vT[k] = 2. * v - 1.; - else - vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2]; - } - // Interpolate to find value at (u,v) - for(int j = 0; j < _uM; j++){ - _tmpInterp[j] = 0.; - for(int k = 0; k < _vM; k++){ - std::complex<double> tmp; - if(uDer == 0 && vDer == 0) - tmp = _coeffData[j][k]; - else if(uDer == 1 && vDer == 0) - tmp = _coeffDerivU[j][k]; - else if(uDer == 0 && vDer == 1) - tmp = _coeffDerivV[j][k]; - else if(uDer == 2 && vDer == 0) - tmp = _coeffDerivUU[j][k]; - else if(uDer == 0 && vDer == 2) - tmp = _coeffDerivVV[j][k]; - else - tmp = _coeffDerivUV[j][k]; - _tmpCoeff[k] = tmp; - } - if (IsVPeriodic) { - std::complex<double> y(cos(2 * M_PI * v / _periodV), - sin(2 * M_PI * v / _periodV)); - _tmpInterp[j] = _PolyEval(_tmpCoeff, y); - _tmpInterp[j] *= std::complex<double> - (cos(2 * M_PI * _vMLower * v / _periodV), - sin(2 * M_PI * _vMLower * v / _periodV)); - } - else { - //printf("i was here 0\n"); - for(int k = 0; k < _vM; k++) - _tmpInterp[j] += _tmpCoeff[k] * vT[k]; - } - } - if (IsUPeriodic) { - std::complex<double> x(cos(2 * M_PI * u / _periodU), - sin(2 * M_PI * u / _periodU)); - return _PolyEval(_tmpInterp, x) * std::complex<double> - (cos(2 * M_PI * _uMLower * u / _periodU), - sin(2 * M_PI * _uMLower * u / _periodU)); - } - else { - std::complex<double> tmp = 0.; - for(int j = 0; j < _uM; j++) - tmp += _tmpInterp[j] * uT[j]; - return tmp; - } -} - -void BlendedPatch::F -(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; - - for (int otherPatchTag_ = 0;otherPatchTag_ < nPatches_; otherPatchTag_++) { - double xx, yy, zz; - if (blendOp_->E(patchTag_,otherPatchTag_,u,v,xx,yy,zz)) { - double uu,vv; - blendOp_->GetPatch(otherPatchTag_)->Inverse(xx,yy,zz,uu,vv); - double lambda = blendOp_->GetBlendingPou(otherPatchTag_,uu,vv); - x += lambda * xx; - y += lambda * yy; - z += lambda * zz; - } - } -} - -bool BlendedPatch::Inverse -(double x, double y, double z, double &u, double &v) -{ - bool found = false; - int projectionSurfaceTag_; - for (int otherPatchTag_ = 0;otherPatchTag_ < nPatches_; otherPatchTag_++) { - if (otherPatchTag_ != patchTag_) { - if (blendOp_->DoPatchesOverlap(patchTag_,otherPatchTag_)) { - if (blendOp_-> - IsPointInIntersectionBoundingBox(patchTag_,otherPatchTag_,x,y,z)) { - projectionSurfaceTag_ = blendOp_-> - GetProjectionSurfaceTagForOverlap(patchTag_,otherPatchTag_); - found = true; - break; - } - } - } - } - if (found) { - found = blendOp_->GetProjectionSurface(projectionSurfaceTag_)-> - OrthoProjectionOnSurface(x,y,z,u,v); - double xx,yy,zz; - blendOp_->GetProjectionSurface(projectionSurfaceTag_)->F(u,v,xx,yy,zz); - double d[3]; - d[0] = x - xx; - d[1] = y - yy; - d[2] = z - zz; - double abs_d = 0.; - for (int l=0;l<3;l++) - abs_d += d[l] * d[l]; - abs_d = std::sqrt(abs_d); - for (int l=0;l<3;l++) - d[l] /= abs_d; - found = blendOp_->GetPointOnPatch(patchTag_,d,x,y,z); - } - found = blendOp_->GetPatch(patchTag_)->Inverse(x,y,z,u,v); -} - -/* -void BlendedPatch::F -(double u, double v, double &x, double &y, double &z) -{ - if (_derivative) { - double px, py, pz, nx, ny, nz, d; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - - u = patch_->UnscaleU(u); - v = patch_->UnscaleV(v); - - d = _Interpolate(u, v).real(); - - x = px + d * nx; - y = py + d * ny; - z = pz + d * nz; - } - else - _F(u,v,x,y,z); -} - -bool BlendedPatch:: -Inverse(double x,double y,double z,double &u,double &v) -{ - bool result; - - if (_derivative) { - result = patch_->GetProjectionSurface()-> - OrthoProjectionOnSurface(x,y,z,u,v); - - u = patch_->UnscaleU(u); - v = patch_->UnscaleV(v); - - double tol = 1.e-12; - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - result = true; - else - result = false; - } - else - result = _Inverse(x,y,z,u,v); - - return result; -} -*/ - -void BlendedPatch:: -Dfdu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu); - patch_->GetProjectionSurface()->Dndu(u,v,nxu, nyu, nzu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - - x = pxu + du * nx + d * nxu; - y = pyu + du * ny + d * nyu; - z = pzu + du * nz + d * nzu; -} - -void BlendedPatch:: -Dfdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv); - patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - - x = pxv + dv * nx + d * nxv; - y = pyv + dv * ny + d * nyv; - z = pzv + dv * nz + d * nzv; -} - -void BlendedPatch:: -Dfdfdudu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu); - patch_->GetProjectionSurface()->Dndu(u,v,nxu,nyu,nzu); - patch_->GetProjectionSurface()->Dfdfdudu(u,v,pxuu,pyuu,pzuu); - patch_->GetProjectionSurface()->Dndndudu(u,v,nxuu,nyuu,nzuu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - duu = _Interpolate(u, v, 2, 0).real(); - - x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu; - y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu; - z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu; -} - -void BlendedPatch:: -Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv); - patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv); - patch_->GetProjectionSurface()->Dfdfdvdv(u,v,pxvv,pyvv,pzvv); - patch_->GetProjectionSurface()->Dndndvdv(u,v,nxvv,nyvv,nzvv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - dvv = _Interpolate(u, v, 0, 2).real(); - - x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv; - y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv; - z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv; -} - -void BlendedPatch:: -Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv; - - u = patch_->RescaleU(u); - v = patch_->RescaleV(v); - - patch_->GetProjectionSurface()->F(u,v,px,py,pz); - patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz); - patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu); - patch_->GetProjectionSurface()->Dndu(u,v,nxu,nyu,nzu); - patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv); - patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv); - patch_->GetProjectionSurface()->Dfdfdudv(u,v,pxuv,pyuv,pzuv); - patch_->GetProjectionSurface()->Dndndudv(u,v,nxuv,nyuv,nzuv); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - dv = _Interpolate(u, v, 1, 0).real(); - duv = _Interpolate(u, v, 1, 1).real(); - - x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv; - y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv; - z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv; -} - -double BlendedPatch::GetPou(double u, double v) -{ - double pouU, pouV; - - if (patch_->IsHardEdge(3)) - pouU = OneSidedPartitionOfUnity(0.,1.,u); - else if (patch_->IsHardEdge(1)) - pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u); - else - pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.); - - if (patch_->IsHardEdge(0)) - pouV = OneSidedPartitionOfUnity(0.,1.,v); - else if (patch_->IsHardEdge(2)) - pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v); - else - pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.); - - return pouU * pouV; -} diff --git a/contrib/FourierModel/BlendedPatch.h b/contrib/FourierModel/BlendedPatch.h deleted file mode 100755 index 7fa138168d..0000000000 --- a/contrib/FourierModel/BlendedPatch.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef _BLENDED_PATCH_H_ -#define _BLENDED_PATCH_H_ - -#include <fftw3.h> -#include "Message.h" -#include "Patch.h" -#include "BlendOperator.h" -#include "PartitionOfUnity.h" - -namespace FM { - -class BlendedPatch { - private: - Patch* patch_; - BlendOperator* blendOp_; - - int nPatches_; - int patchTag_; - - bool IsUPeriodic, IsVPeriodic; - - // bitfield telling if we also interpolate the derivative(s) - int _derivative; - // Number of Modes in reprocessed Fourier/Chebyshev series - int _uM, _vM; - // Period Information - double _periodU, _periodV; - // Limits in the series - int _uMLower, _uMUpper, _vMLower, _vMUpper; - // data (and its first 2 derivatives) - std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV; - std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV; - // temporary interpolation variables - std::vector< std::complex<double> > _tmpCoeff, _tmpInterp; - // polynomial evaluator - std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff, - std::complex<double> x); - // interpolation wrapper - std::complex<double> _Interpolate(double u,double v,int uDer=0,int vDer=0); - // other internal functions - void _ProcessSeriesCoeff(); - // persistent fftw data (used to avoid recomputing the FFTW plans - // and reallocating memory every time) - static int _forwardSize, _backwardSize; - static fftw_plan _forwardPlan, _backwardPlan; - static fftw_complex *_forwardData, *_backwardData; - void _SetForwardPlan(int n); - void _SetBackwardPlan(int n); - // This routine computes the forward FFT (ignoring the last element - // of the data) - void _ForwardFft(int n, std::complex<double> *fftData); - // This routine computes the inverse FFT (ignoring the last element - // in the array), returns values in entire array (by using the - // periodic extension) - void _BackwardFft(int n, std::complex<double> *fftData); - - protected: - - public: - BlendedPatch(Patch* patch, BlendOperator* blendOp); - ~BlendedPatch(); - - double GetPou(double u, double v); - - void F - (double u, double v, double &x, double &y, double &z); - - bool Inverse - (double x,double y,double z,double &u,double &v); - - void Dfdu - (double u, double v, double &x, double &y, double &z); - - void Dfdv - (double u, double v, double &x, double &y, double &z); - - void Dfdfdudu - (double u,double v,double &x,double &y,double &z); - - void Dfdfdudv - (double u,double v,double &x,double &y,double &z); - - void Dfdfdvdv - (double u,double v,double &x,double &y,double &z); - - void Dndu - (double u, double v, double &x, double &y, double &z); - - void Dndv - (double u, double v, double &x, double &y, double &z); - - void GetUnitNormal - (double u,double v,double &x,double &y,double &z); - - void GetNormal - (double u, double v, double &x, double &y, double &z); - - int GetTag - () { return patchTag_; } -}; - -} - -#endif diff --git a/contrib/FourierModel/ContinuationPatch.cpp b/contrib/FourierModel/ContinuationPatch.cpp deleted file mode 100644 index 6ac87cbddd..0000000000 --- a/contrib/FourierModel/ContinuationPatch.cpp +++ /dev/null @@ -1,933 +0,0 @@ -#include <math.h> -#include "Message.h" -#include "ContinuationPatch.h" - -using namespace FM; - -ContinuationPatch::ContinuationPatch -(PatchInfo* PI, ProjectionSurface* ps) - : Patch(),_coeffOriginalData(0),_coeffData(0),_coeffDerivU(0), - _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0) -{ - _PI = PI; - _tag = _PI->tag; - _derivative = _PI->derivative; - _recompute = _PI->recompute; - - SetProjectionSurface(ps); - - _uMin = _PI->uMin; - _uMax = _PI->uMax; - _vMin = _PI->vMin; - _vMax = _PI->vMax; - - if (_ps->IsUPeriodic()) - _periodicityU = 1; - if (_ps->IsVPeriodic()) - _periodicityV = 1; - - for (int i = 0; i < 4; i++) - _hardEdge[i] = _PI->hardEdge[i]; - - if (_ps->IsUPeriodic()) - _periodU = 1.; - else - _periodU = 2.; - - if (_ps->IsVPeriodic()) - _periodV = 1.; - else - _periodV = 2.; - - _uModes = _PI->nModes[0]; - _vModes = _PI->nModes[1]; - - if ((_uModes % 2) == 0) { - _uModesLower = - _uModes/2; - _uModesUpper = _uModes/2 - 1; - } - else { - _uModesLower = - (_uModes - 1)/2; - _uModesUpper = (_uModes - 1)/2; - } - if ((_vModes % 2) == 0) { - _vModesLower = - _vModes/2; - _vModesUpper = _vModes/2 - 1; - } - else { - _vModesLower = - (_vModes - 1)/2; - _vModesUpper = (_vModes - 1)/2; - } - - _uM = _PI->nM[0]; - _vM = _PI->nM[1]; - - if (IsUPeriodic()) { - if ((_uM % 2) == 0) { - _uMLower = - _uM/2; - _uMUpper = _uM/2 - 1; - } - else { - _uMLower = - (_uM - 1)/2; - _uMUpper = (_uM - 1)/2; - } - } - else { - _uMLower = 0; - _uMUpper = _uM; - } - if (IsVPeriodic()) { - if ((_vM % 2) == 0) { - _vMLower = - _vM/2; - _vMUpper = _vM/2 - 1; - } - else { - _vMLower = - (_vM - 1)/2; - _vMUpper = (_vM - 1)/2; - } - } - else { - _vMLower = 0; - _vMUpper = _vM; - } - - // Initialize interpolation variables - _tmpCoeff = std::vector< std::complex<double> >(_vM); - _tmpInterp = std::vector< std::complex<double> >(_uM); - - // Initialize Data - _coeffOriginalData = new std::complex<double>*[_uModes]; - for(int j = 0; j < _uModes; j++){ - _coeffOriginalData[j] = new std::complex<double>[_vModes]; - for(int k = 0; k < _vModes; k++) - _coeffOriginalData[j][k] = _PI->coeffFourier[j][k]; - } - - // Initialize interpolation variables - _tmpOrigCoeff = std::vector< std::complex<double> >(_vModes); - _tmpOrigInterp = std::vector< std::complex<double> >(_uModes); - - if (_derivative) { - // Initialize Chebyshev coefficients - _coeffData = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++) { - _coeffData[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++) - _coeffData[j][k] = 0.; - } - // Initialize Deriv and Deriv2 to zero - if(_derivative & 1){ - _coeffDerivU = new std::complex<double>*[_uM]; - _coeffDerivV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivU[j] = new std::complex<double>[_vM]; - _coeffDerivV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivU[j][k] = 0.; - _coeffDerivV[j][k] = 0.; - } - } - } - if(_derivative & 2){ - _coeffDerivUU = new std::complex<double>*[_uM]; - _coeffDerivVV = new std::complex<double>*[_uM]; - _coeffDerivUV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivUU[j] = new std::complex<double>[_vM]; - _coeffDerivVV[j] = new std::complex<double>[_vM]; - _coeffDerivUV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivUU[j][k] = 0.; - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - } - } - if (_recompute) { - _ReprocessSeriesCoeff(); - // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2 - std::complex<double> I(0., 1.); - for(int j = _uM - 1; j >= 0; j--){ - for(int k = _vM - 1; k >= 0; k--){ - if(_derivative & 1){ - if (IsUPeriodic()) { - int J = j+_uMLower; - _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffData[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivU[j][k] = - 2. * (double)(j + 1) * _coeffData[j + 1][k]; - else - _coeffDerivU[j][k] = _coeffDerivU[j + 2][k] + - 2. * (double)(j + 1) * _coeffData[j + 1][k]; - } - if (IsVPeriodic()) { - int K = k+_vMLower; - _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffData[j][k]; - } - else { - if (k == _vM - 1) - _coeffDerivV[j][k] = 0.; - else if (k == _vM - 2) - _coeffDerivV[j][k] = - 2. * (double)(k + 1) * _coeffData[j][k + 1]; - else - _coeffDerivV[j][k] = _coeffDerivV[j][k + 2] + - 2. * (double)(k + 1) * _coeffData[j][k + 1]; - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 1) { - if (!IsUPeriodic()) { - if (j != 0) { - _coeffDerivU[j][k] *= 2.; - } - } - if (!IsVPeriodic()) { - if (k != 0) { - _coeffDerivV[j][k] *= 2.; - } - } - } - } - } - - for(int j = _uM - 1; j >= 0; j--) { - for(int k = _vM - 1; k >= 0; k--) { - if(_derivative & 2) { - if (IsUPeriodic()) { - int J = j+_uMLower; - _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffDerivU[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivUU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivUU[j][k] = 2. * (double)(j + 1) * - _coeffDerivU[j + 1][k]; - else - _coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] + - 2. * (double)(j + 1) * _coeffDerivU[j + 1][k]; - } - if (IsVPeriodic()) { - int K = k+_vMLower; - _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivV[j][k]; - _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivU[j][k]; - } - else { - if (k == _vM - 1) { - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - else if (k == _vM - 2) { - _coeffDerivVV[j][k] = 2. * (double)(k + 1) * - _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = 2. * (double)(k + 1) * - _coeffDerivU[j][k + 1]; - } - else { - _coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivU[j][k + 1]; - } - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 2) { - if (!IsUPeriodic() && IsVPeriodic()) { - if (j != 0) { - _coeffDerivUU[j][k] *= 2.; - } - } - if (IsUPeriodic() && !IsVPeriodic()) { - if (k != 0) { - _coeffDerivVV[j][k] *= 2.; - _coeffDerivUV[j][k] *= 2.; - } - } - } - } - } - } - else { - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - _coeffData[j][k] = _PI->coeffCheby[j][k]; - _coeffDerivU[j][k] = _PI->coeffDerivU[j][k]; - _coeffDerivV[j][k] = _PI->coeffDerivV[j][k]; - _coeffDerivUU[j][k] = _PI->coeffDerivUU[j][k]; - _coeffDerivUV[j][k] = _PI->coeffDerivUV[j][k]; - _coeffDerivVV[j][k] = _PI->coeffDerivVV[j][k]; - } - } - } - } -} - -ContinuationPatch::~ContinuationPatch() -{ - for(int j = 0; j < _uModes; j++) - delete [] _coeffOriginalData[j]; - delete [] _coeffOriginalData; - - for(int j = 0; j < _uM; j++) - delete [] _coeffData[j]; - delete [] _coeffData; - - if(_coeffDerivU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivU[j]; - delete [] _coeffDerivU; - } - if(_coeffDerivV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivV[j]; - delete [] _coeffDerivV; - } - if(_coeffDerivUU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUU[j]; - delete [] _coeffDerivUU; - } - if(_coeffDerivVV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivVV[j]; - delete [] _coeffDerivVV; - } - if(_coeffDerivUV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUV[j]; - delete [] _coeffDerivUV; - } -} - -int ContinuationPatch::_forwardSize = 0; -int ContinuationPatch::_backwardSize = 0; -fftw_plan ContinuationPatch::_forwardPlan; -fftw_plan ContinuationPatch::_backwardPlan; -fftw_complex *ContinuationPatch::_forwardData = 0; -fftw_complex *ContinuationPatch::_backwardData = 0; - -void ContinuationPatch::_SetForwardPlan(int n) -{ - if(n != _forwardSize){ - if(_forwardSize){ - fftw_destroy_plan(_forwardPlan); - fftw_free(_forwardData); - } - _forwardSize = n; - _forwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize); - _forwardPlan = - fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData, - FFTW_FORWARD, FFTW_ESTIMATE); - } -} - -void ContinuationPatch::_SetBackwardPlan(int n) -{ - if(n != _backwardSize){ - if(_backwardSize){ - fftw_destroy_plan(_backwardPlan); - fftw_free(_backwardData); - } - _backwardSize = n; - _backwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize); - _backwardPlan = - fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData, - FFTW_BACKWARD, FFTW_ESTIMATE); - } -} - -void ContinuationPatch::_ForwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring the last element of - // fftData, which should just be the periodic extension) - _SetForwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _forwardData[i][0] = fftData[i].real(); - _forwardData[i][1] = fftData[i].imag(); - } - - // Perform forward FFT - fftw_execute(_forwardPlan); - - // Copy data back into fftData and scale by 1/(n - 1) - double s = 1. / (double)(n - 1); - for(int i = 0; i < n - 1; i++) - fftData[i] = - s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]); -} - -void ContinuationPatch::_BackwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring last element of fftData) - _SetBackwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _backwardData[i][0] = fftData[i].real(); - _backwardData[i][1] = fftData[i].imag(); - } - - // Perform backward FFT - fftw_execute(_backwardPlan); - - // Copy data back into fftData - for(int i = 0; i < n - 1; i++) - fftData[i] = - std::complex<double>(_backwardData[i][0], _backwardData[i][1]); - - // Fill in last element with copy of first element - fftData[n - 1] = fftData[0]; -} - -void ContinuationPatch::_ReprocessSeriesCoeff() -{ - if (IsUPeriodic() && IsVPeriodic()) { - int uShift = (_uM-_uModes)%2 == 0 ? (_uM-_uModes)/2 : (_uM-_uModes)/2 + 1; - int vShift = (_vM-_vModes)%2 == 0 ? (_vM-_vModes)/2 : (_vM-_vModes)/2 + 1; - for (int j = 0; j < _uModes; j++) - for (int k = 0; k < _vModes; k++) - _coeffData[uShift + j][vShift + k] = _coeffOriginalData[j][k]; - } - else if (IsUPeriodic()) { - std::vector<double> u(_uM), v(_vM + 1); - for (int j = 0; j < _uM; j++) - u[j] = (double)j / (double)(_uM-1); - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [_uM]; - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM - 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - //dataV[k] = 1.; - //dataV[k] = 2. * cos(M_PI * v[k]) * cos(M_PI * v[k]) - 1.; - //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5) - 1.; - //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5) * cos(2 * M_PI * u[j]); - //dataV[k] = cos(0.5 * cos(M_PI * v[k]) + 0.5) * - //cos(2 * M_PI * u[j]); - dataV[k] = _Interpolate(u[j],0.5 * cos(M_PI * v[k]) + 0.5); - } - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM -k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - for (int k = 0; k < _vM; k++) { - dataU[k][_uM - 1] = dataU[k][0]; - _ForwardFft(_uM, dataU[k]); - } - for (int j = _uMLower; j <= _uMUpper; j++) { - for (int k = 0; k < _vM; k++) - if ((j == _uMLower) || (j == _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.; - else if ((j >= 0) && (j < _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][j]; - else - _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1]; - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } - else if (IsVPeriodic()){ - std::vector<double> u(_uM + 1), v(_vM); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM; j++) - v[j] = (double)j / (double)(_vM-1); - - std::complex<double> **dataV = new std::complex<double> *[_uM]; - for (int j = 0; j < _uM; j++) - dataV[j] = new std::complex<double> [_vM]; - std::complex<double> *dataU = new std::complex<double>[2*_uM + 1]; - for (int k = 0; k < _vM - 1; k++) { - for (int j = 0; j < _uM + 1; j++) { - //dataU[j] = 1.; - //dataU[j] = 2. * cos(M_PI * u[j]) * cos(M_PI * u[j]); - dataU[j] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,v[k]); - } - for (int j = 1; j < _uM+1; j++) - dataU[_uM + j] = dataU[_uM -j]; - _BackwardFft(2*_uM + 1, dataU); - dataV[0][k] = 0.5 * dataU[0] / (double)_uM; - for (int j=1; j<_uM-1; j++) - dataV[j][k] = dataU[j] / (double)_uM; - dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM; - } - for (int j = 0; j < _uM; j++) { - dataV[j][_uM - 1] = dataV[j][0]; - _ForwardFft(_vM, dataV[j]); - } - for (int k = _vMLower; k <= _vMUpper; k++) { - //for (int j = 0; j < _uM - 1; j++) { - for (int j = 0; j < _uM; j++) - if ((k == _vMLower) || (k == _vMUpper)) - _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.; - else if ((j >= 0) && (j < _vMUpper)) - _coeffData[j][_uMUpper + k] = dataV[j][k]; - else - _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1]; - } - for (int j = 0; j < _uM; j++) - delete [] dataV[j]; - delete [] dataV; - delete [] dataU; - } - else { - std::vector<double> u(_uM + 1), v(_vM + 1); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [2*_uM + 1]; - - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM + 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - dataV[k] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5, - 0.5 * cos(M_PI * v[k]) + 0.5); - } - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM - k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - - for (int k = 0; k < _vM; k++) { - for (int j = 1; j < _uM+1; j++) { - dataU[k][_uM + j] = dataU[k][_uM - k]; - } - _BackwardFft(2*_uM + 1, dataU[k]); - } - - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if ((j == 0) || (j == _uM - 1)) - _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM; - else - _coeffData[j][k] = dataU[k][j]/ (double)_uM; - } - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } -} - -std::complex<double> ContinuationPatch:: -_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x) -{ - int _polyOrder = _coeff.size()-1; - std::complex<double> out = 0.; - - out = x * _coeff[_polyOrder]; - for (int i = _polyOrder - 1; i > 0; i--) - out = x * (out + _coeff[i]); - out = out + _coeff[0]; - - return out; -} - -std::complex<double> ContinuationPatch:: - _Interpolate(double u, double v) -{ - double epsilon = 1e-12; - if (u < 0. - epsilon || u > 1. + epsilon || - v < 0. - epsilon || v > 1. + epsilon) { - Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) " - "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); - } - - // Interpolate to find value at (u,v) - for(int j = 0; j < _uModes; j++){ - for(int k = 0; k < _vModes; k++) { - _tmpOrigCoeff[k] = _coeffOriginalData[j][k]; - } - std::complex<double> y(cos(2 * M_PI * v / _periodV), - sin(2 * M_PI * v / _periodV)); - _tmpOrigInterp[j] = _PolyEval(_tmpOrigCoeff, y); - _tmpOrigInterp[j] *= std::complex<double> - (cos(2 * M_PI * _vModesLower * v / _periodV), - sin(2 * M_PI * _vModesLower * v / _periodV)); - } - std::complex<double> x(cos(2 * M_PI * u / _periodU), - sin(2 * M_PI * u / _periodU)); - return _PolyEval(_tmpOrigInterp, x) * std::complex<double> - (cos(2 * M_PI * _uModesLower * u / _periodU), - sin(2 * M_PI * _uModesLower * u / _periodU)); -} - -std::complex<double> ContinuationPatch:: - _Interpolate(double u, double v, int uDer, int vDer) -{ - //Msg::Info("%d %d %d",uDer,vDer,_derivative); - if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) || - ((uDer==1 || vDer==1) && !(_derivative & 1)) || - (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) { - Msg::Error("Derivative data not available: check contructor call %d %d %d", - uDer,vDer,_derivative); - return 0.; - } - - double epsilon = 1e-12; - if (u < 0. - epsilon || u > 1. + epsilon) { - Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) " - "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); - } - std::vector<double> uT(_uM,0.); - std::vector<double> vT(_vM,0.); - if (!IsUPeriodic()) { - for (int j = 0; j < _uM; j++) - if (j == 0) - uT[j] = 1.; - else if (j == 1) - uT[j] = 2. * u - 1; - else - uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2]; - } - if (!IsVPeriodic()) { - for (int k = 0; k < _vM; k++) - if (k == 0) - vT[k] = 1.; - else if (k == 1) - vT[k] = 2. * v - 1.; - else - vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2]; - } - // Interpolate to find value at (u,v) - for(int j = 0; j < _uM; j++){ - _tmpInterp[j] = 0.; - for(int k = 0; k < _vM; k++){ - //printf("i was here %d %d\n",j,k); - std::complex<double> tmp; - if(uDer == 0 && vDer == 0) - tmp = _coeffData[j][k]; - else if(uDer == 1 && vDer == 0) - tmp = _coeffDerivU[j][k]; - else if(uDer == 0 && vDer == 1) - tmp = _coeffDerivV[j][k]; - else if(uDer == 2 && vDer == 0) - tmp = _coeffDerivUU[j][k]; - else if(uDer == 0 && vDer == 2) - tmp = _coeffDerivVV[j][k]; - else - tmp = _coeffDerivUV[j][k]; - _tmpCoeff[k] = tmp; - } - //printf("i was here 00\n"); - if (IsVPeriodic()) { - std::complex<double> y(cos(2 * M_PI * v / _periodV), - sin(2 * M_PI * v / _periodV)); - _tmpInterp[j] = _PolyEval(_tmpCoeff, y); - _tmpInterp[j] *= std::complex<double> - (cos(2 * M_PI * _vMLower * v / _periodV), - sin(2 * M_PI * _vMLower * v / _periodV)); - } - else { - //printf("i was here 0\n"); - for(int k = 0; k < _vM; k++) - _tmpInterp[j] += _tmpCoeff[k] * vT[k]; - } - } - //printf("i was here\n"); - if (IsUPeriodic()) { - std::complex<double> x(cos(2 * M_PI * u / _periodU), - sin(2 * M_PI * u / _periodU)); - return _PolyEval(_tmpInterp, x) * std::complex<double> - (cos(2 * M_PI * _uMLower * u / _periodU), - sin(2 * M_PI * _uMLower * u / _periodU)); - } - else { - std::complex<double> tmp = 0.; - for(int j = 0; j < _uM; j++) - tmp += _tmpInterp[j] * uT[j]; - return tmp; - } -} - -void ContinuationPatch:: -F(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - - d = _Interpolate(u, v).real(); - - x = px + d * nx; - y = py + d * ny; - z = pz + d * nz; -} - -bool ContinuationPatch:: -Inverse(double x,double y,double z,double &u,double &v) -{ - bool result = _ps->OrthoProjectionOnSurface(x,y,z,u,v); - - u = UnscaleU(u); - v = UnscaleV(v); - - double tol = 1.e-12; - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - result = true; - else - result = false; - - return result; -} - -void ContinuationPatch:: -Dfdu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu, nyu, nzu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - - x = pxu + du * nx + d * nxu; - y = pyu + du * ny + d * nyu; - z = pzu + du * nz + d * nzu; -} - -void ContinuationPatch:: -Dfdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - - x = pxv + dv * nx + d * nxv; - y = pyv + dv * ny + d * nyv; - z = pzv + dv * nz + d * nzv; -} - -void ContinuationPatch:: -Dfdfdudu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu,nyu,nzu); - _ps->Dfdfdudu(u,v,pxuu,pyuu,pzuu); - _ps->Dndndudu(u,v,nxuu,nyuu,nzuu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - duu = _Interpolate(u, v, 2, 0).real(); - - x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu; - y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu; - z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu; -} - -void ContinuationPatch:: -Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - _ps->Dfdfdvdv(u,v,pxvv,pyvv,pzvv); - _ps->Dndndvdv(u,v,nxvv,nyvv,nzvv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - dvv = _Interpolate(u, v, 0, 2).real(); - - x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv; - y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv; - z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv; -} - -void ContinuationPatch:: -Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu,nyu,nzu); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - _ps->Dfdfdudv(u,v,pxuv,pyuv,pzuv); - _ps->Dndndudv(u,v,nxuv,nyuv,nzuv); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - dv = _Interpolate(u, v, 1, 0).real(); - duv = _Interpolate(u, v, 1, 1).real(); - - x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv; - y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv; - z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv; -} - -double ContinuationPatch::GetPou(double u, double v) -{ - double pouU, pouV; - - if (IsHardEdge(3)) - pouU = OneSidedPartitionOfUnity(0.,1.,u); - else if (IsHardEdge(1)) - pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u); - else - pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.); - - if (IsHardEdge(0)) - pouV = OneSidedPartitionOfUnity(0.,1.,v); - else if (IsHardEdge(2)) - pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v); - else - pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.); - - return pouU * pouV; -} - -void ContinuationPatch::Export(FILE *fp) -{ - double x,y,z; - - fprintf(fp, "%s\n", _ps->GetName().c_str()); - fprintf(fp, "%d\n", _ps->GetTag()); - _ps->GetOrigin(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE0(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE1(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetScale(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - fprintf(fp, "%d\n", _ps->GetNumParameters()); - for (int i = 0; i < _ps->GetNumParameters(); i++) - fprintf(fp, "%g\n",_ps->GetParameter(i)); - - fprintf(fp, "%s\n", "ContinuationPatch"); - fprintf(fp, "%d\n", _tag); - fprintf(fp, "%d\n", _derivative); - fprintf(fp, "%g %g\n", _uMin, _uMax); - fprintf(fp, "%g %g\n", _vMin, _vMax); - fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2], - _hardEdge[3]); - fprintf(fp, "%d %d\n", _uModes, _vModes); - for (int j = 0; j < _uModes; j++) { - for (int k = 0; k < _vModes; k++) { - fprintf(fp, "%g %g\n", _coeffOriginalData[j][k].real(), - _coeffOriginalData[j][k].imag()); - } - } - fprintf(fp, "%d\n", 0); - fprintf(fp, "%d %d\n", _uM, _vM); - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffData[j][k].real(), _coeffData[j][k].imag()); - } - } - if (_derivative) { - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivU[j][k].real(), - _coeffDerivU[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivV[j][k].real(), - _coeffDerivV[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivUU[j][k].real(), - _coeffDerivUU[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivUV[j][k].real(), - _coeffDerivUV[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivVV[j][k].real(), - _coeffDerivVV[j][k].imag()); - } - } - } -} diff --git a/contrib/FourierModel/ContinuationPatch.h b/contrib/FourierModel/ContinuationPatch.h deleted file mode 100644 index 2e536fdee4..0000000000 --- a/contrib/FourierModel/ContinuationPatch.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _CONTINUATION_PATCH_H_ -#define _CONTINUATION_PATCH_H_ - -#include <fftw3.h> -#include "Patch.h" -#include "FM_Info.h" -#include "PartitionOfUnity.h" - -namespace FM { - -// The base class for the patches -class ContinuationPatch : public Patch { - protected: - // Do we recompute - int _recompute; - // Number of Fourier Modes - int _uModes, _vModes; - // Number of Modes in reprocessed Fourier/Chebyshev series - int _uM, _vM; - // Period Information - double _periodU, _periodV; - // Limits of Fourier Series - int _uModesLower, _uModesUpper, _vModesLower, _vModesUpper; - // Limits in the new series - int _uMLower, _uMUpper, _vMLower, _vMUpper; - // data (and its first 2 derivatives) - std::complex<double> **_coeffOriginalData; - std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV; - std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV; - // temporary interpolation variables - std::vector< std::complex<double> > _tmpOrigCoeff, _tmpOrigInterp; - std::vector< std::complex<double> > _tmpCoeff, _tmpInterp; - // polynomial evaluator - std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff, - std::complex<double> x); - // interpolation wrapper - std::complex<double> _Interpolate(double u,double v); - std::complex<double> _Interpolate(double u,double v,int uDer,int vDer); - // other internal functions - void _ReprocessSeriesCoeff(); - // persistent fftw data (used to avoid recomputing the FFTW plans - // and reallocating memory every time) - static int _forwardSize, _backwardSize; - static fftw_plan _forwardPlan, _backwardPlan; - static fftw_complex *_forwardData, *_backwardData; - void _SetForwardPlan(int n); - void _SetBackwardPlan(int n); - // This routine computes the forward FFT (ignoring the last element - // of the data) - void _ForwardFft(int n, std::complex<double> *fftData); - // This routine computes the inverse FFT (ignoring the last element - // in the array), returns values in entire array (by using the - // periodic extension) - void _BackwardFft(int n, std::complex<double> *fftData); - public: - ContinuationPatch - (PatchInfo* PI, ProjectionSurface* ps); - virtual ~ContinuationPatch(); - - PatchInfo* _PI; - - // Abstract functions of Patch - - virtual void Export(FILE *fp); - virtual double GetPou(double u, double v); - virtual void F(double u, double v, double &x, double &y, double &z); - virtual bool Inverse(double x,double y,double z,double &u,double &v); - virtual void Dfdu(double u, double v, double &x, double &y, double &z); - virtual void Dfdv(double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/Curve.cpp b/contrib/FourierModel/Curve.cpp deleted file mode 100644 index 73a1baf49d..0000000000 --- a/contrib/FourierModel/Curve.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "Curve.h" - -using namespace FM; - -Curve::Curve() -{ - _tag = -1; -} - -Curve::Curve(int tag) -{ - _tag = tag; -} diff --git a/contrib/FourierModel/Curve.h b/contrib/FourierModel/Curve.h deleted file mode 100644 index fc5353e033..0000000000 --- a/contrib/FourierModel/Curve.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _CURVE_H_ -#define _CURVE_H_ - -namespace FM { - -// The base class for the patches -class Curve { - protected: - int _tag; - public: - // Intersection Information - Curve(); - Curve(int tag); - virtual ~Curve() {} - - inline int GetTag() { return _tag; } - - virtual double GetPou(double t) = 0; - virtual void F(double t, double &x, double &y, double &z) = 0; - virtual bool Inverse(double x,double y,double z,double &t) = 0; - virtual void Dfdt(double t, double &x, double &y, double &z) = 0; - virtual void Dfdfdtdt(double t, double &x, double &y, double &z) = 0; -}; - -} - -#endif diff --git a/contrib/FourierModel/CylindricalProjectionSurface.cpp b/contrib/FourierModel/CylindricalProjectionSurface.cpp deleted file mode 100755 index 5663749349..0000000000 --- a/contrib/FourierModel/CylindricalProjectionSurface.cpp +++ /dev/null @@ -1,274 +0,0 @@ -#include "CylindricalProjectionSurface.h" - -using namespace FM; - -CylindricalProjectionSurface::CylindricalProjectionSurface -(int tag) : ProjectionSurface(1.) -{ - SetTag(tag); - SetName(std::string("cylinder")); - - twoPi_ = 2 * M_PI; - - R_ = 1.; - Z_ = 1.; - - numParameters_ = 2; - - O_[0] = O_[1] = O_[2] = 0.; - - E0_[0] = 1.; E0_[1] = 0.; E0_[2] = 0.; - E1_[0] = 0.; E1_[1] = 1.; E1_[2] = 0.; - E2_[0] = 0.; E2_[1] = 0.; E2_[2] = 1.; - - scale_[0] = scale_[1] = scale_[2] = 1.; -} - -CylindricalProjectionSurface::CylindricalProjectionSurface -(int tag, double O[3], double E0[3], double E1[3], double scale[3]) - : ProjectionSurface(1.) -{ - SetTag(tag); - SetName(std::string("Cylinder")); - - twoPi_ = 2 * M_PI; - - O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2]; - - E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2]; - E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2]; - - E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1]; - E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2]; - E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; - - scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2]; -} - -CylindricalProjectionSurface::CylindricalProjectionSurface -(int tag, double O[3], double E0[3], double E1[3], double scale[3], - double R, double Z) - : ProjectionSurface(1.) -{ - SetTag(tag); - SetName(std::string("Cylinder")); - - twoPi_ = 2 * M_PI; - - O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2]; - - E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2]; - E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2]; - - E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1]; - E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2]; - E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; - - scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2]; - - R_ = R; - Z_ = Z; -} - -void CylindricalProjectionSurface:: -F(double u, double v, double &x, double &y, double &z) -{ - x = O_[0] + E0_[0] * Z_ * v; - y = O_[1] + E0_[1] * Z_ * v; - z = O_[2] + E0_[2] * Z_ * v; - - x += R_ * (E1_[0] * cos(twoPi_ * (u - 0.5)) + - E2_[0] * sin(twoPi_ * (u - 0.5))); - y += R_ * (E1_[1] * cos(twoPi_ * (u - 0.5)) + - E2_[1] * sin(twoPi_ * (u - 0.5))); - z += R_ * (E1_[2] * cos(twoPi_ * (u - 0.5)) + - E2_[2] * sin(twoPi_ * (u - 0.5))); -} - -bool CylindricalProjectionSurface:: -Inverse(double x, double y, double z, double &u,double &v) -{ - double tol =1.e-12; - - double t = (x - O_[0]) * E0_[0] + - (y - O_[1]) * E0_[1] + - (z - O_[2]) * E0_[2]; - v = t / Z_; - double n[3]; - n[0] = x - (O_[0] + t * E0_[0]); - n[1] = y - (O_[1] + t * E0_[1]); - n[2] = z - (O_[2] + t * E0_[2]); - double norm = sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]); - for (int i=0;i<3;i++) - n[i] /= norm; - u = atan2((n[0]*E2_[0]+n[1]*E2_[1]+n[2]*E2_[2]), - (n[0]*E1_[0]+n[1]*E1_[1]+ - n[2]*E1_[2])); - u /= twoPi_; - u += 0.5; - - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - return true; - else - return false; -} - -void CylindricalProjectionSurface:: -Dfdu(double u, double v, double &x, double &y, double &z) -{ - x = twoPi_ * R_ * - (- E1_[0] * sin(twoPi_ * (u - 0.5)) + - E2_[0] * cos(twoPi_ * (u - 0.5))); - y = twoPi_ * R_ * - (- E1_[1] * sin(twoPi_ * (u - 0.5)) + - E2_[1] * cos(twoPi_ * (u - 0.5))); - z = twoPi_ * R_ * - (- E1_[2] * sin(twoPi_ * (u - 0.5)) + - E2_[2] * cos(twoPi_ * (u - 0.5))); -} - -void CylindricalProjectionSurface:: -Dfdv(double u, double v, double &x, double &y, double &z) -{ - x = E0_[0] * Z_; - y = E0_[1] * Z_; - z = E0_[2] * Z_; -} - -void CylindricalProjectionSurface:: -Dfdfdudu(double u,double v, double &x, double &y, double &z) -{ - x = - twoPi_ * twoPi_ * R_ * - (E1_[0] * cos(twoPi_ * (u - 0.5)) + - E2_[0] * sin(twoPi_ * (u - 0.5))); - y = - twoPi_ * twoPi_ * R_ * - (E1_[1] * cos(twoPi_ * (u - 0.5)) + - E2_[1] * sin(twoPi_ * (u - 0.5))); - z = - twoPi_ * twoPi_ * R_ * - (E1_[2] * cos(twoPi_ * (u - 0.5)) + - E2_[2] * sin(twoPi_ * (u - 0.5))); -} - -void CylindricalProjectionSurface:: -Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void CylindricalProjectionSurface:: -Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void CylindricalProjectionSurface:: -Dfdfdfdududu(double u,double v,double &x,double &y,double &z) -{ - x = twoPi_ * twoPi_ * twoPi_ * R_ * - (E1_[0] * sin(twoPi_ * (u - 0.5)) - - E2_[0] * cos(twoPi_ * (u - 0.5))); - y = twoPi_ * twoPi_ * twoPi_ * R_ * - (E1_[1] * sin(twoPi_ * (u - 0.5)) - - E2_[1] * cos(twoPi_ * (u - 0.5))); - z = twoPi_ * twoPi_ * twoPi_ * R_ * - (E1_[2] * sin(twoPi_ * (u - 0.5)) + - E2_[2] * cos(twoPi_ * (u - 0.5))); -} - -void CylindricalProjectionSurface:: -Dfdfdfdududv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void CylindricalProjectionSurface:: -Dfdfdfdudvdv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void CylindricalProjectionSurface:: -Dfdfdfdvdvdv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void CylindricalProjectionSurface:: -GetNormal(double u, double v, double &x, double &y, double &z) -{ - x = E1_[0] * cos(twoPi_ * (u - 0.5)) + - E2_[0] * sin(twoPi_ * (u - 0.5)); - y = E1_[1] * cos(twoPi_ * (u - 0.5)) + - E2_[1] * sin(twoPi_ * (u - 0.5)); - z = E1_[2] * cos(twoPi_ * (u - 0.5)) + - E2_[2] * sin(twoPi_ * (u - 0.5)); -} - -void CylindricalProjectionSurface:: -Dndu(double u, double v, double &x, double &y, double &z) -{ - Dfdu(u,v,x,y,z); -} - -void CylindricalProjectionSurface:: -Dndv(double u, double v, double &x, double &y, double &z) -{ - Dfdv(u,v,x,y,z); -} - -void CylindricalProjectionSurface:: -Dndndudu(double u, double v, double &x, double &y, double &z) -{ - Dfdfdudu(u,v,x,y,z); -} - -void CylindricalProjectionSurface:: -Dndndudv(double u, double v, double &x, double &y, double &z) -{ - Dfdfdudv(u,v,x,y,z); -} - -void CylindricalProjectionSurface:: -Dndndvdv(double u, double v, double &x, double &y, double &z) -{ - Dfdfdvdv(u,v,x,y,z); -} - -bool CylindricalProjectionSurface:: -OrthoProjectionOnSurface(double x, double y, double z, double &u,double &v) -{ - return Inverse(x,y,z,u,v); -} - -void CylindricalProjectionSurface:: -SetParameter(int i, double x) -{ - switch (i) { - case 0: - R_ = x; - case 1: - Z_ = x; - } -} - -double CylindricalProjectionSurface:: -GetParameter(int i) -{ - switch (i) { - case 0: - return R_; - case 1: - return Z_; - } -} - -std::string CylindricalProjectionSurface:: -GetLabel(int i) -{ - switch (i) { - case 0: - return std::string("R"); - case 1: - return std::string("Hight Scale"); - } -} diff --git a/contrib/FourierModel/CylindricalProjectionSurface.h b/contrib/FourierModel/CylindricalProjectionSurface.h deleted file mode 100755 index 783ff6379f..0000000000 --- a/contrib/FourierModel/CylindricalProjectionSurface.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef _CYLINDRICAL_PROJECTION_SURFACE_H_ -#define _CYLINDRICAL_PROJECTION_SURFACE_H_ - -#include <cmath> -#include "ProjectionSurface.h" - -namespace FM { - -class CylindricalProjectionSurface : public ProjectionSurface { - private: - double twoPi_; - double R_, Z_; - public: - CylindricalProjectionSurface - (int tag); - CylindricalProjectionSurface - (int tag, double O[3], double E0[3], double E1[3], double scale[3]); - CylindricalProjectionSurface - (int tag, double O[3], double E0[3], double E1[3], double scale[3], - double R, double Z); - CylindricalProjectionSurface(CylindricalProjectionSurface *ps) - : ProjectionSurface(ps) - { - twoPi_ = ps->twoPi_; - R_ = ps->R_; - Z_ = ps->Z_; - } - - virtual ~CylindricalProjectionSurface - () {} - - virtual ProjectionSurface *clone() - { - return new CylindricalProjectionSurface(this); - } - - // Abstract methods of ProjectionSurface - - virtual void F - (double u, double v, double &x, double &y, double &z); - virtual bool Inverse - (double x,double y,double z,double &u,double &v); - virtual void Dfdu - (double u, double v, double &x, double &y, double &z); - virtual void Dfdv - (double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdudvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdvdvdv - (double u,double v,double &x,double &y,double &z); - virtual bool OrthoProjectionOnSurface - (double x, double y, double z, double &u,double &v); - virtual void SetParameter - (int i, double x); - virtual double GetParameter - (int i); - virtual std::string GetLabel - (int i); - - // Redefinitions for CylindricalProjectionSurface - - virtual void GetNormal - (double u, double v, double &x, double &y, double &z); - virtual void Dndu - (double u, double v, double &x, double &y, double &z); - virtual void Dndv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudu - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndvdv - (double u, double v, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/ExactPatch.cpp b/contrib/FourierModel/ExactPatch.cpp deleted file mode 100644 index 4a5173771f..0000000000 --- a/contrib/FourierModel/ExactPatch.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "Message.h" -#include "ExactPatch.h" - -using namespace FM; - -ExactPatch::ExactPatch(ProjectionSurface* ps) : Patch() -{ - SetProjectionSurface(ps); -} - -void ExactPatch::F(double u, double v, double &x, double &y, double &z) -{ - _ps->F(u,v,x,y,z); -} - -bool ExactPatch::Inverse(double x,double y,double z,double &u,double &v) -{ - return _ps->Inverse(x,y,z,u,v); -} - -void ExactPatch::Dfdu(double u, double v, double &x, double &y, double &z) -{ - _ps->Dfdu(u,v,x,y,z); -} - -void ExactPatch::Dfdv(double u, double v, double &x, double &y, double &z) -{ - _ps->Dfdv(u,v,x,y,z); -} - -void ExactPatch::Dfdfdudu(double u,double v,double &x,double &y,double &z) -{ - _ps->Dfdfdudu(u,v,x,y,z); -} - -void ExactPatch::Dfdfdudv(double u,double v,double &x,double &y,double &z) -{ - _ps->Dfdfdudv(u,v,x,y,z); -} - -void ExactPatch::Dfdfdvdv(double u,double v,double &x,double &y,double &z) -{ - _ps->Dfdfdvdv(u,v,x,y,z); -} - -double ExactPatch::GetPou(double u, double v) -{ - return 1.; -} - -void ExactPatch::Export(FILE *fp) -{ - double x,y,z; - - fprintf(fp, "%s\n", _ps->GetName().c_str()); - fprintf(fp, "%d\n", _ps->GetTag()); - _ps->GetOrigin(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE0(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE1(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetScale(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - fprintf(fp, "%d\n", _ps->GetNumParameters()); - for (int i = 0; i < _ps->GetNumParameters(); i++) - fprintf(fp, "%g\n",_ps->GetParameter(i)); - - fprintf(fp, "%s\n", "ExactPatch"); - fprintf(fp, "%d\n", _tag); - fprintf(fp, "%d\n", _derivative); - fprintf(fp, "%g %g\n", _uMin, _uMax); - fprintf(fp, "%g %g\n", _vMin, _vMax); - fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2], - _hardEdge[3]); -} diff --git a/contrib/FourierModel/ExactPatch.h b/contrib/FourierModel/ExactPatch.h deleted file mode 100644 index ebd2949295..0000000000 --- a/contrib/FourierModel/ExactPatch.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _EXACT_PATCH_H_ -#define _EXACT_PATCH_H_ - -#include "Patch.h" -#include "FM_Info.h" -#include "ProjectionSurface.h" - -namespace FM { - -// The base class for the patches -class ExactPatch : public Patch { - public: - ExactPatch(ProjectionSurface* ps); - virtual ~ExactPatch() {} - - // These are the virtual functions that must be provided by all - // derived patches: GetPou() returns the original smooth - // (non-normalized) cutoff on the patch; F() and Inverse() implement - // the mapping f: (u,v)->(x,y,z) and its inverse; and the Df*() and Dn*() - // functions return the derivatives of the mapping f and unit normal n - // with respect to u and v - - virtual void Export(FILE *fp); - virtual double GetPou(double u, double v); - virtual void F(double u, double v, double &x, double &y, double &z); - virtual bool Inverse(double x,double y,double z,double &u,double &v); - virtual void Dfdu(double u, double v, double &x, double &y, double &z); - virtual void Dfdv(double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/FCurve.cpp b/contrib/FourierModel/FCurve.cpp deleted file mode 100644 index fcac90e879..0000000000 --- a/contrib/FourierModel/FCurve.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "FCurve.h" - -using namespace FM; - -FCurve::FCurve -(int tag, Patch* patch) - : Curve(tag) -{ - patch_ = patch; - - // default end points - SP_[0] = SP_[1] = 0.; - EP_[0] = 1.; EP_[1] = 0.; -} - -FCurve::FCurve -(int tag, Patch* patch, double SP[2], double EP[2]) - : Curve(tag) -{ - patch_ = patch; - - SP_[0] = SP[0]; SP_[1] = SP[1]; - EP_[0] = EP[0]; EP_[1] = EP[1]; -} - -double FCurve::GetPou -(double t) -{ - return 1.; -} - -void FCurve::F -(double t, double &x, double &y, double &z) -{ - double u = SP_[0] + t * (EP_[0] - SP_[0]); - double v = SP_[1] + t * (EP_[1] - SP_[1]); - - patch_->F(u,v,x,y,z); -} - -bool FCurve::Inverse -(double x, double y, double z, double &t) -{ - double u, v; - if (patch_->Inverse(x,y,z,u,v)) { - if (std::abs(EP_[0] - SP_[0]) > 1.e-12) - t = (u - SP_[0]) / (EP_[0] - SP_[0]); - else if (std::abs(EP_[1] - SP_[1]) > 1.e-12) - t = (v - SP_[1]) / (EP_[1] - SP_[1]); - else - t = 0.; - return true; - } - else - return false; -} - -void FCurve::Dfdt -(double t, double &x, double &y, double &z) -{ - double u = SP_[0] + t * (EP_[0] - SP_[0]); - double v = SP_[1] + t * (EP_[1] - SP_[1]); - - double dfdu[3], dfdv[3]; - patch_->Dfdu(u,v,dfdu[0],dfdu[1],dfdu[2]); - patch_->Dfdv(u,v,dfdv[0],dfdv[1],dfdv[2]); - - x = dfdu[0] * (EP_[0] - SP_[0]) + dfdv[0] * (EP_[1] - SP_[1]); - y = dfdu[1] * (EP_[0] - SP_[0]) + dfdv[1] * (EP_[1] - SP_[1]); - z = dfdu[2] * (EP_[0] - SP_[0]) + dfdv[2] * (EP_[1] - SP_[1]); -} - -void FCurve::Dfdfdtdt -(double t, double &x, double &y, double &z) -{ - double u = SP_[0] + t * (EP_[0] - SP_[0]); - double v = SP_[1] + t * (EP_[1] - SP_[1]); - - double dfdfdudu[3], dfdfdudv[3], dfdfdvdv[3]; - patch_->Dfdfdudu(u,v,dfdfdudu[0],dfdfdudu[1],dfdfdudu[2]); - patch_->Dfdfdudv(u,v,dfdfdudv[0],dfdfdudv[1],dfdfdudv[2]); - patch_->Dfdfdvdv(u,v,dfdfdvdv[0],dfdfdvdv[1],dfdfdvdv[2]); - - x = - dfdfdudu[0] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) + - dfdfdudv[0] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. + - dfdfdvdv[0] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]); - y = - dfdfdudu[1] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) + - dfdfdudv[1] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. + - dfdfdvdv[1] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]); - z = - dfdfdudu[2] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) + - dfdfdudv[2] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. + - dfdfdvdv[2] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]); -} diff --git a/contrib/FourierModel/FCurve.h b/contrib/FourierModel/FCurve.h deleted file mode 100644 index d024bfd274..0000000000 --- a/contrib/FourierModel/FCurve.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef _F_CURVE_H_ -#define _F_CURVE_H_ - -#include "Curve.h" -#include "Patch.h" - -namespace FM { - -// The base class for the patches -class FCurve : public Curve { - protected: - // Underlying Patch - Patch* patch_; - // End Points - double SP_[2],EP_[2]; - - public: - FCurve(int tag, Patch* patch); - FCurve(int tag, Patch* patch, double SP[2], double EP[2]); - virtual ~FCurve() {} - - void SetStartPoint - (double u, double v) - { - SP_[0] = u; SP_[1] = v; - } - void GetStartPoint - (double &u, double &v) - { - u = SP_[0]; v = SP_[1]; - } - void SetEndPoint - (double u, double v) - { - EP_[0] = u; EP_[1] = v; - } - void GetEndPoint - (double &u, double &v) - { - u = EP_[0]; v = EP_[1]; - } - - // These are the virtual functions that must be provided by all - // derived patches: GetPou() returns the original smooth - // (non-normalized) cutoff on the patch; F() and Inverse() implement - // the mapping f: (t)->(x,y,z) and its inverse; and the Df*() and Dn*() - // functions return the derivatives of the mapping f and unit normal n - // with respect to u and v - - virtual double GetPou - (double t); - virtual void F - (double t, double &x, double &y, double &z); - virtual bool Inverse - (double x,double y,double z,double &t); - virtual void Dfdt - (double t, double &x, double &y, double &z); - virtual void Dfdfdtdt - (double t, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/FM_Edge.cpp b/contrib/FourierModel/FM_Edge.cpp deleted file mode 100644 index 90622b4418..0000000000 --- a/contrib/FourierModel/FM_Edge.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include <cmath> -#include "FM_Edge.h" -#include "Message.h" - -using namespace FM; - -void FM_Edge::F(double t, double &x, double &y, double &z) -{ - if (_curve) { - _curve->F(t,x,y,z); - } - else { - x = _SP->GetX() + t * (_EP->GetX() - _SP->GetX()); - y = _SP->GetY() + t * (_EP->GetY() - _SP->GetY()); - z = _SP->GetZ() + t * (_EP->GetZ() - _SP->GetZ()); - } -} - -bool FM_Edge::Inverse(double x,double y,double z,double &t) -{ - if (_curve) { - _curve->Inverse(x,y,z,t); - } - else { - if (_EP->GetX() - _SP->GetX()) - t = (x - _SP->GetX()) / (_EP->GetX() - _SP->GetX()); - else if (_EP->GetY() - _SP->GetY()) - t = (y - _SP->GetY()) / (_EP->GetY() - _SP->GetY()); - else if (_EP->GetZ() - _SP->GetZ()) - t = (z - _SP->GetZ()) / (_EP->GetZ() - _SP->GetZ()); - else { - Msg::Warning("Cannnot invert the curve"); - t = 0.; - } - } -} - -void FM_Edge::Dfdt(double t, double &x, double &y, double &z) -{ - if (_curve) { - double xMinus, yMinus, zMinus; - double xPlus, yPlus, zPlus; - - double tStart, tEnd; - _curve->Inverse(_SP->GetX(),_SP->GetY(),_SP->GetZ(),tStart); - _curve->Inverse(_EP->GetX(),_EP->GetY(),_EP->GetZ(),tEnd); - - double h = 1.e-10; - double tRescaled; - if (std::abs(tEnd - tStart) < 1.e-12) { - tRescaled = tStart + t * (1. + tEnd - tStart); - tRescaled -= floor(tRescaled); - } - else - tRescaled = tStart + t * (tEnd - tStart); - if (tRescaled+0.5*h > tEnd) { - _curve->F(tRescaled, xPlus, yPlus, zPlus); - double tMinus = tRescaled - h; - _curve->F(tMinus, xMinus, yMinus, zMinus); - } - else if (tRescaled-0.5*h < tStart) { - _curve->F(tRescaled, xMinus, yMinus, zMinus); - double tPlus = tRescaled + h; - _curve->F(tPlus, xPlus, yPlus, zPlus); - } - else { - double tPlus = tRescaled + 0.5 * h; - double tMinus = tRescaled - 0.5 * h; - _curve->F(tPlus, xPlus, yPlus, zPlus); - _curve->F(tMinus, xMinus, yMinus, zMinus); - } - x = (xPlus - xMinus) / h; - y = (yPlus - yMinus) / h; - z = (zPlus - zMinus) / h; - } - else { - x = _EP->GetX() - _SP->GetX(); - y = _EP->GetY() - _SP->GetY(); - z = _EP->GetZ() - _SP->GetZ(); - } -} - -void FM_Edge::Dfdfdtdt(double t, double &x, double &y, double &z) -{ - if (_curve) { - double xMinus, yMinus, zMinus; - double xPlus, yPlus, zPlus; - - double tStart, tEnd; - _curve->Inverse(_SP->GetX(),_SP->GetY(),_SP->GetZ(),tStart); - _curve->Inverse(_EP->GetX(),_EP->GetY(),_EP->GetZ(),tEnd); - - double h = 1.e-10; - double tRescaled; - if (std::abs(tEnd - tStart) < 1.e-12) { - tRescaled = tStart + t * (1. + tEnd - tStart); - tRescaled -= floor(tRescaled); - } - else - tRescaled = tStart + t * (tEnd - tStart); - if (tRescaled+0.5*h > tEnd) { - Dfdt(tRescaled, xPlus, yPlus, zPlus); - double tMinus = tRescaled - h; - Dfdt(tMinus, xMinus, yMinus, zMinus); - } - else if (tRescaled-0.5*h < tStart) { - Dfdt(tRescaled, xMinus, yMinus, zMinus); - double tPlus = tRescaled + h; - Dfdt(tPlus, xPlus, yPlus, zPlus); - } - else { - double tPlus = tRescaled + 0.5 * h; - double tMinus = tRescaled - 0.5 * h; - Dfdt(tPlus, xPlus, yPlus, zPlus); - Dfdt(tMinus, xMinus, yMinus, zMinus); - } - x = (xPlus - xMinus) / h; - y = (yPlus - yMinus) / h; - z = (zPlus - zMinus) / h; - } - else { - x = y = z = 0.; - } -} diff --git a/contrib/FourierModel/FM_Edge.h b/contrib/FourierModel/FM_Edge.h deleted file mode 100644 index 5d6a28987e..0000000000 --- a/contrib/FourierModel/FM_Edge.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _FM_EDGE_H_ -#define _FM_EDGE_H_ - -#include "Curve.h" -#include "FM_Vertex.h" - -namespace FM { - -class FM_Edge { - private: - int _tag; - Curve* _curve; - FM_Vertex* _SP; - FM_Vertex* _EP; - public: - FM_Edge() : _tag(-1), _curve(0), _SP(0), _EP(0) {} - FM_Edge(Curve* curve) : _tag(-1), _curve(curve), _SP(0), _EP(0) {} - FM_Edge(int tag, Curve* curve, FM_Vertex* SP, FM_Vertex* EP) : - _tag(tag), _curve(curve), _SP(SP), _EP(EP) {} - virtual ~FM_Edge() {} - - inline int GetTag() { return _tag; } - inline FM_Vertex* GetStartPoint() { return _SP; } - inline FM_Vertex* GetEndPoint() { return _EP; } - - inline void SetTag(int tag) { _tag = tag; } - inline void SetStartPoint(FM_Vertex* SP) { _SP = SP; } - inline void SetStartPoint(double x, double y, double z) { - _SP = new FM_Vertex(x,y,z); - } - inline void SetEndPoint(FM_Vertex* EP) { _EP = EP; } - inline void SetEndPoint(double x, double y, double z) { - _EP = new FM_Vertex(x,y,z); - } - inline bool IsPhysical() { - if (_curve) - return true; - else - return false; - } - - bool GetCurveExtent(double &start, double &end); - - void F(double t, double &x, double &y, double &z); - bool Inverse(double x,double y,double z,double &t); - void Dfdt(double t, double &x, double &y, double &z); - void Dfdfdtdt(double t, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/FM_Face.cpp b/contrib/FourierModel/FM_Face.cpp deleted file mode 100644 index 5330b5976f..0000000000 --- a/contrib/FourierModel/FM_Face.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include "FM_Face.h" -#include "Message.h" - -using namespace FM; - -void FM_Face::F(double u, double v, double &x, double &y, double &z) { - - _patch->F(u,v,x,y,z); - /* - if (_edge.size() == 1) { - double U = sqrt((2*u-1)*(2*u-1)+(2*v-1)*(2*v-1)); - double V = 0.5 * (atan2(2*v-1,2*u-1)/ M_PI + 1.); - double cx, cy, cz; - _patch->F(0.,0.,cx,cy,cz); - double px, py, pz; - _edge[0]->F(V,px,py,pz); - double R = sqrt((px-cx)*(px-cx)+(py-cy)*(py-cy)+(pz-cz)*(pz-cz)); - _patch->F(U*R,V,x,y,z); - } - else if (_edge.size() == 4) { - bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) && - (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical()); - if (isPhysical) - _patch->F(u,v,x,y,z); - else { - double xD, yD, zD, uD, vD; - double xU, yU, zU, uU, vU; - _edge[0]->F(v,xD,yD,zD); - _patch->Inverse(xD,yD,zD,uD,vD); - _edge[2]->F(1.-v,xU,yU,zU); - _patch->Inverse(xU,yU,zU,uU,vU); - - double U = uD + u * (uU - uD); - double V = vD; - - _patch->F(U,V,x,y,z); - } - } - else { - Msg::Info("Such a face not implemented yet"); - x = y = z = 0.; - } - */ -} - -bool FM_Face::Inverse(double x,double y,double z,double &u, double &v) -{ - _patch->Inverse(x,y,z,u,v); - - /* - if (_edge.size() == 1) { - double n[3], t[3], s[3], c[3], r[3]; - _patch->F(0.,0.,c[0],c[1],c[2]); - for (int i=0;i<3;i++) { - t[i] = _patch->_PI->tangent[i]; - n[i] = _patch->_PI->normal[i]; - } - - s[0] = n[1] * t[2] - n[2] * t[1]; - s[1] = n[2] * t[0] - n[0] * t[2]; - s[2] = n[0] * t[1] - n[1] * t[0]; - - r[0] = x - c[0]; - r[1] = y - c[1]; - r[2] = z - c[2]; - - double norm = sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]); - for (int i=0;i<3;i++) - r[i] /= norm; - double xx, yy; - for (int i=0;i<3;i++) { - xx += r[i] * t[i]; - yy += r[i] * s[i]; - } - double U,V; - V = atan2(yy, xx)/(2. * M_PI) +0.5; - double px, py, pz; - _edge[0]->F(v,px,py,pz); - double R = sqrt((px-c[0])*(px-c[0])+(py-c[1])*(py-c[1])+ - (pz-c[2])*(pz-c[2])); - U = norm / R; - u = 0.5 * (1 + U * cos(2*M_PI*(v-0.5))); - v = 0.5 * (1 + U * cos(2*M_PI*(v-0.5))); - } - else if (_edge.size() == 4) { - bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) && - (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical()); - if (isPhysical) - _patch->Inverse(x,y,z,u,v); - else { - double U, V; - _patch->Inverse(x,y,z,U,V); - double u0,v0,u1,v1; - double xD, yD, zD, uD, vD; - double xU, yU, zU, uU, vU; - _edge[0]->F(0,xD,yD,zD); - _patch->Inverse(xD,yD,zD,u0,v0); - _edge[0]->F(1,xD,yD,zD); - _patch->Inverse(xD,yD,zD,u1,v1); - v = (V-v0)/(v1-v0); - _edge[0]->F(v,xD,yD,zD); - _patch->Inverse(xD,yD,zD,uD,vD); - _edge[2]->F(1.-v,xU,yU,zU); - _patch->Inverse(xU,yU,zU,uU,vU); - - u = (U - uD) / (uU - uD); - } - } - else { - Msg::Info("Such a face not implemented yet"); - u = v = 0.; - } - */ -} - -void FM_Face::Dfdu(double u, double v, double &x, double &y, double &z) -{ - _patch->Dfdu(u,v,x,y,z); -} - -void FM_Face::Dfdv(double u, double v, double &x, double &y, double &z) -{ - _patch->Dfdv(u,v,x,y,z); -} - -void FM_Face::Dfdfdudu(double u, double v, double &x, double &y, double &z) -{ - _patch->Dfdfdudu(u,v,x,y,z); -} - -void FM_Face::Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - _patch->Dfdfdudv(u,v,x,y,z); -} - -void FM_Face::Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - _patch->Dfdfdvdv(u,v,x,y,z); -} - -void FM_Face::GetNormal(double u, double v, double &x, double &y, double &z) -{ - double dfdu[3], dfdv[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1]; - y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2]; - z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0]; -} - -void FM_Face:: -GetUnitNormal(double u, double v, double &x, double &y, double &z) -{ - GetNormal(u, v, x, y, z); - double norm = sqrt(x * x + y * y + z * z); - if(norm > 0.) { - x /= norm; - y /= norm; - z /= norm; - } -} diff --git a/contrib/FourierModel/FM_Face.h b/contrib/FourierModel/FM_Face.h deleted file mode 100644 index b2f26d46e5..0000000000 --- a/contrib/FourierModel/FM_Face.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _FM_FACE_H_ -#define _FM_FACE_H_ - -#include <vector> -#include "Patch.h" -#include "FM_Edge.h" - -namespace FM { - -class FM_Face { - private: - int _tag; - Patch* _patch; - std::vector<FM_Edge*> _edge; - public: - FM_Face() : _tag(-1), _patch(0) {} - FM_Face(Patch* patch) : _tag(-1), _patch(patch) {} - FM_Face(int tag, Patch* patch) : _tag(tag), _patch(patch) {} - FM_Face(Patch* patch, std::vector<FM_Edge*> edge) : - _tag(-1), _patch(patch), _edge(edge) {} - FM_Face(int tag, Patch* patch, std::vector<FM_Edge*> edge) : - _tag(tag), _patch(patch), _edge(edge) {} - virtual ~FM_Face() {} - - inline void SetTag(int tag) { _tag = tag; } - inline int GetTag() { return _tag; } - inline bool IsPeriodic(int dim) - { - if (dim) return _patch->IsVPeriodic(); - else return _patch->IsUPeriodic(); - } - inline void AddEdge(FM_Edge* edge) { _edge.push_back(edge); } - inline int GetNumEdges() { return _edge.size(); } - inline Patch* GetPatch() { return _patch; } - inline FM_Edge* GetEdge(int i) { return _edge[i]; } - - void F(double u, double v, double &x, double &y, double &z); - bool Inverse(double x,double y,double z,double &u, double &v); - void Dfdu(double u, double v, double &x, double &y, double &z); - void Dfdv(double u, double v, double &x, double &y, double &z); - void Dfdfdudu(double u, double v, double &x, double &y, double &z); - void Dfdfdudv(double u, double v, double &x, double &y, double &z); - void Dfdfdvdv(double u, double v, double &x, double &y, double &z); - void GetUnitNormal(double u,double v,double &x,double &y,double &z); - void GetNormal(double u, double v, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/FM_Info.cpp b/contrib/FourierModel/FM_Info.cpp deleted file mode 100644 index 29d08d37cb..0000000000 --- a/contrib/FourierModel/FM_Info.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "FM_Info.h" - -using namespace FM; - -PatchInfo::PatchInfo() : tag(-1) -{ - uMin = vMin = 0.; - uMax = vMax = 1.; - derivative = 3; - recompute = 1; -} - -OverlapInfo::OverlapInfo() -{ - doesIntersect = 0; - xMin = xMax = 0.; - yMin = yMax = 0.; - zMin = zMax = 0.; -} - -IntersectionInfo::IntersectionInfo() : tag(-1) -{ - edgeInfo.edgeType = -1; - edgeInfo.constValue = 0.; - edgeInfo.startValue = 0.; - edgeInfo.endValue = 0.; - edgeInfo.acrossDiscontinuity = false; -} diff --git a/contrib/FourierModel/FM_Info.h b/contrib/FourierModel/FM_Info.h deleted file mode 100644 index 2d3f8ffd6c..0000000000 --- a/contrib/FourierModel/FM_Info.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef _FM_INFO_H_ -#define _FM_INFO_H_ - -#include <complex> -#include <vector> - -namespace FM { - -class PatchInfo { - public: - int tag; - int derivative; - int recompute; - int nM[2]; - int nModes[2]; - double uMin, uMax, vMin, vMax; - int hardEdge[4]; - std::vector<std::vector<std::complex<double> > > coeffFourier; - std::vector<std::vector<std::complex<double> > > coeffCheby; - std::vector<std::vector<std::complex<double> > > coeffDerivU; - std::vector<std::vector<std::complex<double> > > coeffDerivV; - std::vector<std::vector<std::complex<double> > > coeffDerivUU; - std::vector<std::vector<std::complex<double> > > coeffDerivUV; - std::vector<std::vector<std::complex<double> > > coeffDerivVV; - - PatchInfo(); - virtual ~PatchInfo() {} -}; - -class OverlapInfo { - public: - short int doesIntersect; - int psTag; - double xMin, xMax; - double yMin, yMax; - double zMin, zMax; - - OverlapInfo(); - virtual ~OverlapInfo() {} -}; - -class IntersectionInfo { - public: - int tag; - double SP[3]; - double EP[3]; - struct { - int patchTag; - } intersectingPatches[2]; - int along; - struct { - int edgeType; - double constValue; - double startValue; - double endValue; - bool acrossDiscontinuity; - } edgeInfo; - - IntersectionInfo(); - virtual ~IntersectionInfo() {} -}; - -} - -#endif diff --git a/contrib/FourierModel/FM_Reader.cpp b/contrib/FourierModel/FM_Reader.cpp deleted file mode 100644 index bb75dcfa5a..0000000000 --- a/contrib/FourierModel/FM_Reader.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include <iostream> -#include <fstream> -#include "Message.h" -#include "FM_Reader.h" - -using namespace FM; - -FM_Reader::FM_Reader(const char* fn) -{ - char c; - char Exact[8] = "Exact"; - char plane[16] = "plane"; - char cylinder[16] = "cylinder"; - char paraboloid[16] = "paraboloid"; - char revolvedParabola[32] = "revolvedParabola"; - - std::ifstream InputFile(fn); - if (!InputFile) { - Msg::Info("Failed to open input file."); - exit(EXIT_FAILURE); - } - InputFile >> _nPatches; - _ps.resize(_nPatches, 0); - for (unsigned int i = 0; i < _nPatches; i++) { - char psName[32]; - InputFile >> psName; - int psTag; - InputFile >> psTag; - double origin[3]; - InputFile >> origin[0] >> origin[1] >> origin[2]; - double E0[3]; - InputFile >> E0[0] >> E0[1] >> E0[2]; - double E1[3]; - InputFile >> E1[0] >> E1[1] >> E1[2]; - double scale[3]; - InputFile >> scale[0] >> scale[1] >> scale[2]; - int psNumParams; - InputFile >> psNumParams; - double *psParams = new double [psNumParams]; - for (unsigned int j = 0; j < psNumParams; j++) { - double tmp; - InputFile >> psParams[j]; - } - if (!strcmp(psName,plane)) - _ps[i] = new PlaneProjectionSurface(psTag,origin,E0,E1,scale); - else if (!strcmp(psName,cylinder)) - _ps[i] = new CylindricalProjectionSurface - (psTag,origin,E0,E1,scale,psParams[0],psParams[1]); - else if (!strcmp(psName,paraboloid)) - _ps[i] = new ParaboloidProjectionSurface - (psTag,origin,E0,E1,scale); - else if (!strcmp(psName,revolvedParabola)) { - double R = psParams[0]; - double K[2]; - K[0] = psParams[1]; K[1] = psParams[2]; - - _ps[i] = new RevolvedParabolaProjectionSurface - (psTag,origin,E0,E1,scale,R,K); - } - else { - _ps[i] = new CylindricalProjectionSurface(psTag,origin,E0,E1,scale); - Msg::Error("Unknown projection surface. Replaced by Cylinder..."); - } - delete [] psParams; - InputFile >> psName; - _patchList.push_back(new PatchInfo); - InputFile >> _patchList[i]->tag; - InputFile >> _patchList[i]->derivative; - InputFile >> _patchList[i]->uMin >> _patchList[i]->uMax; - InputFile >> _patchList[i]->vMin >> _patchList[i]->vMax; - if (strcmp(psName,Exact)) { - InputFile >> _patchList[i]->hardEdge[0] >> _patchList[i]->hardEdge[1] >> - _patchList[i]->hardEdge[2] >> _patchList[i]->hardEdge[3]; - InputFile >> _patchList[i]->nModes[0] >> _patchList[i]->nModes[1]; - _patchList[i]->coeffFourier.resize(_patchList[i]->nModes[0]); - for (int j=0;j<_patchList[i]->nModes[0];j++) { - _patchList[i]->coeffFourier[j].resize(_patchList[i]->nModes[1]); - for (int k=0;k<_patchList[i]->nModes[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffFourier[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - InputFile >> _patchList[i]->nM[0] >> _patchList[i]->nM[1]; - InputFile >> _patchList[i]->recompute; - if ((_patchList[i]->derivative) && (!_patchList[i]->recompute)) { - _patchList[i]->coeffCheby.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffCheby[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffCheby[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - _patchList[i]->coeffDerivU.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffDerivU[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffDerivU[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - _patchList[i]->coeffDerivV.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffDerivV[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffDerivV[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - _patchList[i]->coeffDerivUU.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffDerivUU[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffDerivUU[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - _patchList[i]->coeffDerivUV.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffDerivUV[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffDerivUV[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - _patchList[i]->coeffDerivVV.resize(_patchList[i]->nM[0]); - for (int j=0;j<_patchList[i]->nM[0];j++) { - _patchList[i]->coeffDerivVV[j].resize(_patchList[i]->nM[1]); - for (int k=0;k<_patchList[i]->nM[1];k++) { - double realCoeff, imagCoeff; - InputFile >> realCoeff >> imagCoeff; - _patchList[i]->coeffDerivVV[j][k] = - std::complex<double>(realCoeff,imagCoeff); - } - } - } - } - _patch.push_back(new ContinuationPatch(_patchList[i], _ps[i])); - } -} - -Patch* FM_Reader::GetPatch(int tag) -{ - for (int i=0;i<_patch.size();i++) - if (_patch[i]->GetTag() == tag) - return _patch[i]; -} - -ProjectionSurface* FM_Reader::GetProjectionSurface(int tag) -{ - ProjectionSurface* ps = 0; - for (int i=0;i<_ps.size();i++) { - if (_ps[i]->GetTag() == tag) { - ps = _ps[i]; - break; - } - } - return ps; -} diff --git a/contrib/FourierModel/FM_Reader.h b/contrib/FourierModel/FM_Reader.h deleted file mode 100644 index 199e9d5ed5..0000000000 --- a/contrib/FourierModel/FM_Reader.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _FM_READER_H_ -#define _FM_READER_H_ - -#include <vector> -#include <string> -#include <complex> -#include "Curve.h" -#include "IntersectionCurve.h" -#include "ExactPatch.h" -#include "ContinuationPatch.h" -#include "PlaneProjectionSurface.h" -#include "CylindricalProjectionSurface.h" -#include "ParaboloidProjectionSurface.h" -#include "RevolvedParabolaProjectionSurface.h" -#include "FM_Info.h" -#include "FM_Face.h" -#include "BlendOperator.h" -#include "BlendedPatch.h" - -namespace FM { - -class FM_Reader { - private: - int _nPatches; - std::vector<PatchInfo*> _patchList; - std::vector<Patch*> _patch; - std::vector<ProjectionSurface*> _ps; - - public: - FM_Reader(const char* fn); - - virtual ~FM_Reader() {} - - inline int GetNumPatches - () { return _nPatches; } - - inline std::vector<PatchInfo*> GetPatchList - () { return _patchList; } - - Patch* GetPatch - (int tag); - - ProjectionSurface* GetProjectionSurface - (int tag); -}; - -} - -#endif diff --git a/contrib/FourierModel/FM_Vertex.cpp b/contrib/FourierModel/FM_Vertex.cpp deleted file mode 100644 index 139597f9cb..0000000000 --- a/contrib/FourierModel/FM_Vertex.cpp +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/contrib/FourierModel/FM_Vertex.h b/contrib/FourierModel/FM_Vertex.h deleted file mode 100644 index b893144563..0000000000 --- a/contrib/FourierModel/FM_Vertex.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _FM_VERTEX_H_ -#define _FM_VERTEX_H_ - -namespace FM { - -class FM_Vertex { - private: - int _tag; - double _x,_y,_z; - public: - FM_Vertex() : _tag(-1), _x(0), _y(0), _z(0) {} - FM_Vertex(double x, double y, double z) : _tag(-1), _x(x), _y(y), _z(z) {} - FM_Vertex(int tag, double x, double y, double z) : _tag(tag), - _x(x), _y(y), _z(z) {} - virtual ~FM_Vertex() {} - - inline int GetTag() { return _tag; } - inline double GetX() { return _x; } - inline double GetY() { return _y; } - inline double GetZ() { return _z; } - - inline void SetTag(int tag) { _tag = tag; } - inline void SetX(double x) { _x = x; } - inline void SetY(double y) { _y = y; } - inline void SetZ(double z) { _z = z; } -}; - -} - -#endif diff --git a/contrib/FourierModel/FPatch.cpp b/contrib/FourierModel/FPatch.cpp deleted file mode 100644 index 188a6632e4..0000000000 --- a/contrib/FourierModel/FPatch.cpp +++ /dev/null @@ -1,979 +0,0 @@ -#include <math.h> -#include "Message.h" -#include "FPatch.h" - -using namespace FM; - -extern "C" { - void zgelss_(int &,int &,int &,std::complex<double> *,int &, - std::complex<double> *,int &,double *,double &,int &, - std::complex<double> *,int &,double *,int &); -} - -FPatch::FPatch(int tag, ProjectionSurface* ps, - std::vector<double> &u, std::vector<double> &v, - std::vector< std::complex<double> > &data, int derivative, - int uModes, int vModes, int uM, int vM, - bool hardEdge0, bool hardEdge1, bool hardEdge2, bool hardEdge3) - : _coeffOriginalData(0),_coeffData(0),_coeffDerivU(0), - _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0) -{ - _ps = ps; - - _tag = tag; - _derivative = derivative; - - _uModes = uModes; - _vModes = vModes; - - _uM = (int)pow(2.,(int)(log((double)uM) / log(2.))); - _vM = (int)pow(2.,(int)(log((double)vM) / log(2.))); - - if (_ps->IsUPeriodic()) - _uM++; - if (_ps->IsVPeriodic()) - _vM++; - - _hardEdge[0] = hardEdge0; - _hardEdge[1] = hardEdge1; - _hardEdge[2] = hardEdge2; - _hardEdge[3] = hardEdge3; - - if (_ps->IsUPeriodic()) - _periodicityU = 1; - if (_ps->IsVPeriodic()) - _periodicityV = 1; - - if (_ps->IsUPeriodic()) - _periodU = 1.; - else - _periodU = 2.; - - if (_ps->IsVPeriodic()) - _periodV = 1.; - else - _periodV = 2.; - - if ((_uModes % 2) == 0) { - _uModesLower = - _uModes/2; - _uModesUpper = _uModes/2 - 1; - } - else { - _uModesLower = - (_uModes - 1)/2; - _uModesUpper = (_uModes - 1)/2; - } - if ((_vModes % 2) == 0) { - _vModesLower = - _vModes/2; - _vModesUpper = _vModes/2 - 1; - } - else { - _vModesLower = - (_vModes - 1)/2; - _vModesUpper = (_vModes - 1)/2; - } - - if (_ps->IsUPeriodic()) { - if ((_uM % 2) == 0) { - _uMLower = - _uM/2; - _uMUpper = _uM/2 - 1; - } - else { - _uMLower = - (_uM - 1)/2; - _uMUpper = (_uM - 1)/2; - } - } - else { - _uMLower = 0; - _uMUpper = _uM; - } - if (_ps->IsVPeriodic()) { - if ((_vM % 2) == 0) { - _vMLower = - _vM/2; - _vMUpper = _vM/2 - 1; - } - else { - _vMLower = - (_vM - 1)/2; - _vMUpper = (_vM - 1)/2; - } - } - else { - _vMLower = 0; - _vMUpper = _vM; - } - - - // Initialize Data - - _coeffOriginalData = new std::complex<double>*[_uModes]; - for(int j = 0; j < _uModes; j++){ - _coeffOriginalData[j] = new std::complex<double>[_vModes]; - - //for(int k = 0; k < _vModes; k++) - //_coeffOriginalData[j][k] = _PI->coeff[j][k]; - } - - _nData = data.size(); - _nModes = _uModes * _vModes; - - std::complex<double> *LSRhs = new std::complex<double> [_nData]; - std::complex<double> *LSMatrix = new std::complex<double> [_nModes * _nData]; - - for (int i=0;i<_nData;i++) - LSRhs[i] = data[i]; - - for (int j=0;j<_uModes;j++) - for (int k=0;k<_vModes;k++) - for (int i=0;i<_nData;i++) - LSMatrix[i+_nData*(k+_vModes*j)] = std::complex<double> - (cos(2*M_PI * ((j + _uModesLower) * u[i] / _periodU + - (k + _vModesLower) * v[i] / _periodV)), - sin(2*M_PI * ((j + _uModesLower) * u[i] / _periodU + - (k + _vModesLower) * v[i] / _periodV))); - - // some parameters for the lease square solvers "zgelss" - int info, rank; - int lwork = 66*_nData, one = 1; - double rcond = -1.; - double *s = new double [_nModes]; - double *rwork = new double [5*_nModes]; - std::complex<double> *work = new std::complex<double> [lwork]; - - zgelss_(_nData,_nModes,one,&LSMatrix[0],_nData,&LSRhs[0],_nData,&s[0],rcond, - rank,&work[0],lwork,&rwork[0],info); - - for(int j = 0; j < _uModes; j++) - for(int k = 0; k < _vModes; k++) - _coeffOriginalData[j][k] = LSRhs[k+_vModes*j]; - - // deleting lease square arrays - delete[] s, rwork, work; - delete[] LSMatrix, LSRhs; - - - // Initialize interpolation variables - _tmpOrigCoeff = std::vector< std::complex<double> >(_vModes); - _tmpOrigInterp = std::vector< std::complex<double> >(_uModes); - - if (_derivative) - _ReprocessSeriesCoeff(); - - // Check if we need to interpolate the derivative(s) - if(_derivative){ - // Initialize _fineDeriv and _fineDeriv2 to zero - if(_derivative & 1){ - _coeffDerivU = new std::complex<double>*[_uM]; - _coeffDerivV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivU[j] = new std::complex<double>[_vM]; - _coeffDerivV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivU[j][k] = 0.; - _coeffDerivV[j][k] = 0.; - } - } - } - - if(_derivative & 2){ - _coeffDerivUU = new std::complex<double>*[_uM]; - _coeffDerivVV = new std::complex<double>*[_uM]; - _coeffDerivUV = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++){ - _coeffDerivUU[j] = new std::complex<double>[_vM]; - _coeffDerivVV[j] = new std::complex<double>[_vM]; - _coeffDerivUV[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++){ - _coeffDerivUU[j][k] = 0.; - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - } - } - - // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2 - std::complex<double> I(0., 1.); - for(int j = _uM - 1; j >= 0; j--){ - for(int k = _vM - 1; k >= 0; k--){ - if(_derivative & 1){ - if (_ps->IsUPeriodic()) { - int J = j+_uMLower; - _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffData[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivU[j][k] = 2. * (double)(j + 1) * _coeffData[j + 1][k]; - else - _coeffDerivU[j][k] = _coeffDerivU[j + 2][k] + - 2. * (double)(j + 1) * _coeffData[j + 1][k]; - //if (j != 0) - //_coeffDerivU[j][k] *= 2.; - } - if (_ps->IsVPeriodic()) { - int K = k+_vMLower; - _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffData[j][k]; - } - else { - if (k == _vM - 1) - _coeffDerivV[j][k] = 0.; - else if (k == _vM - 2) - _coeffDerivV[j][k] = 2. * (double)(k + 1) * _coeffData[j][k + 1]; - else - _coeffDerivV[j][k] = _coeffDerivV[j][k + 2] + - 2. * (double)(k + 1) * _coeffData[j][k + 1]; - //if (k != 0) - //_coeffDerivV[j][k] *= 2.; - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 1) { - if (!_ps->IsUPeriodic()) { - if (j != 0) { - _coeffDerivU[j][k] *= 2.; - } - } - if (!_ps->IsVPeriodic()) { - if (k != 0) { - _coeffDerivV[j][k] *= 2.; - } - } - } - } - } - - for(int j = _uM - 1; j >= 0; j--) { - for(int k = _vM - 1; k >= 0; k--) { - if(_derivative & 2) { - if (_ps->IsUPeriodic()) { - int J = j+_uMLower; - _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * - _coeffDerivU[j][k]; - } - else { - if (j == _uM - 1) - _coeffDerivUU[j][k] = 0.; - else if (j == _uM - 2) - _coeffDerivUU[j][k] = 2. * (double)(j + 1) * - _coeffDerivU[j + 1][k]; - else - _coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] + - 2. * (double)(j + 1) * _coeffDerivU[j + 1][k]; - //if (j != 0) - //_coeffDerivUU[j][k] *= 2.; - } - if (_ps->IsVPeriodic()) { - int K = k+_vMLower; - _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivV[j][k]; - _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * - _coeffDerivU[j][k]; - } - else { - if (k == _vM - 1) { - _coeffDerivVV[j][k] = 0.; - _coeffDerivUV[j][k] = 0.; - } - else if (k == _vM - 2) { - _coeffDerivVV[j][k] = 2. * (double)(k + 1) * - _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = 2. * (double)(k + 1) * - _coeffDerivU[j][k + 1]; - } - else { - _coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivV[j][k + 1]; - _coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] + - 2. * (double)(k + 1) * _coeffDerivU[j][k + 1]; - } - } - } - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if (_derivative & 2) { - if (!_ps->IsUPeriodic() && _ps->IsVPeriodic()) { - if (j != 0) { - _coeffDerivUU[j][k] *= 2.; - } - } - if (_ps->IsUPeriodic() && !_ps->IsVPeriodic()) { - if (k != 0) { - _coeffDerivVV[j][k] *= 2.; - _coeffDerivUV[j][k] *= 2.; - } - } - } - } - } - } - - // Initialize interpolation variables - _tmpCoeff = std::vector< std::complex<double> >(_vM); - _tmpInterp = std::vector< std::complex<double> >(_uM); - -} - -FPatch::~FPatch() -{ - for(int j = 0; j < _uModes; j++) - delete [] _coeffOriginalData[j]; - delete [] _coeffOriginalData; - - for(int j = 0; j < _uM; j++) - delete [] _coeffData[j]; - delete [] _coeffData; - - if(_coeffDerivU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivU[j]; - delete [] _coeffDerivU; - } - if(_coeffDerivV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivV[j]; - delete [] _coeffDerivV; - } - if(_coeffDerivUU){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUU[j]; - delete [] _coeffDerivUU; - } - if(_coeffDerivVV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivVV[j]; - delete [] _coeffDerivVV; - } - if(_coeffDerivUV){ - for(int j = 0; j < _uM; j++) - delete [] _coeffDerivUV[j]; - delete [] _coeffDerivUV; - } -} - -int FPatch::_forwardSize = 0; -int FPatch::_backwardSize = 0; -fftw_plan FPatch::_forwardPlan; -fftw_plan FPatch::_backwardPlan; -fftw_complex *FPatch::_forwardData = 0; -fftw_complex *FPatch::_backwardData = 0; - -void FPatch::_SetForwardPlan(int n) -{ - if(n != _forwardSize){ - if(_forwardSize){ - fftw_destroy_plan(_forwardPlan); - fftw_free(_forwardData); - } - _forwardSize = n; - _forwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize); - _forwardPlan = - fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData, - FFTW_FORWARD, FFTW_ESTIMATE); - } -} - -void FPatch::_SetBackwardPlan(int n) -{ - if(n != _backwardSize){ - if(_backwardSize){ - fftw_destroy_plan(_backwardPlan); - fftw_free(_backwardData); - } - _backwardSize = n; - _backwardData = - (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize); - _backwardPlan = - fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData, - FFTW_BACKWARD, FFTW_ESTIMATE); - } -} - -void FPatch::_ForwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring the last element of - // fftData, which should just be the periodic extension) - _SetForwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _forwardData[i][0] = fftData[i].real(); - _forwardData[i][1] = fftData[i].imag(); - } - - // Perform forward FFT - fftw_execute(_forwardPlan); - - // Copy data back into fftData and scale by 1/(n - 1) - double s = 1. / (double)(n - 1); - for(int i = 0; i < n - 1; i++) - fftData[i] = - s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]); -} - -void FPatch::_BackwardFft(int n, std::complex<double> *fftData) -{ - // Initialize fftw plan and array (ignoring last element of fftData) - _SetBackwardPlan(n - 1); - for(int i = 0; i < n - 1; i++){ - _backwardData[i][0] = fftData[i].real(); - _backwardData[i][1] = fftData[i].imag(); - } - - // Perform backward FFT - fftw_execute(_backwardPlan); - - // Copy data back into fftData - for(int i = 0; i < n - 1; i++) - fftData[i] = - std::complex<double>(_backwardData[i][0], _backwardData[i][1]); - - // Fill in last element with copy of first element - fftData[n - 1] = fftData[0]; -} - -void FPatch::_ReprocessSeriesCoeff() -{ - _coeffData = new std::complex<double>*[_uM]; - for(int j = 0; j < _uM; j++) { - _coeffData[j] = new std::complex<double>[_vM]; - for(int k = 0; k < _vM; k++) - _coeffData[j][k] = 0.; - } - if (_ps->IsUPeriodic() && _ps->IsVPeriodic()) { - int uShift = (_uM-_uModes)%2 == 0 ? (_uM-_uModes)/2 : (_uM-_uModes)/2 + 1; - int vShift = (_vM-_vModes)%2 == 0 ? (_vM-_vModes)/2 : (_vM-_vModes)/2 + 1; - for (int j = 0; j < _uModes; j++) - for (int k = 0; k < _vModes; k++) - _coeffData[uShift + j][vShift + k] = _coeffOriginalData[j][k]; - } - else if (_ps->IsUPeriodic()) { - std::vector<double> u(_uM), v(_vM + 1); - for (int j = 0; j < _uM; j++) - u[j] = (double)j / (double)(_uM-1); - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [_uM]; - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM - 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - //dataV[k] = 1.; - //dataV[k] = 2. * cos(M_PI * v[k]) * cos(M_PI * v[k]) - 1.; - //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5) - 1.; - //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) * - //(0.5 * cos(M_PI * v[k]) + 0.5) * cos(2 * M_PI * u[j]); - //dataV[k] = cos(0.5 * cos(M_PI * v[k]) + 0.5) * - //cos(2 * M_PI * u[j]); - dataV[k] = _Interpolate(u[j],0.5 * cos(M_PI * v[k]) + 0.5); - } - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM -k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - for (int k = 0; k < _vM; k++) { - dataU[k][_uM - 1] = dataU[k][0]; - _ForwardFft(_uM, dataU[k]); - } - for (int j = _uMLower; j <= _uMUpper; j++) { - for (int k = 0; k < _vM; k++) - if ((j == _uMLower) || (j == _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.; - else if ((j >= 0) && (j < _uMUpper)) - _coeffData[_uMUpper + j][k] = dataU[k][j]; - else - _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1]; - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } - else if (_ps->IsVPeriodic()) { - std::vector<double> u(_uM + 1), v(_vM); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM; j++) - v[j] = (double)j / (double)(_vM-1); - - std::complex<double> **dataV = new std::complex<double> *[_uM]; - for (int j = 0; j < _uM; j++) - dataV[j] = new std::complex<double> [_vM]; - std::complex<double> *dataU = new std::complex<double>[2*_uM + 1]; - for (int k = 0; k < _vM - 1; k++) { - for (int j = 0; j < _uM + 1; j++) { - //dataU[j] = 1.; - //dataU[j] = 2. * cos(M_PI * u[j]) * cos(M_PI * u[j]); - dataU[j] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,v[k]); - } - for (int j = 1; j < _uM+1; j++) - dataU[_uM + j] = dataU[_uM -j]; - _BackwardFft(2*_uM + 1, dataU); - dataV[0][k] = 0.5 * dataU[0] / (double)_uM; - for (int j=1; j<_uM-1; j++) - dataV[j][k] = dataU[j] / (double)_uM; - dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM; - } - for (int j = 0; j < _uM; j++) { - dataV[j][_uM - 1] = dataV[j][0]; - _ForwardFft(_vM, dataV[j]); - } - for (int k = _vMLower; k <= _vMUpper; k++) { - //for (int j = 0; j < _uM - 1; j++) { - for (int j = 0; j < _uM; j++) - if ((k == _vMLower) || (k == _vMUpper)) - _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.; - else if ((j >= 0) && (j < _vMUpper)) - _coeffData[j][_uMUpper + k] = dataV[j][k]; - else - _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1]; - } - for (int j = 0; j < _uM; j++) - delete [] dataV[j]; - delete [] dataV; - delete [] dataU; - } - else { - std::vector<double> u(_uM + 1), v(_vM + 1); - for (int j = 0; j < _uM + 1; j++) - u[j] = (double)j / (double)_uM; - for (int j = 0; j < _vM + 1; j++) - v[j] = (double)j / (double)_vM; - - std::complex<double> **dataU = new std::complex<double> *[_vM]; - for (int k = 0; k < _vM; k++) - dataU[k] = new std::complex<double> [2*_uM + 1]; - - std::complex<double> *dataV = new std::complex<double>[2*_vM + 1]; - for (int j = 0; j < _uM + 1; j++) { - for (int k = 0; k < _vM + 1; k++) { - dataV[k] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5, - 0.5 * cos(M_PI * v[k]) + 0.5); - } - for (int k = 1; k < _vM+1; k++) - dataV[_vM + k] = dataV[_vM - k]; - _BackwardFft(2*_vM + 1, dataV); - dataU[0][j] = 0.5 * dataV[0] / (double)_vM; - for (int k=1; k<_vM-1; k++) - dataU[k][j] = dataV[k] / (double)_vM; - dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM; - } - - for (int k = 0; k < _vM; k++) { - for (int j = 1; j < _uM+1; j++) { - dataU[k][_uM + j] = dataU[k][_uM - k]; - } - _BackwardFft(2*_uM + 1, dataU[k]); - } - - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - if ((j == 0) || (j == _uM - 1)) - _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM; - else - _coeffData[j][k] = dataU[k][j]/ (double)_uM; - } - } - for (int k = 0; k < _vM; k++) - delete [] dataU[k]; - delete [] dataU; - delete [] dataV; - } -} - -std::complex<double> FPatch:: -_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x) -{ - int _polyOrder = _coeff.size()-1; - std::complex<double> out = 0.; - - out = x * _coeff[_polyOrder]; - for (int i = _polyOrder - 1; i > 0; i--) - out = x * (out + _coeff[i]); - out = out + _coeff[0]; - - return out; -} - -std::complex<double> FPatch:: - _Interpolate(double u, double v) -{ - double epsilon = 1e-12; - if (u < 0. - epsilon || u > 1. + epsilon || - v < 0. - epsilon || v > 1. + epsilon) { - Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) " - "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); - } - - // Interpolate to find value at (u,v) - for(int j = 0; j < _uModes; j++){ - for(int k = 0; k < _vModes; k++) { - _tmpOrigCoeff[k] = _coeffOriginalData[j][k]; - } - std::complex<double> y(cos(2 * M_PI * v / _periodV), - sin(2 * M_PI * v / _periodV)); - _tmpOrigInterp[j] = _PolyEval(_tmpOrigCoeff, y); - _tmpOrigInterp[j] *= std::complex<double> - (cos(2 * M_PI * _vModesLower * v / _periodV), - sin(2 * M_PI * _vModesLower * v / _periodV)); - } - std::complex<double> x(cos(2 * M_PI * u / _periodU), - sin(2 * M_PI * u / _periodU)); - return _PolyEval(_tmpOrigInterp, x) * std::complex<double> - (cos(2 * M_PI * _uModesLower * u / _periodU), - sin(2 * M_PI * _uModesLower * u / _periodU)); -} - -std::complex<double> FPatch:: - _Interpolate(double u, double v, int uDer, int vDer) -{ - //Msg::Info("%d %d %d",uDer,vDer,_derivative); - if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) || - ((uDer==1 || vDer==1) && !(_derivative & 1)) || - (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) { - Msg::Error("Derivative data not available: check contructor call %d %d %d", - uDer,vDer,_derivative); - return 0.; - } - - double epsilon = 1e-12; - if (u < 0. - epsilon || u > 1. + epsilon) { - Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) " - "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); - } - std::vector<double> uT(_uM,0.); - std::vector<double> vT(_vM,0.); - if (!_ps->IsUPeriodic()) { - for (int j = 0; j < _uM; j++) - if (j == 0) - uT[j] = 1.; - else if (j == 1) - uT[j] = 2. * u - 1; - else - uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2]; - } - if (!_ps->IsVPeriodic()) { - for (int k = 0; k < _vM; k++) - if (k == 0) - vT[k] = 1.; - else if (k == 1) - vT[k] = 2. * v - 1.; - else - vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2]; - } - // Interpolate to find value at (u,v) - for(int j = 0; j < _uM; j++){ - _tmpInterp[j] = 0.; - for(int k = 0; k < _vM; k++){ - //printf("i was here %d %d\n",j,k); - std::complex<double> tmp; - if(uDer == 0 && vDer == 0) - tmp = _coeffData[j][k]; - else if(uDer == 1 && vDer == 0) - tmp = _coeffDerivU[j][k]; - else if(uDer == 0 && vDer == 1) - tmp = _coeffDerivV[j][k]; - else if(uDer == 2 && vDer == 0) - tmp = _coeffDerivUU[j][k]; - else if(uDer == 0 && vDer == 2) - tmp = _coeffDerivVV[j][k]; - else - tmp = _coeffDerivUV[j][k]; - _tmpCoeff[k] = tmp; - } - //printf("i was here 00\n"); - if (_ps->IsVPeriodic()) { - std::complex<double> y(cos(2 * M_PI * v / _periodV), - sin(2 * M_PI * v / _periodV)); - _tmpInterp[j] = _PolyEval(_tmpCoeff, y); - _tmpInterp[j] *= std::complex<double> - (cos(2 * M_PI * _vMLower * v / _periodV), - sin(2 * M_PI * _vMLower * v / _periodV)); - } - else { - //printf("i was here 0\n"); - for(int k = 0; k < _vM; k++) - _tmpInterp[j] += _tmpCoeff[k] * vT[k]; - } - } - //printf("i was here\n"); - if (_ps->IsUPeriodic()) { - std::complex<double> x(cos(2 * M_PI * u / _periodU), - sin(2 * M_PI * u / _periodU)); - return _PolyEval(_tmpInterp, x) * std::complex<double> - (cos(2 * M_PI * _uMLower * u / _periodU), - sin(2 * M_PI * _uMLower * u / _periodU)); - } - else { - std::complex<double> tmp = 0.; - for(int j = 0; j < _uM; j++) - tmp += _tmpInterp[j] * uT[j]; - return tmp; - } -} - -void FPatch:: -F(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - - d = _Interpolate(u, v).real(); - - x = px + d * nx; - y = py + d * ny; - z = pz + d * nz; -} - -bool FPatch:: -Inverse(double x,double y,double z,double &u,double &v) -{ - bool result = _ps->OrthoProjectionOnSurface(x,y,z,u,v); - - u = UnscaleU(u); - v = UnscaleV(v); - - double tol = 1.e-12; - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - result = true; - else - result = false; - - return result; -} - -void FPatch:: -Dfdu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu, nyu, nzu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - - x = pxu + du * nx + d * nxu; - y = pyu + du * ny + d * nyu; - z = pzu + du * nz + d * nzu; -} - -void FPatch:: -Dfdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - - x = pxv + dv * nx + d * nxv; - y = pyv + dv * ny + d * nyv; - z = pzv + dv * nz + d * nzv; -} - -void FPatch:: -Dfdfdudu(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu,nyu,nzu); - _ps->Dfdfdudu(u,v,pxuu,pyuu,pzuu); - _ps->Dndndudu(u,v,nxuu,nyuu,nzuu); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - duu = _Interpolate(u, v, 2, 0).real(); - - x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu; - y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu; - z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu; -} - -void FPatch:: -Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - _ps->Dfdfdvdv(u,v,pxvv,pyvv,pzvv); - _ps->Dndndvdv(u,v,nxvv,nyvv,nzvv); - - d = _Interpolate(u, v, 0, 0).real(); - dv = _Interpolate(u, v, 0, 1).real(); - dvv = _Interpolate(u, v, 0, 2).real(); - - x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv; - y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv; - z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv; -} - -void FPatch:: -Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - double px, py, pz, nx, ny, nz, d; - double pxu, pyu, pzu, nxu, nyu, nzu, du; - double pxv, pyv, pzv, nxv, nyv, nzv, dv; - double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv; - - u = RescaleU(u); - v = RescaleV(v); - - _ps->F(u,v,px,py,pz); - _ps->GetUnitNormal(u,v,nx,ny,nz); - _ps->Dfdu(u,v,pxu,pyu,pzu); - _ps->Dndu(u,v,nxu,nyu,nzu); - _ps->Dfdv(u,v,pxv,pyv,pzv); - _ps->Dndv(u,v,nxv,nyv,nzv); - _ps->Dfdfdudv(u,v,pxuv,pyuv,pzuv); - _ps->Dndndudv(u,v,nxuv,nyuv,nzuv); - - d = _Interpolate(u, v, 0, 0).real(); - du = _Interpolate(u, v, 1, 0).real(); - dv = _Interpolate(u, v, 1, 0).real(); - duv = _Interpolate(u, v, 1, 1).real(); - - x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv; - y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv; - z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv; -} - -double FPatch::GetPou(double u, double v) -{ - double pouU, pouV; - - if (_hardEdge[3]) - pouU = OneSidedPartitionOfUnity(0.,1.,u); - else if (_hardEdge[1]) - pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u); - else - pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.); - - if (_hardEdge[0]) - pouV = OneSidedPartitionOfUnity(0.,1.,v); - else if (_hardEdge[2]) - pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v); - else - pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.); - - return pouU * pouV; -} - -void FPatch::Export(FILE *fp) -{ - double x,y,z; - - fprintf(fp, "%s\n", _ps->GetName().c_str()); - fprintf(fp, "%d\n", _ps->GetTag()); - _ps->GetOrigin(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE0(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetE1(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - _ps->GetScale(x,y,z); - fprintf(fp, "%g %g %g\n", x, y, z); - fprintf(fp, "%d\n", _ps->GetNumParameters()); - for (int i = 0; i < _ps->GetNumParameters(); i++) - fprintf(fp, "%g\n",_ps->GetParameter(i)); - - fprintf(fp, "%s\n", "FPatch"); - fprintf(fp, "%d\n", _tag); - fprintf(fp, "%d\n", _derivative); - fprintf(fp, "%g %g\n", _uMin, _uMax); - fprintf(fp, "%g %g\n", _vMin, _vMax); - fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2], - _hardEdge[3]); - fprintf(fp, "%d %d\n", _uModes, _vModes); - for (int j = 0; j < _uModes; j++) { - for (int k = 0; k < _vModes; k++) { - fprintf(fp, "%g %g\n", _coeffOriginalData[j][k].real(), - _coeffOriginalData[j][k].imag()); - } - } - fprintf(fp, "%d %d\n", _uM, _vM); - fprintf(fp, "%d\n", 0); - if (_derivative) { - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffData[j][k].real(), - _coeffData[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivU[j][k].real(), - _coeffDerivU[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivV[j][k].real(), - _coeffDerivV[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivUU[j][k].real(), - _coeffDerivUU[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivUV[j][k].real(), - _coeffDerivUV[j][k].imag()); - } - } - for (int j = 0; j < _uM; j++) { - for (int k = 0; k < _vM; k++) { - fprintf(fp, "%g %g\n", _coeffDerivVV[j][k].real(), - _coeffDerivVV[j][k].imag()); - } - } - } -} diff --git a/contrib/FourierModel/FPatch.h b/contrib/FourierModel/FPatch.h deleted file mode 100644 index d3a24e1e5e..0000000000 --- a/contrib/FourierModel/FPatch.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef _F_PATCH_H_ -#define _F_PATCH_H_ - -#include <cmath> -#include <vector> -#include <fftw3.h> -#include <complex> -#include "Patch.h" -#include "PartitionOfUnity.h" -#include "ProjectionSurface.h" - -namespace FM { - -// The base class for the patches -class FPatch : public Patch { - protected: - // Data Size - int _nData; - - // Number of Fourier Modes - int _uModes, _vModes, _nModes; - - // Number of Modes in reprocessed Fourier/Chebyshev series - int _uM, _vM; - - // Period Information - double _periodU, _periodV; - - // Limits of Fourier Series - int _uModesLower, _uModesUpper, _vModesLower, _vModesUpper; - - // Limits in the new series - int _uMLower, _uMUpper, _vMLower, _vMUpper; - - // data (and its first 2 derivatives) - std::complex<double> **_coeffOriginalData; - std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV; - std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV; - - // temporary interpolation variables - std::vector< std::complex<double> > _tmpOrigCoeff, _tmpOrigInterp; - std::vector< std::complex<double> > _tmpCoeff, _tmpInterp; - - // polynomial evaluator - std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff, - std::complex<double> x); - // interpolation wrapper - std::complex<double> _Interpolate(double u,double v); - std::complex<double> _Interpolate(double u,double v,int uDer,int vDer); - - // other internal functions - void _ReprocessSeriesCoeff(); - - // persistent fftw data (used to avoid recomputing the FFTW plans - // and reallocating memory every time) - static int _forwardSize, _backwardSize; - static fftw_plan _forwardPlan, _backwardPlan; - static fftw_complex *_forwardData, *_backwardData; - void _SetForwardPlan(int n); - void _SetBackwardPlan(int n); - - // This routine computes the forward FFT (ignoring the last element - // of the data) - void _ForwardFft(int n, std::complex<double> *fftData); - - // This routine computes the inverse FFT (ignoring the last element - // in the array), returns values in entire array (by using the - // periodic extension) - void _BackwardFft(int n, std::complex<double> *fftData); - - public: - FPatch - (int tag, ProjectionSurface* ps, - std::vector<double> &u, std::vector<double> &v, - std::vector< std::complex<double> > &data, int derivative = 3, - int uModes = 10, int vModes = 8, int uM = 17, int vM = 16, - bool hardEdge0 = false, bool hardEdge1 = false, bool hardEdge2 = false, - bool hardEdge3 = false); - virtual ~FPatch(); - - // Abstract functions of Patch - - virtual void Export(FILE *fp); - virtual double GetPou(double u, double v); - virtual void F(double u, double v, double &x, double &y, double &z); - virtual bool Inverse(double x,double y,double z,double &u,double &v); - virtual void Dfdu(double u, double v, double &x, double &y, double &z); - virtual void Dfdv(double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/IntersectionCurve.cpp b/contrib/FourierModel/IntersectionCurve.cpp deleted file mode 100644 index 88424a9520..0000000000 --- a/contrib/FourierModel/IntersectionCurve.cpp +++ /dev/null @@ -1,367 +0,0 @@ -#include <math.h> -#include "Message.h" -#include "IntersectionCurve.h" - -using namespace FM; - -IntersectionCurve::IntersectionCurve -(IntersectionInfo* II, std::vector<Patch*> patches) - : Curve(), _II(II) -{ - _tag = _II->tag; - _along = _II->along; - _h = 1.e-6; - _tol = 1.e-12; - - for (int i=0;i<patches.size();i++) { - if (patches[i]->GetTag() == _II->intersectingPatches[0].patchTag) { - _patch0 = patches[i]; - break; - } - } - for (int i=0;i<patches.size();i++) { - if (patches[i]->GetTag() == _II->intersectingPatches[1].patchTag) { - _patch1 = patches[i]; - break; - } - } - - double u,v,x,y,z; - x = _II->SP[0]; y = _II->SP[1]; z = _II->SP[2]; - _patch0->Inverse(x,y,z,u,v); - _SP0[0] = u; - _SP0[1] = v; - _patch1->Inverse(x,y,z,u,v); - _SP1[0] = u; - _SP1[1] = v; - //printf("SPx = %g; SPy = %g; SPz = %g;\n",x,y,z); - - x = _II->EP[0]; y = _II->EP[1]; z = _II->EP[2]; - _patch0->Inverse(x,y,z,u,v); - _EP0[0] = u; - _EP0[1] = v; - _patch1->Inverse(x,y,z,u,v); - _EP1[0] = u; - _EP1[1] = v; - //printf("EPx = %g; EPy = %g; EPz = %g;\n",x,y,z); -} - -void IntersectionCurve::F(double t, double &x, double &y, double &z) -{ - double u0, v0, u1, v1; - //printf("patch0 : %d\n",_patch0->GetTag()); - //printf("patch1 : %d\n",_patch1->GetTag()); - //printf("%g,%g,%g\n",_II->SP[0],_II->SP[1],_II->SP[2]); - //printf("%g,%g,%g\n",_II->EP[0],_II->EP[1],_II->EP[2]); - //printf("%g,%g,%g,%g\n",_SP0[0],_SP0[1],_EP0[0],_EP0[1]); - //printf("%g,%g,%g,%g\n",_SP1[0],_SP1[1],_EP1[0],_EP1[1]); - - if (_patch0->IsUPeriodic()) { - if (std::abs(_SP0[0]-_EP0[0])<1.e-12) - u0 = _SP0[0] + t * (1. + _EP0[0] - _SP0[0]); - else - u0 = _SP0[0] + t * (_EP0[0] - _SP0[0]); - u0 -= floor(u0); - } - else - u0 = _SP0[0] + t * (_EP0[0] - _SP0[0]); - - if (_patch0->IsVPeriodic()) { - if (std::abs(_SP0[1]-_EP0[1])<1.e-12) - v0 = _SP0[1] + t * (1. + _EP0[1] - _SP0[1]); - else - v0 = _SP0[1] + t * (_EP0[1] - _SP0[1]); - v0 -= floor(v0); - } - else - v0 = _SP0[1] + t * (_EP0[1] - _SP0[1]); - - if (_patch1->IsUPeriodic()) { - if (std::abs(_SP1[0]-_EP1[0])<1.e-12) - u1 = _SP1[0] + t * (1. + _EP1[0] - _SP1[0]); - else - u1 = _SP1[0] + t * (_EP1[0] - _SP1[0]); - u1 -= floor(u1); - } - else - u1 = _SP1[0] + t * (_EP1[0] - _SP1[0]); - - if (_patch1->IsVPeriodic()) { - if (std::abs(_SP1[1]-_EP1[1])<1.e-12) - v1 = _SP1[1] + t * (1. + _EP1[1] - _SP1[1]); - else - v1 = _SP1[1] + t * (_EP1[1] - _SP1[1]); - v1 -= floor(v1); - } - else - v1 = _SP1[1] + t * (_EP1[1] - _SP1[1]); - - if (_along) { - double x0, y0, z0; - _patch0->F(u0,v0,x0,y0,z0); - - double x1, y1, z1; - _patch1->F(u1,v1,x1,y1,z1); - - double r,u,v,rPlus,uPlus,vPlus; - - r = u0; - u = u1; - v = v1; - - double F[3]; - F[0] = x1 - x0; - F[1] = y1 - y0; - F[2] = z1 - z0; - - while ((std::abs(F[0])>_tol) || (std::abs(F[1])>_tol) || - (std::abs(F[2])>_tol)) { - rPlus = r + _h; - uPlus = u + _h; - vPlus = v + _h; - if (_patch0->IsUPeriodic()) - rPlus -= std::floor(rPlus); - if (_patch1->IsUPeriodic()) - uPlus -= std::floor(uPlus); - if (_patch1->IsVPeriodic()) - vPlus -= floor(vPlus); - - double x0rPlus, y0rPlus, z0rPlus; - _patch0->F(rPlus,v0,x0rPlus,y0rPlus,z0rPlus); - double x1uPlus, y1uPlus, z1uPlus; - _patch1->F(uPlus,v,x1uPlus,y1uPlus,z1uPlus); - double x1vPlus, y1vPlus, z1vPlus; - _patch1->F(u,vPlus,x1vPlus,y1vPlus,z1vPlus); - - double Df[3][3]; - Df[0][0] = - (x0rPlus - x0) / _h; - Df[0][1] = (x1uPlus - x1) / _h; - Df[0][2] = (x1vPlus - x1) / _h; - Df[1][0] = - (y0rPlus - y0) / _h; - Df[1][1] = (y1uPlus - y1) / _h; - Df[1][2] = (y1vPlus - y1) / _h; - Df[2][0] = - (z0rPlus - z0) / _h; - Df[2][1] = (z1uPlus - z1) / _h; - Df[2][2] = (z1vPlus - z1) / _h; - - double det = - Df[0][0] * (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) + - Df[0][1] * (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) + - Df[0][2] * (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]); - - double update[3]; - update[0] = - (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) * F[0] + - (Df[0][2] * Df[2][1] - Df[0][1] * Df[2][2]) * F[1] + - (Df[0][1] * Df[1][2] - Df[0][2] * Df[1][1]) * F[2]; - update[1] = - (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) * F[0] + - (Df[0][0] * Df[2][2] - Df[0][2] * Df[2][0]) * F[1] + - (Df[0][2] * Df[1][0] - Df[0][0] * Df[1][2]) * F[2]; - update[2] = - (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]) * F[0] + - (Df[0][1] * Df[2][0] - Df[0][0] * Df[2][1]) * F[1] + - (Df[0][0] * Df[1][1] - Df[0][1] * Df[1][0]) * F[2]; - - r -= update[0] / det; - u -= update[1] / det; - v -= update[2] / det; - - if (_patch0->IsUPeriodic()) - r -= std::floor(r); - if (_patch1->IsUPeriodic()) - u -= std::floor(u); - if (_patch1->IsVPeriodic()) - v -= floor(v); - - _patch0->F(r,v0,x0,y0,z0); - _patch1->F(u,v,x1,y1,z1); - - F[0] = x1 - x0; - F[1] = y1 - y0; - F[2] = z1 - z0; - } - x = x0; y = y0; z = z0; - } - else { - double x0, y0, z0; - _patch0->F(u0,v0,x0,y0,z0); - - double x1, y1, z1; - _patch1->F(u1,v1,x1,y1,z1); - - double r,u,v,rPlus,uPlus,vPlus; - - r = v0; - u = u1; - v = v1; - - double F[3]; - F[0] = x1 - x0; - F[1] = y1 - y0; - F[2] = z1 - z0; - - while ((std::abs(F[0])>_tol) || (std::abs(F[1])>_tol) || - (std::abs(F[2])>_tol)) { - rPlus = r + _h; - uPlus = u + _h; - vPlus = v + _h; - if (_patch0->IsVPeriodic()) - rPlus -= std::floor(rPlus); - if (_patch1->IsUPeriodic()) - uPlus -= std::floor(uPlus); - if (_patch1->IsVPeriodic()) - vPlus -= floor(vPlus); - - double x0rPlus, y0rPlus, z0rPlus; - _patch0->F(u0,rPlus,x0rPlus,y0rPlus,z0rPlus); - double x1uPlus, y1uPlus, z1uPlus; - _patch1->F(uPlus,v,x1uPlus,y1uPlus,z1uPlus); - double x1vPlus, y1vPlus, z1vPlus; - _patch1->F(u,vPlus,x1vPlus,y1vPlus,z1vPlus); - - double Df[3][3]; - Df[0][0] = - (x0rPlus - x0) / _h; - Df[0][1] = (x1uPlus - x1) / _h; - Df[0][2] = (x1vPlus - x1) / _h; - Df[1][0] = - (y0rPlus - y0) / _h; - Df[1][1] = (y1uPlus - y1) / _h; - Df[1][2] = (y1vPlus - y1) / _h; - Df[2][0] = - (z0rPlus - z0) / _h; - Df[2][1] = (z1uPlus - z1) / _h; - Df[2][2] = (z1vPlus - z1) / _h; - - double det = - Df[0][0] * (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) + - Df[0][1] * (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) + - Df[0][2] * (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]); - - double update[3]; - update[0] = - (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) * F[0] + - (Df[0][2] * Df[2][1] - Df[0][1] * Df[2][2]) * F[1] + - (Df[0][1] * Df[1][2] - Df[0][2] * Df[1][1]) * F[2]; - update[1] = - (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) * F[0] + - (Df[0][0] * Df[2][2] - Df[0][2] * Df[2][0]) * F[1] + - (Df[0][2] * Df[1][0] - Df[0][0] * Df[1][2]) * F[2]; - update[2] = - (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]) * F[0] + - (Df[0][1] * Df[2][0] - Df[0][0] * Df[2][1]) * F[1] + - (Df[0][0] * Df[1][1] - Df[0][1] * Df[1][0]) * F[2]; - - r -= update[0] / det; - u -= update[1] / det; - v -= update[2] / det; - - if (_patch0->IsVPeriodic()) - r -= std::floor(r); - if (_patch1->IsUPeriodic()) - u -= std::floor(u); - if (_patch1->IsVPeriodic()) - v -= floor(v); - - _patch0->F(u0,r,x0,y0,z0); - _patch1->F(u,v,x1,y1,z1); - - F[0] = x1 - x0; - F[1] = y1 - y0; - F[2] = z1 - z0; - } - x = x0; y = y0; z = z0; - } -} - -bool IntersectionCurve::Inverse(double x,double y,double z,double &t) -{ - double u0, v0; - _patch0->Inverse(x,y,z,u0,v0); - if (_along) { - if ((std::abs(_SP0[1]-_EP0[1])<1.e-12) && - (_patch0->IsVPeriodic())) { - t = (v0 - _SP0[1] > 0 ? v0 - _SP0[1] : 1. + v0 - _SP0[1]); - } - else - t = (v0 - _SP0[1]) / (_EP0[1] - _SP0[1]); - } - else { - if ((std::abs(_SP0[0]-_EP0[0])<1.e-12) && - (_patch0->IsUPeriodic())) { - t = (u0 - _SP0[0] > 0 ? u0 - _SP0[0] : 1. + u0 - _SP0[0]); - } - else - t = (u0 - _SP0[0]) / (_EP0[0] - _SP0[0]); - } - - if ((t < 0.) || (t > 1.)) - return false; - else - return true; -} - -double IntersectionCurve::GetPou(double t) -{ - return 1.; -} - -void IntersectionCurve::Dfdt(double t, double &x, double &y, double &z) -{ - double tPlus = t + _h; - double tMinus = t - _h; - - double xPlus, yPlus, zPlus; - double xMinus, yMinus, zMinus; - - if (tPlus > 1.) { - F(t,xPlus,yPlus,zPlus); - F(tMinus,xMinus,yMinus,zMinus); - x = (xPlus - xMinus) / _h; - y = (yPlus - yMinus) / _h; - z = (zPlus - zMinus) / _h; - } - else if (tMinus < 0.) { - F(tPlus,xPlus,yPlus,zPlus); - F(t,xMinus,yMinus,zMinus); - x = (xPlus - xMinus) / _h; - y = (yPlus - yMinus) / _h; - z = (zPlus - zMinus) / _h; - } - else { - F(tPlus,xPlus,yPlus,zPlus); - F(tMinus,xMinus,yMinus,zMinus); - x = 0.5 * (xPlus - xMinus) / _h; - y = 0.5 * (yPlus - yMinus) / _h; - z = 0.5 * (zPlus - zMinus) / _h; - } -} - -void IntersectionCurve::Dfdfdtdt(double t, double &x, double &y, double &z) -{ - double tPlus = t + _h; - double tMinus = t - _h; - - double xPlus, yPlus, zPlus; - double xMinus, yMinus, zMinus; - - if (tPlus > 1.) { - Dfdt(t,xPlus,yPlus,zPlus); - Dfdt(tMinus,xMinus,yMinus,zMinus); - x = (xPlus - xMinus) / _h; - y = (yPlus - yMinus) / _h; - z = (zPlus - zMinus) / _h; - } - else if (tMinus < 0.) { - Dfdt(tPlus,xPlus,yPlus,zPlus); - Dfdt(t,xMinus,yMinus,zMinus); - x = (xPlus - xMinus) / _h; - y = (yPlus - yMinus) / _h; - z = (zPlus - zMinus) / _h; - } - else { - Dfdt(tPlus,xPlus,yPlus,zPlus); - Dfdt(tMinus,xMinus,yMinus,zMinus); - x = 0.5 * (xPlus - xMinus) / _h; - y = 0.5 * (yPlus - yMinus) / _h; - z = 0.5 * (zPlus - zMinus) / _h; - } -} diff --git a/contrib/FourierModel/IntersectionCurve.h b/contrib/FourierModel/IntersectionCurve.h deleted file mode 100644 index b091d05956..0000000000 --- a/contrib/FourierModel/IntersectionCurve.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _INTERSECTION_CURVE_H_ -#define _INTERSECTION_CURVE_H_ - -#include "Curve.h" -#include "Patch.h" -#include "FM_Info.h" - -namespace FM { - -// The base class for the patches -class IntersectionCurve : public Curve { - private: - int _along; - double _h, _tol; - protected: - // Patches - Patch* _patch0; - Patch* _patch1; - // End Points - double _SP0[2],_EP0[2]; - double _SP1[2],_EP1[2]; - - public: - // Intersection Information - IntersectionInfo* _II; - IntersectionCurve(IntersectionInfo* II, std::vector<Patch*> patches); - virtual ~IntersectionCurve() {} - - // These are the virtual functions that must be provided by all - // derived patches: GetPou() returns the original smooth - // (non-normalized) cutoff on the patch; F() and Inverse() implement - // the mapping f: (t)->(x,y,z) and its inverse; and the Df*() and Dn*() - // functions return the derivatives of the mapping f and unit normal n - // with respect to u and v - virtual double GetPou(double t); - virtual void F(double t, double &x, double &y, double &z); - virtual bool Inverse(double x,double y,double z,double &t); - virtual void Dfdt(double t, double &x, double &y, double &z); - virtual void Dfdfdtdt(double t, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/Main.cpp b/contrib/FourierModel/Main.cpp deleted file mode 100644 index 1dc9e6185a..0000000000 --- a/contrib/FourierModel/Main.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include <cstring> -#include <iostream> -#include "Utils.h" -#include "Message.h" -#include "FM_Reader.h" - -int main(int argc, char *argv[]) -{ - char* fn; - char continuation[16] = "continuation"; - - if (argc == 1) { - Msg::Info("Reading from default file : untitled.fm"); - fn = "untitled.fm"; - } - else - fn = argv[1]; - - FM_Reader reader(fn); - - /* - - int n1=64; - int n2=64; - double h1 = 1./(n1-1); - double h2 = 1./(n2-1); - for (int j=0;j<n1;j++) { - for (int k=0;k<n2;k++) { - double u = j*h1; - double v = k*h2; - double x, y, z; - patches[0]->F(u,v,x,y,z); - printf("x(%d,%d) = %g; y(%d,%d) = %g; z(%d,%d) = %g;\n", - j+1,k+1,x,j+1,k+1,y,j+1,k+1,z); - } - } - - for (int i=0;i<reader.GetNumIntersections();i++) { - int n=128; - double h = 1./(n-1); - for (int j=0;j<n;j++) { - double t = j*h; - double x, y, z; - reader.GetIntersection(i)->F(t,x,y,z); - printf("x(%d,%d) = %g; y(%d,%d) = %g; z(%d,%d) = %g;\n", - i+1,j+1,x,i+1,j+1,y,i+1,j+1,z); - } - } - - for (int i=0;i<reader.GetNumPatches();i++) { - std::cout << reader.GetPatchList()[i]->tag << "\n"; - std::cout << reader.GetPatchList()[i]->type << "\n"; - std::cout << reader.GetPatchList()[i]->projection << "\n"; - std::cout << reader.GetPatchList()[i]->normal[0] << " " << - reader.GetPatchList()[i]->normal[1] << " " << - reader.GetPatchList()[i]->normal[2] << "\n"; - std::cout << reader.GetPatchList()[i]->origin[0] << " " << - reader.GetPatchList()[i]->origin[1] << " " << - reader.GetPatchList()[i]->origin[2] << "\n"; - std::cout << reader.GetPatchList()[i]->tangent[0] << " " << - reader.GetPatchList()[i]->tangent[1] << " " << - reader.GetPatchList()[i]->tangent[2] << "\n"; - if (!strcmp(reader.GetPatchList()[i]->type,continuation)) { - std::cout << reader.GetPatchList()[i]->periodic[0] << " " << - reader.GetPatchList()[i]->periodic[1] << "\n"; - std::cout << reader.GetPatchList()[i]->nModes[0] << " " << - reader.GetPatchList()[i]->nModes[1] << "\n"; - for (int j=0;j<reader.GetPatchList()[i]->nModes[0];j++) - for (int k=0;k<reader.GetPatchList()[i]->nModes[1];k++) - std::cout << reader.GetPatchList()[i]->coeff[j][k].real() << " " << - reader.GetPatchList()[i]->coeff[j][k].imag() << "\n"; - } - } - - for (int i=0;i<reader.GetIntersectionList().size();i++) { - std::cout << reader.GetIntersectionList()[i]->tag << "\n"; - std::cout << reader.GetIntersectionList()[i]->SP[0] << - " " << reader.GetIntersectionList()[i]->SP[1] << " " << - reader.GetIntersectionList()[i]->SP[2] << "\n"; - std::cout << reader.GetIntersectionList()[i]->EP[0] << - " " << reader.GetIntersectionList()[i]->EP[1] << " " << - reader.GetIntersectionList()[i]->EP[2] << "\n"; - std::cout << reader.GetIntersectionList()[i]-> - intersectingPatches[0].patchTag << "\n"; - std::cout << reader.GetIntersectionList()[i]-> - intersectingPatches[1].patchTag << "\n"; - } - */ - - int nU=64; - int nV=64; - - std::vector<int> color(3); - color[0] = 0; color[1] = 0; color[2] = 1; - - std::vector<std::vector<double> > x(nU,std::vector<double>(nV)); - std::vector<std::vector<double> > y(nU,std::vector<double>(nV)); - std::vector<std::vector<double> > z(nU,std::vector<double>(nV)); - - std::vector<std::vector<int> > mask = ones(nU,nV); - - for (int i=0;i<reader.GetNumFaces();i++) { - double hU = 1./(nU-1); - double hV = 1./(nV-1); - for (int j=0;j<nU;j++) { - for (int k=0;k<nV;k++) { - double u = j*hU; - double v = k*hV; - reader.GetFace(i)->F(u,v,x[j][k],y[j][k],z[j][k]); - } - } - if (i == 0) - plotSceneViewer(0,"snc.iv",color,x,y,z,nU,nV,mask); - else - plotSceneViewer(1,"snc.iv",color,x,y,z,nU,nV,mask); - } -} diff --git a/contrib/FourierModel/Makefile b/contrib/FourierModel/Makefile deleted file mode 100644 index f8888acbfc..0000000000 --- a/contrib/FourierModel/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -include ../../variables - -LIB = ../../lib/libGmshFourierModel.a - -CFLAGS = ${OPTIM} ${FLAGS} - -SRC = ProjectionSurface.cpp \ - PlaneProjectionSurface.cpp \ - ParaboloidProjectionSurface.cpp \ - CylindricalProjectionSurface.cpp \ - RevolvedParabolaProjectionSurface.cpp \ - Patch.cpp \ - FPatch.cpp \ - ContinuationPatch.cpp \ - ExactPatch.cpp\ - Curve.cpp \ - FCurve.cpp\ - IntersectionCurve.cpp \ - BlendedPatch.cpp \ - BlendOperator.cpp \ - FM_Edge.cpp\ - FM_Face.cpp\ - FM_Info.cpp\ - FM_Reader.cpp\ - FM_Vertex.cpp\ - Message.cpp \ - Utils.cpp \ - PartitionOfUnity.cpp - -OBJ = ${SRC:.cpp=.o} - -.SUFFIXES: .o .cpp - -${LIB}: ${OBJ} - ${AR} ${LIB} ${OBJ} - ${RANLIB} ${LIB} - -.cpp.o: - ${CXX} ${CFLAGS} -c $< - -clean: - rm -f *.o - -depend: - (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ - ${CXX} -MM ${CFLAGS} ${SRC} \ - ) >Makefile.new - cp Makefile Makefile.bak - cp Makefile.new Makefile - rm -f Makefile.new - -# DO NOT DELETE THIS LINE -ProjectionSurface.o: ProjectionSurface.cpp ProjectionSurface.h -PlaneProjectionSurface.o: PlaneProjectionSurface.cpp \ - PlaneProjectionSurface.h ProjectionSurface.h -ParaboloidProjectionSurface.o: ParaboloidProjectionSurface.cpp \ - ParaboloidProjectionSurface.h Utils.h ProjectionSurface.h -CylindricalProjectionSurface.o: CylindricalProjectionSurface.cpp \ - CylindricalProjectionSurface.h ProjectionSurface.h -RevolvedParabolaProjectionSurface.o: \ - RevolvedParabolaProjectionSurface.cpp \ - RevolvedParabolaProjectionSurface.h Utils.h ProjectionSurface.h -Patch.o: Patch.cpp Patch.h ProjectionSurface.h -FPatch.o: FPatch.cpp Message.h FPatch.h Patch.h ProjectionSurface.h \ - PartitionOfUnity.h -ContinuationPatch.o: ContinuationPatch.cpp Message.h ContinuationPatch.h \ - Patch.h ProjectionSurface.h FM_Info.h PartitionOfUnity.h -ExactPatch.o: ExactPatch.cpp Message.h ExactPatch.h Patch.h \ - ProjectionSurface.h FM_Info.h -Curve.o: Curve.cpp Curve.h -FCurve.o: FCurve.cpp FCurve.h Curve.h Patch.h ProjectionSurface.h -IntersectionCurve.o: IntersectionCurve.cpp Message.h IntersectionCurve.h \ - Curve.h Patch.h ProjectionSurface.h FM_Info.h -BlendedPatch.o: BlendedPatch.cpp BlendedPatch.h Message.h Patch.h \ - ProjectionSurface.h BlendOperator.h FM_Info.h PartitionOfUnity.h -BlendOperator.o: BlendOperator.cpp BlendOperator.h FM_Info.h Patch.h \ - ProjectionSurface.h -FM_Edge.o: FM_Edge.cpp FM_Edge.h Curve.h FM_Vertex.h Message.h -FM_Face.o: FM_Face.cpp FM_Face.h Patch.h ProjectionSurface.h FM_Edge.h \ - Curve.h FM_Vertex.h Message.h -FM_Info.o: FM_Info.cpp FM_Info.h -FM_Reader.o: FM_Reader.cpp Message.h FM_Reader.h Curve.h \ - IntersectionCurve.h Patch.h ProjectionSurface.h FM_Info.h ExactPatch.h \ - ContinuationPatch.h PartitionOfUnity.h PlaneProjectionSurface.h \ - CylindricalProjectionSurface.h ParaboloidProjectionSurface.h Utils.h \ - RevolvedParabolaProjectionSurface.h FM_Face.h FM_Edge.h FM_Vertex.h \ - BlendOperator.h BlendedPatch.h -FM_Vertex.o: FM_Vertex.cpp -Message.o: Message.cpp Message.h -Utils.o: Utils.cpp Utils.h Message.h -PartitionOfUnity.o: PartitionOfUnity.cpp PartitionOfUnity.h diff --git a/contrib/FourierModel/Message.cpp b/contrib/FourierModel/Message.cpp deleted file mode 100644 index 945ce213bf..0000000000 --- a/contrib/FourierModel/Message.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> - -#if !defined(WIN32) || defined(__CYGWIN__) -#include <sys/time.h> -#include <sys/resource.h> -#endif - -#if defined(__APPLE__) -#define RUSAGE_SELF 0 -#define RUSAGE_CHILDREN -1 -#endif - -#include "Message.h" - -using namespace FM; - -int Message::_commRank = 0; -int Message::_commSize = 1; -int Message::_verbosity = 3; -int Message::_progressMeterStep = 10; -int Message::_progressMeterCurrent = 0; - -void Message::Fatal(char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - if(_commSize > 1) - fprintf(stderr, "Fatal : [On processor %d] ", _commRank); - else - fprintf(stderr, "Fatal : "); - vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - va_end(args); - exit(1); -} - -void Message::Error(char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - if(_commSize > 1) - fprintf(stderr, "Error : [On processor %d] ", _commRank); - else - fprintf(stderr, "Error : "); - vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - va_end(args); -} - -void Message::Warning(char *fmt, ...) -{ - if(_commRank) return; - if(_verbosity >= 1){ - va_list args; - va_start(args, fmt); - fprintf(stderr, "Warning : "); - vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - va_end(args); - } -} - -void Message::Info(char *fmt, ...) -{ - if(_commRank) return; - if(_verbosity >= 2){ - va_list args; - va_start(args, fmt); - fprintf(stderr, "Info : "); - vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - va_end(args); - } -} - -void Message::Debug(char *fmt, ...) -{ - if(_commRank) return; - if(_verbosity >= 99){ - va_list args; - va_start(args, fmt); - fprintf(stderr, "Debug : "); - vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - va_end(args); - } -} - -void Message::Cpu(char *fmt, ...) -{ -#if !defined(WIN32) || defined(__CYGWIN__) - if(_commRank) return; - if(_verbosity >= 1){ - static struct rusage r; - getrusage(RUSAGE_SELF, &r); - double s = (double)r.ru_utime.tv_sec; - double us = (double)r.ru_utime.tv_usec; - double mem = (double)r.ru_maxrss; - va_list args; - va_start(args, fmt); - fprintf(stderr, "Info : "); - vfprintf(stderr, fmt, args); - if(mem) - fprintf(stderr, " (CPU = %gs Mem = %gkb)\n", s + 1.e-6 * us, mem); - else - fprintf(stderr, " (CPU = %gs)\n", s + 1.e-6 * us); - va_end(args); - } -#endif -} - -void Message::ResetProgressMeter(int step) -{ - _progressMeterStep = step; - _progressMeterCurrent = 0; -} - -void Message::ProgressMeter(int n, int N, char *fmt, ...) -{ - if(_commRank) return; - if(_verbosity >= 2){ - va_list args; - va_start(args, fmt); - if(100. * (double)n/(double)N >= _progressMeterCurrent){ - vfprintf(stderr, fmt, args); - fprintf(stderr, "(%d %%) \r", _progressMeterCurrent); - _progressMeterCurrent += _progressMeterStep; - } - if(n >= N - 1) - fprintf(stderr, "Done! \r"); - } -} - -void Message::ProgressMeter(int n, int N) -{ - if(_commRank) return; - if(_verbosity >= 2){ - if(100. * (double)n/(double)N >= _progressMeterCurrent){ - fprintf(stderr, "(%d %%)\r", _progressMeterCurrent); - _progressMeterCurrent += _progressMeterStep; - } - if(n >= N - 1) - fprintf(stderr, " \r") ; - } -} - -#if defined(HAVE_PETSC) - -#include "petsc.h" - -void Message::Barrier() -{ - MPI_Barrier(PETSC_COMM_WORLD); -} - -#else - -void Message::Barrier() -{ -} - -#endif diff --git a/contrib/FourierModel/Message.h b/contrib/FourierModel/Message.h deleted file mode 100644 index 1fd9de2cf2..0000000000 --- a/contrib/FourierModel/Message.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _MESSAGE_H_ -#define _MESSAGE_H_ - -#include <stdarg.h> - -namespace FM { - -// a class to manage messages -class Message { - private: - // current cpu number and total number of cpus - static int _commRank, _commSize; - // verbosity level - static int _verbosity; - // step (in %) of the progress meter and current progress % - static int _progressMeterStep, _progressMeterCurrent; - public: - Message() {} - static int GetCommRank(){ return _commRank; } - static int GetCommSize(){ return _commSize; } - static void SetCommRank(int val){ _commRank = val; } - static void SetCommSize(int val){ _commSize = val; } - static void Barrier(); - static void SetVerbosity(int val){ _verbosity = val; } - static void Fatal(char *fmt, ...); - static void Error(char *fmt, ...); - static void Warning(char *fmt, ...); - static void Info(char *fmt, ...); - static void Debug(char *fmt, ...); - static void Cpu(char *fmt, ...); - static void ProgressMeter(int n, int N); - static void ProgressMeter(int n, int N, char *fmt, ...); - static void ResetProgressMeter(int step=10); -}; - -typedef Message Msg; - -} - -#endif diff --git a/contrib/FourierModel/ParaboloidProjectionSurface.cpp b/contrib/FourierModel/ParaboloidProjectionSurface.cpp deleted file mode 100755 index 52830b97e2..0000000000 --- a/contrib/FourierModel/ParaboloidProjectionSurface.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include "ParaboloidProjectionSurface.h" - -using namespace FM; - -ParaboloidProjectionSurface::ParaboloidProjectionSurface -(int tag) : ProjectionSurface() -{ - SetTag(tag); - SetName(std::string("paraboloid")); - - numParameters_ = 0; - - O_[0] = O_[1] = O_[2] = 0.; - - E0_[0] = 0.; E0_[1] = 0.; E0_[2] = 1.; - E1_[0] = 1.; E1_[1] = 0.; E1_[2] = 0.; - E2_[0] = 0.; E2_[1] = 1.; E2_[2] = 0.; - - scale_[0] = scale_[1] = scale_[2] = 1.; -} - -ParaboloidProjectionSurface::ParaboloidProjectionSurface -(int tag, double O[3], double E0[3], double E1[3], double scale[3]) - : ProjectionSurface() -{ - SetTag(tag); - SetName(std::string("Paraboloid")); - - O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2]; - - E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2]; - E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2]; - - E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1]; - E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2]; - E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; - - scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2]; -} - -void ParaboloidProjectionSurface::F -(double u, double v, double &x, double &y, double &z) -{ - x = O_[0] + (u - 0.5) * scale_[1] * E1_[0] + (v - 0.5) * scale_[2] * E2_[0] + - ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] + - (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[0]; - y = O_[1] + (u - 0.5) * scale_[1] * E1_[1] + (v - 0.5) * scale_[2] * E2_[1] + - ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] + - (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[1]; - z = O_[2] + (u - 0.5) * scale_[1] * E1_[2] + (v - 0.5) * scale_[2] * E2_[2] + - ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] + - (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[2]; -} - -bool ParaboloidProjectionSurface::Inverse -(double x, double y, double z, double &u,double &v) -{ - double R[3]; - R[0] = x - O_[0]; - R[1] = y - O_[1]; - R[2] = z - O_[2]; - - double RdotT = 0., RdotNcT = 0.; - for (int i=0;i<3;i++) { - RdotT += R[i] * E1_[i]; - RdotNcT += R[i] * E2_[i]; - } - - RdotT /= scale_[1]; - RdotNcT /= scale_[2]; - - u = RdotT + 0.5; - v = RdotNcT + 0.5; -} - -void ParaboloidProjectionSurface::Dfdu -(double u, double v, double &x, double &y, double &z) -{ - x = scale_[1] * E1_[0] + - 2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[0]; - y = scale_[1] * E1_[1] + - 2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[1]; - z = scale_[1] * E1_[2] + - 2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[2]; -} - -void ParaboloidProjectionSurface::Dfdv -(double u, double v, double &x, double &y, double &z) -{ - x = scale_[2] * E2_[0] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[0]; - y = scale_[2] * E2_[1] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[1]; - z = scale_[2] * E2_[2] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[2]; -} - -void ParaboloidProjectionSurface::Dfdfdudu -(double u,double v, double &x, double &y, double &z) -{ - x = 2 * scale_[0] * scale_[1] * E0_[0]; - y = 2 * scale_[0] * scale_[1] * E0_[1]; - z = 2 * scale_[0] * scale_[1] * E0_[2]; -} - -void ParaboloidProjectionSurface::Dfdfdudv -(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void ParaboloidProjectionSurface::Dfdfdvdv -(double u, double v, double &x, double &y, double &z) -{ - x = 2. * scale_[0] * scale_[2] * E0_[0]; - y = 2. * scale_[0] * scale_[2] * E0_[1]; - z = 2. * scale_[0] * scale_[2] * E0_[2]; -} - -void ParaboloidProjectionSurface::Dfdfdfdududu -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void ParaboloidProjectionSurface::Dfdfdfdududv -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void ParaboloidProjectionSurface::Dfdfdfdudvdv -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void ParaboloidProjectionSurface::Dfdfdfdvdvdv -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -bool ParaboloidProjectionSurface::OrthoProjectionOnSurface -(double x, double y, double z, double& u, double& v) -{ - double R[3]; - R[0] = x - O_[0]; - R[1] = y - O_[1]; - R[2] = z - O_[2]; - - double x0 = 0., y0 = 0., z0 = 0.; - for (int i=0;i<3;i++) { - x0 += R[i] * E1_[i]; - y0 += R[i] * E2_[i]; - z0 += R[i] * E0_[i]; - } - - z0 /= scale_[0]; - - double a = 4.; - double b = 4. * (1. + z0); - double c = 1 + 4. * z0; - double d = z0 - x0 * x0 - y0 * y0; - - std::vector<double> root = SolveCubic(a,b,c,d); - - if (root.size()) { - double xP,yP,zP; - double minDist = 1.e12; - double minRoot; - for (int i=0;i<root.size();i++) { - xP = x0 / (2 * root[i] + 1.); - yP = y0 / (2 * root[i] + 1.); - zP = z0 + root[i]; - double dist = sqrt((x0-xP)*(x0-xP)+(y0-yP)*(y0-yP)+(z0-zP)*(z0-zP)); - if (dist < minDist) { - minDist = dist; - minRoot = root[i]; - } - } - xP = x0 / (2 * minRoot + 1.); - yP = y0 / (2 * minRoot + 1.); - zP = z0 + minRoot; - u = xP / scale_[1] + 0.5; - v = yP / scale_[2] + 0.5; - double tol =1.e-4; - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - return true; - else - return false; - } - else - return false; -} - -void ParaboloidProjectionSurface:: -SetParameter(int i, double x) -{ -} - -double ParaboloidProjectionSurface:: -GetParameter(int i) -{ - return 0.; -} - -std::string ParaboloidProjectionSurface:: -GetLabel(int i) -{ - return std::string(" "); -} diff --git a/contrib/FourierModel/ParaboloidProjectionSurface.h b/contrib/FourierModel/ParaboloidProjectionSurface.h deleted file mode 100755 index 92c13ce1cb..0000000000 --- a/contrib/FourierModel/ParaboloidProjectionSurface.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef _PARABOLOID_PROJECTION_SURFACE_H_ -#define _PARABOLOID_PROJECTION_SURFACE_H_ - -#include <cmath> -#include <vector> -#include "Utils.h" -#include "ProjectionSurface.h" - -namespace FM { - -class ParaboloidProjectionSurface : public ProjectionSurface { - public: - ParaboloidProjectionSurface - (int tag); - ParaboloidProjectionSurface - (int tag, double O[3], double E0[3], double E1[3], double scale[3]); - ParaboloidProjectionSurface(ParaboloidProjectionSurface *ps) - : ProjectionSurface(ps) - { - } - - virtual ~ParaboloidProjectionSurface - () {} - - virtual ProjectionSurface *clone() - { - return new ParaboloidProjectionSurface(this); - } - - // Abstract methods of ProjectionSurface - - virtual void F - (double u, double v, double &x, double &y, double &z); - virtual bool Inverse - (double x,double y,double z,double &u,double &v); - virtual void Dfdu - (double u, double v, double &x, double &y, double &z); - virtual void Dfdv - (double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdudvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdvdvdv - (double u,double v,double &x,double &y,double &z); - virtual bool OrthoProjectionOnSurface - (double x, double y, double z, double &u,double &v); - virtual void SetParameter - (int i, double x); - virtual double GetParameter - (int i); - virtual std::string GetLabel - (int i); -}; - -} - -#endif diff --git a/contrib/FourierModel/PartitionOfUnity.cpp b/contrib/FourierModel/PartitionOfUnity.cpp deleted file mode 100755 index 13e079a5c6..0000000000 --- a/contrib/FourierModel/PartitionOfUnity.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "PartitionOfUnity.h" diff --git a/contrib/FourierModel/PartitionOfUnity.h b/contrib/FourierModel/PartitionOfUnity.h deleted file mode 100755 index edb081e595..0000000000 --- a/contrib/FourierModel/PartitionOfUnity.h +++ /dev/null @@ -1,140 +0,0 @@ -#ifndef _PARTITION_OF_UNITY_H_ -#define _PARTITION_OF_UNITY_H_ - -#include <cmath> - -namespace FM { - -inline double OneSidedPartitionOfUnity(double t0, - double t1, - double t) -{ - if (t <= t0) { - return 1.; - } - else if (t >= t1) { - return 0.; - } - else { - double x = (t - t0) / (t1 - t0); - return exp(2.560851702 * exp(-1. / x) / (x - 1.)); - } -} - -inline double OneSidedPartitionOfUnityDt(double t0, - double t1, - double t) -{ - if (t <= t0) { - return 0.; - } - else if (t >= t1) { - return 0.; - } - else { - // From Maple - return (0.2560851702e1 * pow(t - t0, -0.2e1) * (t1 - t0) * - exp(-0.10e1 / (t - t0) * (t1 - t0)) / ((t - t0) / (t1 - t0) - 0.10e1) - - 0.2560851702e1 * exp(-0.10e1 / (t - t0) * (t1 - t0)) * - pow((t - t0) / (t1 - t0) - 0.10e1, -0.2e1) / (t1 - t0)) * - exp(0.2560851702e1 * exp(-0.10e1 / (t - t0) * (t1 - t0)) / - ((t - t0) / (t1 - t0) - 0.10e1)); - } -} - -inline double OneSidedPartitionOfUnityDtDt(double t0, - double t1, - double t) -{ - if (t <= t0) { - return 0.; - } - else if (t >= t1) { - return 0.; - } - else { - // From Maple - return ((-0.5121703404E1/pow(-t0+t,3.0)*(t1-t0)*exp(-0.1E1/(-t0+t)*(t1-t0))/ - ((-t0+t)/(t1-t0)-0.1E1)+0.2560851702E1/pow(-t0+t,4.0)*pow(t1-t0,2.0)* - exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1)-0.5121703404E1/pow(-t0+t,2.0)* - exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,2.0)+0.5121703404E1* - exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,3.0)/pow(t1-t0,2.0))* - exp(0.2560851702E1*exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1))+ - pow(0.2560851702E1/pow(-t0+t,2.0)*(t1-t0)* - exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1)-0.2560851702E1* - exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,2.0)/(t1-t0),2.0)* - exp(0.2560851702E1*exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1))); - } -} - -// and we get the two sided POU by multiplying two One sided POUs -inline double PartitionOfUnityInternalCall(double r, - double start1, double end1, - double end2, double start2) -{ - double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r); - double rightPart = OneSidedPartitionOfUnity(end2, start2, r); - return leftPart * rightPart; -} - -// and we get derivative of the the two sided POU by adding two One sided POUs -inline double PartitionOfUnityDtInternalCall(double r, - double start1, double end1, - double end2, double start2) -{ - double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r); - double rightPart = OneSidedPartitionOfUnity(end2, start2, r); - double leftPartDt = OneSidedPartitionOfUnityDt(start1, end1, r); - double rightPartDt = OneSidedPartitionOfUnityDt(end2, start2, r); - return leftPart * rightPartDt - rightPart * leftPartDt; -} - -// and we get derivative of the the two sided POU by adding two One sided POUs -inline double PartitionOfUnityDtDtInternalCall(double r, - double start1, double end1, - double end2, double start2) -{ - double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r); - double rightPart = OneSidedPartitionOfUnity(end2, start2, r); - double leftPartDt = OneSidedPartitionOfUnityDt(start1, end1, r); - double rightPartDt = OneSidedPartitionOfUnityDt(end2, start2, r); - double leftPartDtDt = OneSidedPartitionOfUnityDtDt(start1, end1, r); - double rightPartDtDt = OneSidedPartitionOfUnityDtDt(end2, start2, r); - - return leftPartDt * rightPartDt + leftPart * rightPartDtDt - - (rightPartDt * leftPartDt + rightPart * leftPartDtDt); -} - -// Compute the value of a two sided partition of unity -inline double PartitionOfUnity(double r, - double start1, double end1, - double end2, double start2) -{ - if(r < start1 || r > start2) { return 0.; } - if(r > end1 && r < end2) { return 1.; } - return PartitionOfUnityInternalCall(r, start1, end1, end2, start2); -} - -// Compute the derivative of a two sided partition of unity -inline double PartitionOfUnityDt(double r, - double start1, double end1, - double end2, double start2) -{ - if(r < start1 || r > start2) { return 0.; } - if(r > end1 && r < end2) { return 0.; } - return PartitionOfUnityDtInternalCall(r, start1, end1, end2, start2); -} - -// Compute the second derivative of a two sided partition of unity -inline double PartitionOfUnityDtDt(double r, - double start1, double end1, - double end2, double start2) -{ - if(r < start1 || r > start2) { return 0.; } - if(r > end1 && r < end2) { return 0.; } - return PartitionOfUnityDtDtInternalCall(r, start1, end1, end2, start2); -} - -} - -#endif diff --git a/contrib/FourierModel/Patch.cpp b/contrib/FourierModel/Patch.cpp deleted file mode 100644 index cd5a0c03b0..0000000000 --- a/contrib/FourierModel/Patch.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include <cmath> -#include "Patch.h" - -using namespace FM; - -Patch::Patch() :_ps(0), _uMin(0.), _uMax(1.), _vMin(0.), _vMax(1.), - _periodicityU(0), _periodicityV(0), _derivative(3), - _tag(-1) {} - -void Patch::GetNormal(double u, double v, double &x, double &y, double &z) -{ - double dfdu[3], dfdv[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1]; - y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2]; - z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0]; -} - -void Patch::GetUnitNormal(double u, double v, double &x, double &y, double &z) -{ - GetNormal(u, v, x, y, z); - double norm = sqrt(x * x + y * y + z * z); - if(norm > 0.) { - x /= norm; - y /= norm; - z /= norm; - } -} - -void Patch::Dndu(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndu[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - GetNormal(u,v,n[0],n[1],n[2]); - double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); - double normSquared = norm * norm; - double normCubed = normSquared * norm; - - dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - - dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1]; - dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - - dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2]; - dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - - dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0]; - - x = ((normSquared - n[0]*n[0])*dndu[0] - n[0]*n[1]*dndu[1] - - n[0]*n[2]*dndu[2]) / normCubed; - y = ((normSquared - n[1]*n[1])*dndu[1] - n[1]*n[0]*dndu[0] - - n[1]*n[2]*dndu[2]) / normCubed; - z = ((normSquared - n[2]*n[2])*dndu[2] - n[2]*n[0]*dndu[0] - - n[2]*n[1]*dndu[1]) / normCubed; -} - -void Patch::Dndv(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndv[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - GetNormal(u,v,n[0],n[1],n[2]); - double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); - double normSquared = norm * norm; - double normCubed = normSquared * norm; - - dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] - - dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1]; - dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] - - dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2]; - dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] - - dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0]; - - x = ((normSquared - n[0]*n[0])*dndv[0] - n[0]*n[1]*dndv[1] - - n[0]*n[2]*dndv[2]) / normCubed; - y = ((normSquared - n[1]*n[1])*dndv[1] - n[1]*n[0]*dndv[0] - - n[1]*n[2]*dndv[2]) / normCubed; - z = ((normSquared - n[2]*n[2])*dndv[2] - n[2]*n[0]*dndv[0] - - n[2]*n[1]*dndv[1]) / normCubed; -} diff --git a/contrib/FourierModel/Patch.h b/contrib/FourierModel/Patch.h deleted file mode 100644 index f428d514cc..0000000000 --- a/contrib/FourierModel/Patch.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef _PATCH_H_ -#define _PATCH_H_ - -#include <cmath> -#include "ProjectionSurface.h" - -namespace FM { - -// The base class for the patches -class Patch { - protected: - // bitfield telling if we also interpolate the derivative(s) - int _tag; - int _derivative; - double _uMin, _uMax; - double _vMin, _vMax; - int _periodicityU, _periodicityV; - ProjectionSurface* _ps; - // Hard edges - int _hardEdge[4]; - public: - Patch(); - virtual ~Patch() {} - - inline int GetTag() { return _tag; } - - inline double GetMinU() { return _uMin; } - inline double GetMaxU() { return _uMax; } - inline double GetMinV() { return _vMin; } - inline double GetMaxV() { return _vMax; } - inline void SetMinU(double uMin) { _uMin = uMin; } - inline void SetMaxU(double uMax) { _uMax = uMax; } - inline void SetMinV(double vMin) { _vMin = vMin; } - inline void SetMaxV(double vMax) { _vMax = vMax; } - - inline bool IsUPeriodic() - { if (_periodicityU) return true; else return false; } - inline bool IsVPeriodic() - { if (_periodicityV) return true; else return false; } - - inline bool IsHardEdge(int i) - { if (_hardEdge[i]) return true; else return false; } - - inline void SetPeriodicity(int pU, int pV) - { _periodicityU = pU; _periodicityV = pV; } - - inline double RescaleU(double u) - { - u = _uMin + u * (_uMax - _uMin); - if (_periodicityU) { - u -= std::floor(float(u)); - } - return u; - } - inline double RescaleV(double v) - { - v = _vMin + v * (_vMax - _vMin); - if (_periodicityV) { - v -= std::floor(float(v)); - } - return v; - } - - inline double UnscaleU(double u) - { - u -= _uMin; - //printf("u1 = %.16g\n",u); - if (_periodicityU) { - if ((std::abs(u) < 1.e-4)||(std::abs(u-1.) < 1.e-4)|| - (std::abs(u+1.) < 1.e-4)) - u -= std::floor(round(u)); - else - u -= std::floor(u); - } - //printf("u2 = %.16g\n",u); - u /= (_uMax - _uMin); - return u; - } - inline double UnscaleV(double v) - { - v -= _vMin; - if (_periodicityV) { - v -= std::floor(float(v)); - } - v /= (_vMax - _vMin); - return v; - } - - inline int GetDerivativeBitField() { return _derivative; } - inline ProjectionSurface* GetProjectionSurface() { return _ps; } - inline void SetProjectionSurface(ProjectionSurface* ps) { _ps = ps; } - - // These are the virtual functions that must be provided by all - // derived patches: GetPou() returns the original smooth - // (non-normalized) cutoff on the patch; F() and Inverse() implement - // the mapping f: (u,v)->(x,y,z) and its inverse; and the Df*() and Dn*() - // functions return the derivatives of the mapping f and unit normal n - // with respect to u and v - virtual void Export(FILE *fp) = 0; - virtual double GetPou(double u, double v) = 0; - virtual void F(double u, double v, double &x, double &y, double &z) = 0; - virtual bool Inverse(double x,double y,double z,double &u,double &v) = 0; - virtual void Dfdu(double u, double v, double &x, double &y, double &z) = 0; - virtual void Dfdv(double u, double v, double &x, double &y, double &z) = 0; - virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z) = 0; - - // These functions may also be provided by the derived patches - // (usually for better performance), but they don't have to - virtual void Dndu(double u, double v, double &x, double &y, double &z); - virtual void Dndv(double u, double v, double &x, double &y, double &z); - virtual void GetUnitNormal(double u,double v,double &x,double &y,double &z); - virtual void GetNormal(double u, double v, double &x, double &y, double &z); - -}; - -} - -#endif diff --git a/contrib/FourierModel/PlaneProjectionSurface.cpp b/contrib/FourierModel/PlaneProjectionSurface.cpp deleted file mode 100755 index e47808f394..0000000000 --- a/contrib/FourierModel/PlaneProjectionSurface.cpp +++ /dev/null @@ -1,183 +0,0 @@ -#include "PlaneProjectionSurface.h" - -using namespace FM; - -PlaneProjectionSurface::PlaneProjectionSurface -(int tag) : ProjectionSurface() -{ - SetTag(tag); - SetName(std::string("plane")); - - numParameters_ = 0; - - O_[0] = O_[1] = O_[2] = 0.; - - E0_[0] = 1.; E0_[1] = 0.; E0_[2] = 0.; - E1_[0] = 0.; E1_[1] = 1.; E1_[2] = 0.; - E2_[0] = 0.; E2_[1] = 0.; E2_[2] = 1.; - - scale_[0] = scale_[1] = scale_[2] = 1.; -} - -PlaneProjectionSurface::PlaneProjectionSurface -(int tag, double O[3], double E0[3], double E1[3], double scale[3]) - : ProjectionSurface() -{ - SetTag(tag); - SetName(std::string("Plane")); - - O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2]; - - E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2]; - E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2]; - - E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1]; - E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2]; - E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; - - scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2]; -} - -void PlaneProjectionSurface:: -F(double u, double v, double &x, double &y, double &z) -{ - x = O_[0] + u * scale_[1] * E1_[0] + v * scale_[2] * E2_[0]; - y = O_[1] + u * scale_[1] * E1_[1] + v * scale_[2] * E2_[1]; - z = O_[2] + u * scale_[1] * E1_[2] + v * scale_[2] * E2_[2]; -} - -bool PlaneProjectionSurface:: -Inverse(double x, double y, double z, double &u,double &v) -{ - u = (x - O_[0]) * E1_[0] + (y - O_[1]) * E1_[1] + (z - O_[2]) * E1_[2]; - v = (x - O_[0]) * E2_[0] + (y - O_[1]) * E2_[1] + (z - O_[2]) * E2_[2]; - - u /= scale_[1]; - v /= scale_[2]; - - double tol = 1.e-12; - - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - return true; - else - return false; -} - -void PlaneProjectionSurface:: -Dfdu(double u, double v, double &x, double &y, double &z) -{ - x = scale_[1] * E1_[0]; - y = scale_[1] * E1_[1]; - z = scale_[1] * E1_[2]; -} - -void PlaneProjectionSurface:: -Dfdv(double u, double v, double &x, double &y, double &z) -{ - x = scale_[2] * E2_[0]; - y = scale_[2] * E2_[1]; - z = scale_[2] * E2_[2]; -} - -void PlaneProjectionSurface:: -Dfdfdudu(double u,double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdudv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdvdv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdfdududu(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdfdududv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdfdudvdv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dfdfdfdvdvdv(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -GetNormal(double u, double v, double &x, double &y, double &z) -{ - x = E0_[0]; - y = E0_[1]; - z = E0_[2]; -} - -void PlaneProjectionSurface:: -Dndu(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dndv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dndndudu(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dndndudv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -void PlaneProjectionSurface:: -Dndndvdv(double u, double v, double &x, double &y, double &z) -{ - x = y = z = 0.; -} - -bool PlaneProjectionSurface:: -OrthoProjectionOnSurface(double x, double y, double z, double &u,double &v) -{ - return Inverse(x,y,z,u,v); -} - -void PlaneProjectionSurface:: -SetParameter(int i, double x) -{ -} - -double PlaneProjectionSurface:: -GetParameter(int i) -{ - return 0.; -} - -std::string PlaneProjectionSurface:: -GetLabel(int i) -{ - return std::string(" "); -} diff --git a/contrib/FourierModel/PlaneProjectionSurface.h b/contrib/FourierModel/PlaneProjectionSurface.h deleted file mode 100755 index 41a290f409..0000000000 --- a/contrib/FourierModel/PlaneProjectionSurface.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _PLANE_PROJECTION_SURFACE_H_ -#define _PLANE_PROJECTION_SURFACE_H_ - -#include <cmath> -#include "ProjectionSurface.h" - -namespace FM { - -class PlaneProjectionSurface : public ProjectionSurface { - public: - PlaneProjectionSurface - (int tag); - PlaneProjectionSurface - (int tag, double O[3], double E0[3], double E1[3], double scale[3]); - PlaneProjectionSurface(PlaneProjectionSurface *ps) - : ProjectionSurface(ps) {} - - virtual ~PlaneProjectionSurface - () {} - - virtual ProjectionSurface *clone() - { - return new PlaneProjectionSurface(this); - } - - // Abstract methods of ProjectionSurface - - virtual void F - (double u, double v, double &x, double &y, double &z); - virtual bool Inverse - (double x,double y,double z,double &u,double &v); - virtual void Dfdu - (double u, double v, double &x, double &y, double &z); - virtual void Dfdv - (double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdudvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdvdvdv - (double u,double v,double &x,double &y,double &z); - virtual bool OrthoProjectionOnSurface - (double x, double y, double z, double &u,double &v); - virtual void SetParameter - (int i, double x); - virtual double GetParameter - (int i); - virtual std::string GetLabel - (int i); - - // Redefinitions for PlaneProjectionSurface - - virtual void GetNormal - (double u, double v, double &x, double &y, double &z); - virtual void Dndu - (double u, double v, double &x, double &y, double &z); - virtual void Dndv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudu - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndvdv - (double u, double v, double &x, double &y, double &z); -}; - -} - -#endif diff --git a/contrib/FourierModel/ProjectionSurface.cpp b/contrib/FourierModel/ProjectionSurface.cpp deleted file mode 100755 index c1731f5001..0000000000 --- a/contrib/FourierModel/ProjectionSurface.cpp +++ /dev/null @@ -1,357 +0,0 @@ -#include <cmath> -#include "ProjectionSurface.h" - -using namespace FM; - -ProjectionSurface::ProjectionSurface -(double uPeriod, double vPeriod) -{ - tag_ = -1; - name_ = std::string("default"); - numParameters_ = 0; - - uPeriod_ = uPeriod; - vPeriod_ = vPeriod; - - if (uPeriod_ < 0.) - uPeriodic_ = false; - else - uPeriodic_ = true; - - if (vPeriod_ < 0.) - vPeriodic_ = false; - else - vPeriodic_ = true; - - for (int l=0;l<3;l++) { - O_[l] = E0_[l] = E1_[l] = E2_[l] = scale_[l] = 0.; - } -} - -void ProjectionSurface::GetNormal -(double u, double v, double &x, double &y, double &z) -{ - double dfdu[3], dfdv[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1]; - y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2]; - z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0]; -} - -void ProjectionSurface::GetUnitNormal -(double u, double v, double &x, double &y, double &z) -{ - GetNormal(u, v, x, y, z); - double norm = sqrt(x * x + y * y + z * z); - if(norm > 0.) { - x /= norm; - y /= norm; - z /= norm; - } -} - -void ProjectionSurface::Dndu -(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndu[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - GetNormal(u,v,n[0],n[1],n[2]); - double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); - double normSquared = norm * norm; - double normCubed = normSquared * norm; - - dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - - dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1]; - dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - - dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2]; - dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - - dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0]; - - x = ((normSquared - n[0]*n[0])*dndu[0] - n[0]*n[1]*dndu[1] - - n[0]*n[2]*dndu[2]) / normCubed; - y = ((normSquared - n[1]*n[1])*dndu[1] - n[1]*n[0]*dndu[0] - - n[1]*n[2]*dndu[2]) / normCubed; - z = ((normSquared - n[2]*n[2])*dndu[2] - n[2]*n[0]*dndu[0] - - n[2]*n[1]*dndu[1]) / normCubed; -} - -void ProjectionSurface:: -Dndv(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndv[3]; - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - GetNormal(u,v,n[0],n[1],n[2]); - double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); - double normSquared = norm * norm; - double normCubed = normSquared * norm; - - dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] - - dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1]; - dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] - - dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2]; - dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] - - dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0]; - - x = ((normSquared - n[0]*n[0])*dndv[0] - n[0]*n[1]*dndv[1] - - n[0]*n[2]*dndv[2]) / normCubed; - y = ((normSquared - n[1]*n[1])*dndv[1] - n[1]*n[0]*dndv[0] - - n[1]*n[2]*dndv[2]) / normCubed; - z = ((normSquared - n[2]*n[2])*dndv[2] - n[2]*n[0]*dndv[0] - - n[2]*n[1]*dndv[1]) / normCubed; -} - -void ProjectionSurface:: -Dndndudu(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3], - dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3], - dndu[3],dndndudu[3]; - - GetNormal(u,v,n[0],n[1],n[2]); - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]); - Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]); - Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]); - Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]); - - dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - - dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1]; - dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - - dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2]; - dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - - dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0]; - - dndndudu[0] = dfdfdfdududu[1] * dfdv[2] + dfdfdudu[1] * dfdfdudv[2] + - dfdfdudu[1] * dfdfdudv[2] + dfdu[1] * dfdfdfdududv[2] - - dfdfdfdududu[2] * dfdv[1] - dfdfdudu[2] * dfdfdudv[1] - - dfdfdudu[2] * dfdfdudv[1] - dfdu[2] * dfdfdfdududv[1]; - dndndudu[1] = dfdfdfdududu[2] * dfdv[0] + dfdfdudu[2] * dfdfdudv[0] + - dfdfdudu[2] * dfdfdudv[0] + dfdu[2] * dfdfdfdududv[0] - - dfdfdfdududu[0] * dfdv[2] - dfdfdudu[0] * dfdfdudv[2] - - dfdfdudu[0] * dfdfdudv[2] - dfdu[0] * dfdfdfdududv[2]; - dndndudu[2] = dfdfdfdududu[0] * dfdv[1] + dfdfdudu[0] * dfdfdudv[1] + - dfdfdudu[0] * dfdfdudv[1] + dfdu[0] * dfdfdfdududv[1] - - dfdfdfdududu[1] * dfdv[0] - dfdfdudu[1] * dfdfdudv[0] - - dfdfdudu[1] * dfdfdudv[0] - dfdu[1] * dfdfdfdududv[0]; - - double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2]; - double nDotNu = n[0] * dndu[0] + n[1] * dndu[1] + n[2] * dndu[2]; - double nuDotNu = dndu[0] * dndu[0] + dndu[1] * dndu[1] + dndu[2] * dndu[2]; - double nDotNuu = n[0] * dndndudu[0] + n[1] * dndndudu[1] + - n[2] * dndndudu[2]; - - double norm = sqrt(nDotN); - double normCubed = nDotN * norm; - double normToFive = nDotN * normCubed; - - x = (nDotN * dndndudu[0] - 2 * nDotNu * dndu[0] - - (nuDotNu + nDotNuu) * n[0]) / normCubed + - 3 * nDotNu * nDotNu * n[0] / normToFive; - y = (nDotN * dndndudu[1] - 2 * nDotNu * dndu[1] - - (nuDotNu + nDotNuu) * n[1]) / normCubed + - 3 * nDotNu * nDotNu * n[1] / normToFive; - z = (nDotN * dndndudu[2] - 2 * nDotNu * dndu[2] - - (nuDotNu + nDotNuu) * n[2]) / normCubed + - 3 * nDotNu * nDotNu * n[2] / normToFive; -} - -void ProjectionSurface:: -Dndndudv(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3], - dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3], - dndu[3],dndv[3],dndndudv[3]; - - GetNormal(u,v,n[0],n[1],n[2]); - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]); - Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]); - Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]); - Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]); - - dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - - dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1]; - dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - - dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2]; - dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - - dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0]; - - dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] - - dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1]; - dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] - - dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2]; - dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] - - dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0]; - - dndndudv[0] = dfdfdfdududv[1] * dfdv[2] + dfdfdudu[1] * dfdfdvdv[2] + - dfdfdudv[1] * dfdfdudv[2] + dfdu[1] * dfdfdfdudvdv[2] - - dfdfdfdududv[2] * dfdv[1] - dfdfdudu[2] * dfdfdvdv[1] - - dfdfdudv[2] * dfdfdudv[1] - dfdu[2] * dfdfdfdudvdv[1]; - dndndudv[1] = dfdfdfdududv[2] * dfdv[0] + dfdfdudu[2] * dfdfdvdv[0] + - dfdfdudv[2] * dfdfdudv[0] + dfdu[2] * dfdfdfdudvdv[0] - - dfdfdfdududv[0] * dfdv[2] - dfdfdudu[0] * dfdfdvdv[2] - - dfdfdudv[0] * dfdfdudv[2] - dfdu[0] * dfdfdfdudvdv[2]; - dndndudv[2] = dfdfdfdududv[0] * dfdv[1] + dfdfdudu[0] * dfdfdvdv[1] + - dfdfdudv[0] * dfdfdudv[1] + dfdu[0] * dfdfdfdudvdv[1] - - dfdfdfdududv[1] * dfdv[0] - dfdfdudu[1] * dfdfdvdv[0] - - dfdfdudv[1] * dfdfdudv[0] - dfdu[1] * dfdfdfdudvdv[0]; - - double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2]; - double nDotNu = n[0] * dndu[0] + n[1] * dndu[1] + n[2] * dndu[2]; - double nDotNv = n[0] * dndv[0] + n[1] * dndv[1] + n[2] * dndv[2]; - double nuDotNv = dndu[0] * dndv[0] + dndu[1] * dndv[1] + dndu[2] * dndv[2]; - double nDotNuv = n[0] * dndndudv[0] + n[1] * dndndudv[1] + - n[2] * dndndudv[2]; - - double norm = sqrt(nDotN); - double normCubed = nDotN * norm; - double normToFive = nDotN * normCubed; - - x = (nDotN * dndndudv[0] - nDotNv * dndu[0] - nDotNu * dndv[0] - - (nuDotNv + nDotNuv) * n[0]) / normCubed + - 3 * nDotNu * nDotNv * n[0] / normToFive; - y = (nDotN * dndndudv[1] - nDotNv * dndu[1] - nDotNu * dndv[1] - - (nuDotNv + nDotNuv) * n[1]) / normCubed + - 3 * nDotNu * nDotNv * n[1] / normToFive; - z = (nDotN * dndndudv[2] - nDotNv * dndu[2] - nDotNu * dndv[2] - - (nuDotNv + nDotNuv) * n[2]) / normCubed + - 3 * nDotNu * nDotNv * n[2] / normToFive; -} - -void ProjectionSurface:: -Dndndvdv(double u, double v, double &x, double &y, double &z) -{ - double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3], - dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3], - dndv[3],dndndvdv[3]; - - GetNormal(u,v,n[0],n[1],n[2]); - Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]); - Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]); - Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]); - Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]); - Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]); - Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]); - Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]); - Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]); - Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]); - - dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] - - dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1]; - dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] - - dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2]; - dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] - - dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0]; - - dndndvdv[0] = dfdfdfdudvdv[1] * dfdv[2] + dfdfdudv[1] * dfdfdvdv[2] + - dfdfdudv[1] * dfdfdvdv[2] + dfdu[1] * dfdfdfdvdvdv[2] - - dfdfdfdudvdv[2] * dfdv[1] - dfdfdudv[2] * dfdfdvdv[1] - - dfdfdudv[2] * dfdfdvdv[1] - dfdu[2] * dfdfdfdvdvdv[1]; - dndndvdv[1] = dfdfdfdudvdv[2] * dfdv[0] + dfdfdudv[2] * dfdfdvdv[0] + - dfdfdudv[2] * dfdfdvdv[0] + dfdu[2] * dfdfdfdvdvdv[0] - - dfdfdfdudvdv[0] * dfdv[2] - dfdfdudv[0] * dfdfdvdv[2] - - dfdfdudv[0] * dfdfdvdv[2] - dfdu[0] * dfdfdfdvdvdv[2]; - dndndvdv[2] = dfdfdfdudvdv[0] * dfdv[1] + dfdfdudv[0] * dfdfdvdv[1] + - dfdfdudv[0] * dfdfdvdv[1] + dfdu[0] * dfdfdfdvdvdv[1] - - dfdfdfdudvdv[1] * dfdv[0] - dfdfdudv[1] * dfdfdvdv[0] - - dfdfdudv[1] * dfdfdvdv[0] - dfdu[1] * dfdfdfdvdvdv[0]; - - double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2]; - double nDotNv = n[0] * dndv[0] + n[1] * dndv[1] + n[2] * dndv[2]; - double nvDotNv = dndv[0] * dndv[0] + dndv[1] * dndv[1] + dndv[2] * dndv[2]; - double nDotNvv = n[0] * dndndvdv[0] + n[1] * dndndvdv[1] + - n[2] * dndndvdv[2]; - - double norm = sqrt(nDotN); - double normCubed = nDotN * norm; - double normToFive = nDotN * normCubed; - - x = (nDotN * dndndvdv[0] - 2 * nDotNv * dndv[0] - - (nvDotNv + nDotNvv) * n[0]) / normCubed + - 3 * nDotNv * nDotNv * n[0] / normToFive; - y = (nDotN * dndndvdv[1] - 2 * nDotNv * dndv[1] - - (nvDotNv + nDotNvv) * n[1]) / normCubed + - 3 * nDotNv * nDotNv * n[1] / normToFive; - z = (nDotN * dndndvdv[2] - 2 * nDotNv * dndv[2] - - (nvDotNv + nDotNvv) * n[2]) / normCubed + - 3 * nDotNv * nDotNv * n[2] / normToFive; -} - -void ProjectionSurface:: -Rotate(double A0, double A1, double A2) -{ - double tol = 1.e-14; - - A0 = A0 * M_PI / 180.; - A1 = A1 * M_PI / 180.; - A2 = A2 * M_PI / 180.; - - double cosA0 = cos(A0); - double sinA0 = sin(A0); - double cosA1 = cos(A1); - double sinA1 = sin(A1); - double cosA2 = cos(A2); - double sinA2 = sin(A2); - - double c[3], E0[3], E1[3], E2[3]; - - for (int l = 0; l < 3; l++) { - E0[l] = E0_[l]; - E1[l] = E1_[l]; - E2[l] = E2_[l]; - } - - c[0] = cosA1 * cosA2; - c[1] = cosA1 * sinA2; - c[2] = - sinA1; - - for (int l = 0; l < 3; l++) - E0_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l]; - - c[0] = sinA0 * sinA1 * cosA2 - cosA0 * sinA2; - c[1] = sinA0 * sinA1 * sinA2 + cosA0 * cosA2;; - c[2] = sinA0 * cosA1; - - for (int l = 0; l < 3; l++) - E1_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l]; - - c[0] = cosA0 * sinA1 * cosA2 + sinA0 * sinA2; - c[1] = cosA0 * sinA1 * sinA2 - sinA0 * cosA2;; - c[2] = cosA0 * cosA1; - - for (int l = 0; l < 3; l++) - E2_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l]; -} - -void ProjectionSurface:: -Translate(double D0, double D1, double D2) -{ - O_[0] += D0; - O_[1] += D1; - O_[2] += D2; -} - -void ProjectionSurface:: -Rescale(double S0, double S1, double S2) -{ - scale_[0] *= S0; - scale_[1] *= S1; - scale_[2] *= S2; -} diff --git a/contrib/FourierModel/ProjectionSurface.h b/contrib/FourierModel/ProjectionSurface.h deleted file mode 100755 index 41840e7e80..0000000000 --- a/contrib/FourierModel/ProjectionSurface.h +++ /dev/null @@ -1,150 +0,0 @@ -#ifndef _PROJECTION_SURFACE_H_ -#define _PROJECTION_SURFACE_H_ - -#include <string> - -namespace FM { - -class ProjectionSurface { - private: - int tag_; - std::string name_; - protected: - int numParameters_; - double uPeriod_, vPeriod_; - bool uPeriodic_, vPeriodic_; - double O_[3], E0_[3], E1_[3], E2_[3], scale_[3]; - public: - ProjectionSurface - (double uPeriod = -1., double vPeriod = -1.); - - ProjectionSurface(ProjectionSurface *ps) - { - tag_ = ps->tag_; - name_ = ps->name_; - numParameters_ = ps->numParameters_; - uPeriod_ = ps->uPeriod_; - vPeriod_ = ps->vPeriod_; - uPeriodic_ = ps->uPeriodic_; - vPeriodic_ = ps->vPeriodic_; - for(int i = 0; i < 3; i++){ - O_[i] = ps->O_[i]; - E0_[i] = ps->E0_[i]; - E1_[i] = ps->E1_[i]; - E2_[i] = ps->E2_[i]; - scale_[i] = ps->scale_[i]; - } - } - - virtual ProjectionSurface *clone() = 0; - - virtual ~ProjectionSurface() {} - - inline int GetTag() { return tag_; } - inline void SetTag(int tag) { tag_ = tag; } - - inline std::string GetName() { return name_; } - inline void SetName(std::string name) { name_ = name; } - - inline int GetNumParameters() { return numParameters_; } - - inline bool IsUPeriodic() { return uPeriodic_; } - inline bool IsVPeriodic() { return vPeriodic_; } - - // Public access functions - - inline void GetOrigin - (double &x, double &y, double &z) - { - x = O_[0]; y = O_[1]; z = O_[2]; - } - inline void SetOrigin - (double x, double y, double z) - { - O_[0] = x; O_[1] = y; O_[2] = z; - } - inline void GetE0 - (double &x, double &y, double &z) - { - x = E0_[0]; y = E0_[1]; z = E0_[2]; - } - inline void GetE1 - (double &x, double &y, double &z) - { - x = E1_[0]; y = E1_[1]; z = E1_[2]; - } - inline void GetE2 - (double &x, double &y, double &z) - { - x = E2_[0]; y = E2_[1]; z = E2_[2]; - } - inline void GetScale - (double &x, double &y, double &z) - { - x = scale_[0]; y = scale_[1]; z = scale_[2]; - } - - // These are the virtual functions that must be provided - // by all derived projection surfaces - - virtual void F - (double u, double v, double &x, double &y, double &z) = 0; - virtual bool Inverse - (double x,double y,double z,double &u,double &v) = 0; - virtual void Dfdu - (double u, double v, double &x, double &y, double &z) = 0; - virtual void Dfdv - (double u, double v, double &x, double &y, double &z) = 0; - virtual void Dfdfdudu - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdudv - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdvdv - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdfdududu - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdfdududv - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdfdudvdv - (double u,double v,double &x,double &y,double &z) = 0; - virtual void Dfdfdfdvdvdv - (double u,double v,double &x,double &y,double &z) = 0; - virtual bool OrthoProjectionOnSurface - (double x, double y, double z, double &u,double &v) = 0; - virtual void SetParameter - (int i, double x) = 0; - virtual double GetParameter - (int i) = 0; - virtual std::string GetLabel - (int i) = 0; - - // These functions may also be provided by the derived - // projection surfaces (usually for better performance), - // but they don't have to - - virtual void GetNormal - (double u, double v, double &x, double &y, double &z); - virtual void GetUnitNormal - (double u, double v, double &x, double &y, double &z); - virtual void Dndu - (double u, double v, double &x, double &y, double &z); - virtual void Dndv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudu - (double u, double v, double &x, double &y, double &z); - virtual void Dndndudv - (double u, double v, double &x, double &y, double &z); - virtual void Dndndvdv - (double u, double v, double &x, double &y, double &z); - - virtual void Rotate - (double A0, double A1, double A2); - virtual void Translate - (double D0, double D1, double D2); - virtual void Rescale - (double S0, double S1, double S2); -}; - -} - -#endif diff --git a/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp b/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp deleted file mode 100755 index 21a9cfac48..0000000000 --- a/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include "RevolvedParabolaProjectionSurface.h" - -using namespace FM; - -RevolvedParabolaProjectionSurface::RevolvedParabolaProjectionSurface -(int tag) : ProjectionSurface(1.) -{ - SetTag(tag); - SetName(std::string("revolvedParabola")); - - twoPi_ = 2 * M_PI; - - R_ = 1.; - K_[0] = K_[1] = 0.5; - - numParameters_ = 3; - - O_[0] = O_[1] = O_[2] = 0.; - - E0_[0] = 0.; E0_[1] = 0.; E0_[2] = 1.; - E1_[0] = 1.; E1_[1] = 0.; E1_[2] = 0.; - E2_[0] = 0.; E2_[1] = 1.; E2_[2] = 0.; - - scale_[0] = scale_[1] = scale_[2] = 1.; -} - -RevolvedParabolaProjectionSurface::RevolvedParabolaProjectionSurface -(int tag, double O[3], double E0[3], double E1[3], double scale[3], - double R, double K[2]) : ProjectionSurface(1.) -{ - SetTag(tag); - SetName(std::string("revolvedParabola")); - - twoPi_ = 2 * M_PI; - - R_ = R; - K_[0] = K[0]; K_[1] = K[1]; - - O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2]; - - E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2]; - E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2]; - - E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1]; - E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2]; - E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; - - scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2]; -} - -void RevolvedParabolaProjectionSurface::F -(double u, double v, double &x, double &y, double &z) -{ - x = O_[0] + (R_ + K_[0] * (v - 0.5)) * - (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))) + - K_[1] * (v - 0.5) * (v - 0.5) * E0_[0]; - y = O_[1] + (R_ + K_[0] * (v - 0.5)) * - (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))) + - K_[1] * (v - 0.5) * (v - 0.5) * E0_[1]; - z = O_[2] + (R_ + K_[0] * (v - 0.5)) * - (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))) + - K_[1] * (v - 0.5) * (v - 0.5) * E0_[2]; -} - -bool RevolvedParabolaProjectionSurface::Inverse -(double x, double y, double z, double &u,double &v) -{ - double R[3]; - R[0] = x - O_[0]; - R[1] = y - O_[1]; - R[2] = z - O_[2]; - - double RdotT = 0., RdotNcT = 0.; - for (int i=0;i<3;i++) { - RdotT += R[i] * E1_[i]; - RdotNcT += R[i] * E2_[i]; - } - - u = atan2(RdotNcT,RdotT); - u /= twoPi_; - u += 0.5; - - v = sqrt(RdotT * RdotT + RdotNcT * RdotNcT); - v -= R_; - v /= K_[0]; - v += 0.5; -} - -void RevolvedParabolaProjectionSurface::Dfdu -(double u, double v, double &x, double &y, double &z) -{ - x = twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (- E1_[0] * sin(twoPi_ * (u - 0.5)) + E2_[0] * cos(twoPi_ * (u - 0.5))); - y = twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (- E1_[1] * sin(twoPi_ * (u - 0.5)) + E2_[1] * cos(twoPi_ * (u - 0.5))); - z = twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (- E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5))); -} - -void RevolvedParabolaProjectionSurface::Dfdv -(double u, double v, double &x, double &y, double &z) -{ - x = K_[0] * - (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))) + - 2. * K_[1] * (v - 0.5) * E0_[0]; - y = K_[0] * - (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))) + - 2. * K_[1] * (v - 0.5) * E0_[1]; - z = K_[0] * - (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))) + - 2. * K_[1] * (v - 0.5) * E0_[2]; -} - -void RevolvedParabolaProjectionSurface::Dfdfdudu -(double u,double v, double &x, double &y, double &z) -{ - x = - twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))); - y = - twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))); - z = - twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))); -} - -void RevolvedParabolaProjectionSurface::Dfdfdudv -(double u, double v, double &x, double &y, double &z) -{ - x = K_[0] * twoPi_ * - (- E1_[0] * sin(twoPi_ * (u - 0.5)) + E2_[0] * cos(twoPi_ * (u - 0.5))); - y = K_[0] * twoPi_ * - (- E1_[1] * sin(twoPi_ * (u - 0.5)) + E2_[1] * cos(twoPi_ * (u - 0.5))); - z = K_[0] * twoPi_ * - (- E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5))); -} - -void RevolvedParabolaProjectionSurface::Dfdfdvdv -(double u, double v, double &x, double &y, double &z) -{ - x = 2. * K_[1] * E0_[0]; - y = 2. * K_[1] * E0_[1]; - z = 2. * K_[1] * E0_[2]; -} - -void RevolvedParabolaProjectionSurface::Dfdfdfdududu -(double u,double v,double &x,double &y,double &z) -{ - x = twoPi_ * twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[0] * sin(twoPi_ * (u - 0.5)) - E2_[0] * cos(twoPi_ * (u - 0.5))); - y = twoPi_ * twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[1] * sin(twoPi_ * (u - 0.5)) - E2_[1] * cos(twoPi_ * (u - 0.5))); - z = twoPi_ * twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) * - (E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5))); -} - -void RevolvedParabolaProjectionSurface::Dfdfdfdududv -(double u,double v,double &x,double &y,double &z) -{ - x = - twoPi_ * twoPi_ * K_[0] * - (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))); - y = - twoPi_ * twoPi_ * K_[0] * - (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))); - z = - twoPi_ * twoPi_ * K_[0] * - (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))); -} - -void RevolvedParabolaProjectionSurface::Dfdfdfdudvdv -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -void RevolvedParabolaProjectionSurface::Dfdfdfdvdvdv -(double u,double v,double &x,double &y,double &z) -{ - x = y = z = 0.; -} - -bool RevolvedParabolaProjectionSurface::OrthoProjectionOnSurface -(double x, double y, double z, double& u, double& v) -{ - double R[3]; - R[0] = x - O_[0]; - R[1] = y - O_[1]; - R[2] = z - O_[2]; - - double RdotT = 0., RdotNcT = 0.; - for (int i=0;i<3;i++) { - RdotT += R[i] * E1_[i]; - RdotNcT += R[i] * E2_[i]; - } - - u = atan2(RdotNcT,RdotT); - u /= twoPi_; - u += 0.5; - - double A = - R_, B = 0.; - for (int i=0;i<3;i++) { - A += R[i] * (E1_[i] * cos(twoPi_ * (u - 0.5)) + - E2_[i] * sin(twoPi_ * (u - 0.5))); - B += R[i] * E0_[i]; - } - - double a = 2 * K_[1] * K_[1]; - double b = K_[0] * K_[0] - 2 * K_[1] * B; - double c = - K_[0] * A; - - std::vector<double> root = SolveCubic(a,b,c); - - if (root.size()) { - double xP,yP,zP; - double minDist = 1.e12; - for (int i=0;i<root.size();i++) { - F(u,root[i] + 0.5,xP,yP,zP); - double dist = sqrt((x-xP)*(x-xP)+(y-yP)*(y-yP)+(z-zP)*(z-zP)); - if (dist < minDist) { - minDist = dist; - v = root[i] + 0.5; - } - } - double tol =1.e-4; - if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) - return true; - else - return false; - } - else - return false; -} - -void RevolvedParabolaProjectionSurface:: -SetParameter(int i, double x) -{ - switch (i) { - case 0: - R_ = x; - case 1: - K_[0] = x; - case 2: - K_[1] = x; - } -} - -double RevolvedParabolaProjectionSurface:: -GetParameter(int i) -{ - switch (i) { - case 0: - return R_; - case 1: - return K_[0]; - case 2: - return K_[1]; - } -} - -std::string RevolvedParabolaProjectionSurface:: -GetLabel(int i) -{ - switch (i) { - case 0: - return std::string("Radius"); - case 1: - return std::string("Parabola Scale 1"); - case 2: - return std::string("Parabola Scale 2"); - } -} diff --git a/contrib/FourierModel/RevolvedParabolaProjectionSurface.h b/contrib/FourierModel/RevolvedParabolaProjectionSurface.h deleted file mode 100755 index 29217da97b..0000000000 --- a/contrib/FourierModel/RevolvedParabolaProjectionSurface.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _REVOLVED_PARABOLA_PROJECTION_SURFACE_H_ -#define _REVOLVED_PARABOLA_PROJECTION_SURFACE_H_ - -#include <cmath> -#include <vector> -#include "Utils.h" -#include "ProjectionSurface.h" - -namespace FM { - -class RevolvedParabolaProjectionSurface : public ProjectionSurface { - private: - double twoPi_; - double R_, K_[2]; - public: - RevolvedParabolaProjectionSurface - (int tag); - RevolvedParabolaProjectionSurface - (int tag, double O[3], double E0[3], double E1[3], double scale[3], - double R, double K[2]); - RevolvedParabolaProjectionSurface(RevolvedParabolaProjectionSurface *ps) - : ProjectionSurface(ps) - { - twoPi_ = ps->twoPi_; - R_ = ps->R_; - K_[0] = ps->K_[0]; - K_[1] = ps->K_[1]; - } - - virtual ~RevolvedParabolaProjectionSurface - () {} - - virtual ProjectionSurface *clone() - { - return new RevolvedParabolaProjectionSurface(this); - } - - // Abstract methods of ProjectionSurface - - virtual void F - (double u, double v, double &x, double &y, double &z); - virtual bool Inverse - (double x,double y,double z,double &u,double &v); - virtual void Dfdu - (double u, double v, double &x, double &y, double &z); - virtual void Dfdv - (double u, double v, double &x, double &y, double &z); - virtual void Dfdfdudu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdudv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududu - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdududv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdudvdv - (double u,double v,double &x,double &y,double &z); - virtual void Dfdfdfdvdvdv - (double u,double v,double &x,double &y,double &z); - virtual bool OrthoProjectionOnSurface - (double x, double y, double z, double &u,double &v); - virtual void SetParameter - (int i, double x); - virtual double GetParameter - (int i); - virtual std::string GetLabel - (int i); -}; - -} - -#endif diff --git a/contrib/FourierModel/Utils.cpp b/contrib/FourierModel/Utils.cpp deleted file mode 100755 index 82cdc925c5..0000000000 --- a/contrib/FourierModel/Utils.cpp +++ /dev/null @@ -1,345 +0,0 @@ -#include "Utils.h" -#include "Message.h" - -using namespace FM; - -std::vector<double> SolveCubic(double a, double b, double c) -{ - std::vector<double> root; - // find real roots of polynomial a*x^3+ b*x +c=0 - - double tol=pow(10.0, -12.); - - double error=1.; - int maxiter=100; int iter=0; - - std::vector<double> initial_guess(5); - initial_guess[0]=0.; - initial_guess[1]=1.; - initial_guess[2]=-1.; - initial_guess[3]=0.5; - initial_guess[4]=-0.5; - - bool find=0; int init=0; - double x0=0., x1, f, df; - - while (find==0 && init< 5){ - - init=init+1; - x0=initial_guess[init-1]; - error=1.; iter=0; - - while (error>tol && iter<maxiter){ - - f=a*x0*x0*x0+b*x0+c; - df=a*3.*x0*x0+b; - - x1=x0-f/df; - - error=std::abs(x1-x0); - x0=x1; - iter=iter+1; - } - - if (iter<maxiter){ - find=1; - } - } - - if (find) { - root.push_back(x0); - - //%polynomial a*x^3+ b*x +c=(x-x0)*(a*x^2+bb*x+cc) - //%where bb=a*x0, cc=-c/x0 (=b-a*x^2); - - double aa=a, bb=a*x0, cc=b-a*x0*x0; - double D=bb*bb-4.*aa*cc; - - if (D>=0.){ - root.push_back((-bb+sqrt(D))/2./aa); - root.push_back((-bb-sqrt(D))/2./aa); - } - - // it seems that the solution obtained by quadratic formula - //is not so accurate --> used as initial guess. - - if (root.size() == 3){ - for (int i=0 ; i < 2 ; i++){ - x0=root[i+1]; - error=1.; iter=0; - while (error>tol && iter<maxiter){ - - f=a*x0*x0*x0+b*x0+c; - df=a*3.*x0*x0+b; - - x1=x0-f/df; - - error=std::abs(x1-x0); - x0=x1; - iter=iter+1; - } - root[i+1]=x0; - } - } - } - - return root; -} - -std::vector<double> SolveCubic(double a, double b, double c, double d) -{ - std::vector<double> root; - // find real roots of polynomial a*x^3 + b*x^2 + c*x + d=0 - - double tol=pow(10.0, -12.); - - double error=1.; - int maxiter=100; int iter=0; - - std::vector<double> initial_guess(5); - initial_guess[0]=0.; - initial_guess[1]=1.; - initial_guess[2]=-1.; - initial_guess[3]=0.5; - initial_guess[4]=-0.5; - - bool find=0; int init=0; - double x0=0., x1, f, df; - - while (find==0 && init< 5){ - - init=init+1; - x0=initial_guess[init-1]; - error=1.; iter=0; - - while (error>tol && iter<maxiter){ - - f=a*x0*x0*x0+b*x0*x0+c*x0+d; - df=3.*a*x0*x0+2.*b*x0+c; - - x1=x0-f/df; - - error=std::abs(x1-x0); - x0=x1; - iter=iter+1; - } - - if (iter<maxiter){ - find=1; - } - } - - if (find) { - root.push_back(x0); - - //%polynomial a*x^3 + b*x^2 + c*x + d = (x-x0)*(a*x^2+bb*x+cc) - //%where bb=a*x0, cc=-c/x0 (=b-a*x^2); - - double aa=a, bb=b+a*x0, cc=c+b*x0+a*x0*x0; - double D=bb*bb-4.*aa*cc; - - if (D>=0.){ - root.push_back((-bb+sqrt(D))/2./aa); - root.push_back((-bb-sqrt(D))/2./aa); - } - - /* - // it seems that the solution obtained by quadratic formula - //is not so accurate --> used as initial guess. - - if (root.size() == 3){ - for (int i=0 ; i < 2 ; i++){ - x0=root[i+1]; - error=1.; iter=0; - while (error>tol && iter<maxiter){ - - f=a*x0*x0*x0+b*x0+c; - df=a*3.*x0*x0+b; - - x1=x0-f/df; - - error=std::abs(x1-x0); - x0=x1; - iter=iter+1; - } - root[i+1]=x0; - } - } - */ - } - - return root; -} - -void find(std::vector<int> &a, int length, std::vector<int> &q, int &num){ - - int i,j=0; - - for (i=0 ; i < length ; i++){ - if (a[i]!=0){ - q[j]=i+1; - j=j+1; - } - } - num=j; -} - -int minVec(std::vector<int> &a,int n){ -// vector<int> a(n); -// copyVec(aa,n,a); - int i; - int s=a[0]; - - for (i=1;i<n ;i++){ - if (s>a[i]){ - s=a[i]; - } - } - return s; -} - -int maxVec(std::vector<int> &a,int n){ -// vector<int> a(n); -// copyVec(aa,n,a); - int i; - int s=a[0]; - - for (i=1;i<n ;i++){ - if (s<a[i]){ - s=a[i]; - } - } - return s; -} - -std::vector<std::vector<int> > ones(int row, int col){ - std::vector<std::vector<int> > tmp(row, std::vector<int> (col)); - for (int i=0 ; i < row ; i++){ - for (int j=0 ; j < col ; j++){ - tmp[i][j]=1; - } - } - return tmp; -} - -void plotSceneViewer(int app, char* bffer, std::vector<int> &color, - std::vector<std::vector<double> > &x, - std::vector<std::vector<double> > &y, - std::vector<std::vector<double> > &z, int ROW, int COL, - std::vector<std::vector<int> > &mask){ - - std::fstream outfile; - if (app==0){ - outfile.open(bffer, std::ios::out); - }else{ - outfile.open(bffer, std::ios::out | std::ios::app); - } - - if (outfile.fail()) - { - Msg::Error("Could not open readfile.txt"); - exit(1); - } - if (app==0){//not appending - outfile << "#Inventor V2.1 ascii" << std::endl; - outfile << "#created by allplot.cpp" << std::endl; - } - - outfile << "Separator {" << std::endl; - outfile << " Material {" << std::endl; - outfile << " diffuseColor [" << std::endl; - outfile << " " << ' ' << color[0] << ' ' << color[1] << ' ' << color[2] << std::endl; - outfile << " ]" << std::endl; - outfile << " }" << std::endl; - outfile << " IndexedTriangleStripSet {" << std::endl;; - outfile << " vertexProperty VertexProperty {"<< std::endl;; - outfile << " vertex [" << std::endl; - //outfile << " " << ' ' << x(0,0) << ' ' << y(0,0) << ' ' << z(0,0); - - int i, j; - - for (j=0 ; j < COL ; j++){ - for (i=0 ; i < ROW ; i++){ - if (i==0 & j==0 ){ - outfile << " " << ' ' << x[i][j] << ' ' << y[i][j] << ' ' << z[i][j]; - }else{ - outfile <<"," << ' ' << ' ' << std::endl; - outfile << " " << ' ' << x[i][j] << ' ' << y[i][j] << ' ' << z[i][j]; - } - } - } - - outfile <<' ' << std::endl; - outfile << " ]" << std::endl; - outfile << " }" << std::endl; - outfile << " coordIndex [" << std::endl; - - int jump=ROW; - int col, row; - int startrow, startoffset, endrow, endoffset; - std::vector<int> qq(ROW), qw(ROW); - int num1,num2,min1,min2,max1,max2; - - // for (col=0 ; col < ROW-1 ; col++){ - for (col=0 ; col < COL-1 ; col++){ - //copyColToVec(mask, ROW, col, qq); - for (int i=0 ; i < ROW ; i++){ - qq[i]=mask[i][col]; - } - - find(qq, ROW, qw, num1);//cout << num1 << endl; - - if (num1!=0){ - min1=minVec(qw,num1); - max1=maxVec(qw,num1); - } - - // copyColToVec(mask, ROW, col+1, qq); - for (int i=0 ; i < ROW ; i++){ - qq[i]=mask[i][col+1]; - } - - find(qq, ROW, qw, num2); - if (num2!=0){ - min2=minVec(qw,num2); - max2=maxVec(qw,num2); - } - - if (num1!=0 & num2!=0){ - startrow=std::max(min1,min2)-1; - startoffset=min1-min2; - - if (startoffset>0){ - outfile << " " << ' ' << (col+1)*jump+startrow << ' ' <<"," << ' ' << - col*jump+startrow << ' ' <<"," << ' ' << (col+1)*jump+startrow-1 << ' '<<"," << ' ' << "-1,"<< std::endl; - }else if (startoffset<0){ - outfile << " " << ' ' << (col+1)*jump+startrow << ' ' <<"," << ' '<< - col*jump+startrow << ' ' <<"," << ' ' << col*jump+startrow-1 <<' ' << "," << ' ' << "-1,"<< std::endl; - } - - endrow=std::min(max1,max2)-1; - endoffset=max1-max2; - - if (endoffset>0){ - outfile << " " << ' ' <<(col+1)*jump+endrow<< ' ' <<"," << ' ' << - col*jump+endrow+1 << ' ' <<"," << ' ' << col*jump+endrow << ' '<< "," << ' ' << "-1,"<<std::endl; - }else if (endoffset<0){ - outfile << " " << ' ' <<(col+1)*jump+endrow << ' ' << "," << ' ' << - (col+1)*jump+endrow+1 << ' ' <<"," << ' ' << col*jump+endrow <<' ' <<"," << ' ' << "-1,"<< std::endl; - } - - outfile << " " << ' ' << col*jump+startrow << ' ' <<"," << ' ' << (col+1)*jump+startrow<< ' ' << "," ; - - for (row= startrow+1; row <= endrow ; row++){ - outfile << col*jump+row << ' ' <<"," << ' '<< (col+1)*jump+row<< ' ' << ","; - } - } - outfile << " -1," << std::endl; - } - - outfile << " ]" << std::endl; - outfile << " }" << std::endl; - outfile << "}" << std::endl; - - outfile.close(); -} diff --git a/contrib/FourierModel/Utils.h b/contrib/FourierModel/Utils.h deleted file mode 100755 index a33fe45c1f..0000000000 --- a/contrib/FourierModel/Utils.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _UTILS_H_ -#define _UTILS_H_ - -#include <cmath> -#include <vector> -#include <fstream> -#include <iostream> - -std::vector<double> SolveCubic(double a, double b, double c); -std::vector<double> SolveCubic(double a, double b, double c, double d); -std::vector<std::vector<int> > ones(int row, int col); -void plotSceneViewer(int app, char* bffer, std::vector<int>& color, - std::vector<std::vector<double> > &x, - std::vector<std::vector<double> > &y, - std::vector<std::vector<double> > &z, int ROW, int COL, - std::vector<std::vector<int> > &mask); - -#endif -- GitLab