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