- Timestamp:
- 2016-11-01T14:23:51+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zflx.F90
r7068 r7162 22 22 USE iom ! I/O manager 23 23 USE fldread ! read input fields 24 USE sbc_oce, ONLY : atm_co2 ! atmospheric pCO225 24 26 25 IMPLICIT NONE … … 42 41 43 42 ! !!* nampisatm namelist (Atmospheric PRessure) * 44 LOGICAL, PUBLIC :: ln_presatm !: ref. pressure: global mean Patm (F) or a constant (F)45 46 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: patm ! atmospheric pressure at kt [N/m2] 47 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_patm ! structure of input fields (file informations, fields read)48 49 50 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: oce_co2 !: ocean carbon flux 43 LOGICAL, PUBLIC :: ln_presatm !: ref. pressure: global mean Patm (F) or a constant (F) 44 LOGICAL, PUBLIC :: ln_presatmco2 !: accounting for spatial atm CO2 in the compuation of carbon flux (T) or not (F) 45 46 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: patm ! atmospheric pressure at kt [N/m2] 47 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_patm ! structure of input fields (file informations, fields read) 48 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_atmco2 ! structure of input fields (file informations, fields read) 49 51 50 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: satmco2 !: atmospheric pco2 52 51 … … 68 67 !! ** Method : 69 68 !! - Include total atm P correction via Esbensen & Kushnir (1981) 70 !! - Pressure correction NOT done for key_cpl_carbon_cycle71 69 !! - Remove Wanninkhof chemical enhancement; 72 70 !! - Add option for time-interpolation of atcco2.txt … … 79 77 REAL(wp) :: zfld, zflu, zfld16, zflu16, zfact 80 78 REAL(wp) :: zvapsw, zsal, zfco2, zxc2, xCO2approx, ztkel, zfugcoeff 81 REAL(wp) :: zph, z ah2, zbot, zdic, zalk, zsch_o2, zalka, zsch_co279 REAL(wp) :: zph, zdic, zsch_o2, zsch_co2 82 80 REAL(wp) :: zyr_dec, zdco2dt 83 81 CHARACTER (len=25) :: charout … … 94 92 ! IS USED TO COMPUTE AIR-SEA FLUX OF CO2 95 93 96 IF( kt /= nit000 .AND. knt == 1 ) CALL p4z_patm( kt ) ! Get sea-level pressure (E&K [1981] climatology) for use in flux calcs97 98 IF( ln_co2int ) THEN94 IF( kt /= nit000 .AND. .NOT.l_co2cpl .AND. knt == 1 ) CALL p4z_patm( kt ) ! Get sea-level pressure (E&K [1981] climatology) for use in flux calcs 95 96 IF( ln_co2int .AND. .NOT.ln_presatmco2 .AND. .NOT.l_co2cpl ) THEN 99 97 ! Linear temporal interpolation of atmospheric pco2. atcco2.txt has annual values. 100 98 ! Caveats: First column of .txt must be in years, decimal years preferably. … … 110 108 ENDIF 111 109 112 ! IF( ln_cpl_carbon_cycle ) satmco2(:,:) = atm_co2(:,:) 113 114 DO jm = 1, 10 115 DO jj = 1, jpj 116 DO ji = 1, jpi 117 118 ! DUMMY VARIABLES FOR DIC, H+, AND BORATE 119 zbot = borat(ji,jj,1) 120 zfact = rhop(ji,jj,1) / 1000. + rtrn 121 zdic = trb(ji,jj,1,jpdic) / zfact 122 zph = MAX( hi(ji,jj,1), 1.e-10 ) / zfact 123 zalka = trb(ji,jj,1,jptal) / zfact 124 125 ! CALCULATE [ALK]([CO3--], [HCO3-]) 126 zalk = zalka - ( akw3(ji,jj,1) / zph - zph / aphscale(ji,jj,1) & 127 & + zbot / ( 1.+ zph / akb3(ji,jj,1) ) ) 128 129 ! CALCULATE [H+] AND [H2CO3] 130 zah2 = SQRT( (zdic-zalk)**2 + 4.* ( zalk * ak23(ji,jj,1) & 131 & / ak13(ji,jj,1) ) * ( 2.* zdic - zalk ) ) 132 zah2 = 0.5 * ak13(ji,jj,1) / zalk * ( ( zdic - zalk ) + zah2 ) 133 zh2co3(ji,jj) = ( 2.* zdic - zalk ) / ( 2.+ ak13(ji,jj,1) / zah2 ) * zfact 134 hi(ji,jj,1) = zah2 * zfact 135 END DO 110 IF( l_co2cpl ) satmco2(:,:) = atm_co2(:,:) 111 112 DO jj = 1, jpj 113 DO ji = 1, jpi 114 ! DUMMY VARIABLES FOR DIC, H+, AND BORATE 115 zfact = rhop(ji,jj,1) / 1000. + rtrn 116 zdic = trb(ji,jj,1,jpdic) 117 zph = MAX( hi(ji,jj,1), 1.e-10 ) / zfact 118 ! CALCULATE [H2CO3] 119 zh2co3(ji,jj) = zdic/(1. + ak13(ji,jj,1)/zph + ak13(ji,jj,1)*ak23(ji,jj,1)/zph**2) 136 120 END DO 137 121 END DO 138 139 122 140 123 ! -------------- … … 165 148 END DO 166 149 150 167 151 DO jj = 1, jpj 168 152 DO ji = 1, jpi 169 ztkel = tsn(ji,jj,1,jp_tem) + 273.15170 zsal = tsn(ji,jj,1,jp_sal) + ( 1.- tmask(ji,jj,1) ) * 35.153 ztkel = tempis(ji,jj,1) + 273.15 154 zsal = salinprac(ji,jj,1) + ( 1.- tmask(ji,jj,1) ) * 35. 171 155 zvapsw = EXP(24.4543 - 67.4509*(100.0/ztkel) - 4.8489*LOG(ztkel/100) - 0.000544*zsal) 172 156 zpco2atm(ji,jj) = satmco2(ji,jj) * ( patm(ji,jj) - zvapsw ) … … 269 253 WRITE(numout,*) ' ' 270 254 ENDIF 271 IF( .NOT.ln_co2int) THEN255 IF( .NOT.ln_co2int .AND. .NOT.ln_presatmco2 ) THEN 272 256 IF(lwp) THEN ! control print 273 257 WRITE(numout,*) ' Constant Atmospheric pCO2 value atcco2 =', atcco2 … … 275 259 ENDIF 276 260 satmco2(:,:) = atcco2 ! Initialisation of atmospheric pco2 277 ELSE 261 ELSEIF( ln_co2int .AND. .NOT.ln_presatmco2 ) THEN 278 262 IF(lwp) THEN 279 263 WRITE(numout,*) ' Atmospheric pCO2 value from file clname =', TRIM( clname ) … … 297 281 END DO 298 282 CLOSE(numco2) 299 ENDIF 283 ELSEIF( .NOT.ln_co2int .AND. ln_presatmco2 ) THEN 284 IF(lwp) THEN 285 WRITE(numout,*) ' Spatialized Atmospheric pCO2 from an external file' 286 WRITE(numout,*) ' ' 287 ENDIF 288 ELSE 289 IF(lwp) THEN 290 WRITE(numout,*) ' Spatialized Atmospheric pCO2 from an external file' 291 WRITE(numout,*) ' ' 292 ENDIF 293 ENDIF 294 300 295 ! 301 296 oce_co2(:,:) = 0._wp ! Initialization of Flux of Carbon … … 323 318 CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files 324 319 TYPE(FLD_N) :: sn_patm ! informations about the fields to be read 325 !! 326 NAMELIST/nampisatm/ ln_presatm, sn_patm, cn_dir 320 TYPE(FLD_N) :: sn_atmco2 ! informations about the fields to be read 321 !! 322 NAMELIST/nampisatm/ ln_presatm, ln_presatmco2, sn_patm, sn_atmco2, cn_dir 327 323 328 324 ! ! ----------------------- ! … … 343 339 WRITE(numout,*) ' Namelist nampisatm : Atmospheric Pressure as external forcing' 344 340 WRITE(numout,*) ' constant atmopsheric pressure (F) or from a file (T) ln_presatm = ', ln_presatm 341 WRITE(numout,*) ' spatial atmopsheric CO2 for flux calcs ln_presatmco2 = ', ln_presatmco2 345 342 WRITE(numout,*) 346 343 ENDIF … … 355 352 ENDIF 356 353 ! 354 IF( ln_presatmco2 ) THEN 355 ALLOCATE( sf_atmco2(1), STAT=ierr ) !* allocate and fill sf_atmco2 (forcing structure) with sn_atmco2 356 IF( ierr > 0 ) CALL ctl_stop( 'STOP', 'p4z_flx: unable to allocate sf_atmco2 structure' ) 357 ! 358 CALL fld_fill( sf_atmco2, (/ sn_atmco2 /), cn_dir, 'p4z_flx', 'Atmospheric co2 partial pressure ', 'nampisatm' ) 359 ALLOCATE( sf_atmco2(1)%fnow(jpi,jpj,1) ) 360 IF( sn_atmco2%ln_tint ) ALLOCATE( sf_atmco2(1)%fdta(jpi,jpj,1,2) ) 361 ENDIF 362 ! 357 363 IF( .NOT.ln_presatm ) patm(:,:) = 1.e0 ! Initialize patm if no reading from a file 358 364 ! … … 364 370 ENDIF 365 371 ! 372 IF( ln_presatmco2 ) THEN 373 CALL fld_read( kt, 1, sf_atmco2 ) !* input atmco2 provided at kt + 1/2 374 satmco2(:,:) = sf_atmco2(1)%fnow(:,:,1) ! atmospheric pressure 375 ELSE 376 satmco2(:,:) = atcco2 ! Initialize atmco2 if no reading from a file 377 ENDIF 378 ! 366 379 END SUBROUTINE p4z_patm 367 380 381 368 382 INTEGER FUNCTION p4z_flx_alloc() 369 383 !!---------------------------------------------------------------------- 370 384 !! *** ROUTINE p4z_flx_alloc *** 371 385 !!---------------------------------------------------------------------- 372 ALLOCATE( oce_co2(jpi,jpj),satmco2(jpi,jpj), patm(jpi,jpj), STAT=p4z_flx_alloc )386 ALLOCATE( satmco2(jpi,jpj), patm(jpi,jpj), STAT=p4z_flx_alloc ) 373 387 ! 374 388 IF( p4z_flx_alloc /= 0 ) CALL ctl_warn('p4z_flx_alloc : failed to allocate arrays')
Note: See TracChangeset
for help on using the changeset viewer.