Files
wg_cpso/CaeModel/Contact/ContactPair.cs

187 lines
8.0 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CaeMesh;
using DynamicTypeDescriptor;
using CaeGlobals;
using System.Drawing;
namespace CaeModel
{
[Serializable]
public enum ContactPairMethod
{
[StandardValue("Node to surface", "Node to surface", Description =
"Use node-to-face penalty contact method. All contact pairs in the model must use the same contact type.")]
NodeToSurface,
[StandardValue("Surface to surface", "Surface to surface", Description =
"Use face-to-face penalty contact method. All contact pairs in the model must use the same contact type.")]
SurfaceToSurface,
[StandardValue("Mortar", "Mortar", Description =
"Use mortar contact method. All contact pairs in the model must use the same contact type.")]
Mortar,
[StandardValue("Massless", "Massless", Description =
"Use massless contact method. All contact pairs in the model must use the same contact type.")]
Massless,
}
[Serializable]
public class ContactPair : NamedClass, IMasterSlaveMultiRegion
{
// Static variables
public static readonly double InitialAdjustmentSize = 0.01;
// Variables
private static string _positive = "The value must be larger than 0.";
//
private string _surfaceInteractionName;
private ContactPairMethod _method;
private bool _smallSliding;
private bool _adjust;
private double _adjustmentSize;
//
private RegionTypeEnum _slaveRegionType;
private string _slaveSurfaceName;
private RegionTypeEnum _masterRegionType;
private string _masterSurfaceName;
//
private int[] _slaveCreationIds;
private Selection _slaveCreationData;
private int[] _masterCreationIds;
private Selection _masterCreationData;
//
protected Color _masterColor;
protected Color _slaveColor;
// Properties
public string SurfaceInteractionName { get { return _surfaceInteractionName; } set { _surfaceInteractionName = value; } }
public ContactPairMethod Method
{
get { return _method; }
set
{
_method = value;
if (_method == ContactPairMethod.SurfaceToSurface) _smallSliding = false;
}
}
public bool SmallSliding
{
get { return _smallSliding; }
set
{
_smallSliding = value;
Method = _method; // check the compatibility
}
}
public bool Adjust { get { return _adjust; } set { _adjust = value; } }
public double AdjustmentSize
{
get { return _adjustmentSize; }
set { if (double.IsNaN(value) || value >= 0) _adjustmentSize = value; else throw new CaeException(_positive); }
}
//
public RegionTypeEnum MasterRegionType { get { return _masterRegionType; } set { _masterRegionType = value; } }
public string MasterRegionName { get { return _masterSurfaceName; } set { _masterSurfaceName = value; } }
public RegionTypeEnum SlaveRegionType { get { return _slaveRegionType; } set { _slaveRegionType = value; } }
public string SlaveRegionName { get { return _slaveSurfaceName; } set { _slaveSurfaceName = value; } }
//
public int[] SlaveCreationIds { get { return _slaveCreationIds; } set { _slaveCreationIds = value; } }
public Selection SlaveCreationData { get { return _slaveCreationData; } set { _slaveCreationData = value; } }
public int[] MasterCreationIds { get { return _masterCreationIds; } set { _masterCreationIds = value; } }
public Selection MasterCreationData { get { return _masterCreationData; } set { _masterCreationData = value; } }
//
public Color MasterColor
{
get
{
// Compatibility for version v0.6.0
if (_masterColor == Color.Empty) _masterColor = Color.Yellow;
//
return _masterColor;
}
set { _masterColor = value; }
}
public Color SlaveColor
{
get
{
// Compatibility for version v0.6.0
if (_slaveColor == Color.Empty) _slaveColor = Color.Yellow;
//
return _slaveColor;
}
set { _slaveColor = value; }
}
// Constructors
public ContactPair(string name, string surfaceInteractionName, string masterSurfaceName, RegionTypeEnum masterRegionType,
string slaveSurfaceName, RegionTypeEnum slaveRegionType)
: this(name, surfaceInteractionName, ContactPairMethod.SurfaceToSurface, false, false, double.NaN,
masterSurfaceName, masterRegionType, slaveSurfaceName, slaveRegionType)
{
}
public ContactPair(string name, string surfaceInteractionName, ContactPairMethod method, bool smallSliding, bool adjust,
double adjustmentSize, string masterSurfaceName, RegionTypeEnum masterRegionType,
string slaveSurfaceName, RegionTypeEnum slaveRegionType)
: base(name)
{
// Same name can be used for single surface contact
//if (masterRegionType == RegionTypeEnum.SurfaceName && slaveRegionType == RegionTypeEnum.SurfaceName &&
// slaveSurfaceName == masterSurfaceName) throw new CaeException("The master and slave surface names must be different.");
//
_surfaceInteractionName = surfaceInteractionName;
Method = method;
SmallSliding = smallSliding;
_adjust = adjust;
AdjustmentSize = adjustmentSize;
//
_masterRegionType = masterRegionType;
_masterSurfaceName = masterSurfaceName;
_slaveRegionType = slaveRegionType;
_slaveSurfaceName = slaveSurfaceName;
//
_slaveCreationIds = null;
_slaveCreationData = null;
_masterCreationIds = null;
_masterCreationData = null;
//
_masterColor = Color.Yellow;
_slaveColor = Color.Yellow;
}
// Methods
public void SwapMasterSlave()
{
if (_name.Contains(Globals.MasterSlaveSeparator))
{
string[] tmp = _name.Split(new string[] { Globals.MasterSlaveSeparator }, StringSplitOptions.None);
if (tmp.Length == 2) _name = tmp[1] + Globals.MasterSlaveSeparator + tmp[0];
}
//
RegionTypeEnum tmpRegionType = _masterRegionType;
_masterRegionType = _slaveRegionType;
_slaveRegionType = tmpRegionType;
//
string tmpSurfaceName = _masterSurfaceName;
_masterSurfaceName = _slaveSurfaceName;
_slaveSurfaceName = tmpSurfaceName;
//
int[] tmpCreationIds = _masterCreationIds;
_masterCreationIds = _slaveCreationIds;
_slaveCreationIds = tmpCreationIds;
//
Selection tmpCreationData = _masterCreationData;
_masterCreationData = _slaveCreationData;
_slaveCreationData = tmpCreationData;
}
}
}