活动介绍
file-type

ZigBee PRO配置编辑器向导指南

PDF文件

下载需积分: 49 | 6.92MB | 更新于2024-08-06 | 16 浏览量 | 80 下载量 举报 收藏
download 立即下载
"ZPS配置编辑器向导-cfa level 1 notes 电子版" 本文主要介绍了如何使用ZPS配置编辑器向导来创建ZigBee PRO堆栈配置,这是针对NXP(恩智浦)半导体产品的一个关键工具,特别是在ZigBee 3.0 SDK中。ZPS配置编辑器插件是必要的,它需要安装在BeyondStudio或LPCXpresso开发环境中。通过检查"文件>新建>其他"菜单中是否存在Jennic公司的选项,可以验证该插件是否已安装。 在正确安装插件后,用户可以通过"Jennic公司"选项下的"ZBPro配置"向导来创建新的ZigBee PRO配置。如果向导未找到,需参考ZigBee 3.0 SDK提供的安装指南,如JN-UG-3098(针对JN516x)和JN-UG-3109(针对JN517x LPCXpresso)来安装插件。 ZigBee 3.0是ZigBee技术的一个重要版本,它提供了一套完整的栈用户指南,涵盖从概念到操作的详细信息。文档包括了ZigBee网络节点、网络拓扑、应用理想、无线射频操作、电池供电组件、易用性、可靠性、安全性、共存与互操作性,以及设备类型和集群的详细解释。此外,还涉及到ZigBee PRO协议架构和操作,包括网络创建、应用层的概念、网络路由和通信等关键概念。 ZigBee PRO协议栈软件包括API,如ZigBeePRO API和JCU API,这些接口为开发者提供了控制和管理ZigBee网络的能力。应用程序开发概述部分则提到了开发环境和资源,帮助开发者了解如何开始构建基于ZigBee 3.0的应用程序。 这个资源对于理解并使用ZPS配置编辑器创建ZigBee PRO配置,以及进行基于NXP产品的ZigBee 3.0应用开发是非常有帮助的。开发者需要熟悉ZigBee 3.0的相关概念和技术细节,以及如何在特定开发环境中集成和使用ZPS配置编辑器插件。

相关推荐

filetype

