GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/isccp_cloud_types.F90 Lines: 0 303 0.0 %
Date: 2023-06-30 12:51:15 Branches: 0 300 0.0 %

Line Branch Exec Source
1
2
! $Id $
3
4
SUBROUTINE isccp_cloud_types(debug, debugcol, npoints, sunlit, nlev, ncol, &
5
    seed, pfull, phalf, qv, cc, conv, dtau_s, dtau_c, top_height, overlap, &
6
    tautab, invtau, skt, emsfc_lw, at, dem_s, dem_c, fq_isccp, totalcldarea, &
7
    meanptop, meantaucld, boxtau, boxptop)
8
9
10
  ! Copyright Steve Klein and Mark Webb 2002 - all rights reserved.
11
12
  ! This code is available without charge with the following conditions:
13
14
  ! 1. The code is available for scientific purposes and is not for
15
  ! commercial use.
16
  ! 2. Any improvements you make to the code should be made available
17
  ! to the to the authors for incorporation into a future release.
18
  ! 3. The code should not be used in any way that brings the authors
19
  ! or their employers into disrepute.
20
21
  IMPLICIT NONE
22
23
  ! NOTE:   the maximum number of levels and columns is set by
24
  ! the following parameter statement
25
26
  INTEGER ncolprint
27
28
  ! -----
29
  ! Input
30
  ! -----
31
32
  INTEGER npoints !  number of model points in the horizontal
33
  ! PARAMETER(npoints=6722)
34
  INTEGER nlev !  number of model levels in column
35
  INTEGER ncol !  number of subcolumns
36
37
  INTEGER sunlit(npoints) !  1 for day points, 0 for night time
38
39
  INTEGER seed(npoints) !  seed value for random number generator
40
  ! !  ( see Numerical Recipes Chapter 7)
41
  ! !  It is recommended that the seed is set
42
  ! !  to a different value for each model
43
  ! !  gridbox it is called on, as it is
44
  ! !  possible that the choice of the samec
45
  ! !  seed value every time may introduce some
46
  ! !  statistical bias in the results, particularly
47
  ! !  for low values of NCOL.
48
49
  REAL pfull(npoints, nlev) !  pressure of full model levels (Pascals)
50
  ! !  pfull(npoints,1)    is    top level of model
51
  ! !  pfull(npoints,nlev) is bottom level of model
52
53
  REAL phalf(npoints, nlev+1) !  pressure of half model levels (Pascals)
54
  ! !  phalf(npoints,1)    is    top       of model
55
  ! !  phalf(npoints,nlev+1) is the surface pressure
56
57
  REAL qv(npoints, nlev) !  water vapor specific humidity (kg vapor/ kg air)
58
  ! !         on full model levels
59
60
  REAL cc(npoints, nlev) !  input cloud cover in each model level (fraction)
61
  ! !  NOTE:  This is the HORIZONTAL area of each
62
  ! !         grid box covered by clouds
63
64
  REAL conv(npoints, nlev) !  input convective cloud cover in each model level (fraction)
65
  ! !  NOTE:  This is the HORIZONTAL area of each
66
  ! !         grid box covered by convective clouds
67
68
  REAL dtau_s(npoints, nlev) !  mean 0.67 micron optical depth of stratiform
69
  ! !  clouds in each model level
70
  ! !  NOTE:  this the cloud optical depth of only the
71
  ! !         cloudy part of the grid box, it is not weighted
72
  ! !         with the 0 cloud optical depth of the clear
73
  ! !         part of the grid box
74
75
  REAL dtau_c(npoints, nlev) !  mean 0.67 micron optical depth of convective
76
  ! !  clouds in each
77
  ! !  model level.  Same note applies as in dtau_s.
78
79
  INTEGER overlap !  overlap type
80
81
  ! 1=max
82
83
  ! 2=rand
84
  ! 3=max/rand
85
86
  INTEGER top_height !  1 = adjust top height using both a computed
87
  ! !  infrared brightness temperature and the visible
88
  ! !  optical depth to adjust cloud top pressure. Note
89
  ! !  that this calculation is most appropriate to compare
90
  ! !  to ISCCP data during sunlit hours.
91
  ! !  2 = do not adjust top height, that is cloud top
92
  ! !  pressure is the actual cloud top pressure
93
  ! !  in the model
94
  ! !  3 = adjust top height using only the computed
95
  ! !  infrared brightness temperature. Note that this
96
  ! !  calculation is most appropriate to compare to ISCCP
97
  ! !  IR only algortihm (i.e. you can compare to nighttime
98
  ! !  ISCCP data with this option)
99
100
  REAL tautab(0:255) !  ISCCP table for converting count value to
101
  ! !  optical thickness
102
103
  INTEGER invtau(-20:45000) !  ISCCP table for converting optical thickness
104
  ! !  to count value
105
106
  ! The following input variables are used only if top_height = 1 or
107
  ! top_height = 3
108
109
  REAL skt(npoints) !  skin Temperature (K)
110
  REAL emsfc_lw !  10.5 micron emissivity of surface (fraction)
111
  REAL at(npoints, nlev) !  temperature in each model level (K)
112
  REAL dem_s(npoints, nlev) !  10.5 micron longwave emissivity of stratiform
113
  ! !  clouds in each
114
  ! !  model level.  Same note applies as in dtau_s.
115
  REAL dem_c(npoints, nlev) !  10.5 micron longwave emissivity of convective
116
  ! !  clouds in each
117
  ! !  model level.  Same note applies as in dtau_s.
118
  ! IM reg.dyn BEG
119
  REAL t1, t2
120
  ! REAL w(npoints)                   !vertical wind at 500 hPa
121
  ! LOGICAL pct_ocean(npoints)        !TRUE if oceanic point, FALSE otherway
122
  ! INTEGER iw(npoints) , nw
123
  ! REAL wmin, pas_w
124
  ! INTEGER k, l, iwmx
125
  ! PARAMETER(wmin=-100.,pas_w=10.,iwmx=30)
126
  ! REAL fq_dynreg(7,7,iwmx)
127
  ! REAL nfq_dynreg(7,7,iwmx)
128
  ! LOGICAL pctj(7,7,iwmx)
129
  ! IM reg.dyn END
130
  ! ------
131
  ! Output
132
  ! ------
133
134
  REAL fq_isccp(npoints, 7, 7) !  the fraction of the model grid box covered by
135
  ! !  each of the 49 ISCCP D level cloud types
136
137
  REAL totalcldarea(npoints) !  the fraction of model grid box columns
138
  ! !  with cloud somewhere in them.  This should
139
  ! !  equal the sum over all entries of fq_isccp
140
141
142
  ! ! The following three means are averages over the cloudy areas only.  If
143
  ! no
144
  ! ! clouds are in grid box all three quantities should equal zero.
145
146
  REAL meanptop(npoints) !  mean cloud top pressure (mb) - linear averaging
147
  ! !  in cloud top pressure.
148
149
  REAL meantaucld(npoints) !  mean optical thickness
150
  ! !  linear averaging in albedo performed.
151
152
  REAL boxtau(npoints, ncol) !  optical thickness in each column
153
154
  REAL boxptop(npoints, ncol) !  cloud top pressure (mb) in each column
155
156
157
158
  ! ------
159
  ! Working variables added when program updated to mimic Mark Webb's PV-Wave
160
  ! code
161
  ! ------
162
163
  REAL frac_out(npoints, ncol, nlev) ! boxes gridbox divided up into
164
  ! ! Equivalent of BOX in original version, but
165
  ! ! indexed by column then row, rather than
166
  ! ! by row then column
167
168
  REAL tca(npoints, 0:nlev) ! total cloud cover in each model level (fraction)
169
  ! ! with extra layer of zeroes on top
170
  ! ! in this version this just contains the values input
171
  ! ! from cc but with an extra level
172
  REAL cca(npoints, nlev) ! convective cloud cover in each model level (fraction)
173
  ! ! from conv
174
175
  REAL threshold(npoints, ncol) ! pointer to position in gridbox
176
  REAL maxocc(npoints, ncol) ! Flag for max overlapped conv cld
177
  REAL maxosc(npoints, ncol) ! Flag for max overlapped strat cld
178
179
  REAL boxpos(npoints, ncol) ! ordered pointer to position in gridbox
180
181
  REAL threshold_min(npoints, ncol) ! minimum value to define range in with new threshold
182
  ! ! is chosen
183
184
  REAL dem(npoints, ncol), bb(npoints) !  working variables for 10.5 micron longwave
185
  ! !  emissivity in part of
186
  ! !  gridbox under consideration
187
188
  REAL ran(npoints) ! vector of random numbers
189
  REAL ptrop(npoints)
190
  REAL attrop(npoints)
191
  REAL attropmin(npoints)
192
  REAL atmax(npoints)
