Changeset 3126


Ignore:
Timestamp:
02/24/10 15:57:47 (15 years ago)
Author:
Mathieu Morlighem
Message:

Increased InterpFromMeshToMesh2dx speed using Bamg

Location:
issm/trunk/src/c
Files:
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Bamgx/Bamgx.cpp

    r3022 r3126  
    166166                Th.ReNumberingTheTriangleBySubDomain();
    167167                if(NbSmooth>0) Th.SmoothingVertex(NbSmooth,omega);
    168                 Th.BTh.ReMakeTriangleContainingTheVertex();
    169168
    170169                //display info
  • issm/trunk/src/c/Bamgx/Mesh2.h

    r3022 r3126  
    648648                        Triangles(const char * ,Real8=-1) ;
    649649                        Triangles(BamgMesh* bamgmesh,BamgOpts* bamgopts);
     650                        Triangles(double* index,double* x,double* y,int nods,int nels);
    650651
    651652                        Triangles(Int4 nbvx,Triangles & BT,int keepBackVertices=1) :Gh(BT.Gh),BTh(BT) {
     
    724725                        Triangle * FindTriangleContaining(const I2 & ,Icoor2 [3],Triangle *tstart=0) const;
    725726
     727                        void ReadMesh(double* index,double* x,double* y,int nods,int nels);
    726728                        void ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts);
    727729                        void WriteMesh(BamgMesh* bamgmesh,BamgOpts* bamgopts);
     
    738740                        int UnCrack();
    739741
    740                         void BuildGeometryFromMesh(BamgOpts* bamgopts);
     742                        void BuildGeometryFromMesh(BamgOpts* bamgopts=NULL);
    741743                        void FillHoleInMesh() ;
    742744                        int  CrackMesh();
  • issm/trunk/src/c/Bamgx/objects/Triangles.cpp

    r3031 r3126  
    2727                PreInit(0);
    2828                ReadMesh(bamgmesh,bamgopts);
     29                SetIntCoor();
     30                FillHoleInMesh();
     31        }
     32        /*}}}1*/
     33        /*FUNCTION Triangles::Triangles(double* index,double* x,double* y,int nods,int nels){{{1*/
     34        Triangles::Triangles(double* index,double* x,double* y,int nods,int nels):Gh(*(new Geometry())),BTh(*this){
     35
     36                PreInit(0);
     37                ReadMesh(index,x,y,nods,nels);
    2938                SetIntCoor();
    3039                FillHoleInMesh();
     
    226235
    227236        /*IO*/
    228         /*FUNCTION Triangles::ReadMesh{{{1*/
     237        /*FUNCTION Triangles::ReadMesh(double* index,double* x,double* y,int nods,int nels){{{1*/
     238        void Triangles::ReadMesh(double* index,double* x,double* y,int nods,int nels){
     239
     240                Real8 Hmin = HUGE_VAL;// the infinie value
     241                Int4 i1,i2,i3,iref;
     242                Int4 i,j;
     243                Int4 hvertices =0;
     244                Metric M1(1);
     245                int Version=1,dim=2;
     246                int verbose=0;
     247
     248                nbv=nods;
     249                nbvx=nbv;
     250                nbt=nels;
     251                nbiv=nbvx;
     252
     253                //Vertices
     254                if (verbose) printf("Reading vertices (%i)\n",nbv);
     255                vertices=(Vertex*)xmalloc(nbv*sizeof(Vertex));
     256                ordre=(Vertex**)xmalloc(nbv*sizeof(Vertex*));
     257                for (i=0;i<nbv;i++){
     258                        vertices[i].r.x=x[i];
     259                        vertices[i].r.y=y[i];
     260                        vertices[i].ReferenceNumber=1;
     261                        vertices[i].DirOfSearch =NoDirOfSearch;
     262                        vertices[i].m=M1;
     263                }
     264                nbtx=2*nbvx-2; // for filling The Holes and quadrilaterals
     265
     266                //Triangles
     267                if (verbose) printf("Reading triangles (%i)\n",nbt);
     268                triangles =new Triangle[nbtx]; //we cannot allocate only nbt triangles since
     269                //other triangles will be added for each edge
     270                for (i=0;i<nbt;i++){
     271                        Triangle & t = triangles[i];
     272                        i1=(Int4)index[i*3+0]-1; //for C indexing
     273                        i2=(Int4)index[i*3+1]-1; //for C indexing
     274                        i3=(Int4)index[i*3+2]-1; //for C indexing
     275                        t=Triangle(this,i1,i2,i3);
     276                        t.color=i;
     277                }
     278
     279                /*Recreate geometry: */
     280                if (verbose) printf("Building Geometry\n");
     281                BuildGeometryFromMesh();
     282                if (verbose) printf("Completing geometry\n");
     283                Gh.AfterRead();
     284        }
     285        /*}}}1*/
     286        /*FUNCTION Triangles::ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts){{{1*/
    229287        void Triangles::ReadMesh(BamgMesh* bamgmesh, BamgOpts* bamgopts){
    230288
     
    9971055                /*Intermediary*/
    9981056                int i,j,k,kk,it,jt;
     1057                int    verbosity=0;
     1058                double cutoffradian=10*Pi/180;
    9991059
    10001060                /*Recover options*/
    1001                 int    verbosity=bamgopts->verbose;
    1002                 double cutoffradian=bamgopts->MaximalAngleOfCorner*Pi/180;
     1061                if (bamgopts){
     1062                        verbosity=bamgopts->verbose;
     1063                        cutoffradian=bamgopts->MaximalAngleOfCorner*Pi/180;
     1064                }
    10031065
    10041066                //display info
     
    27162778                        t = a->t;
    27172779                        if (t<triangles || t>=triangles+nbt){
     2780                                a->Echo();
    27182781                                throw ErrorException(__FUNCT__,exprintf("t<triangles || t>=triangles+nbt"));
    27192782                        }
  • issm/trunk/src/c/Bamgx/objects/Vertex.cpp

    r2965 r3126  
    207207                printf("  Euclidean coordinates r.x: %g, r.y: %g\n",r.x,r.y);
    208208                printf("  ReferenceNumber = %i\n",ReferenceNumber);
     209                m.Echo();
    209210
    210211                return;
  • issm/trunk/src/c/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp

    r2418 r3126  
    1 /*!\file:  InterpFromMeshToMesh2dx.cpp
    2  * \brief  "c" core code for interpolating values from a structured grid.
    3  */
    4 
    5 
    6 #ifdef HAVE_CONFIG_H
    7         #include "config.h"
    8 #else
    9 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
    10 #endif
     1/*!\file InterpFromMeshToMesh2dx
     2 */
    113
    124#include "./InterpFromMeshToMesh2dx.h"
    13 #include "../shared/shared.h"
    145
    156#undef __FUNCT__
    167#define __FUNCT__ "InterpFromMeshToMesh2dx"
    17 int InterpFromMeshToMesh2dx( Vec* pdata_prime,double* index_data, double* x_data, double* y_data, int nods_data,int nels_data, double* data, int data_length, double* x_prime, double* y_prime, int nods_prime,double default_value){
     8
     9#include "../shared/shared.h"
     10#include "../include/macros.h"
     11#include "../toolkits/toolkits.h"
     12
     13/*Bamg: */
     14#include <unistd.h>
     15#include <stdlib.h>
     16#include <stdio.h>
     17#include <string.h>
     18#include "../Bamgx/Mesh2.h"
     19#include "../Bamgx/QuadTree.h"
     20
     21using namespace bamg;
     22using namespace std;
     23
     24int InterpFromMeshToMesh2dx(double** pdata_interp,double* index_data,double* x_data,double* y_data,int nods_data,int nels_data,
     25                        double* data,int data_rows,int data_cols,double* x_interp,double* y_interp,int nods_interp,double default_value){
    1826
    1927        /*Output*/
    20         Vec data_prime=NULL;
     28        double* data_interp=NULL;
     29        int noerr;
    2130
    2231        /*Intermediary*/
    23         int i;
    24         int interpolation_type;
    25         bool debug;
    26         double x_prime_min,x_prime_max;
    27         double y_prime_min,y_prime_max;
     32        R2     r;
     33        I2     I;
     34        int    i,j,k;
     35        int    it;
     36        int    i0,i1,i2;
     37        double areacoord[3];
     38        double aa,bb;
     39        double data_value;
     40        Icoor2 dete[3];
     41        int verbose=0;
    2842
    29         /*threading: */
    30         InterpFromMeshToMesh2dxThreadStruct gate;
    31         int num=1;
    32         #ifdef _MULTITHREADING_
    33         num=_NUMTHREADS_;
    34         #endif
    35 
    36         /*some checks*/
    37         if (nels_data<1 || nods_data<3 || nods_prime==0){
    38                 throw ErrorException(__FUNCT__,"nothing to be done according to the mesh given in input");
     43        /*Checks*/
     44        if (data_cols<=0){
     45                throw ErrorException(__FUNCT__,exprintf("data provided has a negative number of columns"));
    3946        }
    40 
    41         /*Set debug to 1 if there are lots of elements*/
    42         debug=(bool)((double)nels_data*(double)nods_prime >= pow((double)10,(double)9));
    43 
    44         /*figure out what kind of interpolation is needed*/
    45         if (data_length==nods_data){
    46                 interpolation_type=1;
    47         }
    48         else if (data_length==nels_data){
    49                 interpolation_type=2;
    50         }
    51         else{
    52                 throw ErrorException(__FUNCT__,"length of vector data not supported yet. It should be of length (number of nodes) or (number of elements)!");
    53         }
    54 
    55         /*Get prime mesh extrema coordinates*/
    56         x_prime_min=x_prime[0]; x_prime_max=x_prime[0];y_prime_min=y_prime[0]; y_prime_max=y_prime[0];
    57         for (i=1;i<nods_prime;i++){
    58                 if (x_prime[i]<x_prime_min) x_prime_min=x_prime[i];
    59                 if (x_prime[i]>x_prime_max) x_prime_max=x_prime[i];
    60                 if (y_prime[i]<y_prime_min) y_prime_min=y_prime[i];
    61                 if (y_prime[i]>y_prime_max) y_prime_max=y_prime[i];
     47        if (data_rows!=nods_data && data_rows!=nels_data){
     48                throw ErrorException(__FUNCT__,exprintf("data provided should have either %i or %i lines (not %i)",nods_data,nels_data,data_rows));
    6249        }
    6350
    6451        /*Initialize output*/
    65         data_prime=NewVec(nods_prime);
    66         for (i=0;i<nods_prime;i++) VecSetValue(data_prime,i,default_value,INSERT_VALUES);
     52        if (verbose) printf("Initializing output vector\n");
     53        data_interp=(double*)xmalloc(nods_interp*data_cols*sizeof(double));
    6754
    68         /*initialize thread parameters: */
    69         gate.debug=debug;
    70         gate.nods_prime=nods_prime;
    71         gate.nels_data=nels_data;
    72         gate.x_data=x_data;
    73         gate.y_data=y_data;
    74         gate.index_data=index_data;
    75         gate.x_prime=x_prime;
    76         gate.y_prime=y_prime;
    77         gate.data=data;
    78         gate.interpolation_type=interpolation_type;
    79         gate.default_value=default_value;
    80         gate.data_prime=data_prime;
    81         gate.x_prime_min=x_prime_min;
    82         gate.x_prime_max=x_prime_max;
    83         gate.y_prime_min=y_prime_min;
    84         gate.y_prime_max=y_prime_max;
     55        // read background mesh
     56        if (verbose) printf("Reading mesh\n");
     57        Triangles Th(index_data,x_data,y_data,nods_data,nels_data);
     58        Th.ReMakeTriangleContainingTheVertex();
    8559
    86         /*launch the thread manager with InterpFromMeshToMesh2dxt as a core: */
    87         LaunchThread(InterpFromMeshToMesh2dxt,(void*)&gate,num);
     60        //Loop over output nodes
     61        if (verbose) printf("Loop over the nodes\n");
     62        for(i=0;i<nods_interp;i++){
     63
     64                //Get current point coordinates
     65                r.x=x_interp[i]; r.y=y_interp[i];
     66                I2 I=Th.toI2(r);
     67
     68                //Find triangle holding r/I
     69                Triangle &tb=*Th.FindTriangleContaining(I,dete);
     70
     71                // internal point
     72                if (tb.det>0){
     73                        //Area coordinate
     74                        areacoord[0]= (Real8) dete[0]/ tb.det;
     75                        areacoord[1]= (Real8) dete[1] / tb.det;
     76                        areacoord[2]= (Real8) dete[2] / tb.det;
     77                        //3 vertices of the triangle
     78                        i0=Th.Number(tb[0]);
     79                        i1=Th.Number(tb[1]);
     80                        i2=Th.Number(tb[2]);
     81                        //triangle number
     82                        it=Th.Number(tb);
     83                }
     84
     85                //external point
     86                else {
     87                        //Get closest adjacent triangle (inside the mesh)
     88                        TriangleAdjacent ta=CloseBoundaryEdge(I,&tb,aa,bb).Adj();
     89                        int k=ta;
     90                        Triangle &tc=*(Triangle*)ta;
     91                        //Area coordinate
     92                        areacoord[VerticesOfTriangularEdge[k][1]] = aa;
     93                        areacoord[VerticesOfTriangularEdge[k][0]] = bb;
     94                        areacoord[OppositeVertex[k]] = 1 - aa -bb;
     95                        //3 vertices of the triangle
     96                        i0=Th.Number(tc[0]);
     97                        i1=Th.Number(tc[1]);
     98                        i2=Th.Number(tc[2]);
     99                        //triangle number
     100                        it=Th.Number(tc);
     101                }
     102
     103                /*Last step, P1 interpolation*/
     104                if (data_rows==nods_data){
     105                        for (j=0;j<data_cols;j++){
     106                                data_interp[i*data_cols+j]=areacoord[0]*data[data_cols*i0+j]+areacoord[1]*data[data_cols*i1+j]+areacoord[2]*data[data_cols*i2+j];
     107                        }
     108                }
     109                else{
     110                        for (j=0;j<data_cols;j++){
     111                                if (it<0 || it>=nels_data){
     112                                        throw ErrorException(__FUNCT__,exprintf("Triangle number %i not in [0 %i], because not correctly implemented yet... interpolate on grid first",it,nels_data));
     113                                }
     114                                data_interp[i*data_cols+j]=data[data_cols*it+j];
     115                        }
     116                }
     117
     118        }
    88119
    89120        /*Assign output pointers:*/
    90         *pdata_prime=data_prime;
     121        if (verbose) printf("Assigning output\n");
     122        *pdata_interp=data_interp;
     123
     124        /*No error return*/
     125        return noerr;
     126
    91127}
    92 
    93 
    94 
  • issm/trunk/src/c/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h

    r2417 r3126  
    1 /*!\file InterpFromMeshToMesh2dx.h
    2  * \brief: header file for Data interpolation routines.
    3  */
     1/*!\file: InterpFromMeshToMesh2dx.h
     2 * \brief header file for Bamg module
     3 */ 
    44
    55#ifndef _INTERPFROMMESHTOMESH2DX_H
    66#define _INTERPFROMMESHTOMESH2DX_H
    77
    8 #include "../toolkits/toolkits.h"
     8#include "../objects/objects.h"
    99
     10/* local prototypes: */
     11int InterpFromMeshToMesh2dx(double** pdata_interp,double* index_data,double* x_data,double* y_data,int nods_data,int nels_data,
     12                        double* data,int data_rows,int data_cols,double* x_interp,double* y_interp,int nods_interp,double default_value);
    1013
    11 
    12 /*threading: */
    13 typedef struct{
    14 
    15         int debug;
    16         int nels_data;
    17         double* x_data;
    18         double* y_data;
    19         double* index_data;
    20         int nods_prime;
    21         double* x_prime;
    22         double* y_prime;
    23         double* data;
    24         int     interpolation_type;
    25         double  default_value;
    26         Vec     data_prime;
    27         double  x_prime_min;
    28         double  x_prime_max;
    29         double  y_prime_min;
    30         double  y_prime_max;
    31 
    32 } InterpFromMeshToMesh2dxThreadStruct;
    33 
    34 
    35 int InterpFromMeshToMesh2dx( Vec* pdata_prime,double* index_data, double* x_data, double* y_data, int nods_data,int nels_data, double* data, int data_length, double* x_prime, double* y_prime, int nods_prime,double default_value);
    36 void* InterpFromMeshToMesh2dxt(void* vInterpFromMeshToMesh2dxThreadStruct);
    37 
    38 
    39 #endif /* _INTERPFROMMESHTOMESH2DX_H */
    40 
     14#endif
  • issm/trunk/src/c/Makefile.am

    r3086 r3126  
    260260                                        ./InterpFromGridToMeshx/InterpFromGridToMeshxt.cpp\
    261261                                        ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\
    262                                         ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dxt.cpp\
    263262                                        ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h\
    264263                                        ./InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp\
     
    587586                                        ./InterpFromGridToMeshx/InterpFromGridToMeshxt.cpp\
    588587                                        ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\
    589                                         ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dxt.cpp\
    590588                                        ./InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h\
    591589                                        ./InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp\
  • issm/trunk/src/c/issm.h

    r2892 r3126  
    6363#include "./MassFluxx/MassFluxx.h"
    6464#include "./Bamgx/Bamgx.h"
     65#include "./Bamgx/InterpBamgx.h"
    6566
    6667
Note: See TracChangeset for help on using the changeset viewer.