Changeset 186 for codes/icosagcm/trunk/src/advect.f90
- Timestamp:
- 01/09/14 09:56:11 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/advect.f90
r174 r186 49 49 !======================================================================================= 50 50 51 SUBROUTINE compute_gradq3d(qi ,one_over_sqrt_leng,gradq3d)51 SUBROUTINE compute_gradq3d(qi_in,one_over_sqrt_leng_in,gradq3d_out,xyz_i,xyz_v) 52 52 USE trace 53 53 USE omp_para 54 54 IMPLICIT NONE 55 REAL(rstd),INTENT(IN) :: qi(iim*jjm,llm) 56 REAL(rstd),INTENT(IN) :: one_over_sqrt_leng(iim*jjm) 57 REAL(rstd),INTENT(OUT) :: gradq3d(iim*jjm,llm,3) 55 REAL(rstd),INTENT(IN) :: qi_in(iim*jjm,llm) 56 REAL(rstd),INTENT(IN) :: one_over_sqrt_leng_in(iim*jjm) 57 REAL(rstd),INTENT(IN) :: xyz_i(iim*jjm,3) 58 REAL(rstd),INTENT(IN) :: xyz_v(2*iim*jjm,3) 59 REAL(rstd),INTENT(OUT) :: gradq3d_out(iim*jjm,llm,3) 58 60 REAL(rstd) :: maxq,minq,minq_c,maxq_c 59 61 REAL(rstd) :: alphamx,alphami,alpha ,maggrd … … 63 65 REAL(rstd) :: gradtri(2*iim*jjm,llm,3) 64 66 INTEGER :: ij,k,ind,l 65 66 CALL trace_start("compute_gradq3d") 67 REAL(rstd) :: qi(iim*jjm,llm) 68 REAL(rstd) :: one_over_sqrt_leng(iim*jjm) 69 REAL(rstd) :: gradq3d(iim*jjm,llm,3) 70 REAL(rstd) :: detx,dety,detz,det 71 REAL(rstd) :: A(3,3), a11,a12,a13,a21,a22,a23,a31,a32,a33 72 REAL(rstd) :: x1,x2,x3 73 REAL(rstd) :: dq(3) 74 75 qi=qi_in 76 one_over_sqrt_leng=one_over_sqrt_leng_in 77 78 CALL trace_start("compute_gradq3d1") 67 79 68 80 ! TODO : precompute ar, drop arr as output argument of gradq ? … … 71 83 ! Compute gradient at triangles solving a linear system 72 84 ! arr = area of triangle joining centroids of hexagons 85 ! DO l = ll_begin,ll_end 86 !!$SIMD 87 ! DO ij=ij_begin_ext,ij_end_ext 88 !! CALL gradq(ij,l,ij+t_rup,ij+t_lup,ij+z_up,qi,gradtri(ij+z_up,l,:),arr(ij+z_up)) 89 !! CALL gradq(ij,l,ij+t_ldown,ij+t_rdown,ij+z_down,qi,gradtri(ij+z_down,l,:),arr(ij+z_down)) 90 ! CALL gradq(ij,l,ij+t_rup,ij+t_lup,ij+z_up,qi,gradtri(ij+z_up,l,1),gradtri(ij+z_up,l,2),gradtri(ij+z_up,l,3),arr(ij+z_up)) 91 ! CALL gradq(ij,l,ij+t_ldown,ij+t_rdown,ij+z_down,qi,gradtri(ij+z_down,l,1),gradtri(ij+z_down,l,2),gradtri(ij+z_down,l,3),arr(ij+z_down)) 92 ! END DO 93 ! END DO 94 73 95 DO l = ll_begin,ll_end 74 96 !$SIMD 75 97 DO ij=ij_begin_ext,ij_end_ext 76 CALL gradq(ij,l,ij+t_rup,ij+t_lup,ij+z_up,qi,gradtri(ij+z_up,l,:),arr(ij+z_up)) 77 CALL gradq(ij,l,ij+t_ldown,ij+t_rdown,ij+z_down,qi,gradtri(ij+z_down,l,:),arr(ij+z_down)) 78 END DO 98 ! CALL gradq(ij,l,ij+t_rup,ij+t_lup,ij+z_up,qi,gradtri(ij+z_up,l,1),gradtri(ij+z_up,l,2),gradtri(ij+z_up,l,3),arr(ij+z_up)) 99 100 101 A(1,1)=xyz_i(ij+t_rup,1)-xyz_i(ij,1); A(1,2)=xyz_i(ij+t_rup,2)-xyz_i(ij,2); A(1,3)=xyz_i(ij+t_rup,3)-xyz_i(ij,3) 102 A(2,1)=xyz_i(ij+t_lup,1)-xyz_i(ij,1); A(2,2)=xyz_i(ij+t_lup,2)-xyz_i(ij,2); A(2,3)=xyz_i(ij+t_lup,3)-xyz_i(ij,3) 103 A(3,1)=xyz_v(ij+z_up,1); A(3,2)= xyz_v(ij+z_up,2); A(3,3)=xyz_v(ij+z_up,3) 104 105 dq(1) = qi(ij+t_rup,l)-qi(ij,l) 106 dq(2) = qi(ij+t_lup,l)-qi(ij,l) 107 dq(3) = 0.0 108 109 110 ! CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),det) 111 112 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 113 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 114 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 115 116 x1 = a11 * (a22 * a33 - a23 * a32) 117 x2 = a12 * (a21 * a33 - a23 * a31) 118 x3 = a13 * (a21 * a32 - a22 * a31) 119 det = x1 - x2 + x3 120 121 ! CALL determinant(dq(1),dq(2),dq(3),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),detx) 122 123 a11=dq(1) ; a12=dq(2) ; a13=dq(3) 124 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 125 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 126 127 x1 = a11 * (a22 * a33 - a23 * a32) 128 x2 = a12 * (a21 * a33 - a23 * a31) 129 x3 = a13 * (a21 * a32 - a22 * a31) 130 detx = x1 - x2 + x3 131 132 ! CALL determinant(A(1,1),A(2,1),A(3,1),dq(1),dq(2),dq(3),A(1,3),A(2,3),A(3,3),dety) 133 134 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 135 a21=dq(1) ; a22=dq(2) ; a23=dq(3) 136 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 137 138 x1 = a11 * (a22 * a33 - a23 * a32) 139 x2 = a12 * (a21 * a33 - a23 * a31) 140 x3 = a13 * (a21 * a32 - a22 * a31) 141 dety = x1 - x2 + x3 142 143 ! CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),dq(1),dq(2),dq(3),detz) 144 145 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 146 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 147 a31=dq(1) ; a32=dq(2) ; a33=dq(3) 148 149 x1 = a11 * (a22 * a33 - a23 * a32) 150 x2 = a12 * (a21 * a33 - a23 * a31) 151 x3 = a13 * (a21 * a32 - a22 * a31) 152 detz = x1 - x2 + x3 153 154 gradtri(ij+z_up,l,1) = detx 155 gradtri(ij+z_up,l,2) = dety 156 gradtri(ij+z_up,l,3) = detz 157 arr(ij+z_up) = det 158 159 ENDDO 160 161 DO ij=ij_begin_ext,ij_end_ext 162 163 164 ! CALL gradq(ij,l,ij+t_ldown,ij+t_rdown,ij+z_down,qi,gradtri(ij+z_down,l,1),gradtri(ij+z_down,l,2),gradtri(ij+z_down,l,3),arr(ij+z_down)) 165 166 A(1,1)=xyz_i(ij+t_ldown,1)-xyz_i(ij,1); A(1,2)=xyz_i(ij+t_ldown,2)-xyz_i(ij,2); A(1,3)=xyz_i(ij+t_ldown,3)-xyz_i(ij,3) 167 A(2,1)=xyz_i(ij+t_rdown,1)-xyz_i(ij,1); A(2,2)=xyz_i(ij+t_rdown,2)-xyz_i(ij,2); A(2,3)=xyz_i(ij+t_rdown,3)-xyz_i(ij,3) 168 A(3,1)=xyz_v(ij+z_down,1); A(3,2)= xyz_v(ij+z_down,2); A(3,3)=xyz_v(ij+z_down,3) 169 170 dq(1) = qi(ij+t_ldown,l)-qi(ij,l) 171 dq(2) = qi(ij+t_rdown,l)-qi(ij,l) 172 dq(3) = 0.0 173 174 175 ! CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),det) 176 177 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 178 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 179 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 180 181 x1 = a11 * (a22 * a33 - a23 * a32) 182 x2 = a12 * (a21 * a33 - a23 * a31) 183 x3 = a13 * (a21 * a32 - a22 * a31) 184 det = x1 - x2 + x3 185 186 ! CALL determinant(dq(1),dq(2),dq(3),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),detx) 187 188 a11=dq(1) ; a12=dq(2) ; a13=dq(3) 189 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 190 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 191 192 x1 = a11 * (a22 * a33 - a23 * a32) 193 x2 = a12 * (a21 * a33 - a23 * a31) 194 x3 = a13 * (a21 * a32 - a22 * a31) 195 detx = x1 - x2 + x3 196 197 ! CALL determinant(A(1,1),A(2,1),A(3,1),dq(1),dq(2),dq(3),A(1,3),A(2,3),A(3,3),dety) 198 199 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 200 a21=dq(1) ; a22=dq(2) ; a23=dq(3) 201 a31=A(1,3) ; a32=A(2,3) ; a33=A(3,3) 202 203 x1 = a11 * (a22 * a33 - a23 * a32) 204 x2 = a12 * (a21 * a33 - a23 * a31) 205 x3 = a13 * (a21 * a32 - a22 * a31) 206 dety = x1 - x2 + x3 207 208 ! CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),dq(1),dq(2),dq(3),detz) 209 210 a11=A(1,1) ; a12=A(2,1) ; a13=A(3,1) 211 a21=A(1,2) ; a22=A(2,2) ; a23=A(3,2) 212 a31=dq(1) ; a32=dq(2) ; a33=dq(3) 213 214 x1 = a11 * (a22 * a33 - a23 * a32) 215 x2 = a12 * (a21 * a33 - a23 * a31) 216 x3 = a13 * (a21 * a32 - a22 * a31) 217 detz = x1 - x2 + x3 218 219 gradtri(ij+z_down,l,1) = detx 220 gradtri(ij+z_down,l,2) = dety 221 gradtri(ij+z_down,l,3) = detz 222 arr(ij+z_down) = det 223 224 END DO 79 225 END DO 80 226 81 227 !$SIMD 82 83 228 DO ij=ij_begin,ij_end 229 ar(ij) = arr(ij+z_up)+arr(ij+z_lup)+arr(ij+z_ldown)+arr(ij+z_down)+arr(ij+z_rdown)+arr(ij+z_rup)+1.e-50 84 230 ENDDO 231 CALL trace_end("compute_gradq3d1") 232 CALL trace_start2("compute_gradq3d2") 85 233 86 234 DO k=1,3 … … 94 242 END DO 95 243 ENDDO 244 CALL trace_end2("compute_gradq3d2") 245 CALL trace_start("compute_gradq3d3") 96 246 97 247 !============================================================================================= LIMITING … … 99 249 !$SIMD 100 250 DO ij=ij_begin,ij_end 101 maggrd = dot_product(gradq3d(ij,l,:),gradq3d(ij,l,:)) 251 ! maggrd = dot_product(gradq3d(ij,l,:),gradq3d(ij,l,:)) 252 maggrd = gradq3d(ij,l,1)*gradq3d(ij,l,1) + gradq3d(ij,l,2)*gradq3d(ij,l,2) + gradq3d(ij,l,3)*gradq3d(ij,l,3) 102 253 maggrd = sqrt(maggrd) 103 254 maxq_c = qi(ij,l) + maggrd*one_over_sqrt_leng(ij) … … 112 263 alphami = max(alphami,0.0) 113 264 alpha = min(alphamx,alphami,1.0) 114 gradq3d(ij,l,:) = alpha*gradq3d(ij,l,:) 265 ! gradq3d(ij,l,:) = alpha*gradq3d(ij,l,:) 266 gradq3d(ij,l,1) = alpha*gradq3d(ij,l,1) 267 gradq3d(ij,l,2) = alpha*gradq3d(ij,l,2) 268 gradq3d(ij,l,3) = alpha*gradq3d(ij,l,3) 115 269 END DO 116 270 END DO 117 271 118 CALL trace_end("compute_gradq3d") 272 CALL trace_end("compute_gradq3d3") 273 274 gradq3d_out=gradq3d 275 276 CONTAINS 277 278 SUBROUTINE gradq(n0,l,n1,n2,n3,q,dq1,dq2,dq3,det) 279 IMPLICIT NONE 280 INTEGER, INTENT(IN) :: n0,l,n1,n2,n3 281 REAL(rstd), INTENT(IN) :: q(iim*jjm,llm) 282 ! REAL(rstd), INTENT(OUT) :: dq(3), det 283 REAL(rstd), INTENT(OUT) :: dq1,dq2,dq3,det 284 REAL(rstd) :: dq(3) 285 286 REAL(rstd) ::detx,dety,detz 287 INTEGER :: info 288 INTEGER :: IPIV(3) 289 290 REAL(rstd) :: A(3,3) 291 REAL(rstd) :: B(3) 292 293 ! TODO : replace A by A1,A2,A3 294 A(1,1)=xyz_i(n1,1)-xyz_i(n0,1); A(1,2)=xyz_i(n1,2)-xyz_i(n0,2); A(1,3)=xyz_i(n1,3)-xyz_i(n0,3) 295 A(2,1)=xyz_i(n2,1)-xyz_i(n0,1); A(2,2)=xyz_i(n2,2)-xyz_i(n0,2); A(2,3)=xyz_i(n2,3)-xyz_i(n0,3) 296 A(3,1)=xyz_v(n3,1); A(3,2)= xyz_v(n3,2); A(3,3)=xyz_v(n3,3) 297 298 dq(1) = q(n1,l)-q(n0,l) 299 dq(2) = q(n2,l)-q(n0,l) 300 dq(3) = 0.0 301 302 ! CALL DGESV(3,1,A,3,IPIV,dq(:),3,info) 303 ! CALL determinant(A(:,1),A(:,2),A(:,3),det) 304 ! CALL determinant(dq,A(:,2),A(:,3),detx) 305 ! CALL determinant(A(:,1),dq,A(:,3),dety) 306 ! CALL determinant(A(:,1),A(:,2),dq,detz) 307 ! dq(1) = detx 308 ! dq(2) = dety 309 ! dq(3) = detz 310 311 CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),det) 312 CALL determinant(dq(1),dq(2),dq(3),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),dq1) 313 CALL determinant(A(1,1),A(2,1),A(3,1),dq(1),dq(2),dq(3),A(1,3),A(2,3),A(3,3),dq2) 314 CALL determinant(A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),dq(1),dq(2),dq(3),dq3) 315 316 END SUBROUTINE gradq 317 318 !========================================================================== 319 ! PURE SUBROUTINE determinant(a1,a2,a3,det) 320 ! IMPLICIT NONE 321 ! REAL(rstd), DIMENSION(3), INTENT(IN) :: a1,a2,a3 322 ! REAL(rstd), INTENT(OUT) :: det 323 ! REAL(rstd) :: x1,x2,x3 324 ! x1 = a1(1) * (a2(2) * a3(3) - a2(3) * a3(2)) 325 ! x2 = a1(2) * (a2(1) * a3(3) - a2(3) * a3(1)) 326 ! x3 = a1(3) * (a2(1) * a3(2) - a2(2) * a3(1)) 327 ! det = x1 - x2 + x3 328 ! END SUBROUTINE determinant 329 330 SUBROUTINE determinant(a11,a12,a13,a21,a22,a23,a31,a32,a33,det) 331 IMPLICIT NONE 332 REAL(rstd), INTENT(IN) :: a11,a12,a13,a21,a22,a23,a31,a32,a33 333 REAL(rstd), INTENT(OUT) :: det 334 REAL(rstd) :: x1,x2,x3 335 x1 = a11 * (a22 * a33 - a23 * a32) 336 x2 = a12 * (a21 * a33 - a23 * a31) 337 x3 = a13 * (a21 * a32 - a22 * a31) 338 det = x1 - x2 + x3 339 END SUBROUTINE determinant 340 341 119 342 END SUBROUTINE compute_gradq3d 120 343 … … 222 445 IF (ne(ij,right)*hfluxt(ij+u_right,l)>0) THEN 223 446 ed = cc(ij+u_right,l,:) - xyz_i(ij,:) 224 qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 447 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 448 qe = qi(ij,l)+gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 225 449 ELSE 226 450 ed = cc(ij+u_right,l,:) - xyz_i(ij+t_right,:) 227 qe = qi(ij+t_right,l)+sum2(gradq3d(ij+t_right,l,:),ed) 451 ! qe = qi(ij+t_right,l)+sum2(gradq3d(ij+t_right,l,:),ed) 452 qe = qi(ij+t_right,l) + gradq3d(ij+t_right,l,1)*ed(1)+gradq3d(ij+t_right,l,2)*ed(2)+gradq3d(ij+t_right,l,3)*ed(3) 228 453 ENDIF 229 454 qflux(ij+u_right,l) = hfluxt(ij+u_right,l)*qe … … 231 456 IF (ne(ij,lup)*hfluxt(ij+u_lup,l)>0) THEN 232 457 ed = cc(ij+u_lup,l,:) - xyz_i(ij,:) 233 qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 458 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 459 qe = qi(ij,l) + gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 234 460 ELSE 235 461 ed = cc(ij+u_lup,l,:) - xyz_i(ij+t_lup,:) 236 qe = qi(ij+t_lup,l)+sum2(gradq3d(ij+t_lup,l,:),ed) 462 ! qe = qi(ij+t_lup,l)+sum2(gradq3d(ij+t_lup,l,:),ed) 463 qe = qi(ij+t_lup,l) + gradq3d(ij+t_lup,l,1)*ed(1)+gradq3d(ij+t_lup,l,2)*ed(2)+gradq3d(ij+t_lup,l,3)*ed(3) 237 464 ENDIF 238 465 qflux(ij+u_lup,l) = hfluxt(ij+u_lup,l)*qe … … 240 467 IF (ne(ij,ldown)*hfluxt(ij+u_ldown,l)>0) THEN 241 468 ed = cc(ij+u_ldown,l,:) - xyz_i(ij,:) 242 qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 469 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 470 qe = qi(ij,l) + gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 243 471 ELSE 244 472 ed = cc(ij+u_ldown,l,:) - xyz_i(ij+t_ldown,:) 245 qe = qi(ij+t_ldown,l)+sum2(gradq3d(ij+t_ldown,l,:),ed) 473 ! qe = qi(ij+t_ldown,l)+sum2(gradq3d(ij+t_ldown,l,:),ed) 474 qe = qi(ij+t_ldown,l)+gradq3d(ij+t_ldown,l,1)*ed(1)+gradq3d(ij+t_ldown,l,2)*ed(2)+gradq3d(ij+t_ldown,l,3)*ed(3) 246 475 ENDIF 247 476 qflux(ij+u_ldown,l) = hfluxt(ij+u_ldown,l)*qe … … 289 518 END SUBROUTINE compute_advect_horiz 290 519 291 !==========================================================================292 PURE SUBROUTINE gradq(n0,l,n1,n2,n3,q,dq,det)293 IMPLICIT NONE294 INTEGER, INTENT(IN) :: n0,l,n1,n2,n3295 REAL(rstd), INTENT(IN) :: q(iim*jjm,llm)296 REAL(rstd), INTENT(OUT) :: dq(3), det297 298 REAL(rstd) ::detx,dety,detz299 INTEGER :: info300 INTEGER :: IPIV(3)301 302 REAL(rstd) :: A(3,3)303 REAL(rstd) :: B(3)304 305 ! TODO : replace A by A1,A2,A3306 A(1,1)=xyz_i(n1,1)-xyz_i(n0,1); A(1,2)=xyz_i(n1,2)-xyz_i(n0,2); A(1,3)=xyz_i(n1,3)-xyz_i(n0,3)307 A(2,1)=xyz_i(n2,1)-xyz_i(n0,1); A(2,2)=xyz_i(n2,2)-xyz_i(n0,2); A(2,3)=xyz_i(n2,3)-xyz_i(n0,3)308 A(3,1)=xyz_v(n3,1); A(3,2)= xyz_v(n3,2); A(3,3)=xyz_v(n3,3)309 310 dq(1) = q(n1,l)-q(n0,l)311 dq(2) = q(n2,l)-q(n0,l)312 dq(3) = 0.0313 ! CALL DGESV(3,1,A,3,IPIV,dq(:),3,info)314 CALL determinant(A(:,1),A(:,2),A(:,3),det)315 CALL determinant(dq,A(:,2),A(:,3),detx)316 CALL determinant(A(:,1),dq,A(:,3),dety)317 CALL determinant(A(:,1),A(:,2),dq,detz)318 dq(1) = detx319 dq(2) = dety320 dq(3) = detz321 END SUBROUTINE gradq322 323 !==========================================================================324 PURE SUBROUTINE determinant(a1,a2,a3,det)325 IMPLICIT NONE326 REAL(rstd), DIMENSION(3), INTENT(IN) :: a1,a2,a3327 REAL(rstd), INTENT(OUT) :: det328 REAL(rstd) :: x1,x2,x3329 x1 = a1(1) * (a2(2) * a3(3) - a2(3) * a3(2))330 x2 = a1(2) * (a2(1) * a3(3) - a2(3) * a3(1))331 x3 = a1(3) * (a2(1) * a3(2) - a2(2) * a3(1))332 det = x1 - x2 + x3333 END SUBROUTINE determinant334 520 335 521 END MODULE advect_mod
Note: See TracChangeset
for help on using the changeset viewer.