240 lines
12 KiB
C#
240 lines
12 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Runtime.Serialization;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using CaeGlobals;
|
|||
|
|
using CaeMesh.Meshing;
|
|||
|
|
using DynamicTypeDescriptor;
|
|||
|
|
using GmshCommon;
|
|||
|
|
|
|||
|
|
namespace CaeMesh
|
|||
|
|
{
|
|||
|
|
[Serializable]
|
|||
|
|
public class GmshSetupItem : MeshSetupItem, ISerializable
|
|||
|
|
{
|
|||
|
|
// Variables
|
|||
|
|
private GmshAlgorithmMesh2DEnum _algorithmMesh2D; // ISerializable
|
|||
|
|
private GmshAlgorithmMesh3DEnum _algorithmMesh3D; // ISerializable
|
|||
|
|
private GmshAlgorithmRecombineEnum _algorithmRecombine; // ISerializable
|
|||
|
|
private double _recombineMinQuality; // ISerializable
|
|||
|
|
private bool _transfiniteThreeSided; // ISerializable
|
|||
|
|
private bool _transfiniteFourSided; // ISerializable
|
|||
|
|
private double _transfiniteAngleDeg; // ISerializable
|
|||
|
|
private GmshOptimizeFirstOrderShellEnum _optimizeFirstOrderShell; // ISerializable
|
|||
|
|
private GmshOptimizeFirstOrderSolidEnum _optimizeFirstOrderSolid; // ISerializable
|
|||
|
|
private GmshOptimizeHighOrderEnum _optimizeHighOrder; // ISerializable
|
|||
|
|
private ElementSizeTypeEnum _elementSizeType; // ISerializable
|
|||
|
|
private double _elementScaleFactor; // ISerializable
|
|||
|
|
private int _numberOfElements; // ISerializable
|
|||
|
|
private double[] _layerSizes; // ISerializable
|
|||
|
|
private int[] _numOfElementsPerLayer; // ISerializable
|
|||
|
|
private int _numberOfThreads; // ISerializable
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Properties
|
|||
|
|
public GmshAlgorithmMesh2DEnum AlgorithmMesh2D { get { return _algorithmMesh2D; } set { _algorithmMesh2D = value; } }
|
|||
|
|
public GmshAlgorithmMesh3DEnum AlgorithmMesh3D { get { return _algorithmMesh3D; } set { _algorithmMesh3D = value; } }
|
|||
|
|
public GmshAlgorithmRecombineEnum AlgorithmRecombine
|
|||
|
|
{
|
|||
|
|
get { return _algorithmRecombine; }
|
|||
|
|
set { _algorithmRecombine = value; }
|
|||
|
|
}
|
|||
|
|
public double RecombineMinQuality { get { return _recombineMinQuality; } set { _recombineMinQuality = value; } }
|
|||
|
|
public bool TransfiniteThreeSided { get { return _transfiniteThreeSided; } set { _transfiniteThreeSided = value; } }
|
|||
|
|
public bool TransfiniteFourSided { get { return _transfiniteFourSided; } set { _transfiniteFourSided = value; } }
|
|||
|
|
public double TransfiniteAngleDeg { get { return _transfiniteAngleDeg; } set { _transfiniteAngleDeg = value; } }
|
|||
|
|
public double TransfiniteAngleRad { get { return _transfiniteAngleDeg * Math.PI / 180; } }
|
|||
|
|
public GmshOptimizeFirstOrderShellEnum OptimizeFirstOrderShell
|
|||
|
|
{
|
|||
|
|
get { return _optimizeFirstOrderShell; }
|
|||
|
|
set { _optimizeFirstOrderShell = value; }
|
|||
|
|
}
|
|||
|
|
public GmshOptimizeFirstOrderSolidEnum OptimizeFirstOrderSolid
|
|||
|
|
{
|
|||
|
|
get { return _optimizeFirstOrderSolid; }
|
|||
|
|
set { _optimizeFirstOrderSolid = value; }
|
|||
|
|
}
|
|||
|
|
public GmshOptimizeHighOrderEnum OptimizeHighOrder
|
|||
|
|
{
|
|||
|
|
get { return _optimizeHighOrder; }
|
|||
|
|
set { _optimizeHighOrder = value; }
|
|||
|
|
}
|
|||
|
|
public ElementSizeTypeEnum ElementSizeType
|
|||
|
|
{
|
|||
|
|
get { return _elementSizeType; }
|
|||
|
|
set { _elementSizeType = value; }
|
|||
|
|
}
|
|||
|
|
public double ElementScaleFactor
|
|||
|
|
{
|
|||
|
|
get { return _elementScaleFactor; }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_elementScaleFactor = value;
|
|||
|
|
if (_elementScaleFactor < 0) _elementScaleFactor = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public int NumberOfElements
|
|||
|
|
{
|
|||
|
|
get { return _numberOfElements; }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_numberOfElements = value;
|
|||
|
|
if (_numberOfElements < 1) _numberOfElements = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public double[] LayerSizes
|
|||
|
|
{
|
|||
|
|
get { return _layerSizes; }
|
|||
|
|
set { _layerSizes = value; }
|
|||
|
|
}
|
|||
|
|
public int[] NumOfElementsPerLayer
|
|||
|
|
{
|
|||
|
|
get { return _numOfElementsPerLayer; }
|
|||
|
|
set { _numOfElementsPerLayer = value; }
|
|||
|
|
}
|
|||
|
|
public int NumberOfThreads
|
|||
|
|
{
|
|||
|
|
get { return _numberOfThreads; }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_numberOfThreads = value;
|
|||
|
|
if (_numberOfThreads < 1) _numberOfThreads = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Constructors
|
|||
|
|
public GmshSetupItem(string name)
|
|||
|
|
: base(name)
|
|||
|
|
{
|
|||
|
|
Reset();
|
|||
|
|
}
|
|||
|
|
public GmshSetupItem(ExtrudeMesh extrudeMesh)
|
|||
|
|
: base("tmpName")
|
|||
|
|
{
|
|||
|
|
CopyFrom(extrudeMesh);
|
|||
|
|
}
|
|||
|
|
public GmshSetupItem(SerializationInfo info, StreamingContext context)
|
|||
|
|
: base(info, context)
|
|||
|
|
{
|
|||
|
|
foreach (SerializationEntry entry in info)
|
|||
|
|
{
|
|||
|
|
switch (entry.Name)
|
|||
|
|
{
|
|||
|
|
case "_algorithmMesh2D":
|
|||
|
|
_algorithmMesh2D = (GmshAlgorithmMesh2DEnum)entry.Value; break;
|
|||
|
|
case "_algorithmMesh3D":
|
|||
|
|
_algorithmMesh3D = (GmshAlgorithmMesh3DEnum)entry.Value; break;
|
|||
|
|
case "_algorithmRecombine":
|
|||
|
|
_algorithmRecombine = (GmshAlgorithmRecombineEnum)entry.Value; break;
|
|||
|
|
case "_recombineMinQuality":
|
|||
|
|
_recombineMinQuality = (double)entry.Value; break;
|
|||
|
|
case "_transfiniteThreeSided":
|
|||
|
|
_transfiniteThreeSided = (bool)entry.Value; break;
|
|||
|
|
case "_transfinite":
|
|||
|
|
case "_transfiniteFourSided":
|
|||
|
|
_transfiniteFourSided = (bool)entry.Value; break;
|
|||
|
|
case "_transfiniteAngleDeg":
|
|||
|
|
_transfiniteAngleDeg = (double)entry.Value; break;
|
|||
|
|
case "_optimizeFirstOrderShell":
|
|||
|
|
_optimizeFirstOrderShell = (GmshOptimizeFirstOrderShellEnum)entry.Value; break;
|
|||
|
|
case "_optimizeFirstOrderSolid":
|
|||
|
|
_optimizeFirstOrderSolid = (GmshOptimizeFirstOrderSolidEnum)entry.Value; break;
|
|||
|
|
case "_optimizeHighOrder":
|
|||
|
|
_optimizeHighOrder = (GmshOptimizeHighOrderEnum)entry.Value; break;
|
|||
|
|
case "_elementSizeType":
|
|||
|
|
_elementSizeType = (ElementSizeTypeEnum)entry.Value; break;
|
|||
|
|
case "_elementScaleFactor":
|
|||
|
|
_elementScaleFactor = (double)entry.Value; break;
|
|||
|
|
case "_numberOfLayers": // Compatibility for version v1.5.7
|
|||
|
|
case "_numberOfElements":
|
|||
|
|
_numberOfElements = (int)entry.Value; break;
|
|||
|
|
case "_normalizedLayerSizes": // Compatibility for version v2.0.7
|
|||
|
|
case "_layerSizes":
|
|||
|
|
_layerSizes = (double[])entry.Value; break;
|
|||
|
|
case "_numOfElementsPerLayer":
|
|||
|
|
_numOfElementsPerLayer = (int[])entry.Value; break;
|
|||
|
|
case "_numberOfThreads":
|
|||
|
|
_numberOfThreads = (int)entry.Value; break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Compatibility for version v1.5.7
|
|||
|
|
if (_layerSizes == null) _layerSizes = new double[] { 1 };
|
|||
|
|
if (_numOfElementsPerLayer == null) _numOfElementsPerLayer = new int[] { 1 };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Methods
|
|||
|
|
public override void Reset()
|
|||
|
|
{
|
|||
|
|
base.Reset();
|
|||
|
|
//
|
|||
|
|
_algorithmMesh2D = GmshAlgorithmMesh2DEnum.FrontalDelaunay;
|
|||
|
|
_algorithmMesh3D = GmshAlgorithmMesh3DEnum.Delaunay;
|
|||
|
|
_algorithmRecombine = GmshAlgorithmRecombineEnum.None;
|
|||
|
|
_recombineMinQuality = 0.01;
|
|||
|
|
_transfiniteThreeSided = true;
|
|||
|
|
_transfiniteFourSided = true;
|
|||
|
|
_transfiniteAngleDeg = 135;
|
|||
|
|
_optimizeFirstOrderShell = GmshOptimizeFirstOrderShellEnum.None;
|
|||
|
|
_optimizeFirstOrderSolid = GmshOptimizeFirstOrderSolidEnum.None;
|
|||
|
|
_optimizeHighOrder = GmshOptimizeHighOrderEnum.None;
|
|||
|
|
_elementSizeType = ElementSizeTypeEnum.ScaleFactor;
|
|||
|
|
_elementScaleFactor = 1;
|
|||
|
|
_numberOfElements = 1;
|
|||
|
|
_layerSizes = new double[] { 1 };
|
|||
|
|
_numOfElementsPerLayer = new int[] { 1 };
|
|||
|
|
_numberOfThreads = 1;
|
|||
|
|
}
|
|||
|
|
public void CopyFrom(GmshSetupItem gmshSetupItem)
|
|||
|
|
{
|
|||
|
|
base.CopyFrom(gmshSetupItem);
|
|||
|
|
//
|
|||
|
|
_algorithmMesh2D = gmshSetupItem._algorithmMesh2D;
|
|||
|
|
_algorithmMesh3D = gmshSetupItem._algorithmMesh3D;
|
|||
|
|
_algorithmRecombine = gmshSetupItem._algorithmRecombine;
|
|||
|
|
_recombineMinQuality = gmshSetupItem._recombineMinQuality;
|
|||
|
|
_transfiniteThreeSided = gmshSetupItem._transfiniteThreeSided;
|
|||
|
|
_transfiniteFourSided = gmshSetupItem._transfiniteFourSided;
|
|||
|
|
_transfiniteAngleDeg = gmshSetupItem._transfiniteAngleDeg;
|
|||
|
|
_optimizeFirstOrderShell = gmshSetupItem.OptimizeFirstOrderShell;
|
|||
|
|
_optimizeFirstOrderSolid = gmshSetupItem.OptimizeFirstOrderSolid;
|
|||
|
|
_optimizeHighOrder = gmshSetupItem.OptimizeHighOrder;
|
|||
|
|
_elementSizeType = gmshSetupItem._elementSizeType;
|
|||
|
|
_elementScaleFactor = gmshSetupItem._elementScaleFactor;
|
|||
|
|
_numberOfElements = gmshSetupItem._numberOfElements;
|
|||
|
|
if (gmshSetupItem._layerSizes != null) _layerSizes = gmshSetupItem._layerSizes.ToArray();
|
|||
|
|
else _layerSizes = null;
|
|||
|
|
if (gmshSetupItem._numOfElementsPerLayer != null) _numOfElementsPerLayer = gmshSetupItem._numOfElementsPerLayer.ToArray();
|
|||
|
|
else _numOfElementsPerLayer = null;
|
|||
|
|
_numberOfThreads = gmshSetupItem._numberOfThreads;
|
|||
|
|
}
|
|||
|
|
// ISerialization
|
|||
|
|
public new void GetObjectData(SerializationInfo info, StreamingContext context)
|
|||
|
|
{
|
|||
|
|
base.GetObjectData(info, context);
|
|||
|
|
// Using typeof() works also for null fields
|
|||
|
|
info.AddValue("_algorithmMesh2D", _algorithmMesh2D, typeof(GmshAlgorithmMesh2DEnum));
|
|||
|
|
info.AddValue("_algorithmMesh3D", _algorithmMesh3D, typeof(GmshAlgorithmMesh3DEnum));
|
|||
|
|
info.AddValue("_algorithmRecombine", _algorithmRecombine, typeof(GmshAlgorithmRecombineEnum));
|
|||
|
|
info.AddValue("_recombineMinQuality", _recombineMinQuality, typeof(double));
|
|||
|
|
info.AddValue("_transfiniteThreeSided", _transfiniteThreeSided, typeof(bool));
|
|||
|
|
info.AddValue("_transfiniteFourSided", _transfiniteFourSided, typeof(bool));
|
|||
|
|
info.AddValue("_transfiniteAngleDeg", _transfiniteAngleDeg, typeof(double));
|
|||
|
|
info.AddValue("_optimizeFirstOrderShell", _optimizeFirstOrderShell, typeof(GmshOptimizeFirstOrderShellEnum));
|
|||
|
|
info.AddValue("_optimizeFirstOrderSolid", _optimizeFirstOrderSolid, typeof(GmshOptimizeFirstOrderSolidEnum));
|
|||
|
|
info.AddValue("_optimizeHighOrder", _optimizeHighOrder, typeof(GmshOptimizeHighOrderEnum));
|
|||
|
|
info.AddValue("_elementSizeType", _elementSizeType, typeof(ElementSizeTypeEnum));
|
|||
|
|
info.AddValue("_elementScaleFactor", _elementScaleFactor, typeof(double));
|
|||
|
|
info.AddValue("_numberOfElements", _numberOfElements, typeof(int));
|
|||
|
|
info.AddValue("_layerSizes", _layerSizes, typeof(double[]));
|
|||
|
|
info.AddValue("_numOfElementsPerLayer", _numOfElementsPerLayer, typeof(int[]));
|
|||
|
|
info.AddValue("_numberOfThreads", _numberOfThreads, typeof(int));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|