⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp-sang.f90

📁 一个数值计算程序的OpenMP的并行化代码
💻 F90
📖 第 1 页 / 共 2 页
字号:
   adh2=ckh(i,j,k)*(v(i-1,j,k)+v(i+1,j,k)+v(i,j-1,k)+v(i,j+1,k)-4.*v(i,j,k))/dd/dd*step
   adh3=ckh(i,j,k)*(q(i-1,j,k)+q(i+1,j,k)+q(i,j-1,k)+q(i,j+1,k)-4.*q(i,j,k))/dd/dd*step  
   adh4=ckh(i,j,k)*(t(i-1,j,k)+t(i+1,j,k)+t(i,j-1,k)+t(i,j+1,k)-4.*t(i,j,k))/dd/dd*step  
        
   adv1=(ckz(i,j,k+1)*(u(i,j,k+1)-u(i,j,k))/(z(k+1)-z(k))-ckz(i,j,k)*(u(i,j,k)-u(i,j,k-1))/(z(k)-z(k-1)))/(z(k+1)-z(k-1))*(s/(s-zg(i,j)))**2*step
   adv2=(ckz(i,j,k+1)*(v(i,j,k+1)-v(i,j,k))/(z(k+1)-z(k))-ckz(i,j,k)*(v(i,j,k)-v(i,j,k-1))/(z(k)-z(k-1)))/(z(k+1)-z(k-1))*(s/(s-zg(i,j)))**2*step
   adv3=(cke(i,j,k+1)*(q(i,j,k+1)-q(i,j,k))/(z(k+1)-z(k))-cke(i,j,k)*(q(i,j,k)-q(i,j,k-1))/(z(k)-z(k-1)))/(z(k+1)-z(k-1))*(s/(s-zg(i,j)))**2*step
   adv4=(ckt(i,j,k+1)*(t(i,j,k+1)-t(i,j,k))/(z(k+1)-z(k))-ckt(i,j,k)*(t(i,j,k)-t(i,j,k-1))/(z(k)-z(k-1)))/(z(k+1)-z(k-1))*(s/(s-zg(i,j)))**2*step
  
   u(i,j,k)=u(i,j,k)+adh1+adv1
   v(i,j,k)=v(i,j,k)+adh2+adv2
   q(i,j,k)=q(i,j,k)+adh3+adv3
   t(i,j,k)=t(i,j,k)+adh4+adv4
enddo
enddo
enddo
!$OMP END DO NOWAIT

!SETP 14 U V smoothing
!call smooth(u,l,m,n,aa22,bb22)
!call smooth(v,l,m,n,aa22,bb22)


!$OMP DO PRIVATE(i,j,k)
do k=2,nn
do j=2,mm
do i=2,ll
   u(i,j,k)=aa22*u(i,j,k)+bb22*(u(i+1,j,k)+u(i-1,j,k)+u(i,j+1,k)+u(i,j-1,k))
   v(i,j,k)=aa22*v(i,j,k)+bb22*(v(i+1,j,k)+v(i-1,j,k)+v(i,j+1,k)+v(i,j-1,k))
enddo
enddo
enddo
!$OMP END DO NOWAIT

!$OMP END PARALLEL


WRITE(*,"(5F10.4,I6)")U(10,10,2),V(10,10,2),W(10,10,4),T(10,10,3),p(10,10,3),mk
!WRITE(*,"(6F10.4)")QK(10,10),QR(10,10),SHEAT(10,10),LHEAT(10,10),TSOIL(10,10),TT
WRITE(*,"(4F10.4)")CKZ(10,10,2),CKH(10,10,2),Q(10,10,2)
write(*,"(4f10.4)")qk(10,10),qr(10,10),qh(10,10),qe(10,10)



!!!!一次积分完成,得到新的u,v,w,t,p,q,积分步数增加1,返回55,再次积分
mk=mk+1


goto 55

1994	stop

end

!  sub top                              
!  This program is for dealing with absorbing layer in the five highest grid points near the top of the model                            
subroutine top (a,l,m,n)
dimension a(l,m,n)
do k=n-4,n
   tk=k
do j=1,m
do i=1,l
   a(i,j,k)=a(i,j,k)-(a(i,j,k)-a(1,1,k))*(tk-16.)/4.
