next up previous contents
Next: La classe Problem Up: Structures de données Previous: La Classe Vector

Fonctions P1

Une fonction P1 est définie par ses valeurs aux sommets de la triangulation. Le coeur de la classe P1 sera donc une sous classe de la classe Vector

Les fonctions P1 sont susceptibles d'autres opérations:

Mais compte tenu de la suite nous n'introduisons que les fonctions de lecture d'écriture sur fihier, et d'integration pour calculer:

displaymath773

float deter(const float a,const float b,const float c,
        const float d,const float e,const float f) 
      { float g = (a-c)*(e-f) - (b-c)*(d-f);
          return g;
      } 
/***************************************************/
class P1: public Vector
{ 
public:
  Grid* g;
  P1(Grid* gg): g(gg), Vector(gg->nv){}
  void load(const char* filename);
  void save(const char* filename) const;
  float intgrad2() const; //int gradf.gradf dx
};

//---------------------------------------------------------
void P1::save(const char* path) const
{  // writes a P1 continuous function in freefem format
 	ofstream file(path);
 	int nv = size;
 	assert(!file.fail());
 	file << nv << endl;
 	for(int i=0; i<nv; i++) file << cc[i] << endl;
 	file.close();
}

//---------------------------------------------------------
void P1::load(const char* path)
{  // read a P1 continuous function in freefem format
 	ifstream file(path);
 	int nv ;
 	assert(!file.fail());
 	file >> nv;
 	assert(nv==size);
 	for(int i=0; i<nv; i++) file >> cc[i];
 	file.close();
}

//-----------------------------------------------------
float P1::intgrad2() const
{
 float x[3], y[3], phi[3],gradFx, gradFy, ee;
 int k, iloc, j;

  ee = 0.;
  for(k=0;k<g->nt;k++)	
  { float a1 = 0.5/g->t[k].area;
    for(int jloc=0;jloc<3;jloc++)
    {   j = g->no(g->t[k].v[jloc]);
    	x[jloc] = g->v[j].x;  y[jloc]= g->v[j].y;                                           
    	phi[jloc] = cc[j];
    }
    gradFx = a1 * deter(phi[0],phi[1],phi[2],y[0],y[1],y[2]);
    gradFy = a1 * deter(x[0],x[1],x[2],phi[0],phi[1],phi[2]);
    ee +=  g->t[k].area * (gradFx*gradFx + gradFy*gradFy);  
   }
 return ee;
}



Olivier Pironneau
Mon May 17 17:14:42 METDST 1999