テスト済み有限要素コード

CalculiX

CalculiXは弾性シミュレーションをサポートしています。以下に入力ファイルの説明を示します。

** Mesh ++++++++++++++++++++++++++++++++++++++++++++++++++++

*INCLUDE, INPUT=Mesh/cofea-coarse-quad-hex.inp  # Path to mesh for ccx solver

** Material ++++++++++++++++++++++++++++++++++++++++++++++++

*MATERIAL, NAME=Steel                                    # Defining a material
    *DENSITY
        7800                                             # Defining a density
    *ELASTIC,
        2.1e11, 0.3                                      # Defining Young modulus and Poisson's ratio

** Sections ++++++++++++++++++++++++++++++++++++++++++++++++

*SOLID SECTION, ELSET=PART-1-1-EL-EALL, MATERIAL=Steel   # Assigning material and solid elements
                                                         # to the elements sets in mesh
** Steps +++++++++++++++++++++++++++++++++++++++++++++++++++

*STEP                                                    # Begin of analysis
    *STATIC, SOLVER=SPOOLES                              # Selection of elastic analysis

** Field outputs +++++++++++++++++++++++++++++++++++++++++++

    *EL FILE                                             # Commands responsible for saving results
        E, S
    *NODE FILE
        U
    *EL PRINT,ELSET=EL-EOUT
        S

** Boundary conditions +++++++++++++++++++++++++++++++++++++

    *BOUNDARY,                                           # Applying translation = 0 on desired nodes
        N-AB,1,1,0
    *BOUNDARY
        N-DC,2,2,0
    *BOUNDARY
        N-BC,1,1,0
	      N-BC,2,2,0
    *BOUNDARY
        N-MID,3,3,0

** Boundary conditions(adding pressure) ++++++++++++++++++++

    *DLOAD,
    *INCLUDE, INPUT=Pressure/cofea-coarse-quad-hex.dlo

** End step ++++++++++++++++++++++++++++++++++++++++++++++++

*End step                      # End on analysis

この解析で使用するシミュレーション入力ファイルは CoFEA GitHub にあります。

圧力境界条件の適用方法

次のコマンドを使用して、読み込みモードのCalculiX GraphiXでメッシュを開いてください:

cgx -c mesh_file.inp

次に、CGXウィンドウでマウスの右ボタンをクリックし、コマンドラインを切り替えを選択します。 コマンドラインで次のように入力してください:

comp NODESET do
send NODESET abq press value_of_press

同じディレクトリにNODESET.dloというファイルが表示されます。このファイルは、境界に圧力を適用するために*DLOADセクションに含める必要があります。圧力が正の値になると、要素面が圧縮されます。

Code_Aster

Code_Asterは弾性シミュレーションをサポートしています。以下に入力ファイルの説明を示します。

DEBUT(
      LANG='EN',
      PAR_LOT='NON',
      INFO=1,
     );

from pprint import pprint as pp

# Define material
STEEL   =DEFI_MATERIAU(
                       ELAS=_F(
                               E = 2.1e11,
                               NU = 0.3,
                              ),
                      );

mesh_nums ={
    20 : ["cfa-coarse-lin-hex"],
    21 : ["cfa-coarse-lin-tet"],
    22 : ["cfa-coarse-quad-hex"],
    23 : ["cfa-coarse-quad-tet"],
    24 : ["cfa-fine-lin-hex"],
    25 : ["cfa-fine-lin-tet"],
    26 : ["cfa-fine-quad-hex"],
    27 : ["cfa-fine-quad-tet"]
    }
mesh_list = [None] * len(mesh_nums.keys())

