Changeset 15384 for NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE
- Timestamp:
- 2021-10-15T14:53:30+02:00 (3 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE/DIA/diaregmean.F90
r15381 r15384 10 10 USE in_out_manager ! I/O units 11 11 USE iom ! I/0 library 12 !JT USE wrk_nemo ! working arrays13 12 USE diapea ! PEA 14 13 USE zdfmxl ! MLD … … 38 37 LOGICAL :: ln_diaregmean_diaar5 ! region mean calculation including AR5 SLR terms 39 38 LOGICAL :: ln_diaregmean_diasbc ! region mean calculation including Surface BC 40 LOGICAL :: ln_diaregmean_ karamld! region mean calculation including kara mld terms39 LOGICAL :: ln_diaregmean_mld ! region mean calculation including kara mld terms 41 40 LOGICAL :: ln_diaregmean_pea ! region mean calculation including pea terms 42 41 INTEGER :: nn_diaregmean_nhourlymean ! region mean number of hours in mean (normally 1., <0 = instantanous (slower)) … … 103 102 #if defined key_fabm 104 103 NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_verbose, ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,& 105 & ln_diaregmean_ karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,ln_diaregmean_bgc,&104 & ln_diaregmean_mld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,ln_diaregmean_bgc,& 106 105 & nn_diaregmean_nhourlymean,ln_diaregmean_areawgt 107 106 #else 108 107 NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_verbose, ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,& 109 & ln_diaregmean_ karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,&108 & ln_diaregmean_mld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,& 110 109 & nn_diaregmean_nhourlymean,ln_diaregmean_areawgt 111 110 #endif … … 135 134 WRITE(numout,*) 'Switch for regmean binary output (T) or not (F) ln_diaregmean_bin = ', ln_diaregmean_bin 136 135 WRITE(numout,*) 'Switch for regmean netcdf output (T) or not (F) ln_diaregmean_nc = ', ln_diaregmean_nc 137 WRITE(numout,*) 'Switch for regmean kara mld terms (T) or not (F) ln_diaregmean_ karamld = ', ln_diaregmean_karamld136 WRITE(numout,*) 'Switch for regmean kara mld terms (T) or not (F) ln_diaregmean_mld = ', ln_diaregmean_mld 138 137 WRITE(numout,*) 'Switch for regmean PEA terms (T) or not (F) ln_diaregmean_pea = ', ln_diaregmean_pea 139 138 WRITE(numout,*) 'Switch for regmean AR5 SLR terms (T) or not (F) ln_diaregmean_diaar5 = ', ln_diaregmean_diaar5 … … 648 647 649 648 650 IF( ln_diaregmean_karamld ) THEN 651 tmp_field_mat(:,:,16) = tmp_field_mat(:,:,16) + (hmld_kara(:,:)*tmask(:,:,1)) !mldkara 649 IF( ln_diaregmean_mld ) THEN 650 IF( ALLOCATED( hmld_zint ) ) THEN 651 tmp_field_mat(:,:,16) = tmp_field_mat(:,:,16) + (hmld_zint(:,:)*tmask(:,:,1)) !mldkara 652 ENDIF 652 653 ENDIF 653 654 654 name_dat_mat(16) = 'mld kara'655 name_dat_mat(16) = 'mld' 655 656 656 657 IF( ln_diaregmean_pea ) THEN … … 711 712 712 713 IF (vi == 16) THEN 713 IF( .not. ln_diaregmean_ karamld ) do_reg_mean = .FALSE.714 IF( .not. ln_diaregmean_mld ) do_reg_mean = .FALSE. 714 715 ENDIF 715 716 … … 733 734 ENDIF 734 735 !ELSE 735 !WRITE(numout,*) 'JT dia_regmean SBC variable - no do_reg_mean: ',TRIM( name_dat_mat(vi) ),';',ln_diaregmean_ karamld,ln_diaregmean_pea736 !WRITE(numout,*) 'JT dia_regmean SBC variable - no do_reg_mean: ',TRIM( name_dat_mat(vi) ),';',ln_diaregmean_mld,ln_diaregmean_pea 736 737 ENDIF 737 738 tmp_name="" -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE/IOM/iom.F90
r15378 r15384 134 134 LOGICAL :: ln_diaregmean_bin ! region mean calculation binary output 135 135 LOGICAL :: ln_diaregmean_nc ! region mean calculation netcdf output 136 LOGICAL :: ln_diaregmean_ karamld ! region mean calculation including kara mld terms136 LOGICAL :: ln_diaregmean_mld ! region mean calculation including kara mld terms 137 137 LOGICAL :: ln_diaregmean_pea ! region mean calculation including pea terms 138 138 LOGICAL :: ln_diaregmean_diaar5 ! region mean calculation including AR5 SLR terms … … 170 170 #if defined key_fabm 171 171 NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_verbose, ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,& 172 & ln_diaregmean_ karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,ln_diaregmean_bgc,&172 & ln_diaregmean_mld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,ln_diaregmean_bgc,& 173 173 & nn_diaregmean_nhourlymean,ln_diaregmean_areawgt 174 174 #else 175 175 NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_verbose, ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,& 176 & ln_diaregmean_ karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,&176 & ln_diaregmean_mld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,& 177 177 & nn_diaregmean_nhourlymean,ln_diaregmean_areawgt 178 178 #endif -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE/ZDF/zdfmxl.F90
r15383 r15384 22 22 USE iom ! I/O library 23 23 USE lib_mpp ! MPP library 24 !JT 25 USE lbclnk ! (or mpp link) 26 !JT 27 24 28 25 IMPLICIT NONE 29 26 PRIVATE … … 40 37 LOGICAL, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ll_belowml ! Flag points below mixed layer when ll_found=F 41 38 42 !JT 43 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmld_kara !: mixed layer depth of Kara et al [m] 44 45 46 47 ! Namelist variables for namzdf_karaml 48 LOGICAL :: ln_kara ! Logical switch for calculating kara mixed 49 ! layer 50 LOGICAL :: ln_kara_write25h ! Logical switch for 25 hour outputs 51 INTEGER :: jpmld_type ! mixed layer type 52 REAL(wp) :: ppz_ref ! depth of initial T_ref 53 REAL(wp) :: ppdT_crit ! Critical temp diff 54 REAL(wp) :: ppiso_frac ! Fraction of ppdT_crit used 55 56 !Used for 25h mean 57 LOGICAL, PRIVATE :: kara_25h_init = .TRUE. !Logical used to initalise 25h 58 !outputs. Necissary, because we need to 59 !initalise the kara_25h on the zeroth 60 !timestep (i.e in the nemogcm_init call) 61 REAL, PRIVATE, ALLOCATABLE, DIMENSION(:,:) :: hmld_kara_25h 62 63 64 65 !JT 66 39 67 40 REAL(wp), PUBLIC :: rho_c = 0.01_wp !: density criterion for mixed layer depth 68 41 REAL(wp), PUBLIC :: avt_c = 5.e-4_wp ! Kz criterion for the turbocline depth … … 155 128 END DO 156 129 ! depth of the mixing and mixed layers 157 !JT158 CALL zdf_mxl_kara( kt ) ! kara MLD159 !JT160 161 130 DO jj = 1, jpj 162 131 DO ji = 1, jpi … … 521 490 END SUBROUTINE zdf_mxl_zint 522 491 523 524 525 SUBROUTINE zdf_mxl_kara( kt )526 !!----------------------------------------------------------------------------------527 !! *** ROUTINE zdf_mxl_kara ***528 !529 ! Calculate mixed layer depth according to the definition of530 ! Kara et al, 2000, JGR, 105, 16803.531 !532 ! If mld_type=1 the mixed layer depth is calculated as the depth at which the533 ! density has increased by an amount equivalent to a temperature difference of534 ! 0.8C at the surface.535 !536 ! For other values of mld_type the mixed layer is calculated as the depth at537 ! which the temperature differs by 0.8C from the surface temperature.538 !539 ! Original version: David Acreman540 !541 !!-----------------------------------------------------------------------------------542 543 INTEGER, INTENT( in ) :: kt ! ocean time-step index544 545 NAMELIST/namzdf_karaml/ ln_kara,jpmld_type, ppz_ref, ppdT_crit, &546 & ppiso_frac, ln_kara_write25h547 548 ! Local variables549 REAL, DIMENSION(jpi,jpk) :: ppzdep ! depth for use in calculating d(rho)550 REAL(wp), DIMENSION(jpi,jpj,jpts) :: ztsn_2d !Local version of tsn551 INTEGER, DIMENSION(jpi,jpj) :: ikmt ! number of active tracer levels552 LOGICAL :: ll_found(jpi,jpj) ! Is T_b to be found by interpolation ?553 LOGICAL :: ll_belowml(jpi,jpj,jpk) ! Flag points below mixed layer when ll_found=F554 INTEGER :: ji, jj, jk ! loop counter555 INTEGER :: ik_ref(jpi,jpj) ! index of reference level556 INTEGER :: ik_iso(jpi,jpj) ! index of last uniform temp level557 REAL :: zT(jpi,jpj,jpk) ! Temperature or denisty558 REAL :: zT_ref(jpi,jpj) ! reference temperature559 REAL :: zT_b ! base temperature560 REAL :: zdTdz(jpi,jpj,jpk-2) ! gradient of zT561 REAL :: zmoddT(jpi,jpj,jpk-2) ! Absolute temperature difference562 REAL :: zdz ! depth difference563 REAL :: zdT ! temperature difference564 REAL :: zdelta_T(jpi,jpj) ! difference critereon565 REAL :: zRHO1(jpi,jpj), zRHO2(jpi,jpj) ! Densities566 INTEGER, SAVE :: idt, i_steps567 INTEGER, SAVE :: i_cnt_25h ! Counter for 25 hour means568 INTEGER :: ios ! Local integer output status for namelist read569 570 571 572 !!-------------------------------------------------------------------------------------573 574 IF( kt == nit000 ) THEN575 ! Default values576 ln_kara = .FALSE.577 ln_kara_write25h = .FALSE.578 jpmld_type = 1579 ppz_ref = 10.0580 ppdT_crit = 0.2581 ppiso_frac = 0.1582 ! Read namelist583 REWIND ( numnam_ref )584 READ ( numnam_ref, namzdf_karaml, IOSTAT=ios, ERR= 901 )585 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_karaml in reference namelist' )586 587 REWIND( numnam_cfg ) ! Namelist nam_diadiaop in configuration namelist 3D hourly diagnostics588 READ ( numnam_cfg, namzdf_karaml, IOSTAT = ios, ERR = 902 )589 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namzdf_karaml in configuration namelist' )590 IF(lwm) WRITE ( numond, namzdf_karaml )591 592 593 WRITE(numout,*) '===== Kara mixed layer ====='594 WRITE(numout,*) 'ln_kara = ', ln_kara595 WRITE(numout,*) 'jpmld_type = ', jpmld_type596 WRITE(numout,*) 'ppz_ref = ', ppz_ref597 WRITE(numout,*) 'ppdT_crit = ', ppdT_crit598 WRITE(numout,*) 'ppiso_frac = ', ppiso_frac599 WRITE(numout,*) 'ln_kara_write25h = ', ln_kara_write25h600 WRITE(numout,*) '============================'601 602 IF ( .NOT.ln_kara ) THEN603 WRITE(numout,*) "ln_kara not set; Kara mixed layer not calculated"604 ELSE605 IF (.NOT. ALLOCATED(hmld_kara) ) ALLOCATE( hmld_kara(jpi,jpj) )606 IF ( ln_kara_write25h .AND. kara_25h_init ) THEN607 i_cnt_25h = 0608 IF (.NOT. ALLOCATED(hmld_kara_25h) ) &609 & ALLOCATE( hmld_kara_25h(jpi,jpj) )610 hmld_kara_25h = 0._wp611 !IF( nacc == 1 ) THEN612 ! idt = INT(rdtmin)613 !ELSE614 ! idt = INT(rdt)615 !ENDIF616 617 idt = INT(rdt)618 IF( MOD( 3600,idt) == 0 ) THEN619 i_steps = 3600 / idt620 ELSE621 CALL ctl_stop('STOP', &622 & 'zdf_mxl_kara: timestep must give MOD(3600,rdt)'// &623 & ' = 0 otherwise no hourly values are possible')624 ENDIF625 ENDIF626 ENDIF627 ENDIF628 629 IF ( ln_kara ) THEN630 631 !set critical ln_kara632 ztsn_2d = tsn(:,:,1,:)633 ztsn_2d(:,:,jp_tem) = ztsn_2d(:,:,jp_tem) + ppdT_crit634 635 ! Set the mixed layer depth criterion at each grid point636 ppzdep = 0._wp637 IF( jpmld_type == 1 ) THEN638 CALL eos ( tsn(:,:,1,:), &639 & ppzdep(:,:), zRHO1(:,:) )640 CALL eos ( ztsn_2d(:,:,:), &641 & ppzdep(:,:), zRHO2(:,:) )642 zdelta_T(:,:) = abs( zRHO1(:,:) - zRHO2(:,:) ) * rau0643 ! RHO from eos (2d version) doesn't calculate north or east halo:644 CALL lbc_lnk( 'zdf_mxl_kara',zdelta_T, 'T', 1. )645 zT(:,:,:) = rhop(:,:,:)646 ELSE647 zdelta_T(:,:) = ppdT_crit648 zT(:,:,:) = tsn(:,:,:,jp_tem)649 ENDIF650 651 ! Calculate the gradient of zT and absolute difference for use later652 DO jk = 1 ,jpk-2653 zdTdz(:,:,jk) = ( zT(:,:,jk+1) - zT(:,:,jk) ) / e3w_n(:,:,jk+1)654 zmoddT(:,:,jk) = abs( zT(:,:,jk+1) - zT(:,:,jk) )655 END DO656 657 ! Find density/temperature at the reference level (Kara et al use 10m).658 ! ik_ref is the index of the box centre immediately above or at the reference level659 ! Find ppz_ref in the array of model level depths and find the ref660 ! density/temperature by linear interpolation.661 ik_ref = -1662 DO jk = jpkm1, 2, -1663 WHERE( gdept_n(:,:,jk) > ppz_ref )664 ik_ref(:,:) = jk - 1665 zT_ref(:,:) = zT(:,:,jk-1) + &666 & zdTdz(:,:,jk-1) * ( ppz_ref - gdept_n(:,:,jk-1) )667 ENDWHERE668 END DO669 IF ( ANY( ik_ref < 0 ) .OR. ANY( ik_ref > jpkm1 ) ) THEN670 CALL ctl_stop( "STOP", &671 & "zdf_mxl_kara: unable to find reference level for kara ML" )672 ELSE673 ! If the first grid box centre is below the reference level then use the674 ! top model level to get zT_ref675 WHERE( gdept_n(:,:,1) > ppz_ref )676 zT_ref = zT(:,:,1)677 ik_ref = 1678 ENDWHERE679 680 ! The number of active tracer levels is 1 less than the number of active w levels681 ikmt(:,:) = mbkt(:,:) - 1682 683 ! Search for a uniform density/temperature region where adjacent levels684 ! differ by less than ppiso_frac * deltaT.685 ! ik_iso is the index of the last level in the uniform layer686 ! ll_found indicates whether the mixed layer depth can be found by interpolation687 ik_iso(:,:) = ik_ref(:,:)688 ll_found(:,:) = .false.689 DO jj = 1, nlcj690 DO ji = 1, nlci691 !CDIR NOVECTOR692 DO jk = ik_ref(ji,jj), ikmt(ji,jj)-1 ! mbkt(ji,jj)-1 !mbathy(ji,jj)-1693 IF( zmoddT(ji,jj,jk) > ( ppiso_frac * zdelta_T(ji,jj) ) ) THEN694 ik_iso(ji,jj) = jk695 ll_found(ji,jj) = ( zmoddT(ji,jj,jk) > zdelta_T(ji,jj) )696 EXIT697 ENDIF698 END DO699 END DO700 END DO701 702 ! Use linear interpolation to find depth of mixed layer base where possible703 hmld_kara(:,:) = ppz_ref704 DO jj = 1, jpj705 DO ji = 1, jpi706 IF( ll_found(ji,jj) .and. tmask(ji,jj,1) == 1.0 ) THEN707 zdz = abs( zdelta_T(ji,jj) / zdTdz(ji,jj,ik_iso(ji,jj)) )708 hmld_kara(ji,jj) = gdept_n(ji,jj,ik_iso(ji,jj)) + zdz709 ENDIF710 END DO711 END DO712 713 ! If ll_found = .false. then calculate MLD using difference of zdelta_T714 ! from the reference density/temperature715 716 ! Prevent this section from working on land points717 WHERE( tmask(:,:,1) /= 1.0 )718 ll_found = .true.719 ENDWHERE720 721 DO jk = 1, jpk722 ll_belowml(:,:,jk) = abs( zT(:,:,jk) - zT_ref(:,:) ) >= &723 & zdelta_T(:,:)724 END DO725 726 ! Set default value where interpolation cannot be used (ll_found=false)727 DO jj = 1, jpj728 DO ji = 1, jpi729 IF( .NOT. ll_found(ji,jj) ) &730 & hmld_kara(ji,jj) = gdept_n(ji,jj,ikmt(ji,jj)) ! mbkt(ji,jj))! mbathy(ji,jj))731 END DO732 END DO733 734 DO jj = 1, jpj735 DO ji = 1, jpi736 !CDIR NOVECTOR737 DO jk = ik_ref(ji,jj)+1, ikmt(ji,jj) !mbkt(ji,jj) !mbathy(ji,jj)738 IF( ll_found(ji,jj) ) EXIT739 IF( ll_belowml(ji,jj,jk) ) THEN740 zT_b = zT_ref(ji,jj) + zdelta_T(ji,jj) * &741 & SIGN(1.0, zdTdz(ji,jj,jk-1) )742 zdT = zT_b - zT(ji,jj,jk-1)743 zdz = zdT / zdTdz(ji,jj,jk-1)744 hmld_kara(ji,jj) = gdept_n(ji,jj,jk-1) + zdz745 EXIT746 ENDIF747 END DO748 END DO749 END DO750 751 hmld_kara(:,:) = hmld_kara(:,:) * tmask(:,:,1)752 753 IF( ln_kara_write25h ) THEN754 !Double IF required as i_steps not defined if ln_kara_write25h =755 ! FALSE756 IF ( ( MOD( kt, i_steps ) == 0 ) .OR. kara_25h_init ) THEN757 hmld_kara_25h = hmld_kara_25h + hmld_kara758 i_cnt_25h = i_cnt_25h + 1759 IF ( kara_25h_init ) kara_25h_init = .FALSE.760 ENDIF761 ENDIF762 763 !#if defined key_iomput764 IF( kt /= nit000 ) THEN765 CALL iom_put( "mldkara" , hmld_kara )766 IF( ( MOD( i_cnt_25h, 25) == 0 ) .AND. ln_kara_write25h ) &767 CALL iom_put( "kara25h" , ( hmld_kara_25h / 25._wp ) )768 ENDIF769 !#endif770 771 ENDIF772 ENDIF773 774 END SUBROUTINE zdf_mxl_kara775 776 492 !!====================================================================== 777 493 END MODULE zdfmxl
Note: See TracChangeset
for help on using the changeset viewer.