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 1884 for branches/TAM_V3_0/NEMO/OPA_SRC/geo2ocean.F90 – NEMO

Ignore:
Timestamp:
2010-05-27T11:26:52+02:00 (14 years ago)
Author:
rblod
Message:

Light adaptation of NEMO direct model routine to handle TAM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/TAM_V3_0/NEMO/OPA_SRC/geo2ocean.F90

    r1152 r1884  
    33   !!                     ***  MODULE  geo2ocean  *** 
    44   !! Ocean mesh    :  ??? 
    5    !!===================================================================== 
     5   !!====================================================================== 
     6   !! History :  OPA  !  07-1996  (O. Marti)  Original code 
     7   !!   NEMO     1.0  !  02-2008  (G. Madec)  F90: Free form 
     8   !!            3.0  !   
     9   !!---------------------------------------------------------------------- 
    610 
    711   !!---------------------------------------------------------------------- 
     
    1115   !!   repere      :   old routine suppress it ??? 
    1216   !!---------------------------------------------------------------------- 
    13    !! * Modules used 
    1417   USE dom_oce         ! mesh and scale factors 
    1518   USE phycst          ! physical constants 
     
    1821 
    1922   IMPLICIT NONE 
    20  
    21    !! * Accessibility 
    2223   PRIVATE 
    23    PUBLIC rot_rep, repcmo, repere, geo2oce   ! only rot_rep should be used 
     24 
     25   PUBLIC   rot_rep, repcmo, repere, geo2oce, oce2geo   ! only rot_rep should be used 
    2426                                             ! repcmo and repere are keep only for compatibility. 
    2527                                             ! they are only a useless overlay of rot_rep 
    26  
    27    !! * Module variables 
     28   PUBLIC   obs_rot 
     29 
    2830   REAL(wp), DIMENSION(jpi,jpj) ::   & 
    2931      gsint, gcost,   &  ! cos/sin between model grid lines and NP direction at T point 
     
    3436   LOGICAL ::   lmust_init = .TRUE.        !: used to initialize the cos/sin variables (se above) 
    3537 
    36   !! * Substitutions 
     38   !! * Substitutions 
    3739#  include "vectopt_loop_substitute.h90" 
    38    !!--------------------------------------------------------------------------------- 
    39    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    40    !! $Id$ 
    41    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    42    !!--------------------------------------------------------------------------------- 
     40   !!---------------------------------------------------------------------- 
     41   !! NEMO/OPA 3.0 , LOCEAN-IPSL (2008)  
     42   !! $Id$  
     43   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     44   !!---------------------------------------------------------------------- 
    4345 
    4446CONTAINS 
     
    5456      !! ** Method  :   Initialization of arrays at the first call. 
    5557      !! 
    56       !! ** Action  : - px2 : first componante (defined at u point) 
     58      !! ** Action  : - px2 : first  componante (defined at u point) 
    5759      !!              - py2 : second componante (defined at v point) 
    58       !! 
    59       !! History : 
    60       !!   7.0  !  07-96  (O. Marti)  Original code 
    61       !!   8.5  !  02-08  (G. Madec)  F90: Free form 
    62       !!---------------------------------------------------------------------- 
    63       !! * Arguments  
    64       REAL(wp), INTENT( in ), DIMENSION(jpi,jpj) ::   &  
    65          pxu1, pyu1,     & ! geographic vector componantes at u-point 
    66          pxv1, pyv1        ! geographic vector componantes at v-point 
    67       REAL(wp), INTENT( out ), DIMENSION(jpi,jpj) ::   &  
    68          px2,            & ! i-componante (defined at u-point) 
    69          py2               ! j-componante (defined at v-point) 
     60      !!---------------------------------------------------------------------- 
     61      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   pxu1, pyu1   ! geographic vector componantes at u-point 
     62      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   pxv1, pyv1   ! geographic vector componantes at v-point 
     63      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   px2          ! i-componante (defined at u-point) 
     64      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   py2          ! j-componante (defined at v-point) 
    7065      !!---------------------------------------------------------------------- 
    7166       
    7267      ! Change from geographic to stretched coordinate 
    7368      ! ---------------------------------------------- 
    74        
    7569      CALL rot_rep( pxu1, pyu1, 'U', 'en->i',px2 ) 
    7670      CALL rot_rep( pxv1, pyv1, 'V', 'en->j',py2 ) 
     
    9084      !!                  (O. Marti ) Original code (repere and repcmo) 
    9185      !!---------------------------------------------------------------------- 
    92       !! * Arguments  
    9386      REAL(wp), DIMENSION(jpi,jpj), INTENT( IN ) ::   pxin, pyin   ! vector componantes 
    9487      CHARACTER(len=1),             INTENT( IN ) ::   cd_type      ! define the nature of pt2d array grid-points 
     
    172165      !!   9.2  !  07-04  (S. Masson)  Add T, F points and bugfix in cos lateral boundary 
    173166      !!---------------------------------------------------------------------- 
    174       !! * local declarations 
    175167      INTEGER ::   ji, jj      ! dummy loop indices 
    176  
     168      !! 
    177169      REAL(wp) ::   & 
    178170         zlam, zphi,            &  ! temporary scalars 
     
    320312 
    321313      ! lateral boundary cond.: T-, U-, V-, F-pts, sgn 
    322       CALL lbc_lnk ( gcost, 'T', 1. )   ;   CALL lbc_lnk( gsint, 'T', -1. ) 
    323       CALL lbc_lnk ( gcosu, 'U', 1. )   ;   CALL lbc_lnk( gsinu, 'U', -1. ) 
    324       CALL lbc_lnk ( gcosv, 'V', 1. )   ;   CALL lbc_lnk( gsinv, 'V', -1. ) 
    325       CALL lbc_lnk ( gcosf, 'F', 1. )   ;   CALL lbc_lnk( gsinf, 'F', -1. ) 
     314      CALL lbc_lnk( gcost, 'T', 1. )   ;   CALL lbc_lnk( gsint, 'T', -1. ) 
     315      CALL lbc_lnk( gcosu, 'U', 1. )   ;   CALL lbc_lnk( gsinu, 'U', -1. ) 
     316      CALL lbc_lnk( gcosv, 'V', 1. )   ;   CALL lbc_lnk( gsinv, 'V', -1. ) 
     317      CALL lbc_lnk( gcosf, 'F', 1. )   ;   CALL lbc_lnk( gsinf, 'F', -1. ) 
    326318 
    327319   END SUBROUTINE angle 
    328320 
    329321 
    330    SUBROUTINE geo2oce ( pxx , pyy , pzz, cgrid,     & 
    331                         plon, plat, pte, ptn  , ptv ) 
     322   SUBROUTINE geo2oce ( pxx, pyy, pzz, cgrid,     & 
     323                        pte, ptn ) 
    332324      !!---------------------------------------------------------------------- 
    333325      !!                    ***  ROUTINE geo2oce  *** 
     
    344336      !!        !  00-08  (D. Ludicone) Reduced section at Bab el Mandeb 
    345337      !!   8.5  !  02-06  (G. Madec)  F90: Free form 
    346       !!---------------------------------------------------------------------- 
    347       !! * Local declarations 
    348       REAL(wp), INTENT( in ), DIMENSION(jpi,jpj) ::   & 
    349          pxx, pyy, pzz 
    350       CHARACTER (len=1), INTENT( in) ::   & 
    351          cgrid 
    352       REAL(wp), INTENT( in ), DIMENSION(jpi,jpj) ::   & 
    353          plon, plat 
    354       REAL(wp), INTENT(out), DIMENSION(jpi,jpj) ::    & 
    355          pte, ptn, ptv 
     338      !!   3.0  !  07-08  (G. Madec)  geo2oce suppress lon/lat agruments 
     339      !!---------------------------------------------------------------------- 
     340      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::  pxx, pyy, pzz 
     341      CHARACTER(len=1)            , INTENT(in   ) ::  cgrid 
     342      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::  pte, ptn 
     343      !! 
    356344      REAL(wp), PARAMETER :: rpi = 3.141592653E0 
    357345      REAL(wp), PARAMETER :: rad = rpi / 180.e0 
    358  
    359       !! * Local variables 
    360346      INTEGER ::   ig     ! 
    361  
    362347      !! * Local save 
    363       REAL(wp), SAVE, DIMENSION(jpi,jpj,4) ::   & 
    364          zsinlon, zcoslon,   & 
    365          zsinlat, zcoslat 
    366       LOGICAL, SAVE, DIMENSION (4) ::   & 
    367          linit = .FALSE. 
     348      REAL(wp), SAVE, DIMENSION(jpi,jpj,4) ::   zsinlon, zcoslon, zsinlat, zcoslat 
     349      LOGICAL , SAVE, DIMENSION(4)         ::   linit = .FALSE. 
    368350      !!---------------------------------------------------------------------- 
    369351 
    370352      SELECT CASE( cgrid) 
    371  
    372          CASE ( 't' ) ;; ig = 1 
    373          CASE ( 'u' ) ;; ig = 2 
    374          CASE ( 'v' ) ;; ig = 3 
    375          CASE ( 'f' ) ;; ig = 4 
    376  
    377          CASE default 
     353         CASE ( 'T' )    
     354            ig = 1 
     355            IF( .NOT. linit(ig) ) THEN  
     356               zsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
     357               zcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
     358               zsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
     359               zcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
     360               linit(ig) = .TRUE. 
     361            ENDIF 
     362         CASE ( 'U' )    
     363            ig = 2 
     364            IF( .NOT. linit(ig) ) THEN  
     365               zsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
     366               zcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
     367               zsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
     368               zcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
     369               linit(ig) = .TRUE. 
     370            ENDIF 
     371         CASE ( 'V' )    
     372            ig = 3 
     373            IF( .NOT. linit(ig) ) THEN  
     374               zsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
     375               zcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
     376               zsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
     377               zcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
     378               linit(ig) = .TRUE. 
     379            ENDIF 
     380         CASE ( 'F' )    
     381            ig = 4 
     382            IF( .NOT. linit(ig) ) THEN  
     383               zsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
     384               zcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
     385               zsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
     386               zcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
     387               linit(ig) = .TRUE. 
     388            ENDIF 
     389         CASE default    
    378390            WRITE(ctmp1,*) 'geo2oce : bad grid argument : ', cgrid 
    379391            CALL ctl_stop( ctmp1 ) 
    380        END SELECT 
    381        
    382       IF( .NOT. linit(ig) ) THEN  
    383          zsinlon (:,:,ig) = SIN (rad * plon) 
    384          zcoslon (:,:,ig) = COS (rad * plon) 
    385          zsinlat (:,:,ig) = SIN (rad * plat) 
    386          zcoslat (:,:,ig) = COS (rad * plat) 
    387          linit (ig) = .TRUE. 
    388       ENDIF 
    389        
    390       pte = - zsinlon (:,:,ig) * pxx + zcoslon (:,:,ig) * pyy 
    391       ptn = - zcoslon (:,:,ig) * zsinlat (:,:,ig) * pxx    & 
    392             - zsinlon (:,:,ig) * zsinlat (:,:,ig) * pyy    & 
    393             + zcoslat (:,:,ig) * pzz 
    394       ptv =   zcoslon (:,:,ig) * zcoslat (:,:,ig) * pxx    & 
    395             + zsinlon (:,:,ig) * zcoslat (:,:,ig) * pyy    & 
    396             + zsinlat (:,:,ig) * pzz 
    397  
     392      END SELECT 
     393       
     394      pte = - zsinlon(:,:,ig) * pxx + zcoslon(:,:,ig) * pyy 
     395      ptn = - zcoslon(:,:,ig) * zsinlat(:,:,ig) * pxx    & 
     396            - zsinlon(:,:,ig) * zsinlat(:,:,ig) * pyy    & 
     397            + zcoslat(:,:,ig) * pzz 
     398!!$   ptv =   zcoslon(:,:,ig) * zcoslat(:,:,ig) * pxx    & 
     399!!$         + zsinlon(:,:,ig) * zcoslat(:,:,ig) * pyy    & 
     400!!$         + zsinlat(:,:,ig) * pzz 
     401      ! 
    398402   END SUBROUTINE geo2oce 
     403 
     404   SUBROUTINE oce2geo ( pte, ptn, cgrid,     & 
     405                        pxx , pyy , pzz ) 
     406      !!---------------------------------------------------------------------- 
     407      !!                    ***  ROUTINE oce2geo  *** 
     408      !!       
     409      !! ** Purpose : 
     410      !! 
     411      !! ** Method  :   Change vector from east/north to geocentric 
     412      !! 
     413      !! History : 
     414      !!        !         (A. Caubel)  oce2geo - Original code 
     415      !!---------------------------------------------------------------------- 
     416      REAL(wp), DIMENSION(jpi,jpj), INTENT( IN    ) ::  pte, ptn 
     417      CHARACTER(len=1)            , INTENT( IN    ) ::  cgrid 
     418      REAL(wp), DIMENSION(jpi,jpj), INTENT(   OUT ) ::  pxx , pyy , pzz 
     419      !! 
     420      REAL(wp), PARAMETER :: rpi = 3.141592653E0 
     421      REAL(wp), PARAMETER :: rad = rpi / 180.e0 
     422      INTEGER ::   ig     ! 
     423      !! * Local save 
     424      REAL(wp), SAVE, DIMENSION(jpi,jpj,4) ::   zsinlon, zcoslon, zsinlat, zcoslat 
     425      LOGICAL , SAVE, DIMENSION(4)         ::   linit = .FALSE. 
     426      !!---------------------------------------------------------------------- 
     427 
     428      SELECT CASE( cgrid) 
     429         CASE ( 'T' )    
     430            ig = 1 
     431            IF( .NOT. linit(ig) ) THEN  
     432               zsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
     433               zcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
     434               zsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
     435               zcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
     436               linit(ig) = .TRUE. 
     437            ENDIF 
     438         CASE ( 'U' )    
     439            ig = 2 
     440            IF( .NOT. linit(ig) ) THEN  
     441               zsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
     442               zcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
     443               zsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
     444               zcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
     445               linit(ig) = .TRUE. 
     446            ENDIF 
     447         CASE ( 'V' )    
     448            ig = 3 
     449            IF( .NOT. linit(ig) ) THEN  
     450               zsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
     451               zcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
     452               zsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
     453               zcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
     454               linit(ig) = .TRUE. 
     455            ENDIF 
     456         CASE ( 'F' )    
     457            ig = 4 
     458            IF( .NOT. linit(ig) ) THEN  
     459               zsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
     460               zcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
     461               zsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
     462               zcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
     463               linit(ig) = .TRUE. 
     464            ENDIF 
     465         CASE default    
     466            WRITE(ctmp1,*) 'geo2oce : bad grid argument : ', cgrid 
     467            CALL ctl_stop( ctmp1 ) 
     468      END SELECT 
     469 
     470       pxx = - zsinlon(:,:,ig) * pte - zcoslon(:,:,ig) * zsinlat(:,:,ig) * ptn  
     471       pyy =   zcoslon(:,:,ig) * pte - zsinlon(:,:,ig) * zsinlat(:,:,ig) * ptn 
     472       pzz =   zcoslat(:,:,ig) * ptn 
     473 
     474       
     475   END SUBROUTINE oce2geo 
    399476 
    400477 
     
    446523   END SUBROUTINE repere 
    447524 
     525   SUBROUTINE obs_rot ( psinu, pcosu, psinv, pcosv ) 
     526      !!---------------------------------------------------------------------- 
     527      !!                  ***  ROUTINE obs_rot  *** 
     528      !! 
     529      !! ** Purpose :   Copy gsinu, gcosu, gsinv and gsinv  
     530      !!                to input data for rotations of 
     531      !!                current at observation points 
     532      !! 
     533      !! History : 
     534      !!   9.2  !  09-02  (K. Mogensen) 
     535      !!---------------------------------------------------------------------- 
     536      REAL(wp), DIMENSION(jpi,jpj), INTENT( OUT )::   & 
     537         & psinu, pcosu, psinv, pcosv! copy of data 
     538 
     539      !!---------------------------------------------------------------------- 
     540 
     541      ! Initialization of gsin* and gcos* at first call 
     542      ! ----------------------------------------------- 
     543 
     544      IF( lmust_init ) THEN 
     545         IF(lwp) WRITE(numout,*) 
     546         IF(lwp) WRITE(numout,*) ' obs_rot : geographic <--> stretched' 
     547         IF(lwp) WRITE(numout,*) ' ~~~~~~~   coordinate transformation' 
     548 
     549         CALL angle       ! initialization of the transformation 
     550         lmust_init = .FALSE. 
     551 
     552      ENDIF 
     553       
     554      psinu(:,:) = gsinu(:,:) 
     555      pcosu(:,:) = gcosu(:,:) 
     556      psinv(:,:) = gsinv(:,:) 
     557      pcosv(:,:) = gcosv(:,:) 
     558       
     559   END SUBROUTINE obs_rot 
     560 
     561 
    448562  !!====================================================================== 
    449563END MODULE geo2ocean 
Note: See TracChangeset for help on using the changeset viewer.