enddo
enddo
enddo
return
end 

!  sub  pp                          
!  This program is for calculating pressure gradient force term     

subroutine pp(u,v,p,t,zg,z,dd,s,step,l,m,n)
dimension u(l,m,n),v(l,m,n),t(l,m,n),p(l,m,n),z(n),zg(l,m)

do k=2,kk
do j=2,mm
do i=2,ll
   u(i,j,k)=u(i,j,k)-(p(i,j,k)-p(i-1,j,k))/dd*step*0.5*(t(i,j,k)+t(i-1,j,k))+(zg(i,j)-zg(i-1,j))/dd*9.8*(z(k)-s)/s*step
   v(i,j,k)=v(i,j,k)-(p(i,j,k)-p(i,j-1,k))/dd*step*0.5*(t(i,j,k)+t(i,j-1,k))+(zg(i,j)-zg(i,j-1))/dd*9.8*(z(k)-s)/s*step
enddo
enddo
enddo
return
end

!  sub  advuu                         
!  this program is for calculating advective terms of momentum  u,v   
subroutine advuu(u,v,w,z,dd,step,l,m,n)
dimension u(l,m,n),v(l,m,n),w(l,m,n),z(n)



do 1 k=2,kk
dz1=z(k+1)-z(k)
dz=z(k)-z(k-1)
do 1 j=2,mm     
do 1 i=2,ll
vv=0.25*(v(i-1,j,k)+v(i-1,j+1,k)+v(i,j,k)+v(i,j+1,k))

if(vv.ge.0.)  then
    u(i,j,k)=u(i,j,k)-vv*(u(i,j,k)-u(i,j-1,k))/dd*step
else
    u(i,j,k)=u(i,j,k)-vv*(u(i,j+1,k)-u(i,j,k))/dd*step
endif

if(u(i,j,k).ge.0.) then
    u(i,j,k)=u(i,j,k)-u(i,j,k)*(u(i,j,k)-u(i-1,j,k))/dd*step
else
    u(i,j,k)=u(i,j,k)-u(i,j,k)*(u(i+1,j,k)-u(i,j,k))/dd*step
endif  

ww=.25*(w(i-1,j,k)+w(i,j,k)+w(i-1,j,k+1)+w(i,j,k+1))

if(ww.ge.0.) then
    u(i,j,k)=u(i,j,k)-ww*(u(i,j,k)-u(i,j,k-1))/dz*step
else
    u(i,j,k)=u(i,j,k)-ww*(u(i,j,k+1)-u(i,j,k))/dz1*step
endif

tt=tt
uu=.25*(u(i,j-1,k)+u(i+1,j-1,k)+u(i,j,k)+u(i+1,j,k))

if(uu.ge.0.) then
    v(i,j,k)=v(i,j,k)-uu*(v(i,j,k)-v(i-1,j,k))/dd*step
else
    v(i,j,k)=v(i,j,k)-uu*(v(i+1,j,k)-v(i,j,k))/dd*step
endif

if(v(i,j,k).ge.0.) then
    v(i,j,k)=v(i,j,k)-v(i,j,k)*(v(i,j,k)-v(i,j-1,k))/dd*step
else
    v(i,j,k)=v(i,j,k)-v(i,j,k)*(v(i,j+1,k)-v(i,j,k))/dd*step
endif

ww=.25*(w(i,j-1,k)+w(i,j,k)+w(i,j-1,k+1)+w(i,j,k+1))

if(ww.ge.0.) then
    v(i,j,k)=v(i,j,k)-ww*(v(i,j,k)-v(i,j,k-1))/dz*step
else
    v(i,j,k)=v(i,j,k)-ww*(v(i,j,k+1)-v(i,j,k))/dz1*step
endif

1     continue
return
end



!  sub adv
!  this program is for caculating advective terms  of scalar variables          
subroutine adv(u,v,w,a,z,dd,step,l,m,n)
dimension u(l,m,n),v(l,m,n),w(l,m,n),a(l,m,n),z(n)

do 1 k=2,nn
dz=z(k)-z(k-1)
dz1=z(k+1)-z(k)
do 1 j=2,mm
do 1 i=2,ll

