New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6101 for branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsfld.F90 – NEMO

Ignore:
Timestamp:
2015-12-17T16:48:41+01:00 (8 years ago)
Author:
cbricaud
Message:

correction of bugs from last update and improvments for CRS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsfld.F90

    r5602 r6101  
    2727   USE iom 
    2828   USE zdfmxl_crs 
     29   USE eosbn2 
     30   USE zdfevd_crs 
     31   USE zdftke 
     32   USE zdftke_crs 
     33 
     34!   USE ieee_arithmetic 
    2935 
    3036   IMPLICIT NONE 
     
    4046   !!---------------------------------------------------------------------- 
    4147   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    42    !! $Id$ 
     48   !! $Id $ 
    4349   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4450   !!---------------------------------------------------------------------- 
     
    6571      !! 
    6672      REAL(wp), POINTER, DIMENSION(:,:,:) :: zfse3t, zfse3u, zfse3v, zfse3w ! 3D workspace for e3 
    67       REAL(wp), POINTER, DIMENSION(:,:,:) :: zt, zs  
     73      REAL(wp), POINTER, DIMENSION(:,:,:) :: zt, zs , ztmp 
    6874      REAL(wp), POINTER, DIMENSION(:,:)   :: z2d,z2d_crs 
    69       REAL(wp), POINTER, DIMENSION(:,:,:) :: zt_crs, zs_crs ! 
     75      REAL(wp), POINTER, DIMENSION(:,:,:) :: zt_crs, zs_crs, zerr_crs,zmax_crs 
     76      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztmp_crs 
     77      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: avte_crs 
    7078      REAL(wp)       :: z2dcrsu, z2dcrsv 
    71       REAL(wp)       :: zmin,zmax 
     79      REAL(wp)       :: zmin,zmax,icnt1,icnt2 
    7280      INTEGER :: i,j,ijis,ijie,ijjs,ijje 
    7381      REAL(wp)       :: zw,zwp1,zum1,zu,zvm1,zv,zsnm,zsm,z 
     82      REAL(wp)       :: zerr, zerr0, zerr1, zmean 
     83      INTEGER,DIMENSION(4,3) :: ind 
     84      REAL(wp),DIMENSION(4) :: zwgt 
    7485      INTEGER ::  iji,ijj 
     86      INTEGER :: jl,jm,jn 
    7587      !! 
    7688      !!---------------------------------------------------------------------- 
     
    8193      CALL wrk_alloc( jpi, jpj, jpk, zfse3t, zfse3w ) 
    8294      CALL wrk_alloc( jpi, jpj, jpk, zfse3u, zfse3v ) 
    83       CALL wrk_alloc( jpi, jpj, jpk, zt, zs         ) 
     95      CALL wrk_alloc( jpi, jpj, jpk, zt, zs , ztmp        ) 
    8496      CALL wrk_alloc( jpi, jpj,      z2d            ) 
    8597      ! 
    86       CALL wrk_alloc( jpi_crs, jpj_crs, jpk, zt_crs, zs_crs ) 
     98      CALL wrk_alloc( jpi_crs, jpj_crs, jpk, zt_crs, zs_crs, zerr_crs,zmax_crs ) 
     99      CALL wrk_alloc( jpi_crs, jpj_crs, jpk, ztmp_crs ) 
     100      CALL wrk_alloc( jpi_crs, jpj_crs, jpk, 4, avte_crs ) 
    87101      CALL wrk_alloc( jpi_crs, jpj_crs, z2d_crs     ) 
    88102 
     
    129143      CALL iom_put( "sst" , tsn_crs(:,:,1,jp_tem) )    ! sst 
    130144 
    131        
     145      !n2 before 
     146      zt(:,:,:) = rn2b(:,:,:)  ;      zt_crs(:,:,:) = 0._wp 
     147      CALL crs_dom_ope( zt, 'VOL', 'W', tmask, zt_crs, p_e12=e1e2t, p_e3=zfse3t, psgn=1.0 ) 
     148      rb2_crs(:,:,:) = zt_crs(:,:,:) 
     149      CALL iom_put("rb2_crs",rb2_crs) 
     150 
    132151      !  Salinity 
    133152      zs(:,:,:) = tsb(:,:,:,jp_sal)  ;      zs_crs(:,:,:) = 0._wp 
     
    252271         CASE ( 2 ) 
    253272            CALL crs_dom_ope( avt, 'MIN', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=zfse3w, psgn=1.0 ) 
     273         CASE ( 3 ) 
     274            CALL crs_dom_ope( avt, 'LOGVOL', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=zfse3w, p_mask_crs=tmask_crs, psgn=1.0 ) 
     275         CASE ( 4 ) 
     276            CALL crs_dom_ope( avt, 'MED', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=zfse3w, psgn=1.0 ) 
     277         CASE ( 5 ) 
     278            CALL crs_dom_ope( en , 'VOL', 'W', tmask, en_crs, p_e12=e1e2t, p_e3=zfse3w, psgn=1.0 ) 
     279            CALL crs_dom_ope( taum , 'SUM', 'T', tmask, taum_crs , p_e12=e1e2t, p_surf_crs=e1e2t_crs, psgn=1.0 ) 
     280            CALL crs_dom_ope( rn2(:,:,:), 'VOL', 'W', tmask, rn2_crs, p_e12=e1e2t, p_e3=zfse3t, psgn=1.0 ) 
     281            IF( kt==nit000 )CALL tke_avn_ini_crs 
     282            CALL tke_avn_crs 
     283            CALL zdf_evd_crs(kt) 
     284         CASE ( 6 ) 
     285 
     286            avte_crs(:,:,:,:) = 0._wp 
     287            ztmp(:,:,:)=1. 
     288 
     289            zt(:,:,:) = 0._wp 
     290            zs(:,:,:) = 0._wp 
     291            DO jk=2,jpk  
     292               WHERE( fse3w(:,:,jk) .NE. 0._wp) zs(:,:,jk) = ( tsn(:,:,jk-1,jp_tem) - tsn(:,:,jk,jp_tem) ) / fse3w(:,:,jk) 
     293               zt(:,:,jk)=  avt(:,:,jk) *  zs(:,:,jk) 
     294            ENDDO 
     295            CALL crs_dom_ope( zt, 'VOL', 'W', tmask, zt_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     296            CALL crs_dom_ope( zs, 'VOL', 'W', tmask, zs_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     297            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte1_crs",zmin,zmax  
     298            zmin=MINVAL(zs_crs);zmax=MAXVAL(zs_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte1_crs",zmin,zmax  
     299            zt_crs=tmask_crs*zt_crs 
     300            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte1_crs",zmin,zmax  
     301            WHERE( zs_crs .NE. 0._wp ) avte_crs(:,:,:,1) = zt_crs / zs_crs 
     302            zmin=MINVAL(avte_crs(:,:,:,1));zmax=MAXVAL(avte_crs(:,:,:,1));CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte1_crs",zmin,zmax  
     303 
     304            zt(:,:,:) = 0._wp 
     305            zs(:,:,:) = 0._wp 
     306            DO jk=2,jpk  
     307               WHERE( fse3w(:,:,jk) .NE. 0._wp) zs(:,:,jk) = ( tsn(:,:,jk-1,jp_sal) - tsn(:,:,jk,jp_sal) ) / fse3w(:,:,jk) 
     308               zt(:,:,jk)=  avt(:,:,jk) *  zs(:,:,jk) 
     309            ENDDO 
     310            CALL crs_dom_ope( zt, 'VOL', 'W', tmask, zt_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     311            CALL crs_dom_ope( zs, 'VOL', 'W', tmask, zs_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     312            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte2_crs",zmin,zmax  
     313            zmin=MINVAL(zs_crs);zmax=MAXVAL(zs_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte2_crs",zmin,zmax  
     314            zt_crs=tmask_crs*zt_crs 
     315            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte1_crs",zmin,zmax 
     316            WHERE( zs_crs .NE. 0._wp ) avte_crs(:,:,:,2) = zt_crs / zs_crs 
     317            zmin=MINVAL(avte_crs(:,:,:,2));zmax=MAXVAL(avte_crs(:,:,:,2));CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte2_crs",zmin,zmax 
     318 
     319            zt(:,:,:) = 0._wp 
     320            zs(:,:,:) = 0._wp 
     321            DO jk=2,jpk 
     322                WHERE( fse3w(:,:,jk) .NE. 0._wp ) zs(:,:,jk)= ( rn_a0 * ( tsn(:,:,jk-1,jp_tem) - tsn(:,:,jk,jp_tem) ) +  & 
     323                                                                  &   rn_b0 * ( tsn(:,:,jk-1,jp_sal) - tsn(:,:,jk,jp_sal) ) )/ fse3w(:,:,jk)  
     324                zt(:,:,jk)=  avt(:,:,jk) *  zs(:,:,jk)                                                            
     325            ENDDO 
     326            CALL crs_dom_ope( zt, 'VOL', 'W', tmask, zt_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     327            CALL crs_dom_ope( zs, 'VOL', 'W', tmask, zs_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     328            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte3_crs",zmin,zmax  
     329            zmin=MINVAL(zs_crs);zmax=MAXVAL(zs_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte3_crs",zmin,zmax  
     330            zt_crs=tmask_crs*zt_crs 
     331            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte3_crs",zmin,zmax 
     332            WHERE( zs_crs .NE. 0._wp ) avte_crs(:,:,:,3) = zt_crs / zs_crs 
     333            zmin=MINVAL(avte_crs(:,:,:,3));zmax=MAXVAL(avte_crs(:,:,:,3));CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte3_crs",zmin,zmax 
     334 
     335            zt(:,:,:) = 0._wp 
     336            zs(:,:,:) = 0._wp 
     337            DO jk=2,jpk 
     338                WHERE( fse3w(:,:,jk) .NE. 0._wp ) zs(:,:,jk)= ( rn_a0 * ( tsn(:,:,jk-1,jp_tem) - tsn(:,:,jk,jp_tem) ) -  & 
     339                                                                  &   rn_b0 * ( tsn(:,:,jk-1,jp_sal) - tsn(:,:,jk,jp_sal) ) )/ fse3w(:,:,jk)  
     340                zt(:,:,jk)=  avt(:,:,jk) *  zs(:,:,jk) 
     341            ENDDO 
     342            CALL crs_dom_ope( zt, 'VOL', 'W', tmask, zt_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     343            CALL crs_dom_ope( zs, 'VOL', 'W', tmask, zs_crs, p_e12=e1e2t, p_e3=ztmp, psgn=1.0 ) 
     344            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte4_crs",zmin,zmax  
     345            zmin=MINVAL(zs_crs);zmax=MAXVAL(zs_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte4_crs",zmin,zmax  
     346            zt_crs=tmask_crs*zt_crs 
     347            zmin=MINVAL(zt_crs);zmax=MAXVAL(zt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte4_crs",zmin,zmax 
     348            WHERE( zs_crs .NE. 0._wp ) avte_crs(:,:,:,4) = zt_crs / zs_crs 
     349            zmin=MINVAL(avte_crs(:,:,:,4));zmax=MAXVAL(avte_crs(:,:,:,4));CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avte4_crs",zmin,zmax 
     350 
     351            CALL iom_put( "avte_crs1", avte_crs(:,:,:,1) )   !  Kz 
     352            CALL iom_put( "avte_crs2", avte_crs(:,:,:,2) )   !  Kz 
     353            CALL iom_put( "avte_crs3", avte_crs(:,:,:,3) )   !  Kz 
     354            CALL iom_put( "avte_crs4", avte_crs(:,:,:,4) )   !  Kz 
     355!---------------------  
     356            CALL crs_dom_ope( avt, 'MED', 'W', tmask, zs_crs, p_e12=e1e2t, p_e3=zfse3w, p_mask_crs=tmask_crs, psgn=1.0 ) 
     357!?            zmin=MINVAL(zs_crs*tmask_crs);zmax=MAXVAL(zs_crs*tmask_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"logvol zs_crs*tmask ",zmin,zmax ; call flush(numout) 
     358            CALL iom_put( "zs_crs", zs_crs )   !  Kzlogvol 
     359!--------------------- ok 
     360 
     361            CALL crs_dom_ope( avt, 'VOL', 'W', tmask, zmax_crs, p_e12=e1e2t, p_e3=zfse3w,  psgn=1.0 ) 
     362            WRITE(narea+200,*)"zmax_crs ",SHAPE(zmax_crs) ; call flush(narea+200) 
     363            CALL iom_put( "zmax_crs", zmax_crs )   !  Kzlogvol 
     364            zmin=MINVAL(zmax_crs*tmask_crs);zmax=MAXVAL(zmax_crs*tmask_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"vol zmax_crs*tmask ",zmin,zmax ; call flush(numout) 
     365!-------------------------nok 
     366            avt_crs=zs_crs 
     367 
     368 
     369            zerr0=0.01 
     370 
     371            icnt1=0 
     372            icnt2=0 
     373 
     374            zt_crs(:,:,:)=0._wp 
     375            zerr_crs(:,:,:)=0._wp 
     376            DO ji=1,jpi_crs  
     377            DO jj=1,jpj_crs  
     378            DO jk=1,jpk 
     379 
     380  
     381!-------------- 
     382               zwgt(1:4)=0._wp 
     383               DO jm=1,4 ; IF( avte_crs(ji,jj,jk,jm)  .GE. 0._wp .AND.  avte_crs(ji,jj,jk,jm)  .LE. zmax_crs(ji,jj,jk)  ) zwgt(jm) = 1._wp ; ENDDO 
     384!-------------- 
     385               IF( SUM(zwgt(1:4)) .NE. 0._wp ) THEN   
     386                  zmean = SUM( zwgt(1:4)*avte_crs(ji,jj,jk,1:4)) / SUM(zwgt(1:4) ) 
     387                  zerr  = SQRT(SUM( zwgt(1:4)*(avte_crs(ji,jj,jk,1:4)-zmean)*(avte_crs(ji,jj,jk,1:4)-zmean) ) / SUM(zwgt(1:4) ) ) 
     388               ELSE 
     389                  zmean=0._wp 
     390                 zerr=1.e10 
     391               ENDIF 
     392!-------------- 
     393 
     394               zerr_crs(ji,jj,jk)=zerr 
     395 
     396               IF( zerr .LE. zerr0 .AND. zmean .GT. 0._wp )zt_crs(ji,jj,jk)=zmean 
     397               IF( zerr .LE. zerr0 .AND. zmean .GT. 0._wp )avt_crs(ji,jj,jk)=zmean 
     398 
     399               IF( tmask_crs(ji,jj,jk) == 1 ) icnt1=icnt1+1 
     400               IF( tmask_crs(ji,jj,jk) == 1 .AND.  zerr .LE. zerr0 .AND. zmean .GT. 0._wp ) icnt2=icnt2+1 
     401 
     402               !IF( ieee_is_nan(  zt_crs(ji,jj,jk))   )WRITE(narea+200,*)"NANMEANEFF ",ji,jj,jk,tmask_crs(ji,jj,jk)  ; call flush(narea+200) 
     403               !IF( ieee_is_nan(  zs_crs(ji,jj,jk))   )WRITE(narea+200,*)"NANLOG ",ji,jj,jk,tmask_crs(ji,jj,jk)  ; call flush(narea+200) 
     404               !IF( ieee_is_nan( avt_crs(ji,jj,jk))   )WRITE(narea+200,*)"NANAVT ",ji,jj,jk,tmask_crs(ji,jj,jk)  ; call flush(narea+200) 
     405            ENDDO 
     406            ENDDO 
     407            ENDDO 
     408            zmin=MINVAL(avt_crs);zmax=MAXVAL(avt_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avt_crs ",zmin,zmax  ; call flush(numout) 
     409            zmin=MINVAL(avt_crs*tmask_crs);zmax=MAXVAL(avt_crs*tmask_crs);CALL mpp_min(zmin);CALL mpp_max(zmax);IF(lwp)WRITE(numout,*)"avt_crs*tmask ",zmin,zmax  ; call flush(numout) 
     410 
     411            CALL mpp_sum(icnt1) 
     412            CALL mpp_sum(icnt2) 
     413            IF(lwp)WRITE(numout,*)"TOTO",kt,icnt1,icnt2 
     414            CALL iom_put( "zt_crs", zt_crs )   !  Kz 
     415            CALL iom_put( "zerr_crs", zerr_crs )   !  Kz 
     416 
    254417      END SELECT 
    255418      ! 
     
    293456      CALL wrk_dealloc( jpi, jpj, jpk, zfse3t, zfse3w ) 
    294457      CALL wrk_dealloc( jpi, jpj, jpk, zfse3u, zfse3v ) 
    295       CALL wrk_dealloc( jpi, jpj, jpk, zt, zs         ) 
     458      CALL wrk_dealloc( jpi, jpj, jpk, zt, zs, ztmp   ) 
    296459      CALL wrk_dealloc( jpi, jpj, z2d                 ) 
    297       CALL wrk_dealloc( jpi_crs, jpj_crs, jpk, zt_crs, zs_crs ) 
     460      CALL wrk_dealloc( jpi_crs, jpj_crs, jpk, zt_crs, zs_crs, zerr_crs,zmax_crs ) 
     461      CALL wrk_dealloc( jpi_crs, jpj_crs, jpk, ztmp_crs ) 
     462      CALL wrk_dealloc( jpi_crs, jpj_crs, jpk, 4, avte_crs ) 
    298463      CALL wrk_dealloc( jpi_crs, jpj_crs, z2d_crs     ) 
    299464      ! 
Note: See TracChangeset for help on using the changeset viewer.