- Timestamp:
- 2017-09-06T17:47:28+02:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv_umx.F90
r8486 r8504 43 43 CONTAINS 44 44 45 SUBROUTINE ice_adv_umx( kt, pdt, puc, pvc, pubox, pvbox, ptc ) 45 SUBROUTINE ice_adv_umx( kt, pu_ice, pv_ice, & 46 & pato_i, pv_i, pv_s, psmv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 46 47 !!---------------------------------------------------------------------- 47 48 !! *** ROUTINE ice_adv_umx *** 49 !! 50 !! ** Purpose : Compute the now trend due to total advection of 51 !! tracers and add it to the general trend of tracer equations 52 !! using an "Ultimate-Macho" scheme 53 !! 54 !! Reference : Leonard, B.P., 1991, Comput. Methods Appl. Mech. Eng., 88, 17-74. 55 !!---------------------------------------------------------------------- 56 INTEGER , INTENT(in ) :: kt ! time step 57 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pu_ice ! ice i-velocity 58 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pv_ice ! ice j-velocity 59 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: pato_i ! open water area 60 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i ! ice volume 61 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_s ! snw volume 62 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: psmv_i ! salt content 63 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: poa_i ! age content 64 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_i ! ice concentration 65 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 66 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 67 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 68 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content 69 ! 70 INTEGER :: ji, jj, jk, jl, jt ! dummy loop indices 71 INTEGER :: initad ! number of sub-timestep for the advection 72 REAL(wp) :: zcfl , zusnit, zdt ! - - 73 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zudy, zvdx, zcu_box, zcv_box 74 !!---------------------------------------------------------------------- 75 ! 76 IF( kt == nit000 .AND. lwp ) THEN 77 WRITE(numout,*) 78 WRITE(numout,*) 'ice_adv_umx : Ultimate-MACHO advection scheme' 79 WRITE(numout,*) '~~~~~~~~~~~' 80 ENDIF 81 ! 82 ALLOCATE( zudy(jpi,jpj) , zvdx(jpi,jpj) , zcu_box(jpi,jpj) , zcv_box(jpi,jpj) ) 83 ! 84 ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- ! 85 zcfl = MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 86 zcfl = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 87 IF( lk_mpp ) CALL mpp_max( zcfl ) 88 89 IF( zcfl > 0.5 ) THEN ; initad = 2 ; zusnit = 0.5_wp 90 ELSE ; initad = 1 ; zusnit = 1.0_wp 91 ENDIF 92 93 zdt = rdt_ice / REAL(initad) 94 95 ! --- transport --- ! 96 zudy(:,:) = pu_ice(:,:) * e2u(:,:) 97 zvdx(:,:) = pv_ice(:,:) * e1v(:,:) 98 99 ! --- define velocity for advection: u*grad(H) --- ! 100 DO jj = 2, jpjm1 101 DO ji = fs_2, fs_jpim1 102 IF ( pu_ice(ji,jj) * pu_ice(ji-1,jj) <= 0._wp ) THEN ; zcu_box(ji,jj) = 0._wp 103 ELSEIF( pu_ice(ji,jj) > 0._wp ) THEN ; zcu_box(ji,jj) = pu_ice(ji-1,jj) 104 ELSE ; zcu_box(ji,jj) = pu_ice(ji ,jj) 105 ENDIF 106 107 IF ( pv_ice(ji,jj) * pv_ice(ji,jj-1) <= 0._wp ) THEN ; zcv_box(ji,jj) = 0._wp 108 ELSEIF( pv_ice(ji,jj) > 0._wp ) THEN ; zcv_box(ji,jj) = pv_ice(ji,jj-1) 109 ELSE ; zcv_box(ji,jj) = pv_ice(ji,jj ) 110 ENDIF 111 END DO 112 END DO 113 114 !---------------! 115 !== advection ==! 116 !---------------! 117 DO jt = 1, initad 118 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pato_i(:,:) ) ! Open water area 119 DO jl = 1, jpl 120 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pa_i(:,:,jl) ) ! Ice area 121 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_i(:,:,jl) ) ! Ice volume 122 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, psmv_i(:,:,jl) ) ! Salt content 123 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, poa_i (:,:,jl) ) ! Age content 124 DO jk = 1, nlay_i 125 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pe_i(:,:,jk,jl) ) ! Ice heat content 126 END DO 127 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_s(:,:,jl) ) ! Snow volume 128 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pe_s(:,:,1,jl) ) ! Snow heat content 129 IF ( nn_pnd_scheme > 0 ) THEN 130 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pa_ip(:,:,jl) ) ! Melt pond fraction 131 CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_ip(:,:,jl) ) ! Melt pond volume 132 ENDIF 133 END DO 134 END DO 135 ! 136 DEALLOCATE( zudy, zvdx, zcu_box, zcv_box ) 137 ! 138 END SUBROUTINE ice_adv_umx 139 140 SUBROUTINE adv_umx( kt, pdt, puc, pvc, pubox, pvbox, ptc ) 141 !!---------------------------------------------------------------------- 142 !! *** ROUTINE adv_umx *** 48 143 !! 49 144 !! ** Purpose : Compute the now trend due to total advection of … … 146 241 IF( nn_timing == 1 ) CALL timing_stop('ice_adv_umx') 147 242 ! 148 END SUBROUTINE ice_adv_umx243 END SUBROUTINE adv_umx 149 244 150 245
Note: See TracChangeset
for help on using the changeset viewer.