Commit c0616b4e authored by Adam Powell's avatar Adam Powell

Imported Upstream version 5.5.0.svn.4388.dfsg

parent e800d561
...@@ -78,6 +78,8 @@ ...@@ -78,6 +78,8 @@
#include <TopoDS_Edge.hxx> #include <TopoDS_Edge.hxx>
#include <BRepAdaptor_Curve2d.hxx> #include <BRepAdaptor_Curve2d.hxx>
#include <GCPnts_TangentialDeflection.hxx> #include <GCPnts_TangentialDeflection.hxx>
#include <GProp_GProps.hxx>
#include <BRepGProp.hxx>
using namespace std; using namespace std;
...@@ -254,6 +256,22 @@ bool CadView::readFile(QString fileName) ...@@ -254,6 +256,22 @@ bool CadView::readFile(QString fileName)
BRepTools::Clean(shape); BRepTools::Clean(shape);
// Check 3D properties:
//----------------------
GProp_GProps System;
BRepGProp::VolumeProperties(shape, System);
double mass = System.Mass();
if(mass < 1.0e-12) {
QMessageBox message;
message.setIcon(QMessageBox::Warning);
message.setText("Non 3D-shape detected");
message.setInformativeText("The cad import features of ElmerGUI are currently limited to 3D models. Please consider using external software or other formats for meshing 1D and 2D geometries.");
message.exec();
}
// Go:
//-----
this->fileName = fileName; this->fileName = fileName;
actorToFace.clear(); actorToFace.clear();
...@@ -583,6 +601,16 @@ TopoDS_Shape CadView::readStep(QString fileName) ...@@ -583,6 +601,16 @@ TopoDS_Shape CadView::readStep(QString fileName)
for(Standard_Integer n = 1; n <= nbr; n++) { for(Standard_Integer n = 1; n <= nbr; n++) {
bool ok = stepReader.TransferRoot(n); bool ok = stepReader.TransferRoot(n);
int nbs = stepReader.NbShapes(); int nbs = stepReader.NbShapes();
// Display warning if nbs > 1
//----------------------------
if(nbs > 1) {
QMessageBox message;
message.setIcon(QMessageBox::Warning);
message.setText("Loading multiple shapes");
message.setInformativeText("The mesh generators of ElmerGUI are currently unable to handle cad files with multiple shapes. Please consider using external software for mesh generation in this case.");
message.exec();
}
if(nbs > 0) { if(nbs > 0) {
shapes = new TopTools_HSequenceOfShape(); shapes = new TopTools_HSequenceOfShape();
......
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE edf>
<edf version="1.0" >
<PDE Name="Advection Diffusion Equation" >
<Name>Advection Diffusion Equation</Name>
<Equation>
<Parameter Widget="Label">
<Name> Options </Name>
</Parameter>
<Parameter Widget="Label" >
<Name> Concentration Units </Name>
</Parameter>
<Parameter Widget="Combo" >
<Type> String </Type>
<Name> Concentration Units </Name>
<Item Type="Active" > <Name> Absolute Mass </Name> </Item>
<Item> <Name> Mass To Max Solubility </Name> </Item>
</Parameter>
<Parameter Widget="Label" >
<Name> Convection </Name>
</Parameter>
<Parameter Widget="Combo" >
<Type> String </Type>
<Name> Convection </Name>
<Item Type="Active" > <Name> None </Name> </Item> <Item>
<Name> Constant </Name>
<Activate> /Advection Diffusion Equation/Equation/Convection Velocity 1 </Activate>
<Activate> /Advection Diffusion Equation/Equation/Convection Velocity 2 </Activate>
<Activate> /Advection Diffusion Equation/Equation/Convection Velocity 3 </Activate>
</Item>
<Item> <Name> Computed </Name> </Item>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name> Convection Velocity 1</Name>
<SifName> Convection velocity 1</SifName>
<Whatis> Convection velocity for 'Constant' convection model. Despite its association, may be space and time varying. </Whatis>
<StatusTip> Convection velocity </StatusTip>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name> Convection Velocity 2</Name>
<SifName> Convection velocity 2</SifName>
<Whatis> Convection velocity for 'Constant' convection model. Despite its association, may be space and time varying. </Whatis>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name> Convection Velocity 3</Name>
<SifName> Convection velocity 3</SifName>
<Whatis> Convection velocity for 'Constant' convection model. Despite its association, may be space and time varying. </Whatis>
<StatusTip> Convection velocity </StatusTip>
</Parameter>
</Equation>
<Solver>
<Parameter Widget="Edit" >
<Name > Procedure </Name>
<DefaultValue> "AdvectionDiffusion" "AdvectionDiffusionSolver" </DefaultValue>
</Parameter>
<Parameter Widget="Edit" Enabled="True">
<Name> Variable </Name>
<DefaultValue> Concentration </DefaultValue>
</Parameter>
</Solver>
<BodyForce>
<Parameter Widget="Label" > <Name> Volume sources </Name> </Parameter>
<Parameter Widget="Edit">
<Name> Concentration Diffusion Source </Name>
<Whatis> An additional source S for the diffusion equation may be given with this keyword. </Whatis>
</Parameter>
<Parameter Widget="CheckBox" Enabled="True">
<Name> Physical Units </Name>
<Type> Logical </Type>
<Whatis> With this keyword, the source term can be given in absolute mass units regardless of scaling. </Whatis>
</Parameter>
</BodyForce>
<Material>
<Parameter Widget="Label" > <Name> Properties </Name> </Parameter>
<Parameter Widget="Edit" >
<Name> Concentration Diffusivity </Name>
<StatusTip> Set value to oxygen diffusivity, can also be a tensor for anisotropy. </StatusTip>
<Whatis> Give value to diffusivity material property. </Whatis>
</Parameter>
<Parameter Widget="Edit" >
<Name> Concentration Soret Diffusivity </Name>
<StatusTip> Set value to Soret diffusivity, the thermal diffusivity coefficient. </StatusTip>
<Whatis> Give value to Soret diffusivity material property. </Whatis>
</Parameter>
<Parameter Widget="Edit" >
<Name> Concentration Maximum Solubility </Name>
<StatusTip> Set value to maximum solubility. </StatusTip>
<Whatis> Give value to maximum solubility of solute. </Whatis>
</Parameter>
</Material>
<InitialCondition>
<Parameter Widget="Label" > <Name> Variables </Name> </Parameter>
<Parameter Widget="Edit">
<Name> Concentration </Name>
<Whatis> Give initial value to Concentration field. </Whatis>
<StatusTip> Give initial value to Concentration field. </StatusTip>
</Parameter>
</InitialCondition>
<BoundaryCondition>
<Parameter Widget="Label" > <Name> Dirichlet Conditions </Name> </Parameter>
<Parameter Widget="Edit">
<Name> Concentration </Name>
<Activate> /Advection Diffusion Equation/BoundaryCondition/Concentration Condition </Activate>
<Whatis> Give concentration value for this boundary. </Whatis>
<StatusTip> Give concentration value for this boundary. </StatusTip>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name> Concentration Condition </Name>
<Whatis> If the given value is less than zero, apply flux condition insted of the Dirichlet Condition. To be generally useful space and/or time varying values may be given. </Whatis>
<StatusTip> Give temperature condition value for this boundary. </StatusTip>
</Parameter>
<Parameter Widget="Label" > <Name> Diffusion Flux conditions </Name> </Parameter>
<Parameter Widget="Edit">
<Name> Concentration Flux </Name>
<Whatis> Give diffusion flux. </Whatis>
<StatusTip> Give diffusion flux. </StatusTip>
</Parameter>
<Parameter Widget="Edit">
<Name> Mass Transfer Coeff. </Name>
<SifName> Mass Transfer Coefficient </SifName>
<Whatis> Give mass transfer coefficient. </Whatis>
<StatusTip> Give mass transfer flux. </StatusTip>
</Parameter>
<Parameter Widget="Edit">
<Name> External Concentration </Name>
<Whatis> Give external concentration. </Whatis>
<StatusTip> Give external concentration. </StatusTip>
</Parameter>
</BoundaryCondition>
</PDE>
</edf>
...@@ -39,6 +39,19 @@ ...@@ -39,6 +39,19 @@
<Type> Logical </Type> <Type> Logical </Type>
<Whatis> Append files when calling multiple times. False is the default. </Whatis> <Whatis> Append files when calling multiple times. False is the default. </Whatis>
</Parameter> </Parameter>
<Parameter Widget="CheckBox" >
<Name> Show Norm </Name>
<Type> Logical </Type>
<Whatis> Show result as a norm for convergence monitor. False is the default. </Whatis>
<Activate> /SaveScalars/Solver/Show Norm Index </Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name> Show Norm Index</Name>
<Type> Integer </Type>
<Whatis> The index of the computed value to be shown. One is the default.</Whatis>
</Parameter>
<Parameter Widget="Edit" > <Parameter Widget="Edit" >
<Name> Save Points </Name> <Name> Save Points </Name>
......
...@@ -232,6 +232,11 @@ ...@@ -232,6 +232,11 @@
<Item> <Name> User defined </Name> </Item> <Item> <Name> User defined </Name> </Item>
<Whatis> Set heat conductivity model used to compute the effective heat conductivity. </Whatis> <Whatis> Set heat conductivity model used to compute the effective heat conductivity. </Whatis>
</Parameter> </Parameter>
<Parameter Widget="Edit" >
<Name> Emissivity </Name>
<StatusTip> Set value to emissivity. </StatusTip>
<Whatis>Give value to emissivity material property.</Whatis>
</Parameter>
<Parameter Widget="Edit" Enabled="False"> <Parameter Widget="Edit" Enabled="False">
<Name> Turbulent Prandtl Number </Name> <Name> Turbulent Prandtl Number </Name>
<DefaultValue> 0.85 </DefaultValue> <DefaultValue> 0.85 </DefaultValue>
......
...@@ -131,6 +131,14 @@ stress. </Whatis> ...@@ -131,6 +131,14 @@ stress. </Whatis>
<Name> Fix Displacements </Name> <Name> Fix Displacements </Name>
<Whatis> This keyword defined if the displacements or forces are set and thereby chooces the model lumping algorhitm.</Whatis> <Whatis> This keyword defined if the displacements or forces are set and thereby chooces the model lumping algorhitm.</Whatis>
</Parameter> </Parameter>
<Parameter Widget="Label"> <Name> More Options </Name> </Parameter>
<Parameter Widget="CheckBox" Enabled="True">
<Name> Displace mesh </Name>
<DefaultValue> True </DefaultValue>
<Whatis> Displace mesh with the solution (or not).</Whatis>
</Parameter>
</Solver> </Solver>
<Equation> <Equation>
......
...@@ -34,6 +34,45 @@ ...@@ -34,6 +34,45 @@
<DefaultValue> case </DefaultValue> <DefaultValue> case </DefaultValue>
<Whatis> Name of the file in which results are exported. </Whatis> <Whatis> Name of the file in which results are exported. </Whatis>
</Parameter> </Parameter>
<Parameter Widget="Label"> <Name>Scalar Fields</Name> </Parameter>
<Parameter Widget="Edit">
<Name>Scalar Field 1 </Name>
<Activate> /Result Output/Solver/Scalar Field 2</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Scalar Field 2 </Name>
<Activate> /Result Output/Solver/Scalar Field 3</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Scalar Field 3 </Name>
<Activate> /Result Output/Solver/Scalar Field 4</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Scalar Field 4 </Name>
<Activate> /Result Output/Solver/Scalar Field 5</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Scalar Field 5 </Name>
<Activate> /Result Output/Solver/Scalar Field 6</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Scalar Field 6 </Name>
</Parameter>
<Parameter Widget="Label"> <Name>Vector Fields</Name> </Parameter>
<Parameter Widget="Edit">
<Name>Vector Field 1 </Name>
<Activate> /Result Output/Solver/Vector Field 2</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Vector Field 2 </Name>
<Activate> /Result Output/Solver/Vector Field 3</Activate>
</Parameter>
<Parameter Widget="Edit" Enabled="False" Visible="False">
<Name>Vector Field 3 </Name>
</Parameter>
</Solver> </Solver>
</PDE> </PDE>
</edf> </edf>
...@@ -177,7 +177,8 @@ void DynamicEditor::setupTabs(QDomDocument &elmerDefs, QString Section, int ID) ...@@ -177,7 +177,8 @@ void DynamicEditor::setupTabs(QDomDocument &elmerDefs, QString Section, int ID)
combo->insertItem(count++,itemName.text().trimmed() ); combo->insertItem(count++,itemName.text().trimmed() );
} }
combo->setCurrentIndex(active); combo->setCurrentIndex(active);
connect(combo, SIGNAL(activated(QString)), this, SLOT(comboSlot(QString))); // connect(combo, SIGNAL(activated(QString)), this, SLOT(comboSlot(QString)));
connect(combo, SIGNAL(currentIndexChanged(QString)), this, SLOT(comboSlot(QString)));
} else if ( widget_type == "CheckBox" ) { } else if ( widget_type == "CheckBox" ) {
QCheckBox *l = new QCheckBox; QCheckBox *l = new QCheckBox;
......
...@@ -5612,6 +5612,8 @@ void MainWindow::boundarySelectedSlot(list_t *l) ...@@ -5612,6 +5612,8 @@ void MainWindow::boundarySelectedSlot(list_t *l)
glWidget->altPressed = false; glWidget->altPressed = false;
bodyEdit->setWindowTitle("Properties for body " + QString::number(current)); bodyEdit->setWindowTitle("Properties for body " + QString::number(current));
// if(bodyEdit->ui.nameEdit->text().trimmed().isEmpty())
bodyEdit->ui.nameEdit->setText("Body Property{Boundary " + QString::number(n+1) + "}"); bodyEdit->ui.nameEdit->setText("Body Property{Boundary " + QString::number(n+1) + "}");
} }
} }
...@@ -5644,7 +5646,9 @@ void MainWindow::boundarySelectedSlot(list_t *l) ...@@ -5644,7 +5646,9 @@ void MainWindow::boundarySelectedSlot(list_t *l)
cout << "MainWindow: Undetermined body index" << endl; cout << "MainWindow: Undetermined body index" << endl;
bodyEdit->setWindowTitle("Properties for body " + QString::number(current)); bodyEdit->setWindowTitle("Properties for body " + QString::number(current));
bodyEdit->ui.nameEdit->setText("Body Property " + QString::number(n+1));
if(bodyEdit->ui.nameEdit->text().trimmed().isEmpty())
bodyEdit->ui.nameEdit->setText("Body Property " + QString::number(n+1));
} }
......
...@@ -97,6 +97,11 @@ ...@@ -97,6 +97,11 @@
#include <vtkCommand.h> #include <vtkCommand.h>
#include <vtkFollower.h> #include <vtkFollower.h>
#include <vtkImplicitPlaneWidget.h> #include <vtkImplicitPlaneWidget.h>
#include <vtkGeometryFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkIndent.h>
using namespace std; using namespace std;
...@@ -446,6 +451,10 @@ void VtkPost::createActions() ...@@ -446,6 +451,10 @@ void VtkPost::createActions()
savePictureAct->setStatusTip("Save picture in file"); savePictureAct->setStatusTip("Save picture in file");
connect(savePictureAct, SIGNAL(triggered()), this, SLOT(savePictureSlot())); connect(savePictureAct, SIGNAL(triggered()), this, SLOT(savePictureSlot()));
savePovrayAct = new QAction(QIcon(""), tr("Save povray data..."), this);
savePovrayAct->setStatusTip("Save model data in povray-format");
connect(savePovrayAct, SIGNAL(triggered()), this, SLOT(savePovraySlot()));
reloadPostAct = new QAction(QIcon(""), tr("Reload"), this); reloadPostAct = new QAction(QIcon(""), tr("Reload"), this);
reloadPostAct->setStatusTip("Reloads input file"); reloadPostAct->setStatusTip("Reloads input file");
connect(reloadPostAct, SIGNAL(triggered()), this, SLOT(reloadPostSlot())); connect(reloadPostAct, SIGNAL(triggered()), this, SLOT(reloadPostSlot()));
...@@ -600,6 +609,8 @@ void VtkPost::createMenus() ...@@ -600,6 +609,8 @@ void VtkPost::createMenus()
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(savePictureAct); fileMenu->addAction(savePictureAct);
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(savePovrayAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct); fileMenu->addAction(exitAct);
// Edit menu: // Edit menu:
...@@ -787,6 +798,152 @@ void VtkPost::savePictureSlot() ...@@ -787,6 +798,152 @@ void VtkPost::savePictureSlot()
this->SavePngFile(fileName); this->SavePngFile(fileName);
} }
// Save povray:
//----------------------------------------------------------------------
void VtkPost::savePovraySlot()
{
QFile file("case.pov");
if(!file.open(QIODevice::WriteOnly))
return;
QTextStream text(&file);
// Convert to vtkPolyData with normals:
//======================================
vtkGeometryFilter *geometry = vtkGeometryFilter::New();
geometry->SetInput(surfaceGrid);
vtkPolyDataNormals *normals = vtkPolyDataNormals::New();
normals->SetInputConnection(geometry->GetOutputPort());
vtkPolyData *polyData = normals->GetOutput();
polyData->Update();
polyData->ComputeBounds();
double *bounds = polyData->GetBounds();
double x0 = (bounds[1] + bounds[0])/2.0;
double y0 = (bounds[3] + bounds[2])/2.0;
double z0 = (bounds[5] + bounds[4])/2.0;
double dx = bounds[1] - bounds[0];
double dy = bounds[3] - bounds[2];
double dz = bounds[5] - bounds[4];
double ds = sqrt(dx*dx+dy*dy+dz*dz);
// Create progress dialog:
//=========================
QProgressDialog dialog;
connect(this, SIGNAL(povrayState(int)), &dialog, SLOT(setValue(int)));
dialog.show();
// Headers etc.
//==============
text << "#include \"colors.inc\"\n\n"
<< "background {color White}\n\n"
<< "camera {location <1,1,1>*" << ds/1.5 << " look_at 0}\n\n"
<< "light_source {<1,2,3>*" << 5.0*ds << " color White}\n\n";
// Mesh2:
//========
text << "mesh2 {\n";
// Vertex points:
//----------------
dialog.setLabelText("Writing points...");
dialog.setMaximum(polyData->GetNumberOfPoints());
text << " vertex_vectors {\n"
<< " " << polyData->GetNumberOfPoints() << "\n";
vtkPoints *points = polyData->GetPoints();
for(int i = 0; i < polyData->GetNumberOfPoints(); i++) {
emit(povrayState(i));
double *p = points->GetPoint(i);
text << " <" << p[0] << "," << p[1] << "," << p[2] << ">\n";
}
text << " }\n"; // vertex_vectors
// Surface normals:
//------------------
dialog.setLabelText("Writing normals...");
dialog.setMaximum(polyData->GetNumberOfPoints());
text << " normal_vectors {\n"
<< " " << polyData->GetNumberOfPoints() << "\n";
for(int i = 0; i < polyData->GetNumberOfPoints(); i++) {
emit(povrayState(i));
double *p = polyData->GetPointData()->GetNormals()->GetTuple(i);
text << " <" << p[0] << "," << p[1] << "," << p[2] << ">\n";
}
text << " }\n"; // normal_vectors
// Face indices:
//---------------
dialog.setLabelText("Writing faces...");
dialog.setMaximum(polyData->GetNumberOfCells());
text << " face_indices {\n"
<< " " << polyData->GetNumberOfCells() << "\n";
for(int i = 0; i < polyData->GetNumberOfCells(); i++) {
emit(povrayState(i));
vtkCell *cell = polyData->GetCell(i);
int n0 = cell->GetPointId(0);
int n1 = cell->GetPointId(1);
int n2 = cell->GetPointId(2);
text << " <" << n0 << "," << n1 << "," << n2 << ">\n";
}
text << " }\n"; // face_indices
// Texture:
//----------
text << " texture {\n"
<< " pigment {\n"
<< " rgb <0,1,1>\n"
<< " }\n"
<< " finish {\n"
<< " specular 0.7\n"
<< " roughness 0.05\n"
<< " }\n"
<< " }\n";
// Translate:
//------------
text << " translate <" << -x0/2.0 << "," << -y0/2.0 << "," << -z0/2.0 << ">\n";
text << "}\n\n"; // mesh2
// Floor:
//--------
text << "plane {\n"
<< " y," << -dy/1.5 << "\n"
<< " pigment {\n"
<< " checker rgb<0.9,0.5,0.4> rgb<0.9,0.9,1.0> scale " << ds/5.0 << "\n"
<< " }\n"
<< " finish {\n"
<< " reflection 0.0\n"
<< " ambient 0.4\n"
<< " }\n"
<< "}\n";
// Finalize:
//===========
normals->Delete();
geometry->Delete();
file.close();
}
// Read input file (dialog): // Read input file (dialog):
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void VtkPost::readEpFileSlot() void VtkPost::readEpFileSlot()
...@@ -937,6 +1094,7 @@ bool VtkPost::ReadPostFile(QString postFileName) ...@@ -937,6 +1094,7 @@ bool VtkPost::ReadPostFile(QString postFileName)
ScalarField *sfx = &scalarField[index+0]; ScalarField *sfx = &scalarField[index+0];
ScalarField *sfy = &scalarField[index+1]; ScalarField *sfy = &scalarField[index+1];
ScalarField *sfz = &scalarField[index+2]; ScalarField *sfz = &scalarField[index+2];
for( int i=0; i < nodes; i++ ) for( int i=0; i < nodes; i++ )
{ {
sfx->value[i] = epMesh->epNode[i].x[0]; sfx->value[i] = epMesh->epNode[i].x[0];
......
...@@ -155,6 +155,7 @@ public: ...@@ -155,6 +155,7 @@ public:
signals: signals:
void canProceedWithNextSignal(vtkRenderWindow*); void canProceedWithNextSignal(vtkRenderWindow*);
void povrayState(int value);
public slots: public slots:
void redrawSlot(); // redraw all actors void redrawSlot(); // redraw all actors
...@@ -292,6 +293,7 @@ private slots: ...@@ -292,6 +293,7 @@ private slots:
void clipAllToggledSlot(bool); void clipAllToggledSlot(bool);
void savePictureSlot(); void savePictureSlot();
void savePovraySlot();
void timeStepChangedSlot(); void timeStepChangedSlot();
void reloadPostSlot(); void reloadPostSlot();
...@@ -318,6 +320,7 @@ private: ...@@ -318,6 +320,7 @@ private:
QAction *exitAct; QAction *exitAct;
QAction *redrawAct; QAction *redrawAct;
QAction *savePictureAct; QAction *savePictureAct;
QAction *savePovrayAct;
QAction *preferencesAct; QAction *preferencesAct;
QAction *drawMeshPointAct; QAction *drawMeshPointAct;
QAction *drawMeshEdgeAct; QAction *drawMeshEdgeAct;
......
...@@ -75,7 +75,7 @@ macx { ...@@ -75,7 +75,7 @@ macx {
# VTK library: # VTK library:
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
unix { unix {
VTK_INCLUDEPATH = /usr/include/vtk-5.0 VTK_INCLUDEPATH = /usr/include/vtk-5.2
VTK_LIBPATH = /usr/lib VTK_LIBPATH = /usr/lib
VTK_LIBS = -lvtkHybrid \ VTK_LIBS = -lvtkHybrid \
-lvtkWidgets \ -lvtkWidgets \
......
##### ElmerGrid input file for structured grid generation ######
Version = 210903
Coordinate System = Cartesian 2D
Subcell Divisions in 2D = 4 2
Subcell Limits 1 = 0 15 22.5 37 52
Subcell Limits 2 = 0 6 6
Material Structure in 2D
6 5 4 3
1 1 1 1
End
Geometry Mappings
# mode line limits(2) Np params(Np)
1 1 6.0 6.0 8 15 0 24 3 28 3 37 0
End
Materials Interval = 1 1
Boundary Definitions
# type out int
1 -1 1 1
2 -2 1 1
3 3 1 1
4 4 1 1
5 5 1 1
6 6 1 1
7 -4 1 1
End
Numbering = Vertical
Element Degree = 1
Element Innernodes = False
Triangles = False