# Iterate for all meshes defined in astk with UNITE consistence with mesh_nums dictionary.
for ind, mesh_num in enumerate(mesh_nums.keys()):

    # Load mesh file
    mesh_list[ind] = LIRE_MAILLAGE(
                                   UNITE=mesh_num,
                                   FORMAT='IDEAS'
                                  );  			

    # Create groups of nodes according to all groups of elements
    # Additionally create group with one node for comparison the results
    mesh_list[ind] = DEFI_GROUP(
                                reuse = mesh_list[ind],
                                MAILLAGE = mesh_list[ind],
                                CREA_GROUP_NO=(
                                               _F(TOUT_GROUP_MA = 'OUI',),
                                               _F(
                                                  NOM = 'D',
                                                  OPTION = 'ENV_SPHERE',
                                                  POINT = (2.0, 0.0, 0.6),
                                                  RAYON = 0.02,
                                                  PRECISION = 0.02
                                                 ),
                                              ),		
                               );

    # Change orientation of solids "peel"
    mesh_list[ind] = MODI_MAILLAGE(
                                   reuse = mesh_list[ind],
                                   MAILLAGE = mesh_list[ind],
                                   ORIE_PEAU_3D = _F(GROUP_MA = 'E_2_DIST'),
                                  );

    # Define analysis type
    Model = AFFE_MODELE(
                        MAILLAGE = mesh_list[ind],
                        AFFE = _F(
                                  TOUT = 'OUI',
                                  PHENOMENE = 'MECANIQUE',
                                  MODELISATION = '3D',		
                                 ),
                       );


    # Assign material to mesh and model
    Mater = AFFE_MATERIAU(
                          MAILLAGE = mesh_list[ind],
                          AFFE = _F(
                                    TOUT = 'OUI',
                                    MATER = STEEL,
                                   ),
                         );

    # Get list with names of nodes groups (node-sets)
    no_groups_names = mesh_list[ind].getGroupsOfNodes()

    # Find '_DC' name (C_A do not accept comprehension lists)
    for uy in no_groups_names:
        if uy.endswith('_DC'):            
            Uy_group_name = uy
            print(f"Uy_group_name: {Uy_group_name}")

    # Find '_MID' name (C_A do not accept comprehension lists)
    for uz in no_groups_names:
        if uz.endswith('_MID'):            
            Uz_group_name = uz
            print(f"Uz_group_name: {Uz_group_name}")

    # Define boundaries
    Bound = AFFE_CHAR_MECA(
                           MODELE = Model,
                           DDL_IMPO = (
                                       _F(GROUP_NO = Uz_group_name, DZ = 0.0,),
                                       _F(GROUP_NO = 'N_2_AB', DX = 0.0,),
                                       _F(GROUP_NO = Uy_group_name, DY = 0.0,),					  
                                       _F(GROUP_NO = 'N_3_BC', DX = 0.0, DY = 0.0,),
                                      ),
                            PRES_REP = _F(GROUP_MA = 'E_2_DIST', PRES = 1.0e6),
                          );

    # Solve
    Results = MECA_STATIQUE(      
                            MODELE = Model,
                            CHAM_MATER = Mater,
                            EXCIT = _F(CHARGE = Bound,),
                           );

    # Calculate the field of stresses extrapolated from Gauss point to nodes in Cartesian CS
    Results	= CALC_CHAMP(
                         reuse = Results,
                         RESULTAT = Results,
                         TOUT = 'OUI',
                         CONTRAINTE = 'SIGM_NOEU',
                        );

    # Extract value of normal stress in Y direction extrapolated to node D
    ResD = POST_RELEVE_T(
                         ACTION=(
                                 _F(
                                    INTITULE = 'Stress SIYY in point D',
                                    OPERATION = 'EXTRACTION',
                                    RESULTAT = Results,
                                    NOM_CHAM = 'SIGM_NOEU',
                                    NOM_CMP = ('SIYY'),
                                    GROUP_NO = 'D',
                                   ),
                                ),
                        );

    # Extract table to python object and save the value to dictionary
    resi=ResD.EXTR_TABLE()
    mesh_nums[mesh_num].append("{:e}".format(resi.SIYY.values()[0]))

    # Additionally prepare mesh output enriched with fields of displacement, stresses in gauss points, and  stresses extrapolated to nodes
    IMPR_RESU(
              FORMAT = 'MED',
              UNITE = 80,
              RESU = _F(
                        MAILLAGE = mesh_list[ind],
                        RESULTAT = Results,		  
                        NOM_CHAM = ('DEPL', 'SIEF_ELGA','SIGM_NOEU'),                   
                       ),
             );

# Pretty print the dictionary with stresses
print("Results:")
pp(mesh_nums)
FIN();