193
  REAL atmin(npoints)
194
  REAL btcmin(npoints)
195
  REAL transmax(npoints)
196
197
  INTEGER i, j, ilev, ibox, itrop(npoints)
198
  INTEGER ipres(npoints)
199
  INTEGER itau(npoints), ilev2
200
  INTEGER acc(nlev, ncol)
201
  INTEGER match(npoints, nlev-1)
202
  INTEGER nmatch(npoints)
203
  INTEGER levmatch(npoints, ncol)
204
205
  ! !variables needed for water vapor continuum absorption
206
  REAL fluxtop_clrsky(npoints), trans_layers_above_clrsky(npoints)
207
  REAL taumin(npoints)
208
  REAL dem_wv(npoints, nlev), wtmair, wtmh20, navo, grav, pstd, t0
209
  REAL press(npoints), dpress(npoints), atmden(npoints)
210
  REAL rvh20(npoints), wk(npoints), rhoave(npoints)
211
  REAL rh20s(npoints), rfrgn(npoints)
212
  REAL tmpexp(npoints), tauwv(npoints)
213
214
  CHARACTER *1 cchar(6), cchar_realtops(6)
215
  INTEGER icycle
216
  REAL tau(npoints, ncol)
217
  LOGICAL box_cloudy(npoints, ncol)
218
  REAL tb(npoints, ncol)
219
  REAL ptop(npoints, ncol)
220
  REAL emcld(npoints, ncol)
221
  REAL fluxtop(npoints, ncol)
222
  REAL trans_layers_above(npoints, ncol)
223
  REAL isccp_taumin, fluxtopinit(npoints), tauir(npoints)
224
  REAL meanalbedocld(npoints)
225
  REAL albedocld(npoints, ncol)
226
  REAL boxarea
227
  INTEGER debug ! set to non-zero value to print out inputs
228
  ! ! with step debug
229
  INTEGER debugcol ! set to non-zero value to print out column
230
  ! ! decomposition with step debugcol
231
232
  INTEGER index1(npoints), num1, jj
233
  REAL rec2p13, tauchk
234
235
  CHARACTER *10 ftn09
236
237
  DATA isccp_taumin/0.3/
238
  DATA cchar/' ', '-', '1', '+', 'I', '+'/
239
  DATA cchar_realtops/' ', ' ', '1', '1', 'I', 'I'/
240
241
  tauchk = -1.*log(0.9999999)
242
  rec2p13 = 1./2.13
243
244
  ncolprint = 0
245
246
  ! IM
247
  ! PRINT*,' isccp_cloud_types npoints=',npoints
248
249
  ! if ( debug.ne.0 ) then
250
  ! j=1
251
  ! write(6,'(a10)') 'j='
252
  ! write(6,'(8I10)') j
253
  ! write(6,'(a10)') 'debug='
254
  ! write(6,'(8I10)') debug
255
  ! write(6,'(a10)') 'debugcol='
256
  ! write(6,'(8I10)') debugcol
257
  ! write(6,'(a10)') 'npoints='
258
  ! write(6,'(8I10)') npoints
259
  ! write(6,'(a10)') 'nlev='
260
  ! write(6,'(8I10)') nlev
261
  ! write(6,'(a10)') 'ncol='
262
  ! write(6,'(8I10)') ncol
263
  ! write(6,'(a10)') 'top_height='
264
  ! write(6,'(8I10)') top_height
265
  ! write(6,'(a10)') 'overlap='
266
  ! write(6,'(8I10)') overlap
267
  ! write(6,'(a10)') 'emsfc_lw='
268
  ! write(6,'(8f10.2)') emsfc_lw
269
  ! write(6,'(a10)') 'tautab='
270
  ! write(6,'(8f10.2)') tautab
271
  ! write(6,'(a10)') 'invtau(1:100)='
272
  ! write(6,'(8i10)') (invtau(i),i=1,100)
273
  ! do j=1,npoints,debug
274
  ! write(6,'(a10)') 'j='
275
  ! write(6,'(8I10)') j
276
  ! write(6,'(a10)') 'sunlit='
277
  ! write(6,'(8I10)') sunlit(j)
278
  ! write(6,'(a10)') 'seed='
279
  ! write(6,'(8I10)') seed(j)
280
  ! write(6,'(a10)') 'pfull='
281
  ! write(6,'(8f10.2)') (pfull(j,i),i=1,nlev)
282
  ! write(6,'(a10)') 'phalf='
283
  ! write(6,'(8f10.2)') (phalf(j,i),i=1,nlev+1)
284
  ! write(6,'(a10)') 'qv='
285
  ! write(6,'(8f10.3)') (qv(j,i),i=1,nlev)
286
  ! write(6,'(a10)') 'cc='
287
  ! write(6,'(8f10.3)') (cc(j,i),i=1,nlev)
288
  ! write(6,'(a10)') 'conv='
289
  ! write(6,'(8f10.2)') (conv(j,i),i=1,nlev)
290
  ! write(6,'(a10)') 'dtau_s='
291
  ! write(6,'(8g12.5)') (dtau_s(j,i),i=1,nlev)
292
  ! write(6,'(a10)') 'dtau_c='
293
  ! write(6,'(8f10.2)') (dtau_c(j,i),i=1,nlev)
294
  ! write(6,'(a10)') 'skt='
295
  ! write(6,'(8f10.2)') skt(j)
296
  ! write(6,'(a10)') 'at='
297
  ! write(6,'(8f10.2)') (at(j,i),i=1,nlev)
298
  ! write(6,'(a10)') 'dem_s='
299
  ! write(6,'(8f10.3)') (dem_s(j,i),i=1,nlev)
300
  ! write(6,'(a10)') 'dem_c='
301
  ! write(6,'(8f10.2)') (dem_c(j,i),i=1,nlev)
302
  ! enddo
303
  ! endif
304
305
  ! ---------------------------------------------------!
306
307
  ! assign 2d tca array using 1d input array cc
308
309
  DO j = 1, npoints
310
    tca(j, 0) = 0
311
  END DO
312
313
  DO ilev = 1, nlev
314
    DO j = 1, npoints
315
      tca(j, ilev) = cc(j, ilev)
316
    END DO
317
  END DO
318
319
  ! assign 2d cca array using 1d input array conv
320
321
  DO ilev = 1, nlev
322
    ! IM pas besoin        do ibox=1,ncol
323
    DO j = 1, npoints
324
      cca(j, ilev) = conv(j, ilev)
325
    END DO
326
    ! IM        enddo
327
  END DO
328
329
  ! IM
330
  ! do j=1, iwmx
331
  ! do l=1, 7
332
  ! do k=1, 7
333
  ! fq_dynreg(k,l,j) =0.
334
  ! nfq_dynreg(k,l,j) =0.
335
  ! enddo !k
336
  ! enddo !l
337
  ! enddo !j
338
  ! IM
339
  ! IM
340
  ! if (ncolprint.ne.0) then
341
  ! do j=1,npoints,1000
342
  ! write(6,'(a10)') 'j='
343
  ! write(6,'(8I10)') j
344
  ! write (6,'(a)') 'seed:'
345
  ! write (6,'(I3.2)') seed(j)
346
347
  ! write (6,'(a)') 'tca_pp_rev:'
348
  ! write (6,'(8f5.2)')
349
  ! &   ((tca(j,ilev)),
350
  ! &      ilev=1,nlev)
351
352
  ! write (6,'(a)') 'cca_pp_rev:'
353
  ! write (6,'(8f5.2)')
354
  ! &   ((cca(j,ilev),ibox=1,ncolprint),ilev=1,nlev)
355
  ! enddo
356
  ! endif
357
358
  IF (top_height==1 .OR. top_height==3) THEN
359
360
    DO j = 1, npoints
361
      ptrop(j) = 5000.
362
      atmin(j) = 400.
363
      attropmin(j) = 400.
364
      atmax(j) = 0.
365
      attrop(j) = 120.
366
      itrop(j) = 1
367
    END DO
368
369
    DO ilev = 1, nlev
370
      DO j = 1, npoints
371
        IF (pfull(j,ilev)<40000. .AND. pfull(j,ilev)>5000. .AND. &
372
            at(j,ilev)<attropmin(j)) THEN
373
          ptrop(j) = pfull(j, ilev)
374
          attropmin(j) = at(j, ilev)
375
          attrop(j) = attropmin(j)
376
          itrop(j) = ilev
377
        END IF
378
        IF (at(j,ilev)>atmax(j)) atmax(j) = at(j, ilev)
379
        IF (at(j,ilev)<atmin(j)) atmin(j) = at(j, ilev)
380
      END DO
381
    END DO
382
383
  END IF
384
385
  ! -----------------------------------------------------!
386
387
  ! ---------------------------------------------------!
