📄 wzsxgrid.cxx
字号:
//static char *rcsid="$Id: wzsxgrid.cxx,v 1.2 2000/07/28 06:37:05 schmelze Exp $";//// $Log: wzsxgrid.cxx,v $// Revision 1.2 2000/07/28 06:37:05 schmelze// COG 2.1 alpha//// 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 & Ableitungstruct 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.hstatic 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -