对于fortran编程不懂,有限元也学的不好,求一位代写,有偿,有意留言我,谢谢了。
向传参传过去的是地址而不是值,传过去的参数在函数/子程序中修改了,主函数中的变量值也会随之改变,必须注意这一点!
program main
external fun
integer ::a,x=17,b,fun
a=fun(x)/fun(x)
b=fun(x)-fun(x)
write(*,*)a,b
pause
end
integer function fun(x)
integer x
x=x/2
=>传来的x在此处的改动会改变主函数中的x的值,第一次进来时候x=17,第一次出去时x=8,当主程序a在计算分母的时候
再次调用的时候x=8,之后以此类推
fun=x*x
end
输出:4 3
program main
real::a=3.0,b=5.0,c=4.0
call subt(b-a,c) =>1. 传过去的第一个参数是b-a这个整体
write(*,*)b-a,c => 3. 这里的b-a是用原函数中的b-a重新计算,5-2=3.0
pause
end
subroutine subt(x,y)
real x,y
x=x+2 => 2. 修改的是b-a这个整体,原函数的b,a并没有被修改
y=y+1
end
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
很抱歉,作为一个AI语言模型,我并不能提供有偿代写的服务,也无法通过代码给出完整的有限元分析程序。但是,我可以提供一些有用的信息和建议。
首先,从程序设计角度来看,有限元分析程序是一种比较复杂的数值计算程序,需要考虑各种数值方法、算法和数据结构。如果您不熟悉Fortran和有限元方法,建议先学习一些基本知识和相关的书籍、论文和课程。
关于Fortran编程语言,您可以阅读一些Fortran编程手册和教程,例如Fortran 95/2003编程手册和Fortran语言程序设计。这些资源可以帮助您了解Fortran的语法、数据类型、控制结构、函数和模块等基本知识。
关于有限元方法,需要了解有限元模型的基本概念、离散化方法、求解算法、网格生成、后处理和可视化等方面。有关有限元的书籍包括《有限元方法基础》、《非线性有限元分析:基础与应用》。也可以学习一些在线课程,例如Coursera上的《有限元方法》、MIT OpenCourseWare上的《有限元分析》。
最后,如果您已经理解了Fortran和有限元方法的基本知识,并且已经有一些经验和代码,但需要代写程序的话,建议您在相关论坛或社区发布招标信息或邀请程序员合作,这样可以找到合适的人或团队来帮助您完成项目。
如果我的回答解决了您的问题,请采纳!
一个示例,用于计算二维平面应力问题
program fem
implicit none
integer, parameter :: nelem=4, nnodes=4, ndim=2
real, parameter :: pi=3.14159
integer :: conn(2,nelem), i, j, k
real :: coord(ndim, nnodes), f(nelem), kmat(ndim*nnodes,ndim*nnodes)
real :: x, y, d, c, s, phi, theta, r
! 节点和单元信息
conn(:,1) = [1,2]
conn(:,2) = [2,3]
conn(:,3) = [3,4]
conn(:,4) = [4,1]
coord(:,1) = [0.0, 0.0]
coord(:,2) = [1.0, 0.0]
coord(:,3) = [1.0, 1.0]
coord(:,4) = [0.0, 1.0]
! 初始化矩阵
kmat = 0.0
f = 0.0
! 循环每个单元
do i = 1, nelem
! 计算单元刚度矩阵
x = coord(1,conn(1,i))
y = coord(2,conn(1,i))
d = sqrt(x**2 + y**2)
c = x/d
s = y/d
phi = atan2(s,c)
theta = atan2(y,x)
r = 1.0
kmat(ndim*conn(1,i)-1,ndim*conn(1,i)-1) = kmat(ndim*conn(1,i)-1,ndim*conn(1,i)-1) + r*d*phi/pi
kmat(ndim*conn(1,i)-1,ndim*conn(2,i)-1) = kmat(ndim*conn(1,i)-1,ndim*conn(2,i)-1) - r*d*phi/pi
kmat(ndim*conn(2,i)-1,ndim*conn(1,i)-1) = kmat(ndim*conn(2,i)-1,ndim*conn(1,i)-1) - r*d*phi/pi
kmat(ndim*conn(2,i)-1,ndim*conn(2,i)-1) = kmat(ndim*conn(2,i)-1,ndim*conn(2,i)-1) + r*d*phi/pi
kmat(ndim*conn(1,i),ndim*conn(1,i)) = kmat(ndim*conn(1,i),ndim*conn(1,i)) + r*d*theta/pi
kmat(ndim*conn(1,i),ndim*conn(2,i)) = kmat(ndim*conn(1,i),ndim*conn(2,i)) - r*d*theta/pi
kmat(ndim*conn(2,i),ndim*conn(1,i)) = kmat(ndim*conn(2,i),ndim*conn(1,i)) - r*d*theta/pi
kmat(ndim*conn(2,i),ndim*conn(2,i)) = kmat(ndim*conn(2,i),ndim*conn(2,i)) + r*d*theta/pi
! 计算单元载荷向量
f(i) = 1.0
end do
! 解方程
call solve(kmat,f)
! 输出结果
write(*,*) 'Displacements:'
do i = 1, nnodes
write(*,*) 'Node ',i,': ',f(2*i-1),f(2*i)
end do
contains
! 解线性方程组的函数
subroutine solve(a, b)
implicit none
integer :: n, info
integer :: ipiv(ndim*nnodes)
real :: a(ndim*nnodes, ndim*nnodes), b(ndim*nnodes)
! 调用LAPACK库中的sgesv函数解线性方程组
n = ndim * nnodes
call sgesv(n, 1, a, n, ipiv, b, n, info)
! 如果解决方案失败,则输出错误信息
if (info /= 0) then
write(*,*) 'Failed to solve linear system'
end if
end subroutine solve
end program fem