- Timestamp:
- 2014-09-24T14:03:02+02:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90
r4491 r4785 1 #define TWO_WAY 2 1 #define TWO_WAY /* TWO WAY NESTING */ 2 #undef DECAL_FEEDBACK /* SEPARATION of INTERFACES*/ 3 3 4 MODULE agrif_opa_update 4 5 #if defined key_agrif && ! defined key_offline … … 15 16 PRIVATE 16 17 17 PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn 18 19 INTEGER, PUBLIC :: nbcline = 0 18 PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales 20 19 21 20 !!---------------------------------------------------------------------- … … 31 30 !! *** ROUTINE Agrif_Update_Tra *** 32 31 !!--------------------------------------------- 33 !!34 32 INTEGER, INTENT(in) :: kt 35 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztab 36 37 33 !!--------------------------------------------- 34 ! 38 35 IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN 39 #if defined TWO_WAY 40 CALL wrk_alloc( jpi, jpj, jpk, jpts, ztab ) 41 36 #if defined TWO_WAY 42 37 Agrif_UseSpecialValueInUpdate = .TRUE. 43 38 Agrif_SpecialValueFineGrid = 0. 44 39 ! 45 40 IF (MOD(nbcline,nbclineupdate) == 0) THEN 46 CALL Agrif_Update_Variable(ztab,tsn_id, procname=updateTS) 47 ELSE 48 CALL Agrif_Update_Variable(ztab,tsn_id,locupdate=(/0,2/), procname=updateTS) 49 ENDIF 50 41 # if ! defined DECAL_FEEDBACK 42 CALL Agrif_Update_Variable(tsn_id, procname=updateTS) 43 # else 44 CALL Agrif_Update_Variable(tsn_id, locupdate=(/1,0/),procname=updateTS) 45 # endif 46 ELSE 47 # if ! defined DECAL_FEEDBACK 48 CALL Agrif_Update_Variable(tsn_id,locupdate=(/0,2/), procname=updateTS) 49 # else 50 CALL Agrif_Update_Variable(tsn_id,locupdate=(/1,2/), procname=updateTS) 51 # endif 52 ENDIF 53 ! 51 54 Agrif_UseSpecialValueInUpdate = .FALSE. 52 53 CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztab )54 55 #endif 55 56 ! 56 57 END SUBROUTINE Agrif_Update_Tra 57 58 … … 60 61 !! *** ROUTINE Agrif_Update_Dyn *** 61 62 !!--------------------------------------------- 62 !!63 63 INTEGER, INTENT(in) :: kt 64 REAL(wp), POINTER, DIMENSION(:,:) :: ztab2d 65 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztab 66 67 64 !!--------------------------------------------- 65 ! 68 66 IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) Return 69 67 #if defined TWO_WAY 70 CALL wrk_alloc( jpi, jpj, ztab2d )71 CALL wrk_alloc( jpi, jpj, jpk, ztab )72 68 Agrif_UseSpecialValueInUpdate = .FALSE. 69 Agrif_SpecialValueFineGrid = 0. 70 ! 73 71 IF (mod(nbcline,nbclineupdate) == 0) THEN 74 CALL Agrif_Update_Variable(ztab,un_id,procname = updateU) 75 CALL Agrif_Update_Variable(ztab,vn_id,procname = updateV) 76 ELSE 77 CALL Agrif_Update_Variable(ztab,un_id,locupdate=(/0,1/),procname = updateU) 78 CALL Agrif_Update_Variable(ztab,vn_id,locupdate=(/0,1/),procname = updateV) 79 ENDIF 80 81 CALL Agrif_Update_Variable(ztab2d,e1u_id,procname = updateU2d) 82 CALL Agrif_Update_Variable(ztab2d,e2v_id,procname = updateV2d) 83 84 #if defined key_dynspg_ts 72 # if ! defined DECAL_FEEDBACK 73 CALL Agrif_Update_Variable(un_update_id,procname = updateU) 74 CALL Agrif_Update_Variable(vn_update_id,procname = updateV) 75 # else 76 CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU) 77 CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV) 78 # endif 79 ELSE 80 # if ! defined DECAL_FEEDBACK 81 CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU) 82 CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV) 83 # else 84 CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU) 85 CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV) 86 # endif 87 ENDIF 88 89 # if ! defined DECAL_FEEDBACK 90 CALL Agrif_Update_Variable(e1u_id,procname = updateU2d) 91 CALL Agrif_Update_Variable(e2v_id,procname = updateV2d) 92 # else 93 CALL Agrif_Update_Variable(e1u_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU2d) 94 CALL Agrif_Update_Variable(e2v_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV2d) 95 # endif 96 97 # if defined key_dynspg_ts 85 98 IF (ln_bt_fw) THEN 86 99 ! Update time integrated transports 87 100 IF (mod(nbcline,nbclineupdate) == 0) THEN 88 CALL Agrif_Update_Variable(ztab2d,ub2b_id,procname = updateub2b) 89 CALL Agrif_Update_Variable(ztab2d,vb2b_id,procname = updatevb2b) 101 # if ! defined DECAL_FEEDBACK 102 CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b) 103 CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b) 104 # else 105 CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateub2b) 106 CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updatevb2b) 107 # endif 90 108 ELSE 91 CALL Agrif_Update_Variable(ztab2d,ub2b_id,locupdate=(/0,1/),procname = updateub2b) 92 CALL Agrif_Update_Variable(ztab2d,vb2b_id,locupdate=(/0,1/),procname = updatevb2b) 109 # if ! defined DECAL_FEEDBACK 110 CALL Agrif_Update_Variable(ub2b_update_id,locupdate=(/0,1/),procname = updateub2b) 111 CALL Agrif_Update_Variable(vb2b_update_id,locupdate=(/0,1/),procname = updatevb2b) 93 112 ENDIF 113 # else 114 CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateub2b) 115 CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updatevb2b) 116 # endif 94 117 END IF 118 # endif 119 ! 120 nbcline = nbcline + 1 121 ! 122 Agrif_UseSpecialValueInUpdate = .TRUE. 123 Agrif_SpecialValueFineGrid = 0. 124 # if ! defined DECAL_FEEDBACK 125 CALL Agrif_Update_Variable(sshn_id,procname = updateSSH) 126 # else 127 CALL Agrif_Update_Variable(sshn_id,locupdate=(/1,0/),procname = updateSSH) 128 # endif 129 Agrif_UseSpecialValueInUpdate = .FALSE. 130 ! 95 131 #endif 96 97 nbcline = nbcline + 198 99 Agrif_UseSpecialValueInUpdate = .TRUE.100 Agrif_SpecialValueFineGrid = 0.101 CALL Agrif_Update_Variable(ztab2d,sshn_id,procname = updateSSH)102 Agrif_UseSpecialValueInUpdate = .FALSE.103 104 CALL wrk_dealloc( jpi, jpj, ztab2d )105 CALL wrk_dealloc( jpi, jpj, jpk, ztab )106 107 !Done in step108 ! CALL Agrif_ChildGrid_To_ParentGrid()109 ! CALL recompute_diags( kt )110 ! CALL Agrif_ParentGrid_To_ChildGrid()111 112 #endif113 114 132 END SUBROUTINE Agrif_Update_Dyn 115 133 116 SUBROUTINE recompute_diags( kt )117 !!---------------------------------------------118 !! *** ROUTINE recompute_diags ***119 !!---------------------------------------------120 INTEGER, INTENT(in) :: kt121 122 END SUBROUTINE recompute_diags123 134 124 135 SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) … … 127 138 !!--------------------------------------------- 128 139 # include "domzgr_substitute.h90" 129 130 140 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 131 141 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 132 LOGICAL, iNTENT(in) :: before133 142 LOGICAL, INTENT(in) :: before 143 !! 134 144 INTEGER :: ji,jj,jk,jn 135 145 !!--------------------------------------------- 146 ! 136 147 IF (before) THEN 137 148 DO jn = n1,n2 … … 146 157 ELSE 147 158 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 148 ! Add asselin part159 ! Add asselin part 149 160 DO jn = n1,n2 150 161 DO jk=k1,k2 … … 161 172 ENDDO 162 173 ENDIF 163 164 174 DO jn = n1,n2 165 175 DO jk=k1,k2 … … 174 184 END DO 175 185 ENDIF 176 186 ! 177 187 END SUBROUTINE updateTS 178 188 … … 182 192 !!--------------------------------------------- 183 193 # include "domzgr_substitute.h90" 184 194 !! 185 195 INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 186 196 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 187 197 LOGICAL, INTENT(in) :: before 188 198 !! 189 199 INTEGER :: ji, jj, jk 190 200 REAL(wp) :: zrhoy 191 201 !!--------------------------------------------- 202 ! 192 203 IF (before) THEN 193 204 zrhoy = Agrif_Rhoy() … … 217 228 END DO 218 229 ENDIF 219 230 ! 220 231 END SUBROUTINE updateu 221 232 … … 225 236 !!--------------------------------------------- 226 237 # include "domzgr_substitute.h90" 227 238 !! 228 239 INTEGER :: i1,i2,j1,j2,k1,k2 229 240 INTEGER :: ji,jj,jk 230 241 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres 231 242 LOGICAL :: before 232 243 !! 233 244 REAL(wp) :: zrhox 234 245 !!--------------------------------------------- 246 ! 235 247 IF (before) THEN 236 248 zrhox = Agrif_Rhox() … … 260 272 END DO 261 273 ENDIF 262 274 ! 263 275 END SUBROUTINE updatev 264 276 … … 268 280 !!--------------------------------------------- 269 281 # include "domzgr_substitute.h90" 270 282 !! 271 283 INTEGER, INTENT(in) :: i1, i2, j1, j2 272 284 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 273 285 LOGICAL, INTENT(in) :: before 274 286 !! 275 287 INTEGER :: ji, jj, jk 276 288 REAL(wp) :: zrhoy 277 289 REAL(wp) :: zcorr 278 290 !!--------------------------------------------- 291 ! 279 292 IF (before) THEN 280 293 zrhoy = Agrif_Rhoy() … … 326 339 END DO 327 340 ENDIF 328 341 ! 329 342 END SUBROUTINE updateu2d 330 343 … … 333 346 !! *** ROUTINE updatev2d *** 334 347 !!--------------------------------------------- 335 336 348 INTEGER, INTENT(in) :: i1, i2, j1, j2 337 349 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 338 350 LOGICAL, INTENT(in) :: before 339 351 !! 340 352 INTEGER :: ji, jj, jk 341 353 REAL(wp) :: zrhox 342 354 REAL(wp) :: zcorr 343 355 !!--------------------------------------------- 356 ! 344 357 IF (before) THEN 345 358 zrhox = Agrif_Rhox() … … 391 404 END DO 392 405 ENDIF 393 406 ! 394 407 END SUBROUTINE updatev2d 408 395 409 396 410 SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) … … 398 412 !! *** ROUTINE updateSSH *** 399 413 !!--------------------------------------------- 400 # include "domzgr_substitute.h90"401 402 414 INTEGER, INTENT(in) :: i1, i2, j1, j2 403 415 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 404 416 LOGICAL, INTENT(in) :: before 405 417 !! 406 418 INTEGER :: ji, jj 407 419 !!--------------------------------------------- 420 ! 408 421 IF (before) THEN 409 422 DO jj=j1,j2 … … 413 426 END DO 414 427 ELSE 415 416 428 #if ! defined key_dynspg_ts 417 429 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN … … 430 442 END DO 431 443 ENDIF 432 444 ! 433 445 END SUBROUTINE updateSSH 434 446 … … 437 449 !! *** ROUTINE updateub2b *** 438 450 !!--------------------------------------------- 439 440 451 INTEGER, INTENT(in) :: i1, i2, j1, j2 441 452 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 442 453 LOGICAL, INTENT(in) :: before 443 454 !! 444 455 INTEGER :: ji, jj 445 456 REAL(wp) :: zrhoy 446 457 !!--------------------------------------------- 458 ! 447 459 IF (before) THEN 448 460 zrhoy = Agrif_Rhoy() … … 460 472 END DO 461 473 ENDIF 462 474 ! 463 475 END SUBROUTINE updateub2b 464 476 … … 467 479 !! *** ROUTINE updatevb2b *** 468 480 !!--------------------------------------------- 469 470 481 INTEGER, INTENT(in) :: i1, i2, j1, j2 471 482 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 472 483 LOGICAL, INTENT(in) :: before 473 484 !! 474 485 INTEGER :: ji, jj 475 486 REAL(wp) :: zrhox 476 487 !!--------------------------------------------- 488 ! 477 489 IF (before) THEN 478 490 zrhox = Agrif_Rhox() … … 490 502 END DO 491 503 ENDIF 492 504 ! 493 505 END SUBROUTINE updatevb2b 506 507 508 SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before ) 509 ! currently not used 510 !!--------------------------------------------- 511 !! *** ROUTINE updateT *** 512 !!--------------------------------------------- 513 # include "domzgr_substitute.h90" 514 515 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 516 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 517 LOGICAL, iNTENT(in) :: before 518 519 INTEGER :: ji,jj,jk 520 REAL(wp) :: ztemp 521 522 IF (before) THEN 523 DO jk=k1,k2 524 DO jj=j1,j2 525 DO ji=i1,i2 526 tabres(ji,jj,jk,1) = e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk) 527 tabres(ji,jj,jk,2) = e1t(ji,jj)*tmask(ji,jj,jk) 528 tabres(ji,jj,jk,3) = e2t(ji,jj)*tmask(ji,jj,jk) 529 END DO 530 END DO 531 END DO 532 tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy() 533 tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox() 534 tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy() 535 ELSE 536 DO jk=k1,k2 537 DO jj=j1,j2 538 DO ji=i1,i2 539 IF( tabres(ji,jj,jk,1) .NE. 0. ) THEN 540 print *,'VAL = ',ji,jj,jk,tabres(ji,jj,jk,1),e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk) 541 print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk) 542 print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk) 543 ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3))) 544 print *,'CORR = ',ztemp-1. 545 print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, & 546 tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp 547 e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp 548 e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp 549 END IF 550 END DO 551 END DO 552 END DO 553 ENDIF 554 555 END SUBROUTINE update_scales 494 556 495 557 #else
Note: See TracChangeset
for help on using the changeset viewer.