diff --git a/src/2d/m2d.F90 b/src/2d/m2d.F90 index 0a2c1d4f9eeb5c286c0874dba25d4d6063c319f4..53a8ea7ddac3ca32b3d8bc6ec11618ecf197fea6 100644 --- a/src/2d/m2d.F90 +++ b/src/2d/m2d.F90 @@ -161,7 +161,6 @@ integer :: i,j integer :: elev_method=1 REALTYPE :: elev_const=_ZERO_ - integer,parameter :: rk = kind(_ONE_) character(LEN = PATH_MAX) :: elev_file='elev.nc' namelist /m2d/ & elev_method,elev_const,elev_file, & @@ -396,8 +395,8 @@ ! This is only needed for proper flexible output where (az .eq. 0) - z = -9999.0d0 - zo = -9999.0d0 + z = -9999._rk + zo = -9999._rk end where call depth_update(zo,z,D,Dvel,DU,DV) diff --git a/src/2d/variables_2d.F90 b/src/2d/variables_2d.F90 index a204e4f5ecdb566acf96bac976f073641f14d0d9..f463a32623b71082cab22c096457b44d9c7e6eb1 100644 --- a/src/2d/variables_2d.F90 +++ b/src/2d/variables_2d.F90 @@ -22,6 +22,7 @@ IMPLICIT NONE ! ! !PUBLIC DATA MEMBERS: + integer, parameter :: rk = kind(_ONE_) REALTYPE :: dtm REALTYPE,dimension(:,:),pointer :: zo,z logical :: do_numerical_analyses_2d=.false. @@ -100,7 +101,6 @@ ! ! !LOCAL VARIABLES: integer :: rc - integer,parameter :: rk = kind(_ONE_) !EOP !------------------------------------------------------------------------- !BOC @@ -125,7 +125,7 @@ break_stat = 0 #endif - z = -9999*_ONE_; zo =_ZERO_ + z = -9999._rk ; zo =_ZERO_ U = _ZERO_; DU = _ZERO_; Uint = _ZERO_; UEx = _ZERO_ V = _ZERO_; DV = _ZERO_; Vint = _ZERO_; VEx = _ZERO_ @@ -229,7 +229,6 @@ ! ! !LOCAL VARIABLES: logical :: used - integer,parameter :: rk = kind(_ONE_) !EOP !----------------------------------------------------------------------- !BOC diff --git a/src/3d/m3d.F90 b/src/3d/m3d.F90 index c78ce8219d21c414143b80070174f2657081381f..32a5092c77fa1d90beec73edc1fa7ad68ca45bde 100644 --- a/src/3d/m3d.F90 +++ b/src/3d/m3d.F90 @@ -395,8 +395,8 @@ num(i,j,:) = 1.e-15 nuh(i,j,:) = 1.e-15 #ifndef NO_BAROCLINIC - S(i,j,:) = -9999.0 - T(i,j,:) = -9999.0 + S(i,j,:) = -9999._rk + T(i,j,:) = -9999._rk #endif end if end do diff --git a/src/3d/salinity.F90 b/src/3d/salinity.F90 index 302e85cf481e1876265c379c015ad23b497daa6f..5863808bb10b12ab982f5f70c557b94f17909f98 100644 --- a/src/3d/salinity.F90 +++ b/src/3d/salinity.F90 @@ -20,7 +20,7 @@ use domain, only: H,az !KB use get_field, only: get_3d_field use variables_2d, only: fwf_int - use variables_3d, only: S,hn,kmin + use variables_3d, only: rk,S,hn,kmin use halo_zones, only: update_3d_halo,wait_halo,D_TAG,H_TAG IMPLICIT NONE ! @@ -201,8 +201,8 @@ stop 'init_salinity' end select - S(:,:,0) = -9999*_ONE_ - forall(i=imin:imax,j=jmin:jmax, az(i,j).eq.0) S(i,j,:) = -9999*_ONE_ + S(:,:,0) = -9999._rk + forall(i=imin:imax,j=jmin:jmax, az(i,j).eq.0) S(i,j,:) = -9999._rk call update_3d_halo(S,S,az,imin,jmin,imax,jmax,kmax,D_TAG) call wait_halo(D_TAG) diff --git a/src/3d/temperature.F90 b/src/3d/temperature.F90 index 0fd204d47b9a9053f5b106bb45e2a57e37fdbbd5..768347c87193d8c4590203c8ba6172a41376934d 100644 --- a/src/3d/temperature.F90 +++ b/src/3d/temperature.F90 @@ -21,7 +21,7 @@ use domain, only: ill,ihl,jll,jhl use domain, only: ilg,ihg,jlg,jhg !KB use get_field, only: get_3d_field - use variables_3d, only: T,rad,hn,kmin,A,g1,g2 + use variables_3d, only: rk,T,rad,hn,kmin,A,g1,g2 use halo_zones, only: update_3d_halo,wait_halo,D_TAG,H_TAG IMPLICIT NONE ! @@ -279,8 +279,8 @@ end interface stop 'init_temperature' end select - T(:,:,0) = -9999*_ONE_ - forall(i=imin:imax,j=jmin:jmax, az(i,j).eq.0) T(i,j,:) = -9999*_ONE_ + T(:,:,0) = -9999._rk + forall(i=imin:imax,j=jmin:jmax, az(i,j).eq.0) T(i,j,:) = -9999._rk call update_3d_halo(T,T,az,imin,jmin,imax,jmax,kmax,D_TAG) call wait_halo(D_TAG) diff --git a/src/3d/variables_3d.F90 b/src/3d/variables_3d.F90 index 5e620f6321b412afc45acce7ab505954150ee02a..31a80df23d6f0183c927ba93b31657c5d2f181af 100644 --- a/src/3d/variables_3d.F90 +++ b/src/3d/variables_3d.F90 @@ -115,6 +115,7 @@ IMPLICIT NONE ! ! !PUBLIC DATA MEMBERS: + integer, parameter :: rk = kind(_ONE_) REALTYPE :: dt,cnpar=0.9 REALTYPE :: avmback=_ZERO_,avhback=_ZERO_ logical :: do_numerical_analyses_3d=.false. @@ -175,7 +176,6 @@ ! ! !LOCAL VARIABLES: integer :: rc - integer,parameter :: rk = kind(_ONE_) !EOP !------------------------------------------------------------------------- !BOC @@ -235,8 +235,8 @@ #endif ! must be nonzero for gotm_fabm in case of calc_temp=F - g1 = -9999*_ONE_ - g2 = -9999*_ONE_ + g1 = -9999._rk + g2 = -9999._rk #ifdef DEBUG write(debug,*) 'Leaving init_variables_3d()' @@ -366,7 +366,7 @@ ! Original author(s): Karsten Bolding & Jorn Bruggeman ! ! !LOCAL VARIABLES: - integer,parameter :: rk = kind(_ONE_) +! !EOP !----------------------------------------------------------------------- !BOC diff --git a/src/3d/vertical_coordinates.F90 b/src/3d/vertical_coordinates.F90 index 2905e9102ed65db2d82dd5397259ced3018e0a82..28ca6990527344913c15041159378d1f1e127075 100644 --- a/src/3d/vertical_coordinates.F90 +++ b/src/3d/vertical_coordinates.F90 @@ -171,9 +171,9 @@ stop ! calculate the z-coordinate of the cell centers ! references to mean sea level zc(:,:,0)=-H(:,:) - zc(:,:,1)=-H(:,:) + 0.5*hn(:,:,1) + zc(:,:,1)=-H(:,:) + _HALF_*hn(:,:,1) do k=2,kmax - zc(:,:,k)=zc(:,:,k-1)+0.5*(hn(:,:,k-1)+hn(:,:,k)) + zc(:,:,k)=zc(:,:,k-1)+_HALF_*(hn(:,:,k-1)+hn(:,:,k)) end do #ifdef SLICE_MODEL diff --git a/src/getm/initialise.F90 b/src/getm/initialise.F90 index d833dd6bff3f7e7c7f3019dd9bef3594eab099ae..2f89d97bd2488dd416c3af6b0989d57428ef145e 100644 --- a/src/getm/initialise.F90 +++ b/src/getm/initialise.F90 @@ -366,6 +366,8 @@ #endif end if + call finalize_register_all_variables(runtype) + if (.not. dryrun) then if (save_initial) then call output_manager_prepare_save(julianday, int(secondsofday), 0, int(MinN-1)) diff --git a/src/getm/register_all_variables.F90 b/src/getm/register_all_variables.F90 index ba30b9922c8b802e93f5741aade512a16fbe38e0..cdb91da2ee0c387ae0f0a5285849af80e363a372 100644 --- a/src/getm/register_all_variables.F90 +++ b/src/getm/register_all_variables.F90 @@ -11,6 +11,12 @@ ! ! !USES: use field_manager + use variables_2d, only: register_2d_variables + use variables_3d, only: register_3d_variables +#ifdef _FABM_ + use getm_fabm, only: register_fabm_variables +#endif + use output_processing, only: register_processed_variables, finalize_register_processed_variables IMPLICIT NONE ! ! default: all is private. @@ -225,6 +231,7 @@ #ifdef _FABM_ call finalize_register_fabm_variables(fm) #endif + call finalize_register_processed_variables(fm) return end subroutine finalize_register_all_variables diff --git a/src/output/output_processing.F90 b/src/output/output_processing.F90 index 76fdb744080c317aeff70089f5d84f8bf6d53cad..1029d7f445375e19843b380374f9cc5944eed232 100644 --- a/src/output/output_processing.F90 +++ b/src/output/output_processing.F90 @@ -18,18 +18,22 @@ private ! ! !PUBLIC DATA FUNCTIONS: - public init_output_processing, register_processed_variables, do_output_processing + public init_output_processing, do_output_processing + public register_processed_variables, finalize_register_processed_variables ! ! !PUBLIC DATA MEMBERS: +! +! !PRIVATE DATA MEMBERS: REALTYPE, dimension(:,:), allocatable, target :: u2d, v2d - REALTYPE, dimension(:,:), allocatable, target :: u2d_destag, v2d_destag REALTYPE, dimension(:,:,:), allocatable, target :: u3d, v3d + REALTYPE, dimension(:,:), allocatable, target :: u2d_destag, v2d_destag REALTYPE, dimension(:,:,:), allocatable, target :: u3d_destag, v3d_destag -! -! !PRIVATE DATA MEMBERS: - logical, target:: u2d_use, v2d_use + + logical :: u2d_used, v2d_used + logical :: u3d_used, v3d_used + logical, target :: u2d_now, v2d_now + logical, target :: u3d_now, v3d_now logical, target:: u2d_destag_use, v2d_destag_use - logical, target:: u3d_use, v3d_use logical, target:: u3d_destag_use, v3d_destag_use integer, parameter :: rk = kind(_ONE_) ! @@ -65,12 +69,7 @@ !EOP !------------------------------------------------------------------------- !BOC - allocate(u2d(E2DFIELD),stat=rc) - if (rc /= 0) stop 'init_output_processing: Error allocating memory (u2d)' - u2d = 0._rk - allocate(v2d(E2DFIELD),stat=rc) - if (rc /= 0) stop 'init_output_processing: Error allocating memory (v2d)' - v2d = 0._rk + allocate(u2d_destag(E2DFIELD),stat=rc) if (rc /= 0) stop 'init_output_processing: Error allocating memory (u2d_destag)' u2d_destag = 0._rk @@ -79,10 +78,6 @@ v2d_destag = 0._rk #if 0 - allocate(u3d(I3DFIELD),stat=rc) - if (rc /= 0) stop 'init_output_processing: Error allocating memory (u3d)' - allocate(v3d(I3DFIELD),stat=rc) - if (rc /= 0) stop 'init_output_processing: Error allocating memory (v3d)' allocate(u3d_destag(I3DFIELD),stat=rc) if (rc /= 0) stop 'init_output_processing: Error allocating memory (u3d_destag)' allocate(v3d_destag(I3DFIELD),stat=rc) @@ -117,8 +112,15 @@ !BOC LEVEL2 'register_processed_variables()' - call fm%register('u2d', 'm/s', 'velocity in local x-direction', standard_name='', data2d=u2d(_2D_W_), fill_value=-9999._rk, category='velocities', used_now=u2d_use) - call fm%register('v2d', 'm/s', 'velocity in local y-direction', standard_name='', data2d=v2d(_2D_W_), fill_value=-9999._rk, category='velocities', used_now=v2d_use) + call fm%register('u2d', 'm/s', 'velocity in local x-direction', standard_name='', fill_value=-9999._rk, category='velocities', output_level=output_level_debug, used=u2d_used, used_now=u2d_now) + call fm%register('v2d', 'm/s', 'velocity in local y-direction', standard_name='', fill_value=-9999._rk, category='velocities', output_level=output_level_debug, used=v2d_used, used_now=v2d_now) + +#ifndef NO_3D + call fm%register('u3d', 'm/s', 'velocity in local x-direction (3D)', standard_name='', dimensions=(/id_dim_z/), fill_value=-9999._rk, category='velocities', output_level=output_level_debug, used=u3d_used, used_now=u3d_now) + call fm%register('v3d', 'm/s', 'velocity in local y-direction (3D)', standard_name='', dimensions=(/id_dim_z/), fill_value=-9999._rk, category='velocities', output_level=output_level_debug, used=v3d_used, used_now=v3d_now) +#endif + + call fm%register('u2d-destag', 'm/s', 'velocity in local x-direction(destag)', standard_name='', data2d=u2d_destag(_2D_W_), fill_value=-9999._rk, category='velocities',output_level=output_level_debug, used_now=u2d_destag_use) call fm%register('v2d-destag', 'm/s', 'velocity in local y-direction(destag)', standard_name='', data2d=v2d_destag(_2D_W_), fill_value=-9999._rk, category='velocities',output_level=output_level_debug, used_now=v2d_destag_use) @@ -126,6 +128,67 @@ end subroutine register_processed_variables !EOC +!----------------------------------------------------------------------- +!BOP +! +! !ROUTINE: finalize_register_processed_variables() - send optional variables. +! +! !INTERFACE: + subroutine finalize_register_processed_variables(fm) +! +! !DESCRIPTION: +! +! !USES: + use field_manager + IMPLICIT NONE +! +! !INPUT PARAMETERS: + type (type_field_manager) :: fm +! +! !REVISION HISTORY: +! Original author(s): Knut Klingbeil +! +! !LOCAL VARIABLES: + integer :: rc +!EOP +!----------------------------------------------------------------------- +!BOC + LEVEL1 'finalize_register_processed_variables()' + + if (u2d_used) then + allocate(u2d(E2DFIELD),stat=rc) + if (rc /= 0) stop 'finalize_register_processed_variables: Error allocating memory (u2d)' + u2d = 0._rk + call fm%send_data('u2d', u2d(_2D_W_)) + end if + + if (v2d_used) then + allocate(v2d(E2DFIELD),stat=rc) + if (rc /= 0) stop 'finalize_register_processed_variables: Error allocating memory (v2d)' + v2d = 0._rk + call fm%send_data('v2d', v2d(_2D_W_)) + end if + +#ifndef NO_3D + if (u3d_used) then + allocate(u3d(I3DFIELD),stat=rc) + if (rc /= 0) stop 'finalize_register_processed_variables: Error allocating memory (u3d)' + u3d = 0._rk + call fm%send_data('u3d', u3d(_3D_W_)) + end if + + if (v3d_used) then + allocate(v3d(I3DFIELD),stat=rc) + if (rc /= 0) stop 'finalize_register_processed_variables: Error allocating memory (v3d)' + v3d = 0._rk + call fm%send_data('v3d', v3d(_3D_W_)) + end if +#endif + + return + end subroutine finalize_register_processed_variables +!EOC + !----------------------------------------------------------------------- !BOP ! !IROUTINE: do_output_processing - read required variables @@ -137,7 +200,9 @@ use domain, only: az, au, av use variables_2d, only: z,D use variables_2d, only: U,V,DU,DV +#ifndef NO_3D use variables_3d, only: kmin,hn,uu,hun,vv,hvn +#endif IMPLICIT NONE ! ! !DESCRIPTION: @@ -154,29 +219,40 @@ !BOC ! 2D - velocities - if (u2d_use .and. v2d_use) then + + if (u2d_now) then call to_2d_vel(imin,jmin,imax,jmax,au,U,DU,vel_missing, & imin,jmin,imax,jmax,u2d) + end if + + if (v2d_now) then call to_2d_vel(imin,jmin,imax,jmax,av,V,DV,vel_missing, & imin,jmin,imax,jmax,v2d) end if - if (u2d_destag_use .and. v2d_destag_use) then - call to_2d_u(imin,jmin,imax,jmax,az,U,DU,vel_missing, & - imin,jmin,imax,jmax,u2d_destag) - call to_2d_v(imin,jmin,imax,jmax,az,V,DV,vel_missing, & - imin,jmin,imax,jmax,v2d_destag) - end if -#if 0 ! 3D - velocities #ifndef NO_3D - if (allocated(u3d) .and. allocated(v3d)) then + if (u3d_now) then call to_3d_uu(imin,jmin,imax,jmax,kmin,kmax,az, & hun,uu,vel_missing,u3d) + end if + + if (v3d_now) then call to_3d_vv (imin,jmin,imax,jmax,kmin,kmax,az, & hvn,vv,vel_missing,v3d) end if +#endif + + + if (u2d_destag_use .and. v2d_destag_use) then + call to_2d_u(imin,jmin,imax,jmax,az,U,DU,vel_missing, & + imin,jmin,imax,jmax,u2d_destag) + call to_2d_v(imin,jmin,imax,jmax,az,V,DV,vel_missing, & + imin,jmin,imax,jmax,v2d_destag) + end if +#if 0 +#ifndef NO_3D if (allocated(u3d_destag) .and. allocated(v3d_destag)) then call to_3d_vel(imin,jmin,imax,jmax,kmin,kmax,au, & hun,uu,vel_missing,u3d_destag)