PROGRAM PLATE IMPLICIT NONE ! 定义问题参数 (根据问题描述) INTEGER :: NJ, NE, NZ, NPJ, NPS INTEGER :: IPS = 1 ! 平面应力问题 REAL :: E = 2.0e11, PR = 0.3, T = 0.1, V = 0.0 ! 材料属性 REAL :: SIGMA_XX = 20000.0 ! 施加的拉应力 (2000N/m / 0.1m = 20000Pa) ! 几何参数 REAL, PARAMETER :: LENGTH = 5.0, WIDTH = 1.0, HOLE_RADIUS = 0.3 REAL, PARAMETER :: HOLE_CENTER_X = 2.5, HOLE_CENTER_Y = 0.5 ! 定义数组 INTEGER, ALLOCATABLE :: LND(:,:) ! 单元连接 INTEGER, ALLOCATABLE :: JZ(:,:) ! 约束信息 REAL, ALLOCATABLE :: X(:), Y(:) ! 节点坐标 REAL, ALLOCATABLE :: AK(:,:), P(:), U(:) ! 总刚矩阵和向量 REAL, DIMENSION(3,3) :: D ! 弹性矩阵 ! 工作数组 REAL, ALLOCATABLE :: DXY(:,:) ! 约束位移值 REAL, ALLOCATABLE :: PJ(:,:) ! 集中力值 INTEGER, ALLOCATABLE :: NPP(:) ! 集中力节点号 REAL, ALLOCATABLE :: ZPS(:,:) ! 面力值 INTEGER, ALLOCATABLE :: MPS(:,:) ! 面力边界信息 ! 公共块定义 (与子程序兼容) COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V ! 生成网格 (带孔) PRINT *, "Generating mesh with hole..." CALL GENERATE_MESH_WITH_HOLE(X, Y, LND, NJ, NE, LENGTH, WIDTH, & HOLE_RADIUS, HOLE_CENTER_X, HOLE_CENTER_Y) ! 设置边界条件 PRINT *, "Setting boundary conditions..." NZ = COUNT(X < 0.01) ! 左边界节点数 ALLOCATE(JZ(NZ,3), DXY(NZ,2)) CALL SET_BOUNDARY_CONDITIONS(JZ, DXY, NZ, X, Y, NJ) ! 设置面力 (右边界) PRINT *, "Setting surface forces..." NPS = COUNT(ABS(X - LENGTH) < 0.01) - 1 ! 右边界边数 ALLOCATE(MPS(NPS,2), ZPS(NPS,2)) CALL SET_SURFACE_FORCES(MPS, ZPS, NPS, SIGMA_XX, X, Y, NJ, LENGTH) ! 初始化其他数组 NPJ = 0 ALLOCATE(PJ(1,2), NPP(1)) ALLOCATE(AK(2*NJ,2*NJ), P(2*NJ), U(2*NJ)) AK = 0.0; P = 0.0; U = 0.0 ! 打印问题信息 PRINT *, "==============================================" PRINT *, "Finite Element Analysis of Perforated Plate" PRINT *, "==============================================" PRINT *, "Geometry: ", LENGTH, "m x ", WIDTH, "m with hole R=", HOLE_RADIUS, "m" PRINT *, "Material Properties:" PRINT *, " Young's Modulus (E) =", E PRINT *, " Poisson's Ratio (PR) =", PR PRINT *, " Thickness (T) =", T PRINT *, "Boundary Conditions:" PRINT *, " Fixed left edge, Tension on right edge =", SIGMA_XX, "Pa" PRINT *, "Mesh Information:" PRINT *, " Nodes =", NJ, "Elements =", NE PRINT *, " Constraints =", NZ, "Surface Forces =", NPS PRINT *, "----------------------------------------------" ! 计算弹性矩阵 PRINT *, "Computing elasticity matrix..." CALL MD(D) ! 组装总刚度矩阵 PRINT *, "Assembling global stiffness matrix..." CALL AKFORM(LND, X, Y, D, AK) ! 形成载荷向量 PRINT *, "Forming load vector..." CALL PFORM(LND, X, Y, NPP, PJ, NPS, MPS, ZPS, P) ! 处理约束条件 PRINT *, "Applying boundary constraints..." CALL RKR(NJ, NZ, JZ, AK, P, DXY) ! 求解方程组 PRINT *, "Solving linear system (size:", 2*NJ, ")..." CALL AGAUS(AK, P, 2*NJ, U) ! 计算并输出应力 PRINT *, "Computing element stresses..." CALL MADE(LND, D, X, Y, U) PRINT *, "----------------------------------------------" PRINT *, "Analysis complete! Results saved to result.txt" PRINT *, "Node displacements and element stresses saved" ! 释放内存 DEALLOCATE(X, Y, LND, JZ, DXY, MPS, ZPS, PJ, NPP, AK, P, U) CONTAINS ! 生成带孔矩形板的网格 SUBROUTINE GENERATE_MESH_WITH_HOLE(X, Y, LND, NJ, NE, L, W, R, CX, CY) REAL, ALLOCATABLE, INTENT(OUT) :: X(:), Y(:) INTEGER, ALLOCATABLE, INTENT(OUT) :: LND(:,:) INTEGER, INTENT(OUT) :: NJ, NE REAL, INTENT(IN) :: L, W, R, CX, CY ! 网格参数 INTEGER, PARAMETER :: NX = 50, NY = 20 ! 网格密度 REAL :: DX, DY INTEGER :: I, J, K, NODE_ID, ELEM_ID REAL :: DIST, XPOS, YPOS LOGICAL :: IN_HOLE ! 计算节点总数 (排除孔内节点) NJ = 0 DX = L / REAL(NX-1) DY = W / REAL(NY-1) ! 第一次遍历: 计算节点数 DO J = 1, NY DO I = 1, NX XPOS = REAL(I-1)*DX YPOS = REAL(J-1)*DY ! 检查是否在孔内 DIST = SQRT((XPOS - CX)**2 + (YPOS - CY)**2) IN_HOLE = (DIST <= R) IF (.NOT. IN_HOLE) NJ = NJ + 1 END DO END DO ! 分配节点数组 ALLOCATE(X(NJ), Y(NJ)) ! 第二次遍历: 存储节点坐标 NODE_ID = 0 DO J = 1, NY DO I = 1, NX XPOS = REAL(I-1)*DX YPOS = REAL(J-1)*DY ! 检查是否在孔内 DIST = SQRT((XPOS - CX)**2 + (YPOS - CY)**2) IN_HOLE = (DIST <= R) IF (.NOT. IN_HOLE) THEN NODE_ID = NODE_ID + 1 X(NODE_ID) = XPOS Y(NODE_ID) = YPOS END IF END DO END DO ! 计算单元数 (四边形分成两个三角形) NE = 2 * (NX-1) * (NY-1) ALLOCATE(LND(NE,3)) ! 生成单元连接 (简化版本 - 实际应跳过孔边界单元) ELEM_ID = 0 DO J = 1, NY-1 DO I = 1, NX-1 ! 每个四边形分成两个三角形 ELEM_ID = ELEM_ID + 1 LND(ELEM_ID,1) = (J-1)*NX + I LND(ELEM_ID,2) = (J-1)*NX + I+1 LND(ELEM_ID,3) = J*NX + I ELEM_ID = ELEM_ID + 1 LND(ELEM_ID,1) = (J-1)*NX + I+1 LND(ELEM_ID,2) = J*NX + I+1 LND(ELEM_ID,3) = J*NX + I END DO END DO PRINT *, " Generated mesh with", NJ, "nodes and", NE, "elements" END SUBROUTINE GENERATE_MESH_WITH_HOLE ! 设置边界条件 SUBROUTINE SET_BOUNDARY_CONDITIONS(JZ, DXY, NZ, X, Y, NJ) INTEGER, INTENT(OUT) :: JZ(:,:) REAL, INTENT(OUT) :: DXY(:,:) INTEGER, INTENT(IN) :: NZ REAL, INTENT(IN) :: X(:), Y(:) INTEGER, INTENT(IN) :: NJ INTEGER :: I, COUNT_CONSTRAINT = 0 REAL :: TOL = 1E-3 PRINT *, " Setting", NZ, "boundary constraints" ! 左边界固定 (X=0) DO I = 1, NJ IF (X(I) < TOL) THEN COUNT_CONSTRAINT = COUNT_CONSTRAINT + 1 IF (COUNT_CONSTRAINT > NZ) EXIT JZ(COUNT_CONSTRAINT, 1) = I JZ(COUNT_CONSTRAINT, 2) = 1 ! X方向固定 JZ(COUNT_CONSTRAINT, 3) = 1 ! Y方向固定 DXY(COUNT_CONSTRAINT, 1) = 0.0 DXY(COUNT_CONSTRAINT, 2) = 0.0 END IF END DO END SUBROUTINE SET_BOUNDARY_CONDITIONS ! 设置面力 (右边界) SUBROUTINE SET_SURFACE_FORCES(MPS, ZPS, NPS, SIGMA, X, Y, NJ, LENGTH) INTEGER, INTENT(OUT) :: MPS(:,:) REAL, INTENT(OUT) :: ZPS(:,:) INTEGER, INTENT(IN) :: NPS, NJ REAL, INTENT(IN) :: SIGMA, X(:), Y(:), LENGTH INTEGER :: I, J, COUNT_FORCE = 0 REAL :: TOL = 1E-3 INTEGER, ALLOCATABLE :: RIGHT_NODES(:) INTEGER :: NUM_RIGHT_NODES = 0 ! 先找到右边界节点 ALLOCATE(RIGHT_NODES(NJ)) DO I = 1, NJ IF (ABS(X(I) - LENGTH) < TOL) THEN NUM_RIGHT_NODES = NUM_RIGHT_NODES + 1 RIGHT_NODES(NUM_RIGHT_NODES) = I END IF END DO ! 按Y坐标排序 DO I = 1, NUM_RIGHT_NODES-1 DO J = I+1, NUM_RIGHT_NODES IF (Y(RIGHT_NODES(I)) > Y(RIGHT_NODES(J))) THEN CALL SWAP_INT(RIGHT_NODES(I), RIGHT_NODES(J)) END IF END DO END DO ! 创建边界边 PRINT *, " Applying surface tension to", NPS, "edges" DO I = 1, NUM_RIGHT_NODES-1 COUNT_FORCE = COUNT_FORCE + 1 IF (COUNT_FORCE > NPS) EXIT MPS(COUNT_FORCE, 1) = RIGHT_NODES(I) MPS(COUNT_FORCE, 2) = RIGHT_NODES(I+1) ZPS(COUNT_FORCE, 1) = SIGMA ! X方向应力 ZPS(COUNT_FORCE, 2) = 0.0 ! Y方向应力 END DO DEALLOCATE(RIGHT_NODES) END SUBROUTINE SET_SURFACE_FORCES SUBROUTINE SWAP_INT(A, B) INTEGER, INTENT(INOUT) :: A, B INTEGER :: TMP TMP = A A = B B = TMP END SUBROUTINE SWAP_INT ! 包含所有必要的有限元分析子程序 SUBROUTINE AKFORM(LND,X,Y,D,AK) IMPLICIT NONE INTEGER, INTENT(IN) :: LND(:,:) REAL, INTENT(IN) :: X(:), Y(:), D(3,3) REAL, INTENT(INOUT) :: AK(:,:) REAL :: AKE(6,6) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, II, J, JJ, IH, IDH, JL, JDL, NODE_I, NODE_J COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V AK = 0.0 PRINT *, " Assembling global stiffness from", NE, "elements" DO IE = 1, NE IF (IE > SIZE(LND,1)) CYCLE CALL MKE(IE,LND,X,Y,D,AKE) DO I = 1, 3 NODE_I = LND(IE,I) IF (NODE_I < 1 .OR. NODE_I > NJ) CYCLE DO II = 1, 2 IH = 2*(I-1)+II IDH = 2*(NODE_I-1)+II IF (IDH < 1 .OR. IDH > SIZE(AK,1)) CYCLE DO J = 1, 3 NODE_J = LND(IE,J) IF (NODE_J < 1 .OR. NODE_J > NJ) CYCLE DO JJ = 1, 2 JL = 2*(J-1)+JJ JDL = 2*(NODE_J-1)+JJ IF (JDL < 1 .OR. JDL > SIZE(AK,2)) CYCLE AK(IDH,JDL) = AK(IDH,JDL) + AKE(IH,JL) END DO END DO END DO END DO END DO ! 保存总刚矩阵 OPEN(10, FILE='AK.TXT') DO II = 1, MIN(2*NJ, SIZE(AK,1)) WRITE(10,100) (AK(II,JJ), JJ = 1, MIN(2*NJ, SIZE(AK,2))) END DO 100 FORMAT(1X, 10000E12.4) CLOSE(10) PRINT *, " Global stiffness matrix assembled and saved" END SUBROUTINE AKFORM SUBROUTINE MKE(IE,LND,X,Y,D,AKE) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(:,:) REAL, INTENT(IN) :: X(:), Y(:), D(3,3) REAL, INTENT(OUT) :: AKE(6,6) REAL :: B(3,6), S(3,6), BT(6,3), AE INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: J, K COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) ! 计算 B转置 DO J = 1, 6 DO K = 1, 3 BT(J,K) = B(K,J) END DO END DO ! 计算单元刚度矩阵: AKE = BT * D * B * area * thickness CALL MTXMULT(BT,6,3, S,3,6,AKE) AKE = AKE * AE * T END SUBROUTINE MKE SUBROUTINE MA(IE,LND,X,Y,AE) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(:,:) REAL, INTENT(IN) :: X(:), Y(:) REAL, INTENT(OUT) :: AE INTEGER :: I, J, K REAL :: XIJ, YIJ, XIK, YIK I = LND(IE,1) J = LND(IE,2) K = LND(IE,3) XIJ = X(J)-X(I) YIJ = Y(J)-Y(I) XIK = X(K)-X(I) YIK = Y(K)-Y(I) AE = 0.5*(XIJ*YIK - XIK*YIJ) END SUBROUTINE MA SUBROUTINE MB(IE,LND,X,Y,AE,B) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(:,:) REAL, INTENT(IN) :: X(:), Y(:), AE REAL, INTENT(OUT) :: B(3,6) INTEGER :: I, J, M I = LND(IE,1) J = LND(IE,2) M = LND(IE,3) B = 0.0 B(1,1) = Y(J)-Y(M) B(1,3) = Y(M)-Y(I) B(1,5) = Y(I)-Y(J) B(2,2) = X(M)-X(J) B(2,4) = X(I)-X(M) B(2,6) = X(J)-X(I) B(3,1) = B(2,2) B(3,2) = B(1,1) B(3,3) = B(2,4) B(3,4) = B(1,3) B(3,5) = B(2,6) B(3,6) = B(1,5) B = B * 0.5 / AE END SUBROUTINE MB SUBROUTINE MD(D) IMPLICIT NONE REAL, INTENT(OUT) :: D(3,3) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V REAL :: D0 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V D = 0.0 IF (IPS .EQ. 1) THEN ! 平面应力 D0 = E / (1.0 - PR*PR) D(1,1) = D0 D(1,2) = D0 * PR D(2,1) = D(1,2) D(2,2) = D0 D(3,3) = D0 * (1.0 - PR)/2.0 ELSE ! 平面应变 D0 = E*(1-PR)/((1+PR)*(1-2*PR)) D(1,1) = D0 D(1,2) = D0*PR/(1-PR) D(2,1) = D(1,2) D(2,2) = D0 D(3,3) = D0*(1-2*PR)/(2*(1-PR)) END IF END SUBROUTINE MD SUBROUTINE MS(D, B, S) IMPLICIT NONE REAL, INTENT(IN) :: D(3,3), B(3,6) REAL, INTENT(OUT) :: S(3,6) CALL MTXMULT(D,3,3, B,3,6,S) END SUBROUTINE MS SUBROUTINE MTXMULT(A,M1,N1, B,M2,N2,C) IMPLICIT NONE INTEGER, INTENT(IN) :: M1, N1, M2, N2 REAL, INTENT(IN) :: A(M1,N1), B(M2,N2) REAL, INTENT(OUT) :: C(M1,N2) INTEGER :: I, J, K IF(N1.NE.M2) THEN WRITE(*,*) 'Matrix dimension mismatch in MTXMULT' WRITE(*,*) 'A:', M1, 'x', N1, 'B:', M2, 'x', N2 STOP END IF C = 0.0 DO I = 1, M1 DO J = 1, N2 DO K = 1, N1 C(I,J) = C(I,J) + A(I,K)*B(K,J) END DO END DO END DO END SUBROUTINE MTXMULT SUBROUTINE PFORM(LND,X,Y, NPP, PJ, NPS,MPS,ZPS,P) IMPLICIT NONE INTEGER, INTENT(IN) :: LND(:,:), NPP(:), MPS(:,:), NPS REAL, INTENT(IN) :: X(:), Y(:), PJ(:,:), ZPS(:,:) REAL, INTENT(INOUT) :: P(:) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: II ! 声明循环变量 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V P = 0.0 PRINT *, " Forming load vector with:" PRINT *, " Gravity load =", V PRINT *, " Surface forces =", NPS PRINT *, " Concentrated loads =", NPJ ! 重力载荷 IF (V .NE. 0.0) THEN CALL PVF(LND,X,Y,P) END IF ! 表面载荷 IF (NPS .NE. 0) THEN CALL PSF(NPS,MPS,ZPS,X,Y,P) END IF ! 集中载荷 IF (NPJ .NE. 0) THEN CALL PCF(NPJ,NPP, PJ,P) END IF ! 保存载荷向量 OPEN(20, FILE='P.TXT') DO II = 1, NJ WRITE(20,100) 'PX(',II,')=',P(2*II-1),'PY(',II,')=',P(2*II) END DO 100 FORMAT(1X, 2(A,I3,A,E12.4,3X)) CLOSE(20) END SUBROUTINE PFORM SUBROUTINE PVF(LND,X,Y,P) ! 重力 IMPLICIT NONE INTEGER, INTENT(IN) :: LND(:,:) REAL, INTENT(IN) :: X(:), Y(:) REAL, INTENT(INOUT) :: P(:) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, II REAL :: AE, PE COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V DO IE = 1, NE IF (IE > SIZE(LND,1)) CYCLE CALL MA(IE, LND,X,Y,AE) PE = -V * AE * T / 3.0 ! 分配到每个节点 DO I = 1, 3 II = LND(IE,I) IF (II < 1 .OR. II > NJ) CYCLE P(2*II) = P(2*II) + PE ! Y方向 END DO END DO END SUBROUTINE PVF SUBROUTINE PCF(NPJ,NPP, PJ,P) ! 集中力 IMPLICIT NONE INTEGER, INTENT(IN) :: NPJ, NPP(:) REAL, INTENT(IN) :: PJ(:,:) REAL, INTENT(INOUT) :: P(:) INTEGER :: I, II DO I = 1, NPJ II = NPP(I) IF (II < 1 .OR. II > SIZE(P)/2) CYCLE P(2*II-1) = P(2*II-1) + PJ(I,1) ! X方向 P(2*II) = P(2*II) + PJ(I,2) ! Y方向 END DO END SUBROUTINE PCF SUBROUTINE PSF(NPS,MPS,ZPS,X,Y,P) ! 分布面力 IMPLICIT NONE INTEGER, INTENT(IN) :: NPS, MPS(:,:) REAL, INTENT(IN) :: ZPS(:,:), X(:), Y(:) REAL, INTENT(INOUT) :: P(:) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: I, N1, N2 REAL :: DX, DY, DZP, PX1, PY1, PX2, PY2 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V DO I = 1, NPS IF (I > SIZE(MPS,1)) EXIT N1 = MPS(I,1) N2 = MPS(I,2) IF (N1 < 1 .OR. N1 > NJ .OR. N2 < 1 .OR. N2 > NJ) CYCLE DX = Y(N2) - Y(N1) DY = X(N1) - X(N2) DZP = ZPS(I,1) - ZPS(I,2) PX1 = (ZPS(I,2)/2.0 + DZP/3.0) * DX * T PY1 = (ZPS(I,2)/2.0 + DZP/3.0) * DY * T PX2 = (ZPS(I,2)/2.0 + DZP/6.0) * DX * T PY2 = (ZPS(I,2)/2.0 + DZP/6.0) * DY * T P(2*N1-1) = P(2*N1-1) + PX1 P(2*N1) = P(2*N1) + PY1 P(2*N2-1) = P(2*N2-1) + PX2 P(2*N2) = P(2*N2) + PY2 END DO END SUBROUTINE PSF SUBROUTINE RKR(NJ,NZ,JZ,AK,P, DXY) ! 约束处理 IMPLICIT NONE INTEGER, INTENT(IN) :: NJ, NZ, JZ(:,:) REAL, INTENT(IN) :: DXY(:,:) REAL, INTENT(INOUT) :: AK(:,:), P(:) INTEGER :: I, IR, J, II REAL :: LARGE_NUMBER = 1.0E20 PRINT *, " Applying", NZ, "constraints with penalty method" DO I = 1, NZ IF (I > SIZE(JZ,1)) EXIT IR = JZ(I,1) DO J = 2, 3 IF(JZ(I,J) .NE. 0) THEN II = 2*(IR-1) + J-1 IF (II < 1 .OR. II > SIZE(AK,1)) CYCLE AK(II,II) = AK(II,II) * LARGE_NUMBER P(II) = AK(II,II) * DXY(I,J-1) END IF END DO END DO END SUBROUTINE RKR SUBROUTINE AGAUS(A,B,N,X) ! 高斯消去法 IMPLICIT NONE INTEGER, INTENT(IN) :: N REAL, INTENT(INOUT) :: A(:,:), B(:) REAL, INTENT(OUT) :: X(:) REAL, ALLOCATABLE :: AM(:,:) REAL :: T INTEGER :: K, I, J ALLOCATE(AM(N,N)) AM = A ! 保存原始矩阵 PRINT *, " Solving system with Gaussian elimination" ! 向前消元 DO K = 1, N-1 IF (ABS(A(K,K)) < 1e-10) THEN PRINT *, "Zero pivot at ", K STOP END IF DO I = K+1, N A(I,K) = A(I,K)/A(K,K) DO J = K+1, N A(I,J) = A(I,J) - A(I,K)*A(K,J) END DO B(I) = B(I) - A(I,K)*B(K) END DO END DO ! 回代 X(N) = B(N)/A(N,N) DO I = N-1, 1, -1 T = 0.0 DO J = I+1, N T = T + A(I,J)*X(J) END DO X(I) = (B(I) - T)/A(I,I) END DO A = AM ! 恢复原始矩阵 DEALLOCATE(AM) END SUBROUTINE AGAUS SUBROUTINE MADE(LND,D,X,Y,U) ! 应力计算 IMPLICIT NONE INTEGER, INTENT(IN) :: LND(:,:) REAL, INTENT(IN) :: D(3,3), X(:), Y(:), U(:) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, J, IH, IW REAL :: AE, ST(3), UE(6), STX, STY, TXY, AST, RST, STMA, STMI REAL :: B(3,6), S(3,6) COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V OPEN(8, FILE='result.txt') WRITE(8,*) 'NODE DISPLACEMENTS AND ELEMENT STRESSES' WRITE(8,10) 10 FORMAT(1X, 'ELEMENT', 6X, 'STX', 14X, 'STY', 14X, 'TXY', 14X, 'ST_MAX', 11X, 'ST_MIN') DO IE = 1, NE IF (IE > SIZE(LND,1)) CYCLE CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) ! 提取单元位移 UE = 0.0 DO I = 1, 3 DO J = 1, 2 IH = 2*(I-1)+J IW = 2*(LND(IE,I)-1)+J IF (IW < 1 .OR. IW > SIZE(U)) CYCLE UE(IH) = U(IW) END DO END DO ! 计算应力 ST = 0.0 DO I = 1, 3 DO J = 1, 6 ST(I) = ST(I) + S(I,J)*UE(J) END DO END DO ! 计算主应力 STX = ST(1) STY = ST(2) TXY = ST(3) AST = (STX+STY)*0.5 RST = SQRT(0.25*(STX-STY)**2 + TXY*TXY) STMA = AST + RST STMI = AST - RST WRITE(8,60) IE, STX, STY, TXY, STMA, STMI END DO 60 FORMAT(1X,I5,5E16.6) WRITE(8,70) 70 FORMAT(/,1X,'NODE DISPLACEMENTS',/,' NODE',10X,'UX',14X,'UY') DO I = 1, NJ WRITE(8,80) I, U(2*I-1), U(2*I) END DO 80 FORMAT(1X,I5,2E16.6) CLOSE(8) PRINT *, " Results saved to result.txt" END SUBROUTINE MADE END PROGRAM PLATE 检查有无bug

