Changeset 3411
- Timestamp:
- 2012-06-11T17:41:49+02:00 (12 years ago)
- Location:
- branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/CONFIG/ORCA2_LIM/EXP00/namelist
r3306 r3411 894 894 895 895 ln_sst = .false. ! Logical switch for SST observations 896 896 ln_reysst = .false. ! ln_reysst Logical switch for Reynolds observations 897 897 ! ln_ghrsst Logical switch for GHRSST observations 898 898 -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r3294 r3411 106 106 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 107 107 & ld_velav !: Velocity data is daily averaged 108 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 109 & ld_sstnight !: SST observation corresponds to night mean 108 110 109 111 !!---------------------------------------------------------------------- … … 737 739 ALLOCATE(sstdata(nsstsets)) 738 740 ALLOCATE(sstdatqc(nsstsets)) 741 ALLOCATE(ld_sstnight(nsstsets)) 739 742 sstdata(:)%nsurf=0 740 sstdatqc(:)%nsurf=0 743 sstdatqc(:)%nsurf=0 744 ld_sstnight(:)=.false. 741 745 742 746 nsstsets = 0 … … 745 749 746 750 nsstsets = nsstsets + 1 751 752 ld_sstnight(nsstsets) = .TRUE. 747 753 748 754 CALL obs_rea_sst_rey( reysstname, reysstfmt, sstdata(nsstsets), & … … 757 763 758 764 nsstsets = nsstsets + 1 765 766 ld_sstnight(nsstsets) = .TRUE. 759 767 760 768 CALL obs_rea_sst( 1, sstdata(nsstsets), jnumsst, & … … 774 782 775 783 nsstsets = nsstsets + 1 784 785 ld_sstnight(nsstsets) = .TRUE. 776 786 777 787 CALL obs_rea_sst( 0, sstdata(nsstsets), 1, & … … 1092 1102 IF ( ln_sst ) THEN 1093 1103 DO jsstset = 1, nsstsets 1094 CALL obs_sst_opt( sstdatqc(jsstset), & 1095 & kstp, jpi, jpj, nit000, tsn(:,:,1,jp_tem), & 1096 & tmask(:,:,1), n2dint ) 1104 CALL obs_sst_opt( sstdatqc(jsstset), & 1105 & kstp, jpi, jpj, nit000, idaystp, & 1106 & tsn(:,:,1,jp_tem), tmask(:,:,1), & 1107 & n2dint, ld_sstnight(jsstset) ) 1097 1108 END DO 1098 1109 ENDIF -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
r2715 r3411 614 614 END SUBROUTINE obs_sla_opt 615 615 616 SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, & 617 & psstn, psstmask, k2dint ) 618 616 SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, kdaystp, & 617 & psstn, psstmask, k2dint, ld_nightav ) 619 618 !!----------------------------------------------------------------------- 620 619 !! … … 647 646 !! * Modules used 648 647 USE obs_surf_def ! Definition of storage space for surface observations 648 USE sbcdcy 649 649 650 650 IMPLICIT NONE … … 659 659 ! (kit000-1 = restart time) 660 660 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 661 INTEGER, INTENT(IN) :: kdaystp ! Number of time steps per day 661 662 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 662 663 & psstn, & ! Model SST field 663 664 & psstmask ! Land-sea mask 664 665 665 666 !! * Local declarations 666 667 INTEGER :: ji … … 670 671 INTEGER :: isst 671 672 INTEGER :: iobs 673 INTEGER :: idayend 672 674 REAL(KIND=wp) :: zlam 673 675 REAL(KIND=wp) :: zphi 674 676 REAL(KIND=wp) :: zext(1), zobsmask(1) 677 REAL(KIND=wp) :: zdaystp 678 INTEGER, DIMENSION(:,:), SAVE, ALLOCATABLE :: & 679 & icount_sstnight, & 680 & imask_night 681 REAL(kind=wp), DIMENSION(:,:), SAVE, ALLOCATABLE :: & 682 & zintmp, & 683 & zouttmp, & 684 & zmeanday ! to compute model sst in region of 24h daylight (pole) 675 685 REAL(kind=wp), DIMENSION(2,2,1) :: & 676 686 & zweig … … 678 688 & zmask, & 679 689 & zsstl, & 690 & zsstm, & 680 691 & zglam, & 681 692 & zgphi … … 683 694 & igrdi, & 684 695 & igrdj 696 LOGICAL, INTENT(IN) :: ld_nightav 685 697 686 698 !----------------------------------------------------------------------- … … 690 702 inrc = kt - kit000 + 2 691 703 isst = sstdatqc%nsstp(inrc) 704 705 IF ( ld_nightav ) THEN 706 707 ! Initialize array for night mean 708 709 IF ( kt .EQ. 0 ) THEN 710 ALLOCATE ( icount_sstnight(kpi,kpj) ) 711 ALLOCATE ( imask_night(kpi,kpj) ) 712 ALLOCATE ( zintmp(kpi,kpj) ) 713 ALLOCATE ( zouttmp(kpi,kpj) ) 714 ALLOCATE ( zmeanday(kpi,kpj) ) 715 nday_qsr = -1 ! initialisation flag for nbc_dcy 716 ENDIF 717 718 ! Initialize daily mean for first timestep 719 idayend = MOD( kt - kit000 + 1, kdaystp ) 720 721 ! Added kt == 0 test to catch restart case 722 IF ( idayend == 1 .OR. kt == 0) THEN 723 IF (lwp) WRITE(numout,*) 'Reset sstdatqc%vdmean on time-step: ',kt 724 DO jj = 1, jpj 725 DO ji = 1, jpi 726 sstdatqc%vdmean(ji,jj) = 0.0 727 zmeanday(ji,jj) = 0.0 728 icount_sstnight(ji,jj) = 0 729 END DO 730 END DO 731 ENDIF 732 733 zintmp(:,:) = 0.0 734 zouttmp(:,:) = sbc_dcy( zintmp(:,:), .TRUE. ) 735 imask_night(:,:) = INT( zouttmp(:,:) ) 736 737 DO jj = 1, jpj 738 DO ji = 1, jpi 739 ! Increment the temperature field for computing night mean and counter 740 sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj) & 741 & + psstn(ji,jj)*imask_night(ji,jj) 742 zmeanday(ji,jj) = zmeanday(ji,jj) + psstn(ji,jj) 743 icount_sstnight(ji,jj) = icount_sstnight(ji,jj) + imask_night(ji,jj) 744 END DO 745 END DO 746 747 ! Compute the daily mean at the end of day 748 749 zdaystp = 1.0 / REAL( kdaystp ) 750 751 IF ( idayend == 0 ) THEN 752 DO jj = 1, jpj 753 DO ji = 1, jpi 754 ! Test if "no night" point 755 IF ( icount_sstnight(ji,jj) .NE. 0 ) THEN 756 sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj) & 757 & / icount_sstnight(ji,jj) 758 ELSE 759 sstdatqc%vdmean(ji,jj) = zmeanday(ji,jj) * zdaystp 760 ENDIF 761 END DO 762 END DO 763 ENDIF 764 765 ENDIF 692 766 693 767 ! Get the data for interpolation … … 722 796 CALL obs_int_comm_2d( 2, 2, isst, & 723 797 & igrdi, igrdj, psstn, zsstl ) 724 798 799 ! At the end of the day get interpolated means 800 IF ( idayend == 0 .AND. ld_nightav ) THEN 801 802 ALLOCATE( & 803 & zsstm(2,2,isst) & 804 & ) 805 806 CALL obs_int_comm_2d( 2, 2, isst, igrdi, igrdj, & 807 & sstdatqc%vdmean(:,:), zsstm ) 808 809 ENDIF 810 725 811 ! Loop over observations 726 812 … … 756 842 757 843 ! Interpolate the model SST to the observation point 758 CALL obs_int_h2d( 1, 1, & 844 845 IF ( ld_nightav ) THEN 846 847 IF ( idayend == 0 ) THEN 848 ! Daily averaged/diurnal cycle of SST data 849 CALL obs_int_h2d( 1, 1, & 850 & zweig, zsstm(:,:,iobs), zext ) 851 ELSE 852 CALL ctl_stop( ' ld_nightav is set to true: a nonzero' // & 853 & ' number of night SST data should' // & 854 & ' only occur at the end of a given day' ) 855 ENDIF 856 857 ELSE 858 859 CALL obs_int_h2d( 1, 1, & 759 860 & zweig, zsstl(:,:,iobs), zext ) 861 862 ENDIF 760 863 761 864 sstdatqc%rmod(jobs,1) = zext(1) … … 772 875 & zsstl & 773 876 & ) 877 878 ! At the end of the day also get interpolated means 879 IF ( idayend == 0 .AND. ld_nightav ) THEN 880 DEALLOCATE( & 881 & zsstm & 882 & ) 883 ENDIF 774 884 775 885 sstdatqc%nsurfup = sstdatqc%nsurfup + isst -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_seaice.F90
r2287 r3411 326 326 & iindx ) 327 327 328 CALL obs_surf_alloc( seaicedata, iobs, kvars, kextr, kstp ) 328 CALL obs_surf_alloc( seaicedata, iobs, & 329 kvars, kextr, kstp, jpi, jpj ) 329 330 330 331 ! * Read obs/positions, QC, all variable and assign to seaicedata -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sla.F90
r2287 r3411 391 391 & iindx ) 392 392 393 CALL obs_surf_alloc( sladata, iobs, kvars, kextr, kstp ) 393 CALL obs_surf_alloc( sladata, iobs, kvars, kextr, & 394 & jpi, jpj, kstp ) 394 395 395 396 ! * Read obs/positions, QC, all variable and assign to sladata -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sst.F90
r2287 r3411 326 326 & iindx ) 327 327 328 CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp )328 CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp, jpi, jpj ) 329 329 330 330 ! * Read obs/positions, QC, all variable and assign to sstdata … … 701 701 ! Allocate obs_surf data structure for time sorted data 702 702 703 CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp )703 CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp, jpi, jpj ) 704 704 705 705 pjul = pjulini + 1 -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/OBS/obs_surf_def.F90
r2287 r3411 47 47 INTEGER :: nextra !: Number of extra fields at observation points 48 48 INTEGER :: nstp !: Number of time steps 49 INTEGER :: npi !: Number of 3D grid points 50 INTEGER :: npj 49 51 INTEGER :: nsurfup !: Observation counter used in obs_oper 50 52 … … 79 81 & rext !: Extra fields interpolated to observation points 80 82 83 REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 84 & vdmean !: Time averaged of model field 85 81 86 ! Arrays with size equal to the number of time steps in the window 82 87 … … 103 108 CONTAINS 104 109 105 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp )110 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp, kpi, kpj ) 106 111 !!---------------------------------------------------------------------- 107 112 !! *** ROUTINE obs_surf_alloc *** … … 120 125 INTEGER, INTENT(IN) :: kextra ! Number of extra fields at observation points 121 126 INTEGER, INTENT(IN) :: kstp ! Number of time steps 127 INTEGER, INTENT(IN) :: kpi ! Number of 3D grid points 128 INTEGER, INTENT(IN) :: kpj 122 129 123 130 !!* Local variables … … 131 138 surf%nvar = kvar 132 139 surf%nstp = kstp 140 surf%npi = kpi 141 surf%npj = kpj 133 142 134 143 ! Allocate arrays of number of surface data size … … 174 183 & ) 175 184 185 ! Allocate arrays of size number of grid points 186 187 ALLOCATE( & 188 & surf%vdmean(kpi,kpj) & 189 & ) 190 176 191 ! Set defaults for compression indices 177 192 … … 242 257 & ) 243 258 259 ! Deallocate arrays of size number of grid points size times 260 ! number of variables 261 262 DEALLOCATE( & 263 & surf%vdmean & 264 & ) 265 244 266 ! Deallocate arrays of number of time step size 245 267 … … 300 322 IF ( lallocate ) THEN 301 323 CALL obs_surf_alloc( newsurf, insurf, surf%nvar, & 302 & surf%nextra, surf%nstp )324 & surf%nextra, surf%nstp, surf%npi, surf%npj ) 303 325 ENDIF 304 326 -
branches/2012/dev_r3342_MERCATOR7_SST/NEMOGCM/NEMO/OPA_SRC/SBC/sbcdcy.F90
r3294 r3411 49 49 50 50 51 FUNCTION sbc_dcy( pqsrin ) RESULT( zqsrout )51 FUNCTION sbc_dcy( pqsrin, l_mask ) RESULT( zqsrout ) 52 52 !!---------------------------------------------------------------------- 53 53 !! *** ROUTINE sbc_dcy *** … … 63 63 !! Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 64 64 !!---------------------------------------------------------------------- 65 LOGICAL, OPTIONAL, INTENT(in) :: l_mask ! use the routine for night mask computation 65 66 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqsrin ! input daily QSR flux 66 67 !! 67 68 INTEGER :: ji, jj ! dummy loop indices 69 INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask 68 70 REAL(wp) :: ztwopi, zinvtwopi, zconvrad 69 71 REAL(wp) :: zlo, zup, zlousd, zupusd 70 72 REAL(wp) :: zdsws, zdecrad, ztx, zsin, zcos 71 73 REAL(wp) :: ztmp, ztmp1, ztmp2, ztest 74 REAL(wp) :: ztmpm, ztmpm1, ztmpm2 72 75 REAL(wp), DIMENSION(jpi,jpj) :: zqsrout ! output QSR flux with diurnal cycle 73 76 !---------------------------statement functions------------------------ … … 90 93 zup = zlo + ( REAL(nn_fsbc, wp) * rdttra(1) ) / rday 91 94 ! 92 IF( nday_qsr == -1 ) THEN ! first time step only 95 IF( nday_qsr == -1 ) THEN ! first time step only 93 96 IF(lwp) THEN 94 97 WRITE(numout,*) … … 120 123 zdecrad = (-23.5 * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 121 124 ! Compute A and B needed to compute the time integral of the diurnal cycle 122 125 123 126 zsin = SIN( zdecrad ) ; zcos = COS( zdecrad ) 124 127 DO jj = 1, jpj … … 129 132 END DO 130 133 END DO 131 132 134 ! Compute the time of dawn and dusk 133 135 … … 156 158 rdawn(:,:) = MOD( (rdawn(:,:) + 1._wp), 1._wp ) 157 159 rdusk(:,:) = MOD( (rdusk(:,:) + 1._wp), 1._wp ) 158 159 160 ! 2.2 Compute the scalling function: 160 161 ! S* = the inverse of the time integral of the diurnal cycle from dawm to dusk … … 185 186 ! 186 187 ENDIF 187 188 188 ! 3. update qsr with the diurnal cycle 189 189 ! ------------------------------------ 190 190 191 imask_night(:,:) = 0 191 192 DO jj = 1, jpj 192 193 DO ji = 1, jpi 194 ztmpm = 0.0 193 195 IF( ABS(rab(ji,jj)) < 1 ) THEN ! day duration is less than 24h 194 196 ! … … 200 202 ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 201 203 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 204 ztmpm = zupusd - zlousd 205 IF ( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 202 206 ! 203 207 ELSE ! day time in two parts … … 205 209 zupusd = MIN(zup, rdusk(ji,jj)) 206 210 ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 211 ztmpm1=zupusd-zlousd 207 212 zlousd = MAX(zlo, rdawn(ji,jj)) 208 213 zupusd = MAX(zup, rdawn(ji,jj)) 209 214 ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 215 ztmpm2 =zupusd-zlousd 210 216 ztmp = ztmp1 + ztmp2 217 ztmpm = ztmpm1 + ztmpm2 211 218 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 219 IF (ztmpm .EQ. 0.) imask_night(ji,jj) = 1 212 220 ENDIF 213 221 ELSE ! 24h light or 24h night … … 216 224 ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 217 225 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 226 imask_night(ji,jj) = 0 218 227 ! 219 228 ELSE ! No day 220 229 zqsrout(ji,jj) = 0.e0 230 imask_night(ji,jj) = 1 221 231 ENDIF 222 232 ENDIF 223 233 END DO 224 234 END DO 235 ! 236 IF ( PRESENT(l_mask) .AND. l_mask ) THEN 237 zqsrout(:,:) = float(imask_night(:,:)) 238 ENDIF 225 239 ! 226 240 IF( nn_timing == 1 ) CALL timing_stop('sbc_dcy')
Note: See TracChangeset
for help on using the changeset viewer.