Fortran Coder

查看: 7891|回复: 1
打印 上一主题 下一主题

[数值问题] 一个循环嵌套的设计问题.

[复制链接]

2

帖子

1

主题

0

精华

入门

F 币
34 元
贡献
14 点
跳转到指定楼层
楼主
发表于 2016-12-20 01:42:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 再见大麋鹿 于 2016-12-20 01:51 编辑

鄙人 Fortran 小白, 此问题查阅大量资料后无果, 且时间紧张, 故前来请教.
我的程序的思路是:
做两个自变量: time, voltage 的循环
就是先对 time 做一个循环,然后在每一个 time 数值做一个 voltage 的循环
最后得出2个自变量的函数 current=current(voltage, time)

而且我在给定 voltage 的时候是成功的, 也就是说, 原本只有一个 time 的循环, 现在我要在 time 的循环下加上一个 voltage 的循环.

原代码循环部分如下:

[Fortran] 纯文本查看 复制代码
001time = 0.0d0
002do
003if (time .ge. time_end) exit
004 
005if (time <= time_center) then
006    e_rabi_0 = e_rabi_i*exp(-(time-time_center)**2/time_width**2)       ! = exp(-4*(time-time_center)**2/time_center**2)
007else
008    e_rabi_0 = e_rabi_i
009end if
010    e_rabi_1 = e_rabi_0
011 
012call exci_rates(de,sq_fcf,gam,kop,e_rabi_0,e_rabi_1)
013do mc = 0, 1
014do me = 0, 1
015do mv = 0, mv_max
016do nc = 0, 1
017do ne = 0, 1
018do nv = 0, mv_max
019    k_ref(mc,me,mv,nc,ne,nv) = kivr(mc,me,mv,nc,ne,nv) + kop(mc,me,mv,nc,ne,nv) + klu(mc,me,mv,nc,ne,nv)
020end do
021end do
022end do
023end do
024end do
025end do
026 
027voltage = voltage_give
028 
029 
030call mol_lead_rates(voltage,de,v_l,v_r,sq_fcf,klw,klw_l)
031do mc = 0, 1
032do me = 0, 1
033do mv = 0, mv_max
034do nc = 0, 1
035do ne = 0, 1
036do nv = 0, mv_max
037    k_tot(mc,me,mv,nc,ne,nv) = k_ref(mc,me,mv,nc,ne,nv) + klw(mc,me,mv,nc,ne,nv)
038end do
039end do
040end do
041end do
042end do
043end do
044 
045if (time == 0.0d0) then
046do mc = 0, 1
047do me = 0, 1
048do mv = 0, mv_max
049    pop(mc,me,mv) = 0.d0
050end do
051end do
052end do
053pop(0,0,0) = 1.d0
054 
055stop_time = time_final
056100 do mc = 0, 1
057do me = 0, 1
058do mv = 0, mv_max
059    pop_old(mc,me,mv) = pop(mc,me,mv)
060end do
061end do
062end do
063call multi_to_single(pop_old,fin)
064call rk4(fin,time,time_step,fout,k_tot)
065call single_to_multi(fout,pop)
066 
067time = time + time_step
068if (time < stop_time) goto 100
069 
070error_pop = 0.d0
071do mc = 0, 1
072do me = 0, 1
073do mv = 0, mv_max
074    error_pop = error_pop + (pop(mc,me,mv) - pop_old(mc,me,mv))**2
075end do
076end do
077end do
078    error_pop = SQRT(error_pop)/length_coeff
079if (error_pop > max_error) then
080    stop_time = stop_time + 0.5d0*time_final
081end if
082if (error_pop > max_error) goto 100
083    time = 0.0d0
084    time = time + time_step
085else
086do mc = 0, 1
087do me = 0, 1
088do mv = 0, mv_max
089    pop_old(mc,me,mv) = pop(mc,me,mv)
090end do
091end do
092end do
093 
094call multi_to_single(pop_old,fin)
095call rk4(fin,time,time_step,fout,k_tot)
096call single_to_multi(fout,pop)
097time = time + time_step
098end if
099 
100total_pop = 0.d0
101mean_vib = 0.d0
102do mc = 0, 1
103do me = 0, 1
104    pop_el(mc,me) = 0.d0
105end do
106end do
107 
108do mv = 0, mv_max
109    pop_vib(mv) = 0.d0
110end do
111do mc = 0, 1
112do me = 0, 1
113do mv = 0, mv_max
114    total_pop = total_pop + pop(mc,me,mv)
115    pop_el(mc,me) = pop_el(mc,me) + pop(mc,me,mv)
116end do
117end do
118end do
119 
120mean_vib=0.0d0
121do mc = 0, 1    
122do me = 0, 1  
123do mv = 0, mv_max
124    mean_vib = mean_vib + mv*pop(mc,me,mv)
125end do
126end do
127end do
128 
129i_photon = 0.d0
130do mc = 0, 1
131do mv = 0, mv_max
132do nv = 0, mv_max
133    i_photon = i_photon + klu(mc,1,mv,mc,0,nv)*pop(mc,1,mv)
134end do
135end do
136end do
137 
138current = 0.0d0
139do me = 0, 1
140do mv = 0, mv_max
141do ne = 0, 1
142do nv = 0, mv_max
143    current = current + klw_l(0,me,mv,1,ne,nv)*pop(0,me,mv) - klw_l(1,ne,nv,0,me,mv)*pop(1,ne,nv)
144end do
145end do
146end do
147end do
148 
149do mc = 0, 1
150do me = 0, 1
151do nc = 0, 1
152do ne = 0, 1
153    c_in(mc,me,nc,ne) = 0.0d0
154    c_out(mc,me,nc,ne) = 0.0d0
155end do
156end do
157end do
158end do
159 
160do mv = 0, mv_max
161do nv = 0, mv_max
162    c_in(0,0,1,0) = c_in(0,0,1,0) + klw_l(0,0,mv,1,0,nv)*pop(0,0,mv)
163    c_in(0,0,1,1) = c_in(0,0,1,1) + klw_l(0,0,mv,1,1,nv)*pop(0,0,mv)
164    c_in(0,1,1,0) = c_in(0,1,1,0) + klw_l(0,1,mv,1,0,nv)*pop(0,1,mv)
165    c_in(0,1,1,1) = c_in(0,1,1,1) + klw_l(0,1,mv,1,1,nv)*pop(0,1,mv)
166     
167    c_out(1,0,0,0) = c_out(1,0,0,0) - klw_l(1,0,nv,0,0,mv)*pop(1,0,nv)
168    c_out(1,0,0,1) = c_out(1,0,0,1) - klw_l(1,0,nv,0,1,mv)*pop(1,0,nv)
169    c_out(1,1,0,0) = c_out(1,1,0,0) - klw_l(1,1,nv,0,0,mv)*pop(1,1,nv)
170    c_out(1,1,0,1) = c_out(1,1,0,1) - klw_l(1,1,nv,0,1,mv)*pop(1,1,nv)
171end do
172end do
173 
174!!!!    Output
175write (*,*) time, voltage, current*243.4d0
176write (40,*) time, voltage, current*243.4d0
177 
178end do


