wzsxgrid.cxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· CXX 代码 · 共 1,773 行 · 第 1/3 页

CXX
1,773
字号
//static char *rcsid="$Id: wzsxgrid.cxx,v 1.1 1997/11/05 19:14:36 schmelze Exp $";
//
// $Log: wzsxgrid.cxx,v $
// Revision 1.1  1997/11/05  19:14:36  schmelze
// Version mit neuer Dokumentation, erste Version des neuen Gittergenerators
// noch ohne Randlinienbehandlung
//
// Revision 1.5  1997/10/15  16:58:07  fuhrmann
// face access for interfaces in 1d/2d corrected
//
// Revision 1.4  1997/10/10  14:16:53  fuhrmann
// femmatrices in kaskade, ifm stuff checkin
//
// Revision 1.3  1997/10/08  12:31:30  fuhrmann
// 1d,2d face cycles, verbose test
//
// Revision 1.2  1997/10/01  18:27:32  fuhrmann
// Merge in of kaskade-3.2
//
// Revision 1.1.1.1  1997/09/26  18:36:17  darcy
// preliminary checkin
//
// Revision 1.3  1995/11/10  20:59:24  fuhrmann
// Refinement/Interpolation interface built in.
//
//

extern "C"
{
#include "stdsys/dprintf.h"
#include "stdsys/memory.h"
#include "sxgrid/sxgrid.h"
#include "sxgrid/celltype.h"


// These should come from celltype

  extern int cellInit();
  extern void FVM1Edge(double*,int*,double*,double *,double*),
  FVM2Triangle(double*,int*,double*,double *,double*),
  FVM3Tetrahedron(double*,int*,double*,double *,double*);
  extern void FEM1Edge(double*,int*,double*,double *,double*,double*),
  FEM2Triangle(double*,int*,double*,double *,double*,double*),
  FEM3Tetrahedron(double*,int*,double*,double *,double*,double*);
  extern void FVM0Vertex(double*,int*,double*,double *,double*),
  FVM2Edge(double*,int*,double*,double *,double*),
  FVM3Triangle(double*,int*,double*,double *,double*);
  extern void FEM0Vertex(double*,int*,double*,double *,double*,double*),
  FEM2Edge(double*,int*,double*,double *,double*,double*),
  FEM3Triangle(double*,int*,double*,double *,double*,double*);
  
}

#include <iostream.h>
#include "general.h"
#include "utils.h"
#include "cmdpars.h"
#include "dimension.h"
#include "triang.h"
#include "triang1.h"
#include "triang2.h"
#include "triang3.h"

#include "vector.h"
#ifndef KASKADE_LIB
#include "feplot.h"
#endif


//  !aufteilen in Basis & Ableitung
struct PrivateSimplexDataStruct
{
  void (*FVMFactors)(double*,int*,double*,double*,double*);
  void (*FEMFactors)(double*,int*,double*,double*,double*,double*);
  void (*FVEMFactors)(double*,int*,double*,double*,double*,double*);

  void (*sxNext)(Simplex sx);

  EDG1 *cell1;
  TR2 *cell2;
  TET3 *cell3;
  DListIter<EDG1> *celliter1;
  DListIter<TR2> *celliter2;
  DListIter<TET3> *celliter3;
  

  PT1 *face1;
  EDG2 *face2;
  TR3  *face3;
  DListIter<PT1> *faceiter1;
  DListIter<EDG2> *faceiter2;
  DListIter<TR3> *faceiter3;
  
  PT1 *node1;
  PT2 *node2;
  PT3  *node3;
  DListIter<PT1> *nodeiter1;
  DListIter<PT2> *nodeiter2;
  DListIter<PT3> *nodeiter3;

  EDG1 *line1;
  EDG2 *line2;
  EDG3 *line3;
  DListIter<EDG1> *lineiter1;
  DListIter<EDG2> *lineiter2;
  DListIter<EDG3> *lineiter3;


  PATCH* patch;
  double coord[15];

  double stiffmat[30];
  double massmat[30];
};


struct sxGridStruct
{
  MESH *mesh;
  int spacedim;
  
  int node_num;
  int cell_num;
  int face_num;
  int all_face_num;
  int line_num;
  int cell_node_num;
  int face_node_num;
  
  int  cell_line_num;
  int  cell_face_num;
  int  cell_line_node_ptr[7][7];
  int  cell_face_node_ptr[7][7];
  
  
  int *node_mat_node_num;
  int *cell_mat_cell_num;
  int *face_mat_face_num;
  
