Fortran Coder

查看: 12454|回复: 3
打印 上一主题 下一主题

[求助] 求助---关于无法分配内存问题

[复制链接]

3

帖子

1

主题

0

精华

新人

F 币
10 元
贡献
8 点
跳转到指定楼层
楼主
发表于 2017-4-3 23:03:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5F 币
程序一运行就会提示分配内存失败,求助,检查了几遍,如果在循环内插入write是可以输出的,谢谢各位前辈。

微信截图_20170403230053.png (50.15 KB, 下载次数: 579)

微信截图_20170403230053.png

main.txt

5.7 KB, 下载次数: 0

main.f90

5.68 KB, 下载次数: 0

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

3

帖子

1

主题

0

精华

新人

F 币
10 元
贡献
8 点
沙发
 楼主| 发表于 2017-4-3 23:06:29 | 只看该作者
是个求解sod激波管的问题,用了流通矢量分裂,时间推进是3阶runge-kutta,两个附件是一模一样的代码。
回复

使用道具 举报

3

帖子

1

主题

0

精华

新人

F 币
10 元
贡献
8 点
板凳
 楼主| 发表于 2017-4-3 23:06:56 | 只看该作者
[Fortran] 纯文本查看 复制代码
001program main
002    implicit none
003    integer i,j,W,n
004    real(8) gamma,ux,delt_t,delt_x,total_t,uxp,uxm
005    real(8),allocatable::den(:,:,:),u(:,:,:),p(:,:,:),den_u(:,:,:),e(:,:,:)
006    real(8) f1_p(-3:103),f2_p(-3:103),f3_p(-3:103),f1_m(-3:103),f2_m(-3:103),f3_m(-3:103)
007    gamma=1.4d0
008    total_t=0.14d0
009    delt_x=0.01d0
010    delt_t=0.001d0
011    W=total_t/delt_t+1
012    allocate(den(-3:103,0:W-1,3),u(-3:103,0:W-1,3),p(-3:103,0:W-1,3),den_u(-3:103,0:W-1,3),e(-3:103,0:W-1,3))
013 
014    n=0
015    !----initial value
016    do j=-3,103
017        u(j,n,3)=0d0
018        if(j*delt_x<0.5d0)then
019            den(j,n,3)=1d0
020            p(j,n,3)=1d0
021            else
022                den(j,n,3)=0.125d0
023                p(j,n,3)=0.1d0
024        end if
025        den_u(j,n,3)=den(j,n,3)*u(j,n,3)
026        e(j,n,3)=p(j,n,3)/(gamma-1d0)+0.5d0*den(j,n,3)*u(j,n,3)**2
027    end do
028 
029    !----runge-kutta
030    do while(n<=W-1)
031 
032        !----runge-kutta step1
033        i=3
034        call FVS(i,u,p,den,n,f1_p,f1_m,f2_p,f2_m,f3_p,f3_m,W)
035 
036        do j=0,100
037            ux=uxp(f1_p,j)+uxm(f1_m,j)
038            den(j,n,1)=den(j,n,3)-delt_t*ux
039 
040            ux=uxp(f2_p,j)+uxm(f2_m,j)
041            den_u(j,n,1)=den_u(j,n,3)-delt_t*ux
042            u(j,n,1)=den_u(j,n,1)/den(j,n,1)
043 
044            ux=uxp(f3_p,j)+uxm(f3_m,j)
045            e(j,n,1)=e(j,n,3)-delt_t*ux
046            p(j,n,1)=(gamma-1d0)*(e(j,n,1)-0.5d0*den(j,n,1)*u(j,n,1)**2)
047        end do
048 
049        do j=-3,-1
050            u(j,n,1)=u(0,n,1)
051            den(j,n,1)=den(0,n,1)
052            p(j,n,1)=p(0,n,1)
053        end do
054        do j=101,103
055            u(j,n,1)=u(100,n,1)
056            den(j,n,1)=den(100,n,1)
057            p(j,n,1)=p(100,n,1)
058        end do
059 
060        !----runge-kutta step2
061        i=1
062        call FVS(i,u,p,den,n,f1_p,f1_m,f2_p,f2_m,f3_p,f3_m,W)
063 
064        do j=0,100
065            ux=uxp(f1_p,j)+uxm(f1_m,j)
066            den(j,n,2)=3d0/4d0*den(j,n,3)+1d0/4d0*(den(j,n,1)-delt_t*ux)
067 
068            ux=uxp(f2_p,j)+uxm(f2_m,j)
069            den_u(j,n,2)=3d0/4d0*den_u(j,n,3)+1d0/4d0*(den_u(j,n,1)-delt_t*ux)
070            u(j,n,2)=den_u(j,n,2)/den(j,n,2)
071 
072            ux=uxp(f3_p,j)+uxm(f3_m,j)
073            e(j,n,2)=3d0/4d0*e(j,n,3)+1d0/4d0*(e(j,n,1)-delt_t*ux)
074            p(j,n,2)=(gamma-1d0)*(e(j,n,2)-0.5d0*den(j,n,2)*u(j,n,2)**2)
075        end do
076 
077        do j=-3,-1
078            u(j,n,2)=u(0,n,2)
079            den(j,n,2)=den(0,n,2)
080            p(j,n,2)=p(0,n,2)
081        end do
082        do j=101,103
083            u(j,n,2)=u(100,n,2)
084            den(j,n,2)=den(100,n,2)
085            p(j,n,2)=p(100,n,2)
086        end do
087 
088        !----runge-kutta step3
089        i=2
090        call FVS(i,u,p,den,n,f1_p,f1_m,f2_p,f2_m,f3_p,f3_m,W)
091 
092        do j=0,100
093            ux=uxp(f1_p,j)+uxm(f1_m,j)
094            den(j,n+1,3)=1d0/3d0*den(j,n,3)+2d0/3d0*(den(j,n,2)-delt_t*ux)
095 
096            ux=uxp(f2_p,j)+uxm(f2_m,j)
097            den_u(j,n+1,3)=1d0/3d0*den_u(j,n,3)+2d0/3d0*(den_u(j,n,2)-delt_t*ux)
098            u(j,n+1,3)=den_u(j,n+1,3)/den(j,n+1,3)
099 
100            ux=uxp(f3_p,j)+uxm(f3_m,j)
101            e(j,n+1,3)=1d0/3d0*e(j,n,3)+2d0/3d0*(e(j,n,2)-delt_t*ux)
102            p(j,n+1,3)=(gamma-1d0)*(e(j,n+1,3)-0.5d0*den(j,n+1,3)*u(j,n+1,3)**2)
103        end do
104 
105        do j=-3,-1
106            u(j,n+1,3)=u(0,n+1,3)
107            den(j,n+1,3)=den(0,n+1,3)
108            p(j,n+1,3)=p(0,n+1,3)
109        end do
110        do j=101,103
111            u(j,n+1,3)=u(100,n+1,3)
112            den(j,n+1,3)=den(100,n+1,3)
113            p(j,n+1,3)=p(100,n+1,3)
114        end do
115 
116    n=n+1
117    end do
118 
119    open(unit=10,file="FVS.txt")
120    do j=0,100
121        write(10,"(4E15.7)") j*delt_x,den(j,W-1,3),u(j,W-1,3),p(j,W-1,3)
122    end do
123    close(unit=10)
124 
125end
126 
127subroutine FVS(i,u,p,den,n,f1_p,f1_m,f2_p,f2_m,f3_p,f3_m,W)
128    implicit none
129    integer i,j,W,n
130    real(8) gamma,epsilon,wp,wm,coe
131    real(8) c,lamda1,lamda1_p,lamda1_m,lamda2,lamda2_p,lamda2_m,lamda3,lamda3_p,lamda3_m
132    real(8) f1_p(-3:103),f2_p(-3:103),f3_p(-3:103),f1_m(-3:103),f2_m(-3:103),f3_m(-3:103)
133    real(8) u(-3:103,0:W-1,3),den(-3:103,0:W-1,3),p(-3:103,0:W-1,3)
134    gamma=1.4d0
135    epsilon=0.1d0
136    do j=-3,103
137        c=sqrt(gamma*p(j,n,i)/den(j,n,i))
138        lamda1=u(j,n,i)
139        lamda2=u(j,n,i)-c
140        lamda3=u(j,n,i)+c
141        lamda1_p=(lamda1+sqrt(lamda1**2+epsilon**2))/2d0
142        lamda1_m=(lamda1-sqrt(lamda1**2+epsilon**2))/2d0
143        lamda2_p=(lamda2+sqrt(lamda2**2+epsilon**2))/2d0
144        lamda2_m=(lamda2-sqrt(lamda2**2+epsilon**2))/2d0
145        lamda3_p=(lamda3+sqrt(lamda3**2+epsilon**2))/2d0
146        lamda3_m=(lamda3-sqrt(lamda3**2+epsilon**2))/2d0
147        wp=(3d0-gamma)*(lamda2_p+lamda3_p)*c**2/(2d0*(gamma-1d0))
148        wm=(3d0-gamma)*(lamda2_m+lamda3_m)*c**2/(2d0*(gamma-1d0))
149        coe=den(j,n,i)/(2d0*gamma)
150        f1_p(j)=coe*(2d0*(gamma-1d0)*lamda1_p+lamda2_p+lamda3_p)
151        f1_m(j)=coe*(2d0*(gamma-1d0)*lamda1_m+lamda2_m+lamda3_m)
152        f2_p(j)=coe*(2d0*(gamma-1d0)*lamda1_p*lamda1+lamda2_p*lamda2+lamda3_p*lamda3)
153        f2_m(j)=coe*(2d0*(gamma-1d0)*lamda1_m*lamda1+lamda2_m*lamda2+lamda3_m*lamda3)
154        f3_p(j)=coe*((gamma-1d0)*lamda1_p*lamda1**2+0.5d0*lamda2_p*lamda2**2+0.5d0*lamda3_p*lamda3**2+wp)
155        f3_m(j)=coe*((gamma-1d0)*lamda1_m*lamda1**2+0.5d0*lamda2_m*lamda2**2+0.5d0*lamda3_m*lamda3**2+wm)
156    end do
157end subroutine
158 
159function uxp(up,j)
160    implicit none
161    integer j
162    real(8) up(-3:103)
163    real(8) uxp,delt_x
164    delt_x=0.01d0
165    uxp=(-2d0*up(j-3))+15d0*up(j-2)-60d0*up(j-1)+20d0*up(j)+30d0*up(j+1)-3d0*up(j+2)/(60d0*delt_x)
166end function
167 
168function uxm(um,j)
169    implicit none
170    integer j
171    real(8) um(-3:103)
172    real(8) uxm,delt_x
173    delt_x=0.01d0
174    uxm=(3d0*um(j-2)-30d0*um(j-1)-20d0*um(j)+60d0*um(j+1)-15d0*um(j+2)+2d0*um(j+3))/(60d0*delt_x)
175end function
回复

使用道具 举报

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
地板
发表于 2017-4-4 09:37:28 | 只看该作者
你的提示是c++出问题,不合常理,可能是软件问题。我这里是数组越界,
[Fortran] 纯文本查看 复制代码
1den(-3:103,0:W-1,3)
2。。。
3do while(n<=W-1)
4。。。
5 den(j,n+1,3)=1d0/3d0。。。

QQ截图20170404092943.png (47.21 KB, 下载次数: 602)

QQ截图20170404092943.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-28 21:31

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表