Changeset 7713
- Timestamp:
- 2017-02-22T12:40:19+01:00 (8 years ago)
- Location:
- branches/UKMO/dev_r4650_general_vert_coord_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS
- Files:
-
- 4 edited
- 16 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r4650_general_vert_coord_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r6990 r7713 21 21 USE par_oce 22 22 USE dom_oce ! Ocean space and time domain variables 23 USE obs_const, ONLY: obfillflt ! Fill value 23 24 USE obs_fbm, ONLY: ln_cl4 ! Class 4 diagnostic switch 24 25 USE obs_read_prof ! Reading and allocation of observations (Coriolis) … … 29 30 USE obs_read_seaice ! Reading and allocation of Sea Ice observations 30 31 USE obs_read_vel ! Reading and allocation of velocity component observations 32 USE obs_read_logchl ! Reading and allocation of logchl observations 33 USE obs_read_spm ! Reading and allocation of spm observations 34 USE obs_read_fco2 ! Reading and allocation of fco2 observations 35 USE obs_read_pco2 ! Reading and allocation of pco2 observations 31 36 USE obs_prep ! Preparation of obs. (grid search etc). 32 37 USE obs_oper ! Observation operators … … 40 45 USE obs_sst ! SST data storage 41 46 USE obs_seaice ! Sea Ice data storage 47 USE obs_logchl ! logchl data storage 48 USE obs_spm ! spm data storage 49 USE obs_fco2 ! fco2 data storage 50 USE obs_pco2 ! pco2 data storage 42 51 USE obs_types ! Definitions for observation types 43 52 USE mpp_map ! MPP mapping … … 81 90 LOGICAL, PUBLIC :: ln_velhradcp !: Logical switch for raw high freq netCDF ADCP vel. data 82 91 LOGICAL, PUBLIC :: ln_velfb !: Logical switch for velocities from feedback files 92 LOGICAL, PUBLIC :: ln_logchl !: Logical switch for log10(chlorophyll) 93 LOGICAL, PUBLIC :: ln_logchlfb !: Logical switch for logchl from feedback files 94 LOGICAL, PUBLIC :: ln_spm !: Logical switch for spm 95 LOGICAL, PUBLIC :: ln_spmfb !: Logical switch for spm from feedback files 96 LOGICAL, PUBLIC :: ln_fco2 !: Logical switch for fco2 97 LOGICAL, PUBLIC :: ln_fco2fb !: Logical switch for fco2 from feedback files 98 LOGICAL, PUBLIC :: ln_pco2 !: Logical switch for pco2 99 LOGICAL, PUBLIC :: ln_pco2fb !: Logical switch for pco2 from feedback files 83 100 LOGICAL, PUBLIC :: ln_ssh !: Logical switch for sea surface height 84 101 LOGICAL, PUBLIC :: ln_sss !: Logical switch for sea surface salinity … … 164 181 CHARACTER(len=128) :: velhradcpfiles(MaxNumFiles) 165 182 CHARACTER(len=128) :: velfbfiles(MaxNumFiles) 183 CHARACTER(len=128) :: logchlfiles(MaxNumFiles) 184 CHARACTER(len=128) :: logchlfbfiles(MaxNumFiles) 185 CHARACTER(len=128) :: spmfiles(MaxNumFiles) 186 CHARACTER(len=128) :: spmfbfiles(MaxNumFiles) 187 CHARACTER(len=128) :: fco2files(MaxNumFiles) 188 CHARACTER(len=128) :: fco2fbfiles(MaxNumFiles) 189 CHARACTER(len=128) :: pco2files(MaxNumFiles) 190 CHARACTER(len=128) :: pco2fbfiles(MaxNumFiles) 166 191 CHARACTER(LEN=128) :: reysstname 167 192 CHARACTER(LEN=12) :: reysstfmt … … 189 214 & ln_velhradcp, velhradcpfiles, & 190 215 & ln_velfb, velfbfiles, ln_velfb_av, & 216 & ln_logchl, ln_logchlfb, & 217 & logchlfiles, logchlfbfiles, & 218 & ln_spm, ln_spmfb, & 219 & spmfiles, spmfbfiles, & 220 & ln_fco2, ln_fco2fb, & 221 & fco2files, fco2fbfiles, & 222 & ln_pco2, ln_pco2fb, & 223 & pco2files, pco2fbfiles, & 191 224 & ln_profb_enatim, ln_ignmis, ln_cl4, & 192 225 & ln_sstbias, sstbias_files … … 210 243 INTEGER :: jnumvelhradcp 211 244 INTEGER :: jnumvelfb 245 INTEGER :: jnumlogchl 246 INTEGER :: jnumlogchlfb 247 INTEGER :: jnumspm 248 INTEGER :: jnumspmfb 249 INTEGER :: jnumfco2 250 INTEGER :: jnumfco2fb 251 INTEGER :: jnumpco2 252 INTEGER :: jnumpco2fb 212 253 INTEGER :: ji 213 254 INTEGER :: jset … … 218 259 ! Read namelist parameters 219 260 !----------------------------------------------------------------------- 261 262 ln_logchl = .FALSE. 263 ln_logchlfb = .FALSE. 264 ln_spm = .FALSE. 265 ln_spmfb = .FALSE. 266 ln_fco2 = .FALSE. 267 ln_fco2fb = .FALSE. 268 ln_pco2 = .FALSE. 269 ln_pco2fb = .FALSE. 220 270 221 271 !Initalise all values in namelist arrays … … 238 288 velcurfiles(:) = '' 239 289 veladcpfiles(:) = '' 290 logchlfiles(:) = '' 291 logchlfbfiles(:) = '' 292 spmfiles(:) = '' 293 spmfbfiles(:) = '' 294 fco2files(:) = '' 295 fco2fbfiles(:) = '' 296 pco2files(:) = '' 297 pco2fbfiles(:) = '' 240 298 sstbias_files(:) = '' 241 299 endailyavtypes(:) = -1 … … 337 395 jnumvelfb = COUNT(lmask) 338 396 lmask(:) = .FALSE. 397 ENDIF 398 IF (ln_logchl) THEN 399 lmask(:) = .FALSE. 400 WHERE (logchlfiles(:) /= '') lmask(:) = .TRUE. 401 jnumlogchl = COUNT(lmask) 402 ENDIF 403 IF (ln_logchlfb) THEN 404 lmask(:) = .FALSE. 405 WHERE (logchlfbfiles(:) /= '') lmask(:) = .TRUE. 406 jnumlogchlfb = COUNT(lmask) 407 ENDIF 408 IF (ln_spm) THEN 409 lmask(:) = .FALSE. 410 WHERE (spmfiles(:) /= '') lmask(:) = .TRUE. 411 jnumspm = COUNT(lmask) 412 ENDIF 413 IF (ln_spmfb) THEN 414 lmask(:) = .FALSE. 415 WHERE (spmfbfiles(:) /= '') lmask(:) = .TRUE. 416 jnumspmfb = COUNT(lmask) 417 ENDIF 418 IF (ln_fco2) THEN 419 lmask(:) = .FALSE. 420 WHERE (fco2files(:) /= '') lmask(:) = .TRUE. 421 jnumfco2 = COUNT(lmask) 422 ENDIF 423 IF (ln_fco2fb) THEN 424 lmask(:) = .FALSE. 425 WHERE (fco2fbfiles(:) /= '') lmask(:) = .TRUE. 426 jnumfco2fb = COUNT(lmask) 427 ENDIF 428 IF (ln_pco2) THEN 429 lmask(:) = .FALSE. 430 WHERE (pco2files(:) /= '') lmask(:) = .TRUE. 431 jnumpco2 = COUNT(lmask) 432 ENDIF 433 IF (ln_pco2fb) THEN 434 lmask(:) = .FALSE. 435 WHERE (pco2fbfiles(:) /= '') lmask(:) = .TRUE. 436 jnumpco2fb = COUNT(lmask) 339 437 ENDIF 340 438 … … 368 466 WRITE(numout,*) ' Logical switch for velocity high freq. ADCP ln_velhradcp = ', ln_velhradcp 369 467 WRITE(numout,*) ' Logical switch for feedback velocity data ln_velfb = ', ln_velfb 468 WRITE(numout,*) ' Logical switch for logchl observations ln_logchl = ', ln_logchl 469 WRITE(numout,*) ' Logical switch for feedback logchl data ln_logchlfb = ', ln_logchlfb 470 WRITE(numout,*) ' Logical switch for spm observations ln_spm = ', ln_spm 471 WRITE(numout,*) ' Logical switch for feedback spm data ln_spmfb = ', ln_spmfb 472 WRITE(numout,*) ' Logical switch for fco2 observations ln_fco2 = ', ln_fco2 473 WRITE(numout,*) ' Logical switch for pco2 observations ln_pco2 = ', ln_pco2 474 WRITE(numout,*) ' Logical switch for feedback pco2 data ln_pco2fb = ', ln_pco2fb 475 WRITE(numout,*) ' Logical switch for feedback fco2 data ln_fco2fb = ', ln_fco2fb 370 476 WRITE(numout,*) ' Global distribtion of observations ln_grid_global = ',ln_grid_global 371 477 WRITE(numout,*) & … … 464 570 TRIM(velfbfiles(ji)) 465 571 ENDIF 572 END DO 573 ENDIF 574 IF (ln_logchl) THEN 575 DO ji = 1, jnumlogchl 576 WRITE(numout,'(1X,2A)') ' logchl input observation file name logchlfiles = ', & 577 TRIM(logchlfiles(ji)) 578 END DO 579 ENDIF 580 IF (ln_logchlfb) THEN 581 DO ji = 1, jnumlogchlfb 582 WRITE(numout,'(1X,2A)') ' Feedback logchl input observation file name logchlfbfiles = ', & 583 TRIM(logchlfbfiles(ji)) 584 END DO 585 ENDIF 586 IF (ln_spm) THEN 587 DO ji = 1, jnumspm 588 WRITE(numout,'(1X,2A)') ' spm input observation file name spmfiles = ', & 589 TRIM(spmfiles(ji)) 590 END DO 591 ENDIF 592 IF (ln_spmfb) THEN 593 DO ji = 1, jnumspmfb 594 WRITE(numout,'(1X,2A)') ' Feedback spm input observation file name spmfbfiles = ', & 595 TRIM(spmfbfiles(ji)) 596 END DO 597 ENDIF 598 IF (ln_fco2) THEN 599 DO ji = 1, jnumfco2 600 WRITE(numout,'(1X,2A)') ' fco2 input observation file name fco2files = ', & 601 TRIM(fco2files(ji)) 602 END DO 603 ENDIF 604 IF (ln_fco2fb) THEN 605 DO ji = 1, jnumfco2fb 606 WRITE(numout,'(1X,2A)') ' Feedback fco2 input observation file name fco2fbfiles = ', & 607 TRIM(fco2fbfiles(ji)) 608 END DO 609 ENDIF 610 IF (ln_pco2) THEN 611 DO ji = 1, jnumpco2 612 WRITE(numout,'(1X,2A)') ' pco2 input observation file name pco2files = ', & 613 TRIM(pco2files(ji)) 614 END DO 615 ENDIF 616 IF (ln_pco2fb) THEN 617 DO ji = 1, jnumpco2fb 618 WRITE(numout,'(1X,2A)') ' Feedback pco2 input observation file name pco2fbfiles = ', & 619 TRIM(pco2fbfiles(ji)) 466 620 END DO 467 621 ENDIF … … 501 655 & ( .NOT. ln_vel3d ).AND. & 502 656 & ( .NOT. ln_ssh ).AND.( .NOT. ln_sst ).AND.( .NOT. ln_sss ).AND. & 503 & ( .NOT. ln_seaice ).AND.( .NOT. ln_vel3d ) ) THEN 657 & ( .NOT. ln_seaice ).AND.( .NOT. ln_vel3d ).AND.( .NOT. ln_logchl ).AND. & 658 & ( .NOT. ln_spm ).AND.( .NOT. ln_fco2 ).AND.( .NOT. ln_pco2 ) ) THEN 504 659 IF(lwp) WRITE(numout,cform_war) 505 660 IF(lwp) WRITE(numout,*) ' key_diaobs is activated but logical flags', & 506 & ' ln_t3d, ln_s3d, ln_sla, ln_ssh, ln_sst, ln_sss, ln_seaice, ln_vel3d are all set to .FALSE.' 661 & ' ln_t3d, ln_s3d, ln_sla, ln_ssh, ln_sst, ln_sss, ln_seaice, ln_vel3d,', & 662 & ' ln_logchl, ln_spm, ln_fco2, ln_pco2 are all set to .FALSE.' 507 663 nwarn = nwarn + 1 508 664 ENDIF … … 1002 1158 1003 1159 ENDIF 1160 1161 ! - log10(chlorophyll) 1162 1163 IF ( ln_logchl ) THEN 1164 1165 ! Set the number of variables for logchl to 1 1166 nlogchlvars = 1 1167 1168 ! Set the number of extra variables for logchl to 0 1169 nlogchlextr = 0 1170 1171 IF ( ln_logchlfb ) THEN 1172 nlogchlsets = jnumlogchlfb 1173 ELSE 1174 nlogchlsets = 1 1175 ENDIF 1176 1177 ALLOCATE(logchldata(nlogchlsets)) 1178 ALLOCATE(logchldatqc(nlogchlsets)) 1179 logchldata(:)%nsurf=0 1180 logchldatqc(:)%nsurf=0 1181 1182 nlogchlsets = 0 1183 1184 IF ( ln_logchlfb ) THEN ! Feedback file format 1185 1186 DO jset = 1, jnumlogchlfb 1187 1188 nlogchlsets = nlogchlsets + 1 1189 1190 CALL obs_rea_logchl( 0, logchldata(nlogchlsets), 1, & 1191 & logchlfbfiles(jset:jset), & 1192 & nlogchlvars, nlogchlextr, nitend-nit000+2, & 1193 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1194 1195 CALL obs_pre_logchl( logchldata(nlogchlsets), logchldatqc(nlogchlsets), & 1196 & ln_logchl, ln_nea ) 1197 1198 ENDDO 1199 1200 ELSE ! Original file format 1201 1202 nlogchlsets = nlogchlsets + 1 1203 1204 CALL obs_rea_logchl( 1, logchldata(nlogchlsets), jnumlogchl, & 1205 & logchlfiles(1:jnumlogchl), & 1206 & nlogchlvars, nlogchlextr, nitend-nit000+2, & 1207 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1208 1209 CALL obs_pre_logchl( logchldata(nlogchlsets), logchldatqc(nlogchlsets), & 1210 & ln_logchl, ln_nea ) 1211 1212 ENDIF 1213 1214 ENDIF 1215 1216 ! - spm 1217 1218 IF ( ln_spm ) THEN 1219 1220 ! Set the number of variables for spm to 1 1221 nspmvars = 1 1222 1223 ! Set the number of extra variables for spm to 0 1224 nspmextr = 0 1225 1226 IF ( ln_spmfb ) THEN 1227 nspmsets = jnumspmfb 1228 ELSE 1229 nspmsets = 1 1230 ENDIF 1231 1232 ALLOCATE(spmdata(nspmsets)) 1233 ALLOCATE(spmdatqc(nspmsets)) 1234 spmdata(:)%nsurf=0 1235 spmdatqc(:)%nsurf=0 1236 1237 nspmsets = 0 1238 1239 IF ( ln_spmfb ) THEN ! Feedback file format 1240 1241 DO jset = 1, jnumspmfb 1242 1243 nspmsets = nspmsets + 1 1244 1245 CALL obs_rea_spm( 0, spmdata(nspmsets), 1, & 1246 & spmfbfiles(jset:jset), & 1247 & nspmvars, nspmextr, nitend-nit000+2, & 1248 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1249 1250 CALL obs_pre_spm( spmdata(nspmsets), spmdatqc(nspmsets), & 1251 & ln_spm, ln_nea ) 1252 1253 ENDDO 1254 1255 ELSE ! Original file format 1256 1257 nspmsets = nspmsets + 1 1258 1259 CALL obs_rea_spm( 1, spmdata(nspmsets), jnumspm, & 1260 & spmfiles(1:jnumspm), & 1261 & nspmvars, nspmextr, nitend-nit000+2, & 1262 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1263 1264 CALL obs_pre_spm( spmdata(nspmsets), spmdatqc(nspmsets), & 1265 & ln_spm, ln_nea ) 1266 1267 ENDIF 1268 1269 ENDIF 1270 1271 ! - fco2 1272 1273 IF ( ln_fco2 ) THEN 1274 1275 ! Set the number of variables for fco2 to 1 1276 nfco2vars = 1 1277 1278 ! Set the number of extra variables for fco2 to 0 1279 nfco2extr = 0 1280 1281 IF ( ln_fco2fb ) THEN 1282 nfco2sets = jnumfco2fb 1283 ELSE 1284 nfco2sets = 1 1285 ENDIF 1286 1287 ALLOCATE(fco2data(nfco2sets)) 1288 ALLOCATE(fco2datqc(nfco2sets)) 1289 fco2data(:)%nsurf=0 1290 fco2datqc(:)%nsurf=0 1291 1292 nfco2sets = 0 1293 1294 IF ( ln_fco2fb ) THEN ! Feedback file format 1295 1296 DO jset = 1, jnumfco2fb 1297 1298 nfco2sets = nfco2sets + 1 1299 1300 CALL obs_rea_fco2( 0, fco2data(nfco2sets), 1, & 1301 & fco2fbfiles(jset:jset), & 1302 & nfco2vars, nfco2extr, nitend-nit000+2, & 1303 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1304 1305 CALL obs_pre_fco2( fco2data(nfco2sets), fco2datqc(nfco2sets), & 1306 & ln_fco2, ln_nea ) 1307 1308 ENDDO 1309 1310 ELSE ! Original file format 1311 1312 nfco2sets = nfco2sets + 1 1313 1314 CALL obs_rea_fco2( 1, fco2data(nfco2sets), jnumfco2, & 1315 & fco2files(1:jnumfco2), & 1316 & nfco2vars, nfco2extr, nitend-nit000+2, & 1317 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1318 1319 CALL obs_pre_fco2( fco2data(nfco2sets), fco2datqc(nfco2sets), & 1320 & ln_fco2, ln_nea ) 1321 1322 ENDIF 1323 1324 ENDIF 1325 1326 ! - pco2 1327 1328 IF ( ln_pco2 ) THEN 1329 1330 ! Set the number of variables for pco2 to 1 1331 npco2vars = 1 1332 1333 ! Set the number of extra variables for pco2 to 0 1334 npco2extr = 0 1335 1336 IF ( ln_pco2fb ) THEN 1337 npco2sets = jnumpco2fb 1338 ELSE 1339 npco2sets = 1 1340 ENDIF 1341 1342 ALLOCATE(pco2data(npco2sets)) 1343 ALLOCATE(pco2datqc(npco2sets)) 1344 pco2data(:)%nsurf=0 1345 pco2datqc(:)%nsurf=0 1346 1347 npco2sets = 0 1348 1349 IF ( ln_pco2fb ) THEN ! Feedback file format 1350 1351 DO jset = 1, jnumpco2fb 1352 1353 npco2sets = npco2sets + 1 1354 1355 CALL obs_rea_pco2( 0, pco2data(npco2sets), 1, & 1356 & pco2fbfiles(jset:jset), & 1357 & npco2vars, npco2extr, nitend-nit000+2, & 1358 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1359 1360 CALL obs_pre_pco2( pco2data(npco2sets), pco2datqc(npco2sets), & 1361 & ln_pco2, ln_nea ) 1362 1363 ENDDO 1364 1365 ELSE ! Original file format 1366 1367 npco2sets = npco2sets + 1 1368 1369 CALL obs_rea_pco2( 1, pco2data(npco2sets), jnumpco2, & 1370 & pco2files(1:jnumpco2), & 1371 & npco2vars, npco2extr, nitend-nit000+2, & 1372 & dobsini, dobsend, ln_ignmis, .FALSE. ) 1373 1374 CALL obs_pre_pco2( pco2data(npco2sets), pco2datqc(npco2sets), & 1375 & ln_pco2, ln_nea ) 1376 1377 ENDIF 1378 1379 ENDIF 1004 1380 1005 1381 END SUBROUTINE dia_obs_init … … 1019 1395 !! - Sea surface salinity 1020 1396 !! - Velocity component (U,V) profiles 1397 !! - Sea surface log10(chlorophyll) 1398 !! - Sea surface spm 1399 !! - Sea surface fco2 1400 !! - Sea surface pco2 1021 1401 !! 1022 1402 !! ** Action : … … 1043 1423 & tmask, umask, vmask 1044 1424 USE phycst, ONLY : & ! Physical constants 1045 & rday 1425 & rday, & 1426 & rt0 1046 1427 USE oce, ONLY : & ! Ocean dynamics and tracers variables 1047 1428 & tsn, & … … 1056 1437 & frld 1057 1438 #endif 1439 #if defined key_hadocc 1440 USE trc, ONLY : & ! HadOCC chlorophyll, fCO2 and pCO2 1441 & HADOCC_CHL, & 1442 & HADOCC_FCO2, & 1443 & HADOCC_PCO2, & 1444 & HADOCC_FILL_FLT 1445 #elif defined key_medusa && defined key_foam_medusa 1446 USE trc, ONLY : & ! MEDUSA chlorophyll, fCO2 and pCO2 1447 & MEDUSA_CHL, & 1448 & MEDUSA_FCO2, & 1449 & MEDUSA_PCO2, & 1450 & MEDUSA_FILL_FLT 1451 #elif defined key_fabm 1452 USE fabm 1453 USE par_fabm 1454 #endif 1455 #if defined key_spm 1456 USE par_spm, ONLY: & ! ERSEM/SPM sediments 1457 & jp_spm 1458 USE trc, ONLY : & 1459 & trn 1460 #endif 1058 1461 IMPLICIT NONE 1059 1462 … … 1067 1470 INTEGER :: jseaiceset ! sea ice data set loop variable 1068 1471 INTEGER :: jveloset ! velocity profile data loop variable 1472 INTEGER :: jlogchlset ! logchl data set loop variable 1473 INTEGER :: jspmset ! spm data set loop variable 1474 INTEGER :: jfco2set ! fco2 data set loop variable 1475 INTEGER :: jpco2set ! pco2 data set loop variable 1069 1476 INTEGER :: jvar ! Variable number 1070 1477 #if ! defined key_lim2 && ! defined key_lim3 1071 1478 REAL(wp), POINTER, DIMENSION(:,:) :: frld 1479 #endif 1480 REAL(wp) :: tiny ! small number 1481 REAL(wp), DIMENSION(jpi,jpj) :: & 1482 logchl ! array for log chlorophyll 1483 REAL(wp), DIMENSION(jpi,jpj) :: & 1484 maskchl ! array for special chlorophyll mask 1485 REAL(wp), DIMENSION(jpi,jpj) :: & 1486 spm ! array for spm 1487 REAL(wp), DIMENSION(jpi,jpj) :: & 1488 fco2 ! array for fco2 1489 REAL(wp), DIMENSION(jpi,jpj) :: & 1490 maskfco2 ! array for special fco2 mask 1491 REAL(wp), DIMENSION(jpi,jpj) :: & 1492 pco2 ! array for pco2 1493 REAL(wp), DIMENSION(jpi,jpj) :: & 1494 maskpco2 ! array for special pco2 mask 1495 INTEGER :: jn ! loop index 1496 #if defined key_fabm 1497 REAL(wp), DIMENSION(jpi,jpj,jpk) :: logchl_3d 1498 REAL(wp), DIMENSION(jpi,jpj,jpk) :: pco2_3d 1072 1499 #endif 1073 1500 CHARACTER(LEN=20) :: datestr=" ",timestr=" " … … 1180 1607 ENDIF 1181 1608 1609 IF ( ln_logchl ) THEN 1610 1611 #if defined key_hadocc 1612 logchl(:,:) = HADOCC_CHL(:,:,1) ! (not log) chlorophyll from HadOCC 1613 #elif defined key_medusa && defined key_foam_medusa 1614 logchl(:,:) = MEDUSA_CHL(:,:,1) ! (not log) chlorophyll from HadOCC 1615 #elif defined key_fabm 1616 logchl_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabmdia_chltot) 1617 logchl(:,:) = logchl_3d(:,:,1) 1618 #else 1619 CALL ctl_stop( ' Trying to run logchl observation operator', & 1620 & ' but no biogeochemical model appears to have been defined' ) 1621 #endif 1622 1623 maskchl(:,:) = tmask(:,:,1) ! create a special mask to exclude certain things 1624 1625 ! Take the log10 where we can, otherwise exclude 1626 tiny = 1.0e-20 1627 WHERE(logchl(:,:) > tiny .AND. logchl(:,:) /= obfillflt ) 1628 logchl(:,:) = LOG10(logchl(:,:)) 1629 ELSEWHERE 1630 logchl(:,:) = obfillflt 1631 maskchl(:,:) = 0 1632 END WHERE 1633 1634 DO jlogchlset = 1, nlogchlsets 1635 CALL obs_logchl_opt( logchldatqc(jlogchlset), & 1636 & kstp, jpi, jpj, nit000, logchl(:,:), & 1637 & maskchl(:,:), n2dint ) 1638 END DO 1639 ENDIF 1640 1641 IF ( ln_spm ) THEN 1642 #if defined key_spm 1643 spm(:,:) = 0.0 1644 DO jn = 1, jp_spm 1645 spm(:,:) = spm(:,:) + trn(:,:,1,jn) ! sum SPM sizes 1646 END DO 1647 #else 1648 CALL ctl_stop( ' Trying to run spm observation operator', & 1649 & ' but no spm model appears to have been defined' ) 1650 #endif 1651 1652 DO jspmset = 1, nspmsets 1653 CALL obs_spm_opt( spmdatqc(jspmset), & 1654 & kstp, jpi, jpj, nit000, spm(:,:), & 1655 & tmask(:,:,1), n2dint ) 1656 END DO 1657 ENDIF 1658 1659 IF ( ln_fco2 ) THEN 1660 maskfco2(:,:) = tmask(:,:,1) ! create a special mask to exclude certain things 1661 #if defined key_hadocc 1662 fco2(:,:) = HADOCC_FCO2(:,:) ! fCO2 from HadOCC 1663 IF ( ( MINVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ).AND.( MAXVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) ) THEN 1664 fco2(:,:) = obfillflt 1665 maskfco2(:,:) = 0 1666 CALL ctl_warn( ' HadOCC fCO2 values masked out for observation operator', & 1667 & ' on timestep ' // TRIM(STR(kstp)), & 1668 & ' as HADOCC_FCO2(:,:) == HADOCC_FILL_FLT' ) 1669 ENDIF 1670 #elif defined key_medusa && defined key_foam_medusa 1671 fco2(:,:) = MEDUSA_FCO2(:,:) ! fCO2 from MEDUSA 1672 IF ( ( MINVAL( MEDUSA_FCO2 ) == MEDUSA_FILL_FLT ).AND.( MAXVAL( MEDUSA_FCO2 ) == MEDUSA_FILL_FLT ) ) THEN 1673 fco2(:,:) = obfillflt 1674 maskfco2(:,:) = 0 1675 CALL ctl_warn( ' MEDUSA fCO2 values masked out for observation operator', & 1676 & ' on timestep ' // TRIM(STR(kstp)), & 1677 & ' as MEDUSA_FCO2(:,:) == MEDUSA_FILL_FLT' ) 1678 ENDIF 1679 #elif defined key_fabm 1680 ! First, get pCO2 from FABM 1681 pco2_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabm_o3pc) 1682 pco2(:,:) = pco2_3d(:,:,1) 1683 ! Now, convert pCO2 to fCO2, based on SST in K. This follows the standard methodology of: 1684 ! Pierrot et al. (2009), Recommendations for autonomous underway pCO2 measuring systems 1685 ! and data reduction routines, Deep-Sea Research II, 56: 512-522. 1686 ! and 1687 ! Weiss (1974), Carbon dioxide in water and seawater: the solubility of a non-ideal gas, 1688 ! Marine Chemistry, 2: 203-215. 1689 ! In the implementation below, atmospheric pressure has been assumed to be 1 atm and so 1690 ! not explicitly included - atmospheric pressure is not necessarily available so this is 1691 ! the best assumption. 1692 ! Further, the (1-xCO2)^2 term has been neglected. This is common practice 1693 ! (see e.g. Zeebe and Wolf-Gladrow (2001), CO2 in Seawater: Equilibrium, Kinetics, Isotopes) 1694 ! because xCO2 in atm is ~0, and so this term will only affect the result to the 3rd decimal 1695 ! place for typical values, and xCO2 would need to be approximated from pCO2 anyway. 1696 fco2(:,:) = pco2(:,:) * EXP((-1636.75 + & 1697 & 12.0408 * (tsn(:,:,1,jp_tem)+rt0) - & 1698 & 0.0327957 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 1699 & 0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 1700 & 2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0))) / & 1701 & (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 1702 #else 1703 CALL ctl_stop( ' Trying to run fco2 observation operator', & 1704 & ' but no biogeochemical model appears to have been defined' ) 1705 #endif 1706 1707 DO jfco2set = 1, nfco2sets 1708 CALL obs_fco2_opt( fco2datqc(jfco2set), & 1709 & kstp, jpi, jpj, nit000, fco2(:,:), & 1710 & maskfco2(:,:), n2dint ) 1711 END DO 1712 ENDIF 1713 1714 IF ( ln_pco2 ) THEN 1715 maskpco2(:,:) = tmask(:,:,1) ! create a special mask to exclude certain things 1716 #if defined key_hadocc 1717 pco2(:,:) = HADOCC_PCO2(:,:) ! pCO2 from HadOCC 1718 IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ).AND.( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 1719 pco2(:,:) = obfillflt 1720 maskpco2(:,:) = 0 1721 CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 1722 & ' on timestep ' // TRIM(STR(kstp)), & 1723 & ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 1724 ENDIF 1725 #elif defined key_medusa && defined key_foam_medusa 1726 pco2(:,:) = MEDUSA_PCO2(:,:) ! pCO2 from MEDUSA 1727 IF ( ( MINVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ).AND.( MAXVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ) ) THEN 1728 pco2(:,:) = obfillflt 1729 maskpco2(:,:) = 0 1730 CALL ctl_warn( ' MEDUSA pCO2 values masked out for observation operator', & 1731 & ' on timestep ' // TRIM(STR(kstp)), & 1732 & ' as MEDUSA_PCO2(:,:) == MEDUSA_FILL_FLT' ) 1733 ENDIF 1734 #elif defined key_fabm 1735 pco2_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabm_o3pc) 1736 pco2(:,:) = pco2_3d(:,:,1) 1737 #else 1738 CALL ctl_stop( ' Trying to run pCO2 observation operator', & 1739 & ' but no biogeochemical model appears to have been defined' ) 1740 #endif 1741 1742 DO jpco2set = 1, npco2sets 1743 CALL obs_pco2_opt( pco2datqc(jpco2set), & 1744 & kstp, jpi, jpj, nit000, pco2(:,:), & 1745 & maskpco2(:,:), n2dint ) 1746 END DO 1747 ENDIF 1748 1182 1749 #if ! defined key_lim2 && ! defined key_lim3 1183 1750 CALL wrk_dealloc(jpi,jpj,frld) … … 1212 1779 INTEGER :: jsstset ! SST data set loop variable 1213 1780 INTEGER :: jseaiceset ! Sea Ice data set loop variable 1781 INTEGER :: jlogchlset ! logchl data set loop variable 1782 INTEGER :: jspmset ! spm data set loop variable 1783 INTEGER :: jfco2set ! fco2 data set loop variable 1784 INTEGER :: jpco2set ! pco2 data set loop variable 1214 1785 INTEGER :: jset 1215 1786 INTEGER :: jfbini 1216 1787 CHARACTER(LEN=20) :: datestr=" ",timestr=" " 1217 CHARACTER(LEN= 10) :: cdtmp1788 CHARACTER(LEN=20) :: cdtmp 1218 1789 !----------------------------------------------------------------------- 1219 1790 ! Depending on switches call various observation output routines … … 1456 2027 ENDIF 1457 2028 2029 ENDIF 2030 2031 ! - log10(chlorophyll) 2032 IF ( ln_logchl ) THEN 2033 2034 ! Copy data from logchldatqc to logchldata structures 2035 DO jlogchlset = 1, nlogchlsets 2036 2037 CALL obs_surf_decompress( logchldatqc(jlogchlset), & 2038 & logchldata(jlogchlset), .TRUE., numout ) 2039 2040 END DO 2041 2042 ! Mark as bad observations with no valid model counterpart due to activities in dia_obs 2043 ! Seem to need to set to fill value rather than marking as bad to be effective, so do both 2044 DO jlogchlset = 1, nlogchlsets 2045 WHERE ( logchldata(jlogchlset)%rmod(:,1) == obfillflt ) 2046 logchldata(jlogchlset)%nqc(:) = 1 2047 logchldata(jlogchlset)%robs(:,1) = obfillflt 2048 END WHERE 2049 END DO 2050 2051 ! Write the logchl data 2052 DO jlogchlset = 1, nlogchlsets 2053 2054 WRITE(cdtmp,'(A,I2.2)')'logchlfb_',jlogchlset 2055 CALL obs_wri_logchl( cdtmp, logchldata(jlogchlset) ) 2056 2057 END DO 2058 2059 ENDIF 2060 2061 ! - spm 2062 IF ( ln_spm ) THEN 2063 2064 ! Copy data from spmdatqc to spmdata structures 2065 DO jspmset = 1, nspmsets 2066 2067 CALL obs_surf_decompress( spmdatqc(jspmset), & 2068 & spmdata(jspmset), .TRUE., numout ) 2069 2070 END DO 2071 2072 ! Write the spm data 2073 DO jspmset = 1, nspmsets 2074 2075 WRITE(cdtmp,'(A,I2.2)')'spmfb_',jspmset 2076 CALL obs_wri_spm( cdtmp, spmdata(jspmset) ) 2077 2078 END DO 2079 2080 ENDIF 2081 2082 ! - fco2 2083 IF ( ln_fco2 ) THEN 2084 2085 ! Copy data from fco2datqc to fco2data structures 2086 DO jfco2set = 1, nfco2sets 2087 2088 CALL obs_surf_decompress( fco2datqc(jfco2set), & 2089 & fco2data(jfco2set), .TRUE., numout ) 2090 2091 END DO 2092 2093 ! Mark as bad observations with no valid model counterpart due to fCO2 not being in the restart 2094 ! Seem to need to set to fill value rather than marking as bad to be effective, so do both 2095 DO jfco2set = 1, nfco2sets 2096 WHERE ( fco2data(jfco2set)%rmod(:,1) == obfillflt ) 2097 fco2data(jfco2set)%nqc(:) = 1 2098 fco2data(jfco2set)%robs(:,1) = obfillflt 2099 END WHERE 2100 END DO 2101 2102 ! Write the fco2 data 2103 DO jfco2set = 1, nfco2sets 2104 2105 WRITE(cdtmp,'(A,I2.2)')'fco2fb_',jfco2set 2106 CALL obs_wri_fco2( cdtmp, fco2data(jfco2set) ) 2107 2108 END DO 2109 2110 ENDIF 2111 2112 ! - pco2 2113 IF ( ln_pco2 ) THEN 2114 2115 ! Copy data from pco2datqc to pco2data structures 2116 DO jpco2set = 1, npco2sets 2117 2118 CALL obs_surf_decompress( pco2datqc(jpco2set), & 2119 & pco2data(jpco2set), .TRUE., numout ) 2120 2121 END DO 2122 2123 ! Mark as bad observations with no valid model counterpart due to pco2 not being in the restart 2124 ! Seem to need to set to fill value rather than marking as bad to be effective, so do both 2125 DO jpco2set = 1, npco2sets 2126 WHERE ( pco2data(jpco2set)%rmod(:,1) == obfillflt ) 2127 pco2data(jpco2set)%nqc(:) = 1 2128 pco2data(jpco2set)%robs(:,1) = obfillflt 2129 END WHERE 2130 END DO 2131 2132 ! Write the pco2 data 2133 DO jpco2set = 1, npco2sets 2134 2135 WRITE(cdtmp,'(A,I2.2)')'pco2fb_',jpco2set 2136 CALL obs_wri_pco2( cdtmp, pco2data(jpco2set) ) 2137 2138 END DO 2139 1458 2140 ENDIF 1459 2141 -
branches/UKMO/dev_r4650_general_vert_coord_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
r6301 r7713 23 23 !! obs_vel_opt : Compute the model counterpart of zonal and meridional 24 24 !! components of velocity from observations. 25 !! obs_logchl_opt : Compute the model counterpart of log10(chlorophyll) 26 !! observations 27 !! obs_spm_opt : Compute the model counterpart of spm 28 !! observations 29 !! obs_fco2_opt : Compute the model counterpart of fco2 30 !! observations 31 !! obs_pco2_opt : Compute the model counterpart of pco2 32 !! observations 25 33 !!---------------------------------------------------------------------- 26 34 … … 63 71 & obs_sss_opt, & ! Compute the model counterpart of SSS observations 64 72 & obs_seaice_opt, & 65 & obs_vel_opt ! Compute the model counterpart of velocity profile data 73 & obs_vel_opt, & ! Compute the model counterpart of velocity profile data 74 & obs_logchl_opt, & ! Compute the model counterpart of logchl data 75 & obs_spm_opt, & ! Compute the model counterpart of spm data 76 & obs_fco2_opt, & ! Compute the model counterpart of fco2 data 77 & obs_pco2_opt ! Compute the model counterpart of pco2 data 66 78 67 79 INTEGER, PARAMETER, PUBLIC :: imaxavtypes = 20 ! Max number of daily avgd obs types … … 2052 2064 END SUBROUTINE obs_vel_opt 2053 2065 2066 SUBROUTINE obs_logchl_opt( logchldatqc, kt, kpi, kpj, kit000, & 2067 & plogchln, plogchlmask, k2dint ) 2068 2069 !!----------------------------------------------------------------------- 2070 !! 2071 !! *** ROUTINE obs_logchl_opt *** 2072 !! 2073 !! ** Purpose : Compute the model counterpart of logchl 2074 !! data by interpolating from the model grid to the 2075 !! observation point. 2076 !! 2077 !! ** Method : Linearly interpolate to each observation point using 2078 !! the model values at the corners of the surrounding grid box. 2079 !! 2080 !! The now model logchl is first computed at the obs (lon, lat) point. 2081 !! 2082 !! Several horizontal interpolation schemes are available: 2083 !! - distance-weighted (great circle) (k2dint = 0) 2084 !! - distance-weighted (small angle) (k2dint = 1) 2085 !! - bilinear (geographical grid) (k2dint = 2) 2086 !! - bilinear (quadrilateral grid) (k2dint = 3) 2087 !! - polynomial (quadrilateral grid) (k2dint = 4) 2088 !! 2089 !! 2090 !! ** Action : 2091 !! 2092 !! History : 2093 !! 2094 !!----------------------------------------------------------------------- 2095 2096 !! * Modules used 2097 USE obs_surf_def ! Definition of storage space for surface observations 2098 2099 IMPLICIT NONE 2100 2101 !! * Arguments 2102 TYPE(obs_surf), INTENT(INOUT) :: logchldatqc ! Subset of surface data not failing screening 2103 INTEGER, INTENT(IN) :: kt ! Time step 2104 INTEGER, INTENT(IN) :: kpi ! Model grid parameters 2105 INTEGER, INTENT(IN) :: kpj 2106 INTEGER, INTENT(IN) :: kit000 ! Number of the first time step 2107 ! (kit000-1 = restart time) 2108 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 2109 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 2110 & plogchln, & ! Model logchl field 2111 & plogchlmask ! Land-sea mask 2112 2113 !! * Local declarations 2114 INTEGER :: ji 2115 INTEGER :: jj 2116 INTEGER :: jobs 2117 INTEGER :: inrc 2118 INTEGER :: ilogchl 2119 INTEGER :: iobs 2120 2121 REAL(KIND=wp) :: zlam 2122 REAL(KIND=wp) :: zphi 2123 REAL(KIND=wp) :: zext(1), zobsmask(1) 2124 REAL(kind=wp), DIMENSION(2,2,1) :: & 2125 & zweig 2126 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 2127 & zmask, & 2128 & zlogchll, & 2129 & zglam, & 2130 & zgphi 2131 INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: & 2132 & igrdi, & 2133 & igrdj 2134 2135 !------------------------------------------------------------------------ 2136 ! Local initialization 2137 !------------------------------------------------------------------------ 2138 ! ... Record and data counters 2139 inrc = kt - kit000 + 2 2140 ilogchl = logchldatqc%nsstp(inrc) 2141 2142 ! Get the data for interpolation 2143 2144 ALLOCATE( & 2145 & igrdi(2,2,ilogchl), & 2146 & igrdj(2,2,ilogchl), & 2147 & zglam(2,2,ilogchl), & 2148 & zgphi(2,2,ilogchl), & 2149 & zmask(2,2,ilogchl), & 2150 & zlogchll(2,2,ilogchl) & 2151 & ) 2152 2153 DO jobs = logchldatqc%nsurfup + 1, logchldatqc%nsurfup + ilogchl 2154 iobs = jobs - logchldatqc%nsurfup 2155 igrdi(1,1,iobs) = logchldatqc%mi(jobs)-1 2156 igrdj(1,1,iobs) = logchldatqc%mj(jobs)-1 2157 igrdi(1,2,iobs) = logchldatqc%mi(jobs)-1 2158 igrdj(1,2,iobs) = logchldatqc%mj(jobs) 2159 igrdi(2,1,iobs) = logchldatqc%mi(jobs) 2160 igrdj(2,1,iobs) = logchldatqc%mj(jobs)-1 2161 igrdi(2,2,iobs) = logchldatqc%mi(jobs) 2162 igrdj(2,2,iobs) = logchldatqc%mj(jobs) 2163 END DO 2164 2165 CALL obs_int_comm_2d( 2, 2, ilogchl, & 2166 & igrdi, igrdj, glamt, zglam ) 2167 CALL obs_int_comm_2d( 2, 2, ilogchl, & 2168 & igrdi, igrdj, gphit, zgphi ) 2169 CALL obs_int_comm_2d( 2, 2, ilogchl, & 2170 & igrdi, igrdj, plogchlmask, zmask ) 2171 CALL obs_int_comm_2d( 2, 2, ilogchl, & 2172 & igrdi, igrdj, plogchln, zlogchll ) 2173 2174 DO jobs = logchldatqc%nsurfup + 1, logchldatqc%nsurfup + ilogchl 2175 2176 iobs = jobs - logchldatqc%nsurfup 2177 2178 IF ( kt /= logchldatqc%mstp(jobs) ) THEN 2179 2180 IF(lwp) THEN 2181 WRITE(numout,*) 2182 WRITE(numout,*) ' E R R O R : Observation', & 2183 & ' time step is not consistent with the', & 2184 & ' model time step' 2185 WRITE(numout,*) ' =========' 2186 WRITE(numout,*) 2187 WRITE(numout,*) ' Record = ', jobs, & 2188 & ' kt = ', kt, & 2189 & ' mstp = ', logchldatqc%mstp(jobs), & 2190 & ' ntyp = ', logchldatqc%ntyp(jobs) 2191 ENDIF 2192 CALL ctl_stop( 'obs_logchl_opt', 'Inconsistent time' ) 2193 2194 ENDIF 2195 2196 zlam = logchldatqc%rlam(jobs) 2197 zphi = logchldatqc%rphi(jobs) 2198 2199 ! Get weights to interpolate the model logchl to the observation point 2200 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 2201 & zglam(:,:,iobs), zgphi(:,:,iobs), & 2202 & zmask(:,:,iobs), zweig, zobsmask ) 2203 2204 ! ... Interpolate the model logchl to the observation point 2205 CALL obs_int_h2d( 1, 1, & 2206 & zweig, zlogchll(:,:,iobs), zext ) 2207 2208 logchldatqc%rmod(jobs,1) = zext(1) 2209 2210 END DO 2211 2212 ! Deallocate the data for interpolation 2213 DEALLOCATE( & 2214 & igrdi, & 2215 & igrdj, & 2216 & zglam, & 2217 & zgphi, & 2218 & zmask, & 2219 & zlogchll & 2220 & ) 2221 2222 logchldatqc%nsurfup = logchldatqc%nsurfup + ilogchl 2223 2224 END SUBROUTINE obs_logchl_opt 2225 2226 SUBROUTINE obs_spm_opt( spmdatqc, kt, kpi, kpj, kit000, & 2227 & pspmn, pspmmask, k2dint ) 2228 2229 !!----------------------------------------------------------------------- 2230 !! 2231 !! *** ROUTINE obs_spm_opt *** 2232 !! 2233 !! ** Purpose : Compute the model counterpart of spm 2234 !! data by interpolating from the model grid to the 2235 !! observation point. 2236 !! 2237 !! ** Method : Linearly interpolate to each observation point using 2238 !! the model values at the corners of the surrounding grid box. 2239 !! 2240 !! The now model spm is first computed at the obs (lon, lat) point. 2241 !! 2242 !! Several horizontal interpolation schemes are available: 2243 !! - distance-weighted (great circle) (k2dint = 0) 2244 !! - distance-weighted (small angle) (k2dint = 1) 2245 !! - bilinear (geographical grid) (k2dint = 2) 2246 !! - bilinear (quadrilateral grid) (k2dint = 3) 2247 !! - polynomial (quadrilateral grid) (k2dint = 4) 2248 !! 2249 !! 2250 !! ** Action : 2251 !! 2252 !! History : 2253 !! 2254 !!----------------------------------------------------------------------- 2255 2256 !! * Modules used 2257 USE obs_surf_def ! Definition of storage space for surface observations 2258 2259 IMPLICIT NONE 2260 2261 !! * Arguments 2262 TYPE(obs_surf), INTENT(INOUT) :: spmdatqc ! Subset of surface data not failing screening 2263 INTEGER, INTENT(IN) :: kt ! Time step 2264 INTEGER, INTENT(IN) :: kpi ! Model grid parameters 2265 INTEGER, INTENT(IN) :: kpj 2266 INTEGER, INTENT(IN) :: kit000 ! Number of the first time step 2267 ! (kit000-1 = restart time) 2268 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 2269 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 2270 & pspmn, & ! Model spm field 2271 & pspmmask ! Land-sea mask 2272 2273 !! * Local declarations 2274 INTEGER :: ji 2275 INTEGER :: jj 2276 INTEGER :: jobs 2277 INTEGER :: inrc 2278 INTEGER :: ispm 2279 INTEGER :: iobs 2280 2281 REAL(KIND=wp) :: zlam 2282 REAL(KIND=wp) :: zphi 2283 REAL(KIND=wp) :: zext(1), zobsmask(1) 2284 REAL(kind=wp), DIMENSION(2,2,1) :: & 2285 & zweig 2286 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 2287 & zmask, & 2288 & zspml, & 2289 & zglam, & 2290 & zgphi 2291 INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: & 2292 & igrdi, & 2293 & igrdj 2294 2295 !------------------------------------------------------------------------ 2296 ! Local initialization 2297 !------------------------------------------------------------------------ 2298 ! ... Record and data counters 2299 inrc = kt - kit000 + 2 2300 ispm = spmdatqc%nsstp(inrc) 2301 2302 ! Get the data for interpolation 2303 2304 ALLOCATE( & 2305 & igrdi(2,2,ispm), & 2306 & igrdj(2,2,ispm), & 2307 & zglam(2,2,ispm), & 2308 & zgphi(2,2,ispm), & 2309 & zmask(2,2,ispm), & 2310 & zspml(2,2,ispm) & 2311 & ) 2312 2313 DO jobs = spmdatqc%nsurfup + 1, spmdatqc%nsurfup + ispm 2314 iobs = jobs - spmdatqc%nsurfup 2315 igrdi(1,1,iobs) = spmdatqc%mi(jobs)-1 2316 igrdj(1,1,iobs) = spmdatqc%mj(jobs)-1 2317 igrdi(1,2,iobs) = spmdatqc%mi(jobs)-1 2318 igrdj(1,2,iobs) = spmdatqc%mj(jobs) 2319 igrdi(2,1,iobs) = spmdatqc%mi(jobs) 2320 igrdj(2,1,iobs) = spmdatqc%mj(jobs)-1 2321 igrdi(2,2,iobs) = spmdatqc%mi(jobs) 2322 igrdj(2,2,iobs) = spmdatqc%mj(jobs) 2323 END DO 2324 2325 CALL obs_int_comm_2d( 2, 2, ispm, & 2326 & igrdi, igrdj, glamt, zglam ) 2327 CALL obs_int_comm_2d( 2, 2, ispm, & 2328 & igrdi, igrdj, gphit, zgphi ) 2329 CALL obs_int_comm_2d( 2, 2, ispm, & 2330 & igrdi, igrdj, pspmmask, zmask ) 2331 CALL obs_int_comm_2d( 2, 2, ispm, & 2332 & igrdi, igrdj, pspmn, zspml ) 2333 2334 DO jobs = spmdatqc%nsurfup + 1, spmdatqc%nsurfup + ispm 2335 2336 iobs = jobs - spmdatqc%nsurfup 2337 2338 IF ( kt /= spmdatqc%mstp(jobs) ) THEN 2339 2340 IF(lwp) THEN 2341 WRITE(numout,*) 2342 WRITE(numout,*) ' E R R O R : Observation', & 2343 & ' time step is not consistent with the', & 2344 & ' model time step' 2345 WRITE(numout,*) ' =========' 2346 WRITE(numout,*) 2347 WRITE(numout,*) ' Record = ', jobs, & 2348 & ' kt = ', kt, & 2349 & ' mstp = ', spmdatqc%mstp(jobs), & 2350 & ' ntyp = ', spmdatqc%ntyp(jobs) 2351 ENDIF 2352 CALL ctl_stop( 'obs_spm_opt', 'Inconsistent time' ) 2353 2354 ENDIF 2355 2356 zlam = spmdatqc%rlam(jobs) 2357 zphi = spmdatqc%rphi(jobs) 2358 2359 ! Get weights to interpolate the model spm to the observation point 2360 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 2361 & zglam(:,:,iobs), zgphi(:,:,iobs), & 2362 & zmask(:,:,iobs), zweig, zobsmask ) 2363 2364 ! ... Interpolate the model spm to the observation point 2365 CALL obs_int_h2d( 1, 1, & 2366 & zweig, zspml(:,:,iobs), zext ) 2367 2368 spmdatqc%rmod(jobs,1) = zext(1) 2369 2370 END DO 2371 2372 ! Deallocate the data for interpolation 2373 DEALLOCATE( & 2374 & igrdi, & 2375 & igrdj, & 2376 & zglam, & 2377 & zgphi, & 2378 & zmask, & 2379 & zspml & 2380 & ) 2381 2382 spmdatqc%nsurfup = spmdatqc%nsurfup + ispm 2383 2384 END SUBROUTINE obs_spm_opt 2385 2386 SUBROUTINE obs_fco2_opt( fco2datqc, kt, kpi, kpj, kit000, & 2387 & pfco2n, pfco2mask, k2dint ) 2388 2389 !!----------------------------------------------------------------------- 2390 !! 2391 !! *** ROUTINE obs_fco2_opt *** 2392 !! 2393 !! ** Purpose : Compute the model counterpart of fco2 2394 !! data by interpolating from the model grid to the 2395 !! observation point. 2396 !! 2397 !! ** Method : Linearly interpolate to each observation point using 2398 !! the model values at the corners of the surrounding grid box. 2399 !! 2400 !! The now model fco2 is first computed at the obs (lon, lat) point. 2401 !! 2402 !! Several horizontal interpolation schemes are available: 2403 !! - distance-weighted (great circle) (k2dint = 0) 2404 !! - distance-weighted (small angle) (k2dint = 1) 2405 !! - bilinear (geographical grid) (k2dint = 2) 2406 !! - bilinear (quadrilateral grid) (k2dint = 3) 2407 !! - polynomial (quadrilateral grid) (k2dint = 4) 2408 !! 2409 !! 2410 !! ** Action : 2411 !! 2412 !! History : 2413 !! 2414 !!----------------------------------------------------------------------- 2415 2416 !! * Modules used 2417 USE obs_surf_def ! Definition of storage space for surface observations 2418 2419 IMPLICIT NONE 2420 2421 !! * Arguments 2422 TYPE(obs_surf), INTENT(INOUT) :: fco2datqc ! Subset of surface data not failing screening 2423 INTEGER, INTENT(IN) :: kt ! Time step 2424 INTEGER, INTENT(IN) :: kpi ! Model grid parameters 2425 INTEGER, INTENT(IN) :: kpj 2426 INTEGER, INTENT(IN) :: kit000 ! Number of the first time step 2427 ! (kit000-1 = restart time) 2428 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 2429 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 2430 & pfco2n, & ! Model fco2 field 2431 & pfco2mask ! Land-sea mask 2432 2433 !! * Local declarations 2434 INTEGER :: ji 2435 INTEGER :: jj 2436 INTEGER :: jobs 2437 INTEGER :: inrc 2438 INTEGER :: ifco2 2439 INTEGER :: iobs 2440 2441 REAL(KIND=wp) :: zlam 2442 REAL(KIND=wp) :: zphi 2443 REAL(KIND=wp) :: zext(1), zobsmask(1) 2444 REAL(kind=wp), DIMENSION(2,2,1) :: & 2445 & zweig 2446 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 2447 & zmask, & 2448 & zfco2l, & 2449 & zglam, & 2450 & zgphi 2451 INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: & 2452 & igrdi, & 2453 & igrdj 2454 2455 !------------------------------------------------------------------------ 2456 ! Local initialization 2457 !------------------------------------------------------------------------ 2458 ! ... Record and data counters 2459 inrc = kt - kit000 + 2 2460 ifco2 = fco2datqc%nsstp(inrc) 2461 2462 ! Get the data for interpolation 2463 2464 ALLOCATE( & 2465 & igrdi(2,2,ifco2), & 2466 & igrdj(2,2,ifco2), & 2467 & zglam(2,2,ifco2), & 2468 & zgphi(2,2,ifco2), & 2469 & zmask(2,2,ifco2), & 2470 & zfco2l(2,2,ifco2) & 2471 & ) 2472 2473 DO jobs = fco2datqc%nsurfup + 1, fco2datqc%nsurfup + ifco2 2474 iobs = jobs - fco2datqc%nsurfup 2475 igrdi(1,1,iobs) = fco2datqc%mi(jobs)-1 2476 igrdj(1,1,iobs) = fco2datqc%mj(jobs)-1 2477 igrdi(1,2,iobs) = fco2datqc%mi(jobs)-1 2478 igrdj(1,2,iobs) = fco2datqc%mj(jobs) 2479 igrdi(2,1,iobs) = fco2datqc%mi(jobs) 2480 igrdj(2,1,iobs) = fco2datqc%mj(jobs)-1 2481 igrdi(2,2,iobs) = fco2datqc%mi(jobs) 2482 igrdj(2,2,iobs) = fco2datqc%mj(jobs) 2483 END DO 2484 2485 CALL obs_int_comm_2d( 2, 2, ifco2, & 2486 & igrdi, igrdj, glamt, zglam ) 2487 CALL obs_int_comm_2d( 2, 2, ifco2, & 2488 & igrdi, igrdj, gphit, zgphi ) 2489 CALL obs_int_comm_2d( 2, 2, ifco2, & 2490 & igrdi, igrdj, pfco2mask, zmask ) 2491 CALL obs_int_comm_2d( 2, 2, ifco2, & 2492 & igrdi, igrdj, pfco2n, zfco2l ) 2493 2494 DO jobs = fco2datqc%nsurfup + 1, fco2datqc%nsurfup + ifco2 2495 2496 iobs = jobs - fco2datqc%nsurfup 2497 2498 IF ( kt /= fco2datqc%mstp(jobs) ) THEN 2499 2500 IF(lwp) THEN 2501 WRITE(numout,*) 2502 WRITE(numout,*) ' E R R O R : Observation', & 2503 & ' time step is not consistent with the', & 2504 & ' model time step' 2505 WRITE(numout,*) ' =========' 2506 WRITE(numout,*) 2507 WRITE(numout,*) ' Record = ', jobs, & 2508 & ' kt = ', kt, & 2509 & ' mstp = ', fco2datqc%mstp(jobs), & 2510 & ' ntyp = ', fco2datqc%ntyp(jobs) 2511 ENDIF 2512 CALL ctl_stop( 'obs_fco2_opt', 'Inconsistent time' ) 2513 2514 ENDIF 2515 2516 zlam = fco2datqc%rlam(jobs) 2517 zphi = fco2datqc%rphi(jobs) 2518 2519 ! Get weights to interpolate the model fco2 to the observation point 2520 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 2521 & zglam(:,:,iobs), zgphi(:,:,iobs), & 2522 & zmask(:,:,iobs), zweig, zobsmask ) 2523 2524 ! ... Interpolate the model fco2 to the observation point 2525 CALL obs_int_h2d( 1, 1, & 2526 & zweig, zfco2l(:,:,iobs), zext ) 2527 2528 fco2datqc%rmod(jobs,1) = zext(1) 2529 2530 END DO 2531 2532 ! Deallocate the data for interpolation 2533 DEALLOCATE( & 2534 & igrdi, & 2535 & igrdj, & 2536 & zglam, & 2537 & zgphi, & 2538 & zmask, & 2539 & zfco2l & 2540 & ) 2541 2542 fco2datqc%nsurfup = fco2datqc%nsurfup + ifco2 2543 2544 END SUBROUTINE obs_fco2_opt 2545 2546 SUBROUTINE obs_pco2_opt( pco2datqc, kt, kpi, kpj, kit000, & 2547 & ppco2n, ppco2mask, k2dint ) 2548 2549 !!----------------------------------------------------------------------- 2550 !! 2551 !! *** ROUTINE obs_pco2_opt *** 2552 !! 2553 !! ** Purpose : Compute the model counterpart of pco2 2554 !! data by interpolating from the model grid to the 2555 !! observation point. 2556 !! 2557 !! ** Method : Linearly interpolate to each observation point using 2558 !! the model values at the corners of the surrounding grid box. 2559 !! 2560 !! The now model pco2 is first computed at the obs (lon, lat) point. 2561 !! 2562 !! Several horizontal interpolation schemes are available: 2563 !! - distance-weighted (great circle) (k2dint = 0) 2564 !! - distance-weighted (small angle) (k2dint = 1) 2565 !! - bilinear (geographical grid) (k2dint = 2) 2566 !! - bilinear (quadrilateral grid) (k2dint = 3) 2567 !! - polynomial (quadrilateral grid) (k2dint = 4) 2568 !! 2569 !! 2570 !! ** Action : 2571 !! 2572 !! History : 2573 !! 2574 !!----------------------------------------------------------------------- 2575 2576 !! * Modules used 2577 USE obs_surf_def ! Definition of storage space for surface observations 2578 2579 IMPLICIT NONE 2580 2581 !! * Arguments 2582 TYPE(obs_surf), INTENT(INOUT) :: pco2datqc ! Subset of surface data not failing screening 2583 INTEGER, INTENT(IN) :: kt ! Time step 2584 INTEGER, INTENT(IN) :: kpi ! Model grid parameters 2585 INTEGER, INTENT(IN) :: kpj 2586 INTEGER, INTENT(IN) :: kit000 ! Number of the first time step 2587 ! (kit000-1 = restart time) 2588 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 2589 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 2590 & ppco2n, & ! Model pco2 field 2591 & ppco2mask ! Land-sea mask 2592 2593 !! * Local declarations 2594 INTEGER :: ji 2595 INTEGER :: jj 2596 INTEGER :: jobs 2597 INTEGER :: inrc 2598 INTEGER :: ipco2 2599 INTEGER :: iobs 2600 2601 REAL(KIND=wp) :: zlam 2602 REAL(KIND=wp) :: zphi 2603 REAL(KIND=wp) :: zext(1), zobsmask(1) 2604 REAL(kind=wp), DIMENSION(2,2,1) :: & 2605 & zweig 2606 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 2607 & zmask, & 2608 & zpco2l, & 2609 & zglam, & 2610 & zgphi 2611 INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: & 2612 & igrdi, & 2613 & igrdj 2614 2615 !------------------------------------------------------------------------ 2616 ! Local initialization 2617 !------------------------------------------------------------------------ 2618 ! ... Record and data counters 2619 inrc = kt - kit000 + 2 2620 ipco2 = pco2datqc%nsstp(inrc) 2621 2622 ! Get the data for interpolation 2623 2624 ALLOCATE( & 2625 & igrdi(2,2,ipco2), & 2626 & igrdj(2,2,ipco2), & 2627 & zglam(2,2,ipco2), & 2628 & zgphi(2,2,ipco2), & 2629 & zmask(2,2,ipco2), & 2630 & zpco2l(2,2,ipco2) & 2631 & ) 2632 2633 DO jobs = pco2datqc%nsurfup + 1, pco2datqc%nsurfup + ipco2 2634 iobs = jobs - pco2datqc%nsurfup 2635 igrdi(1,1,iobs) = pco2datqc%mi(jobs)-1 2636 igrdj(1,1,iobs) = pco2datqc%mj(jobs)-1 2637 igrdi(1,2,iobs) = pco2datqc%mi(jobs)-1 2638 igrdj(1,2,iobs) = pco2datqc%mj(jobs) 2639 igrdi(2,1,iobs) = pco2datqc%mi(jobs) 2640 igrdj(2,1,iobs) = pco2datqc%mj(jobs)-1 2641 igrdi(2,2,iobs) = pco2datqc%mi(jobs) 2642 igrdj(2,2,iobs) = pco2datqc%mj(jobs) 2643 END DO 2644 2645 CALL obs_int_comm_2d( 2, 2, ipco2, & 2646 & igrdi, igrdj, glamt, zglam ) 2647 CALL obs_int_comm_2d( 2, 2, ipco2, & 2648 & igrdi, igrdj, gphit, zgphi ) 2649 CALL obs_int_comm_2d( 2, 2, ipco2, & 2650 & igrdi, igrdj, ppco2mask, zmask ) 2651 CALL obs_int_comm_2d( 2, 2, ipco2, & 2652 & igrdi, igrdj, ppco2n, zpco2l ) 2653 2654 DO jobs = pco2datqc%nsurfup + 1, pco2datqc%nsurfup + ipco2 2655 2656 iobs = jobs - pco2datqc%nsurfup 2657 2658 IF ( kt /= pco2datqc%mstp(jobs) ) THEN 2659 2660 IF(lwp) THEN 2661 WRITE(numout,*) 2662 WRITE(numout,*) ' E R R O R : Observation', & 2663 & ' time step is not consistent with the', & 2664 & ' model time step' 2665 WRITE(numout,*) ' =========' 2666 WRITE(numout,*) 2667 WRITE(numout,*) ' Record = ', jobs, & 2668 & ' kt = ', kt, & 2669 & ' mstp = ', pco2datqc%mstp(jobs), & 2670 & ' ntyp = ', pco2datqc%ntyp(jobs) 2671 ENDIF 2672 CALL ctl_stop( 'obs_pco2_opt', 'Inconsistent time' ) 2673 2674 ENDIF 2675 2676 zlam = pco2datqc%rlam(jobs) 2677 zphi = pco2datqc%rphi(jobs) 2678 2679 ! Get weights to interpolate the model pco2 to the observation point 2680 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 2681 & zglam(:,:,iobs), zgphi(:,:,iobs), & 2682 & zmask(:,:,iobs), zweig, zobsmask ) 2683 2684 ! ... Interpolate the model pco2 to the observation point 2685 CALL obs_int_h2d( 1, 1, & 2686 & zweig, zpco2l(:,:,iobs), zext ) 2687 2688 pco2datqc%rmod(jobs,1) = zext(1) 2689 2690 END DO 2691 2692 ! Deallocate the data for interpolation 2693 DEALLOCATE( & 2694 & igrdi, & 2695 & igrdj, & 2696 & zglam, & 2697 & zgphi, & 2698 & zmask, & 2699 & zpco2l & 2700 & ) 2701 2702 pco2datqc%nsurfup = pco2datqc%nsurfup + ipco2 2703 2704 END SUBROUTINE obs_pco2_opt 2705 2054 2706 END MODULE obs_oper 2055 2707 -
branches/UKMO/dev_r4650_general_vert_coord_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
r6990 r7713 12 12 !! obs_pre_seaice : First level check and screening of sea ice observations 13 13 !! obs_pre_vel : First level check and screening of velocity obs. 14 !! obs_pre_logchl : First level check and screening of logchl obs. 15 !! obs_pre_spm : First level check and screening of spm obs. 16 !! obs_pre_fco2 : First level check and screening of fco2 obs. 17 !! obs_pre_pco2 : First level check and screening of pco2 obs. 14 18 !! obs_scr : Basic screening of the observations 15 19 !! obs_coo_tim : Compute number of time steps to the observation time … … 45 49 & obs_pre_seaice, & ! First level check and screening of sea ice data 46 50 & obs_pre_vel, & ! First level check and screening of velocity profiles 51 & obs_pre_logchl, & ! First level check and screening of logchl data 52 & obs_pre_spm, & ! First level check and screening of spm data 53 & obs_pre_fco2, & ! First level check and screening of fco2 data 54 & obs_pre_pco2, & ! First level check and screening of pco2 data 47 55 & calc_month_len ! Calculate the number of days in the months of a year 48 56 … … 1376 1384 END SUBROUTINE obs_pre_vel 1377 1385 1386 SUBROUTINE obs_pre_logchl( logchldata, logchldatqc, ld_logchl, ld_nea ) 1387 !!---------------------------------------------------------------------- 1388 !! *** ROUTINE obs_pre_logchl *** 1389 !! 1390 !! ** Purpose : First level check and screening of logchl observations 1391 !! 1392 !! ** Method : First level check and screening of logchl observations 1393 !! 1394 !! ** Action : 1395 !! 1396 !! References : 1397 !! 1398 !! History : 1399 !!---------------------------------------------------------------------- 1400 !! * Modules used 1401 USE domstp ! Domain: set the time-step 1402 USE par_oce ! Ocean parameters 1403 USE dom_oce, ONLY : & ! Geographical information 1404 & glamt, & 1405 & gphit, & 1406 & tmask 1407 !! * Arguments 1408 TYPE(obs_surf), INTENT(INOUT) :: logchldata ! Full set of logchl data 1409 TYPE(obs_surf), INTENT(INOUT) :: logchldatqc ! Subset of logchl data not failing screening 1410 LOGICAL :: ld_logchl ! Switch for logchl data 1411 LOGICAL :: ld_nea ! Switch for rejecting observation near land 1412 !! * Local declarations 1413 INTEGER :: iyea0 ! Initial date 1414 INTEGER :: imon0 ! - (year, month, day, hour, minute) 1415 INTEGER :: iday0 1416 INTEGER :: ihou0 1417 INTEGER :: imin0 1418 INTEGER :: icycle ! Current assimilation cycle 1419 ! Counters for observations that 1420 INTEGER :: iotdobs ! - outside time domain 1421 INTEGER :: iosdsobs ! - outside space domain 1422 INTEGER :: ilansobs ! - within a model land cell 1423 INTEGER :: inlasobs ! - close to land 1424 INTEGER :: igrdobs ! - fail the grid search 1425 INTEGER :: ibdysobs ! - close to open boundary 1426 ! Global counters for observations that 1427 INTEGER :: iotdobsmpp ! - outside time domain 1428 INTEGER :: iosdsobsmpp ! - outside space domain 1429 INTEGER :: ilansobsmpp ! - within a model land cell 1430 INTEGER :: inlasobsmpp ! - close to land 1431 INTEGER :: igrdobsmpp ! - fail the grid search 1432 INTEGER :: ibdysobsmpp ! - close to open boundary 1433 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 1434 & llvalid ! data selection 1435 INTEGER :: jobs ! Obs. loop variable 1436 INTEGER :: jstp ! Time loop variable 1437 INTEGER :: inrc ! Time index variable 1438 INTEGER :: irec ! Record index 1439 1440 IF (lwp) WRITE(numout,*)'obs_pre_logchl : Preparing the logchl observations...' 1441 1442 ! Initial date initialization (year, month, day, hour, minute) 1443 iyea0 = ndate0 / 10000 1444 imon0 = ( ndate0 - iyea0 * 10000 ) / 100 1445 iday0 = ndate0 - iyea0 * 10000 - imon0 * 100 1446 ihou0 = 0 1447 imin0 = 0 1448 1449 icycle = no ! Assimilation cycle 1450 1451 ! Diagnostics counters for various failures. 1452 1453 iotdobs = 0 1454 igrdobs = 0 1455 iosdsobs = 0 1456 ilansobs = 0 1457 inlasobs = 0 1458 ibdysobs = 0 1459 1460 ! ----------------------------------------------------------------------- 1461 ! Find time coordinate for logchl data 1462 ! ----------------------------------------------------------------------- 1463 1464 CALL obs_coo_tim( icycle, & 1465 & iyea0, imon0, iday0, ihou0, imin0, & 1466 & logchldata%nsurf, logchldata%nyea, logchldata%nmon, & 1467 & logchldata%nday, logchldata%nhou, logchldata%nmin, & 1468 & logchldata%nqc, logchldata%mstp, iotdobs ) 1469 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 1470 ! ----------------------------------------------------------------------- 1471 ! Check for logchl data failing the grid search 1472 ! ----------------------------------------------------------------------- 1473 1474 CALL obs_coo_grd( logchldata%nsurf, logchldata%mi, logchldata%mj, & 1475 & logchldata%nqc, igrdobs ) 1476 CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 1477 1478 ! ----------------------------------------------------------------------- 1479 ! Check for land points. 1480 ! ----------------------------------------------------------------------- 1481 1482 CALL obs_coo_spc_2d( logchldata%nsurf, & 1483 & jpi, jpj, & 1484 & logchldata%mi, logchldata%mj, & 1485 & logchldata%rlam, logchldata%rphi, & 1486 & glamt, gphit, & 1487 & tmask(:,:,1), logchldata%nqc, & 1488 & iosdsobs, ilansobs, & 1489 & inlasobs, ld_nea, & 1490 & ibdysobs, ln_bound_reject ) 1491 1492 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 1493 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 1494 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 1495 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 1496 1497 ! ----------------------------------------------------------------------- 1498 ! Copy useful data from the logchldata data structure to 1499 ! the logchldatqc data structure 1500 ! ----------------------------------------------------------------------- 1501 1502 ! Allocate the selection arrays 1503 1504 ALLOCATE( llvalid(logchldata%nsurf) ) 1505 1506 ! We want all data which has qc flags <= 0 1507 1508 llvalid(:) = ( logchldata%nqc(:) <= 10 ) 1509 1510 ! The actual copying 1511 1512 CALL obs_surf_compress( logchldata, logchldatqc, .TRUE., numout, & 1513 & lvalid=llvalid ) 1514 1515 ! Dellocate the selection arrays 1516 DEALLOCATE( llvalid ) 1517 1518 ! ----------------------------------------------------------------------- 1519 ! Print information about what observations are left after qc 1520 ! ----------------------------------------------------------------------- 1521 1522 ! Update the total observation counter array 1523 1524 IF(lwp) THEN 1525 WRITE(numout,*) 1526 WRITE(numout,*) 'obs_pre_logchl :' 1527 WRITE(numout,*) '~~~~~~~~~~~' 1528 WRITE(numout,*) 1529 WRITE(numout,*) ' logchl data outside time domain = ', & 1530 & iotdobsmpp 1531 WRITE(numout,*) ' Remaining logchl data that failed grid search = ', & 1532 & igrdobsmpp 1533 WRITE(numout,*) ' Remaining logchl data outside space domain = ', & 1534 & iosdsobsmpp 1535 WRITE(numout,*) ' Remaining logchl data at land points = ', & 1536 & ilansobsmpp 1537 IF (ld_nea) THEN 1538 WRITE(numout,*) ' Remaining logchl data near land points (removed) = ', & 1539 & inlasobsmpp 1540 ELSE 1541 WRITE(numout,*) ' Remaining logchl data near land points (kept) = ', & 1542 & inlasobsmpp 1543 ENDIF 1544 WRITE(numout,*) ' Remaining logchl data near open boundary (removed) = ', & 1545 & ibdysobsmpp 1546 WRITE(numout,*) ' logchl data accepted = ', & 1547 & logchldatqc%nsurfmpp 1548 1549 WRITE(numout,*) 1550 WRITE(numout,*) ' Number of observations per time step :' 1551 WRITE(numout,*) 1552 WRITE(numout,1997) 1553 WRITE(numout,1998) 1554 ENDIF 1555 1556 DO jobs = 1, logchldatqc%nsurf 1557 inrc = logchldatqc%mstp(jobs) + 2 - nit000 1558 logchldatqc%nsstp(inrc) = logchldatqc%nsstp(inrc) + 1 1559 END DO 1560 1561 CALL obs_mpp_sum_integers( logchldatqc%nsstp, logchldatqc%nsstpmpp, & 1562 & nitend - nit000 + 2 ) 1563 1564 IF ( lwp ) THEN 1565 DO jstp = nit000 - 1, nitend 1566 inrc = jstp - nit000 + 2 1567 WRITE(numout,1999) jstp, logchldatqc%nsstpmpp(inrc) 1568 END DO 1569 ENDIF 1570 1571 1997 FORMAT(10X,'Time step',5X,'logchl data') 1572 1998 FORMAT(10X,'---------',5X,'------------') 1573 1999 FORMAT(10X,I9,5X,I17) 1574 1575 END SUBROUTINE obs_pre_logchl 1576 1577 SUBROUTINE obs_pre_spm( spmdata, spmdatqc, ld_spm, ld_nea ) 1578 !!---------------------------------------------------------------------- 1579 !! *** ROUTINE obs_pre_spm *** 1580 !! 1581 !! ** Purpose : First level check and screening of spm observations 1582 !! 1583 !! ** Method : First level check and screening of spm observations 1584 !! 1585 !! ** Action : 1586 !! 1587 !! References : 1588 !! 1589 !! History : 1590 !!---------------------------------------------------------------------- 1591 !! * Modules used 1592 USE domstp ! Domain: set the time-step 1593 USE par_oce ! Ocean parameters 1594 USE dom_oce, ONLY : & ! Geographical information 1595 & glamt, & 1596 & gphit, & 1597 & tmask 1598 !! * Arguments 1599 TYPE(obs_surf), INTENT(INOUT) :: spmdata ! Full set of spm data 1600 TYPE(obs_surf), INTENT(INOUT) :: spmdatqc ! Subset of spm data not failing screening 1601 LOGICAL :: ld_spm ! Switch for spm data 1602 LOGICAL :: ld_nea ! Switch for rejecting observation near land 1603 !! * Local declarations 1604 INTEGER :: iyea0 ! Initial date 1605 INTEGER :: imon0 ! - (year, month, day, hour, minute) 1606 INTEGER :: iday0 1607 INTEGER :: ihou0 1608 INTEGER :: imin0 1609 INTEGER :: icycle ! Current assimilation cycle 1610 ! Counters for observations that 1611 INTEGER :: iotdobs ! - outside time domain 1612 INTEGER :: iosdsobs ! - outside space domain 1613 INTEGER :: ilansobs ! - within a model land cell 1614 INTEGER :: inlasobs ! - close to land 1615 INTEGER :: igrdobs ! - fail the grid search 1616 INTEGER :: ibdysobs ! - close to open boundary 1617 ! Global counters for observations that 1618 INTEGER :: iotdobsmpp ! - outside time domain 1619 INTEGER :: iosdsobsmpp ! - outside space domain 1620 INTEGER :: ilansobsmpp ! - within a model land cell 1621 INTEGER :: inlasobsmpp ! - close to land 1622 INTEGER :: igrdobsmpp ! - fail the grid search 1623 INTEGER :: ibdysobsmpp ! - close to open boundary 1624 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 1625 & llvalid ! data selection 1626 INTEGER :: jobs ! Obs. loop variable 1627 INTEGER :: jstp ! Time loop variable 1628 INTEGER :: inrc ! Time index variable 1629 INTEGER :: irec ! Record index 1630 1631 IF (lwp) WRITE(numout,*)'obs_pre_spm : Preparing the spm observations...' 1632 1633 ! Initial date initialization (year, month, day, hour, minute) 1634 iyea0 = ndate0 / 10000 1635 imon0 = ( ndate0 - iyea0 * 10000 ) / 100 1636 iday0 = ndate0 - iyea0 * 10000 - imon0 * 100 1637 ihou0 = 0 1638 imin0 = 0 1639 1640 icycle = no ! Assimilation cycle 1641 1642 ! Diagnostics counters for various failures. 1643 1644 iotdobs = 0 1645 igrdobs = 0 1646 iosdsobs = 0 1647 ilansobs = 0 1648 inlasobs = 0 1649 ibdysobs = 0 1650 1651 ! ----------------------------------------------------------------------- 1652 ! Find time coordinate for spm data 1653 ! ----------------------------------------------------------------------- 1654 1655 CALL obs_coo_tim( icycle, & 1656 & iyea0, imon0, iday0, ihou0, imin0, & 1657 & spmdata%nsurf, spmdata%nyea, spmdata%nmon, & 1658 & spmdata%nday, spmdata%nhou, spmdata%nmin, & 1659 & spmdata%nqc, spmdata%mstp, iotdobs ) 1660 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 1661 ! ----------------------------------------------------------------------- 1662 ! Check for spm data failing the grid search 1663 ! ----------------------------------------------------------------------- 1664 1665 CALL obs_coo_grd( spmdata%nsurf, spmdata%mi, spmdata%mj, & 1666 & spmdata%nqc, igrdobs ) 1667 CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 1668 1669 ! ----------------------------------------------------------------------- 1670 ! Check for land points. 1671 ! ----------------------------------------------------------------------- 1672 1673 CALL obs_coo_spc_2d( spmdata%nsurf, & 1674 & jpi, jpj, & 1675 & spmdata%mi, spmdata%mj, & 1676 & spmdata%rlam, spmdata%rphi, & 1677 & glamt, gphit, & 1678 & tmask(:,:,1), spmdata%nqc, & 1679 & iosdsobs, ilansobs, & 1680 & inlasobs, ld_nea, & 1681 & ibdysobs, ln_bound_reject ) 1682 1683 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 1684 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 1685 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 1686 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 1687 1688 ! ----------------------------------------------------------------------- 1689 ! Copy useful data from the spmdata data structure to 1690 ! the spmdatqc data structure 1691 ! ----------------------------------------------------------------------- 1692 1693 ! Allocate the selection arrays 1694 1695 ALLOCATE( llvalid(spmdata%nsurf) ) 1696 1697 ! We want all data which has qc flags <= 0 1698 1699 llvalid(:) = ( spmdata%nqc(:) <= 10 ) 1700 1701 ! The actual copying 1702 1703 CALL obs_surf_compress( spmdata, spmdatqc, .TRUE., numout, & 1704 & lvalid=llvalid ) 1705 1706 ! Dellocate the selection arrays 1707 DEALLOCATE( llvalid ) 1708 1709 ! ----------------------------------------------------------------------- 1710 ! Print information about what observations are left after qc 1711 ! ----------------------------------------------------------------------- 1712 1713 ! Update the total observation counter array 1714 1715 IF(lwp) THEN 1716 WRITE(numout,*) 1717 WRITE(numout,*) 'obs_pre_spm :' 1718 WRITE(numout,*) '~~~~~~~~~~~' 1719 WRITE(numout,*) 1720 WRITE(numout,*) ' spm data outside time domain = ', & 1721 & iotdobsmpp 1722 WRITE(numout,*) ' Remaining spm data that failed grid search = ', & 1723 & igrdobsmpp 1724 WRITE(numout,*) ' Remaining spm data outside space domain = ', & 1725 & iosdsobsmpp 1726 WRITE(numout,*) ' Remaining spm data at land points = ', & 1727 & ilansobsmpp 1728 IF (ld_nea) THEN 1729 WRITE(numout,*) ' Remaining spm data near land points (removed) = ', & 1730 & inlasobsmpp 1731 ELSE 1732 WRITE(numout,*) ' Remaining spm data near land points (kept) = ', & 1733 & inlasobsmpp 1734 ENDIF 1735 WRITE(numout,*) ' Remaining spm data near open boundary (removed) = ', & 1736 & ibdysobsmpp 1737 WRITE(numout,*) ' spm data accepted = ', & 1738 & spmdatqc%nsurfmpp 1739 1740 WRITE(numout,*) 1741 WRITE(numout,*) ' Number of observations per time step :' 1742 WRITE(numout,*) 1743 WRITE(numout,1997) 1744 WRITE(numout,1998) 1745 ENDIF 1746 1747 DO jobs = 1, spmdatqc%nsurf 1748 inrc = spmdatqc%mstp(jobs) + 2 - nit000 1749 spmdatqc%nsstp(inrc) = spmdatqc%nsstp(inrc) + 1 1750 END DO 1751 1752 CALL obs_mpp_sum_integers( spmdatqc%nsstp, spmdatqc%nsstpmpp, & 1753 & nitend - nit000 + 2 ) 1754 1755 IF ( lwp ) THEN 1756 DO jstp = nit000 - 1, nitend 1757 inrc = jstp - nit000 + 2 1758 WRITE(numout,1999) jstp, spmdatqc%nsstpmpp(inrc) 1759 END DO 1760 ENDIF 1761 1762 1997 FORMAT(10X,'Time step',5X,'spm data') 1763 1998 FORMAT(10X,'---------',5X,'------------') 1764 1999 FORMAT(10X,I9,5X,I17) 1765 1766 END SUBROUTINE obs_pre_spm 1767 1768 SUBROUTINE obs_pre_fco2( fco2data, fco2datqc, ld_fco2, ld_nea ) 1769 !!---------------------------------------------------------------------- 1770 !! *** ROUTINE obs_pre_fco2 *** 1771 !! 1772 !! ** Purpose : First level check and screening of fco2 observations 1773 !! 1774 !! ** Method : First level check and screening of fco2 observations 1775 !! 1776 !! ** Action : 1777 !! 1778 !! References : 1779 !! 1780 !! History : 1781 !!---------------------------------------------------------------------- 1782 !! * Modules used 1783 USE domstp ! Domain: set the time-step 1784 USE par_oce ! Ocean parameters 1785 USE dom_oce, ONLY : & ! Geographical information 1786 & glamt, & 1787 & gphit, & 1788 & tmask 1789 !! * Arguments 1790 TYPE(obs_surf), INTENT(INOUT) :: fco2data ! Full set of fco2 data 1791 TYPE(obs_surf), INTENT(INOUT) :: fco2datqc ! Subset of fco2 data not failing screening 1792 LOGICAL :: ld_fco2 ! Switch for fco2 data 1793 LOGICAL :: ld_nea ! Switch for rejecting observation near land 1794 !! * Local declarations 1795 INTEGER :: iyea0 ! Initial date 1796 INTEGER :: imon0 ! - (year, month, day, hour, minute) 1797 INTEGER :: iday0 1798 INTEGER :: ihou0 1799 INTEGER :: imin0 1800 INTEGER :: icycle ! Current assimilation cycle 1801 ! Counters for observations that 1802 INTEGER :: iotdobs ! - outside time domain 1803 INTEGER :: iosdsobs ! - outside space domain 1804 INTEGER :: ilansobs ! - within a model land cell 1805 INTEGER :: inlasobs ! - close to land 1806 INTEGER :: igrdobs ! - fail the grid search 1807 INTEGER :: ibdysobs ! - close to open boundary 1808 ! Global counters for observations that 1809 INTEGER :: iotdobsmpp ! - outside time domain 1810 INTEGER :: iosdsobsmpp ! - outside space domain 1811 INTEGER :: ilansobsmpp ! - within a model land cell 1812 INTEGER :: inlasobsmpp ! - close to land 1813 INTEGER :: igrdobsmpp ! - fail the grid search 1814 INTEGER :: ibdysobsmpp ! - close to open boundary 1815 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 1816 & llvalid ! data selection 1817 INTEGER :: jobs ! Obs. loop variable 1818 INTEGER :: jstp ! Time loop variable 1819 INTEGER :: inrc ! Time index variable 1820 INTEGER :: irec ! Record index 1821 1822 IF (lwp) WRITE(numout,*)'obs_pre_fco2 : Preparing the fco2 observations...' 1823 1824 ! Initial date initialization (year, month, day, hour, minute) 1825 iyea0 = ndate0 / 10000 1826 imon0 = ( ndate0 - iyea0 * 10000 ) / 100 1827 iday0 = ndate0 - iyea0 * 10000 - imon0 * 100 1828 ihou0 = 0 1829 imin0 = 0 1830 1831 icycle = no ! Assimilation cycle 1832 1833 ! Diagnostics counters for various failures. 1834 1835 iotdobs = 0 1836 igrdobs = 0 1837 iosdsobs = 0 1838 ilansobs = 0 1839 inlasobs = 0 1840 ibdysobs = 0 1841 1842 ! ----------------------------------------------------------------------- 1843 ! Find time coordinate for fco2 data 1844 ! ----------------------------------------------------------------------- 1845 1846 CALL obs_coo_tim( icycle, & 1847 & iyea0, imon0, iday0, ihou0, imin0, & 1848 & fco2data%nsurf, fco2data%nyea, fco2data%nmon, & 1849 & fco2data%nday, fco2data%nhou, fco2data%nmin, & 1850 & fco2data%nqc, fco2data%mstp, iotdobs ) 1851 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 1852 ! ----------------------------------------------------------------------- 1853 ! Check for fco2 data failing the grid search 1854 ! ----------------------------------------------------------------------- 1855 1856 CALL obs_coo_grd( fco2data%nsurf, fco2data%mi, fco2data%mj, & 1857 & fco2data%nqc, igrdobs ) 1858 CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 1859 1860 ! ----------------------------------------------------------------------- 1861 ! Check for land points. 1862 ! ----------------------------------------------------------------------- 1863 1864 CALL obs_coo_spc_2d( fco2data%nsurf, & 1865 & jpi, jpj, & 1866 & fco2data%mi, fco2data%mj, & 1867 & fco2data%rlam, fco2data%rphi, & 1868 & glamt, gphit, & 1869 & tmask(:,:,1), fco2data%nqc, & 1870 & iosdsobs, ilansobs, & 1871 & inlasobs, ld_nea, & 1872 & ibdysobs, ln_bound_reject ) 1873 1874 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 1875 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 1876 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 1877 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 1878 1879 ! ----------------------------------------------------------------------- 1880 ! Copy useful data from the fco2data data structure to 1881 ! the fco2datqc data structure 1882 ! ----------------------------------------------------------------------- 1883 1884 ! Allocate the selection arrays 1885 1886 ALLOCATE( llvalid(fco2data%nsurf) ) 1887 1888 ! We want all data which has qc flags <= 0 1889 1890 llvalid(:) = ( fco2data%nqc(:) <= 10 ) 1891 1892 ! The actual copying 1893 1894 CALL obs_surf_compress( fco2data, fco2datqc, .TRUE., numout, & 1895 & lvalid=llvalid ) 1896 1897 ! Dellocate the selection arrays 1898 DEALLOCATE( llvalid ) 1899 1900 ! ----------------------------------------------------------------------- 1901 ! Print information about what observations are left after qc 1902 ! ----------------------------------------------------------------------- 1903 1904 ! Update the total observation counter array 1905 1906 IF(lwp) THEN 1907 WRITE(numout,*) 1908 WRITE(numout,*) 'obs_pre_fco2 :' 1909 WRITE(numout,*) '~~~~~~~~~~~' 1910 WRITE(numout,*) 1911 WRITE(numout,*) ' fco2 data outside time domain = ', & 1912 & iotdobsmpp 1913 WRITE(numout,*) ' Remaining fco2 data that failed grid search = ', & 1914 & igrdobsmpp 1915 WRITE(numout,*) ' Remaining fco2 data outside space domain = ', & 1916 & iosdsobsmpp 1917 WRITE(numout,*) ' Remaining fco2 data at land points = ', & 1918 & ilansobsmpp 1919 IF (ld_nea) THEN 1920 WRITE(numout,*) ' Remaining fco2 data near land points (removed) = ', & 1921 & inlasobsmpp 1922 ELSE 1923 WRITE(numout,*) ' Remaining fco2 data near land points (kept) = ', & 1924 & inlasobsmpp 1925 ENDIF 1926 WRITE(numout,*) ' Remaining fco2 data near open boundary (removed) = ', & 1927 & ibdysobsmpp 1928 WRITE(numout,*) ' fco2 data accepted = ', & 1929 & fco2datqc%nsurfmpp 1930 1931 WRITE(numout,*) 1932 WRITE(numout,*) ' Number of observations per time step :' 1933 WRITE(numout,*) 1934 WRITE(numout,1997) 1935 WRITE(numout,1998) 1936 ENDIF 1937 1938 DO jobs = 1, fco2datqc%nsurf 1939 inrc = fco2datqc%mstp(jobs) + 2 - nit000 1940 fco2datqc%nsstp(inrc) = fco2datqc%nsstp(inrc) + 1 1941 END DO 1942 1943 CALL obs_mpp_sum_integers( fco2datqc%nsstp, fco2datqc%nsstpmpp, & 1944 & nitend - nit000 + 2 ) 1945 1946 IF ( lwp ) THEN 1947 DO jstp = nit000 - 1, nitend 1948 inrc = jstp - nit000 + 2 1949 WRITE(numout,1999) jstp, fco2datqc%nsstpmpp(inrc) 1950 END DO 1951 ENDIF 1952 1953 1997 FORMAT(10X,'Time step',5X,'fco2 data') 1954 1998 FORMAT(10X,'---------',5X,'------------') 1955 1999 FORMAT(10X,I9,5X,I17) 1956 1957 END SUBROUTINE obs_pre_fco2 1958 1959 SUBROUTINE obs_pre_pco2( pco2data, pco2datqc, ld_pco2, ld_nea ) 1960 !!---------------------------------------------------------------------- 1961 !! *** ROUTINE obs_pre_pco2 *** 1962 !! 1963 !! ** Purpose : First level check and screening of pco2 observations 1964 !! 1965 !! ** Method : First level check and screening of pco2 observations 1966 !! 1967 !! ** Action : 1968 !! 1969 !! References : 1970 !! 1971 !! History : 1972 !!---------------------------------------------------------------------- 1973 !! * Modules used 1974 USE domstp ! Domain: set the time-step 1975 USE par_oce ! Ocean parameters 1976 USE dom_oce, ONLY : & ! Geographical information 1977 & glamt, & 1978 & gphit, & 1979 & tmask 1980 !! * Arguments 1981 TYPE(obs_surf), INTENT(INOUT) :: pco2data ! Full set of pco2 data 1982 TYPE(obs_surf), INTENT(INOUT) :: pco2datqc ! Subset of pco2 data not failing screening 1983 LOGICAL :: ld_pco2 ! Switch for pco2 data 1984 LOGICAL :: ld_nea ! Switch for rejecting observation near land 1985 !! * Local declarations 1986 INTEGER :: iyea0 ! Initial date 1987 INTEGER :: imon0 ! - (year, month, day, hour, minute) 1988 INTEGER :: iday0 1989 INTEGER :: ihou0 1990 INTEGER :: imin0 1991 INTEGER :: icycle ! Current assimilation cycle 1992 ! Counters for observations that 1993 INTEGER :: iotdobs ! - outside time domain 1994 INTEGER :: iosdsobs ! - outside space domain 1995 INTEGER :: ilansobs ! - within a model land cell 1996 INTEGER :: inlasobs ! - close to land 1997 INTEGER :: igrdobs ! - fail the grid search 1998 INTEGER :: ibdysobs ! - close to open boundary 1999 ! Global counters for observations that 2000 INTEGER :: iotdobsmpp ! - outside time domain 2001 INTEGER :: iosdsobsmpp ! - outside space domain 2002 INTEGER :: ilansobsmpp ! - within a model land cell 2003 INTEGER :: inlasobsmpp ! - close to land 2004 INTEGER :: igrdobsmpp ! - fail the grid search 2005 INTEGER :: ibdysobsmpp ! - close to open boundary 2006 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 2007 & llvalid ! data selection 2008 INTEGER :: jobs ! Obs. loop variable 2009 INTEGER :: jstp ! Time loop variable 2010 INTEGER :: inrc ! Time index variable 2011 INTEGER :: irec ! Record index 2012 2013 IF (lwp) WRITE(numout,*)'obs_pre_pco2 : Preparing the pco2 observations...' 2014 2015 ! Initial date initialization (year, month, day, hour, minute) 2016 iyea0 = ndate0 / 10000 2017 imon0 = ( ndate0 - iyea0 * 10000 ) / 100 2018 iday0 = ndate0 - iyea0 * 10000 - imon0 * 100 2019 ihou0 = 0 2020 imin0 = 0 2021 2022 icycle = no ! Assimilation cycle 2023 2024 ! Diagnostics counters for various failures. 2025 2026 iotdobs = 0 2027 igrdobs = 0 2028 iosdsobs = 0 2029 ilansobs = 0 2030 inlasobs = 0 2031 ibdysobs = 0 2032 2033 ! ----------------------------------------------------------------------- 2034 ! Find time coordinate for pco2 data 2035 ! ----------------------------------------------------------------------- 2036 2037 CALL obs_coo_tim( icycle, & 2038 & iyea0, imon0, iday0, ihou0, imin0, & 2039 & pco2data%nsurf, pco2data%nyea, pco2data%nmon, & 2040 & pco2data%nday, pco2data%nhou, pco2data%nmin, & 2041 & pco2data%nqc, pco2data%mstp, iotdobs ) 2042 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 2043 ! ----------------------------------------------------------------------- 2044 ! Check for pco2 data failing the grid search 2045 ! ----------------------------------------------------------------------- 2046 2047 CALL obs_coo_grd( pco2data%nsurf, pco2data%mi, pco2data%mj, & 2048 & pco2data%nqc, igrdobs ) 2049 CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 2050 2051 ! ----------------------------------------------------------------------- 2052 ! Check for land points. 2053 ! ----------------------------------------------------------------------- 2054 2055 CALL obs_coo_spc_2d( pco2data%nsurf, & 2056 & jpi, jpj, & 2057 & pco2data%mi, pco2data%mj, & 2058 & pco2data%rlam, pco2data%rphi, & 2059 & glamt, gphit, & 2060 & tmask(:,:,1), pco2data%nqc, & 2061 & iosdsobs, ilansobs, & 2062 & inlasobs, ld_nea, & 2063 & ibdysobs, ln_bound_reject ) 2064 2065 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 2066 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 2067 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 2068 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 2069 2070 ! ----------------------------------------------------------------------- 2071 ! Copy useful data from the pco2data data structure to 2072 ! the pco2datqc data structure 2073 ! ----------------------------------------------------------------------- 2074 2075 ! Allocate the selection arrays 2076 2077 ALLOCATE( llvalid(pco2data%nsurf) ) 2078 2079 ! We want all data which has qc flags <= 0 2080 2081 llvalid(:) = ( pco2data%nqc(:) <= 10 ) 2082 2083 ! The actual copying 2084 2085 CALL obs_surf_compress( pco2data, pco2datqc, .TRUE., numout, & 2086 & lvalid=llvalid ) 2087 2088 ! Dellocate the selection arrays 2089 DEALLOCATE( llvalid ) 2090 2091 ! ----------------------------------------------------------------------- 2092 ! Print information about what observations are left after qc 2093 ! ----------------------------------------------------------------------- 2094 2095 ! Update the total observation counter array 2096 2097 IF(lwp) THEN 2098 WRITE(numout,*) 2099 WRITE(numout,*) 'obs_pre_pco2 :' 2100 WRITE(numout,*) '~~~~~~~~~~~' 2101 WRITE(numout,*) 2102 WRITE(numout,*) ' pco2 data outside time domain = ', & 2103 & iotdobsmpp 2104 WRITE(numout,*) ' Remaining pco2 data that failed grid search = ', & 2105 & igrdobsmpp 2106 WRITE(numout,*) ' Remaining pco2 data outside space domain = ', & 2107 & iosdsobsmpp 2108 WRITE(numout,*) ' Remaining pco2 data at land points = ', & 2109 & ilansobsmpp 2110 IF (ld_nea) THEN 2111 WRITE(numout,*) ' Remaining pco2 data near land points (removed) = ', & 2112 & inlasobsmpp 2113 ELSE 2114 WRITE(numout,*) ' Remaining pco2 data near land points (kept) = ', & 2115 & inlasobsmpp 2116 ENDIF 2117 WRITE(numout,*) ' Remaining pco2 data near open boundary (removed) = ', & 2118 & ibdysobsmpp 2119 WRITE(numout,*) ' pco2 data accepted = ', & 2120 & pco2datqc%nsurfmpp 2121 2122 WRITE(numout,*) 2123 WRITE(numout,*) ' Number of observations per time step :' 2124 WRITE(numout,*) 2125 WRITE(numout,1997) 2126 WRITE(numout,1998) 2127 ENDIF 2128 2129 DO jobs = 1, pco2datqc%nsurf 2130 inrc = pco2datqc%mstp(jobs) + 2 - nit000 2131 pco2datqc%nsstp(inrc) = pco2datqc%nsstp(inrc) + 1 2132 END DO 2133 2134 CALL obs_mpp_sum_integers( pco2datqc%nsstp, pco2datqc%nsstpmpp, & 2135 & nitend - nit000 + 2 ) 2136 2137 IF ( lwp ) THEN 2138 DO jstp = nit000 - 1, nitend 2139 inrc = jstp - nit000 + 2 2140 WRITE(numout,1999) jstp, pco2datqc%nsstpmpp(inrc) 2141 END DO 2142 ENDIF 2143 2144 1997 FORMAT(10X,'Time step',5X,'pco2 data') 2145 1998 FORMAT(10X,'---------',5X,'------------') 2146 1999 FORMAT(10X,I9,5X,I17) 2147 2148 END SUBROUTINE obs_pre_pco2 2149 1378 2150 SUBROUTINE obs_coo_tim( kcycle, & 1379 2151 & kyea0, kmon0, kday0, khou0, kmin0, & -
branches/UKMO/dev_r4650_general_vert_coord_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
r5838 r7713 11 11 !! obs_wri_seaice: Write seaice observation related diagnostics 12 12 !! obs_wri_vel : Write velocity observation diagnostics in NetCDF format 13 !! obs_wri_logchl: Write logchl observation related diagnostics 14 !! obs_wri_spm : Write spm observation related diagnostics 15 !! obs_wri_fco2 : Write fco2 observation related diagnostics 16 !! obs_wri_pco2 : Write fco2 observation related diagnostics 13 17 !! obs_wri_stats : Print basic statistics on the data being written out 14 18 !!---------------------------------------------------------------------- … … 45 49 & obs_wri_seaice, & ! Write seaice observation related diagnostics 46 50 & obs_wri_vel, & ! Write velocity observation related diagnostics 51 & obs_wri_logchl, & ! Write logchl observation related diagnostics 52 & obs_wri_spm, & ! Write spm observation related diagnostics 53 & obs_wri_fco2, & ! Write fco2 observation related diagnostics 54 & obs_wri_pco2, & ! Write pco2 observation related diagnostics 47 55 & obswriinfo 48 56 … … 930 938 END SUBROUTINE obs_wri_vel 931 939 940 SUBROUTINE obs_wri_logchl( cprefix, logchldata, padd, pext ) 941 !!----------------------------------------------------------------------- 942 !! 943 !! *** ROUTINE obs_wri_logchl *** 944 !! 945 !! ** Purpose : Write logchl observation diagnostics 946 !! related 947 !! 948 !! ** Method : NetCDF 949 !! 950 !! ** Action : 951 !! 952 !!----------------------------------------------------------------------- 953 954 !! * Modules used 955 IMPLICIT NONE 956 957 !! * Arguments 958 CHARACTER(LEN=*), INTENT(IN) :: cprefix ! Prefix for output files 959 TYPE(obs_surf), INTENT(INOUT) :: logchldata ! Full set of logchl 960 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 961 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 962 963 !! * Local declarations 964 TYPE(obfbdata) :: fbdata 965 CHARACTER(LEN=40) :: cfname ! netCDF filename 966 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_logchl' 967 INTEGER :: jo 968 INTEGER :: ja 969 INTEGER :: je 970 INTEGER :: nadd 971 INTEGER :: next 972 973 IF ( PRESENT( padd ) ) THEN 974 nadd = padd%inum 975 ELSE 976 nadd = 0 977 ENDIF 978 979 IF ( PRESENT( pext ) ) THEN 980 next = pext%inum 981 ELSE 982 next = 0 983 ENDIF 984 985 CALL init_obfbdata( fbdata ) 986 987 CALL alloc_obfbdata( fbdata, 1, logchldata%nsurf, 1, & 988 & 1 + nadd, next, .TRUE. ) 989 990 fbdata%cname(1) = 'LOGCHL' 991 fbdata%coblong(1) = 'logchl concentration' 992 fbdata%cobunit(1) = 'mg/m3' 993 DO je = 1, next 994 fbdata%cextname(je) = pext%cdname(je) 995 fbdata%cextlong(je) = pext%cdlong(je,1) 996 fbdata%cextunit(je) = pext%cdunit(je,1) 997 END DO 998 fbdata%caddname(1) = 'Hx' 999 fbdata%caddlong(1,1) = 'Model interpolated LOGCHL' 1000 fbdata%caddunit(1,1) = 'mg/m3' 1001 fbdata%cgrid(1) = 'T' 1002 DO ja = 1, nadd 1003 fbdata%caddname(1+ja) = padd%cdname(ja) 1004 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 1005 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 1006 END DO 1007 1008 WRITE(cfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cprefix), nproc 1009 1010 IF(lwp) THEN 1011 WRITE(numout,*) 1012 WRITE(numout,*)'obs_wri_logchl :' 1013 WRITE(numout,*)'~~~~~~~~~~~~~~~~' 1014 WRITE(numout,*)'Writing logchl feedback file : ',TRIM(cfname) 1015 ENDIF 1016 1017 ! Transform obs_prof data structure into obfbdata structure 1018 fbdata%cdjuldref = '19500101000000' 1019 DO jo = 1, logchldata%nsurf 1020 fbdata%plam(jo) = logchldata%rlam(jo) 1021 fbdata%pphi(jo) = logchldata%rphi(jo) 1022 WRITE(fbdata%cdtyp(jo),'(I4)') logchldata%ntyp(jo) 1023 fbdata%ivqc(jo,:) = 0 1024 fbdata%ivqcf(:,jo,:) = 0 1025 IF ( logchldata%nqc(jo) > 10 ) THEN 1026 fbdata%ioqc(jo) = 4 1027 fbdata%ioqcf(1,jo) = 0 1028 fbdata%ioqcf(2,jo) = logchldata%nqc(jo) - 10 1029 ELSE 1030 fbdata%ioqc(jo) = MAX(logchldata%nqc(jo),1) 1031 fbdata%ioqcf(:,jo) = 0 1032 ENDIF 1033 fbdata%ipqc(jo) = 0 1034 fbdata%ipqcf(:,jo) = 0 1035 fbdata%itqc(jo) = 0 1036 fbdata%itqcf(:,jo) = 0 1037 fbdata%cdwmo(jo) = '' 1038 fbdata%kindex(jo) = logchldata%nsfil(jo) 1039 IF (ln_grid_global) THEN 1040 fbdata%iobsi(jo,1) = logchldata%mi(jo) 1041 fbdata%iobsj(jo,1) = logchldata%mj(jo) 1042 ELSE 1043 fbdata%iobsi(jo,1) = mig(logchldata%mi(jo)) 1044 fbdata%iobsj(jo,1) = mjg(logchldata%mj(jo)) 1045 ENDIF 1046 CALL greg2jul( 0, & 1047 & logchldata%nmin(jo), & 1048 & logchldata%nhou(jo), & 1049 & logchldata%nday(jo), & 1050 & logchldata%nmon(jo), & 1051 & logchldata%nyea(jo), & 1052 & fbdata%ptim(jo), & 1053 & krefdate = 19500101 ) 1054 fbdata%padd(1,jo,1,1) = logchldata%rmod(jo,1) 1055 fbdata%pob(1,jo,1) = logchldata%robs(jo,1) 1056 fbdata%pdep(1,jo) = 0.0 1057 fbdata%idqc(1,jo) = 0 1058 fbdata%idqcf(:,1,jo) = 0 1059 IF ( logchldata%nqc(jo) > 10 ) THEN 1060 fbdata%ivlqc(1,jo,1) = 4 1061 fbdata%ivlqcf(1,1,jo,1) = 0 1062 fbdata%ivlqcf(2,1,jo,1) = logchldata%nqc(jo) - 10 1063 ELSE 1064 fbdata%ivlqc(1,jo,1) = MAX(logchldata%nqc(jo),1) 1065 fbdata%ivlqcf(:,1,jo,1) = 0 1066 ENDIF 1067 fbdata%iobsk(1,jo,1) = 0 1068 DO ja = 1, nadd 1069 fbdata%padd(1,jo,1+ja,1) = & 1070 & logchldata%rext(jo,padd%ipoint(ja)) 1071 END DO 1072 DO je = 1, next 1073 fbdata%pext(1,jo,je) = & 1074 & logchldata%rext(jo,pext%ipoint(je)) 1075 END DO 1076 1077 END DO 1078 1079 ! Write the obfbdata structure 1080 CALL write_obfbdata( cfname, fbdata ) 1081 1082 ! Output some basic statistics 1083 CALL obs_wri_stats( fbdata ) 1084 1085 CALL dealloc_obfbdata( fbdata ) 1086 1087 END SUBROUTINE obs_wri_logchl 1088 1089 SUBROUTINE obs_wri_spm( cprefix, spmdata, padd, pext ) 1090 !!----------------------------------------------------------------------- 1091 !! 1092 !! *** ROUTINE obs_wri_spm *** 1093 !! 1094 !! ** Purpose : Write spm observation diagnostics 1095 !! related 1096 !! 1097 !! ** Method : NetCDF 1098 !! 1099 !! ** Action : 1100 !! 1101 !!----------------------------------------------------------------------- 1102 1103 !! * Modules used 1104 IMPLICIT NONE 1105 1106 !! * Arguments 1107 CHARACTER(LEN=*), INTENT(IN) :: cprefix ! Prefix for output files 1108 TYPE(obs_surf), INTENT(INOUT) :: spmdata ! Full set of spm 1109 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 1110 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 1111 1112 !! * Local declarations 1113 TYPE(obfbdata) :: fbdata 1114 CHARACTER(LEN=40) :: cfname ! netCDF filename 1115 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_spm' 1116 INTEGER :: jo 1117 INTEGER :: ja 1118 INTEGER :: je 1119 INTEGER :: nadd 1120 INTEGER :: next 1121 1122 IF ( PRESENT( padd ) ) THEN 1123 nadd = padd%inum 1124 ELSE 1125 nadd = 0 1126 ENDIF 1127 1128 IF ( PRESENT( pext ) ) THEN 1129 next = pext%inum 1130 ELSE 1131 next = 0 1132 ENDIF 1133 1134 CALL init_obfbdata( fbdata ) 1135 1136 CALL alloc_obfbdata( fbdata, 1, spmdata%nsurf, 1, & 1137 & 1 + nadd, next, .TRUE. ) 1138 1139 fbdata%cname(1) = 'spm' 1140 fbdata%coblong(1) = 'spm' 1141 fbdata%cobunit(1) = 'g/m3' 1142 DO je = 1, next 1143 fbdata%cextname(je) = pext%cdname(je) 1144 fbdata%cextlong(je) = pext%cdlong(je,1) 1145 fbdata%cextunit(je) = pext%cdunit(je,1) 1146 END DO 1147 fbdata%caddname(1) = 'Hx' 1148 fbdata%caddlong(1,1) = 'Model interpolated spm' 1149 fbdata%caddunit(1,1) = 'g/m3' 1150 fbdata%cgrid(1) = 'T' 1151 DO ja = 1, nadd 1152 fbdata%caddname(1+ja) = padd%cdname(ja) 1153 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 1154 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 1155 END DO 1156 1157 WRITE(cfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cprefix), nproc 1158 1159 IF(lwp) THEN 1160 WRITE(numout,*) 1161 WRITE(numout,*)'obs_wri_spm :' 1162 WRITE(numout,*)'~~~~~~~~~~~~~~~~' 1163 WRITE(numout,*)'Writing spm feedback file : ',TRIM(cfname) 1164 ENDIF 1165 1166 ! Transform obs_prof data structure into obfbdata structure 1167 fbdata%cdjuldref = '19500101000000' 1168 DO jo = 1, spmdata%nsurf 1169 fbdata%plam(jo) = spmdata%rlam(jo) 1170 fbdata%pphi(jo) = spmdata%rphi(jo) 1171 WRITE(fbdata%cdtyp(jo),'(I4)') spmdata%ntyp(jo) 1172 fbdata%ivqc(jo,:) = 0 1173 fbdata%ivqcf(:,jo,:) = 0 1174 IF ( spmdata%nqc(jo) > 10 ) THEN 1175 fbdata%ioqc(jo) = 4 1176 fbdata%ioqcf(1,jo) = 0 1177 fbdata%ioqcf(2,jo) = spmdata%nqc(jo) - 10 1178 ELSE 1179 fbdata%ioqc(jo) = MAX(spmdata%nqc(jo),1) 1180 fbdata%ioqcf(:,jo) = 0 1181 ENDIF 1182 fbdata%ipqc(jo) = 0 1183 fbdata%ipqcf(:,jo) = 0 1184 fbdata%itqc(jo) = 0 1185 fbdata%itqcf(:,jo) = 0 1186 fbdata%cdwmo(jo) = '' 1187 fbdata%kindex(jo) = spmdata%nsfil(jo) 1188 IF (ln_grid_global) THEN 1189 fbdata%iobsi(jo,1) = spmdata%mi(jo) 1190 fbdata%iobsj(jo,1) = spmdata%mj(jo) 1191 ELSE 1192 fbdata%iobsi(jo,1) = mig(spmdata%mi(jo)) 1193 fbdata%iobsj(jo,1) = mjg(spmdata%mj(jo)) 1194 ENDIF 1195 CALL greg2jul( 0, & 1196 & spmdata%nmin(jo), & 1197 & spmdata%nhou(jo), & 1198 & spmdata%nday(jo), & 1199 & spmdata%nmon(jo), & 1200 & spmdata%nyea(jo), & 1201 & fbdata%ptim(jo), & 1202 & krefdate = 19500101 ) 1203 fbdata%padd(1,jo,1,1) = spmdata%rmod(jo,1) 1204 fbdata%pob(1,jo,1) = spmdata%robs(jo,1) 1205 fbdata%pdep(1,jo) = 0.0 1206 fbdata%idqc(1,jo) = 0 1207 fbdata%idqcf(:,1,jo) = 0 1208 IF ( spmdata%nqc(jo) > 10 ) THEN 1209 fbdata%ivlqc(1,jo,1) = 4 1210 fbdata%ivlqcf(1,1,jo,1) = 0 1211 fbdata%ivlqcf(2,1,jo,1) = spmdata%nqc(jo) - 10 1212 ELSE 1213 fbdata%ivlqc(1,jo,1) = MAX(spmdata%nqc(jo),1) 1214 fbdata%ivlqcf(:,1,jo,1) = 0 1215 ENDIF 1216 fbdata%iobsk(1,jo,1) = 0 1217 DO ja = 1, nadd 1218 fbdata%padd(1,jo,1+ja,1) = & 1219 & spmdata%rext(jo,padd%ipoint(ja)) 1220 END DO 1221 DO je = 1, next 1222 fbdata%pext(1,jo,je) = & 1223 & spmdata%rext(jo,pext%ipoint(je)) 1224 END DO 1225 1226 END DO 1227 1228 ! Write the obfbdata structure 1229 CALL write_obfbdata( cfname, fbdata ) 1230 1231 ! Output some basic statistics 1232 CALL obs_wri_stats( fbdata ) 1233 1234 CALL dealloc_obfbdata( fbdata ) 1235 1236 END SUBROUTINE obs_wri_spm 1237 1238 SUBROUTINE obs_wri_fco2( cprefix, fco2data, padd, pext ) 1239 !!----------------------------------------------------------------------- 1240 !! 1241 !! *** ROUTINE obs_wri_fco2 *** 1242 !! 1243 !! ** Purpose : Write fco2 observation diagnostics 1244 !! related 1245 !! 1246 !! ** Method : NetCDF 1247 !! 1248 !! ** Action : 1249 !! 1250 !!----------------------------------------------------------------------- 1251 1252 !! * Modules used 1253 IMPLICIT NONE 1254 1255 !! * Arguments 1256 CHARACTER(LEN=*), INTENT(IN) :: cprefix ! Prefix for output files 1257 TYPE(obs_surf), INTENT(INOUT) :: fco2data ! Full set of fco2 1258 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 1259 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 1260 1261 !! * Local declarations 1262 TYPE(obfbdata) :: fbdata 1263 CHARACTER(LEN=40) :: cfname ! netCDF filename 1264 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_fco2' 1265 INTEGER :: jo 1266 INTEGER :: ja 1267 INTEGER :: je 1268 INTEGER :: nadd 1269 INTEGER :: next 1270 1271 IF ( PRESENT( padd ) ) THEN 1272 nadd = padd%inum 1273 ELSE 1274 nadd = 0 1275 ENDIF 1276 1277 IF ( PRESENT( pext ) ) THEN 1278 next = pext%inum 1279 ELSE 1280 next = 0 1281 ENDIF 1282 1283 CALL init_obfbdata( fbdata ) 1284 1285 CALL alloc_obfbdata( fbdata, 1, fco2data%nsurf, 1, & 1286 & 1 + nadd, next, .TRUE. ) 1287 1288 fbdata%cname(1) = 'fco2' 1289 fbdata%coblong(1) = 'fco2' 1290 fbdata%cobunit(1) = 'uatm' 1291 DO je = 1, next 1292 fbdata%cextname(je) = pext%cdname(je) 1293 fbdata%cextlong(je) = pext%cdlong(je,1) 1294 fbdata%cextunit(je) = pext%cdunit(je,1) 1295 END DO 1296 fbdata%caddname(1) = 'Hx' 1297 fbdata%caddlong(1,1) = 'Model interpolated fco2' 1298 fbdata%caddunit(1,1) = 'uatm' 1299 fbdata%cgrid(1) = 'T' 1300 DO ja = 1, nadd 1301 fbdata%caddname(1+ja) = padd%cdname(ja) 1302 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 1303 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 1304 END DO 1305 1306 WRITE(cfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cprefix), nproc 1307 1308 IF(lwp) THEN 1309 WRITE(numout,*) 1310 WRITE(numout,*)'obs_wri_fco2 :' 1311 WRITE(numout,*)'~~~~~~~~~~~~~~~~' 1312 WRITE(numout,*)'Writing fco2 feedback file : ',TRIM(cfname) 1313 ENDIF 1314 1315 ! Transform obs_prof data structure into obfbdata structure 1316 fbdata%cdjuldref = '19500101000000' 1317 DO jo = 1, fco2data%nsurf 1318 fbdata%plam(jo) = fco2data%rlam(jo) 1319 fbdata%pphi(jo) = fco2data%rphi(jo) 1320 WRITE(fbdata%cdtyp(jo),'(I4)') fco2data%ntyp(jo) 1321 fbdata%ivqc(jo,:) = 0 1322 fbdata%ivqcf(:,jo,:) = 0 1323 IF ( fco2data%nqc(jo) > 10 ) THEN 1324 fbdata%ioqc(jo) = 4 1325 fbdata%ioqcf(1,jo) = 0 1326 fbdata%ioqcf(2,jo) = fco2data%nqc(jo) - 10 1327 ELSE 1328 fbdata%ioqc(jo) = MAX(fco2data%nqc(jo),1) 1329 fbdata%ioqcf(:,jo) = 0 1330 ENDIF 1331 fbdata%ipqc(jo) = 0 1332 fbdata%ipqcf(:,jo) = 0 1333 fbdata%itqc(jo) = 0 1334 fbdata%itqcf(:,jo) = 0 1335 fbdata%cdwmo(jo) = '' 1336 fbdata%kindex(jo) = fco2data%nsfil(jo) 1337 IF (ln_grid_global) THEN 1338 fbdata%iobsi(jo,1) = fco2data%mi(jo) 1339 fbdata%iobsj(jo,1) = fco2data%mj(jo) 1340 ELSE 1341 fbdata%iobsi(jo,1) = mig(fco2data%mi(jo)) 1342 fbdata%iobsj(jo,1) = mjg(fco2data%mj(jo)) 1343 ENDIF 1344 CALL greg2jul( 0, & 1345 & fco2data%nmin(jo), & 1346 & fco2data%nhou(jo), & 1347 & fco2data%nday(jo), & 1348 & fco2data%nmon(jo), & 1349 & fco2data%nyea(jo), & 1350 & fbdata%ptim(jo), & 1351 & krefdate = 19500101 ) 1352 fbdata%padd(1,jo,1,1) = fco2data%rmod(jo,1) 1353 fbdata%pob(1,jo,1) = fco2data%robs(jo,1) 1354 fbdata%pdep(1,jo) = 0.0 1355 fbdata%idqc(1,jo) = 0 1356 fbdata%idqcf(:,1,jo) = 0 1357 IF ( fco2data%nqc(jo) > 10 ) THEN 1358 fbdata%ivlqc(1,jo,1) = 4 1359 fbdata%ivlqcf(1,1,jo,1) = 0 1360 fbdata%ivlqcf(2,1,jo,1) = fco2data%nqc(jo) - 10 1361 ELSE 1362 fbdata%ivlqc(1,jo,1) = MAX(fco2data%nqc(jo),1) 1363 fbdata%ivlqcf(:,1,jo,1) = 0 1364 ENDIF 1365 fbdata%iobsk(1,jo,1) = 0 1366 DO ja = 1, nadd 1367 fbdata%padd(1,jo,1+ja,1) = & 1368 & fco2data%rext(jo,padd%ipoint(ja)) 1369 END DO 1370 DO je = 1, next 1371 fbdata%pext(1,jo,je) = & 1372 & fco2data%rext(jo,pext%ipoint(je)) 1373 END DO 1374 1375 END DO 1376 1377 ! Write the obfbdata structure 1378 CALL write_obfbdata( cfname, fbdata ) 1379 1380 ! Output some basic statistics 1381 CALL obs_wri_stats( fbdata ) 1382 1383 CALL dealloc_obfbdata( fbdata ) 1384 1385 END SUBROUTINE obs_wri_fco2 1386 1387 SUBROUTINE obs_wri_pco2( cprefix, pco2data, padd, pext ) 1388 !!----------------------------------------------------------------------- 1389 !! 1390 !! *** ROUTINE obs_wri_pco2 *** 1391 !! 1392 !! ** Purpose : Write pco2 observation diagnostics 1393 !! related 1394 !! 1395 !! ** Method : NetCDF 1396 !! 1397 !! ** Action : 1398 !! 1399 !!----------------------------------------------------------------------- 1400 1401 !! * Modules used 1402 IMPLICIT NONE 1403 1404 !! * Arguments 1405 CHARACTER(LEN=*), INTENT(IN) :: cprefix ! Prefix for output files 1406 TYPE(obs_surf), INTENT(INOUT) :: pco2data ! Full set of pco2 1407 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 1408 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 1409 1410 !! * Local declarations 1411 TYPE(obfbdata) :: fbdata 1412 CHARACTER(LEN=40) :: cfname ! netCDF filename 1413 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_pco2' 1414 INTEGER :: jo 1415 INTEGER :: ja 1416 INTEGER :: je 1417 INTEGER :: nadd 1418 INTEGER :: next 1419 1420 IF ( PRESENT( padd ) ) THEN 1421 nadd = padd%inum 1422 ELSE 1423 nadd = 0 1424 ENDIF 1425 1426 IF ( PRESENT( pext ) ) THEN 1427 next = pext%inum 1428 ELSE 1429 next = 0 1430 ENDIF 1431 1432 CALL init_obfbdata( fbdata ) 1433 1434 CALL alloc_obfbdata( fbdata, 1, pco2data%nsurf, 1, & 1435 & 1 + nadd, next, .TRUE. ) 1436 1437 fbdata%cname(1) = 'pco2' 1438 fbdata%coblong(1) = 'pco2' 1439 fbdata%cobunit(1) = 'uatm' 1440 DO je = 1, next 1441 fbdata%cextname(je) = pext%cdname(je) 1442 fbdata%cextlong(je) = pext%cdlong(je,1) 1443 fbdata%cextunit(je) = pext%cdunit(je,1) 1444 END DO 1445 fbdata%caddname(1) = 'Hx' 1446 fbdata%caddlong(1,1) = 'Model interpolated pco2' 1447 fbdata%caddunit(1,1) = 'uatm' 1448 fbdata%cgrid(1) = 'T' 1449 DO ja = 1, nadd 1450 fbdata%caddname(1+ja) = padd%cdname(ja) 1451 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 1452 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 1453 END DO 1454 1455 WRITE(cfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cprefix), nproc 1456 1457 IF(lwp) THEN 1458 WRITE(numout,*) 1459 WRITE(numout,*)'obs_wri_pco2 :' 1460 WRITE(numout,*)'~~~~~~~~~~~~~~~~' 1461 WRITE(numout,*)'Writing pco2 feedback file : ',TRIM(cfname) 1462 ENDIF 1463 1464 ! Transform obs_prof data structure into obfbdata structure 1465 fbdata%cdjuldref = '19500101000000' 1466 DO jo = 1, pco2data%nsurf 1467 fbdata%plam(jo) = pco2data%rlam(jo) 1468 fbdata%pphi(jo) = pco2data%rphi(jo) 1469 WRITE(fbdata%cdtyp(jo),'(I4)') pco2data%ntyp(jo) 1470 fbdata%ivqc(jo,:) = 0 1471 fbdata%ivqcf(:,jo,:) = 0 1472 IF ( pco2data%nqc(jo) > 10 ) THEN 1473 fbdata%ioqc(jo) = 4 1474 fbdata%ioqcf(1,jo) = 0 1475 fbdata%ioqcf(2,jo) = pco2data%nqc(jo) - 10 1476 ELSE 1477 fbdata%ioqc(jo) = MAX(pco2data%nqc(jo),1) 1478 fbdata%ioqcf(:,jo) = 0 1479 ENDIF 1480 fbdata%ipqc(jo) = 0 1481 fbdata%ipqcf(:,jo) = 0 1482 fbdata%itqc(jo) = 0 1483 fbdata%itqcf(:,jo) = 0 1484 fbdata%cdwmo(jo) = '' 1485 fbdata%kindex(jo) = pco2data%nsfil(jo) 1486 IF (ln_grid_global) THEN 1487 fbdata%iobsi(jo,1) = pco2data%mi(jo) 1488 fbdata%iobsj(jo,1) = pco2data%mj(jo) 1489 ELSE 1490 fbdata%iobsi(jo,1) = mig(pco2data%mi(jo)) 1491 fbdata%iobsj(jo,1) = mjg(pco2data%mj(jo)) 1492 ENDIF 1493 CALL greg2jul( 0, & 1494 & pco2data%nmin(jo), & 1495 & pco2data%nhou(jo), & 1496 & pco2data%nday(jo), & 1497 & pco2data%nmon(jo), & 1498 & pco2data%nyea(jo), & 1499 & fbdata%ptim(jo), & 1500 & krefdate = 19500101 ) 1501 fbdata%padd(1,jo,1,1) = pco2data%rmod(jo,1) 1502 fbdata%pob(1,jo,1) = pco2data%robs(jo,1) 1503 fbdata%pdep(1,jo) = 0.0 1504 fbdata%idqc(1,jo) = 0 1505 fbdata%idqcf(:,1,jo) = 0 1506 IF ( pco2data%nqc(jo) > 10 ) THEN 1507 fbdata%ivlqc(1,jo,1) = 4 1508 fbdata%ivlqcf(1,1,jo,1) = 0 1509 fbdata%ivlqcf(2,1,jo,1) = pco2data%nqc(jo) - 10 1510 ELSE 1511 fbdata%ivlqc(1,jo,1) = MAX(pco2data%nqc(jo),1) 1512 fbdata%ivlqcf(:,1,jo,1) = 0 1513 ENDIF 1514 fbdata%iobsk(1,jo,1) = 0 1515 DO ja = 1, nadd 1516 fbdata%padd(1,jo,1+ja,1) = & 1517 & pco2data%rext(jo,padd%ipoint(ja)) 1518 END DO 1519 DO je = 1, next 1520 fbdata%pext(1,jo,je) = & 1521 & pco2data%rext(jo,pext%ipoint(je)) 1522 END DO 1523 1524 END DO 1525 1526 ! Write the obfbdata structure 1527 CALL write_obfbdata( cfname, fbdata ) 1528 1529 ! Output some basic statistics 1530 CALL obs_wri_stats( fbdata ) 1531 1532 CALL dealloc_obfbdata( fbdata ) 1533 1534 END SUBROUTINE obs_wri_pco2 1535 932 1536 SUBROUTINE obs_wri_stats( fbdata ) 933 1537 !!-----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.