ANSYS四点雨流计数法
! ==============================
! 四点雨流计数法 ANSYS命令流
! 1. 清除旧数据,初始化工作环境
/CLEAR,START
/FILNAME,RAINFLOW_4POINT ! 工作文件名
/TITLE,Four-Point Rainflow Counting Method ! 标题
! 2. 定义参数(根据载荷谱修改)
*DIM,LOAD,TABLE,1000,1,,TIME ! 定义载荷表:1000行(可改),载荷-时间
*DIM,COUNT_AMP,ARRAY,500,1 ! 存储循环幅值
*DIM,COUNT_MEAN,ARRAY,500,1 ! 存储循环均值
*DIM,COUNT_CYC,ARRAY,500,1 ! 存储循环周期
N_LOAD = 1000 ! 载荷数据总点数(必须与LOAD表行数一致)
N_COUNT = 0 ! 雨流计数结果总数(初始0)
! 3. 导入/定义载荷时间历程(替换为真实载荷数据)
! 示例:正弦载荷谱
*DO,I,1,N_LOAD
TIME = (I-1)*0.1 ! 时间步长0.1s
LOAD(I,1) = 100*SIN(TIME) + 50*COS(0.5*TIME) ! 载荷值
*ENDDO
! 4. 四点雨流计数法
! 四点定义:X1-X2-X3-X4 连续4个载荷点
*DIM,SEQ,ARRAY,2000,1 ! 峰值谷值序列存储数组
N_SEQ = 0 ! 峰值谷值序列长度
! 第一步:提取原始载荷的峰值/谷值(提取极值点)
N_SEQ = 1
SEQ(N_SEQ) = LOAD(1,1)
*DO,I,2,N_LOAD-1
! 判断当前点是否为峰值或谷值
IF (LOAD(I,1) > LOAD(I-1,1) AND LOAD(I,1) > LOAD(I+1,1)) THEN
N_SEQ = N_SEQ + 1
SEQ(N_SEQ) = LOAD(I,1)
ELSE IF (LOAD(I,1) < LOAD(I-1,1) AND LOAD(I,1) < LOAD(I+1,1)) THEN
N_SEQ = N_SEQ + 1
SEQ(N_SEQ) = LOAD(I,1)
ENDIF
*ENDDO
N_SEQ = N_SEQ + 1
SEQ(N_SEQ) = LOAD(N_LOAD,1) ! 加入最后一个点
! 第二步:四点雨流计数核心循环
*DIM,RESIDUE,ARRAY,2000,1 ! 剩余载荷序列
N_RES = 0 ! 剩余序列长度
*DO,I,1,N_SEQ
N_RES = N_RES + 1
RESIDUE(N_RES) = SEQ(I) ! 将极值点加入剩余序列
! 当剩余序列≥4个点时,执行四点判断
*WHILE,N_RES >= 4
! 提取最后4个点:Y1 Y2 Y3 Y4
Y1 = RESIDUE(N_RES-3)
Y2 = RESIDUE(N_RES-2)
Y3 = RESIDUE(N_RES-1)
Y4 = RESIDUE(N_RES)
! 四点雨流规则:
! 1. 计算X2-X3幅值、X1-X4幅值
A23 = ABS(Y2-Y3)
A14 = ABS(Y1-Y4)
! 2. 核心判定:X2-X3 ≤ X1-X4 → 提取一个完整循环
IF (A23 <= A14) THEN
N_COUNT = N_COUNT + 1
! 计算循环幅值、均值、周期
COUNT_AMP(N_COUNT) = A23/2 ! 循环幅值
COUNT_MEAN(N_COUNT) = (Y2+Y3)/2 ! 循环均值
COUNT_CYC(N_COUNT) = 1 ! 循环计数(1次)
! 移除Y2、Y3,更新剩余序列
RESIDUE(N_RES-2) = RESIDUE(N_RES)
N_RES = N_RES - 2
ELSE
EXIT ! 不满足条件,退出循环
ENDIF
*ENDDO
*ENDDO
! 5. 输出雨流计数结果
*CFOPEN,RAINFLOW_RESULT,TXT ! 打开结果文件
*VWRITE,N_COUNT
(' 雨流计数总循环数:',I6)
*VWRITE,COUNT_AMP(1),COUNT_MEAN(1),COUNT_CYC(1)
(' 循环幅值 循环均值 循环次数')
*DO,I,1,N_COUNT
*VWRITE,COUNT_AMP(I),COUNT_MEAN(I),COUNT_CYC(I)
(F10.2,F10.2,F6.0)
*ENDDO
*CFCLOSE
! 6. 结果可视化
/Graphics,Full
*DIM,PLOT_DATA,TABLE,N_COUNT,3,,CYCLE
*DO,I,1,N_COUNT
PLOT_DATA(I,1) = COUNT_AMP(I)
PLOT_DATA(I,2) = COUNT_MEAN(I)
PLOT_DATA(I,3) = COUNT_CYC(I)
*ENDDO
/VPLO,PLOT_DATA(1,1),PLOT_DATA(1,2) ! 幅值-均值散点图
/REPLOT
