| 查看: 775 | 回复: 0 | ||
rlafite木虫 (正式写手)
|
[求助]
这段F90代码如何用OpenMP并行运算?
|
|
这段代码如何用openmp并行运算?(附件是全模块) 并保证不溢出16gb内存 全套程序下载地址如下: http://www.atomic-theory.uni-jen ... ange/ratip-2012.tgz subroutine auger_calculate_amplitudes() !-------------------------------------------------------------------- ! calculates for all transitions in turn the required continuum ! spinors and auger amplitudes. ! ! calls: add_csf_to_basis(), anco_calculate_csf_matrix(), ! auger_channel_amplitude(), auger_pure_matrix(), ! auger_transition_properties() cowf_iterate_csp(), ! cowf_set_xk_coefficients(), cowf_set_yk_coefficients(), ! print_configuration_scheme() ! set_configuration_scheme(). !-------------------------------------------------------------------- ! integer :: i, j, n, nw, nocsf real(kind=dp) :: energy type(nkappa) :: subshell integer, dimension( , allocatable :: ndx! n = asf_final%csf_set%nocsf + asf_initial%csf_set%nocsf ! ! allocate for a "first time"; it is first dellocated before any usage allocate( auger_csp%p(1:n_grasp92), auger_csp%q(1:n_grasp92) ) allocate( cowf_csp%p(1:10), cowf_csp%q(1:10) ) allocate( ndx(1:n) ) do i = 1,number_of_transitions if (transition(i)%energy < zero) then transition(i)%probability = zero transition(i)%alpha_2 = zero transition(i)%alpha_4 = zero transition(i)%eta_2 = zero transition(i)%eta_4 = zero cycle end if ! do j = 1,transition(i)%number_of_channels energy = transition(i)%energy !!x print *, "auger_calculate_amplitudes - a" call set_configuration_scheme(asf_final%csf_set,asf_cont%csf_set,& -1,transition(i)%channel(j)%kappa, & transition(i)%totalj_f,transition(i)%parity_f, & transition(i)%totalj_i,transition(i)%parity_i, & append=.false.,index=ndx) ! auger%no_f = asf_cont%csf_set%nocsf allocate( auger%ndx_f(auger%no_f) ) auger%ndx_f(1:auger%no_f) = ndx(1:auger%no_f) ! nw = asf_cont%csf_set%nwshells if (rabs_use_stop .and. nw /= asf_final%csf_set%nwshells + 1) then stop "auger_calculate_amplitudes(): program stop a." end if ! calculate the mcp coefficients for the current coupling scheme ! as well as the d_rs, y_k(ab), and x_k(abcd) coefficients nocsf = asf_cont%csf_set%nocsf call anco_calculate_csf_matrix(asf_cont%csf_set,1,nocsf,1,nocsf) call cowf_set_drs_coefficients(transition(i)%asff, & asf_cont%csf_set,ndx) subshell = nkappa(-1,transition(i)%channel(j)%kappa) call cowf_set_yk_coefficients(subshell,asf_cont%csf_set) !!x print *, "auger_calculate_amplitudes - f" call cowf_set_xk_coefficients(subshell,asf_cont%csf_set) !!x print *, "auger_calculate_amplitudes - g" ! ! now iterate the continuum spinors for this channel ! cowf_solve_homogeneous_eqn = .true. cowf_start_homogeneous = .true. cowf_phaseshift_wkb = .true. cowf_phaseshift_zero_potential = .false. cowf_phaseshift_coulomb = .false. ! !! cowf_norm_nonrel = .true. cowf_norm_wkb = .true. call cowf_iterate_csp(energy,subshell) ! auger_csp = cowf_csp transition(i)%channel(j)%phase = auger_csp%phase ! ! define the 'extended' configuration scheme for calculating ! the auger matrix and allocate memory call add_csf_to_basis(asf_initial%csf_set,asf_cont%csf_set, & transition(i)%totalj_i,transition(i)%parity_i,index=ndx) if (auger_print_csf_scheme) then call print_configuration_scheme(6,asf_cont%csf_set) end if ! auger%no_i = asf_cont%csf_set%nocsf - auger%no_f allocate( auger%ndx_i(auger%no_i) ) auger%ndx_i(1:auger%no_i) = ndx(1+auger%no_f:asf_cont%csf_set%nocsf) allocate( auger%matrix(1:auger%no_f,1:auger%no_i) ) ! ! calculate the 'pure' auger matrix in the given csf scheme ! (not including mixing coefficients) call auger_pure_matrix(asf_cont%csf_set,i) ! call auger_channel_amplitude(i,j) ! deallocate( auger%ndx_f, auger%ndx_i, auger%matrix ) call deallocate_csf_basis(asf_cont%csf_set) end do ! ! calculates all selected properties for the selected transition call auger_transition_properties(transition(i)) end do deallocate( ndx, auger_csp%p, auger_csp%q) ! end subroutine auger_calculate_amplitudes ! ! subroutine auger_channel_amplitude(i,j) !-------------------------------------------------------------------- ! calculates the auger amplitude of channel j of transition i ! by summing over the 'pure' auger matrix using the proper weights of ! transition i. ! ! calls: !-------------------------------------------------------------------- ! integer, intent(in) :: i, j ! integer :: asfi, asff, l, r, rr, s, ss real(kind=dp) :: phase, value ! if (auger_print_main_csf_me) then print *, " " print *, "main contribution from initial- and final-state csf "// & "(abs(c_i*c_f) > 0.01)" print *, "----------------------------------------------------"// & "---------------------" print *, " " print *, " i-csf f-csf kappa c_i c_f c_i*c_f"//& " c_i*c_f*a_if " print *, "-------------------------------------------------------"//& "-----------------" end if ! asfi = transition(i)%asfi; asff = transition(i)%asff value = zero do r = 1,auger%no_f rr = auger%ndx_f(r) do s = 1,auger%no_i ss = auger%ndx_i(s) value = value + asf_final%asf(asff)%eigenvector(rr) * & auger%matrix(r,s) * asf_initial%asf(asfi)%eigenvector(ss) ! if (auger_print_main_csf_me) then if (abs(asf_final%asf(asff)%eigenvector(rr)* & asf_initial%asf(asfi)%eigenvector(ss)) > 0.01_dp .and.& abs(asf_final%asf(asff)%eigenvector(rr) * & auger%matrix(r,s) * & asf_initial%asf(asfi)%eigenvector(ss)) > 0.000001_dp) then ! ! determine first the radial integrals from the occupation ! of the csf write(*,1) ss,rr, & orbital_symmetry(transition(i)%channel(j)%kappa), & asf_initial%asf(asfi)%eigenvector(ss), & asf_final%asf(asff)%eigenvector(rr), & asf_final%asf(asff)%eigenvector(rr)* & asf_initial%asf(asfi)%eigenvector(ss), & asf_final%asf(asff)%eigenvector(rr)* & asf_initial%asf(asfi)%eigenvector(ss)* & auger%matrix(r,s) 1 format(1x,i7,i10,6x,a2,3x,f6.3,2x,f6.3,5x,f8.5,4x,f9.6) end if end if ! end do end do ! if (auger_print_main_csf_me) then print *, "-------------------------------------------------------"//& "-----------------" end if ! l = angular_momentum_l(transition(i)%channel(j)%kappa) phase = transition(i)%channel(j)%phase ! transition(i)%channel(j)%amplitude_re = value transition(i)%channel(j)%amplitude = cmplx(zero,one)**l * & exp( -cmplx(zero,one)*phase) * cmplx(value,zero) ! print *, "i,j,transition(i)%channel(j)%amplitude = ", & i,j,transition(i)%channel(j)%amplitude ! end subroutine auger_channel_amplitude ! |
» 本帖附件资源列表
-
欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com - 附件 1 : rabs_auger.f90
2019-05-04 05:23:07, 86.51 K
» 猜你喜欢
职称评审没过,求安慰
已经有42人回复
回收溶剂求助
已经有7人回复
硝基苯如何除去
已经有3人回复
A期刊撤稿
已经有4人回复
垃圾破二本职称评审标准
已经有17人回复
投稿Elsevier的Neoplasia杂志,到最后选publishing options时页面空白,不能完成投稿
已经有22人回复
EST投稿状态问题
已经有7人回复
毕业后当辅导员了,天天各种学生超烦
已经有4人回复
求助文献
已经有3人回复
三无产品还有机会吗
已经有6人回复













, allocatable :: ndx
回复此楼