この解析で使用するシミュレーション入力ファイルは GitHub にあります。

Elmer

Elmerは、弾性シミュレーションをサポートします。以下はソルバー入力ファイルの説明です。

Header
  CHECK KEYWORDS Warn
  Mesh DB "." "Mesh/cfa-fine-lin-hex"               # Path to the mesh
  Include Path ""
  Results Directory "Results/cfa-fine-lin-hex"      # Path to results directory
End

Simulation                                          # Settings and constants for simulation
  Max Output Level = 5
  Coordinate System = Cartesian
  Coordinate Mapping(3) = 1 2 3
  Simulation Type = Steady state
  Steady State Max Iterations = 1
  Output Intervals = 1
  Timestepping Method = BDF
  BDF Order = 1
  Solver Input File = case.sif
  Post File = case.vtu
End

Constants
  Gravity(4) = 0 -1 0 9.82
  Stefan Boltzmann = 5.67e-08
  Permittivity of Vacuum = 8.8542e-12
  Boltzmann Constant = 1.3807e-23
  Unit Charge = 1.602e-19
End

Body 1                                              # Assigning the material and equations to the mesh
  Target Bodies(1) = 1
  Name = "Body Property 1"
  Equation = 1
  Material = 1
End

Solver 1                                            # Solver settings
  Equation = Linear elasticity
  Calculate Loads = True
  Calculate Stresses = True
  Procedure = "StressSolve" "StressSolver"
  Variable = -dofs 3 Displacement
  Exec Solver = Always
  Stabilize = True
  Bubbles = False
  Lumped Mass Matrix = False
  Optimize Bandwidth = True
  Steady State Convergence Tolerance = 1.0e-5
  Nonlinear System Convergence Tolerance = 1.0e-7
  Nonlinear System Max Iterations = 20
  Nonlinear System Newton After Iterations = 3
  Nonlinear System Newton After Tolerance = 1.0e-3
  Nonlinear System Relaxation Factor = 1
  Linear System Solver = Iterative
  Linear System Iterative Method = BiCGStab
  Linear System Max Iterations = 500
  Linear System Convergence Tolerance = 1.0e-10
  BiCGstabl polynomial degree = 2
  Linear System Preconditioning = ILU0
  Linear System ILUT Tolerance = 1.0e-3
  Linear System Abort Not Converged = False
  Linear System Residual Output = 10
  Linear System Precondition Recompute = 1
End

Equation 1                                          # Setting the active solvers
  Name = "Equation 1"
  Plane Stress = True
  Plane Stress = True
  Calculate Stresses = True
  Active Solvers(1) = 1
End

Material 1                                          # Defining the material
  Name = "Steel (carbon - generic)"
  Heat Capacity = 1265.0
  Poisson ratio = 0.3
  Electric Conductivity = 1.449e6
  Electric Conductivity = 1.449e6
  Porosity Model = Always saturated
  Youngs modulus = 2.1e11
  Density = 7800.0
  Mesh Poisson ratio = 0.3
  Youngs modulus = 2.1e11
  Heat expansion Coefficient = 13.8e-6
  Heat Conductivity = 44.8
  Poisson ratio = 0.3
  Electric Conductivity = 1.449e6
  Youngs modulus = 2.1e11
  Sound speed = 5100.0
  Electric Conductivity = 1.449e6
  Electric Conductivity = 1.449e6
  Poisson ratio = 0.3
End

Boundary Condition 1                                # Applying the boundary conditions
  Target Boundaries(1) = 13
  Name = "AB"
  Displacement 1 = 0
End

Boundary Condition 2
  Target Boundaries(1) = 15
  Name = "CD"
  Displacement 2 = 0
End

Boundary Condition 3
  Target Boundaries(1) = 16
  Name = "BC"
  Displacement 1 = 0
  Displacement 2 = 0
End

Boundary Condition 4
  Target Boundaries(1) = 19
  Name = "EE"
  Displacement 3 = 0
End

Boundary Condition 5
  Target Boundaries(1) = 14
  Name = "LOAD"
  Normal Force = -1e6
End

この解析で使用するシミュレーション入力ファイルは GitHub にあります。