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 9031 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90 – NEMO

Ignore:
Timestamp:
2017-12-14T11:10:02+01:00 (6 years ago)
Author:
timgraham
Message:

Resolved AGRIF conflicts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90

    r9019 r9031  
    1717 
    1818   PUBLIC agrif_oce_alloc ! routine called by nemo_init in nemogcm.F90 
    19  
     19#if defined key_vertical 
     20   PUBLIC reconstructandremap ! remapping routine 
     21#endif    
    2022   !                                              !!* Namelist namagrif: AGRIF parameters 
    2123   LOGICAL , PUBLIC ::   ln_spc_dyn    = .FALSE.   !: 
    22    INTEGER , PUBLIC ::   nn_cln_update = 3         !: update frequency  
    2324   INTEGER , PUBLIC, PARAMETER ::   nn_sponge_len = 2  !: Sponge width (in number of parent grid points) 
    2425   REAL(wp), PUBLIC ::   rn_sponge_tra = 2800.     !: sponge coeff. for tracers 
    2526   REAL(wp), PUBLIC ::   rn_sponge_dyn = 2800.     !: sponge coeff. for dynamics 
    2627   LOGICAL , PUBLIC ::   ln_chk_bathy  = .FALSE.   !: check of parent bathymetry  
    27  
     28   LOGICAL , PUBLIC ::   lk_agrif_clp  = .TRUE.    !: Force clamped bcs 
    2829   !                                              !!! OLD namelist names 
    29    INTEGER , PUBLIC ::   nbcline = 0               !: update counter 
    30    INTEGER , PUBLIC ::   nbclineupdate             !: update frequency  
    3130   REAL(wp), PUBLIC ::   visc_tra                  !: sponge coeff. for tracers 
    3231   REAL(wp), PUBLIC ::   visc_dyn                  !: sponge coeff. for dynamics 
     
    3534   LOGICAL , PUBLIC :: spongedoneU = .FALSE.       !: dynamics sponge layer indicator 
    3635   LOGICAL , PUBLIC :: lk_agrif_fstep = .TRUE.     !: if true: first step 
    37    LOGICAL , PUBLIC :: lk_agrif_doupd = .TRUE.     !: if true: send update from current grid 
    3836   LOGICAL , PUBLIC :: lk_agrif_debug = .FALSE.    !: if true: print debugging info 
    3937 
     
    102100   END FUNCTION agrif_oce_alloc 
    103101 
     102#if defined key_vertical 
     103   SUBROUTINE reconstructandremap(tabin,hin,tabout,hout,N,Nout)       
     104      !!---------------------------------------------------------------------- 
     105      !!                ***  FUNCTION reconstructandremap  *** 
     106      !!---------------------------------------------------------------------- 
     107      IMPLICIT NONE 
     108      INTEGER N, Nout 
     109      REAL(wp) tabin(N), tabout(Nout) 
     110      REAL(wp) hin(N), hout(Nout) 
     111      REAL(wp) coeffremap(N,3),zwork(N,3) 
     112      REAL(wp) zwork2(N+1,3) 
     113      INTEGER jk 
     114      DOUBLE PRECISION, PARAMETER :: dsmll=1.0d-8   
     115      REAL(wp) q,q01,q02,q001,q002,q0 
     116      REAL(wp) z_win(1:N+1), z_wout(1:Nout+1) 
     117      REAL(wp),PARAMETER :: dpthin = 1.D-3 
     118      INTEGER :: k1, kbox, ktop, ka, kbot 
     119      REAL(wp) :: tsum, qbot, rpsum, zbox, ztop, zthk, zbot, offset, qtop 
     120 
     121      z_win(1)=0.; z_wout(1)= 0. 
     122      DO jk=1,N 
     123         z_win(jk+1)=z_win(jk)+hin(jk) 
     124      ENDDO  
     125       
     126      DO jk=1,Nout 
     127         z_wout(jk+1)=z_wout(jk)+hout(jk)        
     128      ENDDO        
     129 
     130      DO jk=2,N 
     131         zwork(jk,1)=1./(hin(jk-1)+hin(jk)) 
     132      ENDDO 
     133         
     134      DO jk=2,N-1 
     135         q0 = 1./(hin(jk-1)+hin(jk)+hin(jk+1)) 
     136         zwork(jk,2)=hin(jk-1)+2.*hin(jk)+hin(jk+1) 
     137         zwork(jk,3)=q0 
     138      ENDDO        
     139      
     140      DO jk= 2,N 
     141         zwork2(jk,1)=zwork(jk,1)*(tabin(jk)-tabin(jk-1)) 
     142      ENDDO 
     143         
     144      coeffremap(:,1) = tabin(:) 
     145  
     146      DO jk=2,N-1 
     147         q001 = hin(jk)*zwork2(jk+1,1) 
     148         q002 = hin(jk)*zwork2(jk,1)         
     149         IF (q001*q002 < 0) then 
     150            q001 = 0. 
     151            q002 = 0. 
     152         ENDIF 
     153         q=zwork(jk,2) 
     154         q01=q*zwork2(jk+1,1) 
     155         q02=q*zwork2(jk,1) 
     156         IF (abs(q001) > abs(q02)) q001 = q02 
     157         IF (abs(q002) > abs(q01)) q002 = q01 
     158         
     159         q=(q001-q002)*zwork(jk,3) 
     160         q001=q001-q*hin(jk+1) 
     161         q002=q002+q*hin(jk-1) 
     162         
     163         coeffremap(jk,3)=coeffremap(jk,1)+q001 
     164         coeffremap(jk,2)=coeffremap(jk,1)-q002 
     165         
     166         zwork2(jk,1)=(2.*q001-q002)**2 
     167         zwork2(jk,2)=(2.*q002-q001)**2 
     168      ENDDO 
     169         
     170      DO jk=1,N 
     171         IF(jk.EQ.1 .OR. jk.EQ.N .OR. hin(jk).LE.dpthin) THEN 
     172            coeffremap(jk,3) = coeffremap(jk,1) 
     173            coeffremap(jk,2) = coeffremap(jk,1) 
     174            zwork2(jk,1) = 0. 
     175            zwork2(jk,2) = 0. 
     176         ENDIF 
     177      ENDDO 
     178         
     179      DO jk=2,N 
     180         q002=max(zwork2(jk-1,2),dsmll) 
     181         q001=max(zwork2(jk,1),dsmll) 
     182         zwork2(jk,3)=(q001*coeffremap(jk-1,3)+q002*coeffremap(jk,2))/(q001+q002) 
     183      ENDDO 
     184         
     185      zwork2(1,3) = 2*coeffremap(1,1)-zwork2(2,3) 
     186      zwork2(N+1,3)=2*coeffremap(N,1)-zwork2(N,3) 
     187  
     188      DO jk=1,N 
     189         q01=zwork2(jk+1,3)-coeffremap(jk,1) 
     190         q02=coeffremap(jk,1)-zwork2(jk,3) 
     191         q001=2.*q01 
     192         q002=2.*q02 
     193         IF (q01*q02<0) then 
     194            q01=0. 
     195            q02=0. 
     196         ELSEIF (abs(q01)>abs(q002)) then 
     197            q01=q002 
     198         ELSEIF (abs(q02)>abs(q001)) then 
     199            q02=q001 
     200         ENDIF 
     201         coeffremap(jk,2)=coeffremap(jk,1)-q02 
     202         coeffremap(jk,3)=coeffremap(jk,1)+q01 
     203      ENDDO 
     204 
     205      zbot=0.0 
     206      kbot=1 
     207      DO jk=1,Nout 
     208         ztop=zbot  !top is bottom of previous layer 
     209         ktop=kbot 
     210         IF     (ztop.GE.z_win(ktop+1)) then 
     211            ktop=ktop+1 
     212         ENDIF 
     213         
     214         zbot=z_wout(jk+1) 
     215         zthk=zbot-ztop 
     216 
     217         IF(zthk.GT.dpthin .AND. ztop.LT.z_wout(Nout+1)) THEN 
     218 
     219            kbot=ktop 
     220            DO while (z_win(kbot+1).lt.zbot.and.kbot.lt.N) 
     221               kbot=kbot+1 
     222            ENDDO 
     223            zbox=zbot 
     224            DO k1= jk+1,Nout 
     225               IF     (z_wout(k1+1)-z_wout(k1).GT.dpthin) THEN 
     226                  exit !thick layer 
     227               ELSE 
     228                  zbox=z_wout(k1+1)  !include thin adjacent layers 
     229                  IF(zbox.EQ.z_wout(Nout+1)) THEN 
     230                     exit !at bottom 
     231                  ENDIF 
     232               ENDIF 
     233            ENDDO 
     234            zthk=zbox-ztop 
     235 
     236            kbox=ktop 
     237            DO while (z_win(kbox+1).lt.zbox.and.kbox.lt.N) 
     238               kbox=kbox+1 
     239            ENDDO 
     240           
     241            IF(ktop.EQ.kbox) THEN 
     242               IF(z_wout(jk).NE.z_win(kbox).OR.z_wout(jk+1).NE.z_win(kbox+1)) THEN 
     243                  IF(hin(kbox).GT.dpthin) THEN 
     244                     q001 = (zbox-z_win(kbox))/hin(kbox) 
     245                     q002 = (ztop-z_win(kbox))/hin(kbox) 
     246                     q01=q001**2+q002**2+q001*q002+1.-2.*(q001+q002) 
     247                     q02=q01-1.+(q001+q002) 
     248                     q0=1.-q01-q02 
     249                  ELSE 
     250                     q0 = 1.0 
     251                     q01 = 0. 
     252                     q02 = 0. 
     253                  ENDIF 
     254                  tabout(jk)=q0*coeffremap(kbox,1)+q01*coeffremap(kbox,2)+q02*coeffremap(kbox,3) 
     255               ELSE 
     256                  tabout(jk) = tabin(kbox) 
     257               ENDIF  
     258            ELSE 
     259               IF(ktop.LE.jk .AND. kbox.GE.jk) THEN 
     260                  ka = jk 
     261               ELSEIF (kbox-ktop.GE.3) THEN 
     262                  ka = (kbox+ktop)/2 
     263               ELSEIF (hin(ktop).GE.hin(kbox)) THEN 
     264                  ka = ktop 
     265               ELSE 
     266                  ka = kbox 
     267               ENDIF !choose ka 
     268     
     269               offset=coeffremap(ka,1) 
     270     
     271               qtop = z_win(ktop+1)-ztop !partial layer thickness 
     272               IF(hin(ktop).GT.dpthin) THEN 
     273                  q=(ztop-z_win(ktop))/hin(ktop) 
     274                  q01=q*(q-1.) 
     275                  q02=q01+q 
     276                  q0=1-q01-q02             
     277               ELSE 
     278                  q0 = 1. 
     279                  q01 = 0. 
     280                  q02 = 0. 
     281               ENDIF 
     282                
     283               tsum =((q0*coeffremap(ktop,1)+q01*coeffremap(ktop,2)+q02*coeffremap(ktop,3))-offset)*qtop 
     284     
     285               DO k1= ktop+1,kbox-1 
     286                  tsum =tsum +(coeffremap(k1,1)-offset)*hin(k1) 
     287               ENDDO !k1 
     288                
     289               qbot = zbox-z_win(kbox) !partial layer thickness 
     290               IF(hin(kbox).GT.dpthin) THEN 
     291                  q=qbot/hin(kbox) 
     292                  q01=(q-1.)**2 
     293                  q02=q01-1.+q 
     294                  q0=1-q01-q02                             
     295               ELSE 
     296                  q0 = 1.0 
     297                  q01 = 0. 
     298                  q02 = 0. 
     299               ENDIF 
     300               
     301               tsum = tsum +((q0*coeffremap(kbox,1)+q01*coeffremap(kbox,2)+q02*coeffremap(kbox,3))-offset)*qbot 
     302                
     303               rpsum=1.0d0/zthk 
     304               tabout(jk)=offset+tsum*rpsum 
     305                  
     306            ENDIF !single or multiple layers 
     307         ELSE 
     308            IF (jk==1) THEN 
     309               write(*,'(a7,i4,i4,3f12.5)')'problem = ',N,Nout,zthk,z_wout(jk+1),hout(1) 
     310            ENDIF 
     311            tabout(jk) = tabout(jk-1) 
     312              
     313         ENDIF !normal:thin layer 
     314      ENDDO !jk 
     315             
     316      return 
     317      end subroutine reconstructandremap 
     318#endif 
     319 
    104320#endif 
    105321   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.