- Timestamp:
- 2021-12-03T20:32:50+01:00 (3 years ago)
- Location:
- NEMO/branches/2021/dev_r14318_RK3_stage1
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14318_RK3_stage1
- Property svn:externals
-
old new 9 9 10 10 # SETTE 11 ^/utils/CI/sette@14244 sette 11 ^/utils/CI/sette@HEAD sette 12
-
- Property svn:externals
-
NEMO/branches/2021/dev_r14318_RK3_stage1/src/TOP/PISCES/SED/sedmat.F90
r10222 r15574 14 14 PRIVATE 15 15 16 PUBLIC sed_mat 17 18 INTERFACE sed_mat 19 MODULE PROCEDURE sed_mat_dsr, sed_mat_btb 20 END INTERFACE 21 22 INTEGER, PARAMETER :: nmax = 30 23 16 PUBLIC sed_mat_dsr 17 PUBLIC sed_mat_dsrjac 18 PUBLIC sed_mat_dsri 19 PUBLIC sed_mat_btb 20 PUBLIC sed_mat_btbjac 21 PUBLIC sed_mat_btbi 22 PUBLIC sed_mat_coef 24 23 25 24 !! $Id$ 26 25 CONTAINS 27 26 28 SUBROUTINE sed_mat_ dsr( nvar, ndim, nlev, preac, psms, psol, dtsed_in)27 SUBROUTINE sed_mat_coef( nksed ) 29 28 !!--------------------------------------------------------------------- 30 !! *** ROUTINE sed_mat_ dsr***29 !! *** ROUTINE sed_mat_coef *** 31 30 !! 32 31 !! ** Purpose : solves tridiagonal system of linear equations … … 49 48 !!---------------------------------------------------------------------- 50 49 !! * Arguments 51 INTEGER , INTENT(in) :: nvar ! number of variable 52 INTEGER , INTENT(in) :: ndim ! number of points 53 INTEGER , INTENT(in) :: nlev ! number of sediment levels 54 55 REAL(wp), DIMENSION(ndim,nlev), INTENT(in ) :: preac ! reaction rates 56 REAL(wp), DIMENSION(ndim,nlev), INTENT(in ) :: psms ! reaction rates 57 REAL(wp), DIMENSION(ndim,nlev), INTENT(inout) :: psol ! solution ( undersaturation values ) 58 REAL(wp), INTENT(in) :: dtsed_in 59 50 INTEGER, INTENT(in) :: nksed 51 60 52 !---Local declarations 61 INTEGER :: ji, jk, jn 62 REAL(wp), DIMENSION(ndim,nlev) :: za, zb, zc, zr 63 REAL(wp), DIMENSION(ndim) :: zbet 64 REAL(wp), DIMENSION(ndim,nmax) :: zgamm 65 66 REAL(wp) :: aplus,aminus 67 REAL(wp) :: rplus,rminus 68 REAL(wp) :: dxplus,dxminus 69 53 INTEGER :: ji, jk 54 REAL(wp) :: aplus, aminus, dxplus, dxminus 70 55 !---------------------------------------------------------------------- 71 56 72 IF( ln_timing ) CALL timing_start('sed_mat_ dsr')57 IF( ln_timing ) CALL timing_start('sed_mat_coef') 73 58 74 59 ! Computation left hand side of linear system of 75 60 ! equations for dissolution reaction 76 61 !--------------------------------------------- 77 78 62 ! first sediment level 63 DO ji = 1, jpoce 64 aplus = ( por(1) + por(2) ) * 0.5 65 dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 66 apluss(ji,1) = ( 1.0 / ( volw3d(ji,1) ) ) * aplus / dxplus 67 68 DO jk = 2, nksed - 1 69 aminus = ( por(jk-1) + por(jk) ) * 0.5 70 dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 71 72 aplus = ( por(jk+1) + por(jk) ) * 0.5 73 dxplus = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 74 ! 75 aminuss(ji,jk) = ( 1.0 / volw3d(ji,jk) ) * aminus / dxminus 76 apluss (ji,jk) = ( 1.0 / volw3d(ji,jk) ) * aplus / dxplus 77 END DO 78 79 aminus = ( por(nksed-1) + por(nksed) ) * 0.5 80 dxminus = ( dz3d(ji,nksed-1) + dz3d(ji,nksed) ) / 2. 81 aminuss(ji,nksed) = ( 1.0 / volw3d(ji,nksed) ) * aminus / dxminus 82 83 END DO 84 85 IF( ln_timing ) CALL timing_stop('sed_mat_coef') 86 87 END SUBROUTINE sed_mat_coef 88 89 SUBROUTINE sed_mat_dsr( nksed, nvar, accmask ) 90 !!--------------------------------------------------------------------- 91 !! *** ROUTINE sed_mat_dsr *** 92 !! 93 !! ** Purpose : solves tridiagonal system of linear equations 94 !! 95 !! ** Method : 96 !! 1 - computes left hand side of linear system of equations 97 !! for dissolution reaction 98 !! For mass balance in kbot+sediment : 99 !! dz3d (:,1) = dz(1) = 0.5 cm 100 !! volw3d(:,1) = dzkbot ( see sedini.F90 ) 101 !! dz(2) = 0.3 cm 102 !! dz3d(:,2) = 0.3 + dzdep ( see seddsr.F90 ) 103 !! volw3d(:,2) and vols3d(l,2) are thickened ( see seddsr.F90 ) 104 !! 105 !! 2 - forward/backward substitution. 106 !! 107 !! History : 108 !! ! 04-10 (N. Emprin, M. Gehlen ) original 109 !! ! 06-04 (C. Ethe) Module Re-organization 110 !!---------------------------------------------------------------------- 111 !! * Arguments 112 INTEGER , INTENT(in) :: nvar, nksed ! number of variable 113 INTEGER, DIMENSION(jpoce) :: accmask 114 INTEGER :: ji 115 116 !---Local declarations 117 INTEGER :: jk, jn 118 REAL(wp), DIMENSION(nksed) :: za, zb, zc 119 120 REAL(wp) :: rplus,rminus 121 !---------------------------------------------------------------------- 122 123 IF( ln_timing ) CALL timing_start('sed_mat_dsr') 124 125 ! Computation left hand side of linear system of 126 ! equations for dissolution reaction 127 !--------------------------------------------- 79 128 jn = nvar 80 129 ! first sediment level 81 DO ji = 1, ndim 82 aplus = ( ( volw3d(ji,1) / ( dz3d(ji,1) ) ) + & 83 ( volw3d(ji,2) / ( dz3d(ji,2) ) ) ) / 2. 84 dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 85 rplus = ( dtsed_in / ( volw3d(ji,1) ) ) * diff(ji,1,jn) * aplus / dxplus 130 DO ji = 1, jpoce 131 IF (accmask(ji) == 0) THEN 132 rplus = apluss(ji,1) * diff(ji,1,jn) * radssol(1,jn) 133 134 za(1) = 0. 135 zb(1) = rplus 136 zc(1) = -rplus 137 138 DO jk = 2, nksed - 1 139 rminus = aminuss(ji,jk) * diff(ji,jk-1,jn) * radssol(jk,jn) 140 rplus = apluss (ji,jk) * diff(ji,jk,jn) * radssol(jk,jn) 141 ! 142 za(jk) = -rminus 143 zb(jk) = rminus + rplus 144 zc(jk) = -rplus 145 END DO 146 147 rminus = aminuss(ji,nksed) * diff(ji,nksed-1,jn) * radssol(nksed,jn) 148 ! 149 za(nksed) = -rminus 150 zb(nksed) = rminus 151 zc(nksed) = 0. 152 153 ! solves tridiagonal system of linear equations 154 ! ----------------------------------------------- 155 156 pwcpa(ji,1,jn) = pwcpa(ji,1,jn) - ( zc(1) * pwcp(ji,2,jn) + zb(1) * pwcp(ji,1,jn) ) 157 DO jk = 2, nksed - 1 158 pwcpa(ji,jk,jn) = pwcpa(ji,jk,jn) - ( zc(jk) * pwcp(ji,jk+1,jn) + za(jk) * pwcp(ji,jk-1,jn) & 159 & + zb(jk) * pwcp(ji,jk,jn) ) 160 ENDDO 161 pwcpa(ji,nksed,jn) = pwcpa(ji,nksed,jn) - ( za(nksed) * pwcp(ji,nksed-1,jn) & 162 & + zb(nksed) * pwcp(ji,nksed,jn) ) 163 164 ENDIF 165 END DO 166 167 IF( ln_timing ) CALL timing_stop('sed_mat_dsr') 168 169 END SUBROUTINE sed_mat_dsr 170 171 SUBROUTINE sed_mat_dsrjac( nksed, nvar, NEQ, NROWPD, jacvode, accmask ) 172 !!--------------------------------------------------------------------- 173 !! *** ROUTINE sed_mat_dsrjac *** 174 !! 175 !! ** Purpose : solves tridiagonal system of linear equations 176 !! 177 !! ** Method : 178 !! 1 - computes left hand side of linear system of equations 179 !! for dissolution reaction 180 !! For mass balance in kbot+sediment : 181 !! dz3d (:,1) = dz(1) = 0.5 cm 182 !! volw3d(:,1) = dzkbot ( see sedini.F90 ) 183 !! dz(2) = 0.3 cm 184 !! dz3d(:,2) = 0.3 + dzdep ( see seddsr.F90 ) 185 !! volw3d(:,2) and vols3d(l,2) are thickened ( see 186 !seddsr.F90 ) 187 !! 188 !! 2 - forward/backward substitution. 189 !! 190 !! History : 191 !! ! 04-10 (N. Emprin, M. Gehlen ) original 192 !! ! 06-04 (C. Ethe) Module Re-organization 193 !!---------------------------------------------------------------------- 194 !! * Arguments 195 INTEGER , INTENT(in) :: nvar, nksed, NEQ, NROWPD ! number of variable 196 REAL, DIMENSION(jpoce,NROWPD,NEQ), INTENT(inout) :: jacvode 197 INTEGER, DIMENSION(jpoce), INTENT(in) :: accmask 198 199 !---Local declarations 200 INTEGER :: ji,jk, jn, jnn, jni, jnj ,jnij 201 REAL(wp), DIMENSION(nksed) :: za, zb, zc 202 203 REAL(wp) :: rplus,rminus 204 !---------------------------------------------------------------------- 205 206 IF( ln_timing ) CALL timing_start('sed_mat_dsrjac') 207 208 ! Computation left hand side of linear system of 209 ! equations for dissolution reaction 210 !--------------------------------------------- 211 jn = nvar 212 ! first sediment level 213 DO ji = 1, jpoce 214 IF (accmask(ji) == 0 ) THEN 215 rplus = apluss(ji,1) * diff(ji,1,jn) * radssol(1,jn) 216 217 za(1) = 0. 218 zb(1) = rplus 219 zc(1) = -rplus 220 221 DO jk = 2, nksed - 1 222 rminus = aminuss(ji,jk) * diff(ji,jk-1,jn) * radssol(jk,jn) 223 rplus = apluss (ji,jk) * diff(ji,jk,jn) * radssol(jk,jn) 224 ! 225 za(jk) = -rminus 226 zb(jk) = rminus + rplus 227 zc(jk) = -rplus 228 END DO 229 230 rminus = aminuss(ji,nksed) * diff(ji,nksed-1,jn) * radssol(nksed,jn) 231 ! 232 za(nksed) = -rminus 233 zb(nksed) = rminus 234 zc(nksed) = 0. 235 236 ! solves tridiagonal system of linear equations 237 238 jnn = isvode(jn) 239 jnij = jpvode + 1 240 jacvode(ji, jnij, jnn) = jacvode(ji,jnij,jnn) - zb(1) 241 jnj = jpvode + jnn 242 jnij = jnn - jnj + jpvode + 1 243 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) -zc(1) 244 DO jk = 2, nksed - 1 245 jni = (jk-1) * jpvode + jnn 246 jnj = (jk-2) * jpvode + jnn 247 jnij = jni - jnj + jpvode + 1 248 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - za(jk) 249 jnj = (jk-1) * jpvode + jnn 250 jnij = jni - jnj + jpvode + 1 251 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - zb(jk) 252 jnj = (jk) * jpvode + jnn 253 jnij = jni - jnj + jpvode + 1 254 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - zc(jk) 255 END DO 256 jni = (nksed-1) * jpvode + jnn 257 jnj = (nksed-2) * jpvode + jnn 258 jnij = jni - jnj + jpvode + 1 259 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - za(nksed) 260 jnij = jpvode + 1 261 jacvode(ji, jnij, jni) = jacvode(ji, jnij, jni) - zb(nksed) 262 ENDIF 263 END DO 264 265 IF( ln_timing ) CALL timing_stop('sed_mat_dsrjac') 266 267 END SUBROUTINE sed_mat_dsrjac 268 269 SUBROUTINE sed_mat_btbi( nksed, nvar, psol, preac, dtsed_in ) 270 !!--------------------------------------------------------------------- 271 !! *** ROUTINE sed_mat_btb *** 272 !! 273 !! ** Purpose : solves tridiagonal system of linear equations 274 !! 275 !! ** Method : 276 !! 1 - computes left hand side of linear system of equations 277 !! for dissolution reaction 278 !! 279 !! 280 !! 2 - forward/backward substitution. 281 !! 282 !! History : 283 !! ! 04-10 (N. Emprin, M. Gehlen ) original 284 !! ! 06-04 (C. Ethe) Module Re-organization 285 !!---------------------------------------------------------------------- 286 !! * Arguments 287 INTEGER , INTENT(in) :: nksed, nvar ! number of sediment levels 288 289 REAL(wp), DIMENSION(jpoce,nksed,nvar), INTENT(inout) :: & 290 psol, preac 291 292 REAL(wp), INTENT(in) :: dtsed_in 293 294 !---Local declarations 295 INTEGER :: & 296 ji, jk, jn 297 298 REAL(wp) :: & 299 aplus,aminus , & 300 rplus,rminus , & 301 dxplus,dxminus 302 303 REAL(wp), DIMENSION(nksed) :: za, zb, zc 304 REAL(wp), DIMENSION(nksed) :: zr, zgamm 305 REAL(wp) :: zbet 306 307 !---------------------------------------------------------------------- 308 309 ! Computation left hand side of linear system of 310 ! equations for dissolution reaction 311 !--------------------------------------------- 312 IF( ln_timing ) CALL timing_start('sed_mat_btbi') 313 314 ! first sediment level 315 DO ji = 1, jpoce 316 aplus = ( por1(2) + por1(3) ) / 2.0 317 dxplus = ( dz(2) + dz(3) ) / 2. 318 rplus = ( dtsed_in / vols(2) ) * db(ji,2) * aplus / dxplus 319 za(2) = 0. 320 zb(2) = 1. + rplus 321 zc(2) = -rplus 322 323 DO jk = 3, nksed - 1 324 aminus = ( por1(jk-1) + por1(jk) ) * 0.5 325 aminus = ( ( vols(jk-1) / dz(jk-1) ) + ( vols(jk) / dz(jk) ) ) / 2. 326 dxminus = ( dz(jk-1) + dz(jk) ) / 2. 327 rminus = ( dtsed_in / vols(jk) ) * db(ji,jk-1) * aminus / dxminus 328 ! 329 aplus = ( por1(jk) + por1(jk+1) ) * 0.5 330 dxplus = ( dz(jk) + dz(jk+1) ) / 2. 331 rplus = ( dtsed_in / vols(jk) ) * db(ji,jk) * aplus / dxplus 332 ! 333 za(jk) = -rminus 334 zb(jk) = 1. + rminus + rplus 335 zc(jk) = -rplus 336 337 ENDDO 338 339 aminus = ( por1(nksed-1) + por1(nksed) ) * 0.5 340 dxminus = ( dz(nksed-1) + dz(nksed) ) / 2. 341 rminus = ( dtsed_in / vols(nksed) ) * db(ji,nksed-1) * aminus / dxminus 342 ! 343 za(nksed) = -rminus 344 zb(nksed) = 1. + rminus 345 zc(nksed) = 0. 346 347 ! solves tridiagonal system of linear equations 348 ! ----------------------------------------------- 349 DO jn = 1, nvar 350 zr(:) = psol(ji,:,jn) 351 zbet = zb(2) - preac(ji,2,jn) * dtsed_in 352 psol(ji,2,jn) = zr(2) / zbet 353 ! 354 DO jk = 3, nksed 355 zgamm(jk) = zc(jk-1) / zbet 356 zbet = zb(jk) - preac(ji,jk,jn) * dtsed_in - za(jk) * zgamm(jk) 357 psol(ji,jk,jn) = ( zr(jk) - za(jk) * psol(ji,jk-1,jn) ) / zbet 358 ENDDO 359 ! 360 DO jk = nksed - 1, 2, -1 361 psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(jk+1) * psol(ji,jk+1,jn) 362 ENDDO 363 END DO 364 END DO 365 ! 366 IF( ln_timing ) CALL timing_stop('sed_mat_btbi') 367 368 END SUBROUTINE sed_mat_btbi 369 370 371 SUBROUTINE sed_mat_btb( nksed, nvar, accmask ) 372 !!--------------------------------------------------------------------- 373 !! *** ROUTINE sed_mat_btb *** 374 !! 375 !! ** Purpose : solves tridiagonal system of linear equations 376 !! 377 !! ** Method : 378 !! 1 - computes left hand side of linear system of equations 379 !! for dissolution reaction 380 !! 381 !! 2 - forward/backward substitution. 382 !! 383 !! History : 384 !! ! 04-10 (N. Emprin, M. Gehlen ) original 385 !! ! 06-04 (C. Ethe) Module Re-organization 386 !!---------------------------------------------------------------------- 387 !! * Arguments 388 INTEGER , INTENT(in) :: & 389 nvar, nksed ! number of sediment levels 390 INTEGER, DIMENSION(jpoce) :: accmask 391 392 !---Local declarations 393 INTEGER :: ji, jk, jn 394 395 REAL(wp) :: & 396 aplus,aminus , & 397 rplus,rminus , & 398 dxplus,dxminus 399 400 REAL(wp), DIMENSION(nksed) :: za, zb, zc 401 402 !---------------------------------------------------------------------- 403 404 ! Computation left hand side of linear system of 405 ! equations for dissolution reaction 406 !--------------------------------------------- 407 IF( ln_timing ) CALL timing_start('sed_mat_btb') 408 409 ! first sediment level 410 jn = nvar 411 DO ji = 1, jpoce 412 IF (accmask(ji) == 0) THEN 413 aplus = ( por1(2) + por1(3) ) / 2.0 414 dxplus = ( dz(2) + dz(3) ) / 2. 415 rplus = ( 1.0 / vols(2) ) * db(ji,2) * aplus / dxplus * rads1sol(2,jn) 416 417 za(2) = 0. 418 zb(2) = rplus 419 zc(2) = -rplus 420 421 DO jk = 3, nksed - 1 422 aminus = ( por1(jk-1) + por1(jk) ) * 0.5 423 aminus = ( ( vols(jk-1) / dz(jk-1) ) + ( vols(jk) / dz(jk) ) ) / 2. 424 dxminus = ( dz(jk-1) + dz(jk) ) / 2. 425 rminus = ( 1.0 / vols(jk) ) * db(ji,jk-1) * aminus / dxminus * rads1sol(jk,jn) 426 ! 427 aplus = ( por1(jk) + por1(jk+1) ) * 0.5 428 dxplus = ( dz(jk) + dz(jk+1) ) / 2. 429 rplus = ( 1.0 / vols(jk) ) * db(ji,jk) * aplus / dxplus * rads1sol(jk,jn) 430 ! 431 za(jk) = -rminus 432 zb(jk) = rminus + rplus 433 zc(jk) = -rplus 434 435 ENDDO 436 437 aminus = ( por1(nksed-1) + por1(nksed) ) * 0.5 438 dxminus = ( dz(nksed-1) + dz(nksed) ) / 2. 439 rminus = ( 1.0 / vols(nksed) ) * db(ji,nksed-1) * aminus / dxminus * rads1sol(nksed,jn) 440 ! 441 za(nksed) = -rminus 442 zb(nksed) = rminus 443 zc(nksed) = 0. 444 445 ! solves tridiagonal system of linear equations 446 ! ----------------------------------------------- 447 pwcpa(ji,2,jn) = pwcpa(ji,2,jn) - ( zc(2) * pwcp(ji,3,jn) + zb(2) * pwcp(ji,2,jn) ) 448 DO jk = 3, nksed-1 449 pwcpa(ji,jk,jn) = pwcpa(ji,jk,jn) - ( zc(jk) * pwcp(ji,jk+1,jn) + za(jk) * pwcp(ji,jk-1,jn) & 450 & + zb(jk) * pwcp(ji,jk,jn) ) 451 ENDDO 452 pwcpa(ji,nksed,jn) = pwcpa(ji,nksed,jn) - ( za(nksed) * pwcp(ji,nksed-1,jn) & 453 & + zb(nksed) * pwcp(ji,nksed,jn) ) 454 ! 455 ENDIF 456 END DO 457 ! 458 IF( ln_timing ) CALL timing_stop('sed_mat_btb') 459 460 END SUBROUTINE sed_mat_btb 461 462 SUBROUTINE sed_mat_btbjac( nksed, nvar, NEQ, NROWPD, jacvode, accmask ) 463 !!--------------------------------------------------------------------- 464 !! *** ROUTINE sed_mat_btb *** 465 !! 466 !! ** Purpose : solves tridiagonal system of linear equations 467 !! 468 !! ** Method : 469 !! 1 - computes left hand side of linear system of equations 470 !! for dissolution reaction 471 !! 472 !! 2 - forward/backward substitution. 473 !! 474 !! History : 475 !! ! 04-10 (N. Emprin, M. Gehlen ) original 476 !! ! 06-04 (C. Ethe) Module Re-organization 477 !!---------------------------------------------------------------------- 478 !! * Arguments 479 INTEGER , INTENT(in) :: nvar, nksed, NEQ, NROWPD ! number of variable 480 REAL, DIMENSION(jpoce,NROWPD,NEQ), INTENT(inout) :: jacvode 481 INTEGER, DIMENSION(jpoce), INTENT(in) :: accmask 482 483 !---Local declarations 484 INTEGER :: ji, jk, jn, jnn, jni, jnj ,jnij 485 486 REAL(wp) :: & 487 aplus,aminus , & 488 rplus,rminus , & 489 dxplus,dxminus 490 491 REAL(wp), DIMENSION(nksed) :: za, zb, zc 492 493 !---------------------------------------------------------------------- 494 495 ! Computation left hand side of linear system of 496 ! equations for dissolution reaction 497 !--------------------------------------------- 498 IF( ln_timing ) CALL timing_start('sed_mat_btbjac') 499 500 ! first sediment level 501 jn = nvar 502 DO ji = 1, jpoce 503 IF (accmask(ji) == 0) THEN 504 aplus = ( por1(2) + por1(3) ) / 2.0 505 dxplus = ( dz(2) + dz(3) ) / 2. 506 rplus = ( 1.0 / vols(2) ) * db(ji,2) * aplus / dxplus * rads1sol(2,jn) 507 508 za(2) = 0. 509 zb(2) = rplus 510 zc(2) = -rplus 511 512 DO jk = 3, nksed - 1 513 aminus = ( por1(jk-1) + por1(jk) ) * 0.5 514 aminus = ( ( vols(jk-1) / dz(jk-1) ) + ( vols(jk) / dz(jk) ) ) / 2. 515 dxminus = ( dz(jk-1) + dz(jk) ) / 2. 516 rminus = ( 1.0 / vols(jk) ) * db(ji,jk-1) * aminus / dxminus * rads1sol(jk,jn) 517 ! 518 aplus = ( por1(jk) + por1(jk+1) ) * 0.5 519 dxplus = ( dz(jk) + dz(jk+1) ) / 2. 520 rplus = ( 1.0 / vols(jk) ) * db(ji,jk) * aplus / dxplus * rads1sol(jk,jn) 521 ! 522 za(jk) = -rminus 523 zb(jk) = rminus + rplus 524 zc(jk) = -rplus 525 526 ENDDO 527 528 aminus = ( por1(nksed-1) + por1(nksed) ) * 0.5 529 dxminus = ( dz(nksed-1) + dz(nksed) ) / 2. 530 rminus = ( 1.0 / vols(nksed) ) * db(ji,nksed-1) * aminus / dxminus * rads1sol(nksed,jn) 531 ! 532 za(nksed) = -rminus 533 zb(nksed) = rminus 534 zc(nksed) = 0. 535 536 ! solves tridiagonal system of linear equations 537 ! ----------------------------------------------- 538 jnn = isvode(jn) 539 jni = jpvode + jnn 540 jnij = jpvode + 1 541 jacvode(ji, jnij, jni) = jacvode(ji,jnij,jni) - zb(2) 542 jnj = 2 * jpvode + jnn 543 jnij = jni - jnj + jpvode + 1 544 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) -zc(2) 545 DO jk = 3, nksed-1 546 jni = (jk-1) * jpvode + jnn 547 jnj = (jk-2) * jpvode + jnn 548 jnij = jni - jnj + jpvode + 1 549 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - za(jk) 550 jnj = (jk-1) * jpvode + jnn 551 jnij = jni - jnj + jpvode + 1 552 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - zb(jk) 553 jnj = (jk) * jpvode + jnn 554 jnij = jni - jnj + jpvode + 1 555 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - zc(jk) 556 ENDDO 557 jni = (nksed-1) * jpvode + jnn 558 jnj = (nksed-2) * jpvode + jnn 559 jnij = jni - jnj + jpvode + 1 560 jacvode(ji, jnij, jnj) = jacvode(ji, jnij, jnj) - za(nksed) 561 jnij = jpvode + 1 562 jacvode(ji, jnij, jni) = jacvode(ji, jnij, jni) - zb(nksed) 563 ! 564 ENDIF 565 END DO 566 ! 567 IF( ln_timing ) CALL timing_stop('sed_mat_btbjac') 568 569 END SUBROUTINE sed_mat_btbjac 570 571 572 SUBROUTINE sed_mat_dsri( nksed, nvar, preac, psms, dtsed_in, psol ) 573 !!--------------------------------------------------------------------- 574 !! *** ROUTINE sed_mat_dsr *** 575 !! 576 !! ** Purpose : solves tridiagonal system of linear equations 577 !! 578 !! ** Method : 579 !! 1 - computes left hand side of linear system of equations 580 !! for dissolution reaction 581 !! For mass balance in kbot+sediment : 582 !! dz3d (:,1) = dz(1) = 0.5 cm 583 !! volw3d(:,1) = dzkbot ( see sedini.F90 ) 584 !! dz(2) = 0.3 cm 585 !! dz3d(:,2) = 0.3 + dzdep ( see seddsr.F90 ) 586 !! volw3d(:,2) and vols3d(l,2) are thickened ( see 587 !seddsr.F90 ) 588 !! 589 !! 2 - forward/backward substitution. 590 !! 591 !! History : 592 !! ! 04-10 (N. Emprin, M. Gehlen ) original 593 !! ! 06-04 (C. Ethe) Module Re-organization 594 !!---------------------------------------------------------------------- 595 !! * Arguments 596 INTEGER , INTENT(in) :: nksed, nvar ! number of variable 597 598 REAL(wp), DIMENSION(jpoce,nksed), INTENT(in ) :: preac ! reaction rates 599 REAL(wp), DIMENSION(jpoce,nksed), INTENT(in ) :: psms ! reaction rates 600 REAL(wp), DIMENSION(jpoce,nksed), INTENT(inout) :: psol ! reaction rates 601 REAL(wp), INTENT(in) :: dtsed_in 602 603 !---Local declarations 604 INTEGER :: ji, jk, jn 605 REAL(wp), DIMENSION(jpoce,nksed) :: za, zb, zc, zr 606 REAL(wp), DIMENSION(jpoce) :: zbet 607 REAL(wp), DIMENSION(jpoce,nksed) :: zgamm 608 609 REAL(wp) :: rplus,rminus 610 !---------------------------------------------------------------------- 611 612 IF( ln_timing ) CALL timing_start('sed_mat_dsri') 613 614 ! Computation left hand side of linear system of 615 ! equations for dissolution reaction 616 !--------------------------------------------- 617 jn = nvar 618 ! first sediment level 619 DO ji = 1, jpoce 620 rplus = dtsed_in * apluss(ji,1) * diff(ji,1,jn) * radssol(1,jn) 86 621 87 622 za(ji,1) = 0. … … 89 624 zc(ji,1) = -rplus 90 625 ENDDO 91 92 DO jk = 2, nlev - 1 93 DO ji = 1, ndim 94 aminus = ( ( volw3d(ji,jk-1) / ( dz3d(ji,jk-1) ) ) + & 95 & ( volw3d(ji,jk ) / ( dz3d(ji,jk ) ) ) ) / 2. 96 dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 97 98 aplus = ( ( volw3d(ji,jk ) / ( dz3d(ji,jk ) ) ) + & 99 & ( volw3d(ji,jk+1) / ( dz3d(ji,jk+1) ) ) ) / 2. 100 dxplus = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 101 ! 102 rminus = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk-1,jn) * aminus / dxminus 103 rplus = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk,jn) * aplus / dxplus 626 627 DO jk = 2, nksed - 1 628 DO ji = 1, jpoce 629 rminus = dtsed_in * aminuss(ji,jk) * diff(ji,jk-1,jn) * radssol(jk,jn) 630 rplus = dtsed_in * apluss (ji,jk) * diff(ji,jk,jn) * radssol(jk,jn) 104 631 ! 105 632 za(ji,jk) = -rminus 106 zb(ji,jk) = 1. + rminus + rplus 633 zb(ji,jk) = 1. + rminus + rplus 107 634 zc(ji,jk) = -rplus 108 635 END DO 109 636 END DO 110 637 111 DO ji = 1, ndim 112 aminus = ( ( volw3d(ji,nlev-1) / dz3d(ji,nlev-1) ) + & 113 & ( volw3d(ji,nlev) / dz3d(ji,nlev) ) ) / 2. 114 dxminus = ( dz3d(ji,nlev-1) + dz3d(ji,nlev) ) / 2. 115 rminus = ( dtsed_in / volw3d(ji,nlev) ) * diff(ji,nlev-1,jn) * aminus / dxminus 638 DO ji = 1, jpoce 639 rminus = dtsed_in * aminuss(ji,nksed) * diff(ji,nksed-1,jn) * radssol(nksed,jn) 116 640 ! 117 za(ji,n lev) = -rminus118 zb(ji,n lev) = 1. + rminus119 zc(ji,n lev) = 0.641 za(ji,nksed) = -rminus 642 zb(ji,nksed) = 1. + rminus 643 zc(ji,nksed) = 0. 120 644 END DO 121 645 … … 124 648 ! ----------------------------------------------- 125 649 126 zr (:,:) = psol(:,:) + psms(:,:) 127 zb (:,:) = zb(:,:) + preac(:,:)650 zr (:,:) = psol(:,:) + psms(:,:) * dtsed_in 651 zb (:,:) = zb(:,:) - preac(:,:) * dtsed_in 128 652 zbet(: ) = zb(:,1) 129 653 psol(:,1) = zr(:,1) / zbet(:) 130 654 131 655 ! 132 DO jk = 2, n lev133 DO ji = 1, ndim656 DO jk = 2, nksed 657 DO ji = 1, jpoce 134 658 zgamm(ji,jk) = zc(ji,jk-1) / zbet(ji) 135 659 zbet(ji) = zb(ji,jk) - za(ji,jk) * zgamm(ji,jk) … … 138 662 ENDDO 139 663 ! 140 DO jk = n lev- 1, 1, -1141 DO ji = 1, ndim664 DO jk = nksed - 1, 1, -1 665 DO ji = 1, jpoce 142 666 psol(ji,jk) = psol(ji,jk) - zgamm(ji,jk+1) * psol(ji,jk+1) 143 667 END DO 144 668 ENDDO 145 669 146 IF( ln_timing ) CALL timing_stop('sed_mat_dsr') 147 148 149 END SUBROUTINE sed_mat_dsr 150 151 SUBROUTINE sed_mat_btb( nvar, ndim, nlev, psol, dtsed_in ) 152 !!--------------------------------------------------------------------- 153 !! *** ROUTINE sed_mat_btb *** 154 !! 155 !! ** Purpose : solves tridiagonal system of linear equations 156 !! 157 !! ** Method : 158 !! 1 - computes left hand side of linear system of equations 159 !! for dissolution reaction 160 !! 161 !! 2 - forward/backward substitution. 162 !! 163 !! History : 164 !! ! 04-10 (N. Emprin, M. Gehlen ) original 165 !! ! 06-04 (C. Ethe) Module Re-organization 166 !!---------------------------------------------------------------------- 167 !! * Arguments 168 INTEGER , INTENT(in) :: & 169 nvar , & ! number of variables 170 ndim , & ! number of points 171 nlev ! number of sediment levels 172 173 REAL(wp), DIMENSION(ndim,nlev,nvar), INTENT(inout) :: & 174 psol ! solution 175 176 REAL(wp), INTENT(in) :: dtsed_in 177 178 !---Local declarations 179 INTEGER :: & 180 ji, jk, jn 181 182 REAL(wp) :: & 183 aplus,aminus , & 184 rplus,rminus , & 185 dxplus,dxminus 186 187 REAL(wp), DIMENSION(nlev) :: za, zb, zc 188 REAL(wp), DIMENSION(ndim,nlev) :: zr 189 REAL(wp), DIMENSION(nmax) :: zgamm 190 REAL(wp) :: zbet 191 192 193 !---------------------------------------------------------------------- 194 195 ! Computation left hand side of linear system of 196 ! equations for dissolution reaction 197 !--------------------------------------------- 198 199 200 IF( ln_timing ) CALL timing_start('sed_mat_btb') 201 202 ! first sediment level 203 DO ji = 1, ndim 204 aplus = ( ( vols(2) / dz(2) ) + ( vols(3) / dz(3) ) ) / 2. 205 dxplus = ( dz(2) + dz(3) ) / 2. 206 rplus = ( dtsed_in / vols(2) ) * db(ji,2) * aplus / dxplus 207 208 za(1) = 0. 209 zb(1) = 1. + rplus 210 zc(1) = -rplus 211 212 213 DO jk = 2, nlev - 1 214 aminus = ( ( vols(jk) / dz(jk) ) + ( vols(jk+1) / dz(jk+1) ) ) / 2. 215 dxminus = ( dz(jk) + dz(jk+1) ) / 2. 216 rminus = ( dtsed_in / vols(jk+1) ) * db(ji,jk) * aminus / dxminus 217 ! 218 aplus = ( ( vols(jk+1) / dz(jk+1 ) ) + ( vols(jk+2) / dz(jk+2) ) ) / 2. 219 dxplus = ( dz(jk+1) + dz(jk+2) ) / 2. 220 rplus = ( dtsed_in / vols(jk+1) ) * db(ji,jk+1) * aplus / dxplus 221 ! 222 za(jk) = -rminus 223 zb(jk) = 1. + rminus + rplus 224 zc(jk) = -rplus 225 ENDDO 226 227 aminus = ( ( vols(nlev) / dz(nlev) ) + ( vols(nlev+1) / dz(nlev+1) ) ) / 2. 228 dxminus = ( dz(nlev) + dz(nlev+1) ) / 2. 229 rminus = ( dtsed_in / vols(nlev+1) ) * db(ji,nlev) * aminus / dxminus 230 ! 231 za(nlev) = -rminus 232 zb(nlev) = 1. + rminus 233 zc(nlev) = 0. 234 235 236 ! solves tridiagonal system of linear equations 237 ! ----------------------------------------------- 238 DO jn = 1, nvar 239 240 DO jk = 1, nlev 241 zr (ji,jk) = psol(ji,jk,jn) 242 END DO 243 zbet = zb(1) 244 psol(ji,1,jn) = zr(ji,1) / zbet 245 ! 246 DO jk = 2, nlev 247 zgamm(jk) = zc(jk-1) / zbet 248 zbet = zb(jk) - za(jk) * zgamm(jk) 249 psol(ji,jk,jn) = ( zr(ji,jk) - za(jk) * psol(ji,jk-1,jn) ) / zbet 250 ENDDO 251 ! 252 DO jk = nlev - 1, 1, -1 253 psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(jk+1) * psol(ji,jk+1,jn) 254 ENDDO 255 256 ENDDO 257 258 END DO 259 ! 260 IF( ln_timing ) CALL timing_stop('sed_mat_btb') 261 262 263 END SUBROUTINE sed_mat_btb 670 IF( ln_timing ) CALL timing_stop('sed_mat_dsri') 671 672 673 END SUBROUTINE sed_mat_dsri 674 264 675 265 676 END MODULE sedmat
Note: See TracChangeset
for help on using the changeset viewer.