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 2636 for branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90 – NEMO

Ignore:
Timestamp:
2011-03-01T20:04:06+01:00 (13 years ago)
Author:
gm
Message:

dynamic mem: #785 ; move ctl_stop & warn in lib_mpp to avoid a circular dependency + ctl_stop improvment

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90

    r2625 r2636  
    1313 
    1414   !!---------------------------------------------------------------------- 
    15    !!   ctl_stop   : update momentum and tracer Kz from a tke scheme 
    16    !!   ctl_warn   : initialization, namelist read, and parameters control 
    17    !!   getunit    : give the index of an unused logical unit 
    18    !!---------------------------------------------------------------------- 
    1915   USE par_oce       ! ocean parameter 
    2016   USE lib_print     ! formated print library 
    2117   USE nc4interface  ! NetCDF4 interface 
    22    USE lib_mpp       ! MPP library 
    2318 
    2419   IMPLICIT NONE 
     
    135130   !! $Id$ 
    136131   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    137    !!---------------------------------------------------------------------- 
    138 CONTAINS 
    139  
    140    SUBROUTINE ctl_stop( cd_stop, cd1, cd2, cd3, cd4, cd5 ,   & 
    141       &                          cd6, cd7, cd8, cd9, cd10 ) 
    142       !!---------------------------------------------------------------------- 
    143       !!                  ***  ROUTINE  stop_opa  *** 
    144       !! 
    145       !! ** Purpose :   print in ocean.outpput file a error message and  
    146       !!                increment the error number (nstop) by one. 
    147       !!---------------------------------------------------------------------- 
    148       CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd_stop, cd1, cd2, cd3, cd4, cd5 
    149       CHARACTER(len=*), INTENT(in), OPTIONAL ::           cd6, cd7, cd8, cd9, cd10 
    150       !!---------------------------------------------------------------------- 
    151       ! 
    152       nstop = nstop + 1  
    153       IF(lwp) THEN 
    154          WRITE(numout,cform_err) 
    155          IF( PRESENT(cd1 ) ) WRITE(numout,*) cd1 
    156          IF( PRESENT(cd2 ) ) WRITE(numout,*) cd2 
    157          IF( PRESENT(cd3 ) ) WRITE(numout,*) cd3 
    158          IF( PRESENT(cd4 ) ) WRITE(numout,*) cd4 
    159          IF( PRESENT(cd5 ) ) WRITE(numout,*) cd5 
    160          IF( PRESENT(cd6 ) ) WRITE(numout,*) cd6 
    161          IF( PRESENT(cd7 ) ) WRITE(numout,*) cd7 
    162          IF( PRESENT(cd8 ) ) WRITE(numout,*) cd8 
    163          IF( PRESENT(cd9 ) ) WRITE(numout,*) cd9 
    164          IF( PRESENT(cd10) ) WRITE(numout,*) cd10 
    165       ENDIF 
    166                                CALL FLUSH(numout    ) 
    167       IF( numstp     /= -1 )   CALL FLUSH(numstp    ) 
    168       IF( numsol     /= -1 )   CALL FLUSH(numsol    ) 
    169       IF( numevo_ice /= -1 )   CALL FLUSH(numevo_ice) 
    170       ! 
    171       IF( PRESENT(cd_stop) ) THEN 
    172          IF( cd_stop == 'STOP' ) THEN 
    173             WRITE(numout,*)  
    174             WRITE(numout,*) 'huge E-R-R-O-R : immediate stop' 
    175             CALL mppstop() 
    176          ENDIF 
    177       ENDIF 
    178       ! 
    179    END SUBROUTINE ctl_stop 
    180  
    181  
    182    SUBROUTINE ctl_warn( cd1, cd2, cd3, cd4, cd5,   & 
    183       &                 cd6, cd7, cd8, cd9, cd10 ) 
    184       !!---------------------------------------------------------------------- 
    185       !!                  ***  ROUTINE  stop_warn  *** 
    186       !! 
    187       !! ** Purpose :   print in ocean.outpput file a error message and  
    188       !!                increment the warning number (nwarn) by one. 
    189       !!---------------------------------------------------------------------- 
    190       CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd1, cd2, cd3, cd4, cd5 
    191       CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd6, cd7, cd8, cd9, cd10 
    192       !!---------------------------------------------------------------------- 
    193       !  
    194       nwarn = nwarn + 1  
    195       IF(lwp) THEN 
    196          WRITE(numout,cform_war) 
    197          IF( PRESENT(cd1 ) ) WRITE(numout,*) cd1 
    198          IF( PRESENT(cd2 ) ) WRITE(numout,*) cd2 
    199          IF( PRESENT(cd3 ) ) WRITE(numout,*) cd3 
    200          IF( PRESENT(cd4 ) ) WRITE(numout,*) cd4 
    201          IF( PRESENT(cd5 ) ) WRITE(numout,*) cd5 
    202          IF( PRESENT(cd6 ) ) WRITE(numout,*) cd6 
    203          IF( PRESENT(cd7 ) ) WRITE(numout,*) cd7 
    204          IF( PRESENT(cd8 ) ) WRITE(numout,*) cd8 
    205          IF( PRESENT(cd9 ) ) WRITE(numout,*) cd9 
    206          IF( PRESENT(cd10) ) WRITE(numout,*) cd10 
    207       ENDIF 
    208       CALL FLUSH(numout) 
    209       ! 
    210    END SUBROUTINE ctl_warn 
    211  
    212  
    213    SUBROUTINE ctl_opn( knum, cdfile, cdstat, cdform, cdacce, klengh, kout, ldwp, karea ) 
    214       !!---------------------------------------------------------------------- 
    215       !!                  ***  ROUTINE ctl_opn  *** 
    216       !! 
    217       !! ** Purpose :   Open file and check if required file is available. 
    218       !! 
    219       !! ** Method  :   Fortan open 
    220       !!---------------------------------------------------------------------- 
    221       INTEGER          , INTENT(  out) ::   knum      ! logical unit to open 
    222       CHARACTER(len=*) , INTENT(in   ) ::   cdfile    ! file name to open 
    223       CHARACTER(len=*) , INTENT(in   ) ::   cdstat    ! disposition specifier 
    224       CHARACTER(len=*) , INTENT(in   ) ::   cdform    ! formatting specifier 
    225       CHARACTER(len=*) , INTENT(in   ) ::   cdacce    ! access specifier 
    226       INTEGER          , INTENT(in   ) ::   klengh    ! record length 
    227       INTEGER          , INTENT(in   ) ::   kout      ! number of logical units for write 
    228       LOGICAL          , INTENT(in   ) ::   ldwp      ! boolean term for print 
    229       INTEGER, OPTIONAL, INTENT(in   ) ::   karea     ! proc number 
    230       !! 
    231       CHARACTER(len=80) ::   clfile 
    232       INTEGER           ::   iost 
    233       !!---------------------------------------------------------------------- 
    234  
    235       ! adapt filename 
    236       ! ---------------- 
    237       clfile = TRIM(cdfile) 
    238       IF( PRESENT( karea ) ) THEN 
    239          IF( karea > 1 )   WRITE(clfile, "(a,'_',i4.4)") TRIM(clfile), karea-1 
    240       ENDIF 
    241 #if defined key_agrif 
    242       IF( .NOT. Agrif_Root() )   clfile = TRIM(Agrif_CFixed())//'_'//TRIM(clfile) 
    243       knum=Agrif_Get_Unit() 
    244 #else 
    245       knum=getunit() 
    246 #endif 
    247  
    248       iost=0 
    249       IF( cdacce(1:6) == 'DIRECT' )  THEN 
    250          OPEN( UNIT=knum, FILE=clfile, FORM=cdform, ACCESS=cdacce, STATUS=cdstat, RECL=klengh, ERR=100, IOSTAT=iost ) 
    251       ELSE 
    252          OPEN( UNIT=knum, FILE=clfile, FORM=cdform, ACCESS=cdacce, STATUS=cdstat             , ERR=100, IOSTAT=iost ) 
    253       ENDIF 
    254       IF( iost == 0 ) THEN 
    255          IF(ldwp) THEN 
    256             WRITE(kout,*) '     file   : ', clfile,' open ok' 
    257             WRITE(kout,*) '     unit   = ', knum 
    258             WRITE(kout,*) '     status = ', cdstat 
    259             WRITE(kout,*) '     form   = ', cdform 
    260             WRITE(kout,*) '     access = ', cdacce 
    261             WRITE(kout,*) 
    262          ENDIF 
    263       ENDIF 
    264 100   CONTINUE 
    265       IF( iost /= 0 ) THEN 
    266          IF(ldwp) THEN 
    267             WRITE(kout,*) 
    268             WRITE(kout,*) ' ===>>>> : bad opening file: ', clfile 
    269             WRITE(kout,*) ' =======   ===  ' 
    270             WRITE(kout,*) '           unit   = ', knum 
    271             WRITE(kout,*) '           status = ', cdstat 
    272             WRITE(kout,*) '           form   = ', cdform 
    273             WRITE(kout,*) '           access = ', cdacce 
    274             WRITE(kout,*) '           iostat = ', iost 
    275             WRITE(kout,*) '           we stop. verify the file ' 
    276             WRITE(kout,*) 
    277          ENDIF 
    278          STOP 'ctl_opn bad opening' 
    279       ENDIF 
    280        
    281    END SUBROUTINE ctl_opn 
    282  
    283  
    284    FUNCTION getunit() 
    285       !!---------------------------------------------------------------------- 
    286       !!                  ***  FUNCTION  getunit  *** 
    287       !! 
    288       !! ** Purpose :   return the index of an unused logical unit 
    289       !!---------------------------------------------------------------------- 
    290       INTEGER :: getunit 
    291       LOGICAL :: llopn  
    292       !!---------------------------------------------------------------------- 
    293       ! 
    294       getunit = 15   ! choose a unit that is big enough then it is not already used in NEMO 
    295       llopn = .TRUE. 
    296       DO WHILE( (getunit < 998) .AND. llopn ) 
    297          getunit = getunit + 1 
    298          INQUIRE( unit = getunit, opened = llopn ) 
    299       END DO 
    300       IF( (getunit == 999) .AND. llopn ) THEN 
    301          CALL ctl_stop( 'getunit: All logical units until 999 are used...' ) 
    302          getunit = -1 
    303       ENDIF 
    304       ! 
    305    END FUNCTION getunit 
    306  
    307132   !!===================================================================== 
    308133END MODULE in_out_manager 
Note: See TracChangeset for help on using the changeset viewer.