Ignore:
Timestamp:
Jun 21, 2007 8:23:15 AM (17 years ago)
Author:
raasch
Message:

New:
---
ocean version including prognostic equation for salinity and equation of state for seawater. Routine buoyancy can be used with both temperature and density.
+ inipar-parameters bc_sa_t, bottom_salinityflux, ocean, sa_surface, sa_vertical_gradient, sa_vertical_gradient_level, top_salinityflux

advec_s_bc, average_3d_data, boundary_conds, buoyancy, check_parameters, data_output_2d, data_output_3d, diffusion_e, flow_statistics, header, init_grid, init_3d_model, modules, netcdf, parin, production_e, prognostic_equations, read_var_list, sum_up_3d_data, swap_timelevel, time_integration, user_interface, write_var_list, write_3d_binary

New:
eqn_state_seawater, init_ocean

Changed:


inipar-parameter use_pt_reference renamed use_reference

hydro_press renamed hyp, routine calc_mean_pt_profile renamed calc_mean_profile

format adjustments for the ocean version (run_control)

advec_particles, buoyancy, calc_liquid_water_content, check_parameters, diffusion_e, diffusivities, header, init_cloud_physics, modules, production_e, prognostic_equations, run_control

Errors:


Bugfix: height above topography instead of height above level k=0 is used for calculating the mixing length (diffusion_e and diffusivities).

Bugfix: error in boundary condition for TKE removed (advec_s_bc)

