- Timestamp:
- 2020-08-13T16:44:28+02:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r12610 r13393 51 51 LOGICAL :: ln_sstnight !: Logical switch for night mean SST obs 52 52 LOGICAL :: ln_default_fp_indegs !: T=> Default obs footprint size specified in degrees, F=> in metres 53 LOGICAL :: ln_sla_fp_indegs !: T=> SLA obs footprint size specified in degrees, F=> in metres 54 LOGICAL :: ln_sst_fp_indegs !: T=> SST obs footprint size specified in degrees, F=> in metres 55 LOGICAL :: ln_sss_fp_indegs !: T=> SSS obs footprint size specified in degrees, F=> in metres 53 LOGICAL :: ln_sla_fp_indegs !: T=> SLA obs footprint size specified in degrees, F=> in metres 54 LOGICAL :: ln_sst_fp_indegs !: T=> SST obs footprint size specified in degrees, F=> in metres 55 LOGICAL :: ln_sss_fp_indegs !: T=> SSS obs footprint size specified in degrees, F=> in metres 56 LOGICAL :: ln_ssv_fp_indegs !: T=> SSV obs footprint size specified in degrees, F=> in metres 56 57 LOGICAL :: ln_sic_fp_indegs !: T=> SIC obs footprint size specified in degrees, F=> in metres 57 58 LOGICAL :: ln_sit_fp_indegs !: T=> SIT obs footprint size specified in degrees, F=> in metres … … 67 68 REAL(wp) :: rn_sss_avglamscl !: E/W diameter of SSS observation footprint 68 69 REAL(wp) :: rn_sss_avgphiscl !: N/S diameter of SSS observation footprint 70 REAL(wp) :: rn_ssv_avglamscl !: E/W diameter of SSV observation footprint 71 REAL(wp) :: rn_ssv_avgphiscl !: N/S diameter of SSV observation footprint 69 72 REAL(wp) :: rn_sic_avglamscl !: E/W diameter of SIC observation footprint 70 73 REAL(wp) :: rn_sic_avgphiscl !: N/S diameter of SIC observation footprint … … 80 83 INTEGER :: nn_2dint_sst !: SST horizontal interpolation method (-1 = default) 81 84 INTEGER :: nn_2dint_sss !: SSS horizontal interpolation method (-1 = default) 85 INTEGER :: nn_2dint_ssv !: SSV horizontal interpolation method (-1 = default) 82 86 INTEGER :: nn_2dint_sic !: SIC horizontal interpolation method (-1 = default) 83 87 INTEGER :: nn_2dint_sit !: SIT horizontal interpolation method (-1 = default) … … 169 173 & cn_velfbfiles, & ! Velocity profile input filenames 170 174 & cn_sssfbfiles, & ! Sea surface salinity input filenames 175 & cn_ssvfbfiles, & ! Sea surface velocity input filenames 171 176 & cn_slchltotfbfiles, & ! Surface total log10(chlorophyll) input filenames 172 177 & cn_slchldiafbfiles, & ! Surface diatom log10(chlorophyll) input filenames … … 207 212 LOGICAL :: ln_sit ! Logical switch for sea ice thickness 208 213 LOGICAL :: ln_sss ! Logical switch for sea surface salinity obs 214 LOGICAL :: ln_ssv ! Logical switch for sea surface velocity obs 209 215 LOGICAL :: ln_vel3d ! Logical switch for velocity (u,v) obs 210 216 LOGICAL :: ln_slchltot ! Logical switch for surface total log10(chlorophyll) obs … … 261 267 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 262 268 & zmask ! Model land/sea mask associated with variables 269 REAL(wp), POINTER, DIMENSION(:,:,:) :: & 270 & zmask_surf ! Surface model land/sea mask associated with variables 263 271 264 272 265 273 NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla, & 266 & ln_sst, ln_sic, ln_sit, ln_sss, ln_vel3d, & 274 & ln_sst, ln_sic, ln_sit, ln_sss, & 275 & ln_ssv, ln_vel3d, & 267 276 & ln_slchltot, ln_slchldia, ln_slchlnon, & 268 277 & ln_slchldin, ln_slchlmic, ln_slchlnan, & … … 280 289 & ln_time_mean_sla_bkg, ln_default_fp_indegs, & 281 290 & ln_sla_fp_indegs, ln_sst_fp_indegs, & 282 & ln_sss_fp_indegs, ln_s ic_fp_indegs, &283 & ln_si t_fp_indegs,&291 & ln_sss_fp_indegs, ln_ssv_fp_indegs, & 292 & ln_sic_fp_indegs, ln_sit_fp_indegs, & 284 293 & cn_profbfiles, cn_slafbfiles, & 285 294 & cn_sstfbfiles, cn_sicfbfiles, & 286 & cn_sitfbfiles, 295 & cn_sitfbfiles, cn_ssvfbfiles, & 287 296 & cn_velfbfiles, cn_sssfbfiles, & 288 297 & cn_slchltotfbfiles, cn_slchldiafbfiles, & … … 305 314 & rn_sst_avglamscl, rn_sst_avgphiscl, & 306 315 & rn_sss_avglamscl, rn_sss_avgphiscl, & 316 & rn_ssv_avglamscl, rn_ssv_avgphiscl, & 307 317 & rn_sic_avglamscl, rn_sic_avgphiscl, & 308 318 & rn_sit_avglamscl, rn_sit_avgphiscl, & 309 319 & nn_1dint, nn_2dint_default, & 310 320 & nn_2dint_sla, nn_2dint_sst, & 311 & nn_2dint_sss, nn_2dint_sic, nn_2dint_sit, & 321 & nn_2dint_sss, nn_2dint_ssv, & 322 & nn_2dint_sic, nn_2dint_sit, & 312 323 & nn_msshc, rn_mdtcorr, rn_mdtcutoff, & 313 324 & nn_profdavtypes … … 325 336 cn_velfbfiles(:) = '' 326 337 cn_sssfbfiles(:) = '' 338 cn_ssvfbfiles(:) = '' 327 339 cn_slchltotfbfiles(:) = '' 328 340 cn_slchldiafbfiles(:) = '' … … 389 401 WRITE(numout,*) ' Logical switch for velocity observations ln_vel3d = ', ln_vel3d 390 402 WRITE(numout,*) ' Logical switch for SSS observations ln_sss = ', ln_sss 403 WRITE(numout,*) ' Logical switch for SSV observations ln_ssv = ', ln_ssv 391 404 WRITE(numout,*) ' Logical switch for surface total logchl obs ln_slchltot = ', ln_slchltot 392 405 WRITE(numout,*) ' Logical switch for surface diatom logchl obs ln_slchldia = ', ln_slchldia … … 424 437 WRITE(numout,*) ' Type of horizontal interpolation method for SST nn_2dint_sst = ', nn_2dint_sst 425 438 WRITE(numout,*) ' Type of horizontal interpolation method for SSS nn_2dint_sss = ', nn_2dint_sss 439 WRITE(numout,*) ' Type of horizontal interpolation method for SSV nn_2dint_ssv = ', nn_2dint_ssv 426 440 WRITE(numout,*) ' Type of horizontal interpolation method for SIC nn_2dint_sic = ', nn_2dint_sic 427 441 WRITE(numout,*) ' Type of horizontal interpolation method for SIT nn_2dint_sit = ', nn_2dint_sit … … 462 476 & ln_pchltot, ln_pno3, ln_psi4, ln_ppo4, & 463 477 & ln_pdic, ln_palk, ln_pph, ln_po2 /) ) 464 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_sss, 478 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_sss, ln_ssv, & 465 479 & ln_slchltot, ln_slchldia, ln_slchlnon, ln_slchldin, & 466 480 & ln_slchlmic, ln_slchlnan, ln_slchlpic, ln_schltot, & … … 591 605 cobstypessurf(jtype) = 'sss' 592 606 clsurffiles(jtype,:) = cn_sssfbfiles 607 ENDIF 608 IF (ln_ssv) THEN 609 jtype = jtype + 1 610 cobstypessurf(jtype) = 'ssv' 611 clsurffiles(jtype,:) = cn_ssvfbfiles 593 612 ENDIF 594 613 IF (ln_slchltot) THEN … … 721 740 ztype_avgphiscl = rn_sss_avgphiscl 722 741 ltype_fp_indegs = ln_sss_fp_indegs 742 ltype_night = .FALSE. 743 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 744 IF ( nn_2dint_ssv == -1 ) THEN 745 n2dint_type = nn_2dint_default 746 ELSE 747 n2dint_type = nn_2dint_ssv 748 ENDIF 749 ztype_avglamscl = rn_ssv_avglamscl 750 ztype_avgphiscl = rn_ssv_avgphiscl 751 ltype_fp_indegs = ln_ssv_fp_indegs 723 752 ltype_night = .FALSE. 724 753 ELSE … … 903 932 nvarssurf(jtype) = 1 904 933 nextrsurf(jtype) = 2 934 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 935 nvarssurf(jtype) = 2 936 nextrsurf(jtype) = 0 905 937 ELSE 906 938 nvarssurf(jtype) = 1 … … 909 941 910 942 ALLOCATE( clvars( nvarssurf(jtype) ) ) 911 943 CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zglam ) 944 CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zgphi ) 945 CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 946 947 IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 948 zglam(:,:,1) = glamu(:,:) 949 zglam(:,:,2) = glamv(:,:) 950 zgphi(:,:,1) = gphiu(:,:) 951 zgphi(:,:,2) = gphiv(:,:) 952 zmask_surf(:,:,1) = umask(:,:,1) 953 zmask_surf(:,:,2) = vmask(:,:,1) 954 ELSE 955 DO jvar = 1, nvarssurf(jtype) 956 zglam(:,:,jvar) = glamt(:,:) 957 zgphi(:,:,jvar) = gphit(:,:) 958 zmask_surf(:,:,jvar) = tmask(:,:,1) 959 END DO 960 ENDIF 961 912 962 IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 913 963 clvars(1) = 'SLA' … … 921 971 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sss' ) THEN 922 972 clvars(1) = 'SSS' 973 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 974 clvars(1) = 'UVEL' 975 clvars(2) = 'VVEL' 923 976 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'slchltot' ) THEN 924 977 clvars(1) = 'SLCHLTOT' … … 960 1013 & llnightav(jtype), ltype_clim, ln_time_mean_sla_bkg, clvars ) 961 1014 962 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject, ln_seaicetypes ) 1015 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), & 1016 & jpi, jpj, & 1017 & zmask_surf, zglam, zgphi, & 1018 & ln_nea, ln_bound_reject, ln_seaicetypes ) 963 1019 964 1020 IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN … … 990 1046 991 1047 DEALLOCATE( clvars ) 1048 CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zglam ) 1049 CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zgphi ) 1050 CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 992 1051 993 1052 END DO … … 1094 1153 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 1095 1154 & zprofmask ! Mask associated with zprofvar 1096 REAL(wp), POINTER, DIMENSION(:,: ) :: &1155 REAL(wp), POINTER, DIMENSION(:,:,:) :: & 1097 1156 & zsurfvar, & ! Model values equivalent to surface ob. 1098 1157 & zsurfclim, & ! Climatology values for variables in a surface ob. 1099 1158 & zsurfmask ! Mask associated with surface variable 1100 1159 REAL(wp), POINTER, DIMENSION(:,:,:) :: & 1101 & zglam, & ! Model longitudes for prof variables1102 & zgphi ! Model latitudes for prof variables1160 & zglam, & ! Model longitudes 1161 & zgphi ! Model latitudes 1103 1162 LOGICAL :: llog10 ! Perform log10 transform of variable 1104 1163 #if defined key_fabm … … 1346 1405 1347 1406 IF ( nsurftypes > 0 ) THEN 1348 1349 !Allocate local work arrays 1350 CALL wrk_alloc( jpi, jpj, zsurfvar ) 1351 CALL wrk_alloc( jpi, jpj, zsurfclim ) 1352 CALL wrk_alloc( jpi, jpj, zsurfmask ) 1407 1353 1408 #if defined key_fabm 1354 1409 CALL wrk_alloc( jpi, jpj, jpk, fabm_3d ) … … 1357 1412 DO jtype = 1, nsurftypes 1358 1413 1414 !Allocate local work arrays 1415 CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar ) 1416 CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim ) 1417 CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 1418 CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam ) 1419 CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi ) 1420 1359 1421 !Defaults which might be changed 1360 zsurfmask(:,:) = tmask(:,:,1) 1361 zsurfclim(:,:) = 0._wp 1422 DO jvar = 1, surfdataqc(jtype)%nvar 1423 zsurfmask(:,:,jvar) = tmask(:,:,1) 1424 zsurfclim(:,:,jvar) = 0._wp 1425 zglam(:,:,jvar) = glamt(:,:) 1426 zgphi(:,:,jvar) = gphit(:,:) 1427 END DO 1362 1428 llog10 = .FALSE. 1363 1429 1364 1430 SELECT CASE ( TRIM(cobstypessurf(jtype)) ) 1365 1431 CASE('sst') 1366 zsurfvar(:,: ) = tsn(:,:,1,jp_tem)1367 IF ( ln_output_clim ) zsurfclim(:,: ) = tclim(:,:,1)1432 zsurfvar(:,:,1) = tsn(:,:,1,jp_tem) 1433 IF ( ln_output_clim ) zsurfclim(:,:,1) = tclim(:,:,1) 1368 1434 CASE('sla') 1369 zsurfvar(:,: ) = sshn(:,:)1435 zsurfvar(:,:,1) = sshn(:,:) 1370 1436 CASE('sss') 1371 zsurfvar(:,:) = tsn(:,:,1,jp_sal) 1372 IF ( ln_output_clim ) zsurfclim(:,:) = sclim(:,:,1) 1437 zsurfvar(:,:,1) = tsn(:,:,1,jp_sal) 1438 IF ( ln_output_clim ) zsurfclim(:,:,1) = sclim(:,:,1) 1439 CASE('ssv') 1440 zsurfvar(:,:,1) = un(:,:,1) 1441 zsurfvar(:,:,2) = vn(:,:,1) 1442 zsurfmask(:,:,1) = umask(:,:,1) 1443 zsurfmask(:,:,2) = vmask(:,:,1) 1444 zglam(:,:,1) = glamu(:,:) 1445 zglam(:,:,2) = glamv(:,:) 1446 zgphi(:,:,1) = gphiu(:,:) 1447 zgphi(:,:,2) = gphiv(:,:) 1373 1448 CASE('sic') 1374 1449 IF ( kstp == 0 ) THEN … … 1381 1456 ELSE 1382 1457 #if defined key_cice 1383 zsurfvar(:,: ) = fr_i(:,:)1458 zsurfvar(:,:,1) = fr_i(:,:) 1384 1459 #elif defined key_lim2 || defined key_lim3 1385 zsurfvar(:,: ) = 1._wp - frld(:,:)1460 zsurfvar(:,:,1) = 1._wp - frld(:,:) 1386 1461 #else 1387 1462 CALL ctl_stop( ' Trying to run sea-ice concentration observation operator', & … … 1400 1475 ELSE 1401 1476 #if defined key_cice 1402 zsurfvar(:,: ) = thick_i(:,:)1477 zsurfvar(:,:,1) = thick_i(:,:) 1403 1478 #elif defined key_lim2 || defined key_lim3 1404 1479 CALL ctl_stop( ' No sea-ice thickness observation operator defined for LIM model' ) … … 1412 1487 #if defined key_hadocc 1413 1488 ! Surface chlorophyll from HadOCC 1414 zsurfvar(:,: ) = HADOCC_CHL(:,:,1)1489 zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 1415 1490 #elif defined key_medusa 1416 1491 ! Add non-diatom and diatom surface chlorophyll from MEDUSA 1417 zsurfvar(:,: ) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd)1492 zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 1418 1493 #elif defined key_fabm 1419 1494 ! Add all surface chlorophyll groups from ERSEM 1420 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + &1495 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 1421 1496 & trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 1422 1497 #else … … 1432 1507 #elif defined key_medusa 1433 1508 ! Diatom surface chlorophyll from MEDUSA 1434 zsurfvar(:,: ) = trn(:,:,1,jpchd)1509 zsurfvar(:,:,1) = trn(:,:,1,jpchd) 1435 1510 #elif defined key_fabm 1436 1511 ! Diatom surface chlorophyll from ERSEM 1437 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1)1512 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) 1438 1513 #else 1439 1514 CALL ctl_stop( ' Trying to run slchldia observation operator', & … … 1448 1523 #elif defined key_medusa 1449 1524 ! Non-diatom surface chlorophyll from MEDUSA 1450 zsurfvar(:,: ) = trn(:,:,1,jpchn)1525 zsurfvar(:,:,1) = trn(:,:,1,jpchn) 1451 1526 #elif defined key_fabm 1452 1527 ! Add all non-diatom surface chlorophyll groups from ERSEM 1453 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + &1528 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 1454 1529 & trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 1455 1530 #else … … 1468 1543 #elif defined key_fabm 1469 1544 ! Dinoflagellate surface chlorophyll from ERSEM 1470 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4)1545 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 1471 1546 #else 1472 1547 CALL ctl_stop( ' Trying to run slchldin observation operator', & … … 1484 1559 #elif defined key_fabm 1485 1560 ! Add diatom and dinoflagellate surface chlorophyll from ERSEM 1486 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4)1561 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 1487 1562 #else 1488 1563 CALL ctl_stop( ' Trying to run slchlmic observation operator', & … … 1500 1575 #elif defined key_fabm 1501 1576 ! Nanophytoplankton surface chlorophyll from ERSEM 1502 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2)1577 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) 1503 1578 #else 1504 1579 CALL ctl_stop( ' Trying to run slchlnan observation operator', & … … 1516 1591 #elif defined key_fabm 1517 1592 ! Picophytoplankton surface chlorophyll from ERSEM 1518 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3)1593 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) 1519 1594 #else 1520 1595 CALL ctl_stop( ' Trying to run slchlpic observation operator', & … … 1526 1601 #if defined key_hadocc 1527 1602 ! Surface chlorophyll from HadOCC 1528 zsurfvar(:,: ) = HADOCC_CHL(:,:,1)1603 zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 1529 1604 #elif defined key_medusa 1530 1605 ! Add non-diatom and diatom surface chlorophyll from MEDUSA 1531 zsurfvar(:,: ) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd)1606 zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 1532 1607 #elif defined key_fabm 1533 1608 ! Add all surface chlorophyll groups from ERSEM 1534 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + &1535 & trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4)1609 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 1610 & trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 1536 1611 #else 1537 1612 CALL ctl_stop( ' Trying to run schltot observation operator', & … … 1542 1617 #if defined key_hadocc 1543 1618 ! Surface phytoplankton nitrogen from HadOCC multiplied by C:N ratio 1544 zsurfvar(:,: ) = trn(:,:,1,jp_had_phy) * c2n_p1619 zsurfvar(:,:,1) = trn(:,:,1,jp_had_phy) * c2n_p 1545 1620 #elif defined key_medusa 1546 1621 ! Add non-diatom and diatom surface phytoplankton nitrogen from MEDUSA 1547 1622 ! multiplied by C:N ratio for each 1548 zsurfvar(:,: ) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd)1623 zsurfvar(:,:,1) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 1549 1624 #elif defined key_fabm 1550 1625 ! Add all surface phytoplankton carbon groups from ERSEM 1551 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + &1626 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 1552 1627 & trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 1553 1628 #else … … 1563 1638 #elif defined key_medusa 1564 1639 ! Diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 1565 zsurfvar(:,: ) = trn(:,:,1,jpphd) * xthetapd1640 zsurfvar(:,:,1) = trn(:,:,1,jpphd) * xthetapd 1566 1641 #elif defined key_fabm 1567 1642 ! Diatom surface phytoplankton carbon from ERSEM 1568 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c)1643 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) 1569 1644 #else 1570 1645 CALL ctl_stop( ' Trying to run slphydia observation operator', & … … 1579 1654 #elif defined key_medusa 1580 1655 ! Non-diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 1581 zsurfvar(:,: ) = trn(:,:,1,jpphn) * xthetapn1656 zsurfvar(:,:,1) = trn(:,:,1,jpphn) * xthetapn 1582 1657 #elif defined key_fabm 1583 1658 ! Add all non-diatom surface phytoplankton carbon groups from ERSEM 1584 zsurfvar(:,: ) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + &1585 & trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c)1659 zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 1660 & trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 1586 1661 #else 1587 1662 CALL ctl_stop( ' Trying to run slphynon observation operator', & … … 1592 1667 CASE('sspm') 1593 1668 #if defined key_spm 1594 zsurfvar(:,: ) = 0.01669 zsurfvar(:,:,1) = 0.0 1595 1670 DO jn = 1, jp_spm 1596 zsurfvar(:,: ) = zsurfvar(:,:) + trn(:,:,1,jn) ! sum SPM sizes1671 zsurfvar(:,:,1) = zsurfvar(:,:,1) + trn(:,:,1,jn) ! sum SPM sizes 1597 1672 END DO 1598 1673 #else … … 1611 1686 ! light_xEPS diagnostic variable 1612 1687 fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_xeps) 1613 zsurfvar(:,: ) = fabm_3d(:,:,1)1688 zsurfvar(:,:,1) = fabm_3d(:,:,1) 1614 1689 #else 1615 1690 CALL ctl_stop( ' Trying to run skd490 observation operator', & … … 1619 1694 CASE('sfco2') 1620 1695 #if defined key_hadocc 1621 zsurfvar(:,: ) = HADOCC_FCO2(:,:) ! fCO2 from HadOCC1696 zsurfvar(:,:,1) = HADOCC_FCO2(:,:) ! fCO2 from HadOCC 1622 1697 IF ( ( MINVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) .AND. & 1623 1698 & ( MAXVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) ) THEN 1624 1699 zsurfvar(:,:) = obfillflt 1625 zsurfmask(:,: ) = 01700 zsurfmask(:,:,1) = 0 1626 1701 CALL ctl_warn( ' HadOCC fCO2 values masked out for observation operator', & 1627 1702 & ' as HADOCC_FCO2(:,:) == HADOCC_FILL_FLT' ) 1628 1703 ENDIF 1629 1704 #elif defined key_medusa && defined key_roam 1630 zsurfvar(:,: ) = f2_fco2w(:,:)1705 zsurfvar(:,:,1) = f2_fco2w(:,:) 1631 1706 #elif defined key_fabm 1632 1707 ! First, get pCO2 from FABM 1633 1708 fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 1634 zsurfvar(:,: ) = fabm_3d(:,:,1)1709 zsurfvar(:,:,1) = fabm_3d(:,:,1) 1635 1710 ! Now, convert pCO2 to fCO2, based on SST in K. This follows the standard methodology of: 1636 1711 ! Pierrot et al. (2009), Recommendations for autonomous underway pCO2 measuring systems … … 1646 1721 ! because xCO2 in atm is ~0, and so this term will only affect the result to the 3rd decimal 1647 1722 ! place for typical values, and xCO2 would need to be approximated from pCO2 anyway. 1648 zsurfvar(:,: ) = zsurfvar(:,:) * EXP((-1636.75 + &1649 & 12.0408 * (tsn(:,:,1,jp_tem)+rt0) - &1650 & 0.0327957 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + &1651 & 0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + &1652 & 2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0))) / &1653 & (82.0578 * (tsn(:,:,1,jp_tem)+rt0)))1723 zsurfvar(:,:,1) = zsurfvar(:,:,1) * EXP((-1636.75 + & 1724 & 12.0408 * (tsn(:,:,1,jp_tem)+rt0) - & 1725 & 0.0327957 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 1726 & 0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 1727 & 2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0))) / & 1728 & (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 1654 1729 #else 1655 1730 CALL ctl_stop( ' Trying to run sfco2 observation operator', & … … 1659 1734 CASE('spco2') 1660 1735 #if defined key_hadocc 1661 zsurfvar(:,: ) = HADOCC_PCO2(:,:) ! pCO2 from HadOCC1736 zsurfvar(:,:,1) = HADOCC_PCO2(:,:) ! pCO2 from HadOCC 1662 1737 IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) .AND. & 1663 1738 & ( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 1664 zsurfvar(:,: ) = obfillflt1665 zsurfmask(:,: ) = 01739 zsurfvar(:,:,1) = obfillflt 1740 zsurfmask(:,:,1) = 0 1666 1741 CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 1667 1742 & ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 1668 1743 ENDIF 1669 1744 #elif defined key_medusa && defined key_roam 1670 zsurfvar(:,: ) = f2_pco2w(:,:)1745 zsurfvar(:,:,1) = f2_pco2w(:,:) 1671 1746 #elif defined key_fabm 1672 1747 fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 1673 zsurfvar(:,: ) = fabm_3d(:,:,1)1748 zsurfvar(:,:,1) = fabm_3d(:,:,1) 1674 1749 #else 1675 1750 CALL ctl_stop( ' Trying to run spco2 observation operator', & … … 1686 1761 ! Take the log10 where we can, otherwise exclude 1687 1762 tiny = 1.0e-20 1688 WHERE(zsurfvar(:,: ) > tiny .AND. zsurfvar(:,:) /= obfillflt )1689 zsurfvar(:,: ) = LOG10(zsurfvar(:,:))1763 WHERE(zsurfvar(:,:,1) > tiny .AND. zsurfvar(:,:,1) /= obfillflt ) 1764 zsurfvar(:,:,1) = LOG10(zsurfvar(:,:,1)) 1690 1765 ELSEWHERE 1691 zsurfvar(:,: ) = obfillflt1692 zsurfmask(:,: ) = 01766 zsurfvar(:,:,1) = obfillflt 1767 zsurfmask(:,:,1) = 0 1693 1768 END WHERE 1694 1769 ENDIF 1695 1770 1696 IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND. & 1697 & ln_time_mean_sla_bkg ) THEN 1698 !Number of time-steps in meaning period 1699 imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 1700 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & 1701 & nit000, idaystp, zsurfvar, & 1702 & zsurfclim, zsurfmask, & 1703 & n2dintsurf(jtype), llnightav(jtype), & 1704 & ravglamscl(jtype), ravgphiscl(jtype), & 1705 & lfpindegs(jtype), kmeanstp = imeanstp ) 1706 1707 1708 ELSE 1709 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & 1710 & nit000, idaystp, zsurfvar, & 1711 & zsurfclim, zsurfmask, & 1712 & n2dintsurf(jtype), llnightav(jtype), & 1713 & ravglamscl(jtype), ravgphiscl(jtype), & 1714 & lfpindegs(jtype) ) 1715 ENDIF 1716 1771 DO jvar = 1, surfdataqc(jtype)%nvar 1772 1773 IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND. & 1774 & ln_time_mean_sla_bkg ) THEN 1775 !Number of time-steps in meaning period 1776 imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 1777 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & 1778 & nit000, idaystp, jvar, & 1779 & zsurfvar(:,:,jvar), & 1780 & zsurfclim(:,:,jvar), & 1781 & zsurfmask(:,:,jvar), & 1782 & zglam(:,:,jvar), zgphi(:,:,jvar), & 1783 & n2dintsurf(jtype), llnightav(jtype), & 1784 & ravglamscl(jtype), ravgphiscl(jtype), & 1785 & lfpindegs(jtype), kmeanstp = imeanstp ) 1786 1787 ELSE 1788 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & 1789 & nit000, idaystp, jvar, & 1790 & zsurfvar(:,:,jvar), & 1791 & zsurfclim(:,:,jvar), & 1792 & zsurfmask(:,:,jvar), & 1793 & zglam(:,:,jvar), zgphi(:,:,jvar), & 1794 & n2dintsurf(jtype), llnightav(jtype), & 1795 & ravglamscl(jtype), ravgphiscl(jtype), & 1796 & lfpindegs(jtype) ) 1797 ENDIF 1798 1799 END DO 1800 1717 1801 ! Change label of data from FBD ("freeboard") to SIT ("Sea Ice 1718 1802 ! Thickness") 1719 1803 IF ( TRIM(surfdataqc(jtype)%cvars(1)) == 'FBD' ) THEN 1720 surfdata (jtype)%cvars(1) = 'SIT'1804 surfdataqc(jtype)%cvars(1) = 'SIT' 1721 1805 ENDIF 1722 1806 1807 CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar ) 1808 CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim ) 1809 CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 1810 CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam ) 1811 CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi ) 1812 1723 1813 END DO 1724 1725 CALL wrk_dealloc( jpi, jpj, zsurfvar )1726 CALL wrk_dealloc( jpi, jpj, zsurfmask )1727 1814 #if defined key_fabm 1728 1815 CALL wrk_dealloc( jpi, jpj, jpk, fabm_3d ) … … 1780 1867 & ) 1781 1868 1782 CALL obs_rotvel ( profdataqc(jtype), nn_2dint_default, zu, zv )1869 CALL obs_rotvel_pro( profdataqc(jtype), nn_2dint_default, zu, zv ) 1783 1870 1784 1871 DO jo = 1, profdataqc(jtype)%nprof … … 1813 1900 1814 1901 DO jtype = 1, nsurftypes 1902 1903 IF ( TRIM(cobstypessurf(jtype)) == 'vel' ) THEN 1904 1905 ! For velocity data, rotate the model velocities to N/S, E/W 1906 ! using the compressed data structure. 1907 ALLOCATE( & 1908 & zu(surfdataqc(jtype)%nsurf), & 1909 & zv(surfdataqc(jtype)%nsurf) & 1910 & ) 1911 1912 CALL obs_rotvel_surf( surfdataqc(jtype), nn_2dint_default, zu, zv ) 1913 1914 DO jo = 1, surfdataqc(jtype)%nsurf 1915 surfdataqc(jtype)%rmod(jo,1) = zu(jo) 1916 surfdataqc(jtype)%rmod(jo,2) = zv(jo) 1917 END DO 1918 1919 DEALLOCATE( zu ) 1920 DEALLOCATE( zv ) 1921 1922 END IF 1923 1815 1924 1816 1925 CALL obs_surf_decompress( surfdataqc(jtype), &
Note: See TracChangeset
for help on using the changeset viewer.