  int node_mat_num;
  int cell_mat_num;
  int face_mat_num;
  
  
  double xmin,xmax;
  double ymin,ymax;
  double zmin,zmax;

  int sx_node[5];
  int sx_line[8];
  int sx_face[5];
  
  int prev_node_num; // for interpolation
  int bisect;
};


typedef struct sxGridStruct sxGridData;


// debug flags, siehe dprintf.h
static int dbg=1;
static int inf=1;
static int wrn=1;
static int err=1;

static int initflag=0;


static void init(void)
{
  if (initflag) return;

  cout.sync_with_stdio();

  dbgRegister("sxgrid-dbg",&dbg);
  dbgRegister("sxgrid",&inf);
  dbgRegister("sxgrid-err",&err);
  dbgRegister("sxgrid-wrn",&wrn);

  cellInit();

  initflag=1;
}



//////////////////////////////////
int node_node_ptr[2]={ 0 ,1 };


//////////////////////////////////
// CELL Loops
//////////////////////////////////


inline void setCell1Data(Simplex sx, EDG1 *cell1)
{
  sx->priv->patch=cell1;
  sx->material=cell1->Class();
  sx->index=cell1->getNode();
  sx->coord[1][1]=cell1->p1->x;
  sx->coord[2][1]=cell1->p2->x;
  sx->node[1]=cell1->p1->getNode();
  sx->node[2]=cell1->p2->getNode();
  sx->line[1]=sx->index;
}

void sxNextCell1(Simplex sx)
{
  sx->priv->cell1=sx->priv->celliter1->all();
  if (!sx->priv->cell1)
    {
      delete sx->priv->celliter1;
      delete sx->priv;
      sx->priv=NULL;
      return;
    }
  setCell1Data(sx,sx->priv->cell1);
} 

void setCell2Data(Simplex sx, TR2 *cell2)
{
  sx->priv->patch=cell2;
  sx->material=cell2->Class();
  sx->index=cell2->getNode();
  sx->coord[1][1]=cell2->p1->x;
  sx->coord[1][2]=cell2->p1->y;
  sx->coord[2][1]=cell2->p2->x;
  sx->coord[2][2]=cell2->p2->y;
  sx->coord[3][1]=cell2->p3->x;
  sx->coord[3][2]=cell2->p3->y;
  sx->node[1]=cell2->p1->getNode();
  sx->node[2]=cell2->p2->getNode();
  sx->node[3]=cell2->p3->getNode();

  sx->line[1]=cell2->e1->getNode();
  sx->line[2]=cell2->e2->getNode();
  sx->line[3]=cell2->e3->getNode();

}


