Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hcox_seasalt_mod.F90
7 : !
8 : ! !DESCRIPTION: Module HCOX\_SeaSalt\_Mod contains routines to calculate
9 : ! sea salt aerosol emissions, following the implementation in GEOS-Chem.
10 : ! Emission number densities of the fine and coarse mode sea salt aerosols
11 : ! are written into diagnostic containers `SEASALT\_DENS\_FINE` and
12 : ! `SEASALT\_DENS\_COARSE`, respectively.
13 : !\\
14 : !\\
15 : ! This is a HEMCO extension module that uses many of the HEMCO core
16 : ! utilities.
17 : !\\
18 : !\\
19 : ! !INTERFACE:
20 : !
21 : MODULE HCOX_SeaSalt_Mod
22 : !
23 : ! !USES:
24 : !
25 : USE HCO_Error_Mod
26 : USE HCO_Diagn_Mod
27 : USE HCO_State_Mod, ONLY : HCO_State
28 : USE HCOX_State_Mod, ONLY : Ext_State
29 :
30 : IMPLICIT NONE
31 : PRIVATE
32 : !
33 : ! !PUBLIC MEMBER FUNCTIONS:
34 : !
35 : PUBLIC :: HCOX_SeaSalt_Init
36 : PUBLIC :: HCOX_SeaSalt_Run
37 : PUBLIC :: HCOX_SeaSalt_Final
38 : !
39 : ! !REVISION HISTORY:
40 : ! 15 Dec 2013 - C. Keller - Now a HEMCO extension module
41 : ! See https://github.com/geoschem/hemco for complete history
42 : !EOP
43 : !------------------------------------------------------------------------------
44 : !
45 : ! !PRIVATE TYPES:
46 : !
47 : TYPE :: MyInst
48 : ! Tracer IDs
49 : INTEGER :: Instance
50 : INTEGER :: ExtNr
51 :
52 : ! Tracer IDs
53 : INTEGER :: ExtNrSS ! Extension number for seasalt
54 : INTEGER :: IDTSALA ! Fine aerosol model species ID
55 : INTEGER :: IDTSALC ! Coarse aerosol model species ID
56 : INTEGER :: IDTMOPO ! marine organic aerosol - phobic
57 : INTEGER :: IDTMOPI ! marine organic aerosol - philic
58 : INTEGER :: IDTBrSALA ! Br- in accum. sea salt aerosol
59 : INTEGER :: IDTBrSALC ! Br- in coarse sea salt aerosol
60 : LOGICAL :: CalcBrSalt ! Calculate Br- content?
61 : LOGICAL :: EmitSnowSS ! Calculate sea salt emission blowing snow
62 : LOGICAL :: ColdSST ! Flag to correct SSA emissions over cold waters
63 : INTEGER :: IDTSALACL ! Fine aerosol Chloride species ID
64 : INTEGER :: IDTSALCCL ! Coarse aerosol Chloride species ID
65 : INTEGER :: IDTSALAAL ! Fine SSA Alkalinity species ID
66 : INTEGER :: IDTSALCAL ! Coarse SSA Alkalinity species ID
67 :
68 : ! Scale factors
69 : REAL*8 :: BrContent ! Ratio of Br- to dry SSA (mass)
70 : REAL*8 :: WindScale ! Wind adjustment factor
71 : REAL*8 :: NSLNT_FYI ! North Hemisphere snow salinity on first year ice (FYI) (psu)
72 : REAL*8 :: NSLNT_MYI ! North Hemisphere snow salinity on multiyear ice (MYI) (psu)
73 : REAL*8 :: SSLNT_FYI ! South Hemisphere snow salinity on FYI (psu)
74 : REAL*8 :: SSLNT_MYI ! South Hemisphere snow salinity on MYI (psu)
75 : REAL*8 :: NAGE ! North Hemisphere snow age (days)
76 : REAL*8 :: SAGE ! South Hemisphere snow age (days)
77 : REAL*8 :: NumP ! number of particle per snowflake
78 :
79 : ! Module variables
80 : INTEGER :: NSALT ! # of seasalt tracers
81 : INTEGER, POINTER :: NR(:) ! Size bin information
82 : REAL*8, POINTER :: SRRC (:,:)
83 : REAL*8, POINTER :: SRRC_N(:,:)
84 : REAL*8, POINTER :: RREDGE(:,:)
85 : REAL*8, POINTER :: RRMID (:,:)
86 : REAL*8, POINTER :: SS_DEN(:) ! densities
87 : REAL*8, POINTER :: F_DI_N_FYI(:,:) ! add for blowing snow for NH
88 : REAL*8, POINTER :: F_DI_N_MYI(:,:) ! add for blowing snow for NH
89 : REAL*8, POINTER :: F_DI_S_FYI(:,:) ! add for blowing snow for SH
90 : REAL*8, POINTER :: F_DI_S_MYI(:,:) ! add for blowing snow for SH
91 : REAL*8, POINTER :: F_DN_N_FYI(:,:) ! add for blowing snow for NH
92 : REAL*8, POINTER :: F_DN_N_MYI(:,:) ! add for blowing snow for NH
93 : REAL*8, POINTER :: F_DN_S_FYI(:,:) ! add for blowing snow for SH
94 : REAL*8, POINTER :: F_DN_S_MYI(:,:) ! add for blowing snow for SH
95 :
96 :
97 : ! Number densities
98 : REAL(sp), POINTER :: NDENS_SALA(:,:) => NULL()
99 : REAL(sp), POINTER :: NDENS_SALC(:,:) => NULL()
100 : REAL(sp), POINTER :: NDENS_MOPO(:,:) => NULL()
101 : REAL(sp), POINTER :: NDENS_MOPI(:,:) => NULL()
102 : REAL(sp), POINTER :: MULTIICE(:,:) => NULL() ! add for blowing snow
103 :
104 : ! MODIS Chlorophyll-A
105 : REAL(hp), POINTER :: CHLR(:,:) => NULL()
106 :
107 : TYPE(MyInst), POINTER :: NextInst => NULL()
108 : END TYPE MyInst
109 :
110 : ! Pointer to instances
111 : TYPE(MyInst), POINTER :: AllInst => NULL()
112 : !
113 : ! !DEFINED PARAMETERS:
114 : !
115 : INTEGER, PARAMETER :: NR_MAX = 200 ! max. # of bins per mode
116 :
117 : ! Increment of radius for Emission integration (um)
118 : REAL*8, PARAMETER :: DR = 5.d-2
119 : REAL*8, PARAMETER :: BETHA = 2.d0
120 :
121 : CONTAINS
122 : !EOC
123 : !-------------------------------------------------------------------------------
124 : ! Harmonized Emissions Component (HEMCO) !
125 : !------------------------------------------------------------------------------
126 : !BOP
127 : !
128 : ! !IROUTINE: HCOX_SeaSalt_Run
129 : !
130 : ! !DESCRIPTION: Subroutine HcoX\_SeaSalt\_Run is the driver run routine to
131 : ! calculate SeaSalt emissions in HEMCO.
132 : !\\
133 : !\\
134 : ! !INTERFACE:
135 : !
136 0 : SUBROUTINE HCOX_SeaSalt_Run( ExtState, HcoState, RC )
137 : !
138 : ! !USES:
139 : !
140 : USE HCO_Calc_Mod, ONLY : HCO_EvalFld
141 : USE HCO_FluxArr_Mod, ONLY : HCO_EmisAdd
142 : !
143 : ! !INPUT PARAMETERS:
144 : !
145 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
146 : TYPE(Ext_State), POINTER :: ExtState ! Module options
147 : !
148 : ! !INPUT/OUTPUT PARAMETERS:
149 : !
150 : INTEGER, INTENT(INOUT) :: RC ! Success or failure?
151 : !
152 : ! !REMARKS:
153 : ! References:
154 : ! ============================================================================
155 : ! (1 ) Chin, M., P. Ginoux, S. Kinne, B. Holben, B. Duncan, R. Martin,
156 : ! J. Logan, A. Higurashi, and T. Nakajima, "Tropospheric aerosol
157 : ! optical thickness from the GOCART model and comparisons with
158 : ! satellite and sunphotometers measurements", J. Atmos Sci., 2001.
159 : ! (2 ) Gong, S., L. Barrie, and J.-P. Blanchet, "Modeling sea-salt
160 : ! aerosols in the atmosphere. 1. Model development", J. Geophys. Res.,
161 : ! v. 102, 3805-3818, 1997.
162 : ! (3 ) Gong, S. L., "A parameterization of sea-salt aerosol source function
163 : ! for sub- and super-micron particles", Global Biogeochem. Cy., 17(4),
164 : ! 1097, doi:10.1029/2003GB002079, 2003.
165 : ! (4 ) Jaegle, L., P.K. Quinn, T.S. Bates, B. Alexander, J.-T. Lin, "Global
166 : ! distribution of sea salt aerosols: New constraints from in situ and
167 : ! remote sensing observations", Atmos. Chem. Phys., 11, 3137-3157,
168 : ! doi:10.5194/acp-11-3137-2011.
169 : ! (5 ) Huang, J., Jaeglé, L., "Wintertime enhancements of sea salt aerosol in
170 : ! polar regions consistent with a sea ice source from blowing snow."
171 : ! Atmos. Chem. Phys. 17, 3699–3712. https://doi.org/10.5194/acp-17-3699-2017, 2017.
172 : ! (6 ) Huang, J., Jaeglé, L., Chen, Q., Alexander, B., Sherwen, T.,
173 : ! Evans, M. J., Theys, N., and Choi, S. "Evaluating the impact of
174 : ! blowing snow sea salt aerosol on springtime BrO and O3 in the Arctic,
175 : ! Atmos. Chem. Phys. Discuss., https://doi.org/10.5194/acp-2019-1094, 2020.
176 : ! (7 ) Tschudi, M., W. N. Meier, J. S. Stewart, C. Fowler, and J. Maslanik.
177 : ! "EASE-Grid Sea Ice Age, Version 4." NASA National Snow and Ice Data Center
178 : ! Distributed Active Archive Center. doi: https://doi.org/10.5067/UTAV7490FEPB., 2019.
179 : !
180 : ! !REVISION HISTORY:
181 : ! See https://github.com/geoschem/hemco for complete history
182 : !EOP
183 : !------------------------------------------------------------------------------
184 : !BOC
185 : !
186 : ! !LOCAL VARIABLES:
187 : !
188 : TYPE(MyInst), POINTER :: Inst
189 : INTEGER :: I, J, N, R
190 : REAL*8 :: SALT, SALT_N, CHLR
191 : REAL*8 :: A_M2
192 : REAL*8 :: W10M
193 : REAL :: FLUX
194 0 : REAL(hp), TARGET :: FLUXSALA (HcoState%NX,HcoState%NY)
195 0 : REAL(hp), TARGET :: FLUXSALC (HcoState%NX,HcoState%NY)
196 0 : REAL(hp), TARGET :: FLUXBrSalA(HcoState%NX,HcoState%NY)
197 0 : REAL(hp), TARGET :: FLUXBrSalC(HcoState%NX,HcoState%NY)
198 0 : REAL(hp), TARGET :: FLUXMOPO (HcoState%NX,HcoState%NY)
199 0 : REAL(hp), TARGET :: FLUXMOPI (HcoState%NX,HcoState%NY)
200 0 : REAL(hp), TARGET :: FLUXSALACL(HcoState%NX,HcoState%NY)
201 0 : REAL(hp), TARGET :: FLUXSALCCL(HcoState%NX,HcoState%NY)
202 0 : REAL(hp), TARGET :: FLUXSALAAL(HcoState%NX,HcoState%NY)
203 0 : REAL(hp), TARGET :: FLUXSALCAL(HcoState%NX,HcoState%NY)
204 :
205 : ! New variables (jaegle 5/11/11)
206 : REAL*8 :: SST, SCALE
207 : ! jpp, 3/2/10
208 : REAL*8 :: SALT_NR
209 : ! B. Gantt, M. Johnson (7,9/15)
210 : REAL*8 :: OMSS1, OMSS2
211 :
212 : ! New variables for blowing snow (huang, 04/09/20)
213 : REAL*8 :: SNOWSALT
214 : REAL*8 :: FROPEN, FRFIRST
215 : REAL*8 :: FRICTVEL, WVMR, TEMP
216 : REAL*8 :: PRESS, P_ICE, RH_ICE
217 : REAL*8 :: D, FK, FD
218 : REAL*8 :: PSI, QSPRIME, UT, APRIM
219 : REAL*8 :: QS, QSNOWICE_FYI, QSNOWICE_MYI,QBSALT, QB0
220 : REAL*8 :: SLNT, SLNT_FYI, SLNT_MYI
221 : REAL*8 :: AGE, ISFROST
222 :
223 : ! New parameters for blowiung snow (huang, 04/09/20)
224 : REAL*8, PARAMETER :: LS = 2839d3 ! Latent heat of sublimation @ T=-30C (J/kg).
225 : ! Varies very little with Temperature
226 : REAL*8, PARAMETER :: RV = 461.5d0 !J kg-1 K-1
227 : REAL*8, PARAMETER :: RHONACL = 2160.0d0 !kg/m3
228 : REAL*8, PARAMETER :: RHOICE = 900.0d0 !kg/m3
229 : REAL*8, PARAMETER :: K = 2.16d-2 !J m-1 s-1 K-1
230 : REAL*8, PARAMETER :: A0 = 3.78407d-1
231 : REAL*8, PARAMETER :: A1 = -8.64089d-2
232 : REAL*8, PARAMETER :: A2 = -1.60570d-2
233 : REAL*8, PARAMETER :: A3 = 7.25516d-4
234 : REAL*8, PARAMETER :: A4 = -1.25650d-1
235 : REAL*8, PARAMETER :: A5 = 2.48430d-2
236 : REAL*8, PARAMETER :: A6 = -9.56871d-4
237 : REAL*8, PARAMETER :: A7 = 1.24600d-2
238 : REAL*8, PARAMETER :: A8 = 1.56862d-3
239 : REAL*8, PARAMETER :: A9 = -2.93002d-4
240 : REAL*8, PARAMETER :: A_SALT = 2.0d0 !from Mann et al. 2000
241 : REAL*8, PARAMETER :: B_SALT = 37.5d0 !in um
242 : REAL*8, PARAMETER :: DDSNOW = 2.0d0 !in um for snow particle interval
243 : LOGICAL, SAVE :: FIRST = .TRUE.
244 : LOGICAL, SAVE :: FIRSTSAL = .TRUE.
245 : CHARACTER(LEN=31) :: FLDNME
246 : INTEGER :: NDAYS!, cYYYY, cMM, cDD
247 0 : REAL(hp), TARGET :: MULTI(HcoState%NX,HcoState%NY)
248 0 : REAL(hp), TARGET :: SNOWSALA (HcoState%NX,HcoState%NY)
249 0 : REAL(hp), TARGET :: SNOWSALC (HcoState%NX,HcoState%NY)
250 :
251 : ! Error handling
252 : LOGICAL :: ERR
253 : CHARACTER(LEN=255) :: MSG, LOC
254 :
255 : !=================================================================
256 : ! HCOX_SeaSalt_Run begins here!
257 : !=================================================================
258 0 : LOC = 'HCOX_SeaSalt_Run (HCOX_SEASALT_MOD.F90)'
259 :
260 : ! Return if extension disabled
261 0 : IF ( ExtState%SeaSalt <= 0 ) RETURN
262 :
263 : ! Enter
264 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
265 0 : IF ( RC /= HCO_SUCCESS ) THEN
266 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
267 0 : RETURN
268 : ENDIF
269 :
270 : ! Exit status
271 0 : ERR = .FALSE.
272 :
273 : ! Get instance
274 0 : Inst => NULL()
275 0 : CALL InstGet ( ExtState%SeaSalt, Inst, RC )
276 0 : IF ( RC /= HCO_SUCCESS ) THEN
277 0 : WRITE(MSG,*) 'Cannot find SeaSalt instance Nr. ', ExtState%SeaSalt
278 0 : CALL HCO_ERROR(MSG,RC)
279 0 : RETURN
280 : ENDIF
281 :
282 : ! Init values
283 0 : FLUXSALA = 0.0_hp
284 0 : FLUXSALC = 0.0_hp
285 0 : FLUXBrSalA = 0.0_hp
286 0 : FLUXBrSalC = 0.0_hp
287 0 : FLUXMOPO = 0.0_hp
288 0 : FLUXMOPI = 0.0_hp
289 0 : FLUXSALACL = 0.0_hp
290 0 : FLUXSALCCL = 0.0_hp
291 0 : FLUXSALAAL = 0.0_hp
292 0 : FLUXSALCAL = 0.0_hp
293 0 : SNOWSALA = 0.0_hp
294 0 : SNOWSALC = 0.0_hp
295 :
296 : ! If the marine POA option is on, get the HEMCO pointer to MODIS CHLR
297 0 : IF ( HcoState%MarinePOA ) THEN
298 0 : CALL HCO_EvalFld ( HcoState, 'MODIS_CHLR', Inst%CHLR, RC )
299 0 : IF ( RC /= HCO_SUCCESS ) THEN
300 0 : WRITE(MSG,*) 'Cannot find MODIS CHLR data for marine POA'
301 0 : CALL HCO_ERROR(MSG, RC)
302 0 : RETURN
303 : ENDIF
304 : ENDIF
305 :
306 0 : IF ( Inst%EmitSnowSS ) THEN
307 : ! Read in distribution of multi-year sea ice from
308 : ! remotely sensed observations of sea ice motion and sea
309 : ! ice extent for the Arctic (Tschudi et al., 2019). For the
310 : ! Antarctic, the multi year sea ice extent is based on the minimum
311 : ! MERRA-2 sea ice extent of the previous summer.
312 0 : CALL HCO_EvalFld ( HcoState, 'MULTISEAICE', MULTI, RC )
313 0 : IF ( RC /= HCO_SUCCESS ) THEN
314 0 : WRITE(MSG,*) 'Cannot find MULTISEAICE data for blowing snow'
315 0 : CALL HCO_ERROR(MSG, RC)
316 0 : RETURN
317 : ENDIF
318 : ENDIF
319 :
320 : !=================================================================
321 : ! Emission is integrated over a given size range for each bin
322 : !=================================================================
323 : !$OMP PARALLEL DO &
324 : !$OMP DEFAULT( SHARED ) &
325 : !$OMP PRIVATE( I, J, A_M2, W10M, SST, SCALE, N ) &
326 : !$OMP PRIVATE( SALT, SALT_N, R, SALT_NR, RC ) &
327 : !$OMP PRIVATE( OMSS1, OMSS2, CHLR ) &
328 : !$OMP PRIVATE( FROPEN, SNOWSALT, AGE ) &
329 : !$OMP PRIVATE( FRICTVEL, WVMR, TEMP, PRESS, P_ICE, RH_ICE ) &
330 : !$OMP PRIVATE( D, FK, FD, PSI, QSPRIME, APRIM, UT, FRFIRST ) &
331 : !$OMP PRIVATE( SLNT, SLNT_FYI, SLNT_MYI ) &
332 : !$OMP PRIVATE( QBSALT, QB0, QS, QSNOWICE_FYI, QSNOWICE_MYI ) &
333 : !$OMP SCHEDULE( DYNAMIC )
334 :
335 : ! Loop over surface boxes
336 0 : DO J = 1, HcoState%NY
337 0 : DO I = 1, HcoState%NX
338 :
339 : ! Grid box surface area on simulation grid [m2]
340 0 : A_M2 = HcoState%Grid%AREA_M2%Val( I, J )
341 :
342 : ! Advance to next grid box if it's not over water or sea ice
343 0 : IF ( ExtState%FROCEAN%Arr%Val(I,J) <= 0d0 .and. &
344 : ExtState%FRSEAICE%Arr%Val(I,J) <= 0d0 ) CYCLE
345 :
346 : ! Wind speed at 10 m altitude [m/s]
347 0 : W10M = SQRT( ExtState%U10M%Arr%Val(I,J)**2 &
348 0 : + ExtState%V10M%Arr%Val(I,J)**2 )
349 :
350 : ! Sea surface temperature in Celcius (jaegle 5/11/11)
351 0 : SST = ExtState%TSKIN%Arr%Val(I,J) - 273.15d0
352 :
353 : ! Limit SST to 0-30C range
354 0 : SST = MAX( SST , 0d0 ) ! limit to 0C
355 0 : SST = MIN( SST , 30d0 ) ! limit to 30C
356 :
357 : ! Empirical SST scaling factor (jaegle 5/11/11)
358 : SCALE = 0.329d0 + 0.0904d0*SST - &
359 0 : 0.00717d0*SST**2d0 + 0.000207d0*SST**3d0
360 :
361 : ! Limit the SST scaling factor to 0.25 over cold SST (below 5C)
362 0 : IF ( Inst%ColdSST .and. SST<= 5.0d0 ) SCALE = 0.25d0
363 :
364 : ! Reset to using original Gong (2003) emissions (jaegle 6/30/11)
365 : !SCALE = 1.0d0
366 :
367 : ! Apply to only the open ocean fraction of the gridbox (Huang 06/12/20)
368 0 : FROPEN = ExtState%FROCEAN%Arr%Val(I,J)-ExtState%FRSEAICE%Arr%Val(I,J)
369 0 : IF ( FROPEN < 0d0 ) FROPEN = 0d0
370 :
371 : ! Eventually apply wind scaling factor.
372 0 : SCALE = SCALE * Inst%WindScale * FROPEN
373 :
374 : !----------------------------------------------------------------
375 : ! huang, 04/09/20: Add blowing snow emissions over sea ice
376 : !----------------------------------------------------------------
377 0 : IF ( Inst%EmitSnowSS ) THEN
378 0 : IF ( ExtState%FRSEAICE%Arr%Val(I,J) > 0d0 )THEN
379 : ! Friction velocity [m/s]
380 0 : FRICTVEL = ExtState%USTAR%Arr%Val(I,J)
381 : ! Convert specific humidity [g H2O/kg air] to water vapor mixing ratio [v/v]
382 : ! QV2m is in kg H2O/kg air
383 0 : WVMR = ExtState%QV2M%Arr%Val(I,J) * 28.973d0 / 18.0d0
384 : ! Temperature at 2M in grid box (I,J) [K]
385 0 : TEMP = ExtState%T2M%Arr%Val(I,J)
386 : ! Surface pressure at grid box (I,J). Convert from [Pa] to [hPa]
387 0 : PRESS = HcoState%Grid%PSFC%Val( I, J ) /100d0
388 : ! Calculate saturation vapor pressure over ice [in Pa] at temperature
389 : ! TS [K]
390 0 : P_ICE = 10d0**(-2663.5d0/TEMP+12.537d0)
391 : ! Calculate relative humidity with respect to ice [%]
392 0 : RH_ICE = PRESS * WVMR / (P_ICE*0.01d0) *100.0d0
393 : ! Limit RH to 100%
394 0 : IF (RH_ICE > 100d0) RH_ICE =100.0d0
395 : ! Coefficient of Diffusion of water vapor in air [m2/s]
396 : ! Parameterization of Massman, W.J. "A review of teh molecular diffusivities of
397 : ! H2O, CO2, CH4... in air, O2 and N2 near STP" Atmos. Env., 32, 6, 1111-1127, 1998.
398 0 : D = 2.178d-5*(1000d0/PRESS)*(TEMP/273.15d0)**1.81
399 : ! Heat conductivity and vapor diffusion terms [m s/kg]
400 : ! Rogers and Yau "A short course in cloud physics", 1989, Eqn 9.4, with
401 : ! RV = 461.5 [J/kg/K] Individual gas constant for water vapor
402 : ! LS = 2839.0*1d3 [J/kg ] Latent heat of sublimation @ T=-30C
403 : ! K = 2.16d-2 [J/(m s K)] Coeff of thermal conductivity of Air [Table 7.1 Rogers and Yau]
404 0 : FK = ( LS / (RV * TEMP ) -1d0 ) * LS / (K * TEMP)
405 0 : FD = ( RV * TEMP ) / (D * P_ICE)
406 : ! Variable PSI [m2/s] Equation 11 from Dery and Yau (2001)
407 : ! RHOICE = 900 kg/m3 Density of ice
408 0 : PSI = (RH_ICE/100.d0 - 1d0)/(2d0 * RHOICE * (FK + FD))
409 : ! Convert PSI from m2/s to units of -1x10d-12 m2/s
410 0 : PSI = PSI * (-1.0d12)
411 : ! Qs prime [mm/day snow water equivalent] Equation 11 Dery and Yau (2001)
412 : QSPRIME = A0 + A1*PSI + A2*PSI**2d0 + A3*PSI**3d0 &
413 : + A4* W10M + A5*PSI*W10M &
414 : + A6*W10M*PSI**2d0 + A7*W10M**2d0 &
415 0 : + A8*PSI*W10M**2d0 + A9*W10M**3d0
416 0 : IF ( QSPRIME < 0.0d0 ) QSPRIME = 0.0d0
417 : !APRIM
418 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .lt. 0 ) AGE = Inst%SAGE*24.0d0
419 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .ge. 0 ) AGE = Inst%NAGE*24.0d0
420 : APRIM = (1.038d0+0.03758d0*AGE-0.00014349d0*AGE**2d0 &
421 0 : + (1.911315d-7*AGE**3d0) )**(-1d0)
422 : ! Threshold wind speed [m/s]
423 0 : UT = 6.975d0 + 0.0033d0 * (TEMP - 273.15d0 + 27.27d0 )**2.0d0
424 : !IF (W10M > UT) THEN
425 : ! add RH<100 too
426 :
427 0 : IF (W10M > UT .and. RH_ICE<100d0) THEN
428 0 : QBSALT = 0.385d0*(1.0d0-Ut/W10M)**2.59d0/FRICTVEL
429 0 : QB0 = 0.385d0*(1d0-6.975d0/W10M)**2.59d0/FRICTVEL
430 : ! Snow sublimation rate [kg/m2/s] Equation 1 in Yang et al. (2008)
431 : ! The constant 1.1574d-5 converts mm/day column integrated sublimation rate to kg m-2 s-1
432 0 : QS = 1.1574d-5*APRIM*QSPRIME*QBSALT/QB0
433 : ELSE
434 : QS = 0d0
435 : ENDIF
436 : !set up the snow salinity
437 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .lt. 0 ) SLNT_FYI = Inst%SSLNT_FYI
438 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .lt. 0 ) SLNT_MYI = Inst%SSLNT_MYI
439 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .ge. 0 ) SLNT_FYI = Inst%NSLNT_FYI
440 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .ge. 0 ) SLNT_MYI = Inst%NSLNT_MYI
441 : ! Sea ice fraction that is first year
442 0 : FRFIRST = ExtState%FRSEAICE%Arr%Val(I,J) - MULTI(I,J)
443 0 : IF ( FRFIRST < 0d0 ) FRFIRST = 0d0
444 : ! Apply FYI salinity to FYI seaice fraction and MYI salinity to MYI fraction
445 : !SLNT = SLNT_FYI * FRFIRST + SLNT_MYI * MULTI(I,J)
446 : ! Assume MYI salinity is 50% of FYI
447 : !SLNT = SLNT * FRFIRST + SLNT * 0.5 * MULTI(I,J)
448 : ! Convert snow sublimation rate to sea salt production rate [kg/m2/s]
449 : ! Calculate it separately for FYI and MYI, scaled by their respective sea ice fraction
450 0 : QSNOWICE_FYI = QS * SLNT_FYI * FRFIRST / 1000d0
451 0 : QSNOWICE_MYI = QS * SLNT_MYI * MULTI(I,J) / 1000d0
452 : ELSE
453 : QSNOWICE_FYI = 0.0d0
454 : QSNOWICE_MYI = 0.0d0
455 : ENDIF
456 : ENDIF
457 : ! End of added blowing snow section
458 : !-----------------------------------------------------------------
459 :
460 : ! Do for accumulation and coarse mode, and Marine POA if enabled
461 0 : DO N = 1,Inst%NSALT
462 :
463 : ! Reset values for SALT, SALT_N, and SNOWSALT
464 0 : SALT = 0d0
465 0 : SALT_N = 0d0
466 0 : SNOWSALT = 0d0
467 :
468 : ! update seasalt from blowing snow - huang 1/4/18
469 0 : IF (( Inst%EmitSnowSS ) .and. ( N .LT.3 )) THEN
470 0 : IF ( HcoState%Grid%YEDGE%Val(I,J) .lt. 0 ) THEN
471 : ! Southern Hemisphere
472 : SALT = SALT + HcoState%TS_EMIS * A_M2 &
473 0 : * ( QSNOWICE_FYI * SUM( Inst%F_DI_S_FYI(:,N) ) + &
474 0 : QSNOWICE_MYI * SUM( Inst%F_DI_S_MYI(:,N) ) ) * DDSNOW
475 :
476 : SNOWSALT = SNOWSALT + HcoState%TS_EMIS * A_M2 &
477 : * ( QSNOWICE_FYI * SUM( Inst%F_DI_S_FYI(:,N) ) + &
478 0 : QSNOWICE_MYI * SUM( Inst%F_DI_S_MYI(:,N) ) ) * DDSNOW
479 :
480 : SALT_N = SALT_N + HcoState%TS_EMIS * A_M2 &
481 0 : * ( QSNOWICE_FYI * SUM( Inst%F_DN_S_FYI(:,N) ) + &
482 0 : QSNOWICE_MYI * SUM( Inst%F_DN_S_MYI(:,N) ) ) * DDSNOW
483 : ELSE
484 : ! Northern Hemisphere
485 : SALT = SALT + HcoState%TS_EMIS * A_M2 &
486 0 : * ( QSNOWICE_FYI * SUM( Inst%F_DI_N_FYI(:,N) ) + &
487 0 : QSNOWICE_MYI * SUM( Inst%F_DI_N_MYI(:,N) ) ) * DDSNOW
488 :
489 : SNOWSALT = SNOWSALT + HcoState%TS_EMIS * A_M2 &
490 : * ( QSNOWICE_FYI * SUM( Inst%F_DI_N_FYI(:,N) ) + &
491 0 : QSNOWICE_MYI * SUM( Inst%F_DI_N_MYI(:,N) ) ) * DDSNOW
492 :
493 : SALT_N = SALT_N + HcoState%TS_EMIS * A_M2 &
494 0 : * ( QSNOWICE_FYI * SUM( Inst%F_DN_N_FYI(:,N) ) + &
495 0 : QSNOWICE_MYI * SUM( Inst%F_DN_N_MYI(:,N) ) ) * DDSNOW
496 : ENDIF
497 : ! ewl: comment out for blowing snow since calcbr2 retired
498 : ! ! add bromine blowing snow
499 : ! IF ( Inst%CalcBr2 ) THEN
500 : ! IF ( HcoState%Grid%YEDGE%Val(I,J) .lt. 0 ) THEN
501 : ! SSA_Br2 = SSA_Br2 + HcoState%TS_EMIS * A_M2 &
502 : ! * (QSNOWICE_FYI * SUM( Inst%F_DI_S_FYI(:,N) ) + &
503 : ! QSNOWICE_MYI * SUM( Inst%F_DI_S_MYI(:,N) ) ) * DDSNOW &
504 : ! * 0.00223d0 * 0.7d0 / 2.0d0
505 : ! ELSE
506 : ! SSA_Br2 = SSA_Br2 + HcoState%TS_EMIS * A_M2 &
507 : ! * (QSNOWICE_FYI * SUM( Inst%F_DI_N_FYI(:,N) ) + &
508 : ! QSNOWICE_MYI * SUM( Inst%F_DI_N_MYI(:,N) ) ) * DDSNOW &
509 : ! * 0.00223d0 * 0.7d0 / 2.0d0
510 : ! ENDIF
511 : ! ENDIF
512 : ENDIF
513 :
514 : ! Loop over size bins
515 0 : DO R = 1, Inst%NR(N)
516 :
517 : ! Coarse and accumulation modes
518 0 : IF ( N .LT. 3 ) THEN
519 :
520 : ! Update SeaSalt source into SALT [kg]
521 : SALT = SALT + &
522 0 : ( SCALE * Inst%SRRC(R,N) * A_M2 * W10M**3.41d0 )
523 :
524 : ! Update SeaSalt source into SALT_N [#]
525 : ! (bec, bmy, 4/13/05)
526 : SALT_N = SALT_N + &
527 0 : ( SCALE * Inst%SRRC_N(R,N) * A_M2 * W10M**3.41d0 )
528 :
529 : ENDIF
530 :
531 : ! Marine organic aerosols (M. Johnson, B. Gantt)
532 0 : IF ( N .EQ. 3 ) THEN
533 :
534 : ! Get MODIS Chlorophyll-a
535 0 : CHLR = Inst%CHLR(I,J)
536 :
537 : ! Calculate organic mass fraction of SSA
538 : OMSS1 = 1.0 / ( 1.0 + EXP( -2.63 * 3.0 * CHLR &
539 0 : + 0.18 * 3.0 * W10M ) )
540 :
541 : OMSS2 = ( OMSS1 ) / (1.0 + 0.03 &
542 0 : * EXP( 6.81 * ( Inst%RRMID(R,N) * 2.0 ) ) ) &
543 0 : + 0.03 * ( OMSS1 )
544 :
545 : ! Update seasalt source into SALT [kg]
546 0 : SALT = SALT + 6.0 * ( ( Inst%SRRC(R,N) * SCALE * A_M2 &
547 : * W10M**3.41d0 * OMSS2 ) &
548 : * ( 1.0 / ( 2.2 / ( 1.0 - OMSS2 &
549 0 : * (1.0 - 2200.0 / 1000.0 ) ) ) ) )
550 :
551 0 : SALT_N = SALT_N + 6.0 * ( Inst%SRRC_N(R,N) * SCALE * A_M2 &
552 0 : * W10M**3.41d0 * OMSS2 )
553 :
554 : ENDIF
555 :
556 : ENDDO !R
557 :
558 : ! ----------------------------------------------------------------
559 : ! Pass sea salt emissions do emission array [kg/m2/s]
560 : ! ----------------------------------------------------------------
561 : ! kg --> kg/m2/s
562 0 : IF ( N == 1 ) THEN
563 0 : FLUXSALA(I,J) = SALT / A_M2 / HcoState%TS_EMIS
564 0 : SNOWSALA(I,J) = SNOWSALT / A_M2 / HcoState%TS_EMIS
565 0 : ELSEIF ( N == 2 ) THEN
566 0 : FLUXSALC(I,J) = SALT / A_M2 / HcoState%TS_EMIS
567 0 : SNOWSALC(I,J) = SNOWSALT / A_M2 / HcoState%TS_EMIS
568 0 : ELSEIF ( N == 3 ) THEN
569 0 : FLUXMOPO(I,J) = SALT / A_M2 / HcoState%TS_EMIS
570 0 : ELSEIF ( N == 4 ) THEN
571 0 : FLUXMOPI(I,J) = SALT / A_M2 / HcoState%TS_EMIS
572 : ENDIF
573 :
574 : ! ----------------------------------------------------------------
575 : ! Write out number density for diagnostics [#]
576 : ! ----------------------------------------------------------------
577 0 : IF ( N == 1 ) THEN
578 0 : Inst%NDENS_SALA(I,J) = SALT_N
579 0 : ELSEIF ( N == 2 ) THEN
580 0 : Inst%NDENS_SALC(I,J) = SALT_N
581 0 : ELSEIF ( N == 3 ) THEN
582 0 : Inst%NDENS_MOPO(I,J) = SALT_N
583 0 : ELSEIF ( N == 4 ) THEN
584 0 : Inst%NDENS_MOPI(I,J) = SALT_N
585 : ENDIF
586 :
587 : ENDDO !N
588 :
589 : ENDDO !I
590 : ENDDO !J
591 : !$OMP END PARALLEL DO
592 :
593 : ! Check exit status
594 : IF ( ERR ) THEN
595 : RC = HCO_FAIL
596 : RETURN
597 : ENDIF
598 :
599 : !=================================================================
600 : ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
601 : !=================================================================
602 :
603 : ! SALA
604 0 : IF ( Inst%IDTSALA > 0 ) THEN
605 :
606 : ! Add flux to emission array
607 : CALL HCO_EmisAdd( HcoState, FLUXSALA, Inst%IDTSALA, &
608 0 : RC, ExtNr=Inst%ExtNrSS )
609 0 : IF ( RC /= HCO_SUCCESS ) THEN
610 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALA', RC )
611 0 : RETURN
612 : ENDIF
613 : ENDIF
614 :
615 : ! SALC
616 0 : IF ( Inst%IDTSALC > 0 ) THEN
617 :
618 : ! Add flux to emission array
619 : CALL HCO_EmisAdd( HcoState, FLUXSALC, Inst%IDTSALC, &
620 0 : RC, ExtNr=Inst%ExtNrSS )
621 0 : IF ( RC /= HCO_SUCCESS ) THEN
622 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALC', RC )
623 0 : RETURN
624 : ENDIF
625 :
626 : ENDIF
627 :
628 : ! SALA Chloride, xnw 10/13/17
629 0 : IF ( Inst%IDTSALACL > 0 ) THEN
630 0 : FLUXSALACL = ( FLUXSALA + SNOWSALA ) * 0.5504d0
631 : ! Add flux to emission array
632 : CALL HCO_EmisAdd( HcoState, FLUXSALACL, Inst%IDTSALACL, &
633 0 : RC, ExtNr=Inst%ExtNrSS )
634 0 : IF ( RC /= HCO_SUCCESS ) THEN
635 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALACL', RC)
636 0 : RETURN
637 : ENDIF
638 : ENDIF
639 :
640 : ! SALC Chloride, xnw 11/17/17
641 0 : IF ( Inst%IDTSALCCL > 0 ) THEN
642 0 : FLUXSALCCL = ( FLUXSALC + SNOWSALC ) * 0.5504d0
643 : ! Add flux to emission array
644 : CALL HCO_EmisAdd( HcoState, FLUXSALCCL, Inst%IDTSALCCL, &
645 0 : RC, ExtNr=Inst%ExtNrSS )
646 0 : IF ( RC /= HCO_SUCCESS ) THEN
647 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALCCL', RC)
648 0 : RETURN
649 : ENDIF
650 : ENDIF
651 :
652 : ! SALA Alkalinity, xnw 11/30/17
653 0 : IF ( Inst%IDTSALAAL > 0 ) THEN
654 0 : FLUXSALAAL = FLUXSALA
655 : ! Add flux to emission array
656 : CALL HCO_EmisAdd( HcoState, FLUXSALAAL, Inst%IDTSALAAL, &
657 0 : RC, ExtNr=Inst%ExtNrSS )
658 0 : IF ( RC /= HCO_SUCCESS ) THEN
659 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALAAL', RC)
660 0 : RETURN
661 : ENDIF
662 : ENDIF
663 :
664 : ! SALC Alkalinity, xnw 11/30/17
665 0 : IF ( Inst%IDTSALCAL > 0 ) THEN
666 0 : FLUXSALCAL = FLUXSALC
667 : ! Add flux to emission array
668 : CALL HCO_EmisAdd( HcoState, FLUXSALCAL, Inst%IDTSALCAL, &
669 0 : RC, ExtNr=Inst%ExtNrSS )
670 0 : IF ( RC /= HCO_SUCCESS ) THEN
671 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXSALCAL', RC)
672 0 : RETURN
673 : ENDIF
674 : ENDIF
675 :
676 : ! Bromine incorporated into sea salt
677 0 : IF ( Inst%CalcBrSalt ) THEN
678 :
679 : ! Scale BrSalX emissions to SalX.
680 : ! Also add blowing snow Br emissions assuming a factor of 5 enrichment
681 : ! factor relative to seawater
682 0 : FluxBrSalA = Inst%BrContent * (FluxSalA + SNOWSALA * 5.0d0)
683 0 : FluxBrSalC = Inst%BrContent * (FluxSalC + SNOWSALC * 5.0d0)
684 :
685 : ! Add flux to emission array
686 : CALL HCO_EmisAdd( HcoState, FLUXBrSalA, Inst%IDTBrSalA, &
687 0 : RC, ExtNr=Inst%ExtNrSS )
688 0 : IF ( RC /= HCO_SUCCESS ) THEN
689 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXBrSalA', RC )
690 0 : RETURN
691 : ENDIF
692 :
693 : ! Add flux to emission array
694 : CALL HCO_EmisAdd( HcoState, FLUXBrSalC, Inst%IDTBrSalC, &
695 0 : RC, ExtNr=Inst%ExtNrSS )
696 0 : IF ( RC /= HCO_SUCCESS ) THEN
697 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXBrSalC', RC )
698 0 : RETURN
699 : ENDIF
700 :
701 : ENDIF
702 :
703 : ! MOPO
704 0 : IF ( Inst%IDTMOPO > 0 ) THEN
705 :
706 : ! Add flux to emission array
707 : CALL HCO_EmisAdd( HcoState, FLUXMOPO, Inst%IDTMOPO, &
708 0 : RC, ExtNr=Inst%ExtNrSS )
709 0 : IF ( RC /= HCO_SUCCESS ) THEN
710 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXMOPO', RC )
711 0 : RETURN
712 : ENDIF
713 :
714 : ENDIF
715 :
716 : ! MOPI
717 0 : IF ( Inst%IDTMOPI > 0 ) THEN
718 :
719 : ! Add flux to emission array
720 : CALL HCO_EmisAdd( HcoState, FLUXMOPI, Inst%IDTMOPI, &
721 0 : RC, ExtNr=Inst%ExtNrSS )
722 0 : IF ( RC /= HCO_SUCCESS ) THEN
723 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: FLUXMOPI', RC )
724 0 : RETURN
725 : ENDIF
726 :
727 : ENDIF
728 :
729 : ! Cleanup
730 0 : Inst => NULL()
731 :
732 : ! Leave w/ success
733 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
734 :
735 : END SUBROUTINE HCOX_SeaSalt_Run
736 : !EOC
737 : !------------------------------------------------------------------------------
738 : ! Harmonized Emissions Component (HEMCO) !
739 : !------------------------------------------------------------------------------
740 : !BOP
741 : !
742 : ! !IROUTINE: HCOX_SeaSalt_Init
743 : !
744 : ! !DESCRIPTION: Subroutine HcoX\_SeaSalt\_Init initializes all
745 : ! extension variables.
746 : !\\
747 : !\\
748 : ! !INTERFACE:
749 : !
750 0 : SUBROUTINE HCOX_SeaSalt_Init( HcoState, ExtName, ExtState, RC )
751 : !
752 : ! !USES:
753 : !
754 : USE HCO_State_Mod, ONLY : HCO_GetHcoID
755 : USE HCO_STATE_MOD, ONLY : HCO_GetExtHcoID
756 : USE HCO_ExtList_Mod, ONLY : GetExtNr
757 : USE HCO_ExtList_Mod, ONLY : GetExtOpt
758 : !
759 : ! !INPUT PARAMETERS:
760 : !
761 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO state object
762 : CHARACTER(LEN=*), INTENT(IN ) :: ExtName ! Extension name
763 : TYPE(Ext_State), POINTER :: ExtState ! Options object
764 : !
765 : ! !INPUT/OUTPUT PARAMETERS:
766 : !
767 : INTEGER, INTENT(INOUT) :: RC ! Return status
768 : !
769 : ! !REVISION HISTORY:
770 : ! 15 Dec 2013 - C. Keller - Initial version
771 : ! See https://github.com/geoschem/hemco for complete history
772 : !EOP
773 : !------------------------------------------------------------------------------
774 : !BOC
775 : !
776 : ! !LOCAL VARIABLES:
777 : !
778 : INTEGER :: ExtNrSS
779 : INTEGER :: N, R, AS
780 : REAL*8 :: A, B, R0, R1
781 : REAL*8 :: CONST_N
782 : CHARACTER(LEN=255) :: MSG, LOC
783 : INTEGER :: nSpcSS, minLen
784 : REAL*8 :: SALA_REDGE_um(2), SALC_REDGE_um(2)
785 : REAL(dp) :: tmpScale
786 : LOGICAL :: FOUND
787 0 : INTEGER, ALLOCATABLE :: HcoIDsSS(:)
788 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNamesSS(:)
789 : TYPE(MyInst), POINTER :: Inst
790 :
791 : ! Local variables for blowing snow
792 : INTEGER :: ND, IH !IH for different hemisphere
793 : REAL*8 :: D_SNOW, D_DRY
794 : REAL*8, PARAMETER :: A_SALT = 2.0d0 !from Mann et al. 2000
795 : REAL*8, PARAMETER :: B_SALT = 37.5d0 !in um
796 : REAL*8, PARAMETER :: DDSNOW = 2.0d0 !in um for snow particle interval
797 : REAL*8, PARAMETER :: RHONACL = 2160.0d0 !kg/m3
798 : REAL*8, PARAMETER :: RHOICE = 900.0d0 !kg/m3
799 :
800 : !=================================================================
801 : ! HCOX_SeaSalt_Init begins here!
802 : !=================================================================
803 0 : LOC = 'HCOX_SeaSalt_Init (HCOX_SEASALT_MOD.F90)'
804 :
805 : ! Extension number for seasalt
806 0 : ExtNrSS = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
807 0 : IF ( ExtNrSS <= 0 ) RETURN
808 :
809 : ! Enter
810 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
811 0 : IF ( RC /= HCO_SUCCESS ) THEN
812 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
813 0 : RETURN
814 : ENDIF
815 :
816 : ! Create Instance
817 0 : Inst => NULL()
818 0 : CALL InstCreate ( ExtNrSS, ExtState%SeaSalt, Inst, RC )
819 0 : IF ( RC /= HCO_SUCCESS ) THEN
820 0 : CALL HCO_ERROR ( 'Cannot create SeaSalt instance', RC )
821 0 : RETURN
822 : ENDIF
823 : ! Also fill ExtNrSS - this is the same as the parent ExtNr
824 0 : Inst%ExtNrSS = ExtNrSS
825 :
826 : ! ----------------------------------------------------------------------
827 : ! Get species IDs and settings
828 : ! ----------------------------------------------------------------------
829 :
830 : ! Read settings specified in configuration file
831 : ! Note: the specified strings have to match those in
832 : ! the config. file!
833 : Call GetExtOpt ( HcoState%Config, Inst%ExtNrSS, 'Model sea salt Br-', &
834 0 : OptValBool=Inst%CalcBrSalt, RC=RC )
835 0 : IF ( Inst%CalcBrSalt ) THEN
836 0 : minLen = 4
837 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'Br- mass ratio', &
838 0 : OptValDp=Inst%BrContent, RC=RC )
839 0 : IF ( RC /= HCO_SUCCESS ) THEN
840 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
841 0 : RETURN
842 : ENDIF
843 : ELSE
844 0 : minLen = 2
845 0 : Inst%IDTBrSALA = -1
846 0 : Inst%IDTBrSALC = -1
847 0 : Inst%BrContent = 0.0d0
848 : ENDIF
849 :
850 : ! Get HEMCO species IDs
851 : CALL HCO_GetExtHcoID( HcoState, Inst%ExtNrSS, HcoIDsSS, &
852 0 : SpcNamesSS, nSpcSS, RC )
853 0 : IF ( RC /= HCO_SUCCESS ) THEN
854 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
855 0 : RETURN
856 : ENDIF
857 0 : IF ( nSpcSS < minLen ) THEN
858 0 : MSG = 'Not enough sea salt emission species set'
859 0 : CALL HCO_ERROR(MSG, RC )
860 0 : RETURN
861 : ENDIF
862 0 : Inst%IDTSALA = HcoIDsSS(1)
863 0 : Inst%IDTSALC = HcoIDsSS(2)
864 0 : Inst%IDTSALACL = HcoIDsSS(3)
865 0 : Inst%IDTSALCCL = HcoIDsSS(4)
866 0 : Inst%IDTSALAAL = HcoIDsSS(5)
867 0 : Inst%IDTSALCAL = HcoIDsSS(6)
868 0 : IF ( Inst%CalcBrSalt ) Inst%IDTBrSALA = HcoIDsSS(7)
869 0 : IF ( Inst%CalcBrSalt ) Inst%IDTBrSALC = HcoIDsSS(8)
870 0 : IF ( HcoState%MarinePOA ) THEN
871 0 : Inst%IDTMOPO = HcoIDsSS(9)
872 0 : Inst%IDTMOPI = HcoIDsSS(10)
873 : ENDIF
874 :
875 : ! Get aerosol radius'
876 0 : SALA_REDGE_um(:) = 0.0d0
877 0 : SALC_REDGE_um(:) = 0.0d0
878 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SALA lower radius', &
879 0 : OptValDp=SALA_REDGE_um(1), RC=RC )
880 0 : IF ( RC /= HCO_SUCCESS ) THEN
881 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
882 0 : RETURN
883 : ENDIF
884 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SALA upper radius', &
885 0 : OptValDp=SALA_REDGE_um(2), RC=RC )
886 0 : IF ( RC /= HCO_SUCCESS ) THEN
887 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
888 0 : RETURN
889 : ENDIF
890 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SALC lower radius', &
891 0 : OptValDp=SALC_REDGE_um(1), RC=RC )
892 0 : IF ( RC /= HCO_SUCCESS ) THEN
893 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
894 0 : RETURN
895 : ENDIF
896 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SALC upper radius', &
897 0 : OptValDp=SALC_REDGE_um(2), RC=RC )
898 0 : IF ( RC /= HCO_SUCCESS ) THEN
899 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
900 0 : RETURN
901 : ENDIF
902 :
903 : ! fix scaling factor over cold water SST (<5 degC)
904 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNrSS, 'Reduce SS cold water', &
905 0 : OptValBool=Inst%ColdSST, RC=RC )
906 0 : IF ( RC /= HCO_SUCCESS ) THEN
907 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
908 0 : RETURN
909 : ENDIF
910 :
911 : ! Add a SSA source from blowing snow (by J. Huang)
912 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNrSS, 'Blowing Snow SS', &
913 0 : OptValBool=Inst%EmitSnowSS, RC=RC )
914 0 : IF ( RC /= HCO_SUCCESS ) THEN
915 0 : CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
916 0 : RETURN
917 : ENDIF
918 :
919 : ! Whether or not differentiate snow salinity on FYI and MYI (by J. Huang)
920 : !CALL GetExtOpt ( HcoState%Config, Inst%ExtNrSS, 'Diff salinity on ice', &
921 : ! OptValBool=Inst%FYIsnow, RC=RC )
922 : !IF ( RC /= HCO_SUCCESS ) RETURN
923 :
924 : ! Add snow salinity (NH and SH), snow age and number of particles
925 : ! per snowflake as external factor from configuration file
926 0 : IF ( Inst%EmitSnowSS ) THEN
927 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'NH FYI snow salinity', &
928 0 : OptValDp=Inst%NSLNT_FYI, RC=RC )
929 0 : IF ( RC /= HCO_SUCCESS ) THEN
930 0 : CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
931 0 : RETURN
932 : ENDIF
933 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'NH MYI snow salinity', &
934 0 : OptValDp=Inst%NSLNT_MYI, RC=RC )
935 0 : IF ( RC /= HCO_SUCCESS ) THEN
936 0 : CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
937 0 : RETURN
938 : ENDIF
939 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SH FYI snow salinity', &
940 0 : OptValDp=Inst%SSLNT_FYI, RC=RC )
941 0 : IF ( RC /= HCO_SUCCESS ) THEN
942 0 : CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
943 0 : RETURN
944 : ENDIF
945 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SH MYI snow salinity', &
946 0 : OptValDp=Inst%SSLNT_MYI, RC=RC )
947 0 : IF ( RC /= HCO_SUCCESS ) THEN
948 0 : CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
949 0 : RETURN
950 : ENDIF
951 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'NH snow age', &
952 0 : OptValDp=Inst%NAGE, RC=RC )
953 0 : IF ( RC /= HCO_SUCCESS ) THEN
954 0 : CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
955 0 : RETURN
956 : ENDIF
957 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'SH snow age', &
958 0 : OptValDp=Inst%SAGE, RC=RC )
959 0 : IF ( RC /= HCO_SUCCESS ) THEN
960 0 : CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
961 0 : RETURN
962 : ENDIF
963 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'N per snowflake', &
964 0 : OptValDp=Inst%NumP, RC=RC )
965 0 : IF ( RC /= HCO_SUCCESS ) THEN
966 0 : CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
967 0 : RETURN
968 : ENDIF
969 : ELSE
970 0 : Inst%NSLNT_FYI = 0.1d0 ! default value 0.1 psu for NH FYI snow
971 0 : Inst%NSLNT_MYI = 0.05d0 ! default value 0.05 psu for NH MYI snow
972 0 : Inst%SSLNT_FYI = 0.03d0 ! default value 0.03 psu for SH FYI snow
973 0 : Inst%SSLNT_FYI = 0.015d0 ! default value 0.015 psu for SH MYI snow
974 0 : Inst%NAGE = 3.0d0 ! default value 3 days snow age in NH
975 0 : Inst%SAGE = 1.5d0 ! default value 1.5 days snow age in SH
976 0 : Inst%NumP = 5.0d0 ! default value of 5 particles per snowflake
977 : ENDIF
978 :
979 : ! Final BrSalt flag
980 0 : Inst%CalcBrSalt = ( Inst%CalcBrSalt .and. Inst%IDTBrSALA > 0 .and. Inst%IDTBrSALC > 0 )
981 :
982 : ! The source function calculated with GEOS-4 2x2.5 wind speeds
983 : ! is too high compared to GEOS-5 at the same resolution. The 10m
984 : ! winds in GEOS-4 are too rapid. To correct this, apply a global
985 : ! scaling factor of 0.72 (jaegle 5/11/11)
986 : ! Now check first if this factor is specified in configuration file
987 : CALL GetExtOpt( HcoState%Config, Inst%ExtNrSS, 'Wind scale factor', &
988 0 : OptValDp=tmpScale, FOUND=FOUND, RC=RC )
989 0 : IF ( RC /= HCO_SUCCESS ) THEN
990 0 : CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
991 0 : RETURN
992 : ENDIF
993 0 : IF ( .NOT. FOUND ) THEN
994 0 : tmpScale = 1.0d0
995 : ENDIF
996 0 : Inst%WindScale = tmpScale
997 :
998 : ! Verbose mode
999 0 : IF ( HcoState%amIRoot ) THEN
1000 :
1001 : ! Write the name of the extension regardless of the verbose setting
1002 0 : msg = 'Using HEMCO extension: SeaSalt (sea salt aerosol emissions)'
1003 0 : IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
1004 0 : CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
1005 : ELSE
1006 0 : CALL HCO_Msg( msg, verb=.TRUE. ) ! w/o separator
1007 : ENDIF
1008 :
1009 : ! Write all other messages as debug printout only
1010 0 : IF ( HcoState%MarinePOA ) THEN
1011 0 : MSG = 'Use marine organic aerosols option'
1012 0 : CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
1013 : ENDIF
1014 :
1015 0 : WRITE(MSG,*) 'Accumulation aerosol: ', TRIM(SpcNamesSS(1)), &
1016 0 : ':', Inst%IDTSALA
1017 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1018 0 : WRITE(MSG,*) ' - size range : ', SALA_REDGE_um
1019 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1020 0 : WRITE(MSG,*) 'Coarse aerosol : ', TRIM(SpcNamesSS(2)), &
1021 0 : ':', Inst%IDTSALC
1022 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1023 0 : WRITE(MSG,*) ' - size range : ', SALA_REDGE_um
1024 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1025 0 : WRITE(MSG,*) ' - wind scale factor: ', Inst%WindScale
1026 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1027 :
1028 0 : IF ( Inst%EmitSnowSS ) THEN
1029 0 : WRITE(MSG,*) ' - Arctic Snow Salinity on FYI (psu): ', Inst%NSLNT_FYI
1030 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1031 0 : WRITE(MSG,*) ' - Arctic Snow Salinity on MYI (psu): ', Inst%NSLNT_MYI
1032 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1033 0 : WRITE(MSG,*) ' - Antarctic Snow Salinity on FYI (psu): ', Inst%SSLNT_FYI
1034 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1035 0 : WRITE(MSG,*) ' - Antarctic Snow Salinity on FYI (psu): ', Inst%SSLNT_MYI
1036 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1037 0 : WRITE(MSG,*) ' - Arctic Snow age (days): ', Inst%NAGE
1038 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1039 0 : WRITE(MSG,*) ' - Antarctic Snow age(days): ', Inst%SAGE
1040 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1041 0 : WRITE(MSG,*) ' - Number of particle per snowflake: ', Inst%NumP
1042 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1043 : ENDIF
1044 :
1045 0 : WRITE(MSG,*) 'Accumulation Chloride: ', TRIM(SpcNamesSS(3)), &
1046 0 : ':', Inst%IDTSALACL
1047 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1048 0 : WRITE(MSG,*) 'Coarse Chloride: ', TRIM(SpcNamesSS(4)), &
1049 0 : ':', Inst%IDTSALCCL
1050 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1051 0 : WRITE(MSG,*) 'Accumulation Alkalinity: ', TRIM(SpcNamesSS(5)), &
1052 0 : ':', Inst%IDTSALAAL
1053 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1054 0 : WRITE(MSG,*) 'Coarse Alkalinity: ', TRIM(SpcNamesSS(6)), &
1055 0 : ':', Inst%IDTSALCAL
1056 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1057 :
1058 0 : IF ( Inst%CalcBrSalt ) THEN
1059 0 : WRITE(MSG,*) 'BrSALA: ', TRIM(SpcNamesSS(7)), Inst%IDTBrSALA
1060 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1061 0 : WRITE(MSG,*) 'BrSALC: ', TRIM(SpcNamesSS(8)), Inst%IDTBrSALC
1062 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1063 0 : WRITE(MSG,*) 'Br- mass content: ', Inst%BrContent
1064 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1065 : ENDIF
1066 :
1067 0 : IF ( HcoState%MarinePOA ) THEN
1068 0 : WRITE(MSG,*) 'Hydrophobic marine organic aerosol: ', &
1069 0 : TRIM(SpcNamesSS(9)), ':', Inst%IDTMOPO
1070 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1071 :
1072 0 : WRITE(MSG,*) 'Hydrophilic marine organic aerosol: ', &
1073 0 : TRIM(SpcNamesSS(10)), ':', Inst%IDTMOPI
1074 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
1075 : ENDIF
1076 : ENDIF
1077 :
1078 : ! ----------------------------------------------------------------------
1079 : ! Allocate module and subroutine arrays
1080 : ! ----------------------------------------------------------------------
1081 :
1082 : ! Number of tracers dependent on MarinePOA (ewl, 7/9/15)
1083 0 : IF ( HcoState%MarinePOA ) THEN
1084 0 : Inst%NSALT = 4
1085 : ELSE
1086 0 : Inst%NSALT = 2
1087 : ENDIF
1088 :
1089 0 : ALLOCATE ( Inst%NR ( Inst%NSALT ), STAT=AS )
1090 0 : IF ( AS/=0 ) THEN
1091 0 : CALL HCO_ERROR( 'Cannot allocate NR', RC )
1092 0 : RETURN
1093 : ENDIF
1094 0 : Inst%NR = 0
1095 :
1096 0 : ALLOCATE ( Inst%SS_DEN ( Inst%NSALT ), STAT=AS )
1097 : IF ( AS/=0 ) THEN
1098 0 : CALL HCO_ERROR( 'Cannot allocate SS_DEN', RC )
1099 0 : RETURN
1100 : ENDIF
1101 0 : Inst%SS_DEN = 2200.d0
1102 :
1103 0 : ALLOCATE ( Inst%SRRC ( NR_MAX, Inst%NSALT ), STAT=AS )
1104 : IF ( AS/=0 ) THEN
1105 0 : CALL HCO_ERROR( 'Cannot allocate SRRC', RC )
1106 0 : RETURN
1107 : ENDIF
1108 0 : Inst%SRRC = 0d0
1109 0 : ALLOCATE ( Inst%SRRC_N ( NR_MAX, Inst%NSALT ), STAT=AS )
1110 : IF ( AS/=0 ) THEN
1111 0 : CALL HCO_ERROR( 'Cannot allocate SRRC_N', RC )
1112 0 : RETURN
1113 : ENDIF
1114 0 : Inst%SRRC_N = 0d0
1115 0 : ALLOCATE ( Inst%RREDGE ( 0:NR_MAX, Inst%NSALT ), STAT=AS )
1116 : IF ( AS/=0 ) THEN
1117 0 : CALL HCO_ERROR( 'Cannot allocate RREDGE', RC )
1118 0 : RETURN
1119 : ENDIF
1120 0 : Inst%RREDGE = 0d0
1121 0 : ALLOCATE ( Inst%RRMID ( NR_MAX, Inst%NSALT ), STAT=AS )
1122 : IF ( AS/=0 ) THEN
1123 0 : CALL HCO_ERROR( 'Cannot allocate RRMID', RC )
1124 0 : RETURN
1125 : ENDIF
1126 0 : Inst%RRMID = 0d0
1127 :
1128 0 : ALLOCATE ( Inst%NDENS_SALA( HcoState%NX, HcoState%NY), STAT=AS )
1129 : IF ( AS/=0 ) THEN
1130 0 : CALL HCO_ERROR( 'Cannot allocate NDENS_SALA', RC )
1131 0 : RETURN
1132 : ENDIF
1133 0 : Inst%NDENS_SALA = 0.0_sp
1134 :
1135 0 : ALLOCATE ( Inst%NDENS_SALC( HcoState%NX, HcoState%NY), STAT=AS )
1136 : IF ( AS/=0 ) THEN
1137 0 : CALL HCO_ERROR( 'Cannot allocate NDENS_SALC', RC )
1138 0 : RETURN
1139 : ENDIF
1140 0 : Inst%NDENS_SALC = 0.0_sp
1141 :
1142 : ! Allocate for blowing snow simulation
1143 0 : IF ( Inst%EmitSnowSS ) THEN
1144 0 : ALLOCATE ( Inst%F_DI_N_FYI( NR_MAX, Inst%NSALT ), STAT=AS )
1145 : IF ( AS/=0 ) THEN
1146 0 : CALL HCO_ERROR( 'Cannot allocate F_DI_N_FYI', RC )
1147 0 : RETURN
1148 : ENDIF
1149 0 : Inst%F_DI_N_FYI = 0.0_sp
1150 :
1151 0 : ALLOCATE ( Inst%F_DI_N_MYI( NR_MAX, Inst%NSALT ), STAT=AS )
1152 : IF ( AS/=0 ) THEN
1153 0 : CALL HCO_ERROR( 'Cannot allocate F_DI_N_MYI', RC )
1154 0 : RETURN
1155 : ENDIF
1156 0 : Inst%F_DI_N_MYI = 0.0_sp
1157 :
1158 0 : ALLOCATE ( Inst%F_DN_N_FYI( NR_MAX, Inst%NSALT ), STAT=AS )
1159 : IF ( AS/=0 ) THEN
1160 0 : CALL HCO_ERROR( 'Cannot allocate F_DN_N_FYI', RC )
1161 0 : RETURN
1162 : ENDIF
1163 0 : Inst%F_DN_N_FYI = 0.0_sp
1164 :
1165 0 : ALLOCATE ( Inst%F_DN_N_MYI( NR_MAX, Inst%NSALT ), STAT=AS )
1166 : IF ( AS/=0 ) THEN
1167 0 : CALL HCO_ERROR( 'Cannot allocate F_DN_N_MYI', RC )
1168 0 : RETURN
1169 : ENDIF
1170 0 : Inst%F_DN_N_MYI = 0.0_sp
1171 :
1172 0 : ALLOCATE ( Inst%F_DI_S_FYI( NR_MAX, Inst%NSALT ), STAT=AS )
1173 : IF ( AS/=0 ) THEN
1174 0 : CALL HCO_ERROR( 'Cannot allocate F_DI_S_FYI', RC )
1175 0 : RETURN
1176 : ENDIF
1177 0 : Inst%F_DI_S_FYI = 0.0_sp
1178 :
1179 0 : ALLOCATE ( Inst%F_DI_S_MYI( NR_MAX, Inst%NSALT ), STAT=AS )
1180 : IF ( AS/=0 ) THEN
1181 0 : CALL HCO_ERROR( 'Cannot allocate F_DI_S_MYI', RC )
1182 0 : RETURN
1183 : ENDIF
1184 0 : Inst%F_DI_S_MYI = 0.0_sp
1185 :
1186 0 : ALLOCATE ( Inst%F_DN_S_FYI( NR_MAX, Inst%NSALT ), STAT=AS )
1187 : IF ( AS/=0 ) THEN
1188 0 : CALL HCO_ERROR( 'Cannot allocate F_DN_S_FYI', RC )
1189 0 : RETURN
1190 : ENDIF
1191 0 : Inst%F_DN_S_FYI = 0.0_sp
1192 :
1193 0 : ALLOCATE ( Inst%F_DN_S_MYI( NR_MAX, Inst%NSALT ), STAT=AS )
1194 : IF ( AS/=0 ) THEN
1195 0 : CALL HCO_ERROR( 'Cannot allocate F_DN_S_MYI', RC )
1196 0 : RETURN
1197 : ENDIF
1198 0 : Inst%F_DN_S_MYI = 0.0_sp
1199 : ENDIF
1200 :
1201 0 : IF ( HcoState%MarinePOA ) THEN
1202 :
1203 : ! Allocate density of phobic marine organic aerosols
1204 0 : ALLOCATE ( Inst%NDENS_MOPO( HcoState%NX, HcoState%NY), STAT=AS )
1205 : IF ( AS/=0 ) THEN
1206 0 : CALL HCO_ERROR( 'Cannot allocate NDENS_MOPO', RC )
1207 0 : RETURN
1208 : ENDIF
1209 0 : Inst%NDENS_MOPO = 0.0_sp
1210 :
1211 : ! Allocate density of philic marine organic aerosols
1212 0 : ALLOCATE ( Inst%NDENS_MOPI( HcoState%NX, HcoState%NY), STAT=AS )
1213 : IF ( AS/=0 ) THEN
1214 0 : CALL HCO_ERROR( 'Cannot allocate NDENS_MOPI', RC )
1215 0 : RETURN
1216 : ENDIF
1217 0 : Inst%NDENS_MOPI = 0.0_sp
1218 :
1219 0 : ALLOCATE ( Inst%CHLR( HcoState%NX, HcoState%NY), STAT=AS )
1220 : IF ( AS/=0 ) THEN
1221 0 : CALL HCO_ERROR( 'Cannot allocate CHLR', RC )
1222 0 : RETURN
1223 : ENDIF
1224 0 : Inst%CHLR = 0.0_hp
1225 :
1226 : ENDIF
1227 :
1228 : !=================================================================
1229 : ! Define edges and midpoints of each incremental radius bin
1230 : !=================================================================
1231 :
1232 : ! Constant [volume * time * other stuff??]
1233 : !CONST = 4d0/3d0 * PI * DR * DTEMIS * 1.d-18 * 1.373d0
1234 :
1235 : !CONST_N = DTEMIS * DR * 1.373d0
1236 : ! Constant for converting from [#/m2/s/um] to [#/m2]
1237 0 : CONST_N = HcoState%TS_EMIS * (DR * BETHA)
1238 :
1239 : ! Do for accumulation, fine mode, and marine organics (if enabled)
1240 0 : DO N = 1,Inst%NSALT
1241 :
1242 : ! Lower and upper limit of size bin N [um]
1243 : ! Note that these are dry size bins. In order to
1244 : ! get wet (RH=80%) sizes, we need to multiply by
1245 : ! BETHA.
1246 :
1247 : ! Accumulation mode
1248 0 : IF ( N==1 ) THEN
1249 0 : R0 = SALA_REDGE_um(1)
1250 0 : R1 = SALA_REDGE_um(2)
1251 :
1252 : ! Coarse mode
1253 0 : ELSEIF ( N==2 ) THEN
1254 0 : R0 = SALC_REDGE_um(1)
1255 0 : R1 = SALC_REDGE_um(2)
1256 :
1257 : ! Marine phobic (mj, bg, 7/9/15)
1258 0 : ELSEIF ( N==3 ) THEN
1259 0 : R0 = SALA_REDGE_um(1)
1260 0 : R1 = SALA_REDGE_um(2)
1261 :
1262 : ! Marine philic (mj, bg, 7/9/15)
1263 0 : ELSEIF ( N==4 ) THEN
1264 0 : R0 = SALC_REDGE_um(1)
1265 0 : R1 = SALC_REDGE_um(2)
1266 : ENDIF
1267 :
1268 : ! Number of radius size bins
1269 0 : Inst%NR(N) = INT( ( ( R1 - R0 ) / DR ) + 0.5d0 )
1270 :
1271 : ! Error check
1272 0 : IF ( Inst%NR(N) > NR_MAX ) THEN
1273 0 : MSG = 'Too many bins'
1274 0 : CALL HCO_ERROR(MSG, RC )
1275 0 : RETURN
1276 : ENDIF
1277 :
1278 : ! Lower edge of 0th bin
1279 0 : Inst%RREDGE(0,N) = R0
1280 :
1281 : ! Loop over the # of radius bins
1282 0 : DO R = 1, Inst%NR(N)
1283 :
1284 : ! Midpoint of IRth bin
1285 0 : Inst%RRMID(R,N) = Inst%RREDGE(R-1,N) + ( DR / 2d0 )
1286 :
1287 : ! Upper edge of IRth bin
1288 0 : Inst%RREDGE(R,N) = Inst%RREDGE(R-1,N) + DR
1289 :
1290 : ! Sea salt base source [#/m2]. Note that the Gong formulation
1291 : ! is for r80 (radius at 80% RH), so we need to multiply RRMID
1292 : ! by the scaling factor BETHA=2.
1293 0 : A = 4.7*(1.+30.*(BETHA*Inst%RRMID(R,N))) &
1294 0 : **(-0.017*(BETHA*Inst%RRMID(R,N))**(-1.44))
1295 0 : B = (0.433d0-LOG10(BETHA*Inst%RRMID(R,N))) / 0.433d0
1296 0 : Inst%SRRC_N(R,N) = CONST_N * 1.373 &
1297 : * (1.d0/(BETHA*Inst%RRMID(R,N))**(A)) &
1298 : * (1.d0+0.057d0*(BETHA*Inst%RRMID(R,N))**3.45d0) &
1299 0 : * 10d0**(1.607d0*EXP(-(B**2)))
1300 :
1301 : ! Sea salt base source [kg/m2]: multiply the number of particles
1302 : ! by the dry volume multiplied by the dry density of sea-salt.
1303 0 : Inst%SRRC(R,N) = Inst%SRRC_N(R,N) * 4d0/3d0 * HcoState%Phys%PI * 1.d-18 &
1304 0 : * Inst%SS_DEN( N ) * (Inst%RRMID(R,N))**3
1305 :
1306 : !-----------------------------------------------------------
1307 : ! IMPORTANT NOTE!
1308 : !
1309 : ! In mathematics, "LOG" means "log10".
1310 : ! In Fortran, "LOG" means "ln" (and LOG10 is "log10").
1311 : !
1312 : ! The following equations require log to the base 10, so
1313 : ! we need to use the Fortran function LOG10 instead of LOG.
1314 : ! (jaegle, bmy, 11/23/09)
1315 : !-----------------------------------------------------------
1316 :
1317 : ! ! Old Monahan et al. (1986) formulation
1318 : ! ! Sea salt base source [kg/m2]
1319 : ! CONST_N = DTEMIS * (DR * BETHA)
1320 : ! SRRC(R,N) = CONST * SS_DEN( N )
1321 : ! & * ( 1.d0 + 0.057d0*( BETHA * RRMID(R,N) )**1.05d0 )
1322 : ! & * 10d0**( 1.19d0*
1323 : ! & EXP(-((0.38d0-LOG10(BETHA*RRMID(R,N)))/0.65d0)**2))
1324 : ! & / BETHA**2
1325 :
1326 : ! ! Sea salt base source [#/m2] (bec, bmy, 4/13/05)
1327 : ! SRRC_N(R,N) = CONST_N * (1.d0/RRMID(R,N)**3)
1328 : ! & * (1.d0+0.057d0*(BETHA*RRMID(R,N))**1.05d0)
1329 : ! & * 10d0**(1.19d0*EXP(-((0.38d0-LOG10(BETHA*RRMID(R,N)))
1330 : ! & /0.65d0)**2))/ BETHA**2
1331 :
1332 : !### Debug
1333 : !### WRITE( 6, 100 ) R,RREDGE(R-1,N),RRMID(R,N),RREDGE(R,N),SRRC(R,N)
1334 : !### 100 FORMAT( 'IR, R0, RRMID, R1: ', i3, 3f11.4,2x,es13.6 )
1335 : ENDDO !R
1336 :
1337 : !size bins for blowing snow - Huang 6/12/20
1338 0 : IF ( Inst%EmitSnowSS .and. N .LT. 3 ) THEN
1339 : !-------------- Define size distribution ---------------------
1340 : ! for southern hemisphere FYI
1341 : D_SNOW = 1.0d0
1342 0 : DO ND = 1, NR_MAX
1343 : D_DRY = ( Inst%NSLNT_FYI * RHOICE / (1000.d0 &
1344 0 : * Inst%NumP * RHONACL ) )**( 1d0 / 3d0 ) * D_SNOW
1345 :
1346 0 : IF (D_DRY .ge. R0*2d0 .and. D_DRY .le. R1*2d0 ) THEN
1347 :
1348 : !----------------------------------------------------------
1349 : ! NOTES:
1350 : ! For size distribution
1351 : ! define the two-parameter gamma probability density funtion here
1352 : ! Yang et al 2008 eq (6)
1353 : !----------------------------------------------------------
1354 : ! Midpoint of IRth bin
1355 0 : Inst%F_DI_N_FYI(ND, N) = EXP( - D_SNOW / B_SALT ) &
1356 : * D_SNOW**( A_SALT - 1.d0 ) &
1357 0 : / ( B_SALT**A_SALT * GAMMA( A_SALT ) )
1358 : ELSE
1359 0 : Inst%F_DI_N_FYI(ND, N) = 0d0
1360 : ENDIF
1361 0 : Inst%F_DN_N_FYI(ND, N) = Inst%F_DI_N_FYI(ND,N) / (4d0/3d0 * HcoState%Phys%PI &
1362 0 : * 1.d-18 * Inst%SS_DEN( N ) * (D_DRY/2d0)**3)
1363 :
1364 0 : D_SNOW = D_SNOW + DDSNOW
1365 : ENDDO
1366 :
1367 : ! for southern hemisphere MYI
1368 : D_SNOW = 1.0d0
1369 0 : DO ND = 1, NR_MAX
1370 : D_DRY = ( Inst%NSLNT_MYI * RHOICE / (1000.d0 &
1371 0 : * Inst%NumP * RHONACL ) )**( 1d0 / 3d0 ) * D_SNOW
1372 :
1373 0 : IF (D_DRY .ge. R0*2d0 .and. D_DRY .le. R1*2d0 ) THEN
1374 : ! Midpoint of IRth bin
1375 0 : Inst%F_DI_N_MYI(ND, N) = EXP( - D_SNOW / B_SALT ) &
1376 : * D_SNOW**( A_SALT - 1.d0 ) &
1377 0 : / ( B_SALT**A_SALT * GAMMA( A_SALT ) )
1378 : ELSE
1379 0 : Inst%F_DI_N_MYI(ND, N) = 0d0
1380 : ENDIF
1381 0 : Inst%F_DN_N_MYI(ND, N) = Inst%F_DI_N_MYI(ND,N) / (4d0/3d0 * HcoState%Phys%PI &
1382 0 : * 1.d-18 * Inst%SS_DEN( N ) * (D_DRY/2d0)**3)
1383 :
1384 0 : D_SNOW = D_SNOW + DDSNOW
1385 : ENDDO
1386 :
1387 : ! for southern hemisphere FYI
1388 : D_SNOW = 1.0d0
1389 0 : DO ND = 1, NR_MAX
1390 : D_DRY = ( Inst%SSLNT_FYI * RHOICE / (1000.d0 &
1391 0 : * Inst%NumP * RHONACL ) )**( 1d0 / 3d0 ) * D_SNOW
1392 :
1393 0 : IF (D_DRY .ge. R0*2d0 .and. D_DRY .le. R1*2d0 ) THEN
1394 : ! Midpoint of IRth bin
1395 0 : Inst%F_DI_S_FYI(ND, N) = EXP( - D_SNOW / B_SALT ) &
1396 : * D_SNOW**( A_SALT - 1.d0 ) &
1397 0 : / ( B_SALT**A_SALT * GAMMA( A_SALT ) )
1398 : ELSE
1399 0 : Inst%F_DI_S_FYI(ND, N) = 0d0
1400 : ENDIF
1401 0 : Inst%F_DN_S_FYI(ND, N) = Inst%F_DI_S_FYI(ND,N)/ (4d0/3d0 * HcoState%Phys%PI &
1402 0 : * 1.d-18 * Inst%SS_DEN( N ) * (D_DRY/2d0)**3)
1403 0 : D_SNOW = D_SNOW + DDSNOW
1404 : ENDDO
1405 :
1406 : ! for southern hemisphere MYI
1407 : D_SNOW = 1.0d0
1408 0 : DO ND = 1, NR_MAX
1409 : D_DRY = ( Inst%SSLNT_MYI * RHOICE / (1000.d0 &
1410 0 : * Inst%NumP * RHONACL ) )**( 1d0 / 3d0 ) * D_SNOW
1411 :
1412 0 : IF (D_DRY .ge. R0*2d0 .and. D_DRY .le. R1*2d0 ) THEN
1413 : ! Midpoint of IRth bin
1414 0 : Inst%F_DI_S_MYI(ND, N) = EXP( - D_SNOW / B_SALT ) &
1415 : * D_SNOW**( A_SALT - 1.d0 ) &
1416 0 : / ( B_SALT**A_SALT * GAMMA( A_SALT ) )
1417 : ELSE
1418 0 : Inst%F_DI_S_MYI(ND, N) = 0d0
1419 : ENDIF
1420 0 : Inst%F_DN_S_MYI(ND, N) = Inst%F_DI_S_MYI(ND,N)/ (4d0/3d0 * HcoState%Phys%PI &
1421 0 : * 1.d-18 * Inst%SS_DEN( N ) * (D_DRY/2d0)**3)
1422 0 : D_SNOW = D_SNOW + DDSNOW
1423 : ENDDO
1424 :
1425 : ENDIF
1426 :
1427 : ENDDO !N
1428 :
1429 : !=======================================================================
1430 : ! Create diagnostics. The number densities of both modes are always
1431 : ! written into a diagnostics so that they can be used by other routines
1432 : ! and from outside of HEMCO. These diagnostics just hold a pointer
1433 : ! to the respective density arrays filled by the run method of this
1434 : ! module.
1435 : !=======================================================================
1436 : CALL Diagn_Create ( HcoState = HcoState, &
1437 : cName = 'SEASALT_DENS_FINE', &
1438 : ExtNr = Inst%ExtNrSS, &
1439 : Cat = -1, &
1440 : Hier = -1, &
1441 : HcoID = Inst%IDTSALA, &
1442 : SpaceDim = 2, &
1443 : OutUnit = 'number_dens', &
1444 : AutoFill = 0, &
1445 : Trgt2D = Inst%NDENS_SALA, &
1446 : COL = HcoState%Diagn%HcoDiagnIDManual, &
1447 0 : RC = RC )
1448 0 : IF ( RC /= HCO_SUCCESS ) THEN
1449 0 : CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
1450 0 : RETURN
1451 : ENDIF
1452 :
1453 : CALL Diagn_Create ( HcoState = HcoState, &
1454 : cName = 'SEASALT_DENS_COARSE', &
1455 : ExtNr = Inst%ExtNrSS, &
1456 : Cat = -1, &
1457 : Hier = -1, &
1458 : HcoID = Inst%IDTSALC, &
1459 : SpaceDim = 2, &
1460 : OutUnit = 'number_dens', &
1461 : AutoFill = 0, &
1462 : Trgt2D = Inst%NDENS_SALC, &
1463 : COL = HcoState%Diagn%HcoDiagnIDManual, &
1464 0 : RC = RC )
1465 0 : IF ( RC /= HCO_SUCCESS ) THEN
1466 0 : CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
1467 0 : RETURN
1468 : ENDIF
1469 :
1470 : ! Create marine density diagnostics only if marine POA enabled
1471 0 : IF ( HcoState%MarinePOA ) THEN
1472 :
1473 : CALL Diagn_Create ( HcoState = HcoState, &
1474 : cName = 'SEASALT_DENS_PHOBIC', &
1475 : ExtNr = Inst%ExtNrSS, &
1476 : Cat = -1, &
1477 : Hier = -1, &
1478 : HcoID = Inst%IDTMOPO, &
1479 : SpaceDim = 2, &
1480 : OutUnit = 'number_dens', &
1481 : AutoFill = 0, &
1482 : Trgt2D = Inst%NDENS_MOPO, &
1483 : COL = HcoState%Diagn%HcoDiagnIDManual, &
1484 0 : RC = RC )
1485 0 : IF ( RC /= HCO_SUCCESS ) THEN
1486 0 : CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
1487 0 : RETURN
1488 : ENDIF
1489 :
1490 : CALL Diagn_Create ( HcoState = HcoState, &
1491 : cName = 'SEASALT_DENS_PHILIC', &
1492 : ExtNr = Inst%ExtNrSS, &
1493 : Cat = -1, &
1494 : Hier = -1, &
1495 : HcoID = Inst%IDTMOPI, &
1496 : SpaceDim = 2, &
1497 : OutUnit = 'number_dens', &
1498 : AutoFill = 0, &
1499 : Trgt2D = Inst%NDENS_MOPI, &
1500 : COL = HcoState%Diagn%HcoDiagnIDManual, &
1501 0 : RC = RC )
1502 0 : IF ( RC /= HCO_SUCCESS ) THEN
1503 0 : CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
1504 0 : RETURN
1505 : ENDIF
1506 :
1507 : ENDIF
1508 :
1509 : !=======================================================================
1510 : ! Activate this module and the fields of ExtState that it uses
1511 : !=======================================================================
1512 :
1513 : ! Activate met fields used by this module
1514 0 : ExtState%TSKIN%DoUse = .TRUE.
1515 0 : ExtState%U10M%DoUse = .TRUE.
1516 0 : ExtState%V10M%DoUse = .TRUE.
1517 0 : ExtState%FROCEAN%DoUse = .TRUE.
1518 0 : ExtState%FRSEAICE%DoUse = .TRUE.
1519 :
1520 : ! for blowing snow
1521 0 : IF ( Inst%EmitSnowSS ) THEN
1522 0 : ExtState%USTAR%DoUse = .TRUE.
1523 0 : ExtState%T2M%DoUse = .TRUE.
1524 0 : ExtState%QV2M%DoUse = .TRUE.
1525 : ENDIF
1526 :
1527 : ! Return w/ success
1528 0 : IF ( ALLOCATED(HcoIDsSS ) ) DEALLOCATE(HcoIDsSS )
1529 0 : IF ( ALLOCATED(SpcNamesSS ) ) DEALLOCATE(SpcNamesSS )
1530 :
1531 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
1532 :
1533 0 : END SUBROUTINE HCOX_SeaSalt_Init
1534 : !EOC
1535 : !------------------------------------------------------------------------------
1536 : ! Harmonized Emissions Component (HEMCO) !
1537 : !------------------------------------------------------------------------------
1538 : !BOP
1539 : !
1540 : ! !IROUTINE: HCOX_SeaSalt_Final
1541 : !
1542 : ! !DESCRIPTION: Subroutine HcoX\_SeaSalt\_Final deallocates
1543 : ! all module arrays.
1544 : !\\
1545 : !\\
1546 : ! !INTERFACE:
1547 : !
1548 0 : SUBROUTINE HCOX_SeaSalt_Final ( ExtState )
1549 : !
1550 : ! !INPUT PARAMETERS:
1551 : !
1552 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1553 : !
1554 : ! !REVISION HISTORY:
1555 : ! 15 Dec 2013 - C. Keller - Initial version
1556 : ! See https://github.com/geoschem/hemco for complete history
1557 : !EOP
1558 : !------------------------------------------------------------------------------
1559 : !BOC
1560 : !
1561 : !=================================================================
1562 : ! HCOX_SeaSalt_Final begins here!
1563 : !=================================================================
1564 0 : CALL InstRemove ( ExtState%SeaSalt )
1565 :
1566 0 : END SUBROUTINE HCOX_SeaSalt_Final
1567 : !EOC
1568 : !------------------------------------------------------------------------------
1569 : ! Harmonized Emissions Component (HEMCO) !
1570 : !------------------------------------------------------------------------------
1571 : !BOP
1572 : !
1573 : ! !IROUTINE: InstGet
1574 : !
1575 : ! !DESCRIPTION: Subroutine InstGet returns a poiner to the desired instance.
1576 : !\\
1577 : !\\
1578 : ! !INTERFACE:
1579 : !
1580 0 : SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
1581 : !
1582 : ! !INPUT PARAMETERS:
1583 : !
1584 : INTEGER :: Instance
1585 : TYPE(MyInst), POINTER :: Inst
1586 : INTEGER :: RC
1587 : TYPE(MyInst), POINTER, OPTIONAL :: PrevInst
1588 : !
1589 : ! !REVISION HISTORY:
1590 : ! 18 Feb 2016 - C. Keller - Initial version
1591 : ! See https://github.com/geoschem/hemco for complete history
1592 : !EOP
1593 : !------------------------------------------------------------------------------
1594 : !BOC
1595 : TYPE(MyInst), POINTER :: PrvInst
1596 :
1597 : !=================================================================
1598 : ! InstGet begins here!
1599 : !=================================================================
1600 :
1601 : ! Get instance. Also archive previous instance.
1602 0 : PrvInst => NULL()
1603 0 : Inst => AllInst
1604 0 : DO WHILE ( ASSOCIATED(Inst) )
1605 0 : IF ( Inst%Instance == Instance ) EXIT
1606 0 : PrvInst => Inst
1607 0 : Inst => Inst%NextInst
1608 : END DO
1609 0 : IF ( .NOT. ASSOCIATED( Inst ) ) THEN
1610 0 : RC = HCO_FAIL
1611 0 : RETURN
1612 : ENDIF
1613 :
1614 : ! Pass output arguments
1615 0 : IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
1616 :
1617 : ! Cleanup & Return
1618 0 : PrvInst => NULL()
1619 0 : RC = HCO_SUCCESS
1620 :
1621 : END SUBROUTINE InstGet
1622 : !EOC
1623 : !------------------------------------------------------------------------------
1624 : ! Harmonized Emissions Component (HEMCO) !
1625 : !------------------------------------------------------------------------------
1626 : !BOP
1627 : !
1628 : ! !IROUTINE: InstCreate
1629 : !
1630 : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
1631 : !\\
1632 : !\\
1633 : ! !INTERFACE:
1634 : !
1635 0 : SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
1636 : !
1637 : ! !INPUT PARAMETERS:
1638 : !
1639 : INTEGER, INTENT(IN) :: ExtNr
1640 : !
1641 : ! !OUTPUT PARAMETERS:
1642 : !
1643 : INTEGER, INTENT( OUT) :: Instance
1644 : TYPE(MyInst), POINTER :: Inst
1645 : !
1646 : ! !INPUT/OUTPUT PARAMETERS:
1647 : !
1648 : INTEGER, INTENT(INOUT) :: RC
1649 : !
1650 : ! !REVISION HISTORY:
1651 : ! 18 Feb 2016 - C. Keller - Initial version
1652 : ! See https://github.com/geoschem/hemco for complete history
1653 : !EOP
1654 : !------------------------------------------------------------------------------
1655 : !BOC
1656 : TYPE(MyInst), POINTER :: TmpInst
1657 : INTEGER :: nnInst
1658 :
1659 : !=================================================================
1660 : ! InstCreate begins here!
1661 : !=================================================================
1662 :
1663 : ! ----------------------------------------------------------------
1664 : ! Generic instance initialization
1665 : ! ----------------------------------------------------------------
1666 : ! Initialize
1667 0 : Inst => NULL()
1668 :
1669 : ! Get number of already existing instances
1670 0 : TmpInst => AllInst
1671 0 : nnInst = 0
1672 0 : DO WHILE ( ASSOCIATED(TmpInst) )
1673 0 : nnInst = nnInst + 1
1674 0 : TmpInst => TmpInst%NextInst
1675 : END DO
1676 :
1677 : ! Create new instance
1678 0 : ALLOCATE(Inst)
1679 0 : Inst%Instance = nnInst + 1
1680 0 : Inst%ExtNr = ExtNr
1681 :
1682 : ! Init values
1683 0 : Inst%ExtNrSS = -1
1684 0 : Inst%IDTSALA = -1
1685 0 : Inst%IDTSALC = -1
1686 0 : Inst%IDTMOPI = -1
1687 0 : Inst%IDTMOPO = -1
1688 0 : Inst%IDTBrSALA = -1
1689 0 : Inst%IDTBrSALC = -1
1690 0 : Inst%CalcBrSalt = .FALSE.
1691 0 : Inst%BrContent = 1.0
1692 0 : Inst%WindScale = 1.0
1693 0 : Inst%ColdSST = .FALSE.
1694 0 : Inst%EmitSnowSS = .FALSE.
1695 0 : Inst%NSLNT_FYI = 0.0
1696 0 : Inst%NSLNT_MYI = 0.0
1697 0 : Inst%SSLNT_FYI = 0.0
1698 0 : Inst%SSLNT_MYI = 0.0
1699 0 : Inst%NAGE = 0.0
1700 0 : Inst%SAGE = 0.0
1701 0 : Inst%NumP = 1.0
1702 :
1703 : ! Attach to instance list
1704 0 : Inst%NextInst => AllInst
1705 0 : AllInst => Inst
1706 :
1707 : ! Update output instance
1708 0 : Instance = Inst%Instance
1709 :
1710 : ! ----------------------------------------------------------------
1711 : ! Type specific initialization statements follow below
1712 : ! ----------------------------------------------------------------
1713 :
1714 : ! Return w/ success
1715 0 : RC = HCO_SUCCESS
1716 :
1717 0 : END SUBROUTINE InstCreate
1718 : !EOC
1719 : !------------------------------------------------------------------------------
1720 : ! Harmonized Emissions Component (HEMCO) !
1721 : !------------------------------------------------------------------------------
1722 : !BOP
1723 : !
1724 : ! !IROUTINE: InstRemove
1725 : !
1726 : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
1727 : !\\
1728 : !\\
1729 : ! !INTERFACE:
1730 : !
1731 0 : SUBROUTINE InstRemove ( Instance )
1732 : !
1733 : ! !INPUT PARAMETERS:
1734 : !
1735 : INTEGER :: Instance
1736 : !
1737 : ! !REVISION HISTORY:
1738 : ! 18 Feb 2016 - C. Keller - Initial version
1739 : ! See https://github.com/geoschem/hemco for complete history
1740 : !EOP
1741 : !------------------------------------------------------------------------------
1742 : !BOC
1743 : INTEGER :: RC
1744 : TYPE(MyInst), POINTER :: PrevInst
1745 : TYPE(MyInst), POINTER :: Inst
1746 :
1747 : !=================================================================
1748 : ! InstRemove begins here!
1749 : !=================================================================
1750 :
1751 : ! Init
1752 0 : PrevInst => NULL()
1753 0 : Inst => NULL()
1754 :
1755 : ! Get instance. Also archive previous instance.
1756 0 : CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
1757 :
1758 : ! Instance-specific deallocation
1759 0 : IF ( ASSOCIATED(Inst) ) THEN
1760 :
1761 : !---------------------------------------------------------------------
1762 : ! Deallocate fields of Inst before popping off from the list
1763 : ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
1764 : !---------------------------------------------------------------------
1765 0 : IF ( ASSOCIATED( Inst%NR ) ) THEN
1766 0 : DEALLOCATE( Inst%NR )
1767 : ENDIF
1768 0 : Inst%NR => NULL()
1769 :
1770 0 : IF ( ASSOCIATED( Inst%SS_DEN ) ) THEN
1771 0 : DEALLOCATE( Inst%SS_DEN )
1772 : ENDIF
1773 0 : Inst%SS_DEN => NULL()
1774 :
1775 0 : IF ( ASSOCIATED( Inst%SRRC ) ) THEN
1776 0 : DEALLOCATE( Inst%SRRC )
1777 : ENDIF
1778 0 : Inst%SRRC => NULL()
1779 :
1780 0 : IF ( ASSOCIATED( Inst%SRRC_N ) ) THEN
1781 0 : DEALLOCATE( Inst%SRRC_N )
1782 : ENDIF
1783 0 : Inst%SRRC_N => NULL()
1784 :
1785 0 : IF ( ASSOCIATED( Inst%RREDGE ) ) THEN
1786 0 : DEALLOCATE( Inst%RREDGE )
1787 : ENDIF
1788 0 : Inst%RREDGE => NULL()
1789 :
1790 0 : IF ( ASSOCIATED( Inst%RRMID ) ) THEN
1791 0 : DEALLOCATE( Inst%RRMID )
1792 : ENDIF
1793 0 : Inst%RRMID => NULL()
1794 :
1795 0 : IF ( ASSOCIATED( Inst%NDENS_SALA ) ) THEN
1796 0 : DEALLOCATE( Inst%NDENS_SALA )
1797 : ENDIF
1798 0 : Inst%NDENS_SALA => NULL()
1799 :
1800 0 : IF ( ASSOCIATED( Inst%NDENS_SALC ) ) THEN
1801 0 : DEALLOCATE( Inst%NDENS_SALC )
1802 : ENDIF
1803 0 : Inst%NDENS_SALC => NULL()
1804 :
1805 0 : IF ( ASSOCIATED( Inst%NDENS_MOPO ) ) THEN
1806 0 : DEALLOCATE( Inst%NDENS_MOPO )
1807 : ENDIF
1808 0 : Inst%NDENS_MOPO => NULL()
1809 :
1810 0 : IF ( ASSOCIATED( Inst%NDENS_MOPI ) ) THEN
1811 0 : DEALLOCATE( Inst%NDENS_MOPI )
1812 : ENDIF
1813 0 : Inst%NDENS_MOPI => NULL()
1814 :
1815 0 : IF ( ASSOCIATED( Inst%CHLR ) ) THEN
1816 0 : DEALLOCATE( Inst%CHLR )
1817 : ENDIF
1818 0 : Inst%CHLR => NULL()
1819 :
1820 0 : IF ( ASSOCIATED( Inst%F_DI_N_FYI ) ) THEN
1821 0 : DEALLOCATE( Inst%F_DI_N_FYI )
1822 : ENDIF
1823 0 : Inst%F_DI_N_FYI => NULL()
1824 :
1825 0 : IF ( ASSOCIATED( Inst%F_DI_N_MYI ) ) THEN
1826 0 : DEALLOCATE( Inst%F_DI_N_MYI )
1827 : ENDIF
1828 0 : Inst%F_DI_N_MYI => NULL()
1829 :
1830 0 : IF ( ASSOCIATED( Inst%F_DI_S_FYI ) ) THEN
1831 0 : DEALLOCATE( Inst%F_DI_S_FYI )
1832 : ENDIF
1833 0 : Inst%F_DI_S_FYI => NULL()
1834 :
1835 0 : IF ( ASSOCIATED( Inst%F_DI_S_MYI ) ) THEN
1836 0 : DEALLOCATE( Inst%F_DI_S_MYI )
1837 : ENDIF
1838 0 : Inst%F_DI_S_MYI => NULL()
1839 :
1840 0 : IF ( ASSOCIATED( Inst%F_DN_N_FYI ) ) THEN
1841 0 : DEALLOCATE( Inst%F_DN_N_FYI )
1842 : ENDIF
1843 0 : Inst%F_DN_N_FYI => NULL()
1844 :
1845 0 : IF ( ASSOCIATED( Inst%F_DN_N_MYI ) ) THEN
1846 0 : DEALLOCATE( Inst%F_DN_N_MYI )
1847 : ENDIF
1848 0 : Inst%F_DN_N_MYI => NULL()
1849 :
1850 0 : IF ( ASSOCIATED( Inst%F_DN_S_FYI ) ) THEN
1851 0 : DEALLOCATE( Inst%F_DN_S_FYI )
1852 : ENDIF
1853 0 : Inst%F_DN_S_FYI => NULL()
1854 :
1855 0 : IF ( ASSOCIATED( Inst%F_DN_S_MYI ) ) THEN
1856 0 : DEALLOCATE( Inst%F_DN_S_MYI )
1857 : ENDIF
1858 0 : Inst%F_DN_S_MYI => NULL()
1859 :
1860 0 : IF ( ASSOCIATED( Inst%MULTIICE ) ) THEN
1861 0 : DEALLOCATE( Inst%MULTIICE )
1862 : ENDIF
1863 0 : Inst%MULTIICE => NULL()
1864 :
1865 : !---------------------------------------------------------------------
1866 : ! Pop off instance from list
1867 : !---------------------------------------------------------------------
1868 0 : IF ( ASSOCIATED(PrevInst) ) THEN
1869 0 : PrevInst%NextInst => Inst%NextInst
1870 : ELSE
1871 0 : AllInst => Inst%NextInst
1872 : ENDIF
1873 0 : DEALLOCATE(Inst)
1874 : ENDIF
1875 :
1876 : ! Free pointers before exiting
1877 0 : PrevInst => NULL()
1878 0 : Inst => NULL()
1879 :
1880 0 : END SUBROUTINE InstRemove
1881 : !EOC
1882 0 : END MODULE HCOX_SeaSalt_Mod
|