📄 sxgridint.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "sxgridint.h"
#include "memory.h"
static void sxCountMaterials(sxGrid g, sxIteratorType t)
{
sxSimplexData sx;
int nmat=0;
if (t==sxEdges) return;
if (t==sxFaces) return;
sxLoop(g,&sx,t)
{
if (sx.material>nmat) nmat=sx.material;
}
g->numOfMaterials[t]=nmat;
}
static void sxCountSimplices(sxGrid g, sxIteratorType t)
{
sxSimplexData sx;
int nsimp=0;
if (t==sxEdges) return;
if (t==sxFaces) return;
sxLoop(g,&sx,t)
{
nsimp++;
}
g->numOfSimplices[t]=nsimp;
}
static void sxDefineBox(sxGrid g)
{
sxSimplexData sx;
g->mincoord[1]=g->mincoord[2]=g->mincoord[3]= 1.0e30;
g->maxcoord[1]=g->maxcoord[2]=g->maxcoord[3]= -1.0e30;
switch(g->spaceDim)
{
case 1:
sxLoop(g,&sx,sxNodes)
{
if(sx.coordinates[1][1]<g->mincoord[1]) g->mincoord[1]=sx.coordinates[1][1];
else if(sx.coordinates[1][1]>g->maxcoord[1]) g->maxcoord[1]=sx.coordinates[1][1];
}
case 2:
sxLoop(g,&sx,sxNodes)
{
if(sx.coordinates[1][1]<g->mincoord[1]) g->mincoord[1]=sx.coordinates[1][1];
else if(sx.coordinates[1][1]>g->maxcoord[1]) g->maxcoord[1]=sx.coordinates[1][1];
if(sx.coordinates[1][2]<g->mincoord[2]) g->mincoord[2]=sx.coordinates[1][2];
else if(sx.coordinates[1][2]>g->maxcoord[2]) g->maxcoord[2]=sx.coordinates[1][2];
}
case 3:
sxLoop(g,&sx,sxNodes)
{
if(sx.coordinates[1][1]<g->mincoord[1]) g->mincoord[1]=sx.coordinates[1][1];
else if(sx.coordinates[1][1]>g->maxcoord[1]) g->maxcoord[1]=sx.coordinates[1][1];
if(sx.coordinates[1][2]<g->mincoord[2]) g->mincoord[2]=sx.coordinates[1][2];
else if(sx.coordinates[1][2]>g->maxcoord[2]) g->maxcoord[2]=sx.coordinates[1][2];
if(sx.coordinates[1][3]<g->mincoord[3]) g->mincoord[3]=sx.coordinates[1][3];
else if(sx.coordinates[1][3]>g->maxcoord[3]) g->maxcoord[3]=sx.coordinates[1][3];
}
}
g->boxNotDefined=0;
}
double sxXMin(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->mincoord[1];
}
double sxXMax(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->maxcoord[1];
}
double sxYMin(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->mincoord[2];
}
double sxYMax(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->maxcoord[2];
}
double sxZMin(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->mincoord[3];
}
double sxZMax(sxGrid g)
{
if(g->boxNotDefined) sxDefineBox(g);
return g->maxcoord[3];
}
int sxDimension(sxGrid g)
{
return g->gridDim;
}
int sxNumber(sxGrid g, sxIteratorType t)
{
if(!g->numOfSimplices[t]) sxCountSimplices(g,t);
return g->numOfSimplices[t];
}
int sxNumberOfMaterials(sxGrid g, sxIteratorType t)
{
if(!g->numOfMaterials[t]) sxCountMaterials(g,t);
return g->numOfMaterials[t];
}
void sxDefaultDestroyGrid(sxGrid g)
{free(g);}
void sxDefaultInitLoop(sxGrid g, sxSimplex sx)
{
int i,j;
sx->priv.grid = g;
sx->priv.internal = NULL;
sx->node = &(sx->priv.node_space[0]);
sx->spaceDimension = g->spaceDim;
switch(sx->iterator_type)
{
case sxNodes: sx->dimension = 0; break;
case sxEdges: sx->dimension = 1; break;
case sxCells: sx->dimension = g->gridDim; break;
case sxFaces: sx->dimension = g->gridDim - 1; break;
case sxBoundaryFaces: sx->dimension = g->gridDim - 1; break;
default: break;
}
sx->codimension = sx->spaceDimension-sx->dimension;
switch(sx->dimension)
{
case 3:/* this is a cell */
sx->numberOfNodes = 4;
sx->numberOfEdges = 6;
sx->numberOfFaces = 4;
sx->numberOfEdgeNodes=2;
sx->numberOfFaceNodes=3;
sx->edgeNodes[1][1]=3;
sx->edgeNodes[1][2]=4;
sx->edgeNodes[1][3]=1;
sx->edgeNodes[1][4]=2;
sx->edgeNodes[2][1]=4;
sx->edgeNodes[2][2]=2;
sx->edgeNodes[2][3]=1;
sx->edgeNodes[2][4]=3;
sx->edgeNodes[3][1]=2;
sx->edgeNodes[3][2]=3;
sx->edgeNodes[3][3]=4;
sx->edgeNodes[3][4]=1;
sx->edgeNodes[4][1]=1;
sx->edgeNodes[4][2]=2;
sx->edgeNodes[4][3]=3;
sx->edgeNodes[4][4]=4;
sx->edgeNodes[5][1]=1;
sx->edgeNodes[5][2]=3;
sx->edgeNodes[5][3]=2;
sx->edgeNodes[5][4]=4;
sx->edgeNodes[6][1]=1;
sx->edgeNodes[6][2]=4;
sx->edgeNodes[6][3]=2;
sx->edgeNodes[6][4]=3;
sx->faceNodes[1][1]=2;
sx->faceNodes[1][2]=3;
sx->faceNodes[1][3]=4;
sx->faceNodes[1][4]=1;
sx->faceNodes[2][1]=1;
sx->faceNodes[2][2]=3;
sx->faceNodes[2][3]=4;
sx->faceNodes[2][4]=2;
sx->faceNodes[3][1]=1;
sx->faceNodes[3][2]=2;
sx->faceNodes[3][3]=4;
sx->faceNodes[3][4]=3;
sx->faceNodes[4][1]=1;
sx->faceNodes[4][2]=2;
sx->faceNodes[4][3]=3;
sx->faceNodes[4][4]=4;
break;
case 2:
switch (sx->spaceDimension)
{
case 2: /* this is cell */
sx->numberOfNodes = 3;
sx->numberOfEdges = 3;
sx->numberOfFaces = 3;
sx->numberOfFaceNodes = 2;
sx->numberOfEdgeNodes = 2;
sx->edgeNodes[1][1]=2;
sx->edgeNodes[1][2]=3;
sx->edgeNodes[1][3]=1;
sx->edgeNodes[2][1]=1;
sx->edgeNodes[2][2]=3;
sx->edgeNodes[2][3]=2;
sx->edgeNodes[3][1]=1;
sx->edgeNodes[3][2]=2;
sx->edgeNodes[3][3]=3;
sx->faceNodes[1][1]=2;
sx->faceNodes[1][2]=3;
sx->faceNodes[1][3]=1;
sx->faceNodes[2][1]=1;
sx->faceNodes[2][2]=3;
sx->faceNodes[2][3]=2;
sx->faceNodes[3][1]=1;
sx->faceNodes[3][2]=2;
sx->faceNodes[3][3]=3;
break;
case 3:/* this is a boundary face */
sx->numberOfNodes = 3;
sx->numberOfEdges = 3;
sx->numberOfFaces = 1;
sx->numberOfFaceNodes = 3;
sx->numberOfEdgeNodes = 2;
sx->edgeNodes[1][1]=2;
sx->edgeNodes[1][2]=3;
sx->edgeNodes[1][3]=1;
sx->edgeNodes[2][1]=1;
sx->edgeNodes[2][2]=3;
sx->edgeNodes[2][3]=2;
sx->edgeNodes[3][1]=1;
sx->edgeNodes[3][2]=2;
sx->edgeNodes[3][3]=3;
sx->faceNodes[1][1]=1;
sx->faceNodes[1][2]=2;
sx->faceNodes[1][3]=3;
break;
}
break;
case 1:
switch(sx->spaceDimension)
{
case 1:/* this is a cell */
sx->numberOfNodes = 2;
sx->numberOfEdges = 1;
sx->numberOfFaces = 2;
sx->numberOfFaceNodes = 1;
sx->numberOfEdgeNodes = 2;
sx->edgeNodes[1][1]=1;
sx->edgeNodes[1][2]=2;
sx->faceNodes[1][1]=1;
sx->faceNodes[2][1]=2;
break;
case 2:/* this is a boundary face */
sx->numberOfNodes = 2;
sx->numberOfEdges = 1;
sx->numberOfFaces = 1;
sx->numberOfFaceNodes = 2;
sx->numberOfEdgeNodes = 2;
sx->edgeNodes[1][1]=1;
sx->edgeNodes[1][2]=2;
sx->faceNodes[1][1]=1;
sx->faceNodes[1][2]=2;
break;
}
break;
case 0:
sx->numberOfNodes = 1;
sx->numberOfEdges = 0;
sx->numberOfFaces = 0;
sx->numberOfFaceNodes = 0;
sx->numberOfEdgeNodes = 0;
break;
}
/*
switch (g->spaceDim)
{
case 1:
sx->numberOfEdgeNodes=2;
sx->edgeNodes[1][1]=1;
sx->edgeNodes[1][2]=2;
sx->numberOfFaceNodes=1;
sx->faceNodes[1][1]=1;
sx->faceNodes[2][1]=2;
break;
case 2:
sx->numberOfEdgeNodes=3;
sx->edgeNodes[1][1]=2;
sx->edgeNodes[1][2]=3;
sx->edgeNodes[1][3]=1;
sx->edgeNodes[2][1]=1;
sx->edgeNodes[2][2]=3;
sx->edgeNodes[2][3]=2;
sx->edgeNodes[3][1]=1;
sx->edgeNodes[3][2]=2;
sx->edgeNodes[3][3]=3;
sx->numberOfFaceNodes=3;
sx->faceNodes[1][1]=2;
sx->faceNodes[1][2]=3;
sx->faceNodes[1][3]=1;
sx->faceNodes[2][1]=1;
sx->faceNodes[2][2]=3;
sx->faceNodes[2][3]=2;
sx->faceNodes[3][1]=1;
sx->faceNodes[3][2]=2;
sx->faceNodes[3][3]=3;
break;
case 3:
sx->numberOfEdgeNodes=4;
sx->edgeNodes[1][1]=3;
sx->edgeNodes[1][2]=4;
sx->edgeNodes[1][3]=1;
sx->edgeNodes[1][4]=2;
sx->edgeNodes[2][1]=4;
sx->edgeNodes[2][2]=2;
sx->edgeNodes[2][3]=1;
sx->edgeNodes[2][4]=3;
sx->edgeNodes[3][1]=2;
sx->edgeNodes[3][2]=3;
sx->edgeNodes[3][3]=4;
sx->edgeNodes[3][4]=1;
sx->edgeNodes[4][1]=1;
sx->edgeNodes[4][2]=2;
sx->edgeNodes[4][3]=3;
sx->edgeNodes[4][4]=4;
sx->edgeNodes[5][1]=1;
sx->edgeNodes[5][2]=3;
sx->edgeNodes[5][3]=2;
sx->edgeNodes[5][4]=4;
sx->edgeNodes[6][1]=1;
sx->edgeNodes[6][2]=4;
sx->edgeNodes[6][3]=2;
sx->edgeNodes[6][4]=3;
sx->numberOfFaceNodes=4;
sx->faceNodes[1][1]=2;
sx->faceNodes[1][2]=3;
sx->faceNodes[1][3]=4;
sx->faceNodes[1][4]=1;
sx->faceNodes[2][1]=1;
sx->faceNodes[2][2]=3;
sx->faceNodes[2][3]=4;
sx->faceNodes[2][4]=2;
sx->faceNodes[3][1]=1;
sx->faceNodes[3][2]=2;
sx->faceNodes[3][3]=4;
sx->faceNodes[3][4]=3;
sx->faceNodes[4][1]=1;
sx->faceNodes[4][2]=2;
sx->faceNodes[4][3]=3;
sx->faceNodes[4][4]=4;
break;
}
*/
for(i=1;i<=sx->numberOfNodes;i++)
sx->coordinates[i]=sx->priv.coord_space+(i-1)*sx->spaceDimension;
sx->priv.coord_nodes=sx->priv.coord_node_space;
sx->priv.coord_ptr=sx->priv.coord_space;
sx->priv.coord_nodes[1]=1;
sx->priv.coord_nodes[2]=2;
sx->priv.coord_nodes[3]=3;
sx->priv.coord_nodes[4]=4;
if (g->setAdditionalData!=NULL)
g->setAdditionalData(g,sx);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -