Changeset 12933 for NEMO/trunk/src/SAS
- Timestamp:
- 2020-05-15T10:06:25+02:00 (4 years ago)
- Location:
- NEMO/trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk
- Property svn:externals
-
old new 8 8 9 9 # SETTE 10 ^/utils/CI/sette@12 798sette10 ^/utils/CI/sette@12931 sette
-
- Property svn:externals
-
NEMO/trunk/src/SAS/diawri.F90
r12649 r12933 138 138 !! Each nn_write time step, output the instantaneous or mean fields 139 139 !!---------------------------------------------------------------------- 140 !!141 140 INTEGER, INTENT( in ) :: kt ! ocean time-step index 142 INTEGER, INTENT( in ) :: Kmm ! ocean time level index141 INTEGER, INTENT( in ) :: Kmm ! ocean time level index 143 142 !! 144 143 LOGICAL :: ll_print = .FALSE. ! =T print and flush numout … … 462 461 CALL iom_close( inum ) 463 462 ENDIF 464 #endif 465 463 ! 464 #endif 466 465 END SUBROUTINE dia_wri_state 467 466 -
NEMO/trunk/src/SAS/nemogcm.F90
r12641 r12933 126 126 END DO 127 127 ! 128 IF( .NOT. Agrif_Root() ) THEN129 CALL Agrif_ParentGrid_To_ChildGrid()130 IF( ln_timing ) CALL timing_finalize131 CALL Agrif_ChildGrid_To_ParentGrid()132 ENDIF133 !134 128 #else 135 129 ! … … 166 160 IF( nstop /= 0 .AND. lwp ) THEN ! error print 167 161 WRITE(ctmp1,*) ' ==>>> nemo_gcm: a total of ', nstop, ' errors have been found' 168 CALL ctl_stop( ctmp1 ) 162 IF( ngrdstop > 0 ) THEN 163 WRITE(ctmp9,'(i2)') ngrdstop 164 WRITE(ctmp2,*) ' ==>>> Error detected in Agrif grid '//TRIM(ctmp9) 165 WRITE(ctmp3,*) ' ==>>> look for error messages in '//TRIM(ctmp9)//'_ocean_output* files' 166 CALL ctl_stop( ctmp1, ctmp2, ctmp3 ) 167 ELSE 168 CALL ctl_stop( ctmp1 ) 169 ENDIF 169 170 ENDIF 170 171 ! … … 275 276 ! 276 277 ! finalize the definition of namctl variables 277 IF( sn_cfctl%l_allon ) THEN 278 ! Turn on all options. 279 CALL nemo_set_cfctl( sn_cfctl, .TRUE., .TRUE. ) 280 ! Ensure all processors are active 281 sn_cfctl%procmin = 0 ; sn_cfctl%procmax = 1000000 ; sn_cfctl%procincr = 1 282 ELSEIF( sn_cfctl%l_config ) THEN 283 ! Activate finer control of report outputs 284 ! optionally switch off output from selected areas (note this only 285 ! applies to output which does not involve global communications) 286 IF( ( narea < sn_cfctl%procmin .OR. narea > sn_cfctl%procmax ) .OR. & 287 & ( MOD( narea - sn_cfctl%procmin, sn_cfctl%procincr ) /= 0 ) ) & 288 & CALL nemo_set_cfctl( sn_cfctl, .FALSE., .FALSE. ) 289 ELSE 290 ! turn off all options. 291 CALL nemo_set_cfctl( sn_cfctl, .FALSE., .TRUE. ) 292 ENDIF 278 IF( narea < sn_cfctl%procmin .OR. narea > sn_cfctl%procmax .OR. MOD( narea - sn_cfctl%procmin, sn_cfctl%procincr ) /= 0 ) & 279 & CALL nemo_set_cfctl( sn_cfctl, .FALSE. ) 293 280 ! 294 281 lwp = (narea == 1) .OR. sn_cfctl%l_oceout ! control of all listing output print … … 408 395 WRITE(numout,*) '~~~~~~~~' 409 396 WRITE(numout,*) ' Namelist namctl' 410 WRITE(numout,*) ' sn_cfctl%l_glochk = ', sn_cfctl%l_glochk411 WRITE(numout,*) ' sn_cfctl%l_allon = ', sn_cfctl%l_allon412 WRITE(numout,*) ' finer control over o/p sn_cfctl%l_config = ', sn_cfctl%l_config413 397 WRITE(numout,*) ' sn_cfctl%l_runstat = ', sn_cfctl%l_runstat 414 398 WRITE(numout,*) ' sn_cfctl%l_trcstat = ', sn_cfctl%l_trcstat … … 552 536 END SUBROUTINE nemo_alloc 553 537 554 SUBROUTINE nemo_set_cfctl(sn_cfctl, setto , for_all)538 SUBROUTINE nemo_set_cfctl(sn_cfctl, setto ) 555 539 !!---------------------------------------------------------------------- 556 540 !! *** ROUTINE nemo_set_cfctl *** 557 541 !! 558 542 !! ** Purpose : Set elements of the output control structure to setto. 559 !! for_all should be .false. unless all areas are to be560 !! treated identically.561 543 !! 562 544 !! ** Method : Note this routine can be used to switch on/off some 563 !! types of output for selected areas but any output types 564 !! that involve global communications (e.g. mpp_max, glob_sum) 565 !! should be protected from selective switching by the 566 !! for_all argument 567 !!---------------------------------------------------------------------- 568 LOGICAL :: setto, for_all 569 TYPE(sn_ctl) :: sn_cfctl 570 !!---------------------------------------------------------------------- 571 IF( for_all ) THEN 572 sn_cfctl%l_runstat = setto 573 sn_cfctl%l_trcstat = setto 574 ENDIF 545 !! types of output for selected areas. 546 !!---------------------------------------------------------------------- 547 TYPE(sn_ctl), INTENT(inout) :: sn_cfctl 548 LOGICAL , INTENT(in ) :: setto 549 !!---------------------------------------------------------------------- 550 sn_cfctl%l_runstat = setto 551 sn_cfctl%l_trcstat = setto 575 552 sn_cfctl%l_oceout = setto 576 553 sn_cfctl%l_layout = setto -
NEMO/trunk/src/SAS/step.F90
r12650 r12933 74 74 !! -2- Outputs and diagnostics 75 75 !!---------------------------------------------------------------------- 76 INTEGER :: indic ! error indicator if < 077 !! ---------------------------------------------------------------------78 76 79 77 #if defined key_agrif 80 IF( nstop > 0 ) return ! avoid to go further if an error was detected during previous time step78 IF( nstop > 0 ) RETURN ! avoid to go further if an error was detected during previous time step (child grid) 81 79 kstp = nit000 + Agrif_Nb_Step() 82 80 Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs ! agrif_oce module copies of time level indices 83 IF 84 IF ( Agrif_Root() .and. lwp) Write(*,*) '---'85 IF (lwp) Write(*,*) 'Grid Number',Agrif_Fixed(),' time step ',kstp, 'int tstep',Agrif_NbStepint()81 IF( lk_agrif_debug ) THEN 82 IF( Agrif_Root() .and. lwp) WRITE(*,*) '---' 83 IF(lwp) WRITE(*,*) 'Grid Number', Agrif_Fixed(),' time step ', kstp, 'int tstep', Agrif_NbStepint() 86 84 ENDIF 87 88 IF ( kstp == (nit000 + 1) ) lk_agrif_fstep = .FALSE. 89 85 IF( kstp == nit000 + 1 ) lk_agrif_fstep = .FALSE. 90 86 # if defined key_iomput 91 87 IF( Agrif_Nbstepint() == 0 ) CALL iom_swap( cxios_context ) 92 88 # endif 93 89 #endif 94 indic = 0 ! although indic is not changed in stp_ctl95 ! need to keep the same interface96 90 IF( kstp == nit000 ) CALL iom_init( cxios_context ) ! iom_put initialization (must be done after nemo_init for AGRIF+XIOS+OASIS) 97 91 IF( kstp /= nit000 ) CALL day( kstp ) ! Calendar (day was already called at nit000 in day_init) … … 112 106 ! AGRIF recursive integration 113 107 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 114 CALL Agrif_Integrate_ChildGrids( stp ) 115 #endif 108 CALL Agrif_Integrate_ChildGrids( stp ) 116 109 110 #endif 117 111 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 118 112 ! Control 119 113 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 120 CALL stp_ctl( kstp, indic ) 121 IF( indic < 0 ) THEN 122 CALL ctl_stop( 'step: indic < 0' ) 123 CALL dia_wri_state( Nnn, 'output.abort' ) 124 ENDIF 114 CALL stp_ctl( kstp, Nnn ) 115 125 116 #if defined key_agrif 126 117 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 132 123 #endif 133 124 ENDIF 125 134 126 #endif 135 127 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 141 133 ! Coupled mode 142 134 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 143 IF( lk_oasis ) CALL sbc_cpl_snd( kstp, Nbb, Nnn )! coupled mode : field exchanges if OASIS-coupled ice135 IF( lk_oasis .AND. nstop == 0 ) CALL sbc_cpl_snd( kstp, Nbb, Nnn ) ! coupled mode : field exchanges if OASIS-coupled ice 144 136 145 137 #if defined key_iomput … … 152 144 lrst_oce = .FALSE. 153 145 ENDIF 154 IF( kstp == nitend .OR. indic <0 ) THEN155 146 IF( kstp == nitend .OR. nstop > 0 ) THEN 147 CALL iom_context_finalize( cxios_context ) ! needed for XIOS+AGRIF 156 148 ENDIF 157 149 #endif -
NEMO/trunk/src/SAS/stpctl.F90
r12377 r12933 21 21 USE ice , ONLY : vt_i, u_ice, tm_i 22 22 ! 23 USE diawri ! Standard run outputs (dia_wri_state routine) 23 24 USE in_out_manager ! I/O manager 24 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 26 USE lib_mpp ! distributed memory computing 26 27 ! 27 28 USE netcdf ! NetCDF library 28 29 IMPLICIT NONE … … 31 32 PUBLIC stp_ctl ! routine called by step.F90 32 33 33 INTEGER :: idrun, idtime, idssh, idu, ids, istatus34 LOGICAL :: lsomeoce34 INTEGER :: nrunid ! netcdf file id 35 INTEGER, DIMENSION(3) :: nvarid ! netcdf variable id 35 36 !!---------------------------------------------------------------------- 36 37 !! NEMO/SAS 4.0 , NEMO Consortium (2018) … … 38 39 !! Software governed by the CeCILL license (see ./LICENSE) 39 40 !!---------------------------------------------------------------------- 40 41 41 CONTAINS 42 42 43 SUBROUTINE stp_ctl( kt, kindic)43 SUBROUTINE stp_ctl( kt, Kmm ) 44 44 !!---------------------------------------------------------------------- 45 45 !! *** ROUTINE stp_ctl *** … … 49 49 !! ** Method : - Save the time step in numstp 50 50 !! - Print it each 50 time steps 51 !! - Stop the run IF problem encountered by setting nstop > 0 52 !! Problems checked: ice thickness maximum > 100 m 53 !! ice velocity maximum > 10 m/s 54 !! min ice temperature < -100 degC 51 55 !! 52 56 !! ** Actions : "time.step" file = last ocean time-step 53 57 !! "run.stat" file = run statistics 54 !! 55 !!---------------------------------------------------------------------- 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 57 INTEGER, INTENT( inout ) :: kindic ! indicator of solver convergence 58 !! 59 REAL(wp), DIMENSION(3) :: zmax 60 LOGICAL :: ll_wrtstp, ll_colruns, ll_wrtruns 61 CHARACTER(len=20) :: clname 62 !!---------------------------------------------------------------------- 63 ! 64 ll_wrtstp = ( MOD( kt, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) 65 ll_colruns = ll_wrtstp .AND. ( sn_cfctl%l_runstat ) 66 ll_wrtruns = ll_colruns .AND. lwm 67 IF( kt == nit000 .AND. lwp ) THEN 68 WRITE(numout,*) 69 WRITE(numout,*) 'stp_ctl : time-stepping control' 70 WRITE(numout,*) '~~~~~~~' 71 ! ! open time.step file 72 IF( lwm ) CALL ctl_opn( numstp, 'time.step', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 73 ! ! open run.stat file(s) at start whatever 74 ! ! the value of sn_cfctl%ptimincr 75 IF( lwm .AND. ( sn_cfctl%l_runstat ) ) THEN 58 !! nstop indicator sheared among all local domain 59 !!---------------------------------------------------------------------- 60 INTEGER, INTENT(in ) :: kt ! ocean time-step index 61 INTEGER, INTENT(in ) :: Kmm ! ocean time level index 62 !! 63 INTEGER :: ji ! dummy loop indices 64 INTEGER :: idtime, istatus 65 INTEGER , DIMENSION(4) :: iareasum, iareamin, iareamax 66 INTEGER , DIMENSION(3,3) :: iloc ! min/max loc indices 67 REAL(wp) :: zzz ! local real 68 REAL(wp), DIMENSION(4) :: zmax, zmaxlocal 69 LOGICAL :: ll_wrtstp, ll_colruns, ll_wrtruns 70 LOGICAL, DIMENSION(jpi,jpj) :: llmsk 71 CHARACTER(len=20) :: clname 72 !!---------------------------------------------------------------------- 73 IF( nstop > 0 .AND. ngrdstop > -1 ) RETURN ! stpctl was already called by a child grid 74 ! 75 ll_wrtstp = ( MOD( kt-nit000, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) 76 ll_colruns = ll_wrtstp .AND. sn_cfctl%l_runstat .AND. jpnij > 1 77 ll_wrtruns = ( ll_colruns .OR. jpnij == 1 ) .AND. lwm 78 ! 79 IF( kt == nit000 ) THEN 80 ! 81 IF( lwp ) THEN 82 WRITE(numout,*) 83 WRITE(numout,*) 'stp_ctl : time-stepping control' 84 WRITE(numout,*) '~~~~~~~' 85 ENDIF 86 ! ! open time.step ascii file, done only by 1st subdomain 87 IF( lwm ) CALL ctl_opn( numstp, 'time.step', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 88 ! 89 IF( ll_wrtruns ) THEN 90 ! ! open run.stat ascii file, done only by 1st subdomain 76 91 CALL ctl_opn( numrun, 'run.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 92 ! ! open run.stat.nc netcdf file, done only by 1st subdomain 77 93 clname = 'run.stat.nc' 78 94 IF( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 79 istatus = NF90_CREATE( 'run.stat.nc', NF90_CLOBBER, idrun ) 80 istatus = NF90_DEF_DIM( idrun, 'time' , NF90_UNLIMITED, idtime ) 81 istatus = NF90_DEF_VAR( idrun, 'vt_i_max' , NF90_DOUBLE, (/ idtime /), idssh ) 82 istatus = NF90_DEF_VAR( idrun, 'abs_u_max', NF90_DOUBLE, (/ idtime /), idu ) 83 istatus = NF90_DEF_VAR( idrun, 'tm_i_min' , NF90_DOUBLE, (/ idtime /), ids ) 84 istatus = NF90_ENDDEF(idrun) 85 ENDIF 86 ENDIF 87 IF( kt == nit000 ) lsomeoce = COUNT( ssmask(:,:) == 1._wp ) > 0 88 ! 89 IF(lwm .AND. ll_wrtstp) THEN !== current time step ==! ("time.step" file) 95 istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, nrunid ) 96 istatus = NF90_DEF_DIM( nrunid, 'time' , NF90_UNLIMITED, idtime ) 97 istatus = NF90_DEF_VAR( nrunid, 'vt_i_max' , NF90_DOUBLE, (/ idtime /), nvarid(1) ) 98 istatus = NF90_DEF_VAR( nrunid, 'abs_u_max', NF90_DOUBLE, (/ idtime /), nvarid(2) ) 99 istatus = NF90_DEF_VAR( nrunid, 'tm_i_min' , NF90_DOUBLE, (/ idtime /), nvarid(3) ) 100 istatus = NF90_ENDDEF(nrunid) 101 ENDIF 102 ! 103 ENDIF 104 ! 105 ! !== write current time step ==! 106 ! !== done only by 1st subdomain at writting timestep ==! 107 IF( lwm .AND. ll_wrtstp ) THEN 90 108 WRITE ( numstp, '(1x, i8)' ) kt 91 109 REWIND( numstp ) 92 110 ENDIF 93 ! !== test of extrema ==! 111 ! !== test of local extrema ==! 112 ! !== done by all processes at every time step ==! 113 llmsk(:,:) = tmask(:,:,1) == 1._wp 114 zmax(1) = MAXVAL( vt_i (:,:) , mask = llmsk ) ! max ice thickness 115 zmax(2) = MAXVAL( ABS( u_ice(:,:) ) , mask = llmsk ) ! max ice velocity (zonal only) 116 zmax(3) = MAXVAL( -tm_i (:,:) + 273.15_wp, mask = llmsk ) ! min ice temperature 117 zmax(4) = REAL( nstop, wp ) ! stop indicator 118 ! !== get global extrema ==! 119 ! !== done by all processes if writting run.stat ==! 94 120 IF( ll_colruns ) THEN 95 zmax(1) = MAXVAL( vt_i (:,:) ) ! max ice thickness 96 zmax(2) = MAXVAL( ABS( u_ice(:,:) ) ) ! max ice velocity (zonal only) 97 zmax(3) = MAXVAL( -tm_i (:,:)+273.15_wp , mask = ssmask(:,:) == 1._wp ) ! min ice temperature 98 CALL mpp_max( "stpctl", zmax ) ! max over the global domain 121 zmaxlocal(:) = zmax(:) 122 CALL mpp_max( "stpctl", zmax ) ! max over the global domain 123 nstop = NINT( zmax(4) ) ! update nstop indicator (now sheared among all local domains) 124 ENDIF 125 ! !== write "run.stat" files ==! 126 ! !== done only by 1st subdomain at writting timestep ==! 127 IF( ll_wrtruns ) THEN 128 WRITE(numrun,9500) kt, zmax(1), zmax(2), -zmax(3) 129 istatus = NF90_PUT_VAR( nrunid, nvarid(1), (/ zmax(1)/), (/kt/), (/1/) ) 130 istatus = NF90_PUT_VAR( nrunid, nvarid(2), (/ zmax(2)/), (/kt/), (/1/) ) 131 istatus = NF90_PUT_VAR( nrunid, nvarid(3), (/-zmax(3)/), (/kt/), (/1/) ) 132 IF( kt == nitend ) istatus = NF90_CLOSE(nrunid) 99 133 END IF 100 ! !== run statistics ==! ("run.stat" file) 101 IF( ll_wrtruns ) THEN 102 WRITE(numrun,9500) kt, zmax(1), zmax(2), - zmax(3) 103 istatus = NF90_PUT_VAR( idrun, idssh, (/ zmax(1)/), (/kt/), (/1/) ) 104 istatus = NF90_PUT_VAR( idrun, idu, (/ zmax(2)/), (/kt/), (/1/) ) 105 istatus = NF90_PUT_VAR( idrun, ids, (/-zmax(3)/), (/kt/), (/1/) ) 106 IF( MOD( kt , 100 ) == 0 ) istatus = NF90_SYNC(idrun) 107 IF( kt == nitend ) istatus = NF90_CLOSE(idrun) 108 END IF 134 ! !== error handling ==! 135 ! !== done by all processes at every time step ==! 136 ! 137 IF( zmax(1) > 100._wp .OR. & ! too large ice thickness maximum ( > 100 m) 138 & zmax(2) > 10._wp .OR. & ! too large ice velocity ( > 10 m/s) 139 & zmax(3) > 101._wp .OR. & ! too cold ice temperature ( < -100 degC) 140 & ISNAN( zmax(1) + zmax(2) + zmax(3) ) .OR. & ! NaN encounter in the tests 141 & ABS( zmax(1) + zmax(2) + zmax(3) ) > HUGE(1._wp) ) THEN ! Infinity encounter in the tests 142 ! 143 iloc(:,:) = 0 144 IF( ll_colruns ) THEN ! zmax is global, so it is the same on all subdomains -> no dead lock with mpp_maxloc 145 ! first: close the netcdf file, so we can read it 146 IF( lwm .AND. kt /= nitend ) istatus = NF90_CLOSE(nrunid) 147 ! get global loc on the min/max 148 CALL mpp_maxloc( 'stpctl', vt_i(:,:) , tmask(:,:,1), zzz, iloc(1:2,1) ) ! mpp_maxloc ok if mask = F 149 CALL mpp_maxloc( 'stpctl',ABS( u_ice(:,:) ) , tmask(:,:,1), zzz, iloc(1:2,2) ) 150 CALL mpp_minloc( 'stpctl', tm_i(:,:) - 273.15_wp, tmask(:,:,1), zzz, iloc(1:2,3) ) 151 ! find which subdomain has the max. 152 iareamin(:) = jpnij+1 ; iareamax(:) = 0 ; iareasum(:) = 0 153 DO ji = 1, 4 154 IF( zmaxlocal(ji) == zmax(ji) ) THEN 155 iareamin(ji) = narea ; iareamax(ji) = narea ; iareasum(ji) = 1 156 ENDIF 157 END DO 158 CALL mpp_min( "stpctl", iareamin ) ! min over the global domain 159 CALL mpp_max( "stpctl", iareamax ) ! max over the global domain 160 CALL mpp_sum( "stpctl", iareasum ) ! sum over the global domain 161 ELSE ! find local min and max locations: 162 ! if we are here, this means that the subdomain contains some oce points -> no need to test the mask used in maxloc 163 iloc(1:2,1) = MAXLOC( vt_i(:,:) , mask = llmsk ) + (/ nimpp - 1, njmpp - 1/) 164 iloc(1:2,2) = MAXLOC( ABS( u_ice(:,:) ) , mask = llmsk ) + (/ nimpp - 1, njmpp - 1/) 165 iloc(1:2,3) = MINLOC( tm_i(:,:) - 273.15_wp, mask = llmsk ) + (/ nimpp - 1, njmpp - 1/) 166 iareamin(:) = narea ; iareamax(:) = narea ; iareasum(:) = 1 ! this is local information 167 ENDIF 168 ! 169 WRITE(ctmp1,*) ' stp_ctl: ice_thick > 100 m or |ice_vel| > 10 m/s or ice_temp < -100 degC or NaN encounter in the tests' 170 CALL wrt_line( ctmp2, kt, 'ice_thick max', zmax(1), iloc(:,1), iareasum(1), iareamin(1), iareamax(1) ) 171 CALL wrt_line( ctmp3, kt, '|ice_vel| max', zmax(2), iloc(:,2), iareasum(2), iareamin(2), iareamax(2) ) 172 CALL wrt_line( ctmp4, kt, 'ice_temp min', -zmax(3), iloc(:,3), iareasum(3), iareamin(3), iareamax(3) ) 173 IF( Agrif_Root() ) THEN 174 WRITE(ctmp6,*) ' ===> output of last computed fields in output.abort* files' 175 ELSE 176 WRITE(ctmp6,*) ' ===> output of last computed fields in '//TRIM(Agrif_CFixed())//'_output.abort* files' 177 ENDIF 178 ! 179 CALL dia_wri_state( Kmm, 'output.abort' ) ! create an output.abort file 180 ! 181 IF( ll_colruns .or. jpnij == 1 ) THEN ! all processes synchronized -> use lwp to print in opened ocean.output files 182 IF(lwp) CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 ) 183 ELSE ! only mpi subdomains with errors are here -> STOP now 184 CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 ) 185 ENDIF 186 ! 187 IF( nstop == 0 ) nstop = 1 188 ngrdstop = Agrif_Fixed() 189 ! 190 ENDIF 109 191 ! 110 192 9500 FORMAT(' it :', i8, ' vt_i_max: ', D23.16, ' |u|_max: ', D23.16,' tm_i_min: ', D23.16) 111 193 ! 112 194 END SUBROUTINE stp_ctl 195 196 197 SUBROUTINE wrt_line( cdline, kt, cdprefix, pval, kloc, ksum, kmin, kmax ) 198 !!---------------------------------------------------------------------- 199 !! *** ROUTINE wrt_line *** 200 !! 201 !! ** Purpose : write information line 202 !! 203 !!---------------------------------------------------------------------- 204 CHARACTER(len=*), INTENT( out) :: cdline 205 CHARACTER(len=*), INTENT(in ) :: cdprefix 206 REAL(wp), INTENT(in ) :: pval 207 INTEGER, DIMENSION(3), INTENT(in ) :: kloc 208 INTEGER, INTENT(in ) :: kt, ksum, kmin, kmax 209 ! 210 CHARACTER(len=80) :: clsuff 211 CHARACTER(len=9 ) :: clkt, clsum, clmin, clmax 212 CHARACTER(len=9 ) :: cli, clj, clk 213 CHARACTER(len=1 ) :: clfmt 214 CHARACTER(len=4 ) :: cl4 ! needed to be able to compile with Agrif, I don't know why 215 INTEGER :: ifmtk 216 !!---------------------------------------------------------------------- 217 WRITE(clkt , '(i9)') kt 218 219 WRITE(clfmt, '(i1)') INT(LOG10(REAL(jpnij ,wp))) + 1 ! how many digits to we need to write ? (we decide max = 9) 220 !!! WRITE(clsum, '(i'//clfmt//')') ksum ! this is creating a compilation error with AGRIF 221 cl4 = '(i'//clfmt//')' ; WRITE(clsum, cl4) ksum 222 WRITE(clfmt, '(i1)') INT(LOG10(REAL(jpnij-1,wp))) + 1 ! how many digits to we need to write ? (we decide max = 9) 223 cl4 = '(i'//clfmt//')' ; WRITE(clmin, cl4) kmin-1 224 WRITE(clmax, cl4) kmax-1 225 ! 226 WRITE(clfmt, '(i1)') INT(LOG10(REAL(jpiglo,wp))) + 1 ! how many digits to we need to write jpiglo? (we decide max = 9) 227 cl4 = '(i'//clfmt//')' ; WRITE(cli, cl4) kloc(1) ! this is ok with AGRIF 228 WRITE(clfmt, '(i1)') INT(LOG10(REAL(jpjglo,wp))) + 1 ! how many digits to we need to write jpjglo? (we decide max = 9) 229 cl4 = '(i'//clfmt//')' ; WRITE(clj, cl4) kloc(2) ! this is ok with AGRIF 230 ! 231 IF( ksum == 1 ) THEN ; WRITE(clsuff,9100) TRIM(clmin) 232 ELSE ; WRITE(clsuff,9200) TRIM(clsum), TRIM(clmin), TRIM(clmax) 233 ENDIF 234 IF(kloc(3) == 0) THEN 235 ifmtk = INT(LOG10(REAL(jpk,wp))) + 1 ! how many digits to we need to write jpk? (we decide max = 9) 236 clk = REPEAT(' ', ifmtk) ! create the equivalent in blank string 237 WRITE(cdline,9300) TRIM(ADJUSTL(clkt)), TRIM(ADJUSTL(cdprefix)), pval, TRIM(cli), TRIM(clj), clk(1:ifmtk), TRIM(clsuff) 238 ELSE 239 WRITE(clfmt, '(i1)') INT(LOG10(REAL(jpk,wp))) + 1 ! how many digits to we need to write jpk? (we decide max = 9) 240 !!! WRITE(clk, '(i'//clfmt//')') kloc(3) ! this is creating a compilation error with AGRIF 241 cl4 = '(i'//clfmt//')' ; WRITE(clk, cl4) kloc(3) ! this is ok with AGRIF 242 WRITE(cdline,9400) TRIM(ADJUSTL(clkt)), TRIM(ADJUSTL(cdprefix)), pval, TRIM(cli), TRIM(clj), TRIM(clk), TRIM(clsuff) 243 ENDIF 244 ! 245 9100 FORMAT('MPI rank ', a) 246 9200 FORMAT('found in ', a, ' MPI tasks, spread out among ranks ', a, ' to ', a) 247 9300 FORMAT('kt ', a, ' ', a, ' ', 1pg11.4, ' at i j ', a, ' ', a, ' ', a, ' ', a) 248 9400 FORMAT('kt ', a, ' ', a, ' ', 1pg11.4, ' at i j k ', a, ' ', a, ' ', a, ' ', a) 249 ! 250 END SUBROUTINE wrt_line 251 113 252 114 253 !!======================================================================
Note: See TracChangeset
for help on using the changeset viewer.