388
389
  ! IM
390
  ! do 13 ilev=1,nlev
391
  ! num1=0
392
  ! do j=1,npoints
393
  ! if (cc(j,ilev) .lt. 0. .or. cc(j,ilev) .gt. 1.) then
394
  ! num1=num1+1
395
  ! index1(num1)=j
396
  ! end if
397
  ! enddo
398
  ! do jj=1,num1
399
  ! j=index1(jj)
400
  ! write(6,*)  ' error = cloud fraction less than zero'
401
  ! write(6,*) ' or '
402
  ! write(6,*)  ' error = cloud fraction greater than 1'
403
  ! write(6,*) 'value at point ',j,' is ',cc(j,ilev)
404
  ! write(6,*) 'level ',ilev
405
  ! STOP
406
  ! enddo
407
  ! num1=0
408
  ! do j=1,npoints
409
  ! if (conv(j,ilev) .lt. 0. .or. conv(j,ilev) .gt. 1.) then
410
  ! num1=num1+1
411
  ! index1(num1)=j
412
  ! end if
413
  ! enddo
414
  ! do jj=1,num1
415
  ! j=index1(jj)
416
  ! write(6,*)
417
  ! &           ' error = convective cloud fraction less than zero'
418
  ! write(6,*) ' or '
419
  ! write(6,*)
420
  ! &           ' error = convective cloud fraction greater than 1'
421
  ! write(6,*) 'value at point ',j,' is ',conv(j,ilev)
422
  ! write(6,*) 'level ',ilev
423
  ! STOP
424
  ! enddo
425
426
  ! num1=0
427
  ! do j=1,npoints
428
  ! if (dtau_s(j,ilev) .lt. 0.) then
429
  ! num1=num1+1
430
  ! index1(num1)=j
431
  ! end if
432
  ! enddo
433
  ! do jj=1,num1
434
  ! j=index1(jj)
435
  ! write(6,*)
436
  ! &           ' error = stratiform cloud opt. depth less than zero'
437
  ! write(6,*) 'value at point ',j,' is ',dtau_s(j,ilev)
438
  ! write(6,*) 'level ',ilev
439
  ! STOP
440
  ! enddo
441
  ! num1=0
442
  ! do j=1,npoints
443
  ! if (dtau_c(j,ilev) .lt. 0.) then
444
  ! num1=num1+1
445
  ! index1(num1)=j
446
  ! end if
447
  ! enddo
448
  ! do jj=1,num1
449
  ! j=index1(jj)
450
  ! write(6,*)
451
  ! &           ' error = convective cloud opt. depth less than zero'
452
  ! write(6,*) 'value at point ',j,' is ',dtau_c(j,ilev)
453
  ! write(6,*) 'level ',ilev
454
  ! STOP
455
  ! enddo
456
457
  ! num1=0
458
  ! do j=1,npoints
459
  ! if (dem_s(j,ilev) .lt. 0. .or. dem_s(j,ilev) .gt. 1.) then
460
  ! num1=num1+1
461
  ! index1(num1)=j
462
  ! end if
463
  ! enddo
464
  ! do jj=1,num1
465
  ! j=index1(jj)
466
  ! write(6,*)
467
  ! &           ' error = stratiform cloud emissivity less than zero'
468
  ! write(6,*)'or'
469
  ! write(6,*)
470
  ! &           ' error = stratiform cloud emissivity greater than 1'
471
  ! write(6,*) 'value at point ',j,' is ',dem_s(j,ilev)
472
  ! write(6,*) 'level ',ilev
473
  ! STOP
474
  ! enddo
475
476
  ! num1=0
477
  ! do j=1,npoints
478
  ! if (dem_c(j,ilev) .lt. 0. .or. dem_c(j,ilev) .gt. 1.) then
479
  ! num1=num1+1
480
  ! index1(num1)=j
481
  ! end if
482
  ! enddo
483
  ! do jj=1,num1
484
  ! j=index1(jj)
485
  ! write(6,*)
486
  ! &           ' error = convective cloud emissivity less than zero'
487
  ! write(6,*)'or'
488
  ! write(6,*)
489
  ! &           ' error = convective cloud emissivity greater than 1'
490
  ! write (6,*)
491
  ! &          'j=',j,'ilev=',ilev,'dem_c(j,ilev) =',dem_c(j,ilev)
492
  ! STOP
493
  ! enddo
494
  ! 13    continue
495
496
497
  DO ibox = 1, ncol
498
    DO j = 1, npoints
499
      boxpos(j, ibox) = (ibox-.5)/ncol
500
    END DO
501
  END DO
502
503
  ! ---------------------------------------------------!
504
  ! Initialise working variables
505
  ! ---------------------------------------------------!
506
507
  ! Initialised frac_out to zero
508
509
  DO ilev = 1, nlev
510
    DO ibox = 1, ncol
511
      DO j = 1, npoints
512
        frac_out(j, ibox, ilev) = 0.0
513
      END DO
514
    END DO
515
  END DO
516
517
  ! IM
518
  ! if (ncolprint.ne.0) then
519
  ! write (6,'(a)') 'frac_out_pp_rev:'
520
  ! do j=1,npoints,1000
521
  ! write(6,'(a10)') 'j='
522
  ! write(6,'(8I10)') j
523
  ! write (6,'(8f5.2)')
524
  ! &     ((frac_out(j,ibox,ilev),ibox=1,ncolprint),ilev=1,nlev)
525
526
  ! enddo
527
  ! write (6,'(a)') 'ncol:'
528
  ! write (6,'(I3)') ncol
529
  ! endif
530
  ! if (ncolprint.ne.0) then
531
  ! write (6,'(a)') 'last_frac_pp:'
532
  ! do j=1,npoints,1000
533
  ! write(6,'(a10)') 'j='
534
  ! write(6,'(8I10)') j
535
  ! write (6,'(8f5.2)') (tca(j,0))
536
  ! enddo
537
  ! endif
538
539
  ! ---------------------------------------------------!
540
  ! ALLOCATE CLOUD INTO BOXES, FOR NCOLUMNS, NLEVELS
541
  ! frac_out is the array that contains the information
542
  ! where 0 is no cloud, 1 is a stratiform cloud and 2 is a
543
  ! convective cloud
544
545
    !loop over vertical levels
546
  DO ilev = 1, nlev
547
548
    ! Initialise threshold
549
550
    IF (ilev==1) THEN
551
        ! If max overlap
552
      IF (overlap==1) THEN
553
          ! select pixels spread evenly
554
          ! across the gridbox
555
        DO ibox = 1, ncol
556
          DO j = 1, npoints
557
            threshold(j, ibox) = boxpos(j, ibox)
558
          END DO
559
        END DO
560
      ELSE
561
        DO ibox = 1, ncol
562
          CALL ran0_vec(npoints, seed, ran)
563
            ! select random pixels from the non-convective
564
            ! part the gridbox ( some will be converted into
565
            ! convective pixels below )
566
          DO j = 1, npoints
567
            threshold(j, ibox) = cca(j, ilev) + (1-cca(j,ilev))*ran(j)
568
          END DO
569
        END DO
570
      END IF
571
      ! IM
572
      ! IF (ncolprint.ne.0) then
573
      ! write (6,'(a)') 'threshold_nsf2:'
574
      ! do j=1,npoints,1000
575
      ! write(6,'(a10)') 'j='
576
      ! write(6,'(8I10)') j
