Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hcox_dust_dead_mod.F
7 : !
8 : ! !DESCRIPTION: Module hcox\_dust\_dead\_mod.F contains routines and
9 : ! variables from Charlie Zender's DEAD dust mobilization model.
10 : ! Most routines are from Charlie Zender, but have been modified and/or
11 : ! cleaned up for inclusion into GEOS-Chem.
12 : !\\
13 : !\\
14 : ! This is a HEMCO extension module that uses many of the HEMCO core
15 : ! utilities.
16 : !\\
17 : !\\
18 : ! NOTE: The current (dust) code was validated at 2 x 2.5 resolution.
19 : ! We have found that running at 4x5 we get much lower (~50%) dust
20 : ! emissions than at 2x2.5. Recommend we either find a way to scale
21 : ! the U* computed in the dust module, or run a 1x1 and store the the
22 : ! dust emissions, with which to drive lower resolution runs.
23 : ! -- Duncan Fairlie, 1/25/07
24 : !\\
25 : !\\
26 : ! (We'll) implement the [dust] code in the standard [GEOS-Chem]
27 : ! model and put a warning about expected low bias when the simulation
28 : ! is run at 4x5. Whoever is interested in running dust at 4x5 in the
29 : ! future can deal with making the fix.
30 : ! -- Daniel Jacob, 1/25/07
31 : !\\
32 : !\\
33 : ! !REFERENCES:
34 : !
35 : ! \begin{itemize}
36 : ! \item Zender, C. S., Bian, H., and Newman, D.: Mineral Dust Entrainment and
37 : ! Deposition (DEAD) model: Description and 1990s dust climatology,
38 : ! Journal of Geophysical Research: Atmospheres, 108, 2003.
39 : ! \end{itemize}
40 : !
41 : ! !INTERFACE:
42 : !
43 : MODULE HCOX_DUSTDEAD_MOD
44 : !
45 : ! !USES:
46 : !
47 : USE HCO_ERROR_MOD
48 : USE HCO_DIAGN_MOD
49 : USE HCOX_State_MOD, ONLY : Ext_State
50 : USE HCO_STATE_MOD, ONLY : HCO_State
51 :
52 : IMPLICIT NONE
53 : PRIVATE
54 : !
55 : ! !PUBLIC MEMBER FUNCTIONS:
56 : !
57 : PUBLIC :: HCOX_DustDead_Run
58 : PUBLIC :: HCOX_DustDead_Init
59 : PUBLIC :: HCOX_DustDead_Final
60 : !
61 : ! !REVISION HISTORY:
62 : ! 08 Apr 2004 - T. D. Fairlie - Initial version
63 : ! See https://github.com/geoschem/hemco for complete history
64 : !EOP
65 : !------------------------------------------------------------------------------
66 : !BOC
67 : !
68 : ! !MODULE VARIABLES:
69 : !
70 : ! Now pack all local variables into customized instance
71 : TYPE :: MyInst
72 :
73 : ! Fields required by module
74 : INTEGER :: Instance
75 : INTEGER :: ExtNr ! Extension num for DustDead
76 : INTEGER :: ExtNrAlk ! Extension num for DustAlk
77 : INTEGER, ALLOCATABLE :: HcoIDs(:) ! tracer IDs for DustDead
78 : INTEGER, ALLOCATABLE :: HcoIDsAlk(:) ! tracer IDs for DustAlk
79 : REAL*8 :: FLX_MSS_FDG_FCT
80 :
81 : !---------------------------------------
82 : ! 2-D pointers pointing to netCDF arrays
83 : !---------------------------------------
84 :
85 : ! Time-invariant fields
86 : REAL(hp), POINTER :: ERD_FCT_GEO (:,:) => NULL()
87 : ! REAL, POINTER :: ERD_FCT_HYDRO(:,:,:,:)
88 : ! REAL, POINTER :: ERD_FCT_TOPO (:,:,:,:)
89 : ! REAL, POINTER :: ERD_FCT_UNITY(:,:,:,:)
90 : ! REAL, POINTER :: MBL_BSN_FCT (:,:,:,:)
91 :
92 : ! GOCART source function (tdf, bmy, 1/25/07)
93 : REAL(hp), POINTER :: SRCE_FUNC(:,:) => NULL()
94 :
95 : ! Land surface that is not lake or wetland (by area)
96 : REAL(hp), POINTER :: LND_FRC_DRY (:,:) => NULL()
97 : REAL(hp), POINTER :: MSS_FRC_CACO3(:,:) => NULL()
98 : REAL(hp), POINTER :: MSS_FRC_CLY (:,:) => NULL()
99 : REAL(hp), POINTER :: MSS_FRC_SND (:,:) => NULL()
100 : REAL(hp), POINTER :: SFC_TYP (:,:) => NULL()
101 : REAL(hp), POINTER :: VAI_DST(:,:) => NULL()
102 :
103 : ! Time-varying surface info from CTM
104 : ! REAL*8, ALLOCATABLE :: FLX_LW_DWN_SFC(:,:)
105 : ! REAL*8, ALLOCATABLE :: FLX_SW_ABS_SFC(:,:)
106 : ! REAL*8, ALLOCATABLE :: TPT_GND(:,:)
107 : ! REAL*8, ALLOCATABLE :: TPT_SOI(:,:)
108 : ! REAL*8, ALLOCATABLE :: VWC_SFC(:,:)
109 :
110 : ! Variables initialized in dst_tvbds_ntp() and dst_tvbds_ini()
111 : ! REAL*8, ALLOCATABLE :: SRC_STR(:,:)
112 :
113 : ! LSM plant type, 28 land surface types plus 0 for ocean
114 : ! Also account for 3 different land types in each grid box
115 : ! NN_SFCTYP denotes the highest possible surface type number.
116 : ! (ckeller, 07/24/2014)
117 : INTEGER, ALLOCATABLE :: PLN_TYP(:,:)
118 : REAL*8, ALLOCATABLE :: PLN_FRC(:,:)
119 : REAL*8, ALLOCATABLE :: TAI(:,:)
120 :
121 : ! Other fields
122 : REAL*8, ALLOCATABLE :: DMT_VWR(:)
123 : ! REAL*8, ALLOCATABLE :: DNS_AER(:)
124 : REAL*8, ALLOCATABLE :: OVR_SRC_SNK_FRC(:,:)
125 : REAL*8, ALLOCATABLE :: OVR_SRC_SNK_MSS(:,:)
126 : ! INTEGER, ALLOCATABLE :: OROGRAPHY(:,:)
127 : REAL*8, ALLOCATABLE :: DMT_MIN(:)
128 : REAL*8, ALLOCATABLE :: DMT_MAX(:)
129 : REAL*8, ALLOCATABLE :: DMT_VMA_SRC(:)
130 : REAL*8, ALLOCATABLE :: GSD_ANL_SRC(:)
131 : REAL*8, ALLOCATABLE :: MSS_FRC_SRC(:)
132 : TYPE(MyInst), POINTER :: NextInst => NULL()
133 : END TYPE MyInst
134 :
135 : ! Pointer to instances
136 : TYPE(MyInst), POINTER :: AllInst => NULL()
137 :
138 : !---------------------------------------
139 : ! MODULE PARAMETER
140 : !---------------------------------------
141 : INTEGER, PARAMETER :: NBINS = 4 ! # of dust bins
142 : INTEGER, PARAMETER :: NN_SFCTYP = 28
143 :
144 : ! Fundamental physical constants
145 : REAL*8, PARAMETER :: GAS_CST_UNV = 8.3144598d0
146 : REAL*8, PARAMETER :: MMW_H2O = 1.8015259d-02
147 : REAL*8, PARAMETER :: MMW_DRY_AIR = 28.97d-3
148 : REAL*8, PARAMETER :: CST_VON_KRM = 0.4d0
149 : REAL*8, PARAMETER :: GRV_SFC = 9.80665d0
150 : REAL*8, PARAMETER :: GAS_CST_DRY_AIR = 287.0d0
151 : REAL*8, PARAMETER :: RDS_EARTH = 6.37122d+6
152 : REAL*8, PARAMETER :: GAS_CST_H2O = 461.65D0
153 : REAL*8, PARAMETER :: SPC_HEAT_DRY_AIR = 1005.0d0
154 : REAL*8, PARAMETER :: TPT_FRZ_PNT = 273.15d0
155 :
156 : ! Derived quantities
157 : REAL*8, PARAMETER :: GRV_SFC_RCP = 1.0d0 / GRV_SFC
158 : REAL*8, PARAMETER :: CST_VON_KRM_RCP = 1.0d0 / CST_VON_KRM
159 : REAL*8, PARAMETER :: EPS_H2O = MMW_H2O / MMW_DRY_AIR
160 : REAL*8, PARAMETER :: EPS_H2O_RCP_M1 = -1.0d0 + MMW_DRY_AIR
161 : & / MMW_H2O
162 : REAL*8, PARAMETER :: KAPPA_DRY_AIR = GAS_CST_DRY_AIR
163 : & / SPC_HEAT_DRY_AIR
164 :
165 : ! Fixed-size grid information
166 : INTEGER, PARAMETER :: DST_SRC_NBR = 3
167 : INTEGER, PARAMETER :: MVT = 14
168 :
169 : CONTAINS
170 : !EOC
171 : !------------------------------------------------------------------------------
172 : ! Harmonized Emissions Component (HEMCO) !
173 : !------------------------------------------------------------------------------
174 : !BOP
175 : !
176 : ! !IROUTINE: HCOX_DustDead_Run
177 : !
178 : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Run is the driver routine
179 : ! for the HEMCO DEAD dust extension.
180 : !\\
181 : !\\
182 : ! !INTERFACE:
183 : !
184 0 : SUBROUTINE HCOX_DustDead_Run( ExtState, HcoState, RC )
185 : !
186 : ! !USES:
187 : !
188 : USE HCO_CALC_MOD, ONLY : HCO_EvalFld, HCO_CalcEmis
189 : USE HCO_FLUXARR_MOD, ONLY : HCO_EmisAdd
190 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Get
191 : USE HCO_CLOCK_MOD, ONLY : HcoClock_First
192 : !
193 : ! !INPUT PARAMETERS:
194 : !
195 : TYPE(Ext_State), POINTER :: ExtState ! Module options
196 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
197 : !
198 : ! !INPUT/OUTPUT PARAMETERS:
199 : !
200 : INTEGER, INTENT(INOUT) :: RC
201 :
202 : ! !REVISION HISTORY:
203 : ! 08 Apr 2004 - T. D. Fairlie - Initial version
204 : ! See https://github.com/geoschem/hemco for complete history
205 : !EOP
206 : !------------------------------------------------------------------------------
207 : !BOC
208 : !
209 : ! !LOCAL VARIABLES:
210 : !
211 : ! Scalars
212 : LOGICAL :: ERR
213 : INTEGER :: I, J, L, N
214 : INTEGER :: M, IOS, INC, LAT_IDX
215 : INTEGER :: NDB, NSTEP, intDOY
216 : REAL*8 :: W10M, DEN, DIAM, U_TS0
217 : REAL*8 :: U_TS, SRCE_P, Reynol, YMID_R
218 : REAL*8 :: ALPHA, BETA, GAMMA, CW
219 : REAL*8 :: XTAU, P1, P2
220 : REAL*8 :: AREA_M2, DTSRCE, DOY
221 :
222 : ! Arrays
223 0 : INTEGER :: OROGRAPHY(HcoState%NX,HcoState%NY)
224 : REAL*8 :: PSLON(HcoState%NX) ! surface pressure
225 0 : REAL*8 :: PTHICK(HcoState%NX) ! delta P (L=1)
226 0 : REAL*8 :: PMID(HcoState%NX) ! mid layer P (L=1)
227 0 : REAL*8 :: TLON(HcoState%NX) ! temperature (L=1)
228 0 : REAL*8 :: THLON(HcoState%NX) ! pot. temp. (L=1)
229 0 : REAL*8 :: ULON(HcoState%NX) ! U-wind (L=1)
230 0 : REAL*8 :: VLON(HcoState%NX) ! V-wind (L=1)
231 0 : REAL*8 :: BHT2(HcoState%NX) ! half box height (L=1)
232 0 : REAL*8 :: Q_H2O(HcoState%NX) ! specific humidity (L=1)
233 0 : REAL*8 :: ORO(HcoState%NX) ! "orography"
234 0 : REAL*8 :: SNW_HGT_LQD(HcoState%NX) ! equivalent snow ht.
235 0 : REAL*8 :: DSRC(HcoState%NX,NBINS) ! dust mixing ratio incr.
236 0 : REAL*8 :: DUST_EMI_TOTAL(HcoState%NX) ! total dust emiss
237 :
238 : ! Flux array [kg/m2/s]
239 : REAL(hp), TARGET :: FLUX(HcoState%NX,
240 : & HcoState%NY,
241 0 : & NBINS)
242 :
243 : ! Flux array for dust alkalinity [kg/m2/s]
244 : REAL(hp), TARGET :: FLUX_ALK(HcoState%NX,
245 : & HcoState%NY,
246 0 : & NBINS)
247 :
248 : ! Pointers
249 : TYPE(MyInst), POINTER :: Inst
250 :
251 : ! Strings
252 : CHARACTER(LEN=255) :: MSG, LOC
253 : !
254 : ! !DEFINED PARAMETERS:
255 : !
256 : ! REAL*8, PARAMETER :: Ch_dust = 9.375d-10
257 : ! REAL*8, PARAMETER :: g0 = 9.80665d0
258 : ! REAL*8, PARAMETER :: G = g0 * 1.D2
259 : ! REAL*8, PARAMETER :: RHOA = 1.25D-3
260 : REAL*8, PARAMETER :: CP = 1004.16d0
261 : REAL*8, PARAMETER :: RGAS = 8314.3d0 / 28.97d0
262 : REAL*8, PARAMETER :: AKAP = RGAS / CP
263 : REAL*8, PARAMETER :: P1000 = 1000d0
264 :
265 : !=================================================================
266 : ! HCOX_DUSTDEAD_RUN begins here!
267 : !=================================================================
268 0 : LOC = 'HCOX_DUSTDEAD_RUN (HCOX_DUSTDEAD_MOD.F)'
269 :
270 : ! Return if extension disabled
271 0 : IF ( ExtState%DustDead <= 0 ) RETURN
272 :
273 : ! Enter
274 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
275 0 : IF ( RC /= HCO_SUCCESS ) THEN
276 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
277 0 : RETURN
278 : ENDIF
279 :
280 : ! Get instance
281 0 : Inst => NULL()
282 0 : CALL InstGet ( ExtState%DustDead, Inst, RC )
283 0 : IF ( RC /= HCO_SUCCESS ) THEN
284 0 : WRITE(MSG,*) 'Cannot find DEAD instance Nr. ', ExtState%DustDead
285 0 : CALL HCO_ERROR(MSG,RC)
286 0 : RETURN
287 : ENDIF
288 :
289 : !=================================================================
290 : ! Get pointers to gridded data imported through config. file
291 : !=================================================================
292 : !
293 : ! The following time-invariant fields are read in
294 : ! ERD_FCT_GEO ; geomorphic erodibility: HcoState%NX HcoState%NY
295 : ! ERD_FCT_HYDRO ; hydrologic erodibility: HcoState%NX HcoState%NY
296 : ! ERD_FCT_TOPO ; topog. erodibility (Ginoux): HcoState%NX HcoState%NY
297 : ! ERD_FCT_UNITY ; uniform erodibility: HcoState%NX HcoState%NY
298 : ! MBL_BSN_FCT ; overall erodibility factor : HcoState%NX HcoState%NY
299 : !
300 : ! Erodibility field should be copied onto mbl_bsn_fct
301 : ! which is the one used by the DEAD code Duncan 8/1/2003
302 : !
303 : ! LND_FRC_DRY ; dry land fraction: HcoState%NX HcoState%NY
304 : ! MSS_FRC_CACO3 ; mass fraction of soil CaCO3: HcoState%NX HcoState%NY
305 : ! MSS_FRC_CLY ; mass fraction of clay: HcoState%NX HcoState%NY
306 : ! MSS_FRC_SND ; mass fraction of sand: HcoState%NX HcoState%NY
307 : ! SFC_TYP ; surface type: HcoState%NX HcoState%NY
308 : !=================================================================
309 : !IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
310 : CALL HCO_EvalFld( HcoState, 'DEAD_EF_GEO',
311 0 : & Inst%ERD_FCT_GEO, RC)
312 0 : IF ( RC /= HCO_SUCCESS ) THEN
313 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
314 0 : RETURN
315 : ENDIF
316 :
317 : CALL HCO_EvalFld( HcoState, 'DEAD_LF_DRY',
318 0 : & Inst%LND_FRC_DRY, RC)
319 0 : IF ( RC /= HCO_SUCCESS ) THEN
320 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
321 0 : RETURN
322 : ENDIF
323 :
324 : CALL HCO_EvalFld( HcoState, 'DEAD_MF_CACO3',
325 0 : & Inst%MSS_FRC_CACO3, RC )
326 0 : IF ( RC /= HCO_SUCCESS ) THEN
327 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
328 0 : RETURN
329 : ENDIF
330 :
331 : CALL HCO_EvalFld( HcoState, 'DEAD_MF_CLY',
332 0 : & Inst%MSS_FRC_CLY, RC)
333 0 : IF ( RC /= HCO_SUCCESS ) THEN
334 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
335 0 : RETURN
336 : ENDIF
337 :
338 : CALL HCO_EvalFld( HcoState, 'DEAD_MF_SND',
339 0 : & Inst%MSS_FRC_SND, RC)
340 0 : IF ( RC /= HCO_SUCCESS ) THEN
341 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
342 0 : RETURN
343 : ENDIF
344 :
345 : CALL HCO_EvalFld( HcoState, 'DEAD_SFC_TYP',
346 0 : & Inst%SFC_TYP, RC )
347 0 : IF ( RC /= HCO_SUCCESS ) THEN
348 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
349 0 : RETURN
350 : ENDIF
351 :
352 : CALL HCO_EvalFld( HcoState, 'DEAD_GOC_SRC',
353 0 : & Inst%SRCE_FUNC, RC )
354 0 : IF ( RC /= HCO_SUCCESS ) THEN
355 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
356 0 : RETURN
357 : ENDIF
358 :
359 : CALL HCO_EvalFld( HcoState, 'DEAD_VAI',
360 0 : & Inst%VAI_DST, RC )
361 0 : IF ( RC /= HCO_SUCCESS ) THEN
362 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
363 0 : RETURN
364 : ENDIF
365 :
366 : ! FIRST = .FALSE.
367 : !ENDIF
368 :
369 : !=================================================================
370 : ! CALL DUST MOBILIZATION SCHEME
371 : !=================================================================
372 :
373 : ! Make OROGRAPHY array (0=Ocean; 1=Land; 2=Ice)
374 0 : CALL GET_ORO( HcoState, ExtState, OROGRAPHY, RC )
375 0 : IF ( RC /= HCO_SUCCESS ) THEN
376 0 : CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
377 0 : RETURN
378 : ENDIF
379 :
380 : ! Get emissions time step
381 0 : DTSRCE = HcoState%TS_EMIS
382 :
383 : ! Get day of year, convert to real!!
384 0 : CALL HcoClock_Get( HcoState%Clock, cDOY = intDOY, RC=RC )
385 0 : IF ( RC /= HCO_SUCCESS ) THEN
386 0 : CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
387 0 : RETURN
388 : ENDIF
389 0 : DOY = intDOY
390 :
391 : ! Init
392 0 : FLUX(:,:,:) = 0.0_hp
393 0 : FLUX_ALK(:,:,:) = 0.0_hp
394 :
395 : ! Error check
396 0 : ERR = .FALSE.
397 :
398 : !$OMP PARALLEL DO
399 : !$OMP+DEFAULT( SHARED )
400 : !$OMP+PRIVATE( I, J, P1, P2, PTHICK, PMID, TLON )
401 : !$OMP+PRIVATE( THLON, ULON, VLON, BHT2, Q_H2O, ORO, SNW_HGT_LQD )
402 : !$OMP+PRIVATE( N, YMID_R, DSRC, RC, AREA_M2, DUST_EMI_TOTAL )
403 :
404 : ! Loop over latitudes
405 0 : DO J = 1, HcoState%NY
406 :
407 : ! Don't do calculations if there has been an error
408 0 : IF ( ERR ) CYCLE
409 :
410 : ! Loop over longitudes
411 0 : DO I = 1, HcoState%NX
412 :
413 : ! Pressure [Pa] at bottom and top edge of level 1
414 0 : P1 = HcoState%Grid%PEDGE%Val(I,J,1)
415 0 : P2 = HcoState%Grid%PEDGE%Val(I,J,2)
416 :
417 : ! Pressure thickness of 1st layer [Pa]
418 0 : PTHICK(I) = ( P1 - P2 )
419 :
420 : ! Pressure at midpt of surface layer [Pa]
421 0 : PMID(I) = ( P1 + P2 ) / 2.0_hp
422 :
423 : ! Temperature [K] at midpoint of surface layer
424 0 : TLON(I) = ExtState%TK%Arr%Val(I,J,1)
425 :
426 : ! Potential temperature [K] at midpoint
427 0 : THLON(I) = TLON(I) * ( P1000 / PMID(I) )**AKAP
428 :
429 : ! U and V winds at surface [m/s]
430 : ! --> These variables won't be used at all...
431 0 : ULON(I) = ExtState%U10M%Arr%Val(I,J)
432 0 : VLON(I) = ExtState%V10M%Arr%Val(I,J)
433 :
434 : ! Half box height at surface [m]
435 0 : BHT2(I) = HcoState%Grid%BXHEIGHT_M%Val(I,J,1) / 2.d0
436 :
437 : ! Specific humidity at midpoint of surface layer [kg H2O/kg air]
438 0 : Q_H2O(I) = ExtState%SPHU%Arr%Val(I,J,1)
439 :
440 : ! Orography at surface
441 : ! Ocean is 0; land is 1; ice is 2
442 0 : ORO(I) = REAL(OROGRAPHY(I,J),KIND=dp)
443 :
444 : ! Snow [m H2O]. SNOWHGT is in kg H2O/m2, which is equivalent to
445 : ! mm H2O. Convert to m H2O here.
446 0 : SNW_HGT_LQD(I) = ExtState%SNOWHGT%Arr%Val(I,J) / 1000.d0
447 :
448 : ! Dust tracer and increments
449 0 : DSRC(I,:) = 0.0d0
450 : ENDDO !I
451 :
452 : !==============================================================
453 : ! CALL DUST MOBILIZATION DRIVER (DST_MBL) FOR LATITUDE J
454 : !==============================================================
455 :
456 : ! Latitude in RADIANS
457 0 : YMID_R = HcoState%Grid%YMID%Val(1,J) * HcoState%Phys%PI /180.d0
458 :
459 : ! Call DEAD dust mobilization
460 : CALL DST_MBL( HcoState, ExtState, Inst, DOY,
461 : & BHT2, J, YMID_R, ORO,
462 : & PTHICK, PMID, Q_H2O, DSRC, SNW_HGT_LQD,
463 : & DTSRCE, TLON, THLON, VLON, ULON,
464 0 : & J, RC )
465 :
466 : ! Error check
467 0 : IF ( RC /= HCO_SUCCESS ) THEN
468 : ERR = .TRUE.
469 : CYCLE
470 : ENDIF
471 :
472 : ! Redistribute dust emissions using new dust size distribution
473 : ! scheme (L. Zhang, 6/26/15)
474 0 : DUST_EMI_TOTAL = 0.0d0
475 0 : DO N = 1, NBINS
476 0 : DUST_EMI_TOTAL(:) = DUST_EMI_TOTAL(:) + DSRC(:,N)
477 : ENDDO
478 0 : DSRC(:,1) = DUST_EMI_TOTAL(:) * 0.0766d0
479 0 : DSRC(:,2) = DUST_EMI_TOTAL(:) * 0.1924d0
480 0 : DSRC(:,3) = DUST_EMI_TOTAL(:) * 0.3491d0
481 0 : DSRC(:,4) = DUST_EMI_TOTAL(:) * 0.3819d0
482 :
483 : ! Write to emissions array
484 0 : DO I = 1, HcoState%NX
485 :
486 : ! Loop over dust tracers
487 : ! Write into flux array: kg/box --> kg/m2/s
488 0 : AREA_M2 = HcoState%Grid%AREA_M2%Val( I, J )
489 0 : DO N = 1, NBINS
490 :
491 0 : IF ( Inst%HcoIDs(N) > 0 ) THEN
492 0 : FLUX(I,J,N) = ( DSRC(I,N) / AREA_M2 / DTSRCE )
493 : ENDIF
494 :
495 : ! Include DUST Alkalinity SOURCE, assuming an alkalinity
496 : ! of 4% by weight [kg]. !tdf 05/10/08
497 : !tdf with 3% Ca, there's also 1% equ. Mg, makes 4%
498 0 : IF ( Inst%ExtNrAlk > 0 ) THEN
499 0 : FLUX_ALK(I,J,N) = 0.04 * ( DSRC(I,N) / AREA_M2 /
500 0 : & DTSRCE )
501 : ENDIF
502 :
503 : ENDDO !N
504 : ENDDO !I
505 : ENDDO !J
506 : !$OMP END PARALLEL DO
507 :
508 : ! Error check
509 0 : IF ( ERR ) THEN
510 0 : RC = HCO_FAIL
511 0 : RETURN
512 : ENDIF
513 :
514 : !=================================================================
515 : ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
516 : !=================================================================
517 0 : DO N = 1, NBINS
518 :
519 0 : IF ( Inst%HcoIDs(N) > 0 ) THEN
520 :
521 : ! Add to emissions array
522 : CALL HCO_EmisAdd( HcoState, FLUX(:,:,N),
523 0 : & Inst%HcoIDs(N), RC, ExtNr=Inst%ExtNr )
524 0 : IF ( RC /= HCO_SUCCESS ) THEN
525 0 : WRITE(MSG,*) 'HCO_EmisAdd error: dust bin ', N
526 0 : CALL HCO_ERROR(MSG, RC )
527 0 : RETURN
528 : ENDIF
529 :
530 : ENDIF
531 :
532 0 : IF ( Inst%ExtNrAlk > 0 ) THEN
533 0 : IF ( Inst%HcoIDsAlk(N) > 0 ) THEN
534 :
535 : ! Add to dust alkalinity emissions array
536 : CALL HCO_EmisAdd( HcoState, FLUX_Alk(:,:,N),
537 : & Inst%HcoIDsAlk(N), RC,
538 0 : & ExtNr=Inst%ExtNrAlk )
539 0 : IF ( RC /= HCO_SUCCESS ) THEN
540 0 : WRITE(MSG,*) 'HCO_EmisAdd error: dust alk bin ', N
541 0 : CALL HCO_ERROR(MSG, RC )
542 0 : RETURN
543 : ENDIF
544 :
545 : ENDIF
546 : ENDIF
547 :
548 : ENDDO !N
549 :
550 : ! Return w/ success
551 0 : Inst => NULL()
552 0 : CALL HCO_LEAVE( HcoState%Config%Err, RC )
553 :
554 : END SUBROUTINE HCOX_DustDead_Run
555 : !EOC
556 : !------------------------------------------------------------------------------
557 : ! Harmonized Emissions Component (HEMCO) !
558 : !------------------------------------------------------------------------------
559 : !BOP
560 : !
561 : ! !IROUTINE: HCOX_DustDead_Init
562 : !
563 : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Init initializes the HEMCO
564 : ! DUST\_DEAD extension.
565 : !\\
566 : !\\
567 : ! !INTERFACE:
568 : !
569 0 : SUBROUTINE HCOX_DustDead_Init ( HcoState, ExtName,
570 : & ExtState, RC )
571 : !
572 : ! !USES:
573 : !
574 : USE HCO_ExtList_Mod, ONLY : GetExtNr, GetExtOpt
575 : USE HCO_STATE_MOD, ONLY : HCO_GetExtHcoID
576 : !
577 : ! !INPUT PARAMETERS:
578 : !
579 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
580 : CHARACTER(LEN=*), INTENT(IN ) :: ExtName ! Extension name
581 : TYPE(Ext_State), POINTER :: ExtState ! Module options
582 : !
583 : ! !INPUT/OUTPUT PARAMETERS:
584 : !
585 : INTEGER, INTENT(INOUT) :: RC
586 :
587 : ! !REVISION HISTORY:
588 : ! 25 Nov 2013 - C. Keller - Now a HEMCO extension
589 : ! See https://github.com/geoschem/hemco for complete history
590 : !EOP
591 : !------------------------------------------------------------------------------
592 : !BOC
593 : !
594 : ! !LOCAL VARIABLES:
595 : !
596 : CHARACTER(LEN=255) :: MSG, LOC
597 : INTEGER :: I, J, N, AS
598 : INTEGER :: ExtNr, nSpc
599 : INTEGER :: nSpcAlk
600 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
601 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNamesAlk(:)
602 : REAL(dp) :: TmpScal
603 : LOGICAL :: FOUND
604 : TYPE(MyInst), POINTER :: Inst
605 : #if defined ( MODEL_GEOS )
606 : CHARACTER(LEN=2047) :: TuningTable
607 : CHARACTER(LEN=2047), PARAMETER :: TuningTable_Default =
608 : & 'DustDead_TuningTable.txt'
609 : #endif
610 :
611 : !=================================================================
612 : ! HCOX_DUST_DEAD_INIT begins here!
613 : !=================================================================
614 0 : LOC = 'HCOX_DUST_DEAD_INIT (HCOX_DUSTDEAD_MOD.F)'
615 :
616 : ! Extension Nr.
617 0 : ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
618 0 : IF ( ExtNr <= 0 ) RETURN
619 :
620 : ! Enter
621 0 : CALL HCO_ENTER ( HcoState%Config%Err, LOC, RC )
622 0 : IF ( RC /= HCO_SUCCESS ) THEN
623 0 : CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
624 0 : RETURN
625 : ENDIF
626 :
627 : ! Create AeroCom instance for this simulation
628 0 : Inst => NULL()
629 0 : CALL InstCreate ( ExtNr, ExtState%DustDead, Inst, RC )
630 0 : IF ( RC /= HCO_SUCCESS ) THEN
631 : CALL HCO_ERROR (
632 0 : & 'Cannot create DEAD instance', RC )
633 0 : RETURN
634 : ENDIF
635 :
636 : ! Check for dust alkalinity option
637 0 : Inst%ExtNrAlk = GetExtNr( HcoState%Config%ExtList, 'DustAlk')
638 :
639 : ! Get horizontal dimensions
640 0 : I = HcoState%NX
641 0 : J = HcoState%NY
642 :
643 : !-----------------------------------------------------------------
644 : ! Get species IDs
645 : !-----------------------------------------------------------------
646 :
647 : CALL HCO_GetExtHcoID( HcoState, ExtNr, Inst%HcoIDs,
648 0 : & SpcNames, nSpc, RC)
649 0 : IF ( RC /= HCO_SUCCESS ) THEN
650 0 : CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
651 0 : RETURN
652 : ENDIF
653 :
654 : ! Get the dust alkalinity species defined for DustAlk option
655 0 : IF ( Inst%ExtNrAlk > 0 ) THEN
656 : CALL HCO_GetExtHcoID( HcoState, Inst%ExtNrAlk,
657 : & Inst%HcoIDsAlk,
658 0 : & SpcNamesAlk, nSpcAlk, RC)
659 0 : IF ( RC /= HCO_SUCCESS ) THEN
660 0 : CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
661 0 : RETURN
662 : ENDIF
663 : ENDIF
664 :
665 : ! Sanity check
666 0 : IF ( nSpc /= NBINS ) THEN
667 0 : MSG = 'Dust DEAD model does not have four species!'
668 0 : CALL HCO_ERROR(MSG, RC )
669 0 : RETURN
670 : ENDIF
671 :
672 : ! Set scale factor: first try to read from configuration file. If
673 : ! not specified, call wrapper function which sets teh scale factor
674 : ! based upon compiler switches.
675 : CALL GetExtOpt( HcoState%Config, ExtNr,
676 : & 'Mass tuning factor',
677 0 : & OptValDp=TmpScal, Found=FOUND, RC=RC )
678 0 : IF ( RC /= HCO_SUCCESS ) THEN
679 0 : CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
680 0 : RETURN
681 : ENDIF
682 :
683 : ! Set parameter FLX_MSS_FDG_FCT to specified tuning factor as
684 : ! defined in configuration file
685 0 : IF ( FOUND ) THEN
686 0 : Inst%FLX_MSS_FDG_FCT = TmpScal
687 : ELSE
688 0 : Inst%FLX_MSS_FDG_FCT = -999.0e0
689 : ENDIF
690 :
691 : #if defined ( MODEL_GEOS )
692 : ! Determine mass flux tuning factor based on grid resolution
693 : IF ( Inst%FLX_MSS_FDG_FCT == -999.0e0 ) THEN
694 : CALL GetExtOpt( HcoState%Config, ExtNr,
695 : & 'Mass tuning table',
696 : & OptValChar=TuningTable, Found=FOUND, RC=RC )
697 : IF ( .NOT. FOUND ) TuningTable = TuningTable_Default
698 : CALL ReadTuningFactor(HcoState, TuningTable,
699 : & Inst%FLX_MSS_FDG_FCT, RC)
700 : IF ( RC /= HCO_SUCCESS ) THEN
701 : CALL HCO_ERROR( 'ERROR ReadTuningFactor', RC, THISLOC=LOC )
702 : RETURN
703 : ENDIF
704 : ENDIF
705 : #endif
706 :
707 : ! Error
708 0 : IF ( Inst%FLX_MSS_FDG_FCT == -999.0e0 ) THEN
709 : MSG = 'Mass flux tuning factor not defined. ' //
710 : & 'Please explicitly set it by modifying the line ' //
711 0 : & '` --> Mass tuning factor: XX.X` in HEMCO_Config.rc. '
712 : CALL HCO_ERROR(MSG,
713 0 : & RC, THISLOC='HCOX_DustDead_Init')
714 0 : RETURN
715 : ENDIF
716 :
717 : ! Verbose mode
718 0 : IF ( HcoState%amIRoot ) THEN
719 :
720 : ! Write the name of the extension regardless of the verbose setting
721 0 : msg = 'Using HEMCO extension: DustDead (dust mobilization)'
722 0 : IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
723 0 : CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
724 : ELSE
725 0 : CALL HCO_Msg( msg, verb=.TRUE. ) ! w/o separator
726 : ENDIF
727 :
728 : ! Write all other messages as debug printout only
729 0 : IF ( Inst%ExtNrAlk > 0 ) THEN
730 0 : MSG = 'Use dust alkalinity option'
731 0 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
732 : ENDIF
733 :
734 0 : MSG = 'Use the following species (Name: HcoID):'
735 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
736 0 : DO N = 1, nSpc
737 0 : WRITE(MSG,*) TRIM(SpcNames(N)), ':', Inst%HcoIDs(N)
738 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
739 : ENDDO
740 0 : IF ( Inst%ExtNrAlk > 0 ) THEN
741 0 : DO N = 1, nSpcAlk
742 0 : WRITE(MSG,*) TRIM(SpcNamesAlk(N)), ':', Inst%HcoIDsAlk(N)
743 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
744 : ENDDO
745 : ENDIF
746 :
747 0 : WRITE(MSG,*) 'Global mass flux tuning factor: ',
748 0 : & Inst%FLX_MSS_FDG_FCT
749 0 : CALL HCO_MSG(HcoState%Config%Err,MSG,SEP2='-')
750 :
751 : ENDIF
752 :
753 : !-----------------------------------------------------------------
754 : ! Init module arrays
755 : !-----------------------------------------------------------------
756 :
757 0 : ALLOCATE( Inst%ERD_FCT_GEO( HcoState%NX, HcoState%NY), STAT=AS )
758 0 : IF ( AS /= 0 ) THEN
759 0 : msg = 'Could not allocate Inst%ERD_FCT_GEO!'
760 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
761 0 : RETURN
762 : ENDIF
763 0 : Inst%ERD_FCT_GEO = 0.0_hp
764 :
765 0 : ALLOCATE( Inst%SRCE_FUNC( HcoState%NX, HcoState%NY), STAT=AS )
766 : IF ( AS /= 0 ) THEN
767 0 : msg = 'Could not allocate Inst%SRCE_FUNC!'
768 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
769 0 : RETURN
770 : ENDIF
771 0 : Inst%SRCE_FUNC = 0.0_hp
772 :
773 0 : ALLOCATE( Inst%LND_FRC_DRY( HcoState%NX, HcoState%NY), STAT=AS )
774 : IF ( AS /= 0 ) THEN
775 0 : msg = 'Could not allocate Inst%LND_FRC_DRY!'
776 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
777 0 : RETURN
778 : ENDIF
779 0 : Inst%LND_FRC_DRY = 0.0_hp
780 :
781 0 : ALLOCATE( Inst%MSS_FRC_CACO3( HcoState%NX, HcoState%NY), STAT=AS )
782 : IF ( AS /= 0 ) THEN
783 0 : msg = 'Could not allocate Inst%MSS_FRC_CACO3!'
784 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
785 0 : RETURN
786 : ENDIF
787 0 : Inst%MSS_FRC_CACO3 = 0.0_hp
788 :
789 0 : ALLOCATE( Inst%MSS_FRC_CLY( HcoState%NX, HcoState%NY), STAT=AS )
790 : IF ( AS /= 0 ) THEN
791 0 : msg = 'Could not allocate Inst%MSS_FRC_CLY!'
792 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
793 0 : RETURN
794 : ENDIF
795 0 : Inst%MSS_FRC_CLY = 0.0_hp
796 :
797 0 : ALLOCATE( Inst%MSS_FRC_SND( HcoState%NX, HcoState%NY), STAT=AS )
798 : IF ( AS /= 0 ) THEN
799 0 : msg = 'Could not allocate Inst%MSS_FRC_SND!'
800 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
801 0 : RETURN
802 : ENDIF
803 0 : Inst%MSS_FRC_SND = 0.0_hp
804 :
805 0 : ALLOCATE( Inst%SFC_TYP( HcoState%NX, HcoState%NY), STAT=AS )
806 : IF ( AS /= 0 ) THEN
807 0 : msg = 'Could not allocate Inst%SFC_TYP!'
808 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
809 0 : RETURN
810 : ENDIF
811 0 : Inst%SFC_TYP = 0.0_hp
812 :
813 0 : ALLOCATE( Inst%VAI_DST( HcoState%NX, HcoState%NY), STAT=AS )
814 : IF ( AS /= 0 ) THEN
815 0 : msg = 'Could not allocate Inst%VAI_DST!'
816 0 : CALL HCO_ERROR( msg, RC, thisLoc=loc )
817 0 : RETURN
818 : ENDIF
819 0 : Inst%VAI_DST = 0.0_hp
820 :
821 : ! ! Allocate arrays
822 : ! ALLOCATE( Inst%FLX_LW_DWN_SFC( I, J ), STAT=AS )
823 : ! IF ( AS /= 0 ) THEN
824 : ! CALL HCO_ERROR ( 'FLX_LW_DWN_SFC', RC )
825 : ! RETURN
826 : ! ENDIF
827 : ! Inst%FLX_LW_DWN_SFC = 0d0
828 :
829 : ! ALLOCATE( Inst%FLX_SW_ABS_SFC( I, J ), STAT=AS )
830 : ! IF ( AS /= 0 ) THEN
831 : ! CALL HCO_ERROR ( 'FLX_SW_ABS_SFC', RC )
832 : ! RETURN
833 : ! ENDIF
834 : ! Inst%FLX_SW_ABS_SFC = 0d0
835 :
836 : ! ALLOCATE( Inst%TPT_GND( I, J ), STAT=AS )
837 : ! IF ( AS /= 0 ) THEN
838 : ! CALL HCO_ERROR ( 'TPT_GND', RC )
839 : ! RETURN
840 : ! ENDIF
841 : ! Inst%TPT_GND = 0d0
842 :
843 : ! ALLOCATE( Inst%TPT_SOI( I, J ), STAT=AS )
844 : ! IF ( AS /= 0 ) THEN
845 : ! CALL HCO_ERROR ( 'TPT_SOI', RC )
846 : ! RETURN
847 : ! ENDIF
848 : ! Inst%TPT_SOI = 0d0
849 :
850 : ! ALLOCATE( Inst%VWC_SFC( I, J ), STAT=AS )
851 : ! IF ( AS /= 0 ) THEN
852 : ! CALL HCO_ERROR ( 'VWC_SFC', RC )
853 : ! RETURN
854 : ! ENDIF
855 : ! Inst%VWC_SFC = 0d0
856 :
857 : ! ALLOCATE( Inst%SRC_STR( I, J ), STAT=AS )
858 : ! IF ( AS /= 0 ) THEN
859 : ! CALL HCO_ERROR ( 'SRC_STR', RC )
860 : ! RETURN
861 : ! ENDIF
862 : ! Inst%SRC_STR = 0d0
863 :
864 0 : ALLOCATE( Inst%PLN_TYP( 0:28, 3 ), STAT=AS )
865 0 : IF ( AS /= 0 ) THEN
866 0 : CALL HCO_ERROR ( 'PLN_TYP', RC )
867 0 : RETURN
868 : ENDIF
869 0 : Inst%PLN_TYP = 0
870 :
871 0 : ALLOCATE( Inst%PLN_FRC( 0:28, 3 ), STAT=AS )
872 0 : IF ( AS /= 0 ) THEN
873 0 : CALL HCO_ERROR ( 'PLN_FRC', RC )
874 0 : RETURN
875 : ENDIF
876 0 : Inst%PLN_FRC = 0d0
877 :
878 0 : ALLOCATE( Inst%TAI( MVT, 12 ), STAT=AS )
879 0 : IF ( AS /= 0 ) THEN
880 0 : CALL HCO_ERROR ( 'TAI', RC )
881 0 : RETURN
882 : ENDIF
883 0 : Inst%TAI = 0d0
884 :
885 0 : ALLOCATE( Inst%DMT_VWR( NBINS ), STAT=AS )
886 0 : IF ( AS /= 0 ) THEN
887 0 : CALL HCO_ERROR ( 'DMT_VWR', RC )
888 0 : RETURN
889 : ENDIF
890 0 : Inst%DMT_VWR = 0d0
891 :
892 : ! ALLOCATE( Inst%DNS_AER( NBINS ), STAT=AS )
893 : ! IF ( AS /= 0 ) THEN
894 : ! CALL HCO_ERROR ( 'DNS_AER', RC )
895 : ! RETURN
896 : ! ENDIF
897 : ! Inst%DNS_AER = 0d0
898 :
899 0 : ALLOCATE( Inst%OVR_SRC_SNK_FRC( DST_SRC_NBR, NBINS ), STAT=AS )
900 0 : IF ( AS /= 0 ) THEN
901 0 : CALL HCO_ERROR ( 'OVR_SRC_SNK_FRC', RC )
902 0 : RETURN
903 : ENDIF
904 0 : Inst%OVR_SRC_SNK_FRC = 0d0
905 :
906 0 : ALLOCATE( Inst%OVR_SRC_SNK_MSS( DST_SRC_NBR, NBINS ), STAT=AS )
907 0 : IF ( AS /= 0 ) THEN
908 0 : CALL HCO_ERROR ( 'OVR_SRC_SNK_MSS', RC )
909 0 : RETURN
910 : ENDIF
911 0 : Inst%OVR_SRC_SNK_MSS = 0d0
912 :
913 : ! ALLOCATE( Inst%OROGRAPHY( I, J ), STAT=AS )
914 : ! IF ( AS /= 0 ) THEN
915 : ! CALL HCO_ERROR ( 'OROGRAPHY', RC )
916 : ! RETURN
917 : ! ENDIF
918 : ! Inst%OROGRAPHY = 0
919 :
920 : ! Bin size min diameter [m]
921 0 : ALLOCATE( Inst%DMT_MIN( NBINS ), STAT=AS )
922 0 : IF ( AS /= 0 ) THEN
923 0 : CALL HCO_ERROR ( 'DMT_MIN', RC )
924 0 : RETURN
925 : ENDIF
926 0 : Inst%DMT_MIN(1) = 0.2d-6
927 0 : Inst%DMT_MIN(2) = 2.0d-6
928 0 : Inst%DMT_MIN(3) = 3.6d-6
929 0 : Inst%DMT_MIN(4) = 6.0d-6
930 :
931 : ! Bin size max diameter [m]
932 0 : ALLOCATE( Inst%DMT_MAX( NBINS ), STAT=AS )
933 0 : IF ( AS /= 0 ) THEN
934 0 : CALL HCO_ERROR ( 'DMT_MAX', RC )
935 0 : RETURN
936 : ENDIF
937 0 : Inst%DMT_MAX(1) = 2.0d-6
938 0 : Inst%DMT_MAX(2) = 3.6d-6
939 0 : Inst%DMT_MAX(3) = 6.0d-6
940 0 : Inst%DMT_MAX(4) = 1.2d-5
941 :
942 : ! DMT_VMA_SRC: D'Almeida's (1987) "Background" modes
943 : ! as default [m] (Zender et al. p.5 Table 1)
944 : ! These modes also summarized in BSM96 p. 73 Table 2
945 : ! Mass median diameter BSM96 p. 73 Table 2
946 0 : ALLOCATE( Inst%DMT_VMA_SRC( DST_SRC_NBR ), STAT=AS )
947 0 : IF ( AS /= 0 ) THEN
948 0 : CALL HCO_ERROR ( 'DMT_VMA_SRC', RC )
949 0 : RETURN
950 : ENDIF
951 0 : Inst%DMT_VMA_SRC(1) = 0.832d-6
952 0 : Inst%DMT_VMA_SRC(2) = 4.82d-6
953 0 : Inst%DMT_VMA_SRC(3) = 19.38d-6
954 :
955 : ! GSD_ANL_SRC: Geometric standard deviation [fraction]
956 : ! BSM96 p. 73 Table 2
957 0 : ALLOCATE( Inst%GSD_ANL_SRC( DST_SRC_NBR ), STAT=AS )
958 0 : IF ( AS /= 0 ) THEN
959 0 : CALL HCO_ERROR ( 'GSD_ANL_SRC', RC )
960 0 : RETURN
961 : ENDIF
962 0 : Inst%GSD_ANL_SRC(1) = 2.10d0
963 0 : Inst%GSD_ANL_SRC(2) = 1.90d0
964 0 : Inst%GSD_ANL_SRC(3) = 1.60d0
965 :
966 : ! MSS_FRC_SRC: Mass fraction BSM96 p. 73 Table 2
967 0 : ALLOCATE( Inst%MSS_FRC_SRC( DST_SRC_NBR ), STAT=AS )
968 0 : IF ( AS /= 0 ) THEN
969 0 : CALL HCO_ERROR ( 'MSS_FRC_SRC', RC )
970 0 : RETURN
971 : ENDIF
972 0 : Inst%MSS_FRC_SRC(1) = 0.036d0
973 0 : Inst%MSS_FRC_SRC(2) = 0.957d0
974 0 : Inst%MSS_FRC_SRC(3) = 0.007d0
975 :
976 : !=================================================================
977 : ! Compute mass overlaps, Mij, between "source" PDFs
978 : ! and size bins (Zender et al., 2K3, Equ. 12, and Table 1)
979 : !=================================================================
980 : CALL OVR_SRC_SNK_FRC_GET( HcoState,
981 : & DST_SRC_NBR, Inst%DMT_VMA_SRC,
982 : & Inst%GSD_ANL_SRC, NBINS,
983 : & Inst%DMT_MIN, Inst%DMT_MAX,
984 0 : & Inst%OVR_SRC_SNK_FRC, RC )
985 0 : IF ( RC /= HCO_SUCCESS ) THEN
986 0 : CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
987 0 : RETURN
988 : ENDIF
989 :
990 : !=================================================================
991 : ! Compute OVR_SRC_SNK_MSS, the fraction of dust transported, given
992 : ! the mass overlap, OVR_SRC_SNK_FRC, and the mass fraction
993 : ! MSS_FRC_SRC. OVR_SRC_SNK_MSS is used in routine
994 : ! FLX_MSS_VRT_DST_PRT which partitions the total vertical
995 : ! dust flux into transport
996 : !==============================================================
997 : CALL DST_PSD_MSS( Inst%OVR_SRC_SNK_FRC, Inst%MSS_FRC_SRC,
998 0 : & Inst%OVR_SRC_SNK_MSS, NBINS, DST_SRC_NBR )
999 :
1000 : !=================================================================
1001 : ! Get plant type, cover, and Leaf area index from land sfc model
1002 : !=================================================================
1003 0 : CALL PLN_TYP_GET( Inst%PLN_TYP, Inst%PLN_FRC, Inst%TAI )
1004 :
1005 : ! Activate met fields used by this extension
1006 0 : ExtState%SPHU%DoUse = .TRUE.
1007 0 : ExtState%TK%DoUse = .TRUE.
1008 0 : ExtState%U10M%DoUse = .TRUE.
1009 0 : ExtState%V10M%DoUse = .TRUE.
1010 0 : ExtState%T2M%DoUse = .TRUE.
1011 0 : ExtState%GWETTOP%DoUse = .TRUE.
1012 0 : ExtState%SNOWHGT%DoUse = .TRUE.
1013 0 : ExtState%USTAR%DoUse = .TRUE.
1014 0 : ExtState%Z0%DoUse = .TRUE.
1015 0 : ExtState%FRLAND%DoUse = .TRUE.
1016 0 : ExtState%FRLANDIC%DoUse= .TRUE.
1017 0 : ExtState%FROCEAN%DoUse = .TRUE.
1018 0 : ExtState%FRSEAICE%DoUse= .TRUE.
1019 0 : ExtState%FRLAKE%DoUse = .TRUE.
1020 :
1021 : ! Leave w/ success
1022 0 : Inst => NULL()
1023 0 : IF ( ALLOCATED(SpcNames ) ) DEALLOCATE(SpcNames )
1024 0 : IF ( ALLOCATED(SpcNamesAlk) ) DEALLOCATE(SpcNamesAlk)
1025 0 : CALL HCO_LEAVE( HcoState%Config%Err, RC )
1026 :
1027 0 : END SUBROUTINE HCOX_DustDead_Init
1028 : !EOC
1029 : !------------------------------------------------------------------------------
1030 : ! Harmonized Emissions Component (HEMCO) !
1031 : !------------------------------------------------------------------------------
1032 : !BOP
1033 : !
1034 : ! !IROUTINE: HCOX_DustDead_Final
1035 : !
1036 : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Final finalizes the HEMCO
1037 : ! DUST\_DEAD extension.
1038 : !\\
1039 : !\\
1040 : ! !INTERFACE:
1041 : !
1042 0 : SUBROUTINE HCOX_DustDead_Final ( ExtState )
1043 : !
1044 : ! !INPUT PARAMETERS:
1045 : !
1046 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1047 : !
1048 : ! !REVISION HISTORY:
1049 : ! 25 Nov 2013 - C. Keller - Now a HEMCO extension
1050 : ! See https://github.com/geoschem/hemco for complete history
1051 : !EOP
1052 : !------------------------------------------------------------------------------
1053 : !BOC
1054 : !
1055 : ! !LOCAL VARIABLES:
1056 : !
1057 0 : CALL InstRemove ( ExtState%DustDead )
1058 :
1059 0 : END SUBROUTINE HCOX_DustDead_Final
1060 : !EOC
1061 : !------------------------------------------------------------------------------
1062 : ! Harmonized Emissions Component (HEMCO) !
1063 : !------------------------------------------------------------------------------
1064 : !
1065 : !******************************************************************************
1066 : ! ORIGINAL ROUTINES FOLLOW BELOW
1067 : !******************************************************************************
1068 :
1069 0 : SUBROUTINE DST_MBL( HcoState, ExtState, Inst,
1070 : & DOY, HGT_MDP, LAT_IDX,
1071 0 : & LAT_RDN, ORO, PRS_DLT,
1072 0 : & PRS_MDP, Q_H2O_VPR, DSRC,
1073 0 : & SNW_HGT_LQD, TM_ADJ, TPT_MDP,
1074 0 : & TPT_PTN_MDP, WND_MRD_MDP, WND_ZNL_MDP,
1075 : & NSTEP, RC )
1076 : !
1077 : !******************************************************************************
1078 : ! Subroutine DST_MBL is the driver for aerosol mobilization (DEAD model).
1079 : ! It is designed to require only single layer surface fields, allowing for
1080 : ! easier implementation. DST_MBL is called once per latitude. Modified
1081 : ! for GEOS-CHEM by Duncan Fairlie and Bob Yantosca.
1082 : ! (tdf, bmy, 1/25/07, 12/18/09)
1083 : !
1084 : ! Arguments as Input:
1085 : ! ============================================================================
1086 : ! (1 ) DOY (REAL*8 ) : Day of year [1.0..366.0) [unitless]
1087 : ! (2 ) HGT_MDP (REAL*8 ) : Midpoint height above surface [m ]
1088 : ! (3 ) LAT_IDX (INTEGER) : Model latitude index [unitless]
1089 : ! (4 ) LAT_RDN (REAL*8 ) : Model latitude [radians ]
1090 : ! (5 ) ORO (REAL*8 ) : Orography [fraction]
1091 : ! (6 ) PRS_DLT (REAL*8 ) : Pressure thickness of grid box [Pa ]
1092 : ! (7 ) PRS_MDP (REAL*8 ) : Pressure @ midpoint of grid box [Pa ]
1093 : ! (8 ) Q_H2O_VPR, (REAL*8 ) : Water vapor mixing ratio [kg/kg ]
1094 : ! (9 ) SNW_HGT_LQD (REAL*8 ) : Equivalent liquid water snow depth [m ]
1095 : ! (10) TM_ADJ, (REAL*8 ) : Adjustment timestep [s ]
1096 : ! (11) TPT_MDP, (REAL*8 ) : Temperature [K ]
1097 : ! (12) TPT_PTN_MDP (REAL*8 ) : Midlayer local potential temp. [K ]
1098 : ! (13) WND_MRD_MDP (REAL*8 ) : Meridional wind component (V-wind) [m/s ]
1099 : ! (14) WND_ZNL_MDP (REAL*8 ) : Zonal wind component (U-wind) [m/s ]
1100 : ! (15) FIRST, (LOGICAL) : Logical used ot open output dataset [unitless]
1101 : ! (16) NSTEP (INTEGER) : Iteration counter [unitless]
1102 : !
1103 : ! Arguments as Output:
1104 : ! ============================================================================
1105 : ! (10) DSRC ! O [kg kg-1] Dust mixing ratio increment
1106 : !
1107 : ! NOTES:
1108 : ! (1 ) Cleaned up and added comments. Also force double precision with
1109 : ! "D" exponents. (bmy, 3/30/04)
1110 : ! (2 ) Now get GOCART source function. (tdf, bmy, 1/25/07)
1111 : ! (3 ) Tune nested-domain emissions dust to the same as 2x2.5 simulation
1112 : ! Also tune GEOS-3 1x1 N. America nested-grid dust emissions to
1113 : ! the 4x5 totals from the GEOS-5 4x5 v8-01-01-Run0 benchmark.
1114 : ! (yxw, bmy, dan, 11/6/08)
1115 : ! (4 ) New scale parameter for 2x2.5 GEOS-5 (tdf, jaf, phs, 10/30/09)
1116 : ! (5 ) Defined FLX_MSS_FDG_FCT for GEOS_4 2x2.5, GEOS_5 2x2.5, NESTED_NA and
1117 : ! NESTED_EU. Redefined FLX_MSS_FDG_FCT for NESTED_CH, based upon above
1118 : ! changes. (amv, bmy, 12/18/09)
1119 : ! (6 ) For now treat MERRA like GEOS-5 (bmy, 8/13/10)
1120 : ! 29 Oct 2010 - T. D. Fairlie, R. Yantosca - Retune dust for MERRA 4x5
1121 : ! 08 Feb 2012 - R. Yantosca - For now, use same FLX_MSS_FDG_FCT for
1122 : ! GEOS-5.7.x as for MERRA
1123 : ! 01 Mar 2012 - R. Yantosca - Now use GET_AREA_M2(I,J,L) from grid_mod.F90
1124 : ! 09 Nov 2012 - M. Payer - Replaced all met field arrays with State_Met
1125 : ! derived type object
1126 : ! 5 Jun 2013 - K. Yu - Use 0.5 x 0.666 NA scale factor for the
1127 : ! 0.25 x 0.3125 NA nested simulation
1128 : !******************************************************************************
1129 : !
1130 : ! Arguments
1131 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1132 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1133 : TYPE(MyInst), POINTER :: Inst
1134 : INTEGER, INTENT(IN) :: LAT_IDX
1135 : REAL*8, INTENT(IN) :: DOY
1136 : REAL*8, INTENT(IN) :: HGT_MDP(HcoState%NX)
1137 : REAL*8, INTENT(IN) :: LAT_RDN
1138 : REAL*8, INTENT(IN) :: ORO(HcoState%NX)
1139 : REAL*8, INTENT(IN) :: PRS_DLT(HcoState%NX)
1140 : REAL*8, INTENT(IN) :: PRS_MDP(HcoState%NX)
1141 : REAL*8, INTENT(IN) :: Q_H2O_VPR(HcoState%NX)
1142 : REAL*8, INTENT(IN) :: SNW_HGT_LQD(HcoState%NX)
1143 : REAL*8, INTENT(IN) :: TM_ADJ
1144 : REAL*8, INTENT(IN) :: TPT_MDP(HcoState%NX)
1145 : REAL*8, INTENT(IN) :: TPT_PTN_MDP(HcoState%NX)
1146 : REAL*8, INTENT(IN) :: WND_MRD_MDP(HcoState%NX)
1147 : REAL*8, INTENT(IN) :: WND_ZNL_MDP(HcoState%NX)
1148 : INTEGER, INTENT(IN) :: NSTEP
1149 : REAL*8, INTENT(INOUT) :: DSRC(HcoState%NX, NBINS)
1150 : INTEGER, INTENT(INOUT) :: RC
1151 :
1152 : !--------------
1153 : ! Parameters
1154 : !--------------
1155 :
1156 : ! Reference height for mobilization processes [m]
1157 : REAL*8, PARAMETER :: HGT_RFR = 10.0d0
1158 :
1159 : ! Zero plane displacement for erodible surfaces [m]
1160 : REAL*8, PARAMETER :: HGT_ZPD_MBL = 0.0d0
1161 :
1162 : ! Set roughness length momentum for erodible surfaces, S&P, p. 858. [m]
1163 : REAL*8, PARAMETER :: RGH_MMN_MBL = 1.0d-3
1164 :
1165 : ! rgh_mmn_smt set to 33.3e-6 um, MaB95 p. 16426 recommend 10.0e-6
1166 : ! Smooth roughness length MaB95 p. 16426, MaB97 p. 4392, GMB98 p. 6207
1167 : ! [m] Z0,m,s
1168 : REAL*8, PARAMETER :: RGH_MMN_SMT = 33.3d-6
1169 :
1170 : ! Minimum windspeed used for mobilization [m/s]
1171 : REAL*8, PARAMETER :: WND_MIN_MBL = 1.0d0
1172 :
1173 : !--------------
1174 : ! Local Output
1175 : !--------------
1176 0 : REAL*8 DST_SLT_FLX_RAT_TTL(HcoState%NX) ! [m-1] Ratio of vertical dust flux to
1177 : ! streamwise mass flux
1178 0 : REAL*8 FLX_MSS_HRZ_SLT_TTL(HcoState%NX) ! [kg/m/s] Vertically integrated
1179 : ! streamwise mass flux
1180 0 : REAL*8 FLX_MSS_VRT_DST_TTL(HcoState%NX) ! [kg/m2/s] Total vertical mass
1181 : ! flux of dust
1182 0 : REAL*8 FRC_THR_NCR_DRG(HcoState%NX) ! [frc] Threshold friction velocity
1183 : ! increase from roughness
1184 0 : REAL*8 FRC_THR_NCR_WTR(HcoState%NX) ! [frc] Threshold friction velocity
1185 : ! increase from moisture
1186 0 : REAL*8 FLX_MSS_VRT_DST(HcoState%NX,NBINS) ! [kg/m2/s] Vertical mass flux
1187 : ! of dust
1188 0 : REAL*8 HGT_ZPD(HcoState%NX) ! [m] Zero plane displacement
1189 0 : REAL*8 LND_FRC_MBL_SLICE(HcoState%NX) ! [frc] Bare ground fraction
1190 0 : REAL*8 MNO_LNG(HcoState%NX) ! [m] Monin-Obukhov length
1191 0 : REAL*8 WND_FRC(HcoState%NX) ! [m/s] Friction velocity
1192 0 : REAL*8 WND_FRC_GEOS(HcoState%NX) ! [m/s] Friction velocity
1193 0 : REAL*8 Z0_GEOS(HcoState%NX) ! [m] roughness height
1194 0 : REAL*8 SNW_FRC(HcoState%NX) ! [frc] Fraction of surface covered
1195 : ! by snow
1196 : REAL*8 TRN_FSH_VPR_SOI_ATM(HcoState%NX) ! [frc] Transfer efficiency of vapor
1197 : ! from soil to atmosphere
1198 0 : REAL*8 wnd_frc_slt(HcoState%NX) ! [m/s] Saltating friction velocity
1199 0 : REAL*8 WND_FRC_THR_SLT(HcoState%NX) ! [m/s] Threshold friction velocity
1200 : ! for saltation
1201 0 : REAL*8 WND_MDP(HcoState%NX) ! [m/s] Surface layer mean wind speed
1202 0 : REAL*8 WND_RFR(HcoState%NX) ! [m/s] Wind speed at reference height
1203 0 : REAL*8 WND_RFR_THR_SLT(HcoState%NX) ! [m/s] Threshold 10 m wind speed for
1204 : ! saltation
1205 :
1206 : LOGICAL FLG_CACO3 ! [FLG] Activate CaCO3 tracer
1207 0 : LOGICAL FLG_MBL_SLICE(HcoState%NX) ! [flg] Mobilization candidates
1208 : CHARACTER(80) FL_OUT ! [sng] Name of netCDF output file
1209 : INTEGER I ! [idx] Counting index
1210 : INTEGER M ! [idx] Counting index
1211 : INTEGER MBL_NBR ! [nbr] Number of mobilization candidates
1212 0 : INTEGER SFC_TYP_SLICE(HcoState%NX) ! [idx] LSM surface type lat slice (0..28)
1213 0 : REAL*8 CND_TRM_SOI(HcoState%NX) ! [W/m/K] Soil thermal conductivity
1214 0 : REAL*8 DNS_MDP(HcoState%NX) ! [kg/m3] Midlayer density
1215 : REAL*8 FLX_LW_DWN_SFC_SLICE(HcoState%NX) ! [W/m2] Longwave downwelling flux
1216 : ! at surface
1217 : REAL*8 FLX_SW_ABS_SFC_SLICE(HcoState%NX) ! [W/m2] Solar flux absorbed by ground
1218 :
1219 0 : REAL*8 LND_FRC_DRY_SLICE(HcoState%NX) ! [frc] Dry land fraction
1220 0 : REAL*8 MBL_BSN_FCT_SLICE(HcoState%NX) ! [frc] Erodibility factor
1221 0 : REAL*8 MSS_FRC_CACO3_SLICE(HcoState%NX) ! [frc] Mass fraction of CaCO3
1222 0 : REAL*8 MSS_FRC_CLY_SLICE(HcoState%NX) ! [frc] Mass fraction of clay
1223 0 : REAL*8 MSS_FRC_SND_SLICE(HcoState%NX) ! [frc] Mass fraction of sand
1224 :
1225 : ! GOCART source function (tdf, bmy, 1/25/07)
1226 0 : REAL*8 SRCE_FUNC_SLICE(HcoState%NX) ! GOCART source function
1227 :
1228 0 : REAL*8 LVL_DLT(HcoState%NX) ! [m] Soil layer thickness
1229 0 : REAL*8 MPL_AIR(HcoState%NX) ! [kg/m2] Air mass path in layer
1230 :
1231 : REAL*8 TM_DLT ! [s] Mobilization timestep
1232 0 : REAL*8 TPT_GND_SLICE(HcoState%NX) ! [K] Ground temperature
1233 0 : REAL*8 TPT_SOI_SLICE(HcoState%NX) ! [K] Soil temperature
1234 : REAL*8 TPT_SOI_FRZ ! [K] Temperature of frozen soil
1235 : REAL*8 TPT_VRT_MDP ! [K] Midlayer virtual temperature
1236 0 : REAL*8 VAI_DST_SLICE(HcoState%NX) ! [m2/m2] Vegetation area index,
1237 : ! one-sided
1238 0 : REAL*8 VWC_DRY(HcoState%NX) ! [m3/s] Dry volumetric water content
1239 : ! (no E-T)
1240 0 : REAL*8 VWC_OPT(HcoState%NX) ! [m3/m3] E-T optimal volumetric water
1241 : ! content
1242 0 : REAL*8 VWC_SAT(HcoState%NX) ! [m3/m3] Saturated volumetric water
1243 : ! content (sand-dependent)
1244 0 : REAL*8 VWC_SFC_SLICE(HcoState%NX) ! [m3/m3] Volumetric water content
1245 0 : REAL*8 GWC_SFC(HcoState%NX) ! [kg/kg] Gravimetric water content
1246 0 : REAL*8 RGH_MMN(HcoState%NX) ! [m] Roughness length momentum
1247 : REAL*8 W10M
1248 :
1249 : ! GCM diagnostics
1250 : ! Dust tendency due to gravitational settling [kg/kg/s]
1251 0 : REAL*8 Q_DST_TND_MBL(HcoState%NX,NBINS)
1252 :
1253 : ! Total dust tendency due to gravitational settling [kg/kg/s]
1254 0 : REAL*8 Q_DST_TND_MBL_TTL(HcoState%NX)
1255 :
1256 : ! Temperature
1257 : REAL(dp) :: TMP
1258 :
1259 : ! For error handling
1260 : CHARACTER(LEN=255) :: MSG, LOC
1261 :
1262 : !=================================================================
1263 : ! DST_MBL begins here!
1264 : !=================================================================
1265 0 : LOC = 'DST_MBL (HCOX_DUSTDEAD_MOD.F)'
1266 :
1267 : ! Start
1268 0 : RC = HCO_SUCCESS
1269 :
1270 : ! Time step [s]
1271 0 : TM_DLT = TM_ADJ
1272 :
1273 : ! Freezing pt of soil [K] -- assume it's 0C
1274 0 : TPT_SOI_FRZ = TPT_FRZ_PNT
1275 :
1276 : ! Initialize output fluxes and tendencies
1277 0 : Q_DST_TND_MBL(:,:) = 0.0D0 ! [kg kg-1 s-1]
1278 0 : Q_DST_TND_MBL_TTL(:) = 0.0D0 ! [kg kg-1 s-1]
1279 0 : FLX_MSS_VRT_DST(:,:) = 0.0D0 ! [kg m-2 s-1]
1280 0 : FLX_MSS_VRT_DST_TTL(:) = 0.0D0 ! [kg m-2 s-1]
1281 0 : FRC_THR_NCR_WTR(:) = 0.0D0 ! [frc]
1282 0 : WND_RFR(:) = 0.0D0 ! [m s-1]
1283 0 : WND_FRC(:) = 0.0D0 ! [m s-1]
1284 0 : WND_FRC_SLT(:) = 0.0D0 ! [m s-1]
1285 0 : WND_FRC_THR_SLT(:) = 0.0D0 ! [m s-1]
1286 0 : WND_RFR_THR_SLT(:) = 0.0D0 ! [m s-1]
1287 0 : HGT_ZPD(:) = HGT_ZPD_MBL ! [m]
1288 :
1289 0 : DSRC(:,:) = 0.0D0
1290 :
1291 : !=================================================================
1292 : ! Compute necessary derived fields
1293 : !=================================================================
1294 0 : DO I = 1, HcoState%NX
1295 :
1296 : ! Stop occasional haywire model runs
1297 : ! IF ( TPT_MDP(I) > 350.0d0 ) THEN
1298 : ! MSG = 'TPT_MDP(i) > 350.0'
1299 : ! CALL HCO_ERROR(MSG, RC, THISLOC='DST_MBL' )
1300 : ! RETURN
1301 : ! ENDIF
1302 : ! Now simply restrict to 350K, rather than crashing
1303 0 : IF ( TPT_MDP(I) > 350.0d0 ) THEN
1304 : TMP = 350.0d0
1305 : ELSE
1306 0 : TMP = TPT_MDP(I)
1307 : ENDIF
1308 :
1309 : ! Midlayer virtual temperature [K]
1310 : TPT_VRT_MDP = TMP
1311 0 : & * (1.0d0 + EPS_H2O_RCP_M1 * Q_H2O_VPR(I))
1312 :
1313 : ! Density at center of gridbox [kg/m3]
1314 : DNS_MDP(I) = PRS_MDP(I)
1315 0 : & / (TPT_VRT_MDP * GAS_CST_DRY_AIR)
1316 :
1317 : ! Commented out
1318 : !cApproximate surface virtual temperature (uses midlayer moisture)
1319 : !c tpt_vrt_sfc=tpt_sfc(i)*(1.0+eps_H2O_rcp_m1*q_H2O_vpr(i)) ! [K]
1320 : !c
1321 : !c Surface density
1322 : !c dns_sfc(i)=prs_sfc(i)/(tpt_vrt_sfc*gas_cst_dry_air) ! [kg m-3]
1323 :
1324 : ! Mass of air currently in gridbox [kg/m2]
1325 0 : MPL_AIR(I) = PRS_DLT(I) * GRV_SFC_RCP
1326 :
1327 : ! Mean surface layer horizontal wind speed
1328 : WND_MDP(I) = SQRT( WND_ZNL_MDP(I)*WND_ZNL_MDP(I)
1329 0 : & + WND_MRD_MDP(I)*WND_MRD_MDP(I) )
1330 :
1331 : ENDDO
1332 :
1333 : !=================================================================
1334 : ! Gather input variables from GEOS-CHEM modules etc.
1335 : !=================================================================
1336 :
1337 : ! Get LSM Surface type (0..28)
1338 : CALL SFC_TYP_GET( HcoState, ExtState, Inst,
1339 0 : & LAT_IDX, SFC_TYP_SLICE, RC )
1340 0 : IF ( RC /= HCO_SUCCESS ) THEN
1341 0 : CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
1342 0 : RETURN
1343 : ENDIF
1344 :
1345 : ! Get erodability and mass fractions
1346 : CALL SOI_TXT_GET(
1347 : & HcoState, ! Hemco state object
1348 : & ExtState, Inst, ! Extension options
1349 : & LAT_IDX, ! I [idx] Latitude index
1350 : & LND_FRC_DRY_SLICE, ! O [frc] Dry land fraction
1351 : & MBL_BSN_FCT_SLICE, ! O [frc] Erodibility factor
1352 : & MSS_FRC_CACO3_SLICE, ! O [frc] Mass fraction of CaCO3
1353 : & MSS_FRC_CLY_SLICE, ! O [frc] Mass fraction of clay
1354 0 : & MSS_FRC_SND_SLICE ) ! O [frc] Mass fraction of sand
1355 :
1356 : ! Get GOCART source function (tdf, bmy, 1/25/07)
1357 : CALL SRCE_FUNC_GET( ! GOCART source function
1358 : & HcoState, Inst, ! Hemco state object
1359 : & LAT_IDX, ! I [idx] Latitude index
1360 0 : & SRCE_FUNC_SLICE ) ! O [frc] GOCART source function
1361 :
1362 : ! Get volumetric water content from GWET
1363 : CALL VWC_SFC_GET(
1364 : & HcoState, ! Hemco state object
1365 : & LAT_IDX, ! I [idx] Latitude index
1366 : & ExtState%GWETTOP%Arr%Val, ! I [unitless] Top soil moisture
1367 0 : & VWC_SFC_SLICE ) ! O [m3 m-3] Volumetric water content
1368 :
1369 : ! Get surface and soil temperature
1370 : CALL TPT_GND_SOI_GET(
1371 : & HcoState, ! Hemco state object
1372 : & LAT_IDX, ! I [idx] Latitude index!
1373 : & ExtState%T2M%Arr%Val, ! I [K] Sfc temperature at 2m
1374 : & TPT_GND_SLICE, ! O [K] Ground temperature
1375 0 : & TPT_SOI_SLICE ) ! O [K] Soil temperature
1376 :
1377 : ! Get time-varying vegetation area index
1378 : CALL DST_TVBDS_GET(
1379 : & Inst, ! # of lons
1380 : & HcoState%NX, ! # of lons
1381 : & LAT_IDX, ! I [idx] Latitude index
1382 0 : & VAI_DST_SLICE) ! O [m2 m-2] Vegetation area index, one-sided
1383 :
1384 : ! Get fraction of surface covered by snow
1385 : CALL SNW_FRC_GET(
1386 : & HcoState, ! Hemco state object
1387 : & SNW_HGT_LQD, ! I [m] Equivalent liquid water snow depth
1388 0 : & SNW_FRC ) ! O [frc] Fraction of surface covered by snow
1389 :
1390 : !=================================================================
1391 : ! Use the variables retrieved above to compute the fraction
1392 : ! of each gridcell suitable for dust mobilization
1393 : !=================================================================
1394 : CALL LND_FRC_MBL_GET(
1395 : % HcoState,
1396 : & DOY, ! I [day] Day of year [1.0..366.0)
1397 : & FLG_MBL_SLICE, ! O [flg] Mobilization candidate flag
1398 : & LAT_RDN, ! I [rdn] Latitude
1399 : & LND_FRC_DRY_SLICE, ! I [frc] Dry land fraction
1400 : & LND_FRC_MBL_SLICE, ! O [frc] Bare ground fraction
1401 : & MBL_NBR, ! O [flg] Number of mobilization candidates
1402 : & ORO, ! I [frc] Orography
1403 : & SFC_TYP_SLICE, ! I [idx] LSM surface type (0..28)
1404 : & SNW_FRC, ! I [frc] Fraction of surface covered by snow
1405 : & TPT_SOI_SLICE, ! I [K] Soil temperature
1406 : & TPT_SOI_FRZ, ! I [K] Temperature of frozen soil
1407 : & VAI_DST_SLICE, ! I [m2 m-2] Vegetation area index, one-sided
1408 0 : & RC )
1409 0 : IF ( RC /= HCO_SUCCESS ) THEN
1410 0 : CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
1411 0 : RETURN
1412 : ENDIF
1413 :
1414 : ! Much ado about nothing
1415 0 : if (mbl_nbr == 0) then
1416 : goto 737
1417 : endif
1418 :
1419 : !=================================================================
1420 : ! Compute time-invariant hydrologic properties
1421 : ! NB flg_mbl IS time-dependent, so keep this in time loop.
1422 : !=================================================================
1423 : CALL HYD_PRP_GET( ! NB: These properties are time-invariant
1424 : & HcoState,
1425 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1426 : & MSS_FRC_CLY_SLICE, ! I [frc] Mass fraction clay
1427 : & MSS_FRC_SND_SLICE, ! I [frc] Mass fraction sand
1428 : & VWC_DRY, ! O [m3/m3] Dry vol'mtric water content (no E-T)
1429 : & VWC_OPT, ! O [m3/m3] E-T optimal volumetric water content
1430 0 : & VWC_SAT) ! O [m3/m3] Saturated volumetric water content
1431 :
1432 0 : CND_TRM_SOI(:) = 0.0D0
1433 0 : LVL_DLT(:) = 0.0D0
1434 :
1435 : !=================================================================
1436 : ! Get reference wind at 10m
1437 : !=================================================================
1438 0 : DO I = 1, HcoState%NX
1439 0 : W10M = ExtState%U10M%Arr%Val(I,LAT_IDX)**2 +
1440 0 : & ExtState%V10M%Arr%Val(I,LAT_IDX)**2
1441 0 : W10M = SQRT(W10M)
1442 :
1443 : ! add mobilisation criterion flag
1444 0 : IF ( FLG_MBL_SLICE(I) ) THEN
1445 0 : WND_RFR(I) = W10M
1446 : ENDIF
1447 : ENDDO
1448 :
1449 : !=================================================================
1450 : ! Compute standard roughness length. This call is probably
1451 : ! unnecessary, because we are only concerned with mobilisation
1452 : ! candidates, for which roughness length is imposed in blm_mbl
1453 : !=================================================================
1454 : CALL RGH_MMN_GET( ! Set roughness length w/o zero plane displacement
1455 : & HcoState, Inst,
1456 : & ORO, ! I [frc] Orography
1457 : & RGH_MMN, ! O [m] Roughness length momentum
1458 : & SFC_TYP_SLICE, ! I [idx] LSM surface type (0..28)
1459 : & SNW_FRC, ! I [frc] Fraction of surface covered by snow
1460 : & WND_RFR,
1461 0 : & RC ) ! I [m s-1] 10 m wind speed
1462 0 : IF ( RC /= HCO_SUCCESS ) THEN
1463 0 : CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
1464 0 : RETURN
1465 : ENDIF
1466 :
1467 : !=================================================================
1468 : ! Introduce Ustar and Z0 from GEOS data
1469 : !=================================================================
1470 0 : DO I = 1, HcoState%NX
1471 :
1472 : ! Just assign for flag mobilisation candidates
1473 0 : IF ( FLG_MBL_SLICE(I) ) THEN
1474 0 : WND_FRC_GEOS(I) = ExtState%USTAR%Arr%Val(I,LAT_IDX)
1475 0 : Z0_GEOS(I) = ExtState%Z0%Arr%Val(I,LAT_IDX)
1476 : ELSE
1477 0 : WND_FRC_GEOS(I) = 0.0D0
1478 0 : Z0_GEOS(I) = 0.0D0
1479 : ENDIF
1480 : ENDDO
1481 :
1482 : !=================================================================
1483 : ! Surface exchange properties over erodible surfaces
1484 : ! DO NEED THIS: Compute Monin-Obukhov and Friction velocities
1485 : ! appropriate for dust producing regions.
1486 : !
1487 : ! Now calling Stripped down (adiabatic) version tdf 10/27/2K3
1488 : ! rgh_mmn_mbl parameter included directly in blm_mbl
1489 : !=================================================================
1490 : CALL BLM_MBL(
1491 : & HcoState,
1492 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1493 : & RGH_MMN, ! I [m] Roughness length momentum, Z0,m
1494 : & WND_RFR, ! I [m s-1] 10 m wind speed
1495 : & MNO_LNG, ! O [m] Monin-Obukhov length
1496 : & WND_FRC,
1497 0 : & RC ) ! O [m s-1] Surface friction velocity, U*
1498 0 : IF ( RC /= HCO_SUCCESS ) THEN
1499 0 : CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
1500 0 : RETURN
1501 : ENDIF
1502 :
1503 : !=================================================================
1504 : ! Factor by which surface roughness increases threshold friction
1505 : ! velocity. The sink of atrmospheric momentum into non-erodible
1506 : ! roughness elements Zender et al., expression (3)
1507 : !=================================================================
1508 : !-----------------------------------------------------------------------------
1509 : ! Prior to 1/25/07:
1510 : ! For now, instead of calling this routine to get FRC_THR_NCR_DRG, we will
1511 : ! just set it to 1 (tdf, bmy, 1/25/07)
1512 : !
1513 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
1514 : !
1515 : ! CALL FRC_THR_NCR_DRG_GET(
1516 : ! & HcoState,
1517 : ! & FRC_THR_NCR_DRG, ! O [frc] Factor increases thresh. fric. veloc.
1518 : ! & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1519 : ! & RGH_MMN_MBL, ! I [m] Rgh length momentum for erodible sfcs
1520 : ! & RGH_MMN_SMT, ! I [m] Smooth roughness length, Z0,m,s
1521 : ! & RC )
1522 : !-----------------------------------------------------------------------------
1523 :
1524 : ! Now set roughness factor to 1.0 (tdf, bmy, 1/25/07)
1525 0 : FRC_THR_NCR_DRG(:) = 1.0d0
1526 :
1527 : !=================================================================
1528 : ! Convert volumetric water content to gravimetric water content
1529 : ! NB: Owen effect included in wnd_frc_slt_get
1530 : !=================================================================
1531 : CALL VWC2GWC(
1532 : & HcoState,
1533 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1534 : & GWC_SFC, ! O [kg kg-1] Gravimetric water content
1535 : & VWC_SAT, ! I [m3 m-3] Saturated VWC (sand-dependent)
1536 0 : & VWC_SFC_SLICE ) ! I [m3 m-3] Volumetric water content
1537 :
1538 : !=================================================================
1539 : ! Factor by which soil moisture increases threshold friction
1540 : ! velocity -- i.e. the inhibition of saltation by soil mositure,
1541 : ! Zender et al., exp(5).
1542 : !=================================================================
1543 : CALL FRC_THR_NCR_WTR_GET(
1544 : & HcoState,
1545 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1546 : & FRC_THR_NCR_WTR, ! O [frc] Factor by which moisture increases
1547 : ! threshold friction velocity
1548 : & MSS_FRC_CLY_SLICE, ! I [frc] Mass fraction of clay
1549 0 : & GWC_SFC) ! I [kg kg-1] Gravimetric water content
1550 :
1551 : !=================================================================
1552 : ! Now, compute basic threshold friction velocity for saltation
1553 : ! over dry, bare, smooth ground. fxm: Use surface density not
1554 : ! midlayer density
1555 : !=================================================================
1556 : CALL WND_FRC_THR_SLT_GET(
1557 : & HcoState,
1558 : & FLG_MBL_SLICE, ! I mobilisation flag
1559 : & DNS_MDP, ! I [kg m-3] Midlayer density
1560 : & WND_FRC_THR_SLT, ! O [m s-1] Threshold friction velocity
1561 0 : & RC )
1562 0 : IF ( RC /= HCO_SUCCESS ) THEN
1563 0 : CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
1564 0 : RETURN
1565 : ENDIF
1566 :
1567 : ! Adjust threshold friction velocity to account
1568 : ! for moisture and roughness
1569 0 : DO I = 1, HcoState%NX
1570 0 : WND_FRC_THR_SLT(I) = ! [m s-1] Threshold friction velocity
1571 : ! for saltation
1572 : & WND_FRC_THR_SLT(i) ! [m s-1] Threshold for dry, flat ground
1573 : & * FRC_THR_NCR_WTR(i) ! [frc] Adjustment for moisture
1574 0 : & * FRC_THR_NCR_DRG(i) ! [frc] Adjustment for roughness
1575 : ENDDO
1576 :
1577 : ! Threshold saltation wind speed at reference height, 10m
1578 0 : DO I = 1, HcoState%NX
1579 0 : IF ( FLG_MBL_SLICE(I) ) THEN
1580 : WND_RFR_THR_SLT(I) = ! [m s-1] Threshold 10 m wind speed
1581 : ! for saltation
1582 0 : & WND_RFR(I) * WND_FRC_THR_SLT(I) / WND_FRC(i)
1583 : ENDIF
1584 : ENDDO
1585 :
1586 : !=================================================================
1587 : ! Saltation increases friction speed by roughening surface
1588 : ! i.e. Owen effect, Zender et al., expression (4)
1589 : !
1590 : ! Compute the wind friction velocity due to saltation, U*,s
1591 : ! accounting for the Owen effect.
1592 : !=================================================================
1593 : CALL WND_FRC_SLT_GET(
1594 : & HcoState,
1595 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1596 : & WND_FRC, ! I [m s-1] Surface friction velocity
1597 : & WND_FRC_SLT, ! O [m s-1] Saltating friction velocity
1598 : & WND_RFR, ! I [m s-1] Wind speed at reference height
1599 0 : & WND_RFR_THR_SLT ) ! I [m s-1] Thresh. 10 m wind speed for saltation
1600 :
1601 : !=================================================================
1602 : ! Compute horizontal streamwise mass flux, Zender et al., expr. (10)
1603 : !=================================================================
1604 : CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(
1605 : & HcoState,
1606 : & DNS_MDP, ! I [kg m-3] Midlayer density
1607 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1608 : & FLX_MSS_HRZ_SLT_TTL, ! O [kg m-1 s-1] Vertically integrated
1609 : ! streamwise mass flux
1610 : & WND_FRC_SLT, ! I [m s-1] Saltating friction velocity
1611 0 : & WND_FRC_THR_SLT ) ! I [m s-1] Threshold friction vel for saltation
1612 :
1613 : !-----------------------------------------------------------------------------
1614 : ! Prior to 1/25/07:
1615 : ! We now multiply by the GOCART source function, and we will ignore
1616 : ! the MBL_BSN_FCT_SLICE. (tdf, bmy, 1/25/07)
1617 : !
1618 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
1619 : !
1620 : !ctdf...prior to Apr/05/06
1621 : ! ! Apply land surface and vegetation limitations
1622 : ! ! and global tuning factor
1623 : ! DO I = 1, HcoState%NX
1624 : ! FLX_MSS_HRZ_SLT_TTL(I) = FLX_MSS_HRZ_SLT_TTL(I) ! [kg m-2 s-1]
1625 : ! & * LND_FRC_MBL_SLICE(i) ! [frc] Bare ground fraction
1626 : ! & * MBL_BSN_FCT_SLICE(i) ! [frc] Erodibility factor
1627 : ! & * FLX_MSS_FDG_FCT ! [frc] Global mass flux tuning
1628 : ! ! factor (empirical)
1629 : ! ENDDO
1630 : !-----------------------------------------------------------------------------
1631 :
1632 : ! Now simply multiply by the GOCART source function.
1633 : ! The vegetation effect has been eliminated in LND_FRC_MBL_GET
1634 : ! and we also ignore MBL_BSN_FCT. (tdf, bmy, 1/25/07)
1635 0 : DO I = 1, HcoState%NX
1636 0 : FLX_MSS_HRZ_SLT_TTL(I) = FLX_MSS_HRZ_SLT_TTL(I) ! [kg m-2 s-1]
1637 : & * LND_FRC_MBL_SLICE(i) ! [frc] Bare ground fraction
1638 : & * Inst%FLX_MSS_FDG_FCT ! [frc] Global mass flux tuning
1639 0 : & * SRCE_FUNC_SLICE(I) ! GOCART source function
1640 : ENDDO
1641 :
1642 : !=================================================================
1643 : ! Compute vertical dust mass flux, see Zender et al., expr. (11).
1644 : !=================================================================
1645 : CALL FLX_MSS_VRT_DST_TTL_MAB95_GET(
1646 : & HcoState,
1647 : & DST_SLT_FLX_RAT_TTL, ! O [m-1] Ratio of vertical dust flux to
1648 : ! streamwise mass flux
1649 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1650 : & FLX_MSS_HRZ_SLT_TTL, ! I [kg/m/s] Vertically integrated
1651 : ! streamwise mass flux
1652 : & FLX_MSS_VRT_DST_TTL, ! O [kg/m2/s] Total vertical mass flux of dust
1653 0 : & MSS_FRC_CLY_SLICE ) ! I [frc] Mass fraction clay
1654 :
1655 : !=================================================================
1656 : ! Now, partition vertical dust mass flux into transport bins
1657 : !
1658 : ! OVR_SRC_SNK_MSS needed in FLX_MSS_VRT_DST_PRT
1659 : ! computed in DST_PSD_MSS, called from "dust_mod.f" (tdf, 3/30/04)
1660 : !=================================================================
1661 : CALL FLX_MSS_VRT_DST_PRT( Inst,
1662 : & HcoState%NX,
1663 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1664 : & FLX_MSS_VRT_DST, ! O [kg m-2 s-1] Vertical mass flux of dust
1665 0 : & FLX_MSS_VRT_DST_TTL) ! I [kg m-2 s-1] Total vertical mass flux of dus
1666 :
1667 : !=================================================================
1668 : ! Mask dust mass flux by tracer mass fraction at source
1669 : !=================================================================
1670 0 : FLG_CACO3 = .FALSE. ! [flg] Activate CaCO3 tracer
1671 : IF ( FLG_CACO3 ) THEN
1672 : CALL FLX_MSS_CACO3_MSK(
1673 : & HcoState,
1674 : & ExtState,
1675 : & Inst%DMT_VWR, ! I [m] Mass weighted diameter resolved
1676 : & FLG_MBL_SLICE, ! I [flg] Mobilization candidate flag
1677 : & FLX_MSS_VRT_DST, ! I/O [kg m-2 s-1] Vert. mass flux of dust
1678 : & MSS_FRC_CACO3_SLICE, ! I [frc] Mass fraction of CaCO3
1679 : & MSS_FRC_CLY_SLICE, ! I [frc] Mass fraction of clay
1680 : & MSS_FRC_SND_SLICE, ! I [frc] Mass fraction of sand
1681 : & RC )
1682 : IF ( RC /= HCO_SUCCESS ) THEN
1683 : CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
1684 : RETURN
1685 : ENDIF
1686 : endif
1687 :
1688 : ! Now, flx_mss_vrt_dst has units of kg/m2/sec
1689 :
1690 : ! Fluxes are known, so adjust mixing ratios
1691 0 : DO I=1, HcoState%NX ! NB: Inefficient loop order
1692 0 : IF (FLG_MBL_SLICE(I)) THEN
1693 :
1694 : ! Loop over dust bins
1695 0 : DO M = 1, NBINS
1696 :
1697 : !========================================================
1698 : ! Compute dust mobilisation tendency. Recognise that
1699 : ! what GEOS-CHEM wants is an increment in kg...So,
1700 : ! multiply by DXYP [m2] and tm_adj [sec]
1701 : !========================================================
1702 :
1703 : ! [kg/sec]
1704 0 : Q_DST_TND_MBL(I,M) = FLX_MSS_VRT_DST(I,M)
1705 0 : & *HcoState%Grid%AREA_M2%Val(I,LAT_IDX)
1706 :
1707 : ! Introduce DSRC: dust mixing ratio increment 12/9/2K3
1708 : ! [kg]
1709 0 : DSRC(I,M) = TM_ADJ * Q_DST_TND_MBL(I,M)
1710 :
1711 : ENDDO
1712 : ENDIF
1713 : ENDDO
1714 :
1715 : ! Jump to here when no points are mobilization candidates
1716 : 737 CONTINUE
1717 :
1718 0 : RC = HCO_SUCCESS
1719 :
1720 : ! Return to calling program
1721 : END SUBROUTINE DST_MBL
1722 :
1723 : !------------------------------------------------------------------------------
1724 :
1725 0 : SUBROUTINE SRCE_FUNC_GET( HcoState, Inst, LAT_IDX, SRCE_FUNC_OUT )
1726 : !
1727 : !******************************************************************************
1728 : ! Subroutine SRCE_FUNC_GET returns a latitude slice of the GOCART source
1729 : ! function. This routine is called by DST_MBL. (tdf, bmy, 1/25/07)
1730 : !
1731 : ! Arguments as Input:
1732 : ! ============================================================================
1733 : ! (1 ) LAT_IDX (INTEGER) : GEOS-Chem latitude index
1734 : !
1735 : ! Arguments as Output:
1736 : ! ============================================================================
1737 : ! (1 ) SRCE_FUNC_OUT (REAL*8 ) : GOCART source function [fraction]
1738 : !
1739 : ! NOTES:
1740 : !******************************************************************************
1741 : !
1742 : ! Arguments
1743 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1744 : TYPE(MyInst), POINTER :: Inst
1745 : INTEGER, INTENT(IN) :: LAT_IDX
1746 : REAL*8, INTENT(OUT) :: SRCE_FUNC_OUT(HcoState%NX)
1747 :
1748 : ! Local variables
1749 : INTEGER :: LON_IDX
1750 :
1751 : !=================================================================
1752 : ! SRCE_FUNC_GET begins here!
1753 : !=================================================================
1754 :
1755 : ! Loop over longitudes
1756 0 : DO LON_IDX = 1, HcoState%NX
1757 :
1758 : ! Save latitude slice in SRCE_FUNC_OUT
1759 0 : SRCE_FUNC_OUT(LON_IDX) = Inst%SRCE_FUNC(LON_IDX,LAT_IDX)
1760 :
1761 : ENDDO
1762 :
1763 : ! Return to calling program
1764 0 : END SUBROUTINE SRCE_FUNC_GET
1765 :
1766 : !------------------------------------------------------------------------------
1767 :
1768 0 : SUBROUTINE SOI_TXT_GET( HcoState, ExtState, Inst, J,
1769 0 : & LND_FRC_DRY_OUT,
1770 0 : & MBL_BSN_FCT_OUT, MSS_FRC_CACO3_OUT,
1771 0 : & MSS_FRC_CLY_OUT, MSS_FRC_SND_OUT )
1772 : !
1773 : !******************************************************************************
1774 : ! Subroutine SOI_GET_TXT returns a latitude slice of soil texture to the
1775 : ! calling program DST_MBL. (tdf, bmy, 3/30/04)
1776 : !
1777 : ! Arguments as Input:
1778 : ! ============================================================================
1779 : ! (1 ) J (INTEGER) : Grid box latitude index
1780 : !
1781 : ! Arguments as Output:
1782 : ! ============================================================================
1783 : ! (2 ) lnd_frc_dry_out (REAL*8 ) : Dry land fraction [fraction]
1784 : ! (3 ) mbl_bsn_fct_out (REAL*8 ) : Erodibility factor [fraction]
1785 : ! (4 ) mss_frc_CaCO3_out (REAL*8 ) : Mass fraction of CaCO3 [fraction]
1786 : ! (5 ) mss_frc_cly_out (REAL*8 ) : Mass fraction of clay [fraction]
1787 : ! (6 ) mss_frc_snd_out (REAL*8 ) : Mass fraction of sand [fraction]
1788 : !
1789 : ! NOTES:
1790 : ! (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
1791 : !******************************************************************************
1792 : !
1793 :
1794 : ! Arguments
1795 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1796 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1797 : TYPE(MyInst), POINTER :: Inst
1798 : INTEGER, INTENT(IN) :: J
1799 : REAL*8, INTENT(OUT) :: LND_FRC_DRY_OUT(HcoState%NX)
1800 : REAL*8, INTENT(OUT) :: MBL_BSN_FCT_OUT(HcoState%NX)
1801 : REAL*8, INTENT(OUT) :: MSS_FRC_CACO3_OUT(HcoState%NX)
1802 : REAL*8, INTENT(OUT) :: MSS_FRC_CLY_OUT(HcoState%NX)
1803 : REAL*8, INTENT(OUT) :: MSS_FRC_SND_OUT(HcoState%NX)
1804 :
1805 : ! Local variables
1806 : INTEGER :: I
1807 :
1808 : ! Ad hoc globally uniform clay mass fraction [kg/kg]
1809 : REAL*8, PARAMETER :: MSS_FRC_CLY_GLB = 0.20d0
1810 :
1811 : !=================================================================
1812 : ! SOI_GET_TXT begins here!
1813 : !=================================================================
1814 0 : DO I = 1, HcoState%NX
1815 :
1816 : ! Save dry land fraction slice
1817 0 : LND_FRC_DRY_OUT(I) = Inst%LND_FRC_DRY(I,J)
1818 :
1819 : ! Change surface source distribution to "geomorphic" tdf 12/12/2K3
1820 0 : MBL_BSN_FCT_OUT(I) = Inst%ERD_FCT_GEO(I,J)
1821 :
1822 : !fxm: CaCO3 currently has missing value of
1823 : ! 1.0e36 which causes problems
1824 0 : IF ( Inst%MSS_FRC_CACO3(I,J) <= 1.0D0 ) THEN
1825 0 : MSS_FRC_CACO3_OUT(I) = Inst%MSS_FRC_CACO3(I,J)
1826 : ELSE
1827 0 : MSS_FRC_CACO3_OUT(I) = 0.0D0
1828 : ENDIF
1829 :
1830 : ! fxm Temporarily set mss_frc_cly used in mobilization to globally
1831 : ! uniform SGS value of 0.20, and put excess mass fraction
1832 : ! into sand
1833 0 : MSS_FRC_CLY_OUT(I) = MSS_FRC_CLY_GLB
1834 0 : MSS_FRC_SND_OUT(I) = Inst%MSS_FRC_SND(I,J) +
1835 0 : & Inst%MSS_FRC_CLY(I,J) -
1836 0 : & MSS_FRC_CLY_GLB
1837 :
1838 : ENDDO
1839 :
1840 : ! Return to calling program
1841 0 : END SUBROUTINE SOI_TXT_GET
1842 :
1843 : !------------------------------------------------------------------------------
1844 :
1845 0 : SUBROUTINE SFC_TYP_GET( HcoState, ExtState,
1846 0 : & Inst, J, SFC_TYP_OUT, RC )
1847 : !
1848 : !******************************************************************************
1849 : ! Subroutine SFC_TYP_GET returns a latitude slice of LSM surface type
1850 : ! to the calling programs DST_MBL & DST_DPS_DRY. (tdf, bmy, 3/30/04)
1851 : !
1852 : ! Arguments as Input:
1853 : ! ============================================================================
1854 : ! (1 ) J (INTEGER) : Grid box latitude index
1855 : !
1856 : ! Arguments as Output:
1857 : ! ============================================================================
1858 : ! (1 ) sfc_typ_out (REAL*8 ) : LSM surface type (0..28) [unitless]
1859 : !
1860 : ! NOTES
1861 : ! (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
1862 : ! (2 ) Added error trap (ckeller, 7/24/2014)
1863 : !******************************************************************************
1864 : !
1865 :
1866 : ! Arguments
1867 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1868 : TYPE(Ext_State), POINTER :: ExtState
1869 : TYPE(MyInst), POINTER :: Inst
1870 : INTEGER, INTENT(IN) :: J
1871 : INTEGER, INTENT(OUT) :: SFC_TYP_OUT(HcoState%NX)
1872 : INTEGER, INTENT(INOUT) :: RC
1873 :
1874 : ! Local variables
1875 : INTEGER :: I, TMP
1876 : CHARACTER(LEN=255) :: MSG
1877 :
1878 : !=================================================================
1879 : ! SFC_TYP_GET begins here!
1880 : !=================================================================
1881 0 : DO I = 1, HcoState%NX
1882 0 : TMP = INT(Inst%SFC_TYP(I,J))
1883 :
1884 : ! Make sure value is within valid range (1 - NN_SFCTYP).
1885 0 : SFC_TYP_OUT(I) = MAX( MIN(TMP,NN_SFCTYP), 0 )
1886 : ENDDO
1887 :
1888 : ! Return with success
1889 0 : RC = HCO_SUCCESS
1890 :
1891 : ! Return to calling program
1892 0 : END SUBROUTINE SFC_TYP_GET ! end sfc_typ_get()
1893 :
1894 : !------------------------------------------------------------------------------
1895 :
1896 0 : SUBROUTINE TPT_GND_SOI_GET( HcoState, J, TS,
1897 0 : & TPT_GND_OUT, TPT_SOI_OUT )
1898 : !
1899 : !******************************************************************************
1900 : ! Subroutine TPT_GND_SOI_GET returns a latitude slice of soil temperature and
1901 : ! ground temperature to the calling program DST_MBL. (tdf, bmy, 3/30/04)
1902 : !
1903 : ! Arguments as Input:
1904 : ! ============================================================================
1905 : ! (1 ) J (INTEGER) : Grid box latitude index
1906 : ! (2 ) TS (REAL*8) : Surface temperature at 2m [K]
1907 : !
1908 : ! Arguments as Output:
1909 : ! ============================================================================
1910 : ! (2 ) TPT_GND_OUT (REAL*8 ) : Ground temperature array slice [K]
1911 : ! (3 ) tpt_soi_out (REAL*8 ) : Soil temperature array slice [K]
1912 : !
1913 : ! NOTES
1914 : ! (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
1915 : !******************************************************************************
1916 : !
1917 :
1918 : ! Arguments
1919 : INTEGER, INTENT(IN) :: J
1920 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1921 : REAL(hp),INTENT(IN) :: TS(HcoState%NX,HcoState%NY)
1922 : REAL*8, INTENT(OUT) :: TPT_GND_OUT(HcoState%NX)
1923 : REAL*8, INTENT(OUT) :: TPT_SOI_OUT(HcoState%NX)
1924 :
1925 : ! Local variables
1926 : INTEGER :: I
1927 :
1928 : !=================================================================
1929 : ! TPT_GND_SOI_GET begins here!
1930 : !=================================================================
1931 :
1932 : ! Use TS from GEOS-CHEM (tdf, 3/30/04)
1933 0 : DO I = 1, HcoState%NX
1934 0 : TPT_GND_OUT(I) = TS(I,J)
1935 0 : TPT_SOI_OUT(I) = TS(I,J)
1936 : ENDDO
1937 :
1938 : ! Return to calling program
1939 0 : END SUBROUTINE TPT_GND_SOI_GET
1940 :
1941 : !------------------------------------------------------------------------------
1942 :
1943 0 : SUBROUTINE VWC_SFC_GET( HcoState, J, GWETTOP, VWC_SFC_OUT )
1944 : !
1945 : !******************************************************************************
1946 : ! Subroutine TPT_GND_SOI_GET returns a latitude slice of volumetric water
1947 : ! content to the calling program DST_MBL. (tdf, bmy, 3/30/04)
1948 : !
1949 : ! Arguments as Input:
1950 : ! ============================================================================
1951 : ! (1 ) J (INTEGER) : Grid box latitude index
1952 : ! (2 ) GWETTOP (REAL*8) : Top soil moisture [unitless]
1953 : !
1954 : ! Arguments as Output:
1955 : ! ============================================================================
1956 : ! VWC_SFC_OUT (REAL*8 ) : Volumetric water content [m3/m3]
1957 : !
1958 : ! NOTES
1959 : ! (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
1960 : !******************************************************************************
1961 : !
1962 :
1963 : ! Arguments
1964 : INTEGER, INTENT(IN) :: J
1965 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
1966 : REAL(hp), INTENT(IN) :: GWETTOP(HcoState%NX,HcoState%NY)
1967 : REAL*8, INTENT(OUT) :: VWC_SFC_OUT(HcoState%NX)
1968 :
1969 : ! Local variables
1970 : INTEGER :: I
1971 :
1972 : !=================================================================
1973 : ! VWC_SFC_GET begins here!
1974 : !=================================================================
1975 0 : DO I = 1, HcoState%NX
1976 0 : VWC_SFC_OUT(I) = GWETTOP(I,J)
1977 : ENDDO
1978 :
1979 : ! Return to calling program
1980 0 : END SUBROUTINE VWC_SFC_GET
1981 :
1982 : !------------------------------------------------------------------------------
1983 :
1984 : REAL*8 FUNCTION DSVPDT_H2O_LQD_PRK78_FST_SCL( TPT_CLS )
1985 : !
1986 : !******************************************************************************
1987 : ! Function DSVPDT_H2O_LQD_PRK78_FST_SCL returns the derivative of saturation
1988 : ! vapor pressure [Pa] over planar liquid water (tdf, bmy, 3/30/04)
1989 : !
1990 : ! Arguments as Input:
1991 : ! ============================================================================
1992 : ! (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
1993 : !
1994 : ! NOTES:
1995 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
1996 : ! with "D" exponents. (bmy, 3/30/04)
1997 : !******************************************************************************
1998 : !
1999 : ! Arguments
2000 : REAL*8, INTENT(IN) :: TPT_CLS
2001 :
2002 : ! Local variables
2003 : REAL*8, PARAMETER :: C0 = 4.438099984d-01
2004 : REAL*8, PARAMETER :: C1 = 2.857002636d-02
2005 : REAL*8, PARAMETER :: C2 = 7.938054040d-04
2006 : REAL*8, PARAMETER :: C3 = 1.215215065d-05
2007 : REAL*8, PARAMETER :: C4 = 1.036561403d-07
2008 : REAL*8, PARAMETER :: C5 = 3.532421810d-10
2009 : REAL*8, PARAMETER :: C6 =-7.090244804d-13
2010 :
2011 : !=================================================================
2012 : ! DSVPDT_H2O_LQD_PRK78_FST_SCL begins here!
2013 : !=================================================================
2014 :
2015 : ! Return deriv. of saturation vapor pressure [Pa]
2016 : DSVPDT_H2O_LQD_PRK78_FST_SCL = 100.0d0 * ( C0+TPT_CLS *
2017 : & ( C1+TPT_CLS *
2018 : & ( C2+TPT_CLS *
2019 : & ( C3+TPT_CLS *
2020 : & ( C4+TPT_CLS *
2021 : & ( C5+TPT_CLS * C6 ))))))
2022 :
2023 : ! Return to calling program
2024 : END FUNCTION DSVPDT_H2O_LQD_PRK78_FST_SCL
2025 :
2026 : !------------------------------------------------------------------------------
2027 :
2028 : REAL*8 FUNCTION DSVPDT_H2O_ICE_PRK78_FST_SCL( TPT_CLS )
2029 : !
2030 : !******************************************************************************
2031 : ! Function DSVPDT_H2O_ICE_PRK78_FST_SCL returns the derivative of saturation
2032 : ! vapor pressure [Pa] over planar ice water (tdf, bmy, 3/30/04)
2033 : !
2034 : ! Arguments as Input:
2035 : ! ============================================================================
2036 : ! (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
2037 : !
2038 : ! NOTES:
2039 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
2040 : ! with "D" exponents. (bmy, 3/30/04)
2041 : !******************************************************************************
2042 : !
2043 : ! Arguments
2044 : REAL*8, INTENT(IN) :: TPT_CLS
2045 :
2046 : ! Local variables
2047 : REAL*8, PARAMETER :: D0 = 5.030305237d-01
2048 : REAL*8, PARAMETER :: D1 = 3.773255020d-02
2049 : REAL*8, PARAMETER :: D2 = 1.267995369d-03
2050 : REAL*8, PARAMETER :: D3 = 2.477563108d-05
2051 : REAL*8, PARAMETER :: D4 = 3.005693132d-07
2052 : REAL*8, PARAMETER :: D5 = 2.158542548d-09
2053 : REAL*8, PARAMETER :: D6 = 7.131097725d-12
2054 :
2055 : !=================================================================
2056 : ! DSVPDT_H2O_ICE_PRK78_FST_SCL begins here!
2057 : !=================================================================
2058 :
2059 : ! Return deriv. of sat vapor pressure [Pa]
2060 : DSVPDT_H2O_ICE_PRK78_FST_SCL = 100.0D0 * ( D0+TPT_CLS *
2061 : & ( D1+TPT_CLS *
2062 : & ( D2+TPT_CLS *
2063 : & ( D3+TPT_CLS *
2064 : & ( D4+TPT_CLS *
2065 : & ( D5+TPT_CLS * D6 ))))))
2066 :
2067 : ! Return to calling program
2068 : END FUNCTION DSVPDT_H2O_ICE_PRK78_FST_SCL
2069 :
2070 : !------------------------------------------------------------------------------
2071 :
2072 : REAL*8 FUNCTION SVP_H2O_LQD_PRK78_FST_SCL( TPT_CLS )
2073 : !
2074 : !******************************************************************************
2075 : ! Function SVP_H2O_LQD_PRK78_FST_SCL returns the saturation vapor pressure
2076 : ! over planer liquid water [Pa] See Lowe and Ficke (1974) as reported in
2077 : ! PrK78 p. 625. Range of validity is -50 C < T < 50 C. (tdf, bmy, 3/30/04)
2078 : !
2079 : ! Arguments as Input:
2080 : ! ============================================================================
2081 : ! (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
2082 : !
2083 : ! NOTES:
2084 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
2085 : ! with "D" exponents. (bmy, 3/30/04)
2086 : !******************************************************************************
2087 : !
2088 : ! Arguments
2089 : REAL*8, INTENT(IN) :: TPT_CLS
2090 :
2091 : ! Local variables
2092 : REAL*8, PARAMETER :: A0 = 6.107799961d0
2093 : REAL*8, PARAMETER :: A1 = 4.436518521d-01
2094 : REAL*8, PARAMETER :: A2 = 1.428945805d-02
2095 : REAL*8, PARAMETER :: A3 = 2.650648471d-04
2096 : REAL*8, PARAMETER :: A4 = 3.031240396d-06
2097 : REAL*8, PARAMETER :: A5 = 2.034080948d-08
2098 : REAL*8, PARAMETER :: A6 = 6.136820929d-11
2099 :
2100 : !=================================================================
2101 : ! SVP_H2O_LQD_PRK78_FST_SCL begins here!
2102 : !=================================================================
2103 :
2104 : ! Return saturation vapor pressure over liquid water [Pa]
2105 : SVP_H2O_LQD_PRK78_FST_SCL = 100.0D0 * ( A0+TPT_CLS *
2106 : & ( A1+TPT_CLS *
2107 : & ( A2+TPT_CLS *
2108 : & ( A3+TPT_CLS *
2109 : & ( A4+TPT_CLS *
2110 : & ( A5+TPT_CLS * A6 ))))))
2111 :
2112 : ! Return to calling program
2113 : END FUNCTION SVP_H2O_LQD_PRK78_FST_SCL
2114 :
2115 : !------------------------------------------------------------------------------
2116 :
2117 : REAL*8 FUNCTION SVP_H2O_ICE_PRK78_FST_SCL( TPT_CLS )
2118 : !
2119 : !******************************************************************************
2120 : ! Function SVP_H2O_ICE_PRK78_FST_SCL returns the saturation vapor pressure
2121 : ! [Pa] over planar ice water (tdf, bmy, 3/30/04)
2122 : !
2123 : ! Arguments as Input:
2124 : ! ============================================================================
2125 : ! (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
2126 : !
2127 : ! NOTES:
2128 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
2129 : ! with "D" exponents. (bmy, 3/30/04)
2130 : !******************************************************************************
2131 : !
2132 :
2133 : ! Arguments
2134 : REAL*8, INTENT(IN) :: TPT_CLS
2135 :
2136 : ! Local variables
2137 : REAL*8, PARAMETER :: B0 = 6.109177956d0
2138 : REAL*8, PARAMETER :: B1 = 5.034698970d-01
2139 : REAL*8, PARAMETER :: B2 = 1.886013408d-02
2140 : REAL*8, PARAMETER :: B3 = 4.176223716d-04
2141 : REAL*8, PARAMETER :: B4 = 5.824720280d-06
2142 : REAL*8, PARAMETER :: B5 = 4.838803174d-08
2143 : REAL*8, PARAMETER :: B6 = 1.838826904d-10
2144 :
2145 : !=================================================================
2146 : ! SVP_H2O_ICE_PRK78_FST_SCL begins here!
2147 : !=================================================================
2148 :
2149 : ! Return saturation vapor pressure over ice [Pa]
2150 : SVP_H2O_ICE_PRK78_FST_SCL = 100.0D0 * ( B0+TPT_CLS *
2151 : & ( B1+TPT_CLS *
2152 : & ( B2+TPT_CLS *
2153 : & ( B3+TPT_CLS *
2154 : & ( B4+TPT_CLS *
2155 : & ( B5+TPT_CLS * B6 ))))))
2156 :
2157 : ! Return to calling program
2158 : END FUNCTION SVP_H2O_ICE_PRK78_FST_SCL
2159 :
2160 : !------------------------------------------------------------------------------
2161 :
2162 : REAL*8 FUNCTION TPT_BND_CLS_GET( TPT )
2163 : !
2164 : !******************************************************************************
2165 : ! Function TPT_BND_CLS_GET returns the bounded temperature in [C],
2166 : ! (i.e., -50 < T [C] < 50 C), given the temperature in [K].
2167 : ! (tdf, bmy, 3/30/04)
2168 : !
2169 : ! Arguments as Input:
2170 : ! ============================================================================
2171 : ! (1 ) TPT (REAL*8) : Temperature in Kelvin [K]
2172 : !
2173 : ! NOTES:
2174 : !******************************************************************************
2175 : !
2176 : ! Arguments
2177 : REAL*8, INTENT(IN) :: TPT
2178 :
2179 : ! Local variables
2180 : REAL*8, PARAMETER :: TPT_FRZ_PNT=273.15
2181 :
2182 : !=================================================================
2183 : ! TPT_BND_CLS_GET begins here!
2184 : !=================================================================
2185 : TPT_BND_CLS_GET = MIN( 50.0D0, MAX( -50.0D0, ( TPT-TPT_FRZ_PNT)) )
2186 :
2187 : ! Return to calling program
2188 : END FUNCTION TPT_BND_CLS_GET
2189 :
2190 : !------------------------------------------------------------------------------
2191 :
2192 0 : SUBROUTINE GET_ORO( HcoState, ExtState, OROGRAPHY, RC )
2193 : !
2194 : ! !USES:
2195 : !
2196 : USE HCO_GEOTOOLS_MOD, ONLY : HCO_LANDTYPE
2197 : !
2198 : !******************************************************************************
2199 : ! Subroutine GET_ORO creates a 2D orography array, OROGRAPHY, from the
2200 : ! GMAO surface type fraction fields, based on definition of GMAO LWI, with
2201 : ! modification to qualify land ice as ice. Ocean=0 (no ice); Land=1; Ice=2.
2202 : !
2203 : ! Arguments as Output:
2204 : ! ============================================================================
2205 : ! (1 ) OROGRAPHY (INTEGER) : Array for orography flags
2206 : !
2207 : ! NOTES:
2208 : ! (1 ) Added parallel DO-loop (bmy, 4/14/04)
2209 : ! (2 ) Now modified for GCAP and GEOS-5 met fields (swu, bmy, 6/9/05)
2210 : ! (3 ) Now use IS_LAND, IS_WATER, IS_ICE functions from "dao_mod.f"
2211 : ! (bmy, 8/17/05)
2212 : ! 09 Nov 2012 - M. Payer - Replaced all met field arrays with State_Met
2213 : ! derived type object
2214 : !******************************************************************************
2215 : !
2216 :
2217 : ! Arguments
2218 : TYPE(HCO_State), POINTER :: HcoState
2219 : Type(Ext_State), POINTER :: ExtState
2220 : INTEGER, INTENT(OUT ) :: OROGRAPHY(HcoState%NX,
2221 : & HcoState%NY)
2222 : INTEGER, INTENT(INOUT) :: RC
2223 :
2224 : ! Local variables
2225 : INTEGER :: I, J
2226 :
2227 : !=================================================================
2228 : ! GET_ORO begins here!
2229 : !=================================================================
2230 :
2231 : !$OMP PARALLEL DO
2232 : !$OMP+DEFAULT( SHARED )
2233 : !$OMP+PRIVATE( I, J )
2234 0 : DO J = 1, HcoState%NY
2235 0 : DO I = 1, HcoState%NX
2236 :
2237 : ! Set orography to from fraction land type
2238 0 : OROGRAPHY (I,J) = HCO_LANDTYPE( ExtState%FRLAND%Arr%Val(I,J),
2239 0 : & ExtState%FRLANDIC%Arr%Val(I,J),
2240 0 : & ExtState%FROCEAN%Arr%Val(I,J),
2241 0 : & ExtState%FRSEAICE%Arr%Val(I,J),
2242 0 : & ExtState%FRLAKE%Arr%Val(I,J) )
2243 :
2244 : ENDDO
2245 : ENDDO
2246 : !$OMP END PARALLEL DO
2247 :
2248 : ! Return w/ success
2249 0 : RC = HCO_SUCCESS
2250 :
2251 0 : END SUBROUTINE GET_ORO
2252 :
2253 : !------------------------------------------------------------------------------
2254 :
2255 0 : SUBROUTINE HYD_PRP_GET( HcoState, FLG_MBL, MSS_FRC_CLY_SLC,
2256 0 : & MSS_FRC_SND_SLC, VWC_DRY, VWC_OPT,
2257 0 : & VWC_SAT )
2258 : !
2259 : !******************************************************************************
2260 : ! Subroutine HYD_PRP_GET determines hydrologic properties from soil texture.
2261 : ! (tdf, bmy, 3/30/04)
2262 : !
2263 : ! Arguments as Input:
2264 : ! ============================================================================
2265 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [unitless]
2266 : ! (2 ) MSS_FRC_CLY (REAL*8 ) : Mass fraction clay [fraction]
2267 : ! (3 ) MSS_FRC_SND (REAL*8 ) : Mass fraction sand [fraction]
2268 : !
2269 : ! Arguments as Output:
2270 : ! ============================================================================
2271 : ! (4 ) VWC_DRY (REAL*8 ) : Dry volumetric water content (no E-T) [m3/m3]
2272 : ! (5 ) VWC_OPT (REAL*8 ) : E-T optimal volumetric water content [m3/m3]
2273 : ! (6 ) VWC_SAT (REAL*8 ) : Saturated volumetric water content [m3/m3]
2274 : !
2275 : ! NOTES:
2276 : ! (1 ) All I/O for this routine is time-invariant, thus, the hydrologic
2277 : ! properties could be computed once at initialization. However,
2278 : ! FLG_MBL is time-dependent, so we should keep this as-is.
2279 : ! (tdf, 10/27/03)
2280 : !******************************************************************************
2281 : !
2282 :
2283 : ! Arguments
2284 : TYPE(HCO_State), POINTER :: HcoState
2285 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
2286 : REAL*8, INTENT(IN) :: MSS_FRC_CLY_SLC(HcoState%NX)
2287 : REAL*8, INTENT(IN) :: MSS_FRC_SND_SLC(HcoState%NX)
2288 : REAL*8, INTENT(OUT) :: VWC_DRY(HcoState%NX)
2289 : REAL*8, INTENT(OUT) :: VWC_OPT(HcoState%NX)
2290 : REAL*8, INTENT(OUT) :: VWC_SAT(HcoState%NX)
2291 :
2292 : ! Local variables
2293 : INTEGER :: LON_IDX
2294 :
2295 : ! [frc] Exponent "b" for smp (clay-dependent)
2296 0 : REAL*8 :: SMP_XPN_B(HcoState%NX)
2297 :
2298 : ! [mm H2O] Saturated soil matric potential (sand-dependent)
2299 0 : REAL*8 :: SMP_SAT(HcoState%NX)
2300 :
2301 : !=================================================================
2302 : ! HYD_PRP_GET begins here
2303 : !=================================================================
2304 :
2305 : ! Initialize output values
2306 0 : VWC_DRY(:) = 0.0D0
2307 0 : VWC_OPT(:) = 0.0D0
2308 0 : VWC_SAT(:) = 0.0D0
2309 :
2310 : ! Time-invariant soil hydraulic properties
2311 : ! See Bon96 p. 98, implemented in CCM:lsm/lsmtci()
2312 0 : DO LON_IDX = 1, HcoState%NX
2313 :
2314 0 : IF ( FLG_MBL(LON_IDX) ) THEN
2315 :
2316 : ! Exponent "b" for smp (clay-dependent) [fraction]
2317 : SMP_XPN_B(LON_IDX) =
2318 0 : & 2.91D0 +0.159D0 * MSS_FRC_CLY_SLC(LON_IDX) * 100.0D0
2319 :
2320 : ! NB: Adopt convention that matric potential is positive definite
2321 : ! Saturated soil matric potential (sand-dependent) [mm H2O]
2322 : SMP_SAT(LON_IDX) =
2323 : & 10.0D0 * (10.0D0**(1.88D0-0.0131D0
2324 0 : & * MSS_FRC_SND_SLC(LON_IDX)*100.0D0))
2325 :
2326 : ! Saturated volumetric water content (sand-dependent) ! [m3 m-3]
2327 : VWC_SAT(LON_IDX)=
2328 0 : & 0.489D0 - 0.00126D0 * MSS_FRC_SND_SLC(LON_IDX)*100.0D0
2329 :
2330 : ! [m3 m-3]
2331 : VWC_DRY(LON_IDX) =
2332 :
2333 : ! Dry volumetric water content (no E-T)
2334 : & VWC_SAT(LON_IDX)*(316230.0D0/SMP_SAT(LON_IDX))
2335 0 : & **(-1.0D0/SMP_XPN_B(LON_IDX))
2336 :
2337 : ! E-T optimal volumetric water content! [m3 m-3]
2338 : VWC_OPT(LON_IDX) =
2339 : & VWC_SAT(LON_IDX)*(158490.0D0/SMP_SAT(LON_IDX))
2340 0 : & **(-1.0D0/SMP_XPN_B(LON_IDX))
2341 : ENDIF
2342 : ENDDO
2343 :
2344 : ! Return to calling program
2345 0 : END SUBROUTINE HYD_PRP_GET
2346 :
2347 : !------------------------------------------------------------------------------
2348 :
2349 : SUBROUTINE CND_TRM_SOI_GET( HcoState,CND_TRM_SOI,FLG_MBL,LVL_DLT,
2350 : & MSS_FRC_CLY_SLC, MSS_FRC_SND_SLC,
2351 : & TPT_SOI,
2352 : & VWC_DRY, VWC_OPT, VWC_SAT,
2353 : & VWC_SFC )
2354 :
2355 : !
2356 : !******************************************************************************
2357 : ! Subroutine CND_TRM_SOI_GET gets thermal properties of soil. Currently this
2358 : ! routine is optimized for ground without snow-cover. Although snow
2359 : ! thickness is read in, it is not currently used. (tdf, bmy, 3/30/04)
2360 : !
2361 : ! Arguments as Input:
2362 : ! ============================================================================
2363 : ! (3 ) lvl_dlt (REAL*8 ) : Soil layer thickness [m ]
2364 : ! (4 ) mss_frc_cly (REAL*8 ) : Mass fraction clay [frac.]
2365 : ! (5 ) mss_frc_snd (REAL*8 ) : Mass fraction sand [frac.]
2366 : ! (6 ) tpt_soi (REAL*8 ) : Soil temperature [K ]
2367 : ! (7 ) vwc_dry (REAL*8 ) : Dry volumetric water content (no E-T) [m3/m3]
2368 : ! (8 ) vwc_opt (REAL*8 ) : E-T optimal volumetric water content [m3/m3]
2369 : ! (9 ) vwc_sat (REAL*8 ) : Saturated volumetric water content [m3/m3]
2370 : ! (10) vwc_sfc (REAL*8 ) : Volumetric water content [m3/m3]
2371 : !
2372 : ! Arguments as Output:
2373 : ! ============================================================================
2374 : ! (1 ) CND_TRM_SOI (REAL*8 ) : Soil thermal conductivity [W/m/K]
2375 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [flag ]
2376 : !
2377 : ! NOTES:
2378 : !******************************************************************************
2379 : !
2380 :
2381 : ! Arguments
2382 : TYPE(HCO_State), POINTER :: HcoState
2383 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
2384 : REAL*8, INTENT(IN) :: MSS_FRC_CLY_SLC(HcoState%NX)
2385 : REAL*8, INTENT(IN) :: MSS_FRC_SND_SLC(HcoState%NX)
2386 : REAL*8, INTENT(IN) :: TPT_SOI(HcoState%NX)
2387 : REAL*8, INTENT(IN) :: VWC_DRY(HcoState%NX)
2388 : REAL*8, INTENT(IN) :: VWC_OPT(HcoState%NX)
2389 : REAL*8, INTENT(IN) :: VWC_SAT(HcoState%NX)
2390 : REAL*8, INTENT(IN) :: VWC_SFC(HcoState%NX)
2391 : REAL*8, INTENT(OUT) :: CND_TRM_SOI(HcoState%NX)
2392 : REAL*8, INTENT(OUT) :: LVL_DLT(HcoState%NX)
2393 :
2394 : !------------
2395 : ! Parameters
2396 : !------------
2397 :
2398 : ! Thermal conductivity of ice water [W m-1 K-1]
2399 : REAL*8, PARAMETER :: CND_TRM_H2O_ICE = 2.2d0
2400 :
2401 : ! Thermal conductivity of liquid water [W m-1 K-1]
2402 : REAL*8, PARAMETER :: CND_TRM_H2O_LQD = 0.6d0
2403 :
2404 : ! Thermal conductivity of snow Bon96 p. 77 [W m-1 K-1]
2405 : REAL*8, PARAMETER :: CND_TRM_SNW = 0.34d0
2406 :
2407 : ! Soil layer thickness, top layer! [m]
2408 : REAL*8, PARAMETER :: LVL_DLT_SFC = 0.1d0
2409 :
2410 : ! Temperature range of mixed phase soil [K]
2411 : REAL*8, PARAMETER :: TPT_DLT = 0.5d0
2412 :
2413 : ! Latent heat of fusion of H2O at 0 C, standard [J kg-1]
2414 : REAL*8, PARAMETER :: LTN_HEAT_FSN_H2O_STD = 0.3336d06
2415 :
2416 : ! Liquid water density [kg/m3]
2417 : REAL*8, PARAMETER :: DNS_H2O_LQD_STD = 1000.0d0
2418 :
2419 : ! Kelvin--Celsius scale offset Bol80 [K]
2420 : REAL*8, PARAMETER :: TPT_FRZ_PNT = 273.15d0
2421 :
2422 : !-----------------
2423 : ! Local variables
2424 : !-----------------
2425 :
2426 : ! Longitude index
2427 : INTEGER :: LON_IDX
2428 :
2429 : ! Thermal conductivity of dry soil [W m-1 K-1]
2430 : REAL*8 :: CND_TRM_SOI_DRY(HcoState%NX)
2431 :
2432 : ! Soil thermal conductivity, frozen [W m-1 K-1]
2433 : REAL*8 :: CND_TRM_SOI_FRZ(HcoState%NX)
2434 :
2435 : ! Thermal conductivity of soil solids [W m-1 K-1]
2436 : REAL*8 :: CND_TRM_SOI_SLD(HcoState%NX)
2437 :
2438 : ! Soil thermal conductivity, unfrozen [W m-1 K-1]
2439 : REAL*8 :: CND_TRM_SOI_WRM(HcoState%NX)
2440 :
2441 : ! Volumetric latent heat of fusion [J m-3]
2442 : REAL*8 :: LTN_HEAT_FSN_VLM(HcoState%NX)
2443 :
2444 : ! Bounded geometric bulk thickness of snow [m]
2445 : REAL*8 :: SNW_HGT_BND
2446 :
2447 : !=================================================================
2448 : ! CND_TRM_SOI_GET begins here!
2449 : !=================================================================
2450 :
2451 : ! [m] Soil layer thickness
2452 : LVL_DLT(:) = LVL_DLT_SFC
2453 :
2454 : ! [W m-1 K-1] Soil thermal conductivity
2455 : CND_TRM_SOI(:) = 0.0D0
2456 :
2457 : ! Loop over longitude
2458 : DO LON_IDX = 1, HcoState%NX
2459 : IF ( FLG_MBL(LON_IDX) ) THEN
2460 :
2461 : ! Volumetric latent heat of fusion [J m-3]
2462 : LTN_HEAT_FSN_VLM(LON_IDX) = VWC_SFC(LON_IDX)
2463 : & * LTN_HEAT_FSN_H2O_STD * DNS_H2O_LQD_STD
2464 :
2465 : !Thermal conductivity of soil solids Bon96 p. 77 [W/m/K]
2466 : CND_TRM_SOI_SLD(LON_IDX) =
2467 : & ( 8.80D0 *MSS_FRC_SND_SLC(LON_IDX)
2468 : & + 2.92D0 *MSS_FRC_CLY_SLC(LON_IDX) )
2469 : & / (MSS_FRC_SND_SLC(LON_IDX)
2470 : & + MSS_FRC_CLY_SLC(LON_IDX))
2471 :
2472 : ! Thermal conductivity of dry soil Bon96 p. 77 [W/m/K]
2473 : cnd_trm_soi_dry(lon_idx) = 0.15D0
2474 :
2475 : ! Soil thermal conductivity, unfrozen [W/m/K]
2476 : CND_TRM_SOI_WRM(LON_IDX) =
2477 : & CND_TRM_SOI_DRY(LON_IDX)
2478 : & + ( CND_TRM_SOI_SLD(LON_IDX)
2479 : & ** (1.0D0-VWC_SAT(LON_IDX))
2480 : & * (CND_TRM_H2O_LQD ** VWC_SFC(LON_IDX) )
2481 : & - CND_TRM_SOI_DRY(LON_IDX) )
2482 : & * VWC_SFC(LON_IDX) / VWC_SAT(lon_idx)
2483 :
2484 : ! Soil thermal conductivity, frozen [W/m/K]
2485 : CND_TRM_SOI_FRZ(LON_IDX) =
2486 : & CND_TRM_SOI_DRY(LON_IDX)
2487 : & + ( CND_TRM_SOI_SLD(LON_IDX)
2488 : & ** (1.0D0-VWC_SAT(LON_IDX))
2489 : & * (CND_TRM_H2O_ICE ** VWC_SFC(LON_IDX) )
2490 : & - CND_TRM_SOI_DRY(LON_IDX) )
2491 : & * VWC_SFC(LON_IDX) / VWC_SAT(LON_IDX)
2492 :
2493 : IF (TPT_SOI(LON_IDX) < TPT_FRZ_PNT-TPT_DLT) THEN
2494 : ! Soil thermal conductivity [W/m/K]
2495 : CND_TRM_SOI(LON_IDX) = CND_TRM_SOI_FRZ(LON_IDX)
2496 : ENDIF
2497 :
2498 : IF ( (TPT_SOI(LON_IDX) >= TPT_FRZ_PNT-TPT_DLT)
2499 : & .AND. (TPT_SOI(LON_IDX) <= TPT_FRZ_PNT+TPT_DLT) )
2500 : & THEN
2501 :
2502 : ! Soil thermal conductivity [W/m/K]
2503 : CND_TRM_SOI(LON_IDX) =
2504 : & CND_TRM_SOI_FRZ(LON_IDX)
2505 : & + (CND_TRM_SOI_FRZ(LON_IDX)
2506 : & - CND_TRM_SOI_WRM(LON_IDX) )
2507 : & * (TPT_SOI(LON_IDX)
2508 : & -TPT_FRZ_PNT+TPT_DLT)
2509 : & / (2.0D0*TPT_DLT)
2510 : ENDIF
2511 :
2512 : IF (TPT_SOI(LON_IDX) > TPT_FRZ_PNT+TPT_DLT) THEN
2513 : ! Soil thermal conductivity[W/m/K]
2514 : CND_TRM_SOI(LON_IDX)=CND_TRM_SOI_WRM(LON_IDX)
2515 : ENDIF
2516 :
2517 : ! Implement this later(??)
2518 : !cZ Blend snow into first soil layer
2519 : !cZ Snow is not allowed to cover dust mobilization regions
2520 : !cZ snw_hgt_bnd=min(snw_hgt(lon_idx),1.0D0) ! [m] Bounded geometric bulk thickness of snow
2521 : !cZ lvl_dlt_snw(lon_idx)=lvl_dlt(lon_idx)+snw_hgt_bnd ! O [m] Soil layer thickness
2522 : !cZ including snow Bon96 p. 77
2523 : !
2524 : !cZ cnd_trm_soi(lon_idx)= & ! [W m-1 K-1] Soil thermal conductivity Bon96 p. 77
2525 : !cZ cnd_trm_snw*cnd_trm_soi(lon_idx)*lvl_dlt_snw(lon_idx) &
2526 : !cZ /(cnd_trm_snw*lvl_dlt(lon_idx)+cnd_trm_soi(lon_idx)*snw_hgt_bnd)
2527 :
2528 : ENDIF
2529 : ENDDO
2530 :
2531 : END SUBROUTINE CND_TRM_SOI_GET
2532 :
2533 : !------------------------------------------------------------------------------
2534 :
2535 : SUBROUTINE TRN_FSH_VPR_SOI_ATM_GET( HcoState, FLG_MBL,
2536 : & TPT_SOI,
2537 : & TPT_SOI_FRZ,
2538 : & TRN_FSH_VPR_SOI_ATM,
2539 : & VWC_DRY,
2540 : & VWC_OPT,
2541 : & VWC_SFC )
2542 : !
2543 : !******************************************************************************
2544 : ! Subroutine TRN_FSH_VPR_SOI_ATM_GET computes the factor describing effects
2545 : ! of soil texture and moisture on vapor transfer between soil and atmosphere.
2546 : ! Taken from Bon96 p. 59, CCM:lsm/surphys. (tdf, bmy, 3/30/04)
2547 : !
2548 : ! The TRN_FSH_VPR_SOI_ATM efficiency factor attempts to tie soil texture and
2549 : ! moisture properties to the vapor conductance of the soil-atmosphere system.
2550 : ! When the soil temperature is sub-freezing, the conductance describes the
2551 : ! resistance to vapor sublimation (or deposition) and transport through the
2552 : ! open soil pores to the atmosphere.
2553 : !
2554 : ! For warm soils, vapor transfer is most efficient at the optimal VWC for E-T
2555 : ! Thus when vwc_sfc = vwc_opt, soil vapor transfer is perfectly efficient
2556 : ! (trn_fsh_vpr_soi_atm = 1.0) so the soil does not contribute any resistance
2557 : ! to the surface vapor transfer.
2558 : !
2559 : ! When vwc_sfc > vwc_opt, the soil has an excess of moisture and, again,
2560 : ! vapor transfer is not limited by soil characteristics.
2561 : ! In fact, according to Bon96 p. 98, vwc_dry is only slightly smaller than
2562 : ! vwc_opt, so trn_fsh_vpr_soi_atm is usually either 0 or 1 and intermediate
2563 : ! efficiencies occur over only a relatively small range of VWC.
2564 : !
2565 : ! When vwc_sfc < vwc_dry, the soil matrix is subsaturated and acts as a
2566 : ! one-way sink for vapor through osmotic and capillary potentials.
2567 : ! In this case trn_fsh_vpr_soi_atm = 0, which would cause the surface
2568 : ! resistance rss_vpr_sfc to blow up, but this is guarded against and
2569 : ! rss_sfc_vpr is set to ~1.0e6*rss_aer_vpr instead.
2570 : !
2571 : ! Note that this formulation does not seem to allow vapor transfer from
2572 : ! the atmosphere to the soil when vwc_sfc < vwc_dry, even when
2573 : ! e_atm > esat(Tg).
2574 : !
2575 : ! Air at the apparent sink for moisture is has vapor pressure e_sfc
2576 : ! e_atm = Vapor pressure of ambient air at z = hgt_mdp
2577 : ! e_sfc = Vapor pressure at apparent sink for moisture at z = zpd + rgh_vpr
2578 : ! e_gnd = Vapor pressure at air/ground interface temperature
2579 : ! Air at the soil interface is assumed saturated, i.e., e_gnd = esat(Tg)
2580 : !
2581 : ! Arguments as Input:
2582 : ! ============================================================================
2583 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [unitless]
2584 : ! (2 ) TPT_SOI (REAL*8 ) : Soil temperature [K ]
2585 : ! (3 ) TPT_SOI_FRZ (REAL*8 ) : Temperature of frozen soil [K ]
2586 : ! (5 ) VWC_DRY (REAL*8 ) : Dry volumetric WC (no E-T) [m3/m3 ]
2587 : ! (6 ) VWC_OPT (REAL*8 ) : E-T optimal volumetric WC [m3/m3 ]
2588 : ! (7 ) VWC_SFC (REAL*8 ) : Volumetric water content [m3/m3 ]
2589 : !
2590 : ! Arguments as Output:
2591 : ! ============================================================================
2592 : ! (4 ) TRN_FSH_VPR_SOI_ATM (REAL*8 ) : Transfer efficiency of vapor from
2593 : ! soil to atmosphere [fraction]
2594 : !
2595 : ! NOTES:
2596 : ! (1 ) Updated comments, cosmetic changes. Also force double-precision
2597 : ! with "D" exponents. (tdf, bmy, 3/30/04)
2598 : !******************************************************************************
2599 : !
2600 :
2601 : !----------------
2602 : ! Arguments
2603 : !----------------
2604 : TYPE(HCO_State), POINTER :: HCoState
2605 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
2606 : REAL*8, INTENT(IN) :: TPT_SOI(HcoState%NX)
2607 : REAL*8, INTENT(IN) :: TPT_SOI_FRZ
2608 : REAL*8, INTENT(IN) :: VWC_DRY(HcoState%NX)
2609 : REAL*8, INTENT(IN) :: VWC_OPT(HcoState%NX)
2610 : REAL*8, INTENT(IN) :: VWC_SFC(HcoState%NX)
2611 : REAL*8, INTENT(OUT) :: TRN_FSH_VPR_SOI_ATM(HcoState%NX)
2612 :
2613 : !----------------
2614 : ! Parameters
2615 : !----------------
2616 :
2617 : ! Transfer efficiency of vapor from frozen soil to
2618 : ! atmosphere CCM:lsm/surphy() [fraction]
2619 : REAL*8, PARAMETER :: TRN_FSH_VPR_SOI_ATM_FRZ = 0.01D0
2620 :
2621 : !-----------------
2622 : ! Local variables
2623 : !-----------------
2624 : INTEGER :: LON_IDX
2625 :
2626 : !=================================================================
2627 : ! TRN_FSH_VPR_SOI_ATM_GET
2628 : !=================================================================
2629 : TRN_FSH_VPR_SOI_ATM(:) = 0.0D0
2630 :
2631 : ! Loop over longitudes
2632 : DO LON_IDX = 1, HcoState%NX
2633 :
2634 : ! If this is a mobilization candidate ...
2635 : IF ( FLG_MBL(LON_IDX) ) THEN
2636 :
2637 : ! ... and if the soil is above freezing ...
2638 : IF ( TPT_SOI(LON_IDX) > TPT_SOI_FRZ ) THEN
2639 :
2640 : ! Transfer efficiency of cvapor from soil to atmosphere [frac]
2641 : ! CCM:lsm/surphys Bon96 p. 59
2642 : TRN_FSH_VPR_SOI_ATM(LON_IDX) =
2643 : & MIN ( MAX(VWC_SFC(LON_IDX)-VWC_DRY(LON_IDX), 0.0D0)
2644 : & /(VWC_OPT(LON_IDX)-VWC_DRY(LON_IDX)), 1.0D0)
2645 :
2646 : ELSE
2647 :
2648 : ! [frc] Bon96 p. 59
2649 : TRN_FSH_VPR_SOI_ATM(LON_IDX) = TRN_FSH_VPR_SOI_ATM_FRZ
2650 :
2651 : ENDIF
2652 : ENDIF
2653 : ENDDO
2654 :
2655 : ! Return to calling program
2656 : END SUBROUTINE TRN_FSH_VPR_SOI_ATM_GET
2657 :
2658 : !------------------------------------------------------------------------------
2659 :
2660 0 : SUBROUTINE BLM_MBL( HcoState, FLG_MBL, RGH_MMN,
2661 0 : & WND_10M, MNO_LNG, WND_FRC, RC )
2662 : !
2663 : !******************************************************************************
2664 : ! Subroutine BLM_MBL computes the boundary-layer exchange properties, given
2665 : ! the meteorology at the GEOS-CHEM layer midpoint. This routine is optimized
2666 : ! for dust source regions: dry, bare, uncovered land. Theory and algorithms:
2667 : ! Bonan (1996) CCM:lsm/surtem(). Stripped down version, based on adiabatic
2668 : ! approximation to U*. (tdf, bmy, 3/30/04)
2669 : !
2670 : ! Arguments as Input:
2671 : ! ============================================================================
2672 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [unitless]
2673 : ! (2 ) RGH_MMN (REAL*8 ) : Roughness length momentum [m ]
2674 : ! (3 ) WND_10M (REAL*8 ) : 10 m wind speed [m/s ]
2675 : !
2676 : ! Arguments as Output:
2677 : ! ============================================================================
2678 : ! (4 ) MNO_LNG (REAL*8 ) : Monin-Obukhov length [m ]
2679 : ! (5 ) WND_FRC (REAL*8 ) : Surface friction velocity [m/s ]
2680 : !
2681 : ! NOTES:
2682 : ! (1 ) Updated comments, cosmetic changes. Also force double-precision with
2683 : ! "D" exponents. (tdf, bmy, 3/30/04)
2684 : !******************************************************************************
2685 : !
2686 : !-----------------
2687 : ! Arguments
2688 : !-----------------
2689 : TYPE(HCO_State), POINTER :: HcoState
2690 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
2691 : REAL*8, INTENT(IN) :: RGH_MMN(HcoState%NX)
2692 : REAL*8, INTENT(IN) :: WND_10M(HcoState%NX)
2693 : REAL*8, INTENT(OUT) :: MNO_LNG(HcoState%NX)
2694 : REAL*8, INTENT(OUT) :: WND_FRC(HcoState%NX)
2695 : INTEGER, INTENT(INOUT) :: RC
2696 :
2697 : !-----------------
2698 : ! Parameters
2699 : !-----------------
2700 :
2701 : ! Prevents division by zero [unitless]
2702 : REAL*8, PARAMETER :: EPS_DBZ = 1.0d-6
2703 :
2704 : ! Minimum windspeed used for mobilization [m/s]
2705 : REAL*8, PARAMETER :: WND_MIN_MBL = 1.0d0
2706 :
2707 : ! Roughness length momentum for erodible surfaces [m]
2708 : ! MaB95 p. 16420, GMB98 p. 6205
2709 : REAL*8, PARAMETER :: RGH_MMN_MBL = 100.0d-6
2710 :
2711 : ! Reference height for mobilization processes [m]
2712 : REAL*8, PARAMETER :: HGT_RFR = 10.0d0
2713 :
2714 : !-----------------
2715 : ! Local variables
2716 : !-----------------
2717 :
2718 : ! Counting index for lon
2719 : INTEGER :: LON_IDX
2720 :
2721 : ! Denominator of Monin-Obukhov length Bon96 p. 49
2722 : REAL*8 :: MNO_DNM
2723 :
2724 : ! Surface layer mean wind speed [m/s]
2725 0 : REAL*8 :: WND_MDP_BND(HcoState%NX)
2726 :
2727 : ! denominator for wind friction velocity
2728 : REAL*8 :: WND_FRC_DENOM
2729 :
2730 : ! For error handling
2731 : CHARACTER(LEN=255) :: MSG
2732 :
2733 : !=================================================================
2734 : ! BLM_MBL begins here!
2735 : !=================================================================
2736 :
2737 : ! Initialize
2738 0 : MNO_LNG(:) = 0.0D0
2739 0 : WND_FRC(:) = 0.0D0
2740 :
2741 : ! Loop over longitudes
2742 0 : DO LON_IDX = 1, HcoState%NX
2743 :
2744 : ! Surface layer mean wind speed bounded [m/s]
2745 0 : WND_MDP_BND(LON_IDX) =
2746 0 : & MAX(WND_10M(LON_IDX), WND_MIN_MBL)
2747 :
2748 : ! Friction velocity (adiabatic approximation S&P equ. 16.57,
2749 : ! tdf 10/27/2K3 -- Sanity check
2750 0 : IF ( RGH_MMN(LON_IDX) <= 0.0 ) THEN
2751 0 : MSG = 'RGH_MMN <= 0.0'
2752 0 : CALL HCO_ERROR(MSG,RC,THISLOC='BLM_MBL')
2753 0 : RETURN
2754 : ENDIF
2755 :
2756 : ! Distinguish between mobilisation candidates and noncandidates
2757 0 : IF ( FLG_MBL(LON_IDX) ) THEN
2758 : WND_FRC_DENOM = HGT_RFR / RGH_MMN_MBL ! z = 10 m
2759 : ELSE
2760 0 : WND_FRC_DENOM = HGT_RFR / RGH_MMN(LON_IDX) ! z = 10 m
2761 : ENDIF
2762 :
2763 : ! Sanity check
2764 0 : IF ( WND_FRC_DENOM <= 0.0 ) THEN
2765 0 : MSG = 'WND_FRC_DENOM <= 0.0'
2766 0 : CALL HCO_ERROR(MSG,RC,THISLOC='BLM_MBL')
2767 0 : RETURN
2768 : ENDIF
2769 :
2770 : ! Take natural LOG of WND_FRC_DENOM
2771 0 : WND_FRC_DENOM = LOG(WND_FRC_DENOM)
2772 :
2773 : ! Convert to [m/s]
2774 : WND_FRC(LON_IDX) = WND_MDP_BND(LON_IDX) * CST_VON_KRM
2775 0 : & / WND_FRC_DENOM
2776 :
2777 : ! Denominator of Monin-Obukhov length Bon96 p. 49
2778 : ! Set denominator of Monin-Obukhov length to minimum value
2779 0 : MNO_DNM = EPS_DBZ
2780 :
2781 : ! Monin-Obukhov length Bon96 p. 49 [m]
2782 : MNO_LNG(LON_IDX) = -1.0D0 * (WND_FRC(LON_IDX)**3.0D0)
2783 0 : & /MNO_DNM
2784 :
2785 : ! Override for non mobilisation candidates
2786 0 : IF ( .NOT. FLG_MBL(LON_IDX) ) THEN
2787 0 : WND_FRC(LON_IDX) = 0.0D0
2788 : ENDIF
2789 : ENDDO
2790 :
2791 : ! Return w/ success
2792 0 : RC = HCO_SUCCESS
2793 :
2794 : END SUBROUTINE BLM_MBL
2795 :
2796 : !------------------------------------------------------------------------------
2797 :
2798 0 : LOGICAL FUNCTION ORO_IS_OCN( ORO_VAL )
2799 : !
2800 : !******************************************************************************
2801 : ! Function ORO_IS_OCN returns TRUE if a grid box contains more than 50%
2802 : ! ocean. (tdf, bmy, 3/30/04)
2803 : !
2804 : ! Arguments as Input:
2805 : ! ============================================================================
2806 : ! (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
2807 : !
2808 : ! NOTES:
2809 : !******************************************************************************
2810 : !
2811 : ! Arguments
2812 : REAL*8, INTENT(IN) :: ORO_VAL
2813 :
2814 : !=================================================================
2815 : ! ORO_IS_OCN begins here!
2816 : !=================================================================
2817 0 : ORO_IS_OCN = ( NINT( ORO_VAL ) == 0 )
2818 :
2819 : ! Return to calling program
2820 0 : END FUNCTION ORO_IS_OCN
2821 :
2822 : !------------------------------------------------------------------------------
2823 :
2824 0 : LOGICAL FUNCTION ORO_IS_LND( ORO_VAL )
2825 : !
2826 : !******************************************************************************
2827 : ! Function ORO_IS_LND returns TRUE if a grid box contains more than 50%
2828 : ! land. (tdf, bmy, 3/30/04, 3/1/05)
2829 : !
2830 : ! Arguments as Input:
2831 : ! ============================================================================
2832 : ! (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
2833 : !
2834 : ! NOTES:
2835 : ! (1 ) Bug fix: Replaced ": :" with "::" in order to prevent compile error
2836 : ! on Linux w/ PGI compiler. (bmy, 3/1/05)
2837 : !******************************************************************************
2838 : !
2839 : ! Arguments
2840 : REAL*8, INTENT(IN) :: ORO_VAL
2841 :
2842 : !=================================================================
2843 : ! ORO_IS_OCN begins here!
2844 : !=================================================================
2845 0 : ORO_IS_LND = ( NINT( ORO_VAL ) == 1 )
2846 :
2847 : ! Return to calling program
2848 0 : END FUNCTION ORO_IS_LND
2849 :
2850 : !------------------------------------------------------------------------------
2851 :
2852 0 : LOGICAL FUNCTION ORO_IS_ICE( ORO_VAL )
2853 : !
2854 : !******************************************************************************
2855 : ! Function ORO_IS_LND returns TRUE if a grid box contains more than 50%
2856 : ! ice. (tdf, bmy, 3/30/04)
2857 : !
2858 : ! Arguments as Input:
2859 : ! ============================================================================
2860 : ! (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
2861 : !
2862 : ! NOTES:
2863 : !******************************************************************************
2864 : !
2865 : ! Arguments
2866 : REAL*8, INTENT(IN) :: ORO_VAL
2867 :
2868 : !=================================================================
2869 : ! ORO_IS_ICE begins here!
2870 : !=================================================================
2871 0 : ORO_IS_ICE = ( NINT( ORO_VAL ) == 2 )
2872 :
2873 : ! Return to calling program
2874 0 : END FUNCTION ORO_IS_ICE
2875 :
2876 : !------------------------------------------------------------------------------
2877 :
2878 : REAL*8 FUNCTION MNO_STB_CRC_HEAT_UNS_GET( SML_FNC_MMN_UNS_RCP )
2879 : !
2880 : !******************************************************************************
2881 : ! Function MNO_STB_CRC_HEAT_UNS_GET returns the stability correction factor
2882 : ! for heat (usually called PSI), given the reciprocal of the Monin-Obukhov
2883 : ! similarity function (usually called PHI) for momentum in an unstable
2884 : ! atmosphere. (tdf, bmy, 3/30/04)
2885 : !
2886 : ! Arguments as Input:
2887 : ! ============================================================================
2888 : ! (1 ) sml_fnc_mmn_uns_rcp (REAL*8) : 1/(M-O similarity function) [fraction]
2889 : !
2890 : ! References:
2891 : ! ============================================================================
2892 : ! References are Ary88 p. 167, Bru82 p. 71, SeP97 p. 869,
2893 : ! Bon96 p. 52, BKL97 p. F1, LaP81 p. 325, LaP82 p. 466
2894 : ! Currently this function is BFB with CCM:dom/flxoce()
2895 : !
2896 : ! NOTES:
2897 : ! (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
2898 : !******************************************************************************
2899 : !
2900 : ! Arguments
2901 : REAL*8, INTENT(IN) :: SML_FNC_MMN_UNS_RCP
2902 :
2903 : !=================================================================
2904 : ! MNO_STB_CRC_HEAT_UNS_GET
2905 : !=================================================================
2906 : MNO_STB_CRC_HEAT_UNS_GET = 2.0D0 *
2907 : & LOG( ( 1.0D0+SML_FNC_MMN_UNS_RCP * SML_FNC_MMN_UNS_RCP) / 2.0D0 )
2908 :
2909 : ! Return to calling program
2910 : END FUNCTION MNO_STB_CRC_HEAT_UNS_GET
2911 :
2912 : !------------------------------------------------------------------------------
2913 :
2914 : REAL*8 FUNCTION MNO_STB_CRC_MMN_UNS_GET( SML_FNC_MMN_UNS_RCP )
2915 : !
2916 : !******************************************************************************
2917 : ! Function MNO_STB_CRC_MMN_UNS_GET returns the stability correction factor
2918 : ! for momentum (usually called PSI), given the reciprocal of the
2919 : ! Monin-Obukhov similarity function (usually called PHI), for momentum in
2920 : ! an unstable atmosphere. (tdf, bmy, 3/30/04)
2921 : !
2922 : ! Arguments as Input:
2923 : ! ============================================================================
2924 : ! (1 ) SML_FNC_MMN_UNS_RCP (REAL*8) : 1/(M-O similarity function) [fraction]
2925 : !
2926 : ! References:
2927 : ! ============================================================================
2928 : ! References are Ary88 p. 167, Bru82 p. 71, SeP97 p. 869,
2929 : ! Bon96 p. 52, BKL97 p. F1, LaP81 p. 325, LaP82 p. 466
2930 : ! Currently this function is BFB with CCM:dom/flxoce()
2931 : !
2932 : ! NOTES:
2933 : ! (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
2934 : !******************************************************************************
2935 : !
2936 : ! Arguments
2937 : REAL*8, INTENT(IN) :: SML_FNC_MMN_UNS_RCP
2938 :
2939 : !=================================================================
2940 : ! MNO_STB_CRC_MMN_UNS_GET begins here!
2941 : !=================================================================
2942 : MNO_STB_CRC_MMN_UNS_GET =
2943 : & LOG((1.0D0+SML_FNC_MMN_UNS_RCP*(2.0D0+SML_FNC_MMN_UNS_RCP))
2944 : & *(1.0D0+SML_FNC_MMN_UNS_RCP*SML_FNC_MMN_UNS_RCP)/8.0D0)
2945 : & -2.0D0*ATAN(SML_FNC_MMN_UNS_RCP)+1.571D0
2946 :
2947 : ! Return to calling program
2948 : END FUNCTION MNO_STB_CRC_MMN_UNS_GET
2949 :
2950 : !------------------------------------------------------------------------------
2951 :
2952 0 : REAL*8 FUNCTION XCH_CFF_MMN_OCN_NTR_GET( WND_10M_NTR )
2953 : !
2954 : !******************************************************************************
2955 : ! Function XCH_CFF_MMN_OCN_NTR_GET returns the Neutral 10m drag coefficient
2956 : ! over oceans. (tdf, bmy, 3/30/04)
2957 : !
2958 : ! Arguments as Input:
2959 : ! ============================================================================
2960 : ! (1 ) WIND_10M_NTR (REAL*8) : Wind speed @ 10 m[m/s]
2961 : !
2962 : ! References:
2963 : ! ============================================================================
2964 : ! LaP82 CCM:dom/flxoce(), NOS97 p. I2
2965 : !
2966 : ! NOTES:
2967 : ! (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
2968 : !******************************************************************************
2969 : !
2970 : ! Arguments
2971 : REAL*8, INTENT(IN) :: WND_10M_NTR
2972 :
2973 : !=================================================================
2974 : ! XCH_CFF_MMN_OCN_NTR_GET begins here!
2975 : !=================================================================
2976 : XCH_CFF_MMN_OCN_NTR_GET = 0.0027D0 / WND_10M_NTR + 0.000142D0
2977 0 : & + 0.0000764D0 * WND_10M_NTR
2978 :
2979 : ! REturn to calling program
2980 0 : END FUNCTION XCH_CFF_MMN_OCN_NTR_GET
2981 :
2982 : !------------------------------------------------------------------------------
2983 :
2984 0 : SUBROUTINE RGH_MMN_GET( HcoState,Inst,ORO, RGH_MMN,
2985 0 : & SFC_TYP_SLC, SNW_FRC, WND_10M, RC )
2986 : !
2987 : !******************************************************************************
2988 : ! Subroutine RGH_MMN_GET sets the roughness length. (tdf, bmy, 3/30/04)
2989 : !
2990 : ! Arguments as Input:
2991 : ! ============================================================================
2992 : ! (1 ) ORO (INTEGER) : Orography (0=ocean; 1=land; 2=ice) [unitless]
2993 : ! (3 ) SFC_TYP (REAL*8 ) : LSM surface type (0..28) [unitless]
2994 : ! (4 ) SNW_FRC (REAL*8 ) : Fraction of surface covered by snow [fraction]
2995 : ! (5 ) WND_10M (REAL*8 ) : 10 m wind speed [m/s ]
2996 : !
2997 : ! Arguments as Output:
2998 : ! ============================================================================
2999 : ! (2 ) RGH_MMN (REAL*8 ) : Roughness length momentu [m ]
3000 : !
3001 : ! NOTES:
3002 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
3003 : ! with "D" exponents (bmy, 3/30/04)
3004 : !******************************************************************************
3005 : !
3006 :
3007 : !-----------------
3008 : ! Arguments
3009 : !-----------------
3010 : TYPE(HCO_State), POINTER :: HcoState
3011 : TYPE(MyInst), POINTER :: Inst
3012 : INTEGER, INTENT(IN) :: SFC_TYP_SLC(HcoState%NX)
3013 : REAL*8, INTENT(IN) :: ORO(HcoState%NX)
3014 : REAL*8, INTENT(IN) :: SNW_FRC(HcoState%NX)
3015 : REAL*8, INTENT(IN) :: WND_10M(HcoState%NX)
3016 : REAL*8, INTENT(OUT) :: RGH_MMN(HcoState%NX)
3017 : INTEGER, INTENT(INOUT) :: RC
3018 :
3019 : !-----------------
3020 : ! Parameters
3021 : !-----------------
3022 :
3023 : ! Roughness length over frozen lakes Bon96 p. 59 [m]
3024 : REAL*8, PARAMETER :: RGH_MMN_ICE_LAK = 0.04d0
3025 :
3026 : ! Roughness length over ice, bare ground, wetlands Bon96 p. 59 [m]
3027 : REAL*8, PARAMETER :: RGH_MMN_ICE_LND = 0.05d0
3028 :
3029 : ! Roughness length over sea ice BKL97 p. F-3 [m]
3030 : REAL*8, PARAMETER :: RGH_MMN_ICE_OCN = 0.0005d0
3031 :
3032 : ! Roughness length over unfrozen lakes Bon96 p. 59 [m]
3033 : REAL*8, PARAMETER :: RGH_MMN_LAK_WRM = 0.001d0
3034 :
3035 : ! Roughness length over snow Bon96 p. 59 CCM:lsm/snoconi.F ! [m]
3036 : REAL*8, PARAMETER :: RGH_MMN_SNW = 0.04d0
3037 :
3038 : ! Minimum windspeed for momentum exchange
3039 : REAL*8, PARAMETER :: WND_MIN_DPS = 1.0d0
3040 :
3041 : !-----------------
3042 : ! Local variables
3043 : !-----------------
3044 :
3045 : ! [idx] Longitude index array (sea ice)
3046 0 : INTEGER :: ICE_IDX(HcoState%NX)
3047 :
3048 : ! [nbr] Number of sea ice points
3049 : INTEGER :: ICE_NBR
3050 :
3051 : ! [Idx] Counting index
3052 : INTEGER :: IDX_IDX
3053 :
3054 : ! [idx] Longitude index array (land)
3055 0 : INTEGER :: LND_IDX(HcoState%NX)
3056 :
3057 : ! [nbr] Number of land points
3058 : INTEGER :: LND_NBR
3059 :
3060 : ! [idx] Counting index
3061 : INTEGER :: LON_IDX
3062 :
3063 : ! [idx] Longitude index array (ocean)
3064 0 : INTEGER :: OCN_IDX(HcoState%NX)
3065 :
3066 : ! [nbr] Number of ocean points
3067 : INTEGER :: OCN_NBR
3068 :
3069 : ! [idx] Plant type index
3070 : INTEGER :: PLN_TYP_IDX
3071 :
3072 : ! [idx] Surface type index
3073 : INTEGER :: SFC_TYP_IDX
3074 :
3075 : ! [idx] Surface sub-gridscale index
3076 : INTEGER :: SGS_IDX
3077 :
3078 : ! [m] Roughness length of current sub-gridscale
3079 : REAL*8 :: RLM_CRR
3080 :
3081 : ! [m s-1] Bounded wind speed at 10 m
3082 : REAL*8 :: WND_10M_BND
3083 :
3084 : ! [frc] Neutral 10 m drag coefficient over ocean
3085 : REAL*8 :: XCH_CFF_MMN_OCN_NTR
3086 :
3087 : ! Momentum roughness length [m]
3088 : REAL*8 :: Z0MVT(MVT) = (/ 0.94d0, 0.77d0, 2.62d0, 1.10d0, 0.99d0,
3089 : & 0.06d0, 0.06d0, 0.06d0, 0.06d0, 0.06d0,
3090 : & 0.06d0, 0.06d0, 0.06d0, 0.00d0 /)
3091 :
3092 : ! Displacement height (fn of plant type)
3093 : REAL*8 :: ZPDVT(MVT) = (/ 11.39d0, 9.38d0, 23.45d0, 13.40d0,
3094 : & 12.06d0, 0.34d0, 0.34d0, 0.34d0,
3095 : & 0.34d0, 0.34d0, 0.34d0, 0.34d0,
3096 : & 0.34d0, 0.00d0 /)
3097 :
3098 : !=================================================================
3099 : ! RGH_MMN_GET begins here
3100 : !=================================================================
3101 0 : RGH_MMN(:) = 0.0D0
3102 :
3103 : ! Count ocean grid boxes
3104 0 : OCN_NBR = 0
3105 0 : DO LON_IDX = 1, HcoState%NX
3106 0 : IF ( ORO_IS_OCN( ORO(LON_IDX) ) ) THEN
3107 0 : OCN_NBR = OCN_NBR + 1
3108 0 : OCN_IDX(OCN_NBR) = LON_IDX
3109 : ENDIF
3110 : ENDDO
3111 :
3112 : ! Count ice grid boxes
3113 0 : ICE_NBR = 0
3114 0 : DO LON_IDX = 1, HcoState%NX
3115 0 : IF ( ORO_IS_ICE( ORO(LON_IDX) ) ) THEN
3116 0 : ICE_NBR = ICE_NBR+1
3117 0 : ICE_IDX(ICE_NBR) = LON_IDX
3118 : ENDIF
3119 : ENDDO
3120 :
3121 : ! Count land grid boxes
3122 0 : LND_NBR = 0
3123 0 : DO LON_IDX = 1, HcoState%NX
3124 0 : IF ( ORO_IS_LND( ORO(LON_IDX) ) ) THEN
3125 0 : LND_NBR = LND_NBR + 1
3126 0 : LND_IDX(LND_NBR) = LON_IDX
3127 : ENDIF
3128 : ENDDO
3129 :
3130 : !=================================================================
3131 : ! Ocean points
3132 : !=================================================================
3133 0 : DO IDX_IDX = 1, OCN_NBR
3134 :
3135 : ! Longitude index of the ocean point
3136 0 : LON_IDX = OCN_IDX(IDX_IDX)
3137 :
3138 : ! Convert wind speed to roughness length over ocean [m/s]
3139 0 : WND_10M_BND = MAX( WND_MIN_DPS, WND_10M(LON_IDX) )
3140 :
3141 : !Approximation: neutral 10 m wind speed unavailable,
3142 : ! use 10 m wind speed [fraction]
3143 0 : XCH_CFF_MMN_OCN_NTR = XCH_CFF_MMN_OCN_NTR_GET(WND_10M_BND)
3144 :
3145 : ! BKL97 p. F-4, LaP81 p. 327 (14) Ocean Points [m]
3146 : RGH_MMN(LON_IDX)=10.0D0
3147 0 : & * EXP(-CST_VON_KRM / SQRT(XCH_CFF_MMN_OCN_NTR))
3148 : ENDDO
3149 :
3150 : !=================================================================
3151 : ! Sea ice points
3152 : !=================================================================
3153 0 : DO IDX_IDX = 1, ICE_NBR
3154 0 : LON_IDX = ICE_IDX(IDX_IDX)
3155 0 : RGH_MMN(LON_IDX) = SNW_FRC(LON_IDX) * RGH_MMN_SNW
3156 0 : & +(1.0D0-SNW_FRC(LON_IDX)) * RGH_MMN_ICE_OCN ! [m] Bon96 p. 59
3157 : ENDDO
3158 :
3159 : !=================================================================
3160 : ! Land points
3161 : !=================================================================
3162 0 : DO IDX_IDX = 1, LND_NBR
3163 :
3164 : ! Longitude
3165 0 : LON_IDX = LND_IDX(IDX_IDX)
3166 :
3167 : ! Store surface blend for current gridpoint, sfc_typ(lon_idx)
3168 0 : SFC_TYP_IDX = SFC_TYP_SLC(LON_IDX)
3169 :
3170 : ! Inland lakes
3171 0 : IF ( SFC_TYP_IDX == 0 ) THEN
3172 :
3173 : !fxm: Add temperature input and so ability to discriminate warm
3174 : ! from frozen lakes here [m] Bon96 p. 59
3175 0 : RGH_MMN(LON_IDX) = RGH_MMN_LAK_WRM
3176 :
3177 : ! Land ice
3178 0 : ELSE IF ( SFC_TYP_IDX == 1 ) THEN
3179 :
3180 : ! [m] Bon96 p. 59
3181 : RGH_MMN(LON_IDX) = SNW_FRC(LON_IDX)*RGH_MMN_SNW
3182 0 : & + (1.0D0-SNW_FRC(LON_IDX))*RGH_MMN_ICE_LND
3183 :
3184 :
3185 : ! Normal land
3186 : ELSE
3187 0 : DO SGS_IDX = 1, 3
3188 :
3189 : ! Bare ground is pln_typ=14, ocean is pln_typ=0
3190 0 : PLN_TYP_IDX = Inst%PLN_TYP(SFC_TYP_IDX,SGS_IDX)
3191 :
3192 : ! Bare ground
3193 0 : IF ( PLN_TYP_IDX == 14 ) THEN
3194 :
3195 : ! Bon96 p. 59 (glacial ice is same as bare ground)
3196 : RLM_CRR = SNW_FRC(LON_IDX) * RGH_MMN_SNW
3197 0 : & + (1.0D0-SNW_FRC(LON_IDX)) * RGH_MMN_ICE_LND ! [m]
3198 :
3199 : ! Regular plant type
3200 0 : ELSE IF ( PLN_TYP_IDX > 0 ) THEN
3201 : RLM_CRR = SNW_FRC(LON_IDX) * RGH_MMN_SNW
3202 0 : & + (1.0D0-SNW_FRC(LON_IDX)) * Z0MVT(PLN_TYP_IDX)
3203 : ! [m] Bon96 p. 59
3204 :
3205 : ! Presumably ocean snuck through
3206 : ELSE
3207 : CALL HCO_ERROR(
3208 : & 'pln_typ_idx == 0', RC,
3209 0 : & THISLOC='RGH_MMN_GET' )
3210 : RETURN
3211 : ENDIF ! endif
3212 :
3213 : ! Roughness length for normal land
3214 : RGH_MMN(LON_IDX) = RGH_MMN(LON_IDX) ! [m]
3215 0 : & + Inst%PLN_FRC(SFC_TYP_IDX,SGS_IDX) ! [frc]
3216 0 : & * RLM_CRR ! [m]
3217 :
3218 : ENDDO
3219 : ENDIF
3220 : ENDDO
3221 :
3222 : ! Return w/ success
3223 0 : RC = HCO_SUCCESS
3224 :
3225 : ! Return to calling program
3226 : END SUBROUTINE RGH_MMN_GET
3227 :
3228 : !------------------------------------------------------------------------------
3229 :
3230 0 : SUBROUTINE SNW_FRC_GET( HcoState, SNW_HGT_LQD, SNW_FRC )
3231 : !
3232 : !******************************************************************************
3233 : ! Subroutine SNW_FRC_GET converts equivalent liquid water snow depth to
3234 : ! fractional snow cover. Uses the snow thickness -> fraction algorithm of
3235 : ! Bon96. (tdf bmy, 3/30/04)
3236 : !
3237 : ! Arguments as Input:
3238 : ! ===========================================================================
3239 : ! (1 ) snw_hgt_lqd (REAL*8) : Equivalent liquid water snow depth [m]
3240 : !
3241 : ! Arguments as Output:
3242 : ! ===========================================================================
3243 : ! (2 ) snw_frc (REAL*8 ) : Fraction of surface covered by snow
3244 : !
3245 : ! NOTES:
3246 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
3247 : ! with "D" exponents. (bmy, 3/30/04)
3248 : !******************************************************************************
3249 : !
3250 :
3251 : !----------------
3252 : ! Arguments
3253 : !----------------
3254 : TYPE(HCO_State), POINTER :: HcoState
3255 : REAL*8, INTENT(IN) :: SNW_HGT_LQD(HcoState%NX)
3256 : REAL*8, INTENT(OUT) :: SNW_FRC(HcoState%NX)
3257 :
3258 : !----------------
3259 : ! Parameters
3260 : !----------------
3261 :
3262 : ! Note disparity in bulk snow density between CCM and LSM
3263 : ! WiW80 p. 2724, 2725 has some discussion of bulk snow density
3264 : !
3265 : ! Bulk density of snow [kg m-3]
3266 : REAL*8, PARAMETER :: DNS_H2O_SNW_GND_LSM = 250.0D0
3267 :
3268 : ! Standard bulk density of snow on ground [kg m-3]
3269 : REAL*8, PARAMETER :: DNS_H2O_SNW_GND_STD = 100.0D0
3270 :
3271 : ! Geometric snow thickness for 100% coverage ! [m]
3272 : REAL*8, PARAMETER :: SNW_HGT_THR = 0.05D0
3273 :
3274 : ! Liquid water density! [kg/m3]
3275 : REAL*8, PARAMETER :: DNS_H2O_LQD_STD = 1000.0D0
3276 :
3277 : !-----------------
3278 : ! Local variables
3279 : !-----------------
3280 :
3281 : ! [idx] Counting index for lon
3282 : INTEGER :: LON_IDX
3283 :
3284 : ! [m] Geometric bulk thickness of snow
3285 0 : REAL*8 :: SNW_HGT(HcoState%NX)
3286 :
3287 : ! Conversion factor from liquid water depth
3288 : ! to geometric snow thickness [fraction]
3289 : REAL*8 :: HGT_LQD_SNW_CNV
3290 :
3291 : !=================================================================
3292 : ! SNW_FRC_GET begins here!
3293 : !=================================================================
3294 :
3295 : ! Conversion factor from liquid water depth to
3296 : ! geometric snow thickness [fraction]
3297 : HGT_LQD_SNW_CNV = DNS_H2O_LQD_STD
3298 0 : & / DNS_H2O_SNW_GND_STD
3299 :
3300 : ! Fractional snow cover
3301 0 : DO LON_IDX = 1, HcoState%NX
3302 :
3303 : ! Snow height [m]
3304 0 : SNW_HGT(LON_IDX) = SNW_HGT_LQD(LON_IDX)
3305 0 : & * HGT_LQD_SNW_CNV
3306 :
3307 : ! Snow fraction
3308 : ! NB: CCM and LSM seem to disagree on this
3309 0 : SNW_FRC(LON_IDX) = MIN(SNW_HGT(LON_IDX)/SNW_HGT_THR, 1.0D0)
3310 : ENDDO
3311 :
3312 : ! Return to calling program
3313 0 : END SUBROUTINE SNW_FRC_GET
3314 :
3315 : !------------------------------------------------------------------------------
3316 :
3317 : SUBROUTINE WND_RFR_GET( HcoState, FLG_ORO, HGT_MDP, HGT_RFR,
3318 : & HGT_ZPD, MNO_LNG, WND_FRC, WND_MDP,
3319 : & WND_MIN, WND_RFR )
3320 : !
3321 : !******************************************************************************
3322 : ! Subroutine WND_RFR_GET interpolates wind speed at given height to wind
3323 : ! speed at reference height. (tdf, bmy, 3/30/04)
3324 : !
3325 : ! Arguments as Input:
3326 : ! ===========================================================================
3327 : ! (1 ) FLG_ORO (LOGICAL) : Orography flag (mobilization flag) [flag]
3328 : ! (2 ) HGT_MDP (REAL*8 ) : Midpoint height above surface [m ]
3329 : ! (3 ) HGT_RFR (REAL*8 ) : Reference height [m ]
3330 : ! (4 ) HGT_ZPD (REAL*8 ) : Zero plane displacement [m ]
3331 : ! (5 ) MNO_LNG (REAL*8 ) : Monin-Obukhov length [m ]
3332 : ! (6 ) WND_FRC (REAL*8 ) : Surface friction velocity [m/s ]
3333 : ! (7 ) WND_MDP (REAL*8 ) : Surface layer mean wind speed [m/s ]
3334 : ! (8 ) WND_MIN (REAL*8 ) : Minimum windspeed [m/s ]
3335 : !
3336 : ! Arguments as Output:
3337 : ! ===========================================================================
3338 : ! (9 ) WND_RFR (REAL*8 ) : Wind speed at reference height [m/s ]
3339 : !
3340 : ! NOTES:
3341 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
3342 : ! with "D" exponents. (bmy, 3/30/04)
3343 : !******************************************************************************
3344 : !
3345 :
3346 : !------------------
3347 : ! Arguments
3348 : !------------------
3349 : TYPE(HCO_State), POINTER :: HcoState
3350 : LOGICAL, INTENT(IN) :: FLG_ORO(HcoState%NX)
3351 : REAL*8, INTENT(IN) :: HGT_MDP(HcoState%NX)
3352 : REAL*8, INTENT(IN) :: HGT_RFR
3353 : REAL*8, INTENT(IN) :: HGT_ZPD(HcoState%NX)
3354 : REAL*8, INTENT(IN) :: MNO_LNG(HcoState%NX)
3355 : REAL*8, INTENT(IN) :: WND_FRC(HcoState%NX)
3356 : REAL*8, INTENT(IN) :: WND_MDP(HcoState%NX)
3357 : REAL*8, INTENT(IN) :: WND_MIN
3358 : REAL*8, INTENT(OUT) :: WND_RFR(HcoState%NX)
3359 :
3360 : !------------------
3361 : ! Parameters
3362 : !------------------
3363 :
3364 : ! Named index for lower (target) hght
3365 : INTEGER, PARAMETER :: RFR_HGT_IDX=1
3366 :
3367 : ! Named index for upper (known) hght
3368 : INTEGER, PARAMETER :: GCM_HGT_IDX=2
3369 :
3370 : !------------------
3371 : ! Local variables
3372 : !------------------
3373 :
3374 : ! [idx] Counting index
3375 : INTEGER :: IDX_IDX
3376 :
3377 : ! [idx] Counting index for lon
3378 : INTEGER :: LON_IDX
3379 :
3380 : ! Stability computation loop index
3381 : INTEGER :: LVL_IDX
3382 :
3383 : ! Valid indices
3384 : INTEGER :: VLD_IDX(HcoState%NX)
3385 :
3386 : ! [nbr] Number of valid indices
3387 : INTEGER :: VLD_NBR
3388 :
3389 : ! [frc] Monin-Obukhov stability correction momentum
3390 : REAL*8 :: MNO_STB_CRC_MMN(HcoState%NX,2)
3391 :
3392 : ! [frc] Monin-Obukhov stability parameter
3393 : REAL*8 :: MNO_STB_PRM(HcoState%NX,2)
3394 :
3395 : ! [frc] Reciprocal of similarity function
3396 : ! for momentum, unstable atmosphere
3397 : REAL*8 :: SML_FNC_MMN_UNS_RCP
3398 :
3399 : ! Term in stability correction computation
3400 : REAL*8 :: TMP2
3401 :
3402 : ! Term in stability correction computation
3403 : REAL*8 :: TMP3
3404 :
3405 : ! Term in stability correction computation
3406 : REAL*8 :: TMP4
3407 :
3408 : ! [frc] Wind correction factor
3409 : REAL*8 :: WND_CRC_FCT(HcoState%NX)
3410 :
3411 : ! [m-1] Reciprocal of reference height
3412 : REAL*8 :: HGT_RFR_RCP
3413 :
3414 : !=================================================================
3415 : ! WND_RFR_GET begins here!
3416 : !=================================================================
3417 :
3418 : HGT_RFR_RCP = 1.0D0 / HGT_RFR ! [m-1]
3419 : WND_RFR = WND_MIN ! [m s-1]
3420 :
3421 : ! Compute horizontal wind speed at reference height
3422 : DO LON_IDX = 1, HcoState%NX
3423 : IF (FLG_ORO(LON_IDX) .AND. HGT_ZPD(LON_IDX) < HGT_RFR) THEN
3424 :
3425 : ! Code uses notation of Bon96 p. 50, where lvl_idx=1
3426 : ! is 10 m ref. hgt, lvl_idx=2 is atm. hgt
3427 : MNO_STB_PRM(LON_IDX,RFR_HGT_IDX) =
3428 : & MIN((HGT_RFR-HGT_ZPD(LON_IDX))
3429 : & /MNO_LNG(LON_IDX),1.0D0) ! [frc]
3430 :
3431 : MNO_STB_PRM(LON_IDX,GCM_HGT_IDX) =
3432 : & MIN((HGT_MDP(LON_IDX)-HGT_ZPD(LON_IDX))
3433 : & /MNO_LNG(LON_IDX),1.0D0) ! [frc]
3434 :
3435 : DO LVL_IDX = 1, 2
3436 : IF (MNO_STB_PRM(LON_IDX,LVL_IDX) < 0.0D0) THEN
3437 : SML_FNC_MMN_UNS_RCP = (1.0D0 - 16.0D0
3438 : & * MNO_STB_PRM(LON_IDX,LVL_IDX))**0.25D0
3439 : TMP2 = LOG((1.0D0 + SML_FNC_MMN_UNS_RCP
3440 : & * SML_FNC_MMN_UNS_RCP)/2.0D0)
3441 : TMP3 = LOG((1.0D0 + SML_FNC_MMN_UNS_RCP)/2.0D0)
3442 : MNO_STB_CRC_MMN(LON_IDX,LVL_IDX) =
3443 : & 2.0D0 * TMP3 + TMP2 - 2.0D0
3444 : & * ATAN(SML_FNC_MMN_UNS_RCP) + 1.5707963
3445 : ELSE ! not stable
3446 : MNO_STB_CRC_MMN(LON_IDX,LVL_IDX) = -5.0D0
3447 : & * MNO_STB_PRM(LON_IDX,LVL_IDX)
3448 : ENDIF ! stable
3449 : ENDDO ! end loop over lvl_idx
3450 :
3451 : TMP4 = LOG( (HGT_MDP(LON_IDX)-HGT_ZPD(LON_IDX))
3452 : & / (HGT_RFR-HGT_ZPD(LON_IDX)) )
3453 :
3454 : ! Correct neutral stability assumption
3455 : WND_CRC_FCT(LON_IDX) = TMP4
3456 : & - MNO_STB_CRC_MMN(LON_IDX,GCM_HGT_IDX)
3457 : & + MNO_STB_CRC_MMN(LON_IDX,RFR_HGT_IDX) ! [frc]
3458 : WND_RFR(LON_IDX) = WND_MDP(LON_IDX)-WND_FRC(LON_IDX)
3459 : & * CST_VON_KRM_RCP * WND_CRC_FCT(LON_IDX) ! [m s-1]
3460 : WND_RFR(LON_IDX) = MAX(WND_RFR(LON_IDX),WND_MIN) ! [m s-1]
3461 : ENDIF
3462 : ENDDO
3463 :
3464 : ! Return to calling program
3465 : END SUBROUTINE WND_RFR_GET
3466 :
3467 : !------------------------------------------------------------------------------
3468 :
3469 0 : SUBROUTINE WND_FRC_THR_SLT_GET( HcoState, FLG_MBL,
3470 0 : & DNS_MDP, WND_FRC_THR_SLT, RC )
3471 : !
3472 : !******************************************************************************
3473 : ! Subroutine WND_FRC_THR_SLT_GET ccmputes the dry threshold friction velocity
3474 : ! for saltation -- See Zender et al. expression (1) (tdf, bmy, 3/30/04)
3475 : !
3476 : ! Arguments as Input:
3477 : ! ===========================================================================
3478 : ! (1 ) FLG_MBL (LOGICAL) : mobilisation flag
3479 : ! (2 ) DNS_MDP (REAL*8 ) : Midlayer density [kg/m3]
3480 : !
3481 : ! Arguments as Output:
3482 : ! ===========================================================================
3483 : ! (3 ) WND_FRC_THR_SLT (REAL*8 ) : Threshold friction velocity
3484 : ! for saltation [m/s]
3485 : !
3486 : ! NOTES:
3487 : ! (1 ) Updated comments, cosmetic changes. Also now force double-precision
3488 : ! with "D" exponents. (bmy, 3/30/04)
3489 : !******************************************************************************
3490 : !
3491 :
3492 : !----------------
3493 : ! Arguments
3494 : !----------------
3495 : TYPE(HCO_State), POINTER :: HcoState
3496 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
3497 : REAL*8, INTENT(IN) :: DNS_MDP(HcoState%NX)
3498 : REAL*8, INTENT(OUT) :: WND_FRC_THR_SLT(HcoState%NX)
3499 : INTEGER, INTENT(INOUT) :: RC
3500 :
3501 : !-----------------
3502 : ! Parameters
3503 : !-----------------
3504 :
3505 : ! [m] Optimal diameter for saltation,
3506 : ! IvW82 p. 117 Fgr. 8, Pye87 p. 31, MBA97 p. 4388, SRL96 (2)
3507 : REAL*8, PARAMETER :: DMT_SLT_OPT = 75.0d-6
3508 :
3509 : ! [kg m-3] Density of optimal saltation particles,
3510 : ! MBA97 p. 4388 friction velocity for saltation
3511 : REAL*8, PARAMETER :: DNS_SLT = 2650.0d0
3512 :
3513 : !-----------------
3514 : ! Local variables
3515 : !-----------------
3516 :
3517 : ! [idx] Longitude Counting Index
3518 : INTEGER :: LON_IDX
3519 :
3520 : ! Threshold friction Reynolds number
3521 : ! approximation for optimal size [frc]
3522 : REAL*8 :: RYN_NBR
3523 :
3524 : ! Density ratio factor for saltation calculation
3525 : REAL*8 :: DNS_FCT
3526 :
3527 : ! Interparticle cohesive forces factor for saltation calculation
3528 : REAL*8 :: ALPHA, BETA, GAMMA, TMP1
3529 :
3530 :
3531 : !=================================================================
3532 : ! WND_FRC_THR_SLT_GET begins here!
3533 : !=================================================================
3534 :
3535 : ! Initialize some variables
3536 : ! MaB95 pzn. for Re*t(D_opt) circumvents iterative solution
3537 : ! [frc] "B" MaB95 p. 16417 (5)
3538 :
3539 : ! [m/s] Threshold velocity
3540 0 : WND_FRC_THR_SLT(:) = 0.0D0
3541 :
3542 : ! Threshold friction Reynolds number approximation for optimal size
3543 : RYN_NBR = 0.38D0 + 1331.0D0
3544 0 : & * (100.0D0*DMT_SLT_OPT)**1.56D0
3545 :
3546 : ! tdf NB conversion of Dp to [cm]
3547 : ! Given Re*t(D_opt), compute time independent factors contributing
3548 : ! to u*t. IvW82 p. 115 (6) MaB95 p. 16417 (4) Interparticle cohesive
3549 : ! forces. see Zender et al., Equ. (1).
3550 :
3551 : ! tdf introduced beta [fraction]
3552 0 : BETA = 1.0D0+6.0D-07 / (DNS_SLT*GRV_SFC*(DMT_SLT_OPT**2.5D0))
3553 :
3554 : ! IvW82 p. 115 (6) MaB95 p. 16417 (4)
3555 0 : DNS_FCT = DNS_SLT * GRV_SFC * DMT_SLT_OPT
3556 :
3557 : ! Error check
3558 : IF ( RYN_NBR < 0.03D0 ) THEN
3559 : CALL HCO_ERROR ( 'RYN_NBR < 0.03', RC,
3560 : & THISLOC='WND_FRC_THR_SLT_GET' )
3561 : RETURN
3562 :
3563 : ELSE IF ( RYN_NBR < 10.0D0 ) THEN
3564 :
3565 : ! IvW82 p. 114 (3), MaB95 p. 16417 (6)
3566 : ! tdf introduced gamma [fraction]
3567 0 : GAMMA = -1.0D0 + 1.928D0 * (RYN_NBR**0.0922D0)
3568 : TMP1 = 0.129D0*0.129D0 * BETA / GAMMA
3569 :
3570 : ELSE
3571 :
3572 : ! ryn_nbr > 10.0D0
3573 : ! IvW82 p. 114 (3), MaB95 p. 16417 (7)
3574 : ! tdf introduced gamma [fraction]
3575 : GAMMA = 1.0D0-0.0858D0 * EXP(-0.0617D0*(RYN_NBR-10.0D0))
3576 : TMP1 = 0.12D0*0.12D0 * BETA * GAMMA * GAMMA
3577 :
3578 : ENDIF
3579 :
3580 0 : DO LON_IDX = 1, HcoState%NX
3581 :
3582 : ! Threshold friction velocity for saltation dry ground
3583 : ! tdf introduced alpha
3584 0 : ALPHA = DNS_FCT / DNS_MDP(LON_IDX)
3585 :
3586 : ! Added mobilisation constraint
3587 0 : IF ( FLG_MBL(LON_IDX) ) THEN
3588 0 : WND_FRC_THR_SLT(LON_IDX) = SQRT(TMP1) * SQRT(ALPHA) ! [m s-1]
3589 : ENDIF
3590 : ENDDO
3591 :
3592 : ! Return w/ success
3593 0 : RC = HCO_SUCCESS
3594 :
3595 : END SUBROUTINE WND_FRC_THR_SLT_GET
3596 :
3597 : !------------------------------------------------------------------------------
3598 :
3599 : SUBROUTINE WND_RFR_THR_SLT_GET( HcoState, WND_FRC,
3600 : & WND_FRC_THR_SLT, WND_MDP, WND_RFR,
3601 : & WND_RFR_THR_SLT )
3602 : !
3603 : !******************************************************************************
3604 : ! Subroutine WND_RFR_THR_SLT_GET computes the threshold horizontal wind
3605 : ! speed at reference height for saltation. (tdf, bmy, 3/30/04)
3606 : !
3607 : ! Arguments as Input:
3608 : ! ============================================================================
3609 : ! (1 ) wnd_frc (REAL*8) : Surface friction velocity [m/s]
3610 : ! (2 ) wnd_frc_thr_slt (REAL*8) : Threshold friction vel. for saltation [m/s]
3611 : ! (3 ) wnd_mdp (REAL*8) : Surface layer mean wind speed [m/s]
3612 : ! (4 ) wnd_rfr (REAL*8) : Wind speed at reference height [m/s]
3613 : !
3614 : ! Arguments as Output:
3615 : ! ============================================================================
3616 : ! (5 ) wnd_rfr_thr_slt (REAL*8) : Threshold 10m wind speed for saltation [m/s]
3617 : !
3618 : ! NOTES:
3619 : ! (1 ) Updated comments, cosmetic changes.
3620 : !******************************************************************************
3621 : !
3622 : ! Arguments
3623 : TYPE(HCO_State), POINTER :: HcoState
3624 : REAL*8, INTENT(IN) :: WND_FRC(HcoState%NX)
3625 : REAL*8, INTENT(IN) :: WND_FRC_THR_SLT(HcoState%NX)
3626 : REAL*8, INTENT(IN) :: WND_MDP(HcoState%NX)
3627 : REAL*8, INTENT(IN) :: WND_RFR(HcoState%NX)
3628 : REAL*8, INTENT(OUT) :: WND_RFR_THR_SLT(HcoState%NX)
3629 :
3630 : ! Local variables
3631 : INTEGER :: I
3632 :
3633 : !=================================================================
3634 : ! WND_RFR_THR_SLT_GET begins here
3635 : !=================================================================
3636 : DO I = 1, HcoState%NX
3637 :
3638 : ! A more complicated procedure would recompute mno_lng for
3639 : ! wnd_frc_thr, and then integrate vertically from rgh_mmn+hgt_zpd
3640 : ! to hgt_rfr.
3641 : !
3642 : ! wnd_crc_fct is (1/k)*[ln(z-D)/z0 - psi(zeta2) + psi(zeta1)]
3643 : WND_RFR_THR_SLT(I) = WND_FRC_THR_SLT(I)
3644 : & * WND_RFR(I) / WND_FRC(I)
3645 :
3646 : ENDDO
3647 :
3648 : ! Return to calling program
3649 : END SUBROUTINE WND_RFR_THR_SLT_GET
3650 :
3651 : !------------------------------------------------------------------------------
3652 :
3653 0 : SUBROUTINE VWC2GWC( HcoState, FLG_MBL, GWC_SFC, VWC_SAT, VWC_SFC )
3654 : !
3655 : !******************************************************************************
3656 : ! Subroutine VWC2GWC converts volumetric water content to gravimetric water
3657 : ! content -- assigned only for mobilisation candidates. (tdf, bmy, 3/30/04)
3658 : !
3659 : ! Arguments as Input:
3660 : ! ===========================================================================
3661 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [flag]
3662 : ! (3 ) VWC_SAT (REAL*8 ) : Saturated VWC (sand-dependent) [m3/m3]
3663 : ! (4 ) VWC_SFC (REAL*8 ) : Volumetric water content! [m3/m3
3664 : !
3665 : ! Arguments as Output:
3666 : ! ===========================================================================
3667 : ! (2 ) gwc_sfc (REAL*8 ) : Gravimetric water content [kg/kg]
3668 : !
3669 : ! NOTES:
3670 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
3671 : ! with "D" exponents. (tdf, bmy, 3/30/04)
3672 : !******************************************************************************
3673 : !
3674 :
3675 : !----------------
3676 : ! Arguments
3677 : !----------------
3678 : TYPE(HCO_State), POINTER :: HcoState
3679 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
3680 : REAL*8, INTENT(IN) :: VWC_SAT(HcoState%NX)
3681 : REAL*8, INTENT(IN) :: VWC_SFC(HcoState%NX)
3682 : REAL*8, INTENT(OUT) :: GWC_SFC(HcoState%NX)
3683 :
3684 : !----------------
3685 : ! Parameters
3686 : !----------------
3687 :
3688 : ! Dry density of soil ! particles (excluding pores) [kg/m3]
3689 : REAL*8, PARAMETER :: DNS_PRT_SFC = 2650.0d0
3690 :
3691 : ! liq. H2O density [kg/m3]
3692 : REAL*8, PARAMETER :: DNS_H2O_LQD_STD = 1000.0d0
3693 :
3694 : !-----------------
3695 : ! Local variables
3696 : !-----------------
3697 :
3698 : ! Longitude index
3699 : INTEGER :: LON_IDX
3700 :
3701 : ! [kg m-3] Bulk density of dry surface soil
3702 0 : REAL*8 :: DNS_BLK_DRY(HcoState%NX)
3703 :
3704 : !=================================================================
3705 : ! VWC2GWC begins here!
3706 : !=================================================================
3707 0 : GWC_SFC(:) = 0.0D0
3708 0 : DNS_BLK_DRY(:) = 0.0D0
3709 :
3710 : ! Loop over longitudes
3711 0 : DO LON_IDX = 1, HcoState%NX
3712 :
3713 : ! If this is a mobilization candidate then...
3714 0 : IF ( FLG_MBL(LON_IDX) ) THEN
3715 :
3716 : ! Assume volume of air pores when dry equals saturated VWC
3717 : ! This implies air pores are completely filled by water in
3718 : ! saturated soil
3719 :
3720 : ! Bulk density of dry surface soil [kg m-3]
3721 : DNS_BLK_DRY(LON_IDX) = DNS_PRT_SFC
3722 0 : & * ( 1.0d0 - VWC_SAT(LON_IDX) )
3723 :
3724 : ! Gravimetric water content [ kg kg-1]
3725 : GWC_SFC(LON_IDX) = VWC_SFC(LON_IDX)
3726 : & * DNS_H2O_LQD_STD
3727 0 : & / DNS_BLK_DRY(LON_IDX)
3728 :
3729 : ENDIF
3730 : ENDDO
3731 :
3732 : ! Return to calling program
3733 0 : END SUBROUTINE VWC2GWC
3734 :
3735 : !------------------------------------------------------------------------------
3736 :
3737 0 : SUBROUTINE FRC_THR_NCR_WTR_GET( HcoState, FLG_MBL,
3738 0 : & FRC_THR_NCR_WTR, MSS_FRC_CLY_SLC, GWC_SFC )
3739 : !
3740 : !******************************************************************************
3741 : ! Subroutine FRC_THR_NCR_WTR_GET computes the factor by which soil moisture
3742 : ! increases threshold friction velocity. This parameterization is based on
3743 : ! FMB99. Zender et al., exp. (5). (tdf, bmy, 4/5/04)
3744 : !
3745 : ! Arguments as Input:
3746 : ! ===========================================================================
3747 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [flags ]
3748 : ! (3 ) MSS_FRC_CLY (REAL*8 ) : Mass fraction of clay [fraction]
3749 : ! (4 ) GWC_SFC (REAL*8 ) : Gravimetric water content [kg/kg ]
3750 : !
3751 : ! Arguments as Output:
3752 : ! ===========================================================================
3753 : ! (2 ) FRC_THR_NCR_WTR (REAL*8 ) : Factor by which moisture increases
3754 : ! threshold friction velocity [fraction]
3755 : !
3756 : ! NOTES:
3757 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
3758 : ! with "D" exponents. (tdf, bmy, 4/5/04)
3759 : !******************************************************************************
3760 : !
3761 :
3762 : ! Arguments
3763 : TYPE(HCO_State), POINTER :: HcoState
3764 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
3765 : REAL*8, INTENT(IN) :: MSS_FRC_CLY_SLC(HcoState%NX)
3766 : REAL*8, INTENT(IN) :: GWC_SFC(HcoState%NX)
3767 : REAL*8, INTENT(OUT) :: FRC_THR_NCR_WTR(HcoState%NX)
3768 :
3769 : ! local variables
3770 : INTEGER :: LON_IDX ! [idx] Counting index
3771 0 : REAL*8 :: GWC_THR(HcoState%NX) ! [kg/kg] Threshold GWC
3772 :
3773 : !=================================================================
3774 : ! FRC_THR_NCR_WTR_GET begins here!
3775 : !=================================================================
3776 :
3777 : ! Initialize
3778 0 : frc_thr_ncr_wtr(:) = 1.0D0
3779 0 : gwc_thr(:) = 0.0D0
3780 :
3781 : ! Loop over longitudes
3782 0 : DO LON_IDX = 1, HcoState%NX
3783 :
3784 : ! If this is a candidate for mobilization...
3785 0 : IF ( FLG_MBL(LON_IDX) ) THEN
3786 :
3787 : !===========================================================
3788 : ! Adjust threshold velocity for inhibition by moisture
3789 : ! frc_thr_ncr_wtr(lon_idx)=exp(22.7D0*vwc_sfc(lon_idx))
3790 : ! [frc] SRL96
3791 : !
3792 : ! Compute threshold soil moisture based on clay content
3793 : ! GWC_THR=MSS_FRC_CLY*(0.17D0+0.14D0*MSS_FRC_CLY) [m3/m3]
3794 : ! FMB99 p. 155 (14)
3795 : !
3796 : ! 19991105 remove factor of mss_frc_cly from gwc_thr to
3797 : ! improve large scale behavior.
3798 : !===========================================================
3799 :
3800 : ! [m3 m-3]
3801 0 : GWC_THR(LON_IDX) = 0.17D0 + 0.14D0* MSS_FRC_CLY_SLC(LON_IDX)
3802 :
3803 0 : IF ( GWC_SFC(LON_IDX) > GWC_THR(LON_IDX) )
3804 : & FRC_THR_NCR_WTR(LON_IDX) = SQRT(1.0D0+1.21D0
3805 : & * (100.0D0 * (GWC_SFC(LON_IDX)-GWC_THR(LON_IDX)))
3806 0 : & ** 0.68D0) ! [frc] FMB99 p. 155 (15)
3807 : ENDIF
3808 : ENDDO
3809 :
3810 : ! Return to calling program
3811 0 : END SUBROUTINE FRC_THR_NCR_WTR_GET
3812 :
3813 : !------------------------------------------------------------------------------
3814 :
3815 : SUBROUTINE FRC_THR_NCR_DRG_GET( HcoState, FRC_THR_NCR_DRG,
3816 : & FLG_MBL, Z0M, ZS0M, RC )
3817 : !
3818 : !******************************************************************************
3819 : ! Subroutine FRC_THR_NCR_DRG_GET computes factor by which surface roughness
3820 : ! increases threshold friction velocity. Zender et al., expression (3)
3821 : ! This parameterization is based on MaB95 and GMB98. (tdf, bmy, 4/5/04)
3822 : !
3823 : ! Arguments as Input:
3824 : ! ===========================================================================
3825 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag
3826 : ! (3 ) Z0M (REAL*8 ) : Roughness length momentum
3827 : ! : for erodible surfaces [m]
3828 : ! (4 ) ZS0M (REAL*8 ) : Smooth roughness length [m]
3829 : !
3830 : ! Arguments as Output:
3831 : ! ===========================================================================
3832 : ! (1 ) FRC_THR_NCR_DRG (REAL*8 ) : Factor by which surface roughness
3833 : ! increases threshold fric. velocity [frac]
3834 : !
3835 : ! NOTES:
3836 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
3837 : ! with "D" exponents. (tdf, bmy, 4/5/04)
3838 : !******************************************************************************
3839 : !
3840 :
3841 : !-----------------
3842 : ! Arguments
3843 : !-----------------
3844 : TYPE(HCO_State), POINTER :: HcoState
3845 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
3846 : REAL*8, INTENT(IN) :: Z0M
3847 : REAL*8, INTENT(IN) :: ZS0M
3848 : REAL*8, INTENT(OUT) :: FRC_THR_NCR_DRG(HcoState%NX)
3849 : INTEGER, INTENT(INOUT) :: RC
3850 :
3851 : !-----------------
3852 : ! Local variables
3853 : !-----------------
3854 :
3855 : ! [idx] Counting index
3856 : integer lon_idx
3857 :
3858 : ! [frc] Efficient fraction of wind friction
3859 : real*8 Feff
3860 :
3861 : ! [frc] Reciprocal of Feff
3862 : real*8 Feff_rcp
3863 :
3864 : ! for error handling
3865 : CHARACTER(LEN=255) :: MSG
3866 :
3867 : !=================================================================
3868 : ! FRC_THR_NCR_DRG_GET begins here!
3869 : !=================================================================
3870 :
3871 : FRC_THR_NCR_DRG(:) = 1.0D0
3872 :
3873 : ! Adjust threshold velocity for inhibition by roughness elements
3874 : ! Zender et al. Equ. (3), fd.
3875 :
3876 : ! [frc] MaB95 p. 16420, GMB98 p. 6207
3877 : FEFF = 1.0D0 - LOG( Z0M /ZS0M )
3878 : & / LOG( 0.35D0*( (0.1D0/ZS0M)**0.8D0) )
3879 :
3880 : ! Error check
3881 : if ( FEFF <= 0.0D0 .OR. FEFF > 1.0D0 ) THEN
3882 : MSG = 'Feff out of range!'
3883 : CALL HCO_ERROR(MSG, RC,
3884 : & THISLOC='FRC_THR_NC_DRG_GET' )
3885 : RETURN
3886 : ENDIF
3887 :
3888 : ! Reciprocal of FEFF [fraction]
3889 : FEFF_RCP = 1.0D0 / FEFF
3890 :
3891 : ! Loop over longitudes
3892 : DO LON_IDX = 1, HcoState%NX
3893 :
3894 : ! If this is a mobilization candidate...
3895 : IF ( FLG_MBL(LON_IDX) ) THEN
3896 :
3897 : ! Save into FRC_THR_NCR_DRG
3898 : FRC_THR_NCR_DRG(LON_IDX) = FEFF_RCP
3899 :
3900 : ! fxm: 19991012
3901 : ! Set frc_thr_ncr_drg=1.0, equivalent to assuming mobilization
3902 : ! takes place at smooth roughness length
3903 : FRC_THR_NCR_DRG(LON_IDX) = 1.0D0
3904 :
3905 : ENDIF
3906 : ENDDO
3907 :
3908 : ! Return w/ success
3909 : RC = HCO_SUCCESS
3910 :
3911 : END SUBROUTINE FRC_THR_NCR_DRG_GET
3912 :
3913 : !------------------------------------------------------------------------------
3914 :
3915 0 : SUBROUTINE WND_FRC_SLT_GET( HcoState, FLG_MBL, WND_FRC,
3916 0 : & WND_FRC_SLT, WND_RFR, WND_RFR_THR_SLT)
3917 : !
3918 : !******************************************************************************
3919 : ! Subroutine WND_FRC_SLT_GET computes the saltating friction velocity.
3920 : ! Saltation increases friction speed by roughening surface, AKA "Owen's
3921 : ! effect". This acts as a positive feedback to the friction speed. GMB98
3922 : ! parameterized this feedback in terms of 10 m windspeeds, Zender et al.
3923 : ! equ. (4). (tdf, bmy, 4/5/04, 1/25/07)
3924 : !
3925 : ! Arguments as Input:
3926 : ! ===========================================================================
3927 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag
3928 : ! (2 ) WND_FRC (REAL*8 ) : Surface friction velocity [m/s]
3929 : ! (4 ) WND_RFR (REAL*8 ) : Wind speed at reference height [m/s]
3930 : ! (5 ) WND_RFR_THR_SLT (REAL*8 ) : Thresh. 10m wind speed for saltation [m/s]
3931 : !
3932 : ! Arguments as Output:
3933 : ! ===========================================================================
3934 : ! (3 ) WND_FRC_SLT (REAL*8 ) : Saltating friction velocity [m/s]
3935 : !
3936 : ! NOTES:
3937 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
3938 : ! with "D" exponents. (tdf, bmy, 4/5/04)
3939 : ! (2 ) Now eliminate Owen effect (tdf, bmy, 1/25/07)
3940 : !******************************************************************************
3941 : !
3942 :
3943 : !-------------------
3944 : ! Arguments
3945 : !-------------------
3946 : TYPE(HCO_State), POINTER :: HcoState
3947 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
3948 : REAL*8, INTENT(IN) :: WND_FRC(HcoState%NX)
3949 : REAL*8, INTENT(IN) :: WND_RFR(HcoState%NX)
3950 : REAL*8, INTENT(IN) :: WND_RFR_THR_SLT(HcoState%NX)
3951 : REAL*8, INTENT(OUT) :: WND_FRC_SLT(HcoState%NX)
3952 :
3953 : !-------------------
3954 : ! Local variables
3955 : !-------------------
3956 :
3957 : ! [idx] Counting index
3958 : INTEGER :: LON_IDX
3959 :
3960 : !---------------------------------------------------------------------
3961 : ! Prior to 1/25/07:
3962 : ! Eliminate Owen effect, so comment out this code (tdf, bmy, 1/25/07)
3963 : !
3964 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
3965 : !
3966 : !! [m/s] Reference windspeed excess over threshold
3967 : !REAL*8 :: WND_RFR_DLT
3968 : !
3969 : !! [m/s] Friction velocity increase from saltation
3970 : !REAL*8 :: WND_FRC_SLT_DLT
3971 : !---------------------------------------------------------------------
3972 :
3973 : !=================================================================
3974 : ! WND_FRC_SLT_GET begins here!
3975 : !=================================================================
3976 :
3977 : ! [m/s] Saltating friction velocity
3978 0 : WND_FRC_SLT(:) = WND_FRC(:)
3979 :
3980 : !------------------------------------------------------------------------------
3981 : ! Prior to 1/25/07:
3982 : ! Eliminate the Owen effect. Note that the more computationally
3983 : ! efficient way to do this is to just comment out the entire IF block.
3984 : ! (tdf, bmy, 1/25/07)
3985 : !
3986 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
3987 : !
3988 : ! ! Loop over longitudes
3989 : ! DO LON_IDX = 1, HcoState%NX
3990 : !
3991 : ! ! If this is a mobilization candidate, then only
3992 : ! ! only apply Owen effect only when Uref > Ureft (tdf 4/5/04)
3993 : ! IF ( FLG_MBL(LON_IDX) .AND.
3994 : ! & WND_RFR(LON_IDX) >= WND_RFR_THR_SLT(LON_IDX) ) THEN
3995 : !
3996 : ! !==================================================================
3997 : ! ! Saltation roughens the boundary layer, AKA "Owen's effect"
3998 : ! ! GMB98 p. 6206 Fig. 1 shows observed/computed u* dependence
3999 : ! ! on observed U(1 m). GMB98 p. 6209 (12) has u* in cm s-1 and
4000 : ! ! U, Ut in m s-1, personal communication, D. Gillette, 19990529
4001 : ! ! With everything in MKS, the 0.3 coefficient in GMB98 (12)
4002 : ! ! becomes 0.003. Increase in friction velocity due to saltation
4003 : ! ! varies as square of difference between reference wind speed
4004 : ! ! and reference threshold speed.
4005 : ! !==================================================================
4006 : ! WND_RFR_DLT = WND_RFR(LON_IDX) - WND_RFR_THR_SLT(LON_IDX)
4007 : !
4008 : ! ! Friction velocity increase from saltation GMB98 p. 6209 [m/s]
4009 : ! wnd_frc_slt_dlt = 0.003D0 * wnd_rfr_dlt * wnd_rfr_dlt
4010 : !
4011 : ! ! Saltation friction velocity, U*,s, Zender et al. Equ. (4).
4012 : ! WND_FRC_SLT(LON_IDX) = WND_FRC(LON_IDX)
4013 : ! & + WND_FRC_SLT_DLT ! [m s-1]
4014 : !
4015 : ! !
4016 : !ctdf Eliminate Owen effect tdf 01/13/2K5
4017 : ! wnd_frc_slt(:) = wnd_frc(:)
4018 : !
4019 : ! ENDIF
4020 : ! ENDDO
4021 : !------------------------------------------------------------------------------
4022 :
4023 : ! Return to calling program
4024 0 : END SUBROUTINE WND_FRC_SLT_GET
4025 :
4026 : !------------------------------------------------------------------------------
4027 :
4028 : SUBROUTINE FLX_MSS_CACO3_MSK( HcoState, ExtState,
4029 : & DMT_VWR,
4030 : & FLG_MBL,
4031 : & FLX_MSS_VRT_DST_CACO3,
4032 : & MSS_FRC_CACO3_SLC,
4033 : & MSS_FRC_CLY_SLC,
4034 : & MSS_FRC_SND_SLC, RC )
4035 : !
4036 : !******************************************************************************
4037 : ! Subroutine FLX_MSS_CACO3_MSK masks dust mass flux by CaCO3 mass fraction at
4038 : ! source. Theory: Uses soil CaCO3 mass fraction from Global Soil Data Task,
4039 : ! 1999 (Sch99). Uses size dependent apportionment of CaCO3 from Claquin et
4040 : ! al, 1999 (CSB99). (tdf, bmy, 4/5/04)
4041 : !
4042 : ! Arguments as Input:
4043 : ! ===========================================================================
4044 : ! (1 ) DMT_VWR (REAL*8 ) : Mass weighted diameter resolved [m]
4045 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag
4046 : ! (3 ) FLX_MSS_VRT_DST_CACO3 (REAL*8 ) : Vert. mass flux of dust [kg/m2/s ]
4047 : ! (4 ) MSS_FRC_CACO3 (REAL*8 ) : Mass fraction of CaCO3 [fraction]
4048 : ! (5 ) MSS_FRC_CLY (REAL*8 ) : Mass fraction of clay [fraction]
4049 : ! (6 ) MSS_FRC_SND (REAL*8 ) : Mass fraction of sand [fraction]
4050 : !
4051 : ! Arguments as Output:
4052 : ! ===========================================================================
4053 : ! (3 ) FLX_MSS_VRT_DST_CACO3 (REAL*8 ) : Vertical mass flux of CaCO3 [kg/m2/s]
4054 : !
4055 : ! NOTES:
4056 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4057 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4058 : !******************************************************************************
4059 : !
4060 :
4061 : !------------------
4062 : ! Arguments
4063 : !------------------
4064 : TYPE(HCO_State), POINTER :: HcoState
4065 : TYPE(Ext_State), POINTER :: ExtState
4066 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
4067 : REAL*8, INTENT(IN) :: DMT_VWR(NBINS)
4068 : REAL*8, INTENT(IN) :: MSS_FRC_CACO3_SLC(HcoState%NX)
4069 : REAL*8, INTENT(IN) :: MSS_FRC_CLY_SLC(HcoState%NX)
4070 : REAL*8, INTENT(IN) :: MSS_FRC_SND_SLC(HcoState%NX)
4071 : REAL*8, INTENT(INOUT) :: FLX_MSS_VRT_DST_CACO3(HcoState%NX,NBINS)
4072 : INTEGER, INTENT(INOUT) :: RC
4073 :
4074 : !------------------
4075 : ! Parameters
4076 : !------------------
4077 :
4078 : ! Maximum diameter of Clay soil texture CSB99 p. 22250 [m]
4079 : REAL*8, PARAMETER :: DMT_CLY_MAX = 2.0d-6
4080 :
4081 : ! Maximum diameter of Silt soil texture CSB99 p. 22250 [m]
4082 : REAL*8, PARAMETER :: DMT_SLT_MAX = 50.0d-6
4083 :
4084 : ! Density of CaCO3 http://www.ssc.on.ca/mandm/calcit.htm [kg/m3]
4085 : REAL*8, PARAMETER :: DNS_CACO3 = 2950.0d0
4086 :
4087 : !------------------
4088 : ! Local variables
4089 : !------------------
4090 :
4091 : ! [idx] Counting index
4092 : INTEGER :: M
4093 :
4094 : ! [idx] Counting index for lon
4095 : INTEGER :: LON_IDX
4096 :
4097 : ! [frc] Mass fraction of silt
4098 : REAL*8 :: MSS_FRC_SLT_SLC(HcoState%NX)
4099 :
4100 : ! [frc] Fraction of soil CaCO3 in size bin
4101 : REAL*8 :: MSS_FRC_CACO3_SZ_CRR
4102 :
4103 : ! [frc] Fraction of CaCO3 in clay
4104 : REAL*8 :: MSS_FRC_CACO3_CLY
4105 :
4106 : ! [frc] Fraction of CaCO3 in silt
4107 : REAL*8 :: MSS_FRC_CACO3_SLT
4108 :
4109 : ! [frc] Fraction of CaCO3 in sand
4110 : REAL*8 :: MSS_FRC_CACO3_SND
4111 :
4112 : ! Error handling
4113 : CHARACTER(LEN=255) :: MSG
4114 :
4115 : !=================================================================
4116 : ! FLX_MSS_CACO3_MSK
4117 : !=================================================================
4118 :
4119 : ! INITIALIZE
4120 : MSS_FRC_SLT_SLC(:) = 0.0D0
4121 :
4122 : ! Loop over dust bins
4123 : DO M = 1, NBINS
4124 :
4125 : ! Loop over longitudes
4126 : DO LON_IDX = 1, HcoState%NX
4127 :
4128 : !===========================================================
4129 : ! Simple technique is to mask dust mass by tracer mass
4130 : ! fraction. The model transports (hence conserves) CaCO3
4131 : ! rather than total dust itself. The method assumes source,
4132 : ! transport, and removal processes are linear with tracer
4133 : ! mass
4134 : !===========================================================
4135 :
4136 : ! If this is a mobilization candidate, then...
4137 : IF ( FLG_MBL(LON_IDX) ) THEN
4138 :
4139 : ! 20000320: Currently this is only process in
4140 : ! dust model requiring mss_frc_slt
4141 :
4142 : ! [frc] Mass fraction of silt
4143 : MSS_FRC_SLT_SLC(LON_IDX) =
4144 : & MAX(0.0D0, 1.0D0 -MSS_FRC_CLY_SLC(LON_IDX)
4145 : & -MSS_FRC_SND_SLC(LON_IDX))
4146 :
4147 : ! CSB99 showed that CaCO3 is not uniformly distributed
4148 : ! across sizes. There is more CaCO3 per unit mass of
4149 : ! silt than per unit mass of clay.
4150 :
4151 : ! Fraction of CaCO3 in clay CSB99 p. 22249 Figure 1b
4152 : MSS_FRC_CACO3_CLY = MAX(0.0D0,-0.045D0+0.5D0
4153 : & * MIN(0.5D0,MSS_FRC_CLY_SLC(LON_IDX)))
4154 :
4155 : ! Fraction of CaCO3 in silt CSB99 p. 22249 Figure 1a
4156 : MSS_FRC_CACO3_SLT = MAX(0.0D0,-0.175D0+1.4D0
4157 : & * MIN(0.5D0,MSS_FRC_SLT_SLC(LON_IDX)))
4158 :
4159 : ! Fraction of CaCO3 in sand CSB99 p. 22249 Figure 1a
4160 : MSS_FRC_CACO3_SND = 1.0D0 - MSS_FRC_CACO3_CLY
4161 : & - MSS_FRC_CACO3_SND
4162 :
4163 : ! Set CaCO3 fraction of total CaCO3 for each transport bin
4164 : IF ( DMT_VWR(M) < DMT_CLY_MAX ) THEN
4165 :
4166 : ! Transport bin carries Clay
4167 : ! Fraction of soil CaCO3 in size bin
4168 : MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_CLY
4169 :
4170 : ELSE IF ( DMT_VWR(M) < DMT_SLT_MAX ) THEN
4171 :
4172 : ! Transport bin carries Silt
4173 : ! Fraction of soil CaCO3 in size bin
4174 : MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_SLT
4175 :
4176 : ELSE
4177 :
4178 : ! Transport bin carries Sand
4179 : ! Fraction of soil CaCO3 in size bin
4180 : MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_SND
4181 :
4182 : ENDIF
4183 :
4184 : ! Error checks
4185 : IF ( MSS_FRC_CACO3_SZ_CRR < 0.0D0 .OR.
4186 : & MSS_FRC_CACO3_SZ_CRR > 1.0D0 ) THEN
4187 : MSG = 'mss_frc_CaC_s < 0.0.or.mss_frc_CaC_s > 1.0!'
4188 : CALL HCO_ERROR(MSG, RC,
4189 : & THISLOC='FLX_MSS_CACO3_MSK' )
4190 : RETURN
4191 : ENDIF
4192 :
4193 : IF ( MSS_FRC_CACO3_SLC(LON_IDX) < 0.0D0 .OR.
4194 : & MSS_FRC_CACO3_SLC(LON_IDX) > 1.0D0 ) THEN
4195 : MSG = 'mss_frc_CaCO3_s < 0.0.or.mss_frc_CaCO3 > 1.0!'
4196 : CALL HCO_ERROR(MSG, RC,
4197 : & THISLOC='FLX_MSS_CACO3_MSK' )
4198 : RETURN
4199 : ENDIF
4200 :
4201 : ! Convert dust flux to CaCO3 flux
4202 : FLX_MSS_VRT_DST_CACO3(LON_IDX,M) =
4203 : & FLX_MSS_VRT_DST_CACO3(LON_IDX,M) ! [KG m-2 s-1]
4204 : & * MSS_FRC_CACO3_SLC(LON_IDX) ! [frc] Mass fraction of
4205 : ! CaCO3 (at this location)
4206 : ! 20020925 fxm: Remove size dependence of CaCO3
4207 : & * 1.0D0
4208 :
4209 : ENDIF
4210 : ENDDO
4211 : ENDDO
4212 :
4213 : ! Return w/ success
4214 : RC = HCO_SUCCESS
4215 :
4216 : END SUBROUTINE FLX_MSS_CACO3_MSK
4217 :
4218 : !------------------------------------------------------------------------------
4219 :
4220 0 : SUBROUTINE FLX_MSS_HRZ_SLT_TTL_WHI79_GET( HcoState, DNS_MDP,
4221 0 : & FLG_MBL, QS_TTL, U_S, U_ST )
4222 : !
4223 : !******************************************************************************
4224 : ! Subroutine FLX_MSS_HRZ_SLT_TTL_WHI79_GET computes vertically integrated
4225 : ! streamwise mass flux of particles. Theory: Uses method proposed by White
4226 : ! (1979). See Zender et al., expr (10). fxm: use surface air density not
4227 : ! midlayer density (tdf, bmy, 4/5/04)
4228 : !
4229 : ! Arguments as Input:
4230 : ! ============================================================================
4231 : ! (1 ) DNS_MDP (REAL*8 ) : Midlayer density [g/m3 ]
4232 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [flag ]
4233 : ! (4 ) U_S (REAL*8 ) : Surface friction velocity [m/s ]
4234 : ! (5 ) U_ST (REAL*8 ) : Threshold friction spd for saltation [m/s ]
4235 : !
4236 : ! Arguments as Output:
4237 : ! ============================================================================
4238 : ! (3 ) QS_TTL (REAL*8 ) : Vertically integrated streamwise mass flux [kg/m/s]
4239 : !
4240 : ! NOTES:
4241 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4242 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4243 : !******************************************************************************
4244 : !
4245 :
4246 : !------------------
4247 : ! Arguments
4248 : !------------------
4249 : TYPE(HCO_State), POINTER :: HcoState
4250 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
4251 : REAL*8, INTENT(IN) :: DNS_MDP(HcoState%NX)
4252 : REAL*8, INTENT(IN) :: U_S(HcoState%NX)
4253 : REAL*8, INTENT(IN) :: U_ST(HcoState%NX)
4254 : REAL*8, INTENT(OUT) :: QS_TTL(HcoState%NX)
4255 :
4256 : !------------------
4257 : ! Parameters
4258 : !------------------
4259 :
4260 : ! [frc] Saltation constant Whi79 p. 4648, MaB97 p. 16422
4261 : REAL*8, PARAMETER :: CST_SLT = 2.61d0
4262 :
4263 : !------------------
4264 : ! Local variables
4265 : !------------------
4266 :
4267 : ! [frc] Ratio of wind friction threshold to wind friction
4268 : real*8 :: U_S_rat
4269 :
4270 : ! [idx] Counting index for lon
4271 : integer :: lon_idx
4272 :
4273 : !=================================================================
4274 : ! FLX_MSS_HRZ_SLT_TTL_WHI79_GET begins here!
4275 : !=================================================================
4276 :
4277 : ! Initialize
4278 0 : QS_TTL(:) = 0.0D0
4279 :
4280 : ! Loop over longitudes
4281 0 : DO LON_IDX = 1, HcoState%NX
4282 :
4283 : ! If this is a mobilization candidate and the friction
4284 : ! velocity is above the threshold for saltation...
4285 0 : IF ( FLG_MBL(LON_IDX) .AND.
4286 0 : & U_S(LON_IDX) > U_ST(LON_IDX) ) THEN
4287 :
4288 : ! Ratio of wind friction threshold to wind friction
4289 0 : U_S_RAT = U_ST(LON_IDX) / U_S(LON_IDX)
4290 :
4291 : ! Whi79 p. 4648 (19), MaB97 p. 16422 (28)
4292 : QS_TTL(LON_IDX) = ! [kg m-1 s-1]
4293 : & CST_SLT * DNS_MDP(LON_IDX) * (U_S(LON_IDX)**3.0D0)
4294 : & * (1.0D0-U_S_RAT) * (1.0D0+U_S_RAT)
4295 0 : & * (1.0D0+U_S_RAT) / GRV_SFC
4296 :
4297 : ENDIF
4298 : ENDDO
4299 :
4300 : ! Return to calling program
4301 0 : END SUBROUTINE FLX_MSS_HRZ_SLT_TTL_WHI79_GET
4302 :
4303 : !------------------------------------------------------------------------------
4304 :
4305 0 : SUBROUTINE FLX_MSS_VRT_DST_TTL_MAB95_GET( HcoState,
4306 0 : & DST_SLT_FLX_RAT_TTL,
4307 0 : & FLG_MBL,
4308 0 : & FLX_MSS_HRZ_SLT_TTL,
4309 0 : & FLX_MSS_VRT_DST_TTL,
4310 0 : & MSS_FRC_CLY_SLC )
4311 : !
4312 : !******************************************************************************
4313 : ! Subroutine FLX_MSS_VRT_DST_TTL_MAB95_GET diagnoses total vertical mass flux
4314 : ! of dust from vertically integrated streamwise mass flux, Zender et al.,
4315 : ! expr. (11). (tdf, bmy, 4/5/04)
4316 : !
4317 : ! Theory: Uses clay-based method proposed by Marticorena & Bergametti (1995)
4318 : ! Their parameterization is based only on data for mss_frc_cly < 0.20
4319 : ! For clayier soils, dst_slt_flx_rat_ttl may behave dramatically differently
4320 : ! Whether this behavior changes when mss_frc_cly > 0.20 is unknown
4321 : ! Anecdotal evidence suggests vertical flux decreases for mss_frc_cly > 0.20
4322 : ! Thus we use min[mss_frc_cly,0.20] in MaB95 parameterization
4323 : !
4324 : ! Arguments as Input:
4325 : ! ============================================================================
4326 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag
4327 : ! (3 ) FLX_MSS_HRZ_SLT_TTL (REAL*8 ) : Vertically integrated streamwise
4328 : ! mass flux [kg/m/s]
4329 : ! (5 ) MSS_FRC_CLY (REAL*8 ) : Mass fraction clay [fraction]
4330 : !
4331 : ! Arguments as Output:
4332 : ! ============================================================================
4333 : ! (1 ) DST_SLT_FLX_RAT_TTL (REAL*8 ) : Ratio of vertical dust flux t
4334 : ! to streamwise mass flux [1/m]
4335 : ! (4 ) FX_MSS_VRT_DST_TTL (REAL*8 ) : Total vert. mass flux of dust [kg/m2/s]
4336 : !
4337 : ! NOTES:
4338 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4339 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4340 : !******************************************************************************
4341 : !
4342 :
4343 : !-----------------
4344 : ! Arguments
4345 : !-----------------
4346 : TYPE(HCO_State), POINTER :: HcoState
4347 : LOGICAL, INTENT(IN) :: FLG_MBL(HcoState%NX)
4348 : REAL*8, INTENT(IN) :: FLX_MSS_HRZ_SLT_TTL(HcoState%NX)
4349 : REAL*8, INTENT(IN) :: MSS_FRC_CLY_SLC(HcoState%NX)
4350 : REAL*8, INTENT(OUT) :: DST_SLT_FLX_RAT_TTL(HcoState%NX)
4351 : REAL*8, INTENT(OUT) :: FLX_MSS_VRT_DST_TTL(HcoState%NX)
4352 :
4353 : !-----------------
4354 : ! Local variables
4355 : !-----------------
4356 :
4357 : ! [idx] Counting index for lon
4358 : INTEGER :: LON_IDX
4359 :
4360 : ! [frc] Mass fraction clay limited to 0.20
4361 : REAL*8 :: MSS_FRC_CLY_VLD
4362 :
4363 : ! [frc] Natural log of 10
4364 : REAL*8 :: LN10
4365 :
4366 : !=================================================================
4367 : ! FLX_MSS_VRT_DST_TTL_MAB95_GET
4368 : !=================================================================
4369 :
4370 : ! Initialize
4371 0 : LN10 = LOG(10.0D0)
4372 0 : DST_SLT_FLX_RAT_TTL(:) = 0.0D0
4373 0 : FLX_MSS_VRT_DST_TTL(:) = 0.0D0
4374 :
4375 : ! Loop over longitudes
4376 0 : DO LON_IDX = 1, HcoState%NX
4377 :
4378 : ! If this is a mobilization candidate...
4379 0 : IF ( FLG_MBL(LON_IDX) ) then
4380 :
4381 : ! 19990603: fxm: Dust production is EXTREMELY sensitive to
4382 : ! this parameter, which changes flux by 3 orders of magnitude
4383 : ! in 0.0 < mss_frc_cly < 0.20
4384 0 : MSS_FRC_CLY_VLD = MIN(MSS_FRC_CLY_SLC(LON_IDX),0.2D0) ! [frc]
4385 :
4386 : DST_SLT_FLX_RAT_TTL(LON_IDX) = ! [m-1]
4387 0 : & 100.0D0 * EXP(LN10*(13.4D0*MSS_FRC_CLY_VLD-6.0D0))
4388 : ! MaB95 p. 16423 (47)
4389 :
4390 : FLX_MSS_VRT_DST_TTL(LON_IDX) = ! [kg M-1 s-1]
4391 : & FLX_MSS_HRZ_SLT_TTL(LON_IDX)
4392 0 : & * DST_SLT_FLX_RAT_TTL(LON_IDX)
4393 :
4394 : ENDIF
4395 : ENDDO
4396 :
4397 : ! Return to calling program
4398 0 : END SUBROUTINE FLX_MSS_VRT_DST_TTL_MAB95_GET
4399 :
4400 : !------------------------------------------------------------------------------
4401 :
4402 0 : SUBROUTINE DST_PSD_MSS( OVR_SRC_SNK_FRC, MSS_FRC_SRC,
4403 0 : & OVR_SRC_SNK_MSS, NBINS, DST_SRC_NBR )
4404 : !
4405 : !******************************************************************************
4406 : ! Subroutine DST_PSD_MSS computes OVR_SRC_SNK_MSS from OVR_SRC_SNK_FRC
4407 : ! and MSS_FRC_SRC. (tdf, bmy, 4/5/04)
4408 : !
4409 : ! Multiply ovr_src_snk_frc(src_idx,*) by mss_frc(src_idx) to obtain
4410 : ! absolute mass fraction mapping from source dists. to sink bins
4411 : !
4412 : ! Arguments as Input:
4413 : ! ============================================================================
4414 : ! (1 ) OVR_SRC_SNK_FRC (REAL*8 ) : Mass overlap, Mij, Zender p. 5, Equ. 12
4415 : ! (2 ) MSS_FRC_SRC (REAL*8 ) : Mass fraction in each mode (Table 1, M)
4416 : ! (4 ) NBINS (INTEGER) : Number of GEOS_CHEM dust bins
4417 : ! (5 ) DST_SRC_NBR (INTEGER) : Number of source modes
4418 : !
4419 : ! Arguments as Output:
4420 : ! ============================================================================
4421 : ! (3 ) OVR_SRC_SNK_MSS (REAL*8 ) : Mass of stuff ???
4422 : !
4423 : ! NOTES:
4424 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4425 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4426 : !******************************************************************************
4427 : !
4428 : !-----------------
4429 : ! Arguments
4430 : !-----------------
4431 : INTEGER, INTENT(IN) :: DST_SRC_NBR, NBINS
4432 : REAL*8, INTENT(IN) :: OVR_SRC_SNK_FRC(DST_SRC_NBR,NBINS)
4433 : REAL*8, INTENT(IN) :: MSS_FRC_SRC(DST_SRC_NBR)
4434 : REAL*8, INTENT(OUT) :: OVR_SRC_SNK_MSS(DST_SRC_NBR,NBINS)
4435 :
4436 : !-----------------
4437 : ! Local variables
4438 : !-----------------
4439 : INTEGER :: SRC_IDX, SNK_IDX
4440 0 : REAL*8 :: MSS_FRC_TRN_DST_SRC(NBINS)
4441 : REAL*8 :: OVR_SRC_SNK_MSS_TTL
4442 :
4443 : !=================================================================
4444 : ! DST_PSD_MSS begins here!
4445 : !=================================================================
4446 :
4447 : ! Fraction of vertical dust flux which is transported
4448 0 : OVR_SRC_SNK_MSS_TTL = 0.0D0
4449 :
4450 : ! Fraction of transported dust mass at source
4451 0 : DO SNK_IDX = 1, NBINS
4452 0 : MSS_FRC_TRN_DST_SRC(SNK_IDX) = 0.0D0
4453 : ENDDO
4454 :
4455 0 : DO SNK_IDX = 1, NBINS
4456 0 : DO SRC_IDX = 1, DST_SRC_NBR
4457 0 : OVR_SRC_SNK_MSS (SRC_IDX,SNK_IDX) = ! [frc]
4458 : & OVR_SRC_SNK_FRC (SRC_IDX,SNK_IDX)
4459 0 : & * MSS_FRC_SRC (SRC_IDX) ! [frc]
4460 : ENDDO
4461 : ENDDO
4462 :
4463 : ! Split double do loop into 2 parts tdf 10/22/2K3
4464 0 : DO SNK_IDX = 1, NBINS
4465 0 : DO SRC_IDX = 1, DST_SRC_NBR
4466 :
4467 : ! [frc] Fraction of transported dust mass at source
4468 0 : MSS_FRC_TRN_DST_SRC(SNK_IDX) =
4469 : & MSS_FRC_TRN_DST_SRC(SNK_IDX)
4470 0 : & + OVR_SRC_SNK_MSS(SRC_IDX,SNK_IDX)
4471 :
4472 : ! [frc] Compute total transported mass fraction of dust flux
4473 : OVR_SRC_SNK_MSS_TTL = OVR_SRC_SNK_MSS_TTL
4474 0 : & + OVR_SRC_SNK_MSS (SRC_IDX,snk_idx)
4475 : ENDDO
4476 : ENDDO
4477 :
4478 : ! Convert fraction of mobilized mass to fraction of transported mass
4479 0 : DO SNK_IDX = 1, NBINS
4480 0 : MSS_FRC_TRN_DST_SRC (SNK_IDX) =
4481 0 : & MSS_FRC_TRN_DST_SRC (SNK_IDX) / OVR_SRC_SNK_MSS_TTL
4482 : ENDDO
4483 :
4484 : ! Return to calling program
4485 0 : END SUBROUTINE DST_PSD_MSS
4486 :
4487 : !------------------------------------------------------------------------------
4488 :
4489 0 : SUBROUTINE FLX_MSS_VRT_DST_PRT( Inst, NX, FLG_MBL,
4490 0 : & FLX_MSS_VRT_DST,
4491 0 : & FLX_MSS_VRT_DST_TTL )
4492 : !
4493 : !******************************************************************************
4494 : ! Subroutine FLX_MSS_VRT_DST_PRT partitions total vertical mass flux of dust
4495 : ! into transport bins. Assumes a trimodal lognormal probability density
4496 : ! function (see Zender et al., p. 5). (tdf, bmy, 4/5/04)
4497 : !
4498 : ! DST_SRC_NBR = 3 - trimodal size distribution in source c regions (p. 5)
4499 : ! OVR_SRC_SNK_MSS [frc] computed in dst_psd_mss, called from dust_mod.f
4500 : !
4501 : ! Arguments as Input:
4502 : ! ============================================================================
4503 : ! (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag
4504 : ! (3 ) FLX_MSS_VRT_DST_TTL (REAL*8 ) : Total vert. mass flux of dust [kg/m2/s]
4505 : !
4506 : ! Arguments as Output:
4507 : ! ============================================================================
4508 : ! (2 ) FLX_MSS_VRT_DST (REAL*8 ) : Vertical mass flux of dust [kg/m2/s]
4509 : !
4510 : ! NOTES:
4511 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4512 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4513 : !******************************************************************************
4514 : !
4515 :
4516 : ! Arguments
4517 : TYPE(MyInst), POINTER :: Inst
4518 : INTEGER, INTENT(IN) :: NX
4519 : LOGICAL, INTENT(IN) :: FLG_MBL(NX)
4520 : REAL*8, INTENT(IN) :: FLX_MSS_VRT_DST_TTL(NX)
4521 : REAL*8, INTENT(OUT) :: FLX_MSS_VRT_DST(NX,NBINS)
4522 :
4523 : ! Local variables
4524 : INTEGER :: LON_IDX ! [idx] Counting index for lon
4525 : INTEGER :: SRC_IDX ! [idx] Counting index for src
4526 : INTEGER :: SNK_IDX ! [idx] Counting index for snk
4527 : INTEGER :: SNK_NBR ! [nbr] Dimension size
4528 :
4529 : !=================================================================
4530 : ! FLX_MSS_VRT_DST_PRT begins here!
4531 : !=================================================================
4532 :
4533 : ! Initialize
4534 0 : FLX_MSS_VRT_DST(:,:) = 0.0D0 ! [frc]
4535 :
4536 : ! Loop over longitudes (NB: Inefficient loop order)
4537 0 : DO LON_IDX = 1, NX
4538 :
4539 : ! If this is a mobilization candidate...
4540 0 : IF ( FLG_MBL(LON_IDX) ) THEN
4541 :
4542 : ! Loop over source & sink indices
4543 0 : DO SNK_IDX = 1, NBINS
4544 0 : DO SRC_IDX = 1, DST_SRC_NBR
4545 0 : FLX_MSS_VRT_DST(LON_IDX,SNK_IDX) = ! [kg m-2 s-1]
4546 : & FLX_MSS_VRT_DST(LON_IDX,SNK_IDX)
4547 0 : & + Inst%OVR_SRC_SNK_MSS(SRC_IDX,SNK_IDX)
4548 0 : & * FLX_MSS_VRT_DST_TTL(LON_IDX)
4549 : ENDDO
4550 : ENDDO
4551 : ENDIF
4552 : ENDDO
4553 :
4554 : ! Return to calling program
4555 0 : END SUBROUTINE FLX_MSS_VRT_DST_PRT
4556 :
4557 : !------------------------------------------------------------------------------
4558 :
4559 : SUBROUTINE TM_2_IDX_WGT()
4560 :
4561 : ! routine eliminated: see original code
4562 : END SUBROUTINE TM_2_IDX_WGT
4563 :
4564 : !------------------------------------------------------------------------------
4565 :
4566 0 : SUBROUTINE LND_FRC_MBL_GET( HcoState, DOY,
4567 0 : & FLG_MBL, LAT_RDN,
4568 0 : & LND_FRC_DRY_SLC, LND_FRC_MBL, MBL_NBR,
4569 0 : & ORO, SFC_TYP_SLC, SNW_FRC,
4570 0 : & TPT_SOI, TPT_SOI_FRZ, VAI_DST_SLC,
4571 : & RC)
4572 : !
4573 : !******************************************************************************
4574 : ! Subroutine LND_FRC_MBL_GET returns the fraction of each GEOS-CHEM grid
4575 : ! box which is suitable for dust mobilization. This routine is called
4576 : ! by DST_MBL. (tdf, bmy, 4/5/04, 1/13/10)
4577 : !
4578 : ! The DATE is used to obtain the time-varying vegetation cover.
4579 : ! Routine currently uses latitude slice of VAI from time-dependent surface
4580 : ! boundary dataset (tdf, 10/27/03). LAI/VAI algorithm is from CCM:lsm/phenol
4581 : ! () Bon96. The LSM data are mid-month values, i.e., valid on the 15th of !
4582 : ! the month.!
4583 : !
4584 : ! Criterion for mobilisation candidate (tdf, 4/5/04):
4585 : ! (1) first, must be a land point, not ocean, not ice
4586 : ! (2) second, it cannot be an inland lake, wetland or ice
4587 : ! (3) modulated by vegetation type
4588 : ! (4) modulated by subgridscale wetness
4589 : ! (5) cannot be snow covered
4590 : !
4591 : ! Arguments as Input:
4592 : ! ============================================================================
4593 : ! (1 ) DOY (REAL*8 ) : Day of year [1.0-366.0]
4594 : ! (3 ) LAT_RDN (REAL*8 ) : Latitude [radians ]
4595 : ! (4 ) LND_FRC_DRY (REAL*8 ) : Dry land fraction [fraction ]
4596 : ! (7 ) ORO (REAL*8 ) : Orography: land/ocean/ice [flags ]
4597 : ! (8 ) SFC_TYP (INTEGER) : LSM surface type (0..28) [unitless ]
4598 : ! (9 ) SNW_FRC (REAL*8 ) : Fraction of surface covered by snow [fraction ]
4599 : ! (10) TPT_SOI (REAL*8 ) : Soil temperature [K ]
4600 : ! (11) TPT_SOI_FRZ (REAL*8 ) : Temperature of frozen soil [K ]
4601 : ! (12) VAI_DST (REAL*8 ) : Vegetation area index, one-sided [m2/m2 ]
4602 : !
4603 : ! Arguments as Output:
4604 : ! ============================================================================
4605 : ! (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag [flag ]
4606 : ! (5 ) LND_FRC_MBL (REAL*8 ) : Bare ground fraction [fraction ]
4607 : ! (6 ) MBL_NBR (INTEGER) : Number of mobilization candidates [unitless ]
4608 : !
4609 : ! NOTES:
4610 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4611 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4612 : ! (2 ) For the GOCART source function, we don't use VAI, so set FLG_VAI_TVBDS
4613 : ! = .FALSE. and disable calls to ERROR_STOP (tdf, bmy, 1/25/07)
4614 : ! (3 ) Modification for GEOS-4 1 x 1.25 grids (lok, bmy, 1/13/10)
4615 : !******************************************************************************
4616 : !
4617 :
4618 : !------------------
4619 : ! Arguments
4620 : !------------------
4621 : TYPE(HCO_State), POINTER :: HcoState
4622 : INTEGER, INTENT(IN) :: SFC_TYP_SLC(HcoState%NX)
4623 : REAL*8, INTENT(IN) :: DOY
4624 : REAL*8, INTENT(IN) :: LAT_RDN
4625 : REAL*8, INTENT(IN) :: LND_FRC_DRY_SLC(HcoState%NX)
4626 : REAL*8, INTENT(IN) :: ORO(HcoState%NX)
4627 : REAL*8, INTENT(IN) :: SNW_FRC(HcoState%NX)
4628 : REAL*8, INTENT(IN) :: TPT_SOI(HcoState%NX)
4629 : REAL*8, INTENT(IN) :: TPT_SOI_FRZ
4630 : REAL*8, INTENT(IN) :: VAI_DST_SLC(HcoState%NX)
4631 : INTEGER, INTENT(OUT) :: MBL_NBR
4632 : LOGICAL, INTENT(OUT) :: FLG_MBL(HcoState%NX)
4633 : REAL*8, INTENT(OUT) :: LND_FRC_MBL(HcoState%NX)
4634 : INTEGER, INTENT(INOUT) :: RC
4635 :
4636 : !------------------
4637 : ! Parameters
4638 : !------------------
4639 :
4640 : ! VAI threshold quench [m2/m2]
4641 : REAL*8, PARAMETER :: VAI_MBL_THR = 0.30D0
4642 :
4643 : !------------------
4644 : ! Local variables
4645 : !------------------
4646 :
4647 : ! [idx] Counting index
4648 : INTEGER :: IDX_IDX
4649 :
4650 : ! [idx] Interpolation month, future
4651 : INTEGER :: IDX_MTH_GLB
4652 :
4653 : ! [idx] Interpolation month, past
4654 : INTEGER :: IDX_MTH_LUB
4655 :
4656 : ! [idx] Longitude index array (land)
4657 0 : INTEGER :: LND_IDX(HcoState%NX)
4658 :
4659 : ! [nbr] Number of land points
4660 : INTEGER :: LND_NBR
4661 :
4662 : ! [idx] Counting index for longitude
4663 : INTEGER :: LON_IDX
4664 :
4665 : ! [idx] Surface type index
4666 : INTEGER :: SFC_TYP_IDX
4667 :
4668 : ! [idx] Surface sub-gridscale index
4669 : INTEGER :: SGS_IDX
4670 :
4671 : !-------------------------------------------------------------------
4672 : ! Prior to 1/25/07:
4673 : ! For GOCART source function, we don't use VAI (tdf, bmy, 1/25/07)
4674 : !
4675 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
4676 : !
4677 : !! [flg] Use VAI data from time-varying boundary dataset
4678 : ! LOGICAL :: FLG_VAI_TVBDS = .TRUE.
4679 : !-------------------------------------------------------------------
4680 :
4681 : ! For GOCART source function, we do not use VAI (tdf, bmy, 1/25/07)
4682 : LOGICAL :: FLG_VAI_TVBDS = .FALSE.
4683 :
4684 : ! [flg] Add 182 days in southern hemisphere
4685 : LOGICAL :: FLG_SH_ADJ = .TRUE.
4686 :
4687 : ! [dgr] Latitude
4688 : REAL*8 :: LAT_DGR
4689 :
4690 : ! [m2 m-2] Leaf + stem area index, one-sided
4691 : REAL*8 :: VAI_SGS
4692 :
4693 : ! Error handling
4694 : CHARACTER(LEN=255) :: MSG
4695 :
4696 : !=================================================================
4697 : ! LND_FRC_MBL_GET begins here!
4698 : !=================================================================
4699 :
4700 : ! Error check
4701 : IF ( VAI_MBL_THR <= 0.0d0 ) THEN
4702 : MSG = 'VAI_MBL_THR <= 0.0'
4703 : CALL HCO_ERROR(MSG, RC,
4704 : & THISLOC='LND_FRC_MBL_GET' )
4705 : RETURN
4706 : ENDIF
4707 :
4708 : ! Latitude (degrees)
4709 0 : LAT_DGR = 180.0D0 * LAT_RDN/HcoState%Phys%PI
4710 :
4711 : ! Initialize outputs
4712 0 : MBL_NBR = 0
4713 :
4714 0 : DO LON_IDX = 1, HcoState%NX
4715 0 : FLG_MBL(LON_IDX) = .FALSE.
4716 : ENDDO
4717 :
4718 0 : LND_FRC_MBL(:) = 0.0D0
4719 :
4720 : !=================================================================
4721 : ! For dust mobilisation, we need to have land! tdf 10/27/2K3
4722 : ! Set up lnd_idx to hold the longitude indices for land
4723 : ! Land ahoy!
4724 : !=================================================================
4725 0 : LND_NBR = 0
4726 0 : DO LON_IDX = 1, HcoState%NX
4727 0 : IF ( ORO_IS_LND( ORO(LON_IDX)) ) THEN
4728 0 : LND_NBR = LND_NBR + 1
4729 0 : LND_IDX(LND_NBR) = LON_IDX
4730 : ENDIF
4731 : ENDDO
4732 :
4733 : ! Much ado about nothing (no land points)
4734 0 : IF ( LND_NBR == 0 ) RETURN
4735 :
4736 : !-----------------------------------------------------------------------------
4737 : ! Prior to 1/25/07:
4738 : ! When GOCART source function is used, VAI flag is NOT used, so
4739 : ! we need to disable the ERROR_STOP call (tdf, bmy, 1/25/07)
4740 : !
4741 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
4742 : !
4743 : ! ! Introduce error message for flg_vai_tvbds=F (VAI not used!)
4744 : ! IF ( .not. FLG_VAI_TVBDS ) THEN
4745 : !c print *,' FLG_VAI_TVBDS is false: GOCART source function used'
4746 : ! CALL ERROR_STOP( 'FLG_VAI_TVBDS=F',
4747 : ! & 'LND_FRC_MBL_GET ("dust_dead_mod.f")' )
4748 : ! ENDIF
4749 : !-----------------------------------------------------------------------------
4750 :
4751 : !=================================================================
4752 : ! Only land points are possible candidates for dust mobilization
4753 : !=================================================================
4754 :
4755 : ! Loop over land points
4756 0 : DO IDX_IDX = 1, LND_NBR
4757 0 : LON_IDX = LND_IDX(IDX_IDX)
4758 :
4759 : ! Store surface blend of current gridpoint
4760 0 : SFC_TYP_IDX = SFC_TYP_SLC(LON_IDX)
4761 :
4762 : ! Check for wet or frozen conditions - no mobilisation allowed
4763 : ! Surface type 1 = inland lakes & land ice
4764 : ! Surface type 27 = wetlands
4765 0 : IF ( SFC_TYP_IDX <= 1 .OR. SFC_TYP_IDX >= 27 .OR.
4766 : & TPT_SOI(LON_IDX) < TPT_SOI_FRZ ) THEN
4767 :
4768 : ! SET bare ground fraction to zero
4769 0 : LND_FRC_MBL(LON_IDX) = 0.0D0
4770 :
4771 : ELSE
4772 :
4773 : !-------------------------
4774 : ! If we are using VAI...
4775 : !-------------------------
4776 0 : IF ( FLG_VAI_TVBDS ) THEN
4777 :
4778 : ! "bare ground" fraction of current gridcell decreases
4779 : ! linearly from 1.0 to 0.0 as VAI increases from 0.0 to
4780 : ! vai_mbl_thr. NOTE: vai_mbl_thr set to 0.3 (tdf, 4/5/04)
4781 : LND_FRC_MBL(LON_IDX) =
4782 : & 1.0D0 - MIN(1.0D0, MIN(VAI_DST_SLC(LON_IDX),
4783 0 : & VAI_MBL_THR) / VAI_MBL_THR)
4784 :
4785 : !---------------------------
4786 : ! If we're not using VAI...
4787 : !---------------------------
4788 : ELSE
4789 :
4790 : !-----------------------------------------------------------------------------
4791 : ! Prior to 1/25/07:
4792 : ! When GOCART source function is used, VAI flag is NOT used, so
4793 : ! we need to disable the ERROR_STOP call. (tdf, bmy, 1/25/07)
4794 : !
4795 : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
4796 : !
4797 : ! CALL ERROR_STOP( 'FLG_VAI_TVBDS=F',
4798 : ! & 'LND_FRC_MBL_GET ("dust_dead_mod.f")' )
4799 : !-----------------------------------------------------------------------------
4800 :
4801 : ! For GOCART source function, set the bare
4802 : ! ground fraction to 1 (tdf, bmy, 1/25/07)
4803 0 : LND_FRC_MBL(LON_IDX) = 1.0D0
4804 :
4805 : ENDIF
4806 :
4807 : ENDIF ! endif normal land
4808 :
4809 : !==============================================================
4810 : ! We have now filled "lnd_frc_mbl" the land fraction suitable
4811 : ! for mobilisation. Adjust for factors which constrain entire
4812 : ! gridcell LND_FRC_MBL modulated by LND_FRC_DRY and SNW_FRC.
4813 : ! (tdf, 4/5/04)
4814 : !==============================================================
4815 :
4816 : ! Take the bare ground fraction, multiply by the fraction
4817 : ! that is dry and that is NOT covered by snow
4818 : LND_FRC_MBL(LON_IDX) = LND_FRC_MBL(LON_IDX)
4819 : & * LND_FRC_DRY_SLC(LON_IDX)
4820 0 : & * ( 1.0D0 - SNW_FRC(LON_IDX) )
4821 :
4822 : ! Temporary fix for 1 x 1.25 grids -- Lok Lamsal 1/13/10
4823 0 : IF ( LND_FRC_MBL(LON_IDX) .GT. 1.0D0 ) THEN
4824 0 : LND_FRC_MBL(LON_IDX) = 0.99D0
4825 : ENDIF
4826 :
4827 : ! Error check
4828 0 : IF ( LND_FRC_MBL(lon_idx) > 1.0D0 ) THEN
4829 0 : MSG = 'LND_FRC_MBL > 1'
4830 : CALL HCO_ERROR(MSG, RC,
4831 0 : & THISLOC='LND_FRC_MBL_GET' )
4832 0 : RETURN
4833 : ENDIF
4834 :
4835 0 : IF ( LND_FRC_MBL(LON_IDX) < 0.0D0 ) then
4836 0 : MSG = 'LND_FRC_MBL < 0'
4837 : CALL HCO_ERROR(MSG, RC,
4838 0 : & THISLOC='LND_FRC_MBL_GET' )
4839 0 : RETURN
4840 : ENDIF
4841 :
4842 : ! If there is dry land in this longitude
4843 0 : if ( LND_FRC_MBL(LON_IDX) > 0.0D0 ) then
4844 :
4845 : ! Set flag, we have a candidate!
4846 0 : FLG_MBL(LON_IDX) = .TRUE.
4847 :
4848 : ! Increment # of candidates
4849 0 : MBL_NBR = MBL_NBR + 1
4850 : ENDIF
4851 :
4852 : ENDDO
4853 :
4854 : ! Return w/ success
4855 0 : RC = HCO_SUCCESS
4856 :
4857 : ! Return to calling program
4858 : END SUBROUTINE LND_FRC_MBL_GET
4859 :
4860 : !------------------------------------------------------------------------------
4861 :
4862 : SUBROUTINE DST_ADD_LON( NX, NBINS, Q, Q_TTL )
4863 : !
4864 : !******************************************************************************
4865 : ! Subroutine DST_ADD_LON dst_add_lon() computes and returns the total
4866 : ! property (e.g., mixing ratio, flux), obtained by simply adding along the
4867 : ! (dust) constituent dimension, when given an 3-D array of an additive
4868 : ! property (e.g., mixing ratio, flux). (tdf, bmy, 4/5/04)
4869 : !
4870 : ! Arguments as Input:
4871 : ! ============================================================================
4872 : ! (1 ) q (REAL*8) : Total property
4873 : !
4874 : ! Arguments as Output:
4875 : ! ============================================================================
4876 : ! (2 ) q_ttl (REAL*8) : Property for each size class
4877 : !
4878 : ! NOTES:
4879 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4880 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4881 : !******************************************************************************
4882 : !
4883 :
4884 : ! Arguments
4885 : INTEGER, INTENT(IN) :: NX, NBINS
4886 : REAL*8, INTENT(IN) :: Q(NX,NBINS)
4887 : REAL*8, INTENT(OUT) :: Q_TTL(NX)
4888 :
4889 : ! Local variables
4890 : INTEGER :: I, M
4891 :
4892 : !=================================================================
4893 : ! DST_ADD_LON begins here!
4894 : !=================================================================
4895 :
4896 : ! Initialize
4897 : Q_TTL = 0d0
4898 :
4899 : ! Loop over dust bins
4900 : DO M = 1, NBINS
4901 :
4902 : ! Loop over longitudes
4903 : DO I = 1, NX
4904 :
4905 : ! Integrate!
4906 : Q_TTL(I) = Q_TTL(I) + Q(I,M)
4907 :
4908 : ENDDO
4909 : ENDDO
4910 :
4911 : ! Return to calling program
4912 : END SUBROUTINE DST_ADD_LON
4913 :
4914 : !------------------------------------------------------------------------------
4915 :
4916 0 : SUBROUTINE DST_TVBDS_GET( Inst, NX, LAT_IDX, VAI_DST_OUT )
4917 : !
4918 : !******************************************************************************
4919 : ! Subroutine DST_TVBDS_GET returns a specifed latitude slice of VAI data.
4920 : ! (tdf, bmy, 4/5/04)
4921 : !
4922 : ! Arguments as Input:
4923 : ! ============================================================================
4924 : ! (1 ) LAT_IDX (INTEGER) : Latitude index
4925 : !
4926 : ! Arguments as Output:
4927 : ! ============================================================================
4928 : ! (2 ) VAI_DST_OUT (REAL*8 ) : Vegetation area index, 1-sided, current [m2/m2]
4929 : !
4930 : ! NOTES:
4931 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4932 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4933 : !******************************************************************************
4934 : !
4935 :
4936 : ! Arguments
4937 : TYPE(MyInst), POINTER :: Inst
4938 : INTEGER, INTENT(IN) :: NX
4939 : INTEGER, INTENT(IN) :: LAT_IDX
4940 : REAL*8, INTENT(OUT) :: VAI_DST_OUT(:)
4941 :
4942 : ! Local variables
4943 : INTEGER :: LON_IDX
4944 :
4945 : !=================================================================
4946 : ! DST_TVBDS_GET begins here!
4947 : !=================================================================
4948 :
4949 : ! Return lat slice of VAI [m2/m2]
4950 0 : DO LON_IDX = 1, NX
4951 0 : VAI_DST_OUT(LON_IDX) = Inst%VAI_DST(LON_IDX,LAT_IDX)
4952 : ENDDO
4953 :
4954 : ! Return to calling program
4955 0 : END SUBROUTINE DST_TVBDS_GET
4956 :
4957 : !------------------------------------------------------------------------------
4958 :
4959 0 : SUBROUTINE OVR_SRC_SNK_FRC_GET( HcoState,
4960 0 : & SRC_NBR, MDN_SRC,
4961 0 : & GSD_SRC, SNK_NBR,
4962 0 : & DMT_MIN_SNK, DMT_MAX_SNK,
4963 0 : & OVR_SRC_SNK_FRC, RC )
4964 :
4965 : USE HCO_CLOCK_MOD, ONLY : HcoClock_First
4966 : !
4967 : !******************************************************************************
4968 : ! Subroutine OVR_SRC_SNK_FRC_GET, given one set (the "source") of lognormal
4969 : ! distributions, and one set of bin boundaries (the "sink"), computes and
4970 : ! returns the overlap factors between the source distributions and the sink
4971 : ! bins. (tdf, bmy, 4/5/04)
4972 : !
4973 : ! The output is a matrix, Mij, OVR_SRC_SNK_FRC(SRC_NBR,SNK_NBR)
4974 : ! Element ovr_src_snk_frc(i,j) is the fraction of size distribution i
4975 : ! in group src that overlaps sink bin j
4976 : !
4977 : ! Arguments as Input:
4978 : ! ============================================================================
4979 : ! (1 ) SRC_NBR (INTEGER) : Dimension size [unitless]
4980 : ! (2 ) MDN_SRC (REAL*8 ) : Mass median particle size [m ]
4981 : ! (3 ) GSD_SRC (REAL*8 ) : Geometric standard deviation [fraction]
4982 : ! (4 ) SNK_NBR (INTEGER) : Dimension size [unitless]
4983 : ! (5 ) DMT_MIN_SNK (REAL*8 ) : Minimum diameter in bin [m ]
4984 : ! (6 ) DMT_MAX_SNK (REAL*8 ) : Maximum diameter in bin [m ]
4985 : !
4986 : ! Arguments as Output:
4987 : ! ============================================================================
4988 : ! (7 ) OVR_SRC_SNK_FRC (REAL*8 ) : Fractional overlap of src with snk, Mij.
4989 : !
4990 : ! NOTES
4991 : ! (1 ) Updated comments, cosmetic changes. Also now forces double-precision
4992 : ! with "D" exponents. (tdf, bmy, 4/5/04)
4993 : !******************************************************************************
4994 : !
4995 :
4996 : ! Arguments
4997 : TYPE(HCO_State), POINTER :: HcoState
4998 : INTEGER, INTENT(IN) :: SRC_NBR
4999 : REAL*8, INTENT(IN) :: MDN_SRC(SRC_NBR)
5000 : REAL*8, INTENT(IN) :: GSD_SRC(SRC_NBR)
5001 : INTEGER, INTENT(IN) :: SNK_NBR
5002 : REAL*8, INTENT(IN) :: DMT_MIN_SNK(SNK_NBR)
5003 : REAL*8, INTENT(IN) :: DMT_MAX_SNK(SNK_NBR)
5004 : REAL*8, INTENT(OUT) :: OVR_SRC_SNK_FRC(SRC_NBR,SNK_NBR)
5005 : INTEGER, INTENT(INOUT) :: RC
5006 :
5007 : ! Local
5008 : ! LOGICAL :: FIRST = .TRUE.
5009 : INTEGER :: SRC_IDX ! [idx] Counting index for src
5010 : INTEGER :: SNK_IDX ! [idx] Counting index for snk
5011 : REAL*8 :: LN_GSD ! [frc] ln(gsd)
5012 : REAL*8 :: SQRT2LNGSDI ! [frc] Factor in erf() argument
5013 : REAL*8 :: LNDMAXJOVRDMDNI ! [frc] Factor in erf() argument
5014 : REAL*8 :: LNDMINJOVRDMDNI ! [frc] Factor in erf() argument
5015 : CHARACTER(LEN=255) :: MSG
5016 :
5017 : !=================================================================
5018 : ! OVR_SRC_SNK_FRC_GET begins here
5019 : !=================================================================
5020 :
5021 0 : IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
5022 :
5023 : ! Test if ERF is implemented OK on this platform
5024 : ! 19990913: erf() in SGI /usr/lib64/mips4/libftn.so is bogus
5025 0 : IF ( ABS( 0.8427d0 - ERF(1.0d0) ) / 0.8427d0 > 0.001d0 ) THEN
5026 0 : MSG = 'ERF error 1 in OVR_SRC_SNK_FRC_GET!'
5027 : CALL HCO_ERROR(MSG, RC,
5028 0 : & THISLOC='OVR_SRC_SNK_FRC_GET' )
5029 0 : RETURN
5030 : ENDIF
5031 :
5032 : ! Another ERF check
5033 0 : IF ( ERF( 0.0D0 ) /= 0.0D0 ) THEN
5034 0 : MSG = 'ERF error 2 in OVR_SRC_SNK_FRC_GET!'
5035 : CALL HCO_ERROR(MSG, RC,
5036 0 : & THISLOC='OVR_SRC_SNK_FRC_GET' )
5037 0 : RETURN
5038 : ENDIF
5039 :
5040 : ! Reset first-time flag
5041 : !FIRST = .FALSE.
5042 : ENDIF
5043 :
5044 :
5045 : ! Loop over source index (cf Zender et al eq 12)
5046 0 : DO SRC_IDX = 1, SRC_NBR
5047 :
5048 : ! Fraction
5049 0 : SQRT2LNGSDI = SQRT(2.0D0) * LOG( GSD_SRC(SRC_IDX) )
5050 :
5051 : ! Loop over sink index
5052 0 : DO SNK_IDX = 1, SNK_NBR
5053 :
5054 : ! [fraction]
5055 0 : LNDMAXJOVRDMDNI = LOG(DMT_MAX_SNK(SNK_IDX)/MDN_SRC(SRC_IDX))
5056 :
5057 : ! [fraction]
5058 0 : LNDMINJOVRDMDNI = LOG(DMT_MIN_SNK(SNK_IDX)/MDN_SRC(SRC_IDX))
5059 :
5060 : ! [fraction]
5061 : OVR_SRC_SNK_FRC (SRC_IDX,SNK_IDX)= ! [frc]
5062 : & 0.5D0 * (ERF(LNDMAXJOVRDMDNI/SQRT2LNGSDI)
5063 0 : & - ERF(LNDMINJOVRDMDNI/SQRT2LNGSDI) )
5064 : ENDDO
5065 : ENDDO
5066 :
5067 : ! Return w/ success
5068 0 : RC = HCO_SUCCESS
5069 :
5070 : END SUBROUTINE OVR_SRC_SNK_FRC_GET
5071 :
5072 : !------------------------------------------------------------------------------
5073 :
5074 0 : FUNCTION ERF( X ) RESULT( ERF_VAL )
5075 : !
5076 : !******************************************************************************
5077 : ! Function ERF returns the error function erf(x). See comments heading
5078 : ! routine CALERF below. Author/Date: W. J. Cody, January 8, 1985
5079 : ! (tdf, bmy, 4/5/04)
5080 : !
5081 : ! Arguments as Input:
5082 : ! ============================================================================
5083 : ! (1 ) X (REAL*8) : Argument to erf(x)
5084 : !
5085 : ! NOTES:
5086 : ! (1 ) Updated comments (bmy, 4/5/04)
5087 : !******************************************************************************
5088 : !
5089 : IMPLICIT NONE
5090 :
5091 : ! Arguments
5092 : REAL*8, INTENT(IN) :: X
5093 :
5094 : ! Local variables
5095 : INTEGER :: JINT
5096 : REAL*8 :: RESULT, ERF_VAL
5097 :
5098 : !================================================================
5099 : ! ERF begins here!
5100 : !================================================================
5101 0 : JINT = 0
5102 0 : CALL CALERF( X, RESULT, JINT )
5103 0 : ERF_VAL = RESULT
5104 :
5105 : ! Return to calling program
5106 0 : END FUNCTION ERF
5107 :
5108 : !------------------------------------------------------------------------------
5109 :
5110 0 : SUBROUTINE CALERF( ARG, RESULT, JINT )
5111 : !
5112 : !******************************************************************************
5113 : ! This packet evaluates erf(x), erfc(x), and exp(x*x)*erfc(x)
5114 : ! for a real argument x. It contains three function type
5115 : ! subprograms: erf, erfc, and erfcx (or derf, derfc, and derfcx),
5116 : ! and one subroutine type subprogram, calerf. The calling
5117 : ! statements for the primary entries are:
5118 : !
5119 : ! y=erf(x) (or y=derf(x)),
5120 : ! y=erfc(x) (or y=derfc(x)),
5121 : ! and
5122 : ! y=erfcx(x) (or y=derfcx(x)).
5123 : !
5124 : ! The routine calerf is intended for internal packet use only,
5125 : ! all computations within the packet being concentrated in this
5126 : ! routine. The function subprograms invoke calerf with the
5127 : ! statement
5128 : ! call calerf(arg,result,jint)
5129 : ! where the parameter usage is as follows
5130 : !
5131 : ! Function Parameters for calerf
5132 : ! Call Arg Result Jint
5133 : !
5134 : ! erf(arg) any real argument erf(arg) 0
5135 : ! erfc(arg) abs(arg) < xbig erfc(arg) 1
5136 : ! erfcx(arg) xneg < arg < xmax erfcx(arg) 2
5137 : !
5138 : ! The main computation evaluates near-minimax approximations:
5139 : ! from "Rational Chebyshev Approximations for the Error Function"
5140 : ! by W. J. Cody, Math. Comp., 1969, pp. 631-638. This
5141 : ! transportable program uses rational functions that theoretically
5142 : ! approximate erf(x) and erfc(x) to at least 18 significant
5143 : ! decimal digits. The accuracy achieved depends on the arithmetic
5144 : ! system, the compiler, the intrinsic functions, and proper
5145 : ! selection of the machine-dependent constants.
5146 : !
5147 : ! Explanation of machine-dependent constants:
5148 : ! xmin = The smallest positive floating-point number.
5149 : ! xinf = The largest positive finite floating-point number.
5150 : ! xneg = The largest negative argument acceptable to erfcx;
5151 : ! the negative of the solution to the equation
5152 : ! 2*exp(x*x) = xinf.
5153 : ! xsmall = Argument below which erf(x) may be represented by
5154 : ! 2*x/sqrt(pi) and above which x*x will not underflow.
5155 : ! A conservative value is the largest machine number x
5156 : ! such that 1.0 + x = 1.0 to machine precision.
5157 : ! xbig = Largest argument acceptable to erfc; solution to
5158 : ! the equation: w(x)* (1-0.5/x**2) = xmin, where
5159 : ! w(x) = exp(-x*x)/[x*sqrt(pi)].
5160 : ! xhuge = Argument above which 1.0 - 1/(2*x*x) = 1.0 to
5161 : ! machine precision. a conservative value is
5162 : ! 1/[2*sqrt(xsmall)]
5163 : ! xmax = Largest acceptable argument to erfcx; the minimum
5164 : ! of xinf and 1/[sqrt(pi)*xmin].
5165 : !
5166 : ! Approximate values for some important machines are:
5167 : ! xmin xinf xneg xsmall
5168 : ! CDC 7600 (s.p.) 3.13e-294 1.26e+322 -27.220 7.11e-15
5169 : ! Cray-1 (s.p.) 4.58e-2467 5.45e+2465 -75.345 7.11e-15
5170 : ! IEEE (IBM/XT,
5171 : ! Sun, etc.) (s.p.) 1.18e-38 3.40e+38 -9.382 5.96e-8
5172 : ! IEEE (IBM/XT,
5173 : ! Sun, etc.) (d.p.) 2.23d-308 1.79d+308 -26.628 1.11d-16
5174 : ! IBM 195 (d.p.) 5.40d-79 7.23e+75 -13.190 1.39d-17
5175 : ! Univac 1108 (d.p.) 2.78d-309 8.98d+307 -26.615 1.73d-18
5176 : ! Vax d-format (d.p.) 2.94d-39 1.70d+38 -9.345 1.39d-17
5177 : ! Vax g-format (d.p.) 5.56d-309 8.98d+307 -26.615 1.11d-16
5178 : !
5179 : ! xbig xhuge xmax
5180 : ! CDC 7600 (s.p.) 25.922 8.39e+6 1.80x+293
5181 : ! Cray-1 (s.p.) 75.326 8.39e+6 5.45e+2465
5182 : ! IEEE (IBM/XT,
5183 : ! Sun, etc.) (s.p.) 9.194 2.90e+3 4.79e+37
5184 : ! IEEE (IBM/XT,
5185 : ! Sun, etc.) (d.p.) 26.543 6.71d+7 2.53d+307
5186 : ! IBM 195 (d.p.) 13.306 1.90d+8 7.23e+75
5187 : ! Univac 1108 (d.p.) 26.582 5.37d+8 8.98d+307
5188 : ! Vax d-format (d.p.) 9.269 1.90d+8 1.70d+38
5189 : ! Vax g-format (d.p.) 26.569 6.71d+7 8.98d+307
5190 : !
5191 : ! Error returns:
5192 : ! The program returns erfc = 0 for arg >= xbig;
5193 : ! erfcx = xinf for arg < xneg;
5194 : ! and
5195 : ! erfcx = 0 for arg >= xmax.
5196 : !
5197 : ! Intrinsic functions required are:
5198 : ! abs, aint, exp
5199 : !
5200 : ! Author: W. J. Cody
5201 : ! Mathematics And Computer Science Division
5202 : ! Argonne National Laboratory
5203 : ! Argonne, IL 60439
5204 : ! Latest modification: March 19, 1990
5205 : !
5206 : ! NOTES:
5207 : ! (1 ) Now force double-precision w/ "D" exponents (bmy, 4/5/04)
5208 : !******************************************************************************
5209 : !
5210 : IMPLICIT NONE
5211 : INTEGER I,JINT
5212 : REAL*8 A,ARG,B,C,D,DEL,FOUR,HALF,P,ONE,Q,RESULT,SIXTEN,SQRPI,
5213 : & TWO,THRESH,X,XBIG,XDEN,XHUGE,XINF,XMAX,XNEG,XNUM,XSMALL,
5214 : & Y,YSQ,ZERO
5215 : DIMENSION A(5),B(4),C(9),D(8),P(6),Q(5)
5216 :
5217 : ! Mathematical constants
5218 : data four,one,half,two,zero/4.0d0,1.0d0,0.5d0,2.0d0,0.0d0/,
5219 : & sqrpi/5.6418958354775628695d-1/,thresh/0.46875d0/,
5220 : & sixten/16.0d0/
5221 :
5222 : ! Machine-dependent constants
5223 : data xinf,xneg,xsmall/3.40d+38,-9.382d0,5.96d-8/,
5224 : & xbig,xhuge,xmax/9.194d0,2.90d3,4.79d37/
5225 :
5226 : ! Coefficients for approximation to erf in first interval
5227 : data a /3.16112374387056560d00,1.13864154151050156d02,
5228 : & 3.77485237685302021d02,3.20937758913846947d03,
5229 : & 1.85777706184603153d-1/
5230 :
5231 : data b /2.36012909523441209d01,2.44024637934444173d02,
5232 : & 1.28261652607737228d03,2.84423683343917062d03/
5233 :
5234 : ! Coefficients for approximation to erfc in second interval
5235 : data c /5.64188496988670089d-1,8.88314979438837594d0,
5236 : & 6.61191906371416295d01,2.98635138197400131d02,
5237 : & 8.81952221241769090d02,1.71204761263407058d03,
5238 : & 2.05107837782607147d03,1.23033935479799725d03,
5239 : & 2.15311535474403846d-8/
5240 :
5241 : data d /1.57449261107098347d01,1.17693950891312499d02,
5242 : & 5.37181101862009858d02,1.62138957456669019d03,
5243 : & 3.29079923573345963d03,4.36261909014324716d03,
5244 : & 3.43936767414372164d03,1.23033935480374942d03/
5245 :
5246 : ! Coefficients for approximation to erfc in third interval
5247 : data p /3.05326634961232344d-1,3.60344899949804439d-1,
5248 : & 1.25781726111229246d-1,1.60837851487422766d-2,
5249 : & 6.58749161529837803d-4,1.63153871373020978d-2/
5250 :
5251 : data q /2.56852019228982242d00,1.87295284992346047d00,
5252 : & 5.27905102951428412d-1,6.05183413124413191d-2,
5253 : & 2.33520497626869185d-3/
5254 :
5255 : c Main Code
5256 0 : x=arg
5257 0 : y=abs(x)
5258 0 : if (y <= thresh) then
5259 : c Evaluate erf for |x| <= 0.46875
5260 0 : ysq=zero
5261 0 : if (y > xsmall) ysq=y*y
5262 0 : xnum=a(5)*ysq
5263 0 : xden=ysq
5264 0 : do i=1,3
5265 0 : xnum=(xnum+a(i))*ysq
5266 0 : xden=(xden+b(i))*ysq
5267 : end do
5268 0 : result=x*(xnum+a(4))/(xden+b(4))
5269 0 : if (jint /= 0) result=one-result
5270 0 : if (jint == 2) result=exp(ysq)*result
5271 : go to 800
5272 :
5273 : c Evaluate erfc for 0.46875 <= |x| <= 4.0
5274 0 : else if (y <= four) then
5275 0 : xnum=c(9)*y
5276 0 : xden=y
5277 0 : do i=1,7
5278 0 : xnum=(xnum+c(i))*y
5279 0 : xden=(xden+d(i))*y
5280 : end do
5281 0 : result=(xnum+c(8))/(xden+d(8))
5282 0 : if (jint /= 2) then
5283 0 : ysq=aint(y*sixten)/sixten
5284 0 : del=(y-ysq)*(y+ysq)
5285 0 : result=exp(-ysq*ysq)*exp(-del)*result
5286 : end if
5287 :
5288 : c Evaluate erfc for |x| > 4.0
5289 : else
5290 0 : result=zero
5291 0 : if (y >= xbig) then
5292 0 : if ((jint /= 2).or.(y >= xmax)) go to 300
5293 0 : if (y >= xhuge) then
5294 0 : result=sqrpi/y
5295 0 : go to 300
5296 : end if
5297 : end if
5298 0 : ysq=one/(y*y)
5299 0 : xnum=p(6)*ysq
5300 0 : xden=ysq
5301 0 : do i=1,4
5302 0 : xnum=(xnum+p(i))*ysq
5303 0 : xden=(xden+q(i))*ysq
5304 : end do
5305 0 : result=ysq*(xnum+p(5))/(xden+q(5))
5306 0 : result=(sqrpi-result)/y
5307 0 : if (jint /= 2) then
5308 0 : ysq=aint(y*sixten)/sixten
5309 0 : del=(y-ysq)*(y+ysq)
5310 0 : result=exp(-ysq*ysq)*exp(-del)*result
5311 : end if
5312 : end if
5313 :
5314 : c Fix up for negative argument, erf, etc.
5315 0 : 300 if (jint == 0) then
5316 0 : result=(half-result)+half
5317 0 : if (x < zero) result=-result
5318 0 : else if (jint == 1) then
5319 0 : if (x < zero) result=two-result
5320 : else
5321 0 : if (x < zero) then
5322 0 : if (x < xneg) then
5323 0 : result=xinf
5324 : else
5325 0 : ysq=aint(x*sixten)/sixten
5326 0 : del=(x-ysq)*(x+ysq)
5327 0 : y=exp(ysq*ysq)*exp(del)
5328 0 : result=(y+y)-result
5329 : end if
5330 : end if
5331 : end if
5332 0 : 800 return
5333 :
5334 : ! Return to calling program
5335 : END SUBROUTINE CALERF
5336 :
5337 : !------------------------------------------------------------------------------
5338 :
5339 0 : SUBROUTINE PLN_TYP_GET( PLN_TYP, PLN_FRC, TAI )
5340 :
5341 : !
5342 : !******************************************************************************
5343 : ! Subroutine PLN_TYPE_GET returns LSM information needed by the DEAD
5344 : ! dust parameterization. (tdf, bmy, 4/5/04)
5345 : !
5346 : ! Arguments as Output:
5347 : ! ============================================================================
5348 : ! (1 ) PLN_TYP (INTEGER) : LSM plant type index (1..14)
5349 : ! (2 ) PLN_TYP (REAL*8 ) : Weight of corresponding plant type (sums to 1.0)
5350 : ! (3 ) TAI (REAL*8 ) : Leaf-area index (one sided) [index]
5351 : !
5352 : ! NOTES:
5353 : ! (1 ) Updated comments. Now force double-precision w/ "D" exponents.
5354 : ! (bmy, 4/5/04)
5355 : !******************************************************************************
5356 : !
5357 : ! Arguments
5358 : INTEGER, INTENT(OUT) :: PLN_TYP(0:28,3)
5359 : REAL*8, INTENT(OUT) :: PLN_FRC(0:28,3)
5360 : REAL*8, INTENT(OUT) :: TAI(14,12)
5361 :
5362 : ! Local variables
5363 : INTEGER :: I, J
5364 :
5365 : !=================================================================
5366 : ! There are 29 land surface types: 0 = ocean, 1 to 28 = land.
5367 : ! Each land point has up to three vegetation types, ranging in
5368 : ! value from 1 to 14. PLN_TYPE contains the vegetation type of
5369 : ! the 3 subgrid points for each surface type. PLN_FRC contains
5370 : ! the fractional area of the 3 subgrid points for each surface
5371 : ! type.
5372 : !=================================================================
5373 : PLN_TYP(0:28,1) = (/ 0,
5374 : & 14, 14, 1, 2, 4, 1 , 1,
5375 : & 4, 1, 3, 5, 13, 1, 2,
5376 : & 11, 11, 6, 13, 9, 7, 8,
5377 0 : & 8, 12, 11, 12, 11, 3, 14/)
5378 :
5379 : PLN_FRC(0:28,1) = (/ 0.00d0,
5380 : & 1.00d0, 1.00d0, 0.75d0, 0.50d0,
5381 : & 0.75d0, 0.37d0, 0.75d0,
5382 : & 0.75d0, 0.37d0, 0.95d0, 0.75d0,
5383 : & 0.70d0, 0.25d0, 0.25d0,
5384 : & 0.40d0, 0.40d0, 0.60d0, 0.60d0,
5385 : & 0.30d0, 0.80d0, 0.80d0,
5386 : & 0.10d0, 0.85d0, 0.85d0, 0.85d0,
5387 0 : & 0.85d0, 0.80d0, 1.00d0/)
5388 :
5389 :
5390 : PLN_TYP(0:28,2) = (/ 0,
5391 : & 14, 14, 14, 14, 14, 4 ,14,
5392 : & 14, 4, 14, 14, 5, 10, 10,
5393 : & 4, 4, 13, 6, 10, 14, 14,
5394 0 : & 14, 14, 14, 14, 14, 14, 14/)
5395 :
5396 : PLN_FRC(0:28,2) = (/ 0.00d0,
5397 : & 0.00d0, 0.00d0, 0.25d0, 0.50d0,
5398 : & 0.25d0, 0.37d0, 0.25d0,
5399 : & 0.25d0, 0.37d0, 0.05d0, 0.25d0,
5400 : & 0.30d0, 0.25d0, 0.25d0,
5401 : & 0.30d0, 0.30d0, 0.20d0, 0.20d0,
5402 : & 0.30d0, 0.20d0, 0.20d0,
5403 : & 0.90d0, 0.15d0, 0.15d0, 0.15d0,
5404 0 : & 0.15d0, 0.20d0, 0.00d0/)
5405 :
5406 : PLN_TYP(0:28,3) = (/ 0,
5407 : & 14, 14, 14, 14, 14, 14, 14,
5408 : & 14, 14, 14, 14, 14, 14, 14,
5409 : & 1, 1, 14, 14, 14, 14, 14,
5410 0 : & 14, 14, 14, 14, 14, 14, 14/)
5411 :
5412 : PLN_FRC(0:28,3) = (/ 0.00d0,
5413 : & 0.00d0, 0.00d0, 0.00d0, 0.00d0,
5414 : & 0.00d0, 0.26d0, 0.00d0,
5415 : & 0.00d0, 0.26d0, 0.00d0, 0.00d0,
5416 : & 0.00d0, 0.50d0, 0.50d0,
5417 : & 0.30d0, 0.30d0, 0.20d0, 0.20d0,
5418 : & 0.40d0, 0.00d0, 0.00d0,
5419 : & 0.00d0, 0.00d0, 0.00d0, 0.00d0,
5420 0 : & 0.00d0, 0.00d0, 0.00d0/)
5421 :
5422 : !=================================================================
5423 : ! ----------------------------------------------------------------
5424 : ! description of the 29 surface types
5425 : ! ----------------------------------------------------------------
5426 : !
5427 : ! no vegetation
5428 : ! -------------
5429 : ! 0 ocean
5430 : ! 1 land ice (glacier)
5431 : ! 2 desert
5432 : !
5433 : ! forest vegetation
5434 : ! -----------------
5435 : ! 3 cool needleleaf evergreen tree
5436 : ! 4 cool needleleaf deciduous tree
5437 : ! 5 cool broadleaf deciduous tree
5438 : ! 6 cool mixed needleleaf evergreen and broadleaf deciduous tree
5439 : ! 7 warm needleleaf evergreen tree
5440 : ! 8 warm broadleaf deciduous tree
5441 : ! 9 warm mixed needleleaf evergreen and broadleaf deciduous tree
5442 : ! 10 tropical broadleaf evergreen tree
5443 : ! 11 tropical seasonal deciduous tree
5444 : !
5445 : ! interrupted woods
5446 : ! ----------------
5447 : ! 12 savanna
5448 : ! 13 evergreen forest tundra
5449 : ! 14 deciduous forest tundra
5450 : ! 15 cool forest crop
5451 : ! 16 warm forest crop
5452 : !
5453 : ! non-woods
5454 : ! ---------
5455 : ! 17 cool grassland
5456 : ! 18 warm grassland
5457 : ! 19 tundra
5458 : ! 20 evergreen shrub
5459 : ! 21 deciduous shrub
5460 : ! 22 semi-desert
5461 : ! 23 cool irrigated crop
5462 : ! 24 cool non-irrigated crop
5463 : ! 25 warm irrigated crop
5464 : ! 26 warm non-irrigated crop
5465 : !
5466 : ! wetlands
5467 : ! --------
5468 : ! 27 forest (mangrove)
5469 : ! 28 non-forest
5470 : !
5471 : ! ----------------------------------------------------------------
5472 : ! description of the 14 plant types. see vegconi.F for
5473 : ! parameters that depend on vegetation type
5474 : ! ----------------------------------------------------------------
5475 : !
5476 : ! 1 = needleleaf evergreen tree
5477 : ! 2 = needleleaf deciduous tree
5478 : ! 3 = broadleaf evergreen tree
5479 : ! 4 = broadleaf deciduous tree
5480 : ! 5 = tropical seasonal tree
5481 : ! 6 = cool grass (c3)
5482 : ! 7 = evergreen shrub
5483 : ! 8 = deciduous shrub
5484 : ! 9 = arctic deciduous shrub
5485 : ! 10 = arctic grass
5486 : ! 11 = crop
5487 : ! 12 = irrigated crop
5488 : ! 13 = warm grass (c4)
5489 : ! 14 = not vegetated
5490 : !=================================================================
5491 :
5492 : ! TAI = monthly leaf area index + stem area index, one-sided
5493 : TAI(1,1:12) = (/ 4.5d0, 4.7d0, 5.0d0, 5.1d0, 5.3d0, 5.5d0,
5494 0 : & 5.3d0, 5.3d0, 5.2d0, 4.9d0, 4.6d0, 4.5d0 /)
5495 :
5496 : TAI(2,1:12) = (/ 0.3d0, 0.3d0, 0.3d0, 1.0d0, 1.6d0, 2.4d0,
5497 0 : & 4.3d0, 2.9d0, 2.0d0, 1.3d0, 0.8d0, 0.5d0 /)
5498 :
5499 : TAI(3,1:12) = (/ 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0,
5500 0 : & 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0 /)
5501 :
5502 : TAI(4,1:12) = (/ 0.4d0, 0.4d0, 0.7d0, 1.6d0, 3.5d0, 5.1d0,
5503 0 : & 5.4d0, 4.8d0, 3.8d0, 1.7d0, 0.6d0, 0.4d0 /)
5504 :
5505 : TAI(5,1:12) = (/ 1.2d0, 1.0d0, 0.9d0, 0.8d0, 0.8d0, 1.0d0,
5506 0 : & 2.0d0, 3.7d0, 3.2d0, 2.7d0, 1.9d0, 1.2d0 /)
5507 :
5508 : TAI(6,1:12) = (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
5509 0 : & 4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
5510 :
5511 : TAI(7,1:12) = (/ 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0,
5512 0 : & 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0 /)
5513 :
5514 : TAI(8,1:12) = (/ 1.0d0, 1.0d0, 0.8d0, 0.3d0, 0.6d0, 0.0d0,
5515 0 : & 0.1d0, 0.3d0, 0.5d0, 0.6d0, 0.7d0, 0.9d0 /)
5516 :
5517 : TAI(9,1:12) = (/ 0.1d0, 0.1d0, 0.1d0, 0.1d0, 0.1d0, 0.3d0,
5518 0 : & 1.5d0, 1.7d0, 1.4d0, 0.1d0, 0.1d0, 0.1d0 /)
5519 :
5520 : TAI(10,1:12) = (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
5521 0 : & 4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
5522 :
5523 : TAI(11,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.0d0, 2.0d0,
5524 0 : & 3.0d0, 3.0d0, 1.5d0, 0.0d0, 0.0d0, 0.0d0 /)
5525 :
5526 : TAI(12,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.0d0, 2.0d0,
5527 0 : & 3.0d0, 3.0d0, 1.5d0, 0.0d0, 0.0d0, 0.0d0 /)
5528 :
5529 : TAI(13,1:12) = (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
5530 0 : & 4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
5531 :
5532 : TAI(14,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0,
5533 0 : & 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0 /)
5534 :
5535 : ! Return to calling program
5536 0 : END SUBROUTINE PLN_TYP_GET
5537 :
5538 : !******************************************************************************
5539 : !------------------------------------------------------------------------------
5540 : ! Harmonized Emissions Component (HEMCO) !
5541 : !------------------------------------------------------------------------------
5542 : !BOP
5543 : !
5544 : ! !IROUTINE: InstGet
5545 : !
5546 : ! !DESCRIPTION: Subroutine InstGet returns a pointer to the desired instance.
5547 : !\\
5548 : !\\
5549 : ! !INTERFACE:
5550 : !
5551 0 : SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
5552 : !
5553 : ! !INPUT PARAMETERS:
5554 : !
5555 : INTEGER :: Instance
5556 : TYPE(MyInst), POINTER :: Inst
5557 : INTEGER :: RC
5558 : TYPE(MyInst), POINTER, OPTIONAL :: PrevInst
5559 : !
5560 : ! !REVISION HISTORY:
5561 : ! 18 Feb 2016 - C. Keller - Initial version
5562 : ! See https://github.com/geoschem/hemco for complete history
5563 : !EOP
5564 : !------------------------------------------------------------------------------
5565 : !BOC
5566 : TYPE(MyInst), POINTER :: PrvInst
5567 :
5568 : !=================================================================
5569 : ! InstGet begins here!
5570 : !=================================================================
5571 :
5572 : ! Get instance. Also archive previous instance.
5573 0 : PrvInst => NULL()
5574 0 : Inst => AllInst
5575 0 : DO WHILE ( ASSOCIATED(Inst) )
5576 0 : IF ( Inst%Instance == Instance ) EXIT
5577 0 : PrvInst => Inst
5578 0 : Inst => Inst%NextInst
5579 : END DO
5580 0 : IF ( .NOT. ASSOCIATED( Inst ) ) THEN
5581 0 : RC = HCO_FAIL
5582 0 : RETURN
5583 : ENDIF
5584 :
5585 : ! Pass output arguments
5586 0 : IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
5587 :
5588 : ! Cleanup & Return
5589 0 : PrvInst => NULL()
5590 0 : RC = HCO_SUCCESS
5591 :
5592 : END SUBROUTINE InstGet
5593 : !EOC
5594 : !------------------------------------------------------------------------------
5595 : ! Harmonized Emissions Component (HEMCO) !
5596 : !------------------------------------------------------------------------------
5597 : !BOP
5598 : !
5599 : ! !IROUTINE: InstCreate
5600 : !
5601 : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
5602 : !\\
5603 : !\\
5604 : ! !INTERFACE:
5605 : !
5606 0 : SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
5607 : !
5608 : ! !INPUT PARAMETERS:
5609 : !
5610 : INTEGER, INTENT(IN) :: ExtNr
5611 : !
5612 : ! !OUTPUT PARAMETERS:
5613 : !
5614 : INTEGER, INTENT( OUT) :: Instance
5615 : TYPE(MyInst), POINTER :: Inst
5616 : !
5617 : ! !INPUT/OUTPUT PARAMETERS:
5618 : !
5619 : INTEGER, INTENT(INOUT) :: RC
5620 : !
5621 : ! !REVISION HISTORY:
5622 : ! 18 Feb 2016 - C. Keller - Initial version
5623 : ! See https://github.com/geoschem/hemco for complete history
5624 : !EOP
5625 : !------------------------------------------------------------------------------
5626 : !BOC
5627 : TYPE(MyInst), POINTER :: TmpInst
5628 : INTEGER :: nnInst
5629 :
5630 : !=================================================================
5631 : ! InstCreate begins here!
5632 : !=================================================================
5633 :
5634 : ! ----------------------------------------------------------------
5635 : ! Generic instance initialization
5636 : ! ----------------------------------------------------------------
5637 :
5638 : ! Initialize
5639 0 : Inst => NULL()
5640 :
5641 : ! Get number of already existing instances
5642 0 : TmpInst => AllInst
5643 0 : nnInst = 0
5644 0 : DO WHILE ( ASSOCIATED(TmpInst) )
5645 0 : nnInst = nnInst + 1
5646 0 : TmpInst => TmpInst%NextInst
5647 : END DO
5648 :
5649 : ! Create new instance
5650 0 : ALLOCATE(Inst)
5651 0 : Inst%Instance = nnInst + 1
5652 0 : Inst%ExtNr = ExtNr
5653 :
5654 : ! Attach to instance list
5655 0 : Inst%NextInst => AllInst
5656 0 : AllInst => Inst
5657 :
5658 : ! Update output instance
5659 0 : Instance = Inst%Instance
5660 :
5661 : ! ----------------------------------------------------------------
5662 : ! Type specific initialization statements follow below
5663 : ! ----------------------------------------------------------------
5664 0 : Inst%ERD_FCT_GEO => NULL()
5665 0 : Inst%SRCE_FUNC => NULL()
5666 0 : Inst%LND_FRC_DRY => NULL()
5667 0 : Inst%MSS_FRC_CACO3 => NULL()
5668 0 : Inst%MSS_FRC_SND => NULL()
5669 0 : Inst%SFC_TYP => NULL()
5670 0 : Inst%VAI_DST => NULL()
5671 :
5672 : ! Return w/ success
5673 0 : RC = HCO_SUCCESS
5674 :
5675 0 : END SUBROUTINE InstCreate
5676 : !EOC
5677 : !------------------------------------------------------------------------------
5678 : ! Harmonized Emissions Component (HEMCO) !
5679 : !------------------------------------------------------------------------------
5680 : !BOP
5681 : !
5682 : ! !IROUTINE: InstRemove
5683 : !
5684 : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
5685 : !\\
5686 : !\\
5687 : ! !INTERFACE:
5688 : !
5689 0 : SUBROUTINE InstRemove ( Instance )
5690 : !
5691 : ! !INPUT PARAMETERS:
5692 : !
5693 : INTEGER :: Instance
5694 : !
5695 : ! !REVISION HISTORY:
5696 : ! 18 Feb 2016 - C. Keller - Initial version
5697 : ! See https://github.com/geoschem/hemco for complete history
5698 : !EOP
5699 : !------------------------------------------------------------------------------
5700 : !BOC
5701 : INTEGER :: RC
5702 : TYPE(MyInst), POINTER :: PrevInst
5703 : TYPE(MyInst), POINTER :: Inst
5704 :
5705 : !=================================================================
5706 : ! InstRemove begins here!
5707 : !=================================================================
5708 :
5709 : ! Get instance. Also archive previous instance.
5710 0 : PrevInst => NULL()
5711 0 : Inst => NULL()
5712 0 : CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
5713 :
5714 : ! Instance-specific deallocation
5715 0 : IF ( ASSOCIATED(Inst) ) THEN
5716 :
5717 : !--------------------------------------------------------------
5718 : ! Deallocate fields of Inst before popping off from the list
5719 : ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
5720 : !--------------------------------------------------------------
5721 0 : IF ( ASSOCIATED( Inst%ERD_FCT_GEO ) ) THEN
5722 0 : DEALLOCATE(Inst%ERD_FCT_GEO )
5723 : ENDIF
5724 0 : Inst%ERD_FCT_GEO => NULL()
5725 :
5726 0 : IF ( ASSOCIATED( Inst%SRCE_FUNC ) ) THEN
5727 0 : DEALLOCATE(Inst%SRCE_FUNC )
5728 : ENDIF
5729 0 : Inst%SRCE_FUNC => NULL()
5730 :
5731 0 : IF ( ASSOCIATED( Inst%LND_FRC_DRY ) ) THEN
5732 0 : DEALLOCATE(Inst%LND_FRC_DRY )
5733 : ENDIF
5734 0 : Inst%LND_FRC_DRY => NULL()
5735 :
5736 0 : IF ( ASSOCIATED( Inst%MSS_FRC_CACO3 ) ) THEN
5737 0 : DEALLOCATE(Inst%MSS_FRC_CACO3)
5738 : ENDIF
5739 0 : Inst%MSS_FRC_CACO3 => NULL()
5740 :
5741 0 : IF ( ASSOCIATED( Inst%MSS_FRC_CLY ) ) THEN
5742 0 : DEALLOCATE(Inst%MSS_FRC_CLY)
5743 : ENDIF
5744 0 : Inst%MSS_FRC_CLY => NULL()
5745 :
5746 0 : IF ( ASSOCIATED( Inst%MSS_FRC_SND ) ) THEN
5747 0 : DEALLOCATE(Inst%MSS_FRC_SND )
5748 : ENDIF
5749 0 : Inst%MSS_FRC_SND => NULL()
5750 :
5751 0 : IF ( ASSOCIATED( Inst%SFC_TYP ) ) THEN
5752 0 : DEALLOCATE(Inst%SFC_TYP )
5753 : ENDIF
5754 0 : Inst%SFC_TYP => NULL()
5755 :
5756 0 : IF ( ASSOCIATED( Inst%VAI_DST ) ) THEN
5757 0 : DEALLOCATE(Inst%VAI_DST )
5758 : ENDIF
5759 0 : Inst%VAI_DST => NULL()
5760 :
5761 0 : IF ( ALLOCATED( Inst%PLN_TYP ) ) THEN
5762 0 : DEALLOCATE( Inst%PLN_TYP )
5763 : ENDIF
5764 :
5765 0 : IF ( ALLOCATED( Inst%PLN_FRC ) ) THEN
5766 0 : DEALLOCATE( Inst%PLN_FRC )
5767 : ENDIF
5768 :
5769 0 : IF ( ALLOCATED( Inst%TAI ) ) THEN
5770 0 : DEALLOCATE( Inst%TAI )
5771 : ENDIF
5772 :
5773 0 : IF ( ALLOCATED( Inst%DMT_VWR ) ) THEN
5774 0 : DEALLOCATE( Inst%DMT_VWR )
5775 : ENDIF
5776 :
5777 0 : IF ( ALLOCATED( Inst%OVR_SRC_SNK_FRC ) ) THEN
5778 0 : DEALLOCATE( Inst%OVR_SRC_SNK_FRC )
5779 : ENDIF
5780 :
5781 0 : IF ( ALLOCATED( Inst%OVR_SRC_SNK_MSS ) ) THEN
5782 0 : DEALLOCATE( Inst%OVR_SRC_SNK_MSS )
5783 : ENDIF
5784 :
5785 0 : IF ( ALLOCATED( Inst%DMT_MIN ) ) THEN
5786 0 : DEALLOCATE( Inst%DMT_MIN )
5787 : ENDIF
5788 :
5789 0 : IF ( ALLOCATED( Inst%DMT_MAX ) ) THEN
5790 0 : DEALLOCATE( Inst%DMT_MAX )
5791 : ENDIF
5792 :
5793 0 : IF ( ALLOCATED( Inst%DMT_VMA_SRC ) ) THEN
5794 0 : DEALLOCATE( Inst%DMT_VMA_SRC )
5795 : ENDIF
5796 :
5797 0 : IF ( ALLOCATED( Inst%GSD_ANL_SRC ) ) THEN
5798 0 : DEALLOCATE( Inst%GSD_ANL_SRC )
5799 : ENDIF
5800 :
5801 0 : IF ( ALLOCATED( Inst%MSS_FRC_SRC ) ) THEN
5802 0 : DEALLOCATE( Inst%MSS_FRC_SRC )
5803 : ENDIF
5804 :
5805 0 : IF ( ALLOCATED( Inst%HcoIDs ) ) THEN
5806 0 : DEALLOCATE( Inst%HcoIDs )
5807 : ENDIF
5808 :
5809 0 : IF ( ALLOCATED( Inst%HcoIDsALK ) ) THEN
5810 0 : DEALLOCATE( Inst%HcoIDsALK )
5811 : ENDIF
5812 :
5813 : !--------------------------------------------------------------
5814 : ! Pop off instance from list
5815 : !--------------------------------------------------------------
5816 0 : IF ( ASSOCIATED(PrevInst) ) THEN
5817 0 : PrevInst%NextInst => Inst%NextInst
5818 : ELSE
5819 0 : AllInst => Inst%NextInst
5820 : ENDIF
5821 0 : DEALLOCATE(Inst)
5822 :
5823 : ENDIF
5824 :
5825 : ! Free pointers before exiting
5826 0 : PrevInst => NULL()
5827 0 : Inst => NULL()
5828 :
5829 0 : END SUBROUTINE InstRemove
5830 : !EOC
5831 : #if defined ( MODEL_GEOS )
5832 : !------------------------------------------------------------------------------
5833 : SUBROUTINE ReadTuningFactor(HcoState, TuningTable, FCT, RC )
5834 : !
5835 : USE HCO_CharTools_Mod
5836 : USE HCO_inquireMod, ONLY : findFreeLUN
5837 :
5838 : ! Arguments
5839 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state
5840 : CHARACTER(LEN=*), INTENT(IN) :: TuningTable
5841 : REAL*8 , INTENT(INOUT) :: FCT
5842 : INTEGER , INTENT(INOUT) :: RC
5843 :
5844 : ! Return value
5845 :
5846 : ! Local variables
5847 : REAL(hp) :: AM2, RES
5848 : INTEGER :: IU, IDX
5849 : CHARACTER(LEN=7) :: CSLABEL, FNDLABEL
5850 : CHARACTER(LEN=255) :: MSG, LINE, ICSL
5851 : LOGICAL :: EX, EOF
5852 :
5853 : CHARACTER(LEN=255), PARAMETER :: LOC =
5854 : & 'ReadTuningFactor (hcox_dustdead_mod)'
5855 :
5856 : !================================================================
5857 : ! ReadTuningFactor begins here!
5858 : !================================================================
5859 :
5860 : ! Enter
5861 : CALL HCO_ENTER ( HcoState%Config%Err, LOC, RC )
5862 :
5863 : ! Init
5864 : FCT = -999.0
5865 :
5866 : ! Determine resolution based on grid cell area
5867 : CSLABEL = 'UNKNOWN'
5868 : FNDLABEL = TRIM(CSLABEL)
5869 : IF ( .NOT. HcoState%Grid%AREA_M2%Alloc ) THEN
5870 : MSG = 'Warning: AREA_M2 not found, will use default number'
5871 : CALL HCO_WARNING( MSG, RC, .TRUE., LOC )
5872 : ELSE
5873 : AM2 = SUM(HcoState%Grid%AREA_M2%Val)/(HcoState%NX*HcoState%NY)
5874 : RES = SQRT(AM2)
5875 : IF ( RES > 280.0_hp ) THEN
5876 : CSLABEL = 'C24'
5877 : ELSEIF ( RES > 140.0_hp .AND. RES <= 280.0_hp ) THEN
5878 : CSLABEL = 'C48'
5879 : ELSEIF ( RES > 70.0_hp .AND. RES <= 140.0_hp ) THEN
5880 : CSLABEL = 'C90'
5881 : ELSEIF ( RES > 35.0_hp .AND. RES <= 70.0_hp ) THEN
5882 : CSLABEL = 'C180'
5883 : ELSEIF ( RES > 17.5_hp .AND. RES <= 35.0_hp ) THEN
5884 : CSLABEL = 'C360'
5885 : ELSEIF ( RES > 8.75_hp .AND. RES <= 17.5_hp ) THEN
5886 : CSLABEL = 'C720'
5887 : ELSEIF ( RES > 4.375_hp .AND. RES <= 8.75_hp ) THEN
5888 : CSLABEL = 'C1440'
5889 : ELSEIF ( RES <= 4.375_hp ) THEN
5890 : CSLABEL = 'C2880'
5891 : ENDIF
5892 : ENDIF
5893 :
5894 : ! Open file
5895 : INQUIRE( FILE=TRIM(TuningTable), EXIST=EX )
5896 : IF ( .NOT. EX ) THEN
5897 : MSG = 'FILE NOT FOUND: '//TRIM(TuningTable)
5898 : CALL HCO_ERROR( MSG, RC, THISLOC=LOC )
5899 : RETURN
5900 : ENDIF
5901 : IU = findFreeLUN()
5902 : OPEN( IU, FILE=TRIM(TuningTable) )
5903 :
5904 : ! Search for resolution entry in file, assuming they are listed as follows:
5905 : ! C360: 1.0
5906 : ! C48: 2.0e2
5907 : ! C90: 1.0e-4
5908 : DO
5909 : CALL HCO_ReadLine ( IU, LINE, EOF, RC )
5910 : IF ( EOF ) EXIT
5911 : IDX = INDEX( LINE, ':' )
5912 : IF ( IDX > 0 ) ICSL = ADJUSTL(LINE(1:(IDX-1)))
5913 : ! If cube-sphere label matches current resolution, read factor
5914 : IF ( TRIM(ICSL)==TRIM(CSLABEL) ) THEN
5915 : READ(LINE(IDX+1:LEN(LINE)),*) FCT
5916 : FNDLABEL = TRIM(ICSL)
5917 : EXIT
5918 : ENDIF
5919 : ENDDO
5920 :
5921 : ! All done
5922 : CLOSE ( IU )
5923 :
5924 : ! Verbose
5925 : IF ( HcoState%amIRoot ) THEN
5926 : MSG = 'Read dust tuning factor from '//TRIM(TuningTable)
5927 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
5928 : MSG = 'Model resolution: '//TRIM(CSLABEL)
5929 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
5930 : MSG = 'Resolution label in file: '//TRIM(FNDLABEL)
5931 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
5932 : WRITE(MSG,*) 'Scale factor: ',FCT
5933 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
5934 : ENDIF
5935 :
5936 : ! Leave
5937 : CALL HCO_LEAVE( HcoState%Config%Err, RC )
5938 :
5939 : END SUBROUTINE ReadTuningFactor
5940 : #endif
5941 0 : END MODULE HCOX_DUSTDEAD_MOD
5942 : !EOM
|