这时候代码是可以正确运行的, 但是我想取若干个:
[Fortran] 纯文本查看 复制代码
1voltage = voltage_give

所以我把这行改成了:
voltage = voltage_min
然后 Output 的前一行加上:
[Fortran] 纯文本查看 复制代码
1if (num_voltage > 0) then      voltage = voltage + (voltage_max - voltage_min)/num_voltageend if

再然后, 末尾再加一个:
[Fortran] 纯文本查看 复制代码

编译没错, 但是, 但是并不是每个 time 数值都做一个voltage的循环, 而是同时作循环:
[Fortran] 纯文本查看 复制代码
01  1.000000000000000E-002   40.0000000000000       1.988160357654218E-016
02  2.000000000000000E-002   80.0000000000000       1.364425784870382E-004
03  3.000000000000000E-002   120.000000000000       1.370837425057141E-004
04  4.000000000000000E-002   160.000000000000       2.083606552928942E-004
05  5.000000000000000E-002   200.000000000000       3.832251385343335E-004
06  6.000000000000000E-002   240.000000000000       3.846367630381155E-004
07  7.000000000000001E-002   280.000000000000       4.131201522155061E-004
08  8.000000000000000E-002   320.000000000000       5.825466767173463E-004
09  9.000000000000000E-002   360.000000000000       5.852940467602035E-004
10  0.100000000000000        400.000000000000       5.948948519956353E-004
11  0.110000000000000        440.000000000000       7.259287371840456E-004
12  0.120000000000000        480.000000000000       7.304897383455301E-004
13…… 
14   38.1800000000010        2000.00000000000        74.8222446587716    
159


按理说应该是第一列先都是 1.000000000000000E-002 第二列从 00.0000000000000 每隔 40 数到 2000.000000000000   
然后第一列变成 2.000000000000000E-002 第二列重新从 00.0000000000000 每隔 40 数到 2000.000000000000   
……


近期是论文dead_line, 心态简直好到爆炸! T.T

最后感谢大家的帮助!


MyTpye.f90

556 Bytes, 下载次数: 7

源文件1

Loading.f90

26.14 KB, 下载次数: 5

源文件3

Params.f90

5.96 KB, 下载次数: 4

源文件2

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

63

帖子

9

主题

0

精华

专家

超凡脱俗

F 币
474 元
贡献
237 点
沙发
发表于 2017-2-16 12:22:32 | 只看该作者
你可以吧这部分voltage 循环改成子程序,然后让这个子程序对time进行循环调用,输出结果,time作为参数每次传入一个数值
天下英雄出我辈,一入江湖岁月催。

鸿图霸业谈笑间,不胜人生一场醉。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-6 11:09

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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