filetype

PROGRAM PLATE IMPLICIT NONE ! 定义问题参数 (移除PARAMETER属性) INTEGER :: NJ = 1000, NE = 1800, NZ = 100, NPJ = 0, NPS = 40 INTEGER :: IPS = 1 ! 平面应力问题 REAL :: E = 1000.0, PR = 0.0, T = 1.0, V = 0.0 ! 材料属性 REAL :: SIGMA_XX = 100.0 ! 施加的拉应力 ! 定义数组 (增大尺寸以适应实际需求) INTEGER, DIMENSION(500,3) :: LND ! 单元连接 INTEGER, DIMENSION(50,3) :: JZ ! 约束信息 REAL, DIMENSION(200) :: X, Y ! 节点坐标 REAL, DIMENSION(3,3) :: D ! 弹性矩阵 REAL, DIMENSION(2000,2000) :: AK ! 总刚度矩阵 (2*NJ x 2*NJ) REAL, DIMENSION(2000) :: P, U ! 载荷向量和位移向量 ! 工作数组 REAL, DIMENSION(50,2) :: DXY ! 约束位移值 REAL, DIMENSION(50,2) :: PJ ! 集中力值 REAL, DIMENSION(50,2) :: ZPS ! 面力值 INTEGER, DIMENSION(50) :: NPP ! 集中力节点号 INTEGER, DIMENSION(50,2) :: MPS ! 面力边界信息 ! 公共块定义 (与1.txt中的子程序兼容) COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V ! 生成网格 PRINT *, "Generating mesh..." CALL GENERATE_MESH(X, Y, LND, NJ, NE) ! 设置边界条件 PRINT *, "Setting boundary conditions..." CALL SET_BOUNDARY_CONDITIONS(JZ, DXY, NZ, X, Y, NJ) ! 设置面力 PRINT *, "Setting surface forces..." CALL SET_SURFACE_FORCES(MPS, ZPS, NPS, SIGMA_XX, X, Y, NJ) ! 打印问题信息 PRINT *, "==============================================" PRINT *, "Finite Element Analysis of Perforated Plate" PRINT *, "==============================================" PRINT *, "Geometry: 8m x 4m with 0.5m radius hole" PRINT *, "Material Properties:" PRINT *, " Young's Modulus (E) =", E PRINT *, " Poisson's Ratio (PR) =", PR PRINT *, " Thickness (T) =", T PRINT *, "Boundary Conditions:" PRINT *, " Fixed left edge, Tension on right edge =", SIGMA_XX PRINT *, "Mesh Information:" PRINT *, " Nodes =", NJ, "Elements =", NE PRINT *, " Constraints =", NZ, "Surface Forces =", NPS PRINT *, "----------------------------------------------" ! 计算弹性矩阵 PRINT *, "Computing elasticity matrix..." CALL MD(D) ! 组装总刚度矩阵 PRINT *, "Assembling global stiffness matrix..." CALL AKFORM(LND, X, Y, D, AK) ! 形成载荷向量 PRINT *, "Forming load vector..." CALL PFORM(LND, X, Y, NPP, PJ, NPS, MPS, ZPS, P) ! 处理约束条件 PRINT *, "Applying boundary constraints..." CALL RKR(NJ, NZ, JZ, AK, P, DXY) ! 求解方程组 PRINT *, "Solving linear system (size:", 2*NJ, ")..." CALL AGAUS(AK, P, 2*NJ, U) ! 计算并输出应力 PRINT *, "Computing element stresses..." CALL MADE(LND, D, X, Y, U) PRINT *, "----------------------------------------------" PRINT *, "Analysis complete! Results saved to result.txt" PRINT *, "Global stiffness matrix saved to AK.TXT" PRINT *, "Load vector saved to P.TXT" CONTAINS ! 生成带孔矩形板的网格 (示例实现) SUBROUTINE GENERATE_MESH(X, Y, LND, NJ, NE) REAL, INTENT(OUT) :: X(:), Y(:) INTEGER, INTENT(OUT) :: LND(:,:) INTEGER, INTENT(IN) :: NJ, NE INTEGER :: I, IE ! 实际网格生成代码 (简化示例) PRINT *, " Generating mesh with", NJ, "nodes and", NE, "elements" ! 这里应该有完整的网格生成逻辑 ! 为演示目的,简单初始化 DO I = 1, NJ X(I) = REAL(I-1)*0.1 Y(I) = REAL(MOD(I,20))*0.2 END DO DO IE = 1, NE LND(IE,1) = IE LND(IE,2) = IE+1 LND(IE,3) = IE+2 END DO END SUBROUTINE GENERATE_MESH ! 设置边界条件 SUBROUTINE SET_BOUNDARY_CONDITIONS(JZ, DXY, NZ, X, Y, NJ) INTEGER, INTENT(OUT) :: JZ(:,:) REAL, INTENT(OUT) :: DXY(:,:) INTEGER, INTENT(IN) :: NZ, NJ REAL, INTENT(IN) :: X(:), Y(:) INTEGER :: I, COUNT_CONSTRAINT = 0 REAL :: TOL = 1E-5 PRINT *, " Setting", NZ, "boundary constraints" ! 左边界固定 (X=0) DO I = 1, NJ IF (ABS(X(I)) < TOL) THEN COUNT_CONSTRAINT = COUNT_CONSTRAINT + 1 IF (COUNT_CONSTRAINT > NZ) EXIT JZ(COUNT_CONSTRAINT, 1) = I JZ(COUNT_CONSTRAINT, 2) = 1 ! X方向固定 JZ(COUNT_CONSTRAINT, 3) = 1 ! Y方向固定 DXY(COUNT_CONSTRAINT, 1) = 0.0 DXY(COUNT_CONSTRAINT, 2) = 0.0 END IF END DO END SUBROUTINE SET_BOUNDARY_CONDITIONS ! 设置面力 SUBROUTINE SET_SURFACE_FORCES(MPS, ZPS, NPS, SIGMA, X, Y, NJ) INTEGER, INTENT(OUT) :: MPS(:,:) REAL, INTENT(OUT) :: ZPS(:,:) INTEGER, INTENT(IN) :: NPS, NJ REAL, INTENT(IN) :: SIGMA, X(:), Y(:) INTEGER :: I, COUNT_FORCE = 0 REAL :: RIGHT_BOUND = 8.0, TOL = 1E-5 PRINT *, " Applying surface tension to", NPS, "edges" ! 右边界施加拉应力 (X=8) DO I = 1, NJ-1 IF (ABS(X(I) - RIGHT_BOUND) < TOL .AND. ABS(X(I+1) - RIGHT_BOUND) < TOL) THEN COUNT_FORCE = COUNT_FORCE + 1 IF (COUNT_FORCE > NPS) EXIT MPS(COUNT_FORCE, 1) = I MPS(COUNT_FORCE, 2) = I+1 ZPS(COUNT_FORCE, 1) = SIGMA ! X方向应力 ZPS(COUNT_FORCE, 2) = 0.0 ! Y方向应力 END IF END DO END SUBROUTINE SET_SURFACE_FORCES ! 包含所有必要的有限元分析子程序 ! 从1.txt中复制并稍作修改以适应本程序 SUBROUTINE AKFORM(LND,X,Y,D,AK) IMPLICIT NONE INTEGER, INTENT(IN) :: LND(500,3) REAL, INTENT(IN) :: X(200), Y(200), D(3,3) REAL, INTENT(OUT) :: AK(2000,2000) REAL :: AKE(6,6) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, II, J, JJ, IH, IDH, JL, JDL COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V AK = 0.0 PRINT *, " Assembling global stiffness from", NE, "elements" DO IE = 1, NE CALL MKE(IE,LND,X,Y,D,AKE) DO I = 1, 3 DO II = 1, 2 IH = 2*(I-1)+II IDH = 2*(LND(IE,I)-1)+II DO J = 1, 3 DO JJ = 1, 2 JL = 2*(J-1)+JJ JDL = 2*(LND(IE,J)-1)+JJ AK(IDH,JDL) = AK(IDH,JDL) + AKE(IH,JL) END DO END DO END DO END DO END DO ! 保存总刚矩阵 OPEN(10, FILE='AK.TXT') DO II = 1, 2*NJ WRITE(10,100) (AK(II,JJ), JJ = 1, 2*NJ) END DO 100 FORMAT(1X, 2000E12.4) CLOSE(10) PRINT *, " Global stiffness matrix assembled and saved" END SUBROUTINE AKFORM SUBROUTINE MKE(IE,LND,X,Y,D,AKE) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(500,3) REAL, INTENT(IN) :: X(200), Y(200), D(3,3) REAL, INTENT(OUT) :: AKE(6,6) REAL :: B(3,6), S(3,6), BT(6,3), AE INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: J, K COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) ! 计算 B转置 DO J = 1, 6 DO K = 1, 3 BT(J,K) = B(K,J) END DO END DO ! 计算单元刚度矩阵: AKE = BT * D * B * area * thickness CALL MTXMULT(BT,6,3, S,3,6,AKE) AKE = AKE * AE * T END SUBROUTINE MKE SUBROUTINE MA(IE,LND,X,Y,AE) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(500,3) REAL, INTENT(IN) :: X(200), Y(200) REAL, INTENT(OUT) :: AE INTEGER :: I, J, K REAL :: XIJ, YIJ, XIK, YIK I = LND(IE,1) J = LND(IE,2) K = LND(IE,3) XIJ = X(J)-X(I) YIJ = Y(J)-Y(I) XIK = X(K)-X(I) YIK = Y(K)-Y(I) AE = 0.5*(XIJ*YIK - XIK*YIJ) END SUBROUTINE MA SUBROUTINE MB(IE,LND,X,Y,AE,B) IMPLICIT NONE INTEGER, INTENT(IN) :: IE, LND(500,3) REAL, INTENT(IN) :: X(200), Y(200), AE REAL, INTENT(OUT) :: B(3,6) INTEGER :: I, J, M I = LND(IE,1) J = LND(IE,2) M = LND(IE,3) B = 0.0 B(1,1) = Y(J)-Y(M) B(1,3) = Y(M)-Y(I) B(1,5) = Y(I)-Y(J) B(2,2) = X(M)-X(J) B(2,4) = X(I)-X(M) B(2,6) = X(J)-X(I) B(3,1) = B(2,2) B(3,2) = B(1,1) B(3,3) = B(2,4) B(3,4) = B(1,3) B(3,5) = B(2,6) B(3,6) = B(1,5) B = B * 0.5 / AE END SUBROUTINE MB SUBROUTINE MD(D) IMPLICIT NONE REAL, INTENT(OUT) :: D(3,3) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V REAL :: D0 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V D = 0.0 IF (IPS .EQ. 1) THEN ! 平面应力 D0 = E / (1.0 - PR*PR) D(1,1) = D0 D(1,2) = D0 * PR D(2,1) = D(1,2) D(2,2) = D0 D(3,3) = D0 * (1.0 - PR)/2.0 ELSE ! 平面应变 D0 = E*(1-PR)/((1+PR)*(1-2*PR)) D(1,1) = D0 D(1,2) = D0*PR/(1-PR) D(2,1) = D(1,2) D(2,2) = D0 D(3,3) = D0*(1-2*PR)/(2*(1-PR)) END IF END SUBROUTINE MD SUBROUTINE MS(D, B, S) IMPLICIT NONE REAL, INTENT(IN) :: D(3,3), B(3,6) REAL, INTENT(OUT) :: S(3,6) CALL MTXMULT(D,3,3, B,3,6,S) END SUBROUTINE MS SUBROUTINE MTXMULT(A,M1,N1, B,M2,N2,C) IMPLICIT NONE INTEGER, INTENT(IN) :: M1, N1, M2, N2 REAL, INTENT(IN) :: A(M1,N1), B(M2,N2) REAL, INTENT(OUT) :: C(M1,N2) INTEGER :: I, J, K IF(N1.NE.M2) THEN WRITE(*,*) 'Matrix dimension mismatch in MTXMULT' STOP END IF C = 0.0 DO I = 1, M1 DO J = 1, N2 DO K = 1, N1 C(I,J) = C(I,J) + A(I,K)*B(K,J) END DO END DO END DO END SUBROUTINE MTXMULT SUBROUTINE PFORM(LND,X,Y, NPP, PJ, NPS,MPS,ZPS,P) IMPLICIT NONE INTEGER, INTENT(IN) :: LND(500,3), NPP(50), MPS(50,2), NPS REAL, INTENT(IN) :: X(200), Y(200), PJ(50,2), ZPS(50,2) REAL, INTENT(OUT) :: P(2000) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V ! 添加循环变量声明 INTEGER :: II ! 声明循环变量 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V P = 0.0 PRINT *, " Forming load vector with:" PRINT *, " Gravity load =", V PRINT *, " Surface forces =", NPS PRINT *, " Concentrated loads =", NPJ ! 重力载荷 IF (V .NE. 0.0) THEN CALL PVF(LND,X,Y,P) END IF ! 表面载荷 IF (NPS .NE. 0) THEN CALL PSF(NPS,MPS,ZPS,X,Y,P) END IF ! 集中载荷 IF (NPJ .NE. 0) THEN CALL PCF(NPJ,NPP, PJ,P) END IF ! 保存载荷向量 OPEN(20, FILE='P.TXT') DO II = 1, NJ WRITE(20,100) 'PX(',II,')=',P(2*II-1),'PY(',II,')=',P(2*II) END DO 100 FORMAT(1X, 2(A,I3,A,E12.4,3X)) CLOSE(20) END SUBROUTINE PFORM SUBROUTINE PVF(LND,X,Y,P) ! 重力 IMPLICIT NONE INTEGER, INTENT(IN) :: LND(500,3) REAL, INTENT(IN) :: X(200), Y(200) REAL, INTENT(INOUT) :: P(2000) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, II REAL :: AE, PE COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V DO IE = 1, NE CALL MA(IE, LND,X,Y,AE) PE = -V * AE * T / 3.0 ! 分配到每个节点 DO I = 1, 3 II = LND(IE,I) P(2*II) = P(2*II) + PE ! Y方向 END DO END DO END SUBROUTINE PVF SUBROUTINE PCF(NPJ,NPP, PJ,P) ! 集中力 IMPLICIT NONE INTEGER, INTENT(IN) :: NPJ, NPP(50) REAL, INTENT(IN) :: PJ(50,2) REAL, INTENT(INOUT) :: P(2000) INTEGER :: I, II DO I = 1, NPJ II = NPP(I) P(2*II-1) = P(2*II-1) + PJ(I,1) ! X方向 P(2*II) = P(2*II) + PJ(I,2) ! Y方向 END DO END SUBROUTINE PCF SUBROUTINE PSF(NPS,MPS,ZPS,X,Y,P) ! 分布面力 IMPLICIT NONE INTEGER, INTENT(IN) :: NPS, MPS(50,2) REAL, INTENT(IN) :: ZPS(50,2), X(200), Y(200) REAL, INTENT(INOUT) :: P(2000) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: I, N1, N2 REAL :: DX, DY, DZP, PX1, PY1, PX2, PY2 COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V DO I = 1, NPS N1 = MPS(I,1) N2 = MPS(I,2) DX = Y(N2) - Y(N1) DY = X(N1) - X(N2) DZP = ZPS(I,1) - ZPS(I,2) PX1 = (ZPS(I,2)/2.0 + DZP/3.0) * DX * T PY1 = (ZPS(I,2)/2.0 + DZP/3.0) * DY * T PX2 = (ZPS(I,2)/2.0 + DZP/6.0) * DX * T PY2 = (ZPS(I,2)/2.0 + DZP/6.0) * DY * T P(2*N1-1) = P(2*N1-1) + PX1 P(2*N1) = P(2*N1) + PY1 P(2*N2-1) = P(2*N2-1) + PX2 P(2*N2) = P(2*N2) + PY2 END DO END SUBROUTINE PSF SUBROUTINE RKR(NJ,NZ,JZ,AK,P, DXY) ! 约束处理 IMPLICIT NONE INTEGER, INTENT(IN) :: NJ, NZ, JZ(50,3) REAL, INTENT(IN) :: DXY(50,2) REAL, INTENT(INOUT) :: AK(2000,2000), P(2000) INTEGER :: I, IR, J, II REAL :: LARGE_NUMBER = 1.0E20 PRINT *, " Applying", NZ, "constraints with penalty method" DO I = 1, NZ IR = JZ(I,1) DO J = 2, 3 IF(JZ(I,J) .NE. 0) THEN II = 2*(IR-1) + J-1 AK(II,II) = AK(II,II) * LARGE_NUMBER P(II) = AK(II,II) * DXY(I,J-1) END IF END DO END DO END SUBROUTINE RKR SUBROUTINE AGAUS(A,B,N,X) ! 高斯消去法 IMPLICIT NONE INTEGER, INTENT(IN) :: N REAL, INTENT(INOUT) :: A(N,N), B(N) REAL, INTENT(OUT) :: X(N) REAL :: AM(N,N), T INTEGER :: K, I, J PRINT *, " Solving system with Gaussian elimination" ! 向前消元 DO K = 1, N-1 DO I = K+1, N AM(I,K) = A(I,K)/A(K,K) DO J = K, N A(I,J) = A(I,J) - AM(I,K)*A(K,J) END DO B(I) = B(I) - AM(I,K)*B(K) END DO END DO ! 回代 X(N) = B(N)/A(N,N) DO I = N-1, 1, -1 T = 0.0 DO J = I+1, N T = T + A(I,J)*X(J) END DO X(I) = (B(I) - T)/A(I,I) END DO END SUBROUTINE AGAUS SUBROUTINE MADE(LND,D,X,Y,U) ! 应力计算 IMPLICIT NONE INTEGER, INTENT(IN) :: LND(500,3) REAL, INTENT(IN) :: D(3,3), X(200), Y(200), U(2000) INTEGER :: NJ, NE, NZ, NPJ, IPS REAL :: E, PR, T, V INTEGER :: IE, I, J, IH, IW REAL :: AE, ST(3), UE(6), STX, STY, TXY, AST, RST, STMA, STMI REAL :: B(3,6), S(3,6) COMMON /GLOBAL/ NJ, NE, NZ, NPJ, IPS, E, PR, T, V OPEN(8, FILE='result.txt') WRITE(8,*) 'NODE DISPLACEMENTS AND ELEMENT STRESSES' WRITE(8,10) 10 FORMAT(1X, 'ELEMENT', 6X, 'STX', 14X, 'STY', 14X, 'TXY', 14X, 'ST_MAX', 11X, 'ST_MIN') DO IE = 1, NE CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) ! 提取单元位移 DO I = 1, 3 DO J = 1, 2 IH = 2*(I-1)+J IW = 2*(LND(IE,I)-1)+J UE(IH) = U(IW) END DO END DO ! 计算应力 DO I = 1, 3 ST(I) = 0.0 DO J = 1, 6 ST(I) = ST(I) + S(I,J)*UE(J) END DO END DO ! 计算主应力 STX = ST(1) STY = ST(2) TXY = ST(3) AST = (STX+STY)*0.5 RST = SQRT(0.25*(STX-STY)**2 + TXY*TXY) STMA = AST + RST STMI = AST - RST WRITE(8,60) IE, STX, STY, TXY, STMA, STMI END DO 60 FORMAT(1X,I5,5E16.6) WRITE(8,70) 70 FORMAT(/,1X,'NODE DISPLACEMENTS',/,' NODE',10X,'UX',14X,'UY') DO I = 1, NJ WRITE(8,80) I, U(2*I-1), U(2*I) END DO 80 FORMAT(1X,I5,2E16.6) CLOSE(8) PRINT *, " Results saved to result.txt" END SUBROUTINE MADE END PROGRAM PLATE

