[3] | 1 | !!--------------------------------------------------------------------- |
---|
| 2 | !! diawri_fdir.h90 |
---|
| 3 | !! ******************* |
---|
| 4 | !!--------------------------------------------------------------------- |
---|
| 5 | !! dia_wri : create the standart direct access output files |
---|
| 6 | !!--------------------------------------------------------------------- |
---|
| 7 | |
---|
| 8 | SUBROUTINE dia_wri ( kt, kindic ) |
---|
| 9 | !!--------------------------------------------------------------------- |
---|
| 10 | !! *** ROUTINE diawri *** |
---|
| 11 | !! |
---|
| 12 | !! ** Purpose : Standard output of opa: dynamics and tracer fields |
---|
| 13 | !! in direct access format |
---|
| 14 | !! |
---|
| 15 | !! ** Method : At the first time step (nit000), output of the grid- |
---|
| 16 | !! point position and depth and of the mask at t-point. |
---|
| 17 | !! Each nwrite time step, output of velocity fields (un,vn,wn) |
---|
| 18 | !! tracer fields (tn,sn) and three two dimensional selected fields, |
---|
| 19 | !! usually the thermohaline forcing fields (q, e, qsr). |
---|
| 20 | !! If kindic <0, output of fields before the model interruption. |
---|
| 21 | !! If kindic =0, time step loop |
---|
| 22 | !! If kindic >0, output of fields before the time step loop |
---|
| 23 | !! |
---|
| 24 | !! History : |
---|
| 25 | !! ! 91-03 () Original code |
---|
| 26 | !! ! 91-11 (G. Madec) |
---|
| 27 | !! ! 92-06 (M. Imbard) correction restart file |
---|
| 28 | !! ! 92-07 (M. Imbard) split into diawri and rstwri |
---|
| 29 | !! ! 93-03 (M. Imbard) suppress writibm |
---|
| 30 | !! ! 94-12 (M. Imbard) access direct format |
---|
| 31 | !! 8.5 ! 02-09 (G. Madec) F90: Free form and module |
---|
| 32 | !!---------------------------------------------------------------------- |
---|
| 33 | !! * Arguments |
---|
| 34 | INTEGER, INTENT( in ) :: kt ! ocean time-step index |
---|
| 35 | INTEGER, INTENT( in ) :: kindic ! |
---|
| 36 | |
---|
| 37 | !! * Save variables |
---|
| 38 | INTEGER, SAVE :: & |
---|
| 39 | nmoyct, & ! time-step counter for averaging |
---|
| 40 | nstepo ! output number |
---|
| 41 | # if ! defined key_diainstant |
---|
| 42 | REAL(wp), SAVE, DIMENSION(jpi,jpj,jpk) :: & |
---|
| 43 | um, vm, wm, & ! average value of velocity components |
---|
| 44 | tm, sm, & ! average value of temperature and salinity |
---|
| 45 | am, & ! average value of vert.diffusivity coef. |
---|
| 46 | fsel ! average value of 2D fields collected in a 2D one |
---|
| 47 | # endif |
---|
| 48 | |
---|
| 49 | !! * Local declarations |
---|
| 50 | INTEGER :: inum = 11 ! temporary logical unit |
---|
| 51 | INTEGER :: inbrec, inbsel |
---|
| 52 | INTEGER :: jk, jc |
---|
| 53 | INTEGER :: ilglo, ibloc, ierror, ic |
---|
| 54 | REAL(wp) :: zmoyctr |
---|
| 55 | #if defined key_diainstant |
---|
| 56 | REAL(wp), DIMENSION(jpi,jpj,jpk) :: & |
---|
| 57 | zsel ! temporary array for 2D fields collected in a 3D one |
---|
| 58 | #endif |
---|
| 59 | CHARACTER (len=40) :: clhstnam |
---|
| 60 | CHARACTER (len=21) :: cldir, clunf, clunk |
---|
| 61 | CHARACTER (len=80) :: classign |
---|
| 62 | !!---------------------------------------------------------------------- |
---|
| 63 | |
---|
| 64 | |
---|
| 65 | ! 1. Initialization |
---|
| 66 | ! ----------------- |
---|
| 67 | |
---|
| 68 | inbrec = 7 |
---|
| 69 | inbsel = 13 |
---|
| 70 | |
---|
| 71 | IF( kt == nit000 .AND. kindic > 0 ) THEN |
---|
| 72 | |
---|
| 73 | ! 0.1 Open specifier |
---|
| 74 | |
---|
| 75 | clunk = 'UNKNOWN' |
---|
| 76 | clunf = 'UNFORMATTED' |
---|
| 77 | cldir = 'DIRECT' |
---|
| 78 | |
---|
| 79 | ! computation of the record length for direct access file |
---|
| 80 | ! this length depend of 512 for the t3d machine |
---|
| 81 | |
---|
| 82 | ibloc = 4096 |
---|
| 83 | ilglo = ibloc*( (jpiglo*jpjglo*jpbytda-1 )/ibloc+1) |
---|
| 84 | |
---|
| 85 | CALL dia_nam(clhstnam,nwrite,' ') |
---|
| 86 | DO jc=1,40 |
---|
| 87 | IF( clhstnam(jc:jc) == ' ' ) go to 120 |
---|
| 88 | END DO |
---|
| 89 | 120 CONTINUE |
---|
| 90 | ic=jc |
---|
| 91 | clhstnam=clhstnam(1:ic-1)//".fd" |
---|
| 92 | CALL ctlopn( inum, 'date.file', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', 1, numout, lwp, 1 ) |
---|
| 93 | WRITE(inum,*) clhstnam |
---|
| 94 | CLOSE(inum) |
---|
| 95 | WRITE (UNIT = classign,FMT ='(''assign -F null -N ieee f:'',a40)') clhstnam |
---|
| 96 | IF(lwp) WRITE(numout,*) classign |
---|
| 97 | #if defined _CRAY |
---|
| 98 | CALL ASSIGN(classign, ierror) |
---|
| 99 | #endif |
---|
| 100 | IF(lwp)WRITE(numout,*) ' ierror assign = ',ierror |
---|
| 101 | CALL ctlopn( numwri, clhstnam, clunk, clunf, cldir, & |
---|
| 102 | ilglo, numout, lwp, 1 ) |
---|
| 103 | ENDIF |
---|
| 104 | |
---|
| 105 | #if ! defined key_diainstant |
---|
| 106 | |
---|
| 107 | IF( kt == nit000 .AND. kindic > 0 ) THEN |
---|
| 108 | |
---|
| 109 | ! 1.1.1 Prognostic variables |
---|
| 110 | |
---|
| 111 | nmoyct = 0 |
---|
| 112 | nstepo = 0 |
---|
| 113 | |
---|
| 114 | um(:,:,:) = 0.e0 |
---|
| 115 | vm(:,:,:) = 0.e0 |
---|
| 116 | wm(:,:,:) = 0.e0 |
---|
| 117 | tm(:,:,:) = 0.e0 |
---|
| 118 | sm(:,:,:) = 0.e0 |
---|
| 119 | am(:,:,:) = 0.e0 |
---|
| 120 | |
---|
| 121 | fsel(:,:,:) = 0.e0 |
---|
| 122 | ENDIF |
---|
| 123 | |
---|
| 124 | ! 1.2 Sum |
---|
| 125 | |
---|
| 126 | nmoyct = nmoyct+1 |
---|
| 127 | |
---|
| 128 | um(:,:,:) = um (:,:,:) + un(:,:,:) |
---|
| 129 | vm(:,:,:) = vm (:,:,:) + vn(:,:,:) |
---|
| 130 | wm(:,:,:) = wm (:,:,:) + wn(:,:,:) |
---|
| 131 | tm(:,:,:) = tm (:,:,:) + tn(:,:,:) |
---|
| 132 | sm(:,:,:) = sm (:,:,:) + sn(:,:,:) |
---|
| 133 | am(:,:,:) = am (:,:,:) +avt(:,:,:) |
---|
| 134 | |
---|
| 135 | fsel(:,:,1 ) = fsel(:,:,1 ) + taux(:,:) |
---|
| 136 | fsel(:,:,2 ) = fsel(:,:,2 ) + tauy(:,:) |
---|
| 137 | fsel(:,:,3 ) = fsel(:,:,3 ) + qt (:,:) |
---|
| 138 | fsel(:,:,4 ) = fsel(:,:,4 ) + (emp(:,:) - runoff(:,:))*rday |
---|
| 139 | #if defined key_dtasst |
---|
| 140 | fsel(:,:,5 ) = fsel(:,:,5 ) + sst (:,:) |
---|
| 141 | #else |
---|
| 142 | fsel(:,:,5 ) = fsel(:,:,5 ) + tb (:,:,1) |
---|
| 143 | #endif |
---|
| 144 | fsel(:,:,6 ) = fsel(:,:,6 ) + qsr (:,:) |
---|
| 145 | #if defined key_dynspg_fsc |
---|
| 146 | fsel(:,:,7 ) = fsel(:,:,7 ) + sshn(:,:) |
---|
| 147 | #else |
---|
| 148 | fsel(:,:,7 ) = fsel(:,:,7 ) + bsfn(:,:) |
---|
| 149 | #endif |
---|
| 150 | fsel(:,:,8 ) = fsel(:,:,8 ) + freeze(:,:) |
---|
| 151 | fsel(:,:,9 ) = fsel(:,:,9 ) + qrp (:,:) |
---|
| 152 | fsel(:,:,10) = fsel(:,:,10) + erp (:,:)*rday |
---|
| 153 | fsel(:,:,11) = fsel(:,:,11) + hmlp(:,:) |
---|
| 154 | fsel(:,:,12) = fsel(:,:,12) + emp (:,:)*rday*sb(:,:,1) |
---|
| 155 | fsel(:,:,13) = fsel(:,:,13) + erp (:,:)*rday*sb(:,:,1) |
---|
| 156 | fsel(:,:,14) = fsel(:,:,14) + hmld(:,:) |
---|
| 157 | fsel(:,:,15) = 0.e0 |
---|
| 158 | fsel(:,:,16) = fsel(:,:,16) + runoff(:,:) |
---|
| 159 | ! vertical sum of intantaneous in situ density anomaly |
---|
| 160 | fsel(:,:,17) = 0. |
---|
| 161 | DO jk =1, jpk |
---|
| 162 | fsel(:,:,17) = fsel(:,:,17) + rhd(:,:,jk) * e1t(:,:) * e2t(:,:) * fse3t(:,:,jk) |
---|
| 163 | END DO |
---|
| 164 | ! 1.2 Output of the model domain (at nit000) |
---|
| 165 | |
---|
| 166 | IF( kt == nit000 .AND. kindic > 0 ) THEN |
---|
| 167 | IF(lwp) WRITE ( numwri, REC=1 ) jpiglo, jpjglo, jpk |
---|
| 168 | ENDIF |
---|
| 169 | |
---|
| 170 | |
---|
| 171 | ! 2. Output of dynamics and tracer fields and selected fields (numwri) |
---|
| 172 | ! ----------------------------------------------------------- |
---|
| 173 | |
---|
| 174 | ! 2.1 Average |
---|
| 175 | |
---|
| 176 | IF( MOD( kt, nwrite ) == 0 .OR. kindic < 0 .OR. & |
---|
| 177 | ( kt == nit000 .AND. kindic > 0) .OR. kt == nitend ) THEN |
---|
| 178 | |
---|
| 179 | IF(kindic /= -3) THEN |
---|
| 180 | zmoyctr = 1. / FLOAT(nmoyct) |
---|
| 181 | um (:,:,:) = um (:,:,:) * zmoyctr |
---|
| 182 | vm (:,:,:) = vm (:,:,:) * zmoyctr |
---|
| 183 | wm (:,:,:) = wm (:,:,:) * zmoyctr |
---|
| 184 | tm (:,:,:) = tm (:,:,:) * zmoyctr |
---|
| 185 | sm (:,:,:) = sm (:,:,:) * zmoyctr |
---|
| 186 | am (:,:,:) = am (:,:,:) * zmoyctr |
---|
| 187 | fsel(:,:,:) = fsel(:,:,:) * zmoyctr |
---|
| 188 | |
---|
| 189 | ELSE |
---|
| 190 | ! kindic=-3 STOP with e r r o r, instantaneous output |
---|
| 191 | nmoyct = 1 |
---|
| 192 | um(:,:,:) = un (:,:,:) |
---|
| 193 | vm(:,:,:) = vn (:,:,:) |
---|
| 194 | wm(:,:,:) = wn (:,:,:) |
---|
| 195 | tm(:,:,:) = tn (:,:,:) |
---|
| 196 | sm(:,:,:) = sn (:,:,:) |
---|
| 197 | am(:,:,:) = avt(:,:,:) |
---|
| 198 | |
---|
| 199 | fsel(:,:,1 ) = taux(:,:) |
---|
| 200 | fsel(:,:,2 ) = tauy(:,:) |
---|
| 201 | fsel(:,:,3 ) = qt (:,:) |
---|
| 202 | fsel(:,:,4 ) = (emp (:,:)- runoff(:,:))*rday |
---|
| 203 | #if defined key_dtasst |
---|
| 204 | fsel(:,:,5 ) = sst (:,:) |
---|
| 205 | #else |
---|
| 206 | fsel(:,:,5 ) = tb (:,:,1) |
---|
| 207 | #endif |
---|
| 208 | fsel(:,:,6 ) = qsr (:,:) |
---|
| 209 | #if defined key_dynspg_fsc |
---|
| 210 | fsel(:,:,7 ) = sshn(:,:) |
---|
| 211 | #else |
---|
| 212 | fsel(:,:,7 ) = bsfn(:,:) |
---|
| 213 | #endif |
---|
| 214 | fsel(:,:,8 ) = freeze(:,:) |
---|
| 215 | fsel(:,:,9 ) = qrp (:,:) |
---|
| 216 | fsel(:,:,10) = erp (:,:) |
---|
| 217 | fsel(:,:,11) = hmlp(:,:) |
---|
| 218 | fsel(:,:,12) = emp (:,:)*rday*sb(:,:,1) |
---|
| 219 | fsel(:,:,13) = erp (:,:)*rday*sb(:,:,1) |
---|
| 220 | fsel(:,:,14) = hmld(:,:) |
---|
| 221 | fsel(:,:,15) = 0.e0 |
---|
| 222 | fsel(:,:,16) = runoff(:,:) |
---|
| 223 | ENDIF |
---|
| 224 | |
---|
| 225 | ! 2.2 Write |
---|
| 226 | |
---|
| 227 | IF(lwp) THEN |
---|
| 228 | um(3,1,1) = FLOAT( kt ) |
---|
| 229 | vm(3,1,1) = FLOAT( nmoyct ) |
---|
| 230 | ENDIF |
---|
| 231 | CALL write4( numwri, um , nstepo*inbrec+2 ) |
---|
| 232 | CALL write4( numwri, vm , nstepo*inbrec+3 ) |
---|
| 233 | CALL write4( numwri, wm , nstepo*inbrec+4 ) |
---|
| 234 | CALL write4( numwri, tm , nstepo*inbrec+5 ) |
---|
| 235 | CALL write4( numwri, sm , nstepo*inbrec+6 ) |
---|
| 236 | CALL write4( numwri, am , nstepo*inbrec+7 ) |
---|
| 237 | CALL write4( numwri, fsel, nstepo*inbrec+8 ) |
---|
| 238 | |
---|
| 239 | IF(lwp) WRITE(numout,*) ' ' |
---|
| 240 | IF(lwp) WRITE(numout,*) ' **** write in numwri ',kt |
---|
| 241 | IF(lwp) WRITE(numout,*) ' average fields with ',nmoyct,'pdt' |
---|
| 242 | |
---|
| 243 | ! 2.3 Zero initialisation |
---|
| 244 | |
---|
| 245 | nmoyct = 0 |
---|
| 246 | nstepo = nstepo+1 |
---|
| 247 | |
---|
| 248 | um(:,:,:) = 0.e0 |
---|
| 249 | vm(:,:,:) = 0.e0 |
---|
| 250 | wm(:,:,:) = 0.e0 |
---|
| 251 | tm(:,:,:) = 0.e0 |
---|
| 252 | sm(:,:,:) = 0.e0 |
---|
| 253 | am(:,:,:) = 0.e0 |
---|
| 254 | |
---|
| 255 | fsel(:,:,:) = 0.e0 |
---|
| 256 | |
---|
| 257 | ENDIF |
---|
| 258 | |
---|
| 259 | #else |
---|
| 260 | |
---|
| 261 | ! Sortie instantanee |
---|
| 262 | |
---|
| 263 | IF( kt == nit000 .AND. kindic > 0 ) THEN |
---|
| 264 | nstepo = 0 |
---|
| 265 | IF(lwp) WRITE ( numwri, REC=1 ) jpiglo, jpjglo, jpk |
---|
| 266 | ENDIF |
---|
| 267 | |
---|
| 268 | IF( MOD( kt, nwrite ) == 0 .OR. kindic < 0 & |
---|
| 269 | .OR. (kt == nit000 .AND. kindic > 0) .OR. kt == nitend ) THEN |
---|
| 270 | fsel(:,:,:) = 0.e0 |
---|
| 271 | |
---|
| 272 | zsel(:,:,1 ) = taux(:,:) * umask(:,:,1) |
---|
| 273 | zsel(:,:,2 ) = tauy(:,:) * vmask(:,:,1) |
---|
| 274 | zsel(:,:,3 ) = qt (:,:) |
---|
| 275 | zsel(:,:,4 ) = (emp (:,:)-runoff(:,:))*rday |
---|
| 276 | #if defined key_dtasst |
---|
| 277 | zsel(:,:,5 ) = sst (:,:) |
---|
| 278 | #else |
---|
| 279 | zsel(:,:,5 ) = tb (:,:,1) |
---|
| 280 | #endif |
---|
| 281 | zsel(:,:,6 ) = qsr (:,:) |
---|
| 282 | #if defined key_dynspg_fsc |
---|
| 283 | zsel(:,:,7 ) = sshn(:,:) |
---|
| 284 | #else |
---|
| 285 | zsel(:,:,7 ) = bsfn(:,:) |
---|
| 286 | #endif |
---|
| 287 | zsel(:,:,8 ) = freeze(:,:) |
---|
| 288 | zsel(:,:,9 ) = qrp (:,:) |
---|
| 289 | zsel(:,:,10) = erp (:,:) |
---|
| 290 | zsel(:,:,11) = hmlp(:,:) |
---|
| 291 | zsel(:,:,12) = emp (:,:) * sb(:,:,1) |
---|
| 292 | zsel(:,:,13) = erp (:,:) * sb(:,:,1) |
---|
| 293 | zsel(:,:,14) = hmld(:,:) |
---|
| 294 | zsel(:,:,15) = 0.e0 |
---|
| 295 | zsel(:,:,16) = runoff(:,:) |
---|
| 296 | |
---|
| 297 | CALL write4( numwri, un , nstepo*inbrec+2 ) |
---|
| 298 | CALL write4( numwri, vn , nstepo*inbrec+3 ) |
---|
| 299 | CALL write4( numwri, wn , nstepo*inbrec+4 ) |
---|
| 300 | CALL write4( numwri, tn , nstepo*inbrec+5 ) |
---|
| 301 | CALL write4( numwri, sn , nstepo*inbrec+6 ) |
---|
| 302 | CALL write4( numwri, avt , nstepo*inbrec+7 ) |
---|
| 303 | CALL write4( numwri, zsel, nstepo*inbrec+8 ) |
---|
| 304 | |
---|
| 305 | IF(lwp) WRITE(numout,*) |
---|
| 306 | IF(lwp) WRITE(numout,*) ' **** write in numwri ',kt |
---|
| 307 | IF(lwp) WRITE(numout,*) ' instantaneous fields' |
---|
| 308 | nstepo = nstepo+1 |
---|
| 309 | ENDIF |
---|
| 310 | |
---|
| 311 | END SUBROUTINE dia_wri |
---|