577
      ! write (6,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
578
      ! enddo
579
      ! ENDIF
580
    END IF
581
582
    ! IF (ncolprint.ne.0) then
583
    ! write (6,'(a)') 'ilev:'
584
    ! write (6,'(I2)') ilev
585
    ! ENDIF
586
587
    DO ibox = 1, ncol
588
589
        ! All versions
590
      DO j = 1, npoints
591
        IF (boxpos(j,ibox)<=cca(j,ilev)) THEN
592
          ! IM REAL           maxocc(j,ibox) = 1
593
          maxocc(j, ibox) = 1.0
594
        ELSE
595
          ! IM REAL           maxocc(j,ibox) = 0
596
          maxocc(j, ibox) = 0.0
597
        END IF
598
      END DO
599
600
        ! Max overlap
601
      IF (overlap==1) THEN
602
        DO j = 1, npoints
603
          threshold_min(j, ibox) = cca(j, ilev)
604
          ! IM REAL           maxosc(j,ibox)=1
605
          maxosc(j, ibox) = 1.0
606
        END DO
607
      END IF
608
609
        ! Random overlap
610
      IF (overlap==2) THEN
611
        DO j = 1, npoints
612
          threshold_min(j, ibox) = cca(j, ilev)
613
          ! IM REAL           maxosc(j,ibox)=0
614
          maxosc(j, ibox) = 0.0
615
        END DO
616
      END IF
617
618
        ! Max/Random overlap
619
      IF (overlap==3) THEN
620
        DO j = 1, npoints
621
          threshold_min(j, ibox) = max(cca(j,ilev), min(tca(j,ilev-1),tca(j, &
622
            ilev)))
623
          IF (threshold(j,ibox)<min(tca(j,ilev-1),tca(j, &
624
              ilev)) .AND. (threshold(j,ibox)>cca(j,ilev))) THEN
625
            ! IM REAL                maxosc(j,ibox)= 1
626
            maxosc(j, ibox) = 1.0
627
          ELSE
628
            ! IM REAL                 maxosc(j,ibox)= 0
629
            maxosc(j, ibox) = 0.0
630
          END IF
631
        END DO
632
      END IF
633
634
        ! Reset threshold
635
      CALL ran0_vec(npoints, seed, ran)
636
637
      DO j = 1, npoints
638
        threshold(j, ibox) = &       !if max overlapped conv cloud
639
          maxocc(j, ibox)*(boxpos(j,ibox)) + &   !else
640
          (1-maxocc(j,ibox))*( &     !if max overlapped strat cloud
641
          (maxosc(j,ibox))*( &       !threshold=boxpos
642
          threshold(j,ibox))+ &      !else
643
          (1-maxosc(j,ibox))*( &     !threshold_min=random[thrmin,1]
644
          threshold_min(j,ibox)+(1-threshold_min(j,ibox))*ran(j)))
645
      END DO
646
647
    END DO ! ibox
648
649
    ! Fill frac_out with 1's where tca is greater than the threshold
650
651
    DO ibox = 1, ncol
652
      DO j = 1, npoints
653
        IF (tca(j,ilev)>threshold(j,ibox)) THEN
654
          ! IM REAL             frac_out(j,ibox,ilev)=1
655
          frac_out(j, ibox, ilev) = 1.0
656
        ELSE
657
          ! IM REAL             frac_out(j,ibox,ilev)=0
658
          frac_out(j, ibox, ilev) = 0.0
659
        END IF
660
      END DO
661
    END DO
662
663
    ! Code to partition boxes into startiform and convective parts
664
    ! goes here
665
666
    DO ibox = 1, ncol
667
      DO j = 1, npoints
668
        IF (threshold(j,ibox)<=cca(j,ilev)) THEN
669
            ! = 2 IF threshold le cca(j)
670
          ! IM REAL                  frac_out(j,ibox,ilev) = 2
671
          frac_out(j, ibox, ilev) = 2.0
672
        ELSE
673
            ! = the same IF NOT threshold le cca(j)
674
          frac_out(j, ibox, ilev) = frac_out(j, ibox, ilev)
675
        END IF
676
      END DO
677
    END DO
678
679
    ! Set last_frac to tca at this level, so as to be tca
680
    ! from last level next time round
681
682
    ! IM
683
    ! if (ncolprint.ne.0) then
684
685
    ! do j=1,npoints ,1000
686
    ! write(6,'(a10)') 'j='
687
    ! write(6,'(8I10)') j
688
    ! write (6,'(a)') 'last_frac:'
689
    ! write (6,'(8f5.2)') (tca(j,ilev-1))
690
691
    ! write (6,'(a)') 'cca:'
692
    ! write (6,'(8f5.2)') (cca(j,ilev),ibox=1,ncolprint)
693
694
    ! write (6,'(a)') 'max_overlap_cc:'
695
    ! write (6,'(8f5.2)') (maxocc(j,ibox),ibox=1,ncolprint)
696
697
    ! write (6,'(a)') 'max_overlap_sc:'
698
    ! write (6,'(8f5.2)') (maxosc(j,ibox),ibox=1,ncolprint)
699
700
    ! write (6,'(a)') 'threshold_min_nsf2:'
701
    ! write (6,'(8f5.2)') (threshold_min(j,ibox),ibox=1,ncolprint)
702
703
    ! write (6,'(a)') 'threshold_nsf2:'
704
    ! write (6,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
705
706
    ! write (6,'(a)') 'frac_out_pp_rev:'
707
    ! write (6,'(8f5.2)')
708
    ! &       ((frac_out(j,ibox,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
709
    ! enddo
710
    ! endif
711
712
713
  END DO
714
715
  ! ---------------------------------------------------!
716
717
718
719
  ! ---------------------------------------------------!
720
  ! COMPUTE CLOUD OPTICAL DEPTH FOR EACH COLUMN and
721
  ! put into vector tau
722
723
    !initialize tau and albedocld to zero
724
  ! loop over nlev
725
  DO ibox = 1, ncol
726
    DO j = 1, npoints
727
      tau(j, ibox) = 0.
728
      albedocld(j, ibox) = 0.
729
      boxtau(j, ibox) = 0.
730
      boxptop(j, ibox) = 0.
731
      box_cloudy(j, ibox) = .FALSE.
732
    END DO
733
  END DO
734
735
    !compute total cloud optical depth for each column
736
  DO ilev = 1, nlev
737
      !increment tau for each of the boxes
738
    DO ibox = 1, ncol
739
      DO j = 1, npoints
740
        ! IM REAL              if (frac_out(j,ibox,ilev).eq.1) then
741
        IF (frac_out(j,ibox,ilev)==1.0) THEN
742
          tau(j, ibox) = tau(j, ibox) + dtau_s(j, ilev)
743
        END IF
744
        ! IM REAL              if (frac_out(j,ibox,ilev).eq.2) then
745
        IF (frac_out(j,ibox,ilev)==2.0) THEN
746
          tau(j, ibox) = tau(j, ibox) + dtau_c(j, ilev)
747
        END IF
748
      END DO
749
    END DO ! ibox
750
  END DO ! ilev
751
  ! IM
752
  ! if (ncolprint.ne.0) then
753
754
  ! do j=1,npoints ,1000
755
  ! write(6,'(a10)') 'j='
756
  ! write(6,'(8I10)') j
757
  ! write(6,'(i2,1X,8(f7.2,1X))')
758
  ! &          ilev,
759
  ! &          (tau(j,ibox),ibox=1,ncolprint)
760
  ! enddo
761
  ! endif
762
763
  ! ---------------------------------------------------!
764
765
766
767
768
  ! ---------------------------------------------------!
769
  ! COMPUTE INFRARED BRIGHTNESS TEMPERUATRES
770
  ! AND CLOUD TOP TEMPERATURE SATELLITE SHOULD SEE
771
772
  ! again this is only done if top_height = 1 or 3
773
774
  ! fluxtop is the 10.5 micron radiance at the top of the
775
  ! atmosphere
776
  ! trans_layers_above is the total transmissivity in the layers
777
  ! above the current layer
778
  ! fluxtop_clrsky(j) and trans_layers_above_clrsky(j) are the clear
779
  ! sky versions of these quantities.
780
781
  IF (top_height==1 .OR. top_height==3) THEN
782
783
784
      !----------------------------------------------------------------------
785
      !
786
      !             DO CLEAR SKY RADIANCE CALCULATION FIRST
787
      !
788
      !compute water vapor continuum emissivity
789
      !this treatment follows Schwarkzopf and Ramasamy
790
      !JGR 1999,vol 104, pages 9467-9499.
791
      !the emissivity is calculated at a wavenumber of 955 cm-1,
792
      !or 10.47 microns
793
    wtmair = 28.9644
794
    wtmh20 = 18.01534
795
    navo = 6.023E+23
796
    grav = 9.806650E+02
797
    pstd = 1.013250E+06
798
    t0 = 296.
799
    ! IM
800
    ! if (ncolprint .ne. 0)
801
    ! &         write(6,*)  'ilev   pw (kg/m2)   tauwv(j)      dem_wv'
802
    DO ilev = 1, nlev
803
      DO j = 1, npoints
804
          !press and dpress are dyne/cm2 = Pascals *10
805
        press(j) = pfull(j, ilev)*10.
806
        dpress(j) = (phalf(j,ilev+1)-phalf(j,ilev))*10
807
          !atmden = g/cm2 = kg/m2 / 10
808
        atmden(j) = dpress(j)/grav
809
        rvh20(j) = qv(j, ilev)*wtmair/wtmh20
810
        wk(j) = rvh20(j)*navo*atmden(j)/wtmair
811
        rhoave(j) = (press(j)/pstd)*(t0/at(j,ilev))
812
        rh20s(j) = rvh20(j)*rhoave(j)
813
        rfrgn(j) = rhoave(j) - rh20s(j)
814
        tmpexp(j) = exp(-0.02*(at(j,ilev)-t0))
815
        tauwv(j) = wk(j)*1.E-20*((0.0224697*rh20s(j)*tmpexp(j))+(3.41817E-7* &
816
          rfrgn(j)))*0.98
817
        dem_wv(j, ilev) = 1. - exp(-1.*tauwv(j))
818
      END DO
819
      ! IM
820
      ! if (ncolprint .ne. 0) then
821
      ! do j=1,npoints ,1000
822
      ! write(6,'(a10)') 'j='
823
      ! write(6,'(8I10)') j
824
      ! write(6,'(i2,1X,3(f8.3,3X))') ilev,
825
      ! &           qv(j,ilev)*(phalf(j,ilev+1)-phalf(j,ilev))/(grav/100.),
826
      ! &           tauwv(j),dem_wv(j,ilev)
827
      ! enddo
828
      ! endif
829
    END DO
830
831
      !initialize variables
832
    DO j = 1, npoints
833
      fluxtop_clrsky(j) = 0.
834
      trans_layers_above_clrsky(j) = 1.
835
    END DO
836
837
    DO ilev = 1, nlev
838
      DO j = 1, npoints
839
840
          ! Black body emission at temperature of the layer
841
842
        bb(j) = 1/(exp(1307.27/at(j,ilev))-1.)
843
          !bb(j)= 5.67e-8*at(j,ilev)**4
844
845
          ! increase TOA flux by flux emitted from layer
846
          ! times total transmittance in layers above
847
848
        fluxtop_clrsky(j) = fluxtop_clrsky(j) + dem_wv(j, ilev)*bb(j)* &
849
          trans_layers_above_clrsky(j)
850
851
          ! update trans_layers_above with transmissivity
852
          ! from this layer for next time around loop
853
854
        trans_layers_above_clrsky(j) = trans_layers_above_clrsky(j)* &
855
          (1.-dem_wv(j,ilev))
856
857
858
      END DO
859
      ! IM
860
      ! if (ncolprint.ne.0) then
861
      ! do j=1,npoints ,1000
862
      ! write(6,'(a10)') 'j='
863
      ! write(6,'(8I10)') j
864
      ! write (6,'(a)') 'ilev:'
865
      ! write (6,'(I2)') ilev
866
867
      ! write (6,'(a)')
868
      ! &        'emiss_layer,100.*bb(j),100.*f,total_trans:'
869
      ! write (6,'(4(f7.2,1X))') dem_wv(j,ilev),100.*bb(j),
870
      ! &             100.*fluxtop_clrsky(j),trans_layers_above_clrsky(j)
871
      ! enddo
872
      ! endif
873
874
    END DO !loop over level
875
876
    DO j = 1, npoints
877
        !add in surface emission
878
      bb(j) = 1/(exp(1307.27/skt(j))-1.)
879
        !bb(j)=5.67e-8*skt(j)**4
880
881
      fluxtop_clrsky(j) = fluxtop_clrsky(j) + emsfc_lw*bb(j)* &
882
        trans_layers_above_clrsky(j)
883
    END DO
884
885
    ! IM
886
    ! if (ncolprint.ne.0) then
887
    ! do j=1,npoints ,1000
888
    ! write(6,'(a10)') 'j='
889
    ! write(6,'(8I10)') j
890
    ! write (6,'(a)') 'id:'
891
    ! write (6,'(a)') 'surface'
892
893
    ! write (6,'(a)') 'emsfc,100.*bb(j),100.*f,total_trans:'
894
    ! write (6,'(4(f7.2,1X))') emsfc_lw,100.*bb(j),
895
    ! &      100.*fluxtop_clrsky(j),
896
    ! &       trans_layers_above_clrsky(j)
897
    ! enddo
898
    ! endif
899
900
901
      !
902
      !           END OF CLEAR SKY CALCULATION
903
      !
904
      !----------------------------------------------------------------
905
906
907
    ! IM
908
    ! if (ncolprint.ne.0) then
909
910
    ! do j=1,npoints ,1000
911
    ! write(6,'(a10)') 'j='
912
    ! write(6,'(8I10)') j
913
    ! write (6,'(a)') 'ts:'
914
    ! write (6,'(8f7.2)') (skt(j),ibox=1,ncolprint)
915
916
    ! write (6,'(a)') 'ta_rev:'
917
    ! write (6,'(8f7.2)')
918
    ! &       ((at(j,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
919
920
    ! enddo
921
    ! endif
922
      !loop over columns
923
    DO ibox = 1, ncol
924
      DO j = 1, npoints
925
        fluxtop(j, ibox) = 0.
926
        trans_layers_above(j, ibox) = 1.
927
      END DO
928
    END DO
929
930
    DO ilev = 1, nlev
931
      DO j = 1, npoints
932
          ! Black body emission at temperature of the layer
933
934
        bb(j) = 1/(exp(1307.27/at(j,ilev))-1.)
935
          !bb(j)= 5.67e-8*at(j,ilev)**4
936
      END DO
937
938
      DO ibox = 1, ncol
939
        DO j = 1, npoints
940
941
            ! emissivity for point in this layer
942
          ! IM REAL             if (frac_out(j,ibox,ilev).eq.1) then
943
          IF (frac_out(j,ibox,ilev)==1.0) THEN
944
            dem(j, ibox) = 1. - ((1.-dem_wv(j,ilev))*(1.-dem_s(j,ilev)))
945
            ! IM REAL             else if (frac_out(j,ibox,ilev).eq.2) then
946
          ELSE IF (frac_out(j,ibox,ilev)==2.0) THEN
947
            dem(j, ibox) = 1. - ((1.-dem_wv(j,ilev))*(1.-dem_c(j,ilev)))
948
          ELSE
949
            dem(j, ibox) = dem_wv(j, ilev)
950
          END IF
951
952
953
            ! increase TOA flux by flux emitted from layer
954
            ! times total transmittance in layers above
955
956
          fluxtop(j, ibox) = fluxtop(j, ibox) + dem(j, ibox)*bb(j)* &
957
            trans_layers_above(j, ibox)
958
959
            ! update trans_layers_above with transmissivity
960
            ! from this layer for next time around loop
961
962
          trans_layers_above(j, ibox) = trans_layers_above(j, ibox)* &
963
            (1.-dem(j,ibox))
964
965
        END DO ! j
966
      END DO ! ibox
967
968
      ! IM
969
      ! if (ncolprint.ne.0) then
970
      ! do j=1,npoints,1000
971
      ! write (6,'(a)') 'ilev:'
972
      ! write (6,'(I2)') ilev
973
974
      ! write(6,'(a10)') 'j='
975
      ! write(6,'(8I10)') j
976
      ! write (6,'(a)') 'emiss_layer:'
977
      ! write (6,'(8f7.2)') (dem(j,ibox),ibox=1,ncolprint)
978
979
      ! write (6,'(a)') '100.*bb(j):'
980
      ! write (6,'(8f7.2)') (100.*bb(j),ibox=1,ncolprint)
981
982
      ! write (6,'(a)') '100.*f:'
983
      ! write (6,'(8f7.2)')
984
      ! &         (100.*fluxtop(j,ibox),ibox=1,ncolprint)
985
986
      ! write (6,'(a)') 'total_trans:'
987
      ! write (6,'(8f7.2)')
988
      ! &          (trans_layers_above(j,ibox),ibox=1,ncolprint)
989
      ! enddo
990
      ! endif
991
992
    END DO ! ilev
993
994
995
    DO j = 1, npoints
996
        !add in surface emission
997
      bb(j) = 1/(exp(1307.27/skt(j))-1.)
998
        !bb(j)=5.67e-8*skt(j)**4
999
    END DO
1000
1001
    DO ibox = 1, ncol
1002
      DO j = 1, npoints
1003
1004
          !add in surface emission
1005
1006
        fluxtop(j, ibox) = fluxtop(j, ibox) + emsfc_lw*bb(j)* &
1007
          trans_layers_above(j, ibox)
1008
1009
      END DO
1010
    END DO
1011
1012
    ! IM
1013
    ! if (ncolprint.ne.0) then
1014
1015
    ! do j=1,npoints ,1000
1016
    ! write(6,'(a10)') 'j='
1017
    ! write(6,'(8I10)') j
1018
    ! write (6,'(a)') 'id:'
1019
    ! write (6,'(a)') 'surface'
1020
1021
    ! write (6,'(a)') 'emiss_layer:'
1022
    ! write (6,'(8f7.2)') (dem(1,ibox),ibox=1,ncolprint)
1023
1024
    ! write (6,'(a)') '100.*bb(j):'
1025
    ! write (6,'(8f7.2)') (100.*bb(j),ibox=1,ncolprint)
1026
1027
    ! write (6,'(a)') '100.*f:'
1028
    ! write (6,'(8f7.2)') (100.*fluxtop(j,ibox),ibox=1,ncolprint)
1029
    ! end do
1030
    ! endif
1031
1032
      !now that you have the top of atmosphere radiance account
1033
      !for ISCCP procedures to determine cloud top temperature
1034
1035
      !account for partially transmitting cloud recompute flux
1036
      !ISCCP would see assuming a single layer cloud
1037
      !note choice here of 2.13, as it is primarily ice
1038
      !clouds which have partial emissivity and need the
1039
      !adjustment performed in this section
1040
      !
1041
      !If it turns out that the cloud brightness temperature
1042
      !is greater than 260K, then the liquid cloud conversion
1043
      !factor of 2.56 is used.
1044
      !
1045
      !Note that this is discussed on pages 85-87 of
1046
      !the ISCCP D level documentation (Rossow et al. 1996)
1047
1048
    DO j = 1, npoints
1049
        !compute minimum brightness temperature and optical depth
1050
      btcmin(j) = 1./(exp(1307.27/(attrop(j)-5.))-1.)
1051
    END DO
1052
    DO ibox = 1, ncol
1053
      DO j = 1, npoints
1054
        transmax(j) = (fluxtop(j,ibox)-btcmin(j))/(fluxtop_clrsky(j)-btcmin(j &
1055
          ))
1056
          !note that the initial setting of tauir(j) is needed so that
1057
          !tauir(j) has a realistic value should the next if block be
1058
          !bypassed
1059
        tauir(j) = tau(j, ibox)*rec2p13
1060
        taumin(j) = -1.*log(max(min(transmax(j),0.9999999),0.001))
1061
1062
      END DO
1063
1064
      IF (top_height==1) THEN
1065
        DO j = 1, npoints
1066
          IF (transmax(j)>0.001 .AND. transmax(j)<=0.9999999) THEN
1067
            fluxtopinit(j) = fluxtop(j, ibox)
1068
            tauir(j) = tau(j, ibox)*rec2p13
1069
          END IF
1070
        END DO
1071
        DO icycle = 1, 2
1072
          DO j = 1, npoints
1073
            IF (tau(j,ibox)>(tauchk)) THEN
1074
              IF (transmax(j)>0.001 .AND. transmax(j)<=0.9999999) THEN
1075
                emcld(j, ibox) = 1. - exp(-1.*tauir(j))
1076
                fluxtop(j, ibox) = fluxtopinit(j) - ((1.-emcld(j, &
1077
                  ibox))*fluxtop_clrsky(j))
1078
                fluxtop(j, ibox) = max(1.E-06, (fluxtop(j,ibox)/emcld(j, &
1079
                  ibox)))
1080
                tb(j, ibox) = 1307.27/(log(1.+(1./fluxtop(j,ibox))))
1081
                IF (tb(j,ibox)>260.) THEN
1082
                  tauir(j) = tau(j, ibox)/2.56
1083
                END IF
1084
              END IF
1085
            END IF
1086
          END DO
1087
        END DO
1088
1089
      END IF
1090
1091
      DO j = 1, npoints
1092
        IF (tau(j,ibox)>(tauchk)) THEN
1093
            !cloudy box
1094
          tb(j, ibox) = 1307.27/(log(1.+(1./fluxtop(j,ibox))))
1095
          IF (top_height==1 .AND. tauir(j)<taumin(j)) THEN
1096
            tb(j, ibox) = attrop(j) - 5.
1097
            tau(j, ibox) = 2.13*taumin(j)
1098
          END IF
1099
        ELSE
1100
            !clear sky brightness temperature
1101
          tb(j, ibox) = 1307.27/(log(1.+(1./fluxtop_clrsky(j))))
1102
        END IF
1103
      END DO ! j
1104
    END DO ! ibox
1105
1106
    ! IM
1107
    ! if (ncolprint.ne.0) then
1108
1109
    ! do j=1,npoints,1000
1110
    ! write(6,'(a10)') 'j='
1111
    ! write(6,'(8I10)') j
1112
1113
    ! write (6,'(a)') 'attrop:'
1114
    ! write (6,'(8f7.2)') (attrop(j))
1115
1116
    ! write (6,'(a)') 'btcmin:'
1117
    ! write (6,'(8f7.2)') (btcmin(j))
1118
1119
    ! write (6,'(a)') 'fluxtop_clrsky*100:'
1120
    ! write (6,'(8f7.2)')
1121
    ! &      (100.*fluxtop_clrsky(j))
1122
1123
    ! write (6,'(a)') '100.*f_adj:'
1124
    ! write (6,'(8f7.2)') (100.*fluxtop(j,ibox),ibox=1,ncolprint)
1125
1126
    ! write (6,'(a)') 'transmax:'
1127
    ! write (6,'(8f7.2)') (transmax(ibox),ibox=1,ncolprint)
1128
1129
    ! write (6,'(a)') 'tau:'
1130
    ! write (6,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
1131
1132
    ! write (6,'(a)') 'emcld:'
1133
    ! write (6,'(8f7.2)') (emcld(j,ibox),ibox=1,ncolprint)
1134
1135
    ! write (6,'(a)') 'total_trans:'
1136
    ! write (6,'(8f7.2)')
1137
    ! &          (trans_layers_above(j,ibox),ibox=1,ncolprint)
1138
1139
    ! write (6,'(a)') 'total_emiss:'
1140
    ! write (6,'(8f7.2)')
1141
    ! &          (1.0-trans_layers_above(j,ibox),ibox=1,ncolprint)
1142
1143
    ! write (6,'(a)') 'total_trans:'
1144
    ! write (6,'(8f7.2)')
1145
    ! &          (trans_layers_above(j,ibox),ibox=1,ncolprint)
1146
1147
    ! write (6,'(a)') 'ppout:'
1148
    ! write (6,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
1149
    ! enddo ! j
1150
    ! endif
1151
1152
  END IF
1153
1154
  ! ---------------------------------------------------!
1155
1156
1157
  ! ---------------------------------------------------!
1158
  ! DETERMINE CLOUD TOP PRESSURE
1159
1160
  ! again the 2 methods differ according to whether
1161
  ! or not you use the physical cloud top pressure (top_height = 2)
1162
  ! or the radiatively determined cloud top pressure (top_height = 1 or 3)
1163
1164
1165
    !compute cloud top pressure
1166
  DO ibox = 1, ncol
1167
      !segregate according to optical thickness
1168
    IF (top_height==1 .OR. top_height==3) THEN
1169
        !find level whose temperature
1170
        !most closely matches brightness temperature
1171
      DO j = 1, npoints
1172
        nmatch(j) = 0
1173
      END DO
1174
      DO ilev = 1, nlev - 1
1175
        ! cdir nodep
1176
        DO j = 1, npoints
1177
          IF ((at(j,ilev)>=tb(j,ibox) .AND. at(j,ilev+1)<tb(j, &
1178
              ibox)) .OR. (at(j,ilev)<=tb(j,ibox) .AND. at(j,ilev+1)>tb(j, &
1179
              ibox))) THEN
1180
1181
            nmatch(j) = nmatch(j) + 1
1182
            IF (abs(at(j,ilev)-tb(j,ibox))<abs(at(j,ilev+1)-tb(j,ibox))) THEN
1183
              match(j, nmatch(j)) = ilev
1184
            ELSE
1185
              match(j, nmatch(j)) = ilev + 1
1186
            END IF
1187
          END IF
1188
        END DO
1189
      END DO
1190
1191
      DO j = 1, npoints
1192
        IF (nmatch(j)>=1) THEN
1193
          ptop(j, ibox) = pfull(j, match(j,nmatch(j)))
1194
          levmatch(j, ibox) = match(j, nmatch(j))
1195
        ELSE
1196
          IF (tb(j,ibox)<atmin(j)) THEN
1197
            ptop(j, ibox) = ptrop(j)
1198
            levmatch(j, ibox) = itrop(j)
1199
          END IF
1200
          IF (tb(j,ibox)>atmax(j)) THEN
1201
            ptop(j, ibox) = pfull(j, nlev)
1202
            levmatch(j, ibox) = nlev
1203
          END IF
1204
        END IF
1205
      END DO ! j
1206
1207
    ELSE ! if (top_height .eq. 1 .or. top_height .eq. 3)
1208
1209
      DO j = 1, npoints
1210
        ptop(j, ibox) = 0.
1211
      END DO
1212
      DO ilev = 1, nlev
1213
        DO j = 1, npoints
1214
          IF ((ptop(j,ibox)==0.) & ! IM  &
1215
                                   ! .and.(frac_out(j,ibox,ilev) .ne. 0))
1216
                                   ! then
1217
              .AND. (frac_out(j,ibox,ilev)/=0.0)) THEN
1218
            ptop(j, ibox) = pfull(j, ilev)
1219
            levmatch(j, ibox) = ilev
1220
          END IF
1221
        END DO
1222
      END DO
1223
    END IF
1224
1225
    DO j = 1, npoints
1226
      IF (tau(j,ibox)<=(tauchk)) THEN
1227
        ptop(j, ibox) = 0.
1228
        levmatch(j, ibox) = 0
1229
      END IF
1230
    END DO
1231
1232
  END DO
1233
1234
1235
1236
  ! ---------------------------------------------------!
1237
1238
1239
1240
  ! ---------------------------------------------------!
1241
  ! DETERMINE ISCCP CLOUD TYPE FREQUENCIES
1242
1243
  ! Now that ptop and tau have been determined,
1244
  ! determine amount of each of the 49 ISCCP cloud
1245
  ! types
1246
1247
  ! Also compute grid box mean cloud top pressure and
1248
  ! optical thickness.  The mean cloud top pressure and
1249
  ! optical thickness are averages over the cloudy
1250
  ! area only. The mean cloud top pressure is a linear
1251
  ! average of the cloud top pressures.  The mean cloud
1252
  ! optical thickness is computed by converting optical
1253
  ! thickness to an albedo, averaging in albedo units,
1254
  ! then converting the average albedo back to a mean
1255
  ! optical thickness.
1256
1257
1258
    !compute isccp frequencies
1259
1260
    !reset frequencies
1261
  DO ilev = 1, 7
1262
    DO ilev2 = 1, 7
1263
      DO j = 1, npoints !
1264
        fq_isccp(j, ilev, ilev2) = 0.
1265
      END DO
1266
    END DO
1267
  END DO
1268
1269
    !reset variables need for averaging cloud properties
1270
  DO j = 1, npoints
1271
    totalcldarea(j) = 0.
1272
    meanalbedocld(j) = 0.
1273
    meanptop(j) = 0.
1274
    meantaucld(j) = 0.
1275
  END DO ! j
1276
1277
  boxarea = 1./real(ncol)
1278
1279
    !determine optical depth category
1280
  ! IM       do 39 j=1,npoints
1281
  ! IM       do ibox=1,ncol
1282
  DO ibox = 1, ncol
1283
    DO j = 1, npoints
1284
1285
      ! IM
1286
      ! CALL CPU_time(t1)
1287
      ! IM
1288
1289
      IF (tau(j,ibox)>(tauchk) .AND. ptop(j,ibox)>0.) THEN
1290
        box_cloudy(j, ibox) = .TRUE.
1291
      END IF
1292
1293
      ! IM
1294
      ! CALL CPU_time(t2)
1295
      ! print*,'IF tau t2 - t1',t2 - t1
1296
1297
      ! CALL CPU_time(t1)
1298
      ! IM
1299
1300
      IF (box_cloudy(j,ibox)) THEN
1301
1302
          ! totalcldarea always diagnosed day or night
1303
        totalcldarea(j) = totalcldarea(j) + boxarea
1304
1305
        IF (sunlit(j)==1) THEN
1306
1307
            ! tau diagnostics only with sunlight
1308
1309
          boxtau(j, ibox) = tau(j, ibox)
1310
1311
            !convert optical thickness to albedo
1312
          albedocld(j, ibox) = real(invtau(min(nint(100.*tau(j,ibox)), &
1313
            45000)))
1314
1315
            !contribute to averaging
1316
          meanalbedocld(j) = meanalbedocld(j) + albedocld(j, ibox)*boxarea
1317
1318
        END IF
1319
1320
      END IF
1321
1322
      ! IM
1323
      ! CALL CPU_time(t2)
1324
      ! print*,'IF box_cloudy t2 - t1',t2 - t1
1325
1326
      ! CALL CPU_time(t1)
1327
      ! IM BEG
1328
      ! IM           !convert ptop to millibars
1329
      ptop(j, ibox) = ptop(j, ibox)/100.
1330
1331
      ! IM           !save for output cloud top pressure and optical
1332
      ! thickness
1333
      boxptop(j, ibox) = ptop(j, ibox)
1334
      ! IM END
1335
1336
      ! IM BEG
1337
        !reset itau(j), ipres(j)
1338
      itau(j) = 0
1339
      ipres(j) = 0
1340
1341
      IF (tau(j,ibox)<isccp_taumin) THEN
1342
        itau(j) = 1
1343
      ELSE IF (tau(j,ibox)>=isccp_taumin .AND. tau(j,ibox)<1.3) THEN
1344
        itau(j) = 2
1345
      ELSE IF (tau(j,ibox)>=1.3 .AND. tau(j,ibox)<3.6) THEN
1346
        itau(j) = 3
1347
      ELSE IF (tau(j,ibox)>=3.6 .AND. tau(j,ibox)<9.4) THEN
1348
        itau(j) = 4
1349
      ELSE IF (tau(j,ibox)>=9.4 .AND. tau(j,ibox)<23.) THEN
1350
        itau(j) = 5
1351
      ELSE IF (tau(j,ibox)>=23. .AND. tau(j,ibox)<60.) THEN
1352
        itau(j) = 6
1353
      ELSE IF (tau(j,ibox)>=60.) THEN
1354
        itau(j) = 7
1355
      END IF
1356
1357
        !determine cloud top pressure category
1358
      IF (ptop(j,ibox)>0. .AND. ptop(j,ibox)<180.) THEN
1359
        ipres(j) = 1
1360
      ELSE IF (ptop(j,ibox)>=180. .AND. ptop(j,ibox)<310.) THEN
1361
        ipres(j) = 2
1362
      ELSE IF (ptop(j,ibox)>=310. .AND. ptop(j,ibox)<440.) THEN
1363
        ipres(j) = 3
1364
      ELSE IF (ptop(j,ibox)>=440. .AND. ptop(j,ibox)<560.) THEN
1365
        ipres(j) = 4
1366
      ELSE IF (ptop(j,ibox)>=560. .AND. ptop(j,ibox)<680.) THEN
1367
        ipres(j) = 5
1368
      ELSE IF (ptop(j,ibox)>=680. .AND. ptop(j,ibox)<800.) THEN
1369
        ipres(j) = 6
1370
      ELSE IF (ptop(j,ibox)>=800.) THEN
1371
        ipres(j) = 7
1372
      END IF
1373
      ! IM END
1374
1375
      IF (sunlit(j)==1 .OR. top_height==3) THEN
1376
1377
        ! IM         !convert ptop to millibars
1378
        ! IM           ptop(j,ibox)=ptop(j,ibox) / 100.
1379
1380
        ! IM         !save for output cloud top pressure and optical
1381
        ! thickness
1382
        ! IM             boxptop(j,ibox) = ptop(j,ibox)
1383
1384
        IF (box_cloudy(j,ibox)) THEN
1385
1386
          meanptop(j) = meanptop(j) + ptop(j, ibox)*boxarea
1387
1388
          ! IM             !reset itau(j), ipres(j)
1389
          ! IM           itau(j) = 0
1390
          ! IM           ipres(j) = 0
1391
1392
          ! if (tau(j,ibox) .lt. isccp_taumin) then
1393
          ! itau(j)=1
1394
          ! else if (tau(j,ibox) .ge. isccp_taumin
1395
          ! &
1396
          ! &          .and. tau(j,ibox) .lt. 1.3) then
1397
          ! itau(j)=2
1398
          ! else if (tau(j,ibox) .ge. 1.3
1399
          ! &          .and. tau(j,ibox) .lt. 3.6) then
1400
          ! itau(j)=3
1401
          ! else if (tau(j,ibox) .ge. 3.6
1402
          ! &          .and. tau(j,ibox) .lt. 9.4) then
1403
          ! itau(j)=4
1404
          ! else if (tau(j,ibox) .ge. 9.4
1405
          ! &          .and. tau(j,ibox) .lt. 23.) then
1406
          ! itau(j)=5
1407
          ! else if (tau(j,ibox) .ge. 23.
1408
          ! &          .and. tau(j,ibox) .lt. 60.) then
1409
          ! itau(j)=6
1410
          ! else if (tau(j,ibox) .ge. 60.) then
1411
          ! itau(j)=7
1412
          ! end if
1413
1414
          ! !determine cloud top pressure category
1415
          ! if (    ptop(j,ibox) .gt. 0.
1416
          ! &          .and.ptop(j,ibox) .lt. 180.) then
1417
          ! ipres(j)=1
1418
          ! else if(ptop(j,ibox) .ge. 180.
1419
          ! &          .and.ptop(j,ibox) .lt. 310.) then
1420
          ! ipres(j)=2
1421
          ! else if(ptop(j,ibox) .ge. 310.
1422
          ! &          .and.ptop(j,ibox) .lt. 440.) then
1423
          ! ipres(j)=3
1424
          ! else if(ptop(j,ibox) .ge. 440.
1425
          ! &          .and.ptop(j,ibox) .lt. 560.) then
1426
          ! ipres(j)=4
1427
          ! else if(ptop(j,ibox) .ge. 560.
1428
          ! &          .and.ptop(j,ibox) .lt. 680.) then
1429
          ! ipres(j)=5
1430
          ! else if(ptop(j,ibox) .ge. 680.
1431
          ! &          .and.ptop(j,ibox) .lt. 800.) then
1432
          ! ipres(j)=6
1433
          ! else if(ptop(j,ibox) .ge. 800.) then
1434
          ! ipres(j)=7
1435
          ! end if
1436
1437
            !update frequencies
1438
          IF (ipres(j)>0 .AND. itau(j)>0) THEN
1439
            fq_isccp(j, itau(j), ipres(j)) = fq_isccp(j, itau(j), ipres(j)) + &
1440
              boxarea
1441
          END IF
1442
1443
          ! IM calcul stats regime dynamique BEG
1444
          ! iw(j) = int((w(j)-wmin)/pas_w) +1
1445
          ! pctj(itau(j),ipres(j),iw(j))=.FALSE.
1446
          ! !update frequencies W500
1447
          ! if (pct_ocean(j)) then
1448
          ! if (ipres(j) .gt. 0.and.itau(j) .gt. 0) then
1449
          ! if (iw(j) .gt. int(wmin).and.iw(j) .le. iwmx) then
1450
          ! print*,' ISCCP iw=',iw(j),j
1451
          ! fq_dynreg(itau(j),ipres(j),iw(j))=
1452
          ! &          fq_dynreg(itau(j),ipres(j),iw(j))+
1453
          ! &          boxarea
1454
          ! &          fq_isccp(j,itau(j),ipres(j))
1455
          ! pctj(itau(j),ipres(j),iw(j))=.TRUE.
1456
          ! nfq_dynreg(itau(j),ipres(j),iw(j))=
1457
          ! &          nfq_dynreg(itau(j),ipres(j),iw(j))+1.
1458
          ! end if
1459
          ! end if
1460
          ! end if
1461
          ! IM calcul stats regime dynamique END
1462
        END IF !IM boxcloudy
1463
1464
      END IF !IM sunlit
1465
1466
      ! IM
1467
      ! CALL CPU_time(t2)
1468
      ! print*,'IF sunlit boxcloudy t2 - t1',t2 - t1
1469
      ! IM
1470
    END DO !IM ibox/j
1471
1472
1473
    ! IM ajout stats s/ W500 BEG
1474
    ! IM ajout stats s/ W500 END
1475
1476
    ! if(j.EQ.6722) then
1477
    ! print*,' ISCCP',w(j),iw(j),ipres(j),itau(j)
1478
    ! endif
1479
1480
    ! if (pct_ocean(j)) then
1481
    ! if (ipres(j) .gt. 0.and.itau(j) .gt. 0) then
1482
    ! if (iw(j) .gt. int(wmin).and.iw(j) .le. iwmx) then
1483
    ! if(pctj(itau(j),ipres(j),iw(j))) THEN
1484
    ! nfq_dynreg(itau(j),ipres(j),iw(j))=
1485
    ! &    nfq_dynreg(itau(j),ipres(j),iw(j))+1.
1486
    ! if(itau(j).EQ.4.AND.ipres(j).EQ.2.AND.
1487
    ! &    iw(j).EQ.10) then
1488
    ! PRINT*,' isccp AVANT',
1489
    ! &    nfq_dynreg(itau(j),ipres(j),iw(j)),
1490
    ! &    fq_dynreg(itau(j),ipres(j),iw(j))
1491
    ! endif
1492
    ! endif
1493
    ! endif
1494
    ! endif
1495
    ! endif
1496
1497
  END DO
1498
    !compute mean cloud properties
1499
  ! IM j/ibox
1500
  DO j = 1, npoints
1501
    IF (totalcldarea(j)>0.) THEN
1502
      meanptop(j) = meanptop(j)/totalcldarea(j)
1503
      IF (sunlit(j)==1) THEN
1504
        meanalbedocld(j) = meanalbedocld(j)/totalcldarea(j)
1505
        meantaucld(j) = tautab(min(255,max(1,nint(meanalbedocld(j)))))
1506
      END IF
1507
    END IF
1508
  END DO ! j
1509
1510
  ! IM ajout stats s/ W500 BEG
1511
  ! do nw = 1, iwmx
1512
  ! do l = 1, 7
1513
  ! do k = 1, 7
1514
  ! if (nfq_dynreg(k,l,nw).GT.0.) then
1515
  ! fq_dynreg(k,l,nw) = fq_dynreg(k,l,nw)/nfq_dynreg(k,l,nw)
1516
  ! if(k.EQ.4.AND.l.EQ.2.AND.nw.EQ.10) then
1517
  ! print*,' isccp APRES',nfq_dynreg(k,l,nw),
1518
  ! &   fq_dynreg(k,l,nw)
1519
  ! endif
1520
  ! else
1521
  ! if(fq_dynreg(k,l,nw).NE.0.) then
1522
  ! print*,'nfq_dynreg = 0 tau,pc,nw',k,l,nw,fq_dynreg(k,l,nw)
1523
  ! endif
1524
  ! fq_dynreg(k,l,nw) = -1.E+20
1525
  ! nfq_dynreg(k,l,nw) = 1.E+20
1526
  ! end if
1527
  ! enddo !k
1528
  ! enddo !l
1529
  ! enddo !nw
1530
  ! IM ajout stats s/ W500 END
1531
  ! ---------------------------------------------------!
1532
1533
  ! ---------------------------------------------------!
1534
  ! OPTIONAL PRINTOUT OF DATA TO CHECK PROGRAM
1535
1536
  ! cIM
1537
  ! if (debugcol.ne.0) then
1538
1539
  ! do j=1,npoints,debugcol
1540
1541
  ! !produce character output
1542
  ! do ilev=1,nlev
1543
  ! do ibox=1,ncol
1544
  ! acc(ilev,ibox)=0
1545
  ! enddo
1546
  ! enddo
1547
1548
  ! do ilev=1,nlev
1549
  ! do ibox=1,ncol
1550
  ! acc(ilev,ibox)=frac_out(j,ibox,ilev)*2
1551
  ! if (levmatch(j,ibox) .eq. ilev)
1552
  ! &                 acc(ilev,ibox)=acc(ilev,ibox)+1
1553
  ! enddo
1554
  ! enddo
1555
1556
    !print test
1557
1558
  ! write(ftn09,11) j
1559
  ! 11        format('ftn09.',i4.4)
1560
  ! open(9, FILE=ftn09, FORM='FORMATTED')
1561
1562
  ! write(9,'(a1)') ' '
1563
  ! write(9,'(10i5)')
1564
  ! &                  (ilev,ilev=5,nlev,5)
1565
  ! write(9,'(a1)') ' '
1566
1567
  ! do ibox=1,ncol
1568
  ! write(9,'(40(a1),1x,40(a1))')
1569
  ! &           (cchar_realtops(acc(ilev,ibox)+1),ilev=1,nlev)
1570
  ! &           ,(cchar(acc(ilev,ibox)+1),ilev=1,nlev)
1571
  ! end do
1572
  ! close(9)
1573
1574
  ! IM
1575
  ! if (ncolprint.ne.0) then
1576
  ! write(6,'(a1)') ' '
1577
  ! write(6,'(a2,1X,5(a7,1X),a50)')
1578
  ! &                  'ilev',
1579
  ! &                  'pfull','at',
1580
  ! &                  'cc*100','dem_s','dtau_s',
1581
  ! &                  'cchar'
1582
1583
  ! do 4012 ilev=1,nlev
1584
  ! write(6,'(60i2)') (box(i,ilev),i=1,ncolprint)
1585
  ! write(6,'(i2,1X,5(f7.2,1X),50(a1))')
1586
  ! &                  ilev,
1587
  ! &                  pfull(j,ilev)/100.,at(j,ilev),
1588
  ! &                  cc(j,ilev)*100.0,dem_s(j,ilev),dtau_s(j,ilev)
1589
  ! &                  ,(cchar(acc(ilev,ibox)+1),ibox=1,ncolprint)
1590
  ! 4012           continue
1591
  ! write (6,'(a)') 'skt(j):'
1592
  ! write (6,'(8f7.2)') skt(j)
1593
1594
  ! write (6,'(8I7)') (ibox,ibox=1,ncolprint)
1595
1596
  ! write (6,'(a)') 'tau:'
1597
  ! write (6,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
1598
1599
  ! write (6,'(a)') 'tb:'
1600
  ! write (6,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
1601
1602
  ! write (6,'(a)') 'ptop:'
1603
  ! write (6,'(8f7.2)') (ptop(j,ibox),ibox=1,ncolprint)
1604
  ! endif
1605
1606
  ! enddo
1607
1608
  ! end if
1609
1610
  RETURN
1611
END SUBROUTINE isccp_cloud_types