advec_s_bc, diffusion_e, prognostic_equations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/check_parameters.f90

    r96 r97  
    44! Actual revisions:
    55! -----------------
    6 ! Initial salinity profile is calculated.
     6! Initial salinity profile is calculated, salinity boundary conditions are
     7! checked,
    78! z_max_do1d is checked only in case of ocean = .f.,
    8 ! +initial temperature profile for the ocean version,
     9! +initial temperature and geostrophic velocity profiles for the ocean version,
     10! use_pt_reference renamed use_reference
    911!
    1012! Former revisions:
     
    163165          WRITE( action, '(A,A)' )  'timestep_scheme = ', timestep_scheme
    164166       ENDIF
     167       IF ( momentum_advec == 'ups-scheme' )  THEN
     168          WRITE( action, '(A,A)' )  'momentum_advec = ', momentum_advec
     169       ENDIF
    165170       IF ( action /= ' ' )  THEN
    166171          IF ( myid == 0 )  THEN
     
    447452       i = 1
    448453       gradient = 0.0
    449        ug_vertical_gradient_level_ind(1) = 0
    450        ug(0) = ug_surface
    451        DO  k = 1, nzt+1
    452           IF ( ug_vertical_gradient_level(i) < zu(k)  .AND. &
    453                ug_vertical_gradient_level(i) >= 0.0 )  THEN
    454              gradient = ug_vertical_gradient(i) / 100.0
    455              ug_vertical_gradient_level_ind(i) = k - 1
    456              i = i + 1
    457              IF ( i > 10 )  THEN
    458                 IF ( myid == 0 )  THEN
    459                    PRINT*, '+++ check_parameters: upper bound 10 of array', &
    460                            ' "ug_vertical_gradient_level_ind" exceeded'
    461                 ENDIF
    462                 CALL local_stop
    463              ENDIF
    464           ENDIF
    465           IF ( gradient /= 0.0 )  THEN
    466              IF ( k /= 1 )  THEN
    467                 ug(k) = ug(k-1) + dzu(k) * gradient
     454
     455       IF ( .NOT. ocean )  THEN
     456
     457          ug_vertical_gradient_level_ind(1) = 0
     458          ug(0) = ug_surface
     459          DO  k = 1, nzt+1
     460             IF ( ug_vertical_gradient_level(i) < zu(k)  .AND. &
     461                  ug_vertical_gradient_level(i) >= 0.0 )  THEN
     462                gradient = ug_vertical_gradient(i) / 100.0
     463                ug_vertical_gradient_level_ind(i) = k - 1
     464                i = i + 1
     465                IF ( i > 10 )  THEN
     466                   IF ( myid == 0 )  THEN
     467                      PRINT*, '+++ check_parameters: upper bound 10 of array', &
     468                              ' "ug_vertical_gradient_level_ind" exceeded'
     469                   ENDIF
     470                   CALL local_stop
     471                ENDIF
     472             ENDIF
     473             IF ( gradient /= 0.0 )  THEN
     474                IF ( k /= 1 )  THEN
     475                   ug(k) = ug(k-1) + dzu(k) * gradient
     476                ELSE
     477                   ug(k) = ug_surface + 0.5 * dzu(k) * gradient
     478                ENDIF
    468479             ELSE
    469                 ug(k) = ug_surface + 0.5 * dzu(k) * gradient
    470              ENDIF
    471           ELSE
    472              ug(k) = ug(k-1)
    473           ENDIF
    474        ENDDO
     480                ug(k) = ug(k-1)
     481             ENDIF
     482          ENDDO
     483
     484       ELSE
     485
     486          ug_vertical_gradient_level_ind(1) = nzt+1
     487          DO  k = nzt, 0, -1
     488             IF ( ug_vertical_gradient_level(i) > zu(k)  .AND. &
     489                  ug_vertical_gradient_level(i) <= 0.0 )  THEN
     490                gradient = ug_vertical_gradient(i) / 100.0
     491                ug_vertical_gradient_level_ind(i) = k + 1
     492                i = i + 1
     493                IF ( i > 10 )  THEN
     494                   IF ( myid == 0 )  THEN
     495                      PRINT*, '+++ check_parameters: upper bound 10 of array', &
     496                              ' "ug_vertical_gradient_level_ind" exceeded'
     497                   ENDIF
     498                   CALL local_stop
     499                ENDIF
     500             ENDIF
     501             IF ( gradient /= 0.0 )  THEN
     502                IF ( k /= nzt )  THEN
     503                   ug(k) = ug(k+1) - dzu(k+1) * gradient
     504                ELSE
     505                   ug(k)   = ug_surface - 0.5 * dzu(k+1) * gradient
     506                   ug(k+1) = ug_surface + 0.5 * dzu(k+1) * gradient
     507                ENDIF
     508             ELSE
     509                ug(k) = ug(k+1)
     510             ENDIF
     511          ENDDO
     512
     513       ENDIF
    475514
    476515       u_init = ug
     
    478517!
    479518!--    In case of no given gradients for ug, choose a vanishing gradient
    480        IF ( ug_vertical_gradient_level(1) == -1.0 )  THEN
     519       IF ( ug_vertical_gradient_level(1) == -9999999.9 )  THEN
    481520          ug_vertical_gradient_level(1) = 0.0
    482521       ENDIF 
     
    488527       i = 1
    489528       gradient = 0.0
    490        vg_vertical_gradient_level_ind(1) = 0
    491        vg(0) = vg_surface
    492        DO  k = 1, nzt+1
    493           IF ( vg_vertical_gradient_level(i) < zu(k)  .AND. &
    494                vg_vertical_gradient_level(i) >= 0.0 )  THEN
    495              gradient = vg_vertical_gradient(i) / 100.0
    496              vg_vertical_gradient_level_ind(i) = k - 1
    497              i = i + 1
    498              IF ( i > 10 )  THEN
    499                 IF ( myid == 0 )  THEN
    500                    PRINT*, '+++ check_parameters: upper bound 10 of array', &
    501                            ' "vg_vertical_gradient_level_ind" exceeded'
    502                 ENDIF
    503                 CALL local_stop
    504              ENDIF
    505           ENDIF
    506           IF ( gradient /= 0.0 )  THEN
    507              IF ( k /= 1 )  THEN
    508                 vg(k) = vg(k-1) + dzu(k) * gradient
     529
     530       IF ( .NOT. ocean )  THEN
     531
     532          vg_vertical_gradient_level_ind(1) = 0
     533          vg(0) = vg_surface
     534          DO  k = 1, nzt+1
     535             IF ( vg_vertical_gradient_level(i) < zu(k)  .AND. &
     536                  vg_vertical_gradient_level(i) >= 0.0 )  THEN
     537                gradient = vg_vertical_gradient(i) / 100.0
     538                vg_vertical_gradient_level_ind(i) = k - 1
     539                i = i + 1
     540                IF ( i > 10 )  THEN
     541                   IF ( myid == 0 )  THEN
     542                      PRINT*, '+++ check_parameters: upper bound 10 of array', &
     543                              ' "vg_vertical_gradient_level_ind" exceeded'
     544                   ENDIF
     545                   CALL local_stop
     546                ENDIF
     547             ENDIF
     548             IF ( gradient /= 0.0 )  THEN
     549                IF ( k /= 1 )  THEN
     550                   vg(k) = vg(k-1) + dzu(k) * gradient
     551                ELSE
     552                   vg(k) = vg_surface + 0.5 * dzu(k) * gradient
     553                ENDIF
    509554             ELSE
    510                 vg(k) = vg_surface + 0.5 * dzu(k) * gradient
    511              ENDIF
    512           ELSE
    513              vg(k) = vg(k-1)
    514           ENDIF
    515        ENDDO
     555                vg(k) = vg(k-1)
     556             ENDIF
     557          ENDDO
     558
     559       ELSE
     560
     561          vg_vertical_gradient_level_ind(1) = 0
     562          DO  k = nzt, 0, -1
     563             IF ( vg_vertical_gradient_level(i) > zu(k)  .AND. &
     564                  vg_vertical_gradient_level(i) <= 0.0 )  THEN
     565                gradient = vg_vertical_gradient(i) / 100.0
     566                vg_vertical_gradient_level_ind(i) = k + 1
     567                i = i + 1
     568                IF ( i > 10 )  THEN
     569                   IF ( myid == 0 )  THEN
     570                      PRINT*, '+++ check_parameters: upper bound 10 of array', &
     571                              ' "vg_vertical_gradient_level_ind" exceeded'
     572                   ENDIF
     573                   CALL local_stop
     574                ENDIF
     575             ENDIF
     576             IF ( gradient /= 0.0 )  THEN
     577                IF ( k /= nzt )  THEN
     578                   vg(k) = vg(k+1) - dzu(k+1) * gradient
     579                ELSE
     580                   vg(k)   = vg_surface - 0.5 * dzu(k+1) * gradient
     581                   vg(k+1) = vg_surface + 0.5 * dzu(k+1) * gradient
     582                ENDIF
     583             ELSE
     584                vg(k) = vg(k+1)
     585             ENDIF
     586          ENDDO
     587
     588       ENDIF
    516589
    517590       v_init = vg
     
    519592!
    520593!--    In case of no given gradients for vg, choose a vanishing gradient
    521        IF ( vg_vertical_gradient_level(1) == -1.0 )  THEN
     594       IF ( vg_vertical_gradient_level(1) == -9999999.9 )  THEN
    522595          vg_vertical_gradient_level(1) = 0.0
    523596       ENDIF
     
    707780
    708781!
    709 !-- Reference temperature to be used in buoyancy terms
    710     IF ( pt_reference /= 9999999.9 )  use_pt_reference = .TRUE.
     782!-- Ocean runs always use reference values in the buoyancy term. Therefore
     783!-- set the reference temperature equal to the surface temperature.
     784    IF ( ocean  .AND.  pt_reference == 9999999.9 )  pt_reference = pt_surface
     785
     786!
     787!-- Reference value has to be used in buoyancy terms
     788    IF ( pt_reference /= 9999999.9 )  use_reference = .TRUE.
     789
     790!
     791!-- Sign of buoyancy/stability terms
     792    IF ( ocean )  atmos_ocean_sign = -1.0
     793
     794!
     795!-- Ocean version is using flux boundary conditions at the top
     796    IF ( ocean )  use_top_fluxes = .TRUE.
    711797
    712798!
     
    10201106
    10211107       IF ( top_salinityflux == 9999999.9 )  constant_top_salinityflux = .FALSE.
     1108       IF ( ibc_sa_t == 1  .AND.   top_salinityflux == 9999999.9 )  THEN
     1109          IF ( myid == 0 )  THEN
     1110             PRINT*, '+++ check_parameters:'
     1111             PRINT*, '    boundary_condition: bc_sa_t = ', bc_sa_t
     1112             PRINT*, '    requires to set top_salinityflux '
     1113          ENDIF
     1114          CALL local_stop
     1115       ENDIF
    10221116
    10231117!
     
    24742568!
    24752569!-- Determine upper and lower hight level indices for random perturbations
    2476     IF ( disturbance_level_b == -1.0 )  THEN
    2477        disturbance_level_b     = zu(nzb+3)
    2478        disturbance_level_ind_b = nzb + 3
     2570    IF ( disturbance_level_b == -9999999.9 )  THEN
     2571       IF ( ocean ) THEN
     2572          disturbance_level_b     = zu((nzt*2)/3)
     2573          disturbance_level_ind_b = ( nzt * 2 ) / 3
     2574       ELSE
     2575          disturbance_level_b     = zu(nzb+3)
     2576          disturbance_level_ind_b = nzb + 3
     2577       ENDIF
    24792578    ELSEIF ( disturbance_level_b < zu(3) )  THEN
    24802579       IF ( myid == 0 )  PRINT*, '+++ check_parameters:  disturbance_level_b=',&
     
    24962595    ENDIF
    24972596
    2498     IF ( disturbance_level_t == -1.0 )  THEN
    2499        disturbance_level_t     = zu(nzt/3)
    2500        disturbance_level_ind_t = nzt / 3
     2597    IF ( disturbance_level_t == -9999999.9 )  THEN
     2598       IF ( ocean )  THEN
     2599          disturbance_level_t     = zu(nzt-3)
     2600          disturbance_level_ind_t = nzt - 3
     2601       ELSE
     2602          disturbance_level_t     = zu(nzt/3)
     2603          disturbance_level_ind_t = nzt / 3
     2604       ENDIF
    25012605    ELSEIF ( disturbance_level_t > zu(nzt-2) )  THEN
    25022606       IF ( myid == 0 )  PRINT*, '+++ check_parameters:  disturbance_level_t=',&
Note: See TracChangeset for help on using the changeset viewer.