source: LMDZ.3.3/branches/rel-LF/libf/phylmd/isccp_cloud_types.F @ 486

Last change on this file since 486 was 486, checked in by lmdzadmin, 20 years ago

Phasage avec la version de Ionela
IM/LF

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