source: LMDZ6/branches/Amaury_dev/libf/phylmd/cosp/mod_cosp_modis_simulator.F90

Last change on this file was 5158, checked in by abarral, 13 months ago

Add missing klon on strataer_emiss_mod.F90
Correct various missing explicit declarations
Replace tabs by spaces (tabs are not part of the fortran charset)
Continue cleaning modules
Removed unused arguments and variables

File size: 24.2 KB
Line 
1! (c) 2009, Regents of the Unversity of Colorado
2!   Author: Robert Pincus, Cooperative Institute for Research in the Environmental Sciences
3! All rights reserved.
4! $Revision: 88 $, $Date: 2013-11-13 07:08:38 -0700 (Wed, 13 Nov 2013) $
5! $URL: http://cfmip-obs-sim.googlecode.com/svn/stable/v1.4.0/cosp_modis_simulator.F90 $
6
7! Redistribution and use in source and binary forms, with or without modification, are permitted
8! provided that the following conditions are met:
9
10!     * Redistributions of source code must retain the above copyright notice, this list
11!       of conditions and the following disclaimer.
12!     * Redistributions in binary form must reproduce the above copyright notice, this list
13!       of conditions and the following disclaimer in the documentation and/or other materials
14!       provided with the distribution.
15!     * Neither the name of the Met Office nor the names of its contributors may be used
16!       to endorse or promote products derived from this software without specific prior written
17!       permission.
18
19! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
20! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26! OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28! History:
29!   May 2009 - Robert Pincus - Initial version
30!   Dec 2009 - Robert Pincus - Tiny revisions
31
32MODULE MOD_COSP_Modis_Simulator
33  USE MOD_COSP_CONSTANTS
34  USE MOD_COSP_TYPES
35  use mod_modis_sim, numModisTauBins      => numTauHistogramBins,      &
36                     numModisPressureBins => numPressureHistogramBins, &
37                     MODIS_TAU      => nominalTauHistogramCenters,     &
38                     MODIS_TAU_BNDS => nominalTauHistogramBoundaries,  &
39                     MODIS_PC       => nominalPressureHistogramCenters, &
40                     MODIS_PC_BNDS  => nominalPressureHistogramBoundaries                     
41  implicit none
42  !------------------------------------------------------------------------------------------------
43  ! Public type
44
45  ! Summary statistics from MODIS retrievals
46  type COSP_MODIS
47     ! Dimensions
48     integer :: Npoints   ! Number of gridpoints
49
50     ! Grid means; dimension nPoints
51
52     real, dimension(:),       pointer :: &
53       Cloud_Fraction_Total_Mean,       Cloud_Fraction_Water_Mean,       Cloud_Fraction_Ice_Mean,       &
54       Cloud_Fraction_High_Mean,        Cloud_Fraction_Mid_Mean,         Cloud_Fraction_Low_Mean,       &
55       Optical_Thickness_Total_Mean,    Optical_Thickness_Water_Mean,    Optical_Thickness_Ice_Mean,    &
56       Optical_Thickness_Total_LogMean, Optical_Thickness_Water_LogMean, Optical_Thickness_Ice_LogMean, &
57                                        Cloud_Particle_Size_Water_Mean,  Cloud_Particle_Size_Ice_Mean,  &
58       Cloud_Top_Pressure_Total_Mean,                                                                   &
59                                        Liquid_Water_Path_Mean,          Ice_Water_Path_Mean
60
61     ! Also need the ISCCP-type optical thickness/cloud top pressure histogram
62
63     real, dimension(:, :, :), pointer :: Optical_Thickness_vs_Cloud_Top_Pressure
64     real, dimension(:, :, :), pointer :: Optical_Thickness_vs_ReffICE
65     real, dimension(:, :, :), pointer :: Optical_Thickness_vs_ReffLIQ
66  end type COSP_MODIS
67 
68contains
69  !------------------------------------------------------------------------------------------------
70  subroutine COSP_Modis_Simulator(gridBox, subCols, subcolHydro, isccpSim, modisSim)
71    ! Arguments
72    type(cosp_gridbox), intent(in   ) :: gridBox     ! Gridbox info
73    type(cosp_subgrid), intent(in   ) :: subCols     ! subCol indicators of convective/stratiform
74    type(cosp_sghydro), intent(in   ) :: subcolHydro ! subcol hydrometeor contens
75    type(cosp_isccp),   intent(in   ) :: isccpSim    ! ISCCP simulator output
76    type(cosp_modis),   intent(  out) :: modisSim    ! MODIS simulator subcol output
77   
78    ! ------------------------------------------------------------
79    ! Local variables
80    !   Leave space only for sunlit points
81   
82    integer :: nPoints, nSubCols, nLevels, nSunlit, i, j, k
83   
84    ! Grid-mean quanties;  dimensions nPoints, nLevels
85    real, &
86      dimension(count(gridBox%sunlit(:) > 0),                  gridBox%nLevels) :: &
87        temperature, pressureLayers
88    real, &
89      dimension(count(gridBox%sunlit(:) > 0),                  gridBox%nLevels + 1) :: &
90        pressureLevels
91   
92    ! Subcol quantities, dimension nPoints, nSubCols, nLevels
93    real, &
94      dimension(count(gridBox%sunlit(:) > 0), subCols%nColumns, gridBox%nLevels) :: &
95        opticalThickness, cloudWater, cloudIce, waterSize, iceSize
96   
97    ! Vertically-integrated subcol quantities; dimensions nPoints, nSubcols
98    integer, &
99      dimension(count(gridBox%sunlit(:) > 0), subCols%nColumns) :: &
100        retrievedPhase
101    real, &
102      dimension(count(gridBox%sunlit(:) > 0), subCols%nColumns) :: &
103        isccpTau, isccpCloudTopPressure, retrievedCloudTopPressure, retrievedTau, retrievedSize 
104   
105    ! Vertically-integrated results
106    real, dimension(count(gridBox%sunlit(:) > 0)) :: &
107        cfTotal, cfLiquid, cfIce,                &
108        cfHigh,  cfMid,    cfLow,                &
109        meanTauTotal, meanTauLiquid, meanTauIce, &
110        meanLogTauTotal, meanLogTauLiquid, meanLogTauIce , &
111        meanSizeLiquid, meanSizeIce,             &
112        meanCloudTopPressure,                    &
113        meanLiquidWaterPath, meanIceWaterPath
114       
115    real, dimension(count(gridBox%sunlit(:) > 0), numModisTauBins, numModisPressureBins) :: &
116         jointHistogram
117    real, dimension(count(gridBox%sunlit(:) > 0), numModisTauBins, numMODISReffIceBins) :: &
118         jointHistogram2
119    real, dimension(count(gridBox%sunlit(:) > 0), numModisTauBins, numMODISReffLiqBins) :: &
120         jointHistogram3
121   
122    integer, dimension(count(gridBox%sunlit(:) >  0)) :: sunlit
123    integer, dimension(count(gridBox%sunlit(:) <= 0)) :: notSunlit
124    ! ------------------------------------------------------------
125
126    ! Are there any sunlit points?
127
128    nSunlit = count(gridBox%sunlit(:) > 0)
129    if(nSunlit > 0) then
130      nLevels  = gridBox%Nlevels
131      nPoints  = gridBox%Npoints
132      nSubCols = subCols%Ncolumns
133
134      ! This is a vector index indicating which points are sunlit
135
136      sunlit(:)    = pack((/ (i, i = 1, nPoints ) /), mask =       gridBox%sunlit(:) > 0)
137      notSunlit(:) = pack((/ (i, i = 1, nPoints ) /), mask = .not. gridBox%sunlit(:) > 0)
138
139      ! Copy needed quantities, reversing vertical order and removing points with no sunlight
140
141      pressureLevels(:, 1) = 0.0 ! Top of model, following ISCCP sim
142      temperature(:, :)     = gridBox%T (sunlit(:), nLevels:1:-1)
143      pressureLayers(:, :)  = gridBox%p (sunlit(:), nLevels:1:-1)
144      pressureLevels(:, 2:) = gridBox%ph(sunlit(:), nLevels:1:-1)
145
146      ! Subcolumn properties - first stratiform cloud...
147
148      where(subCols%frac_out(sunlit(:), :, :) == I_LSC)
149        !opticalThickness(:, :, :) = &
150        !               spread(gridBox%dtau_s      (sunlit(:),    :), dim = 2, nCopies = nSubCols)
151        cloudWater(:, :, :) = subcolHydro%mr_hydro(sunlit(:), :, :, I_LSCLIQ)
152        waterSize (:, :, :) = subcolHydro%reff    (sunlit(:), :, :, I_LSCLIQ)
153        cloudIce  (:, :, :) = subcolHydro%mr_hydro(sunlit(:), :, :, I_LSCICE)
154        iceSize   (:, :, :) = subcolHydro%reff    (sunlit(:), :, :, I_LSCICE)
155      elsewhere
156        opticalThickness(:, :, :) = 0.
157        cloudWater      (:, :, :) = 0.
158        cloudIce        (:, :, :) = 0.
159        waterSize       (:, :, :) = 0.
160        iceSize         (:, :, :) = 0.
161      end where
162
163      ! Loop version of spread above - intrinsic doesn't work on certain platforms.
164      DO k = 1, nLevels
165        DO j = 1, nSubCols
166          DO i = 1, nSunlit
167            if(subCols%frac_out(sunlit(i), j, k) == I_LSC) then
168              opticalThickness(i, j, k) = gridBox%dtau_s(sunlit(i), k)
169            else
170              opticalThickness(i, j, k) = 0.   
171            end if
172          end do
173        end do
174      end do
175
176      ! .. then add convective cloud...
177
178      where(subCols%frac_out(sunlit(:), :, :) == I_CVC)
179        !opticalThickness(:, :, :) = &
180        !               spread(gridBox%dtau_c(      sunlit(:),    :), dim = 2, nCopies = nSubCols)
181        cloudWater(:, :, :) = subcolHydro%mr_hydro(sunlit(:), :, :, I_CVCLIQ)
182        waterSize (:, :, :) = subcolHydro%reff    (sunlit(:), :, :, I_CVCLIQ)
183        cloudIce  (:, :, :) = subcolHydro%mr_hydro(sunlit(:), :, :, I_CVCICE)
184        iceSize   (:, :, :) = subcolHydro%reff    (sunlit(:), :, :, I_CVCICE)
185      end where
186
187      ! Loop version of spread above - intrinsic doesn't work on certain platforms.
188      DO k = 1, nLevels
189        DO j = 1, nSubCols
190          DO i = 1, nSunlit
191            if(subCols%frac_out(sunlit(i), j, k) == I_CVC) opticalThickness(i, j, k) = gridBox%dtau_c(sunlit(i), k)
192          end do
193        end do
194      end do
195
196      ! Reverse vertical order
197
198      opticalThickness(:, :, :)  = opticalThickness(:, :, nLevels:1:-1)
199      cloudWater      (:, :, :)  = cloudWater      (:, :, nLevels:1:-1)
200      waterSize       (:, :, :)  = waterSize       (:, :, nLevels:1:-1)
201      cloudIce        (:, :, :)  = cloudIce        (:, :, nLevels:1:-1)
202      iceSize         (:, :, :)  = iceSize         (:, :, nLevels:1:-1)
203     
204      isccpTau(:, :)              = isccpSim%boxtau (sunlit(:), :)
205      isccpCloudTopPressure(:, :) = isccpSim%boxptop(sunlit(:), :)
206     
207      DO i = 1, nSunlit
208        call modis_L2_simulator(temperature(i, :), pressureLayers(i, :), pressureLevels(i, :),     &
209                                opticalThickness(i, :, :), cloudWater(i, :, :), cloudIce(i, :, :), &
210                                waterSize(i, :, :), iceSize(i, :, :),                       &
211                                isccpTau(i, :), isccpCloudTopPressure(i, :),                &
212                                retrievedPhase(i, :), retrievedCloudTopPressure(i, :),      &
213                                retrievedTau(i, :), retrievedSize(i, :))
214     end do
215     
216      ! DJS2015: Call L3 modis simulator used by cospv2.0
217     ! call modis_L3_simulator(retrievedPhase,              &
218     !                         retrievedCloudTopPressure,   &
219     !                         retrievedTau, retrievedSize, &
220     !                         cfTotal,         cfLiquid,         cfIce,         &
221     !                         cfHigh,          cfMid,            cfLow,         &
222     !                         meanTauTotal,    meanTauLiquid,    meanTauIce,    &
223     !                         meanLogTauTotal, meanLogTauLiquid, meanLogTauIce, &
224     !                         meanSizeLiquid,   meanSizeIce,   &
225     !                         meanCloudTopPressure,                             &
226     !                         meanLiquidWaterPath, meanIceWaterPath, &
227     !                         jointHistogram)
228     call modis_column(nSunlit,nSubcols,retrievedPhase,retrievedCloudTopPressure,   &
229                        retrievedTau,retrievedSize,cfTotal,cfLiquid,cfIce,cfHigh,    &
230                        cfMid,cfLow,meanTauTotal,meanTauLiquid,meanTauIce,           &
231                        meanLogTauTotal,meanLogTauLiquid,meanLogTauIce,              &
232                        meanSizeLiquid,meanSizeIce,meanCloudTopPressure,             &
233                        meanLiquidWaterPath, meanIceWaterPath,                       &
234                        jointHistogram,jointHistogram2,jointHistogram3)
235      ! DJS2015: END
236
237      ! Copy results into COSP structure
238
239      modisSim%Cloud_Fraction_Total_Mean(sunlit(:)) = cfTotal(:)
240      modisSim%Cloud_Fraction_Water_Mean(sunlit(:)) = cfLiquid
241      modisSim%Cloud_Fraction_Ice_Mean  (sunlit(:)) = cfIce
242 
243      modisSim%Cloud_Fraction_High_Mean(sunlit(:)) = cfHigh
244      modisSim%Cloud_Fraction_Mid_Mean (sunlit(:)) = cfMid
245      modisSim%Cloud_Fraction_Low_Mean (sunlit(:)) = cfLow
246 
247      modisSim%Optical_Thickness_Total_Mean(sunlit(:)) = meanTauTotal
248      modisSim%Optical_Thickness_Water_Mean(sunlit(:)) = meanTauLiquid
249      modisSim%Optical_Thickness_Ice_Mean  (sunlit(:)) = meanTauIce
250 
251      modisSim%Optical_Thickness_Total_LogMean(sunlit(:)) = meanLogTauTotal
252      modisSim%Optical_Thickness_Water_LogMean(sunlit(:)) = meanLogTauLiquid
253      modisSim%Optical_Thickness_Ice_LogMean  (sunlit(:)) = meanLogTauIce
254 
255      modisSim%Cloud_Particle_Size_Water_Mean(sunlit(:)) = meanSizeLiquid
256      modisSim%Cloud_Particle_Size_Ice_Mean  (sunlit(:)) = meanSizeIce
257 
258      modisSim%Cloud_Top_Pressure_Total_Mean(sunlit(:)) = meanCloudTopPressure
259 
260      modisSim%Liquid_Water_Path_Mean(sunlit(:)) = meanLiquidWaterPath
261      modisSim%Ice_Water_Path_Mean   (sunlit(:)) = meanIceWaterPath
262     
263      modisSim%Optical_Thickness_vs_Cloud_Top_Pressure(sunlit(:), 2:numModisTauBins+1, :) = jointHistogram(:, :, :)
264      modisSim%Optical_Thickness_vs_ReffICE(sunlit(:),2:numModisTauBins+1,:)              = jointHistogram2(:, :, :)
265      modisSim%Optical_Thickness_vs_ReffLIQ(sunlit(:),2:numModisTauBins+1,:)              = jointHistogram3(:, :, :)
266
267      ! Reorder pressure bins in joint histogram to go from surface to TOA
268
269      modisSim%Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = modisSim%Optical_Thickness_vs_Cloud_Top_Pressure(:, :, numModisPressureBins:1:-1)
270      if(nSunlit < nPoints) then
271
272        ! Where it's night and we haven't done the retrievals the values are undefined
273
274        modisSim%Cloud_Fraction_Total_Mean(notSunlit(:)) = R_UNDEF
275        modisSim%Cloud_Fraction_Water_Mean(notSunlit(:)) = R_UNDEF
276        modisSim%Cloud_Fraction_Ice_Mean  (notSunlit(:)) = R_UNDEF
277   
278        modisSim%Cloud_Fraction_High_Mean(notSunlit(:)) = R_UNDEF
279        modisSim%Cloud_Fraction_Mid_Mean (notSunlit(:)) = R_UNDEF
280        modisSim%Cloud_Fraction_Low_Mean (notSunlit(:)) = R_UNDEF
281
282        modisSim%Optical_Thickness_Total_Mean(notSunlit(:)) = R_UNDEF
283        modisSim%Optical_Thickness_Water_Mean(notSunlit(:)) = R_UNDEF
284        modisSim%Optical_Thickness_Ice_Mean  (notSunlit(:)) = R_UNDEF
285   
286        modisSim%Optical_Thickness_Total_LogMean(notSunlit(:)) = R_UNDEF
287        modisSim%Optical_Thickness_Water_LogMean(notSunlit(:)) = R_UNDEF
288        modisSim%Optical_Thickness_Ice_LogMean  (notSunlit(:)) = R_UNDEF
289   
290        modisSim%Cloud_Particle_Size_Water_Mean(notSunlit(:)) = R_UNDEF
291        modisSim%Cloud_Particle_Size_Ice_Mean  (notSunlit(:)) = R_UNDEF
292   
293        modisSim%Cloud_Top_Pressure_Total_Mean(notSunlit(:)) = R_UNDEF
294   
295        modisSim%Liquid_Water_Path_Mean(notSunlit(:)) = R_UNDEF
296        modisSim%Ice_Water_Path_Mean   (notSunlit(:)) = R_UNDEF
297 
298        modisSim%Optical_Thickness_vs_Cloud_Top_Pressure(notSunlit(:), :, :) = R_UNDEF
299        modisSim%Optical_Thickness_vs_ReffICE(notSunlit(:), :, :) = R_UNDEF
300        modisSim%Optical_Thickness_vs_ReffLIQ(notSunlit(:), :, :) = R_UNDEF
301      end if
302    else
303
304      ! It's nightime everywhere - everything is undefined
305
306      modisSim%Cloud_Fraction_Total_Mean(:) = R_UNDEF
307      modisSim%Cloud_Fraction_Water_Mean(:) = R_UNDEF
308      modisSim%Cloud_Fraction_Ice_Mean  (:) = R_UNDEF
309 
310      modisSim%Cloud_Fraction_High_Mean(:) = R_UNDEF
311      modisSim%Cloud_Fraction_Mid_Mean (:) = R_UNDEF
312      modisSim%Cloud_Fraction_Low_Mean (:) = R_UNDEF
313
314      modisSim%Optical_Thickness_Total_Mean(:) = R_UNDEF
315      modisSim%Optical_Thickness_Water_Mean(:) = R_UNDEF
316      modisSim%Optical_Thickness_Ice_Mean  (:) = R_UNDEF
317 
318      modisSim%Optical_Thickness_Total_LogMean(:) = R_UNDEF
319      modisSim%Optical_Thickness_Water_LogMean(:) = R_UNDEF
320      modisSim%Optical_Thickness_Ice_LogMean  (:) = R_UNDEF
321 
322      modisSim%Cloud_Particle_Size_Water_Mean(:) = R_UNDEF
323      modisSim%Cloud_Particle_Size_Ice_Mean  (:) = R_UNDEF
324 
325      modisSim%Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF
326 
327      modisSim%Liquid_Water_Path_Mean(:) = R_UNDEF
328      modisSim%Ice_Water_Path_Mean   (:) = R_UNDEF
329 
330      modisSim%Optical_Thickness_vs_Cloud_Top_Pressure(:, :, :) = R_UNDEF
331      modisSim%Optical_Thickness_vs_ReffICE(:, :, :) = R_UNDEF
332      modisSim%Optical_Thickness_vs_ReffLIQ(:, :, :) = R_UNDEF
333    end if
334
335  end subroutine COSP_Modis_Simulator
336  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
337  !------------- SUBROUTINE CONSTRUCT_COSP_MODIS ------------------
338  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
339  SUBROUTINE CONSTRUCT_COSP_MODIS(cfg, nPoints, x)
340    type(cosp_config), intent(in)  :: cfg ! Configuration options
341    integer,           intent(in)  :: Npoints  ! Number of sampled points
342    type(cosp_MODIS),  intent(out) :: x
343
344    ! Allocate minumum storage if simulator not used
345
346    if (cfg%LMODIS_sim) then
347      x%nPoints  = nPoints
348    else
349      x%Npoints  = 1
350    endif
351   
352    ! --- Allocate arrays ---
353    allocate(x%Cloud_Fraction_Total_Mean(x%nPoints))
354    allocate(x%Cloud_Fraction_Water_Mean(x%nPoints))
355    allocate(x%Cloud_Fraction_Ice_Mean(x%nPoints))
356   
357    allocate(x%Cloud_Fraction_High_Mean(x%nPoints))
358    allocate(x%Cloud_Fraction_Mid_Mean(x%nPoints))
359    allocate(x%Cloud_Fraction_Low_Mean(x%nPoints))
360   
361    allocate(x%Optical_Thickness_Total_Mean(x%nPoints))
362    allocate(x%Optical_Thickness_Water_Mean(x%nPoints))
363    allocate(x%Optical_Thickness_Ice_Mean(x%nPoints))
364   
365    allocate(x%Optical_Thickness_Total_LogMean(x%nPoints))
366    allocate(x%Optical_Thickness_Water_LogMean(x%nPoints))
367    allocate(x%Optical_Thickness_Ice_LogMean(x%nPoints))
368   
369    allocate(x%Cloud_Particle_Size_Water_Mean(x%nPoints))
370    allocate(x%Cloud_Particle_Size_Ice_Mean(x%nPoints))
371   
372    allocate(x%Cloud_Top_Pressure_Total_Mean(x%nPoints))
373   
374    allocate(x%Liquid_Water_Path_Mean(x%nPoints))
375    allocate(x%Ice_Water_Path_Mean(x%nPoints))
376     
377    allocate(x%Optical_Thickness_vs_Cloud_Top_Pressure(nPoints, numModisTauBins+1, numModisPressureBins))
378    allocate(x%Optical_Thickness_vs_ReffICE(nPoints, numModisTauBins+1, numModisReffIceBins))
379    allocate(x%Optical_Thickness_vs_ReffLIQ(nPoints, numModisTauBins+1, numModisReffLiqBins))
380    x%Optical_Thickness_vs_Cloud_Top_Pressure(:, :, :) = R_UNDEF
381    x%Optical_Thickness_vs_ReffLIQ(:, :, :) = R_UNDEF
382    x%Optical_Thickness_vs_ReffICE(:, :, :) = R_UNDEF
383
384  END SUBROUTINE CONSTRUCT_COSP_MODIS
385
386  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
387  !------------- SUBROUTINE FREE_COSP_MODIS -----------------------
388  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
389  SUBROUTINE FREE_COSP_MODIS(x)
390    type(cosp_MODIS),intent(inout) :: x
391
392    ! Free space used by cosp_modis variable.
393
394    if(associated(x%Cloud_Fraction_Total_Mean)) deallocate(x%Cloud_Fraction_Total_Mean)
395    if(associated(x%Cloud_Fraction_Water_Mean)) deallocate(x%Cloud_Fraction_Water_Mean)
396    if(associated(x%Cloud_Fraction_Ice_Mean  )) deallocate(x%Cloud_Fraction_Ice_Mean)
397   
398    if(associated(x%Cloud_Fraction_High_Mean)) deallocate(x%Cloud_Fraction_High_Mean)
399    if(associated(x%Cloud_Fraction_Mid_Mean )) deallocate(x%Cloud_Fraction_Mid_Mean)
400    if(associated(x%Cloud_Fraction_Low_Mean )) deallocate(x%Cloud_Fraction_Low_Mean)
401   
402    if(associated(x%Optical_Thickness_Total_Mean)) deallocate(x%Optical_Thickness_Total_Mean)
403    if(associated(x%Optical_Thickness_Water_Mean)) deallocate(x%Optical_Thickness_Water_Mean)
404    if(associated(x%Optical_Thickness_Ice_Mean  )) deallocate(x%Optical_Thickness_Ice_Mean)
405   
406    if(associated(x%Optical_Thickness_Total_LogMean)) deallocate(x%Optical_Thickness_Total_LogMean)
407    if(associated(x%Optical_Thickness_Water_LogMean)) deallocate(x%Optical_Thickness_Water_LogMean)
408    if(associated(x%Optical_Thickness_Ice_LogMean  )) deallocate(x%Optical_Thickness_Ice_LogMean)
409   
410    if(associated(x%Cloud_Particle_Size_Water_Mean)) deallocate(x%Cloud_Particle_Size_Water_Mean)
411    if(associated(x%Cloud_Particle_Size_Ice_Mean  )) deallocate(x%Cloud_Particle_Size_Ice_Mean)
412   
413    if(associated(x%Cloud_Top_Pressure_Total_Mean )) deallocate(x%Cloud_Top_Pressure_Total_Mean   )
414   
415    if(associated(x%Liquid_Water_Path_Mean)) deallocate(x%Liquid_Water_Path_Mean   )
416    if(associated(x%Ice_Water_Path_Mean   )) deallocate(x%Ice_Water_Path_Mean   )
417   
418    if(associated(x%Optical_Thickness_vs_Cloud_Top_Pressure)) deallocate(x%Optical_Thickness_vs_Cloud_Top_Pressure   )
419    if(associated(x%Optical_Thickness_vs_ReffIce)) deallocate(x%Optical_Thickness_vs_ReffIce)
420    if(associated(x%Optical_Thickness_vs_ReffLiq)) deallocate(x%Optical_Thickness_vs_ReffLiq)
421  END SUBROUTINE FREE_COSP_MODIS
422  ! -----------------------------------------------------
423
424  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
425  !------------- SUBROUTINE COSP_MODIS_CPSECTION -----------------
426  !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
427  SUBROUTINE COSP_MODIS_CPSECTION(ix, iy, orig, copy)
428    integer, dimension(2), intent(in) :: ix, iy
429    type(cosp_modis),      intent(in   ) :: orig
430    type(cosp_modis),      intent(  out) :: copy
431
432    ! Copy a set of grid points from one cosp_modis variable to another.
433    !   Should test to be sure ix and iy refer to the same number of grid points
434
435    integer :: orig_start, orig_end, copy_start, copy_end
436   
437    orig_start = ix(1); orig_end = ix(2)
438    copy_start = iy(1); copy_end = iy(2)
439   
440    copy%Cloud_Fraction_Total_Mean(copy_start:copy_end) = orig%Cloud_Fraction_Total_Mean(orig_start:orig_end)
441    copy%Cloud_Fraction_Water_Mean(copy_start:copy_end) = orig%Cloud_Fraction_Water_Mean(orig_start:orig_end)
442    copy%Cloud_Fraction_Ice_Mean  (copy_start:copy_end) = orig%Cloud_Fraction_Ice_Mean  (orig_start:orig_end)
443   
444    copy%Cloud_Fraction_High_Mean(copy_start:copy_end) = orig%Cloud_Fraction_High_Mean(orig_start:orig_end)
445    copy%Cloud_Fraction_Mid_Mean (copy_start:copy_end) = orig%Cloud_Fraction_Mid_Mean (orig_start:orig_end)
446    copy%Cloud_Fraction_Low_Mean (copy_start:copy_end) = orig%Cloud_Fraction_Low_Mean (orig_start:orig_end)
447   
448    copy%Optical_Thickness_Total_Mean(copy_start:copy_end) = orig%Optical_Thickness_Total_Mean(orig_start:orig_end)
449    copy%Optical_Thickness_Water_Mean(copy_start:copy_end) = orig%Optical_Thickness_Water_Mean(orig_start:orig_end)
450    copy%Optical_Thickness_Ice_Mean  (copy_start:copy_end) = orig%Optical_Thickness_Ice_Mean  (orig_start:orig_end)
451   
452    copy%Optical_Thickness_Total_LogMean(copy_start:copy_end) = &
453                                                          orig%Optical_Thickness_Total_LogMean(orig_start:orig_end)
454    copy%Optical_Thickness_Water_LogMean(copy_start:copy_end) = &
455                                                          orig%Optical_Thickness_Water_LogMean(orig_start:orig_end)
456    copy%Optical_Thickness_Ice_LogMean  (copy_start:copy_end) = &
457                                                          orig%Optical_Thickness_Ice_LogMean  (orig_start:orig_end)
458
459    copy%Cloud_Particle_Size_Water_Mean(copy_start:copy_end) = orig%Cloud_Particle_Size_Water_Mean(orig_start:orig_end)
460    copy%Cloud_Particle_Size_Ice_Mean  (copy_start:copy_end) = orig%Cloud_Particle_Size_Ice_Mean  (orig_start:orig_end)
461
462    copy%Cloud_Top_Pressure_Total_Mean(copy_start:copy_end) = orig%Cloud_Top_Pressure_Total_Mean(orig_start:orig_end)
463   
464    copy%Liquid_Water_Path_Mean(copy_start:copy_end) = orig%Liquid_Water_Path_Mean(orig_start:orig_end)
465    copy%Ice_Water_Path_Mean   (copy_start:copy_end) = orig%Ice_Water_Path_Mean  (orig_start:orig_end)
466   
467    copy%Optical_Thickness_vs_Cloud_Top_Pressure(copy_start:copy_end, :, :) = &
468         orig%Optical_Thickness_vs_Cloud_Top_Pressure(orig_start:orig_end, :, :)
469    copy%Optical_Thickness_vs_ReffIce(copy_start:copy_end, :, :) = &
470         orig%Optical_Thickness_vs_ReffIce(orig_start:orig_end, :, :)
471    copy%Optical_Thickness_vs_ReffLiq(copy_start:copy_end, :, :) = &
472         orig%Optical_Thickness_vs_ReffLiq(orig_start:orig_end, :, :)
473
474  END SUBROUTINE COSP_MODIS_CPSECTION
475  ! -----------------------------------------------------
476
477END MODULE MOD_COSP_Modis_Simulator
Note: See TracBrowser for help on using the repository browser.