Changeset 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/DIA
- Timestamp:
- 2012-01-28T17:44:18+01:00 (12 years ago)
- Location:
- trunk/NEMOGCM/NEMO/OPA_SRC/DIA
- Files:
-
- 8 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90
r2715 r3294 19 19 USE lib_mpp ! distribued memory computing library 20 20 USE iom ! I/O manager library 21 USE timing ! preformance summary 22 USE wrk_nemo ! working arrays 21 23 22 24 IMPLICIT NONE … … 65 67 !! ** Purpose : compute and output some AR5 diagnostics 66 68 !!---------------------------------------------------------------------- 67 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released68 USE wrk_nemo, ONLY: zarea_ssh => wrk_2d_1 , zbotpres => wrk_2d_2 ! 2D workspace69 USE wrk_nemo, ONLY: zrhd => wrk_3d_1 , zrhop => wrk_3d_2 ! 3D -70 USE wrk_nemo, ONLY: ztsn => wrk_4d_1 ! 4D -71 69 ! 72 70 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 74 72 INTEGER :: ji, jj, jk ! dummy loop arguments 75 73 REAL(wp) :: zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 74 ! 75 REAL(wp), POINTER, DIMENSION(:,:) :: zarea_ssh , zbotpres ! 2D workspace 76 REAL(wp), POINTER, DIMENSION(:,:,:) :: zrhd , zrhop ! 3D workspace 77 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsn ! 4D workspace 76 78 !!-------------------------------------------------------------------- 77 78 IF( wrk_in_use(2, 1,2) .OR. & 79 wrk_in_use(3, 1,2) .OR. & 80 wrk_in_use(4, 1) ) THEN 81 CALL ctl_stop('dia_ar5: requested workspace arrays unavailable') ; RETURN 82 ENDIF 79 IF( nn_timing == 1 ) CALL timing_start('dia_ar5') 80 81 CALL wrk_alloc( jpi , jpj , zarea_ssh , zbotpres ) 82 CALL wrk_alloc( jpi , jpj , jpk , zrhd , zrhop ) 83 CALL wrk_alloc( jpi , jpj , jpk , jpts , ztsn ) 83 84 84 85 CALL iom_put( 'cellthc', fse3t(:,:,:) ) … … 94 95 CALL iom_put( 'sshtot', zvolssh / area_tot ) 95 96 96 ! ! thermosteric ssh97 ztsn(:,:,:,jp_tem) = t n (:,:,:)97 ! 98 ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) ! thermosteric ssh 98 99 ztsn(:,:,:,jp_sal) = sn0(:,:,:) 99 100 CALL eos( ztsn, zrhd ) ! now in situ density using initial salinity … … 138 139 DO ji = 1, jpi 139 140 zztmp = area(ji,jj) * fse3t(ji,jj,jk) 140 ztemp = ztemp + zztmp * t n(ji,jj,jk)141 zsal = zsal + zztmp * sn(ji,jj,jk)141 ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 142 zsal = zsal + zztmp * tsn(ji,jj,jk,jp_sal) 142 143 END DO 143 144 END DO 144 145 END DO 145 146 IF( .NOT.lk_vvl ) THEN 146 ztemp = ztemp + SUM( zarea_ssh(:,:) * t n(:,:,1) )147 zsal = zsal + SUM( zarea_ssh(:,:) * sn(:,:,1) )147 ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 148 zsal = zsal + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 148 149 ENDIF 149 150 IF( lk_mpp ) THEN … … 160 161 CALL iom_put( 'saltot' , zsal ) 161 162 ! 162 IF( wrk_not_released(2, 1,2) .OR. & 163 wrk_not_released(3, 1,2) .OR. & 164 wrk_not_released(4, 1) ) CALL ctl_stop('dia_ar5: failed to release workspace arrays') 163 CALL wrk_dealloc( jpi , jpj , zarea_ssh , zbotpres ) 164 CALL wrk_dealloc( jpi , jpj , jpk , zrhd , zrhop ) 165 CALL wrk_dealloc( jpi , jpj , jpk , jpts , ztsn ) 166 ! 167 IF( nn_timing == 1 ) CALL timing_stop('dia_ar5') 165 168 ! 166 169 END SUBROUTINE dia_ar5 … … 173 176 !! ** Purpose : initialization for AR5 diagnostic computation 174 177 !!---------------------------------------------------------------------- 175 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released176 USE wrk_nemo, ONLY: wrk_4d_1 ! 4D workspace177 !178 178 INTEGER :: inum 179 179 INTEGER :: ik … … 183 183 !!---------------------------------------------------------------------- 184 184 ! 185 IF(wrk_in_use(4, 1) ) THEN 186 CALL ctl_stop('dia_ar5_init: requested workspace array unavailable.') ; RETURN 187 ENDIF 188 zsaldta => wrk_4d_1(:,:,:,1:2) 189 185 IF( nn_timing == 1 ) CALL timing_start('dia_ar5_init') 186 ! 187 CALL wrk_alloc( jpi , jpj , jpk, jpts, zsaldta ) 190 188 ! ! allocate dia_ar5 arrays 191 189 IF( dia_ar5_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) … … 221 219 ENDIF 222 220 ! 223 IF( wrk_not_released(4, 1) ) CALL ctl_stop('dia_ar5_init: failed to release workspace array') 221 CALL wrk_dealloc( jpi , jpj , jpk, jpts, zsaldta ) 222 ! 223 IF( nn_timing == 1 ) CALL timing_stop('dia_ar5_init') 224 224 ! 225 225 END SUBROUTINE dia_ar5_init -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diadct.F90
r3292 r3294 38 38 USE dianam ! build name of file 39 39 USE lib_mpp ! distributed memory computing library 40 #if defined key_ ice_lim2 || defined key_ice_lim340 #if defined key_lim2 || defined key_lim3 41 41 USE ice 42 42 #endif 43 43 USE domvvl 44 USE timing ! preformance summary 45 USE wrk_nemo ! working arrays 44 46 45 47 IMPLICIT NONE … … 114 116 NAMELIST/namdct/nn_dct,nn_dctwri,nn_secdebug 115 117 118 IF( nn_timing == 1 ) CALL timing_start('dia_dct_init') 119 116 120 !read namelist 117 121 REWIND( numnam ) … … 147 151 ENDIF 148 152 149 153 IF( nn_timing == 1 ) CALL timing_stop('dia_dct_init') 154 ! 150 155 END SUBROUTINE dia_dct_init 151 156 … … 161 166 162 167 !! * Local variables 163 INTEGER :: jsec, &!loop on sections 164 iost !error for opening fileout 165 LOGICAL :: lldebug =.FALSE. !debug a section 166 CHARACTER(len=160) :: clfileout !fileout name 168 INTEGER :: jsec, &! loop on sections 169 iost, &! error for opening fileout 170 itotal ! nb_sec_max*nb_type_class*nb_class_max 171 LOGICAL :: lldebug =.FALSE. ! debug a section 172 CHARACTER(len=160) :: clfileout ! fileout name 167 173 168 174 169 INTEGER , DIMENSION(1) :: ish! tmp array for mpp_sum170 INTEGER , DIMENSION(3) :: ish2! "171 REAL(wp), DIMENSION(nb_sec_max*nb_type_class*nb_class_max):: zwork ! "172 REAL(wp), DIMENSION(nb_sec_max,nb_type_class,nb_class_max):: zsum ! "175 INTEGER , DIMENSION(1) :: ish ! tmp array for mpp_sum 176 INTEGER , DIMENSION(3) :: ish2 ! " 177 REAL(wp), POINTER, DIMENSION(:) :: zwork ! " 178 REAL(wp), POINTER, DIMENSION(:,:,:):: zsum ! " 173 179 174 180 !!--------------------------------------------------------------------- 175 181 IF( nn_timing == 1 ) CALL timing_start('dia_dct') 182 183 IF( lk_mpp )THEN 184 itotal = nb_sec_max*nb_type_class*nb_class_max 185 CALL wrk_alloc( itotal , zwork ) 186 CALL wrk_alloc( nb_sec_max,nb_type_class,nb_class_max , zsum ) 187 ENDIF 188 176 189 IF( lwp .AND. kt==nit000+nn_dct-1 ) THEN 177 190 WRITE(numout,*) " " … … 189 202 !debug this section computing ? 190 203 lldebug=.FALSE. 191 ! IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND. kt==nit000+nn_dct-1 .AND. lwp ) lldebug=.TRUE. 192 IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND. kt==nit000+nn_dct-1 ) lldebug=.TRUE. 204 IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND. kt==nit000+nn_dct-1 .AND. lwp ) lldebug=.TRUE. 193 205 194 206 !Compute transport through section … … 226 238 ENDIF 227 239 240 IF( lk_mpp )THEN 241 itotal = nb_sec_max*nb_type_class*nb_class_max 242 CALL wrk_dealloc( itotal , zwork ) 243 CALL wrk_dealloc( nb_sec_max,nb_type_class,nb_class_max , zsum ) 244 ENDIF 245 246 IF( nn_timing == 1 ) CALL timing_stop('dia_dct') 247 ! 228 248 END SUBROUTINE dia_dct 229 249 … … 250 270 TYPE(POINT_SECTION),DIMENSION(nb_point_max) ::coordtemp !contains listpoints coordinates 251 271 !read in the file 252 INTEGER, DIMENSION(nb_point_max) ::directemp!contains listpoints directions272 INTEGER, POINTER, DIMENSION(:) :: directemp !contains listpoints directions 253 273 !read in the files 254 274 LOGICAL :: llbon ,&!local logical 255 275 lldebug !debug the section 256 276 !!------------------------------------------------------------------------------------- 277 CALL wrk_alloc( nb_point_max, directemp ) 257 278 258 279 !open input file … … 381 402 ENDIF 382 403 404 IF(jsec==nn_secdebug .AND. secs(jsec)%nb_point .NE. 0)THEN 405 WRITE(narea+200,*)'avant secs(jsec)%nb_point iptloc ',secs(jsec)%nb_point,iptloc 406 DO jpt = 1,iptloc 407 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 408 ijglo = secs(jsec)%listPoint(jpt)%J + jpjzoom - 1 + njmpp - 1 409 WRITE(narea+200,*)'avant # I J : ',iiglo,ijglo 410 ENDDO 411 ENDIF 412 383 413 !remove redundant points between processors 384 414 !------------------------------------------ … … 390 420 CALL removepoints(secs(jsec),'J','bot_list',lldebug) 391 421 ENDIF 422 IF(jsec==nn_secdebug .AND. secs(jsec)%nb_point .NE. 0)THEN 423 WRITE(narea+200,*)'apres secs(jsec)%nb_point iptloc ',secs(jsec)%nb_point,iptloc 424 DO jpt = 1,secs(jsec)%nb_point 425 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 426 ijglo = secs(jsec)%listPoint(jpt)%J + jpjzoom - 1 + njmpp - 1 427 WRITE(narea+200,*)'apres # I J : ',iiglo,ijglo 428 ENDDO 429 ENDIF 392 430 393 431 !debug … … 395 433 IF( lwp .AND. ( jsec==nn_secdebug .OR. nn_secdebug==-1 ) )THEN 396 434 WRITE(numout,*)" List of points after removepoints:" 435 iptloc = secs(jsec)%nb_point 397 436 DO jpt = 1,iptloc 398 437 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 … … 411 450 nb_sec = jsec-1 !number of section read in the file 412 451 452 CALL wrk_dealloc( nb_point_max, directemp ) 453 ! 413 454 END SUBROUTINE readsec 414 455 … … 436 477 ! isgn=-1 : scan listpoint from end to start 437 478 istart,iend !first and last points selected in listpoint 438 INTEGER :: jpoint =0!loop on list points439 INTEGER, DIMENSION(nb_point_max) :: idirec !contains temporary sec%direction440 INTEGER, DIMENSION(2,nb_point_max) :: icoord !contains temporary sec%listpoint479 INTEGER :: jpoint !loop on list points 480 INTEGER, POINTER, DIMENSION(:) :: idirec !contains temporary sec%direction 481 INTEGER, POINTER, DIMENSION(:,:) :: icoord !contains temporary sec%listpoint 441 482 !---------------------------------------------------------------------------- 483 CALL wrk_alloc( nb_point_max, idirec ) 484 CALL wrk_alloc( 2, nb_point_max, icoord ) 485 442 486 IF( ld_debug )WRITE(numout,*)' -------------------------' 443 487 IF( ld_debug )WRITE(numout,*)' removepoints in listpoint' … … 467 511 sec%direction = 0 468 512 469 470 513 jpoint=iextr+isgn 471 DO WHILE( jpoint .GE. 1 .AND. jpoint .LE. sec%nb_point .AND. & 472 icoord( iind,jpoint-isgn ) == itest .AND. icoord( iind,jpoint ) == itest ) 473 jpoint=jpoint+isgn 474 ENDDO 514 DO WHILE( jpoint .GE. 1 .AND. jpoint .LE. sec%nb_point ) 515 IF( icoord( iind,jpoint-isgn ) == itest .AND. icoord( iind,jpoint ) == itest )THEN ; jpoint=jpoint+isgn 516 ELSE ; EXIT 517 ENDIF 518 ENDDO 475 519 476 520 IF( cdextr=='bot_list')THEN ; istart=jpoint-1 ; iend=sec%nb_point 477 521 ELSE ; istart=1 ; iend=jpoint+1 478 522 ENDIF 523 479 524 sec%listPoint(1:1+iend-istart)%I = icoord(1,istart:iend) 480 525 sec%listPoint(1:1+iend-istart)%J = icoord(2,istart:iend) … … 487 532 ENDIF 488 533 534 CALL wrk_dealloc( nb_point_max, idirec ) 535 CALL wrk_dealloc( 2, nb_point_max, icoord ) 489 536 END SUBROUTINE removepoints 490 537 … … 536 583 537 584 TYPE(POINT_SECTION) :: k 538 REAL(wp), DIMENSION(nb_type_class,nb_class_max)::zsum585 REAL(wp), POINTER, DIMENSION(:,:):: zsum ! 2D work array 539 586 !!-------------------------------------------------------- 587 CALL wrk_alloc( nb_type_class , nb_class_max , zsum ) 540 588 541 589 IF( ld_debug )WRITE(numout,*)' Compute transport' … … 746 794 ENDDO !end of loop on the density classes 747 795 748 #if defined key_ ice_lim796 #if defined key_lim2 || defined key_lim3 749 797 750 798 !ICE CASE … … 812 860 sec%transport(2,jclass)=sec%transport(2,jclass)+zsum(2,jclass)*1.E-6 813 861 IF( sec%llstrpond ) THEN 814 IF( zsum(1,jclass) .NE. 0 ) THEN 815 sec%transport(3,jclass)=sec%transport(3,jclass)+zsum(3,jclass)/zsum(1,jclass) 816 sec%transport(5,jclass)=sec%transport(5,jclass)+zsum(5,jclass)/zsum(1,jclass) 817 sec%transport(7,jclass)=sec%transport(7,jclass)+zsum(7,jclass) 818 sec%transport(9,jclass)=sec%transport(9,jclass)+zsum(9,jclass) 819 ELSE 820 sec%transport(3,jclass)=0. 821 sec%transport(5,jclass)=0. 822 sec%transport(7,jclass)=0. 823 sec%transport(9,jclass)=0. 862 IF( zsum(1,jclass) .NE. 0._wp ) THEN 863 sec%transport( 3,jclass) = sec%transport( 3,jclass) + zsum( 3,jclass)/zsum(1,jclass) 864 sec%transport( 5,jclass) = sec%transport( 5,jclass) + zsum( 5,jclass)/zsum(1,jclass) 865 sec%transport( 7,jclass) = sec%transport( 7,jclass) + zsum( 7,jclass) 866 sec%transport( 9,jclass) = sec%transport( 9,jclass) + zsum( 9,jclass) 824 867 ENDIF 825 IF( zsum(2,jclass) .NE. 0 )THEN 826 sec%transport( 4,jclass)=sec%transport( 4,jclass)+zsum( 4,jclass)/zsum(2,jclass) 827 sec%transport( 6,jclass)=sec%transport( 6,jclass)+zsum( 6,jclass)/zsum(2,jclass) 828 sec%transport( 8,jclass)=sec%transport( 8,jclass)+zsum( 8,jclass) 829 sec%transport(10,jclass)=sec%transport(10,jclass)+zsum(10,jclass) 830 ELSE 831 sec%transport( 4,jclass)=0. 832 sec%transport( 6,jclass)=0. 833 sec%transport( 8,jclass)=0. 834 sec%transport(10,jclass)=0. 868 IF( zsum(2,jclass) .NE. 0._wp )THEN 869 sec%transport( 4,jclass) = sec%transport( 4,jclass) + zsum( 4,jclass)/zsum(2,jclass) 870 sec%transport( 6,jclass) = sec%transport( 6,jclass) + zsum( 6,jclass)/zsum(2,jclass) 871 sec%transport( 8,jclass) = sec%transport( 8,jclass) + zsum( 8,jclass) 872 sec%transport(10,jclass) = sec%transport(10,jclass) + zsum(10,jclass) 835 873 ENDIF 836 874 ELSE 837 sec%transport( 3,jclass) =0.838 sec%transport( 4,jclass) =0.839 sec%transport( 5,jclass) =0.840 sec%transport( 6,jclass) =0.841 sec%transport( 7,jclass) =0.842 sec%transport( 8,jclass) =0.843 sec%transport(10,jclass) =0.875 sec%transport( 3,jclass) = 0._wp 876 sec%transport( 4,jclass) = 0._wp 877 sec%transport( 5,jclass) = 0._wp 878 sec%transport( 6,jclass) = 0._wp 879 sec%transport( 7,jclass) = 0._wp 880 sec%transport( 8,jclass) = 0._wp 881 sec%transport(10,jclass) = 0._wp 844 882 ENDIF 845 883 ENDDO … … 852 890 ENDIF 853 891 892 CALL wrk_dealloc( nb_type_class , nb_class_max , zsum ) 893 ! 854 894 END SUBROUTINE transport 855 895 … … 872 912 !!------------------------------------------------------------- 873 913 !!arguments 874 INTEGER, INTENT(IN) :: kt ! time-step875 TYPE(SECTION), INTENT(INOUT) :: sec ! section to write876 INTEGER ,INTENT(IN) :: ksec ! section number914 INTEGER, INTENT(IN) :: kt ! time-step 915 TYPE(SECTION), INTENT(INOUT) :: sec ! section to write 916 INTEGER ,INTENT(IN) :: ksec ! section number 877 917 878 918 !!local declarations 879 REAL(wp) ,DIMENSION(nb_type_class):: zsumclass 880 INTEGER :: jcl,ji ! Dummy loop 881 CHARACTER(len=2) :: classe ! Classname 882 REAL(wp) :: zbnd1,zbnd2 ! Class bounds 883 REAL(wp) :: zslope ! section's slope coeff 919 INTEGER :: jcl,ji ! Dummy loop 920 CHARACTER(len=2) :: classe ! Classname 921 REAL(wp) :: zbnd1,zbnd2 ! Class bounds 922 REAL(wp) :: zslope ! section's slope coeff 923 ! 924 REAL(wp), POINTER, DIMENSION(:):: zsumclass ! 1D workspace 884 925 !!------------------------------------------------------------- 885 926 CALL wrk_alloc(nb_type_class , zsumclass ) 927 886 928 zsumclass(:)=0._wp 887 929 zslope = sec%slopeSection … … 996 1038 119 FORMAT(I8,1X,I8,1X,I4,1X,A30,1X,f9.2,1X,I4,3X,A8,1X,2F12.4,5X,3E15.6) 997 1039 1040 CALL wrk_dealloc(nb_type_class , zsumclass ) 998 1041 END SUBROUTINE dia_dct_wri 999 1042 -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diadimg.F90
r2715 r3294 10 10 USE in_out_manager ! I/O manager 11 11 USE daymod ! calendar 12 USE lib_mpp 12 13 13 14 IMPLICIT NONE … … 40 41 !!--------------------------------------------------------------------- 41 42 ! 42 ALLOCATE( z42d(jpi,jpj), z4dep(jpk), STAT=dia_wri_dimg_alloc ) 43 ! 44 IF( lk_mpp ) CALL mpp_sum ( dia_wri_dimg_alloc ) 45 IF( dia_wri_dimg_alloc /= 0 ) CALL ctl_warn('dia_wri_dimg_alloc: allocation of array failed.') 43 IF( .NOT. ALLOCATED( z42d ) )THEN 44 45 ALLOCATE( z42d(jpi,jpj), z4dep(jpk), STAT=dia_wri_dimg_alloc ) 46 47 IF( lk_mpp ) CALL mpp_sum ( dia_wri_dimg_alloc ) 48 IF( dia_wri_dimg_alloc /= 0 ) CALL ctl_warn('dia_wri_dimg_alloc: allocation of array failed.') 49 50 ELSE 51 52 dia_wri_dimg_alloc = 0 53 54 ENDIF 46 55 ! 47 56 END FUNCTION dia_wri_dimg_alloc -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diafwb.F90
r2528 r3294 22 22 USE in_out_manager ! I/O manager 23 23 USE lib_mpp ! distributed memory computing library 24 USE timing ! preformance summary 24 25 25 26 IMPLICIT NONE … … 61 62 REAL(wp) :: zsm0, zfwfnew 62 63 !!---------------------------------------------------------------------- 64 IF( nn_timing == 1 ) CALL timing_start('dia_fwb') 63 65 64 66 ! Mean global salinity … … 80 82 DO ji = fs_2, fs_jpim1 ! vector opt. 81 83 zwei = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 82 a_salb = a_salb + ( sb(ji,jj,jk) - zsm0 ) * zwei84 a_salb = a_salb + ( tsb(ji,jj,jk,jp_sal) - zsm0 ) * zwei 83 85 END DO 84 86 END DO … … 106 108 DO ji = fs_2, fs_jpim1 ! vector opt. 107 109 zwei = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 108 a_saln = a_saln + ( sn(ji,jj,jk) - zsm0 ) * zwei110 a_saln = a_saln + ( tsn(ji,jj,jk,jp_sal) - zsm0 ) * zwei 109 111 zvol = zvol + zwei 110 112 END DO … … 174 176 END SELECT 175 177 ! 176 DO ji = mi0(ii0), mi1(ii1)178 DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 177 179 DO jj = mj0(ij0), mj1(ij1) 178 180 DO jk = 1, jpk 179 zt = 0.5 * ( t n(ji,jj,jk) + tn(ji+1,jj,jk) )180 zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) )181 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 181 zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 182 zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 183 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 182 184 183 185 IF( un(ji,jj,jk) > 0.e0 ) THEN … … 221 223 END SELECT 222 224 ! 223 DO ji = mi0(ii0), mi1(ii1)225 DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 224 226 DO jj = mj0(ij0), mj1(ij1) 225 227 DO jk = 1, jpk 226 zt = 0.5 * ( t n(ji,jj,jk) + tn(ji+1,jj,jk) )227 zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) )228 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 228 zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 229 zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 230 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 229 231 230 232 IF( un(ji,jj,jk) > 0.e0 ) THEN … … 268 270 END SELECT 269 271 ! 270 DO ji = mi0(ii0), mi1(ii1)272 DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 271 273 DO jj = mj0(ij0), mj1(ij1) 272 274 DO jk = 1, jpk 273 zt = 0.5 * ( t n(ji,jj,jk) + tn(ji+1,jj,jk) )274 zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) )275 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 275 zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 276 zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 277 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 276 278 277 279 IF( un(ji,jj,jk) > 0.e0 ) THEN … … 315 317 END SELECT 316 318 ! 317 DO ji = mi0(ii0), mi1(ii1)319 DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 318 320 DO jj = mj0(ij0), mj1(ij1) 319 321 DO jk = 1, jpk 320 zt = 0.5 * ( t n(ji,jj,jk) + tn(ji+1,jj,jk) )321 zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) )322 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 322 zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 323 zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 324 zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 323 325 324 326 IF( un(ji,jj,jk) > 0.e0 ) THEN … … 438 440 ENDIF 439 441 442 IF( nn_timing == 1 ) CALL timing_start('dia_fwb') 443 440 444 9005 FORMAT(1X,A,ES24.16) 441 445 9010 FORMAT(1X,A,ES12.5,A,F10.5,A) -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90
r3292 r3294 16 16 USE dynspg_oce 17 17 USE dynspg_ts 18 USE surdetermine19 18 USE daymod 20 19 USE tide_mod 21 20 USE iom 21 USE timing ! preformance summary 22 USE wrk_nemo ! working arrays 22 23 23 24 IMPLICIT NONE 24 25 PRIVATE 26 27 LOGICAL, PUBLIC, PARAMETER :: lk_diaharm = .TRUE. 25 28 26 INTEGER, PARAMETER :: nb_harmo_max=9 27 28 LOGICAL, PUBLIC, PARAMETER :: lk_diaharm = .TRUE. 29 30 INTEGER :: & !! namelist variables 31 nit000_han=1, & ! First time step used for harmonic analysis 32 nitend_han=1, & ! Last time step used for harmonic analysis 33 nstep_han=1, & ! Time step frequency for harmonic analysis 34 nb_ana ! Number of harmonics to analyse 35 36 CHARACTER (LEN=4), DIMENSION(nb_harmo_max) :: & 29 INTEGER, PARAMETER :: jpincomax = 2.*jpmax_harmo 30 INTEGER, PARAMETER :: jpdimsparse = jpincomax*300*24 31 32 INTEGER :: & !! namelist variables 33 nit000_han = 1, & ! First time step used for harmonic analysis 34 nitend_han = 1, & ! Last time step used for harmonic analysis 35 nstep_han = 1, & ! Time step frequency for harmonic analysis 36 nb_ana ! Number of harmonics to analyse 37 38 INTEGER , ALLOCATABLE, DIMENSION(:) :: name 39 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ana_temp 40 REAL(wp), ALLOCATABLE, DIMENSION(:) :: ana_freq, vt, ut, ft 41 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: out_eta, & 42 out_u , & 43 out_v 44 45 INTEGER :: ninco, nsparse 46 INTEGER , DIMENSION(jpdimsparse) :: njsparse, nisparse 47 INTEGER , SAVE, DIMENSION(jpincomax) :: ipos1 48 REAL(wp), DIMENSION(jpdimsparse) :: valuesparse 49 REAL(wp), DIMENSION(jpincomax) :: ztmp4 , ztmp7 50 REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) :: ztmp3 , zpilier 51 REAL(wp), SAVE, DIMENSION(jpincomax) :: zpivot 52 53 CHARACTER (LEN=4), DIMENSION(jpmax_harmo) :: & 37 54 tname ! Names of tidal constituents ('M2', 'K1',...) 38 55 39 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ana_temp40 REAL(wp), ALLOCATABLE, DIMENSION(:) :: ana_freq, vt, ut, ft41 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: out_eta, &42 out_u, &43 out_v44 INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) :: name45 56 46 57 !! * Routine accessibility … … 67 78 !! * Local declarations 68 79 INTEGER :: jh, nhan, jk, ji 69 NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, nb_ana, tname 70 71 !!---------------------------------------------------------------------- 72 73 ! Read namelist parameters: 74 ! ------------------------- 80 81 NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, tname 82 !!---------------------------------------------------------------------- 83 84 IF(lwp) THEN 85 WRITE(numout,*) 86 WRITE(numout,*) 'dia_harm_init: Tidal harmonic analysis initialization' 87 WRITE(numout,*) '~~~~~~~ ' 88 ENDIF 89 ! 90 CALL tide_init_Wave 91 ! 92 tname(:)='' 93 ! 94 ! Read Namelist nam_diaharm 75 95 REWIND ( numnam ) 76 96 READ ( numnam, nam_diaharm ) 77 78 IF(lwp) WRITE(numout,*) 79 IF(lwp) WRITE(numout,*) 'dia_harm_init: Tidal harmonic analysis initialization' 80 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~' 81 82 IF(lwp) WRITE(numout,*) 'First time step used for analysis: nit000_han= ', nit000_han 83 IF(lwp) WRITE(numout,*) 'Last time step used for analysis: nitend_han= ', nitend_han 84 IF(lwp) WRITE(numout,*) 'Time step frequency for harmonic analysis: nstep_han= ', nstep_han 85 86 IF (nb_ana > nb_harmo_max) THEN 87 IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 88 & nb_ana must be lower than nb_harmo_max, stop' 89 IF(lwp) WRITE(numout,*) 'nb_harmo_max= ', nb_harmo_max 90 nstop = nstop + 1 97 ! 98 IF(lwp) THEN 99 WRITE(numout,*) 'First time step used for analysis: nit000_han= ', nit000_han 100 WRITE(numout,*) 'Last time step used for analysis: nitend_han= ', nitend_han 101 WRITE(numout,*) 'Time step frequency for harmonic analysis: nstep_han= ', nstep_han 91 102 ENDIF 92 103 … … 94 105 ! ---------------------------------------------- 95 106 IF (nit000 > nit000_han) THEN 96 IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 97 & nit000_han must be greater than nit000, stop' 98 IF(lwp) WRITE(numout,*) 'restart capability not implemented' 107 IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nit000_han must be greater than nit000, stop' 108 IF(lwp) WRITE(numout,*) ' restart capability not implemented' 99 109 nstop = nstop + 1 100 110 ENDIF 101 111 IF (nitend < nitend_han) THEN 102 IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 103 & nitend_han must be lower than nitend, stop' 104 IF(lwp) WRITE(numout,*) 'restart capability not implemented' 112 IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nitend_han must be lower than nitend, stop' 113 IF(lwp) WRITE(numout,*) ' restart capability not implemented' 105 114 nstop = nstop + 1 106 115 ENDIF 107 116 108 117 IF (MOD(nitend_han-nit000_han+1,nstep_han).NE.0) THEN 109 IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 110 & analysis time span must be a multiple of nstep_han, stop' 118 IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : analysis time span must be a multiple of nstep_han, stop' 111 119 nstop = nstop + 1 112 120 END IF 113 121 114 CALL tide_init_Wave 122 nb_ana=0 123 DO jk=1,jpmax_harmo 124 DO ji=1,jpmax_harmo 125 IF(TRIM(tname(jk)) == Wave(ji)%cname_tide) THEN 126 nb_ana=nb_ana+1 127 ENDIF 128 END DO 129 ENDDO 130 ! 131 IF(lwp) THEN 132 WRITE(numout,*) ' Namelist nam_diaharm' 133 WRITE(numout,*) ' nb_ana = ', nb_ana 134 CALL flush(numout) 135 ENDIF 136 ! 137 IF (nb_ana > jpmax_harmo) THEN 138 IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nb_ana must be lower than jpmax_harmo, stop' 139 IF(lwp) WRITE(numout,*) ' jpmax_harmo= ', jpmax_harmo 140 nstop = nstop + 1 141 ENDIF 115 142 116 143 ALLOCATE(name (nb_ana)) … … 162 189 163 190 !! * Local declarations 164 INTEGER :: ji, jj, jh, jc, nhc191 INTEGER :: ji, jj, jh, jc, nhc 165 192 REAL(wp) :: ztime, ztemp 193 !!-------------------------------------------------------------------- 194 IF( nn_timing == 1 ) CALL timing_start('dia_harm') 166 195 167 196 IF ( kt .EQ. nit000 ) CALL dia_harm_init … … 170 199 (MOD(kt,nstep_han).EQ.0) ) THEN 171 200 172 ztime = kt*rdt201 ztime = (kt-nit000+1)*rdt 173 202 174 203 nhc = 0 … … 202 231 IF ( kt .EQ. nitend_han ) CALL dia_harm_end 203 232 233 IF( nn_timing == 1 ) CALL timing_stop('dia_harm') 204 234 205 235 END SUBROUTINE dia_harm … … 223 253 REAL(wp) :: ztime, ztime_ini, ztime_end 224 254 REAL(wp) :: X1,X2 225 REAL(wp), DIMENSION(jpi,jpj,nb_harmo_max,2) :: ana_amp 226 227 228 IF(lwp) WRITE(numout,*) 229 IF(lwp) WRITE(numout,*) 'anharmo_end: kt=nitend_han: Perform harmonic analysis' 230 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 231 232 ztime_ini = nit000_han*rdt ! Initial time in seconds at the beginning of analysis 233 ztime_end = nitend_han*rdt ! Final time in seconds at the end of analysis 234 nhan = (nitend_han-nit000_han+1)/nstep_han ! Number of dumps used for analysis 235 236 ninco = 2*nb_ana 237 238 ksp = 0 239 keq = 0 240 DO jn = 1, nhan 241 ztime=( (nhan-jn)*ztime_ini + (jn-1)*ztime_end )/FLOAT(nhan-1) 242 keq = keq + 1 243 kun = 0 244 DO jh = 1,nb_ana 255 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ana_amp 256 !!-------------------------------------------------------------------- 257 CALL wrk_alloc( jpi , jpj , jpmax_harmo , 2 , ana_amp ) 258 259 IF(lwp) WRITE(numout,*) 260 IF(lwp) WRITE(numout,*) 'anharmo_end: kt=nitend_han: Perform harmonic analysis' 261 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 262 263 ztime_ini = nit000_han*rdt ! Initial time in seconds at the beginning of analysis 264 ztime_end = nitend_han*rdt ! Final time in seconds at the end of analysis 265 nhan = (nitend_han-nit000_han+1)/nstep_han ! Number of dumps used for analysis 266 267 ninco = 2*nb_ana 268 269 ksp = 0 270 keq = 0 271 DO jn = 1, nhan 272 ztime=( (nhan-jn)*ztime_ini + (jn-1)*ztime_end )/FLOAT(nhan-1) 273 keq = keq + 1 274 kun = 0 275 DO jh = 1,nb_ana 245 276 DO jc = 1,2 246 kun = kun + 1247 ksp = ksp + 1248 nisparse(ksp) = keq249 njsparse(ksp) = kun250 valuesparse(ksp)= &251 +(MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) &277 kun = kun + 1 278 ksp = ksp + 1 279 nisparse(ksp) = keq 280 njsparse(ksp) = kun 281 valuesparse(ksp)= & 282 +( MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) & 252 283 +(1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh))) 253 284 END DO 254 255 256 257 258 259 260 261 285 END DO 286 END DO 287 288 nsparse=ksp 289 290 ! Elevation: 291 DO jj = 1, jpj 292 DO ji = 1, jpi 262 293 ! Fill input array 263 294 kun=0 264 295 DO jh = 1,nb_ana 265 DO jc = 1,2266 kun = kun + 1267 tmp4(kun)=ana_temp(ji,jj,kun,1)268 ENDDO296 DO jc = 1,2 297 kun = kun + 1 298 ztmp4(kun)=ana_temp(ji,jj,kun,1) 299 ENDDO 269 300 ENDDO 270 301 … … 273 304 ! Fill output array 274 305 DO jh = 1, nb_ana 275 ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1)276 ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2)306 ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 307 ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 277 308 END DO 278 END DO 279 END DO 280 281 ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 282 ALLOCATE(out_u (jpi,jpj,2*nb_ana)) 283 ALLOCATE(out_v (jpi,jpj,2*nb_ana)) 284 285 286 DO jj = 1, jpj 287 DO ji = 1, jpi 309 END DO 310 END DO 311 312 ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 313 ALLOCATE(out_u (jpi,jpj,2*nb_ana)) 314 ALLOCATE(out_v (jpi,jpj,2*nb_ana)) 315 316 DO jj = 1, jpj 317 DO ji = 1, jpi 288 318 DO jh = 1, nb_ana 289 290 291 292 319 X1=ana_amp(ji,jj,jh,1) 320 X2=-ana_amp(ji,jj,jh,2) 321 out_eta(ji,jj,jh)=X1 * tmask(ji,jj,1) 322 out_eta(ji,jj,nb_ana+jh)=X2 * tmask(ji,jj,1) 293 323 ENDDO 294 295 296 297 298 299 324 ENDDO 325 ENDDO 326 327 ! ubar: 328 DO jj = 1, jpj 329 DO ji = 1, jpi 300 330 ! Fill input array 301 331 kun=0 302 332 DO jh = 1,nb_ana 303 DO jc = 1,2304 kun = kun + 1305 tmp4(kun)=ana_temp(ji,jj,kun,2)306 ENDDO333 DO jc = 1,2 334 kun = kun + 1 335 ztmp4(kun)=ana_temp(ji,jj,kun,2) 336 ENDDO 307 337 ENDDO 308 338 … … 311 341 ! Fill output array 312 342 DO jh = 1, nb_ana 313 ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1)314 ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2)343 ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 344 ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 315 345 END DO 316 346 317 318 319 320 321 347 END DO 348 END DO 349 350 DO jj = 1, jpj 351 DO ji = 1, jpi 322 352 DO jh = 1, nb_ana 323 324 325 326 353 X1=ana_amp(ji,jj,jh,1) 354 X2=-ana_amp(ji,jj,jh,2) 355 out_u(ji,jj,jh) = X1 * umask(ji,jj,1) 356 out_u (ji,jj,nb_ana+jh) = X2 * umask(ji,jj,1) 327 357 ENDDO 328 329 330 331 332 333 334 335 336 337 358 ENDDO 359 ENDDO 360 361 ! vbar: 362 DO jj = 1, jpj 363 DO ji = 1, jpi 364 ! Fill input array 365 kun=0 366 DO jh = 1,nb_ana 367 DO jc = 1,2 338 368 kun = kun + 1 339 tmp4(kun)=ana_temp(ji,jj,kun,3)340 341 342 343 344 345 346 347 ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1)348 ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2)349 350 351 352 353 354 355 369 ztmp4(kun)=ana_temp(ji,jj,kun,3) 370 ENDDO 371 ENDDO 372 373 CALL SUR_DETERMINE(jj+1) 374 375 ! Fill output array 376 DO jh = 1, nb_ana 377 ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 378 ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 379 END DO 380 381 END DO 382 END DO 383 384 DO jj = 1, jpj 385 DO ji = 1, jpi 356 386 DO jh = 1, nb_ana 357 358 359 360 387 X1=ana_amp(ji,jj,jh,1) 388 X2=-ana_amp(ji,jj,jh,2) 389 out_v(ji,jj,jh)=X1 * vmask(ji,jj,1) 390 out_v(ji,jj,nb_ana+jh)=X2 * vmask(ji,jj,1) 361 391 ENDDO 362 ENDDO 363 ENDDO 364 365 CALL dia_wri_harm ! Write results in files 366 367 END SUBROUTINE dia_harm_end 368 369 SUBROUTINE dia_wri_harm 392 ENDDO 393 ENDDO 394 395 CALL dia_wri_harm ! Write results in files 396 CALL wrk_dealloc( jpi , jpj , jpmax_harmo , 2 , ana_amp ) 397 ! 398 END SUBROUTINE dia_harm_end 399 400 SUBROUTINE dia_wri_harm 370 401 !!-------------------------------------------------------------------- 371 402 !! *** ROUTINE dia_wri_harm *** … … 382 413 CHARACTER(LEN=lc) :: cltext 383 414 CHARACTER(LEN=lc) :: & 384 cdfile_name_T 385 cdfile_name_U 386 cdfile_name_V 387 INTEGER :: jh 415 cdfile_name_T , & ! name of the file created (T-points) 416 cdfile_name_U , & ! name of the file created (U-points) 417 cdfile_name_V ! name of the file created (V-points) 418 INTEGER :: jh 388 419 !!---------------------------------------------------------------------- 389 420 … … 395 426 396 427 IF(lwp) WRITE(numout,*) ' ' 397 IF(lwp) WRITE(numout,*) 'dia_wri_harm : Write harmonic analysis results' 428 IF(lwp) WRITE(numout,*) 'dia_wri_harm : Write harmonic analysis results' 398 429 #if defined key_dimgout 399 430 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~ Output files: ', TRIM(cdfile_name_T) … … 442 473 #endif 443 474 444 END SUBROUTINE dia_wri_harm 475 END SUBROUTINE dia_wri_harm 476 477 SUBROUTINE SUR_DETERMINE(init) 478 !!--------------------------------------------------------------------------------- 479 !! *** ROUTINE SUR_DETERMINE *** 480 !! 481 !! 482 !! 483 !!--------------------------------------------------------------------------------- 484 INTEGER, INTENT(in) :: init 485 486 INTEGER :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd 487 REAL(wp) :: zval1, zval2, zx1 488 REAL(wp), POINTER, DIMENSION(:) :: ztmpx, zcol1, zcol2 489 INTEGER , POINTER, DIMENSION(:) :: ipos2, ipivot 490 !--------------------------------------------------------------------------------- 491 CALL wrk_alloc( jpincomax , ztmpx , zcol1 , zcol2 ) 492 CALL wrk_alloc( jpincomax , ipos2 , ipivot ) 493 494 IF( init==1 )THEN 495 496 IF( nsparse .GT. jpdimsparse ) & 497 CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 498 499 IF( ninco .GT. jpincomax ) & 500 CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 501 502 ztmp3(:,:)=0.e0 503 504 DO jk1_sd = 1, nsparse 505 DO jk2_sd = 1, nsparse 506 507 nisparse(jk2_sd)=nisparse(jk2_sd) 508 njsparse(jk2_sd)=njsparse(jk2_sd) 509 510 IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN 511 ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) & 512 + valuesparse(jk1_sd)*valuesparse(jk2_sd) 513 ENDIF 514 515 ENDDO 516 ENDDO 517 518 DO jj_sd = 1 ,ninco 519 ipos1(jj_sd) = jj_sd 520 ipos2(jj_sd) = jj_sd 521 ENDDO 522 523 DO ji_sd = 1 , ninco 524 525 !find greatest non-zero pivot: 526 zval1 = ABS(ztmp3(ji_sd,ji_sd)) 527 528 ipivot(ji_sd) = ji_sd 529 DO jj_sd = ji_sd, ninco 530 zval2 = ABS(ztmp3(ji_sd,jj_sd)) 531 IF( zval2.GE.zval1 )THEN 532 ipivot(ji_sd) = jj_sd 533 zval1 = zval2 534 ENDIF 535 ENDDO 536 537 DO ji1_sd = 1, ninco 538 zcol1(ji1_sd) = ztmp3(ji1_sd,ji_sd) 539 zcol2(ji1_sd) = ztmp3(ji1_sd,ipivot(ji_sd)) 540 ztmp3(ji1_sd,ji_sd) = zcol2(ji1_sd) 541 ztmp3(ji1_sd,ipivot(ji_sd)) = zcol1(ji1_sd) 542 ENDDO 543 544 ipos2(ji_sd) = ipos1(ipivot(ji_sd)) 545 ipos2(ipivot(ji_sd)) = ipos1(ji_sd) 546 ipos1(ji_sd) = ipos2(ji_sd) 547 ipos1(ipivot(ji_sd)) = ipos2(ipivot(ji_sd)) 548 zpivot(ji_sd) = ztmp3(ji_sd,ji_sd) 549 DO jj_sd = 1, ninco 550 ztmp3(ji_sd,jj_sd) = ztmp3(ji_sd,jj_sd) / zpivot(ji_sd) 551 ENDDO 552 553 DO ji2_sd = ji_sd+1, ninco 554 zpilier(ji2_sd,ji_sd)=ztmp3(ji2_sd,ji_sd) 555 DO jj_sd=1,ninco 556 ztmp3(ji2_sd,jj_sd)= ztmp3(ji2_sd,jj_sd) - ztmp3(ji_sd,jj_sd) * zpilier(ji2_sd,ji_sd) 557 ENDDO 558 ENDDO 559 560 ENDDO 561 562 ENDIF ! End init==1 563 564 DO ji_sd = 1, ninco 565 ztmp4(ji_sd) = ztmp4(ji_sd) / zpivot(ji_sd) 566 DO ji2_sd = ji_sd+1, ninco 567 ztmp4(ji2_sd) = ztmp4(ji2_sd) - ztmp4(ji_sd) * zpilier(ji2_sd,ji_sd) 568 ENDDO 569 ENDDO 570 571 !system solving: 572 ztmpx(ninco) = ztmp4(ninco) / ztmp3(ninco,ninco) 573 ji_sd = ninco 574 DO ji_sd = ninco-1, 1, -1 575 zx1=0. 576 DO jj_sd = ji_sd+1, ninco 577 zx1 = zx1 + ztmpx(jj_sd) * ztmp3(ji_sd,jj_sd) 578 ENDDO 579 ztmpx(ji_sd) = ztmp4(ji_sd)-zx1 580 ENDDO 581 582 DO jj_sd =1, ninco 583 ztmp7(ipos1(jj_sd))=ztmpx(jj_sd) 584 ENDDO 585 586 587 CALL wrk_dealloc( jpincomax , ztmpx , zcol1 , zcol2 ) 588 CALL wrk_dealloc( jpincomax , ipos2 , ipivot ) 589 590 END SUBROUTINE SUR_DETERMINE 591 445 592 446 593 #else -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90
r2528 r3294 18 18 USE lib_mpp ! distributed memory computing library 19 19 USE trabbc ! bottom boundary condition 20 USE obc_par ! (for lk_obc) 20 21 USE bdy_par ! (for lk_bdy) 21 USE obc_par ! (for lk_obc)22 USE timing ! preformance summary 22 23 23 24 IMPLICIT NONE … … 72 73 REAL(dp) :: z_frc_trd_v ! - - 73 74 !!--------------------------------------------------------------------------- 75 IF( nn_timing == 1 ) CALL timing_start('dia_hsb') 74 76 75 77 ! ------------------------- ! … … 107 109 ! heat content variation 108 110 zdiff_hc = zdiff_hc + SUM( surf(:,:) * tmask(:,:,jk) & 109 & * ( fse3t_n(:,:,jk) * t n(:,:,jk) &111 & * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_tem) & 110 112 & - hc_loc_ini(:,:,jk) ) ) 111 113 ! salt content variation 112 114 zdiff_sc = zdiff_sc + SUM( surf(:,:) * tmask(:,:,jk) & 113 & * ( fse3t_n(:,:,jk) * sn(:,:,jk) &115 & * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_sal) & 114 116 & - sc_loc_ini(:,:,jk) ) ) 115 117 ENDDO … … 139 141 IF ( kt == nitend ) CLOSE( numhsb ) 140 142 143 IF( nn_timing == 1 ) CALL timing_stop('dia_hsb') 144 141 145 9020 FORMAT(I5,11D15.7) 142 146 ! … … 205 209 WRITE(numout,*) "dia_hsb: heat salt volume budgets activated" 206 210 WRITE(numout,*) "~~~~~~~ output written in the 'heat_salt_volume_budgets.txt' ASCII file" 207 IF( lk_obc . OR. lk_bdy) THEN211 IF( lk_obc .or. lk_bdy ) THEN 208 212 CALL ctl_warn( 'dia_hsb does not take open boundary fluxes into account' ) 209 213 ENDIF … … 248 252 ! 4 - initial conservation variables ! 249 253 ! ---------------------------------- ! 250 ssh_ini(:,:) = sshn(:,:) ! initial ssh254 ssh_ini(:,:) = sshn(:,:) ! initial ssh 251 255 DO jk = 1, jpk 252 e3t_ini (:,:,jk) = fse3t_n(:,:,jk) ! initial vertical scale factors253 hc_loc_ini(:,:,jk) = t n(:,:,jk) * fse3t_n(:,:,jk) ! initial heat content254 sc_loc_ini(:,:,jk) = sn(:,:,jk) * fse3t_n(:,:,jk) ! initial salt content256 e3t_ini (:,:,jk) = fse3t_n(:,:,jk) ! initial vertical scale factors 257 hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * fse3t_n(:,:,jk) ! initial heat content 258 sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * fse3t_n(:,:,jk) ! initial salt content 255 259 END DO 256 260 frc_v = 0.d0 ! volume trend due to forcing -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diahth.F90
r2715 r3294 23 23 USE lib_mpp ! MPP library 24 24 USE iom ! I/O library 25 USE timing ! preformance summary 25 26 26 27 IMPLICIT NONE … … 103 104 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zdelr ! delta rho equivalent to deltaT = 0.2 104 105 !!---------------------------------------------------------------------- 106 IF( nn_timing == 1 ) CALL timing_start('dia_hth') 105 107 106 108 IF( kt == nit000 ) THEN … … 160 162 DO ji = 1, jpi 161 163 IF( tmask(ji,jj,nla10) == 1. ) THEN 162 zu = 1779.50 + 11.250*tn(ji,jj,nla10) - 3.80*sn(ji,jj,nla10) - 0.0745*tn(ji,jj,nla10)*tn(ji,jj,nla10) & 163 & - 0.0100*tn(ji,jj,nla10)*sn(ji,jj,nla10) 164 zv = 5891.00 + 38.000*tn(ji,jj,nla10) + 3.00*sn(ji,jj,nla10) - 0.3750*tn(ji,jj,nla10)*tn(ji,jj,nla10) 165 zut = 11.25 - 0.149*tn(ji,jj,nla10) - 0.01*sn(ji,jj,nla10) 166 zvt = 38.00 - 0.750*tn(ji,jj,nla10) 164 zu = 1779.50 + 11.250 * tsn(ji,jj,nla10,jp_tem) - 3.80 * tsn(ji,jj,nla10,jp_sal) & 165 & - 0.0745 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem) & 166 & - 0.0100 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_sal) 167 zv = 5891.00 + 38.000 * tsn(ji,jj,nla10,jp_tem) + 3.00 * tsn(ji,jj,nla10,jp_sal) & 168 & - 0.3750 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem) 169 zut = 11.25 - 0.149 * tsn(ji,jj,nla10,jp_tem) - 0.01 * tsn(ji,jj,nla10,jp_sal) 170 zvt = 38.00 - 0.750 * tsn(ji,jj,nla10,jp_tem) 167 171 zw = (zu + 0.698*zv) * (zu + 0.698*zv) 168 172 zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) … … 184 188 ! 185 189 zzdep = fsdepw(ji,jj,jk) 186 zztmp = ( t n(ji,jj,jk-1) - tn(ji,jj,jk) ) / zzdep * tmask(ji,jj,jk) ! vertical gradient of temperature (dT/dz)190 zztmp = ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) / zzdep * tmask(ji,jj,jk) ! vertical gradient of temperature (dT/dz) 187 191 zzdep = zzdep * tmask(ji,jj,1) 188 192 … … 221 225 zzdep = fsdepw(ji,jj,jk) * tmask(ji,jj,1) 222 226 ! 223 zztmp = t n(ji,jj,nla10) - tn(ji,jj,jk)! - delta T(10m)227 zztmp = tsn(ji,jj,nla10,jp_tem) - tsn(ji,jj,jk,jp_tem) ! - delta T(10m) 224 228 IF( ABS(zztmp) > ztem2 ) zabs2 (ji,jj) = zzdep ! abs > 0.2 225 229 IF( zztmp > ztem2 ) ztm2 (ji,jj) = zzdep ! > 0.2 … … 254 258 DO jj = 1, jpj 255 259 DO ji = 1, jpi 256 zztmp = t n(ji,jj,jk)260 zztmp = tsn(ji,jj,jk,jp_tem) 257 261 IF( zztmp >= 20. ) ik20(ji,jj) = jk 258 262 IF( zztmp >= 28. ) ik28(ji,jj) = jk … … 273 277 zztmp = fsdept(ji,jj,iid ) & ! linear interpolation 274 278 & + ( fsdept(ji,jj,iid+1) - fsdept(ji,jj,iid) ) & 275 & * ( 20.*tmask(ji,jj,iid+1) - tn(ji,jj,iid) ) &276 & / ( tn(ji,jj,iid+1) - tn(ji,jj,iid) + (1.-tmask(ji,jj,1)) )279 & * ( 20.*tmask(ji,jj,iid+1) - tsn(ji,jj,iid,jp_tem) ) & 280 & / ( tsn(ji,jj,iid+1,jp_tem) - tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 277 281 hd20(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1) ! bound by the ocean depth 278 282 ELSE … … 284 288 zztmp = fsdept(ji,jj,iid ) & ! linear interpolation 285 289 & + ( fsdept(ji,jj,iid+1) - fsdept(ji,jj,iid) ) & 286 & * ( 28.*tmask(ji,jj,iid+1) - tn(ji,jj,iid) ) &287 & / ( tn(ji,jj,iid+1) - tn(ji,jj,iid) + (1.-tmask(ji,jj,1)) )290 & * ( 28.*tmask(ji,jj,iid+1) - tsn(ji,jj,iid,jp_tem) ) & 291 & / ( tsn(ji,jj,iid+1,jp_tem) - tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 288 292 hd28(ji,jj) = MIN( zztmp , zzdep ) * tmask(ji,jj,1) ! bound by the ocean depth 289 293 ELSE … … 309 313 ! surface boundary condition 310 314 IF( lk_vvl ) THEN ; zthick(:,:) = 0._wp ; htc3(:,:) = 0._wp 311 ELSE ; zthick(:,:) = sshn(:,:) ; htc3(:,:) = t n(:,:,jk) * sshn(:,:) * tmask(:,:,jk)315 ELSE ; zthick(:,:) = sshn(:,:) ; htc3(:,:) = tsn(:,:,jk,jp_tem) * sshn(:,:) * tmask(:,:,jk) 312 316 ENDIF 313 317 ! integration down to ilevel 314 318 DO jk = 1, ilevel 315 319 zthick(:,:) = zthick(:,:) + fse3t(:,:,jk) 316 htc3 (:,:) = htc3 (:,:) + fse3t(:,:,jk) * t n(:,:,jk) * tmask(:,:,jk)320 htc3 (:,:) = htc3 (:,:) + fse3t(:,:,jk) * tsn(:,:,jk,jp_tem) * tmask(:,:,jk) 317 321 END DO 318 322 ! deepest layer … … 320 324 DO jj = 1, jpj 321 325 DO ji = 1, jpi 322 htc3(ji,jj) = htc3(ji,jj) + tn(ji,jj,ilevel+1) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) ) * tmask(ji,jj,ilevel+1) 326 htc3(ji,jj) = htc3(ji,jj) + tsn(ji,jj,ilevel+1,jp_tem) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) ) & 327 * tmask(ji,jj,ilevel+1) 328 htc3(ji,jj) = htc3(ji,jj) + tsn(ji,jj,ilevel+1,jp_tem) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) ) & 329 & * tmask(ji,jj,ilevel+1) 323 330 END DO 324 331 END DO … … 327 334 htc3(:,:) = zcoef * htc3(:,:) 328 335 CALL iom_put( "hc300", htc3 ) ! first 300m heat content 336 ! 337 IF( nn_timing == 1 ) CALL timing_stop('dia_hth') 329 338 ! 330 339 END SUBROUTINE dia_hth -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90
r2715 r3294 29 29 USE lib_mpp ! MPP library 30 30 USE lbclnk ! lateral boundary condition - processor exchanges 31 USE timing ! preformance summary 32 USE wrk_nemo ! working arrays 31 33 32 34 IMPLICIT NONE … … 95 97 !!---------------------------------------------------------------------- 96 98 INTEGER :: dia_ptr_alloc ! return value 97 INTEGER, DIMENSION( 5) :: ierr99 INTEGER, DIMENSION(6) :: ierr 98 100 !!---------------------------------------------------------------------- 99 101 ierr(:) = 0 … … 121 123 & ndex_h_ind_30(jpj), ndex_h_ipc_30(jpj), Stat=ierr(5) ) 122 124 ! 125 ALLOCATE( btm30(jpi,jpj) , STAT=ierr(6) ) 126 ! 123 127 dia_ptr_alloc = MAXVAL( ierr ) 124 128 IF(lk_mpp) CALL mpp_sum( dia_ptr_alloc ) … … 209 213 !! ** Action : - p_fval: i-mean poleward flux of pva 210 214 !!---------------------------------------------------------------------- 211 #if defined key_mpp_mpi212 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released213 USE wrk_nemo, ONLY: zwork => wrk_1d_1214 #endif215 215 !! 216 216 IMPLICIT none … … 225 225 INTEGER :: ijpjjpk 226 226 #endif 227 #if defined key_mpp_mpi 228 REAL(wp), POINTER, DIMENSION(:) :: zwork ! mask flux array at V-point 229 #endif 227 230 !!-------------------------------------------------------------------- 228 231 ! 229 232 #if defined key_mpp_mpi 230 IF( wrk_in_use(1, 1) ) THEN 231 CALL ctl_stop('ptr_vjk: ERROR - requested workspace array is unavailable') ; RETURN 232 END IF 233 ijpjjpk = jpj*jpk 234 CALL wrk_alloc( jpj*jpk, zwork ) 233 235 #endif 234 236 … … 257 259 ! 258 260 #if defined key_mpp_mpi 259 ijpjjpk = jpj*jpk260 261 ish(1) = ijpjjpk ; ish2(1) = jpj ; ish2(2) = jpk 261 262 zwork(1:ijpjjpk) = RESHAPE( p_fval, ish ) … … 265 266 ! 266 267 #if defined key_mpp_mpi 267 IF( wrk_not_released(1, 1) ) CALL ctl_stop('ptr_vjk: ERROR - failed to release workspace array')268 CALL wrk_dealloc( jpj*jpk, zwork ) 268 269 #endif 269 270 ! … … 281 282 !! ** Action : - p_fval: i-sum of e1t*e3t*pta 282 283 !!---------------------------------------------------------------------- 283 #if defined key_mpp_mpi284 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released285 USE wrk_nemo, ONLY: zwork => wrk_1d_1286 #endif287 284 !! 288 285 REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) :: pta ! tracer flux array at T-point … … 296 293 INTEGER :: ijpjjpk 297 294 #endif 295 #if defined key_mpp_mpi 296 REAL(wp), POINTER, DIMENSION(:) :: zwork ! mask flux array at V-point 297 #endif 298 298 !!-------------------------------------------------------------------- 299 299 ! 300 300 #if defined key_mpp_mpi 301 IF( wrk_in_use(1, 1) ) THEN 302 CALL ctl_stop('ptr_tjk: requested workspace array unavailable') ; RETURN 303 ENDIF 301 ijpjjpk = jpj*jpk 302 CALL wrk_alloc( jpj*jpk, zwork ) 304 303 #endif 305 304 … … 315 314 END DO 316 315 #if defined key_mpp_mpi 317 ijpjjpk = jpj*jpk318 316 ish(1) = jpj*jpk ; ish2(1) = jpj ; ish2(2) = jpk 319 317 zwork(1:ijpjjpk)= RESHAPE( p_fval, ish ) … … 323 321 ! 324 322 #if defined key_mpp_mpi 325 IF( wrk_not_released(1, 1) ) CALL ctl_stop('ptr_tjk: failed to release workspace array')323 CALL wrk_dealloc( jpj*jpk, zwork ) 326 324 #endif 327 325 ! … … 343 341 !!---------------------------------------------------------------------- 344 342 ! 343 IF( nn_timing == 1 ) CALL timing_start('dia_ptr') 344 ! 345 345 IF( kt == nit000 .OR. MOD( kt, nn_fptr ) == 0 ) THEN 346 346 ! … … 349 349 IF( ln_diaznl ) THEN ! i-mean temperature and salinity 350 350 DO jn = 1, nptr 351 tn_jk(:,:,jn) = ptr_tjk( t n(:,:,:), btmsk(:,:,jn) ) * r1_sjk(:,:,jn)351 tn_jk(:,:,jn) = ptr_tjk( tsn(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 352 352 END DO 353 353 ENDIF … … 368 368 ! 369 369 ! ! Transports 370 ! ! local heat & salt transports at T-points ( t n*mj[vn+v_eiv] )370 ! ! local heat & salt transports at T-points ( tsn*mj[vn+v_eiv] ) 371 371 vt(:,:,jpk) = 0._wp ; vs(:,:,jpk) = 0._wp 372 372 DO jk= 1, jpkm1 … … 378 378 zv = ( vn(ji,jj,jk) + vn(ji,jj-1,jk) ) * 0.5_wp 379 379 #endif 380 vt(:,jj,jk) = zv * t n(:,jj,jk)381 vs(:,jj,jk) = zv * sn(:,jj,jk)380 vt(:,jj,jk) = zv * tsn(:,jj,jk,jp_tem) 381 vs(:,jj,jk) = zv * tsn(:,jj,jk,jp_sal) 382 382 END DO 383 383 END DO … … 430 430 ENDIF 431 431 ! 432 IF( kt == nitend ) CALL histclo( numptr ) ! Close the file 432 #if defined key_mpp_mpi 433 IF( kt == nitend .AND. l_znl_root ) CALL histclo( numptr ) ! Close the file 434 #else 435 IF( kt == nitend ) CALL histclo( numptr ) ! Close the file 436 #endif 437 ! 438 IF( nn_timing == 1 ) CALL timing_stop('dia_ptr') 433 439 ! 434 440 END SUBROUTINE dia_ptr … … 449 455 NAMELIST/namptr/ ln_diaptr, ln_diaznl, ln_subbas, ln_ptrcomp, nn_fptr, nn_fwri 450 456 !!---------------------------------------------------------------------- 451 452 ! ! allocate dia_ptr arrays 453 IF( dia_ptr_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'lim_sbc_init : unable to allocate arrays' ) 457 IF( nn_timing == 1 ) CALL timing_start('dia_ptr_init') 454 458 455 459 REWIND( numnam ) ! Read Namelist namptr : poleward transport parameters … … 468 472 WRITE(numout,*) ' Frequency of outputs nn_fwri = ', nn_fwri 469 473 ENDIF 470 471 IF( ln_subbas ) THEN ; nptr = 5 ! Global, Atlantic, Pacific, Indian, Indo-Pacific472 ELSE ; nptr = 1 ! Global only473 ENDIF474 475 rc_pwatt = rc_pwatt * rau0 * rcp ! conversion from K.s-1 to PetaWatt476 477 IF( .NOT. ln_diaptr ) THEN ! diaptr not used478 RETURN479 ENDIF480 474 481 IF( lk_mpp ) CALL mpp_ini_znl( numout ) ! Define MPI communicator for zonal sum 482 483 IF( ln_subbas ) THEN ! load sub-basin mask 484 CALL iom_open( 'subbasins', inum ) 485 CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) ) ! Atlantic basin 486 CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) ) ! Pacific basin 487 CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) ) ! Indian basin 488 CALL iom_close( inum ) 489 btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) ) ! Indo-Pacific basin 490 WHERE( gphit(:,:) < -30._wp) ; btm30(:,:) = 0._wp ! mask out Southern Ocean 491 ELSE WHERE ; btm30(:,:) = tmask(:,:,1) 492 END WHERE 493 ENDIF 494 btmsk(:,:,1) = tmask_i(:,:) ! global ocean 475 IF( ln_diaptr) THEN 495 476 496 DO jn = 1, nptr 497 btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:) ! interior domain only 498 END DO 477 IF( ln_subbas ) THEN ; nptr = 5 ! Global, Atlantic, Pacific, Indian, Indo-Pacific 478 ELSE ; nptr = 1 ! Global only 479 ENDIF 480 481 ! ! allocate dia_ptr arrays 482 IF( dia_ptr_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'dia_ptr_init : unable to allocate arrays' ) 483 484 rc_pwatt = rc_pwatt * rau0 * rcp ! conversion from K.s-1 to PetaWatt 485 486 IF( lk_mpp ) CALL mpp_ini_znl( numout ) ! Define MPI communicator for zonal sum 487 488 IF( ln_subbas ) THEN ! load sub-basin mask 489 CALL iom_open( 'subbasins', inum ) 490 CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) ) ! Atlantic basin 491 CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) ) ! Pacific basin 492 CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) ) ! Indian basin 493 CALL iom_close( inum ) 494 btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) ) ! Indo-Pacific basin 495 WHERE( gphit(:,:) < -30._wp) ; btm30(:,:) = 0._wp ! mask out Southern Ocean 496 ELSE WHERE ; btm30(:,:) = tmask(:,:,1) 497 END WHERE 498 ENDIF 499 btmsk(:,:,1) = tmask_i(:,:) ! global ocean 499 500 500 IF( lk_vvl ) CALL ctl_stop( 'diaptr: error in vvl case as constant i-mean surface is used' ) 501 502 ! ! i-sum of e1v*e3v surface and its inverse 503 DO jn = 1, nptr 504 sjk(:,:,jn) = ptr_tjk( tmask(:,:,:), btmsk(:,:,jn) ) 505 r1_sjk(:,:,jn) = 0._wp 506 WHERE( sjk(:,:,jn) /= 0._wp ) r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 507 END DO 501 DO jn = 1, nptr 502 btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:) ! interior domain only 503 END DO 504 505 IF( lk_vvl ) CALL ctl_stop( 'diaptr: error in vvl case as constant i-mean surface is used' ) 506 507 ! ! i-sum of e1v*e3v surface and its inverse 508 DO jn = 1, nptr 509 sjk(:,:,jn) = ptr_tjk( tmask(:,:,:), btmsk(:,:,jn) ) 510 r1_sjk(:,:,jn) = 0._wp 511 WHERE( sjk(:,:,jn) /= 0._wp ) r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 512 END DO 513 514 ! Initialise arrays to zero because diatpr is called before they are first calculated 515 ! Note that this means diagnostics will not be exactly correct when model run is restarted. 516 htr_adv(:) = 0._wp ; str_adv(:) = 0._wp ; htr_ldf(:) = 0._wp ; str_ldf(:) = 0._wp 508 517 509 518 #if defined key_mpp_mpi 510 iglo (1) = jpjglo ! MPP case using MPI ('key_mpp_mpi')511 iloc (1) = nlcj512 iabsf(1) = njmppt(narea)513 iabsl(:) = iabsf(:) + iloc(:) - 1514 ihals(1) = nldj - 1515 ihale(1) = nlcj - nlej516 idid (1) = 2517 CALL flio_dom_set( jpnj, nproc/jpni, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom_ptr )519 iglo (1) = jpjglo ! MPP case using MPI ('key_mpp_mpi') 520 iloc (1) = nlcj 521 iabsf(1) = njmppt(narea) 522 iabsl(:) = iabsf(:) + iloc(:) - 1 523 ihals(1) = nldj - 1 524 ihale(1) = nlcj - nlej 525 idid (1) = 2 526 CALL flio_dom_set( jpnj, nproc/jpni, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom_ptr ) 518 527 #else 519 nidom_ptr = FLIO_DOM_NONE 520 #endif 528 nidom_ptr = FLIO_DOM_NONE 529 #endif 530 ENDIF 531 ! 532 IF( nn_timing == 1 ) CALL timing_stop('dia_ptr_init') 521 533 ! 522 534 END SUBROUTINE dia_ptr_init … … 531 543 !! ** Method : NetCDF file 532 544 !!---------------------------------------------------------------------- 533 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released534 USE wrk_nemo, ONLY: zphi => wrk_1d_1, zfoo => wrk_1d_2 ! 1D workspace535 USE wrk_nemo, ONLY: z_1 => wrk_2d_1 ! 2D -536 545 !! 537 546 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 548 557 #endif 549 558 REAL(wp) :: zsto, zout, zdt, zjulian ! temporary scalars 550 !!---------------------------------------------------------------------- 551 552 IF( wrk_in_use(1, 1,2) .OR. wrk_in_use(2, 1) ) THEN 553 CALL ctl_stop('dia_ptr_wri: requested workspace arrays unavailable') ; RETURN 554 ENDIF 559 !! 560 REAL(wp), POINTER, DIMENSION(:) :: zphi, zfoo ! 1D workspace 561 REAL(wp), POINTER, DIMENSION(:,:) :: z_1 ! 2D workspace 562 !!-------------------------------------------------------------------- 563 ! 564 CALL wrk_alloc( jpi , zphi , zfoo ) 565 CALL wrk_alloc( jpi , jpk, z_1 ) 555 566 556 567 ! define time axis … … 866 877 ENDIF 867 878 ! 868 IF( wrk_not_released(1, 1,2) .OR. &869 wrk_not_released(2, 1) ) CALL ctl_stop('dia_ptr_wri: failed to release workspace arrays')879 CALL wrk_dealloc( jpi , zphi , zfoo ) 880 CALL wrk_dealloc( jpi , jpk, z_1 ) 870 881 ! 871 882 END SUBROUTINE dia_ptr_wri -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90
r2715 r3294 28 28 USE ldftra_oce ! ocean active tracers: lateral physics 29 29 USE ldfdyn_oce ! ocean dynamics: lateral physics 30 USE traldf_iso_grif, ONLY : psix_eiv, psiy_eiv 30 31 USE sol_oce ! solver variables 31 32 USE sbc_oce ! Surface boundary condition: ocean fields … … 46 47 USE limwri_2 47 48 #endif 48 USE dtatem49 USE dtasal50 49 USE lib_mpp ! MPP library 50 USE timing ! preformance summary 51 USE wrk_nemo ! working array 51 52 52 53 IMPLICIT NONE … … 116 117 !! ** Method : use iom_put 117 118 !!---------------------------------------------------------------------- 118 USE oce, ONLY : z3d => ta ! use ta as 3D workspace119 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released120 USE wrk_nemo, ONLY: z2d => wrk_2d_1121 119 !! 122 120 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 124 122 INTEGER :: ji, jj, jk ! dummy loop indices 125 123 REAL(wp) :: zztmp, zztmpx, zztmpy ! 124 !! 125 REAL(wp), POINTER, DIMENSION(:,:) :: z2d ! 2D workspace 126 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d ! 3D workspace 126 127 !!---------------------------------------------------------------------- 127 128 ! 128 IF( wrk_in_use(2, 1))THEN129 CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.')130 RETURN131 END IF129 IF( nn_timing == 1 ) CALL timing_start('dia_wri') 130 ! 131 CALL wrk_alloc( jpi , jpj , z2d ) 132 CALL wrk_alloc( jpi , jpj, jpk , z3d ) 132 133 ! 133 134 ! Output the initial state and forcings … … 137 138 ENDIF 138 139 139 CALL iom_put( "toce" , t n) ! temperature140 CALL iom_put( "soce" , sn) ! salinity141 CALL iom_put( "sst" , t n(:,:,1)) ! sea surface temperature142 CALL iom_put( "sst2" , t n(:,:,1) * tn(:,:,1) ) ! square of sea surface temperature143 CALL iom_put( "sss" , sn(:,:,1)) ! sea surface salinity144 CALL iom_put( "sss2" , sn(:,:,1) * sn(:,:,1) ) ! square of sea surface salinity145 CALL iom_put( "uoce" , un ) ! i-current146 CALL iom_put( "voce" , vn ) ! j-current140 CALL iom_put( "toce" , tsn(:,:,:,jp_tem) ) ! temperature 141 CALL iom_put( "soce" , tsn(:,:,:,jp_sal) ) ! salinity 142 CALL iom_put( "sst" , tsn(:,:,1,jp_tem) ) ! sea surface temperature 143 CALL iom_put( "sst2" , tsn(:,:,1,jp_tem) * tsn(:,:,1,jp_tem) ) ! square of sea surface temperature 144 CALL iom_put( "sss" , tsn(:,:,1,jp_sal) ) ! sea surface salinity 145 CALL iom_put( "sss2" , tsn(:,:,1,jp_sal) * tsn(:,:,1,jp_sal) ) ! square of sea surface salinity 146 CALL iom_put( "uoce" , un ) ! i-current 147 CALL iom_put( "voce" , vn ) ! j-current 147 148 148 CALL iom_put( "avt" , avt ) ! T vert. eddy diff. coef.149 CALL iom_put( "avm" , avmu ) ! T vert. eddy visc. coef.149 CALL iom_put( "avt" , avt ) ! T vert. eddy diff. coef. 150 CALL iom_put( "avm" , avmu ) ! T vert. eddy visc. coef. 150 151 IF( lk_zdfddm ) THEN 151 CALL iom_put( "avs" , fsavs(:,:,:) ) ! S vert. eddy diff. coef.152 CALL iom_put( "avs" , fsavs(:,:,:) ) ! S vert. eddy diff. coef. 152 153 ENDIF 153 154 154 155 DO jj = 2, jpjm1 ! sst gradient 155 156 DO ji = fs_2, fs_jpim1 ! vector opt. 156 zztmp = t n(ji,jj,1)157 zztmpx = ( t n(ji+1,jj ,1) - zztmp ) / e1u(ji,jj) + ( zztmp - tn(ji-1,jj ,1) ) / e1u(ji-1,jj )158 zztmpy = ( t n(ji ,jj+1,1) - zztmp ) / e2v(ji,jj) + ( zztmp - tn(ji ,jj-1,1) ) / e2v(ji ,jj-1)157 zztmp = tsn(ji,jj,1,jp_tem) 158 zztmpx = ( tsn(ji+1,jj ,1,jp_tem) - zztmp ) / e1u(ji,jj) + ( zztmp - tsn(ji-1,jj ,1,jp_tem) ) / e1u(ji-1,jj ) 159 zztmpy = ( tsn(ji ,jj+1,1,jp_tem) - zztmp ) / e2v(ji,jj) + ( zztmp - tsn(ji ,jj-1,1,jp_tem) ) / e2v(ji ,jj-1) 159 160 z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy ) & 160 161 & * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1) … … 178 179 DO jj = 2, jpjm1 179 180 DO ji = fs_2, fs_jpim1 ! vector opt. 180 z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( t n(ji,jj,jk) + tn(ji+1,jj,jk) )181 z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 181 182 END DO 182 183 END DO … … 192 193 DO jj = 2, jpjm1 193 194 DO ji = fs_2, fs_jpim1 ! vector opt. 194 z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( t n(ji,jj,jk) + tn(ji,jj+1,jk) )195 z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tsn(ji,jj,jk,jp_tem) + tsn(ji,jj+1,jk,jp_tem) ) 195 196 END DO 196 197 END DO … … 200 201 ENDIF 201 202 ! 202 IF( wrk_not_released(2, 1))THEN203 CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.')204 RETURN205 END IF203 CALL wrk_dealloc( jpi , jpj , z2d ) 204 CALL wrk_dealloc( jpi , jpj, jpk , z3d ) 205 ! 206 IF( nn_timing == 1 ) CALL timing_stop('dia_wri') 206 207 ! 207 208 END SUBROUTINE dia_wri … … 224 225 !! Each nwrite time step, output the instantaneous or mean fields 225 226 !!---------------------------------------------------------------------- 226 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released227 USE wrk_nemo, ONLY: zw2d => wrk_2d_1228 227 !! 229 228 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 232 231 CHARACTER (len=40) :: clhstnam, clop, clmx ! local names 233 232 INTEGER :: inum = 11 ! temporary logical unit 233 INTEGER :: ji, jj, jk ! dummy loop indices 234 INTEGER :: ierr ! error code return from allocation 234 235 INTEGER :: iimi, iima, ipk, it, itmod, ijmi, ijma ! local integers 235 236 REAL(wp) :: zsto, zout, zmax, zjulian, zdt ! local scalars 237 !! 238 REAL(wp), POINTER, DIMENSION(:,:) :: zw2d ! 2D workspace 239 REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d ! 3D workspace 236 240 !!---------------------------------------------------------------------- 237 ! 238 IF( wrk_in_use(2, 1))THEN239 CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.')240 RETURN241 END IF241 ! 242 IF( nn_timing == 1 ) CALL timing_start('dia_wri') 243 ! 244 CALL wrk_alloc( jpi , jpj , zw2d ) 245 IF ( ln_traldf_gdia ) call wrk_alloc( jpi , jpj , jpk , zw3d ) 242 246 ! 243 247 ! Output the initial state and forcings … … 446 450 CALL histdef( nid_U, "vozocrtx", "Zonal Current" , "m/s" , & ! un 447 451 & jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 452 IF( ln_traldf_gdia ) THEN 453 CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current" , "m/s" , & ! u_eiv 454 & jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 455 ELSE 448 456 #if defined key_diaeiv 449 CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current" , "m/s" , & ! u_eiv457 CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current" , "m/s" , & ! u_eiv 450 458 & jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 451 459 #endif 460 END IF 452 461 ! !!! nid_U : 2D 453 462 CALL histdef( nid_U, "sozotaux", "Wind Stress along i-axis" , "N/m2" , & ! utau … … 459 468 CALL histdef( nid_V, "vomecrty", "Meridional Current" , "m/s" , & ! vn 460 469 & jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 470 IF( ln_traldf_gdia ) THEN 471 CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current" , "m/s" , & ! v_eiv 472 & jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 473 ELSE 461 474 #if defined key_diaeiv 462 CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current" , "m/s" , & ! v_eiv475 CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current" , "m/s" , & ! v_eiv 463 476 & jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 464 477 #endif 478 END IF 465 479 ! !!! nid_V : 2D 466 480 CALL histdef( nid_V, "sometauy", "Wind Stress along j-axis" , "N/m2" , & ! vtau … … 472 486 CALL histdef( nid_W, "vovecrtz", "Vertical Velocity" , "m/s" , & ! wn 473 487 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 488 IF( ln_traldf_gdia ) THEN 489 CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity" , "m/s" , & ! w_eiv 490 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 491 ELSE 474 492 #if defined key_diaeiv 475 CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity" , "m/s" , & ! w_eiv 476 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 477 #endif 493 CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity" , "m/s" , & ! w_eiv 494 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 495 #endif 496 END IF 478 497 CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity" , "m2/s" , & ! avt 479 498 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) … … 516 535 517 536 ! Write fields on T grid 518 CALL histwrite( nid_T, "votemper", it, t n, ndim_T , ndex_T ) ! temperature519 CALL histwrite( nid_T, "vosaline", it, sn, ndim_T , ndex_T ) ! salinity520 CALL histwrite( nid_T, "sosstsst", it, t n(:,:,1), ndim_hT, ndex_hT ) ! sea surface temperature521 CALL histwrite( nid_T, "sosaline", it, sn(:,:,1), ndim_hT, ndex_hT ) ! sea surface salinity537 CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem), ndim_T , ndex_T ) ! temperature 538 CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal), ndim_T , ndex_T ) ! salinity 539 CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem), ndim_hT, ndex_hT ) ! sea surface temperature 540 CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal), ndim_hT, ndex_hT ) ! sea surface salinity 522 541 CALL histwrite( nid_T, "sossheig", it, sshn , ndim_hT, ndex_hT ) ! sea surface height 523 542 !!$#if defined key_lim3 || defined key_lim2 … … 528 547 !!$ CALL histwrite( nid_T, "sorunoff", it, runoff , ndim_hT, ndex_hT ) ! runoff 529 548 CALL histwrite( nid_T, "sowaflcd", it, ( emps-rnf ) , ndim_hT, ndex_hT ) ! c/d water flux 530 zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * sn(:,:,1) * tmask(:,:,1)549 zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 531 550 CALL histwrite( nid_T, "sosalflx", it, zw2d , ndim_hT, ndex_hT ) ! c/d salt flux 532 551 CALL histwrite( nid_T, "sohefldo", it, qns + qsr , ndim_hT, ndex_hT ) ! total heat flux … … 539 558 CALL histwrite( nid_T, "sohefldp", it, qrp , ndim_hT, ndex_hT ) ! heat flux damping 540 559 CALL histwrite( nid_T, "sowafldp", it, erp , ndim_hT, ndex_hT ) ! freshwater flux damping 541 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1)560 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 542 561 CALL histwrite( nid_T, "sosafldp", it, zw2d , ndim_hT, ndex_hT ) ! salt flux damping 543 562 #endif … … 545 564 CALL histwrite( nid_T, "sohefldp", it, qrp , ndim_hT, ndex_hT ) ! heat flux damping 546 565 CALL histwrite( nid_T, "sowafldp", it, erp , ndim_hT, ndex_hT ) ! freshwater flux damping 547 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1)566 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 548 567 CALL histwrite( nid_T, "sosafldp", it, zw2d , ndim_hT, ndex_hT ) ! salt flux damping 549 568 #endif … … 570 589 ! Write fields on U grid 571 590 CALL histwrite( nid_U, "vozocrtx", it, un , ndim_U , ndex_U ) ! i-current 591 IF( ln_traldf_gdia ) THEN 592 IF (.not. ALLOCATED(psix_eiv))THEN 593 ALLOCATE( psix_eiv(jpi,jpj,jpk) , psiy_eiv(jpi,jpj,jpk) , STAT=ierr ) 594 IF( lk_mpp ) CALL mpp_sum ( ierr ) 595 IF( ierr > 0 ) CALL ctl_stop('STOP', 'diawri: unable to allocate psi{x,y}_eiv') 596 psix_eiv(:,:,:) = 0.0_wp 597 psiy_eiv(:,:,:) = 0.0_wp 598 ENDIF 599 DO jk=1,jpkm1 600 zw3d(:,:,jk) = (psix_eiv(:,:,jk+1) - psix_eiv(:,:,jk))/fse3u(:,:,jk) ! u_eiv = -dpsix/dz 601 END DO 602 zw3d(:,:,jpk) = 0._wp 603 CALL histwrite( nid_U, "vozoeivu", it, zw3d, ndim_U , ndex_U ) ! i-eiv current 604 ELSE 572 605 #if defined key_diaeiv 573 CALL histwrite( nid_U, "vozoeivu", it, u_eiv , ndim_U , ndex_U ) ! i-eiv current 574 #endif 606 CALL histwrite( nid_U, "vozoeivu", it, u_eiv, ndim_U , ndex_U ) ! i-eiv current 607 #endif 608 ENDIF 575 609 CALL histwrite( nid_U, "sozotaux", it, utau , ndim_hU, ndex_hU ) ! i-wind stress 576 610 577 611 ! Write fields on V grid 578 612 CALL histwrite( nid_V, "vomecrty", it, vn , ndim_V , ndex_V ) ! j-current 613 IF( ln_traldf_gdia ) THEN 614 DO jk=1,jpk-1 615 zw3d(:,:,jk) = (psiy_eiv(:,:,jk+1) - psiy_eiv(:,:,jk))/fse3v(:,:,jk) ! v_eiv = -dpsiy/dz 616 END DO 617 zw3d(:,:,jpk) = 0._wp 618 CALL histwrite( nid_V, "vomeeivv", it, zw3d, ndim_V , ndex_V ) ! j-eiv current 619 ELSE 579 620 #if defined key_diaeiv 580 CALL histwrite( nid_V, "vomeeivv", it, v_eiv , ndim_V , ndex_V ) ! j-eiv current 581 #endif 621 CALL histwrite( nid_V, "vomeeivv", it, v_eiv, ndim_V , ndex_V ) ! j-eiv current 622 #endif 623 ENDIF 582 624 CALL histwrite( nid_V, "sometauy", it, vtau , ndim_hV, ndex_hV ) ! j-wind stress 583 625 584 626 ! Write fields on W grid 585 627 CALL histwrite( nid_W, "vovecrtz", it, wn , ndim_T, ndex_T ) ! vert. current 628 IF( ln_traldf_gdia ) THEN 629 DO jk=1,jpk-1 630 DO jj = 2, jpjm1 631 DO ji = fs_2, fs_jpim1 ! vector opt. 632 zw3d(ji,jj,jk) = (psiy_eiv(ji,jj,jk) - psiy_eiv(ji,jj-1,jk))/e2v(ji,jj) + & 633 & (psix_eiv(ji,jj,jk) - psix_eiv(ji-1,jj,jk))/e1u(ji,jj) ! w_eiv = dpsiy/dy + dpsiy/dx 634 END DO 635 END DO 636 END DO 637 zw3d(:,:,jpk) = 0._wp 638 CALL histwrite( nid_W, "voveeivw", it, zw3d , ndim_T, ndex_T ) ! vert. eiv current 639 ELSE 586 640 # if defined key_diaeiv 587 CALL histwrite( nid_W, "voveeivw", it, w_eiv , ndim_T, ndex_T ) ! vert. eiv current641 CALL histwrite( nid_W, "voveeivw", it, w_eiv , ndim_T, ndex_T ) ! vert. eiv current 588 642 # endif 643 ENDIF 589 644 CALL histwrite( nid_W, "votkeavt", it, avt , ndim_T, ndex_T ) ! T vert. eddy diff. coef. 590 645 CALL histwrite( nid_W, "votkeavm", it, avmu , ndim_T, ndex_T ) ! T vert. eddy visc. coef. … … 608 663 ENDIF 609 664 ! 610 IF( wrk_not_released(2, 1))THEN611 CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.')612 RETURN613 END IF665 CALL wrk_dealloc( jpi , jpj , zw2d ) 666 IF ( ln_traldf_gdia ) call wrk_dealloc( jpi , jpj , jpk , zw3d ) 667 ! 668 IF( nn_timing == 1 ) CALL timing_stop('dia_wri') 614 669 ! 615 670 END SUBROUTINE dia_wri … … 640 695 REAL(wp) :: zsto, zout, zmax, zjulian, zdt 641 696 !!---------------------------------------------------------------------- 697 ! 698 IF( nn_timing == 1 ) CALL timing_start('dia_wri_state') 642 699 643 700 ! 0. Initialisation … … 711 768 712 769 ! Write all fields on T grid 713 CALL histwrite( id_i, "votemper", kt, t n, jpi*jpj*jpk, idex ) ! now temperature714 CALL histwrite( id_i, "vosaline", kt, sn, jpi*jpj*jpk, idex ) ! now salinity715 CALL histwrite( id_i, "sossheig", kt, sshn , jpi*jpj , idex ) ! sea surface height716 CALL histwrite( id_i, "vozocrtx", kt, un , jpi*jpj*jpk, idex ) ! now i-velocity717 CALL histwrite( id_i, "vomecrty", kt, vn , jpi*jpj*jpk, idex ) ! now j-velocity718 CALL histwrite( id_i, "vovecrtz", kt, wn , jpi*jpj*jpk, idex ) ! now k-velocity719 CALL histwrite( id_i, "sowaflup", kt, (emp-rnf ), jpi*jpj , idex ) ! freshwater budget720 CALL histwrite( id_i, "sohefldo", kt, qsr + qns , jpi*jpj , idex ) ! total heat flux721 CALL histwrite( id_i, "soshfldo", kt, qsr , jpi*jpj , idex ) ! solar heat flux722 CALL histwrite( id_i, "soicecov", kt, fr_i , jpi*jpj , idex ) ! ice fraction723 CALL histwrite( id_i, "sozotaux", kt, utau , jpi*jpj , idex ) ! i-wind stress724 CALL histwrite( id_i, "sometauy", kt, vtau , jpi*jpj , idex ) ! j-wind stress770 CALL histwrite( id_i, "votemper", kt, tsn(:,:,:,jp_tem), jpi*jpj*jpk, idex ) ! now temperature 771 CALL histwrite( id_i, "vosaline", kt, tsn(:,:,:,jp_sal), jpi*jpj*jpk, idex ) ! now salinity 772 CALL histwrite( id_i, "sossheig", kt, sshn , jpi*jpj , idex ) ! sea surface height 773 CALL histwrite( id_i, "vozocrtx", kt, un , jpi*jpj*jpk, idex ) ! now i-velocity 774 CALL histwrite( id_i, "vomecrty", kt, vn , jpi*jpj*jpk, idex ) ! now j-velocity 775 CALL histwrite( id_i, "vovecrtz", kt, wn , jpi*jpj*jpk, idex ) ! now k-velocity 776 CALL histwrite( id_i, "sowaflup", kt, (emp-rnf ) , jpi*jpj , idex ) ! freshwater budget 777 CALL histwrite( id_i, "sohefldo", kt, qsr + qns , jpi*jpj , idex ) ! total heat flux 778 CALL histwrite( id_i, "soshfldo", kt, qsr , jpi*jpj , idex ) ! solar heat flux 779 CALL histwrite( id_i, "soicecov", kt, fr_i , jpi*jpj , idex ) ! ice fraction 780 CALL histwrite( id_i, "sozotaux", kt, utau , jpi*jpj , idex ) ! i-wind stress 781 CALL histwrite( id_i, "sometauy", kt, vtau , jpi*jpj , idex ) ! j-wind stress 725 782 726 783 ! 3. Close the file … … 735 792 ENDIF 736 793 #endif 794 795 IF( nn_timing == 1 ) CALL timing_stop('dia_wri_state') 796 ! 737 797 738 798 END SUBROUTINE dia_wri_state -
trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90
r2715 r3294 82 82 INTEGER :: inbsel, jk 83 83 INTEGER :: iyear,imon,iday 84 INTEGER :: ialloc 84 85 REAL(wp) :: zdtj 85 86 CHARACTER(LEN=80) :: clname … … 88 89 CHARACTER(LEN= 4) :: clver 89 90 !!---------------------------------------------------------------------- 91 IF( nn_timing == 1 ) CALL timing_start('dia_wri') 90 92 ! 91 93 ! Initialization 92 94 ! --------------- 93 95 ! 94 IF( .not.ALLOCATED(um))THEN96 IF( .NOT. ALLOCATED(um) )THEN 95 97 ALLOCATE(um(jpi,jpj,jpk), vm(jpi,jpj,jpk), & 96 98 wm(jpi,jpj,jpk), & … … 98 100 tm(jpi,jpj,jpk), sm(jpi,jpj,jpk), & 99 101 fsel(jpi,jpj,jpk), & 100 S tat=jk)101 IF(jk /= 0)THEN102 WRITE(*,*) 'ERROR: allocate failed in dia_wri (diawri_dimg.h90)'103 CALL mppabort()104 ENDIF105 END IF 102 STAT=ialloc ) 103 ! 104 IF( lk_mpp ) CALL mpp_sum ( ialloc ) 105 IF( ialloc /= 0 ) CALL ctl_warn('dia_wri( diawri_dimg.h90) : failed to allocate arrays') 106 ENDIF 107 106 108 107 109 inbsel = 17 … … 152 154 wm(:,:,:)=wm(:,:,:) + wn (:,:,:) 153 155 avtm(:,:,:)=avtm(:,:,:) + avt (:,:,:) 154 tm(:,:,:)=tm(:,:,:) + t n (:,:,:)155 sm(:,:,:)=sm(:,:,:) + sn (:,:,:)156 tm(:,:,:)=tm(:,:,:) + tsn(:,:,:,jp_tem) 157 sm(:,:,:)=sm(:,:,:) + tsn(:,:,:,jp_sal) 156 158 ! 157 159 fsel(:,:,1 ) = fsel(:,:,1 ) + utau(:,:) * umask(:,:,1) … … 159 161 fsel(:,:,3 ) = fsel(:,:,3 ) + qsr (:,:) + qns (:,:) 160 162 fsel(:,:,4 ) = fsel(:,:,4 ) + ( emp(:,:)-rnf(:,:) ) 161 ! fsel(:,:,5 ) = fsel(:,:,5 ) + t b (:,:,1) !RB not used163 ! fsel(:,:,5 ) = fsel(:,:,5 ) + tsb(:,:,1,jp_tem) !RB not used 162 164 fsel(:,:,6 ) = fsel(:,:,6 ) + sshn(:,:) 163 165 fsel(:,:,7 ) = fsel(:,:,7 ) + qsr(:,:) … … 226 228 fsel(:,:,3 ) = (qsr (:,:) + qns (:,:)) * tmask(:,:,1) 227 229 fsel(:,:,4 ) = ( emp(:,:)-rnf(:,:) ) * tmask(:,:,1) 228 ! fsel(:,:,5 ) = (t b (:,:,1) - sf_sst(1)%fnow(:,:) ) *tmask(:,:,1) !RB not used230 ! fsel(:,:,5 ) = (tsb(:,:,1,jp_tem) - sf_sst(1)%fnow(:,:) ) *tmask(:,:,1) !RB not used 229 231 230 232 fsel(:,:,6 ) = sshn(:,:) … … 302 304 303 305 IF( ll_dia_inst) THEN 304 CALL dia_wri_dimg(clname, cltext, t n, jpk, 'T')305 ELSE 306 CALL dia_wri_dimg(clname, cltext, tm , jpk, 'T')306 CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_tem), jpk, 'T') 307 ELSE 308 CALL dia_wri_dimg(clname, cltext, tm , jpk, 'T') 307 309 ENDIF 308 310 ! … … 314 316 315 317 IF( ll_dia_inst) THEN 316 CALL dia_wri_dimg(clname, cltext, sn, jpk, 'T')317 ELSE 318 CALL dia_wri_dimg(clname, cltext, sm , jpk, 'T')318 CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_sal), jpk, 'T') 319 ELSE 320 CALL dia_wri_dimg(clname, cltext, sm , jpk, 'T') 319 321 ENDIF 320 322 ! … … 357 359 ENDIF 358 360 ! 361 IF( nn_timing == 1 ) CALL timing_stop('dia_wri') 362 ! 359 363 9000 FORMAT(a,"_",a,"_y",i4.4,"m",i2.2,"d",i2.2,".dimgproc") 360 364 !
Note: See TracChangeset
for help on using the changeset viewer.