[3] | 1 | MODULE trdtra |
---|
| 2 | !!====================================================================== |
---|
| 3 | !! *** MODULE trdtra *** |
---|
| 4 | !! Ocean diagnostics: ocean tracer trends |
---|
| 5 | !!===================================================================== |
---|
| 6 | #if defined key_trdtra || defined key_esopa |
---|
| 7 | !!---------------------------------------------------------------------- |
---|
| 8 | !! 'key_trdtra' or tracer trend diagnostics |
---|
| 9 | !! 'key_trdmld' mixed layer trend diagnostics |
---|
| 10 | !!---------------------------------------------------------------------- |
---|
| 11 | |
---|
| 12 | !!---------------------------------------------------------------------- |
---|
| 13 | !! trd_tra : verify the basin averaged properties for tracers |
---|
| 14 | !! trd_tra_init : ??? |
---|
| 15 | !!---------------------------------------------------------------------- |
---|
| 16 | !! * Modules used |
---|
| 17 | USE oce ! ocean dynamics and tracers variables |
---|
| 18 | USE dom_oce ! ocean space and time domain variables |
---|
| 19 | USE trdtra_oce ! ocean active tracer trend variables |
---|
| 20 | USE trddyn_oce ! ocean dynamics trend variables |
---|
| 21 | USE ldftra_oce ! ocean active tracers: lateral physics |
---|
| 22 | USE ldfdyn_oce ! ocean dynamics: lateral physics |
---|
| 23 | USE zdf_oce ! ocean vertical physics |
---|
| 24 | USE in_out_manager ! I/O manager |
---|
| 25 | USE lib_mpp ! distibuted memory computing library |
---|
| 26 | |
---|
| 27 | IMPLICIT NONE |
---|
| 28 | PRIVATE |
---|
| 29 | |
---|
| 30 | !! * Routine accessibility |
---|
| 31 | PUBLIC trd_tra ! called by step.F90 |
---|
| 32 | PUBLIC trd_tra_init ! called by opa.F90 |
---|
| 33 | |
---|
| 34 | !! * Shared module variables |
---|
[16] | 35 | LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .TRUE. !: momentum trend flag |
---|
[3] | 36 | |
---|
| 37 | !! * Substitutions |
---|
| 38 | # include "domzgr_substitute.h90" |
---|
| 39 | # include "vectopt_loop_substitute.h90" |
---|
| 40 | !!---------------------------------------------------------------------- |
---|
| 41 | !! OPA 9.0 , LODYC-IPSL (2003) |
---|
| 42 | !!---------------------------------------------------------------------- |
---|
| 43 | |
---|
| 44 | CONTAINS |
---|
| 45 | |
---|
| 46 | SUBROUTINE trd_tra( kt ) |
---|
| 47 | !!--------------------------------------------------------------------- |
---|
| 48 | !! *** ROUTINE trd_tra *** |
---|
| 49 | !! |
---|
| 50 | !! ** Purpose : verify the basin averaged properties of the tracers |
---|
| 51 | !! equations at every time step frequency ntrd. |
---|
| 52 | !! |
---|
| 53 | !! Method : |
---|
| 54 | !! |
---|
| 55 | !! History : |
---|
| 56 | !! ! 91-12 (G. Madec) |
---|
| 57 | !! ! 92-06 (M. Imbard) add time step frequency |
---|
| 58 | !! ! 96-01 (G. Madec) terrain following coordinates |
---|
| 59 | !! 8.5 ! 02-06 (G. Madec) F90: Free form and module |
---|
| 60 | !!---------------------------------------------------------------------- |
---|
| 61 | !! * Arguments |
---|
| 62 | INTEGER, INTENT( in ) :: kt ! ocean time-step index |
---|
| 63 | |
---|
| 64 | !! * Local declarations |
---|
| 65 | INTEGER :: ji, jj, jk, jn |
---|
| 66 | REAL(wp) :: zbt |
---|
| 67 | REAL(wp), DIMENSION(10) :: ztmo, zsmo, zt2, zs2 |
---|
| 68 | |
---|
| 69 | NAMELIST/namtrd/ ntrd, nctls |
---|
| 70 | !!---------------------------------------------------------------------- |
---|
| 71 | |
---|
| 72 | ! 0. Initialization |
---|
| 73 | ! ----------------- |
---|
| 74 | |
---|
| 75 | IF( kt == nit000 ) THEN |
---|
| 76 | |
---|
| 77 | ! namelist namtrd : trend diagnostic |
---|
| 78 | REWIND( numnam ) |
---|
| 79 | READ ( numnam, namtrd ) |
---|
| 80 | |
---|
| 81 | IF(lwp) THEN |
---|
| 82 | WRITE(numout,*) 'trd_tra : read namelist namtrd' |
---|
| 83 | WRITE(numout,*) '~~~~~~~' |
---|
| 84 | WRITE(numout,*) ' time step frequency trend ntrd = ', ntrd |
---|
| 85 | WRITE(numout,*) ' ' |
---|
| 86 | ENDIF |
---|
| 87 | |
---|
| 88 | ! Total volume at t-points: |
---|
| 89 | tvolt = 0. |
---|
| 90 | DO jk = 1, jpkm1 |
---|
| 91 | DO jj = 2, jpjm1 |
---|
| 92 | DO ji = fs_2, fs_jpim1 ! vector opt. |
---|
| 93 | tvolt = tvolt + e1t(ji,jj) *e2t(ji,jj) * fse3t(ji,jj,jk)* tmask(ji,jj,jk) * tmask_i(ji,jj) |
---|
| 94 | END DO |
---|
| 95 | END DO |
---|
| 96 | END DO |
---|
[16] | 97 | IF( lk_mpp ) CALL mpp_sum( tvolt ) ! sum over the global domain |
---|
| 98 | |
---|
[3] | 99 | IF(lwp) THEN |
---|
| 100 | WRITE(numout,*) |
---|
| 101 | WRITE(numout,*) '***trd_tra' |
---|
| 102 | WRITE(numout,*) ' frequency ntrd = ',ntrd |
---|
| 103 | WRITE(numout,*) ' ' |
---|
| 104 | WRITE(numout,*) ' tvolt = ',tvolt |
---|
| 105 | WRITE(numout,*) ' ' |
---|
| 106 | ENDIF |
---|
| 107 | |
---|
| 108 | ENDIF |
---|
| 109 | |
---|
| 110 | |
---|
| 111 | ! 1. Advective trends and forcing trend |
---|
| 112 | ! ------------------------------------- |
---|
| 113 | |
---|
| 114 | IF( MOD(kt,ntrd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN |
---|
| 115 | |
---|
| 116 | ! 1.1 Mask the forcing trend and substract it from the vertical diffusion trend |
---|
| 117 | flxtrd(:,:,1) = flxtrd(:,:,1) * tmask_i(:,:) |
---|
| 118 | flxtrd(:,:,2) = flxtrd(:,:,2) * tmask_i(:,:) |
---|
| 119 | |
---|
| 120 | ! 1.2 Mask the trends |
---|
| 121 | DO jn = 1, 6 |
---|
| 122 | DO jk = 1, jpk |
---|
| 123 | ttrd(:,:,jk,jn) = ttrd(:,:,jk,jn)* tmask(:,:,jk) * tmask_i(:,:) |
---|
| 124 | strd(:,:,jk,jn) = strd(:,:,jk,jn)* tmask(:,:,jk) * tmask_i(:,:) |
---|
| 125 | END DO |
---|
| 126 | END DO |
---|
| 127 | |
---|
| 128 | DO jk = 1, jpk |
---|
| 129 | ttrd(:,:,jk,7) = ttrd(:,:,jk,7) * tmask(:,:,jk) * tmask_i(:,:) |
---|
| 130 | END DO |
---|
| 131 | |
---|
| 132 | |
---|
| 133 | ! 2. Basin averaged tracer trend |
---|
| 134 | ! ------------------------------ |
---|
| 135 | |
---|
| 136 | DO jn = 1, 6 |
---|
| 137 | ztmo(jn) = 0. |
---|
| 138 | zsmo(jn) = 0. |
---|
| 139 | DO jk = 1, jpkm1 |
---|
| 140 | DO jj = 1, jpj |
---|
| 141 | DO ji = 1, jpi |
---|
| 142 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) |
---|
| 143 | ztmo(jn) = ztmo(jn) + ttrd(ji,jj,jk,jn) * zbt |
---|
| 144 | zsmo(jn) = zsmo(jn) + strd(ji,jj,jk,jn) * zbt |
---|
| 145 | END DO |
---|
| 146 | END DO |
---|
| 147 | END DO |
---|
| 148 | END DO |
---|
| 149 | |
---|
| 150 | ztmo(7) = 0. |
---|
| 151 | DO jk = 1, jpk |
---|
| 152 | DO jj = 1, jpj |
---|
| 153 | DO ji = 1, jpi |
---|
| 154 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) |
---|
| 155 | ztmo(7) = ztmo(7) + ttrd(ji,jj,jk,7) * zbt |
---|
| 156 | END DO |
---|
| 157 | END DO |
---|
| 158 | END DO |
---|
| 159 | |
---|
| 160 | ztmo(8) = 0. |
---|
| 161 | zsmo(8) = 0. |
---|
| 162 | DO jj = 1, jpj |
---|
| 163 | DO ji = 1, jpi |
---|
| 164 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) |
---|
| 165 | ztmo(8) = ztmo(8) + flxtrd(ji,jj,1) * zbt |
---|
| 166 | zsmo(8) = zsmo(8) + flxtrd(ji,jj,2) * zbt |
---|
| 167 | END DO |
---|
| 168 | END DO |
---|
| 169 | |
---|
| 170 | |
---|
| 171 | ! 3. Basin averaged tracer square trend |
---|
| 172 | ! ------------------------------------- |
---|
| 173 | ! c a u t i o n: field before, because after the array swap |
---|
| 174 | |
---|
| 175 | DO jn = 1, 6 |
---|
| 176 | zt2(jn) = 0.e0 |
---|
| 177 | zs2(jn) = 0.e0 |
---|
| 178 | DO jk = 1, jpk |
---|
| 179 | DO jj = 1, jpj |
---|
| 180 | DO ji = 1, jpi |
---|
| 181 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) |
---|
| 182 | zt2(jn) = zt2(jn) + ttrd(ji,jj,jk,jn) * zbt * tb(ji,jj,jk) |
---|
| 183 | zs2(jn) = zs2(jn) + strd(ji,jj,jk,jn) * zbt * sb(ji,jj,jk) |
---|
| 184 | END DO |
---|
| 185 | END DO |
---|
| 186 | END DO |
---|
| 187 | END DO |
---|
| 188 | |
---|
| 189 | zt2(7) = 0.e0 |
---|
| 190 | DO jk = 1, jpk |
---|
| 191 | DO jj = 1, jpj |
---|
| 192 | DO ji = 1, jpi |
---|
| 193 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) |
---|
| 194 | zt2(7) = zt2(7) + ttrd(ji,jj,jk,7) * zbt * tb(ji,jj,jk) |
---|
| 195 | END DO |
---|
| 196 | END DO |
---|
| 197 | END DO |
---|
| 198 | |
---|
| 199 | zt2(8) = 0.e0 |
---|
| 200 | zs2(8) = 0.e0 |
---|
| 201 | DO jj = 1, jpj |
---|
| 202 | DO ji = 1, jpi |
---|
| 203 | zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) |
---|
| 204 | zt2(8) = zt2(8) + flxtrd(ji,jj,1) * zbt * tb(ji,jj,1) |
---|
| 205 | zs2(8) = zs2(8) + flxtrd(ji,jj,2) * zbt * sb(ji,jj,1) |
---|
| 206 | END DO |
---|
| 207 | END DO |
---|
| 208 | |
---|
[16] | 209 | IF( lk_mpp ) THEN |
---|
| 210 | CALL mpp_sum( ztmo, 10 ) ! sums over the global domain |
---|
| 211 | CALL mpp_sum( zsmo, 10 ) |
---|
| 212 | CALL mpp_sum( zt2 , 10 ) |
---|
| 213 | CALL mpp_sum( zs2 , 10 ) |
---|
| 214 | ENDIF |
---|
[3] | 215 | |
---|
| 216 | ! 4. Print |
---|
| 217 | ! -------- |
---|
| 218 | |
---|
| 219 | IF(lwp) THEN |
---|
| 220 | WRITE (numout,*) |
---|
| 221 | WRITE (numout,*) |
---|
| 222 | WRITE (numout,9400) kt |
---|
| 223 | WRITE (numout,9401) ztmo(1) / tvolt, zsmo(1) / tvolt |
---|
| 224 | WRITE (numout,9402) ztmo(2) / tvolt, zsmo(2) / tvolt |
---|
| 225 | WRITE (numout,9403) ztmo(3) / tvolt, zsmo(3) / tvolt |
---|
| 226 | WRITE (numout,9404) ztmo(4) / tvolt, zsmo(4) / tvolt |
---|
| 227 | WRITE (numout,9405) ztmo(5) / tvolt, zsmo(5) / tvolt |
---|
| 228 | WRITE (numout,9406) ztmo(6) / tvolt, zsmo(6) / tvolt |
---|
| 229 | WRITE (numout,9407) ztmo(7) / tvolt |
---|
| 230 | WRITE (numout,9408) ztmo(8) / tvolt, zsmo(8) / tvolt |
---|
| 231 | WRITE (numout,9409) |
---|
| 232 | WRITE (numout,9410) ( ztmo(1) + ztmo(2) + ztmo(3) + ztmo(4) & |
---|
| 233 | & + ztmo(5) + ztmo(6) + ztmo(7) + ztmo(8) ) / tvolt, & |
---|
| 234 | & ( zsmo(1) + zsmo(2) + zsmo(3) + zsmo(4) & |
---|
| 235 | & + zsmo(5) + zsmo(6) + zsmo(8) ) / tvolt |
---|
| 236 | ENDIF |
---|
| 237 | |
---|
| 238 | 9400 FORMAT(' tracer trend at it= ',i6,' : temperature', & |
---|
| 239 | ' salinity',/' ============================') |
---|
| 240 | 9401 FORMAT(' horizontal advection ',e20.13,' ',e20.13) |
---|
| 241 | 9402 FORMAT(' vertical advection ',e20.13,' ',e20.13) |
---|
| 242 | 9403 FORMAT(' horizontal diffusion ',e20.13,' ',e20.13) |
---|
| 243 | 9404 FORMAT(' vertical diffusion ',e20.13,' ',e20.13) |
---|
| 244 | 9405 FORMAT(' STATIC instability mixing ',e20.13,' ',e20.13) |
---|
| 245 | 9406 FORMAT(' damping term ',e20.13,' ',e20.13) |
---|
| 246 | 9407 FORMAT(' penetrative qsr ',e20.13,' ',e20.13) |
---|
| 247 | 9408 FORMAT(' forcing term ',e20.13,' ',e20.13) |
---|
| 248 | 9409 FORMAT(' -------------------------------------------------------------------------') |
---|
| 249 | 9410 FORMAT(' total trend ',e20.13,' ',e20.13) |
---|
| 250 | |
---|
| 251 | |
---|
| 252 | IF(lwp) THEN |
---|
| 253 | WRITE (numout,*) |
---|
| 254 | WRITE (numout,*) |
---|
| 255 | WRITE (numout,9420) kt |
---|
| 256 | WRITE (numout,9421) zt2(1) / tvolt, zs2(1) / tvolt |
---|
| 257 | WRITE (numout,9422) zt2(2) / tvolt, zs2(2) / tvolt |
---|
| 258 | WRITE (numout,9423) zt2(3) / tvolt, zs2(3) / tvolt |
---|
| 259 | WRITE (numout,9424) zt2(4) / tvolt, zs2(4) / tvolt |
---|
| 260 | WRITE (numout,9425) zt2(5) / tvolt, zs2(5) / tvolt |
---|
| 261 | WRITE (numout,9426) zt2(6) / tvolt, zs2(6) / tvolt |
---|
| 262 | WRITE (numout,9427) zt2(7) / tvolt |
---|
| 263 | WRITE (numout,9428) zt2(8) / tvolt, zs2(8) / tvolt |
---|
| 264 | WRITE (numout,9429) |
---|
| 265 | WRITE (numout,9430) ( zt2(1) + zt2(2) + zt2(3) + zt2(4) & |
---|
| 266 | & + zt2(5) + zt2(6) + zt2(7) + zt2(8) ) / tvolt, & |
---|
| 267 | & ( zs2(1) + zs2(2) + zs2(3) + zs2(4) & |
---|
| 268 | & + zs2(5) + zs2(6) + zs2(8) ) / tvolt |
---|
| 269 | ENDIF |
---|
| 270 | |
---|
| 271 | 9420 FORMAT(' tracer**2 trend at it= ', i6, ' : temperature', & |
---|
| 272 | ' salinity', /, ' ===============================') |
---|
| 273 | 9421 FORMAT(' horizontal advection * t ', e20.13, ' ', e20.13) |
---|
| 274 | 9422 FORMAT(' vertical advection * t ', e20.13, ' ', e20.13) |
---|
| 275 | 9423 FORMAT(' horizontal diffusion * t ', e20.13, ' ', e20.13) |
---|
| 276 | 9424 FORMAT(' vertical diffusion * t ', e20.13, ' ', e20.13) |
---|
| 277 | 9425 FORMAT(' STATIC instability mixing * t ', e20.13, ' ', e20.13) |
---|
| 278 | 9426 FORMAT(' damping term * t ', e20.13, ' ', e20.13) |
---|
| 279 | 9427 FORMAT(' penetrative qsr * t ', e20.13, ' ', e20.13) |
---|
| 280 | 9428 FORMAT(' forcing term * t ', e20.13, ' ', e20.13) |
---|
| 281 | 9429 FORMAT(' -----------------------------------------------------------------------------') |
---|
| 282 | 9430 FORMAT(' total trend *t = ', e20.13, ' *s = ', e20.13) |
---|
| 283 | |
---|
| 284 | |
---|
| 285 | IF(lwp) THEN |
---|
| 286 | WRITE (numout,*) |
---|
| 287 | WRITE (numout,*) |
---|
| 288 | WRITE (numout,9440) kt |
---|
| 289 | WRITE (numout,9441) ( ztmo(1)+ztmo(2) )/tvolt, ( zsmo(1)+zsmo(2) )/tvolt |
---|
| 290 | WRITE (numout,9442) ztmo(3)/tvolt, zsmo(3)/tvolt |
---|
| 291 | WRITE (numout,9443) ztmo(4)/tvolt, zsmo(4)/tvolt |
---|
| 292 | WRITE (numout,9444) ztmo(5)/tvolt, zsmo(5)/tvolt |
---|
| 293 | WRITE (numout,9445) ( zt2(1)+zt2(2) )/tvolt, ( zs2(1)+zs2(2) )/tvolt |
---|
| 294 | WRITE (numout,9446) zt2(3)/tvolt, zs2(3)/tvolt |
---|
| 295 | WRITE (numout,9447) zt2(4)/tvolt, zs2(4)/tvolt |
---|
| 296 | WRITE (numout,9448) zt2(5)/tvolt, zs2(5)/tvolt |
---|
| 297 | ENDIF |
---|
| 298 | |
---|
| 299 | 9440 FORMAT(' tracer consistency at it= ',i6, & |
---|
| 300 | ' : temperature',' salinity',/, & |
---|
| 301 | ' ==================================') |
---|
| 302 | 9441 FORMAT(' 0 = horizontal+vertical advection ',e20.13,' ',e20.13) |
---|
| 303 | 9442 FORMAT(' 0 = horizontal diffusion ',e20.13,' ',e20.13) |
---|
| 304 | 9443 FORMAT(' 0 = vertical diffusion ',e20.13,' ',e20.13) |
---|
| 305 | 9444 FORMAT(' 0 = static instability mixing ',e20.13,' ',e20.13) |
---|
| 306 | 9445 FORMAT(' 0 = horizontal+vertical advection * t ',e20.13,' ',e20.13) |
---|
| 307 | 9446 FORMAT(' 0 > horizontal diffusion * t ',e20.13,' ',e20.13) |
---|
| 308 | 9447 FORMAT(' 0 > vertical diffusion * t ',e20.13,' ',e20.13) |
---|
| 309 | 9448 FORMAT(' 0 > static instability mixing * t ',e20.13,' ',e20.13) |
---|
| 310 | ENDIF |
---|
| 311 | |
---|
| 312 | END SUBROUTINE trd_tra |
---|
| 313 | |
---|
| 314 | |
---|
| 315 | SUBROUTINE trd_tra_init |
---|
| 316 | !!--------------------------------------------------------------------- |
---|
| 317 | !! *** ROUTINE trd_tra_init *** |
---|
| 318 | !! |
---|
| 319 | !! ** Purpose : |
---|
| 320 | !! |
---|
| 321 | !! ** Method : |
---|
| 322 | !! |
---|
| 323 | !! History : |
---|
| 324 | !! 9.0 ! 03-09 (G. Madec) Original code |
---|
| 325 | !!---------------------------------------------------------------------- |
---|
| 326 | !! * Local declarations |
---|
| 327 | INTEGER :: ji, jj, jk |
---|
| 328 | |
---|
| 329 | NAMELIST/namtrd/ ntrd, nctls |
---|
| 330 | !!---------------------------------------------------------------------- |
---|
| 331 | |
---|
| 332 | ! set to zero the tracers trends |
---|
| 333 | ttrd (:,:,:,:) = 0.e0 |
---|
| 334 | strd (:,:,:,:) = 0.e0 |
---|
| 335 | ttrdh (:,:,:,:) = 0.e0 |
---|
| 336 | strdh (:,:,:,:) = 0.e0 |
---|
| 337 | flxtrd(:,:, :) = 0.e0 |
---|
| 338 | |
---|
| 339 | ! namelist namtrd : trend diagnostic |
---|
| 340 | REWIND( numnam ) |
---|
| 341 | READ ( numnam, namtrd ) |
---|
| 342 | |
---|
| 343 | IF(lwp) THEN |
---|
| 344 | WRITE(numout,*) |
---|
| 345 | WRITE(numout,*) 'trd_tra : read namelist namtrd' |
---|
| 346 | WRITE(numout,*) '~~~~~~~' |
---|
| 347 | WRITE(numout,*) ' time step frequency trend ntrd = ', ntrd |
---|
| 348 | ENDIF |
---|
| 349 | |
---|
| 350 | ! Total volume at t-points: |
---|
| 351 | tvolt = 0. |
---|
| 352 | DO jk = 1, jpkm1 |
---|
| 353 | DO jj = 2, jpjm1 |
---|
| 354 | DO ji = fs_2, fs_jpim1 ! vector opt. |
---|
| 355 | tvolt = tvolt + e1t(ji,jj) *e2t(ji,jj) * fse3t(ji,jj,jk)* tmask(ji,jj,jk) * tmask_i(ji,jj) |
---|
| 356 | END DO |
---|
| 357 | END DO |
---|
| 358 | END DO |
---|
[16] | 359 | IF( lk_mpp ) CALL mpp_sum( tvolt ) ! sum over the global domain |
---|
[3] | 360 | |
---|
[16] | 361 | IF(lwp) WRITE(numout,*) ' total ocean volume at T-point tvolt = ',tvolt |
---|
| 362 | |
---|
[3] | 363 | END SUBROUTINE trd_tra_init |
---|
| 364 | |
---|
| 365 | # else |
---|
| 366 | !!---------------------------------------------------------------------- |
---|
| 367 | !! Default case : Empty module |
---|
| 368 | !!---------------------------------------------------------------------- |
---|
[16] | 369 | LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .FALSE. !: momentum trend flag |
---|
[3] | 370 | CONTAINS |
---|
| 371 | SUBROUTINE trd_tra( kt ) ! Empty routine |
---|
[16] | 372 | WRITE(*,*) 'trd_tra: You should not have seen this print! error?', kt |
---|
[3] | 373 | END SUBROUTINE trd_tra |
---|
| 374 | SUBROUTINE trd_tra_init ! Empty routine |
---|
| 375 | END SUBROUTINE trd_tra_init |
---|
| 376 | #endif |
---|
| 377 | |
---|
| 378 | !!====================================================================== |
---|
| 379 | END MODULE trdtra |
---|