uu=.5*(u(i,j,k)+u(i+1,j,k))
vv=.5*(v(i,j,k)+v(i,j+1,k))
ww=.5*(w(i,j,k)+w(i,j,k+1))
if (uu.ge.0.) then 
    a(i,j,k)=a(i,j,k)-uu*(a(i,j,k)-a(i-1,j,k))/dd*step
else
    a(i,j,k)=a(i,j,k)-uu*(a(i+1,j,k)-a(i,j,k))/dd*step
endif

if(vv.ge.0.) then 
    a(i,j,k)=a(i,j,k)-vv*(a(i,j,k)-a(i,j-1,k))/dd*step
else
    a(i,j,k)=a(i,j,k)-vv*(a(i,j+1,k)-a(i,j,k))/dd*step
endif

if(ww.ge.0.) then 
    a(i,j,k)=a(i,j,k)-ww*(a(i,j,k)-a(i,j,k-1))/dz*step
else
    a(i,j,k)=a(i,j,k)-ww*(a(i,j,k+1)-a(i,j,k))/dz1*step
endif 

1     continue
return  
end


!  sub smooth                     
!  this progam  is used to smooth calculation noise caused by diference schemes      
subroutine smooth(a,l,m,n,aa11,bb11)
dimension a(l,m,n)

do k=2,nn
do j=2,mm
do i=2,ll
   a(i,j,k)=aa11*a(i,j,k)+bb11*(a(i+1,j,k)+a(i-1,j,k)+a(i,j+1,k)+a(i,j-1,k))
enddo
enddo
enddo
return
end


!  sub verti                        
!  this program is for calculating continuity equation      
subroutine verti(u,v,w,dd,step,s,z,zg,l,m,n,ll,mm,kk)
dimension u(l,m,n),v(l,m,n),w(l,m,n),z(n),zg(l,m)
do k=2,kk
do j=2,mm
do i=2,ll
w(i,j,k)=w(i,j,k-1)-(u(i+1,j,k-1)-u(i,j,k-1)+v(i,j+1,k-1)-v(i,j,k-1))/dd*(z(k)-z(k-1))+.5*((u(i+1,j,k-1)+u(i,j,k-1))*(zg(i+1,j)-zg(i-1,j))+(v(i,j+1,k-1)+v(i,j,k-1))*(zg(i,j+1)-zg(i,j-1)))/dd/2.*(z(k)-z(k-1))/(s-zg(i,j))
enddo
enddo
enddo
return
end

!  sub diff                         
!  this program is for calculating diffusion terms             
subroutine diff(ck,ckh,z,zg,dd,step,s,l,m,n,a)
dimension a(l,m,n),z(n),zg(l,m),ck(l,m,n),ckh(l,m,n)


!$OMP PARALLEL 
!$OMP DO PRIVATE(i,j,k)
do k=2,nn
do j=2,mm
do i=2,ll
   adh=ckh(i,j,k)*(a(i-1,j,k)+a(i+1,j,k)+a(i,j-1,k)+a(i,j+1,k)-4.*a(i,j,k))/dd/dd*step
   adv=(ck(i,j,k+1)*(a(i,j,k+1)-a(i,j,k))/(z(k+1)-z(k))-ck(i,j,k)*(a(i,j,k)-a(i,j,k-1))/(z(k)-z(k-1)))/(z(k+1)-z(k-1))*(s/(s-zg(i,j)))**2*step
   a(i,j,k)=a(i,j,k)+adh+adv
enddo
enddo
enddo
!$OMP END DO NOWAIT
!$OMP END PARALLEL

return 
end

!  sub bound                             
!  this program is for dealing with the lateral boundaries         
subroutine bound(a,u,v,l,m,n)
dimension a(l,m,n),u(l,m,n),v(l,m,n)
do 1 k=2,n
do 1 j=1,m
if(u(1,j,k).le.0.) then
    a(1,j,k)=a(2,j,k)
else
    a(l,j,k)=a(l-1,j,k)
endif
1   continue


do 3 k=2,n
do 3 i=1,l
if(v(i,2,k).lt.0.) then
    a(i,1,k)=a(i,2,k)
elseif(v(i,m-1,k).gt.0.) then
    a(i,m,k)=a(i,m-1,k)
