Files
wg_cpso/CaeModel/FileInOut/Output/Abaqus/AbaqusFileWriter.cs
2026-03-25 18:20:24 +08:00

131 lines
5.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CaeModel;
using CaeMesh;
using System.IO;
using FileInOut.Output.Calculix;
using CaeGlobals;
using Microsoft.SqlServer.Server;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Xml.Linq;
using System.Diagnostics.Eventing.Reader;
using System.Security;
namespace FileInOut.Output
{
[Serializable]
public static class AbaqusFileWriter
{
// Methods
static public void Write(string fileName, FeModel model, ConvertPyramidsToEnum convertPyramidsTo,
Dictionary<int, double[]> deformations = null)
{
CalculixKeyword keywordToChange;
List<CalculixKeyword> keywords = CalculixFileWriter.GetAllKeywords(model, convertPyramidsTo, deformations);
for (int i = 0; i < keywords.Count; i++)
{
keywordToChange = keywords[i];
ConvertKeywordsToAbaqus(model, ref keywordToChange);
keywords[i] = keywordToChange;
}
// Write file
StringBuilder sb = new StringBuilder();
foreach (var keyword in keywords)
{
WriteKeywordRecursively(sb, keyword);
}
// Write to file in multiple steps
int step = 10_000_000;
int upper;
using (StreamWriter sw = new StreamWriter(fileName, false))
{
for (int i = 0; i < sb.Length; i+=step)
{
upper = Math.Min(sb.Length - i, step);
sw.Write(sb.ToString(i, upper));
}
}
}
static private void WriteKeywordRecursively(StringBuilder sb, CalculixKeyword keyword)
{
sb.Append(keyword.GetKeywordString());
sb.Append(keyword.GetDataString());
//
foreach (var childKeyword in keyword.Keywords)
{
WriteKeywordRecursively(sb, childKeyword);
}
}
static private void ConvertKeywordsToAbaqus(FeModel model, ref CalculixKeyword keyword)
{
CalculixKeyword additionalKeyword;
CalculixKeyword childKeyword;
//
HashSet<string> rpRotNames = new HashSet<string>();
foreach (var entry in model.Mesh.ReferencePoints) rpRotNames.Add(entry.Value.RotNodeSetName);
// Element
if (keyword is CalElement ce) keyword = new AbqElement(ce);
// Surface
else if (keyword is CalSurface cs) keyword = new AbqSurface(cs);
// Rigid body
else if (keyword is CalRigidBody crb) keyword = new AbqRigidBody(crb);
// Step
else if (keyword is CalStep cst) { cst.OutputSolver = false; cst.OutputNoAnalysis = false; }
// Output
else if (keyword is CalOutputFrequency) keyword = new CalTitle("", "");
// History output
else if (keyword is CalNodePrint cnp)
{
if (rpRotNames.Contains(cnp.RegionName)) keyword = new CalTitle("", "");
else cnp.OutputFrequency = true;
}
else if (keyword is CalElPrint cep) { cep.OutputFrequency = true; cep.OutputGlobal = false; }
else if (keyword is CalContactPrint ccp) keyword = new AbqContactPrint(ccp);
// Field output
else if (keyword is CalNodeFile cnf) keyword = new AbqFieldNodeOutput(cnf);
else if (keyword is CalElFile cef) keyword = new AbqFieldElementOutput(cef);
else if (keyword is CalContactFile ccf) keyword = new AbqFieldContactOutput(ccf);
// Boundary condition
else if (keyword is CalBC cbc)
{
if (cbc is CalDisplacementRotation cdr) cdr.MaxNumberNodeDOFs = 6;
else if (cbc is CalFixedBC cfb) cfb.MaxNumberNodeDOFs = 6;
cbc.OpType = OpTypeEnum.New;
}
// Load
else if (keyword is CalLoad cl)
{
if (cl is CalMomentLoad cml) cml.MaxNumberNodeDOFs = 6;
else if (cl is CalDLoad cdl) keyword = new AbqDLoad(cdl);
else if (cl is CalVariablePressureLoad cvpl) keyword = new AbqVariablePressureLoad(cvpl);
else if (cl is CalImportedPressureLoad cipl) keyword = new AbqImportedPressureLoad(cipl);
else if (cl is CalShellEdgeLoad csel) keyword = new AbqShellEdgeLoad(csel);
//
cl.OpType = OpTypeEnum.New;
}
// Additional
else if (keyword is CalAdditional ca)
{
for (int i = 0; i < ca.AdditionalKeywords.Count; i++)
{
additionalKeyword = ca.AdditionalKeywords[i];
ConvertKeywordsToAbaqus(model, ref additionalKeyword);
ca.AdditionalKeywords[i] = additionalKeyword;
}
}
// Child keywords
for (int i = 0; i < keyword.Keywords.Count; i++)
{
childKeyword = keyword.Keywords[i];
ConvertKeywordsToAbaqus(model, ref childKeyword);
keyword.Keywords[i] = childKeyword;
}
}
}
}