Ignore:
Timestamp:
Aug 29, 2019 11:02:06 AM (22 months ago)
Author:
gronemeier
Message:

Consider rotation of model domain for claculation of Coriolis force:

  • check_parameters: Overwrite rotation_angle from namelist by value from static driver;
  • coriolis: Consider rotation of model domain;
  • header: Write information about rotation angle;
  • modules: Added rotation_angle;
  • netcdf_interface_mod: replaced rotation angle from input-netCDF file by namelist parameter 'rotation_angle';
  • ocean_mod: Consider rotation of model domain for calculating the Stokes drift;
  • parin: added rotation_angle to initialization_parameters;
File:
1 edited

Legend:

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

    r4182 r4196  
    2525! -----------------
    2626! $Id$
     27! Consider rotation of model domain
     28!
     29! 4182 2019-08-22 15:20:23Z scharf
    2730! Corrected "Former revisions" section
    2831!
     
    6568       USE arrays_3d,                                                          &
    6669           ONLY:  tend, u, ug, v, vg, w
    67            
     70
     71       USE basic_constants_and_equations_mod,                                  &
     72           ONLY:  pi
     73
    6874       USE control_parameters,                                                 &
    69            ONLY:  f, fs, message_string
     75           ONLY:  f, fs, message_string, rotation_angle
    7076           
    7177       USE indices,                                                            &
     
    7682       IMPLICIT NONE
    7783
    78        INTEGER(iwp) ::  component  !<
    79        INTEGER(iwp) ::  i          !< running index x direction
    80        INTEGER(iwp) ::  j          !< running index y direction
    81        INTEGER(iwp) ::  k          !< running index z direction
    82 
     84       INTEGER(iwp) ::  component      !< component of momentum equation
     85       INTEGER(iwp) ::  i              !< running index x direction
     86       INTEGER(iwp) ::  j              !< running index y direction
     87       INTEGER(iwp) ::  k              !< running index z direction
     88
     89       REAL(wp)     ::  cos_rot_angle  !< cosine of model rotation angle
    8390       REAL(wp)     ::  flag           !< flag to mask topography
     91       REAL(wp)     ::  sin_rot_angle  !< sine of model rotation angle
     92
     93!
     94!--    Precalculate cosine and sine of rotation angle
     95       cos_rot_angle = COS( rotation_angle * pi / 180.0_wp )
     96       sin_rot_angle = SIN( rotation_angle * pi / 180.0_wp )
    8497
    8598!
     
    99112!
    100113!--                   Predetermine flag to mask topography
    101                       flag = MERGE( 1.0_wp, 0.0_wp,                            &
    102                                     BTEST( wall_flags_0(k,j,i), 1 ) )
    103 
    104                       tend(k,j,i) = tend(k,j,i) + f  *    ( 0.25_wp *          &
    105                                    ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) +    &
    106                                      v(k,j+1,i) ) - vg(k) ) * flag             &
    107                                                 - fs *    ( 0.25_wp *          &
    108                                    ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) +  &
    109                                      w(k,j,i)   )                              &
    110                                                           ) * flag
     114                      flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 1 ) )
     115
     116                      tend(k,j,i) = tend(k,j,i) + flag *                                           &
     117                            ( f                                                                    &
     118                              * ( 0.25_wp * ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) + v(k,j+1,i) )  &
     119                                - vg(k) )                                                          &
     120                            - fs * cos_rot_angle                                                   &
     121                              * 0.25_wp * ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) + w(k,j,i) )    &
     122                            )
    111123                   ENDDO
    112124                ENDDO
     
    118130             !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i, j, k, flag) &
    119131             !$ACC PRESENT(wall_flags_0) &
    120              !$ACC PRESENT(u, ug) &
     132             !$ACC PRESENT(u, w, ug) &
    121133             !$ACC PRESENT(tend)
    122134             DO  i = nxl, nxr
     
    125137!
    126138!--                   Predetermine flag to mask topography
    127                       flag = MERGE( 1.0_wp, 0.0_wp,                            &
    128                                     BTEST( wall_flags_0(k,j,i), 2 ) )
    129 
    130                       tend(k,j,i) = tend(k,j,i) - f *     ( 0.25_wp *          &
    131                                    ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) +    &
    132                                      u(k,j,i+1) ) - ug(k) ) * flag
     139                      flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 2 ) )
     140
     141                      tend(k,j,i) = tend(k,j,i) - flag *                                           &
     142                            ( f                                                                    &
     143                              * ( 0.25_wp * ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) + u(k,j,i+1) )  &
     144                                - ug(k) )                                                          &
     145                            + fs * sin_rot_angle                                                   &
     146                              * 0.25_wp * ( w(k,j,i) + w(k-1,j,i) + w(k,j-1,i) + w(k-1,j-1,i) )    &
     147                            )
    133148                   ENDDO
    134149                ENDDO
     
    140155             !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i, j, k, flag) &
    141156             !$ACC PRESENT(wall_flags_0) &
    142              !$ACC PRESENT(u) &
     157             !$ACC PRESENT(u, v) &
    143158             !$ACC PRESENT(tend)
    144159             DO  i = nxl, nxr
     
    147162!
    148163!--                   Predetermine flag to mask topography
    149                       flag = MERGE( 1.0_wp, 0.0_wp,                            &
    150                                     BTEST( wall_flags_0(k,j,i), 3 ) )
    151 
    152                       tend(k,j,i) = tend(k,j,i) + fs * 0.25_wp *               &
    153                                    ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) +      &
    154                                      u(k+1,j,i+1) ) * flag
     164                      flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 3 ) )
     165
     166                      tend(k,j,i) = tend(k,j,i)                                                 &
     167                                  + fs * 0.25_wp * flag                                         &
     168                                    * ( cos_rot_angle                                           &
     169                                        * ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) + u(k+1,j,i+1) ) &
     170                                      + sin_rot_angle                                           &
     171                                        * ( v(k,j,i) + v(k+1,j,i) + v(k,j+1,i) + v(k+1,j+1,i) ) &
     172                                      )
    155173                   ENDDO
    156174                ENDDO
     
    176194       USE arrays_3d,                                                          &
    177195           ONLY:  tend, u, ug, v, vg, w
    178            
     196
     197       USE basic_constants_and_equations_mod,                                  &
     198           ONLY:  pi
     199
    179200       USE control_parameters,                                                 &
    180            ONLY:  f, fs, message_string
     201           ONLY:  f, fs, message_string, rotation_angle
    181202           
    182203       USE indices,                                                            &
     
    184205           
    185206       USE kinds
    186        
     207
    187208       IMPLICIT NONE
    188209
    189        INTEGER(iwp) ::  component  !<
     210       INTEGER(iwp) ::  component  !< component of momentum equation
    190211       INTEGER(iwp) ::  i          !< running index x direction
    191212       INTEGER(iwp) ::  j          !< running index y direction
    192213       INTEGER(iwp) ::  k          !< running index z direction
    193214
    194        REAL(wp)     ::  flag       !< flag to mask topography
     215       REAL(wp)     ::  cos_rot_angle  !< cosine of model rotation angle
     216       REAL(wp)     ::  flag           !< flag to mask topography
     217       REAL(wp)     ::  sin_rot_angle  !< sine of model rotation angle
     218
     219!
     220!--    Precalculate cosine and sine of rotation angle
     221       cos_rot_angle = COS( rotation_angle * pi / 180.0_wp )
     222       sin_rot_angle = SIN( rotation_angle * pi / 180.0_wp )
    195223
    196224!
     
    206234                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 1 ) )
    207235
    208                 tend(k,j,i) = tend(k,j,i) + f  *     ( 0.25_wp *               &
    209                                 ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) +       &
    210                                   v(k,j+1,i) ) - vg(k)                         &
    211                                                      ) * flag                  &
    212                                           - fs *     ( 0.25_wp *               &
    213                                 ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) +     &
    214                                   w(k,j,i)   )       ) * flag
     236                tend(k,j,i) = tend(k,j,i) + flag *                                                 &
     237                            ( f                                                                    &
     238                              * ( 0.25_wp * ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) + v(k,j+1,i) )  &
     239                                - vg(k) )                                                          &
     240                            - fs * cos_rot_angle                                                   &
     241                              * 0.25_wp * ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) + w(k,j,i) )    &
     242                            )
    215243             ENDDO
    216244
     
    223251                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 2 ) )
    224252
    225                 tend(k,j,i) = tend(k,j,i) - f *        ( 0.25_wp *             &
    226                                 ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) +       &
    227                                   u(k,j,i+1) ) - ug(k) ) * flag
     253                tend(k,j,i) = tend(k,j,i) - flag *                                                 &
     254                            ( f                                                                    &
     255                              * ( 0.25_wp * ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) + u(k,j,i+1) )  &
     256                                - ug(k) )                                                          &
     257                            + fs * sin_rot_angle                                                   &
     258                              * 0.25_wp * ( w(k,j,i) + w(k-1,j,i) + w(k,j-1,i) + w(k-1,j-1,i) )    &
     259                            )
    228260             ENDDO
    229261
     
    236268                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 3 ) )
    237269
    238                 tend(k,j,i) = tend(k,j,i) + fs * 0.25_wp *                     &
    239                                 ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) +         &
    240                                   u(k+1,j,i+1) ) * flag
     270                tend(k,j,i) = tend(k,j,i)                                                 &
     271                            + fs * 0.25_wp * flag                                         &
     272                              * ( cos_rot_angle                                           &
     273                                  * ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) + u(k+1,j,i+1) ) &
     274                                + sin_rot_angle                                           &
     275                                  * ( v(k,j,i) + v(k+1,j,i) + v(k,j+1,i) + v(k+1,j+1,i) ) &
     276                                )
    241277             ENDDO
    242278
Note: See TracChangeset for help on using the changeset viewer.