void sxNextCell2(Simplex sx)
{
  sx->priv->cell2=sx->priv->celliter2->all();
  if (!sx->priv->cell2)
    {
      delete sx->priv->celliter2;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  setCell2Data(sx,sx->priv->cell2);

}

inline void setCell3Data(Simplex sx, TET3 *cell3)
{
  sx->priv->patch=cell3;
  sx->material=cell3->Class();
  sx->index=cell3->getNode();
  sx->coord[1][1]=cell3->p1->x;
  sx->coord[1][2]=cell3->p1->y;
  sx->coord[1][3]=cell3->p1->z;
  sx->coord[2][1]=cell3->p2->x;
  sx->coord[2][2]=cell3->p2->y;
  sx->coord[2][3]=cell3->p2->z;
  sx->coord[3][1]=cell3->p4->x;
  sx->coord[3][2]=cell3->p4->y;
  sx->coord[3][3]=cell3->p4->z;
  sx->coord[4][1]=cell3->p3->x;
  sx->coord[4][2]=cell3->p3->y;
  sx->coord[4][3]=cell3->p3->z;
// Orientierung !!! ??? 

  sx->node[1]=cell3->p1->getNode();
  sx->node[2]=cell3->p2->getNode();
  sx->node[3]=cell3->p4->getNode();
  sx->node[4]=cell3->p3->getNode();


  sx->line[1]=cell3->e1->getNode();
  sx->line[2]=cell3->e2->getNode();
  sx->line[3]=cell3->e3->getNode();
  sx->line[4]=cell3->e4->getNode();
  sx->line[5]=cell3->e5->getNode();
  sx->line[6]=cell3->e6->getNode();

  sx->face[1]=cell3->n1->getNode();
  sx->face[2]=cell3->n2->getNode();
  sx->face[3]=cell3->n3->getNode();
  sx->face[4]=cell3->n4->getNode();

}


void sxNextCell3(Simplex sx)
{
  sx->priv->cell3=sx->priv->celliter3->all();
  if (!sx->priv->cell3)
    {
      delete sx->priv->celliter3;
      delete sx->priv;
      sx->priv=0;
      return;
    }

  setCell3Data(sx,sx->priv->cell3);
}

//////////////////////////////////
// FACE Loops
//////////////////////////////////




void sxNextFace1(Simplex sx)
{
  while ((sx->priv->face1=sx->priv->faceiter1->all())&&!(sx->priv->face1->isDirichlet()));
  if (!sx->priv->face1)
    {
      delete sx->priv->faceiter1;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->face1;
  sx->material=sx->priv->face1->Class();
  sx->index=sx->priv->face1->getNode();
  sx->coord[1][1]=sx->priv->face1->x;
  sx->node[1]=sx->priv->face1->getNode();
}


void sxNextFace2(Simplex sx)
{
  while ((sx->priv->face2=sx->priv->faceiter2->all())&&!sx->priv->face2->isDirichlet());
  if (!sx->priv->face2)
    {
      delete sx->priv->faceiter2;
      delete sx->priv;
      sx->priv=0;
      return;
    }

  sx->priv->patch=sx->priv->face2;
  sx->material=sx->priv->face2->Class();
  sx->index=sx->priv->face2->getNode();
  sx->coord[1][1]=sx->priv->face2->p1->x;
  sx->coord[1][2]=sx->priv->face2->p1->y;
  sx->coord[2][1]=sx->priv->face2->p2->x;
  sx->coord[2][2]=sx->priv->face2->p2->y;
  sx->node[1]=sx->priv->face2->p1->getNode();
  sx->node[2]=sx->priv->face2->p2->getNode();
  sx->line[1]=sx->index;
}

void sxNextFace3(Simplex sx)
{
  while ((sx->priv->face3=sx->priv->faceiter3->all())&&!sx->priv->face3->isDirichlet());
  if (!sx->priv->face3)
    {
      delete sx->priv->faceiter3;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->face3;
  sx->material=sx->priv->face3->Class();
  sx->index=sx->priv->face3->getNode();
  sx->coord[1][1]=sx->priv->face3->p1->x;
  sx->coord[1][2]=sx->priv->face3->p1->y;
  sx->coord[1][3]=sx->priv->face3->p1->z;
  sx->coord[2][1]=sx->priv->face3->p2->x;
  sx->coord[2][2]=sx->priv->face3->p2->y;
  sx->coord[2][3]=sx->priv->face3->p2->z;
  sx->coord[3][1]=sx->priv->face3->p3->x;
  sx->coord[3][2]=sx->priv->face3->p3->y;
  sx->coord[3][3]=sx->priv->face3->p3->z;
 
  sx->node[1]=sx->priv->face3->p1->getNode();
  sx->node[2]=sx->priv->face3->p2->getNode();
  sx->node[3]=sx->priv->face3->p3->getNode();

  sx->line[1]=sx->priv->face3->e1->getNode();
  sx->line[2]=sx->priv->face3->e2->getNode();
  sx->line[3]=sx->priv->face3->e3->getNode();

}

//////////////////////////////////
// EDGE Loops
//////////////////////////////////
void sxNextLine1(Simplex sx)
{
  sx->priv->line1=sx->priv->lineiter1->all();
  if (!sx->priv->line1)
    {
      delete sx->priv->lineiter1;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->line1;
  sx->index=sx->priv->line1->getNode();
  sx->node[1]=sx->priv->line1->p1->getNode();
  sx->node[2]=sx->priv->line1->p2->getNode();
}


void sxNextLine2(Simplex sx)
{
  sx->priv->line2=sx->priv->lineiter2->all();
  if (!sx->priv->line2)
    {
      delete sx->priv->lineiter2;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  
  sx->priv->patch=sx->priv->line2;
  sx->index=sx->priv->line2->getNode();
  sx->node[1]=sx->priv->line2->p1->getNode();
  sx->node[2]=sx->priv->line2->p2->getNode();
}

void sxNextLine3(Simplex sx)
{
  sx->priv->line3=sx->priv->lineiter3->all();
  if (!sx->priv->line3)
    {
      delete sx->priv->lineiter3;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->line3;
  sx->index=sx->priv->line3->getNode();
  sx->node[1]=sx->priv->line3->p1->getNode();
  sx->node[2]=sx->priv->line3->p2->getNode();

}


//////////////////////////////////
// NODE Loops
//////////////////////////////////



void sxNextNode1(Simplex sx)
{
  sx->priv->node1=sx->priv->nodeiter1->all();
  if (!sx->priv->node1)
    {
      delete sx->priv->nodeiter1;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->node1;
  sx->material=sx->priv->node1->Class();
  sx->index=sx->priv->node1->getNode();
  sx->coord[1][1]=sx->priv->node1->x;
  sx->node[1]=sx->priv->node1->getNode();
}


void sxNextNode2(Simplex sx)
{
  sx->priv->node2=sx->priv->nodeiter2->all();
  if (!sx->priv->node2)
    {
      delete sx->priv->nodeiter2;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  
  sx->priv->patch=sx->priv->node2;
  sx->material=sx->priv->node2->Class();
  sx->index=sx->priv->node2->getNode();
  sx->coord[1][1]=sx->priv->node2->x;
  sx->coord[1][2]=sx->priv->node2->y;
  sx->node[1]=sx->priv->node2->getNode();
}

void sxNextNode3(Simplex sx)
{
  sx->priv->node3=sx->priv->nodeiter3->all();
  if (!sx->priv->node3)
    {
      delete sx->priv->nodeiter3;
      delete sx->priv;
      sx->priv=0;
      return;
    }
  sx->priv->patch=sx->priv->node3;
  sx->material=sx->priv->node3->Class();
  sx->index=sx->priv->node3->getNode();
  sx->coord[1][1]=sx->priv->node3->x;
  sx->coord[1][2]=sx->priv->node3->y;
  sx->coord[1][3]=sx->priv->node3->z;
 
  sx->node[1]=sx->priv->node3->getNode();
}

//////////////////////////////////



void sxNext(Simplex sx)
{
  sx->priv->sxNext(sx);
}


void sxStart(sxGrid g, Simplex sx, int WhatToTraverse)
{
  register int in;
  sx->grid=g;
  sx->spacedim=g->spacedim;
  sx->priv=new PrivateSimplexData;
  for(in=0;in<15;in++) sx->priv->coord[in]=3.3333333e33;
  sx->node=sx->grid->sx_node;
  sx->line=sx->grid->sx_line;
  sx->face=sx->grid->sx_face;
  
  switch (WhatToTraverse)
    {
    case SX_CELLS:
      sx->nnodes=g->cell_node_num;
      sx->nlines=g->cell_line_num;
      sx->nfaces=g->cell_face_num;
      sx->linenodenum=2;
      sx->facenodenum=g->face_node_num;


      sx->linenodes=g->cell_line_node_ptr;
      sx->facenodes=g->cell_face_node_ptr;
      sx->dim=g->spacedim;
      sx->codim=0;

      switch(sx->spacedim)
	{
	case 1: 
	  sx->face=sx->node;
	  sx->priv->FVMFactors=FVM1Edge; 
	  sx->priv->FEMFactors=FEM1Edge; 
          sx->priv->sxNext=sxNextCell1;
	  sx->priv->celliter1= new DListIter<EDG1>(sx->grid->mesh->castToMESH1()->lines());
	  break;
	case 2: 
	  sx->face=sx->line;
	  sx->priv->FVMFactors=FVM2Triangle; 
	  sx->priv->FEMFactors=FEM2Triangle; 
          sx->priv->sxNext=sxNextCell2;
	  sx->priv->celliter2= new DListIter<TR2>(sx->grid->mesh->castToMESH2()->triangles());
	  break;
  	case 3: 
	  sx->priv->FVMFactors=FVM3Tetrahedron; 
	  sx->priv->FEMFactors=FEM3Tetrahedron; 
          sx->priv->sxNext=sxNextCell3;
	  sx->priv->celliter3= new DListIter<TET3>(sx->grid->mesh->castToMESH3()->tetras());
	  break;
	}

      break;

    case SX_FACES:
      sx->nnodes=g->face_node_num;
      sx->nfaces=1;
      sx->linenodes=NULL;

      switch(sx->spacedim)
	{
	case 1: 
	  sx->face=sx->node;
	  sx->nlines=0;
	  sx->priv->FVMFactors=FVM0Vertex; 
	  sx->priv->FEMFactors=FEM0Vertex; 
          sx->priv->sxNext=sxNextFace1;
	  sx->priv->faceiter1= new DListIter<PT1>(sx->grid->mesh->castToMESH1()->points());
	  break;
	case 2: 
	  sx->face=sx->line;
	  sx->nlines=1;
	  sx->priv->FVMFactors=FVM2Edge; 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?