endif
3   continue
return
end



! calculating turbulence energy      
subroutine turbu(q,ckz,ckt,cke,u,v,t,z,step,l,m,n,tm,s,zg)
dimension  q(l,m,n),ckz(l,m,n),u(l,m,n),v(l,m,n),t(l,m,n),zg(l,m)
dimension  ckt(l,m,n),cke(l,m,n)
dimension  z(n)
al8=35.


!$OMP PARALLEL
!$OMP DO PRIVATE(i,j,k,dz,ri,rif,sm,alf,all,ti,tk)
do 1 k=2,n-1
dz=z(k+1)-z(k-1)

do 1 j=1,m
do 1 i=1,l
if(u(i,j,k+1).eq.u(i,j,k-1)) goto 10
ri=9.8/t(i,j,k)*(t(i,j,k+1)-t(i,j,k-1))*dz/((u(i,j,k+1)-u(i,j,k-1))**2+(v(i,j,k+1)-v(i,j,k-1))**2)
if(ri.ge.0.195) goto 10
rif=.6588*(ri+.1776-(ri*ri-.3221*ri+.03156)**.5)  
goto 11
10  rif=.191
11  if(rif.ge.0.16) then
sm=.085
alf=1.25
else
sm=1.96*(.1912-rif)*(.2341-rif)/(1.-rif)/(.2331-rif)
alf=1.318*(.2331-rif)/(.2341-rif)
end if
all=.4*z(k)/(1.+.4*z(k)/al8)
ti=i
tk=k
!if(q(i,j,k).le.0.) then
if(q(i,j,k).le.0.00001) then
q(i,j,k)=.01
else
q(i,j,k)=q(i,j,k)+ckz(i,j,k)*(((u(i,j,k+1)-u(i,j,k-1))/dz)**2+((v(i,j,k+1)-v(i,j,k-1))/dz)**2)*step*(s/(s-zg(i,j)))**2-(s/(s-zg(i,j)))*alf*ckt(i,j,k)*9.8/t(i,j,k)*(t(i,j,k+1)-t(i,j,k-1))/dz*step*0.5-(2*q(i,j,k))**1.5/10.6/all*step
end if
! if(q(i,j,k).le.0.00001) q(i,j,k)=0.01
ckz(i,j,k)=sm*all*(2*q(i,j,k))**.5
cke(i,j,k)=.2*all*(2*q(i,j,k))**.5
ckt(i,j,k)=ckz(i,j,k)*alf
!if(i.ne.12.or.k.ne.3) goto 1
1   continue
!$OMP END DO NOWAIT
!$OMP END PARALLEL

!  up and down boundery conditions
do j=1,m
do i=1,l
ckt(i,j,n)=ckt(i,j,n-1)
enddo
enddo

return
end

subroutine interface(qk,qr,qh,qe,u2,t1,t2,r2,ct,z0,alf,z2,step,qa,tm,tem,rstar,hu,soil,water,grass,trees,tsoil,i,j)

parameter(as=0.2,taus=0.9	,b = 9.4,pai=3.1416,rs=40.,laitre=3.,laigra=2.,pa=11.,fai=32.5/180.*3.1416)

s0 = 1353!

delta=-23.5*3.1416/180*cos(2*3.1416*(173+16)/365.)


!	richardson number
ri = 9.8 / t2 * z2 * (t2 - t1) / u2 / u2
a2=0.16/(log(z2/z0))**2
c=7.4*a2*9.4*(z2/z0)**.5
if(ri.le.0.) then
fm=1.-9.4*ri/(1.+c*(abs(ri))**.5)
else
fm=1./(1.+4.7*ri)**2
endif
us=(a2)**0.5*u2*fm**.5
c=5.3*a2*b*(z2/z0)**0.5
if(ri.le.0.) then
fh=1.-b*ri/(1.+c*(abs(ri))**0.5)
else
fh=fm
endif

qh = a2/.74*u2*(t2-t1)*fh
conduc=a2/0.74*u2*fh

