Skip to content
Snippets Groups Projects
Forked from gmsh / gmsh
20271 commits behind the upstream repository.
2D_Parametric.cpp 3.93 KiB
// $Id: 2D_Parametric.cpp,v 1.9 2002-05-20 02:15:36 geuzaine Exp $
//
// Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.

#include "Gmsh.h"
#include "Numeric.h"
#include "Geo.h"
#include "CAD.h"
#include "Interpolation.h"
#include "Mesh.h"
#include "2D_Mesh.h"
#include "Create.h"
#include "Context.h"

extern Mesh      *THEM;
extern Context_T  CTX;

static Surface *SURF;

Surface *PARAMETRIC;

/* SURFACES CYLINDRIQUES */

void XYZtoUV (void *a, void *dum){
  Vertex *v;
  double uu, vv;
  v = *(Vertex **) a;
  ProjectPointOnSurface (SURF->Support, v, &uu, &vv);
  v->Pos.X = uu;
  v->Pos.Y = vv;
  v->Pos.Z = 0.0;
}

void UVtoXYZ (void *a, void *dum){
  Vertex *v, n;
  v = *(Vertex **) a;

  n = InterpolateSurface (SURF->Support, v->Pos.X, v->Pos.Y, 0, 0);

  v->Pos.X = n.Pos.X;
  v->Pos.Y = n.Pos.Y;
  v->Pos.Z = n.Pos.Z;
}

void printMetric (Mesh * m, Surface * s, char *name){

  int N = 10, M = 10, i, j;
  double u, v;
  FILE *f = fopen (name, "w");
  if (!f)
    return;
  fprintf (f, "View \"metric\" Offset{0,0,0} {\n");
  for (i = 0; i < N; i++){
    u = (s->ku[0]) + (s->ku[s->Nu + s->OrderU] - s->ku[0]) 
      * (double) i / (double) (N - 1);
    for (j = 0; j < M; j++){
      v = (s->kv[0]) + (s->kv[s->Nv + s->OrderV] - s->kv[0]) 
        * (double) j / (double) (M - 1);
      m->Metric->setMetric (u, v, s);
      fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)"
               "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n",
               u, v, u, v, u, v, 
               m->Metric->m[0][0], m->Metric->m[0][1], 0.0,
               m->Metric->m[0][0], m->Metric->m[0][1], 0.0, 
               m->Metric->m[0][0], m->Metric->m[0][1], 0.0);
          fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)"
                   "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n",
                   u, v, u, v, u, v, 
                   m->Metric->m[1][0], m->Metric->m[1][1], 0.0,
                   m->Metric->m[1][0], m->Metric->m[1][1], 0.0,
                   m->Metric->m[1][0], m->Metric->m[1][1], 0.0);
    }
  }
  fprintf (f, "};\n");
  fclose (f);
}

int MeshParametricSurface (Surface * s){

  int i, j, ori;
  Curve *pC;
  Vertex *v;
  Tree_T *tnxe;

  PARAMETRIC = s;

  if (s->Typ == MSH_SURF_NURBS)
    return 1;
  if (s->Typ != MSH_SURF_TRIMMED || s->Support->Typ != MSH_SURF_NURBS)
    return 0;

  SURF = s;
  if (!List_Nbr (s->Generatrices))
    return 1;
  for (i = 0; i < List_Nbr (s->Generatrices); i++){
    List_Read (s->Generatrices, i, &pC);
    for (j = 0; j < List_Nbr (pC->Vertices); j++){
      List_Read (pC->Vertices, j, &v);
      Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j));
    }
  }

  //printMetric(THEM,s,"metric.pos");

  Tree_Action (s->Vertices, Freeze_Vertex);

  Tree_Action (s->Vertices, XYZtoUV);
  ori = Calcule_Contours (s);

  if (!AlgorithmeMaillage2DAnisotropeModeJF (s))
    Maillage_Automatique_VieuxCode (s, THEM, ori);

  if (CTX.mesh.nb_smoothing){
    tnxe = Tree_Create (sizeof (NXE), compareNXE);
    create_NXE (s->Vertices, s->Simplexes, tnxe);
    
    for(i = 0 ; i < CTX.mesh.nb_smoothing ; i++)
      Tree_Action (tnxe, ActionLiss);
    
    //AmelioreSurface_EliminationTripet (s, THEM, tnxe);
    
    Tree_Delete (tnxe);
  }

  Tree_Action (s->Vertices, UVtoXYZ);
  Tree_Action (s->Vertices, deFreeze_Vertex);

  PARAMETRIC = NULL;

  return 1;
}