filetype

SUBROUTINE AKFORM(LND,X,Y,D,AK) DIMENSION LND(500,3),X(200),Y(200), AK(1000,1000), AKE(6,6), D(3,3) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V AK=0.0 DO IE=1,NE CALL MKE(IE,LND,X,Y,D,AKE) DO I=1,3 !单元刚度矩阵含3*3个2*2子矩阵 ---行对应 !代表单元中第I个节点,其在总体模型中的节点编号为LND(IE,I) DO II=1,2 !子矩阵行(与两个方向对应) IH=2*(I-1)+II ! 元素在单元刚度矩阵中行号(AKE(IH,?)) IDH=2*(LND(IE,I)-1)+II !元素在总刚中行号-单元IE第I个节点号对应的行 ! AK(IDH,?)) DO J=1,3 !代表单元中第J个节点,其在总体模型中的节点编号为LND(IE,J) DO JJ=1,2 !子矩阵列 -----列对应 JL=2*(J-1)+JJ !元素单元刚度矩阵中列号(AKE(IH,JL)) JDL=2*(LND(IE,J)-1)+JJ !元素在总刚中列号-单元IE第J个节点号对应的列 AK(IDH,JDL)=AK(IDH,JDL)+AKE(IH,JL) END DO END DO END DO END DO END DO OPEN(10,FILE='AK.TXT') DO II=1,2*NJ WRITE(10,100)(AK(II,JJ),JJ=1, 2*NJ) ENDDO 100 FORMAT(1X, 1000E10.2) CLOSE(10) PRINT *, 'Global stiffness matrix is complete' END ! 输入数据子程序 SUBROUTINE INPUT(LND,X,Y,JZ,DXY, NPP, PJ, NPS, MPS, ZPS) ! PLANE STRESS/STRAIN PROBLEM ANSLYSIS PROGRAM DIMENSION LND(500,3),X(200),Y(200),JZ(50,3), DXY(50,2) DIMENSION NPP(50), PJ(50,2), MPS(50,2), ZPS(50,2) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V !读入数据 OPEN(6,FILE='INDATA.TXT',STATUS='OLD') OPEN(8,FILE='OUT.DAT') READ(6,*) IPS READ(6,*) NJ,NE READ(6,*) NZ,NPJ,NPS READ(6,*)E,PR,T,V DO I=1,NJ READ(6,*)X(I),Y(I) ENDDO DO I=1,NE READ(6,*)(LND(I,J),J=1,3) ENDDO DO I=1,NZ READ(6,*) (JZ(I,J),J=1,3), (DXY(I,J), J=1,2) ENDDO DO I=1,NPJ !读集中力 READ(6,*) NPP(I), (PJ(I,J),J=1,2) ENDDO DO I=1,NPS !读面力结点编号 READ(6,*)(MPS(I,J),J=1,2) ENDDO DO I=1,NPS !节点法向面力 READ(6,*)(ZPS(I,J),J=1,2) ENDDO !打印 WRITE(8,*) 'NJ,NE,NZ,NPJ,NPS' WRITE(8,100) NJ,NE,NZ,NPJ,NPS 100 FORMAT(2X,5I4) WRITE(8,*) 'IPS,E,PR,T,V' WRITE(8,101) IPS,E,PR,T,V 101 FORMAT(2X,I4,2X,E10.4,3F6.2) WRITE(8,*) 'NODE COORDINATE(X, Y) ' DO I=1,NJ WRITE(8,200)I,X(I),Y(I) ENDDO 200 FORMAT(I4, 2E15.6) WRITE(8,*) 'ELEMENT' DO I=1,NE WRITE(8,300)I, (LND(I,J),J=1,3) ENDDO 300 FORMAT(4I4) WRITE(8,*) 'CONSTRAINTS' DO I=1,NZ WRITE (8,301) (JZ(I,J),J=1,3), DXY(I,1) , DXY(I,2) ENDDO 301 FORMAT(3I4, 2F8.2) WRITE(8, *)'Concentrated Forces' DO I=1,NPJ WRITE (8,400) NPP(I),(PJ(I,J),J=1,2) ENDDO 400 FORMAT(I4,2X, 2(E15.6,2X)) ! WRITE(8, *) ' Surface Forces ' WRITE(8, *)' I J SI SJ' DO I=1,NPS WRITE (8,500) (MPS(I,J),J=1,2), (ZPS(I,J),J=1,2) ENDDO 500 FORMAT(2(I4,2X), 2(E15.6,2X)) CLOSE(6) CLOSE(8) END !面积AE子程序 SUBROUTINE MA(IE,LND,X,Y,AE) DIMENSION LND (500,3),X(200),Y(200) I=LND(IE,1) J=LND(IE,2) K=LND(IE,3) XIJ=X(J)-X(I) YIJ= Y(J)-Y(I) XIK=X(K)-X(I) YIK= Y(K)-Y(I) AE=0.5*(XIJ*YIK-XIK*YIJ) END !应变矩阵B子程序 SUBROUTINE MB(IE,LND,X,Y,AE,B) DIMENSION LND(500,3),X(200),Y(200),B(3,6) I=LND(IE,1) J=LND(IE,2) M=LND(IE,3) B=0.0 B(1,1)=Y(J)-Y(M) B(1,3)=Y(M)-Y(I) B(1,5)=Y(I)-Y(J) B(2,2)=X(M)-X(J) B(2,4)= X(I)-X(M) B(2,6)= X(J)-X(I) B(3,1)= B(2,2) B(3,2)= B(1,1) B(3,3)= B(2,4) B(3,4)= B(1,3) B(3,5)= B(2,6) B(3,6)= B(1,5) B=B*0.5/AE END !刚度矩阵D子程序 SUBROUTINE MD(D) DIMENSION D(3,3) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V D=0. IF (IPS.NE.1) THEN E=E/(1-PR**2) PR= PR/(1-PR) ENDIF D0=E/(1-PR**2) D(1,1)=D0 D(1,2)=D0*PR D(2,1)= D(1,2) D(2,2)= D(1,1) D(3,3)=0.5*D0*(1-PR) END !应力矩阵S子程序 SUBROUTINE MS(D, B, S) DIMENSION B(3,6),D(3,3),S(3,6) CALL MTXMULT(D,3,3, B,3,6,S) END !Matrix multiplication SUBROUTINE MTXMULT (D,M1,N1, B,M2,N2,S) DIMENSION D(M1,N1),B(M2,N2), S(M1,N2) IF(N1.NE.M2) THEN WRITE(*,*) 'please check matrix dimension when calling subroutine MATMUL' STOP ENDIF S=0.0 DO I=1,M1 DO J=1,N2 DO K=1,N1 S(I,J)=S(I,J)+D(I,K)*B(K,J) ENDDO ENDDO ENDDO END !刚度矩阵组装AKE子程序 SUBROUTINE MKE(IE,LND,X,Y,D,AKE) DIMENSION LND(500,3),X(200),Y(200),B(3,6),D(3,3),S(3,6),AKE(6,6),BT(6,3) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) DO J=1,6 DO K=1,3 BT(J,K)= B(K,J) END DO END DO CALL MTXMULT (BT,6,3, S,3,6,AKE) AKE=AKE*AE*T END SUBROUTINE MADE(LND,D,X,Y,U) DIMENSION LND(500,3),X(200),Y(200),D(3,3) ,B(3,6),S(3,6),ST(3),U(2*NJ),UE(6) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V OPEN(unit=8,file= 'result.txt') WRITE(8,10) 10 FORMAT(1X, 'ELEMENT STRESSES') DO IE=1,NE CALL MA(IE,LND,X,Y,AE) CALL MB(IE,LND,X,Y,AE,B) CALL MS(D, B, S) DO I=1,3 !查找IE单元结点位移 DO J=1,2 IH=2*(I-1)+J IW=2*(LND(IE,I)-1)+J UE(IH)=U(IW) END DO END DO DO I=1,3 ST(I)=0.0 DO J=1,6 ST(I)=ST(I)+S(I,J)*UE(J) END DO END DO !CALL MTXMULT (S,3,6, UE,6,1,ST) STX=ST(1) STY=ST(2) TXY=ST(3) AST=(STX+STY)*0.5 RST=SQRT(0.25*(STX-STY)**2+TXY*TXY) STMA=AST+RST STMI=AST-RST WRITE(8,60) IE,STX,STY,TXY,STMA,STMI END DO 60 FORMAT(1X,'ELEMENT NO.=',I5,3X,'STX=',E15.6,2X,'STY=',E15.6,2X,'TXY=',E15.6,3X,'STMA=',E15.6,2X,'STMI=',E15.6) WRITE(8,70) 70 Format(4X,'ND',3X,'UX',13x,'UY') DO I=1,NJ WRITE(8,80) I,U(2*I-1),U(2*I) END DO 80 FORMAT(1X,I5,2E15.6) Close(8) END !载荷列阵 SUBROUTINE PFORM(LND,X,Y, NPP, PJ, NPS,MPS,ZPS,P) DIMENSION LND(500,3), X(200),Y(200) DIMENSION PJ(50,2), NPP(50), MPS(50,2),ZPS(50,2),P(400) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V P=0.0 !载荷向量清零 IF (V.NE.0) THEN !重力载荷不为零 CALL PVF(LND,X,Y,P) END IF IF (NPS.NE.0) THEN !均布载荷 CALL PSF(NPS,MPS,ZPS,X,Y,P) END IF IF(NPJ.NE.0) THEN !集中载荷 CALL PCF(NPJ,NPP, PJ,P) END IF OPEN(20,FILE='P.TXT') DO II=1, NJ WRITE(20,100) 'PX(',II,')=',P(2*II-1),'PY(',II,')=',P(2*II) ENDDO 100 FORMAT(1X, 2(A,I3,A,E10.2,3X)) CLOSE(20) END ! 重力的等效力 SUBROUTINE PVF(LND,X,Y,P) !重力 DIMENSION LND(500,3),X(200),Y(200),P(400) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V DO IE=1,NE CALL MA(IE, LND,X,Y,AE) PE=-V*AE*T/3.0 !总重的1/3,负Y方向 DO I=1,3 II=LND(IE,I) P(2*II)=P(2*II)+PE !重力Y方向 END DO END DO END !集中力 SUBROUTINE PCF(NPJ,NPP, PJ,P) !集中力 DIMENSION NPP(50),PJ(50,2),P(400) DO I=1,NPJ II=NPP (I) P(2*II-1)= P(2*II-1)+PJ(I,1) P(2*II)= P(2*II)+PJ(I,2) END DO END !分布面力 SUBROUTINE PSF(NPS,MPS,ZPS,X,Y,P) DIMENSION X(200),Y(200), MPS(50,2), ZPS(50,2), P(400) COMMON NJ,NE,NZ,NPJ,IPS,E,PR,T,V DO I=1,NPS N1=MPS(I,1) N2=MPS(I,2) DX=Y(N2)-Y(N1) DY=X(N1)-X(N2) dZP=ZPS(I,1)-ZPS(I,2) PX1=(ZPS(I,2)/2.0+dZP/3.0)*DX*T PY1 =(ZPS(I,2)/2.0+dZP/3.0)*DY*T PX2=(ZPS(I,2)/2.0+dZP/6.0)*DX*T PY2=(ZPS(I,2)/2.0+dZP/6.0)*DY*T P(2*N1-1)= P(2*N1-1)+PX1 P(2*N1)= P(2*N1)+PY1 P(2*N2-1)= P(2*N2-1)+PX2 P(2*N2)= P(2*N2)+PY2 END DO END SUBROUTINE AGAUS(A,B,N,X) DIMENSION A(N,N),X(N),B(N), AM(N,N) DO K=1,N-1 DO I=K+1,N AM(I,K)=A(I,K)/A(K,K) ENDDO DO I=K+1,N DO J=K, N A(I,J)=A(I,J)- AM(I,K)*A(K,J) ENDDO B(I)=B(I)-AM(I,K)*B(K) ENDDO ENDDO X(N)=B(N)/A(N,N) DO I=N-1,1,-1 T=0.0 DO J=I+1,N T=T+A(I,J)*X(J) ENDDO X(I)=(B(I)-T)/A(I,I) ENDDO END !乘大数法 SUBROUTINE RKR(NJ,NZ,JZ,AK,P, DXY) DIMENSION P(400),JZ(50,3),AK(1000,1000), DXY(50,2) DO I=1,NZ IR=JZ(I,1) DO J=2,3 IF(JZ(I,J).NE.0) THEN II=2*(IR-1)+J-1 AK(II,II)= AK(II,II)*1.0E20 !对角线元素乘大数 P(II)= AK(II,II)*DXY(I,J-1) !载荷变为位移 END IF END DO END DO OPEN(10,FILE='AK.TXT',ACCESS='APPEND') !打开总刚矩阵文件 WRITE(10,*)"变换后的总刚" DO II=1,2*NJ WRITE(10,100)(AK(II,JJ),JJ=1,2*NJ) ENDDO 100 FORMAT(1X, 1000E10.2) CLOSE(10) OPEN(20,FILE='P.TXT',ACCESS='APPEND') !打开载荷向量文件 WRITE(20,*) '变换后的载荷向量' DO II=1, NJ WRITE(20,200) 'PX(',II,')=',P(2*II-1),'PY(',II,')=',P(2*II) ENDDO 200 FORMAT(1X, 2(A,I3,A,E10.2,3X)) CLOSE(20) END提取其中的子程序