ra=1./conduc

	 
qe =conduc*water*(r2-rstar)+grass*(r2-rstar)/(ra+rs/laigra)+trees*(r2-rstar)/(ra+rs/laitre)
if(r2.le.hu*rstar) then
qe=qe+conduc*soil*(r2-rstar)
else
endif
ts=qh/us
if(ts.eq.0.) then
al=-100!
else
al=t2*us*us/9.8/ts/.4
end if
qh=1.29*1005.*qh
qe=1.29*2500000.*qe


ea=1.24*(pa/t2)**.14
qr=(ea*t2**4-0.95*t1**4)*5.67/10.**8
tk=tm
h=3.1416*(12.-tk)/12.  !Sang orig
!h=(tk-12)*15.*3.1416/180.


!delta=0.409*cos(2.*3.1416*(180.-173.)/365.) !Sang orig

csz=sin(fai)*sin(delta)+cos(fai)*cos(delta)*cos(h)
!qk=(1.-alf)*s0*csz*taus**(1./csz) !Sang orig
if(csz.ge.0.000001) then
!qk=s0*csz*(1-5*(0.28/(1-6.43*csz)))*(1.-alf) !xujm
qk=(1.-alf)*s0*csz*taus**(1./csz)
else
qk=0.
endif
t1=t1+ct*(qk+qr+qh+qe+qa)*step-2.*pai/24./3600.*(t1-tsoil)*step
if(i.eq.10 .and. j.eq.10) then
!write(*,*)"qk=",qk,"t1=",t1,"tk=",tk
endif
tsoil=tsoil+(t1-tsoil)/24./3600.*step
return
end

subroutine landclas(ct,alf,z0,zg,bldmean,soil,water,grass,trees,l,m)
dimension ct(l,m),alf(l,m),z0(l,m),zg(l,m),bldmean(l,m)
dimension soil(l,m),water(l,m),grass(l,m),trees(l,m)
!dimension landuse_orig(400,223,271)

integer l,m
do j=1,m
do i=1,l
   num_water=10
   num_busin=100
   num_inhab=100
   num_trans=90
   num_green=40
   num_garden=40
   num_farm=20
   num_orch=0
   num_tree=0
   num_beach=0
   num_lack=0
   
   alf(i,j)=(0.09*num_water+0.10*num_busin+0.12*num_inhab+0.2*num_green+0.19*num_garden+0.19*num_farm+0.18*num_orch+0.18*num_tree+0.16*num_beach)/(400-num_lack)
   z0(i,j)=(0.001*num_water+2.5*num_busin+2*num_inhab+0.5*num_green+0.5*num_garden+0.1*num_farm+0.1*num_orch+3.*num_tree+0.005*num_beach)/(400-num_lack)
   zg(i,j)=(0.2*num_water+3.5*num_busin+3.5*num_inhab+3.5*num_green+3.5*num_garden+4.*num_farm+3.5*num_orch+3.5*num_tree+1.*num_beach)/(400-num_lack)
   ct(i,j)=(0.08*num_water+0.35*num_busin+0.3*num_inhab+0.2*num_green+0.16*num_garden+0.12*num_farm+0.13*num_orch+0.12*num_tree+0.14*num_beach)/100000/(400-num_lack)
   bldmean(i,j)=(0.0*num_water+18.*num_busin+15.*num_inhab+0.0*num_green+1.*num_garden+1.*num_farm+0.*num_orch+0.*num_tree+0.*num_beach)/(400-num_lack)
   water(i,j)=(1.0*num_water+0.*num_busin+0.*num_inhab+0.*num_green+0.*num_garden+0.*num_farm+0.*num_orch+0.*num_tree+0.4*num_beach)/(400-num_lack)
   trees(i,j)=(0.*num_water+0.1*num_busin+0.2*num_inhab+0.3*num_green+0.5*num_garden+0.*num_farm+1.*num_orch+1.*num_tree+0.*num_beach)/(400-num_lack)
   grass(i,j)=(0.*num_water+0.1*num_busin+0.2*num_inhab+1.*num_green+0.8*num_garden+0.3*num_farm+0.3*num_orch+0.*num_tree+0.*num_beach)/(400-num_lack)
   soil(i,j)=(0.*num_water+0.9*num_busin+0.6*num_inhab+0.*num_green+0.2*num_garden+0.8*num_farm+0.*num_orch+0.*num_tree+0.5*num_beach)/(400-num_lack)

enddo
enddo

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -