PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/share/sint.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 380 lines | 313 code | 30 blank | 37 comment | 4 complexity | fb637ba76b82574f4ef2f1ecdb5ed3e8 MD5 | raw file
Possible License(s): AGPL-1.0
  1. SUBROUTINE SINT(XF, &
  2. ims, ime, jms, jme, icmask , &
  3. its, ite, jts, jte, nf, xstag, ystag )
  4. IMPLICIT NONE
  5. INTEGER ims, ime, jms, jme, &
  6. its, ite, jts, jte
  7. LOGICAL icmask( ims:ime, jms:jme )
  8. LOGICAL xstag, ystag
  9. INTEGER nf, ior
  10. REAL one12, one24, ep
  11. PARAMETER(one12=1./12.,one24=1./24.)
  12. PARAMETER(ior=2)
  13. !
  14. REAL XF(ims:ime,jms:jme,NF)
  15. !
  16. REAL Y(ims:ime,jms:jme,-IOR:IOR), &
  17. Z(ims:ime,jms:jme,-IOR:IOR), &
  18. F(ims:ime,jms:jme,0:1)
  19. !
  20. INTEGER I,J,II,JJ,IIM
  21. INTEGER N2STAR, N2END, N1STAR, N1END
  22. !
  23. DATA EP/ 1.E-10/
  24. REAL W(ims:ime,jms:jme),OV(ims:ime,jms:jme),UN(ims:ime,jms:jme)
  25. REAL MXM(ims:ime,jms:jme),MN(ims:ime,jms:jme)
  26. REAL FL(ims:ime,jms:jme,0:1)
  27. REAL XIG(NF*NF), XJG(NF*NF) ! NF is parent to child grid refinement ratio
  28. integer rr
  29. REAL rioff, rjoff
  30. !
  31. REAL donor, y1, y2, a
  32. DONOR(Y1,Y2,A)=(Y1*AMAX1(0.,SIGN(1.,A))-Y2*AMIN1(0.,SIGN(1.,A)))*A
  33. REAL tr4, ym1, y0, yp1, yp2
  34. TR4(YM1,Y0,YP1,YP2,A)=A*ONE12*(7.*(YP1+Y0)-(YP2+YM1)) &
  35. -A*A*ONE24*(15.*(YP1-Y0)-(YP2-YM1))-A*A*A*ONE12*((YP1+Y0) &
  36. -(YP2+YM1))+A*A*A*A*ONE24*(3.*(YP1-Y0)-(YP2-YM1))
  37. REAL pp, pn, x
  38. PP(X)=AMAX1(0.,X)
  39. PN(X)=AMIN1(0.,X)
  40. rr = nint(sqrt(float(nf)))
  41. !! write(6,*) ' nf, rr are ',nf,rr
  42. rioff = 0
  43. rjoff = 0
  44. if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
  45. if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
  46. DO I=1,rr
  47. DO J=1,rr
  48. XIG(J+(I-1)*rr)=(float(rr)-1.-rioff)/float(2*rr)-FLOAT(J-1)*1./float(rr)
  49. XJG(J+(I-1)*rr)=(float(rr)-1.-rjoff)/float(2*rr)-FLOAT(I-1)*1./float(rr)
  50. ENDDO
  51. ENDDO
  52. N2STAR = jts
  53. N2END = jte
  54. N1STAR = its
  55. N1END = ite
  56. DO 2000 IIM=1,NF
  57. !
  58. ! HERE STARTS RESIDUAL ADVECTION
  59. !
  60. DO 9000 JJ=N2STAR,N2END
  61. DO 50 J=-IOR,IOR
  62. DO 51 I=-IOR,IOR
  63. DO 511 II=N1STAR,N1END
  64. IF ( icmask(II,JJ) ) Y(II,JJ,I)=XF(II+I,JJ+J,IIM)
  65. 511 CONTINUE
  66. 51 CONTINUE
  67. DO 811 II=N1STAR,N1END
  68. IF ( icmask(II,JJ) ) THEN
  69. FL(II,JJ,0)=DONOR(Y(II,JJ,-1),Y(II,JJ,0),XIG(IIM))
  70. FL(II,JJ,1)=DONOR(Y(II,JJ,0),Y(II,JJ,1),XIG(IIM))
  71. ENDIF
  72. 811 CONTINUE
  73. DO 812 II=N1STAR,N1END
  74. IF ( icmask(II,JJ) ) W(II,JJ)=Y(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
  75. 812 CONTINUE
  76. DO 813 II=N1STAR,N1END
  77. IF ( icmask(II,JJ) ) THEN
  78. MXM(II,JJ)= &
  79. AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1), &
  80. W(II,JJ))
  81. MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ))
  82. ENDIF
  83. 813 CONTINUE
  84. DO 312 II=N1STAR,N1END
  85. IF ( icmask(II,JJ) ) THEN
  86. F(II,JJ,0)= &
  87. TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0), &
  88. Y(II,JJ,1),XIG(IIM))
  89. F(II,JJ,1)= &
  90. TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
  91. XIG(IIM))
  92. ENDIF
  93. 312 CONTINUE
  94. DO 822 II=N1STAR,N1END
  95. IF ( icmask(II,JJ) ) THEN
  96. F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
  97. F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
  98. ENDIF
  99. 822 CONTINUE
  100. DO 823 II=N1STAR,N1END
  101. IF ( icmask(II,JJ) ) THEN
  102. OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
  103. PP(F(II,JJ,0))+EP)
  104. UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))- &
  105. PN(F(II,JJ,0))+EP)
  106. ENDIF
  107. 823 CONTINUE
  108. DO 824 II=N1STAR,N1END
  109. IF ( icmask(II,JJ) ) THEN
  110. F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+ &
  111. PN(F(II,JJ,0))*AMIN1(1.,UN(II,JJ))
  112. F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+ &
  113. PN(F(II,JJ,1))*AMIN1(1.,OV(II,JJ))
  114. ENDIF
  115. 824 CONTINUE
  116. DO 825 II=N1STAR,N1END
  117. IF ( icmask(II,JJ) ) THEN
  118. Y(II,JJ,0)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
  119. ENDIF
  120. 825 CONTINUE
  121. DO 361 II=N1STAR,N1END
  122. IF ( icmask(II,JJ) ) Z(II,JJ,J)=Y(II,JJ,0)
  123. 361 CONTINUE
  124. !
  125. ! END IF FIRST J LOOP
  126. !
  127. 8000 CONTINUE
  128. 50 CONTINUE
  129. DO 911 II=N1STAR,N1END
  130. IF ( icmask(II,JJ) ) THEN
  131. FL(II,JJ,0)=DONOR(Z(II,JJ,-1),Z(II,JJ,0),XJG(IIM))
  132. FL(II,JJ,1)=DONOR(Z(II,JJ,0),Z(II,JJ,1),XJG(IIM))
  133. ENDIF
  134. 911 CONTINUE
  135. DO 912 II=N1STAR,N1END
  136. IF ( icmask(II,JJ) ) W(II,JJ)=Z(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
  137. 912 CONTINUE
  138. DO 913 II=N1STAR,N1END
  139. IF ( icmask(II,JJ) ) THEN
  140. MXM(II,JJ)=AMAX1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
  141. MN(II,JJ)=AMIN1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
  142. ENDIF
  143. 913 CONTINUE
  144. DO 412 II=N1STAR,N1END
  145. IF ( icmask(II,JJ) ) THEN
  146. F(II,JJ,0)= &
  147. TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
  148. ,XJG(IIM))
  149. F(II,JJ,1)= &
  150. TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2), &
  151. XJG(IIM))
  152. ENDIF
  153. 412 CONTINUE
  154. DO 922 II=N1STAR,N1END
  155. IF ( icmask(II,JJ) ) THEN
  156. F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
  157. F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
  158. ENDIF
  159. 922 CONTINUE
  160. DO 923 II=N1STAR,N1END
  161. IF ( icmask(II,JJ) ) THEN
  162. OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
  163. PP(F(II,JJ,0))+EP)
  164. UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
  165. EP)
  166. ENDIF
  167. 923 CONTINUE
  168. DO 924 II=N1STAR,N1END
  169. IF ( icmask(II,JJ) ) THEN
  170. F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+PN(F(II,JJ,0)) &
  171. *AMIN1(1.,UN(II,JJ))
  172. F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1)) &
  173. *AMIN1(1.,OV(II,JJ))
  174. ENDIF
  175. 924 CONTINUE
  176. 9000 CONTINUE
  177. DO 925 JJ=N2STAR,N2END
  178. DO 925 II=N1STAR,N1END
  179. IF ( icmask(II,JJ) ) XF(II,JJ,IIM)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
  180. 925 CONTINUE
  181. !
  182. 2000 CONTINUE
  183. RETURN
  184. END
  185. ! Version of sint that replaces mask with detailed ranges for avoiding boundaries
  186. ! may help performance by getting the conditionals out of innner loops
  187. SUBROUTINE SINTB(XF1, XF , &
  188. ims, ime, jms, jme, icmask , &
  189. its, ite, jts, jte, nf, xstag, ystag )
  190. IMPLICIT NONE
  191. INTEGER ims, ime, jms, jme, &
  192. its, ite, jts, jte
  193. LOGICAL icmask( ims:ime, jms:jme )
  194. LOGICAL xstag, ystag
  195. INTEGER nf, ior
  196. REAL one12, one24, ep
  197. PARAMETER(one12=1./12.,one24=1./24.)
  198. PARAMETER(ior=2)
  199. !
  200. REAL XF(ims:ime,jms:jme,NF)
  201. REAL XF1(ims:ime,jms:jme,NF)
  202. !
  203. REAL Y(ims:ime,jms:jme,-IOR:IOR), &
  204. Z(ims:ime,jms:jme,-IOR:IOR), &
  205. F(ims:ime,jms:jme,0:1)
  206. !
  207. INTEGER I,J,II,JJ,IIM
  208. INTEGER N2STAR, N2END, N1STAR, N1END
  209. !
  210. DATA EP/ 1.E-10/
  211. !
  212. ! PARAMETER(NONOS=1)
  213. ! PARAMETER(N1OS=N1*NONOS+1-NONOS,N2OS=N2*NONOS+1-NONOS)
  214. !
  215. REAL W(ims:ime,jms:jme),OV(ims:ime,jms:jme),UN(ims:ime,jms:jme)
  216. REAL MXM(ims:ime,jms:jme),MN(ims:ime,jms:jme)
  217. REAL FL(ims:ime,jms:jme,0:1)
  218. REAL XIG(NF*NF), XJG(NF*NF) ! NF is the parent to child grid refinement ratio
  219. integer rr
  220. REAL rioff, rjoff
  221. !
  222. REAL donor, y1, y2, a
  223. DONOR(Y1,Y2,A)=(Y1*AMAX1(0.,SIGN(1.,A))-Y2*AMIN1(0.,SIGN(1.,A)))*A
  224. REAL tr4, ym1, y0, yp1, yp2
  225. TR4(YM1,Y0,YP1,YP2,A)=A*ONE12*(7.*(YP1+Y0)-(YP2+YM1)) &
  226. -A*A*ONE24*(15.*(YP1-Y0)-(YP2-YM1))-A*A*A*ONE12*((YP1+Y0) &
  227. -(YP2+YM1))+A*A*A*A*ONE24*(3.*(YP1-Y0)-(YP2-YM1))
  228. REAL pp, pn, x
  229. PP(X)=AMAX1(0.,X)
  230. PN(X)=AMIN1(0.,X)
  231. rr = nint(sqrt(float(nf)))
  232. rioff = 0
  233. rjoff = 0
  234. if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
  235. if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
  236. DO I=1,rr
  237. DO J=1,rr
  238. XIG(J+(I-1)*rr)=(float(rr)-1.-rioff)/float(2*rr)-FLOAT(J-1)*1./float(rr)
  239. XJG(J+(I-1)*rr)=(float(rr)-1.-rjoff)/float(2*rr)-FLOAT(I-1)*1./float(rr)
  240. ENDDO
  241. ENDDO
  242. N2STAR = jts
  243. N2END = jte
  244. N1STAR = its
  245. N1END = ite
  246. DO 2000 IIM=1,NF
  247. !
  248. ! HERE STARTS RESIDUAL ADVECTION
  249. !
  250. DO 9000 JJ=N2STAR,N2END
  251. !cdir unroll=5
  252. DO 50 J=-IOR,IOR
  253. !cdir unroll=5
  254. DO 51 I=-IOR,IOR
  255. DO 511 II=N1STAR,N1END
  256. Y(II,JJ,I)=XF1(II+I,JJ+J,IIM)
  257. 511 CONTINUE
  258. 51 CONTINUE
  259. DO 811 II=N1STAR,N1END
  260. FL(II,JJ,0)=DONOR(Y(II,JJ,-1),Y(II,JJ,0),XIG(IIM))
  261. FL(II,JJ,1)=DONOR(Y(II,JJ,0),Y(II,JJ,1),XIG(IIM))
  262. 811 CONTINUE
  263. DO 812 II=N1STAR,N1END
  264. W(II,JJ)=Y(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
  265. 812 CONTINUE
  266. DO 813 II=N1STAR,N1END
  267. MXM(II,JJ)= &
  268. AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1), &
  269. W(II,JJ))
  270. MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ))
  271. 813 CONTINUE
  272. DO 312 II=N1STAR,N1END
  273. F(II,JJ,0)= &
  274. TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0), &
  275. Y(II,JJ,1),XIG(IIM))
  276. F(II,JJ,1)= &
  277. TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
  278. XIG(IIM))
  279. 312 CONTINUE
  280. DO 822 II=N1STAR,N1END
  281. F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
  282. F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
  283. 822 CONTINUE
  284. DO 823 II=N1STAR,N1END
  285. OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
  286. PP(F(II,JJ,0))+EP)
  287. UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))- &
  288. PN(F(II,JJ,0))+EP)
  289. 823 CONTINUE
  290. DO 824 II=N1STAR,N1END
  291. F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+ &
  292. PN(F(II,JJ,0))*AMIN1(1.,UN(II,JJ))
  293. F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+ &
  294. PN(F(II,JJ,1))*AMIN1(1.,OV(II,JJ))
  295. 824 CONTINUE
  296. DO 825 II=N1STAR,N1END
  297. Y(II,JJ,0)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
  298. 825 CONTINUE
  299. DO 361 II=N1STAR,N1END
  300. Z(II,JJ,J)=Y(II,JJ,0)
  301. 361 CONTINUE
  302. !
  303. ! END IF FIRST J LOOP
  304. !
  305. 8000 CONTINUE
  306. 50 CONTINUE
  307. DO 911 II=N1STAR,N1END
  308. FL(II,JJ,0)=DONOR(Z(II,JJ,-1),Z(II,JJ,0),XJG(IIM))
  309. FL(II,JJ,1)=DONOR(Z(II,JJ,0),Z(II,JJ,1),XJG(IIM))
  310. 911 CONTINUE
  311. DO 912 II=N1STAR,N1END
  312. W(II,JJ)=Z(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
  313. 912 CONTINUE
  314. DO 913 II=N1STAR,N1END
  315. MXM(II,JJ)=AMAX1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
  316. MN(II,JJ)=AMIN1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
  317. 913 CONTINUE
  318. DO 412 II=N1STAR,N1END
  319. F(II,JJ,0)= &
  320. TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
  321. ,XJG(IIM))
  322. F(II,JJ,1)= &
  323. TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2), &
  324. XJG(IIM))
  325. 412 CONTINUE
  326. DO 922 II=N1STAR,N1END
  327. F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
  328. F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
  329. 922 CONTINUE
  330. DO 923 II=N1STAR,N1END
  331. OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
  332. PP(F(II,JJ,0))+EP)
  333. UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
  334. EP)
  335. 923 CONTINUE
  336. DO 924 II=N1STAR,N1END
  337. F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+PN(F(II,JJ,0)) &
  338. *AMIN1(1.,UN(II,JJ))
  339. F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1)) &
  340. *AMIN1(1.,OV(II,JJ))
  341. 924 CONTINUE
  342. 9000 CONTINUE
  343. DO 925 JJ=N2STAR,N2END
  344. DO 925 II=N1STAR,N1END
  345. XF(II,JJ,IIM)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
  346. 925 CONTINUE
  347. !
  348. 2000 CONTINUE
  349. RETURN
  350. END