filetype

解释代码:int post_process(int8_t* input0, int8_t* input1, int8_t* input2, int model_in_h, int model_in_w, float conf_threshold, float nms_threshold, float scale_w, float scale_h, std::vector<int32_t>& qnt_zps, std::vector<float>& qnt_scales, detect_result_group_t* group) { static int init = -1; if (init == -1) { int ret = 0; ret = loadLabelName(LABEL_NALE_TXT_PATH, labels); if (ret < 0) { return -1; } init = 0; } memset(group, 0, sizeof(detect_result_group_t)); std::vector<float> filterBoxes; std::vector<float> objProbs; std::vector<int> classId; // stride 8 int stride0 = 8; int grid_h0 = model_in_h / stride0; int grid_w0 = model_in_w / stride0; int validCount0 = 0; validCount0 = process(input0, (int*)anchor0, grid_h0, grid_w0, model_in_h, model_in_w, stride0, filterBoxes, objProbs, classId, conf_threshold, qnt_zps[0], qnt_scales[0]); // stride 16 int stride1 = 16; int grid_h1 = model_in_h / stride1; int grid_w1 = model_in_w / stride1; int validCount1 = 0; validCount1 = process(input1, (int*)anchor1, grid_h1, grid_w1, model_in_h, model_in_w, stride1, filterBoxes, objProbs, classId, conf_threshold, qnt_zps[1], qnt_scales[1]); // stride 32 int stride2 = 32; int grid_h2 = model_in_h / stride2; int grid_w2 = model_in_w / stride2; int validCount2 = 0; validCount2 = process(input2, (int*)anchor2, grid_h2, grid_w2, model_in_h, model_in_w, stride2, filterBoxes, objProbs, classId, conf_threshold, qnt_zps[2], qnt_scales[2]); int validCount = validCount0 + validCount1 + validCount2; // no object detect if (validCount <= 0) { return 0; } std::vector<int> indexArray; for (int i = 0; i < validCount; ++i) { indexArray.push_back(i); } quick_sort_indice_inverse(objProbs, 0, validCount - 1, indexArray); std::set<int> class_set(std::begin(classId), std::end(classId)); for (auto c : class_set) { nms(validCount, filterBoxes, classId, indexArray, c, nms_threshold); } int last_count = 0; group->count = 0; /* box valid detect target */ for (int i = 0; i < validCount; ++i) { if (indexArray[i] == -1 || last_count >= OBJ_NUMB_MAX_SIZE) { continue; } int n = indexArray[i]; float x1 = filterBoxes[n * 4 + 0]; float y1 = filterBoxes[n * 4 + 1]; float x2 = x1 + filterBoxes[n * 4 + 2]; float y2 = y1 + filterBoxes[n * 4 + 3]; int id = classId[n]; float obj_conf = objProbs[i]; group->results[last_count].box.left = (int)(clamp(x1, 0, model_in_w) / scale_w); group->results[last_count].box.top = (int)(clamp(y1, 0, model_in_h) / scale_h); group->results[last_count].box.right = (int)(clamp(x2, 0, model_in_w) / scale_w); group->results[last_count].box.bottom = (int)(clamp(y2, 0, model_in_h) / scale_h); group->results[last_count].prop = obj_conf; char* label = labels[id]; strncpy(group->results[last_count].name, label, OBJ_NAME_MAX_SIZE); // printf("result %2d: (%4d, %4d, %4d, %4d), %s\n", i, group->results[last_count].box.left, // group->results[last_count].box.top, // group->results[last_count].box.right, group->results[last_count].box.bottom, label); last_count++; } group->count = last_count; return 0; }

马运良
  • 粉丝: 34
上传资源 快速赚钱