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 2715 for trunk/NEMOGCM/NEMO/OPA_SRC/SBC/geo2ocean.F90 – NEMO

Ignore:
Timestamp:
2011-03-30T17:58:35+02:00 (13 years ago)
Author:
rblod
Message:

First attempt to put dynamic allocation on the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/SBC/geo2ocean.F90

    r2528 r2715  
    1919   USE in_out_manager  ! I/O manager 
    2020   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     21   USE lib_mpp         ! MPP library 
    2122 
    2223   IMPLICIT NONE 
     
    2930   PUBLIC   obs_rot 
    3031 
    31    REAL(wp), DIMENSION(jpi,jpj) ::   & 
     32   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   & 
    3233      gsint, gcost,   &  ! cos/sin between model grid lines and NP direction at T point 
    3334      gsinu, gcosu,   &  ! cos/sin between model grid lines and NP direction at U point 
    3435      gsinv, gcosv,   &  ! cos/sin between model grid lines and NP direction at V point 
    3536      gsinf, gcosf       ! cos/sin between model grid lines and NP direction at F point 
     37 
     38   LOGICAL ,              SAVE, DIMENSION(4)     ::   linit = .FALSE. 
     39   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gsinlon, gcoslon, gsinlat, gcoslat 
    3640 
    3741   LOGICAL ::   lmust_init = .TRUE.        !: used to initialize the cos/sin variables (se above) 
     
    4246   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    4347   !! $Id$  
    44    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     48   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4549   !!---------------------------------------------------------------------- 
    46  
    4750CONTAINS 
    4851 
     
    9396      !!                                                           ! 'ij->n' model i-j componantes to east componante 
    9497      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) ::   prot       
    95  
    9698      !!---------------------------------------------------------------------- 
    9799 
     
    103105         IF(lwp) WRITE(numout,*) ' rot_rep : geographic <--> stretched' 
    104106         IF(lwp) WRITE(numout,*) ' ~~~~~    coordinate transformation' 
    105  
     107         ! 
    106108         CALL angle       ! initialization of the transformation 
    107109         lmust_init = .FALSE. 
    108  
    109110      ENDIF 
    110111       
     
    166167      !!   9.2  !  07-04  (S. Masson)  Add T, F points and bugfix in cos lateral boundary 
    167168      !!---------------------------------------------------------------------- 
    168       INTEGER ::   ji, jj      ! dummy loop indices 
    169       !! 
     169      INTEGER ::   ji, jj   ! dummy loop indices 
     170      INTEGER ::   ierr     ! local integer 
    170171      REAL(wp) ::   & 
    171172         zlam, zphi,            &  ! temporary scalars 
     
    181182      !!---------------------------------------------------------------------- 
    182183 
     184      ALLOCATE( gsint(jpi,jpj), gcost(jpi,jpj),   &  
     185         &      gsinu(jpi,jpj), gcosu(jpi,jpj),   &  
     186         &      gsinv(jpi,jpj), gcosv(jpi,jpj),   &   
     187         &      gsinf(jpi,jpj), gcosf(jpi,jpj), STAT=ierr ) 
     188      IF(lk_mpp)   CALL mpp_sum( ierr ) 
     189      IF( ierr /= 0 )   CALL ctl_stop('STOP', 'angle_msh_geo: unable to allocate arrays' ) 
     190 
    183191      ! ============================= ! 
    184192      ! Compute the cosinus and sinus ! 
     
    343351      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::  pte, ptn 
    344352      !! 
    345       REAL(wp), PARAMETER :: rpi = 3.141592653E0 
     353      REAL(wp), PARAMETER :: rpi = 3.141592653e0 
    346354      REAL(wp), PARAMETER :: rad = rpi / 180.e0 
    347355      INTEGER ::   ig     ! 
    348       !! * Local save 
    349       REAL(wp), SAVE, DIMENSION(jpi,jpj,4) ::   zsinlon, zcoslon, zsinlat, zcoslat 
    350       LOGICAL , SAVE, DIMENSION(4)         ::   linit = .FALSE. 
    351       !!---------------------------------------------------------------------- 
     356      INTEGER ::   ierr   ! local integer 
     357      !!---------------------------------------------------------------------- 
     358 
     359      IF( .NOT. ALLOCATED( gsinlon ) ) THEN 
     360         ALLOCATE( gsinlon(jpi,jpj,4) , gcoslon(jpi,jpj,4) ,   & 
     361            &      gsinlat(jpi,jpj,4) , gcoslat(jpi,jpj,4) , STAT=ierr ) 
     362         IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     363         IF( ierr /= 0 )   CALL ctl_stop('STOP', 'angle_msh_geo: unable to allocate arrays' ) 
     364      ENDIF 
    352365 
    353366      SELECT CASE( cgrid) 
     
    355368            ig = 1 
    356369            IF( .NOT. linit(ig) ) THEN  
    357                zsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
    358                zcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
    359                zsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
    360                zcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
     370               gsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
     371               gcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
     372               gsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
     373               gcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
    361374               linit(ig) = .TRUE. 
    362375            ENDIF 
     
    364377            ig = 2 
    365378            IF( .NOT. linit(ig) ) THEN  
    366                zsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
    367                zcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
    368                zsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
    369                zcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
     379               gsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
     380               gcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
     381               gsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
     382               gcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
    370383               linit(ig) = .TRUE. 
    371384            ENDIF 
     
    373386            ig = 3 
    374387            IF( .NOT. linit(ig) ) THEN  
    375                zsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
    376                zcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
    377                zsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
    378                zcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
     388               gsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
     389               gcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
     390               gsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
     391               gcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
    379392               linit(ig) = .TRUE. 
    380393            ENDIF 
     
    382395            ig = 4 
    383396            IF( .NOT. linit(ig) ) THEN  
    384                zsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
    385                zcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
    386                zsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
    387                zcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
     397               gsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
     398               gcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
     399               gsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
     400               gcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
    388401               linit(ig) = .TRUE. 
    389402            ENDIF 
     
    393406      END SELECT 
    394407       
    395       pte = - zsinlon(:,:,ig) * pxx + zcoslon(:,:,ig) * pyy 
    396       ptn = - zcoslon(:,:,ig) * zsinlat(:,:,ig) * pxx    & 
    397             - zsinlon(:,:,ig) * zsinlat(:,:,ig) * pyy    & 
    398             + zcoslat(:,:,ig) * pzz 
    399 !!$   ptv =   zcoslon(:,:,ig) * zcoslat(:,:,ig) * pxx    & 
    400 !!$         + zsinlon(:,:,ig) * zcoslat(:,:,ig) * pyy    & 
    401 !!$         + zsinlat(:,:,ig) * pzz 
     408      pte = - gsinlon(:,:,ig) * pxx + gcoslon(:,:,ig) * pyy 
     409      ptn = - gcoslon(:,:,ig) * gsinlat(:,:,ig) * pxx    & 
     410            - gsinlon(:,:,ig) * gsinlat(:,:,ig) * pyy    & 
     411            + gcoslat(:,:,ig) * pzz 
     412!!$   ptv =   gcoslon(:,:,ig) * gcoslat(:,:,ig) * pxx    & 
     413!!$         + gsinlon(:,:,ig) * gcoslat(:,:,ig) * pyy    & 
     414!!$         + gsinlat(:,:,ig) * pzz 
    402415      ! 
    403416   END SUBROUTINE geo2oce 
     
    422435      REAL(wp), PARAMETER :: rad = rpi / 180.e0 
    423436      INTEGER ::   ig     ! 
    424       !! * Local save 
    425       REAL(wp), SAVE, DIMENSION(jpi,jpj,4) ::   zsinlon, zcoslon, zsinlat, zcoslat 
    426       LOGICAL , SAVE, DIMENSION(4)         ::   linit = .FALSE. 
    427       !!---------------------------------------------------------------------- 
     437      INTEGER ::   ierr   ! local integer 
     438      !!---------------------------------------------------------------------- 
     439 
     440      IF( ALLOCATED( gsinlon ) ) THEN 
     441         ALLOCATE( gsinlon(jpi,jpj,4) , gcoslon(jpi,jpj,4) ,   & 
     442            &      gsinlat(jpi,jpj,4) , gcoslat(jpi,jpj,4) , STAT=ierr ) 
     443         IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     444         IF( ierr /= 0 )   CALL ctl_stop('STOP', 'angle_msh_geo: unable to allocate arrays' ) 
     445      ENDIF 
    428446 
    429447      SELECT CASE( cgrid) 
     
    431449            ig = 1 
    432450            IF( .NOT. linit(ig) ) THEN  
    433                zsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
    434                zcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
    435                zsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
    436                zcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
     451               gsinlon(:,:,ig) = SIN( rad * glamt(:,:) ) 
     452               gcoslon(:,:,ig) = COS( rad * glamt(:,:) ) 
     453               gsinlat(:,:,ig) = SIN( rad * gphit(:,:) ) 
     454               gcoslat(:,:,ig) = COS( rad * gphit(:,:) ) 
    437455               linit(ig) = .TRUE. 
    438456            ENDIF 
     
    440458            ig = 2 
    441459            IF( .NOT. linit(ig) ) THEN  
    442                zsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
    443                zcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
    444                zsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
    445                zcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
     460               gsinlon(:,:,ig) = SIN( rad * glamu(:,:) ) 
     461               gcoslon(:,:,ig) = COS( rad * glamu(:,:) ) 
     462               gsinlat(:,:,ig) = SIN( rad * gphiu(:,:) ) 
     463               gcoslat(:,:,ig) = COS( rad * gphiu(:,:) ) 
    446464               linit(ig) = .TRUE. 
    447465            ENDIF 
     
    449467            ig = 3 
    450468            IF( .NOT. linit(ig) ) THEN  
    451                zsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
    452                zcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
    453                zsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
    454                zcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
     469               gsinlon(:,:,ig) = SIN( rad * glamv(:,:) ) 
     470               gcoslon(:,:,ig) = COS( rad * glamv(:,:) ) 
     471               gsinlat(:,:,ig) = SIN( rad * gphiv(:,:) ) 
     472               gcoslat(:,:,ig) = COS( rad * gphiv(:,:) ) 
    455473               linit(ig) = .TRUE. 
    456474            ENDIF 
     
    458476            ig = 4 
    459477            IF( .NOT. linit(ig) ) THEN  
    460                zsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
    461                zcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
    462                zsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
    463                zcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
     478               gsinlon(:,:,ig) = SIN( rad * glamf(:,:) ) 
     479               gcoslon(:,:,ig) = COS( rad * glamf(:,:) ) 
     480               gsinlat(:,:,ig) = SIN( rad * gphif(:,:) ) 
     481               gcoslat(:,:,ig) = COS( rad * gphif(:,:) ) 
    464482               linit(ig) = .TRUE. 
    465483            ENDIF 
     
    469487      END SELECT 
    470488 
    471        pxx = - zsinlon(:,:,ig) * pte - zcoslon(:,:,ig) * zsinlat(:,:,ig) * ptn  
    472        pyy =   zcoslon(:,:,ig) * pte - zsinlon(:,:,ig) * zsinlat(:,:,ig) * ptn 
    473        pzz =   zcoslat(:,:,ig) * ptn 
     489       pxx = - gsinlon(:,:,ig) * pte - gcoslon(:,:,ig) * gsinlat(:,:,ig) * ptn  
     490       pyy =   gcoslon(:,:,ig) * pte - gsinlon(:,:,ig) * gsinlat(:,:,ig) * ptn 
     491       pzz =   gcoslat(:,:,ig) * ptn 
    474492 
    475493       
     
    495513      !!   8.5  !  02-08  (G. Madec)  F90: Free form 
    496514      !!---------------------------------------------------------------------- 
    497       !! * Arguments 
    498       REAL(wp), INTENT( IN   ), DIMENSION(jpi,jpj) ::   & 
    499          px1, py1          ! two horizontal components to be rotated 
    500       REAL(wp), INTENT( OUT  ), DIMENSION(jpi,jpj) ::   & 
    501          px2, py2          ! the two horizontal components in the model repere 
    502       INTEGER, INTENT( IN ) ::   & 
    503          kchoix   ! type of transformation 
    504                   ! = 1 change from geographic to model grid. 
    505                   ! =-1 change from model to geographic grid 
    506       CHARACTER(len=1), INTENT( IN ), OPTIONAL ::   cd_type      ! define the nature of pt2d array grid-points 
     515      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   px1, py1   ! two horizontal components to be rotated 
     516      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   px2, py2   ! the two horizontal components in the model repere 
     517      INTEGER , INTENT(in   )                     ::   kchoix     ! type of transformation 
     518      !                                                           ! = 1 change from geographic to model grid. 
     519      !                                                           ! =-1 change from model to geographic grid 
     520      CHARACTER(len=1), INTENT(in   ), OPTIONAL   ::   cd_type    ! define the nature of pt2d array grid-points 
    507521      ! 
    508522      CHARACTER(len=1) ::   cl_type      ! define the nature of pt2d array grid-points (T point by default) 
     
    536550      !!   9.2  !  09-02  (K. Mogensen) 
    537551      !!---------------------------------------------------------------------- 
    538       REAL(wp), DIMENSION(jpi,jpj), INTENT( OUT )::   & 
    539          & psinu, pcosu, psinv, pcosv! copy of data 
    540  
     552      REAL(wp), DIMENSION(jpi,jpj), INTENT( OUT )::   psinu, pcosu, psinv, pcosv   ! copy of data 
    541553      !!---------------------------------------------------------------------- 
    542554 
     
    561573   END SUBROUTINE obs_rot 
    562574 
    563  
    564575  !!====================================================================== 
    565576END MODULE geo2ocean 
Note: See TracChangeset for help on using the changeset viewer.